1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
// node --test test/*.test.mjs (after `npm ci` and scripts/stage.sh: the published modules, staged in dist/)
// The module -> MCP adapter and the agent with the real modules, runModule, policyCall, code mode (asc in a
// Node worker) and the asyncai agent; only the user's PDS (its OAuth session and its public reads) and the
// inference API are stubbed. The official MCP SDK client talks to the adapter over Streamable HTTP, as a
// remote client would through the ingress.
import assert from "node:assert/strict";
import { mkdtemp } from "node:fs/promises";
import { createServer } from "node:http";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { test } from "node:test";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
// The page loads @publicdomainrelay/* from jsdelivr through its import map, and Node from node_modules (the same
// npm packages).
const ROOT = new URL("../dist/", import.meta.url);
const spa = await import("../spa.js");
const { actionsServer, toolName } = await import("@publicdomainrelay/atlibs/mcp/index.js");
const { requestScope } = await import("@publicdomainrelay/atlibs/oauth/index.js");
const { createNodeContext, fileFetch } = await import("@publicdomainrelay/atlibs/server/index.js");
// a hook default (the requester's user-data) loads from beside its module with the global fetch, as the page's
// does from its origin: dist/ here
const netFetch = globalThis.fetch;
globalThis.fetch = (url, init) => (String(url).startsWith("file:") ? fileFetch(url, init) : netFetch(url, init));
const did = "did:plc:lpfuqerea3deuoyrn7ojser4";
const PDS = "https://pds.test";
const DOMAIN = { uri: `at://${did}/at.marque.domain/example.com`, cid: "bafydomain", value: { $type: "at.marque.domain", domain: "example.com", status: "active" } };
const created = [];
// the user's computer.socialweb.vm.kept/self, when a test keeps a VM
let keptRecord = null;
const SSH_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGp6bWl0ZXN0a2V5Zm9yYXRsaWJzYWdlbnRzcGF0ZXN0 agent";
// The user's PDS, public reads and the session's alike; `seen` records each request as "METHOD nsid".
function pds(seen) {
return async (url, init = {}) => {
const u = new URL(url, PDS);
if (u.origin === "https://plc.directory") return Response.json({ service: [{ id: "#atproto_pds", type: "AtprotoPersonalDataServer", serviceEndpoint: PDS }] });
const nsid = u.pathname.replace("/xrpc/", "");
seen.push(`${init.method ?? "GET"} ${nsid}${u.searchParams.get("collection") ? ` ${u.searchParams.get("collection")}` : ""}`);
if (nsid === "com.atproto.repo.listRecords" && u.searchParams.get("collection") === "at.marque.domain") return Response.json({ records: [DOMAIN] });
if (nsid === "com.atproto.repo.listRecords" && u.searchParams.get("collection") === "dev.knotless.repo") return Response.json({ records: [{ uri: `at://${did}/dev.knotless.repo/demo`, cid: "bafyrepo", value: { name: "demo" } }] });
if (nsid === "dev.cocore.account.createApiKey") return Response.json({ id: "k1", name: JSON.parse(init.body).name, key: "cocore_secret" });
if (nsid === "com.atproto.repo.createRecord" && created.push(JSON.parse(init.body))) return Response.json({ uri: `at://${did}/${JSON.parse(init.body).collection}/3new`, cid: "bafynew" });
if (nsid === "com.atproto.repo.getRecord" && u.searchParams.get("collection") === "computer.socialweb.vm.kept" && keptRecord) return Response.json(keptRecord);
if (nsid === "com.atproto.repo.putRecord") return Response.json({ uri: `at://${did}/${JSON.parse(init.body).collection}/${JSON.parse(init.body).rkey}`, cid: "bafyput" });
return Response.json({ error: "RecordNotFound", message: "not here" }, { status: 400 });
};
}
const sessionOf = (seen) => ({ did, fetchHandler: (path, init) => pds(seen)(new URL(path, PDS).href, init) });
async function setup({ confirm = async () => true, fetch } = {}) {
const seen = [];
const ctx = createNodeContext({ id: "agent-spa-test", stateDir: await mkdtemp(join(tmpdir(), "agent-spa-")), fetch: fetch ?? pds(seen) });
const { modules, policy } = await spa.loadAll(ctx, ROOT, fileFetch);
const asked = [];
const servers = spa.mcpServers({ ctx, policy, modules, session: sessionOf(seen), confirm: async (q) => (asked.push(q), confirm(q)) });
return { ctx, modules, policy, servers, seen, asked };
}
const rpc = (server, method, params, id = 1) => server.message({ jsonrpc: "2.0", id, method, params });
test("one sign-in asks for every lib's session scope; each module keeps its own", async () => {
const { policy, ctx } = await setup();
ctx.close?.();
const scope = requestScope(policy, Object.keys(policy.sessions)).split(" ");
for (const s of ["repo:dev.knotless.ref?action=create&action=update", "blob:application/x-git-packed-objects", "repo:at.marque.dns?action=create&action=update", "repo:com.fedproxy.sshPublicKey?action=create", "rpc:dev.cocore.account.createApiKey?aud=did:web:cocore.dev%23cocore_console", "rpc:dev.cocore.inference.dispatch?aud=*", "repo:com.publicdomainrelay.temp.market.rfp?action=create&action=delete", "rpc:com.publicdomainrelay.temp.market.submitRfp?aud=*", "repo:computer.socialweb.vm.kept?action=create&action=update"]) assert.ok(scope.includes(s), s);
assert.deepEqual(Object.keys(policy.sessions).sort(), ["asyncai", "cocore-inference", "cocore-keys", "fedproxy", "knotless", "marque", "requester"]);
assert.equal(policy.modules.asyncai.session, "asyncai"); // its own: co/core inference by service auth
});
test("module.json actions become MCP tools: names, schemas, read-only hints", async () => {
const { servers, ctx } = await setup();
ctx.close?.();
const init = await rpc(servers.knotless, "initialize", { protocolVersion: "2025-06-18", capabilities: {}, clientInfo: { name: "t", version: "0" } });
assert.deepEqual(init.result, { protocolVersion: "2025-06-18", capabilities: { tools: {} }, serverInfo: { name: "atlibs-knotless", version: "0.1.0" } });
assert.equal(await servers.knotless.message({ jsonrpc: "2.0", method: "notifications/initialized" }), null);
const knotless = (await rpc(servers.knotless, "tools/list")).result.tools;
assert.deepEqual(knotless.map((t) => [t.name, t.annotations.readOnlyHint]), [["create_repo", false], ["commit", false]]);
assert.deepEqual(Object.keys(knotless[1].inputSchema.properties), ["name", "branch", "parent", "message", "author", "changes"]);
// the model's servers: code mode and config.js TOOLS; cocore (the inference behind asyncai) is none of them
assert.deepEqual(Object.keys(servers), ["code", "knotless", "marque", "fedproxy", "vm"]);
assert.equal(servers.fedproxy.readOnly("list_keys"), true);
assert.equal(servers.fedproxy.readOnly("create_key"), false);
assert.equal(toolName("cocore", "cocore-keys", "list_keys"), "keys_list_keys");
assert.equal((await rpc(servers.marque, "tools/call", { name: "nope" })).error.code, -32602);
assert.equal((await rpc(servers.marque, "resources/list")).error.code, -32601);
});
test("a read runs as the user with no confirm; a write asks first, and a declined one never reaches the PDS", async () => {
let answer = false;
const { servers, seen, asked, ctx } = await setup({ confirm: async () => answer });
const domains = await rpc(servers.marque, "tools/call", { name: "list_domains", arguments: {} });
assert.equal(domains.result.isError, undefined, JSON.stringify(domains));
assert.equal(domains.result.structuredContent.domains[0].domain, "example.com");
assert.deepEqual(asked, []);
seen.length = 0;
const key = { handle: "alice.test", name: "agent", service: "agent", key: SSH_KEY };
const declined = await rpc(servers.fedproxy, "tools/call", { name: "create_key", arguments: { ...key, did: "did:plc:mallory" } });
assert.equal(declined.result.isError, true);
assert.match(declined.result.content[0].text, /declined/);
assert.deepEqual(asked, [{ server: "fedproxy", tool: "create_key", module: "fedproxy", entry: "create_key", arguments: key, caller: undefined }]);
assert.deepEqual(seen, []);
answer = true;
const added = await rpc(servers.fedproxy, "tools/call", { name: "create_key", arguments: key });
ctx.close?.();
assert.equal(added.result.isError, undefined, JSON.stringify(added));
assert.deepEqual(seen, ["POST com.atproto.repo.createRecord"]);
});
test("each tool is held to its own module's session: a narrowed scope fails the call", async () => {
const { ctx, modules, policy, seen } = await setup();
const narrowed = { ...policy, sessions: { ...policy.sessions, "cocore-keys": policy.sessions.marque } };
const server = actionsServer({ name: "cocore", modules: [modules["cocore-keys"]], confirm: async () => true, run: (mod, entry, args) => spa.runAction({ ctx, policy: narrowed, session: sessionOf(seen) }, mod, entry, args) });
const out = await rpc(server, "tools/call", { name: "keys_create_key", arguments: { name: "agent" } });
ctx.close?.();
assert.equal(out.result.isError, true);
assert.match(out.result.content[0].text, /cocore-keys may not call dev.cocore.account.createApiKey/);
});
test("the MCP SDK client over Streamable HTTP sees only the public tools; write tools still ask the user", async () => {
const { servers, asked, ctx } = await setup({ confirm: async () => false });
const isPublic = (server, tool) => servers[server].readOnly(tool);
const forward = spa.publicMcp(servers, isPublic);
// what the ingress hands the page for each request, and back
const http = createServer(async (req, res) => {
let body = "";
for await (const chunk of req) body += chunk;
const out = await forward({ method: req.method, path: new URL(req.url, "http://x").pathname, headers: req.headers, body, callerDid: "did:plc:remote" });
res.writeHead(out.status, { "content-type": out.contentType, ...out.headers }).end(typeof out.body === "string" ? out.body : JSON.stringify(out.body));
});
await new Promise((ok) => http.listen(0, "127.0.0.1", ok));
const base = `http://127.0.0.1:${http.address().port}`;
try {
const client = new Client({ name: "remote", version: "0" });
await client.connect(new StreamableHTTPClientTransport(new URL(`${base}/mcp/fedproxy`)));
assert.deepEqual((await client.listTools()).tools.map((t) => t.name), ["list_keys"]);
await assert.rejects(client.callTool({ name: "create_key", arguments: { name: "x" } }), /Unknown tool/);
await client.close();
// opted in: listed, and the user is still asked (here: declines)
const optIn = spa.publicMcp(servers, (server, tool) => isPublic(server, tool) || tool === "create_key");
const out = await optIn({ method: "POST", path: "/mcp/fedproxy", body: JSON.stringify({ jsonrpc: "2.0", id: 7, method: "tools/call", params: { name: "create_key", arguments: { handle: "alice.test", name: "agent", service: "agent", key: SSH_KEY } } }), callerDid: "did:plc:remote" });
assert.equal(out.body.result.isError, true);
assert.equal(asked.at(-1).caller, "did:plc:remote");
const code = new Client({ name: "remote", version: "0" });
await code.connect(new StreamableHTTPClientTransport(new URL(`${base}/mcp/code`)));
assert.deepEqual((await code.listTools()).tools.map((t) => t.name), ["run_assemblyscript"]);
await code.close();
assert.equal((await forward({ method: "GET", path: "/mcp/code" })).status, 405);
// CORS on every answer, and the browser's preflight
for (const r of [await forward({ method: "GET", path: "/mcp/code" }), await forward({ method: "POST", path: "/mcp/code", body: '{"jsonrpc":"2.0","method":"notifications/initialized"}' }), await forward({ method: "POST", path: "/nope" })]) assert.deepEqual(r.headers, { "access-control-allow-origin": "*", "access-control-expose-headers": "mcp-session-id" });
const pre = await forward({ method: "OPTIONS", path: "/mcp/marque" });
assert.equal(pre.status, 204);
assert.match(pre.headers["access-control-allow-headers"], /mcp-protocol-version/);
assert.match(pre.headers["access-control-allow-methods"], /POST/);
assert.deepEqual((await forward({ method: "POST", path: "/" })).body.servers, ["/mcp/code", "/mcp/knotless", "/mcp/marque", "/mcp/fedproxy", "/mcp/vm"]);
} finally {
http.close();
ctx.close?.();
}
});
// code mode calls a lib server's read-only tool (one JSON-RPC message) and filters what it returns; a write is refused
const toolCall = (name, args) => `Json.object().set("jsonrpc", Json.string("2.0")).set("id", Json.number(1)).set("method", Json.string("tools/call")).set("params", Json.object().set("name", Json.string("${name}")).set("arguments", ${args}))`;
const CODE_CALLS = `export function main(run: Run): void {
if (run.start) { print("hi"); run.call("d", "com.fedfork.exec.mcp.marque", ${toolCall("list_domains", "Json.object()")}); return; }
run.finish(Json.object().set("n", Json.number(17 * 23)).set("domain", run.output.get("result").get("structuredContent").get("domains").at(0).get("domain")));
}`;
const CODE_WRITES = `export function main(run: Run): void {
if (run.start) { run.call("w", "com.fedfork.exec.mcp.knotless", ${toolCall("create_repo", 'Json.object().set("name", Json.string("x"))')}); return; }
run.finish(run.output.get("error").get("message"));
}`;
test("the agent: asyncai with code mode and the lib servers in-process; inference stubbed", { timeout: 120_000 }, async () => {
const requests = [];
const turns = [
{
content: [
{ type: "tool_use", id: "a", name: "code__run_assemblyscript", input: { code: CODE_CALLS } },
{ type: "tool_use", id: "w", name: "code__run_assemblyscript", input: { code: CODE_WRITES } },
{ type: "tool_use", id: "b", name: "marque__list_domains", input: {} },
{ type: "tool_use", id: "c", name: "knotless__create_repo", input: { name: "demo" } },
],
stop_reason: "tool_use",
},
{ content: [{ type: "text", text: "391; example.com; you declined the repo" }], stop_reason: "end_turn" },
];
const seen = [];
const stub = pds(seen);
const fetch = async (url, init) => (url.startsWith("https://inference.test/") ? (requests.push({ headers: init.headers, body: JSON.parse(init.body) }), Response.json({ ...turns.shift(), usage: { input_tokens: 1, output_tokens: 1 } })) : stub(url, init));
const { ctx, modules, servers, asked } = await setup({ fetch, confirm: async () => false });
const composition = await spa.agentComposition(ctx, modules.asyncai, Object.keys(servers));
const progress = [];
const ran = await spa.runAgent(ctx, composition, servers, { prompt: "go", system: spa.systemPrompt(did), provider: "custom", endpoint: "https://inference.test", format: "anthropic", apiKey: "PAGE-KEY", model: "m" }, { progress: (r) => progress.push(r.length) });
ctx.close?.();
assert.equal(ran.error, undefined, ran.error);
const r = ran.result;
assert.equal(r.stop, "end_turn", r.error);
assert.deepEqual(r.servers.map((s) => [s.name, s.phase]), [["code", "ready"], ["knotless", "ready"], ["marque", "ready"], ["fedproxy", "ready"], ["vm", "ready"]]);
const results = Object.fromEntries(r.messages.at(-2).content.map((b) => [b.tool_use_id, b]));
assert.deepEqual(JSON.parse(results.a.content), { stdout: "hi\n", result: { n: 391, domain: "example.com" } });
assert.match(JSON.parse(results.w.content).result, /create_repo: code mode calls read-only tools only/);
assert.match(results.b.content, /example\.com/);
assert.equal(results.c.is_error, true);
assert.deepEqual(asked.map((q) => q.tool), ["create_repo"]);
// each in-process server on its own hook: code mode's, and com.fedfork.exec.mcp.<lib>
assert.deepEqual([...new Set(ran.graph.map((g) => `${g.nsid} ${g.handler}`))].sort(), ["com.fedfork.exec.mcp.fedproxy fedproxy", "com.fedfork.exec.mcp.knotless knotless", "com.fedfork.exec.mcp.marque marque", "com.fedfork.exec.mcp.message code", "com.fedfork.exec.mcp.vm vm"]);
// the key went only in the host's headers; the model saw every server's tools
assert.equal(requests[0].headers["x-api-key"], "PAGE-KEY");
assert.ok(requests[0].body.tools.some((t) => t.name === "fedproxy__list_keys"));
assert.ok(!requests[0].body.tools.some((t) => t.name.startsWith("cocore__")));
// no listing: every PDS read the run made is one record at a computed key, or marque's own list_domains
assert.ok(!seen.some((s) => s.startsWith("GET com.atproto.repo.listRecords") && !s.endsWith("at.marque.domain")), seen.join("\n"));
assert.equal(requests[0].body.model, "m");
assert.ok(progress.length >= 2 && progress.at(-1) === spa.rows(r.messages).length);
});
// co/core's /models on 2026-11-10
const COCORE_MODELS = ["mlx-community/Qwen2.5-7B-Instruct-4bit", "mlx-community/gemma-4-26B-A4B-it-4bit", "mlx-community/Qwen3.5-4B-MLX-4bit", "google/gemma-4-12b", "mlx-community/gemma-3-4b-it-qat-4bit", "mlx-community/Ornith-1.0-9B-4bit", "mlx-community/Qwen2.5-32B-Instruct-4bit", "prism-ml/Ternary-Bonsai-27B-mlx-2bit", "stub"];
test("pickModel: the largest instruct model, else the largest other than stub", () => {
assert.equal(spa.pickModel(COCORE_MODELS), "mlx-community/Qwen2.5-32B-Instruct-4bit");
assert.equal(spa.pickModel(COCORE_MODELS.filter((id) => !id.includes("32B"))), "mlx-community/gemma-4-26B-A4B-it-4bit");
assert.equal(spa.pickModel(["google/gemma-4-12b", "stub", "x/Big-70B"]), "x/Big-70B");
assert.equal(spa.pickModel(["stub"]), undefined);
});
test("co/core, the default provider: the host mints its service-auth token with asyncai's session; the agent never sees it", { timeout: 120_000 }, async () => {
const seen = [];
const stub = pds(seen);
const sent = [];
const fetch = async (url, init = {}) => {
const u = new URL(url);
if (u.pathname.endsWith("com.atproto.server.getServiceAuth")) return (seen.push(`GET getServiceAuth ${u.searchParams.get("aud")} ${u.searchParams.get("lxm")}`), Response.json({ token: "SVC" }));
if (u.href === "https://cocore.dev/api/v1/models") return Response.json({ object: "list", data: COCORE_MODELS.map((id) => ({ id, object: "model" })) });
if (u.origin === "https://cocore.dev") return (sent.push({ headers: init.headers, body: JSON.parse(init.body) }), Response.json({ id: "c", object: "chat.completion", choices: [{ index: 0, message: { role: "assistant", content: "hello" }, finish_reason: "stop" }], usage: { prompt_tokens: 1, completion_tokens: 1 } }));
return stub(url, init);
};
const { ctx, modules, policy, servers } = await setup({ fetch });
const composition = await spa.agentComposition(ctx, modules.asyncai, Object.keys(servers));
const host = { ctx, policy, session: { did, fetchHandler: (path, init) => fetch(new URL(path, PDS).href, init) } };
// no model named: the largest instruct model co/core serves now
const model = await spa.cocoreModel(host, modules);
assert.equal(model, "mlx-community/Qwen2.5-32B-Instruct-4bit");
const ran = await spa.runAgent(ctx, composition, servers, { prompt: "hi", system: "s", model }, { host });
ctx.close?.();
assert.equal(ran.error, undefined, ran.error);
assert.equal(ran.result.stop, "end_turn", ran.result.error);
assert.ok(seen.includes("GET getServiceAuth did:web:cocore.dev dev.cocore.inference.dispatch"), seen.join("\n"));
assert.equal(new Headers(sent[0].headers).get("authorization"), "Bearer SVC");
assert.equal(sent[0].body.model, model);
});
test("inference providers: co/core by service auth (no key), Anthropic and custom by host headers", async () => {
const today = { actions: [{ entry: "run", fields: [{ key: "prompt" }] }] };
const withProvider = { actions: [{ entry: "run", fields: [{ key: "prompt" }, { key: "provider" }] }] };
assert.throws(() => spa.inference({}, today), /co\/core inference needs atlibs-asyncai's provider option/);
assert.throws(() => spa.inference({ provider: "custom", endpoint: "https://x.test", format: "openai" }, today), /OpenAI-format/);
assert.deepEqual(spa.inference({}, withProvider), {
input: { endpoint: "https://cocore.dev/api/v1", model: "claude-opus-5-5", provider: "openai" },
http: { "https://cocore.dev": { serviceAuth: { aud: "did:web:cocore.dev", lxm: "dev.cocore.inference.dispatch" } } },
});
assert.deepEqual(spa.inference({ provider: "anthropic", apiKey: "K" }, today).http, { "https://api.anthropic.com": { headers: { "x-api-key": "K", "anthropic-dangerous-direct-browser-access": "true" } } });
assert.deepEqual(spa.inference({ provider: "custom", endpoint: "https://api.deepseek.com/anthropic", apiKey: "K", model: "d" }, today), { input: { endpoint: "https://api.deepseek.com/anthropic", model: "d" }, http: { "https://api.deepseek.com": { headers: { "x-api-key": "K" } } } });
assert.deepEqual(spa.inference({ provider: "custom", endpoint: "https://o.test/v1", format: "openai", apiKey: "T" }, withProvider).http, { "https://o.test": { headers: { authorization: "Bearer T" } } });
assert.throws(() => spa.inference({ provider: "custom" }, today), /base URL/);
});
const { mcpServer, streamableHttp, fetcher } = await import("./mcp-stub.mjs");
const { webrtcUrl } = await import("@publicdomainrelay/atlibs-webrtc/index.js");
const RECEIPT = { uri: "at://did:plc:bidder/com.publicdomainrelay.temp.market.receipt/3r", cid: "bafyreceipt" };
test("vm is a server: vm-mcp's four tools; vm_create asks first, then rents through the requester (its hook default, as you)", async () => {
const seen = [];
// the page's context: managed_records is the ledger release deletes by
const ctx = createNodeContext({ id: "agent-spa-test", stateDir: await mkdtemp(join(tmpdir(), "agent-spa-")), storage: { managed_records: {} }, fetch: pds(seen) });
const { modules, policy } = await spa.loadAll(ctx, ROOT, fileFetch);
const asked = [];
const observed = [];
const vm = { attest: async ({ record } = {}) => (record ? { key: "did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme", record: { ...record, signatures: [{ $type: "network.attested.signature" }] } } : { key: "did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme" }), calls: {}, fetchers: {} };
const servers = spa.mcpServers({ ctx, policy, modules, session: sessionOf(seen), vm, confirm: async (q) => (asked.push(q), true), observe: (...a) => observed.push(a) });
const tools = (await rpc(servers.vm, "tools/list")).result.tools;
assert.deepEqual(tools.map((t) => [t.name, t.annotations.readOnlyHint]), [["vm_create", false], ["vm_list", true], ["vm_exec", false], ["vm_release", false], ["vm_forget", false]]);
assert.equal(tools[0].inputSchema.required, undefined, "vm_create needs no argument");
// hostOptions: the vm lib and the hook defaults it names get the transport, the attestation key and the ledger
for (const name of ["vm-mcp", "requester", "process-mcp"]) {
const options = spa.hostOptions({ ctx, policy, session: sessionOf(seen), vm }, name);
assert.deepEqual([options.attest, options.fetchers, options.ledger, options.budget], [vm.attest, vm.fetchers, ctx.storage.managed_records, { wallMs: 1_200_000, calls: Infinity, events: Infinity }], name);
}
assert.equal(spa.hostOptions({ ctx, policy, session: sessionOf(seen), vm }, "marque").attest, undefined);
const out = await rpc(servers.vm, "tools/call", { name: "vm_create", arguments: { bidders: ["did:plc:bidder"] } });
ctx.close?.();
assert.deepEqual(asked.map((q) => [q.tool, q.arguments]), [["vm_create", { bidders: ["did:plc:bidder"] }]]);
const [server, entry, args, ran] = observed[0];
assert.deepEqual([server, entry, args.via], ["vm", "vm_create", "webrtc"]);
// the kept list was written back before renting; the requester wrote the vm record as you, its user-data hook
// default built the VM's cloud-init: the guest agent's MCP shell
assert.ok(seen.indexOf("POST com.atproto.repo.putRecord") < seen.indexOf("POST com.atproto.repo.createRecord"), seen.join("\n"));
const record = created.find((c) => c.collection === "com.publicdomainrelay.temp.compute.vm").record;
assert.match(record.user_data, /^#cloud-config\n/);
assert.match(record.user_data, /services\.json/);
assert.match(record.user_data, /shell\.sock/);
// the stub PDS has no bidder, so no VM: vm_create says why and what to change, and the requester deleted
// the record it made (the ledger holds it; the stub PDS answers the delete RecordNotFound)
assert.equal(out.result.isError, true);
assert.match(out.result.content[0].text, /^no VM \(.*did:plc:bidder offerings.*\); nothing is kept\. Try vm_create again/);
assert.equal(ran.error, out.result.content[0].text);
assert.doesNotMatch(out.result.content[0].text, /not created by this module/);
assert.ok(seen.includes("POST com.atproto.repo.deleteRecord"), seen.join("\n"));
assert.ok(!seen.some((s) => s.includes("listRecords")), "never listRecords");
});
test("kept VMs: vm_list's are the list, vm_create adds one, vm_release drops it; the transport signals through requester runs", async () => {
const good = webrtcUrl({ receipt: RECEIPT, bidder: "did:plc:bidder" }, "shell", "mcp");
const one = { vm: "vm-3r", bidder: "did:plc:bidder", shell: good };
const kept = spa.vmsAfter([], "vm", "vm_list", {}, { result: { vms: [one] } });
assert.deepEqual(kept, [one]);
const two = spa.vmsAfter(kept, "vm", "vm_create", {}, { result: { ...one, vm: "vm-4s" } });
assert.deepEqual(two.map((v) => v.vm), ["vm-3r", "vm-4s"]);
assert.equal(spa.vmsAfter(two, "vm", "vm_release", { vm: "vm-3r" }, { error: "nope" }), two);
assert.deepEqual(spa.vmsAfter(two, "vm", "vm_release", { vm: "vm-3r" }, { result: {} }).map((v) => v.vm), ["vm-4s"]);
assert.deepEqual(spa.vmsAfter(two, "vm", "vm_forget", { vm: "vm-4s" }, { result: { forgotten: true } }).map((v) => v.vm), ["vm-3r"]);
assert.equal(spa.vmsAfter(two, "marque", "vm_release", { vm: "vm-3r" }, { result: {} }), two);
// the fetchers send a kept VM's own ref (found by receipt URI), and refuse one no kept VM has, at once
const miscopied = webrtcUrl({ receipt: { ...RECEIPT, cid: "bafyreceip" }, bidder: "did:plc:bidder" }, "shell", "mcp");
const sent = [];
const held = spa.keptFetchers({ "webrtc:": async (r) => (sent.push(r.url), { status: 200, headers: {}, body: "" }) }, () => kept);
await held["webrtc:"]({ method: "POST", url: miscopied, body: "{}" });
assert.deepEqual(sent, [good]);
const stranger = webrtcUrl({ receipt: { uri: "at://did:plc:bidder/com.publicdomainrelay.temp.market.receipt/other", cid: "c" } }, "shell", "mcp");
assert.throws(() => held["webrtc:"]({ method: "POST", url: stranger, body: "{}" }), /no VM kept here has this receipt.*kept: vm-3r/);
const runs = [];
const { events, signal } = spa.vmSignals(async (entry, input) => (runs.push([entry, input]), entry === "watch" ? { events: [{ kind: "k" }] } : { ok: true }));
assert.deepEqual(await events({ receipt: RECEIPT, tag: "shell" }), [{ kind: "k" }]);
await signal({ receipt: RECEIPT, tag: "shell", offer: "sealed" });
assert.deepEqual(runs, [
["watch", { bidder: "did:plc:bidder", receipt: RECEIPT.uri, tags: ["shell"], max_polls: 1 }],
["signal", { receipt: RECEIPT, tag: "shell", offer: "sealed" }],
]);
});
test("vm_exec runs a command on a kept VM: process-mcp's http.fetch to its shell, over the host's webrtc: fetcher", async () => {
const seen = [];
const good = webrtcUrl({ receipt: RECEIPT, bidder: "did:plc:bidder" }, "shell", "mcp");
keptRecord = { uri: `at://${did}/computer.socialweb.vm.kept/self`, cid: "bafykept", value: { vms: [{ vm: "vm-3r", bidder: "did:plc:bidder", shell: good, receipt: RECEIPT, records: [] }] } };
const shell = mcpServer({ exec: ({ command, timeoutMs }) => ({ content: [{ type: "text", text: JSON.stringify({ exitCode: 0, stdout: `ran ${command} in ${timeoutMs}\n`, stderr: "" }) }] }) });
const transport = fetcher(streamableHttp(shell).handle);
const ctx = createNodeContext({ id: "agent-spa-test", stateDir: await mkdtemp(join(tmpdir(), "agent-spa-")), storage: { managed_records: {} }, fetch: pds(seen) });
const { modules, policy } = await spa.loadAll(ctx, ROOT, fileFetch);
const vm = { attest: async () => ({ key: "did:key:zQ3shokFTS3brHcDQrn82RUDfCZESWL1ZdCEJwekUDPQiYBme" }), calls: {}, fetchers: spa.keptFetchers({ "webrtc:": transport.fetch }, () => keptRecord.value.vms) };
const servers = spa.mcpServers({ ctx, policy, modules, session: sessionOf(seen), vm, confirm: async () => true });
const out = await rpc(servers.vm, "tools/call", { name: "vm_exec", arguments: { vm: "vm-3r", command: "uname -a", timeout_s: 5 } });
keptRecord = null;
ctx.close?.();
assert.deepEqual(out.result.structuredContent, { exit: 0, stdout: "ran uname -a in 5000\n", stderr: "" }, JSON.stringify(out.result));
assert.ok(transport.urls.length > 0 && transport.urls.every((u) => u === good), transport.urls.join("\n"));
});
test("the agent connects a VM's MCP shell mid-run over the host's webrtc: fetcher, runs a command and follows a job", { timeout: 120_000 }, async () => {
const url = webrtcUrl({ receipt: RECEIPT, bidder: "did:plc:bidder" }, "shell", "mcp");
const job = { reads: 0 };
const shell = mcpServer({
exec: ({ command }) => ({ content: [{ type: "text", text: JSON.stringify({ exitCode: 0, stdout: `ran ${command}\n`, stderr: "", truncated: false }) }] }),
start: () => ({ content: [{ type: "text", text: '{"id":"j1"}' }] }),
read: ({ cursor = 0 }) => ({ content: [{ type: "text", text: JSON.stringify(++job.reads < 2 ? { output: "tick 1\n", cursor: 7, done: false } : { output: "tick 2\ntick 3\n", cursor: 21, done: true, exitCode: 0, from: cursor }) }] }),
write: () => ({ content: [{ type: "text", text: "{}" }] }),
kill: () => ({ content: [{ type: "text", text: "{}" }] }),
list: () => ({ content: [{ type: "text", text: '{"jobs":[]}' }] }),
});
const transport = fetcher(streamableHttp(shell).handle);
const turns = [
{ content: [{ type: "tool_use", id: "c", name: "mcp_connect", input: { name: "shell", server: { url } } }], stop_reason: "tool_use" },
{ content: [{ type: "tool_use", id: "e", name: "shell__exec", input: { command: "uname -a; id -u" } }, { type: "tool_use", id: "s", name: "shell__start", input: { command: "for i in 1 2 3; do echo tick $i; sleep 2; done" } }], stop_reason: "tool_use" },
{ content: [{ type: "tool_use", id: "r1", name: "shell__read", input: { id: "j1", cursor: 0, waitMs: 5000 } }], stop_reason: "tool_use" },
{ content: [{ type: "tool_use", id: "r2", name: "shell__read", input: { id: "j1", cursor: 7, waitMs: 5000 } }], stop_reason: "tool_use" },
{ content: [{ type: "text", text: "done" }], stop_reason: "end_turn" },
];
const bodies = [];
const seen = [];
const stub = pds(seen);
const fetch = async (u, init) => (u.startsWith("https://inference.test/") ? (bodies.push(JSON.parse(init.body)), Response.json({ ...turns.shift(), usage: { input_tokens: 1, output_tokens: 1 } })) : stub(u, init));
const { ctx, modules, servers } = await setup({ fetch });
const composition = await spa.agentComposition(ctx, modules.asyncai, Object.keys(servers));
const ran = await spa.runAgent(ctx, composition, servers, { prompt: "rent a vm", system: spa.systemPrompt(did), provider: "custom", endpoint: "https://inference.test", format: "anthropic", apiKey: "K", model: "m" }, { fetchers: { "webrtc:": transport.fetch } });
ctx.close?.();
assert.equal(ran.error, undefined, ran.error);
const r = ran.result;
assert.equal(r.stop, "end_turn", r.error);
const vm = r.servers.find((s) => s.name === "shell");
assert.deepEqual([vm.phase, vm.dynamic, vm.tools.length], ["ready", true, 6]);
assert.ok(transport.urls.length >= 5 && transport.urls.every((u) => u === url), transport.urls.join("\n"));
assert.ok(bodies[0].tools.some((t) => t.name === "mcp_connect"));
assert.ok(bodies[1].tools.some((t) => t.name === "shell__read"));
const results = Object.fromEntries(r.messages.flatMap((m) => (Array.isArray(m.content) ? m.content : [])).filter((b) => b.type === "tool_result").map((b) => [b.tool_use_id, b]));
assert.match(JSON.stringify(results.e.content), /ran uname -a; id -u/);
assert.match(JSON.stringify(results.r2.content), /\\"done\\":true/);
assert.deepEqual(spa.connectedOf(spa.rows(r.messages)).map((s) => [s.name, s.url, s.tools.length]), [["shell", url, 6]]);
});
test("rows: OpenAI chat completions transcripts too", () => {
const list = spa.rows([
{ role: "user", content: "go" },
{ role: "assistant", content: null, tool_calls: [{ id: "t1", type: "function", function: { name: "mcp_connect", arguments: '{"name":"vm","server":{"url":"webrtc:///x/shell/mcp"}}' } }] },
{ role: "tool", tool_call_id: "t1", content: '{"connected":"vm","tools":["vm__exec"]}' },
]);
assert.deepEqual(list.map((r) => [r.kind, r.id ?? null]), [["text", null], ["tool_use", "t1"], ["tool_result", "t1"]]);
assert.deepEqual(spa.connectedOf(list), [{ name: "vm", url: "webrtc:///x/shell/mcp", tools: ["vm__exec"] }]);
});
test("co/core is offered on localhost origins only (its CORS); elsewhere custom endpoints alone", () => {
for (const host of ["localhost", "127.0.0.1", "[::1]"]) assert.equal(spa.cocoreUsable(host), true, host);
for (const host of ["atlibs-agent.socialweb.computer", "example.com", "127.0.0.2"]) assert.equal(spa.cocoreUsable(host), false, host);
});