@dvmkit/sdk 0.21.0 → 0.21.2

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 (52) hide show
  1. package/dist/{chunk-MWDUGMN2.js → chunk-27QB2D3Z.js} +2 -2
  2. package/dist/{chunk-CVN2YNMG.js → chunk-2AGADOX3.js} +1 -1
  3. package/dist/{chunk-5RLNRLLB.js → chunk-2HSWWHXK.js} +1 -1
  4. package/dist/{chunk-CXRI4N4Y.js → chunk-2RZRYMCR.js} +1 -1
  5. package/dist/{chunk-C65P6MGZ.js → chunk-3V6CSTWB.js} +1 -1
  6. package/dist/{chunk-KRX7VNBG.js → chunk-62JG4AF7.js} +1 -1
  7. package/dist/{chunk-A6AOE63A.js → chunk-6GZF7VDO.js} +5 -1
  8. package/dist/{chunk-LY2JYSJS.js → chunk-7KNFEDFW.js} +1 -1
  9. package/dist/{chunk-DJRTYBEE.js → chunk-B27E7JIR.js} +1 -1
  10. package/dist/{chunk-2PN4DKZW.js → chunk-D2MGOQIS.js} +1 -1
  11. package/dist/{chunk-34H4ZKBM.js → chunk-FAT57DAP.js} +1 -1
  12. package/dist/{chunk-7RWE6ELV.js → chunk-IUFVIIPF.js} +1 -1
  13. package/dist/{chunk-I5MXADJS.js → chunk-JOSNSNS7.js} +2 -2
  14. package/dist/{chunk-INYFUPXV.js → chunk-LSANCGLP.js} +1 -1
  15. package/dist/{chunk-RX6FT7XA.js → chunk-LWF4ABYF.js} +1 -1
  16. package/dist/{chunk-ALTE7I6C.js → chunk-MA55LUNR.js} +1 -0
  17. package/dist/{chunk-QTKGFG3I.js → chunk-NRE4NOCY.js} +1 -1
  18. package/dist/{chunk-VT3WUX6B.js → chunk-VIAMJ6GS.js} +45 -32
  19. package/dist/{chunk-6RJAE332.js → chunk-WWKFG6TM.js} +1 -1
  20. package/dist/{chunk-72A4PHLD.js → chunk-XWG54M6T.js} +1 -1
  21. package/dist/{chunk-QCZXKUS2.js → chunk-Y746QPX7.js} +1 -1
  22. package/dist/{chunk-OTNHKRHA.js → chunk-ZBOCNF56.js} +2 -2
  23. package/dist/{content-retention-COnj0QKi.d.ts → content-retention-efjireLM.d.ts} +1 -1
  24. package/dist/{credit-ledger-ZCJXJG6R.js → credit-ledger-M3EBVMOP.js} +3 -3
  25. package/dist/{credit-menu-BpPa43Co.d.ts → credit-menu-UOOxuxVL.d.ts} +9 -4
  26. package/dist/{fx-DfzQ0Lge.d.ts → fx-BtxHVj6w.d.ts} +1 -1
  27. package/dist/index.d.ts +5 -5
  28. package/dist/index.js +4 -4
  29. package/dist/internal/caller.d.ts +11 -6
  30. package/dist/internal/caller.js +8 -7
  31. package/dist/internal/server.d.ts +7 -7
  32. package/dist/internal/server.js +20 -20
  33. package/dist/{job-store-p45j28px.d.ts → job-store-DWVkleH3.d.ts} +1 -1
  34. package/dist/{lightning-backend-DO7G7VqP.d.ts → lightning-backend-CTijN35u.d.ts} +1 -1
  35. package/dist/{memory-credit-ledger-N4PZKTT5.js → memory-credit-ledger-WL2VKLE3.js} +4 -4
  36. package/dist/{mpp-setup-BLIYBORK.js → mpp-setup-DBYDXISN.js} +3 -3
  37. package/dist/{payout-reporter-5QAHCYIO.js → payout-reporter-D5TCIBQA.js} +2 -2
  38. package/dist/{postgres-consumed-credential-store-4PCJEZBD.js → postgres-consumed-credential-store-IPWPJ6V7.js} +1 -1
  39. package/dist/{postgres-job-store-QKN5LGAH.js → postgres-job-store-POZJNFJU.js} +2 -2
  40. package/dist/{postgres-replay-store-GH5AINQR.js → postgres-replay-store-JQYAKG47.js} +2 -2
  41. package/dist/{pricing-JJYLTTWK.js → pricing-FGPVRNTL.js} +3 -3
  42. package/dist/{revenue-reporter-6XARUEG6.js → revenue-reporter-QKCBYFWT.js} +2 -2
  43. package/dist/server/index.d.ts +10 -10
  44. package/dist/server/index.js +38 -29
  45. package/dist/{step-cache-CcCjpZm1.d.ts → step-cache-Bx_ZybWF.d.ts} +2 -1
  46. package/dist/{tempo-charge-store-A3CDF7D5.js → tempo-charge-store-P7ZBR3GG.js} +2 -2
  47. package/dist/{tempo-session-store-XJE6GIXN.js → tempo-session-store-ZVRBAMLG.js} +3 -3
  48. package/dist/testing/index.d.ts +3 -3
  49. package/dist/testing/index.js +6 -6
  50. package/dist/{usd-BnAFcUai.d.ts → usd-eOAMEO12.d.ts} +1 -1
  51. package/dist/{x402-XLFD43RF.js → x402-44JZJQ5F.js} +3 -3
  52. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  PostgresReplayStore
