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,367 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const node_test_1 = require("node:test");
|
|
40
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
41
|
+
const node_fs_1 = require("node:fs");
|
|
42
|
+
const os = __importStar(require("node:os"));
|
|
43
|
+
const path = __importStar(require("node:path"));
|
|
44
|
+
const index_1 = require("../src/index");
|
|
45
|
+
async function tempStateDir() {
|
|
46
|
+
return node_fs_1.promises.mkdtemp(path.join(os.tmpdir(), "orbit-host-state-"));
|
|
47
|
+
}
|
|
48
|
+
const DEMO_PACT = {
|
|
49
|
+
id: "plugin.durable",
|
|
50
|
+
displayName: "Durable",
|
|
51
|
+
edition: "1.0.0",
|
|
52
|
+
requireHostMinEdition: "1.0.0",
|
|
53
|
+
allowCapabilities: ["channel:read"]
|
|
54
|
+
};
|
|
55
|
+
(0, node_test_1.test)("host durability: the audit journal survives a process restart", async () => {
|
|
56
|
+
const dir = await tempStateDir();
|
|
57
|
+
const tracePath = path.join(dir, "trace.wal.jsonl");
|
|
58
|
+
// --- process #1: run a sandbox cycle, then shut down cleanly.
|
|
59
|
+
const first = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
60
|
+
await first.bootHost();
|
|
61
|
+
const box = first.spawnAgentBox({
|
|
62
|
+
agentBoxId: "box.durable",
|
|
63
|
+
boxAlias: "d",
|
|
64
|
+
baseInstruct: "You are a test agent.",
|
|
65
|
+
maxCycleRun: 2
|
|
66
|
+
});
|
|
67
|
+
await box.runSingleCycle("first cycle");
|
|
68
|
+
const liveEntries = first.traceJournal.snapshot();
|
|
69
|
+
strict_1.default.ok(liveEntries.length > 0, "the cycle must produce audit entries");
|
|
70
|
+
await first.shutdownHost();
|
|
71
|
+
// shutdownHost clears the in-memory journal; the WAL is the durable record.
|
|
72
|
+
strict_1.default.equal(first.traceJournal.entries().length, 0);
|
|
73
|
+
// --- process #2: a fresh host over the same path recovers the audit trail.
|
|
74
|
+
const second = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
75
|
+
strict_1.default.equal(second.traceJournal.entries().length, 0, "nothing is read before boot");
|
|
76
|
+
await second.bootHost();
|
|
77
|
+
strict_1.default.deepEqual(second.traceJournal.snapshot(), liveEntries);
|
|
78
|
+
await second.shutdownHost();
|
|
79
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
80
|
+
});
|
|
81
|
+
(0, node_test_1.test)("host durability: a recorded window survives a restart and replays verbatim", async () => {
|
|
82
|
+
const dir = await tempStateDir();
|
|
83
|
+
const recordPath = path.join(dir, "record.wal.jsonl");
|
|
84
|
+
// --- process #1: record two governed calls, then shut down.
|
|
85
|
+
const first = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
86
|
+
await first.bootHost();
|
|
87
|
+
first.registerPlugin(DEMO_PACT);
|
|
88
|
+
const journal = first.beginRecording();
|
|
89
|
+
await first.capabilityInvoke({
|
|
90
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
91
|
+
pluginId: DEMO_PACT.id,
|
|
92
|
+
funcName: "readEntry",
|
|
93
|
+
args: ["alpha"],
|
|
94
|
+
mode: "live"
|
|
95
|
+
});
|
|
96
|
+
await first.capabilityInvoke({
|
|
97
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
98
|
+
pluginId: DEMO_PACT.id,
|
|
99
|
+
funcName: "readEntry",
|
|
100
|
+
args: ["beta"],
|
|
101
|
+
mode: "live"
|
|
102
|
+
});
|
|
103
|
+
strict_1.default.equal(journal.size(), 2);
|
|
104
|
+
const recorded = journal.snapshot();
|
|
105
|
+
await first.shutdownHost();
|
|
106
|
+
// --- process #2: boot recovers the window; the calls replay byte-identically.
|
|
107
|
+
const second = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
108
|
+
await second.bootHost();
|
|
109
|
+
const resumed = second.currentRecordJournal();
|
|
110
|
+
strict_1.default.equal(resumed.size(), 2);
|
|
111
|
+
strict_1.default.deepEqual(resumed.snapshot(), recorded);
|
|
112
|
+
const engine = new index_1.ReplayEngine(resumed);
|
|
113
|
+
strict_1.default.deepEqual(engine.replayCall(index_1.ChannelKind.MEM_KV_STORE, "readEntry", recorded[0].inputDigest, 0), recorded[0].outputSnapshot);
|
|
114
|
+
await second.shutdownHost();
|
|
115
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
116
|
+
});
|
|
117
|
+
(0, node_test_1.test)("host durability: resumeRecording continues the window instead of restarting it", async () => {
|
|
118
|
+
const dir = await tempStateDir();
|
|
119
|
+
const recordPath = path.join(dir, "record.wal.jsonl");
|
|
120
|
+
const first = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
121
|
+
await first.bootHost();
|
|
122
|
+
first.registerPlugin(DEMO_PACT);
|
|
123
|
+
first.beginRecording();
|
|
124
|
+
await first.capabilityInvoke({
|
|
125
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
126
|
+
pluginId: DEMO_PACT.id,
|
|
127
|
+
funcName: "readEntry",
|
|
128
|
+
args: ["alpha"],
|
|
129
|
+
mode: "live"
|
|
130
|
+
});
|
|
131
|
+
await first.shutdownHost();
|
|
132
|
+
// A second process resumes and appends one more call to the same window.
|
|
133
|
+
const second = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
134
|
+
await second.bootHost(); // boot auto-resumes when a record path is configured
|
|
135
|
+
second.registerPlugin(DEMO_PACT);
|
|
136
|
+
const resumed = second.currentRecordJournal();
|
|
137
|
+
strict_1.default.equal(resumed.size(), 1);
|
|
138
|
+
await second.capabilityInvoke({
|
|
139
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
140
|
+
pluginId: DEMO_PACT.id,
|
|
141
|
+
funcName: "readEntry",
|
|
142
|
+
args: ["gamma"],
|
|
143
|
+
mode: "live"
|
|
144
|
+
});
|
|
145
|
+
const combined = second.currentRecordJournal();
|
|
146
|
+
strict_1.default.equal(combined.size(), 2);
|
|
147
|
+
strict_1.default.deepEqual(combined.snapshot().map((r) => r.orderIndex), [0, 1], "orderIndex must continue, so the combined window replays as one run");
|
|
148
|
+
await second.shutdownHost();
|
|
149
|
+
// A third process sees both calls on disk.
|
|
150
|
+
const third = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
151
|
+
await third.bootHost();
|
|
152
|
+
strict_1.default.equal(third.currentRecordJournal().size(), 2);
|
|
153
|
+
await third.shutdownHost();
|
|
154
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
155
|
+
});
|
|
156
|
+
(0, node_test_1.test)("host durability: beginRecording opens a fresh window over an existing WAL", async () => {
|
|
157
|
+
const dir = await tempStateDir();
|
|
158
|
+
const recordPath = path.join(dir, "record.wal.jsonl");
|
|
159
|
+
const first = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
160
|
+
await first.bootHost();
|
|
161
|
+
first.registerPlugin(DEMO_PACT);
|
|
162
|
+
first.beginRecording();
|
|
163
|
+
await first.capabilityInvoke({
|
|
164
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
165
|
+
pluginId: DEMO_PACT.id,
|
|
166
|
+
funcName: "readEntry",
|
|
167
|
+
args: ["alpha"],
|
|
168
|
+
mode: "live"
|
|
169
|
+
});
|
|
170
|
+
await first.shutdownHost();
|
|
171
|
+
// Explicitly opening a new window truncates the WAL first.
|
|
172
|
+
const second = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
173
|
+
await second.bootHost();
|
|
174
|
+
second.registerPlugin(DEMO_PACT);
|
|
175
|
+
const fresh = second.beginRecording();
|
|
176
|
+
strict_1.default.equal(fresh.size(), 0, "a new window starts empty");
|
|
177
|
+
await second.capabilityInvoke({
|
|
178
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
179
|
+
pluginId: DEMO_PACT.id,
|
|
180
|
+
funcName: "readEntry",
|
|
181
|
+
args: ["delta"],
|
|
182
|
+
mode: "live"
|
|
183
|
+
});
|
|
184
|
+
await second.shutdownHost();
|
|
185
|
+
const third = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
186
|
+
await third.bootHost();
|
|
187
|
+
const reloaded = third.currentRecordJournal();
|
|
188
|
+
strict_1.default.equal(reloaded.size(), 1);
|
|
189
|
+
strict_1.default.equal(reloaded.get(0).funcName, "readEntry");
|
|
190
|
+
strict_1.default.equal(reloaded.get(0).orderIndex, 0);
|
|
191
|
+
await third.shutdownHost();
|
|
192
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
193
|
+
});
|
|
194
|
+
(0, node_test_1.test)("host durability: without paths the host stays purely in-memory (default behavior)", async () => {
|
|
195
|
+
const host = new index_1.OrbitRuntimeHost();
|
|
196
|
+
await host.bootHost();
|
|
197
|
+
host.registerPlugin(DEMO_PACT);
|
|
198
|
+
const journal = host.beginRecording();
|
|
199
|
+
await host.capabilityInvoke({
|
|
200
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
201
|
+
pluginId: DEMO_PACT.id,
|
|
202
|
+
funcName: "readEntry",
|
|
203
|
+
args: ["k"],
|
|
204
|
+
mode: "live"
|
|
205
|
+
});
|
|
206
|
+
strict_1.default.equal(journal.size(), 1);
|
|
207
|
+
strict_1.default.equal(host.currentRecordJournal().size(), 1);
|
|
208
|
+
await host.shutdownHost();
|
|
209
|
+
strict_1.default.equal(host.traceJournal.entries().length, 0);
|
|
210
|
+
});
|
|
211
|
+
(0, node_test_1.test)("host durability: a healed audit WAL keeps recovering after the next run appends", async () => {
|
|
212
|
+
const dir = await tempStateDir();
|
|
213
|
+
const tracePath = path.join(dir, "trace.wal.jsonl");
|
|
214
|
+
const first = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
215
|
+
await first.bootHost();
|
|
216
|
+
const box = first.spawnAgentBox({
|
|
217
|
+
agentBoxId: "box.heal",
|
|
218
|
+
boxAlias: "h",
|
|
219
|
+
baseInstruct: "You are a test agent.",
|
|
220
|
+
maxCycleRun: 1
|
|
221
|
+
});
|
|
222
|
+
await box.runSingleCycle("only cycle");
|
|
223
|
+
const survivors = first.traceJournal.snapshot().length;
|
|
224
|
+
await first.shutdownHost();
|
|
225
|
+
// Crash mid-append leaves a partial trailing line.
|
|
226
|
+
await node_fs_1.promises.appendFile(tracePath, '{"entryUid":"partial","entryCl', "utf8");
|
|
227
|
+
// Boot heals the file, so the partial line never becomes an interior line.
|
|
228
|
+
const second = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
229
|
+
await second.bootHost();
|
|
230
|
+
strict_1.default.equal(second.traceJournal.entries().length, survivors);
|
|
231
|
+
strict_1.default.ok(!(await node_fs_1.promises.readFile(tracePath, "utf8")).includes('"entryUid":"partial"'), "the truncated tail must be physically removed, not merely ignored");
|
|
232
|
+
// This run appends more entries on top of the healed prefix.
|
|
233
|
+
const box2 = second.spawnAgentBox({
|
|
234
|
+
agentBoxId: "box.heal2",
|
|
235
|
+
boxAlias: "h2",
|
|
236
|
+
baseInstruct: "You are a test agent.",
|
|
237
|
+
maxCycleRun: 1
|
|
238
|
+
});
|
|
239
|
+
await box2.runSingleCycle("second cycle");
|
|
240
|
+
const afterSecond = second.traceJournal.snapshot();
|
|
241
|
+
strict_1.default.ok(afterSecond.length > survivors, "the second run must add entries");
|
|
242
|
+
await second.shutdownHost();
|
|
243
|
+
// Without healing the partial line would now be interior — a hard fault.
|
|
244
|
+
const third = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
245
|
+
await third.bootHost();
|
|
246
|
+
strict_1.default.deepEqual(third.traceJournal.snapshot(), afterSecond);
|
|
247
|
+
await third.shutdownHost();
|
|
248
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
249
|
+
});
|
|
250
|
+
(0, node_test_1.test)("host durability: a resumed recording window heals its truncated tail", async () => {
|
|
251
|
+
const dir = await tempStateDir();
|
|
252
|
+
const recordPath = path.join(dir, "record.wal.jsonl");
|
|
253
|
+
const first = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
254
|
+
await first.bootHost();
|
|
255
|
+
first.registerPlugin(DEMO_PACT);
|
|
256
|
+
first.beginRecording();
|
|
257
|
+
await first.capabilityInvoke({
|
|
258
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
259
|
+
pluginId: DEMO_PACT.id,
|
|
260
|
+
funcName: "readEntry",
|
|
261
|
+
args: ["alpha"],
|
|
262
|
+
mode: "live"
|
|
263
|
+
});
|
|
264
|
+
await first.shutdownHost();
|
|
265
|
+
await node_fs_1.promises.appendFile(recordPath, '{"entryUid":"partial","orderInd', "utf8");
|
|
266
|
+
const second = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
267
|
+
await second.bootHost();
|
|
268
|
+
second.registerPlugin(DEMO_PACT);
|
|
269
|
+
strict_1.default.equal(second.currentRecordJournal().size(), 1);
|
|
270
|
+
await second.capabilityInvoke({
|
|
271
|
+
kind: index_1.ChannelKind.MEM_KV_STORE,
|
|
272
|
+
pluginId: DEMO_PACT.id,
|
|
273
|
+
funcName: "readEntry",
|
|
274
|
+
args: ["beta"],
|
|
275
|
+
mode: "live"
|
|
276
|
+
});
|
|
277
|
+
const combined = second.currentRecordJournal().snapshot();
|
|
278
|
+
await second.shutdownHost();
|
|
279
|
+
// The window still replays as one uninterrupted run in a third process.
|
|
280
|
+
const third = new index_1.OrbitRuntimeHost({ recordJournalPath: recordPath });
|
|
281
|
+
await third.bootHost();
|
|
282
|
+
const reloaded = third.currentRecordJournal();
|
|
283
|
+
strict_1.default.deepEqual(reloaded.snapshot(), combined);
|
|
284
|
+
const engine = new index_1.ReplayEngine(reloaded);
|
|
285
|
+
strict_1.default.deepEqual(engine.replayCall(index_1.ChannelKind.MEM_KV_STORE, "readEntry", combined[1].inputDigest, 1), combined[1].outputSnapshot);
|
|
286
|
+
await third.shutdownHost();
|
|
287
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
288
|
+
});
|
|
289
|
+
(0, node_test_1.test)("host durability: auditRetention bounds the durable audit log across restarts", async () => {
|
|
290
|
+
const dir = await tempStateDir();
|
|
291
|
+
const tracePath = path.join(dir, "trace.wal.jsonl");
|
|
292
|
+
const first = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath, auditRetention: 3 });
|
|
293
|
+
await first.bootHost();
|
|
294
|
+
// Drive the audit log directly: retention is about volume, and tying the
|
|
295
|
+
// assertion to how many entries a sandbox cycle happens to emit would make
|
|
296
|
+
// this test fail whenever unrelated instrumentation changes.
|
|
297
|
+
for (let i = 0; i < 8; i += 1) {
|
|
298
|
+
first.traceJournal.append({ entryClass: "tick", traceMarkId: `t${i}`, factPayload: { i } });
|
|
299
|
+
}
|
|
300
|
+
strict_1.default.ok(first.traceJournal.snapshot().length > 3, "the run must exceed the bound");
|
|
301
|
+
const newest = first.traceJournal.snapshot().slice(-3);
|
|
302
|
+
await first.shutdownHost(); // shutdown applies retention at rest
|
|
303
|
+
const lines = (await node_fs_1.promises.readFile(tracePath, "utf8")).split("\n").filter((l) => l.trim() !== "");
|
|
304
|
+
strict_1.default.equal(lines.length, 3, "the WAL must be bounded on disk, not just in memory");
|
|
305
|
+
const second = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath, auditRetention: 3 });
|
|
306
|
+
await second.bootHost();
|
|
307
|
+
strict_1.default.deepEqual(second.traceJournal.snapshot(), newest, "the newest entries are the survivors");
|
|
308
|
+
await second.shutdownHost();
|
|
309
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
310
|
+
});
|
|
311
|
+
(0, node_test_1.test)("host durability: pruneAuditLog is on-demand, and unbounded by default", async () => {
|
|
312
|
+
const dir = await tempStateDir();
|
|
313
|
+
const tracePath = path.join(dir, "trace.wal.jsonl");
|
|
314
|
+
// Unbounded: pruning reports the current size and keeps every entry.
|
|
315
|
+
const unbounded = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
316
|
+
await unbounded.bootHost();
|
|
317
|
+
for (let i = 0; i < 5; i += 1) {
|
|
318
|
+
unbounded.traceJournal.append({ entryClass: "tick", traceMarkId: `u${i}`, factPayload: {} });
|
|
319
|
+
}
|
|
320
|
+
const total = unbounded.traceJournal.snapshot().length;
|
|
321
|
+
strict_1.default.equal(await unbounded.pruneAuditLog(), total);
|
|
322
|
+
strict_1.default.equal(unbounded.traceJournal.snapshot().length, total);
|
|
323
|
+
await unbounded.shutdownHost();
|
|
324
|
+
// Bounded: an operator can prune a long-running host without a restart.
|
|
325
|
+
const bounded = new index_1.OrbitRuntimeHost({
|
|
326
|
+
traceJournalPath: path.join(dir, "bounded.wal.jsonl"),
|
|
327
|
+
auditRetention: 2
|
|
328
|
+
});
|
|
329
|
+
await bounded.bootHost();
|
|
330
|
+
for (let i = 0; i < 5; i += 1) {
|
|
331
|
+
bounded.traceJournal.append({ entryClass: "tick", traceMarkId: `b${i}`, factPayload: {} });
|
|
332
|
+
}
|
|
333
|
+
strict_1.default.equal(await bounded.pruneAuditLog(), 2);
|
|
334
|
+
strict_1.default.deepEqual(bounded.traceJournal.snapshot().map((e) => e.traceMarkId), ["b3", "b4"]);
|
|
335
|
+
await bounded.shutdownHost();
|
|
336
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
337
|
+
});
|
|
338
|
+
(0, node_test_1.test)("host durability: an invalid auditRetention is rejected at construction", () => {
|
|
339
|
+
strict_1.default.throws(() => new index_1.OrbitRuntimeHost({ auditRetention: -1 }), RangeError);
|
|
340
|
+
strict_1.default.throws(() => new index_1.OrbitRuntimeHost({ auditRetention: 2.5 }), RangeError);
|
|
341
|
+
strict_1.default.throws(() => new index_1.OrbitRuntimeHost({ auditRetention: Number.NaN }), RangeError);
|
|
342
|
+
// Zero is legal: "keep no audit history on disk" is a valid operator choice.
|
|
343
|
+
strict_1.default.doesNotThrow(() => new index_1.OrbitRuntimeHost({ auditRetention: 0 }));
|
|
344
|
+
});
|
|
345
|
+
(0, node_test_1.test)("host durability: a crash-truncated WAL still boots (partial tail dropped)", async () => {
|
|
346
|
+
const dir = await tempStateDir();
|
|
347
|
+
const tracePath = path.join(dir, "trace.wal.jsonl");
|
|
348
|
+
const first = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
349
|
+
await first.bootHost();
|
|
350
|
+
const box = first.spawnAgentBox({
|
|
351
|
+
agentBoxId: "box.crash",
|
|
352
|
+
boxAlias: "c",
|
|
353
|
+
baseInstruct: "You are a test agent.",
|
|
354
|
+
maxCycleRun: 1
|
|
355
|
+
});
|
|
356
|
+
await box.runSingleCycle("only cycle");
|
|
357
|
+
const survivors = first.traceJournal.snapshot().length;
|
|
358
|
+
await first.shutdownHost();
|
|
359
|
+
// Simulate a crash mid-append: a partial JSON line with no newline.
|
|
360
|
+
await node_fs_1.promises.appendFile(tracePath, '{"entryUid":"partial","entryCl', "utf8");
|
|
361
|
+
const second = new index_1.OrbitRuntimeHost({ traceJournalPath: tracePath });
|
|
362
|
+
await second.bootHost();
|
|
363
|
+
strict_1.default.equal(second.traceJournal.entries().length, survivors);
|
|
364
|
+
await second.shutdownHost();
|
|
365
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
366
|
+
});
|
|
367
|
+
//# sourceMappingURL=host_journal_persistence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host_journal_persistence.test.js","sourceRoot":"","sources":["../../test/host_journal_persistence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact_domain.test.d.ts","sourceRoot":"","sources":["../../test/impact_domain.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
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 sandbox_runtime_1 = require("@orbit/sandbox-runtime");
|
|
9
|
+
(0, node_test_1.test)("closure: failure impact follows reverse edges (who depends on it)", () => {
|
|
10
|
+
const g = new sandbox_runtime_1.ImpactDomainGraph();
|
|
11
|
+
g.addEdge("A", "B"); // A depends on B
|
|
12
|
+
g.addEdge("B", "C"); // B depends on C
|
|
13
|
+
strict_1.default.deepEqual([...g.closure("C")].sort(), ["A", "B"]); // C fails -> B, then A
|
|
14
|
+
strict_1.default.deepEqual([...g.closure("A")], []); // A fails -> nobody depends on A
|
|
15
|
+
});
|
|
16
|
+
(0, node_test_1.test)("areIndependent: mutually unreachable nodes are provably independent", () => {
|
|
17
|
+
const g = new sandbox_runtime_1.ImpactDomainGraph();
|
|
18
|
+
g.addEdge("p1", "kv-store");
|
|
19
|
+
g.addEdge("p2", "llm-access");
|
|
20
|
+
strict_1.default.equal(g.areIndependent("p1", "p2"), true);
|
|
21
|
+
});
|
|
22
|
+
(0, node_test_1.test)("areIndependent: shared dependency does not couple the dependents", () => {
|
|
23
|
+
const g = new sandbox_runtime_1.ImpactDomainGraph();
|
|
24
|
+
g.addEdge("p1", "kv-store");
|
|
25
|
+
g.addEdge("sandbox1", "kv-store");
|
|
26
|
+
strict_1.default.equal(g.areIndependent("p1", "sandbox1"), true);
|
|
27
|
+
strict_1.default.deepEqual([...g.closure("kv-store")].sort(), ["p1", "sandbox1"]);
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.test)("outDegree: counts direct dependencies", () => {
|
|
30
|
+
const g = new sandbox_runtime_1.ImpactDomainGraph();
|
|
31
|
+
g.addEdge("hub", "a");
|
|
32
|
+
g.addEdge("hub", "b");
|
|
33
|
+
g.addEdge("hub", "c");
|
|
34
|
+
strict_1.default.equal(g.outDegree("hub"), 3);
|
|
35
|
+
strict_1.default.equal(g.outDegree("unknown"), 0);
|
|
36
|
+
});
|
|
37
|
+
(0, node_test_1.test)("removeNode: drops the node and all incident edges", () => {
|
|
38
|
+
const g = new sandbox_runtime_1.ImpactDomainGraph();
|
|
39
|
+
g.addEdge("p1", "kv-store");
|
|
40
|
+
g.addEdge("sandbox1", "kv-store");
|
|
41
|
+
g.removeNode("sandbox1");
|
|
42
|
+
strict_1.default.equal(g.hasNode("sandbox1"), false);
|
|
43
|
+
strict_1.default.deepEqual([...g.closure("kv-store")], ["p1"]);
|
|
44
|
+
g.removeNode("kv-store");
|
|
45
|
+
strict_1.default.equal(g.hasNode("kv-store"), false);
|
|
46
|
+
strict_1.default.deepEqual([...g.closure("p1")], []);
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=impact_domain.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact_domain.test.js","sourceRoot":"","sources":["../../test/impact_domain.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determinism regression for every time-dependent decision that reaches a
|
|
3
|
+
* recorded value (charter A1).
|
|
4
|
+
*
|
|
5
|
+
* A component that reads the real clock makes its outcome depend on *when* the
|
|
6
|
+
* run happened, so two recordings of the same input can disagree and replay
|
|
7
|
+
* reports a drift that never existed. Both components here therefore take an
|
|
8
|
+
* injected `ClockSource`, and with a frozen clock their behaviour must be
|
|
9
|
+
* perfectly constant — with a pushed clock it must flip exactly where the
|
|
10
|
+
* configured window says it should, and nowhere else.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=injected_clock.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injected_clock.test.d.ts","sourceRoot":"","sources":["../../test/injected_clock.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|