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.
Files changed (168) hide show
  1. package/CHANGELOG.md +750 -0
  2. package/LICENSE +201 -0
  3. package/README.md +492 -0
  4. package/README.zh-CN.md +389 -0
  5. package/benchmarks/README.md +24 -0
  6. package/benchmarks/gateway.mjs +68 -0
  7. package/benchmarks/pae.mjs +90 -0
  8. package/benchmarks/replay.mjs +51 -0
  9. package/benchmarks/run-all.mjs +24 -0
  10. package/benchmarks/wal.mjs +50 -0
  11. package/bin/orbit.mjs +523 -0
  12. package/dist/.tsbuildinfo +1 -0
  13. package/dist/demo-deepseek.d.ts +2 -0
  14. package/dist/demo-deepseek.d.ts.map +1 -0
  15. package/dist/demo-deepseek.js +66 -0
  16. package/dist/demo-deepseek.js.map +1 -0
  17. package/dist/demo-host.d.ts +2 -0
  18. package/dist/demo-host.d.ts.map +1 -0
  19. package/dist/demo-host.js +98 -0
  20. package/dist/demo-host.js.map +1 -0
  21. package/dist/demo-replay.d.ts +2 -0
  22. package/dist/demo-replay.d.ts.map +1 -0
  23. package/dist/demo-replay.js +68 -0
  24. package/dist/demo-replay.js.map +1 -0
  25. package/dist/src/core/orbitRuntimeHost.d.ts +349 -0
  26. package/dist/src/core/orbitRuntimeHost.d.ts.map +1 -0
  27. package/dist/src/core/orbitRuntimeHost.js +706 -0
  28. package/dist/src/core/orbitRuntimeHost.js.map +1 -0
  29. package/dist/src/index.d.ts +92 -0
  30. package/dist/src/index.d.ts.map +1 -0
  31. package/dist/src/index.js +226 -0
  32. package/dist/src/index.js.map +1 -0
  33. package/dist/test/audit_chain.test.d.ts +2 -0
  34. package/dist/test/audit_chain.test.d.ts.map +1 -0
  35. package/dist/test/audit_chain.test.js +283 -0
  36. package/dist/test/audit_chain.test.js.map +1 -0
  37. package/dist/test/channel_hub.test.d.ts +2 -0
  38. package/dist/test/channel_hub.test.d.ts.map +1 -0
  39. package/dist/test/channel_hub.test.js +66 -0
  40. package/dist/test/channel_hub.test.js.map +1 -0
  41. package/dist/test/cordis_adapter.test.d.ts +2 -0
  42. package/dist/test/cordis_adapter.test.d.ts.map +1 -0
  43. package/dist/test/cordis_adapter.test.js +280 -0
  44. package/dist/test/cordis_adapter.test.js.map +1 -0
  45. package/dist/test/cost_routing.test.d.ts +2 -0
  46. package/dist/test/cost_routing.test.d.ts.map +1 -0
  47. package/dist/test/cost_routing.test.js +31 -0
  48. package/dist/test/cost_routing.test.js.map +1 -0
  49. package/dist/test/domain_transaction.test.d.ts +2 -0
  50. package/dist/test/domain_transaction.test.d.ts.map +1 -0
  51. package/dist/test/domain_transaction.test.js +351 -0
  52. package/dist/test/domain_transaction.test.js.map +1 -0
  53. package/dist/test/file_channel.test.d.ts +2 -0
  54. package/dist/test/file_channel.test.d.ts.map +1 -0
  55. package/dist/test/file_channel.test.js +179 -0
  56. package/dist/test/file_channel.test.js.map +1 -0
  57. package/dist/test/gateway.test.d.ts +2 -0
  58. package/dist/test/gateway.test.d.ts.map +1 -0
  59. package/dist/test/gateway.test.js +548 -0
  60. package/dist/test/gateway.test.js.map +1 -0
  61. package/dist/test/governance_profile.test.d.ts +2 -0
  62. package/dist/test/governance_profile.test.d.ts.map +1 -0
  63. package/dist/test/governance_profile.test.js +214 -0
  64. package/dist/test/governance_profile.test.js.map +1 -0
  65. package/dist/test/governance_schema.test.d.ts +2 -0
  66. package/dist/test/governance_schema.test.d.ts.map +1 -0
  67. package/dist/test/governance_schema.test.js +200 -0
  68. package/dist/test/governance_schema.test.js.map +1 -0
  69. package/dist/test/host_integration.test.d.ts +2 -0
  70. package/dist/test/host_integration.test.d.ts.map +1 -0
  71. package/dist/test/host_integration.test.js +104 -0
  72. package/dist/test/host_integration.test.js.map +1 -0
  73. package/dist/test/host_journal_persistence.test.d.ts +2 -0
  74. package/dist/test/host_journal_persistence.test.d.ts.map +1 -0
  75. package/dist/test/host_journal_persistence.test.js +367 -0
  76. package/dist/test/host_journal_persistence.test.js.map +1 -0
  77. package/dist/test/impact_domain.test.d.ts +2 -0
  78. package/dist/test/impact_domain.test.d.ts.map +1 -0
  79. package/dist/test/impact_domain.test.js +48 -0
  80. package/dist/test/impact_domain.test.js.map +1 -0
  81. package/dist/test/injected_clock.test.d.ts +13 -0
  82. package/dist/test/injected_clock.test.d.ts.map +1 -0
  83. package/dist/test/injected_clock.test.js +200 -0
  84. package/dist/test/injected_clock.test.js.map +1 -0
  85. package/dist/test/isolation_domain.test.d.ts +2 -0
  86. package/dist/test/isolation_domain.test.d.ts.map +1 -0
  87. package/dist/test/isolation_domain.test.js +302 -0
  88. package/dist/test/isolation_domain.test.js.map +1 -0
  89. package/dist/test/journal_wal.test.d.ts +2 -0
  90. package/dist/test/journal_wal.test.d.ts.map +1 -0
  91. package/dist/test/journal_wal.test.js +622 -0
  92. package/dist/test/journal_wal.test.js.map +1 -0
  93. package/dist/test/mcp_adapter.test.d.ts +2 -0
  94. package/dist/test/mcp_adapter.test.d.ts.map +1 -0
  95. package/dist/test/mcp_adapter.test.js +440 -0
  96. package/dist/test/mcp_adapter.test.js.map +1 -0
  97. package/dist/test/openai_compat_channel.test.d.ts +2 -0
  98. package/dist/test/openai_compat_channel.test.d.ts.map +1 -0
  99. package/dist/test/openai_compat_channel.test.js +325 -0
  100. package/dist/test/openai_compat_channel.test.js.map +1 -0
  101. package/dist/test/openapi_adapter.test.d.ts +2 -0
  102. package/dist/test/openapi_adapter.test.d.ts.map +1 -0
  103. package/dist/test/openapi_adapter.test.js +270 -0
  104. package/dist/test/openapi_adapter.test.js.map +1 -0
  105. package/dist/test/orbit_cli.test.d.ts +2 -0
  106. package/dist/test/orbit_cli.test.d.ts.map +1 -0
  107. package/dist/test/orbit_cli.test.js +137 -0
  108. package/dist/test/orbit_cli.test.js.map +1 -0
  109. package/dist/test/pact_verifier.test.d.ts +2 -0
  110. package/dist/test/pact_verifier.test.d.ts.map +1 -0
  111. package/dist/test/pact_verifier.test.js +41 -0
  112. package/dist/test/pact_verifier.test.js.map +1 -0
  113. package/dist/test/pae_adapter.test.d.ts +2 -0
  114. package/dist/test/pae_adapter.test.d.ts.map +1 -0
  115. package/dist/test/pae_adapter.test.js +469 -0
  116. package/dist/test/pae_adapter.test.js.map +1 -0
  117. package/dist/test/plugin_sandbox_guard.test.d.ts +2 -0
  118. package/dist/test/plugin_sandbox_guard.test.d.ts.map +1 -0
  119. package/dist/test/plugin_sandbox_guard.test.js +57 -0
  120. package/dist/test/plugin_sandbox_guard.test.js.map +1 -0
  121. package/dist/test/rate_limit_behavior.test.d.ts +2 -0
  122. package/dist/test/rate_limit_behavior.test.d.ts.map +1 -0
  123. package/dist/test/rate_limit_behavior.test.js +85 -0
  124. package/dist/test/rate_limit_behavior.test.js.map +1 -0
  125. package/dist/test/replay_compat.test.d.ts +2 -0
  126. package/dist/test/replay_compat.test.d.ts.map +1 -0
  127. package/dist/test/replay_compat.test.js +1122 -0
  128. package/dist/test/replay_compat.test.js.map +1 -0
  129. package/dist/test/replay_engine.test.d.ts +2 -0
  130. package/dist/test/replay_engine.test.d.ts.map +1 -0
  131. package/dist/test/replay_engine.test.js +85 -0
  132. package/dist/test/replay_engine.test.js.map +1 -0
  133. package/dist/test/shell_channel.test.d.ts +2 -0
  134. package/dist/test/shell_channel.test.d.ts.map +1 -0
  135. package/dist/test/shell_channel.test.js +173 -0
  136. package/dist/test/shell_channel.test.js.map +1 -0
  137. package/dist/test/teardown_isolation.test.d.ts +10 -0
  138. package/dist/test/teardown_isolation.test.d.ts.map +1 -0
  139. package/dist/test/teardown_isolation.test.js +279 -0
  140. package/dist/test/teardown_isolation.test.js.map +1 -0
  141. package/dist/test/token_budget.test.d.ts +2 -0
  142. package/dist/test/token_budget.test.d.ts.map +1 -0
  143. package/dist/test/token_budget.test.js +113 -0
  144. package/dist/test/token_budget.test.js.map +1 -0
  145. package/dist/test/trace_journal.test.d.ts +2 -0
  146. package/dist/test/trace_journal.test.d.ts.map +1 -0
  147. package/dist/test/trace_journal.test.js +43 -0
  148. package/dist/test/trace_journal.test.js.map +1 -0
  149. package/dist/test/trace_journal_persistence.test.d.ts +2 -0
  150. package/dist/test/trace_journal_persistence.test.d.ts.map +1 -0
  151. package/dist/test/trace_journal_persistence.test.js +175 -0
  152. package/dist/test/trace_journal_persistence.test.js.map +1 -0
  153. package/dist/test/trace_persistence.test.d.ts +2 -0
  154. package/dist/test/trace_persistence.test.d.ts.map +1 -0
  155. package/dist/test/trace_persistence.test.js +216 -0
  156. package/dist/test/trace_persistence.test.js.map +1 -0
  157. package/dist/test/trip_protector.test.d.ts +2 -0
  158. package/dist/test/trip_protector.test.d.ts.map +1 -0
  159. package/dist/test/trip_protector.test.js +42 -0
  160. package/dist/test/trip_protector.test.js.map +1 -0
  161. package/examples/README.md +34 -0
  162. package/examples/cli-record-replay.mjs +74 -0
  163. package/examples/custom-channel.mjs +102 -0
  164. package/examples/js-pae-plugin.mjs +128 -0
  165. package/examples/mcp-adapter.mjs +102 -0
  166. package/package.json +60 -0
  167. package/src/core/orbitRuntimeHost.ts +853 -0
  168. package/src/index.ts +256 -0
