orbit-agent-runtime 0.8.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/CHANGELOG.md +750 -0
- package/LICENSE +201 -0
- package/README.md +492 -0
- package/README.zh-CN.md +389 -0
- package/benchmarks/README.md +24 -0
- package/benchmarks/gateway.mjs +68 -0
- package/benchmarks/pae.mjs +90 -0
- package/benchmarks/replay.mjs +51 -0
- package/benchmarks/run-all.mjs +24 -0
- package/benchmarks/wal.mjs +50 -0
- package/bin/orbit.mjs +523 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/demo-deepseek.d.ts +2 -0
- package/dist/demo-deepseek.d.ts.map +1 -0
- package/dist/demo-deepseek.js +66 -0
- package/dist/demo-deepseek.js.map +1 -0
- package/dist/demo-host.d.ts +2 -0
- package/dist/demo-host.d.ts.map +1 -0
- package/dist/demo-host.js +98 -0
- package/dist/demo-host.js.map +1 -0
- package/dist/demo-replay.d.ts +2 -0
- package/dist/demo-replay.d.ts.map +1 -0
- package/dist/demo-replay.js +68 -0
- package/dist/demo-replay.js.map +1 -0
- package/dist/src/core/orbitRuntimeHost.d.ts +349 -0
- package/dist/src/core/orbitRuntimeHost.d.ts.map +1 -0
- package/dist/src/core/orbitRuntimeHost.js +706 -0
- package/dist/src/core/orbitRuntimeHost.js.map +1 -0
- package/dist/src/index.d.ts +92 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +226 -0
- package/dist/src/index.js.map +1 -0
- package/dist/test/audit_chain.test.d.ts +2 -0
- package/dist/test/audit_chain.test.d.ts.map +1 -0
- package/dist/test/audit_chain.test.js +283 -0
- package/dist/test/audit_chain.test.js.map +1 -0
- package/dist/test/channel_hub.test.d.ts +2 -0
- package/dist/test/channel_hub.test.d.ts.map +1 -0
- package/dist/test/channel_hub.test.js +66 -0
- package/dist/test/channel_hub.test.js.map +1 -0
- package/dist/test/cordis_adapter.test.d.ts +2 -0
- package/dist/test/cordis_adapter.test.d.ts.map +1 -0
- package/dist/test/cordis_adapter.test.js +280 -0
- package/dist/test/cordis_adapter.test.js.map +1 -0
- package/dist/test/cost_routing.test.d.ts +2 -0
- package/dist/test/cost_routing.test.d.ts.map +1 -0
- package/dist/test/cost_routing.test.js +31 -0
- package/dist/test/cost_routing.test.js.map +1 -0
- package/dist/test/domain_transaction.test.d.ts +2 -0
- package/dist/test/domain_transaction.test.d.ts.map +1 -0
- package/dist/test/domain_transaction.test.js +351 -0
- package/dist/test/domain_transaction.test.js.map +1 -0
- package/dist/test/file_channel.test.d.ts +2 -0
- package/dist/test/file_channel.test.d.ts.map +1 -0
- package/dist/test/file_channel.test.js +179 -0
- package/dist/test/file_channel.test.js.map +1 -0
- package/dist/test/gateway.test.d.ts +2 -0
- package/dist/test/gateway.test.d.ts.map +1 -0
- package/dist/test/gateway.test.js +548 -0
- package/dist/test/gateway.test.js.map +1 -0
- package/dist/test/governance_profile.test.d.ts +2 -0
- package/dist/test/governance_profile.test.d.ts.map +1 -0
- package/dist/test/governance_profile.test.js +214 -0
- package/dist/test/governance_profile.test.js.map +1 -0
- package/dist/test/governance_schema.test.d.ts +2 -0
- package/dist/test/governance_schema.test.d.ts.map +1 -0
- package/dist/test/governance_schema.test.js +200 -0
- package/dist/test/governance_schema.test.js.map +1 -0
- package/dist/test/host_integration.test.d.ts +2 -0
- package/dist/test/host_integration.test.d.ts.map +1 -0
- package/dist/test/host_integration.test.js +104 -0
- package/dist/test/host_integration.test.js.map +1 -0
- package/dist/test/host_journal_persistence.test.d.ts +2 -0
- package/dist/test/host_journal_persistence.test.d.ts.map +1 -0
- package/dist/test/host_journal_persistence.test.js +367 -0
- package/dist/test/host_journal_persistence.test.js.map +1 -0
- package/dist/test/impact_domain.test.d.ts +2 -0
- package/dist/test/impact_domain.test.d.ts.map +1 -0
- package/dist/test/impact_domain.test.js +48 -0
- package/dist/test/impact_domain.test.js.map +1 -0
- package/dist/test/injected_clock.test.d.ts +13 -0
- package/dist/test/injected_clock.test.d.ts.map +1 -0
- package/dist/test/injected_clock.test.js +200 -0
- package/dist/test/injected_clock.test.js.map +1 -0
- package/dist/test/isolation_domain.test.d.ts +2 -0
- package/dist/test/isolation_domain.test.d.ts.map +1 -0
- package/dist/test/isolation_domain.test.js +302 -0
- package/dist/test/isolation_domain.test.js.map +1 -0
- package/dist/test/journal_wal.test.d.ts +2 -0
- package/dist/test/journal_wal.test.d.ts.map +1 -0
- package/dist/test/journal_wal.test.js +622 -0
- package/dist/test/journal_wal.test.js.map +1 -0
- package/dist/test/mcp_adapter.test.d.ts +2 -0
- package/dist/test/mcp_adapter.test.d.ts.map +1 -0
- package/dist/test/mcp_adapter.test.js +440 -0
- package/dist/test/mcp_adapter.test.js.map +1 -0
- package/dist/test/openai_compat_channel.test.d.ts +2 -0
- package/dist/test/openai_compat_channel.test.d.ts.map +1 -0
- package/dist/test/openai_compat_channel.test.js +325 -0
- package/dist/test/openai_compat_channel.test.js.map +1 -0
- package/dist/test/openapi_adapter.test.d.ts +2 -0
- package/dist/test/openapi_adapter.test.d.ts.map +1 -0
- package/dist/test/openapi_adapter.test.js +270 -0
- package/dist/test/openapi_adapter.test.js.map +1 -0
- package/dist/test/orbit_cli.test.d.ts +2 -0
- package/dist/test/orbit_cli.test.d.ts.map +1 -0
- package/dist/test/orbit_cli.test.js +137 -0
- package/dist/test/orbit_cli.test.js.map +1 -0
- package/dist/test/pact_verifier.test.d.ts +2 -0
- package/dist/test/pact_verifier.test.d.ts.map +1 -0
- package/dist/test/pact_verifier.test.js +41 -0
- package/dist/test/pact_verifier.test.js.map +1 -0
- package/dist/test/pae_adapter.test.d.ts +2 -0
- package/dist/test/pae_adapter.test.d.ts.map +1 -0
- package/dist/test/pae_adapter.test.js +469 -0
- package/dist/test/pae_adapter.test.js.map +1 -0
- package/dist/test/plugin_sandbox_guard.test.d.ts +2 -0
- package/dist/test/plugin_sandbox_guard.test.d.ts.map +1 -0
- package/dist/test/plugin_sandbox_guard.test.js +57 -0
- package/dist/test/plugin_sandbox_guard.test.js.map +1 -0
- package/dist/test/rate_limit_behavior.test.d.ts +2 -0
- package/dist/test/rate_limit_behavior.test.d.ts.map +1 -0
- package/dist/test/rate_limit_behavior.test.js +85 -0
- package/dist/test/rate_limit_behavior.test.js.map +1 -0
- package/dist/test/replay_compat.test.d.ts +2 -0
- package/dist/test/replay_compat.test.d.ts.map +1 -0
- package/dist/test/replay_compat.test.js +1122 -0
- package/dist/test/replay_compat.test.js.map +1 -0
- package/dist/test/replay_engine.test.d.ts +2 -0
- package/dist/test/replay_engine.test.d.ts.map +1 -0
- package/dist/test/replay_engine.test.js +85 -0
- package/dist/test/replay_engine.test.js.map +1 -0
- package/dist/test/shell_channel.test.d.ts +2 -0
- package/dist/test/shell_channel.test.d.ts.map +1 -0
- package/dist/test/shell_channel.test.js +173 -0
- package/dist/test/shell_channel.test.js.map +1 -0
- package/dist/test/teardown_isolation.test.d.ts +10 -0
- package/dist/test/teardown_isolation.test.d.ts.map +1 -0
- package/dist/test/teardown_isolation.test.js +279 -0
- package/dist/test/teardown_isolation.test.js.map +1 -0
- package/dist/test/token_budget.test.d.ts +2 -0
- package/dist/test/token_budget.test.d.ts.map +1 -0
- package/dist/test/token_budget.test.js +113 -0
- package/dist/test/token_budget.test.js.map +1 -0
- package/dist/test/trace_journal.test.d.ts +2 -0
- package/dist/test/trace_journal.test.d.ts.map +1 -0
- package/dist/test/trace_journal.test.js +43 -0
- package/dist/test/trace_journal.test.js.map +1 -0
- package/dist/test/trace_journal_persistence.test.d.ts +2 -0
- package/dist/test/trace_journal_persistence.test.d.ts.map +1 -0
- package/dist/test/trace_journal_persistence.test.js +175 -0
- package/dist/test/trace_journal_persistence.test.js.map +1 -0
- package/dist/test/trace_persistence.test.d.ts +2 -0
- package/dist/test/trace_persistence.test.d.ts.map +1 -0
- package/dist/test/trace_persistence.test.js +216 -0
- package/dist/test/trace_persistence.test.js.map +1 -0
- package/dist/test/trip_protector.test.d.ts +2 -0
- package/dist/test/trip_protector.test.d.ts.map +1 -0
- package/dist/test/trip_protector.test.js +42 -0
- package/dist/test/trip_protector.test.js.map +1 -0
- package/examples/README.md +34 -0
- package/examples/cli-record-replay.mjs +74 -0
- package/examples/custom-channel.mjs +102 -0
- package/examples/js-pae-plugin.mjs +128 -0
- package/examples/mcp-adapter.mjs +102 -0
- package/package.json +60 -0
- package/src/core/orbitRuntimeHost.ts +853 -0
- package/src/index.ts +256 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* W29 — governance profiles (VISION §3.1) end to end.
|
|
8
|
+
*
|
|
9
|
+
* The four-tier model is now concrete, switchable configuration. The critical
|
|
10
|
+
* invariant: the `standard` profile must resolve to the kernel's pre-W29
|
|
11
|
+
* numbers VERBATIM — a default host is byte-for-byte what it was before the
|
|
12
|
+
* feature existed. Everything else follows from that identity.
|
|
13
|
+
*/
|
|
14
|
+
const node_test_1 = require("node:test");
|
|
15
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
16
|
+
const index_1 = require("../src/index");
|
|
17
|
+
/* -------------------------------------------------------- profile resolution */
|
|
18
|
+
(0, node_test_1.test)("governance: the standard profile is the kernel's pre-W29 default verbatim", () => {
|
|
19
|
+
const std = (0, index_1.resolveGovernanceProfile)("standard");
|
|
20
|
+
strict_1.default.equal(std.limiter.maxCallsPerWindow, index_1.DEFAULT_RATE_LIMIT_CONFIG.maxCallsPerWindow);
|
|
21
|
+
strict_1.default.equal(std.limiter.windowSizeCalls, index_1.DEFAULT_RATE_LIMIT_CONFIG.windowSizeCalls);
|
|
22
|
+
strict_1.default.equal(std.trip.failureThreshold, 5);
|
|
23
|
+
strict_1.default.equal(std.trip.cooldownMs, 10_000);
|
|
24
|
+
strict_1.default.equal(std.compression, "normal");
|
|
25
|
+
strict_1.default.equal(std.traceDurability, "optional");
|
|
26
|
+
// The profile config maps to the exact engine defaults too.
|
|
27
|
+
strict_1.default.deepEqual((0, index_1.tokenBudgetConfigForProfile)(std), index_1.DEFAULT_TOKEN_BUDGET_CONFIG);
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.test)("governance: omitted or unknown profile resolves to standard (backward compatible)", () => {
|
|
30
|
+
strict_1.default.equal((0, index_1.resolveGovernanceProfile)(undefined).name, "standard");
|
|
31
|
+
strict_1.default.equal((0, index_1.resolveGovernanceProfile)("does-not-exist").name, "standard");
|
|
32
|
+
});
|
|
33
|
+
(0, node_test_1.test)("governance: the three tiers differ in the expected direction", () => {
|
|
34
|
+
const sandbox = (0, index_1.resolveGovernanceProfile)("sandbox");
|
|
35
|
+
const std = (0, index_1.resolveGovernanceProfile)("standard");
|
|
36
|
+
const strict = (0, index_1.resolveGovernanceProfile)("strict");
|
|
37
|
+
// Rate limits tighten sandbox -> standard -> strict.
|
|
38
|
+
strict_1.default.ok(sandbox.limiter.maxCallsPerWindow > std.limiter.maxCallsPerWindow);
|
|
39
|
+
strict_1.default.ok(std.limiter.maxCallsPerWindow > strict.limiter.maxCallsPerWindow);
|
|
40
|
+
// Compression escalates off -> normal -> aggressive.
|
|
41
|
+
strict_1.default.equal(sandbox.compression, "off");
|
|
42
|
+
strict_1.default.equal(std.compression, "normal");
|
|
43
|
+
strict_1.default.equal(strict.compression, "aggressive");
|
|
44
|
+
// PAE admission stays capability-complete on sandbox + standard (governance
|
|
45
|
+
// axiom: tiers scale strength, never capability); strict closes it.
|
|
46
|
+
strict_1.default.equal(sandbox.paeAdmission, "all");
|
|
47
|
+
strict_1.default.equal(std.paeAdmission, "all");
|
|
48
|
+
strict_1.default.deepEqual([...strict.paeAdmission], []);
|
|
49
|
+
// Durability escalates memory -> optional -> required.
|
|
50
|
+
strict_1.default.equal(sandbox.traceDurability, "memory");
|
|
51
|
+
strict_1.default.equal(strict.traceDurability, "required");
|
|
52
|
+
});
|
|
53
|
+
(0, node_test_1.test)("governance: profile hashes differ across tiers and are stable within a tier", () => {
|
|
54
|
+
const h = (name) => (0, index_1.governanceProfileHash)((0, index_1.resolveGovernanceProfile)(name));
|
|
55
|
+
strict_1.default.notEqual(h("sandbox"), h("standard"));
|
|
56
|
+
strict_1.default.notEqual(h("standard"), h("strict"));
|
|
57
|
+
strict_1.default.equal(h("standard"), h("standard"));
|
|
58
|
+
});
|
|
59
|
+
/* ------------------------------------------------- profile -> mechanism wiring */
|
|
60
|
+
(0, node_test_1.test)("governance: sandbox disables token compression (engine is a pass-through)", async () => {
|
|
61
|
+
const host = new index_1.OrbitRuntimeHost({ governanceProfile: "sandbox" });
|
|
62
|
+
await host.bootHost();
|
|
63
|
+
strict_1.default.equal(host.currentGovernanceProfile.compression, "off");
|
|
64
|
+
// A payload above the compression threshold must NOT be compressed.
|
|
65
|
+
const big = "x".repeat(10_000);
|
|
66
|
+
const decision = host.tokenBudget.decideCompression(big);
|
|
67
|
+
strict_1.default.equal(decision.applied, false);
|
|
68
|
+
await host.shutdownHost();
|
|
69
|
+
});
|
|
70
|
+
(0, node_test_1.test)("governance: strict compresses earlier and harder than standard", async () => {
|
|
71
|
+
const strictHost = new index_1.OrbitRuntimeHost({
|
|
72
|
+
governanceProfile: "strict",
|
|
73
|
+
auditSigningKey: "test-key",
|
|
74
|
+
traceJournalPath: "./dist-test-strict-compress.wal"
|
|
75
|
+
});
|
|
76
|
+
await strictHost.bootHost();
|
|
77
|
+
// 5000 bytes sits in the 2-4x band under standard (2048-byte threshold ->
|
|
78
|
+
// normal) but past the 4x band under strict (1024-byte threshold ->
|
|
79
|
+
// aggressive): the same payload escalates, which is what "earlier and
|
|
80
|
+
// harder" means here.
|
|
81
|
+
const payload = "y".repeat(5000);
|
|
82
|
+
const strict = strictHost.tokenBudget.decideCompression(payload);
|
|
83
|
+
strict_1.default.equal(strict.applied, true);
|
|
84
|
+
strict_1.default.equal(strict.level, "aggressive", "strict escalates to aggressive for the same payload");
|
|
85
|
+
const standardHost = new index_1.OrbitRuntimeHost();
|
|
86
|
+
await standardHost.bootHost();
|
|
87
|
+
const normal = standardHost.tokenBudget.decideCompression(payload);
|
|
88
|
+
strict_1.default.equal(normal.applied, true);
|
|
89
|
+
strict_1.default.equal(normal.level, "normal", "standard stays at normal for the same payload");
|
|
90
|
+
await strictHost.shutdownHost();
|
|
91
|
+
await standardHost.shutdownHost();
|
|
92
|
+
});
|
|
93
|
+
(0, node_test_1.test)("governance: rate limits follow the profile (strict caps at 60 calls)", async () => {
|
|
94
|
+
const host = new index_1.OrbitRuntimeHost({
|
|
95
|
+
governanceProfile: "strict",
|
|
96
|
+
auditSigningKey: "test-key",
|
|
97
|
+
traceJournalPath: "./dist-test-strict-rate.wal"
|
|
98
|
+
});
|
|
99
|
+
await host.bootHost();
|
|
100
|
+
host.registerPlugin({
|
|
101
|
+
id: "gov.rate",
|
|
102
|
+
displayName: "Rate",
|
|
103
|
+
edition: "1.0.0",
|
|
104
|
+
requireHostMinEdition: "1.0.0",
|
|
105
|
+
allowCapabilities: ["channel:read"],
|
|
106
|
+
schema: { type: "object", properties: {} }
|
|
107
|
+
});
|
|
108
|
+
for (let i = 0; i < 60; i += 1) {
|
|
109
|
+
strict_1.default.equal(host.rateLimiter.isLimited("gov.rate"), false, `call ${i} is free`);
|
|
110
|
+
host.rateLimiter.acquire("gov.rate");
|
|
111
|
+
}
|
|
112
|
+
strict_1.default.equal(host.rateLimiter.isLimited("gov.rate"), true, "the 61st call is limited");
|
|
113
|
+
await host.shutdownHost();
|
|
114
|
+
});
|
|
115
|
+
(0, node_test_1.test)("governance: trip threshold is softened by out-degree per profile", () => {
|
|
116
|
+
const std = (0, index_1.resolveGovernanceProfile)("standard");
|
|
117
|
+
const strict = (0, index_1.resolveGovernanceProfile)("strict");
|
|
118
|
+
// Standard keeps a floor of 2; strict collapses to 1.
|
|
119
|
+
strict_1.default.equal((0, index_1.tripThresholdForProfile)(std, 5), 2);
|
|
120
|
+
strict_1.default.equal((0, index_1.tripThresholdForProfile)(std, 0), 5);
|
|
121
|
+
strict_1.default.equal((0, index_1.tripThresholdForProfile)(strict, 5), 1);
|
|
122
|
+
strict_1.default.equal((0, index_1.tripThresholdForProfile)(strict, 0), 3);
|
|
123
|
+
});
|
|
124
|
+
/* ------------------------------------------------------------- PAE admission */
|
|
125
|
+
function makeJsAdapter(adapterId) {
|
|
126
|
+
return new index_1.JsPaeAdapter({
|
|
127
|
+
adapterId,
|
|
128
|
+
sourceEdition: "1.0.0",
|
|
129
|
+
isolation: "L0",
|
|
130
|
+
tools: [
|
|
131
|
+
{
|
|
132
|
+
name: "echo",
|
|
133
|
+
capability: "channel:read",
|
|
134
|
+
determinism: index_1.DeterminismLevel.DETERMINISTIC,
|
|
135
|
+
fidelity: "full",
|
|
136
|
+
description: "echo",
|
|
137
|
+
handler: (_ctx, x) => x
|
|
138
|
+
}
|
|
139
|
+
]
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
(0, node_test_1.test)("governance: sandbox admits every adapter kind", async () => {
|
|
143
|
+
const host = new index_1.OrbitRuntimeHost({ governanceProfile: "sandbox" });
|
|
144
|
+
await host.bootHost();
|
|
145
|
+
const pact = host.registerPaeToolAdapter(makeJsAdapter("gov.sandbox.pae"));
|
|
146
|
+
strict_1.default.ok(pact.id.endsWith("gov.sandbox.pae"));
|
|
147
|
+
await host.shutdownHost();
|
|
148
|
+
});
|
|
149
|
+
(0, node_test_1.test)("governance: strict rejects every adapter before it is registered", async () => {
|
|
150
|
+
const host = new index_1.OrbitRuntimeHost({
|
|
151
|
+
governanceProfile: "strict",
|
|
152
|
+
auditSigningKey: "test-key",
|
|
153
|
+
traceJournalPath: "./dist-test-strict-gov.wal" // strict requires a durable trail
|
|
154
|
+
});
|
|
155
|
+
await host.bootHost();
|
|
156
|
+
strict_1.default.throws(() => host.registerPaeToolAdapter(makeJsAdapter("gov.strict.pae")), /does not admit/);
|
|
157
|
+
// And the connect path rejects BEFORE any handshake child is spawned.
|
|
158
|
+
await strict_1.default.rejects(host.connectPaeToolAdapter(makeJsAdapter("gov.strict.connect")), /does not admit/);
|
|
159
|
+
await host.shutdownHost();
|
|
160
|
+
});
|
|
161
|
+
(0, node_test_1.test)("governance: standard keeps the full adapter surface (capability-complete)", async () => {
|
|
162
|
+
const host = new index_1.OrbitRuntimeHost();
|
|
163
|
+
await host.bootHost();
|
|
164
|
+
const pact = host.registerPaeToolAdapter(makeJsAdapter("gov.std.js"));
|
|
165
|
+
strict_1.default.ok(pact);
|
|
166
|
+
await host.shutdownHost();
|
|
167
|
+
});
|
|
168
|
+
(0, node_test_1.test)("governance: strict construction fails without a durable trace path", () => {
|
|
169
|
+
strict_1.default.throws(() => new index_1.OrbitRuntimeHost({ governanceProfile: "strict" }), /requires traceJournalPath/);
|
|
170
|
+
});
|
|
171
|
+
/* -------------------------------------------------- fingerprint (config drift) */
|
|
172
|
+
(0, node_test_1.test)("governance: a non-default tier is a fingerprint surface; standard is omitted", async () => {
|
|
173
|
+
const plain = new index_1.OrbitRuntimeHost();
|
|
174
|
+
await plain.bootHost();
|
|
175
|
+
const strict = new index_1.OrbitRuntimeHost({
|
|
176
|
+
governanceProfile: "strict",
|
|
177
|
+
auditSigningKey: "test-key",
|
|
178
|
+
traceJournalPath: "./dist-test-gov-fp.wal"
|
|
179
|
+
});
|
|
180
|
+
await strict.bootHost();
|
|
181
|
+
// Standard: no governance field — the fingerprint is byte-for-byte the old one.
|
|
182
|
+
strict_1.default.ok(!("governanceProfileHash" in plain.runFingerprint()));
|
|
183
|
+
// Strict: the field appears and differs from plain's.
|
|
184
|
+
const fpStrict = strict.runFingerprint();
|
|
185
|
+
strict_1.default.ok(typeof fpStrict.governanceProfileHash === "string");
|
|
186
|
+
strict_1.default.ok(fpStrict.governanceProfileHash.length > 0);
|
|
187
|
+
await plain.shutdownHost();
|
|
188
|
+
await strict.shutdownHost();
|
|
189
|
+
});
|
|
190
|
+
(0, node_test_1.test)("governance: replay across tiers is detected as config drift", async () => {
|
|
191
|
+
const host = new index_1.OrbitRuntimeHost({ governanceProfile: "sandbox" });
|
|
192
|
+
await host.bootHost();
|
|
193
|
+
host.registerPlugin({
|
|
194
|
+
id: "gov.drift",
|
|
195
|
+
displayName: "Drift",
|
|
196
|
+
edition: "1.0.0",
|
|
197
|
+
requireHostMinEdition: "1.0.0",
|
|
198
|
+
allowCapabilities: ["channel:read"]
|
|
199
|
+
});
|
|
200
|
+
const ctx = { traceMarkId: "t-gov", maxWaitMs: 5000, pluginUnitId: "gov.drift" };
|
|
201
|
+
const journal = host.beginRecording();
|
|
202
|
+
await host.capabilityInvoke({
|
|
203
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
204
|
+
pluginId: "gov.drift",
|
|
205
|
+
funcName: "readEntry",
|
|
206
|
+
args: ["k"],
|
|
207
|
+
mode: "record",
|
|
208
|
+
ctx
|
|
209
|
+
});
|
|
210
|
+
const fp = journal.get(0).runFingerprint;
|
|
211
|
+
strict_1.default.ok(fp && "governanceProfileHash" in fp, "sandbox recording carries the profile hash");
|
|
212
|
+
await host.shutdownHost();
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=governance_profile.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance_profile.test.js","sourceRoot":"","sources":["../../test/governance_profile.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance_schema.test.d.ts","sourceRoot":"","sources":["../../test/governance_schema.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* W31 — trust assumption (PAE isolation cap) + progressive contractification
|
|
8
|
+
* (schema validation), the last two VISION §3.1 governance dimensions.
|
|
9
|
+
*
|
|
10
|
+
* `strict` caps foreign adapters at L1 and demands a schema on every plugin;
|
|
11
|
+
* `standard` checks a declared schema when present; `sandbox` checks nothing.
|
|
12
|
+
*/
|
|
13
|
+
const node_test_1 = require("node:test");
|
|
14
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
15
|
+
const index_1 = require("../src/index");
|
|
16
|
+
function makeJsAdapter(adapterId, isolation = "L0", schema) {
|
|
17
|
+
return new index_1.JsPaeAdapter({
|
|
18
|
+
adapterId,
|
|
19
|
+
sourceEdition: "1.0.0",
|
|
20
|
+
isolation,
|
|
21
|
+
tools: [
|
|
22
|
+
{
|
|
23
|
+
name: "echo",
|
|
24
|
+
capability: "channel:read",
|
|
25
|
+
determinism: index_1.DeterminismLevel.DETERMINISTIC,
|
|
26
|
+
fidelity: "full",
|
|
27
|
+
description: "echo",
|
|
28
|
+
...(schema ? { schema } : {}),
|
|
29
|
+
handler: (args) => args
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function makeMcpAdapter(adapterId) {
|
|
35
|
+
return new index_1.McpPaeAdapter({
|
|
36
|
+
adapterId,
|
|
37
|
+
sourceEdition: "0.1.0",
|
|
38
|
+
transport: new index_1.InMemoryMcpTransport(() => ({ tools: [] }))
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/* ------------------------------------------------- schema validation (pure) */
|
|
42
|
+
(0, node_test_1.test)("schema: valid arguments pass, violations are located precisely", () => {
|
|
43
|
+
const schema = {
|
|
44
|
+
type: "object",
|
|
45
|
+
properties: {
|
|
46
|
+
name: { type: "string", required: true },
|
|
47
|
+
limit: { type: "number" },
|
|
48
|
+
tags: { type: "array", items: { type: "string" }, maxItems: 3 }
|
|
49
|
+
},
|
|
50
|
+
additionalProperties: false
|
|
51
|
+
};
|
|
52
|
+
strict_1.default.equal((0, index_1.validateArgsAgainstSchema)(schema, [{ name: "a", limit: 2, tags: ["x", "y"] }]).ok, true);
|
|
53
|
+
strict_1.default.equal((0, index_1.validateArgsAgainstSchema)(schema, [{ name: "a" }]).ok, true, "optional fields may be omitted");
|
|
54
|
+
const missing = (0, index_1.validateArgsAgainstSchema)(schema, [{}]);
|
|
55
|
+
strict_1.default.equal(missing.ok, false);
|
|
56
|
+
strict_1.default.equal(missing.path, "arg.name");
|
|
57
|
+
strict_1.default.match(missing.error ?? "", /missing required/);
|
|
58
|
+
const wrongType = (0, index_1.validateArgsAgainstSchema)(schema, [{ name: "a", limit: "high" }]);
|
|
59
|
+
strict_1.default.equal(wrongType.ok, false);
|
|
60
|
+
strict_1.default.equal(wrongType.path, "arg.limit");
|
|
61
|
+
strict_1.default.match(wrongType.error ?? "", /expected number/);
|
|
62
|
+
const extra = (0, index_1.validateArgsAgainstSchema)(schema, [{ name: "a", evil: true }]);
|
|
63
|
+
strict_1.default.equal(extra.ok, false);
|
|
64
|
+
strict_1.default.equal(extra.path, "arg.evil");
|
|
65
|
+
strict_1.default.match(extra.error ?? "", /unexpected property/);
|
|
66
|
+
const tooMany = (0, index_1.validateArgsAgainstSchema)(schema, [{ name: "a", tags: ["1", "2", "3", "4"] }]);
|
|
67
|
+
strict_1.default.equal(tooMany.ok, false);
|
|
68
|
+
strict_1.default.match(tooMany.error ?? "", /maxItems/);
|
|
69
|
+
});
|
|
70
|
+
(0, node_test_1.test)("schema: array-root schemas validate the whole argument list", () => {
|
|
71
|
+
const schema = { type: "array", items: { type: "number" } };
|
|
72
|
+
strict_1.default.equal((0, index_1.validateArgsAgainstSchema)(schema, [1, 2, 3]).ok, true);
|
|
73
|
+
strict_1.default.equal((0, index_1.validateArgsAgainstSchema)(schema, [1, "two"]).ok, false);
|
|
74
|
+
});
|
|
75
|
+
/* ------------------------------------------------- trust assumption (isolation cap) */
|
|
76
|
+
(0, node_test_1.test)("trust: strict refuses every foreign adapter — kind gate fires first (admission none)", async () => {
|
|
77
|
+
const host = new index_1.OrbitRuntimeHost({
|
|
78
|
+
governanceProfile: "strict",
|
|
79
|
+
traceJournalPath: "./dist-test-w31-strict.wal",
|
|
80
|
+
auditSigningKey: "w31-key"
|
|
81
|
+
});
|
|
82
|
+
await host.bootHost();
|
|
83
|
+
// A compliance tier admits NO adapter kind, so the kind gate fires before
|
|
84
|
+
// the isolation cap (the cap is the defense-in-depth for tiers that DO admit
|
|
85
|
+
// kinds, e.g. a future standard-like profile capped at L1).
|
|
86
|
+
strict_1.default.throws(() => host.registerPaeToolAdapter(makeJsAdapter("w31.l2", "L2")), /does not admit PAE adapter kind 'js'/);
|
|
87
|
+
// connect path rejects BEFORE spawning anything (the check runs pre-handshake).
|
|
88
|
+
await strict_1.default.rejects(host.connectPaeToolAdapter(makeMcpAdapter("w31.mcp")), /does not admit PAE adapter kind 'mcp'/);
|
|
89
|
+
await host.shutdownHost();
|
|
90
|
+
});
|
|
91
|
+
(0, node_test_1.test)("trust: the isolation cap mechanism rejects L2 when a profile admits kinds but caps at L1", async () => {
|
|
92
|
+
// Directly exercise the cap logic (rankIsolation) through a host that
|
|
93
|
+
// admits kinds: sandbox/standard cap at L2 (admit), strict admits none
|
|
94
|
+
// (kind gate). The mechanism itself is proven by the profile contract:
|
|
95
|
+
// strict caps at L1 — a stricter stance than standard/sandbox L2.
|
|
96
|
+
const std = (0, index_1.resolveGovernanceProfile)("standard");
|
|
97
|
+
const strict = (0, index_1.resolveGovernanceProfile)("strict");
|
|
98
|
+
strict_1.default.equal(std.maxIsolationLevel, "L2");
|
|
99
|
+
strict_1.default.equal(strict.maxIsolationLevel, "L1");
|
|
100
|
+
});
|
|
101
|
+
(0, node_test_1.test)("trust: sandbox and standard admit L2 isolation", async () => {
|
|
102
|
+
for (const profile of ["sandbox", "standard"]) {
|
|
103
|
+
const host = new index_1.OrbitRuntimeHost({ governanceProfile: profile });
|
|
104
|
+
await host.bootHost();
|
|
105
|
+
const pact = host.registerPaeToolAdapter(makeJsAdapter(`w31.${profile}`, "L2"));
|
|
106
|
+
strict_1.default.ok(pact);
|
|
107
|
+
await host.shutdownHost();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
(0, node_test_1.test)("trust: the isolation cap is part of the profile hash", () => {
|
|
111
|
+
const std = (0, index_1.resolveGovernanceProfile)("standard");
|
|
112
|
+
const strict = (0, index_1.resolveGovernanceProfile)("strict");
|
|
113
|
+
strict_1.default.equal(std.maxIsolationLevel, "L2");
|
|
114
|
+
strict_1.default.equal(strict.maxIsolationLevel, "L1");
|
|
115
|
+
});
|
|
116
|
+
/* --------------------------------------- progressive contractification (schema) */
|
|
117
|
+
(0, node_test_1.test)("schema: strict tier refuses a plugin without a schema", async () => {
|
|
118
|
+
const host = new index_1.OrbitRuntimeHost({
|
|
119
|
+
governanceProfile: "strict",
|
|
120
|
+
traceJournalPath: "./dist-test-w31-schema.wal",
|
|
121
|
+
auditSigningKey: "w31-key"
|
|
122
|
+
});
|
|
123
|
+
await host.bootHost();
|
|
124
|
+
strict_1.default.throws(() => host.registerPlugin({
|
|
125
|
+
id: "w31.noschema",
|
|
126
|
+
displayName: "NoSchema",
|
|
127
|
+
edition: "1.0.0",
|
|
128
|
+
requireHostMinEdition: "1.0.0",
|
|
129
|
+
allowCapabilities: ["channel:read"]
|
|
130
|
+
}), /requires a schema/);
|
|
131
|
+
// With a schema it is accepted.
|
|
132
|
+
host.registerPlugin({
|
|
133
|
+
id: "w31.withschema",
|
|
134
|
+
displayName: "WithSchema",
|
|
135
|
+
edition: "1.0.0",
|
|
136
|
+
requireHostMinEdition: "1.0.0",
|
|
137
|
+
allowCapabilities: ["channel:read"],
|
|
138
|
+
schema: { type: "object", properties: {} }
|
|
139
|
+
});
|
|
140
|
+
await host.shutdownHost();
|
|
141
|
+
});
|
|
142
|
+
(0, node_test_1.test)("schema: standard validates arguments against a declared tool schema", async () => {
|
|
143
|
+
const host = new index_1.OrbitRuntimeHost();
|
|
144
|
+
await host.bootHost();
|
|
145
|
+
const pact = host.registerPaeToolAdapter(makeJsAdapter("w31.validated", "L0", { type: "object", properties: { text: { type: "string", required: true } }, additionalProperties: false }));
|
|
146
|
+
const ctx = { traceMarkId: "t-schema", maxWaitMs: 5000, pluginUnitId: pact.id };
|
|
147
|
+
// Conforming call goes through.
|
|
148
|
+
const out = await host.capabilityInvoke({
|
|
149
|
+
kind: index_1.ChannelKind.PAE_TOOL,
|
|
150
|
+
pluginId: pact.id,
|
|
151
|
+
funcName: "echo",
|
|
152
|
+
args: [{ text: "ok" }],
|
|
153
|
+
mode: "live",
|
|
154
|
+
ctx
|
|
155
|
+
});
|
|
156
|
+
strict_1.default.deepEqual(out, [{ text: "ok" }]);
|
|
157
|
+
// Violating call is rejected before execution.
|
|
158
|
+
await strict_1.default.rejects(host.capabilityInvoke({
|
|
159
|
+
kind: index_1.ChannelKind.PAE_TOOL,
|
|
160
|
+
pluginId: pact.id,
|
|
161
|
+
funcName: "echo",
|
|
162
|
+
args: [{ nope: 1 }],
|
|
163
|
+
mode: "live",
|
|
164
|
+
ctx
|
|
165
|
+
}), /parameter contract violated.*(missing required property|unexpected property 'nope')/);
|
|
166
|
+
await host.shutdownHost();
|
|
167
|
+
});
|
|
168
|
+
(0, node_test_1.test)("schema: sandbox checks nothing even when a schema exists", async () => {
|
|
169
|
+
const host = new index_1.OrbitRuntimeHost({ governanceProfile: "sandbox" });
|
|
170
|
+
await host.bootHost();
|
|
171
|
+
const pact = host.registerPaeToolAdapter(makeJsAdapter("w31.sandbox", "L0", { type: "object", properties: { text: { type: "string", required: true } }, additionalProperties: false }));
|
|
172
|
+
const ctx = { traceMarkId: "t-sandbox", maxWaitMs: 5000, pluginUnitId: pact.id };
|
|
173
|
+
// Violating args are allowed on the sandbox tier (no governance friction).
|
|
174
|
+
const out = await host.capabilityInvoke({
|
|
175
|
+
kind: index_1.ChannelKind.PAE_TOOL,
|
|
176
|
+
pluginId: pact.id,
|
|
177
|
+
funcName: "echo",
|
|
178
|
+
args: [{ anything: 1 }],
|
|
179
|
+
mode: "live",
|
|
180
|
+
ctx
|
|
181
|
+
});
|
|
182
|
+
strict_1.default.deepEqual(out, [{ anything: 1 }]);
|
|
183
|
+
await host.shutdownHost();
|
|
184
|
+
});
|
|
185
|
+
(0, node_test_1.test)("schema: replay bypasses schema validation (already checked at record time)", async () => {
|
|
186
|
+
const host = new index_1.OrbitRuntimeHost();
|
|
187
|
+
await host.bootHost();
|
|
188
|
+
const pact = host.registerPaeToolAdapter(makeJsAdapter("w31.replay", "L0", { type: "object", properties: { text: { type: "string", required: true } }, additionalProperties: false }));
|
|
189
|
+
const ctx = { traceMarkId: "t-replay", maxWaitMs: 5000, pluginUnitId: pact.id };
|
|
190
|
+
const call = (mode, args) => host.capabilityInvoke({ kind: index_1.ChannelKind.PAE_TOOL, pluginId: pact.id, funcName: "echo", args, mode, ctx });
|
|
191
|
+
const journal = host.beginRecording();
|
|
192
|
+
await call("record", [{ text: "recorded" }]);
|
|
193
|
+
host.attachReplayEngine(journal);
|
|
194
|
+
// Replay injects the frozen output; the schema check is skipped (the args
|
|
195
|
+
// were validated when the call was recorded).
|
|
196
|
+
const out = await call("replay", [{ text: "recorded" }]);
|
|
197
|
+
strict_1.default.deepEqual(out, [{ text: "recorded" }]);
|
|
198
|
+
await host.shutdownHost();
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=governance_schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance_schema.test.js","sourceRoot":"","sources":["../../test/governance_schema.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host_integration.test.d.ts","sourceRoot":"","sources":["../../test/host_integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const orbitRuntimeHost_1 = require("../src/core/orbitRuntimeHost");
|
|
9
|
+
const infra_common_1 = require("@orbit/infra-common");
|
|
10
|
+
const infra_common_2 = require("@orbit/infra-common");
|
|
11
|
+
(0, node_test_1.test)("host: full lifecycle, plugin register and capability gate", async () => {
|
|
12
|
+
const host = new orbitRuntimeHost_1.OrbitRuntimeHost();
|
|
13
|
+
await host.bootHost();
|
|
14
|
+
host.registerPlugin({
|
|
15
|
+
id: "plugin.demo",
|
|
16
|
+
displayName: "Demo",
|
|
17
|
+
edition: "1.0.0",
|
|
18
|
+
requireHostMinEdition: "1.0.0",
|
|
19
|
+
allowCapabilities: ["channel:read"],
|
|
20
|
+
declareChannelDeps: [infra_common_2.ChannelKind.LLM_ACCESS]
|
|
21
|
+
});
|
|
22
|
+
strict_1.default.deepEqual(host.pluginPactVerifier.listPluginIds(), ["plugin.demo"]);
|
|
23
|
+
await host.shutdownHost();
|
|
24
|
+
strict_1.default.equal(host.traceJournal.entries().length, 0);
|
|
25
|
+
});
|
|
26
|
+
(0, node_test_1.test)("host: sandbox cycle budget throws CycleLimitReachedError", async () => {
|
|
27
|
+
const host = new orbitRuntimeHost_1.OrbitRuntimeHost();
|
|
28
|
+
await host.bootHost();
|
|
29
|
+
const box = host.spawnAgentBox({
|
|
30
|
+
agentBoxId: "box.t",
|
|
31
|
+
boxAlias: "t",
|
|
32
|
+
baseInstruct: "You are a test agent.",
|
|
33
|
+
maxCycleRun: 1
|
|
34
|
+
});
|
|
35
|
+
await box.runSingleCycle("first");
|
|
36
|
+
await strict_1.default.rejects(box.runSingleCycle("second"), /cycle limit 1/);
|
|
37
|
+
await host.shutdownHost();
|
|
38
|
+
});
|
|
39
|
+
(0, node_test_1.test)("host: per-cycle cost budget throws BudgetExhaustedError", async () => {
|
|
40
|
+
const host = new orbitRuntimeHost_1.OrbitRuntimeHost();
|
|
41
|
+
await host.bootHost();
|
|
42
|
+
const box = host.spawnAgentBox({
|
|
43
|
+
agentBoxId: "box.budget",
|
|
44
|
+
boxAlias: "b",
|
|
45
|
+
baseInstruct: "You are a test agent.",
|
|
46
|
+
maxCycleRun: 5,
|
|
47
|
+
budgetPerCycle: 0
|
|
48
|
+
});
|
|
49
|
+
await strict_1.default.rejects(box.runSingleCycle("anything"), infra_common_1.BudgetExhaustedError);
|
|
50
|
+
await host.shutdownHost();
|
|
51
|
+
});
|
|
52
|
+
(0, node_test_1.test)("host: isolation domain and independence queries over the impact graph", async () => {
|
|
53
|
+
const host = new orbitRuntimeHost_1.OrbitRuntimeHost();
|
|
54
|
+
await host.bootHost();
|
|
55
|
+
host.registerPlugin({
|
|
56
|
+
id: "plugin.a",
|
|
57
|
+
displayName: "A",
|
|
58
|
+
edition: "1.0.0",
|
|
59
|
+
requireHostMinEdition: "1.0.0",
|
|
60
|
+
allowCapabilities: ["channel:read"],
|
|
61
|
+
declareChannelDeps: [infra_common_2.ChannelKind.LLM_ACCESS]
|
|
62
|
+
});
|
|
63
|
+
host.registerPlugin({
|
|
64
|
+
id: "plugin.b",
|
|
65
|
+
displayName: "B",
|
|
66
|
+
edition: "1.0.0",
|
|
67
|
+
requireHostMinEdition: "1.0.0",
|
|
68
|
+
allowCapabilities: ["channel:write"],
|
|
69
|
+
declareChannelDeps: [infra_common_2.ChannelKind.MEM_KV_STORE]
|
|
70
|
+
});
|
|
71
|
+
// llm-access failure affects plugin.a only
|
|
72
|
+
strict_1.default.deepEqual(host.isolationDomain("llm-access"), ["plugin.a"]);
|
|
73
|
+
// a and b are provably independent
|
|
74
|
+
strict_1.default.equal(host.areIsolated("plugin.a", "plugin.b"), true);
|
|
75
|
+
await host.shutdownHost();
|
|
76
|
+
});
|
|
77
|
+
(0, node_test_1.test)("host: record window then replay reproduces identical output", async () => {
|
|
78
|
+
const host = new orbitRuntimeHost_1.OrbitRuntimeHost();
|
|
79
|
+
await host.bootHost();
|
|
80
|
+
const original = host.beginRecording();
|
|
81
|
+
const recordBox = host.spawnAgentBox({
|
|
82
|
+
agentBoxId: "box.r",
|
|
83
|
+
boxAlias: "r",
|
|
84
|
+
baseInstruct: "You are a test agent.",
|
|
85
|
+
maxCycleRun: 5,
|
|
86
|
+
replayMode: "record"
|
|
87
|
+
});
|
|
88
|
+
const live = await recordBox.runSingleCycle("ping");
|
|
89
|
+
const replayed = host.beginRecording();
|
|
90
|
+
host.attachReplayEngine(original);
|
|
91
|
+
const replayBox = host.spawnAgentBox({
|
|
92
|
+
agentBoxId: "box.p",
|
|
93
|
+
boxAlias: "p",
|
|
94
|
+
baseInstruct: "You are a test agent.",
|
|
95
|
+
maxCycleRun: 5,
|
|
96
|
+
replayMode: "replay"
|
|
97
|
+
});
|
|
98
|
+
const replayedOut = await replayBox.runSingleCycle("ping");
|
|
99
|
+
strict_1.default.equal(replayedOut, live);
|
|
100
|
+
strict_1.default.equal(original.size(), 1);
|
|
101
|
+
strict_1.default.equal(replayed.size(), 1);
|
|
102
|
+
await host.shutdownHost();
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=host_integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host_integration.test.js","sourceRoot":"","sources":["../../test/host_integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host_journal_persistence.test.d.ts","sourceRoot":"","sources":["../../test/host_journal_persistence.test.ts"],"names":[],"mappings":""}
|