@ninelives/agent-governance-sdk 5.0.1
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/README.md +363 -0
- package/dist/audit.d.ts +26 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +107 -0
- package/dist/audit.js.map +1 -0
- package/dist/cascade-containment.d.ts +84 -0
- package/dist/cascade-containment.d.ts.map +1 -0
- package/dist/cascade-containment.js +387 -0
- package/dist/cascade-containment.js.map +1 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +112 -0
- package/dist/client.js.map +1 -0
- package/dist/context-poisoning.d.ts +58 -0
- package/dist/context-poisoning.d.ts.map +1 -0
- package/dist/context-poisoning.js +410 -0
- package/dist/context-poisoning.js.map +1 -0
- package/dist/credential-vault.d.ts +213 -0
- package/dist/credential-vault.d.ts.map +1 -0
- package/dist/credential-vault.js +567 -0
- package/dist/credential-vault.js.map +1 -0
- package/dist/discovery.d.ts +80 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +404 -0
- package/dist/discovery.js.map +1 -0
- package/dist/encryption/channel.d.ts +29 -0
- package/dist/encryption/channel.d.ts.map +1 -0
- package/dist/encryption/channel.js +78 -0
- package/dist/encryption/channel.js.map +1 -0
- package/dist/encryption/index.d.ts +9 -0
- package/dist/encryption/index.d.ts.map +1 -0
- package/dist/encryption/index.js +23 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/mesh-client.d.ts +281 -0
- package/dist/encryption/mesh-client.d.ts.map +1 -0
- package/dist/encryption/mesh-client.js +1110 -0
- package/dist/encryption/mesh-client.js.map +1 -0
- package/dist/encryption/ratchet.d.ts +38 -0
- package/dist/encryption/ratchet.d.ts.map +1 -0
- package/dist/encryption/ratchet.js +223 -0
- package/dist/encryption/ratchet.js.map +1 -0
- package/dist/encryption/registry-client.d.ts +136 -0
- package/dist/encryption/registry-client.d.ts.map +1 -0
- package/dist/encryption/registry-client.js +369 -0
- package/dist/encryption/registry-client.js.map +1 -0
- package/dist/encryption/x3dh.d.ts +80 -0
- package/dist/encryption/x3dh.d.ts.map +1 -0
- package/dist/encryption/x3dh.js +238 -0
- package/dist/encryption/x3dh.js.map +1 -0
- package/dist/framework-adapter.d.ts +63 -0
- package/dist/framework-adapter.d.ts.map +1 -0
- package/dist/framework-adapter.js +253 -0
- package/dist/framework-adapter.js.map +1 -0
- package/dist/identity.d.ts +124 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +446 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/kill-switch.d.ts +22 -0
- package/dist/kill-switch.d.ts.map +1 -0
- package/dist/kill-switch.js +60 -0
- package/dist/kill-switch.js.map +1 -0
- package/dist/lifecycle.d.ts +50 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +113 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/mcp.d.ts +41 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +233 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metrics.d.ts +123 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +289 -0
- package/dist/metrics.js.map +1 -0
- package/dist/oci-manifest.d.ts +49 -0
- package/dist/oci-manifest.d.ts.map +1 -0
- package/dist/oci-manifest.js +182 -0
- package/dist/oci-manifest.js.map +1 -0
- package/dist/policy-backends/cedar.d.ts +15 -0
- package/dist/policy-backends/cedar.d.ts.map +1 -0
- package/dist/policy-backends/cedar.js +88 -0
- package/dist/policy-backends/cedar.js.map +1 -0
- package/dist/policy-backends/opa.d.ts +17 -0
- package/dist/policy-backends/opa.d.ts.map +1 -0
- package/dist/policy-backends/opa.js +74 -0
- package/dist/policy-backends/opa.js.map +1 -0
- package/dist/policy.d.ts +77 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +760 -0
- package/dist/policy.js.map +1 -0
- package/dist/prompt-defense.d.ts +37 -0
- package/dist/prompt-defense.d.ts.map +1 -0
- package/dist/prompt-defense.js +229 -0
- package/dist/prompt-defense.js.map +1 -0
- package/dist/protocol-facets.d.ts +87 -0
- package/dist/protocol-facets.d.ts.map +1 -0
- package/dist/protocol-facets.js +728 -0
- package/dist/protocol-facets.js.map +1 -0
- package/dist/rings.d.ts +17 -0
- package/dist/rings.d.ts.map +1 -0
- package/dist/rings.js +61 -0
- package/dist/rings.js.map +1 -0
- package/dist/sandbox.d.ts +61 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +199 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/surface-parity.d.ts +45 -0
- package/dist/surface-parity.d.ts.map +1 -0
- package/dist/surface-parity.js +216 -0
- package/dist/surface-parity.js.map +1 -0
- package/dist/trust.d.ts +28 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +209 -0
- package/dist/trust.js.map +1 -0
- package/dist/types.d.ts +422 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +135 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +356 -0
- package/dist/verify.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.RegistryClient = exports.RegistryError = void 0;
|
|
6
|
+
exports.ed25519AuthSigner = ed25519AuthSigner;
|
|
7
|
+
/**
|
|
8
|
+
* AgentMesh Registry HTTP client.
|
|
9
|
+
*
|
|
10
|
+
* Wraps the registry's REST surface (POST /v1/agents,
|
|
11
|
+
* PUT/GET /v1/agents/{did}/prekeys, GET /v1/discover, GET/DELETE /v1/agents/{did})
|
|
12
|
+
* with typed Uint8Array <-> base64url marshalling so callers stay in raw key
|
|
13
|
+
* material on both sides of the wire.
|
|
14
|
+
*
|
|
15
|
+
* Spec: docs/specs/AGENTMESH-WIRE-1.0.md Section 13 (Registry)
|
|
16
|
+
*
|
|
17
|
+
* The optional `authSigner` lets callers attach an Ed25519-Timestamp
|
|
18
|
+
* Authorization header when the registry is configured to require it
|
|
19
|
+
* (verify_ed25519_timestamp_auth in agent-governance-python). Open
|
|
20
|
+
* registries leave it unset.
|
|
21
|
+
*/
|
|
22
|
+
const ed25519_js_1 = require("@noble/curves/ed25519.js");
|
|
23
|
+
// ── base64url helpers (browser + node) ────────────────────────────
|
|
24
|
+
function toBase64Url(bytes) {
|
|
25
|
+
// Node 18+ supports 'base64url' encoding. Fall back to btoa for browsers.
|
|
26
|
+
if (typeof Buffer !== "undefined") {
|
|
27
|
+
return Buffer.from(bytes).toString("base64url");
|
|
28
|
+
}
|
|
29
|
+
let bin = "";
|
|
30
|
+
for (const b of bytes)
|
|
31
|
+
bin += String.fromCharCode(b);
|
|
32
|
+
return btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
33
|
+
}
|
|
34
|
+
function fromBase64Url(s) {
|
|
35
|
+
if (typeof Buffer !== "undefined") {
|
|
36
|
+
return new Uint8Array(Buffer.from(s, "base64url"));
|
|
37
|
+
}
|
|
38
|
+
const pad = "=".repeat((4 - (s.length % 4)) % 4);
|
|
39
|
+
const bin = atob(s.replace(/-/g, "+").replace(/_/g, "/") + pad);
|
|
40
|
+
const out = new Uint8Array(bin.length);
|
|
41
|
+
for (let i = 0; i < bin.length; i++)
|
|
42
|
+
out[i] = bin.charCodeAt(i);
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* sha256(bytes) → lowercase hex. Used to deterministically derive the
|
|
47
|
+
* canonical `did:mesh:<hex32>` server DID when a 409 conflict occurs
|
|
48
|
+
* during POP registration and the server didn't return a body to parse.
|
|
49
|
+
* Matches `hashlib.sha256(public_key).hexdigest()` on the Python side.
|
|
50
|
+
*/
|
|
51
|
+
async function sha256Hex(bytes) {
|
|
52
|
+
// Node 18+ exposes Web Crypto via globalThis.crypto.
|
|
53
|
+
const c = globalThis.crypto;
|
|
54
|
+
if (c?.subtle) {
|
|
55
|
+
const ab = bytes.buffer instanceof ArrayBuffer
|
|
56
|
+
? bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)
|
|
57
|
+
: new Uint8Array(bytes).buffer;
|
|
58
|
+
const digest = await c.subtle.digest("SHA-256", ab);
|
|
59
|
+
return Array.from(new Uint8Array(digest))
|
|
60
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
61
|
+
.join("");
|
|
62
|
+
}
|
|
63
|
+
// Fallback: node:crypto (CommonJS require to keep browser bundlers happy).
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
65
|
+
const nodeCrypto = require("node:crypto");
|
|
66
|
+
return nodeCrypto.createHash("sha256").update(bytes).digest("hex");
|
|
67
|
+
}
|
|
68
|
+
class RegistryError extends Error {
|
|
69
|
+
status;
|
|
70
|
+
body;
|
|
71
|
+
constructor(message, status, body) {
|
|
72
|
+
super(message);
|
|
73
|
+
this.status = status;
|
|
74
|
+
this.body = body;
|
|
75
|
+
this.name = "RegistryError";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.RegistryError = RegistryError;
|
|
79
|
+
// ── Implementation ───────────────────────────────────────────────
|
|
80
|
+
class RegistryClient {
|
|
81
|
+
baseUrl;
|
|
82
|
+
fetchImpl;
|
|
83
|
+
authSigner;
|
|
84
|
+
timeoutMs;
|
|
85
|
+
maxRetries;
|
|
86
|
+
retryBaseDelayMs;
|
|
87
|
+
constructor(opts) {
|
|
88
|
+
this.baseUrl = opts.baseUrl.replace(/\/$/, "");
|
|
89
|
+
this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
90
|
+
this.authSigner = opts.authSigner;
|
|
91
|
+
this.timeoutMs = opts.timeoutMs ?? 10_000;
|
|
92
|
+
this.maxRetries = opts.maxRetries ?? 2;
|
|
93
|
+
this.retryBaseDelayMs = opts.retryBaseDelayMs ?? 250;
|
|
94
|
+
}
|
|
95
|
+
// ── Registration ───────────────────────────────────────────────
|
|
96
|
+
/**
|
|
97
|
+
* Register the agent in the registry. Idempotent: a 409 response
|
|
98
|
+
* (already registered) resolves successfully without throwing.
|
|
99
|
+
*
|
|
100
|
+
* @param did Client-supplied DID hint. Ignored when `popSigner`
|
|
101
|
+
* is provided (the server derives the canonical
|
|
102
|
+
* `did:mesh:<sha256(public_key)[:32]>` itself); kept
|
|
103
|
+
* for back-compat with pre-2533 (May-23-2026)
|
|
104
|
+
* registries that accept a body-supplied DID.
|
|
105
|
+
* @param identityKey When `popSigner` is set: the **Ed25519** identity
|
|
106
|
+
* public key (32 bytes). The server verifies the
|
|
107
|
+
* proof against this key.
|
|
108
|
+
* When `popSigner` is unset: legacy X25519 public
|
|
109
|
+
* key path, preserves the old wire shape.
|
|
110
|
+
* @param capabilities Capability strings the agent advertises. Include
|
|
111
|
+
* friendly display name here so peers can find this
|
|
112
|
+
* agent via `discover(name)`.
|
|
113
|
+
* @param metadata Arbitrary string metadata (e.g. {display_name}).
|
|
114
|
+
* @param popSigner Optional Ed25519 signer. When set, the client
|
|
115
|
+
* attaches proof-of-possession (the new wire
|
|
116
|
+
* shape introduced by AGT PR #2533, mandatory on
|
|
117
|
+
* registries built from main after 2026-05-23).
|
|
118
|
+
* Required by `ghcr.io/microsoft/agentmesh/registry:4.0.0+`.
|
|
119
|
+
* @returns The canonical agent DID (server-derived when popSigner is
|
|
120
|
+
* set; falls back to the caller-supplied `did` otherwise).
|
|
121
|
+
*/
|
|
122
|
+
async register(did, identityKey, capabilities = [], metadata = {}, popSigner) {
|
|
123
|
+
if (identityKey.length !== 32) {
|
|
124
|
+
throw new Error(`RegistryClient.register: identityKey must be 32 bytes, got ${identityKey.length}`);
|
|
125
|
+
}
|
|
126
|
+
// POP path (new wire shape, AGT PR #2533+).
|
|
127
|
+
if (popSigner) {
|
|
128
|
+
const publicKeyB64 = toBase64Url(identityKey);
|
|
129
|
+
const proofTimestamp = new Date().toISOString();
|
|
130
|
+
// Server verifies Ed25519(public_key_b64_str || proof_timestamp_str)
|
|
131
|
+
// — the strings as transmitted, NOT the raw key bytes. See
|
|
132
|
+
// agent-governance-python/agent-mesh/src/agentmesh/registry/app.py
|
|
133
|
+
// line ~204: `message = req.public_key.encode() + req.proof_timestamp.encode()`.
|
|
134
|
+
const popMessage = new TextEncoder().encode(publicKeyB64 + proofTimestamp);
|
|
135
|
+
const proof = popSigner.sign(popMessage);
|
|
136
|
+
const body = JSON.stringify({
|
|
137
|
+
public_key: publicKeyB64,
|
|
138
|
+
proof: toBase64Url(proof),
|
|
139
|
+
proof_timestamp: proofTimestamp,
|
|
140
|
+
capabilities,
|
|
141
|
+
metadata,
|
|
142
|
+
});
|
|
143
|
+
const resp = await this.request("POST", "/v1/agents", body);
|
|
144
|
+
if (resp.status === 201 || resp.status === 200) {
|
|
145
|
+
// Parse the server-derived DID out of the response body.
|
|
146
|
+
try {
|
|
147
|
+
const j = JSON.parse(resp.bodyText);
|
|
148
|
+
if (j.did)
|
|
149
|
+
return { did: j.did };
|
|
150
|
+
}
|
|
151
|
+
catch { /* fall through */ }
|
|
152
|
+
return { did };
|
|
153
|
+
}
|
|
154
|
+
if (resp.status === 409) {
|
|
155
|
+
// Already registered — server didn't necessarily return a DID body.
|
|
156
|
+
// Re-derive it deterministically the same way the server does so the
|
|
157
|
+
// caller can use the canonical form for subsequent lookups.
|
|
158
|
+
const sha256 = await sha256Hex(identityKey);
|
|
159
|
+
return { did: `did:mesh:${sha256.slice(0, 32)}` };
|
|
160
|
+
}
|
|
161
|
+
throw new RegistryError(`register failed: ${resp.status}`, resp.status, resp.bodyText);
|
|
162
|
+
}
|
|
163
|
+
// Legacy path (pre-2533 registries that accept body `did` + X25519 key).
|
|
164
|
+
const body = JSON.stringify({
|
|
165
|
+
did,
|
|
166
|
+
public_key: toBase64Url(identityKey),
|
|
167
|
+
capabilities,
|
|
168
|
+
metadata,
|
|
169
|
+
});
|
|
170
|
+
const resp = await this.request("POST", "/v1/agents", body);
|
|
171
|
+
if (resp.status === 201 || resp.status === 200)
|
|
172
|
+
return { did };
|
|
173
|
+
if (resp.status === 409)
|
|
174
|
+
return { did }; // already registered — idempotent
|
|
175
|
+
throw new RegistryError(`register failed: ${resp.status}`, resp.status, resp.bodyText);
|
|
176
|
+
}
|
|
177
|
+
/** Look up an agent record. Returns null on 404. */
|
|
178
|
+
async getAgent(did) {
|
|
179
|
+
const resp = await this.request("GET", `/v1/agents/${encodeURIComponent(did)}`);
|
|
180
|
+
if (resp.status === 404)
|
|
181
|
+
return null;
|
|
182
|
+
if (!resp.ok) {
|
|
183
|
+
throw new RegistryError(`getAgent failed: ${resp.status}`, resp.status, resp.bodyText);
|
|
184
|
+
}
|
|
185
|
+
const j = JSON.parse(resp.bodyText);
|
|
186
|
+
return {
|
|
187
|
+
did: j.did,
|
|
188
|
+
capabilities: j.capabilities,
|
|
189
|
+
metadata: j.metadata,
|
|
190
|
+
registeredAt: new Date(j.registered_at),
|
|
191
|
+
lastSeen: new Date(j.last_seen),
|
|
192
|
+
reputationScore: j.reputation_score,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/** Deregister an agent. */
|
|
196
|
+
async deleteAgent(did) {
|
|
197
|
+
const resp = await this.request("DELETE", `/v1/agents/${encodeURIComponent(did)}`);
|
|
198
|
+
if (resp.status === 204 || resp.status === 404)
|
|
199
|
+
return;
|
|
200
|
+
if (!resp.ok) {
|
|
201
|
+
throw new RegistryError(`deleteAgent failed: ${resp.status}`, resp.status, resp.bodyText);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// ── Pre-Keys ───────────────────────────────────────────────────
|
|
205
|
+
/**
|
|
206
|
+
* Upload a pre-key bundle. Replaces any existing bundle for this DID.
|
|
207
|
+
*
|
|
208
|
+
* @param identityKey X25519 long-term key (32 bytes).
|
|
209
|
+
* @param identityKeyEd Ed25519 signing key (32 bytes) — REQUIRED for
|
|
210
|
+
* receivers to verify the signed pre-key signature.
|
|
211
|
+
* Pass `keyManager.identityKeyEd`.
|
|
212
|
+
* @param signedPreKey Output of X3DHKeyManager.generateSignedPreKey()
|
|
213
|
+
* @param oneTimePreKeys Output of X3DHKeyManager.generateOneTimePreKeys(N)
|
|
214
|
+
*/
|
|
215
|
+
async uploadPrekeys(did, identityKey, identityKeyEd, signedPreKey, oneTimePreKeys) {
|
|
216
|
+
if (identityKey.length !== 32) {
|
|
217
|
+
throw new Error(`RegistryClient.uploadPrekeys: identityKey must be 32 bytes, got ${identityKey.length}`);
|
|
218
|
+
}
|
|
219
|
+
if (identityKeyEd.length !== 32) {
|
|
220
|
+
throw new Error(`RegistryClient.uploadPrekeys: identityKeyEd must be 32 bytes, got ${identityKeyEd.length}`);
|
|
221
|
+
}
|
|
222
|
+
const body = JSON.stringify({
|
|
223
|
+
identity_key: toBase64Url(identityKey),
|
|
224
|
+
identity_key_ed: toBase64Url(identityKeyEd),
|
|
225
|
+
signed_pre_key: {
|
|
226
|
+
key_id: signedPreKey.keyId,
|
|
227
|
+
public_key: toBase64Url(signedPreKey.publicKey),
|
|
228
|
+
signature: toBase64Url(signedPreKey.signature),
|
|
229
|
+
},
|
|
230
|
+
one_time_pre_keys: oneTimePreKeys.map((otk) => ({
|
|
231
|
+
key_id: otk.keyId,
|
|
232
|
+
public_key: toBase64Url(otk.publicKey),
|
|
233
|
+
})),
|
|
234
|
+
});
|
|
235
|
+
const resp = await this.request("PUT", `/v1/agents/${encodeURIComponent(did)}/prekeys`, body);
|
|
236
|
+
if (!resp.ok) {
|
|
237
|
+
throw new RegistryError(`uploadPrekeys failed: ${resp.status}`, resp.status, resp.bodyText);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Fetch a peer's pre-key bundle for X3DH initiation. Atomically
|
|
242
|
+
* consumes one OPK on the registry side. Returns null on 404 (no
|
|
243
|
+
* bundle published).
|
|
244
|
+
*
|
|
245
|
+
* The returned PreKeyBundle is shaped for direct use with
|
|
246
|
+
* SecureChannel.createSender() / X3DHKeyManager.
|
|
247
|
+
*
|
|
248
|
+
* `identityKeyEd` (Ed25519, used to verify the signed pre-key
|
|
249
|
+
* signature) is included when the publisher uploaded it via
|
|
250
|
+
* `uploadPrekeys()`. Bundles that lack identity_key_ed (older clients)
|
|
251
|
+
* will fail verifyBundle() — peers must upgrade.
|
|
252
|
+
*/
|
|
253
|
+
async fetchPrekeys(did) {
|
|
254
|
+
const resp = await this.request("GET", `/v1/agents/${encodeURIComponent(did)}/prekeys`);
|
|
255
|
+
if (resp.status === 404)
|
|
256
|
+
return null;
|
|
257
|
+
if (!resp.ok) {
|
|
258
|
+
throw new RegistryError(`fetchPrekeys failed: ${resp.status}`, resp.status, resp.bodyText);
|
|
259
|
+
}
|
|
260
|
+
const j = JSON.parse(resp.bodyText);
|
|
261
|
+
const identityKey = fromBase64Url(j.identity_key);
|
|
262
|
+
if (!j.identity_key_ed) {
|
|
263
|
+
throw new RegistryError(`Peer ${did} has not published identity_key_ed (Ed25519 signing key). ` +
|
|
264
|
+
"Their client must upgrade to a version that uploads both X25519 and Ed25519 keys.", 200, resp.bodyText);
|
|
265
|
+
}
|
|
266
|
+
const identityKeyEd = fromBase64Url(j.identity_key_ed);
|
|
267
|
+
const bundle = {
|
|
268
|
+
identityKey,
|
|
269
|
+
identityKeyEd,
|
|
270
|
+
signedPreKey: fromBase64Url(j.signed_pre_key.public_key),
|
|
271
|
+
signedPreKeySignature: fromBase64Url(j.signed_pre_key.signature),
|
|
272
|
+
signedPreKeyId: j.signed_pre_key.key_id,
|
|
273
|
+
};
|
|
274
|
+
if (j.one_time_pre_key) {
|
|
275
|
+
bundle.oneTimePreKey = fromBase64Url(j.one_time_pre_key.public_key);
|
|
276
|
+
bundle.oneTimePreKeyId = j.one_time_pre_key.key_id;
|
|
277
|
+
}
|
|
278
|
+
return bundle;
|
|
279
|
+
}
|
|
280
|
+
// ── Discovery ──────────────────────────────────────────────────
|
|
281
|
+
/**
|
|
282
|
+
* Search agents by capability. Capability matching on the registry
|
|
283
|
+
* side is exact-string (no globs); to find a friendly name, the agent
|
|
284
|
+
* must have published that name in its capabilities array at register
|
|
285
|
+
* time.
|
|
286
|
+
*/
|
|
287
|
+
async discover(capability, limit = 50) {
|
|
288
|
+
const path = `/v1/discover?capability=${encodeURIComponent(capability)}&limit=${limit}`;
|
|
289
|
+
const resp = await this.request("GET", path);
|
|
290
|
+
if (!resp.ok) {
|
|
291
|
+
throw new RegistryError(`discover failed: ${resp.status}`, resp.status, resp.bodyText);
|
|
292
|
+
}
|
|
293
|
+
const j = JSON.parse(resp.bodyText);
|
|
294
|
+
return j.results.map((r) => ({
|
|
295
|
+
did: r.did,
|
|
296
|
+
capabilities: r.capabilities,
|
|
297
|
+
reputationScore: r.reputation_score,
|
|
298
|
+
lastSeen: new Date(r.last_seen),
|
|
299
|
+
}));
|
|
300
|
+
}
|
|
301
|
+
// ── Internal request plumbing ──────────────────────────────────
|
|
302
|
+
async request(method, path, body) {
|
|
303
|
+
let lastErr;
|
|
304
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
305
|
+
try {
|
|
306
|
+
const result = await this.requestOnce(method, path, body);
|
|
307
|
+
// Retry on 5xx; succeed/return on 2xx and 4xx.
|
|
308
|
+
if (result.status >= 500 && result.status < 600 && attempt < this.maxRetries) {
|
|
309
|
+
await this.delay(this.retryBaseDelayMs * 2 ** attempt);
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
lastErr = e;
|
|
316
|
+
if (attempt < this.maxRetries) {
|
|
317
|
+
await this.delay(this.retryBaseDelayMs * 2 ** attempt);
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
throw e;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Unreachable, but keeps TS happy.
|
|
324
|
+
throw lastErr ?? new Error("RegistryClient.request: exhausted retries");
|
|
325
|
+
}
|
|
326
|
+
async requestOnce(method, path, body) {
|
|
327
|
+
const headers = {};
|
|
328
|
+
if (body !== undefined)
|
|
329
|
+
headers["content-type"] = "application/json";
|
|
330
|
+
if (this.authSigner) {
|
|
331
|
+
const ts = new Date().toISOString();
|
|
332
|
+
const sig = this.authSigner.sign(new TextEncoder().encode(ts));
|
|
333
|
+
headers["authorization"] = `Ed25519-Timestamp ${this.authSigner.did} ${ts} ${toBase64Url(sig)}`;
|
|
334
|
+
}
|
|
335
|
+
const ac = new AbortController();
|
|
336
|
+
const timer = setTimeout(() => ac.abort(), this.timeoutMs);
|
|
337
|
+
try {
|
|
338
|
+
const resp = await this.fetchImpl(`${this.baseUrl}${path}`, {
|
|
339
|
+
method,
|
|
340
|
+
headers,
|
|
341
|
+
body,
|
|
342
|
+
signal: ac.signal,
|
|
343
|
+
});
|
|
344
|
+
const bodyText = await resp.text();
|
|
345
|
+
return { ok: resp.ok, status: resp.status, bodyText };
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
348
|
+
clearTimeout(timer);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
delay(ms) {
|
|
352
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
exports.RegistryClient = RegistryClient;
|
|
356
|
+
// ── Convenience: build an authSigner from an Ed25519 private key ──
|
|
357
|
+
/**
|
|
358
|
+
* Build an authSigner suitable for RegistryClientOptions.authSigner
|
|
359
|
+
* from a 32-byte Ed25519 secret key. This is a thin wrapper around
|
|
360
|
+
* @noble/curves so callers don't need to import noble themselves.
|
|
361
|
+
*/
|
|
362
|
+
function ed25519AuthSigner(did, ed25519PrivateKey) {
|
|
363
|
+
const sk = ed25519PrivateKey.length === 64 ? ed25519PrivateKey.slice(0, 32) : ed25519PrivateKey;
|
|
364
|
+
return {
|
|
365
|
+
did,
|
|
366
|
+
sign: (msg) => ed25519_js_1.ed25519.sign(msg, sk),
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=registry-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../src/encryption/registry-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export interface X25519KeyPair {
|
|
2
|
+
privateKey: Uint8Array;
|
|
3
|
+
publicKey: Uint8Array;
|
|
4
|
+
}
|
|
5
|
+
export interface PreKeyBundle {
|
|
6
|
+
identityKey: Uint8Array;
|
|
7
|
+
/** Ed25519 signing public key — required for signature verification. */
|
|
8
|
+
identityKeyEd: Uint8Array;
|
|
9
|
+
signedPreKey: Uint8Array;
|
|
10
|
+
signedPreKeySignature: Uint8Array;
|
|
11
|
+
signedPreKeyId: number;
|
|
12
|
+
oneTimePreKey?: Uint8Array;
|
|
13
|
+
oneTimePreKeyId?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface X3DHResult {
|
|
16
|
+
sharedSecret: Uint8Array;
|
|
17
|
+
ephemeralPublicKey: Uint8Array;
|
|
18
|
+
usedOneTimeKeyId?: number;
|
|
19
|
+
associatedData: Uint8Array;
|
|
20
|
+
}
|
|
21
|
+
export declare function generateX25519KeyPair(): X25519KeyPair;
|
|
22
|
+
export declare function ed25519ToX25519(ed25519Private: Uint8Array, ed25519Public: Uint8Array): X25519KeyPair;
|
|
23
|
+
/**
|
|
24
|
+
* X3DH key-derivation function.
|
|
25
|
+
*
|
|
26
|
+
* Computes `HKDF-SHA256(salt = 0x00 × 32, IKM = F ‖ dhConcat,
|
|
27
|
+
* info = "AgentMesh_X3DH_v1", L = 32)` where `F` is `0xFF × 32`, per the
|
|
28
|
+
* Signal X3DH spec (§2.2). Callers pass `dhConcat` (the concatenation of the
|
|
29
|
+
* DH outputs) as `ikm`; the F prefix is prepended here so every code path
|
|
30
|
+
* (initiator + responder) applies it exactly once.
|
|
31
|
+
*
|
|
32
|
+
* Exported so the test suite can pin the exact derived key against a
|
|
33
|
+
* cross-runtime known-answer vector shared with the AGT Python SDK, which
|
|
34
|
+
* guards against silent salt/IKM regressions that pass intra-runtime
|
|
35
|
+
* consistency checks but break Python↔TypeScript interop.
|
|
36
|
+
*/
|
|
37
|
+
export declare function kdf(ikm: Uint8Array): Uint8Array;
|
|
38
|
+
export declare class X3DHKeyManager {
|
|
39
|
+
readonly identityKey: X25519KeyPair;
|
|
40
|
+
private readonly ed25519Private;
|
|
41
|
+
private readonly ed25519Public;
|
|
42
|
+
private signedPreKeyPair;
|
|
43
|
+
private oneTimePreKeys;
|
|
44
|
+
private nextSpkId;
|
|
45
|
+
private nextOtkId;
|
|
46
|
+
constructor(ed25519Private: Uint8Array, ed25519Public: Uint8Array);
|
|
47
|
+
/**
|
|
48
|
+
* Ed25519 public key used to sign pre-keys. Distinct from
|
|
49
|
+
* `identityKey.publicKey` (X25519). Peers MUST be given this key to
|
|
50
|
+
* verify the signature on the signed pre-key (`verifyBundle`).
|
|
51
|
+
*/
|
|
52
|
+
get identityKeyEd(): Uint8Array;
|
|
53
|
+
/**
|
|
54
|
+
* Sign an arbitrary message with the Ed25519 identity private key.
|
|
55
|
+
*
|
|
56
|
+
* Used for registry registration proof-of-possession (the server
|
|
57
|
+
* verifies `Ed25519(public_key || proof_timestamp)` against
|
|
58
|
+
* `identityKeyEd`) and for the relay's `connect` frame Ed25519
|
|
59
|
+
* timestamp signature.
|
|
60
|
+
*/
|
|
61
|
+
signMessage(message: Uint8Array): Uint8Array;
|
|
62
|
+
generateSignedPreKey(): {
|
|
63
|
+
keyId: number;
|
|
64
|
+
publicKey: Uint8Array;
|
|
65
|
+
signature: Uint8Array;
|
|
66
|
+
};
|
|
67
|
+
generateOneTimePreKeys(count: number): Array<{
|
|
68
|
+
keyId: number;
|
|
69
|
+
publicKey: Uint8Array;
|
|
70
|
+
}>;
|
|
71
|
+
getPublicBundle(otkId?: number): PreKeyBundle;
|
|
72
|
+
initiate(peerBundle: PreKeyBundle): X3DHResult;
|
|
73
|
+
respond(peerIdentityKey: Uint8Array, ephemeralPublicKey: Uint8Array, usedOneTimeKeyId?: number): X3DHResult;
|
|
74
|
+
get signedPreKey(): {
|
|
75
|
+
keyPair: X25519KeyPair;
|
|
76
|
+
signature: Uint8Array;
|
|
77
|
+
keyId: number;
|
|
78
|
+
} | null;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=x3dh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x3dh.d.ts","sourceRoot":"","sources":["../../src/encryption/x3dh.ts"],"names":[],"mappings":"AA0CA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,UAAU,CAAC;IACxB,wEAAwE;IACxE,aAAa,EAAE,UAAU,CAAC;IAC1B,YAAY,EAAE,UAAU,CAAC;IACzB,qBAAqB,EAAE,UAAU,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,UAAU,CAAC;IACzB,kBAAkB,EAAE,UAAU,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,UAAU,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,IAAI,aAAa,CAIrD;AAED,wBAAgB,eAAe,CAC7B,cAAc,EAAE,UAAU,EAC1B,aAAa,EAAE,UAAU,GACxB,aAAa,CAgBf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAE/C;AAaD,qBAAa,cAAc;IACzB,SAAgB,WAAW,EAAE,aAAa,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,gBAAgB,CAAiF;IACzG,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;gBAEV,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU;IAMjE;;;;OAIG;IACH,IAAI,aAAa,IAAI,UAAU,CAE9B;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAI5C,oBAAoB,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE;IAQvF,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE,CAAC;IAWtF,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY;IAqB7C,QAAQ,CAAC,UAAU,EAAE,YAAY,GAAG,UAAU;IA6B9C,OAAO,CACL,eAAe,EAAE,UAAU,EAC3B,kBAAkB,EAAE,UAAU,EAC9B,gBAAgB,CAAC,EAAE,MAAM,GACxB,UAAU;IAgCb,IAAI,YAAY;iBAzIqB,aAAa;mBAAa,UAAU;eAAS,MAAM;aA2IvF;CACF"}
|