@@ -0,0 +1,469 @@
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 index_1 = require("../src/index");
9
+ /**
10
+ * W15 — PAE (plugin adaptation engine) suite.
11
+ *
12
+ * Two things are under test, and they are separate concerns:
13
+ *
14
+ * 1. the registry's *static* contract (identity, surface validity, honest
15
+ * fidelity, deterministic configuration hash, dynamic pact derivation);
16
+ * 2. the *runtime* guarantee that a foreign call is indistinguishable from a
17
+ * native one — same gateway decision, same journal entry, same replay
18
+ * semantics, and zero foreign execution while replaying.
19
+ */
20
+ // ---------------------------------------------------------------------------
21
+ // Fixtures
22
+ // ---------------------------------------------------------------------------
23
+ /** A JS adapter with one read tool and one write tool. */
24
+ function makeEchoAdapter(counter) {
25
+ return new index_1.JsPaeAdapter({
26
+ adapterId: "echo-tools",
27
+ sourceEdition: "1.2.0",
28
+ tools: [
29
+ {
30
+ name: "echoUpper",
31
+ capability: "channel:read",
32
+ determinism: index_1.DeterminismLevel.DETERMINISTIC,
33
+ description: "uppercase the first argument",
34
+ handler: (args) => {
35
+ if (counter)
36
+ counter.calls += 1;
37
+ return String(args[0] ?? "").toUpperCase();
38
+ }
39
+ },
40
+ {
41
+ name: "storeNote",
42
+ capability: "channel:write",
43
+ determinism: index_1.DeterminismLevel.IO_BOUND,
44
+ handler: (args) => {
45
+ if (counter)
46
+ counter.calls += 1;
47
+ return { stored: true, note: args[0] };
48
+ }
49
+ }
50
+ ]
51
+ });
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Registry: static validation
55
+ // ---------------------------------------------------------------------------
56
+ (0, node_test_1.test)("pae registry: rejects a duplicate adapter id", () => {
57
+ const registry = new index_1.PaeAdapterRegistry();
58
+ registry.register(makeEchoAdapter());
59
+ strict_1.default.throws(() => registry.register(makeEchoAdapter()), index_1.PaeAdapterRejectError);
60
+ });
61
+ (0, node_test_1.test)("pae registry: rejects a non-semver sourceEdition", () => {
62
+ const registry = new index_1.PaeAdapterRegistry();
63
+ const adapter = new index_1.JsPaeAdapter({
64
+ adapterId: "weird-edition",
65
+ sourceEdition: "2024-11-05",
66
+ tools: [{ name: "ping", handler: () => "pong" }]
67
+ });
68
+ strict_1.default.throws(() => registry.register(adapter), (err) => {
69
+ strict_1.default.ok(err instanceof index_1.PaeAdapterRejectError);
70
+ strict_1.default.match(err.message, /not semver/);
71
+ return true;
72
+ });
73
+ });
74
+ (0, node_test_1.test)("pae registry: rejects a tool name that collides across adapters", () => {
75
+ const registry = new index_1.PaeAdapterRegistry();
76
+ registry.register(makeEchoAdapter());
77
+ const clashing = new index_1.JsPaeAdapter({
78
+ adapterId: "other-tools",
79
+ tools: [{ name: "echoUpper", handler: () => "x" }]
80
+ });
81
+ strict_1.default.throws(() => registry.register(clashing), (err) => {
82
+ strict_1.default.ok(err instanceof index_1.PaeAdapterRejectError);
83
+ strict_1.default.match(err.message, /already served by adapter echo-tools/);
84
+ return true;
85
+ });
86
+ });
87
+ (0, node_test_1.test)("pae registry: rejects a tool name that would shadow the channel surface", () => {
88
+ const registry = new index_1.PaeAdapterRegistry();
89
+ const shadowing = new index_1.JsPaeAdapter({
90
+ adapterId: "shadow",
91
+ tools: [{ name: "teardown", handler: () => null }]
92
+ });
93
+ strict_1.default.throws(() => registry.register(shadowing), (err) => {
94
+ strict_1.default.ok(err instanceof index_1.PaeAdapterRejectError);
95
+ strict_1.default.match(err.message, /reserved/);
96
+ return true;
97
+ });
98
+ });
99
+ (0, node_test_1.test)("pae registry: an undocumented fidelity downgrade is refused", () => {
100
+ const registry = new index_1.PaeAdapterRegistry();
101
+ const silent = new index_1.JsPaeAdapter({
102
+ adapterId: "silent-lossy",
103
+ tools: [{ name: "guess", fidelity: "lossy", handler: () => 1 }]
104
+ });
105
+ strict_1.default.throws(() => registry.register(silent), (err) => {
106
+ strict_1.default.ok(err instanceof index_1.PaeAdapterRejectError);
107
+ strict_1.default.match(err.message, /without a fidelityNote/);
108
+ return true;
109
+ });
110
+ // The same downgrade, documented, is accepted — the charter asks for informed
111
+ // choice, not for perfection.
112
+ const documented = new index_1.JsPaeAdapter({
113
+ adapterId: "documented-lossy",
114
+ tools: [
115
+ {
116
+ name: "guess",
117
+ fidelity: "lossy",
118
+ fidelityNote: "numeric results are rounded to integers",
119
+ handler: () => 1
120
+ }
121
+ ]
122
+ });
123
+ registry.register(documented);
124
+ strict_1.default.equal(registry.listTools()[0].fidelity, "lossy");
125
+ });
126
+ // ---------------------------------------------------------------------------
127
+ // Registry: derived pact, negotiation, configuration hash
128
+ // ---------------------------------------------------------------------------
129
+ (0, node_test_1.test)("pae registry: derived pact carries the union of tool capabilities", () => {
130
+ const registry = new index_1.PaeAdapterRegistry();
131
+ registry.register(makeEchoAdapter());
132
+ const pact = registry.derivePact("echo-tools");
133
+ strict_1.default.equal(pact.id, "echo-tools");
134
+ strict_1.default.equal(pact.edition, "1.2.0");
135
+ strict_1.default.deepEqual(pact.allowCapabilities, ["channel:read", "channel:write"]);
136
+ strict_1.default.deepEqual(pact.declareChannelDeps, [index_1.ChannelKind.PAE_TOOL]);
137
+ });
138
+ (0, node_test_1.test)("pae registry: a read-only adapter still declares channel:read", () => {
139
+ const registry = new index_1.PaeAdapterRegistry();
140
+ registry.register(new index_1.JsPaeAdapter({
141
+ adapterId: "writer-only",
142
+ tools: [{ name: "writeThing", capability: "channel:write", handler: () => true }]
143
+ }));
144
+ const pact = registry.derivePact("writer-only");
145
+ // Reaching the adaptation channel at all is a read of its surface, so the
146
+ // derived pact must not be write-only (the pact verifier enforces closure).
147
+ strict_1.default.deepEqual(pact.allowCapabilities, ["channel:read", "channel:write"]);
148
+ });
149
+ (0, node_test_1.test)("pae registry: fidelity negotiation refuses a downgrade and reports both levels", () => {
150
+ const registry = new index_1.PaeAdapterRegistry();
151
+ registry.register(new index_1.JsPaeAdapter({
152
+ adapterId: "streamless",
153
+ tools: [
154
+ {
155
+ name: "chatOnce",
156
+ fidelity: "reduced",
157
+ fidelityNote: "streaming collapsed into a single response",
158
+ handler: () => "hello"
159
+ }
160
+ ]
161
+ }));
162
+ const accepted = registry.negotiate("chatOnce", "reduced");
163
+ strict_1.default.equal(accepted.fidelity, "reduced");
164
+ strict_1.default.match(accepted.fidelityNote, /streaming/);
165
+ strict_1.default.throws(() => registry.negotiate("chatOnce", "full"), (err) => {
166
+ strict_1.default.ok(err instanceof index_1.PaeFidelityRejectError);
167
+ strict_1.default.equal(err.required, "full");
168
+ strict_1.default.equal(err.actual, "reduced");
169
+ return true;
170
+ });
171
+ strict_1.default.throws(() => registry.negotiate("noSuchTool"), index_1.PaeToolMissingError);
172
+ });
173
+ (0, node_test_1.test)("pae registry: configuration hash is deterministic and order-independent", () => {
174
+ const first = new index_1.PaeAdapterRegistry();
175
+ first.register(makeEchoAdapter());
176
+ first.register(new index_1.JsPaeAdapter({ adapterId: "zeta", tools: [{ name: "zz", handler: () => 0 }] }));
177
+ const second = new index_1.PaeAdapterRegistry();
178
+ second.register(new index_1.JsPaeAdapter({ adapterId: "zeta", tools: [{ name: "zz", handler: () => 0 }] }));
179
+ second.register(makeEchoAdapter());
180
+ strict_1.default.equal(first.configHash(), second.configHash(), "registration order must not change the hash");
181
+ second.unregister("zeta");
182
+ strict_1.default.notEqual(first.configHash(), second.configHash(), "a changed surface must change the hash");
183
+ });
184
+ (0, node_test_1.test)("pae registry: unregister drops the adapter and all of its tools", () => {
185
+ const registry = new index_1.PaeAdapterRegistry();
186
+ registry.register(makeEchoAdapter());
187
+ strict_1.default.equal(registry.listTools().length, 2);
188
+ registry.unregister("echo-tools");
189
+ strict_1.default.ok(registry.isEmpty());
190
+ strict_1.default.equal(registry.lookup("echoUpper"), undefined);
191
+ strict_1.default.equal(registry.capabilityOf("storeNote"), undefined);
192
+ });
193
+ // ---------------------------------------------------------------------------
194
+ // Adapter contract
195
+ // ---------------------------------------------------------------------------
196
+ (0, node_test_1.test)("pae js adapter: unknown tool names fail with PaeToolMissingError", async () => {
197
+ const adapter = makeEchoAdapter();
198
+ const ctx = { traceMarkId: "t", maxWaitMs: 1000 };
199
+ await strict_1.default.rejects(adapter.invoke("nope", [], ctx), index_1.PaeToolMissingError);
200
+ });
201
+ (0, node_test_1.test)("pae js adapter: determinism sources come from the injected context", async () => {
202
+ const adapter = new index_1.JsPaeAdapter({
203
+ adapterId: "seeded",
204
+ tools: [
205
+ {
206
+ name: "rollDie",
207
+ determinism: index_1.DeterminismLevel.STOCHASTIC,
208
+ handler: (_args, ctx) => Math.floor((ctx.rng?.next() ?? 0) * 6) + 1
209
+ }
210
+ ]
211
+ });
212
+ const ctx = { traceMarkId: "t", maxWaitMs: 1000, rng: new index_1.SeededRng(42) };
213
+ const other = { traceMarkId: "t", maxWaitMs: 1000, rng: new index_1.SeededRng(42) };
214
+ strict_1.default.equal(await adapter.invoke("rollDie", [], ctx), await adapter.invoke("rollDie", [], other));
215
+ });
216
+ // ---------------------------------------------------------------------------
217
+ // Host integration: a foreign call is a governed call
218
+ // ---------------------------------------------------------------------------
219
+ (0, node_test_1.test)("pae host: registering an adapter derives and installs a dynamic pact", async () => {
220
+ const host = new index_1.OrbitRuntimeHost();
221
+ await host.bootHost();
222
+ const pact = host.registerPaeToolAdapter(makeEchoAdapter());
223
+ strict_1.default.ok(host.pluginPactVerifier.listPluginIds().includes("echo-tools"));
224
+ strict_1.default.ok(host.pluginPactVerifier.hasCapability("echo-tools", "channel:write"));
225
+ strict_1.default.deepEqual(host.paeChannel.installedTools(), ["echoUpper", "storeNote"]);
226
+ // The adapter is a graph node depending on the adaptation channel, so a
227
+ // failure of that channel provably reaches the adapter — the foreign unit
228
+ // participates in isolation reasoning exactly like a native one.
229
+ strict_1.default.ok(host.isolationDomain(index_1.ChannelKind.PAE_TOOL).includes("echo-tools"));
230
+ strict_1.default.equal(host.areIsolated("echo-tools", index_1.ChannelKind.MEM_KV_STORE), true);
231
+ strict_1.default.equal(pact.displayName, "pae:js:echo-tools");
232
+ await host.shutdownHost();
233
+ });
234
+ (0, node_test_1.test)("pae host: a foreign call is recorded with a full pae-routed decision", async () => {
235
+ const host = new index_1.OrbitRuntimeHost();
236
+ await host.bootHost();
237
+ host.registerPaeToolAdapter(makeEchoAdapter());
238
+ const journal = host.beginRecording();
239
+ const out = await host.capabilityInvoke({
240
+ kind: index_1.ChannelKind.PAE_TOOL,
241
+ pluginId: "echo-tools",
242
+ funcName: "echoUpper",
243
+ args: ["orbit"],
244
+ mode: "live"
245
+ });
246
+ strict_1.default.equal(out, "ORBIT");
247
+ strict_1.default.equal(journal.size(), 1);
248
+ const rec = journal.get(0);
249
+ strict_1.default.equal(rec.channelKind, index_1.ChannelKind.PAE_TOOL);
250
+ strict_1.default.equal(rec.funcName, "echoUpper", "the trace names the real tool");
251
+ strict_1.default.equal(rec.decision.route, "pae");
252
+ strict_1.default.equal(rec.decision.pactPass, true);
253
+ strict_1.default.equal(rec.decision.tripAllowed, true);
254
+ strict_1.default.equal(rec.behavior.route, "pae");
255
+ strict_1.default.ok(rec.runFingerprint.paeEnabled);
256
+ strict_1.default.ok(rec.runFingerprint.paeAdaptersHash, "the adaptation surface is fingerprinted");
257
+ await host.shutdownHost();
258
+ });
259
+ (0, node_test_1.test)("pae host: a write tool is blocked for a caller holding only read", async () => {
260
+ const host = new index_1.OrbitRuntimeHost();
261
+ await host.bootHost();
262
+ // Registered WITHOUT its derived pact, so a hand-written read-only pact is
263
+ // the only capability declaration in play.
264
+ host.registerPaeToolAdapter(makeEchoAdapter(), { registerPact: false });
265
+ host.registerPlugin({
266
+ id: "echo-tools",
267
+ displayName: "Echo (read-only)",
268
+ edition: "1.0.0",
269
+ requireHostMinEdition: "1.0.0",
270
+ allowCapabilities: ["channel:read"]
271
+ });
272
+ // The read tool passes …
273
+ strict_1.default.equal(await host.capabilityInvoke({
274
+ kind: index_1.ChannelKind.PAE_TOOL,
275
+ pluginId: "echo-tools",
276
+ funcName: "echoUpper",
277
+ args: ["ok"],
278
+ mode: "live"
279
+ }), "OK");
280
+ // … while the write tool is refused: PAE tools are governed per tool, not
281
+ // wholesale per channel.
282
+ await strict_1.default.rejects(host.capabilityInvoke({
283
+ kind: index_1.ChannelKind.PAE_TOOL,
284
+ pluginId: "echo-tools",
285
+ funcName: "storeNote",
286
+ args: ["secret"],
287
+ mode: "live"
288
+ }), /lacks capability/);
289
+ await host.shutdownHost();
290
+ });
291
+ (0, node_test_1.test)("pae host: unknown tool names fail closed at the capability gate", async () => {
292
+ const host = new index_1.OrbitRuntimeHost();
293
+ await host.bootHost();
294
+ host.registerPaeToolAdapter(makeEchoAdapter(), { registerPact: false });
295
+ host.registerPlugin({
296
+ id: "echo-tools",
297
+ displayName: "Echo (read-only)",
298
+ edition: "1.0.0",
299
+ requireHostMinEdition: "1.0.0",
300
+ allowCapabilities: ["channel:read"]
301
+ });
302
+ // An unregistered tool resolves to the conservative write capability, so the
303
+ // call is refused before anything is dispatched.
304
+ await strict_1.default.rejects(host.capabilityInvoke({
305
+ kind: index_1.ChannelKind.PAE_TOOL,
306
+ pluginId: "echo-tools",
307
+ funcName: "ghostTool",
308
+ args: [],
309
+ mode: "live"
310
+ }), /lacks capability/);
311
+ await host.shutdownHost();
312
+ });
313
+ (0, node_test_1.test)("pae host: negotiation surfaces at the host facade", async () => {
314
+ const host = new index_1.OrbitRuntimeHost();
315
+ await host.bootHost();
316
+ host.registerPaeToolAdapter(new index_1.JsPaeAdapter({
317
+ adapterId: "reduced-tools",
318
+ tools: [
319
+ {
320
+ name: "summarize",
321
+ fidelity: "reduced",
322
+ fidelityNote: "no citations in the reduced mapping",
323
+ handler: () => "summary"
324
+ }
325
+ ]
326
+ }));
327
+ strict_1.default.equal(host.negotiatePaeTool("summarize", "reduced").fidelity, "reduced");
328
+ strict_1.default.throws(() => host.negotiatePaeTool("summarize", "full"), index_1.PaeFidelityRejectError);
329
+ await host.shutdownHost();
330
+ });
331
+ (0, node_test_1.test)("pae host: adapters registered after boot are connected by bootPaeAdapters", async () => {
332
+ const setupOrder = [];
333
+ const lateAdapter = {
334
+ meta: { adapterId: "late", kind: "js", sourceEdition: "1.0.0", isolation: "L0" },
335
+ describe: () => [
336
+ {
337
+ name: "lateTool",
338
+ capability: "channel:read",
339
+ determinism: index_1.DeterminismLevel.DETERMINISTIC,
340
+ fidelity: "full"
341
+ }
342
+ ],
343
+ invoke: async () => "late-ok",
344
+ setup: async () => {
345
+ setupOrder.push("setup");
346
+ },
347
+ teardown: async () => {
348
+ setupOrder.push("teardown");
349
+ }
350
+ };
351
+ const host = new index_1.OrbitRuntimeHost();
352
+ await host.bootHost(); // the adaptation channel boots with an empty surface
353
+ host.registerPaeToolAdapter(lateAdapter);
354
+ strict_1.default.deepEqual(setupOrder, [], "registration alone does not connect the adapter");
355
+ await host.bootPaeAdapters();
356
+ strict_1.default.deepEqual(setupOrder, ["setup"]);
357
+ await host.bootPaeAdapters();
358
+ strict_1.default.deepEqual(setupOrder, ["setup"], "connecting twice is a no-op");
359
+ strict_1.default.equal(await host.capabilityInvoke({
360
+ kind: index_1.ChannelKind.PAE_TOOL,
361
+ pluginId: "late",
362
+ funcName: "lateTool",
363
+ args: [],
364
+ mode: "live"
365
+ }), "late-ok");
366
+ await host.shutdownHost();
367
+ strict_1.default.deepEqual(setupOrder, ["setup", "teardown"]);
368
+ });
369
+ (0, node_test_1.test)("pae host: unregistering an adapter revokes its tools and its pact", async () => {
370
+ const host = new index_1.OrbitRuntimeHost();
371
+ await host.bootHost();
372
+ host.registerPaeToolAdapter(makeEchoAdapter());
373
+ host.unregisterPaeToolAdapter("echo-tools");
374
+ strict_1.default.deepEqual(host.paeChannel.installedTools(), []);
375
+ strict_1.default.equal(host.pluginPactVerifier.hasCapability("echo-tools", "channel:read"), false);
376
+ await strict_1.default.rejects(host.capabilityInvoke({
377
+ kind: index_1.ChannelKind.PAE_TOOL,
378
+ pluginId: "echo-tools",
379
+ funcName: "echoUpper",
380
+ args: ["x"],
381
+ mode: "live"
382
+ }), /lacks capability/);
383
+ await host.shutdownHost();
384
+ });
385
+ // ---------------------------------------------------------------------------
386
+ // Determinism: record → replay with zero foreign execution
387
+ // ---------------------------------------------------------------------------
388
+ (0, node_test_1.test)("pae host: replay serves the recorded output and never re-enters the adapter", async () => {
389
+ const counter = { calls: 0 };
390
+ const host = new index_1.OrbitRuntimeHost();
391
+ await host.bootHost();
392
+ host.registerPaeToolAdapter(makeEchoAdapter(counter));
393
+ const journal = host.beginRecording();
394
+ const recorded = await host.capabilityInvoke({
395
+ kind: index_1.ChannelKind.PAE_TOOL,
396
+ pluginId: "echo-tools",
397
+ funcName: "echoUpper",
398
+ args: ["replay-me"],
399
+ mode: "record"
400
+ });
401
+ strict_1.default.equal(recorded, "REPLAY-ME");
402
+ strict_1.default.equal(counter.calls, 1);
403
+ host.attachReplayEngine(journal);
404
+ const replayed = await host.capabilityInvoke({
405
+ kind: index_1.ChannelKind.PAE_TOOL,
406
+ pluginId: "echo-tools",
407
+ funcName: "echoUpper",
408
+ args: ["replay-me"],
409
+ mode: "replay"
410
+ });
411
+ strict_1.default.equal(replayed, recorded, "replay is byte-identical");
412
+ strict_1.default.equal(counter.calls, 1, "the foreign runtime is never re-entered on replay");
413
+ strict_1.default.equal(host.gateway.lastDecision.route, "pae", "the recorded decision is restored");
414
+ await host.shutdownHost();
415
+ });
416
+ (0, node_test_1.test)("pae host: replaying against a changed adaptation surface reports config drift", async () => {
417
+ const host = new index_1.OrbitRuntimeHost();
418
+ await host.bootHost();
419
+ host.registerPaeToolAdapter(makeEchoAdapter());
420
+ const journal = host.beginRecording();
421
+ await host.capabilityInvoke({
422
+ kind: index_1.ChannelKind.PAE_TOOL,
423
+ pluginId: "echo-tools",
424
+ funcName: "echoUpper",
425
+ args: ["x"],
426
+ mode: "record"
427
+ });
428
+ // A second adapter changes the surface hash without touching the recorded
429
+ // call, so the mismatch must be classified as configuration drift.
430
+ host.registerPaeToolAdapter(new index_1.JsPaeAdapter({ adapterId: "extra", tools: [{ name: "extraTool", handler: () => 1 }] }));
431
+ host.attachReplayEngine(journal);
432
+ await strict_1.default.rejects(host.capabilityInvoke({
433
+ kind: index_1.ChannelKind.PAE_TOOL,
434
+ pluginId: "echo-tools",
435
+ funcName: "echoUpper",
436
+ args: ["x"],
437
+ mode: "replay"
438
+ }), (err) => {
439
+ strict_1.default.ok(err instanceof index_1.RunFingerprintDriftError);
440
+ strict_1.default.equal(err.driftField, "paeAdaptersHash");
441
+ return true;
442
+ });
443
+ await host.shutdownHost();
444
+ });
445
+ (0, node_test_1.test)("pae host: traces recorded without any adapter keep their fingerprint shape", async () => {
446
+ const host = new index_1.OrbitRuntimeHost();
447
+ await host.bootHost();
448
+ host.registerPlugin({
449
+ id: "native-only",
450
+ displayName: "Native",
451
+ edition: "1.0.0",
452
+ requireHostMinEdition: "1.0.0",
453
+ allowCapabilities: ["channel:read"]
454
+ });
455
+ const journal = host.beginRecording();
456
+ await host.capabilityInvoke({
457
+ kind: index_1.ChannelKind.MEM_KV_STORE,
458
+ pluginId: "native-only",
459
+ funcName: "readEntry",
460
+ args: ["k"],
461
+ mode: "record"
462
+ });
463
+ // Backwards compatibility: hosts that never adapt a foreign runtime record
464
+ // exactly the fingerprint they recorded before the engine existed.
465
+ strict_1.default.equal(journal.get(0).runFingerprint.paeAdaptersHash, undefined);
466
+ strict_1.default.equal(journal.get(0).decision.route, "native");
467
+ await host.shutdownHost();
468
+ });
469
+ //# sourceMappingURL=pae_adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pae_adapter.test.js","sourceRoot":"","sources":["../../test/pae_adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin_sandbox_guard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin_sandbox_guard.test.d.ts","sourceRoot":"","sources":["../../test/plugin_sandbox_guard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
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
+ const core_hub_2 = require("@orbit/core-hub");
10
+ (0, node_test_1.test)("runPluginSafe: failure is isolated, journaled and rethrown", async () => {
11
+ const journal = new core_hub_1.TraceJournal();
12
+ const guard = new core_hub_2.PluginSandboxGuard(journal);
13
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", async () => {
14
+ throw new Error("boom");
15
+ }), /boom/);
16
+ const entries = journal.byEntryClass("PLUGIN_UNIT_EXCEPTION");
17
+ strict_1.default.equal(entries.length, 1);
18
+ strict_1.default.equal(entries[0].pluginUnitId, "p1");
19
+ strict_1.default.deepEqual(entries[0].factPayload, { errMsg: "boom" });
20
+ });
21
+ (0, node_test_1.test)("runPluginSafe: repeated failures trip the per-plugin protector", async () => {
22
+ const journal = new core_hub_1.TraceJournal();
23
+ const guard = new core_hub_2.PluginSandboxGuard(journal, () => 2); // strict threshold for this plugin
24
+ const boom = async () => {
25
+ throw new Error("x");
26
+ };
27
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom));
28
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom));
29
+ // third call: protector is TRIPPED, blocked before running the business fn
30
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom), /trip protector active/);
31
+ });
32
+ (0, node_test_1.test)("runPluginSafe: different plugins have independent protectors", async () => {
33
+ const journal = new core_hub_1.TraceJournal();
34
+ const guard = new core_hub_2.PluginSandboxGuard(journal, () => 2);
35
+ const boom = async () => {
36
+ throw new Error("x");
37
+ };
38
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom));
39
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom));
40
+ // p1 is tripped, but p2 still executes fine
41
+ const ok = await guard.runPluginSafe("p2", "t2", async () => "fine");
42
+ strict_1.default.equal(ok, "fine");
43
+ });
44
+ (0, node_test_1.test)("releaseAllGuard: clears every protector", async () => {
45
+ const journal = new core_hub_1.TraceJournal();
46
+ const guard = new core_hub_2.PluginSandboxGuard(journal, () => 2);
47
+ const boom = async () => {
48
+ throw new Error("x");
49
+ };
50
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom));
51
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom));
52
+ await strict_1.default.rejects(guard.runPluginSafe("p1", "t1", boom), /trip protector active/);
53
+ guard.releaseAllGuard();
54
+ const ok = await guard.runPluginSafe("p1", "t1", async () => "recovered");
55
+ strict_1.default.equal(ok, "recovered");
56
+ });
57
+ //# sourceMappingURL=plugin_sandbox_guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin_sandbox_guard.test.js","sourceRoot":"","sources":["../../test/plugin_sandbox_guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rate_limit_behavior.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate_limit_behavior.test.d.ts","sourceRoot":"","sources":["../../test/rate_limit_behavior.test.ts"],"names":[],"mappings":""}