@dvmkit/sdk 0.5.0-rc.1 → 0.7.0-rc.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.
Files changed (54) hide show
  1. package/README.md +100 -0
  2. package/dist/{chunk-JH3SX3LY.js → chunk-6XF3RVVX.js} +1 -1
  3. package/dist/chunk-AFV77S4C.js +258 -0
  4. package/dist/{chunk-RLTSCKRI.js → chunk-BPYMEMQX.js} +50 -3
  5. package/dist/chunk-BQJIFRAZ.js +36 -0
  6. package/dist/{chunk-IWQHUSMO.js → chunk-CXCQLOOK.js} +143 -2
  7. package/dist/{chunk-PB4FYZET.js → chunk-EQLA4FFY.js} +54 -4
  8. package/dist/{chunk-LE74UEV7.js → chunk-EZXAJ6EI.js} +64 -53
  9. package/dist/{chunk-FI4CST2D.js → chunk-FWGWLPXF.js} +4 -6
  10. package/dist/{chunk-EYTHFFFU.js → chunk-GY66THYI.js} +179 -56
  11. package/dist/{chunk-TZ2WKCDD.js → chunk-HCLVYZUZ.js} +2 -2
  12. package/dist/{chunk-O5AT6S5T.js → chunk-IV6Q7NRW.js} +25 -195
  13. package/dist/{chunk-UOCZXO2Z.js → chunk-JEVLNAO3.js} +10 -5
  14. package/dist/{chunk-TUA7PYH7.js → chunk-KMED3H3A.js} +134 -130
  15. package/dist/{chunk-Z4KLECAC.js → chunk-N5RZ5HVB.js} +1 -1
  16. package/dist/{chunk-PAIM66YA.js → chunk-NFMOPYBA.js} +47 -37
  17. package/dist/{chunk-B2IROPQF.js → chunk-O2OTZ5GP.js} +40 -15
  18. package/dist/{chunk-FYRR2UEZ.js → chunk-OML32F6I.js} +1 -1
  19. package/dist/{chunk-6DOGTAHA.js → chunk-QR2EF2NI.js} +9 -43
  20. package/dist/{chunk-7ZUKL4IV.js → chunk-RA2WIX7G.js} +5 -5
  21. package/dist/{chunk-A4YFWZ7R.js → chunk-RCM3P2HE.js} +1 -1
  22. package/dist/{chunk-PLG4XER6.js → chunk-S3OY533W.js} +1 -1
  23. package/dist/{chunk-GFY5FRX3.js → chunk-SZVXOQ75.js} +5 -12
  24. package/dist/{chunk-MZRJR2CW.js → chunk-WBOKPC37.js} +22 -3
  25. package/dist/content-retention-DHyLdA6b.d.ts +78 -0
  26. package/dist/{credit-ledger-MI2H7NEC.js → credit-ledger-MCUXYKSJ.js} +2 -3
  27. package/dist/{credit-menu-CAfqe8IY.d.ts → credit-menu-DjnkeEUU.d.ts} +98 -5
  28. package/dist/{fx-D9nsN3n4.d.ts → fx-zMWFzfrU.d.ts} +1 -1
  29. package/dist/index.d.ts +5 -5
  30. package/dist/index.js +3 -3
  31. package/dist/internal/caller.d.ts +1369 -860
  32. package/dist/internal/caller.js +1079 -991
  33. package/dist/internal/index.js +1 -1
  34. package/dist/internal/server.d.ts +8 -99
  35. package/dist/internal/server.js +19 -18
  36. package/dist/{job-store-Bx-VFRjg.d.ts → job-store-DdLXBpol.d.ts} +1 -1
  37. package/dist/{lightning-backend-BAx2Y8pP.d.ts → lightning-backend-Bw-qtAbt.d.ts} +4 -2
  38. package/dist/{memory-credit-ledger-W2BAUYJP.js → memory-credit-ledger-SBSMGMDX.js} +3 -4
  39. package/dist/{postgres-consumed-credential-store-CUQJKRSL.js → postgres-consumed-credential-store-BUVCAPLS.js} +13 -0
  40. package/dist/{postgres-job-store-VLXLWXUQ.js → postgres-job-store-VHLQBJZC.js} +3 -1
  41. package/dist/server/index.d.ts +28 -10
  42. package/dist/server/index.js +34 -24
  43. package/dist/{step-cache-QG_h5-3G.d.ts → step-cache-2MkvenJn.d.ts} +3 -3
  44. package/dist/tempo-lifecycle-GJ77YKVY.js +15 -0
  45. package/dist/{tempo-wallet-B5XXV3YH.js → tempo-wallet-X2GGAZ6X.js} +4 -4
  46. package/dist/testing/index.d.ts +9 -2
  47. package/dist/testing/index.js +6 -3
  48. package/dist/{usd-EwRqCPF-.d.ts → usd-DI3d3gTK.d.ts} +1 -1
  49. package/dist/{x402-R6HPBY5D.js → x402-FT4S4JS4.js} +8 -10
  50. package/package.json +5 -3
  51. package/recipes/postgres/financial-export-v1.sql +137 -0
  52. package/dist/chunk-CZULM42S.js +0 -143
  53. package/dist/chunk-LIRAHP7B.js +0 -53
  54. package/dist/tempo-lifecycle-ZBBLFBMH.js +0 -15
