xytara 3.1.13 → 3.1.14
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/.env.example +8 -1
- package/BSV_TERANODE_PLATFORM_DISCONTINUITY_RUNBOOK.md +126 -126
- package/RELEASE_NOTES.md +6 -4
- package/lib/a2a_rpc.js +280 -280
- package/lib/account_auth.js +585 -585
- package/lib/agent_identity.js +162 -162
- package/lib/bolt_adapter.js +187 -187
- package/lib/bolt_payment_front.js +224 -224
- package/lib/checkout_processor_adapter.js +217 -217
- package/lib/command_flow.js +722 -722
- package/lib/commerce_artifacts.js +591 -591
- package/lib/commerce_bridge.js +274 -274
- package/lib/commerce_cases.js +399 -399
- package/lib/commerce_client.js +7694 -7694
- package/lib/commerce_quotes.js +29 -0
- package/lib/commerce_runtime.js +322 -322
- package/lib/execution_dedupe.js +86 -86
- package/lib/external_credit_bridge.js +142 -142
- package/lib/http_transport.js +81 -81
- package/lib/l402_adapter.js +241 -241
- package/lib/l402_payment_front.js +265 -265
- package/lib/mpp_adapter.js +237 -237
- package/lib/payment_config.js +253 -253
- package/lib/payment_verification.js +357 -357
- package/lib/provider_payout_execution.js +155 -155
- package/lib/provider_registry.js +842 -842
- package/lib/rate_limiter.js +81 -81
- package/lib/runtime_state_store.js +491 -369
- package/lib/settlement_bsv_live.js +600 -600
- package/lib/settlement_bsv_teranode.js +117 -117
- package/lib/stripe_mpp_payment_front.js +258 -258
- package/lib/x402_facilitator.js +191 -191
- package/package.json +5 -3
- package/scripts/state_backup_offsite.js +196 -0
- package/scripts/verify_a2a_rpc.js +105 -105
- package/scripts/verify_agent_identity.js +153 -153
- package/scripts/verify_all.js +1 -1
- package/scripts/verify_bolt_adapter.js +128 -128
- package/scripts/verify_cdp_facilitator.js +110 -110
- package/scripts/verify_checkout_processor.js +109 -109
- package/scripts/verify_commerce_bridge.js +177 -177
- package/scripts/verify_execution_dedupe.js +189 -189
- package/scripts/verify_execution_surfacing.js +76 -76
- package/scripts/verify_final_activation.js +191 -191
- package/scripts/verify_l402_adapter.js +86 -86
- package/scripts/verify_mpp_adapter.js +128 -128
- package/scripts/verify_production_readiness.js +268 -268
- package/scripts/verify_rate_limiter.js +52 -52
- package/scripts/verify_refund_credit.js +106 -106
- package/scripts/verify_release_candidate.js +81 -81
- package/scripts/verify_runtime_state_guard.js +117 -0
- package/scripts/verify_service.js +15421 -15421
- package/scripts/verify_verify_execute_settle.js +208 -208
- package/scripts/verify_x402_facilitator.js +286 -286
- package/server.js +11976 -11974
package/lib/commerce_quotes.js
CHANGED
|
@@ -175,10 +175,38 @@ function refreshQuoteStatus(state, quoteId, nowMs) {
|
|
|
175
175
|
return next;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
// Expired, never-paid quotes (e.g. from unpaid 402 probes) are pure history: nothing executes or
|
|
179
|
+
// settles against them. Keep them for a retention window, then drop them so durable state does
|
|
180
|
+
// not grow without bound. Executed/accepted quotes are never pruned.
|
|
181
|
+
const DEFAULT_QUOTE_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
|
|
182
|
+
function quoteRetentionMs() {
|
|
183
|
+
const raw = process.env.XYTARA_QUOTE_RETENTION_MS;
|
|
184
|
+
if (raw === undefined || raw === "") return DEFAULT_QUOTE_RETENTION_MS;
|
|
185
|
+
const n = Number(raw);
|
|
186
|
+
return Number.isFinite(n) && n >= 0 ? n : DEFAULT_QUOTE_RETENTION_MS;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function pruneStaleQuotes(state, nowMs) {
|
|
190
|
+
if (!state || !(state.quotes instanceof Map)) return 0;
|
|
191
|
+
const now = typeof nowMs === "number" ? nowMs : Date.now();
|
|
192
|
+
const cutoff = now - quoteRetentionMs();
|
|
193
|
+
let pruned = 0;
|
|
194
|
+
for (const [quoteId, quote] of Array.from(state.quotes.entries())) {
|
|
195
|
+
if (!quote || quote.status !== "expired" || quote.transaction_id) continue;
|
|
196
|
+
const expiresAtMs = Date.parse(quote.expires_at_iso || "");
|
|
197
|
+
if (Number.isFinite(expiresAtMs) && expiresAtMs < cutoff) {
|
|
198
|
+
state.quotes.delete(quoteId);
|
|
199
|
+
pruned += 1;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return pruned;
|
|
203
|
+
}
|
|
204
|
+
|
|
178
205
|
function hydrateQuoteStates(state, nowMs) {
|
|
179
206
|
for (const quoteId of Array.from(state.quotes.keys())) {
|
|
180
207
|
refreshQuoteStatus(state, quoteId, nowMs);
|
|
181
208
|
}
|
|
209
|
+
pruneStaleQuotes(state, nowMs);
|
|
182
210
|
}
|
|
183
211
|
|
|
184
212
|
function markQuoteExecuted(state, quote, result, paymentRecord, options) {
|
|
@@ -233,5 +261,6 @@ module.exports = {
|
|
|
233
261
|
isQuoteExpired,
|
|
234
262
|
markQuoteExecuted,
|
|
235
263
|
normalizeTaskRefs,
|
|
264
|
+
pruneStaleQuotes,
|
|
236
265
|
refreshQuoteStatus
|
|
237
266
|
};
|