@nodetool-ai/reliability-harness 0.8.1
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 +34 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/cli.d.ts +73 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +201 -0
- package/dist/cli.js.map +1 -0
- package/dist/compare.d.ts +98 -0
- package/dist/compare.d.ts.map +1 -0
- package/dist/compare.js +267 -0
- package/dist/compare.js.map +1 -0
- package/dist/core/diff.d.ts +39 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +114 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/golden.d.ts +50 -0
- package/dist/core/golden.d.ts.map +1 -0
- package/dist/core/golden.js +150 -0
- package/dist/core/golden.js.map +1 -0
- package/dist/core/invariants/index.d.ts +32 -0
- package/dist/core/invariants/index.d.ts.map +1 -0
- package/dist/core/invariants/index.js +44 -0
- package/dist/core/invariants/index.js.map +1 -0
- package/dist/core/invariants/leaks.d.ts +22 -0
- package/dist/core/invariants/leaks.d.ts.map +1 -0
- package/dist/core/invariants/leaks.js +55 -0
- package/dist/core/invariants/leaks.js.map +1 -0
- package/dist/core/invariants/lifecycle.d.ts +19 -0
- package/dist/core/invariants/lifecycle.d.ts.map +1 -0
- package/dist/core/invariants/lifecycle.js +95 -0
- package/dist/core/invariants/lifecycle.js.map +1 -0
- package/dist/core/invariants/protocol-validity.d.ts +4 -0
- package/dist/core/invariants/protocol-validity.d.ts.map +1 -0
- package/dist/core/invariants/protocol-validity.js +131 -0
- package/dist/core/invariants/protocol-validity.js.map +1 -0
- package/dist/core/invariants/state-machine.d.ts +29 -0
- package/dist/core/invariants/state-machine.d.ts.map +1 -0
- package/dist/core/invariants/state-machine.js +79 -0
- package/dist/core/invariants/state-machine.js.map +1 -0
- package/dist/core/invariants/status-sets.d.ts +27 -0
- package/dist/core/invariants/status-sets.d.ts.map +1 -0
- package/dist/core/invariants/status-sets.js +51 -0
- package/dist/core/invariants/status-sets.js.map +1 -0
- package/dist/core/invariants/terminal-uniqueness.d.ts +23 -0
- package/dist/core/invariants/terminal-uniqueness.d.ts.map +1 -0
- package/dist/core/invariants/terminal-uniqueness.js +99 -0
- package/dist/core/invariants/terminal-uniqueness.js.map +1 -0
- package/dist/core/invariants/types.d.ts +25 -0
- package/dist/core/invariants/types.d.ts.map +1 -0
- package/dist/core/invariants/types.js +2 -0
- package/dist/core/invariants/types.js.map +1 -0
- package/dist/core/journey.d.ts +121 -0
- package/dist/core/journey.d.ts.map +1 -0
- package/dist/core/journey.js +166 -0
- package/dist/core/journey.js.map +1 -0
- package/dist/core/normalize.d.ts +86 -0
- package/dist/core/normalize.d.ts.map +1 -0
- package/dist/core/normalize.js +182 -0
- package/dist/core/normalize.js.map +1 -0
- package/dist/core/record.d.ts +160 -0
- package/dist/core/record.d.ts.map +1 -0
- package/dist/core/record.js +74 -0
- package/dist/core/record.js.map +1 -0
- package/dist/core/stable-json.d.ts +13 -0
- package/dist/core/stable-json.d.ts.map +1 -0
- package/dist/core/stable-json.js +28 -0
- package/dist/core/stable-json.js.map +1 -0
- package/dist/drivers/anchors.d.ts +29 -0
- package/dist/drivers/anchors.d.ts.map +1 -0
- package/dist/drivers/anchors.js +48 -0
- package/dist/drivers/anchors.js.map +1 -0
- package/dist/drivers/app-headless.d.ts +39 -0
- package/dist/drivers/app-headless.d.ts.map +1 -0
- package/dist/drivers/app-headless.js +123 -0
- package/dist/drivers/app-headless.js.map +1 -0
- package/dist/drivers/browser.d.ts +34 -0
- package/dist/drivers/browser.d.ts.map +1 -0
- package/dist/drivers/browser.js +176 -0
- package/dist/drivers/browser.js.map +1 -0
- package/dist/drivers/cli.d.ts +13 -0
- package/dist/drivers/cli.d.ts.map +1 -0
- package/dist/drivers/cli.js +82 -0
- package/dist/drivers/cli.js.map +1 -0
- package/dist/drivers/fixture-nodes.d.ts +124 -0
- package/dist/drivers/fixture-nodes.d.ts.map +1 -0
- package/dist/drivers/fixture-nodes.js +189 -0
- package/dist/drivers/fixture-nodes.js.map +1 -0
- package/dist/drivers/index.d.ts +18 -0
- package/dist/drivers/index.d.ts.map +1 -0
- package/dist/drivers/index.js +12 -0
- package/dist/drivers/index.js.map +1 -0
- package/dist/drivers/kernel.d.ts +8 -0
- package/dist/drivers/kernel.d.ts.map +1 -0
- package/dist/drivers/kernel.js +247 -0
- package/dist/drivers/kernel.js.map +1 -0
- package/dist/drivers/packaged.d.ts +28 -0
- package/dist/drivers/packaged.d.ts.map +1 -0
- package/dist/drivers/packaged.js +303 -0
- package/dist/drivers/packaged.js.map +1 -0
- package/dist/drivers/python-bridge.d.ts +22 -0
- package/dist/drivers/python-bridge.d.ts.map +1 -0
- package/dist/drivers/python-bridge.js +48 -0
- package/dist/drivers/python-bridge.js.map +1 -0
- package/dist/drivers/registry.d.ts +11 -0
- package/dist/drivers/registry.d.ts.map +1 -0
- package/dist/drivers/registry.js +18 -0
- package/dist/drivers/registry.js.map +1 -0
- package/dist/drivers/relay-fields.d.ts +70 -0
- package/dist/drivers/relay-fields.d.ts.map +1 -0
- package/dist/drivers/relay-fields.js +104 -0
- package/dist/drivers/relay-fields.js.map +1 -0
- package/dist/drivers/repo-root.d.ts +9 -0
- package/dist/drivers/repo-root.d.ts.map +1 -0
- package/dist/drivers/repo-root.js +39 -0
- package/dist/drivers/repo-root.js.map +1 -0
- package/dist/drivers/spawn-cli.d.ts +8 -0
- package/dist/drivers/spawn-cli.d.ts.map +1 -0
- package/dist/drivers/spawn-cli.js +41 -0
- package/dist/drivers/spawn-cli.js.map +1 -0
- package/dist/drivers/types.d.ts +18 -0
- package/dist/drivers/types.d.ts.map +1 -0
- package/dist/drivers/types.js +2 -0
- package/dist/drivers/types.js.map +1 -0
- package/dist/drivers/ws-server.d.ts +8 -0
- package/dist/drivers/ws-server.d.ts.map +1 -0
- package/dist/drivers/ws-server.js +382 -0
- package/dist/drivers/ws-server.js.map +1 -0
- package/dist/faults/bridge-faults.d.ts +7 -0
- package/dist/faults/bridge-faults.d.ts.map +1 -0
- package/dist/faults/bridge-faults.js +90 -0
- package/dist/faults/bridge-faults.js.map +1 -0
- package/dist/faults/host-faults.d.ts +40 -0
- package/dist/faults/host-faults.d.ts.map +1 -0
- package/dist/faults/host-faults.js +70 -0
- package/dist/faults/host-faults.js.map +1 -0
- package/dist/faults/index.d.ts +21 -0
- package/dist/faults/index.d.ts.map +1 -0
- package/dist/faults/index.js +29 -0
- package/dist/faults/index.js.map +1 -0
- package/dist/faults/net-proxy.d.ts +75 -0
- package/dist/faults/net-proxy.d.ts.map +1 -0
- package/dist/faults/net-proxy.js +305 -0
- package/dist/faults/net-proxy.js.map +1 -0
- package/dist/faults/provider-faults.d.ts +12 -0
- package/dist/faults/provider-faults.d.ts.map +1 -0
- package/dist/faults/provider-faults.js +110 -0
- package/dist/faults/provider-faults.js.map +1 -0
- package/dist/faults/registry.d.ts +17 -0
- package/dist/faults/registry.d.ts.map +1 -0
- package/dist/faults/registry.js +15 -0
- package/dist/faults/registry.js.map +1 -0
- package/dist/faults/types.d.ts +42 -0
- package/dist/faults/types.d.ts.map +1 -0
- package/dist/faults/types.js +2 -0
- package/dist/faults/types.js.map +1 -0
- package/dist/faults/ws-faults.d.ts +6 -0
- package/dist/faults/ws-faults.d.ts.map +1 -0
- package/dist/faults/ws-faults.js +48 -0
- package/dist/faults/ws-faults.js.map +1 -0
- package/dist/faults/ws-proxy.d.ts +36 -0
- package/dist/faults/ws-proxy.d.ts.map +1 -0
- package/dist/faults/ws-proxy.js +40 -0
- package/dist/faults/ws-proxy.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"net-proxy.js","sourceRoot":"","sources":["../../src/faults/net-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FaultModule } from "./types.js";
|
|
2
|
+
/** Provider id journeys wire an LLM node's `model.provider` to in order to
|
|
3
|
+
* exercise a provider fault (kernel + ws-server share this process-wide
|
|
4
|
+
* registration). Overridable per-fault via `fault.params.providerId`. */
|
|
5
|
+
export declare const RELIABILITY_FAULT_PROVIDER_ID = "reliability-fault-llm";
|
|
6
|
+
export declare const PROVIDER_FAULT_MODULES: readonly FaultModule[];
|
|
7
|
+
/** Registers every provider-seam fault module. Called once from
|
|
8
|
+
* `faults/index.ts`'s module-load side effect (mirrors `registerBaseNodes`'
|
|
9
|
+
* "call once, own module state" shape) — safe to call again (registration is
|
|
10
|
+
* last-write-wins, same as `NodeRegistry.register`). */
|
|
11
|
+
export declare function registerProviderFaultModules(): void;
|
|
12
|
+
//# sourceMappingURL=provider-faults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-faults.d.ts","sourceRoot":"","sources":["../../src/faults/provider-faults.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAgB,WAAW,EAAiB,MAAM,YAAY,CAAC;AAE3E;;yEAEyE;AACzE,eAAO,MAAM,6BAA6B,0BAA0B,CAAC;AAsGrE,eAAO,MAAM,sBAAsB,EAAE,SAAS,WAAW,EAEG,CAAC;AAE7D;;;wDAGwD;AACxD,wBAAgB,4BAA4B,IAAI,IAAI,CAInD"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-seam fault modules (docs/RELIABILITY_ARCHITECTURE.md §9; task D1).
|
|
3
|
+
*
|
|
4
|
+
* Each of the seven `provider-*` fault names in `cli.ts`'s `KNOWN_FAULT_TYPES`
|
|
5
|
+
* maps to one `ProviderFault` kind the fault-capable `CassetteProvider`
|
|
6
|
+
* (`@nodetool-ai/runtime`) understands. `configure()` registers a
|
|
7
|
+
* `FaultCassetteProvider` under a fixed provider id
|
|
8
|
+
* ({@link RELIABILITY_FAULT_PROVIDER_ID}) into the process-wide provider
|
|
9
|
+
* registry (`@nodetool-ai/runtime`'s `registerProvider` — shared by the
|
|
10
|
+
* kernel driver's in-process session and the ws-server driver's in-process
|
|
11
|
+
* test server alike, since both run in this same Node process), and the
|
|
12
|
+
* teardown restores whatever was registered there before (or unregisters it
|
|
13
|
+
* if nothing was).
|
|
14
|
+
*
|
|
15
|
+
* A journey exercises this fault by giving an LLM node's `model.provider`
|
|
16
|
+
* the value {@link RELIABILITY_FAULT_PROVIDER_ID} (see
|
|
17
|
+
* `reliability/journeys/provider-failure-mid-stream/workflow.json`).
|
|
18
|
+
*/
|
|
19
|
+
import { CassetteProvider, FakeProvider, getRegisteredProvider, registerProvider, unregisterProvider } from "@nodetool-ai/runtime";
|
|
20
|
+
import { registerFaultModule } from "./registry.js";
|
|
21
|
+
/** Provider id journeys wire an LLM node's `model.provider` to in order to
|
|
22
|
+
* exercise a provider fault (kernel + ws-server share this process-wide
|
|
23
|
+
* registration). Overridable per-fault via `fault.params.providerId`. */
|
|
24
|
+
export const RELIABILITY_FAULT_PROVIDER_ID = "reliability-fault-llm";
|
|
25
|
+
/** `cli.ts`'s `KNOWN_FAULT_TYPES` `provider-*` entries, mapped to the
|
|
26
|
+
* `ProviderFault.kind` the cassette provider understands. */
|
|
27
|
+
const FAULT_KIND_BY_NAME = {
|
|
28
|
+
"provider-429": "http-429",
|
|
29
|
+
"provider-500": "http-500",
|
|
30
|
+
"provider-timeout": "timeout",
|
|
31
|
+
"provider-truncated-stream": "truncated-stream",
|
|
32
|
+
"provider-malformed-sse": "malformed-chunk",
|
|
33
|
+
"provider-slow-drip": "slow-drip",
|
|
34
|
+
"provider-cost-omission": "cost-omission"
|
|
35
|
+
};
|
|
36
|
+
const FAULT_FIXTURE_TEXT = "This is a deterministic reliability-harness fixture response used to " +
|
|
37
|
+
"exercise provider fault injection end to end.";
|
|
38
|
+
/** A `new (kwargs) => BaseProvider` shape (`registerProvider`'s contract) that
|
|
39
|
+
* wraps a fresh `FakeProvider` in a fault-scripted `CassetteProvider`. Kwargs
|
|
40
|
+
* carry the `ProviderFault` a given `getProvider()` call should apply — set
|
|
41
|
+
* per-registration by `configureProviderFault`, not per-instance by a caller. */
|
|
42
|
+
class FaultCassetteProvider extends CassetteProvider {
|
|
43
|
+
constructor(kwargs = {}) {
|
|
44
|
+
super(new FakeProvider({
|
|
45
|
+
textResponse: FAULT_FIXTURE_TEXT,
|
|
46
|
+
shouldStream: true,
|
|
47
|
+
chunkSize: 6
|
|
48
|
+
}), { mode: "auto", fault: kwargs.fault });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function faultParams(fault) {
|
|
52
|
+
return fault.params ?? {};
|
|
53
|
+
}
|
|
54
|
+
function providerIdFor(fault) {
|
|
55
|
+
const configured = faultParams(fault)["providerId"];
|
|
56
|
+
return typeof configured === "string" && configured.length > 0
|
|
57
|
+
? configured
|
|
58
|
+
: RELIABILITY_FAULT_PROVIDER_ID;
|
|
59
|
+
}
|
|
60
|
+
/** Builds the `ProviderFault` a fault module's `configure()` registers, from
|
|
61
|
+
* the fixed `kind` plus whatever numeric knobs the journey/`--faults` call
|
|
62
|
+
* supplied in `fault.params` (`afterChunks`, `delayMs`, `timeoutMs`,
|
|
63
|
+
* `retryAfterSeconds` — see `ProviderFault` in `cassette-provider.ts`). */
|
|
64
|
+
function buildProviderFault(kind, fault) {
|
|
65
|
+
const params = faultParams(fault);
|
|
66
|
+
const numeric = (key) => {
|
|
67
|
+
const value = params[key];
|
|
68
|
+
return typeof value === "number" ? value : undefined;
|
|
69
|
+
};
|
|
70
|
+
return {
|
|
71
|
+
kind,
|
|
72
|
+
afterChunks: numeric("afterChunks"),
|
|
73
|
+
delayMs: numeric("delayMs"),
|
|
74
|
+
timeoutMs: numeric("timeoutMs"),
|
|
75
|
+
retryAfterSeconds: numeric("retryAfterSeconds")
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function configureProviderFault(kind, ctx) {
|
|
79
|
+
const providerId = providerIdFor(ctx.fault);
|
|
80
|
+
const previous = getRegisteredProvider(providerId);
|
|
81
|
+
registerProvider(providerId, FaultCassetteProvider, {
|
|
82
|
+
fault: buildProviderFault(kind, ctx.fault)
|
|
83
|
+
});
|
|
84
|
+
return () => {
|
|
85
|
+
if (previous) {
|
|
86
|
+
registerProvider(providerId, previous.cls, previous.kwargs, previous.optionalKwargs);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
unregisterProvider(providerId);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function makeProviderFaultModule(name, kind) {
|
|
94
|
+
return {
|
|
95
|
+
name,
|
|
96
|
+
seam: "provider",
|
|
97
|
+
configure: (ctx) => configureProviderFault(kind, ctx)
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export const PROVIDER_FAULT_MODULES = Object.entries(FAULT_KIND_BY_NAME).map(([name, kind]) => makeProviderFaultModule(name, kind));
|
|
101
|
+
/** Registers every provider-seam fault module. Called once from
|
|
102
|
+
* `faults/index.ts`'s module-load side effect (mirrors `registerBaseNodes`'
|
|
103
|
+
* "call once, own module state" shape) — safe to call again (registration is
|
|
104
|
+
* last-write-wins, same as `NodeRegistry.register`). */
|
|
105
|
+
export function registerProviderFaultModules() {
|
|
106
|
+
for (const module of PROVIDER_FAULT_MODULES) {
|
|
107
|
+
registerFaultModule(module);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=provider-faults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-faults.js","sourceRoot":"","sources":["../../src/faults/provider-faults.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fault module registry (task D1) — name -> {@link FaultModule} lookup.
|
|
3
|
+
* `compare.ts` resolves a journey's declared (or `--faults`-selected) fault
|
|
4
|
+
* names against this map; a name with no registered module is reported as
|
|
5
|
+
* "unknown" the same way `compare.ts` already reports unknown invariants,
|
|
6
|
+
* rather than silently no-oping.
|
|
7
|
+
*
|
|
8
|
+
* D2/D3 add their own module files and call {@link registerFaultModule} from
|
|
9
|
+
* them (see `index.ts`'s barrel) — no edits needed here.
|
|
10
|
+
*/
|
|
11
|
+
import type { FaultModule } from "./types.js";
|
|
12
|
+
export declare function registerFaultModule(module: FaultModule): void;
|
|
13
|
+
export declare function getFaultModule(name: string): FaultModule | undefined;
|
|
14
|
+
export declare function listFaultModuleNames(): string[];
|
|
15
|
+
/** Test-only escape hatch: clears every registered module. */
|
|
16
|
+
export declare function clearFaultModulesForTests(): void;
|
|
17
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/faults/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAE7D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,8DAA8D;AAC9D,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const FAULT_MODULES = new Map();
|
|
2
|
+
export function registerFaultModule(module) {
|
|
3
|
+
FAULT_MODULES.set(module.name, module);
|
|
4
|
+
}
|
|
5
|
+
export function getFaultModule(name) {
|
|
6
|
+
return FAULT_MODULES.get(name);
|
|
7
|
+
}
|
|
8
|
+
export function listFaultModuleNames() {
|
|
9
|
+
return Array.from(FAULT_MODULES.keys()).sort();
|
|
10
|
+
}
|
|
11
|
+
/** Test-only escape hatch: clears every registered module. */
|
|
12
|
+
export function clearFaultModulesForTests() {
|
|
13
|
+
FAULT_MODULES.clear();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/faults/registry.ts"],"names":[],"mappings":"AAYA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;AAErD,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,yBAAyB;IACvC,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fault module plumbing (docs/RELIABILITY_ARCHITECTURE.md §9; task D1).
|
|
3
|
+
*
|
|
4
|
+
* A `FaultModule` is the harness's one extension point for fault injection:
|
|
5
|
+
* one module per named fault (matching `cli.ts`'s `KNOWN_FAULT_TYPES` and a
|
|
6
|
+
* journey's `faults` block entries, `core/journey.ts`'s `JourneyFault`),
|
|
7
|
+
* registered by name in `registry.ts`. `compare.ts` looks a fault up by name
|
|
8
|
+
* and calls `configure()` immediately before the driver run it applies to,
|
|
9
|
+
* then calls the returned teardown immediately after — so a fault's
|
|
10
|
+
* process-global side effects (today: the provider registry) never leak
|
|
11
|
+
* across surfaces or across journeys.
|
|
12
|
+
*
|
|
13
|
+
* D1 ships the "provider" seam (`provider-faults.ts`). D2 (WS proxy) and D3
|
|
14
|
+
* (bridge/host) add their own module files + `registerFaultModule` calls
|
|
15
|
+
* without touching this file, `registry.ts`, or `compare.ts`'s wiring.
|
|
16
|
+
*/
|
|
17
|
+
import type { Journey, JourneyFault, JourneySurface } from "../core/journey.js";
|
|
18
|
+
/** The five fault seams §9 names. */
|
|
19
|
+
export type FaultSeam = "provider" | "ws" | "bridge" | "host" | "client";
|
|
20
|
+
/** What a `FaultModule.configure()` call is being asked to apply. */
|
|
21
|
+
export interface FaultContext {
|
|
22
|
+
journey: Journey;
|
|
23
|
+
/** The surface about to run (or that just ran) with this fault applied. */
|
|
24
|
+
surface: JourneySurface | string;
|
|
25
|
+
/** The journey-declared (or `--faults`-synthesized) fault entry itself —
|
|
26
|
+
* carries `type`, the optional `surface` restriction, and `params`. */
|
|
27
|
+
fault: JourneyFault;
|
|
28
|
+
}
|
|
29
|
+
/** Undoes whatever `configure()` did. Always called once per `configure()`
|
|
30
|
+
* call, even when the driver run it wrapped threw. */
|
|
31
|
+
export type FaultTeardown = () => void | Promise<void>;
|
|
32
|
+
export interface FaultModule {
|
|
33
|
+
/** Matches a `JourneyFault.type` / `KNOWN_FAULT_TYPES` entry exactly. */
|
|
34
|
+
readonly name: string;
|
|
35
|
+
readonly seam: FaultSeam;
|
|
36
|
+
/** Applies the fault for the duration of one driver run. May be called
|
|
37
|
+
* many times concurrently-in-sequence (once per applicable surface) across
|
|
38
|
+
* one `compareJourney` call — implementations must not assume they're only
|
|
39
|
+
* ever configured once per process. */
|
|
40
|
+
configure(ctx: FaultContext): FaultTeardown | Promise<FaultTeardown>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/faults/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEhF,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzE,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC;IACjC;2EACuE;IACvE,KAAK,EAAE,YAAY,CAAC;CACrB;AAED;sDACsD;AACtD,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB;;;2CAGuC;IACvC,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACtE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/faults/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FaultModule } from "./types.js";
|
|
2
|
+
export declare const WS_FAULT_MODULES: readonly FaultModule[];
|
|
3
|
+
/** Registers every ws-seam fault module. Called once from `faults/index.ts`'s
|
|
4
|
+
* module-load side effect (mirrors `registerProviderFaultModules`). */
|
|
5
|
+
export declare function registerWsFaultModules(): void;
|
|
6
|
+
//# sourceMappingURL=ws-faults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-faults.d.ts","sourceRoot":"","sources":["../../src/faults/ws-faults.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAgB,WAAW,EAAiB,MAAM,YAAY,CAAC;AA+C3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,WAAW,EAEG,CAAC;AAEvD;uEACuE;AACvE,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { getActiveWsProxyFault, setActiveWsProxyFault } from "./ws-proxy.js";
|
|
2
|
+
import { registerFaultModule } from "./registry.js";
|
|
3
|
+
/** `cli.ts`'s `KNOWN_FAULT_TYPES` `ws-*` entries, mapped to the
|
|
4
|
+
* `WsProxyFaultKind` `net-proxy.ts`'s proxy understands. */
|
|
5
|
+
const FAULT_KIND_BY_NAME = {
|
|
6
|
+
"ws-drop-no-fin": "drop-no-fin",
|
|
7
|
+
"ws-delay": "delay",
|
|
8
|
+
"ws-reorder": "reorder",
|
|
9
|
+
"ws-fragment": "fragment",
|
|
10
|
+
"ws-stall-reads": "stall-reads",
|
|
11
|
+
"ws-abrupt-close": "abrupt-close"
|
|
12
|
+
};
|
|
13
|
+
function faultParams(fault) {
|
|
14
|
+
return fault.params ?? {};
|
|
15
|
+
}
|
|
16
|
+
function numericParam(params, key) {
|
|
17
|
+
const value = params[key];
|
|
18
|
+
return typeof value === "number" ? value : undefined;
|
|
19
|
+
}
|
|
20
|
+
function configureWsFault(kind, ctx) {
|
|
21
|
+
const params = faultParams(ctx.fault);
|
|
22
|
+
const previous = getActiveWsProxyFault();
|
|
23
|
+
setActiveWsProxyFault({
|
|
24
|
+
kind,
|
|
25
|
+
afterFrames: numericParam(params, "afterFrames"),
|
|
26
|
+
delayMs: numericParam(params, "delayMs"),
|
|
27
|
+
chunkBytes: numericParam(params, "chunkBytes")
|
|
28
|
+
});
|
|
29
|
+
return () => {
|
|
30
|
+
setActiveWsProxyFault(previous);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function makeWsFaultModule(name, kind) {
|
|
34
|
+
return {
|
|
35
|
+
name,
|
|
36
|
+
seam: "ws",
|
|
37
|
+
configure: (ctx) => configureWsFault(kind, ctx)
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export const WS_FAULT_MODULES = Object.entries(FAULT_KIND_BY_NAME).map(([name, kind]) => makeWsFaultModule(name, kind));
|
|
41
|
+
/** Registers every ws-seam fault module. Called once from `faults/index.ts`'s
|
|
42
|
+
* module-load side effect (mirrors `registerProviderFaultModules`). */
|
|
43
|
+
export function registerWsFaultModules() {
|
|
44
|
+
for (const module of WS_FAULT_MODULES) {
|
|
45
|
+
registerFaultModule(module);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ws-faults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-faults.js","sourceRoot":"","sources":["../../src/faults/ws-faults.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD;4DAC4D;AAC5D,MAAM,kBAAkB,GAA+C;IACrE,gBAAgB,EAAE,aAAa;IAC/B,UAAU,EAAE,OAAO;IACnB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,UAAU;IACzB,gBAAgB,EAAE,aAAa;IAC/B,iBAAiB,EAAE,cAAc;CAClC,CAAC;AAEF,SAAS,WAAW,CAAC,KAA4B;IAC/C,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CACnB,MAA+B,EAC/B,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAsB,EAAE,GAAiB;IACjE,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,qBAAqB,CAAC;QACpB,IAAI;QACJ,WAAW,EAAE,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC;QAChD,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;QACxC,UAAU,EAAE,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,GAAG,EAAE;QACV,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAsB;IAC7D,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAA2B,MAAM,CAAC,OAAO,CACpE,kBAAkB,CACnB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvD;uEACuE;AACvE,MAAM,UAAU,sBAAsB;IACpC,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WS-seam fault wiring (docs/RELIABILITY_ARCHITECTURE.md §9 "WS transport"
|
|
3
|
+
* row; task D2). `ws-faults.ts`'s `FaultModule.configure()` calls only know
|
|
4
|
+
* a `FaultContext` (journey/surface/fault) — never a driver instance
|
|
5
|
+
* (`faults/types.ts`'s contract, which D2 doesn't touch) — so, exactly like
|
|
6
|
+
* `provider-faults.ts` registers a fault-scripted provider into a
|
|
7
|
+
* process-wide registry the driver already consults by provider id, this
|
|
8
|
+
* module holds one process-wide "is a ws fault active right now" slot that
|
|
9
|
+
* `drivers/ws-server.ts` consults on every run. Nothing here talks to a
|
|
10
|
+
* socket directly; `net-proxy.ts` is the mechanism, this is the seam.
|
|
11
|
+
*/
|
|
12
|
+
import { WsFaultProxy, type WsProxyFaultConfig } from "./net-proxy.js";
|
|
13
|
+
/** Set by a `ws-faults.ts` module's `configure()`; cleared by its teardown. */
|
|
14
|
+
export declare function setActiveWsProxyFault(config: WsProxyFaultConfig | null): void;
|
|
15
|
+
export declare function getActiveWsProxyFault(): WsProxyFaultConfig | null;
|
|
16
|
+
/** A running proxy front-end plus enough to tear it down and (for the
|
|
17
|
+
* client-reconnect-mid-run journey, outside the declarative fault matrix)
|
|
18
|
+
* sever its connections on demand. */
|
|
19
|
+
export interface WsProxyFrontEnd {
|
|
20
|
+
port: number;
|
|
21
|
+
proxy: WsFaultProxy;
|
|
22
|
+
close: () => Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Called by `WsServerDriver.run()` right after it starts the real hermetic
|
|
26
|
+
* server: when a ws-seam fault is currently active, spins up a
|
|
27
|
+
* {@link WsFaultProxy} in front of `targetPort` and returns its listening
|
|
28
|
+
* port — the driver connects its client there instead of straight to the
|
|
29
|
+
* server, so every ws-* fault applies transparently to the existing driver
|
|
30
|
+
* without the driver knowing which fault kind it is. Returns `null` when no
|
|
31
|
+
* ws fault is active (the overwhelming majority of runs), in which case the
|
|
32
|
+
* driver connects directly exactly as it did before D2 — this function is a
|
|
33
|
+
* no-op on the hot path.
|
|
34
|
+
*/
|
|
35
|
+
export declare function maybeFrontWithProxy(targetHost: string, targetPort: number): Promise<WsProxyFrontEnd | null>;
|
|
36
|
+
//# sourceMappingURL=ws-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-proxy.d.ts","sourceRoot":"","sources":["../../src/faults/ws-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIvE,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAE7E;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE;AAED;;sCAEsC;AACtC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAMjC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WS-seam fault wiring (docs/RELIABILITY_ARCHITECTURE.md §9 "WS transport"
|
|
3
|
+
* row; task D2). `ws-faults.ts`'s `FaultModule.configure()` calls only know
|
|
4
|
+
* a `FaultContext` (journey/surface/fault) — never a driver instance
|
|
5
|
+
* (`faults/types.ts`'s contract, which D2 doesn't touch) — so, exactly like
|
|
6
|
+
* `provider-faults.ts` registers a fault-scripted provider into a
|
|
7
|
+
* process-wide registry the driver already consults by provider id, this
|
|
8
|
+
* module holds one process-wide "is a ws fault active right now" slot that
|
|
9
|
+
* `drivers/ws-server.ts` consults on every run. Nothing here talks to a
|
|
10
|
+
* socket directly; `net-proxy.ts` is the mechanism, this is the seam.
|
|
11
|
+
*/
|
|
12
|
+
import { WsFaultProxy } from "./net-proxy.js";
|
|
13
|
+
let activeFault = null;
|
|
14
|
+
/** Set by a `ws-faults.ts` module's `configure()`; cleared by its teardown. */
|
|
15
|
+
export function setActiveWsProxyFault(config) {
|
|
16
|
+
activeFault = config;
|
|
17
|
+
}
|
|
18
|
+
export function getActiveWsProxyFault() {
|
|
19
|
+
return activeFault;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Called by `WsServerDriver.run()` right after it starts the real hermetic
|
|
23
|
+
* server: when a ws-seam fault is currently active, spins up a
|
|
24
|
+
* {@link WsFaultProxy} in front of `targetPort` and returns its listening
|
|
25
|
+
* port — the driver connects its client there instead of straight to the
|
|
26
|
+
* server, so every ws-* fault applies transparently to the existing driver
|
|
27
|
+
* without the driver knowing which fault kind it is. Returns `null` when no
|
|
28
|
+
* ws fault is active (the overwhelming majority of runs), in which case the
|
|
29
|
+
* driver connects directly exactly as it did before D2 — this function is a
|
|
30
|
+
* no-op on the hot path.
|
|
31
|
+
*/
|
|
32
|
+
export async function maybeFrontWithProxy(targetHost, targetPort) {
|
|
33
|
+
const config = activeFault;
|
|
34
|
+
if (!config)
|
|
35
|
+
return null;
|
|
36
|
+
const proxy = new WsFaultProxy(targetHost, targetPort, config);
|
|
37
|
+
const port = await proxy.listen();
|
|
38
|
+
return { port, proxy, close: () => proxy.close() };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ws-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-proxy.js","sourceRoot":"","sources":["../../src/faults/ws-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAEvE,IAAI,WAAW,GAA8B,IAAI,CAAC;AAElD,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB,CAAC,MAAiC;IACrE,WAAW,GAAG,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,WAAW,CAAC;AACrB,CAAC;AAWD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,UAAkB;IAElB,MAAM,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AACrD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./core/journey.js";
|
|
2
|
+
export * from "./core/record.js";
|
|
3
|
+
export * from "./core/normalize.js";
|
|
4
|
+
export * from "./core/diff.js";
|
|
5
|
+
export * from "./core/stable-json.js";
|
|
6
|
+
export * from "./core/golden.js";
|
|
7
|
+
export * from "./core/invariants/index.js";
|
|
8
|
+
export * from "./drivers/index.js";
|
|
9
|
+
export * from "./faults/index.js";
|
|
10
|
+
export * from "./compare.js";
|
|
11
|
+
export * from "./cli.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./core/journey.js";
|
|
2
|
+
export * from "./core/record.js";
|
|
3
|
+
export * from "./core/normalize.js";
|
|
4
|
+
export * from "./core/diff.js";
|
|
5
|
+
export * from "./core/stable-json.js";
|
|
6
|
+
export * from "./core/golden.js";
|
|
7
|
+
export * from "./core/invariants/index.js";
|
|
8
|
+
export * from "./drivers/index.js";
|
|
9
|
+
export * from "./faults/index.js";
|
|
10
|
+
export * from "./compare.js";
|
|
11
|
+
export * from "./cli.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nodetool-ai/reliability-harness",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"engines": {
|
|
5
|
+
"node": ">=22.0.0"
|
|
6
|
+
},
|
|
7
|
+
"version": "0.8.1",
|
|
8
|
+
"description": "Reliability harness core: journey manifests, RunRecord, normalization, and per-channel stream diff (docs/RELIABILITY_ARCHITECTURE.md §12)",
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "node ../../scripts/build-typescript-workspace.mjs",
|
|
13
|
+
"test": "node ../../scripts/run-vitest.mjs run",
|
|
14
|
+
"test:watch": "node ../../scripts/run-vitest.mjs",
|
|
15
|
+
"lint": "node ../../scripts/run-tsc.mjs --noEmit"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@nodetool-ai/base-nodes": "^0.8.1",
|
|
19
|
+
"@nodetool-ai/execution": "^0.8.1",
|
|
20
|
+
"@nodetool-ai/node-sdk": "^0.8.1",
|
|
21
|
+
"@nodetool-ai/protocol": "^0.8.1",
|
|
22
|
+
"@nodetool-ai/runtime": "^0.8.1",
|
|
23
|
+
"@nodetool-ai/storage": "^0.8.1",
|
|
24
|
+
"@nodetool-ai/websocket": "^0.8.1",
|
|
25
|
+
"ws": "^8.18.0",
|
|
26
|
+
"zod": "^4.0.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@nodetool-ai/config": "*",
|
|
30
|
+
"@nodetool-ai/models": "*",
|
|
31
|
+
"@nodetool-ai/security": "*",
|
|
32
|
+
"@types/node": "^22.0.0",
|
|
33
|
+
"@types/ws": "^8.5.10",
|
|
34
|
+
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
35
|
+
"vitest": "^5.0.1"
|
|
36
|
+
},
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"nodetool-dev": "./src/index.ts",
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"default": "./dist/index.js"
|
|
43
|
+
},
|
|
44
|
+
"./drivers": {
|
|
45
|
+
"nodetool-dev": "./src/drivers/index.ts",
|
|
46
|
+
"types": "./dist/drivers/index.d.ts",
|
|
47
|
+
"import": "./dist/drivers/index.js",
|
|
48
|
+
"default": "./dist/drivers/index.js"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "https://github.com/nodetool-ai/nodetool.git",
|
|
55
|
+
"directory": "reliability/harness"
|
|
56
|
+
},
|
|
57
|
+
"homepage": "https://nodetool.ai",
|
|
58
|
+
"bugs": {
|
|
59
|
+
"url": "https://github.com/nodetool-ai/nodetool/issues"
|
|
60
|
+
},
|
|
61
|
+
"publishConfig": {
|
|
62
|
+
"access": "public"
|
|
63
|
+
},
|
|
64
|
+
"files": [
|
|
65
|
+
"dist",
|
|
66
|
+
"README.md"
|
|
67
|
+
],
|
|
68
|
+
"keywords": [
|
|
69
|
+
"nodetool",
|
|
70
|
+
"reliability",
|
|
71
|
+
"harness",
|
|
72
|
+
"journey",
|
|
73
|
+
"run-record"
|
|
74
|
+
]
|
|
75
|
+
}
|