@@ -1,191 +1,15 @@
1
1
  import {
2
- StepCache,
2
+ ContentHoldError,
3
+ applyContentHoldMutation,
4
+ isTerminal
5
+ } from "./chunk-AFV77S4C.js";
6
+ import {
3
7
  loggers
4
- } from "./chunk-6DOGTAHA.js";
8
+ } from "./chunk-QR2EF2NI.js";
5
9
  import {
6
10
  redactUrl
7
11
  } from "./chunk-FUJ36YDV.js";
8
12
 
9
- // src/sdk/server/job.ts
10
- function toJobRecord(job) {
11
- return {
12
- id: job.id,
13
- tags: job.tags,
14
- capability: job.capability,
15
- input: job.input,
16
- params: job.params,
17
- requesterId: job.requesterId,
18
- requesterTokenHash: job.requesterTokenHash,
19
- requesterToken: job.requesterToken,
20
- requestFingerprint: job.requestFingerprint,
21
- requesterPubkey: job.requesterPubkey,
22
- requestId: job.requestId,
23
- authRequestPath: job.authRequestPath,
24
- status: job.status,
25
- summary: job.summary,
26
- timingKnown: job.timingKnown,
27
- endedBy: job.endedBy,
28
- terminalAtMs: job.terminalAtMs,
29
- callerWaitMs: job.callerWaitMs,
30
- awaitingInputAtMs: job.awaitingInputAtMs,
31
- messages: job.messages,
32
- seq: job.seq,
33
- paidMsats: job.paidMsats,
34
- paymentMint: job.paymentMint,
35
- paymentRail: job.paymentRail,
36
- paymentTxHash: job.paymentTxHash,
37
- paymentTransactionHash: job.paymentTransactionHash,
38
- nativeAmount: job.nativeAmount,
39
- nativeAsset: job.nativeAsset,
40
- cashuFlow: job.cashuFlow,
41
- costAmountMicro: job.costAmountMicro,
42
- costCurrency: job.costCurrency,
43
- costRevision: job.costRevision,
44
- creditId: job.creditId,
45
- drawId: job.drawId,
46
- fundingReceipt: job.fundingReceipt,
47
- fundingCredit: job.fundingCredit,
48
- receivedProofs: job.receivedProofs,
49
- pendingPaymentMsats: job.pendingPaymentMsats,
50
- pendingMppChallengeIds: job.pendingMppChallengeIds,
51
- pendingX402Nonce: job.pendingX402Nonce,
52
- pendingX402AmountUsdcMicro: job.pendingX402AmountUsdcMicro,
53
- pendingPaymentFiatMicro: job.pendingPaymentFiatMicro,
54
- pendingPaymentFiatCurrency: job.pendingPaymentFiatCurrency,
55
- askedTopUpMicro: job.askedTopUpMicro,
56
- askedTopUpCurrency: job.askedTopUpCurrency,
57
- topUpCapUnenforcedReason: job.topUpCapUnenforcedReason,
58
- requiredMsats: job.requiredMsats,
59
- receipt: job.receipt,
60
- stepCache: job.stepCache.serialize(),
61
- state: job.state,
62
- createdAt: job.createdAt,
63
- lastActivityAt: job.lastActivityAt
64
- };
65
- }
66
- function fromJobRecord(record) {
67
- return {
68
- id: record.id,
69
- tags: record.tags,
70
- capability: record.capability,
71
- input: record.input,
72
- params: record.params,
73
- requesterId: record.requesterId,
74
- requesterTokenHash: record.requesterTokenHash,
75
- status: record.status,
76
- summary: record.summary,
77
- timingKnown: record.timingKnown,
78
- endedBy: record.endedBy,
79
- terminalAtMs: record.terminalAtMs,
80
- callerWaitMs: record.callerWaitMs,
81
- awaitingInputAtMs: record.awaitingInputAtMs,
82
- messages: [...record.messages],
83
- seq: record.seq,
84
- paidMsats: record.paidMsats,
85
- paymentMint: record.paymentMint,
86
- paymentRail: record.paymentRail,
87
- paymentTxHash: record.paymentTxHash,
88
- paymentTransactionHash: record.paymentTransactionHash,
89
- nativeAmount: record.nativeAmount,
90
- nativeAsset: record.nativeAsset,
91
- cashuFlow: record.cashuFlow,
92
- costAmountMicro: record.costAmountMicro,
93
- costCurrency: record.costCurrency,
94
- costRevision: record.costRevision,
95
- creditId: record.creditId,
96
- drawId: record.drawId,
97
- fundingReceipt: record.fundingReceipt,
98
- fundingCredit: record.fundingCredit,
99
- receivedProofs: [...record.receivedProofs],
100
- pendingPaymentMsats: record.pendingPaymentMsats,
101
- pendingMppChallengeIds: record.pendingMppChallengeIds ? [...record.pendingMppChallengeIds] : void 0,
102
- requesterToken: record.requesterToken,
103
- requestFingerprint: record.requestFingerprint,
104
- requesterPubkey: record.requesterPubkey,
105
- requestId: record.requestId,
106
- authRequestPath: record.authRequestPath,
107
- pendingX402Nonce: record.pendingX402Nonce,
108
- pendingX402AmountUsdcMicro: record.pendingX402AmountUsdcMicro,
109
- pendingPaymentFiatMicro: record.pendingPaymentFiatMicro,
110
- pendingPaymentFiatCurrency: record.pendingPaymentFiatCurrency,
111
- askedTopUpMicro: record.askedTopUpMicro,
112
- askedTopUpCurrency: record.askedTopUpCurrency,
113
- topUpCapUnenforcedReason: record.topUpCapUnenforcedReason,
114
- requiredMsats: record.requiredMsats,
115
- receipt: record.receipt,
116
- listeners: /* @__PURE__ */ new Set(),
117
- abort: new AbortController(),
118
- messageAppender: void 0,
119
- messageAppenderTail: void 0,
120
- stepCache: StepCache.deserialize(record.stepCache),
121
- state: record.state,
122
- pendingPrompts: /* @__PURE__ */ new Map(),
123
- pendingPayment: null,
124
- replayHighSeq: null,
125
- replayProviderSkip: 0,
126
- replayPaymentIndex: 0,
127
- createdAt: record.createdAt,
128
- lastActivityAt: record.lastActivityAt
129
- };
130
- }
131
- function abortJob(job, reason) {
132
- job.abort.abort(new JobCancelledError(reason));
133
- }
134
- var JobCancelledError = class extends Error {
135
- constructor(message = "Job cancelled") {
136
- super(message);
137
- this.name = "JobCancelledError";
138
- }
139
- };
140
- function providerMessage(job, type, content) {
141
- if (job.replayProviderSkip > 0) {
142
- job.replayProviderSkip--;
143
- return;
144
- }
145
- const msg = localMessage(job, "provider", type, content);
146
- if (type === "payment-request") {
147
- const paymentRequest = content;
148
- const pendingPaymentDelta = typeof paymentRequest.amount_msats === "number" ? paymentRequest.amount_msats : void 0;
149
- const pendingMppChallengeIds = paymentRequest.tempo?.challenges?.map((challenge) => challenge.id).filter((id) => typeof id === "string");
150
- job.messageAppender?.(msg, {
151
- awaitingInput: job.status === "awaiting-input",
152
- pendingPaymentDelta,
153
- pendingMppChallengeIds,
154
- pendingX402Nonce: typeof paymentRequest.x402?.nonce === "string" ? paymentRequest.x402.nonce : void 0,
155
- pendingX402AmountUsdcMicro: typeof paymentRequest.x402?.required_usdc_micro === "string" ? paymentRequest.x402.required_usdc_micro : void 0,
156
- // read off the job rather than the content — the fiat envelope
157
- // is ledger state, not part of the wire shape, and `requestPayment` has
158
- // already pinned it on the job by the time this fires (same ordering the
159
- // `pendingPaymentMsats` comment above describes).
160
- pendingPaymentFiatMicro: job.pendingPaymentFiatMicro,
161
- pendingPaymentFiatCurrency: job.pendingPaymentFiatCurrency
162
- });
163
- return;
164
- }
165
- job.messageAppender?.(msg, type === "prompt" ? { awaitingInput: job.status === "awaiting-input" } : void 0);
166
- }
167
- function localMessage(job, from, type, content) {
168
- job.seq++;
169
- const msg = {
170
- seq: job.seq,
171
- from,
172
- timestamp: Math.floor(Date.now() / 1e3),
173
- type,
174
- content
175
- };
176
- job.messages.push(msg);
177
- for (const listener of job.listeners) {
178
- listener(msg);
179
- }
180
- return msg;
181
- }
182
- function isTerminal(status) {
183
- return status === "completed" || status === "failed" || status === "cancelled";
184
- }
185
- function isYieldMessage(msg) {
186
- return msg.type === "prompt" || msg.type === "payment-request" || msg.type === "working" || msg.type === "complete" || msg.type === "cancel";
187
- }
188
-
189
13
  // src/sdk/server/job-store.ts
