@ashlar-blue/x402-trust 0.5.9 → 0.5.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/agent-switchboard.d.ts +1 -1
  4. package/dist/agent-switchboard.js +2 -2
  5. package/dist/agent-switchboard.js.map +1 -1
  6. package/dist/attested-directory.js +1 -1
  7. package/dist/attested-directory.js.map +1 -1
  8. package/dist/badges.js +1 -1
  9. package/dist/badges.js.map +1 -1
  10. package/dist/catalog-mcp.d.ts +1 -1
  11. package/dist/catalog-mcp.js +4 -4
  12. package/dist/catalog-mcp.js.map +1 -1
  13. package/dist/census-reconcile.js +1 -1
  14. package/dist/census-reconcile.js.map +1 -1
  15. package/dist/cli.js +1 -1
  16. package/dist/cli.js.map +1 -1
  17. package/dist/client-core.d.ts +233 -0
  18. package/dist/client-core.d.ts.map +1 -0
  19. package/dist/client-core.js +431 -0
  20. package/dist/client-core.js.map +1 -0
  21. package/dist/directory-classify.js +1 -1
  22. package/dist/directory-classify.js.map +1 -1
  23. package/dist/discovery.d.ts +6 -0
  24. package/dist/discovery.d.ts.map +1 -1
  25. package/dist/discovery.js +29 -10
  26. package/dist/discovery.js.map +1 -1
  27. package/dist/dynamic-discovery.js +1 -1
  28. package/dist/dynamic-discovery.js.map +1 -1
  29. package/dist/evidence-ref.js +1 -1
  30. package/dist/evidence-ref.js.map +1 -1
  31. package/dist/facilitator-config.d.ts +1 -1
  32. package/dist/facilitator-config.js +2 -2
  33. package/dist/facilitator-config.js.map +1 -1
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/institutional-gate.d.ts +72 -0
  39. package/dist/institutional-gate.d.ts.map +1 -0
  40. package/dist/institutional-gate.js +240 -0
  41. package/dist/institutional-gate.js.map +1 -0
  42. package/dist/institutional-onboarding.d.ts +86 -0
  43. package/dist/institutional-onboarding.d.ts.map +1 -0
  44. package/dist/institutional-onboarding.js +278 -0
  45. package/dist/institutional-onboarding.js.map +1 -0
  46. package/dist/isda-cdm.js +1 -1
  47. package/dist/isda-cdm.js.map +1 -1
  48. package/dist/manifest-sig.d.ts +1 -1
  49. package/dist/manifest-sig.js +2 -2
  50. package/dist/manifest-sig.js.map +1 -1
  51. package/dist/mcp-server.js +2 -2
  52. package/dist/mcp-server.js.map +1 -1
  53. package/dist/merkle-transcript.js +1 -1
  54. package/dist/merkle-transcript.js.map +1 -1
  55. package/dist/open-catalog.js +1 -1
  56. package/dist/open-catalog.js.map +1 -1
  57. package/dist/reconcile.js +1 -1
  58. package/dist/reconcile.js.map +1 -1
  59. package/dist/trust-sdk.d.ts +3 -2
  60. package/dist/trust-sdk.d.ts.map +1 -1
  61. package/dist/trust-sdk.js +5 -3
  62. package/dist/trust-sdk.js.map +1 -1
  63. package/dist/types.d.ts +7 -4
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js +4 -3
  66. package/dist/types.js.map +1 -1
  67. package/package.json +4 -3