3
- } from "../chunk-5RLNRLLB.js";
3
+ } from "../chunk-2HSWWHXK.js";
4
4
  import {
5
5
  PostgresKVStore
6
6
  } from "../chunk-V5ZRATJH.js";
@@ -18,7 +18,7 @@ import {
18
18
  parseNwcUri,
19
19
  validateX402Env,
20
20
  withNwcPool
21
- } from "../chunk-2PN4DKZW.js";
21
+ } from "../chunk-D2MGOQIS.js";
22
22
  import {
23
23
  MemoryKVStore
24
24
  } from "../chunk-SDK6KDJN.js";
@@ -47,6 +47,7 @@ import {
47
47
  X402_BATCH_SETTLEMENT_NETWORK,
48
48
  attachCreditMenu,
49
49
  buildCreditMenu,
50
+ callerInputIssues,
50
51
  clientCompatibilityAttributes,
51
52
  clientCompatibilityMiddleware,
52
53
  clientUpgradeRequired,
@@ -82,29 +83,30 @@ import {
82
83
  toCreditView,
83
84
  unknownRouteNotFound,
84
85
  writeOffHostedTempoCloseReport
85
- } from "../chunk-VT3WUX6B.js";
86
+ } from "../chunk-VIAMJ6GS.js";
86
87
  import {
87
88
  MemoryProcessedPaymentStore,
88
89
  PostgresProcessedPaymentStore,
89
90
  ProcessedPaymentReplayError
90
91
  } from "../chunk-XRLKGCAW.js";
