@mcsherrylabs/evolver-mcp 0.11.0 → 0.13.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/deploy/release.json +1 -1
- package/dist/application-signer.d.ts +16 -0
- package/dist/application-signer.d.ts.map +1 -0
- package/dist/application-signer.js +55 -0
- package/dist/application-signer.js.map +1 -0
- package/dist/approved-request.d.ts +30 -0
- package/dist/approved-request.d.ts.map +1 -0
- package/dist/approved-request.js +167 -0
- package/dist/approved-request.js.map +1 -0
- package/dist/attachment-tools.d.ts +3 -0
- package/dist/attachment-tools.d.ts.map +1 -0
- package/dist/attachment-tools.js +32 -0
- package/dist/attachment-tools.js.map +1 -0
- package/dist/attachments.d.ts +41 -0
- package/dist/attachments.d.ts.map +1 -0
- package/dist/attachments.js +458 -0
- package/dist/attachments.js.map +1 -0
- package/dist/content-file-tools.d.ts +3 -0
- package/dist/content-file-tools.d.ts.map +1 -0
- package/dist/content-file-tools.js +67 -0
- package/dist/content-file-tools.js.map +1 -0
- package/dist/content-files.d.ts +32 -0
- package/dist/content-files.d.ts.map +1 -0
- package/dist/content-files.js +79 -0
- package/dist/content-files.js.map +1 -0
- package/dist/content-ranges.d.ts +41 -0
- package/dist/content-ranges.d.ts.map +1 -0
- package/dist/content-ranges.js +75 -0
- package/dist/content-ranges.js.map +1 -0
- package/dist/content.d.ts +62 -19
- package/dist/content.d.ts.map +1 -1
- package/dist/content.js +180 -25
- package/dist/content.js.map +1 -1
- package/dist/files.d.ts +60 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +355 -0
- package/dist/files.js.map +1 -0
- package/dist/group-crypto-tools.d.ts +3 -0
- package/dist/group-crypto-tools.d.ts.map +1 -0
- package/dist/group-crypto-tools.js +47 -0
- package/dist/group-crypto-tools.js.map +1 -0
- package/dist/group-crypto.d.ts +24 -0
- package/dist/group-crypto.d.ts.map +1 -0
- package/dist/group-crypto.js +135 -0
- package/dist/group-crypto.js.map +1 -0
- package/dist/group-key-provider.d.ts +30 -0
- package/dist/group-key-provider.d.ts.map +1 -0
- package/dist/group-key-provider.js +72 -0
- package/dist/group-key-provider.js.map +1 -0
- package/dist/group-keys.d.ts +34 -0
- package/dist/group-keys.d.ts.map +1 -0
- package/dist/group-keys.js +88 -0
- package/dist/group-keys.js.map +1 -0
- package/dist/group-ownership.d.ts +78 -0
- package/dist/group-ownership.d.ts.map +1 -0
- package/dist/group-ownership.js +324 -0
- package/dist/group-ownership.js.map +1 -0
- package/dist/group.d.ts +2 -2
- package/dist/group.js +3 -3
- package/dist/group.js.map +1 -1
- package/dist/http-profiles.d.ts +47 -0
- package/dist/http-profiles.d.ts.map +1 -0
- package/dist/http-profiles.js +161 -0
- package/dist/http-profiles.js.map +1 -0
- package/dist/human-approval.d.ts +14 -0
- package/dist/human-approval.d.ts.map +1 -0
- package/dist/human-approval.js +34 -0
- package/dist/human-approval.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -40
- package/dist/index.js.map +1 -1
- package/dist/login-profiles.d.ts +25 -0
- package/dist/login-profiles.d.ts.map +1 -0
- package/dist/login-profiles.js +77 -0
- package/dist/login-profiles.js.map +1 -0
- package/dist/login-tools.d.ts +3 -0
- package/dist/login-tools.d.ts.map +1 -0
- package/dist/login-tools.js +27 -0
- package/dist/login-tools.js.map +1 -0
- package/dist/login.d.ts +36 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +144 -0
- package/dist/login.js.map +1 -0
- package/dist/mcp.d.ts +1 -0
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +22 -6
- package/dist/mcp.js.map +1 -1
- package/dist/node-transport.d.ts +14 -0
- package/dist/node-transport.d.ts.map +1 -0
- package/dist/node-transport.js +54 -0
- package/dist/node-transport.js.map +1 -0
- package/dist/p2p-tools.d.ts +3 -0
- package/dist/p2p-tools.d.ts.map +1 -0
- package/dist/p2p-tools.js +52 -0
- package/dist/p2p-tools.js.map +1 -0
- package/dist/p2p.d.ts +67 -0
- package/dist/p2p.d.ts.map +1 -0
- package/dist/p2p.js +326 -0
- package/dist/p2p.js.map +1 -0
- package/dist/proof-attempts.d.ts +19 -0
- package/dist/proof-attempts.d.ts.map +1 -0
- package/dist/proof-attempts.js +30 -0
- package/dist/proof-attempts.js.map +1 -0
- package/dist/read.d.ts +60 -1
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +97 -5
- package/dist/read.js.map +1 -1
- package/dist/signed-http-tools.d.ts +3 -0
- package/dist/signed-http-tools.d.ts.map +1 -0
- package/dist/signed-http-tools.js +33 -0
- package/dist/signed-http-tools.js.map +1 -0
- package/dist/signed-http.d.ts +30 -0
- package/dist/signed-http.d.ts.map +1 -0
- package/dist/signed-http.js +114 -0
- package/dist/signed-http.js.map +1 -0
- package/dist/tools.d.ts +27 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +243 -32
- package/dist/tools.js.map +1 -1
- package/dist/transaction-interchange-tools.d.ts +3 -0
- package/dist/transaction-interchange-tools.d.ts.map +1 -0
- package/dist/transaction-interchange-tools.js +41 -0
- package/dist/transaction-interchange-tools.js.map +1 -0
- package/dist/transaction-interchange.d.ts +141 -0
- package/dist/transaction-interchange.d.ts.map +1 -0
- package/dist/transaction-interchange.js +502 -0
- package/dist/transaction-interchange.js.map +1 -0
- package/dist/transaction-policy.d.ts +32 -0
- package/dist/transaction-policy.d.ts.map +1 -0
- package/dist/transaction-policy.js +89 -0
- package/dist/transaction-policy.js.map +1 -0
- package/dist/write.d.ts +52 -13
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +95 -25
- package/dist/write.js.map +1 -1
- package/package.json +4 -3
package/dist/p2p.js
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
// The SDK owns canonical P2P signing and relay transport. MCP owns configured identity,
|
|
2
|
+
// bounded session handles and a single explicit attempt. No HTTP/alternate wire encoder here.
|
|
3
|
+
import { randomBytes, createHash } from "node:crypto";
|
|
4
|
+
import { p2pRelayBody, p2pSignable, bytesToHex, isValidPrincipalName } from "@mcsherrylabs/evolver-client";
|
|
5
|
+
import { applicationKeyRegistered } from "./application-signer.js";
|
|
6
|
+
import { CONTENT_MAX_BYTES, CONTENT_MAX_BASE64_CHARS } from "./content.js";
|
|
7
|
+
export const P2P_MAX_HANDLES = 32;
|
|
8
|
+
export const P2P_PREPARED_TTL_MS = 10_000;
|
|
9
|
+
/** Existing node default. A stricter receiver policy requires separate operator coordination. */
|
|
10
|
+
export const P2P_FRESHNESS_WINDOW_MS = 15_000;
|
|
11
|
+
export const P2P_SUMMARY_TTL_MS = 60_000;
|
|
12
|
+
export const P2P_PAYLOAD_MAX_BYTES = CONTENT_MAX_BYTES;
|
|
13
|
+
const NO_RETRY = "No automatic retry or new nonce/signature: retain the original fingerprint, nonce and timestamp for diagnosis. Relay handoff is not recipient delivery, authentication, retention or a chain commit.";
|
|
14
|
+
const HANDLE = /^p2p_[0-9a-f]{48}$/;
|
|
15
|
+
/** Host configuration only, not an MCP tool parameter. TLS is supplied on THIS relay's SDK
|
|
16
|
+
* client by the composition root, using the operator's node policy (not external HTTP policy). */
|
|
17
|
+
export function p2pOriginFromEnv(env) {
|
|
18
|
+
const raw = env.EVOLVER_P2P_URL;
|
|
19
|
+
if (raw === undefined)
|
|
20
|
+
return { ok: true };
|
|
21
|
+
try {
|
|
22
|
+
const url = new URL(raw);
|
|
23
|
+
if (!raw || !["http:", "https:"].includes(url.protocol) || url.username || url.password ||
|
|
24
|
+
url.pathname !== "/" || url.search || url.hash)
|
|
25
|
+
throw new Error();
|
|
26
|
+
return { ok: true, origin: url.origin };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { ok: false, error: "EVOLVER_P2P_URL must be an explicit HTTP(S) origin without credentials, path, query or fragment; no chain/content fallback." };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function result(kind, reason, message) {
|
|
33
|
+
return { kind, reason, ...(message ? { message } : {}), note: NO_RETRY };
|
|
34
|
+
}
|
|
35
|
+
function cancelled() { return new DOMException("P2P operation cancelled", "AbortError"); }
|
|
36
|
+
function check(signal) { if (signal.aborted)
|
|
37
|
+
throw cancelled(); }
|
|
38
|
+
async function read(signal, operation) {
|
|
39
|
+
check(signal);
|
|
40
|
+
let abort;
|
|
41
|
+
const stopped = new Promise((_resolve, reject) => {
|
|
42
|
+
abort = () => reject(cancelled());
|
|
43
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
44
|
+
});
|
|
45
|
+
try {
|
|
46
|
+
return await Promise.race([Promise.resolve().then(() => { check(signal); return operation(); }), stopped]);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
signal.removeEventListener("abort", abort);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function payload(request) {
|
|
53
|
+
if (Object.keys(request).some(k => !["recipient", "channel", "text", "base64"].includes(k)) ||
|
|
54
|
+
(request.text === undefined) === (request.base64 === undefined))
|
|
55
|
+
throw new Error();
|
|
56
|
+
if (request.text !== undefined) {
|
|
57
|
+
const value = request.text;
|
|
58
|
+
if (typeof value !== "string" || value.length > P2P_PAYLOAD_MAX_BYTES ||
|
|
59
|
+
/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/.test(value) ||
|
|
60
|
+
Buffer.byteLength(value, "utf8") > P2P_PAYLOAD_MAX_BYTES)
|
|
61
|
+
throw new Error();
|
|
62
|
+
return Buffer.from(value, "utf8");
|
|
63
|
+
}
|
|
64
|
+
const value = request.base64;
|
|
65
|
+
if (typeof value !== "string" || value.length > CONTENT_MAX_BASE64_CHARS ||
|
|
66
|
+
!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value))
|
|
67
|
+
throw new Error();
|
|
68
|
+
const bytes = Buffer.from(value, "base64");
|
|
69
|
+
if (bytes.length > P2P_PAYLOAD_MAX_BYTES || bytes.toString("base64") !== value) {
|
|
70
|
+
bytes.fill(0);
|
|
71
|
+
throw new Error();
|
|
72
|
+
}
|
|
73
|
+
return bytes;
|
|
74
|
+
}
|
|
75
|
+
export function createP2PService(deps) {
|
|
76
|
+
const identity = deps.identity;
|
|
77
|
+
const now = deps.now ?? Date.now;
|
|
78
|
+
const monotonic = deps.monotonic ?? (() => performance.now());
|
|
79
|
+
const configured = deps.relay && p2pOriginFromEnv({ EVOLVER_P2P_URL: deps.relay.origin });
|
|
80
|
+
const relayClient = configured?.ok && configured.origin ? deps.relay.client : undefined;
|
|
81
|
+
const relay = relayClient?.sendP2P.bind(relayClient);
|
|
82
|
+
const reads = { nodeStatus: deps.reads.nodeStatus.bind(deps.reads), getIdentityKeys: deps.reads.getIdentityKeys.bind(deps.reads) };
|
|
83
|
+
const supplied = deps.applicationSigner;
|
|
84
|
+
const app = supplied.ok ? { ok: true, publicKey: new Uint8Array(supplied.publicKey),
|
|
85
|
+
signer: Object.freeze({ keyType: supplied.signer.keyType, keyLabel: supplied.signer.keyLabel,
|
|
86
|
+
nodeId: supplied.signer.nodeId, sign: supplied.signer.sign.bind(supplied.signer) }) } : { ok: false, error: "Application signer unavailable" };
|
|
87
|
+
const validSigner = app.ok && app.signer.keyType === "Ed25519" && app.publicKey.length === 32 &&
|
|
88
|
+
(app.signer.nodeId === "" || app.signer.nodeId === identity) &&
|
|
89
|
+
/^[\x20-\x21\x23-\x5b\x5d-\x7e]{0,128}$/.test(app.signer.keyLabel) && isValidPrincipalName(identity);
|
|
90
|
+
const entries = new Map();
|
|
91
|
+
const lifetime = new AbortController();
|
|
92
|
+
let pending = 0;
|
|
93
|
+
let closed = false;
|
|
94
|
+
const sample = () => {
|
|
95
|
+
const epoch = now(), mono = monotonic();
|
|
96
|
+
if (!Number.isSafeInteger(epoch) || epoch < 0 || !Number.isSafeInteger(epoch + P2P_PREPARED_TTL_MS) ||
|
|
97
|
+
!Number.isFinite(mono) || mono < 0 || mono > Number.MAX_SAFE_INTEGER - P2P_SUMMARY_TTL_MS)
|
|
98
|
+
throw new Error();
|
|
99
|
+
return { epoch, mono };
|
|
100
|
+
};
|
|
101
|
+
const clear = (entry) => { entry.body = undefined; clearTimeout(entry.expiryTimer); clearTimeout(entry.retireTimer); };
|
|
102
|
+
const prune = (mono) => {
|
|
103
|
+
for (const [handle, entry] of entries)
|
|
104
|
+
if (entry.state !== "attempting" && mono >= entry.createdMono + P2P_SUMMARY_TTL_MS) {
|
|
105
|
+
clear(entry);
|
|
106
|
+
entries.delete(handle);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const fresh = (entry, time = sample()) => {
|
|
110
|
+
return time.mono >= entry.createdMono && time.mono < entry.expiresMono &&
|
|
111
|
+
BigInt(time.epoch) >= BigInt(entry.summary.timestamp) && BigInt(time.epoch) < BigInt(entry.summary.expiresAt);
|
|
112
|
+
};
|
|
113
|
+
const signals = (caller) => {
|
|
114
|
+
const controller = new AbortController();
|
|
115
|
+
const abort = () => controller.abort();
|
|
116
|
+
const sources = caller ? [caller, lifetime.signal] : [lifetime.signal];
|
|
117
|
+
for (const source of sources)
|
|
118
|
+
source.addEventListener("abort", abort, { once: true });
|
|
119
|
+
if (sources.some(s => s.aborted))
|
|
120
|
+
controller.abort();
|
|
121
|
+
return { signal: controller.signal, abort, release() { for (const source of sources)
|
|
122
|
+
source.removeEventListener("abort", abort); } };
|
|
123
|
+
};
|
|
124
|
+
const registration = async (signal) => {
|
|
125
|
+
if (!app.ok)
|
|
126
|
+
return "key_mismatch";
|
|
127
|
+
const before = await read(signal, () => reads.nodeStatus());
|
|
128
|
+
const height = before.blockHeight;
|
|
129
|
+
const applied = before.appliedRound;
|
|
130
|
+
if (!Number.isSafeInteger(height) || height < 0 || (applied !== null && applied !== height))
|
|
131
|
+
return "stale_chain";
|
|
132
|
+
if (!await read(signal, () => applicationKeyRegistered(reads, identity, app)))
|
|
133
|
+
return "key_mismatch";
|
|
134
|
+
const after = await read(signal, () => reads.nodeStatus());
|
|
135
|
+
if (after.blockHeight !== height || (after.appliedRound !== null && after.appliedRound !== height))
|
|
136
|
+
return "stale_chain";
|
|
137
|
+
return "ok";
|
|
138
|
+
};
|
|
139
|
+
const unknownHandle = () => result("unknown_handle", "not prepared in this process, expired from bounded retention, or invalid handle");
|
|
140
|
+
return {
|
|
141
|
+
async prepare(request, caller) {
|
|
142
|
+
if (closed || !relay || !validSigner)
|
|
143
|
+
return result("misconfigured", "Configure the explicit relay and registered Ed25519 application signer, then reload; no BLS/chain/content fallback");
|
|
144
|
+
if (!request || typeof request !== "object" || Array.isArray(request))
|
|
145
|
+
return result("refused", "invalid_request; message fields required");
|
|
146
|
+
let bytes;
|
|
147
|
+
const recipient = request.recipient, channel = request.channel;
|
|
148
|
+
try {
|
|
149
|
+
if (typeof recipient !== "string" || !isValidPrincipalName(recipient) || typeof channel !== "string" ||
|
|
150
|
+
!/^[A-Za-z0-9][A-Za-z0-9._-]{0,255}$/.test(channel))
|
|
151
|
+
throw new Error();
|
|
152
|
+
bytes = payload(request);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return result("refused", "invalid_request; bounded recipient/channel and exactly one lossless text or canonical base64 payload required; no caller metadata/nonce/time/URL");
|
|
156
|
+
}
|
|
157
|
+
const linked = signals(caller);
|
|
158
|
+
let reserved = false;
|
|
159
|
+
try {
|
|
160
|
+
check(linked.signal);
|
|
161
|
+
prune(sample().mono);
|
|
162
|
+
if (entries.size + pending >= P2P_MAX_HANDLES)
|
|
163
|
+
return result("session_full", "bounded session store full; disposal releases artifacts, but capacity returns only after public-summary retention expiry");
|
|
164
|
+
pending++;
|
|
165
|
+
reserved = true;
|
|
166
|
+
let registered;
|
|
167
|
+
try {
|
|
168
|
+
registered = await registration(linked.signal);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return result(linked.signal.aborted ? "cancelled" : "registration_unavailable", "No message signed or sent; current application-key registration could not be established");
|
|
172
|
+
}
|
|
173
|
+
if (registered !== "ok")
|
|
174
|
+
return result("refused", registered);
|
|
175
|
+
check(linked.signal);
|
|
176
|
+
const time = sample();
|
|
177
|
+
const nonce = randomBytes(16);
|
|
178
|
+
try {
|
|
179
|
+
const fields = { sender: identity, keyType: "Ed25519", keyLabel: app.signer.keyLabel,
|
|
180
|
+
recipient, channel, timestamp: BigInt(time.epoch), nonce, payload: bytes };
|
|
181
|
+
const body = Object.freeze(p2pRelayBody(app.signer, fields));
|
|
182
|
+
if (!/^[0-9a-f]{128}$/.test(body.signature))
|
|
183
|
+
throw new Error();
|
|
184
|
+
check(linked.signal);
|
|
185
|
+
const afterSign = sample();
|
|
186
|
+
if (afterSign.mono < time.mono || afterSign.mono >= time.mono + P2P_PREPARED_TTL_MS ||
|
|
187
|
+
afterSign.epoch < time.epoch || afterSign.epoch >= time.epoch + P2P_PREPARED_TTL_MS)
|
|
188
|
+
throw new Error();
|
|
189
|
+
const handle = `p2p_${randomBytes(24).toString("hex")}`;
|
|
190
|
+
const summary = Object.freeze({ handle,
|
|
191
|
+
fingerprint: bytesToHex(p2pSignable(fields)), fingerprintScope: "canonical-p2p-message-digest",
|
|
192
|
+
sender: identity, keyType: "Ed25519", keyLabel: fields.keyLabel, recipient, channel,
|
|
193
|
+
timestamp: fields.timestamp.toString(10), nonce: bytesToHex(nonce), expiresAt: String(time.epoch + P2P_PREPARED_TTL_MS),
|
|
194
|
+
payloadBytes: bytes.length, payloadSha256: createHash("sha256").update(bytes).digest("hex") });
|
|
195
|
+
const entry = { summary, body, state: "prepared", createdMono: time.mono, expiresMono: time.mono + P2P_PREPARED_TTL_MS };
|
|
196
|
+
entry.expiryTimer = setTimeout(() => { entry.body = undefined; if (entry.state === "prepared")
|
|
197
|
+
entry.state = "expired"; }, P2P_PREPARED_TTL_MS);
|
|
198
|
+
entry.expiryTimer.unref();
|
|
199
|
+
entry.retireTimer = setTimeout(() => { if (entry.state !== "attempting") {
|
|
200
|
+
clear(entry);
|
|
201
|
+
entries.delete(handle);
|
|
202
|
+
} }, P2P_SUMMARY_TTL_MS);
|
|
203
|
+
entry.retireTimer.unref();
|
|
204
|
+
entries.set(handle, entry);
|
|
205
|
+
return { kind: "prepared", message: summary, note: "Signed locally only; no relay or chain submit. Send once explicitly within ten seconds. " + NO_RETRY };
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
nonce.fill(0);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return result(linked.signal.aborted ? "cancelled" : "refused", "No outbound send; invalid trusted clock, signing failure or cancellation");
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
bytes.fill(0);
|
|
216
|
+
linked.release();
|
|
217
|
+
if (reserved)
|
|
218
|
+
pending--;
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
async send(handle, caller) {
|
|
222
|
+
if (closed || !relay)
|
|
223
|
+
return result("misconfigured", "Published SDK relay transport is not configured; no fallback");
|
|
224
|
+
if (typeof handle !== "string" || !HANDLE.test(handle))
|
|
225
|
+
return unknownHandle();
|
|
226
|
+
const entry = entries.get(handle);
|
|
227
|
+
if (!entry)
|
|
228
|
+
return unknownHandle();
|
|
229
|
+
if (entry.state === "disposed")
|
|
230
|
+
return result("disposed", "message disposed; not sent again", entry.summary);
|
|
231
|
+
if (entry.state !== "prepared" && entry.state !== "expired")
|
|
232
|
+
return result("already_attempted", "this handle's send attempt was already reserved; no second send", entry.summary);
|
|
233
|
+
const body = entry.body;
|
|
234
|
+
// Reserve BEFORE any await, including readonly key checks. Every exit consumes this call.
|
|
235
|
+
entry.state = "attempting";
|
|
236
|
+
entry.body = undefined;
|
|
237
|
+
clearTimeout(entry.expiryTimer);
|
|
238
|
+
const linked = signals(caller);
|
|
239
|
+
let outbound = false;
|
|
240
|
+
let budgetExpired = false;
|
|
241
|
+
let sendDeadline;
|
|
242
|
+
try {
|
|
243
|
+
check(linked.signal);
|
|
244
|
+
if (!body || !fresh(entry))
|
|
245
|
+
return result("expired", "prepared message expired or trusted clock moved backwards; no send", entry.summary);
|
|
246
|
+
let registered;
|
|
247
|
+
try {
|
|
248
|
+
registered = await registration(linked.signal);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return result(linked.signal.aborted ? "cancelled" : "registration_unavailable", "No relay attempt; registration check unavailable/cancelled", entry.summary);
|
|
252
|
+
}
|
|
253
|
+
if (entry.disposed)
|
|
254
|
+
return result("disposed", "message disposed during pre-send checks; no relay attempt", entry.summary);
|
|
255
|
+
if (registered !== "ok")
|
|
256
|
+
return result("refused", registered, entry.summary);
|
|
257
|
+
check(linked.signal);
|
|
258
|
+
const time = sample();
|
|
259
|
+
if (!fresh(entry, time))
|
|
260
|
+
return result("expired", "message became stale while checking registration; no send", entry.summary);
|
|
261
|
+
const age = Math.max(time.mono - entry.createdMono, Number(BigInt(time.epoch) - BigInt(entry.summary.timestamp)));
|
|
262
|
+
const remaining = Math.floor(P2P_FRESHNESS_WINDOW_MS - age) - 1;
|
|
263
|
+
if (remaining <= 0)
|
|
264
|
+
return result("expired", "no remaining default receiver freshness budget; no send", entry.summary);
|
|
265
|
+
// Derived from the ORIGINAL timestamp/monotonic age, never a fresh nonce or renewed TTL.
|
|
266
|
+
// The SDK also retains its own bounded P2P send budget. Neither implies recipient arrival.
|
|
267
|
+
sendDeadline = setTimeout(() => { budgetExpired = true; linked.abort(); }, remaining);
|
|
268
|
+
sendDeadline.unref();
|
|
269
|
+
outbound = true;
|
|
270
|
+
entry.outbound = true;
|
|
271
|
+
const raw = await relay(body, { signal: linked.signal });
|
|
272
|
+
if (budgetExpired)
|
|
273
|
+
return result("unknown", "freshness_budget_exhausted", entry.summary);
|
|
274
|
+
if (!raw || typeof raw !== "object")
|
|
275
|
+
return result("unknown", "malformed SDK outcome", entry.summary);
|
|
276
|
+
const r = raw;
|
|
277
|
+
const count = (n) => typeof n === "number" && Number.isInteger(n) && n >= 0 && n <= 2_147_483_647;
|
|
278
|
+
if (r.kind === "handed" && count(r.peers) && count(r.destinationsHeld) && r.destinationsHeld <= r.peers)
|
|
279
|
+
return { kind: "handed", peers: r.peers, destinationsHeld: r.destinationsHeld, message: entry.summary, note: NO_RETRY };
|
|
280
|
+
if (r.kind === "unsupported" && [404, 405, 501].includes(r.httpStatus))
|
|
281
|
+
return { kind: "unsupported", httpStatus: r.httpStatus, message: entry.summary, note: NO_RETRY };
|
|
282
|
+
if (r.kind === "refused" && typeof r.reason === "string" && ["not-configured", "invalid-message", "too-large", "cancelled",
|
|
283
|
+
"bad-request", "unresolvable-recipient", "unknown-channel", "unauthorized", "not-delivered"].includes(r.reason))
|
|
284
|
+
return result("refused", r.reason, entry.summary);
|
|
285
|
+
if (r.kind === "unknown" && typeof r.reason === "string" && ["transport", "cancelled", "timeout", "malformed-response",
|
|
286
|
+
"response-too-large", "http-error", "internal"].includes(r.reason))
|
|
287
|
+
return result("unknown", r.reason, entry.summary);
|
|
288
|
+
return result("unknown", "unclassified SDK outcome", entry.summary);
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return result(outbound ? "unknown" : linked.signal.aborted ? "cancelled" : "refused", outbound ? "Relay outcome uncertain; no second attempt" : "No relay send; cancellation or invalid trusted clock", entry.summary);
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
clearTimeout(sendDeadline);
|
|
295
|
+
entry.state = entry.disposed ? "disposed" : "attempted";
|
|
296
|
+
linked.release();
|
|
297
|
+
try {
|
|
298
|
+
prune(sample().mono);
|
|
299
|
+
}
|
|
300
|
+
catch { /* keep bounded public summary when clock is invalid */ }
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
dispose(handle) {
|
|
304
|
+
if (typeof handle !== "string" || !HANDLE.test(handle))
|
|
305
|
+
return unknownHandle();
|
|
306
|
+
const entry = entries.get(handle);
|
|
307
|
+
if (!entry)
|
|
308
|
+
return unknownHandle();
|
|
309
|
+
if (entry.state === "attempting" && entry.outbound)
|
|
310
|
+
return result("refused", "in_flight; use client cancellation and wait for its outcome before disposal", entry.summary);
|
|
311
|
+
entry.disposed = true;
|
|
312
|
+
entry.body = undefined;
|
|
313
|
+
clearTimeout(entry.expiryTimer);
|
|
314
|
+
entry.state = "disposed";
|
|
315
|
+
return result("disposed", "signed artifact released locally; this cannot recall any prior relay handoff", entry.summary);
|
|
316
|
+
},
|
|
317
|
+
close() {
|
|
318
|
+
closed = true;
|
|
319
|
+
lifetime.abort();
|
|
320
|
+
for (const entry of entries.values())
|
|
321
|
+
clear(entry);
|
|
322
|
+
entries.clear();
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=p2p.js.map
|
package/dist/p2p.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p2p.js","sourceRoot":"","sources":["../src/p2p.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ProofAttempt {
|
|
2
|
+
/** Mark conservatively at the final trusted-state check before signing. */
|
|
3
|
+
consume(): void;
|
|
4
|
+
/** Release a declined/unsigned reservation, retain a consumed/uncertain proof until expiry. */
|
|
5
|
+
finish(): void;
|
|
6
|
+
}
|
|
7
|
+
export interface ProofAttemptGuard {
|
|
8
|
+
reserve(binding: {
|
|
9
|
+
audience: string;
|
|
10
|
+
principal: string;
|
|
11
|
+
keyLabel: string;
|
|
12
|
+
serverNonce: string;
|
|
13
|
+
expiresAt: number;
|
|
14
|
+
}, nowMs: number): ProofAttempt | undefined;
|
|
15
|
+
}
|
|
16
|
+
/** Shared per-stdio-session anti-retry/concurrency guard, NOT the service's durable replay defense.
|
|
17
|
+
* Login and caller-described HTTP must not re-sign the same service nonce through different tools. */
|
|
18
|
+
export declare function createProofAttemptGuard(): ProofAttemptGuard;
|
|
19
|
+
//# sourceMappingURL=proof-attempts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-attempts.d.ts","sourceRoot":"","sources":["../src/proof-attempts.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,OAAO,IAAI,IAAI,CAAC;IAChB,+FAA+F;IAC/F,MAAM,IAAI,IAAI,CAAC;CAChB;AACD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;CAC9J;AAED;sGACsG;AACtG,wBAAgB,uBAAuB,IAAI,iBAAiB,CAmB3D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/** Shared per-stdio-session anti-retry/concurrency guard, NOT the service's durable replay defense.
|
|
3
|
+
* Login and caller-described HTTP must not re-sign the same service nonce through different tools. */
|
|
4
|
+
export function createProofAttemptGuard() {
|
|
5
|
+
const attempts = new Map();
|
|
6
|
+
return { reserve(binding, nowMs) {
|
|
7
|
+
const now = Math.floor(nowMs / 1000);
|
|
8
|
+
for (const [key, value] of attempts)
|
|
9
|
+
if (!value.pending && value.expires <= now)
|
|
10
|
+
attempts.delete(key);
|
|
11
|
+
const key = createHash("sha256").update(JSON.stringify([binding.audience, binding.principal, binding.keyLabel, binding.serverNonce])).digest("hex");
|
|
12
|
+
if (attempts.has(key) || attempts.size >= 1024)
|
|
13
|
+
return undefined;
|
|
14
|
+
const state = { expires: binding.expiresAt, pending: true };
|
|
15
|
+
attempts.set(key, state);
|
|
16
|
+
let consumed = false;
|
|
17
|
+
return {
|
|
18
|
+
consume() { consumed = true; },
|
|
19
|
+
finish() {
|
|
20
|
+
if (attempts.get(key) !== state)
|
|
21
|
+
return;
|
|
22
|
+
if (consumed)
|
|
23
|
+
state.pending = false;
|
|
24
|
+
else
|
|
25
|
+
attempts.delete(key);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
} };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=proof-attempts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-attempts.js","sourceRoot":"","sources":["../src/proof-attempts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAYzC;sGACsG;AACtG,MAAM,UAAU,uBAAuB;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiD,CAAC;IAC1E,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG;oBAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtG,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpJ,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI;gBAAE,OAAO,SAAS,CAAC;YACjE,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC5D,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,OAAO;gBACL,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;gBAC9B,MAAM;oBACJ,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;wBAAE,OAAO;oBACxC,IAAI,QAAQ;wBAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;;wBAC/B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;aACF,CAAC;QACJ,CAAC,EAAE,CAAC;AACN,CAAC"}
|
package/dist/read.d.ts
CHANGED
|
@@ -26,6 +26,9 @@ export interface ChainReads {
|
|
|
26
26
|
blockHeight: number;
|
|
27
27
|
appliedRound: number | null;
|
|
28
28
|
heardRound: number;
|
|
29
|
+
/** #9 — `true` only from a node that refuses any tx lacking its sender's AUTHORIZE auth.
|
|
30
|
+
* Absent (older SDK/node), `null` or `false` all mean unsupported; never defaulted. */
|
|
31
|
+
senderAuthorizationRequired?: boolean | null;
|
|
29
32
|
}>;
|
|
30
33
|
getIdentity(name: string): Promise<{
|
|
31
34
|
nodeId: string;
|
|
@@ -52,6 +55,20 @@ export interface ChainReads {
|
|
|
52
55
|
searchPrincipalPage?(q: string, options?: SearchOptions): Promise<SearchPage>;
|
|
53
56
|
/** SDK 0.21+ / node #101. Missing API refuses, never falls back to a feed scan. */
|
|
54
57
|
getTransaction?(txId: string): Promise<TransactionObservation>;
|
|
58
|
+
/** #10 — one explorer page each. Optional so a client without them refuses, never scans. */
|
|
59
|
+
listLedgerOwners?(limit?: number, offset?: number): Promise<{
|
|
60
|
+
owners: Array<{
|
|
61
|
+
ledgerId: string;
|
|
62
|
+
ownerNodeId: string;
|
|
63
|
+
}>;
|
|
64
|
+
total: number;
|
|
65
|
+
}>;
|
|
66
|
+
getKeys?(limit?: number, offset?: number): Promise<Array<{
|
|
67
|
+
nodeId: string;
|
|
68
|
+
keyType: string;
|
|
69
|
+
label: string;
|
|
70
|
+
publicKeyHex: string;
|
|
71
|
+
}>>;
|
|
55
72
|
}
|
|
56
73
|
export interface SearchOptions {
|
|
57
74
|
mode?: "prefix" | "contains";
|
|
@@ -82,6 +99,17 @@ export interface SearchPage {
|
|
|
82
99
|
* back. 200 is the node's own clamp, so the tool never asks for what it cannot get. */
|
|
83
100
|
export declare const DEFAULT_LIMIT = 20;
|
|
84
101
|
export declare const MAX_LIMIT = 200;
|
|
102
|
+
/** The node's clamp for the ledger-owners and keys explorer pages (`ExplorerApiHandler`). */
|
|
103
|
+
export declare const INVENTORY_MAX_LIMIT = 100;
|
|
104
|
+
/** The node parses `offset` as a JVM Int and reads anything larger as 0 — page one, silently. */
|
|
105
|
+
export declare const MAX_OFFSET = 2147483647;
|
|
106
|
+
/** Exact page arguments, or why not. Only an ABSENT value takes the default; a present one must
|
|
107
|
+
* already be an in-range safe integer. Nothing is clamped, coerced or rounded: the node would
|
|
108
|
+
* clamp silently, and an answer to a page nobody asked for reads as the page they did. */
|
|
109
|
+
export declare function pageArgs(limit: unknown, offset: unknown, maxLimit: number): {
|
|
110
|
+
limit: number;
|
|
111
|
+
offset: number;
|
|
112
|
+
} | string;
|
|
85
113
|
/** The three heights a node actually has, and what each one answers.
|
|
86
114
|
*
|
|
87
115
|
* ⚠️ `height` ALONE IS THE TRAP THIS REPLACES. It used to return one number — the held tip —
|
|
@@ -102,7 +130,38 @@ export interface HeightReport extends NodeHeights {
|
|
|
102
130
|
}
|
|
103
131
|
export declare function chainHeight(reads: ChainReads): Promise<ToolResult<HeightReport>>;
|
|
104
132
|
export declare function transaction(reads: Pick<ChainReads, "getTransaction">, txId: unknown): Promise<ToolResult<TransactionObservation>>;
|
|
105
|
-
|
|
133
|
+
/** One newest-first page of the explorer feed at the exact validated offset. A display tail, never
|
|
134
|
+
* a lookup: an empty page says nothing about whether a transaction exists. */
|
|
135
|
+
export declare function recent(reads: ChainReads, limit?: unknown, offset?: unknown): Promise<ToolResult<{
|
|
136
|
+
transactions: FeedTx[];
|
|
137
|
+
limit: number;
|
|
138
|
+
offset: number;
|
|
139
|
+
}>>;
|
|
140
|
+
/** One page of the chain-wide ledger-owner listing, exactly as the node orders and reports it.
|
|
141
|
+
* `ownerNodeId` carries no identity/group kind on this row, so none is invented here.
|
|
142
|
+
*
|
|
143
|
+
* ⚠️ NO TOTAL. SDK 0.21.0 substitutes `0` for an absent node total, so a zero cannot be told from
|
|
144
|
+
* a missing field; a count that may be fabricated is not reported. */
|
|
145
|
+
export declare function ledgerOwnersPage(reads: ChainReads, limit?: unknown, offset?: unknown): Promise<ToolResult<{
|
|
146
|
+
owners: Array<{
|
|
147
|
+
ledgerId: string;
|
|
148
|
+
ownerNodeId: string;
|
|
149
|
+
}>;
|
|
150
|
+
limit: number;
|
|
151
|
+
offset: number;
|
|
152
|
+
}>>;
|
|
153
|
+
/** One page of the chain-wide registered PUBLIC key metadata. Never the route to one identity's
|
|
154
|
+
* keys — that is `keys(name)`, a direct read. The SDK returns no total for this page. */
|
|
155
|
+
export declare function chainKeysPage(reads: ChainReads, limit?: unknown, offset?: unknown): Promise<ToolResult<{
|
|
156
|
+
keys: Array<{
|
|
157
|
+
nodeId: string;
|
|
158
|
+
keyType: string;
|
|
159
|
+
label: string;
|
|
160
|
+
publicKeyHex: string;
|
|
161
|
+
}>;
|
|
162
|
+
limit: number;
|
|
163
|
+
offset: number;
|
|
164
|
+
}>>;
|
|
106
165
|
/** The one read with a DEFINITIVE negative: the chain answered and has no such identity. The
|
|
107
166
|
* height it answered at travels with it, so a lagging node is visible rather than confident.
|
|
108
167
|
*
|
package/dist/read.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEvG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,gFAAgF;AAChF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED;;mBAEmB;AACnB,MAAM,WAAW,UAAU;IACzB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC;;;kBAGc;IACd,UAAU,IAAI,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
|