@@ -0,0 +1,431 @@
1
+ // GENERATED from src/x402/client-core.ts by scripts/sdk/sync-sdk.ts — do not edit here.
2
+ // The canonical module is the one Ashlar Blue runs in production; this is a copy so
3
+ // that what we publish and what we run cannot diverge. Edit the canonical file.
4
+ /**
5
+ * Ashlar Blue — Official Thin-Client SDK (`AshlarClient`)
6
+ *
7
+ * Provides unified, zero-dependency access to:
8
+ * 1. Pre-flight trust verification (`checkService`, `safeToPay`)
9
+ * 2. Automated RFC 9110 HTTP 402 caller-pays execution
10
+ * 3. Client-side agent spend mandates & budget vouchers
11
+ * 4. IETF SCITT notary calldata parsing & Merkle receipts
12
+ * 5. Audit transcripts & offline inclusion proofs
13
+ *
14
+ * Copyright (c) 2026 Corrente Labs, Inc. All rights reserved.
15
+ * Licensed under the Apache License, Version 2.0.
16
+ */
17
+ import { Buffer } from 'node:buffer';
18
+ import { createHash, createHmac, randomBytes } from 'node:crypto';
19
+ import { checkService, verifyReceipt, verifyDirectoryEntry, verifyReconcileRow, Transcript, } from './trust-sdk.js';
20
+ import { resolveX402, } from './discovery.js';
21
+ import { encodeEvidenceRef, parseEvidenceRef } from './evidence-ref.js';
22
+ import { ASHLAR_INSTITUTIONAL_CONFIG, } from './institutional-gate.js';
23
+ import { isRetailEmailDomain, } from './institutional-onboarding.js';
24
+ export class PaymentRequiredError extends Error {
25
+ challenge;
26
+ response;
27
+ constructor(message, challenge, response) {
28
+ super(message);
29
+ this.challenge = challenge;
30
+ this.response = response;
31
+ this.name = 'PaymentRequiredError';
32
+ }
33
+ }
34
+ export class InstitutionalAccessRequiredError extends Error {
35
+ response;
36
+ details;
37
+ statusCode = 403;
38
+ policy = 'INSTITUTIONAL_ONLY_TIER';
39
+ acceptedCredentials = [
40
+ 'XRPL_SOULBOUND_NFTOKEN_XLS20',
41
+ 'FLARE_ATTESTED_CREDENTIAL_GATE_NFT',
42
+ 'INTEL_TDX_MRENCLAVE_LEI_QUOTE',
43
+ 'ISDA_WHOLESALE_QIB_TOKEN',
44
+ ];
45
+ onboardingUrl = 'https://ashlar.blue/compliance.html';
46
+ constructor(message = 'Ashlar Blue is strictly institutional infrastructure. Retail and commercial traffic without an attested Ashlar Institutional Credential NFT or ISDA wholesale license is refused.', response, details) {
47
+ super(message);
48
+ this.response = response;
49
+ this.details = details;
50
+ this.name = 'InstitutionalAccessRequiredError';
51
+ }
52
+ }
53
+ // ──────────────────── ASHLAR CLIENT CLASS ────────────────────
54
+ export class AshlarClient {
55
+ baseUrl;
56
+ apiKey;
57
+ privateKey;
58
+ signerFn;
59
+ credential;
60
+ defaultRail;
61
+ timeoutMs;
62
+ fetchFn;
63
+ constructor(options = {}) {
64
+ this.baseUrl = (options.baseUrl || 'https://api.ashlar.blue').replace(/\/+$/, '');
65
+ this.apiKey = options.apiKey || (typeof process !== 'undefined' ? process.env?.ASHLAR_API_KEY : undefined);
66
+ this.privateKey = options.privateKey || (typeof process !== 'undefined' ? process.env?.ASHLAR_PRIVATE_KEY : undefined);
67
+ this.signerFn = options.signer;
68
+ this.credential = options.credential || (typeof process !== 'undefined' ? process.env?.ASHLAR_CREDENTIAL : undefined);
69
+ this.defaultRail = options.defaultRail || 'eip155:8453';
70
+ this.timeoutMs = options.timeoutMs || 15_000;
71
+ this.fetchFn = options.fetch || globalThis.fetch.bind(globalThis);
72
+ }
73
+ // ──────────────────── INSTITUTIONAL ONBOARDING & TURNSTILE ────────────────────
74
+ onboard = {
75
+ /**
76
+ * Submit a formal institutional onboarding application.
77
+ * Strictly blocks retail emails and requires ISO 17442 Legal Entity Identifier (LEI).
78
+ */
79
+ apply: async (req) => {
80
+ if (isRetailEmailDomain(req.officialEmail)) {
81
+ throw new InstitutionalAccessRequiredError('Ashlar Blue is strictly institutional infrastructure. Retail email domains (@gmail, @yahoo, etc.) are prohibited.');
82
+ }
83
+ const res = await this.fetchFn(`${this.baseUrl}/onboarding/apply`, {
84
+ method: 'POST',
85
+ headers: { 'Content-Type': 'application/json' },
86
+ body: JSON.stringify(req),
87
+ });
88
+ return res.json();
89
+ },
90
+ /**
91
+ * Issue an approved soulbound credential NFT once vetted by institutional compliance.
92
+ */
93
+ issue: async (ticketId) => {
94
+ const res = await this.fetchFn(`${this.baseUrl}/onboarding/issue`, {
95
+ method: 'POST',
96
+ headers: { 'Content-Type': 'application/json' },
97
+ body: JSON.stringify({ ticketId }),
98
+ });
99
+ return res.json();
100
+ },
101
+ /**
102
+ * Check the status of a pending institutional intake ticket.
103
+ */
104
+ getStatus: async (ticketId) => {
105
+ const res = await this.fetchFn(`${this.baseUrl}/onboarding/status/${encodeURIComponent(ticketId)}`, {
106
+ method: 'GET',
107
+ });
108
+ return res.json();
109
+ },
110
+ };
111
+ // ──────────────────── TRUST & VERIFICATION NAMESPACE ────────────────────
112
+ trust = {
113
+ /**
114
+ * Pre-flight trust probe: resolves domain manifest, checks same-origin attestation,
115
+ * executes live /supported parity probe, and returns an authoritative safeToPay verdict.
116
+ */
117
+ checkService: async (domain, options) => {
118
+ return checkService(domain, options);
119
+ },
120
+ /**
121
+ * Resolves the canonical x402 discovery manifest via DNS TXT or /.well-known/x402.
122
+ */
123
+ resolveX402: async (domain, options) => {
124
+ return resolveX402(domain, options);
125
+ },
126
+ /**
127
+ * Offline Merkle inclusion verification (RFC 6962). Proves that an entry exists
128
+ * within a signed root with zero trust in third parties.
129
+ */
130
+ verifyReceipt: (proof) => {
131
+ return verifyReceipt(proof);
132
+ },
133
+ /**
134
+ * Verifies an entry within an attested platform directory census root.
135
+ */
136
+ verifyDirectoryEntry: (entry, index, size, proof, outputRoot) => {
137
+ return verifyDirectoryEntry(entry, index, size, proof, outputRoot);
138
+ },
139
+ /**
140
+ * Verifies a single reconciliation audit row against a signed census root.
141
+ */
142
+ verifyReconcileRow: (row, index, size, proof, rowsRoot) => {
143
+ return verifyReconcileRow(row, index, size, proof, rowsRoot);
144
+ },
145
+ };
146
+ // ──────────────────── TRANSCRIPTS & AUDIT PROOFS ────────────────────
147
+ /**
148
+ * Creates an append-only audit transcript accumulator for session work verification.
149
+ */
150
+ createTranscript() {
151
+ return new Transcript();
152
+ }
153
+ // ──────────────────── NOTARY & SCITT PROOFS ────────────────────
154
+ notary = {
155
+ /**
156
+ * Validates a SHA-256 digest string ("sha256:<64 hex chars>").
157
+ */
158
+ parseDigest: (input) => {
159
+ if (typeof input !== 'string')
160
+ throw new Error('digest must be string of form sha256:<64 hex>');
161
+ const d = input.trim();
162
+ if (!/^sha256:[0-9a-f]{64}$/.test(d)) {
163
+ throw new Error('digest must be exactly "sha256:" + 64 lowercase hex chars');
164
+ }
165
+ return d;
166
+ },
167
+ /**
168
+ * Formats canonical IETF SCITT / x402 notary anchor calldata ("x402note/1;sha256:...;for=0x...").
169
+ */
170
+ formatCalldata: (digest, payer) => {
171
+ const d = this.notary.parseDigest(digest);
172
+ const p = payer.toLowerCase();
173
+ if (!/^0x[0-9a-f]{40}$/.test(p))
174
+ throw new Error('payer must be 20-byte hex address');
175
+ return `x402note/1;${d};for=${p}`;
176
+ },
177
+ /**
178
+ * Parses and verifies notary anchor calldata string.
179
+ */
180
+ parseCalldata: (data) => {
181
+ const parts = data.split(';');
182
+ if (parts.length !== 3 || parts[0] !== 'x402note/1')
183
+ return null;
184
+ if (!/^sha256:[0-9a-f]{64}$/.test(parts[1]))
185
+ return null;
186
+ const forMatch = /^for=(0x[0-9a-f]{40})$/.exec(parts[2]);
187
+ if (!forMatch)
188
+ return null;
189
+ return { digest: parts[1], payer: forMatch[1] };
190
+ },
191
+ /**
192
+ * Formats portable evidence reference string (x402ev/1).
193
+ */
194
+ formatEvidenceRef: (ref) => {
195
+ return encodeEvidenceRef(ref);
196
+ },
197
+ /**
198
+ * Parses portable evidence reference string (x402ev/1).
199
+ */
200
+ parseEvidenceRef: (s) => {
201
+ return parseEvidenceRef(s);
202
+ },
203
+ };
204
+ // ──────────────────── AGENT SPEND MANDATES ────────────────────
205
+ mandates = {
206
+ /**
207
+ * Computes canonical deterministic SHA-256 digest for a mandate voucher.
208
+ */
209
+ computeVoucherDigest: (params) => {
210
+ const canonical = JSON.stringify({
211
+ amount: params.amount,
212
+ currency: params.currency || 'USD',
213
+ mandateId: params.mandateId,
214
+ nonce: params.nonce || '0',
215
+ payer: params.payer.toLowerCase(),
216
+ recipient: params.recipient.toLowerCase(),
217
+ validUntil: params.validUntil,
218
+ });
219
+ return createHash('sha256').update(canonical).digest('hex');
220
+ },
221
+ /**
222
+ * Creates a signed agent spending voucher bounded by a mandate leash.
223
+ */
224
+ signVoucher: (params, secretKey) => {
225
+ const key = secretKey || this.privateKey;
226
+ if (!key) {
227
+ throw new Error('Signing a mandate voucher requires a privateKey in client options or parameter');
228
+ }
229
+ const nonce = params.nonce || randomBytes(16).toString('hex');
230
+ const voucherParams = { ...params, nonce };
231
+ const digest = this.mandates.computeVoucherDigest(voucherParams);
232
+ const signature = createHmac('sha256', key).update(digest).digest('hex');
233
+ return {
234
+ ...voucherParams,
235
+ digest,
236
+ signature,
237
+ };
238
+ },
239
+ /**
240
+ * Verifies a signed agent spending voucher offline.
241
+ */
242
+ verifyVoucher: (voucher, secretKey, nowSeconds) => {
243
+ const key = secretKey || this.privateKey;
244
+ if (!key)
245
+ return false;
246
+ const now = nowSeconds !== undefined ? nowSeconds : Math.floor(Date.now() / 1000);
247
+ if (voucher.validUntil < now)
248
+ return false;
249
+ const expectedDigest = this.mandates.computeVoucherDigest(voucher);
250
+ if (voucher.digest !== expectedDigest)
251
+ return false;
252
+ const expectedSignature = createHmac('sha256', key).update(expectedDigest).digest('hex');
253
+ return voucher.signature === expectedSignature;
254
+ },
255
+ /**
256
+ * Creates a structured mandate envelope bounding an agent's authority.
257
+ */
258
+ createEnvelope: (params) => {
259
+ const envelopeId = `mnd_${randomBytes(12).toString('hex')}`;
260
+ const createdAt = Math.floor(Date.now() / 1000);
261
+ const allowedRecipients = params.allowedRecipients ? params.allowedRecipients.map(r => r.toLowerCase()) : ['*'];
262
+ const allowedRails = params.allowedRails || ['eip155:8453'];
263
+ const principalId = params.principalId.toLowerCase();
264
+ const canonical = JSON.stringify({
265
+ allowedRails,
266
+ allowedRecipients,
267
+ createdAt,
268
+ currency: params.currency,
269
+ envelopeId,
270
+ maxSpend: params.maxSpend,
271
+ principalId,
272
+ validUntil: params.validUntil,
273
+ });
274
+ const digest = createHash('sha256').update(canonical).digest('hex');
275
+ return {
276
+ ...params,
277
+ principalId,
278
+ allowedRecipients,
279
+ allowedRails,
280
+ envelopeId,
281
+ createdAt,
282
+ digest,
283
+ };
284
+ },
285
+ };
286
+ // ──────────────────── AUTONOMOUS CALLER-PAYS HTTP 402 CLIENT ────────────────────
287
+ /**
288
+ * Executes a fetch request with automated RFC 9110 HTTP 402 challenge negotiation.
289
+ * If the endpoint requires payment, the client inspects requirements, validates safety bounds,
290
+ * signs the authorization payload via local signer, and re-dispatches with payment headers.
291
+ */
292
+ async fetchWithPayment(input, init, options = {}) {
293
+ // Prepare initial headers including institutional credentials
294
+ const initialHeaders = new Headers(init?.headers || {});
295
+ const cred = options.credential || this.credential;
296
+ if (cred) {
297
+ const credStr = typeof cred === 'string' ? cred : JSON.stringify(cred);
298
+ if (!initialHeaders.has('X-Ashlar-Credential-NFT')) {
299
+ initialHeaders.set('X-Ashlar-Credential-NFT', credStr);
300
+ }
301
+ if (!initialHeaders.has('X-Institutional-Token')) {
302
+ initialHeaders.set('X-Institutional-Token', credStr);
303
+ }
304
+ }
305
+ if (this.apiKey && !initialHeaders.has('Authorization')) {
306
+ initialHeaders.set('Authorization', `Bearer ${this.apiKey}`);
307
+ }
308
+ // Initial request
309
+ const res = await this.fetchFn(input, { ...init, headers: initialHeaders });
310
+ // Institutional Credential Gate refusal check (HTTP 403)
311
+ if (res.status === 403) {
312
+ let errorJson = null;
313
+ try {
314
+ errorJson = await res.clone().json();
315
+ }
316
+ catch { /* not json */ }
317
+ if (errorJson?.error === 'INSTITUTIONAL_CREDENTIAL_REQUIRED' || errorJson?.compliancePolicy === 'INSTITUTIONAL_ONLY_TIER') {
318
+ throw new InstitutionalAccessRequiredError(errorJson.message || ASHLAR_INSTITUTIONAL_CONFIG.POLICY_DISCLAIMER, res, errorJson);
319
+ }
320
+ }
321
+ // Not a 402? Return response directly
322
+ if (res.status !== 402) {
323
+ return { response: res };
324
+ }
325
+ // Parse 402 Payment Required Challenge
326
+ const challenge = await this.parse402Challenge(res);
327
+ if (!challenge.accepts || challenge.accepts.length === 0) {
328
+ throw new PaymentRequiredError('Received HTTP 402 Payment Required without valid payment options', challenge, res);
329
+ }
330
+ // Match preferred rail or default rail
331
+ const targetRail = options.network || this.defaultRail;
332
+ const requirement = challenge.accepts.find(a => a.network === targetRail) || challenge.accepts[0];
333
+ // Check safety constraints
334
+ if (options.expectPayTo && requirement.payTo.toLowerCase() !== options.expectPayTo.toLowerCase()) {
335
+ throw new Error(`Payment safety check failed: payTo ${requirement.payTo} does not match expected ${options.expectPayTo}`);
336
+ }
337
+ if (options.expectAsset && requirement.asset.toLowerCase() !== options.expectAsset.toLowerCase()) {
338
+ throw new Error(`Payment safety check failed: asset ${requirement.asset} does not match expected ${options.expectAsset}`);
339
+ }
340
+ if (options.maxAtomicAmount !== undefined) {
341
+ const max = BigInt(options.maxAtomicAmount);
342
+ const reqAmount = BigInt(requirement.amount);
343
+ if (reqAmount > max) {
344
+ throw new Error(`Payment safety check failed: required amount ${reqAmount} exceeds maximum budget ${max}`);
345
+ }
346
+ }
347
+ // Produce payment authorization signature
348
+ let signature = '';
349
+ if (this.signerFn) {
350
+ signature = await this.signerFn({
351
+ network: requirement.network,
352
+ amount: requirement.amount,
353
+ asset: requirement.asset,
354
+ payTo: requirement.payTo,
355
+ challenge,
356
+ });
357
+ }
358
+ else if (this.privateKey) {
359
+ // Local deterministic voucher signature
360
+ const payload = `${requirement.network}:${requirement.asset}:${requirement.payTo}:${requirement.amount}`;
361
+ signature = createHmac('sha256', this.privateKey).update(payload).digest('hex');
362
+ }
363
+ else {
364
+ // No signer provided
365
+ throw new PaymentRequiredError(`Payment required: ${requirement.amount} on ${requirement.network} (asset: ${requirement.asset}, payTo: ${requirement.payTo}). Provide privateKey or signer to automate payment.`, challenge, res);
366
+ }
367
+ // Construct payment payload header
368
+ const paymentHeaderJson = JSON.stringify({
369
+ x402Version: challenge.x402Version || 2,
370
+ network: requirement.network,
371
+ asset: requirement.asset,
372
+ amount: requirement.amount,
373
+ payTo: requirement.payTo,
374
+ signature,
375
+ });
376
+ const paymentHeaderB64 = Buffer.from(paymentHeaderJson, 'utf-8').toString('base64');
377
+ // Re-dispatch with dual payment headers (v1 X-PAYMENT and v2 payment-signature)
378
+ const retryHeaders = new Headers(initialHeaders);
379
+ retryHeaders.set('X-PAYMENT', paymentHeaderB64);
380
+ retryHeaders.set('payment-signature', paymentHeaderB64);
381
+ retryHeaders.set('Payment-Signature', signature);
382
+ const retryInit = {
383
+ ...init,
384
+ headers: retryHeaders,
385
+ };
386
+ const retryRes = await this.fetchFn(input, retryInit);
387
+ return {
388
+ response: retryRes,
389
+ paid: {
390
+ network: requirement.network,
391
+ amount: requirement.amount,
392
+ asset: requirement.asset,
393
+ payTo: requirement.payTo,
394
+ signature,
395
+ },
396
+ };
397
+ }
398
+ /**
399
+ * Parses an HTTP 402 response into a canonical PaymentChallenge object.
400
+ */
401
+ async parse402Challenge(response) {
402
+ // 1. Check PAYMENT-REQUIRED header (Coinbase x402 v2 Base64 format)
403
+ const header = response.headers.get('PAYMENT-REQUIRED') || response.headers.get('payment-required');
404
+ if (header) {
405
+ try {
406
+ const decoded = Buffer.from(header, 'base64').toString('utf-8');
407
+ return JSON.parse(decoded);
408
+ }
409
+ catch {
410
+ try {
411
+ return JSON.parse(header);
412
+ }
413
+ catch {
414
+ // Fall through to body
415
+ }
416
+ }
417
+ }
418
+ // 2. Check JSON response body
419
+ try {
420
+ const body = await response.clone().json();
421
+ if (body && typeof body === 'object') {
422
+ return body;
423
+ }
424
+ }
425
+ catch {
426
+ // Body is not JSON
427
+ }
428
+ return { error: 'Could not parse HTTP 402 payment requirements' };
429
+ }
430
+ }
431
+ //# sourceMappingURL=client-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-core.js","sourceRoot":"","sources":["../src/client-core.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // GENERATED from src/x402/directory-classify.ts by scripts/sdk/sync-sdk.ts — do not edit here.
2
- // The canonical module is the one FlareClaw runs in production; this is a copy so
2
+ // The canonical module is the one Ashlar Blue runs in production; this is a copy so
3
3
  // that what we publish and what we run cannot diverge. Edit the canonical file.
