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,279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Teardown must be total even when a component fails to release.
|
|
4
|
+
*
|
|
5
|
+
* Both loops below used to `await` each release directly, so the first throw
|
|
6
|
+
* skipped every release behind it — and skipped the final `clear()`. Since each
|
|
7
|
+
* of those components may own a child process, one failing MCP teardown was
|
|
8
|
+
* enough to leak the entire remaining surface.
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
const node_test_1 = require("node:test");
|
|
48
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
49
|
+
const node_child_process_1 = require("node:child_process");
|
|
50
|
+
const node_fs_1 = require("node:fs");
|
|
51
|
+
const os = __importStar(require("node:os"));
|
|
52
|
+
const path = __importStar(require("node:path"));
|
|
53
|
+
const index_1 = require("../src/index");
|
|
54
|
+
function makeCtx(overrides = {}) {
|
|
55
|
+
return { traceMarkId: "t-1", maxWaitMs: 1000, ...overrides };
|
|
56
|
+
}
|
|
57
|
+
/* ------------------------------------------------------------ ChannelHub */
|
|
58
|
+
(0, node_test_1.test)("channel hub: a throwing teardown does not strand the channels behind it", async () => {
|
|
59
|
+
const released = [];
|
|
60
|
+
const mk = (id, throws) => ({
|
|
61
|
+
setup: async () => { },
|
|
62
|
+
teardown: async () => {
|
|
63
|
+
released.push(id);
|
|
64
|
+
if (throws)
|
|
65
|
+
throw new Error(`${id} exploded`);
|
|
66
|
+
},
|
|
67
|
+
determinismMeta: { determinism: index_1.DeterminismLevel.DETERMINISTIC }
|
|
68
|
+
});
|
|
69
|
+
const hub = new index_1.ChannelHub();
|
|
70
|
+
hub.registerBuiltInChannel(index_1.ChannelKind.MEM_KV_STORE, mk("kv", true));
|
|
71
|
+
hub.registerBuiltInChannel(index_1.ChannelKind.LLM_ACCESS, mk("llm", false));
|
|
72
|
+
hub.registerPluginExtChannel(index_1.ChannelKind.FILE_SYSTEM, mk("file", false));
|
|
73
|
+
// Does not reject: a failed release is contained, not propagated.
|
|
74
|
+
await hub.teardown();
|
|
75
|
+
strict_1.default.deepEqual(released, ["kv", "llm", "file"], "every channel was released");
|
|
76
|
+
// clear() ran despite the failure, so nothing is left registered.
|
|
77
|
+
strict_1.default.equal(hub.getEffectiveChannel(index_1.ChannelKind.LLM_ACCESS), undefined);
|
|
78
|
+
strict_1.default.equal(hub.getEffectiveChannel(index_1.ChannelKind.FILE_SYSTEM), undefined);
|
|
79
|
+
strict_1.default.deepEqual(hub.listCallContexts(), []);
|
|
80
|
+
});
|
|
81
|
+
(0, node_test_1.test)("channel hub: teardown still releases everything when the last channel throws", async () => {
|
|
82
|
+
const released = [];
|
|
83
|
+
const mk = (id, throws) => ({
|
|
84
|
+
setup: async () => { },
|
|
85
|
+
teardown: async () => {
|
|
86
|
+
released.push(id);
|
|
87
|
+
if (throws)
|
|
88
|
+
throw new Error(`${id} exploded`);
|
|
89
|
+
},
|
|
90
|
+
determinismMeta: { determinism: index_1.DeterminismLevel.DETERMINISTIC }
|
|
91
|
+
});
|
|
92
|
+
const hub = new index_1.ChannelHub();
|
|
93
|
+
hub.registerBuiltInChannel(index_1.ChannelKind.MEM_KV_STORE, mk("kv", false));
|
|
94
|
+
hub.registerPluginExtChannel(index_1.ChannelKind.FILE_SYSTEM, mk("file", true));
|
|
95
|
+
await hub.teardown();
|
|
96
|
+
strict_1.default.deepEqual(released, ["kv", "file"]);
|
|
97
|
+
strict_1.default.equal(hub.getEffectiveChannel(index_1.ChannelKind.MEM_KV_STORE), undefined);
|
|
98
|
+
});
|
|
99
|
+
(0, node_test_1.test)("channel hub: teardown is idempotent on an empty hub", async () => {
|
|
100
|
+
const hub = new index_1.ChannelHub();
|
|
101
|
+
await hub.teardown();
|
|
102
|
+
await hub.teardown();
|
|
103
|
+
});
|
|
104
|
+
/* ----------------------------------------------------- PaeAdapterRegistry */
|
|
105
|
+
function fakeAdapter(adapterId, toolName, onTeardown) {
|
|
106
|
+
const tool = {
|
|
107
|
+
name: toolName,
|
|
108
|
+
capability: "channel:read",
|
|
109
|
+
determinism: index_1.DeterminismLevel.IO_BOUND,
|
|
110
|
+
fidelity: "full",
|
|
111
|
+
description: "teardown fixture"
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
meta: { adapterId, kind: "mcp", sourceEdition: "1.0.0", isolation: "L2" },
|
|
115
|
+
describe: () => [tool],
|
|
116
|
+
invoke: async () => null,
|
|
117
|
+
teardown: onTeardown
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
(0, node_test_1.test)("pae registry: a throwing teardown does not strand the adapters behind it", async () => {
|
|
121
|
+
const released = [];
|
|
122
|
+
const registry = new index_1.PaeAdapterRegistry();
|
|
123
|
+
registry.register(fakeAdapter("bad", "badTool", async () => {
|
|
124
|
+
released.push("bad");
|
|
125
|
+
throw new Error("bad exploded");
|
|
126
|
+
}));
|
|
127
|
+
registry.register(fakeAdapter("good-1", "goodTool1", async () => {
|
|
128
|
+
released.push("good-1");
|
|
129
|
+
}));
|
|
130
|
+
registry.register(fakeAdapter("good-2", "goodTool2", async () => {
|
|
131
|
+
released.push("good-2");
|
|
132
|
+
}));
|
|
133
|
+
await registry.teardownAll();
|
|
134
|
+
strict_1.default.deepEqual(released, ["bad", "good-1", "good-2"], "every adapter was released");
|
|
135
|
+
// The setup bookkeeping was cleared, so a re-registered adapter is set up afresh.
|
|
136
|
+
strict_1.default.deepEqual(registry.listAdapters().map((a) => a.adapterId), ["bad", "good-1", "good-2"]);
|
|
137
|
+
registry.clear();
|
|
138
|
+
strict_1.default.equal(registry.isEmpty(), true);
|
|
139
|
+
});
|
|
140
|
+
(0, node_test_1.test)("pae registry: an adapter without teardown is skipped harmlessly", async () => {
|
|
141
|
+
const registry = new index_1.PaeAdapterRegistry();
|
|
142
|
+
const adapter = fakeAdapter("no-teardown", "toolX", async () => { });
|
|
143
|
+
delete adapter.teardown;
|
|
144
|
+
registry.register(adapter);
|
|
145
|
+
await registry.teardownAll();
|
|
146
|
+
strict_1.default.equal(registry.listAdapters().length, 1);
|
|
147
|
+
});
|
|
148
|
+
/* ------------------------------------------- child process reaping (close) */
|
|
149
|
+
async function tempDir(prefix) {
|
|
150
|
+
return node_fs_1.promises.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
151
|
+
}
|
|
152
|
+
/** True when no live process answers to `pid`. */
|
|
153
|
+
function pidIsGone(pid) {
|
|
154
|
+
try {
|
|
155
|
+
process.kill(pid, 0);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
// ESRCH: gone. EPERM: alive but owned by someone else — treat as alive.
|
|
160
|
+
return err.code === "ESRCH";
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async function waitFor(predicate, timeoutMs = 5000) {
|
|
164
|
+
const deadline = Date.now() + timeoutMs;
|
|
165
|
+
while (!(await predicate())) {
|
|
166
|
+
if (Date.now() > deadline)
|
|
167
|
+
throw new Error("timed out waiting for the child to be reaped");
|
|
168
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* A host script that publishes its own pid and then either exits cleanly when
|
|
173
|
+
* stdin closes, or ignores stdin and has to be killed.
|
|
174
|
+
*/
|
|
175
|
+
function hostScript(pidFile, exitsOnStdinEnd) {
|
|
176
|
+
const marker = JSON.stringify(pidFile);
|
|
177
|
+
const behaviour = exitsOnStdinEnd
|
|
178
|
+
? `process.stdin.resume(); process.stdin.on("end", () => process.exit(0));`
|
|
179
|
+
: `setInterval(() => {}, 50);`;
|
|
180
|
+
return `require("node:fs").writeFileSync(${marker}, String(process.pid)); ${behaviour}`;
|
|
181
|
+
}
|
|
182
|
+
(0, node_test_1.test)("domain transport: close() reaps a child that exits when stdin closes", async () => {
|
|
183
|
+
const dir = await tempDir("orbit-close-");
|
|
184
|
+
const pidFile = path.join(dir, "child.pid");
|
|
185
|
+
const transport = new index_1.ChildProcessDomainTransport({
|
|
186
|
+
command: process.execPath,
|
|
187
|
+
args: ["-e", hostScript(pidFile, true)]
|
|
188
|
+
});
|
|
189
|
+
await transport.start();
|
|
190
|
+
await waitFor(async () => (await node_fs_1.promises.access(pidFile).then(() => true, () => false)));
|
|
191
|
+
const pid = Number(await node_fs_1.promises.readFile(pidFile, "utf8"));
|
|
192
|
+
strict_1.default.ok(pid > 0, "the host published its pid");
|
|
193
|
+
strict_1.default.equal(pidIsGone(pid), false, "the host is running before close()");
|
|
194
|
+
await transport.close();
|
|
195
|
+
// The whole point: once close() resolves the child is actually gone, not
|
|
196
|
+
// merely signalled — otherwise it outlives the kernel that spawned it.
|
|
197
|
+
await waitFor(() => pidIsGone(pid));
|
|
198
|
+
strict_1.default.equal(transport.closed, true);
|
|
199
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
200
|
+
});
|
|
201
|
+
(0, node_test_1.test)("domain transport: close() kills a child that ignores stdin instead of hanging", async () => {
|
|
202
|
+
const dir = await tempDir("orbit-close-");
|
|
203
|
+
const pidFile = path.join(dir, "child.pid");
|
|
204
|
+
const transport = new index_1.ChildProcessDomainTransport({
|
|
205
|
+
command: process.execPath,
|
|
206
|
+
args: ["-e", hostScript(pidFile, false)]
|
|
207
|
+
});
|
|
208
|
+
await transport.start();
|
|
209
|
+
await waitFor(async () => (await node_fs_1.promises.access(pidFile).then(() => true, () => false)));
|
|
210
|
+
const pid = Number(await node_fs_1.promises.readFile(pidFile, "utf8"));
|
|
211
|
+
await transport.close();
|
|
212
|
+
// A hostile host cannot be asked nicely, so the grace window must expire and
|
|
213
|
+
// the process must be killed — close() must neither hang nor leak it.
|
|
214
|
+
await waitFor(() => pidIsGone(pid));
|
|
215
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
216
|
+
});
|
|
217
|
+
(0, node_test_1.test)("cordis transport: close() reaps a child that exits when stdin closes", async () => {
|
|
218
|
+
const dir = await tempDir("orbit-close-");
|
|
219
|
+
const pidFile = path.join(dir, "child.pid");
|
|
220
|
+
const transport = new index_1.ChildProcessCordisTransport({
|
|
221
|
+
command: process.execPath,
|
|
222
|
+
args: ["-e", hostScript(pidFile, true)]
|
|
223
|
+
});
|
|
224
|
+
await transport.start();
|
|
225
|
+
await waitFor(async () => (await node_fs_1.promises.access(pidFile).then(() => true, () => false)));
|
|
226
|
+
const pid = Number(await node_fs_1.promises.readFile(pidFile, "utf8"));
|
|
227
|
+
strict_1.default.equal(pidIsGone(pid), false, "the host is running before close()");
|
|
228
|
+
await transport.close();
|
|
229
|
+
await waitFor(() => pidIsGone(pid));
|
|
230
|
+
strict_1.default.equal(transport.closed, true);
|
|
231
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
232
|
+
});
|
|
233
|
+
(0, node_test_1.test)("cordis transport: close() kills a child that ignores stdin instead of hanging", async () => {
|
|
234
|
+
const dir = await tempDir("orbit-close-");
|
|
235
|
+
const pidFile = path.join(dir, "child.pid");
|
|
236
|
+
const transport = new index_1.ChildProcessCordisTransport({
|
|
237
|
+
command: process.execPath,
|
|
238
|
+
args: ["-e", hostScript(pidFile, false)]
|
|
239
|
+
});
|
|
240
|
+
await transport.start();
|
|
241
|
+
await waitFor(async () => (await node_fs_1.promises.access(pidFile).then(() => true, () => false)));
|
|
242
|
+
const pid = Number(await node_fs_1.promises.readFile(pidFile, "utf8"));
|
|
243
|
+
await transport.close();
|
|
244
|
+
await waitFor(() => pidIsGone(pid));
|
|
245
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
246
|
+
});
|
|
247
|
+
(0, node_test_1.test)("child transports: close() before start() is a safe no-op", async () => {
|
|
248
|
+
const domain = new index_1.ChildProcessDomainTransport({ command: process.execPath, args: ["-e", ""] });
|
|
249
|
+
await domain.close();
|
|
250
|
+
strict_1.default.equal(domain.closed, true);
|
|
251
|
+
const cordis = new index_1.ChildProcessCordisTransport({ command: process.execPath, args: ["-e", ""] });
|
|
252
|
+
await cordis.close();
|
|
253
|
+
strict_1.default.equal(cordis.closed, true);
|
|
254
|
+
});
|
|
255
|
+
(0, node_test_1.test)("child transports: close() is idempotent", async () => {
|
|
256
|
+
const dir = await tempDir("orbit-close-");
|
|
257
|
+
const pidFile = path.join(dir, "child.pid");
|
|
258
|
+
const transport = new index_1.ChildProcessDomainTransport({
|
|
259
|
+
command: process.execPath,
|
|
260
|
+
args: ["-e", hostScript(pidFile, true)]
|
|
261
|
+
});
|
|
262
|
+
await transport.start();
|
|
263
|
+
await transport.close();
|
|
264
|
+
await transport.close();
|
|
265
|
+
strict_1.default.equal(transport.closed, true);
|
|
266
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
267
|
+
});
|
|
268
|
+
// Guard the assumption behind the pid probe itself: without it, every test
|
|
269
|
+
// above could pass for the wrong reason.
|
|
270
|
+
(0, node_test_1.test)("fixture: the pid probe distinguishes a live child from a dead one", async () => {
|
|
271
|
+
const child = (0, node_child_process_1.spawn)(process.execPath, ["-e", "setInterval(() => {}, 50)"], {
|
|
272
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
273
|
+
});
|
|
274
|
+
await new Promise((resolve) => child.on("spawn", () => resolve()));
|
|
275
|
+
strict_1.default.equal(pidIsGone(child.pid), false, "a live child is detected as live");
|
|
276
|
+
child.kill("SIGKILL");
|
|
277
|
+
await waitFor(() => pidIsGone(child.pid));
|
|
278
|
+
});
|
|
279
|
+
//# sourceMappingURL=teardown_isolation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teardown_isolation.test.js","sourceRoot":"","sources":["../../test/teardown_isolation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_budget.test.d.ts","sourceRoot":"","sources":["../../test/token_budget.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
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 core_hub_1 = require("@orbit/core-hub");
|
|
9
|
+
// A tight config so thresholds are easy to assert against.
|
|
10
|
+
const TIGHT = {
|
|
11
|
+
maxTokensPerCall: 100,
|
|
12
|
+
compressAboveTokens: 50,
|
|
13
|
+
trimRatio: { conservative: 0.9, normal: 0.5, aggressive: 0.25 },
|
|
14
|
+
compressThresholdBytes: 64,
|
|
15
|
+
enabled: true
|
|
16
|
+
};
|
|
17
|
+
(0, node_test_1.test)("engine: token estimate is deterministic and punctuation-aware", () => {
|
|
18
|
+
const e = new core_hub_1.TokenBudgetEngine(TIGHT);
|
|
19
|
+
strict_1.default.equal(e.estimateTokens(""), 0);
|
|
20
|
+
strict_1.default.equal(e.estimateTokens("hello world"), 2);
|
|
21
|
+
strict_1.default.equal(e.estimateTokens("the quick brown fox jumps"), 5);
|
|
22
|
+
// Pure function: identical input -> identical output.
|
|
23
|
+
strict_1.default.equal(e.estimateTokens("hello world"), e.estimateTokens("hello world"));
|
|
24
|
+
// CJK letters also count as word-runs.
|
|
25
|
+
strict_1.default.equal(e.estimateTokens("你好 世界"), 2);
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.test)("engine: compress is a pure, deterministic head-trim (no invention/reorder)", () => {
|
|
28
|
+
const e = new core_hub_1.TokenBudgetEngine(TIGHT);
|
|
29
|
+
const long = Array(60).fill("tok").join(" "); // 60 tokens > 50 threshold
|
|
30
|
+
const a = e.compress(long, "normal");
|
|
31
|
+
const b = e.compress(long, "normal");
|
|
32
|
+
strict_1.default.equal(a.applied, true);
|
|
33
|
+
strict_1.default.equal(a.level, "normal");
|
|
34
|
+
// Deterministic: same output every call.
|
|
35
|
+
strict_1.default.equal(a.text, b.text);
|
|
36
|
+
strict_1.default.equal(a.estimatedTokens, 30); // keep 50% of 60
|
|
37
|
+
// Head trim: the first 30 tokens are preserved verbatim.
|
|
38
|
+
strict_1.default.equal(a.text, Array(30).fill("tok").join(" "));
|
|
39
|
+
});
|
|
40
|
+
(0, node_test_1.test)("engine: compress is a no-op below the threshold", () => {
|
|
41
|
+
const e = new core_hub_1.TokenBudgetEngine(TIGHT);
|
|
42
|
+
const short = "one two three"; // 3 tokens
|
|
43
|
+
const r = e.compress(short, "aggressive");
|
|
44
|
+
strict_1.default.equal(r.applied, false);
|
|
45
|
+
strict_1.default.equal(r.text, short);
|
|
46
|
+
});
|
|
47
|
+
(0, node_test_1.test)("engine: budgetPolicy reflects cumulative usage (normal -> shrink -> stop)", () => {
|
|
48
|
+
const e = new core_hub_1.TokenBudgetEngine(TIGHT); // compressAbove=50, max=100
|
|
49
|
+
strict_1.default.deepEqual(e.budgetPolicy("p1"), { allow: true, strategy: "normal" });
|
|
50
|
+
e.account("p1", 60); // now above compressAboveTokens
|
|
51
|
+
strict_1.default.deepEqual(e.budgetPolicy("p1"), { allow: true, strategy: "shrink" });
|
|
52
|
+
e.account("p1", 60); // now above maxTokensPerCall
|
|
53
|
+
strict_1.default.deepEqual(e.budgetPolicy("p1"), { allow: false, strategy: "stop" });
|
|
54
|
+
});
|
|
55
|
+
(0, node_test_1.test)("engine: disabled config is a pass-through (always allow/normal)", () => {
|
|
56
|
+
const e = new core_hub_1.TokenBudgetEngine({ ...TIGHT, enabled: false });
|
|
57
|
+
e.account("p1", 9999);
|
|
58
|
+
strict_1.default.deepEqual(e.budgetPolicy("p1"), { allow: true, strategy: "normal" });
|
|
59
|
+
strict_1.default.equal(e.compress("a b c d e".repeat(100)).applied, false);
|
|
60
|
+
});
|
|
61
|
+
(0, node_test_1.test)("engine: compressionPolicyFor scales with estimated size", () => {
|
|
62
|
+
const e = new core_hub_1.TokenBudgetEngine(TIGHT); // compressAbove=50
|
|
63
|
+
strict_1.default.deepEqual(e.compressionPolicyFor(10), { level: "conservative", applied: false });
|
|
64
|
+
strict_1.default.deepEqual(e.compressionPolicyFor(45), { level: "normal", applied: true });
|
|
65
|
+
strict_1.default.deepEqual(e.compressionPolicyFor(80), { level: "aggressive", applied: true });
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.test)("engine: configHash is stable per config and changes with the thresholds", () => {
|
|
68
|
+
const a = new core_hub_1.TokenBudgetEngine(core_hub_1.DEFAULT_TOKEN_BUDGET_CONFIG).configHash();
|
|
69
|
+
const b = new core_hub_1.TokenBudgetEngine(core_hub_1.DEFAULT_TOKEN_BUDGET_CONFIG).configHash();
|
|
70
|
+
strict_1.default.equal(a, b); // stable across instances
|
|
71
|
+
const c = new core_hub_1.TokenBudgetEngine({ ...core_hub_1.DEFAULT_TOKEN_BUDGET_CONFIG, maxTokensPerCall: 4096 }).configHash();
|
|
72
|
+
strict_1.default.notEqual(a, c); // drift is detectable
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.test)("engine: decideCompression is payload-aware and threshold-driven", () => {
|
|
75
|
+
const e = new core_hub_1.TokenBudgetEngine(TIGHT); // compressThresholdBytes = 64
|
|
76
|
+
// Below threshold -> no compression, "normal" level.
|
|
77
|
+
strict_1.default.deepEqual(e.decideCompression("hello"), { level: "normal", applied: false });
|
|
78
|
+
// ~102 bytes: just above threshold, within 2x -> applied, conservative.
|
|
79
|
+
const mid = "x".repeat(100);
|
|
80
|
+
const dMid = e.decideCompression(mid);
|
|
81
|
+
strict_1.default.equal(dMid.applied, true);
|
|
82
|
+
strict_1.default.equal(dMid.level, "conservative");
|
|
83
|
+
// ~302 bytes: above 4x threshold -> aggressive, applied.
|
|
84
|
+
strict_1.default.deepEqual(e.decideCompression("x".repeat(300)), { level: "aggressive", applied: true });
|
|
85
|
+
// Small objects stay uncompressed.
|
|
86
|
+
strict_1.default.deepEqual(e.decideCompression({ a: 1 }), { level: "normal", applied: false });
|
|
87
|
+
});
|
|
88
|
+
(0, node_test_1.test)("engine: compressPayload/decompressPayload round-trips and is deterministic", () => {
|
|
89
|
+
for (const v of ["hello world", { a: [1, 2, 3], b: "x" }, 42, null, ["a", "b"], true]) {
|
|
90
|
+
const env = (0, core_hub_1.compressPayload)(v, "normal");
|
|
91
|
+
strict_1.default.equal((0, core_hub_1.isCompressedPayload)(env), true);
|
|
92
|
+
strict_1.default.deepEqual((0, core_hub_1.decompressPayload)(env), v);
|
|
93
|
+
// Determinism: identical input -> identical envelope bytes.
|
|
94
|
+
strict_1.default.equal(env.data, (0, core_hub_1.compressPayload)(v, "normal").data);
|
|
95
|
+
}
|
|
96
|
+
strict_1.default.equal((0, core_hub_1.isCompressedPayload)("not compressed"), false);
|
|
97
|
+
strict_1.default.equal((0, core_hub_1.isCompressedPayload)(null), false);
|
|
98
|
+
});
|
|
99
|
+
(0, node_test_1.test)("engine: packSnapshot keeps the original when deflate does not save space", () => {
|
|
100
|
+
const small = "hi"; // tiny -> deflate enlarges -> original kept, not applied
|
|
101
|
+
const p = (0, core_hub_1.packSnapshot)(small, "normal");
|
|
102
|
+
strict_1.default.equal(p.applied, false);
|
|
103
|
+
strict_1.default.equal(p.bytesSaved, 0);
|
|
104
|
+
strict_1.default.equal(p.served, small);
|
|
105
|
+
// Large repeated payload -> deflate clearly helps.
|
|
106
|
+
const big = "y".repeat(5000);
|
|
107
|
+
const q = (0, core_hub_1.packSnapshot)(big, "aggressive");
|
|
108
|
+
strict_1.default.equal(q.applied, true);
|
|
109
|
+
strict_1.default.ok(q.bytesSaved > 0);
|
|
110
|
+
strict_1.default.equal((0, core_hub_1.isCompressedPayload)(q.served), true);
|
|
111
|
+
strict_1.default.deepEqual((0, core_hub_1.decompressPayload)(q.served), big);
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=token_budget.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_budget.test.js","sourceRoot":"","sources":["../../test/token_budget.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace_journal.test.d.ts","sourceRoot":"","sources":["../../test/trace_journal.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 core_hub_1 = require("@orbit/core-hub");
|
|
9
|
+
(0, node_test_1.test)("append & entries: records carry uid and timestamp", () => {
|
|
10
|
+
const journal = new core_hub_1.TraceJournal();
|
|
11
|
+
journal.append({ entryClass: "TEST_EVENT", traceMarkId: "t1", factPayload: { n: 1 } });
|
|
12
|
+
const entries = journal.entries();
|
|
13
|
+
strict_1.default.equal(entries.length, 1);
|
|
14
|
+
strict_1.default.ok(entries[0].entryUid.length > 0);
|
|
15
|
+
strict_1.default.ok(entries[0].occurredAt > 0);
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.test)("filters: by trace mark / agent box / plugin unit / entry class", () => {
|
|
18
|
+
const journal = new core_hub_1.TraceJournal();
|
|
19
|
+
journal.append({ entryClass: "AGENT_SINGLE_CYCLE_EXEC", traceMarkId: "t1", agentBoxId: "box.a", factPayload: {} });
|
|
20
|
+
journal.append({ entryClass: "PLUGIN_UNIT_EXCEPTION", traceMarkId: "t1", pluginUnitId: "p1", factPayload: {} });
|
|
21
|
+
journal.append({ entryClass: "AGENT_SINGLE_CYCLE_EXEC", traceMarkId: "t2", agentBoxId: "box.b", factPayload: {} });
|
|
22
|
+
strict_1.default.equal(journal.byTraceMark("t1").length, 2);
|
|
23
|
+
strict_1.default.equal(journal.byAgentBox("box.a").length, 1);
|
|
24
|
+
strict_1.default.equal(journal.byPluginUnit("p1").length, 1);
|
|
25
|
+
strict_1.default.equal(journal.byEntryClass("AGENT_SINGLE_CYCLE_EXEC").length, 2);
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.test)("snapshot & restore: round-trips the journal", () => {
|
|
28
|
+
const journal = new core_hub_1.TraceJournal();
|
|
29
|
+
journal.append({ entryClass: "A", traceMarkId: "t", factPayload: {} });
|
|
30
|
+
const snapshot = journal.snapshot();
|
|
31
|
+
journal.append({ entryClass: "B", traceMarkId: "t", factPayload: {} });
|
|
32
|
+
journal.restoreSnapshot(snapshot);
|
|
33
|
+
strict_1.default.equal(journal.entries().length, 1);
|
|
34
|
+
strict_1.default.equal(journal.entries()[0].entryClass, "A");
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.test)("entries returns a copy: external mutation is isolated", () => {
|
|
37
|
+
const journal = new core_hub_1.TraceJournal();
|
|
38
|
+
journal.append({ entryClass: "A", traceMarkId: "t", factPayload: {} });
|
|
39
|
+
const entries = journal.entries();
|
|
40
|
+
entries.length = 0;
|
|
41
|
+
strict_1.default.equal(journal.entries().length, 1);
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=trace_journal.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace_journal.test.js","sourceRoot":"","sources":["../../test/trace_journal.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAiC;AACjC,gEAAwC;AACxC,8CAA+C;AAE/C,IAAA,gBAAI,EAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,uBAAY,EAAE,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAClC,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,gBAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,gBAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,MAAM,OAAO,GAAG,IAAI,uBAAY,EAAE,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,yBAAyB,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACnH,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,uBAAuB,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IAChH,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,yBAAyB,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IAEnH,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAClD,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpD,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,uBAAY,EAAE,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1C,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,MAAM,OAAO,GAAG,IAAI,uBAAY,EAAE,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAClC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACnB,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace_journal_persistence.test.d.ts","sourceRoot":"","sources":["../../test/trace_journal_persistence.test.ts"],"names":[],"mappings":""}
|