@volter/twin-stripe 0.1.2 → 2.0.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.
Files changed (219) hide show
  1. package/README.md +64 -27
  2. package/client/dashboard-api.ts +286 -0
  3. package/client/stripe-mirror.css +272 -159
  4. package/client/stripe-mirror.tsx +1384 -541
  5. package/dist/client/dashboard-api.d.ts +107 -0
  6. package/dist/client/dashboard-api.js +238 -0
  7. package/dist/client/dashboard-api.ts +286 -0
  8. package/dist/client/stripe-mirror.bundle.js +236 -0
  9. package/dist/client/stripe-mirror.css +275 -0
  10. package/dist/client/stripe-mirror.d.ts +134 -0
  11. package/dist/client/stripe-mirror.js +823 -0
  12. package/dist/client/stripe-mirror.tsx +1534 -0
  13. package/dist/src/cli.d.ts +2 -0
  14. package/dist/src/cli.js +39 -0
  15. package/dist/src/generated/events.gen.json +1 -0
  16. package/dist/src/generated/surface.gen.json +1 -0
  17. package/dist/src/generated/ui.gen.json +1 -0
  18. package/dist/src/index.d.ts +14 -0
  19. package/dist/src/index.js +73 -0
  20. package/dist/src/manifest.d.ts +2 -0
  21. package/dist/src/manifest.js +1065 -0
  22. package/dist/src/screens/checkout.d.ts +31 -0
  23. package/dist/src/screens/checkout.js +241 -0
  24. package/dist/src/screens/consent-skin.d.ts +4 -0
  25. package/dist/src/screens/consent-skin.js +18 -0
  26. package/dist/src/screens/financial-connections.d.ts +5 -0
  27. package/dist/src/screens/financial-connections.js +90 -0
  28. package/dist/src/screens/identity.d.ts +5 -0
  29. package/dist/src/screens/identity.js +86 -0
  30. package/dist/src/screens/industries.d.ts +1 -0
  31. package/dist/src/screens/industries.js +267 -0
  32. package/dist/src/screens/onboarding.d.ts +13 -0
  33. package/dist/src/screens/onboarding.js +225 -0
  34. package/dist/src/screens/portal.d.ts +5 -0
  35. package/dist/src/screens/portal.js +214 -0
  36. package/dist/src/screens/public-details.d.ts +5 -0
  37. package/dist/src/screens/public-details.js +90 -0
  38. package/dist/src/semantics/after-payment.d.ts +22 -0
  39. package/dist/src/semantics/after-payment.js +93 -0
  40. package/dist/src/semantics/apps-secrets.d.ts +2 -0
  41. package/dist/src/semantics/apps-secrets.js +54 -0
  42. package/dist/src/semantics/balance.d.ts +11 -0
  43. package/dist/src/semantics/balance.js +195 -0
  44. package/dist/src/semantics/billing.d.ts +2 -0
  45. package/dist/src/semantics/billing.js +220 -0
  46. package/dist/src/semantics/charges.d.ts +28 -0
  47. package/dist/src/semantics/charges.js +201 -0
  48. package/dist/src/semantics/checkout.d.ts +15 -0
  49. package/dist/src/semantics/checkout.js +303 -0
  50. package/dist/src/semantics/connect.d.ts +5 -0
  51. package/dist/src/semantics/connect.js +476 -0
  52. package/dist/src/semantics/coupons.d.ts +6 -0
  53. package/dist/src/semantics/coupons.js +92 -0
  54. package/dist/src/semantics/credit-notes.d.ts +2 -0
  55. package/dist/src/semantics/credit-notes.js +172 -0
  56. package/dist/src/semantics/customers.d.ts +6 -0
  57. package/dist/src/semantics/customers.js +429 -0
  58. package/dist/src/semantics/disputes.d.ts +2 -0
  59. package/dist/src/semantics/disputes.js +51 -0
  60. package/dist/src/semantics/entitlements.d.ts +2 -0
  61. package/dist/src/semantics/entitlements.js +95 -0
  62. package/dist/src/semantics/ephemeral-keys.d.ts +2 -0
  63. package/dist/src/semantics/ephemeral-keys.js +34 -0
  64. package/dist/src/semantics/files.d.ts +2 -0
  65. package/dist/src/semantics/files.js +125 -0
  66. package/dist/src/semantics/invoices.d.ts +18 -0
  67. package/dist/src/semantics/invoices.js +541 -0
  68. package/dist/src/semantics/issuing.d.ts +13 -0
  69. package/dist/src/semantics/issuing.js +570 -0
  70. package/dist/src/semantics/ledger.d.ts +54 -0
  71. package/dist/src/semantics/ledger.js +181 -0
  72. package/dist/src/semantics/payment-intents.d.ts +18 -0
  73. package/dist/src/semantics/payment-intents.js +404 -0
  74. package/dist/src/semantics/payment-links.d.ts +2 -0
  75. package/dist/src/semantics/payment-links.js +133 -0
  76. package/dist/src/semantics/payment-methods.d.ts +20 -0
  77. package/dist/src/semantics/payment-methods.js +138 -0
  78. package/dist/src/semantics/plans.d.ts +5 -0
  79. package/dist/src/semantics/plans.js +121 -0
  80. package/dist/src/semantics/platform.d.ts +9 -0
  81. package/dist/src/semantics/platform.js +206 -0
  82. package/dist/src/semantics/products.d.ts +2 -0
  83. package/dist/src/semantics/products.js +140 -0
  84. package/dist/src/semantics/radar.d.ts +2 -0
  85. package/dist/src/semantics/radar.js +83 -0
  86. package/dist/src/semantics/refunds.d.ts +9 -0
  87. package/dist/src/semantics/refunds.js +195 -0
  88. package/dist/src/semantics/renewals.d.ts +47 -0
  89. package/dist/src/semantics/renewals.js +251 -0
  90. package/dist/src/semantics/setup-intents.d.ts +2 -0
  91. package/dist/src/semantics/setup-intents.js +84 -0
  92. package/dist/src/semantics/shared.d.ts +78 -0
  93. package/dist/src/semantics/shared.js +192 -0
  94. package/dist/src/semantics/subscription-schedules.d.ts +2 -0
  95. package/dist/src/semantics/subscription-schedules.js +119 -0
  96. package/dist/src/semantics/subscriptions.d.ts +11 -0
  97. package/dist/src/semantics/subscriptions.js +605 -0
  98. package/dist/src/semantics/tax.d.ts +2 -0
  99. package/dist/src/semantics/tax.js +197 -0
  100. package/dist/src/semantics/terminal.d.ts +5 -0
  101. package/dist/src/semantics/terminal.js +182 -0
  102. package/dist/src/semantics/test-clocks.d.ts +6 -0
  103. package/dist/src/semantics/test-clocks.js +73 -0
  104. package/dist/src/semantics/tokens.d.ts +4 -0
  105. package/dist/src/semantics/tokens.js +44 -0
  106. package/dist/src/semantics/transfers.d.ts +2 -0
  107. package/dist/src/semantics/transfers.js +154 -0
  108. package/dist/src/semantics/treasury.d.ts +2 -0
  109. package/dist/src/semantics/treasury.js +377 -0
  110. package/dist/src/semantics/webhook-endpoints.d.ts +3 -0
  111. package/dist/src/semantics/webhook-endpoints.js +85 -0
  112. package/dist/src/stripe-budget.d.ts +55 -0
  113. package/dist/src/stripe-budget.js +155 -0
  114. package/dist/src/stripe-capabilities.d.ts +3 -0
  115. package/dist/src/stripe-capabilities.js +5052 -0
  116. package/dist/src/stripe-conformance.d.ts +41 -0
  117. package/dist/src/stripe-conformance.js +96 -0
  118. package/dist/src/stripe-connector.d.ts +161 -0
  119. package/dist/src/stripe-connector.js +414 -0
  120. package/dist/src/stripe-emit.d.ts +2 -0
  121. package/dist/src/stripe-emit.js +145 -0
  122. package/dist/src/stripe-events.d.ts +93 -0
  123. package/dist/src/stripe-events.js +388 -0
  124. package/dist/src/stripe-js.d.ts +4 -0
  125. package/dist/src/stripe-js.js +70 -0
  126. package/dist/src/stripe-mirror-ui.d.ts +15 -0
  127. package/dist/src/stripe-mirror-ui.js +87 -0
  128. package/dist/src/stripe-params.d.ts +3 -0
  129. package/dist/src/stripe-params.js +43 -0
  130. package/dist/src/stripe-perform-harness.d.ts +9 -0
  131. package/dist/src/stripe-perform-harness.js +26 -0
  132. package/dist/src/stripe-server.d.ts +33 -0
  133. package/dist/src/stripe-server.js +326 -0
  134. package/dist/src/stripe-shared.d.ts +106 -0
  135. package/dist/src/stripe-shared.js +273 -0
  136. package/dist/src/stripe-twin.d.ts +155 -0
  137. package/dist/src/stripe-twin.js +1226 -0
  138. package/dist/src/stripe-ui-conformance.d.ts +5 -0
  139. package/dist/src/stripe-ui-conformance.js +79 -0
  140. package/dist/src/stripe-ui-structure.d.ts +3 -0
  141. package/dist/src/stripe-ui-structure.js +168 -0
  142. package/dist/src/stripe-version.d.ts +10 -0
  143. package/dist/src/stripe-version.js +285 -0
  144. package/dist/test-fixtures/stripe-known-deviations.json +105 -0
  145. package/dist/test-fixtures/stripe-openapi-operations.SOURCE.md +14 -0
  146. package/dist/test-fixtures/stripe-openapi-operations.json +4717 -0
  147. package/dist/test-fixtures/stripe-schemas.SOURCE.md +35 -0
  148. package/dist/test-fixtures/stripe-schemas.json +3740 -0
  149. package/package.json +18 -10
  150. package/src/cli.ts +7 -7
  151. package/src/generated/events.gen.json +1 -0
  152. package/src/generated/surface.gen.json +1 -0
  153. package/src/generated/ui.gen.json +1 -0
  154. package/src/index.ts +31 -9
  155. package/src/manifest.ts +1097 -0
  156. package/src/screens/checkout.tsx +252 -0
  157. package/src/screens/consent-skin.ts +20 -0
  158. package/src/screens/financial-connections.tsx +101 -0
  159. package/src/screens/identity.tsx +96 -0
  160. package/src/screens/industries.ts +267 -0
  161. package/src/screens/onboarding.tsx +243 -0
  162. package/src/screens/portal.tsx +218 -0
  163. package/src/screens/public-details.tsx +105 -0
  164. package/src/semantics/after-payment.ts +113 -0
  165. package/src/semantics/apps-secrets.ts +58 -0
  166. package/src/semantics/balance.ts +209 -0
  167. package/src/semantics/billing.ts +216 -0
  168. package/src/semantics/charges.ts +211 -0
  169. package/src/semantics/checkout.ts +297 -0
  170. package/src/semantics/connect.ts +471 -0
  171. package/src/semantics/coupons.ts +97 -0
  172. package/src/semantics/credit-notes.ts +168 -0
  173. package/src/semantics/customers.ts +432 -0
  174. package/src/semantics/disputes.ts +62 -0
  175. package/src/semantics/entitlements.ts +94 -0
  176. package/src/semantics/ephemeral-keys.ts +34 -0
  177. package/src/semantics/files.ts +143 -0
  178. package/src/semantics/invoices.ts +541 -0
  179. package/src/semantics/issuing.ts +585 -0
  180. package/src/semantics/ledger.ts +216 -0
  181. package/src/semantics/payment-intents.ts +420 -0
  182. package/src/semantics/payment-links.ts +148 -0
  183. package/src/semantics/payment-methods.ts +143 -0
  184. package/src/semantics/plans.ts +131 -0
  185. package/src/semantics/platform.ts +220 -0
  186. package/src/semantics/products.ts +154 -0
  187. package/src/semantics/radar.ts +85 -0
  188. package/src/semantics/refunds.ts +218 -0
  189. package/src/semantics/renewals.ts +274 -0
  190. package/src/semantics/setup-intents.ts +87 -0
  191. package/src/semantics/shared.ts +215 -0
  192. package/src/semantics/subscription-schedules.ts +129 -0
  193. package/src/semantics/subscriptions.ts +610 -0
  194. package/src/semantics/tax.ts +220 -0
  195. package/src/semantics/terminal.ts +195 -0
  196. package/src/semantics/test-clocks.ts +77 -0
  197. package/src/semantics/tokens.ts +52 -0
  198. package/src/semantics/transfers.ts +174 -0
  199. package/src/semantics/treasury.ts +383 -0
  200. package/src/semantics/webhook-endpoints.ts +87 -0
  201. package/src/stripe-budget.ts +4 -4
  202. package/src/stripe-capabilities.ts +1456 -222
  203. package/src/stripe-conformance.ts +6 -5
  204. package/src/stripe-connector.ts +68 -40
  205. package/src/stripe-emit.ts +14 -7
  206. package/src/stripe-events.ts +94 -36
  207. package/src/stripe-js.ts +70 -0
  208. package/src/stripe-mirror-ui.ts +28 -298
  209. package/src/stripe-params.ts +44 -0
  210. package/src/stripe-perform-harness.ts +29 -0
  211. package/src/stripe-server.ts +263 -38
  212. package/src/stripe-shared.ts +294 -0
  213. package/src/stripe-twin.ts +429 -5325
  214. package/src/stripe-ui-conformance.ts +70 -107
  215. package/src/stripe-ui-structure.ts +124 -348
  216. package/src/stripe-version.ts +278 -0
  217. package/test-fixtures/stripe-known-deviations.json +2 -7
  218. package/test-fixtures/stripe-openapi-operations.json +1188 -2855
  219. package/src/stripe-form.ts +0 -35