4
4
  /** A TXT answer with at least one non-blank string. `[]` and `[""]` are empty. */
5
5
  export function hasContent(a) {
@@ -1 +1 @@
1
- {"version":3,"file":"directory-classify.js","sourceRoot":"","sources":["../src/directory-classify.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,kFAAkF;AAClF,gFAAgF;AAkChF,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,CAAkB;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW;IACxC,0EAA0E;IAC1E,uEAAuE;IACvE,uDAAuD;IACvD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACH,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,yBAAyB;SACtG,CAAC;IACN,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO;YACH,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,0DAA0D;SACrE,CAAC;IACN,CAAC;IACD,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO;QACH,MAAM,EAAE,CAAC,CAAC,IAAI;QACd,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,cAAc;QAC1D,MAAM,EAAE,MAAM;YACV,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,wCAAwC;QAC9C,MAAM,EAAE,GAAG;KACd,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC"}
1
+ {"version":3,"file":"directory-classify.js","sourceRoot":"","sources":["../src/directory-classify.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,oFAAoF;AACpF,gFAAgF;AAkChF,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,CAAkB;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW;IACxC,0EAA0E;IAC1E,uEAAuE;IACvE,uDAAuD;IACvD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACH,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,yBAAyB;SACtG,CAAC;IACN,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO;YACH,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,0DAA0D;SACrE,CAAC;IACN,CAAC;IACD,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO;QACH,MAAM,EAAE,CAAC,CAAC,IAAI;QACd,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,cAAc;QAC1D,MAAM,EAAE,MAAM;YACV,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,wCAAwC;QAC9C,MAAM,EAAE,GAAG;KACd,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC"}
@@ -225,6 +225,10 @@ export interface ResolveResult {
225
225
  manifestUrl: string;
226
226
  via: 'dns-txt' | 'well-known';
227
227
  txtRecord?: X402TxtRecord;
228
+ /** RFC 9110 ETag header if served by host. */
229
+ etag?: string;
230
+ /** True if server returned HTTP 304 Not Modified based on supplied ifNoneMatch. */
231
+ notModified?: boolean;
228
232
  /** Live GET {baseUrl}{endpoints.supported} result (authoritative over manifest kinds). */
229
233
  liveKinds?: SupportedKind[];
230
234
  /** True when live kinds and manifest kinds agree (spec: divergence = misconfiguration). */
@@ -296,6 +300,8 @@ export declare function resolveX402(domain: string, opts?: {
296
300
  lookupImpl?: LookupImpl;
297
301
  /** Skip the negative cache for this call (forced refresh). */
298
302
  noCache?: boolean;
303
+ /** Send If-None-Match header for RFC 9110 conditional revalidation. */
304
+ ifNoneMatch?: string;
299
305
  /** Override negative TTLs (tests, aggressive crawlers). */
300
306
  negativeTtlMs?: Partial<Record<NegativeReason, number>>;
301
307
  /** Injectable clock so TTL expiry is testable without waiting. */
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
package/dist/discovery.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // GENERATED from src/x402/discovery.ts by scripts/sdk/sync-sdk.ts — do not edit here.
2
- // The canonical module is the one FlareClaw runs in production; this is a copy so
2
+ // The canonical module is the one Ashlar Blue runs in production; this is a copy so
3
3
  // that what we publish and what we run cannot diverge. Edit the canonical file.
4
4
  // ──────────────────── TXT record grammar ────────────────────
5
5
  const TXT_VERSION = 'x402-1';
@@ -207,8 +207,8 @@ export function isWkInDomain(wkUrl, domain) {
207
207
  // `_x402.<domain>` and never says which domain a consumer holding a RESOURCE
208
208
  // URL should ask for. A census of 1,609 hosts on 2026-08-22 asked
209
209
  // `_x402.<exact-host>` and recorded the draft's own author as a non-publisher:
210
- // our record is at the apex `flareclaw.app` with `wk=` pointing at the
211
- // subdomain `api.flareclaw.app`. Publishing at the apex is the natural choice
210
+ // our record is at the apex `ashlar.blue` with `wk=` pointing at the
211
+ // subdomain `api.ashlar.blue`. Publishing at the apex is the natural choice
212
212
  // for an operator with one DNS zone and several service hosts, and the naive
213
213
  // reading makes them invisible.
214
214
  //
@@ -217,7 +217,7 @@ export function isWkInDomain(wkUrl, domain) {
217
217
  // belongs to the PLATFORM, not the tenant, and one record there would make
218
218
  // every tenant beneath it discoverable — including tenants who never published
219
219
  // anything, and including hosts that do not exist. Our own control demonstrates
220
- // it: `zzq-...-9931.flareclaw.app` inherits our apex record.
220
+ // it: `zzq-...-9931.ashlar.blue` inherits our apex record.
221
221
  //
222
222
  // A public-suffix list would answer "is this ancestor an operator or a
223
223
  // platform", and we deliberately do NOT use one: it is a mutable external
@@ -567,12 +567,18 @@ async function defaultLookup(hostname) {
567
567
  * strangers, so an unbounded read is a denial-of-service handed to
568
568
  * anyone who publishes a TXT record.
569
569
  */
570
- async function fetchBounded(url, fetchImpl) {
570
+ async function fetchBounded(url, fetchImpl, ifNoneMatch) {
571
+ const headers = { Accept: 'application/json' };
572
+ if (ifNoneMatch) {
573
+ headers['If-None-Match'] = ifNoneMatch;
574
+ }
571
575
  const res = await fetchImpl(url, {
572
- headers: { Accept: 'application/json' },
576
+ headers,
573
577
  redirect: 'manual',
574
578
  signal: AbortSignal.timeout(MANIFEST_TIMEOUT_MS),
575
579
  });
580
+ if (res.status === 304)
581
+ return { res, body: undefined };
576
582
  if (res.status >= 300 && res.status < 400)
577
583
  return { res, body: undefined };
578
584
  if (!res.ok)
@@ -748,10 +754,10 @@ export async function resolveX402(domain, opts) {
748
754
  let res;
749
755
  try {
750
756
  await guard(manifestUrl);
751
- fetched = await fetchBounded(manifestUrl, fetchImpl);
757
+ fetched = await fetchBounded(manifestUrl, fetchImpl, opts?.ifNoneMatch);
752
758
  res = fetched.res;
753
- for (let hop = 0; res.status >= 300 && res.status < 400 && hop < MAX_MANIFEST_REDIRECTS; hop++) {
754
- const location = res.headers.get('location');
759
+ for (let hop = 0; res.status >= 300 && res.status < 400 && res.status !== 304 && hop < MAX_MANIFEST_REDIRECTS; hop++) {
760
+ const location = res.headers?.get?.('location');
755
761
  if (!location)
756
762
  break;
757
763
  const nextUrl = new URL(location, manifestUrl);
@@ -768,7 +774,7 @@ export async function resolveX402(domain, opts) {
768
774
  }
769
775
  manifestUrl = next; // report where the bytes ACTUALLY came from
770
776
  await guard(manifestUrl); // every hop — a public host redirecting inward is the classic bypass
771
- fetched = await fetchBounded(manifestUrl, fetchImpl);
777
+ fetched = await fetchBounded(manifestUrl, fetchImpl, opts?.ifNoneMatch);
772
778
  res = fetched.res;
773
779
  }
774
780
  }
@@ -783,6 +789,17 @@ export async function resolveX402(domain, opts) {
783
789
  return failWith('invalid', e);
784
790
  return failWith('unreachable', e);
785
791
  }
792
+ if (res.status === 304) {
793
+ return {
794
+ manifest: null,
795
+ manifestUrl,
796
+ via,
797
+ notModified: true,
798
+ etag: res.headers?.get?.('etag') || opts?.ifNoneMatch,
799
+ liveCheck: 'skipped',
800
+ ...(txtRecord ? { txtRecord } : {}),
801
+ };
802
+ }
786
803
  if (res.status >= 300 && res.status < 400) {
787
804
  failWith('invalid', new Error(`[x402-discovery] too many manifest redirects for ${domain}`));
788
805
  }
@@ -854,8 +871,10 @@ export async function resolveX402(domain, opts) {
854
871
  if (manifest.peers !== undefined) {
855
872
  manifest.peers = peerScan.peers;
856
873
  }
874
+ const etag = res.headers?.get?.('etag') || undefined;
857
875
  const out = {
858
876
  manifest, manifestUrl, via, attestationUsable,
877
+ ...(etag ? { etag } : {}),
859
878
  ...(peerScan.peers.length ? { peers: peerScan.peers } : {}),
860
879
  ...(peerScan.dropped.length ? { droppedPeers: peerScan.dropped } : {}),
861
880
  ...(droppedResources.length ? { droppedResources } : {}),