91
- import "../chunk-KRX7VNBG.js";
92
- import "../chunk-C65P6MGZ.js";
92
+ import "../chunk-62JG4AF7.js";
93
+ import "../chunk-3V6CSTWB.js";
93
94
  import {
94
95
  MemoryCreditLedger
95
- } from "../chunk-DJRTYBEE.js";
96
+ } from "../chunk-B27E7JIR.js";
96
97
  import {
97
98
  PostgresJobStore
98
- } from "../chunk-QCZXKUS2.js";
99
+ } from "../chunk-Y746QPX7.js";
99
100
  import {
100
101
  SignedRequestError,
102
+ carriesSignedEnvelope,
101
103
  createDefaultReplayStore,
102
104
  createSignedRequestVerifier,
103
105
  signedRequestInput
104
- } from "../chunk-A6AOE63A.js";
106
+ } from "../chunk-6GZF7VDO.js";
105
107
  import {
106
108
  isStreamableJobStore
107
- } from "../chunk-6RJAE332.js";
109
+ } from "../chunk-WWKFG6TM.js";
108
110
  import {
109
111
  ContentHoldError,
110
112
  baselineContentExpiry,
@@ -115,7 +117,7 @@ import {
115
117
  IMPLICIT_CREDIT_TTL_MS,
116
118
  generateEphemeralReceiptKey,
117
119
  receiptPubkeyFromSecret
118
- } from "../chunk-7RWE6ELV.js";
120
+ } from "../chunk-IUFVIIPF.js";
119
121
  import {
120
122
  X402_DEFAULT_FACILITATOR,
121
123
  X402_DEFAULT_NETWORK,
@@ -127,11 +129,11 @@ import {
127
129
  SIGNED_REQUEST_STATEMENT_VERSION,
128
130
  signedRequestStatementHeader
129
131
  } from "../chunk-SXL44PL5.js";
130
- import "../chunk-QTKGFG3I.js";
132
+ import "../chunk-NRE4NOCY.js";
131
133
  import "../chunk-FUJ36YDV.js";
132
134
  import "../chunk-BQJIFRAZ.js";
133
- import "../chunk-RX6FT7XA.js";
134
- import "../chunk-72A4PHLD.js";
135
+ import "../chunk-LWF4ABYF.js";
136
+ import "../chunk-XWG54M6T.js";
135
137
  import {
136
138
  CreditLedger,
137
139
  CreditLedgerError,
@@ -139,7 +141,7 @@ import {
139
141
  PostgresX402ChannelStorage,
140
142
  X402RelaySubmissionLockError,
141
143
  allocateDrawValue
142
- } from "../chunk-I5MXADJS.js";
144
+ } from "../chunk-JOSNSNS7.js";
143
145
  import "../chunk-YG7G4DPZ.js";
144
146
  import {
145
147
  SDK_INIT_ADVISORY_LOCK,
@@ -148,7 +150,7 @@ import {
148
150
  import "../chunk-5UC7TOQC.js";
149
151
  import {
150
152
  applyRetryToPool
151
- } from "../chunk-INYFUPXV.js";
153
+ } from "../chunk-LSANCGLP.js";
152
154
  import {
153
155
  assertSupportedX402Network
154
156
  } from "../chunk-BPYMEMQX.js";
@@ -159,14 +161,14 @@ import {
159
161
  TEMPO_SETTLEMENT_DEFAULT_LOW_BALANCE_MICRO,
160
162
  TempoSettlementReadiness,
161
163
  resolveTempoNetwork
162
- } from "../chunk-MWDUGMN2.js";
164
+ } from "../chunk-27QB2D3Z.js";
163
165
  import {
164
166
  initLoggers
165
- } from "../chunk-LY2JYSJS.js";
167
+ } from "../chunk-7KNFEDFW.js";
166
168
  import "../chunk-66HGCPBU.js";
167
169
  import {
168
170
  diagnosticConsole
169
- } from "../chunk-ALTE7I6C.js";
171
+ } from "../chunk-MA55LUNR.js";
170
172
 
171
173
  // src/sdk/server/cashu-env.ts
172
174
  async function resolveCashuOptsFromEnv(env, pool, cashuModeHint) {
@@ -1193,7 +1195,7 @@ function createDVMHost(opts = {}) {
1193
1195
  });
1194
1196
  applyRetryToPool(pool, "dvm-host");
1195
1197
  pgPool = pool;
1196
- const { PostgresJobStore: PostgresJobStore2 } = await import("../postgres-job-store-QKN5LGAH.js");
1198
+ const { PostgresJobStore: PostgresJobStore2 } = await import("../postgres-job-store-POZJNFJU.js");
1197
1199
  const pgJobStore = new PostgresJobStore2(pool);
1198
1200
  pendingInits.push(pgJobStore.init(), pgJobStore.initStreaming());
1199
1201
  jobStore = pgJobStore;
@@ -1286,11 +1288,11 @@ ${config.facilitatorAuth?.keyId ?? ""}`;
1286
1288
  let tempoChargeBackend = "user-supplied";
1287
1289
  const mppTempoRecipient = envMaybe.DVMKIT_TEMPO_RECIPIENT;
1288
1290
  if (!mpp && mppTempoRecipient) {
1289
- const { createMppFromOpts, createDualKeyMppxFromOpts, parseMppMethodsAllowlist } = await import("../mpp-setup-BLIYBORK.js");
1291
+ const { createMppFromOpts, createDualKeyMppxFromOpts, parseMppMethodsAllowlist } = await import("../mpp-setup-DBYDXISN.js");
1290
1292
  tempoChargeBackend = pgPool ? "postgres" : "memory";
1291
1293
  let tempoCharge;
1292
1294
  if (pgPool) {
1293
- const { PostgresTempoChargeStore } = await import("../tempo-charge-store-A3CDF7D5.js");
1295
+ const { PostgresTempoChargeStore } = await import("../tempo-charge-store-P7ZBR3GG.js");
1294
1296
  const chargeStore = new PostgresTempoChargeStore(pgPool);
1295
1297
  tempoChargeStore = chargeStore;
1296
1298
  pendingInits.push(chargeStore.init());
@@ -1310,7 +1312,7 @@ ${config.facilitatorAuth?.keyId ?? ""}`;
1310
1312
  { createPublicClient, createWalletClient, erc20Abi, http },
