@nifrajs/testing 2.10.0 → 2.12.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 +1 -0
- package/dist/fault-profile.d.ts +47 -0
- package/dist/fault-profile.d.ts.map +1 -0
- package/dist/fault-profile.js +107 -0
- package/dist/fault-profile.js.map +1 -0
- package/dist/idempotency.d.ts +18 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +59 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/tool-contract.d.ts +8 -0
- package/dist/tool-contract.d.ts.map +1 -0
- package/dist/tool-contract.js +156 -0
- package/dist/tool-contract.js.map +1 -0
- package/dist/trajectory.d.ts +62 -0
- package/dist/trajectory.d.ts.map +1 -0
- package/dist/trajectory.js +200 -0
- package/dist/trajectory.js.map +1 -0
- package/package.json +11 -7
- package/src/fault-profile.ts +174 -0
- package/src/idempotency.ts +89 -0
- package/src/index.ts +41 -0
- package/src/tool-contract.ts +189 -0
- package/src/trajectory.ts +328 -0
package/README.md
CHANGED
|
@@ -190,6 +190,7 @@ that every call carries and captures cookies via a shared jar.
|
|
|
190
190
|
- `testSession<App>(app, { origin?, cookies? })` → `{ client: Treaty<App>, cookies: CookieJar }`.
|
|
191
191
|
- `cookieJar()` → `CookieJar` - `header()` · `applyTo(headers)` · `store(response)` · `set` · `get` · `clear` · `size`.
|
|
192
192
|
Honours removal (`Max-Age=0` / past `Expires`); other cookie attributes are ignored (in-process, same-origin).
|
|
193
|
+
- `proveIdempotency({ run, runs? })` → a token-only proof that canonical effect ledgers replay identically.
|
|
193
194
|
|
|
194
195
|
For a **stateless** request (no cookies), use `testClient` from `@nifrajs/client` directly.
|
|
195
196
|
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type FailureDirective, type FailureEvidence, type FailureReplay, type FailureScenario } from "./failure-lab.js";
|
|
2
|
+
/** A named adapter profile composed from the deterministic failure laboratory. */
|
|
3
|
+
export interface FaultProfile {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly scenarios: readonly FaultProfileScenario[];
|
|
6
|
+
/** Optional trajectory faults consumed by the agent trajectory harness. */
|
|
7
|
+
readonly faults?: readonly FaultProfileFault[];
|
|
8
|
+
/** Existing deterministic failure-lab schedule shared by trajectory runs. */
|
|
9
|
+
readonly schedule?: readonly FailureDirective[];
|
|
10
|
+
}
|
|
11
|
+
export type FaultProfileFaultKind = "tool-error" | "malformed-model-output" | "budget-pressure" | "approval-denial" | "cancellation";
|
|
12
|
+
export interface FaultProfileFault {
|
|
13
|
+
readonly point: "model" | "tool" | "effect";
|
|
14
|
+
readonly kind: FaultProfileFaultKind;
|
|
15
|
+
readonly occurrence?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface FaultProfileScenario extends FailureScenario<unknown> {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly description: string;
|
|
20
|
+
}
|
|
21
|
+
export interface FaultProfileScenarioReport {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly description: string;
|
|
24
|
+
readonly ok: boolean;
|
|
25
|
+
readonly replay: FailureReplay;
|
|
26
|
+
readonly evidence: readonly FailureEvidence[];
|
|
27
|
+
readonly error?: {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly kind?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface FaultProfileReport {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly ok: boolean;
|
|
35
|
+
readonly scenarios: readonly FaultProfileScenarioReport[];
|
|
36
|
+
}
|
|
37
|
+
export interface RunFaultProfileOptions {
|
|
38
|
+
readonly seed?: number;
|
|
39
|
+
readonly schedule?: readonly FailureDirective[];
|
|
40
|
+
}
|
|
41
|
+
/** Validate and freeze a reusable fault profile. */
|
|
42
|
+
export declare function defineFaultProfile(profile: FaultProfile): FaultProfile;
|
|
43
|
+
/** Run every profile scenario with the same deterministic seed and failure schedule. */
|
|
44
|
+
export declare function runFaultProfile(profile: FaultProfile, options?: RunFaultProfileOptions): Promise<FaultProfileReport>;
|
|
45
|
+
/** A small smoke profile for consumers that only need to verify the harness wiring. */
|
|
46
|
+
export declare const referenceFaultProfile: FaultProfile;
|
|
47
|
+
//# sourceMappingURL=fault-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fault-profile.d.ts","sourceRoot":"","sources":["../src/fault-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EAErB,MAAM,kBAAkB,CAAA;AAEzB,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAA;IACnD,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAC9C,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAChD;AAED,MAAM,MAAM,qBAAqB,GAC7B,YAAY,GACZ,wBAAwB,GACxB,iBAAiB,GACjB,iBAAiB,GACjB,cAAc,CAAA;AAElB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;IAC3C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAA;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe,CAAC,OAAO,CAAC;IACpE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAA;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACnE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,0BAA0B,EAAE,CAAA;CAC1D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAChD;AAwED,oDAAoD;AACpD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAEtE;AAED,wFAAwF;AACxF,wBAAsB,eAAe,CACnC,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,kBAAkB,CAAC,CAsB7B;AAED,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,cAahC,CAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { runFailureScenario, } from "./failure-lab.js";
|
|
2
|
+
const PROFILE_NAME = /^[a-z][a-z0-9._-]{0,127}$/;
|
|
3
|
+
function validateProfile(profile) {
|
|
4
|
+
if (!PROFILE_NAME.test(profile.name)) {
|
|
5
|
+
throw new TypeError(`fault profile: invalid name ${JSON.stringify(profile.name)}`);
|
|
6
|
+
}
|
|
7
|
+
if (!Array.isArray(profile.scenarios) || profile.scenarios.length === 0) {
|
|
8
|
+
throw new TypeError("fault profile: at least one scenario is required");
|
|
9
|
+
}
|
|
10
|
+
if (profile.faults !== undefined) {
|
|
11
|
+
const seenFaults = new Set();
|
|
12
|
+
for (const fault of profile.faults) {
|
|
13
|
+
if (fault.point !== "model" && fault.point !== "tool" && fault.point !== "effect") {
|
|
14
|
+
throw new TypeError("fault profile: invalid trajectory fault point");
|
|
15
|
+
}
|
|
16
|
+
if (![
|
|
17
|
+
"tool-error",
|
|
18
|
+
"malformed-model-output",
|
|
19
|
+
"budget-pressure",
|
|
20
|
+
"approval-denial",
|
|
21
|
+
"cancellation",
|
|
22
|
+
].includes(fault.kind)) {
|
|
23
|
+
throw new TypeError("fault profile: invalid trajectory fault kind");
|
|
24
|
+
}
|
|
25
|
+
if (fault.occurrence !== undefined &&
|
|
26
|
+
(!Number.isSafeInteger(fault.occurrence) || fault.occurrence < 1)) {
|
|
27
|
+
throw new RangeError("fault profile: trajectory fault occurrence must be positive");
|
|
28
|
+
}
|
|
29
|
+
const identity = `${fault.point}:${fault.kind}:${fault.occurrence ?? 1}`;
|
|
30
|
+
if (seenFaults.has(identity))
|
|
31
|
+
throw new Error(`fault profile: duplicate trajectory fault ${identity}`);
|
|
32
|
+
seenFaults.add(identity);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const ids = new Set();
|
|
36
|
+
const scenarios = profile.scenarios.map((scenario) => {
|
|
37
|
+
if (!PROFILE_NAME.test(scenario.id)) {
|
|
38
|
+
throw new TypeError(`fault profile: invalid scenario id ${JSON.stringify(scenario.id)}`);
|
|
39
|
+
}
|
|
40
|
+
if (ids.has(scenario.id)) {
|
|
41
|
+
throw new Error(`fault profile: duplicate scenario id ${JSON.stringify(scenario.id)}`);
|
|
42
|
+
}
|
|
43
|
+
if (scenario.description.trim() === "") {
|
|
44
|
+
throw new Error(`fault profile: scenario ${JSON.stringify(scenario.id)} needs a description`);
|
|
45
|
+
}
|
|
46
|
+
if (typeof scenario.execute !== "function" || typeof scenario.verify !== "function") {
|
|
47
|
+
throw new TypeError(`fault profile: scenario ${JSON.stringify(scenario.id)} is not executable`);
|
|
48
|
+
}
|
|
49
|
+
ids.add(scenario.id);
|
|
50
|
+
return Object.freeze({
|
|
51
|
+
...scenario,
|
|
52
|
+
description: scenario.description.trim(),
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
return Object.freeze({
|
|
56
|
+
name: profile.name,
|
|
57
|
+
scenarios: Object.freeze(scenarios),
|
|
58
|
+
...(profile.faults === undefined
|
|
59
|
+
? {}
|
|
60
|
+
: { faults: Object.freeze(profile.faults.map((fault) => Object.freeze({ ...fault }))) }),
|
|
61
|
+
...(profile.schedule === undefined ? {} : { schedule: Object.freeze([...profile.schedule]) }),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** Validate and freeze a reusable fault profile. */
|
|
65
|
+
export function defineFaultProfile(profile) {
|
|
66
|
+
return validateProfile(profile);
|
|
67
|
+
}
|
|
68
|
+
/** Run every profile scenario with the same deterministic seed and failure schedule. */
|
|
69
|
+
export async function runFaultProfile(profile, options = {}) {
|
|
70
|
+
const checked = validateProfile(profile);
|
|
71
|
+
const scenarios = [];
|
|
72
|
+
for (const scenario of checked.scenarios) {
|
|
73
|
+
const result = await runFailureScenario(scenario, {
|
|
74
|
+
...(options.seed === undefined ? {} : { seed: options.seed }),
|
|
75
|
+
schedule: options.schedule ?? [],
|
|
76
|
+
});
|
|
77
|
+
scenarios.push({
|
|
78
|
+
id: scenario.id,
|
|
79
|
+
description: scenario.description,
|
|
80
|
+
ok: result.ok,
|
|
81
|
+
replay: result.replay,
|
|
82
|
+
evidence: result.evidence,
|
|
83
|
+
...(result.error === undefined ? {} : { error: result.error }),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return Object.freeze({
|
|
87
|
+
name: checked.name,
|
|
88
|
+
ok: scenarios.every((scenario) => scenario.ok),
|
|
89
|
+
scenarios: Object.freeze(scenarios),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** A small smoke profile for consumers that only need to verify the harness wiring. */
|
|
93
|
+
export const referenceFaultProfile = defineFaultProfile({
|
|
94
|
+
name: "reference",
|
|
95
|
+
scenarios: [
|
|
96
|
+
{
|
|
97
|
+
id: "checkpoint",
|
|
98
|
+
name: "reference-checkpoint",
|
|
99
|
+
description: "the reference adapter reaches a deterministic checkpoint",
|
|
100
|
+
execute(lab) {
|
|
101
|
+
lab.checkpoint("reference.checkpoint");
|
|
102
|
+
},
|
|
103
|
+
verify: () => true,
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=fault-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fault-profile.js","sourceRoot":"","sources":["../src/fault-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SealedEffectLedger } from "@nifrajs/core/ledger";
|
|
2
|
+
export type EffectLedger = SealedEffectLedger;
|
|
3
|
+
export interface IdempotencyDivergence {
|
|
4
|
+
readonly step: number;
|
|
5
|
+
readonly field: string;
|
|
6
|
+
readonly first: unknown;
|
|
7
|
+
readonly second: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface IdempotencyProof {
|
|
10
|
+
readonly ok: boolean;
|
|
11
|
+
readonly divergences: readonly IdempotencyDivergence[];
|
|
12
|
+
}
|
|
13
|
+
/** Run a token-only effect workload repeatedly and report the first stable replay differences. */
|
|
14
|
+
export declare function proveIdempotency(options: {
|
|
15
|
+
readonly run: () => Promise<EffectLedger> | EffectLedger;
|
|
16
|
+
readonly runs?: number;
|
|
17
|
+
}): Promise<IdempotencyProof>;
|
|
18
|
+
//# sourceMappingURL=idempotency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAA;AAE7C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAA;CACvD;AAyCD,kGAAkG;AAClG,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;IACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6B5B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
function canonicalize(ledger) {
|
|
2
|
+
return {
|
|
3
|
+
method: ledger.method,
|
|
4
|
+
path: ledger.path,
|
|
5
|
+
declared: [...ledger.declared],
|
|
6
|
+
entries: ledger.entries.map((entry) => {
|
|
7
|
+
const value = {
|
|
8
|
+
seq: entry.seq,
|
|
9
|
+
...(entry.effectId === undefined ? {} : { effectId: entry.effectId }),
|
|
10
|
+
capability: entry.capability,
|
|
11
|
+
phase: entry.phase,
|
|
12
|
+
...(entry.target === undefined ? {} : { target: entry.target }),
|
|
13
|
+
...(entry.cost === undefined ? {} : { cost: entry.cost }),
|
|
14
|
+
...(entry.digest === undefined ? {} : { digest: entry.digest }),
|
|
15
|
+
...(entry.error === undefined ? {} : { error: entry.error }),
|
|
16
|
+
};
|
|
17
|
+
return value;
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function flatten(value, path = "") {
|
|
22
|
+
if (Array.isArray(value))
|
|
23
|
+
return value.flatMap((item, index) => flatten(item, `${path}[${index}]`));
|
|
24
|
+
if (typeof value === "object" && value !== null) {
|
|
25
|
+
return Object.entries(value).flatMap(([key, item]) => flatten(item, path ? `${path}.${key}` : key));
|
|
26
|
+
}
|
|
27
|
+
return [{ path, value }];
|
|
28
|
+
}
|
|
29
|
+
/** Run a token-only effect workload repeatedly and report the first stable replay differences. */
|
|
30
|
+
export async function proveIdempotency(options) {
|
|
31
|
+
const runs = options.runs ?? 2;
|
|
32
|
+
if (!Number.isSafeInteger(runs) || runs < 2)
|
|
33
|
+
throw new RangeError("idempotency runs must be at least 2");
|
|
34
|
+
const ledgers = [];
|
|
35
|
+
for (let index = 0; index < runs; index++)
|
|
36
|
+
ledgers.push(canonicalize(await options.run()));
|
|
37
|
+
const first = flatten(ledgers[0]);
|
|
38
|
+
const divergences = [];
|
|
39
|
+
for (let run = 1; run < ledgers.length; run++) {
|
|
40
|
+
const current = flatten(ledgers[run]);
|
|
41
|
+
const max = Math.max(first.length, current.length);
|
|
42
|
+
for (let step = 0; step < max; step++) {
|
|
43
|
+
const left = first[step];
|
|
44
|
+
const right = current[step];
|
|
45
|
+
if (left?.path === right?.path &&
|
|
46
|
+
JSON.stringify(left?.value) === JSON.stringify(right?.value))
|
|
47
|
+
continue;
|
|
48
|
+
divergences.push({
|
|
49
|
+
step,
|
|
50
|
+
field: left?.path ?? right?.path ?? "ledger",
|
|
51
|
+
first: left?.value,
|
|
52
|
+
second: right?.value,
|
|
53
|
+
});
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return Object.freeze({ ok: divergences.length === 0, divergences: Object.freeze(divergences) });
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=idempotency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ export { AdversarialContractError, type AdversarialContractOptions, type Adversa
|
|
|
11
11
|
export { AdapterCertificationError, type AdapterCertificationProfile, type AdapterCertificationReport, assertAdapterCertification, type CertifiableCacheEntry, type CertifiableCacheStore, type CertifiableDomainEvent, type CertifiableEventDeliveryAdapter, type CertifiableEventRecord, type CertifiableJobStore, type CertifiableRuntimeAdapter, type CertifiableRuntimeServer, type CertifiableStorageAdapter, type CertificationCapabilityEvidence, type CertificationCheck, type CertificationCheckEvidence, cacheStoreCertificationProfile, certifyAdapter, defineCertificationProfile, eventDeliveryCertificationProfile, jobStoreCertificationProfile, runtimeAdapterCertificationProfile, storageAdapterCertificationProfile, verifyAdapterCertification, } from "./certification.js";
|
|
12
12
|
export { type CookieJar, cookieJar } from "./cookies.js";
|
|
13
13
|
export { createFailureLab, type FailureDirective, type FailureEvidence, FailureInjectedError, type FailureKind, type FailureLab, type FailureLabOptions, type FailureReplay, type FailureScenario, type FailureScenarioReport, runFailureScenario, } from "./failure-lab.js";
|
|
14
|
+
export { defineFaultProfile, type FaultProfile, type FaultProfileFault, type FaultProfileFaultKind, type FaultProfileReport, type FaultProfileScenario, type FaultProfileScenarioReport, type RunFaultProfileOptions, referenceFaultProfile, runFaultProfile, } from "./fault-profile.js";
|
|
15
|
+
export { type EffectLedger, type IdempotencyDivergence, type IdempotencyProof, proveIdempotency, } from "./idempotency.js";
|
|
14
16
|
export { assertIncidentReplays, type CapturedRequest, type CapturedRequestInput, type CaptureIncidentOptions, captureIncident, type GenerateRegressionTestOptions, generateRegressionTest, type IncidentCapsule, IncidentReplayError, type IncidentReplayResult, type ReplayIncidentOptions, redactForEmission, replayIncident, shapeOf, } from "./incident.js";
|
|
15
17
|
export { type AppLike, type TestSession, type TestSessionOptions, testSession } from "./session.js";
|
|
18
|
+
export { httpToolAdapter, inProcessToolAdapter, mcpToolAdapter, testToolAdapter, } from "./tool-contract.js";
|
|
19
|
+
export { assertTrajectoryInvariants, type CreateTrajectoryTranscriptOptions, checkTrajectoryInvariants, createTrajectoryTranscript, type ReplayTrajectoryOptions, recordTrajectory, replayTrajectory, runTrajectory, type TrajectoryInvariantId, type TrajectoryInvariantOptions, type TrajectoryInvariantResult, type TrajectoryReplayResult, type TrajectoryRun, type TrajectoryTranscript, trajectoryRegressionId, } from "./trajectory.js";
|
|
16
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,wBAAwB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,yBAAyB,EACzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,8BAA8B,EAC9B,cAAc,EACd,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,kCAAkC,EAClC,kCAAkC,EAClC,0BAA0B,GAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EACL,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,KAAK,eAAe,EACpB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,cAAc,EACd,OAAO,GACR,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,wBAAwB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,yBAAyB,EACzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,8BAA8B,EAC9B,cAAc,EACd,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,kCAAkC,EAClC,kCAAkC,EAClC,0BAA0B,GAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EACL,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,gBAAgB,GACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,KAAK,eAAe,EACpB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,cAAc,EACd,OAAO,GACR,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACnG,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,0BAA0B,EAC1B,KAAK,iCAAiC,EACtC,yBAAyB,EACzB,0BAA0B,EAC1B,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,sBAAsB,GACvB,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,10 @@ export { AdversarialContractError, assertAdversarialContract, runAdversarialCont
|
|
|
11
11
|
export { AdapterCertificationError, assertAdapterCertification, cacheStoreCertificationProfile, certifyAdapter, defineCertificationProfile, eventDeliveryCertificationProfile, jobStoreCertificationProfile, runtimeAdapterCertificationProfile, storageAdapterCertificationProfile, verifyAdapterCertification, } from "./certification.js";
|
|
12
12
|
export { cookieJar } from "./cookies.js";
|
|
13
13
|
export { createFailureLab, FailureInjectedError, runFailureScenario, } from "./failure-lab.js";
|
|
14
|
+
export { defineFaultProfile, referenceFaultProfile, runFaultProfile, } from "./fault-profile.js";
|
|
15
|
+
export { proveIdempotency, } from "./idempotency.js";
|
|
14
16
|
export { assertIncidentReplays, captureIncident, generateRegressionTest, IncidentReplayError, redactForEmission, replayIncident, shapeOf, } from "./incident.js";
|
|
15
17
|
export { testSession } from "./session.js";
|
|
18
|
+
export { httpToolAdapter, inProcessToolAdapter, mcpToolAdapter, testToolAdapter, } from "./tool-contract.js";
|
|
19
|
+
export { assertTrajectoryInvariants, checkTrajectoryInvariants, createTrajectoryTranscript, recordTrajectory, replayTrajectory, runTrajectory, trajectoryRegressionId, } from "./trajectory.js";
|
|
16
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,wBAAwB,EAIxB,yBAAyB,EAUzB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,yBAAyB,EAGzB,0BAA0B,EAa1B,8BAA8B,EAC9B,cAAc,EACd,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,kCAAkC,EAClC,kCAAkC,EAClC,0BAA0B,GAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAkB,SAAS,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EACL,gBAAgB,EAGhB,oBAAoB,EAOpB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,qBAAqB,EAIrB,eAAe,EAEf,sBAAsB,EAEtB,mBAAmB,EAGnB,iBAAiB,EACjB,cAAc,EACd,OAAO,GACR,MAAM,eAAe,CAAA;AACtB,OAAO,EAA2D,WAAW,EAAE,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,wBAAwB,EAIxB,yBAAyB,EAUzB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,yBAAyB,EAGzB,0BAA0B,EAa1B,8BAA8B,EAC9B,cAAc,EACd,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,kCAAkC,EAClC,kCAAkC,EAClC,0BAA0B,GAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAkB,SAAS,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EACL,gBAAgB,EAGhB,oBAAoB,EAOpB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,kBAAkB,EAQlB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAIL,gBAAgB,GACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,qBAAqB,EAIrB,eAAe,EAEf,sBAAsB,EAEtB,mBAAmB,EAGnB,iBAAiB,EACjB,cAAc,EACd,OAAO,GACR,MAAM,eAAe,CAAA;AACtB,OAAO,EAA2D,WAAW,EAAE,MAAM,cAAc,CAAA;AACnG,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,0BAA0B,EAE1B,yBAAyB,EACzB,0BAA0B,EAE1B,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EAOb,sBAAsB,GACvB,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Test adapters for typed tool contracts. Assertions stay on the shared core pipeline. */
|
|
2
|
+
import { type ToolAdapter, type ToolCallOptions, type ToolContract } from "@nifrajs/core/tool-contract";
|
|
3
|
+
export declare function inProcessToolAdapter<Input, Output>(tool: ToolContract<Input, Output>, baseOptions?: ToolCallOptions): ToolAdapter;
|
|
4
|
+
export declare function testToolAdapter<Input, Output>(tool: ToolContract<Input, Output>, baseOptions?: ToolCallOptions): ToolAdapter;
|
|
5
|
+
export declare function mcpToolAdapter<Input, Output>(tool: ToolContract<Input, Output>, baseOptions?: Omit<ToolCallOptions, "signal" | "ledger">): ToolAdapter;
|
|
6
|
+
/** Exercise the Web adapter while returning the same normalized result shape as direct calls. */
|
|
7
|
+
export declare function httpToolAdapter<Input, Output>(tool: ToolContract<Input, Output>, baseOptions?: Omit<ToolCallOptions, "signal" | "ledger">): ToolAdapter;
|
|
8
|
+
//# sourceMappingURL=tool-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-contract.d.ts","sourceRoot":"","sources":["../src/tool-contract.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,EAGL,KAAK,WAAW,EAEhB,KAAK,eAAe,EACpB,KAAK,YAAY,EAGlB,MAAM,6BAA6B,CAAA;AAGpC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAChD,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,EACjC,WAAW,GAAE,eAAoB,GAChC,WAAW,CAKb;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAC3C,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,EACjC,WAAW,GAAE,eAAoB,GAChC,WAAW,CAKb;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAC1C,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,EACjC,WAAW,GAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAM,GAC3D,WAAW,CAmCb;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAC3C,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,EACjC,WAAW,GAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAM,GAC3D,WAAW,CA8Bb"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/** Test adapters for typed tool contracts. Assertions stay on the shared core pipeline. */
|
|
2
|
+
import { createToolHttpHandler, executeTool, } from "@nifrajs/core/tool-contract";
|
|
3
|
+
import { toMcpTool } from "@nifrajs/mcp/tool-contract";
|
|
4
|
+
export function inProcessToolAdapter(tool, baseOptions = {}) {
|
|
5
|
+
return {
|
|
6
|
+
name: "in-process",
|
|
7
|
+
call: (input, options) => executeTool(tool, input, { ...baseOptions, ...options }),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function testToolAdapter(tool, baseOptions = {}) {
|
|
11
|
+
return {
|
|
12
|
+
name: "test",
|
|
13
|
+
call: (input, options) => executeTool(tool, input, { ...baseOptions, ...options }),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function mcpToolAdapter(tool, baseOptions = {}) {
|
|
17
|
+
return {
|
|
18
|
+
name: "mcp",
|
|
19
|
+
async call(input, options) {
|
|
20
|
+
const args = recordOf(input);
|
|
21
|
+
if (args === undefined)
|
|
22
|
+
throw new Error("tool adapter: MCP input must be an object");
|
|
23
|
+
const mcp = toMcpTool(tool, { ...baseOptions, ...options });
|
|
24
|
+
const result = await mcp.handler(args, {
|
|
25
|
+
signal: options?.signal ?? new AbortController().signal,
|
|
26
|
+
requestId: "test",
|
|
27
|
+
reportProgress: () => { },
|
|
28
|
+
});
|
|
29
|
+
if (typeof result === "string")
|
|
30
|
+
throw new Error("tool adapter: MCP returned plain text");
|
|
31
|
+
const text = result.content?.find((item) => item.type === "text");
|
|
32
|
+
if (text === undefined || text.type !== "text")
|
|
33
|
+
throw new Error("tool adapter: MCP result has no text");
|
|
34
|
+
const parsed = JSON.parse(text.text);
|
|
35
|
+
const record = recordOf(parsed);
|
|
36
|
+
if (result.isError === true) {
|
|
37
|
+
const error = toolErrorOf(record?.error);
|
|
38
|
+
return {
|
|
39
|
+
ok: false,
|
|
40
|
+
dryRun: record?.dryRun === true,
|
|
41
|
+
error,
|
|
42
|
+
evidence: evidenceOf(record?.evidence),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
ok: true,
|
|
47
|
+
dryRun: record?.dryRun === true,
|
|
48
|
+
...(record?.output === undefined ? {} : { output: record.output }),
|
|
49
|
+
evidence: evidenceOf(record?.evidence),
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Exercise the Web adapter while returning the same normalized result shape as direct calls. */
|
|
55
|
+
export function httpToolAdapter(tool, baseOptions = {}) {
|
|
56
|
+
return {
|
|
57
|
+
name: "http",
|
|
58
|
+
async call(input, options) {
|
|
59
|
+
const handler = createToolHttpHandler(tool, { ...baseOptions, ...options });
|
|
60
|
+
const request = new Request("http://nifra.local/tool", {
|
|
61
|
+
method: "POST",
|
|
62
|
+
body: JSON.stringify(input),
|
|
63
|
+
});
|
|
64
|
+
const response = await handler(request);
|
|
65
|
+
const body = (await response.json());
|
|
66
|
+
if (response.status >= 200 && response.status < 300) {
|
|
67
|
+
const record = recordOf(body);
|
|
68
|
+
return {
|
|
69
|
+
ok: true,
|
|
70
|
+
dryRun: record?.dryRun === true,
|
|
71
|
+
...(record?.output === undefined ? {} : { output: record.output }),
|
|
72
|
+
evidence: Array.isArray(record?.evidence) ? record.evidence : [],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const record = recordOf(body);
|
|
76
|
+
const error = toolErrorOf(record?.error);
|
|
77
|
+
return {
|
|
78
|
+
ok: false,
|
|
79
|
+
dryRun: record?.dryRun === true,
|
|
80
|
+
error,
|
|
81
|
+
evidence: Array.isArray(record?.evidence) ? record.evidence : [],
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function recordOf(value) {
|
|
87
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
88
|
+
? value
|
|
89
|
+
: undefined;
|
|
90
|
+
}
|
|
91
|
+
function toolErrorOf(value) {
|
|
92
|
+
const record = recordOf(value);
|
|
93
|
+
const code = record?.code;
|
|
94
|
+
const stage = record?.stage;
|
|
95
|
+
if (!isToolErrorCode(code) || !isToolEvidenceStage(stage)) {
|
|
96
|
+
throw new Error("tool adapter: malformed error result");
|
|
97
|
+
}
|
|
98
|
+
return { code, stage };
|
|
99
|
+
}
|
|
100
|
+
function evidenceOf(value) {
|
|
101
|
+
if (!Array.isArray(value))
|
|
102
|
+
return [];
|
|
103
|
+
const evidence = [];
|
|
104
|
+
for (const item of value) {
|
|
105
|
+
const record = recordOf(item);
|
|
106
|
+
if (record === undefined || typeof record.seq !== "number" || !Number.isSafeInteger(record.seq))
|
|
107
|
+
continue;
|
|
108
|
+
if (!isToolEvidenceStage(record.stage) || !isToolEvidenceOutcome(record.outcome))
|
|
109
|
+
continue;
|
|
110
|
+
evidence.push({
|
|
111
|
+
seq: record.seq,
|
|
112
|
+
stage: record.stage,
|
|
113
|
+
outcome: record.outcome,
|
|
114
|
+
...(typeof record.code === "string" ? { code: record.code } : {}),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return evidence;
|
|
118
|
+
}
|
|
119
|
+
function isToolErrorCode(value) {
|
|
120
|
+
return (typeof value === "string" &&
|
|
121
|
+
[
|
|
122
|
+
"input_invalid",
|
|
123
|
+
"capability_denied",
|
|
124
|
+
"execution_policy_unsatisfied",
|
|
125
|
+
"approval_required",
|
|
126
|
+
"approval_denied",
|
|
127
|
+
"idempotency_store_missing",
|
|
128
|
+
"idempotency_durability",
|
|
129
|
+
"idempotency_duplicate",
|
|
130
|
+
"idempotency_in_flight",
|
|
131
|
+
"idempotency_capacity",
|
|
132
|
+
"budget_exceeded",
|
|
133
|
+
"cancelled",
|
|
134
|
+
"execution_failed",
|
|
135
|
+
"output_invalid",
|
|
136
|
+
"ledger_failed",
|
|
137
|
+
].includes(value));
|
|
138
|
+
}
|
|
139
|
+
function isToolEvidenceStage(value) {
|
|
140
|
+
return (typeof value === "string" &&
|
|
141
|
+
[
|
|
142
|
+
"input",
|
|
143
|
+
"capability",
|
|
144
|
+
"policy",
|
|
145
|
+
"approval",
|
|
146
|
+
"idempotency",
|
|
147
|
+
"budget",
|
|
148
|
+
"execution",
|
|
149
|
+
"output",
|
|
150
|
+
].includes(value));
|
|
151
|
+
}
|
|
152
|
+
function isToolEvidenceOutcome(value) {
|
|
153
|
+
return (typeof value === "string" &&
|
|
154
|
+
["passed", "denied", "failed", "skipped", "committed", "dry-run"].includes(value));
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=tool-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-contract.js","sourceRoot":"","sources":["../src/tool-contract.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,EACL,qBAAqB,EACrB,WAAW,GAOZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAEtD,MAAM,UAAU,oBAAoB,CAClC,IAAiC,EACjC,cAA+B,EAAE;IAEjC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;KACnF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAiC,EACjC,cAA+B,EAAE;IAEjC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;KACnF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAiC,EACjC,cAA0D,EAAE;IAE5D,OAAO;QACL,IAAI,EAAE,KAAK;QACX,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;YACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC5B,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;YACpF,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;gBACrC,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM;gBACvD,SAAS,EAAE,MAAM;gBACjB,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;aACzB,CAAC,CAAA;YACF,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;YACxF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;YACjE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAC5C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC/B,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;gBACxC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;oBAC/B,KAAK;oBACL,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC;iBACvC,CAAA;YACH,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;gBAC/B,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClE,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC;aACvC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAC7B,IAAiC,EACjC,cAA0D,EAAE;IAE5D,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;YACvB,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;YAC3E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,yBAAyB,EAAE;gBACrD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;aAC5B,CAAC,CAAA;YACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;YACvC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAY,CAAA;YAC/C,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAC7B,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;oBAC/B,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;iBACrC,CAAA;YAC/B,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YACxC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;gBAC/B,KAAK;gBACL,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;aACrC,CAAA;QAC/B,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAA;IACzB,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAA;IAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpC,MAAM,QAAQ,GAAmB,EAAE,CAAA;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YAC7F,SAAQ;QACV,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,SAAQ;QAC1F,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB;YACE,eAAe;YACf,mBAAmB;YACnB,8BAA8B;YAC9B,mBAAmB;YACnB,iBAAiB;YACjB,2BAA2B;YAC3B,wBAAwB;YACxB,uBAAuB;YACvB,uBAAuB;YACvB,sBAAsB;YACtB,iBAAiB;YACjB,WAAW;YACX,kBAAkB;YAClB,gBAAgB;YAChB,eAAe;SAChB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClB,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB;YACE,OAAO;YACP,YAAY;YACZ,QAAQ;YACR,UAAU;YACV,aAAa;YACb,QAAQ;YACR,WAAW;YACX,QAAQ;SACT,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClB,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type AgentDefinition, type AgentPorts, type AgentRunResult, type AgentTranscript, type AgentTurnInput, type AgentTurnState } from "@nifrajs/agent";
|
|
2
|
+
import type { StandardSchemaV1 } from "@nifrajs/core/schema";
|
|
3
|
+
import { type FailureEvidence } from "./failure-lab.js";
|
|
4
|
+
import type { FaultProfile } from "./fault-profile.js";
|
|
5
|
+
export interface TrajectoryTranscript {
|
|
6
|
+
readonly version: 1;
|
|
7
|
+
readonly digest: string;
|
|
8
|
+
readonly turn: AgentTranscript;
|
|
9
|
+
readonly faultProfile?: string;
|
|
10
|
+
readonly seed?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateTrajectoryTranscriptOptions {
|
|
13
|
+
readonly faultProfile?: string;
|
|
14
|
+
readonly seed?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface TrajectoryRun<Output> {
|
|
17
|
+
readonly result: AgentRunResult<Output>;
|
|
18
|
+
readonly transcript: TrajectoryTranscript;
|
|
19
|
+
}
|
|
20
|
+
export interface ReplayTrajectoryOptions {
|
|
21
|
+
readonly state: AgentTurnState;
|
|
22
|
+
readonly maxTurns?: number;
|
|
23
|
+
readonly goal?: (output: unknown) => boolean;
|
|
24
|
+
readonly faultProfile?: FaultProfile;
|
|
25
|
+
readonly seed?: number;
|
|
26
|
+
}
|
|
27
|
+
export type TrajectoryInvariantId = "ledger-evidence" | "capability-admission" | "budget-monotonic" | "bounded-stop" | "resumable-suspension";
|
|
28
|
+
export interface TrajectoryInvariantResult {
|
|
29
|
+
readonly id: TrajectoryInvariantId;
|
|
30
|
+
readonly ok: boolean;
|
|
31
|
+
readonly code?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface TrajectoryReplayResult<Output> {
|
|
34
|
+
readonly result: AgentRunResult<Output>;
|
|
35
|
+
readonly transcript: TrajectoryTranscript;
|
|
36
|
+
readonly faults: readonly FailureEvidence[];
|
|
37
|
+
readonly invariants: readonly TrajectoryInvariantResult[];
|
|
38
|
+
readonly regressionIds: readonly string[];
|
|
39
|
+
}
|
|
40
|
+
export interface TrajectoryInvariantOptions {
|
|
41
|
+
readonly maxSteps?: number;
|
|
42
|
+
/** Remaining budget snapshots, used when the caller owns a budget adapter. */
|
|
43
|
+
readonly budgetSnapshots?: readonly Readonly<Record<string, number>>[];
|
|
44
|
+
}
|
|
45
|
+
/** Record the transcript emitted by a turn without adding a second execution recording path. */
|
|
46
|
+
export declare function createTrajectoryTranscript(transcript: AgentTranscript, options?: CreateTrajectoryTranscriptOptions): Promise<TrajectoryTranscript>;
|
|
47
|
+
/** Alias that reads naturally at a call site which has just completed a run. */
|
|
48
|
+
export declare const recordTrajectory: typeof createTrajectoryTranscript;
|
|
49
|
+
export declare function runTrajectory<InputSchema extends StandardSchemaV1, OutputSchema extends StandardSchemaV1>(definition: AgentDefinition<InputSchema, OutputSchema>, input: AgentTurnInput, ports: AgentPorts, options: {
|
|
50
|
+
readonly state: AgentTurnState;
|
|
51
|
+
readonly maxTurns?: number;
|
|
52
|
+
readonly goal?: (output: unknown) => boolean;
|
|
53
|
+
}): Promise<TrajectoryRun<NonNullable<OutputSchema["~standard"]["types"]>["output"]>>;
|
|
54
|
+
/**
|
|
55
|
+
* Replay a recorded run with local model decisions and dry-run tools. The supplied model port is
|
|
56
|
+
* never called. Fault schedules use the existing deterministic failure-lab controller.
|
|
57
|
+
*/
|
|
58
|
+
export declare function replayTrajectory<InputSchema extends StandardSchemaV1, OutputSchema extends StandardSchemaV1>(definition: AgentDefinition<InputSchema, OutputSchema>, input: AgentTurnInput, ports: Omit<AgentPorts, "model">, transcript: TrajectoryTranscript, options: ReplayTrajectoryOptions): Promise<TrajectoryReplayResult<NonNullable<OutputSchema["~standard"]["types"]>["output"]>>;
|
|
59
|
+
export declare function checkTrajectoryInvariants(result: AgentRunResult<unknown>, options?: TrajectoryInvariantOptions): readonly TrajectoryInvariantResult[];
|
|
60
|
+
export declare function assertTrajectoryInvariants(result: AgentRunResult<unknown>, options?: TrajectoryInvariantOptions): void;
|
|
61
|
+
export declare function trajectoryRegressionId(transcript: TrajectoryTranscript, faultProfile: string, invariant: TrajectoryInvariantId): Promise<string>;
|
|
62
|
+
//# sourceMappingURL=trajectory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../src/trajectory.ts"],"names":[],"mappings":"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"}
|