agent-comms 3.15.0 → 3.17.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +52 -1
- package/dist/core/bridge-mesh.d.ts +1 -1
- package/dist/core/bridge-mesh.js +1 -1
- package/dist/core/bridge.d.ts +11 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +52 -3
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/connection-code-tool.d.ts +18 -0
- package/dist/core/connection-code-tool.d.ts.map +1 -0
- package/dist/core/connection-code-tool.js +74 -0
- package/dist/core/connection-code-tool.js.map +1 -0
- package/dist/core/connection-code.d.ts +65 -0
- package/dist/core/connection-code.d.ts.map +1 -0
- package/dist/core/connection-code.js +180 -0
- package/dist/core/connection-code.js.map +1 -0
- package/dist/core/dm-send-delegation.d.ts +32 -0
- package/dist/core/dm-send-delegation.d.ts.map +1 -0
- package/dist/core/dm-send-delegation.js +35 -0
- package/dist/core/dm-send-delegation.js.map +1 -0
- package/dist/core/gateway-trust-actions.d.ts +18 -0
- package/dist/core/gateway-trust-actions.d.ts.map +1 -0
- package/dist/core/gateway-trust-actions.js +70 -0
- package/dist/core/gateway-trust-actions.js.map +1 -0
- package/dist/core/gateway-trust.d.ts +20 -5
- package/dist/core/gateway-trust.d.ts.map +1 -1
- package/dist/core/gateway-trust.js +37 -7
- package/dist/core/gateway-trust.js.map +1 -1
- package/dist/core/identity-store.d.ts +28 -4
- package/dist/core/identity-store.d.ts.map +1 -1
- package/dist/core/identity-store.js +82 -8
- package/dist/core/identity-store.js.map +1 -1
- package/dist/core/mesh-store.d.ts +19 -4
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +36 -5
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/pgp-keyserver.d.ts +12 -0
- package/dist/core/pgp-keyserver.d.ts.map +1 -0
- package/dist/core/pgp-keyserver.js +22 -0
- package/dist/core/pgp-keyserver.js.map +1 -0
- package/dist/core/room-lifecycle.d.ts +3 -1
- package/dist/core/room-lifecycle.d.ts.map +1 -1
- package/dist/core/room-lifecycle.js +4 -3
- package/dist/core/room-lifecycle.js.map +1 -1
- package/dist/core/tool.d.ts +14 -5
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +16 -50
- package/dist/core/tool.js.map +1 -1
- package/dist/core/types.d.ts +45 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +29 -0
- package/dist/core/types.js.map +1 -1
- package/dist/test/connection-code-ledger-persistence.test.d.ts +5 -0
- package/dist/test/connection-code-ledger-persistence.test.d.ts.map +1 -0
- package/dist/test/connection-code-ledger-persistence.test.js +84 -0
- package/dist/test/connection-code-ledger-persistence.test.js.map +1 -0
- package/dist/test/connection-code-tool.test.d.ts +2 -0
- package/dist/test/connection-code-tool.test.d.ts.map +1 -0
- package/dist/test/connection-code-tool.test.js +296 -0
- package/dist/test/connection-code-tool.test.js.map +1 -0
- package/dist/test/connection-code.test.d.ts +5 -0
- package/dist/test/connection-code.test.d.ts.map +1 -0
- package/dist/test/connection-code.test.js +236 -0
- package/dist/test/connection-code.test.js.map +1 -0
- package/dist/test/dm-send-capability-admission.integration.test.js +82 -1
- package/dist/test/dm-send-capability-admission.integration.test.js.map +1 -1
- package/dist/test/dm-send-delegation.test.d.ts +2 -0
- package/dist/test/dm-send-delegation.test.d.ts.map +1 -0
- package/dist/test/dm-send-delegation.test.js +146 -0
- package/dist/test/dm-send-delegation.test.js.map +1 -0
- package/dist/test/dm-send-principal-delegation.integration.test.d.ts +2 -0
- package/dist/test/dm-send-principal-delegation.integration.test.d.ts.map +1 -0
- package/dist/test/dm-send-principal-delegation.integration.test.js +89 -0
- package/dist/test/dm-send-principal-delegation.integration.test.js.map +1 -0
- package/dist/test/gateway-trust-tool.test.js +98 -1
- package/dist/test/gateway-trust-tool.test.js.map +1 -1
- package/dist/test/gateway-trust.test.js +92 -0
- package/dist/test/gateway-trust.test.js.map +1 -1
- package/dist/test/identity-store.test.js +42 -18
- package/dist/test/identity-store.test.js.map +1 -1
- package/dist/test/pgp-keyserver.test.d.ts +5 -0
- package/dist/test/pgp-keyserver.test.d.ts.map +1 -0
- package/dist/test/pgp-keyserver.test.js +24 -0
- package/dist/test/pgp-keyserver.test.js.map +1 -0
- package/dist/test/test-transport.d.ts +2 -1
- package/dist/test/test-transport.d.ts.map +1 -1
- package/dist/test/test-transport.js +5 -5
- package/dist/test/test-transport.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the connection-code ledger's own per-slot JSON persistence (agent-comms#188), mirroring identity-store.test.ts's own loadGatewayTrust/saveGatewayTrust coverage for the sibling gateway-trust file.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { test, expect } from "vitest";
|
|
8
|
+
import { loadConnectionCodeLedger, saveConnectionCodeLedger, } from "../core/identity-store.js";
|
|
9
|
+
function tempSlot(harness) {
|
|
10
|
+
const dir = fs.mkdtempSync(path.join(tmpdir(), "agent-comms-connection-code-ledger-test-"));
|
|
11
|
+
return { harness, cwd: "/tmp/project", dir };
|
|
12
|
+
}
|
|
13
|
+
test("loadConnectionCodeLedger is empty for a slot that has never saved a ledger", () => {
|
|
14
|
+
const slot = tempSlot("test");
|
|
15
|
+
expect(loadConnectionCodeLedger(slot)).toEqual({ issued: {}, redeemed: {} });
|
|
16
|
+
});
|
|
17
|
+
test("loadConnectionCodeLedger does not require an identity to have been created first", () => {
|
|
18
|
+
const slot = tempSlot("test");
|
|
19
|
+
expect(() => {
|
|
20
|
+
saveConnectionCodeLedger(slot, {
|
|
21
|
+
issued: {
|
|
22
|
+
nonce1: { expiresAt: "2026-01-01T00:00:00.000Z", deviceId: "aabbcc" },
|
|
23
|
+
},
|
|
24
|
+
redeemed: {},
|
|
25
|
+
});
|
|
26
|
+
}).not.toThrow();
|
|
27
|
+
expect(loadConnectionCodeLedger(slot).issued).toEqual({
|
|
28
|
+
nonce1: { expiresAt: "2026-01-01T00:00:00.000Z", deviceId: "aabbcc" },
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
test("saveConnectionCodeLedger persists both issued and redeemed maps, loadConnectionCodeLedger reloads the same data", () => {
|
|
32
|
+
const slot = tempSlot("test");
|
|
33
|
+
saveConnectionCodeLedger(slot, {
|
|
34
|
+
issued: {
|
|
35
|
+
nonce1: {
|
|
36
|
+
expiresAt: "2026-01-01T00:00:00.000Z",
|
|
37
|
+
deviceId: "aabbcc",
|
|
38
|
+
signature: "-----BEGIN PGP SIGNATURE-----\nfake\n-----END PGP SIGNATURE-----",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
redeemed: { nonce2: "2026-01-02T00:00:00.000Z" },
|
|
42
|
+
});
|
|
43
|
+
expect(loadConnectionCodeLedger(slot)).toEqual({
|
|
44
|
+
issued: {
|
|
45
|
+
nonce1: {
|
|
46
|
+
expiresAt: "2026-01-01T00:00:00.000Z",
|
|
47
|
+
deviceId: "aabbcc",
|
|
48
|
+
signature: "-----BEGIN PGP SIGNATURE-----\nfake\n-----END PGP SIGNATURE-----",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
redeemed: { nonce2: "2026-01-02T00:00:00.000Z" },
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
test("saveConnectionCodeLedger overwrites the previously saved ledger rather than merging with it", () => {
|
|
55
|
+
const slot = tempSlot("test");
|
|
56
|
+
saveConnectionCodeLedger(slot, {
|
|
57
|
+
issued: {
|
|
58
|
+
nonce1: { expiresAt: "2026-01-01T00:00:00.000Z", deviceId: "aabbcc" },
|
|
59
|
+
},
|
|
60
|
+
redeemed: {},
|
|
61
|
+
});
|
|
62
|
+
saveConnectionCodeLedger(slot, {
|
|
63
|
+
issued: {},
|
|
64
|
+
redeemed: { nonce1: "2026-01-01T00:00:00.000Z" },
|
|
65
|
+
});
|
|
66
|
+
expect(loadConnectionCodeLedger(slot)).toEqual({
|
|
67
|
+
issued: {},
|
|
68
|
+
redeemed: { nonce1: "2026-01-01T00:00:00.000Z" },
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
test("loadConnectionCodeLedger ignores a malformed issued record rather than throwing", () => {
|
|
72
|
+
const slot = tempSlot("test");
|
|
73
|
+
const { dir } = { dir: slot.dir };
|
|
74
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
75
|
+
fs.writeFileSync(path.join(dir, `connection-codes-${slot.harness}--_tmp_project.json`), JSON.stringify({ issued: { bad: { deviceId: "aabbcc" } }, redeemed: {} }));
|
|
76
|
+
expect(loadConnectionCodeLedger(slot)).toEqual({ issued: {}, redeemed: {} });
|
|
77
|
+
});
|
|
78
|
+
test("loadConnectionCodeLedger returns empty for an unparseable file", () => {
|
|
79
|
+
const slot = tempSlot("test");
|
|
80
|
+
fs.mkdirSync(slot.dir, { recursive: true });
|
|
81
|
+
fs.writeFileSync(path.join(slot.dir, `connection-codes-${slot.harness}--_tmp_project.json`), "not json");
|
|
82
|
+
expect(loadConnectionCodeLedger(slot)).toEqual({ issued: {}, redeemed: {} });
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=connection-code-ledger-persistence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-code-ledger-persistence.test.js","sourceRoot":"","sources":["../../src/test/connection-code-ledger-persistence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-code-tool.test.d.ts","sourceRoot":"","sources":["../../src/test/connection-code-tool.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommsTool's gateway_generate_connection_code/gateway_redeem_connection_code actions (agent-comms#188), mirroring gateway-trust-tool.test.ts's own pattern for the sibling gateway-trust actions -- an end-to-end pass through CommsTool.handle, MeshStore, and ConnectionCodeLedger, ending in a real gatewayTrust.add on successful redemption.
|
|
3
|
+
*/
|
|
4
|
+
import { test, describe, expect } from "vitest";
|
|
5
|
+
import * as openpgp from "openpgp";
|
|
6
|
+
import { MeshStore } from "../core/mesh-store.js";
|
|
7
|
+
import { CommsTool } from "../core/tool.js";
|
|
8
|
+
import { buildAction } from "../core/bridge.js";
|
|
9
|
+
import { wireTestTransport } from "./test-transport.js";
|
|
10
|
+
const TEST_PORT = 0;
|
|
11
|
+
/** A generic "far enough in the future"/"far enough in the past" offset, used wherever a test needs an expired or not-yet-expired timestamp without caring about the exact margin. */
|
|
12
|
+
const ONE_MINUTE_MS = 60_000;
|
|
13
|
+
async function registerAgent(store, name) {
|
|
14
|
+
return store.registerAgent({
|
|
15
|
+
name,
|
|
16
|
+
harness: "test",
|
|
17
|
+
cwd: "/test",
|
|
18
|
+
pid: process.pid,
|
|
19
|
+
visibility: "visible",
|
|
20
|
+
tags: [],
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
describe("CommsTool connection-code actions", () => {
|
|
24
|
+
test("gateway_generate_connection_code returns a bare code vouching for this store's own device-id", async () => {
|
|
25
|
+
const store = new MeshStore(TEST_PORT);
|
|
26
|
+
await wireTestTransport(store);
|
|
27
|
+
await store.init();
|
|
28
|
+
const agent = await registerAgent(store, "connection-code-generate-test");
|
|
29
|
+
const tool = new CommsTool(store);
|
|
30
|
+
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "gateway_generate_connection_code" });
|
|
31
|
+
expect(result.isError, result.content).toBe(false);
|
|
32
|
+
expect(result.content).toContain("unsigned");
|
|
33
|
+
expect(result.content).toContain(`"deviceId":"${store.peerId}"`);
|
|
34
|
+
await store.shutdown();
|
|
35
|
+
});
|
|
36
|
+
test("gateway_redeem_connection_code trusts the vouched-for device on success", async () => {
|
|
37
|
+
const issuerStore = new MeshStore(TEST_PORT);
|
|
38
|
+
await wireTestTransport(issuerStore);
|
|
39
|
+
await issuerStore.init();
|
|
40
|
+
const issuerTool = new CommsTool(issuerStore);
|
|
41
|
+
const issuerAgent = await registerAgent(issuerStore, "issuer");
|
|
42
|
+
const generateResult = await issuerTool.handle({
|
|
43
|
+
agentId: issuerAgent.id,
|
|
44
|
+
harness: "test",
|
|
45
|
+
cwd: "/test",
|
|
46
|
+
pid: process.pid,
|
|
47
|
+
}, { action: "gateway_generate_connection_code" });
|
|
48
|
+
const code = JSON.parse(generateResult.content.split("\n").at(-1) ?? "{}");
|
|
49
|
+
const redeemerStore = new MeshStore(TEST_PORT);
|
|
50
|
+
await wireTestTransport(redeemerStore);
|
|
51
|
+
await redeemerStore.init();
|
|
52
|
+
const redeemerTool = new CommsTool(redeemerStore);
|
|
53
|
+
const redeemerAgent = await registerAgent(redeemerStore, "redeemer");
|
|
54
|
+
const redeemResult = await redeemerTool.handle({
|
|
55
|
+
agentId: redeemerAgent.id,
|
|
56
|
+
harness: "test",
|
|
57
|
+
cwd: "/test",
|
|
58
|
+
pid: process.pid,
|
|
59
|
+
}, {
|
|
60
|
+
action: "gateway_redeem_connection_code",
|
|
61
|
+
code: code.code,
|
|
62
|
+
expiresAt: code.expiresAt,
|
|
63
|
+
device: code.deviceId,
|
|
64
|
+
});
|
|
65
|
+
expect(redeemResult.isError, redeemResult.content).toBe(false);
|
|
66
|
+
expect(redeemerStore.listTrustedGateways()).toEqual([issuerStore.peerId]);
|
|
67
|
+
await issuerStore.shutdown();
|
|
68
|
+
await redeemerStore.shutdown();
|
|
69
|
+
});
|
|
70
|
+
test("gateway_redeem_connection_code rejects an expired code without trusting anything", async () => {
|
|
71
|
+
const store = new MeshStore(TEST_PORT);
|
|
72
|
+
await wireTestTransport(store);
|
|
73
|
+
await store.init();
|
|
74
|
+
const tool = new CommsTool(store);
|
|
75
|
+
const agent = await registerAgent(store, "expired-redeem-test");
|
|
76
|
+
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, {
|
|
77
|
+
action: "gateway_redeem_connection_code",
|
|
78
|
+
code: "some-nonce",
|
|
79
|
+
expiresAt: new Date(Date.now() - ONE_MINUTE_MS).toISOString(),
|
|
80
|
+
device: "aabbcc",
|
|
81
|
+
});
|
|
82
|
+
expect(result.isError, result.content).toBe(true);
|
|
83
|
+
expect(result.content).toContain("expired");
|
|
84
|
+
expect(store.listTrustedGateways()).toEqual([]);
|
|
85
|
+
await store.shutdown();
|
|
86
|
+
});
|
|
87
|
+
test("gateway_generate_connection_code signs the code when a private key is supplied", async () => {
|
|
88
|
+
const store = new MeshStore(TEST_PORT);
|
|
89
|
+
await wireTestTransport(store);
|
|
90
|
+
await store.init();
|
|
91
|
+
const tool = new CommsTool(store);
|
|
92
|
+
const agent = await registerAgent(store, "signed-generate-test");
|
|
93
|
+
const { privateKey } = await openpgp.generateKey({
|
|
94
|
+
type: "ecc",
|
|
95
|
+
curve: "curve25519Legacy",
|
|
96
|
+
userIDs: [{ name: "Alice", email: "alice@example.com" }],
|
|
97
|
+
format: "armored",
|
|
98
|
+
});
|
|
99
|
+
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "gateway_generate_connection_code", privateKey });
|
|
100
|
+
expect(result.isError, result.content).toBe(false);
|
|
101
|
+
expect(result.content).toContain("PGP-signed");
|
|
102
|
+
await store.shutdown();
|
|
103
|
+
});
|
|
104
|
+
test("gateway_redeem_connection_code verifies a signature against a pasted public key", async () => {
|
|
105
|
+
const { privateKey, publicKey } = await openpgp.generateKey({
|
|
106
|
+
type: "ecc",
|
|
107
|
+
curve: "curve25519Legacy",
|
|
108
|
+
userIDs: [{ name: "Alice", email: "alice@example.com" }],
|
|
109
|
+
format: "armored",
|
|
110
|
+
});
|
|
111
|
+
const issuerStore = new MeshStore(TEST_PORT);
|
|
112
|
+
await wireTestTransport(issuerStore);
|
|
113
|
+
await issuerStore.init();
|
|
114
|
+
const issuerTool = new CommsTool(issuerStore);
|
|
115
|
+
const issuerAgent = await registerAgent(issuerStore, "signed-issuer");
|
|
116
|
+
const generateResult = await issuerTool.handle({
|
|
117
|
+
agentId: issuerAgent.id,
|
|
118
|
+
harness: "test",
|
|
119
|
+
cwd: "/test",
|
|
120
|
+
pid: process.pid,
|
|
121
|
+
}, { action: "gateway_generate_connection_code", privateKey });
|
|
122
|
+
const code = JSON.parse(generateResult.content.split("\n").at(-1) ?? "{}");
|
|
123
|
+
const redeemerStore = new MeshStore(TEST_PORT);
|
|
124
|
+
await wireTestTransport(redeemerStore);
|
|
125
|
+
await redeemerStore.init();
|
|
126
|
+
const redeemerTool = new CommsTool(redeemerStore);
|
|
127
|
+
const redeemerAgent = await registerAgent(redeemerStore, "signed-redeemer");
|
|
128
|
+
const redeemResult = await redeemerTool.handle({
|
|
129
|
+
agentId: redeemerAgent.id,
|
|
130
|
+
harness: "test",
|
|
131
|
+
cwd: "/test",
|
|
132
|
+
pid: process.pid,
|
|
133
|
+
}, {
|
|
134
|
+
action: "gateway_redeem_connection_code",
|
|
135
|
+
code: code.code,
|
|
136
|
+
expiresAt: code.expiresAt,
|
|
137
|
+
device: code.deviceId,
|
|
138
|
+
signature: code.signature,
|
|
139
|
+
publicKey,
|
|
140
|
+
});
|
|
141
|
+
expect(redeemResult.isError, redeemResult.content).toBe(false);
|
|
142
|
+
expect(redeemResult.content).toContain("signature verified");
|
|
143
|
+
expect(redeemerStore.listTrustedGateways()).toEqual([issuerStore.peerId]);
|
|
144
|
+
await issuerStore.shutdown();
|
|
145
|
+
await redeemerStore.shutdown();
|
|
146
|
+
});
|
|
147
|
+
test("gateway_redeem_connection_code fetches the public key from a keyserver when only a fingerprint is supplied", async () => {
|
|
148
|
+
const { privateKey, publicKey } = await openpgp.generateKey({
|
|
149
|
+
type: "ecc",
|
|
150
|
+
curve: "curve25519Legacy",
|
|
151
|
+
userIDs: [{ name: "Alice", email: "alice@example.com" }],
|
|
152
|
+
format: "armored",
|
|
153
|
+
});
|
|
154
|
+
const readKey = await openpgp.readKey({ armoredKey: publicKey });
|
|
155
|
+
const fingerprint = readKey.getFingerprint();
|
|
156
|
+
const issuerStore = new MeshStore(TEST_PORT);
|
|
157
|
+
await wireTestTransport(issuerStore);
|
|
158
|
+
await issuerStore.init();
|
|
159
|
+
const issuerTool = new CommsTool(issuerStore);
|
|
160
|
+
const issuerAgent = await registerAgent(issuerStore, "keyserver-issuer");
|
|
161
|
+
const generateResult = await issuerTool.handle({
|
|
162
|
+
agentId: issuerAgent.id,
|
|
163
|
+
harness: "test",
|
|
164
|
+
cwd: "/test",
|
|
165
|
+
pid: process.pid,
|
|
166
|
+
}, { action: "gateway_generate_connection_code", privateKey });
|
|
167
|
+
const code = JSON.parse(generateResult.content.split("\n").at(-1) ?? "{}");
|
|
168
|
+
const redeemerStore = new MeshStore(TEST_PORT);
|
|
169
|
+
await wireTestTransport(redeemerStore);
|
|
170
|
+
await redeemerStore.init();
|
|
171
|
+
const fetchPgpPublicKeyByFingerprintImpl = async (requestedFingerprint) => {
|
|
172
|
+
expect(requestedFingerprint).toBe(fingerprint);
|
|
173
|
+
return publicKey;
|
|
174
|
+
};
|
|
175
|
+
const redeemerTool = new CommsTool(redeemerStore, undefined, undefined, fetchPgpPublicKeyByFingerprintImpl);
|
|
176
|
+
const redeemerAgent = await registerAgent(redeemerStore, "keyserver-redeemer");
|
|
177
|
+
const redeemResult = await redeemerTool.handle({
|
|
178
|
+
agentId: redeemerAgent.id,
|
|
179
|
+
harness: "test",
|
|
180
|
+
cwd: "/test",
|
|
181
|
+
pid: process.pid,
|
|
182
|
+
}, {
|
|
183
|
+
action: "gateway_redeem_connection_code",
|
|
184
|
+
code: code.code,
|
|
185
|
+
expiresAt: code.expiresAt,
|
|
186
|
+
device: code.deviceId,
|
|
187
|
+
signature: code.signature,
|
|
188
|
+
fingerprint,
|
|
189
|
+
});
|
|
190
|
+
expect(redeemResult.isError, redeemResult.content).toBe(false);
|
|
191
|
+
expect(redeemerStore.listTrustedGateways()).toEqual([issuerStore.peerId]);
|
|
192
|
+
await issuerStore.shutdown();
|
|
193
|
+
await redeemerStore.shutdown();
|
|
194
|
+
});
|
|
195
|
+
test("gateway_redeem_connection_code reports a keyserver lookup failure without trusting anything", async () => {
|
|
196
|
+
const redeemerStore = new MeshStore(TEST_PORT);
|
|
197
|
+
await wireTestTransport(redeemerStore);
|
|
198
|
+
await redeemerStore.init();
|
|
199
|
+
const failingFetch = async () => {
|
|
200
|
+
throw new Error("HTTP 404");
|
|
201
|
+
};
|
|
202
|
+
const redeemerTool = new CommsTool(redeemerStore, undefined, undefined, failingFetch);
|
|
203
|
+
const redeemerAgent = await registerAgent(redeemerStore, "keyserver-failure-redeemer");
|
|
204
|
+
const redeemResult = await redeemerTool.handle({
|
|
205
|
+
agentId: redeemerAgent.id,
|
|
206
|
+
harness: "test",
|
|
207
|
+
cwd: "/test",
|
|
208
|
+
pid: process.pid,
|
|
209
|
+
}, {
|
|
210
|
+
action: "gateway_redeem_connection_code",
|
|
211
|
+
code: "some-nonce",
|
|
212
|
+
expiresAt: new Date(Date.now() + ONE_MINUTE_MS).toISOString(),
|
|
213
|
+
device: "aabbcc",
|
|
214
|
+
signature: "-----BEGIN PGP SIGNATURE-----\nfake\n-----END PGP SIGNATURE-----",
|
|
215
|
+
fingerprint: "0000000000000000000000000000000000000000",
|
|
216
|
+
});
|
|
217
|
+
expect(redeemResult.isError, redeemResult.content).toBe(true);
|
|
218
|
+
expect(redeemResult.content).toContain("Failed to fetch PGP public key");
|
|
219
|
+
expect(redeemerStore.listTrustedGateways()).toEqual([]);
|
|
220
|
+
await redeemerStore.shutdown();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe("buildAction connection-code parsing", () => {
|
|
224
|
+
test("buildAction parses gateway_generate_connection_code with no fields", () => {
|
|
225
|
+
const action = buildAction({ action: "gateway_generate_connection_code" });
|
|
226
|
+
expect(action.action).toBe("gateway_generate_connection_code");
|
|
227
|
+
});
|
|
228
|
+
test("buildAction parses gateway_generate_connection_code's optional fields", () => {
|
|
229
|
+
const action = buildAction({
|
|
230
|
+
action: "gateway_generate_connection_code",
|
|
231
|
+
ttlMs: ONE_MINUTE_MS,
|
|
232
|
+
privateKey: "armored-key",
|
|
233
|
+
passphrase: "secret",
|
|
234
|
+
});
|
|
235
|
+
expect(action.action).toBe("gateway_generate_connection_code");
|
|
236
|
+
if (action.action === "gateway_generate_connection_code") {
|
|
237
|
+
expect(action.ttlMs).toBe(ONE_MINUTE_MS);
|
|
238
|
+
expect(action.privateKey).toBe("armored-key");
|
|
239
|
+
expect(action.passphrase).toBe("secret");
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
test("buildAction parses gateway_redeem_connection_code's required fields", () => {
|
|
243
|
+
const action = buildAction({
|
|
244
|
+
action: "gateway_redeem_connection_code",
|
|
245
|
+
code: "nonce",
|
|
246
|
+
expiresAt: "2026-01-01T00:00:00.000Z",
|
|
247
|
+
device: "aabbcc",
|
|
248
|
+
});
|
|
249
|
+
expect(action.action).toBe("gateway_redeem_connection_code");
|
|
250
|
+
if (action.action === "gateway_redeem_connection_code") {
|
|
251
|
+
expect(action.code).toBe("nonce");
|
|
252
|
+
expect(action.expiresAt).toBe("2026-01-01T00:00:00.000Z");
|
|
253
|
+
expect(action.device).toBe("aabbcc");
|
|
254
|
+
expect(action.signature).toBeUndefined();
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
test("buildAction parses gateway_redeem_connection_code's optional signature/publicKey/fingerprint", () => {
|
|
258
|
+
const action = buildAction({
|
|
259
|
+
action: "gateway_redeem_connection_code",
|
|
260
|
+
code: "nonce",
|
|
261
|
+
expiresAt: "2026-01-01T00:00:00.000Z",
|
|
262
|
+
device: "aabbcc",
|
|
263
|
+
signature: "sig",
|
|
264
|
+
publicKey: "pubkey",
|
|
265
|
+
fingerprint: "fpr",
|
|
266
|
+
});
|
|
267
|
+
expect(action.action).toBe("gateway_redeem_connection_code");
|
|
268
|
+
if (action.action === "gateway_redeem_connection_code") {
|
|
269
|
+
expect(action.signature).toBe("sig");
|
|
270
|
+
expect(action.publicKey).toBe("pubkey");
|
|
271
|
+
expect(action.fingerprint).toBe("fpr");
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
test("buildAction throws for gateway_redeem_connection_code without code", () => {
|
|
275
|
+
expect(() => buildAction({
|
|
276
|
+
action: "gateway_redeem_connection_code",
|
|
277
|
+
expiresAt: "2026-01-01T00:00:00.000Z",
|
|
278
|
+
device: "aabbcc",
|
|
279
|
+
})).toThrow(/code/);
|
|
280
|
+
});
|
|
281
|
+
test("buildAction throws for gateway_redeem_connection_code without expiresAt", () => {
|
|
282
|
+
expect(() => buildAction({
|
|
283
|
+
action: "gateway_redeem_connection_code",
|
|
284
|
+
code: "nonce",
|
|
285
|
+
device: "aabbcc",
|
|
286
|
+
})).toThrow(/expiresAt/);
|
|
287
|
+
});
|
|
288
|
+
test("buildAction throws for gateway_redeem_connection_code without device", () => {
|
|
289
|
+
expect(() => buildAction({
|
|
290
|
+
action: "gateway_redeem_connection_code",
|
|
291
|
+
code: "nonce",
|
|
292
|
+
expiresAt: "2026-01-01T00:00:00.000Z",
|
|
293
|
+
})).toThrow(/device/);
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
//# sourceMappingURL=connection-code-tool.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-code-tool.test.js","sourceRoot":"","sources":["../../src/test/connection-code-tool.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for ConnectionCodeLedger (agent-comms#188): the generate/redeem pair backing gateway_generate_connection_code/gateway_redeem_connection_code. Covers the always-checked nonce/expiry path standalone from the optional PGP-signature path, mirroring gateway-trust.test.ts's own split between plain-trust and slot-persistence describe blocks for the sibling allowlist class.
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=connection-code.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-code.test.d.ts","sourceRoot":"","sources":["../../src/test/connection-code.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|