1311
1313
  { tempo: tempoMainnet, tempoModerato }
1312
1314
  ] = await Promise.all([
1313
- import("../tempo-session-store-XJE6GIXN.js"),
1315
+ import("../tempo-session-store-ZVRBAMLG.js"),
1314
1316
  import("viem/accounts"),
1315
1317
  import("viem"),
1316
1318
  import("viem/chains")
@@ -1463,7 +1465,7 @@ ${config.facilitatorAuth?.keyId ?? ""}`;
1463
1465
  }
1464
1466
  }
1465
1467
  const fxSource = envMaybe.DVMKIT_FX_SOURCE;
1466
- const { createFxFetcher, resolveFxSourceFromEnv, warmFxSnapshot } = await import("../pricing-JJYLTTWK.js");
1468
+ const { createFxFetcher, resolveFxSourceFromEnv, warmFxSnapshot } = await import("../pricing-FGPVRNTL.js");
1467
1469
  const fxFetcher = opts.fx ?? createFxFetcher({ source: resolveFxSourceFromEnv(envMaybe) });
1468
1470
  const hostRailConfigured = (opts.paymentMethods?.length ?? 0) > 0 || (effectiveMints?.length ?? 0) > 0 || !!x402WithDualServe || !!mpp;
1469
1471
  if (mounts.some((entry) => mountNeedsFx(entry, hostRailConfigured))) warmFxSnapshot(fxFetcher);
@@ -1473,7 +1475,7 @@ ${config.facilitatorAuth?.keyId ?? ""}`;
1473
1475
  assertReceiptIdentity(envMaybe, opts.builder, receiptKey, cashuOpts.dvmId, opts.devMode);
1474
1476
  let sharedPgReplayStore;
1475
1477
  if (pgPool) {
1476
- const { PostgresReplayStore: PostgresReplayStore2 } = await import("../postgres-replay-store-GH5AINQR.js");
1478
+ const { PostgresReplayStore: PostgresReplayStore2 } = await import("../postgres-replay-store-JQYAKG47.js");
1477
1479
  const store2 = new PostgresReplayStore2(pgPool);
1478
1480
  pendingInits.push(store2.init());
1479
1481
  sharedPgReplayStore = store2;
@@ -1501,13 +1503,13 @@ ${config.facilitatorAuth?.keyId ?? ""}`;
1501
1503
  }
1502
1504
  let sharedPgConsumedStore;
1503
1505
  if (pgPool) {
1504
- const { PostgresConsumedCredentialStore } = await import("../postgres-consumed-credential-store-4PCJEZBD.js");
1506
+ const { PostgresConsumedCredentialStore } = await import("../postgres-consumed-credential-store-IPWPJ6V7.js");
1505
1507
  const consumedStore = new PostgresConsumedCredentialStore(pgPool);
1506
1508
  pendingInits.push(consumedStore.init());
1507
1509
  sharedPgConsumedStore = consumedStore;
1508
1510
  }
1509
1511
  if (pgPool) {
1510
- const { CreditLedger: CreditLedger2 } = await import("../credit-ledger-ZCJXJG6R.js");
1512
+ const { CreditLedger: CreditLedger2 } = await import("../credit-ledger-M3EBVMOP.js");
1511
1513
  const pgLedger = new CreditLedger2(pgPool, tempoSessionStore);
1512
1514
  pendingInits.push(pgLedger.init());
1513
1515
  creditLedger = pgLedger;
@@ -1516,7 +1518,7 @@ ${config.facilitatorAuth?.keyId ?? ""}`;
1516
1518
  pendingInits.push(pgProcessed.init());
1517
1519
  processedPayments = pgProcessed;
1518
1520
  } else {
1519
- const { MemoryCreditLedger: MemoryCreditLedger2 } = await import("../memory-credit-ledger-N4PZKTT5.js");
1521
+ const { MemoryCreditLedger: MemoryCreditLedger2 } = await import("../memory-credit-ledger-WL2VKLE3.js");
1520
1522
  creditLedger = disposableCashu?.ledger ?? new MemoryCreditLedger2();
1521
1523
  const { MemoryProcessedPaymentStore: MemoryProcessedPaymentStore2 } = await import("../processed-payment-store-GKMAWOM3.js");
1522
1524
  processedPayments = new MemoryProcessedPaymentStore2();
@@ -2106,8 +2108,15 @@ function secp256k1Auth(opts = {}) {
2106
2108
  id: SIGNED_REQUEST_AUTH_ID,
2107
2109
  allowUnsignedPaid: opts.allowUnsignedPaid === true,
2108
2110
  checkAuth(schema, input, domain) {
2109
- const envelope = getVerifier(schema).checkAuth(input, domain);
2110
- return { pubkey: envelope.pubkey, envelope };
2111
+ try {
2112
+ const envelope = getVerifier(schema).checkAuth(input, domain);
2113
+ return { pubkey: envelope.pubkey, envelope };
2114
+ } catch (err) {
2115
+ if (err instanceof SignedRequestError && err.sub_reason === "schema_invalid" && !carriesSignedEnvelope(input) && callerInputIssues(err.issues).length === 0) {
2116
+ throw new SignedRequestError("signed request required", "signature_required");
2117
+ }
2118
+ throw err;
2119
+ }
2111
2120
  },
2112
2121
  recheckSignature(schema, input, domain) {
2113
2122
  getVerifier(schema).verifySignature(input, domain);
@@ -5342,7 +5342,8 @@ interface SignedRequestVerifier<T> {
5342
5342
  */
5343
5343
  signRequest(privkey: Uint8Array, body: Record<string, unknown>, opts?: SignedRequestSignOpts, domain?: SignedRequestDomain): T & CanonicalEnvelope;
5344
5344
  }
5345
- type SignedRequestFailure = "schema_invalid" | "timestamp_drift" | "signature_invalid" | "replay_detected";
5345
+ /** Authentication failure; signature_required means no envelope fields were supplied. */
5346
+ type SignedRequestFailure = "schema_invalid" | "timestamp_drift" | "signature_required" | "signature_invalid" | "replay_detected";
5346
5347
  /**
5347
5348
  * One definition of envelope field types shared by the runtime shape guard
5348
5349
  * and error disclosure classifier. Envelope failures stay private; violations
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  PostgresTempoChargeStore
3
- } from "./chunk-CXRI4N4Y.js";
3
+ } from "./chunk-2RZRYMCR.js";
4
4
  import "./chunk-YG7G4DPZ.js";
5
5
  import "./chunk-COYKJRMM.js";
6
- import "./chunk-ALTE7I6C.js";
6
+ import "./chunk-MA55LUNR.js";
7
7
  export {
8
8
  PostgresTempoChargeStore
9
9
  };
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  PostgresTempoSessionStore,
3
3
  assertMonotonicTransition
4
- } from "./chunk-34H4ZKBM.js";
4
+ } from "./chunk-FAT57DAP.js";
5
5
  import "./chunk-YG7G4DPZ.js";
6
6
  import "./chunk-COYKJRMM.js";
7
- import "./chunk-INYFUPXV.js";
8
- import "./chunk-ALTE7I6C.js";
7
+ import "./chunk-LSANCGLP.js";
8
+ import "./chunk-MA55LUNR.js";
9
9
  export {
10
10
  PostgresTempoSessionStore,
11
11
  assertMonotonicTransition
@@ -1,6 +1,6 @@
1
- import { C as ContentHoldHistory, a as ContentHoldMutation } from '../content-retention-COnj0QKi.js';
2
- import { a4 as JobReceipt, a9 as Message, a5 as MessageType, K as KVStore, L as Logger, x as ResponseContent, P as PaymentContent, S as SDKJobContext } from '../step-cache-CcCjpZm1.js';
3
- import { c as StreamableJobStore, R as ReceiptIssuingStore, J as JobRecord, d as RequestIdClaim, e as RequestIdClaimResult, f as JobRetentionCursor, O as OutgoingMessage, A as AppendOutgoingOptions, P as PaymentCreditDelta, V as VerifyAndCreditResult, g as JobCounters } from '../job-store-p45j28px.js';
1
+ import { C as ContentHoldHistory, a as ContentHoldMutation } from '../content-retention-efjireLM.js';
2
+ import { a4 as JobReceipt, a9 as Message, a5 as MessageType, K as KVStore, L as Logger, x as ResponseContent, P as PaymentContent, S as SDKJobContext } from '../step-cache-Bx_ZybWF.js';
3
+ import { c as StreamableJobStore, R as ReceiptIssuingStore, J as JobRecord, d as RequestIdClaim, e as RequestIdClaimResult, f as JobRetentionCursor, O as OutgoingMessage, A as AppendOutgoingOptions, P as PaymentCreditDelta, V as VerifyAndCreditResult, g as JobCounters } from '../job-store-DWVkleH3.js';
4
4
  import 'hono';
5
5
  import 'mppx';
6
6
  import '@x402/core/server';
@@ -4,22 +4,22 @@ import {
4
4
  import {
5
5
  MemoryJobStore,
6
6
  createInstrumentedFetch
7
- } from "../chunk-6RJAE332.js";
7
+ } from "../chunk-WWKFG6TM.js";
8
8
  import {
9
9
  JobCancelledError
10
10
  } from "../chunk-KVKJ7R5V.js";
11
11
  import {
12
12
  createNoopLogger
13
- } from "../chunk-QTKGFG3I.js";
13
+ } from "../chunk-NRE4NOCY.js";
14
14
  import "../chunk-FUJ36YDV.js";
15
15
  import "../chunk-BQJIFRAZ.js";
16
- import "../chunk-RX6FT7XA.js";
16
+ import "../chunk-LWF4ABYF.js";
17
17
  import {
18
18
  validateCurrency
19
- } from "../chunk-72A4PHLD.js";
20
- import "../chunk-LY2JYSJS.js";
19
+ } from "../chunk-XWG54M6T.js";
20
+ import "../chunk-7KNFEDFW.js";
21
21
  import "../chunk-66HGCPBU.js";
22
- import "../chunk-ALTE7I6C.js";
22
+ import "../chunk-MA55LUNR.js";
23
23
 
24
24
  // src/sdk/testing/test-context.ts
25
25
  function createTestContext(opts) {
@@ -1,4 +1,4 @@
1
- import { C as Currency } from './step-cache-CcCjpZm1.js';
1
+ import { C as Currency } from './step-cache-Bx_ZybWF.js';
2
2
 
3
3
  /**
4
4
  * Thrown by `fiatToSatsCeil` / `satsToFiat` when the supplied `ratePerBtc` is
@@ -6,8 +6,8 @@ import {
6
6
  } from "./chunk-5RGZN6WQ.js";
7
7
  import {
8
8
  verifyX402Payment
9
- } from "./chunk-OTNHKRHA.js";
10
- import "./chunk-C65P6MGZ.js";
9
+ } from "./chunk-ZBOCNF56.js";
10
+ import "./chunk-3V6CSTWB.js";
11
11
  import {
12
12
  X402_DEFAULT_FACILITATOR,
13
13
  X402_DEFAULT_NETWORK,
@@ -37,7 +37,7 @@ import {
37
37
  x402SupportedNetworksHint
38
38
  } from "./chunk-BPYMEMQX.js";
39
39
  import "./chunk-66HGCPBU.js";
40
- import "./chunk-ALTE7I6C.js";
40
+ import "./chunk-MA55LUNR.js";
41
41
  export {
42
42
  X402_DEFAULT_FACILITATOR,
43
43
  X402_DEFAULT_NETWORK,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dvmkit/sdk",
3
- "version": "0.21.0",
3
+ "version": "0.21.2",
4
4
  "description": "SDK for building Digital Vending Machines: pay-per-use HTTPS services AI agents can find, pay, and call with no account or API key",
5
5
  "author": "DVM Technologies Ltd",
6
6
  "keywords": [