@@ -0,0 +1,41 @@
1
+ import { specConformance } from '@volter/world-tooling';
2
+ type JsonSchema = specConformance.JsonSchema;
3
+ type KnownDeviation = specConformance.KnownDeviation;
4
+ type SpecViolation = specConformance.SpecViolation;
5
+ export type StripeSchemas = Record<string, JsonSchema>;
6
+ export type StripeViolation = SpecViolation & {
7
+ object: string;
8
+ id: string;
9
+ };
10
+ export type StripeConformanceReport = {
11
+ ok: boolean;
12
+ resourcesChecked: number;
13
+ fieldsChecked: number;
14
+ violations: StripeViolation[];
15
+ knownIgnored: number;
16
+ };
17
+ /** Load the vendored per-object Stripe JSON Schemas (type+required+enum from OpenAPI). */
18
+ export declare function loadStripeSchemas(): Promise<StripeSchemas>;
19
+ /** Load the declared scope (Stripe fields the twin does not model, + reasons). */
20
+ export declare function loadStripeKnownDeviations(): Promise<KnownDeviation[]>;
21
+ /**
22
+ * Validate every Stripe resource the twin serves (in `root`) against the published
23
+ * schema. A wrong type, an undeclared missing-required field, an enum violation, or
24
+ * a fabricated field fails the report.
25
+ */
26
+ export declare function checkStripeConformance(schemas: StripeSchemas, opts?: {
27
+ root?: string;
28
+ known?: KnownDeviation[];
29
+ }): StripeConformanceReport;
30
+ export type StripeCoverageReport = specConformance.SpecCoverageReport & {
31
+ object: string;
32
+ };
33
+ /**
34
+ * Per-object coverage: of the fields each Stripe object declares, which does the
35
+ * twin emit? Computed over one representative resource of each type present in
36
+ * `root` — the "what we emulate / what we're missing" report, from the spec.
37
+ */
38
+ export declare function stripeCoverage(schemas: StripeSchemas, opts?: {
39
+ root?: string;
40
+ }): StripeCoverageReport[];
41
+ export {};
@@ -0,0 +1,96 @@
1
+ // Stripe twin conformance (scorecard R2) — spec-conformance against Stripe's
2
+ // PUBLISHED OpenAPI, offline (no API key). Stripe is the twin we CANNOT dual-run
3
+ // against a live sandbox, so the published spec carries the most weight here.
4
+ //
5
+ // For every resource the twin emits, validate its REST body against the vendored
6
+ // per-object schema (test-fixtures/stripe-schemas.json) via the shared
7
+ // specConformance harness: declared TYPES, REQUIRED fields (omission), and ENUMS.
8
+ // Polymorphic Stripe fields (anyOf/$ref — `customer` may be id|object|null) are
9
+ // left untyped in the projection and so are not type-checked, avoiding false
10
+ // positives. Fields the twin deliberately does not model are DECLARED in
11
+ // stripe-known-deviations.json with reasons; an undeclared missing-required field,
12
+ // a wrong type, an enum violation, or a fabricated field all fail CI.
13
+ import { readFile } from 'node:fs/promises';
14
+ import { twinResources } from '@volter/world-core';
15
+ import { specConformance } from '@volter/world-tooling';
16
+ import { OBJECT_NAME } from "./stripe-twin.js";
17
+ // twin resource type -> Stripe OpenAPI object name (the resources the twin serves)
18
+ const TYPE_TO_OBJECT = {
19
+ charge: 'charge', customer: 'customer', payment_intent: 'payment_intent', refund: 'refund',
20
+ subscription: 'subscription', setup_intent: 'setup_intent', payment_method: 'payment_method',
21
+ price: 'price', product: 'product', invoice: 'invoice', invoiceitem: 'invoiceitem',
22
+ dispute: 'dispute', payout: 'payout', balance_transaction: 'balance_transaction', event: 'event',
23
+ checkout_session: 'checkout.session', billing_portal_session: 'billing_portal.session',
24
+ billing_portal_configuration: 'billing_portal.configuration',
25
+ account: 'account', transfer: 'transfer',
26
+ tax_rate: 'tax_rate', tax_calculation: 'tax.calculation', tax_registration: 'tax.registration',
27
+ credit_note: 'credit_note', tax_id: 'tax_id', customer_balance_transaction: 'customer_balance_transaction',
28
+ issuing_authorization: 'issuing.authorization', issuing_card: 'issuing.card',
29
+ issuing_cardholder: 'issuing.cardholder', issuing_transaction: 'issuing.transaction',
30
+ };
31
+ const isTwinExtra = (k) => k.startsWith('_');
32
+ const fixturePath = (name) => new URL(`../test-fixtures/${name}`, import.meta.url).pathname;
33
+ // The emitted REST body == the twin's view(): strip internal fields, add object + id.
34
+ // Mirrors stripe-twin.ts view(): a vendor `type` field collides with the kernel
35
+ // discriminator, so it is stored under `_stripe_type` and restored to `type` on emit.
36
+ function emitted(r) {
37
+ const { type, updatedAt, _stripe_type, ...rest } = r;
38
+ const out = { object: OBJECT_NAME[type] ?? type, ...rest, id: r.id };
39
+ if (_stripe_type !== undefined)
40
+ out.type = _stripe_type;
41
+ return out;
42
+ }
43
+ /** Load the vendored per-object Stripe JSON Schemas (type+required+enum from OpenAPI). */
44
+ export async function loadStripeSchemas() {
45
+ return JSON.parse(await readFile(fixturePath('stripe-schemas.json'), 'utf8'));
46
+ }
47
+ /** Load the declared scope (Stripe fields the twin does not model, + reasons). */
48
+ export async function loadStripeKnownDeviations() {
49
+ const doc = JSON.parse(await readFile(fixturePath('stripe-known-deviations.json'), 'utf8'));
50
+ return doc.deviations;
51
+ }
52
+ /**
53
+ * Validate every Stripe resource the twin serves (in `root`) against the published
54
+ * schema. A wrong type, an undeclared missing-required field, an enum violation, or
55
+ * a fabricated field fails the report.
56
+ */
57
+ export function checkStripeConformance(schemas, opts = {}) {
58
+ const resources = twinResources('stripe', opts.root);
59
+ const violations = [];
60
+ let fieldsChecked = 0;
61
+ let knownIgnored = 0;
62
+ for (const r of resources) {
63
+ const objectName = TYPE_TO_OBJECT[r.type];
64
+ if (!objectName)
65
+ continue;
66
+ const schema = schemas[objectName];
67
+ if (!schema)
68
+ continue;
69
+ const rep = specConformance.checkSpecConformance(emitted(r), schema, { exemptKey: isTwinExtra, known: opts.known ?? [] });
70
+ fieldsChecked += rep.fieldsChecked;
71
+ knownIgnored += rep.knownIgnored;
72
+ for (const v of rep.violations)
73
+ violations.push({ ...v, object: objectName, id: r.id });
74
+ }
75
+ return { ok: violations.length === 0, resourcesChecked: resources.length, fieldsChecked, violations, knownIgnored };
76
+ }
77
+ /**
78
+ * Per-object coverage: of the fields each Stripe object declares, which does the
79
+ * twin emit? Computed over one representative resource of each type present in
80
+ * `root` — the "what we emulate / what we're missing" report, from the spec.
81
+ */
82
+ export function stripeCoverage(schemas, opts = {}) {
83
+ const byType = new Map();
84
+ for (const r of twinResources('stripe', opts.root))
85
+ if (!byType.has(r.type))
86
+ byType.set(r.type, r);
87
+ const out = [];
88
+ for (const [type, r] of byType) {
89
+ const objectName = TYPE_TO_OBJECT[type];
90
+ const schema = objectName ? schemas[objectName] : undefined;
91
+ if (!objectName || !schema)
92
+ continue;
93
+ out.push({ object: objectName, ...specConformance.specCoverage(schema, emitted(r), { exemptKey: isTwinExtra }) });
94
+ }
95
+ return out;
96
+ }
@@ -0,0 +1,161 @@
1
+ import type { PerformContext, PushOutcome, RemoteExecute, SyncResource, TwinAction } from '@volter/world-core';
2
+ import { StripeBudget, type StripeBudgetOptions } from './stripe-budget.js';
3
+ export declare const INTERNAL_SUBJECT_TYPES: Set<string>;
4
+ /**
5
+ * The injected real-Stripe boundary. `request` issues ONE Stripe REST call:
6
+ * method — 'GET' | 'POST' | 'DELETE'
7
+ * path — e.g. '/v1/customers' or '/v1/customers/cus_123'
8
+ * params — form params (POST) or query filters (GET); omitted for plain GETs
9
+ * It returns the parsed JSON body (a Stripe object or `{ object: 'list', data }`) or
10
+ * a Stripe `{ error }` envelope. A real client (the `stripe` SDK or a raw fetch
11
+ * wrapper) is structurally assignable; tests pass a fake.
12
+ */
13
+ export type StripeExecute = (method: 'GET' | 'POST' | 'DELETE', path: string, params?: Record<string, unknown>) => Promise<{
14
+ object?: string;
15
+ data?: any;
16
+ error?: {
17
+ message?: string;
18
+ type?: string;
19
+ };
20
+ [k: string]: unknown;
21
+ }>;
22
+ /** Construction options for the live executor. `budget` cannot be null and cannot be loosened. */
23
+ export type LiveStripeOptions = {
24
+ /** Injected `fetch`, so a test can COUNT the requests the guard did or did not let through. */
25
+ fetchImpl?: typeof fetch;
26
+ /** An existing budget to share across executors. Omit and one is constructed. Cannot be null. */
27
+ budget?: StripeBudget;
28
+ /** Construction options for the default budget (ledger path, clock). Cannot loosen it. */
29
+ budgetOptions?: StripeBudgetOptions;
30
+ };
31
+ /**
32
+ * A live executor against the real Stripe REST API (secret key = the user's own).
33
+ * Form-encodes POST params; sends GET filters as a query string. Never imported by
34
+ * the pack's own code path — only constructed by a caller that opts into real I/O.
35
+ *
36
+ * THIS IS THE ONE PLACE this pack issues a live `api.stripe.com` request, and therefore the one
37
+ * place the rate budget has to be enforced — and Stripe is the pack where a runaway loop does not
38
+ * merely annoy a vendor, it MOVES MONEY. EVERY call is guarded: the budget is charged BEFORE the
39
+ * request goes out (`checkBudget`, which THROWS `StripeBudgetError` instead of returning when the
40
+ * ceiling or a cooldown says stop) and the response is fed back (`recordCall`) so a `Retry-After` /
41
+ * 429 signal becomes a persisted cooldown that makes every later call fail fast WITHOUT touching
42
+ * Stripe. There is deliberately no OPTION to disable the guard, and no
43
+ * value a caller can pass for `budget` that yields an unguarded client. That is NOT immunity from
44
+ * a caller who WANTS one: a fresh `budgetOptions.path` per construction, or an injected clock,
45
+ * restores the allowance, because the seam tests need cannot be denied to a determined caller in
46
+ * the same process. The kernel header states that limit and this does not upgrade it. See `stripe-budget.ts` for why,
47
+ * and for the limits of the guarantee.
48
+ */
49
+ export declare function liveStripeExecute(apiKey: string, base?: string, opts?: LiveStripeOptions): StripeExecute;
50
+ /**
51
+ * Map a real-Stripe customer (snake_case) → a twin sync resource. Only the stable
52
+ * scalar fields the twin tracks are carried; absent fields become null so the diff
53
+ * is faithful (an unset email reads as null, not missing).
54
+ */
55
+ export declare function mapCustomer(c: Record<string, unknown>): SyncResource;
56
+ /**
57
+ * Map a real-Stripe subscription (snake_case) → a twin sync resource. The single
58
+ * subscribed price id is lifted out of items.data[0].price.id (Stripe's nested list
59
+ * shape) so the twin tracks a flat, diffable `price`.
60
+ */
61
+ export declare function mapSubscription(s: Record<string, unknown>): SyncResource;
62
+ /**
63
+ * A GENERIC scalar mapper for the collections that don't need special id-lifting like
64
+ * subscriptions do. We carry the stable, diffable scalar fields a twin tracks (anything
65
+ * that is a string/number/boolean), dropping nested objects/arrays (which the twin either
66
+ * synthesizes or doesn't diff on). This keeps every collection's pull faithful without a
67
+ * bespoke mapper per type — vendor-SPECIFIC lifting (subscription.price) stays explicit.
68
+ */
69
+ export declare function mapScalarResource(type: string, r: Record<string, unknown>): SyncResource;
70
+ /** Pull real Stripe customers via the executor and map them to twin sync resources. */
71
+ export declare function pullStripeCustomers(execute: StripeExecute, opts?: {
72
+ limit?: number;
73
+ }): Promise<SyncResource[]>;
74
+ /** Pull real Stripe subscriptions via the executor and map them to twin sync resources. */
75
+ export declare function pullStripeSubscriptions(execute: StripeExecute, opts?: {
76
+ limit?: number;
77
+ }): Promise<SyncResource[]>;
78
+ export declare function syncStripeFromReal(execute: StripeExecute, opts: {
79
+ root?: string;
80
+ occurredAt: string;
81
+ limit?: number;
82
+ }): Promise<{
83
+ observed: number;
84
+ deltasAppended: number;
85
+ }>;
86
+ /**
87
+ * Resolve the REST (method, path) for ONE pending action — faithful to the real
88
+ * Stripe REST surface for EVERY write operation the twin records. The action carries
89
+ * the twin operation (`<type>.<verb>`) plus its subject:
90
+ * - `<type>.create` → POST /v1/<collection>
91
+ * - `subscription.cancel` → DELETE /v1/subscriptions/:id
92
+ * - `payout.cancel` → POST /v1/payouts/:id/cancel (sub-action)
93
+ * - `payment_intent.confirm` → POST /v1/payment_intents/:id/confirm
94
+ * - `setup_intent.confirm` → POST /v1/setup_intents/:id/confirm
95
+ * - `payment_method.detach` → POST /v1/payment_methods/:id/detach
96
+ * - `invoice.finalize|pay|void` → POST /v1/invoices/:id/<verb>
97
+ * - `dispute.close` → POST /v1/disputes/:id/close
98
+ * - `<type>.update` (or any other verb) → POST /v1/<collection>/:id
99
+ *
100
+ * Unknown/unsupported operations must FAIL LOUDLY at push time (see pushStripeAction),
101
+ * never be silently dropped — so this resolver always returns a concrete request and
102
+ * the caller validates the operation is one the twin is allowed to push.
103
+ */
104
+ export declare function stripeRequestForAction(action: Pick<TwinAction, 'operation' | 'subject'>): {
105
+ method: 'POST' | 'DELETE';
106
+ path: string;
107
+ };
108
+ /** Throw if `op` is not a write operation this connector can faithfully push. */
109
+ /** Whether this operation is one the connector can faithfully send to Stripe. */
110
+ export declare function isPushable(op: string): boolean;
111
+ /**
112
+ * Push ONE pending action to REAL Stripe via the injected executor. Returns the real
113
+ * external id (the Stripe object id from the response — for a create that is a freshly
114
+ * minted id; for an update it echoes the subject). WRITES TO THE REAL ACCOUNT.
115
+ */
116
+ export declare function pushStripeAction(execute: StripeExecute, action: Pick<TwinAction, 'operation' | 'subject' | 'fields'>): Promise<{
117
+ externalId: string;
118
+ }>;
119
+ /** The pack's executor over the kernel's: the same Stripe REST call, carried by the head. Stripe's API is
120
+ * form-encoded, which is what `stripeExecute` already speaks — this only carries it. */
121
+ export declare function stripeExecuteOver(execute: RemoteExecute): StripeExecute;
122
+ /** The refresh adapter: pull every modeled collection and the webhook endpoints through the executor. */
123
+ export declare function syncStripeFromRemote(execute: RemoteExecute, opts?: {
124
+ root?: string;
125
+ origin?: string;
126
+ occurredAt?: string;
127
+ }): Promise<{
128
+ observed: number;
129
+ deltasAppended: number;
130
+ }>;
131
+ /** The perform adapter: one entry crosses to Stripe, or settles with the reason it never could. The twin's
132
+ * own subject types — the recorded `event` envelopes the write path persists for the Events API, and the
133
+ * idempotency bookkeeping — are local state and must never be sent. */
134
+ export declare function performStripeAction(execute: RemoteExecute, action: TwinAction, _ctx: PerformContext): Promise<PushOutcome>;
135
+ /**
136
+ * Pull EVERY tracked collection from real Stripe (not just customers + subscriptions) in
137
+ * one pass and return the combined sync resources. This is the read half of a full sync.
138
+ */
139
+ export declare function pullStripeAll(execute: StripeExecute, opts?: {
140
+ limit?: number;
141
+ }): Promise<SyncResource[]>;
142
+ /** Pull the account's registered webhook endpoints (so the twin mirrors them too). */
143
+ export declare function pullStripeWebhookEndpoints(execute: StripeExecute, opts?: {
144
+ limit?: number;
145
+ }): Promise<SyncResource[]>;
146
+ /**
147
+ * FULL bi-directional sync over the injected client: (1) PUSH every pending local action to
148
+ * real Stripe and confirm it, then (2) PULL all collections + webhook endpoints back and
149
+ * fold them into the event log. Pushing first means the pull observes the twin's own writes
150
+ * as confirmed external state (no double-count). Returns per-direction counts. Same code
151
+ * path offline (fake executor) and live (real key) — D4-faithful.
152
+ */
153
+ export declare function fullSyncStripe(execute: StripeExecute, opts: {
154
+ root?: string;
155
+ occurredAt: string;
156
+ limit?: number;
157
+ }): Promise<{
158
+ observed: number;
159
+ deltasAppended: number;
160
+ collections: number;
161
+ }>;