190
14
  function accumulateAskedTopUp(prior, ask) {
191
15
  const poisoned = (reason) => ({
@@ -219,6 +43,7 @@ function isStaleJobReapable(store) {
219
43
 
220
44
  // src/sdk/server/memory-job-store.ts
221
45
  var MemoryJobStore = class {
46
+ contentHolds = /* @__PURE__ */ new Map();
222
47
  data = /* @__PURE__ */ new Map();
223
48
  messages = /* @__PURE__ */ new Map();
224
49
  nextSeq = /* @__PURE__ */ new Map();
@@ -290,6 +115,7 @@ var MemoryJobStore = class {
290
115
  }
291
116
  const snapshot = structuredClone(record);
292
117
  if (existing) snapshot.createdAt = existing.createdAt;
118
+ if (existing && isTerminal(existing.status)) snapshot.lastActivityAt = existing.lastActivityAt;
293
119
  if (existing?.receipt) snapshot.receipt = existing.receipt;
294
120
  snapshot.timingKnown = existing ? existing.timingKnown ?? false : record.timingKnown ?? true;
295
121
  applyTiming(snapshot, existing, Date.now());
@@ -302,6 +128,7 @@ var MemoryJobStore = class {
302
128
  return Promise.resolve();
303
129
  }
304
130
  delete(id) {
131
+ this.contentHolds.delete(id);
305
132
  this.data.delete(id);
306
133
  this.messages.delete(id);
307
134
  this.nextSeq.delete(id);
@@ -317,7 +144,7 @@ var MemoryJobStore = class {
317
144
  }
318
145
  redactJob(args) {
319
146
  const record = this.data.get(args.jobId);
320
- if (!record || record.redactedAt !== void 0 || !isTerminal(record.status) || record.lastActivityAt !== args.expectedLastActivityAt) {
147
+ if (!record || record.redactedAt !== void 0 || !isTerminal(record.status) || this.contentHolds.get(args.jobId)?.holds.some((hold) => hold.cleared_at === null) || record.lastActivityAt !== args.expectedLastActivityAt) {
321
148
  return Promise.resolve(false);
322
149
  }
323
150
  record.input = "";
@@ -340,6 +167,17 @@ var MemoryJobStore = class {
340
167
  this.messages.delete(args.jobId);
341
168
  return Promise.resolve(true);
342
169
  }
170
+ getContentSnapshot(jobId) {
171
+ const job = this.data.get(jobId);
172
+ return Promise.resolve(job ? structuredClone({ job, history: this.contentHolds.get(jobId) ?? { holds: [], events: [] } }) : void 0);
173
+ }
174
+ mutateContentHold(jobId, mutation) {
175
+ const job = this.data.get(jobId);
176
+ if (!job) return Promise.reject(new ContentHoldError("job_not_found"));
177
+ const history = applyContentHoldMutation(job, this.contentHolds.get(jobId) ?? { holds: [], events: [] }, mutation);
178
+ this.contentHolds.set(jobId, history);
179
+ return Promise.resolve(structuredClone(history));
180
+ }
343
181
  claimReceiptSeq(jobId) {
344
182
  if (!this.data.has(jobId)) {
345
183
  return Promise.reject(new Error(`claimReceiptSeq: job ${jobId} not found`));
@@ -394,7 +232,7 @@ var MemoryJobStore = class {
394
232
  record.askedTopUpCurrency = asked.currency;
395
233
  record.topUpCapUnenforcedReason = asked.reason;
396
234
  }
397
- record.lastActivityAt = Date.now();
235
+ if (!isTerminal(record.status)) record.lastActivityAt = Date.now();
398
236
  if (seq > record.seq) record.seq = seq;
399
237
  this.notify(jobId, fullMessage);
400
238
  return Promise.resolve(seq);
@@ -407,7 +245,7 @@ var MemoryJobStore = class {
407
245
  const seq = this.allocateSeq(jobId);
408
246
  const fullMessage = { ...message, seq };
409
247
  this.messagesFor(jobId).push({ message: fullMessage, status: "pending-verification" });
410
- record.lastActivityAt = Date.now();
248
+ if (!isTerminal(record.status)) record.lastActivityAt = Date.now();
411
249
  if (seq > record.seq) record.seq = seq;
412
250
  this.fireNotifyOnly(jobId);
413
251
  return Promise.resolve(seq);
@@ -456,7 +294,7 @@ var MemoryJobStore = class {
456
294
  record.pendingX402AmountUsdcMicro = void 0;
457
295
  }
458
296
  }
459
- record.lastActivityAt = Date.now();
297
+ if (!isTerminal(record.status)) record.lastActivityAt = Date.now();
460
298
  this.notify(jobId, stored.message);
461
299
  return Promise.resolve({
462
300
  counters: snapshotCounters(record),
@@ -521,7 +359,7 @@ var MemoryJobStore = class {
521
359
  if (record?.status !== "awaiting-input") return Promise.resolve(false);
522
360
  applyTiming(record, structuredClone(record), Date.now(), "processing");
523
361
  record.status = "processing";
524
- record.lastActivityAt = Date.now();
362
+ if (!isTerminal(record.status)) record.lastActivityAt = Date.now();
525
363
  return Promise.resolve(true);
526
364
  }
527
365
  async tryReactivationLock(jobId, fn) {
@@ -704,14 +542,6 @@ function mergeSignals(a, b) {
704
542
  }
705
543
 
706
544
  export {
707
- toJobRecord,
708
- fromJobRecord,
709
- abortJob,
710
- JobCancelledError,
711
- providerMessage,
712
- localMessage,
713
- isTerminal,
714
- isYieldMessage,
715
545
  accumulateAskedTopUp,
716
546
  UNCAPPABLE_ASK_TOTAL,
717
547
  isJobRetentionStore,
@@ -2,33 +2,33 @@ import {
2
2
  connectedTempoAccount,
3
3
  tempoBalanceCheckHint,
4
4
  tempoTokenReference
5
- } from "./chunk-GFY5FRX3.js";
5
+ } from "./chunk-SZVXOQ75.js";
6
6
  import {
7
7
  fundingReachableAt,
8
8
  listCredits,
9
9
  maxAdvertisedMicro,
10
10
  normalizeCreditEndpoint,
11
11
  withinAdvertisedTolerance
12
- } from "./chunk-B2IROPQF.js";
12
+ } from "./chunk-O2OTZ5GP.js";
13
13
  import {
14
14
  costAnchor,
15
15
  formatUsd,
16
16
  formatUsdcMicrounits
17
- } from "./chunk-PAIM66YA.js";
17
+ } from "./chunk-NFMOPYBA.js";
18
18
  import {
19
19
  IDENTITIES_FILE,
20
20
  TEMPO_CHANNELS_FILE,
21
21
  ensureConfigDir,
22
22
  resolveRpcHttpTransportOptions,
23
23
  resolveRpcOverride
24
- } from "./chunk-CZULM42S.js";
24
+ } from "./chunk-CXCQLOOK.js";
25
25
  import {
26
26
  redactUrl,
27
27
  redactUrlsInText
28
28
  } from "./chunk-FUJ36YDV.js";
29
29
  import {
30
30
  DvmError
31
- } from "./chunk-LIRAHP7B.js";
31
+ } from "./chunk-BPYMEMQX.js";
32
32
 
33
33
  // src/lib/cli-identity-store.ts
34
34
  import { schnorr } from "@noble/curves/secp256k1.js";
@@ -1606,11 +1606,16 @@ function intentClause(intent) {
1606
1606
  export {
1607
1607
  TEMPO_CHARGE_PENDING_STALE_MS,
1608
1608
  withTempoChannelLock,
1609
+ createTempoChannelStore,
1609
1610
  listTempoChannelAssociations,
1610
1611
  loadTempoChannelAssociation,
1612
+ loadTempoChannelAssociationByKey,
1611
1613
  loadTempoChannelEntry,
1612
1614
  loadTempoChannelController,
1615
+ tempoDescriptorController,
1613
1616
  tempoChannelControlledBy,
1617
+ retireTempoChannel,
1618
+ retireTempoChannelScope,
1614
1619
  tempoChargeCredentialSettleable,
1615
1620
  recordPendingTempoChargeFunding,
1616
1621
  loadResumableTempoChargeFunding,