@rewind-ai/cli 0.6.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 (244) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +39 -0
  4. package/dist/src/action/capture.d.ts +15 -0
  5. package/dist/src/action/capture.js +215 -0
  6. package/dist/src/action/capture.js.map +1 -0
  7. package/dist/src/action/mediate.d.ts +28 -0
  8. package/dist/src/action/mediate.js +109 -0
  9. package/dist/src/action/mediate.js.map +1 -0
  10. package/dist/src/action/mutate.d.ts +11 -0
  11. package/dist/src/action/mutate.js +189 -0
  12. package/dist/src/action/mutate.js.map +1 -0
  13. package/dist/src/action/objects.d.ts +5 -0
  14. package/dist/src/action/objects.js +50 -0
  15. package/dist/src/action/objects.js.map +1 -0
  16. package/dist/src/action/store.d.ts +24 -0
  17. package/dist/src/action/store.js +149 -0
  18. package/dist/src/action/store.js.map +1 -0
  19. package/dist/src/action/types.d.ts +84 -0
  20. package/dist/src/action/types.js +3 -0
  21. package/dist/src/action/types.js.map +1 -0
  22. package/dist/src/action/undo.d.ts +11 -0
  23. package/dist/src/action/undo.js +42 -0
  24. package/dist/src/action/undo.js.map +1 -0
  25. package/dist/src/adapters/filesystem.d.ts +35 -0
  26. package/dist/src/adapters/filesystem.js +499 -0
  27. package/dist/src/adapters/filesystem.js.map +1 -0
  28. package/dist/src/adapters/index.d.ts +7 -0
  29. package/dist/src/adapters/index.js +19 -0
  30. package/dist/src/adapters/index.js.map +1 -0
  31. package/dist/src/adapters/types.d.ts +54 -0
  32. package/dist/src/adapters/types.js +7 -0
  33. package/dist/src/adapters/types.js.map +1 -0
  34. package/dist/src/api/server.d.ts +25 -0
  35. package/dist/src/api/server.js +786 -0
  36. package/dist/src/api/server.js.map +1 -0
  37. package/dist/src/approval/store.d.ts +35 -0
  38. package/dist/src/approval/store.js +113 -0
  39. package/dist/src/approval/store.js.map +1 -0
  40. package/dist/src/checkpoint.d.ts +9 -0
  41. package/dist/src/checkpoint.js +140 -0
  42. package/dist/src/checkpoint.js.map +1 -0
  43. package/dist/src/cli/v5.d.ts +15 -0
  44. package/dist/src/cli/v5.js +110 -0
  45. package/dist/src/cli/v5.js.map +1 -0
  46. package/dist/src/cli.d.ts +2 -0
  47. package/dist/src/cli.js +823 -0
  48. package/dist/src/cli.js.map +1 -0
  49. package/dist/src/clients/types.d.ts +90 -0
  50. package/dist/src/clients/types.js +239 -0
  51. package/dist/src/clients/types.js.map +1 -0
  52. package/dist/src/commercial/auth/provider.d.ts +61 -0
  53. package/dist/src/commercial/auth/provider.js +227 -0
  54. package/dist/src/commercial/auth/provider.js.map +1 -0
  55. package/dist/src/commercial/entitlement/provider.d.ts +27 -0
  56. package/dist/src/commercial/entitlement/provider.js +192 -0
  57. package/dist/src/commercial/entitlement/provider.js.map +1 -0
  58. package/dist/src/commercial/entitlement/signing.d.ts +61 -0
  59. package/dist/src/commercial/entitlement/signing.js +124 -0
  60. package/dist/src/commercial/entitlement/signing.js.map +1 -0
  61. package/dist/src/commercial/env.d.ts +10 -0
  62. package/dist/src/commercial/env.js +40 -0
  63. package/dist/src/commercial/env.js.map +1 -0
  64. package/dist/src/commercial/product.d.ts +26 -0
  65. package/dist/src/commercial/product.js +39 -0
  66. package/dist/src/commercial/product.js.map +1 -0
  67. package/dist/src/commercial/store.d.ts +46 -0
  68. package/dist/src/commercial/store.js +104 -0
  69. package/dist/src/commercial/store.js.map +1 -0
  70. package/dist/src/commercial/stripe/checkout.d.ts +104 -0
  71. package/dist/src/commercial/stripe/checkout.js +469 -0
  72. package/dist/src/commercial/stripe/checkout.js.map +1 -0
  73. package/dist/src/core/compatibility.d.ts +15 -0
  74. package/dist/src/core/compatibility.js +226 -0
  75. package/dist/src/core/compatibility.js.map +1 -0
  76. package/dist/src/core/engine.d.ts +33 -0
  77. package/dist/src/core/engine.js +432 -0
  78. package/dist/src/core/engine.js.map +1 -0
  79. package/dist/src/core/lifecycle.d.ts +17 -0
  80. package/dist/src/core/lifecycle.js +56 -0
  81. package/dist/src/core/lifecycle.js.map +1 -0
  82. package/dist/src/core/types.d.ts +140 -0
  83. package/dist/src/core/types.js +37 -0
  84. package/dist/src/core/types.js.map +1 -0
  85. package/dist/src/destroy.d.ts +21 -0
  86. package/dist/src/destroy.js +219 -0
  87. package/dist/src/destroy.js.map +1 -0
  88. package/dist/src/diff.d.ts +13 -0
  89. package/dist/src/diff.js +251 -0
  90. package/dist/src/diff.js.map +1 -0
  91. package/dist/src/enforcement/detect.d.ts +13 -0
  92. package/dist/src/enforcement/detect.js +75 -0
  93. package/dist/src/enforcement/detect.js.map +1 -0
  94. package/dist/src/enforcement/hook-policy.d.ts +38 -0
  95. package/dist/src/enforcement/hook-policy.js +111 -0
  96. package/dist/src/enforcement/hook-policy.js.map +1 -0
  97. package/dist/src/enforcement/index.d.ts +8 -0
  98. package/dist/src/enforcement/index.js +8 -0
  99. package/dist/src/enforcement/index.js.map +1 -0
  100. package/dist/src/enforcement/perf.d.ts +6 -0
  101. package/dist/src/enforcement/perf.js +18 -0
  102. package/dist/src/enforcement/perf.js.map +1 -0
  103. package/dist/src/enforcement/policy.d.ts +12 -0
  104. package/dist/src/enforcement/policy.js +84 -0
  105. package/dist/src/enforcement/policy.js.map +1 -0
  106. package/dist/src/enforcement/readonly.d.ts +17 -0
  107. package/dist/src/enforcement/readonly.js +124 -0
  108. package/dist/src/enforcement/readonly.js.map +1 -0
  109. package/dist/src/enforcement/sandbox-clone.d.ts +6 -0
  110. package/dist/src/enforcement/sandbox-clone.js +11 -0
  111. package/dist/src/enforcement/sandbox-clone.js.map +1 -0
  112. package/dist/src/enforcement/setup.d.ts +33 -0
  113. package/dist/src/enforcement/setup.js +168 -0
  114. package/dist/src/enforcement/setup.js.map +1 -0
  115. package/dist/src/enforcement/trust.d.ts +10 -0
  116. package/dist/src/enforcement/trust.js +71 -0
  117. package/dist/src/enforcement/trust.js.map +1 -0
  118. package/dist/src/enforcement/types.d.ts +40 -0
  119. package/dist/src/enforcement/types.js +3 -0
  120. package/dist/src/enforcement/types.js.map +1 -0
  121. package/dist/src/entitlement/provider.d.ts +48 -0
  122. package/dist/src/entitlement/provider.js +95 -0
  123. package/dist/src/entitlement/provider.js.map +1 -0
  124. package/dist/src/hash.d.ts +9 -0
  125. package/dist/src/hash.js +23 -0
  126. package/dist/src/hash.js.map +1 -0
  127. package/dist/src/ledger/query.d.ts +19 -0
  128. package/dist/src/ledger/query.js +158 -0
  129. package/dist/src/ledger/query.js.map +1 -0
  130. package/dist/src/manifest.d.ts +32 -0
  131. package/dist/src/manifest.js +242 -0
  132. package/dist/src/manifest.js.map +1 -0
  133. package/dist/src/mcp/server.d.ts +7 -0
  134. package/dist/src/mcp/server.js +364 -0
  135. package/dist/src/mcp/server.js.map +1 -0
  136. package/dist/src/paths.d.ts +94 -0
  137. package/dist/src/paths.js +354 -0
  138. package/dist/src/paths.js.map +1 -0
  139. package/dist/src/permission/engine.d.ts +15 -0
  140. package/dist/src/permission/engine.js +147 -0
  141. package/dist/src/permission/engine.js.map +1 -0
  142. package/dist/src/permission/types.d.ts +42 -0
  143. package/dist/src/permission/types.js +3 -0
  144. package/dist/src/permission/types.js.map +1 -0
  145. package/dist/src/product/setup.d.ts +35 -0
  146. package/dist/src/product/setup.js +300 -0
  147. package/dist/src/product/setup.js.map +1 -0
  148. package/dist/src/protect/audit.d.ts +5 -0
  149. package/dist/src/protect/audit.js +26 -0
  150. package/dist/src/protect/audit.js.map +1 -0
  151. package/dist/src/protect/capture.d.ts +7 -0
  152. package/dist/src/protect/capture.js +250 -0
  153. package/dist/src/protect/capture.js.map +1 -0
  154. package/dist/src/protect/fingerprint.d.ts +4 -0
  155. package/dist/src/protect/fingerprint.js +49 -0
  156. package/dist/src/protect/fingerprint.js.map +1 -0
  157. package/dist/src/protect/hook-cli.d.ts +2 -0
  158. package/dist/src/protect/hook-cli.js +107 -0
  159. package/dist/src/protect/hook-cli.js.map +1 -0
  160. package/dist/src/protect/index.d.ts +12 -0
  161. package/dist/src/protect/index.js +12 -0
  162. package/dist/src/protect/index.js.map +1 -0
  163. package/dist/src/protect/install.d.ts +34 -0
  164. package/dist/src/protect/install.js +293 -0
  165. package/dist/src/protect/install.js.map +1 -0
  166. package/dist/src/protect/intercept.d.ts +11 -0
  167. package/dist/src/protect/intercept.js +390 -0
  168. package/dist/src/protect/intercept.js.map +1 -0
  169. package/dist/src/protect/protect.d.ts +17 -0
  170. package/dist/src/protect/protect.js +194 -0
  171. package/dist/src/protect/protect.js.map +1 -0
  172. package/dist/src/protect/root-paths.d.ts +13 -0
  173. package/dist/src/protect/root-paths.js +140 -0
  174. package/dist/src/protect/root-paths.js.map +1 -0
  175. package/dist/src/protect/shell-policy.d.ts +17 -0
  176. package/dist/src/protect/shell-policy.js +269 -0
  177. package/dist/src/protect/shell-policy.js.map +1 -0
  178. package/dist/src/protect/status.d.ts +11 -0
  179. package/dist/src/protect/status.js +165 -0
  180. package/dist/src/protect/status.js.map +1 -0
  181. package/dist/src/protect/store.d.ts +20 -0
  182. package/dist/src/protect/store.js +170 -0
  183. package/dist/src/protect/store.js.map +1 -0
  184. package/dist/src/protect/types.d.ts +116 -0
  185. package/dist/src/protect/types.js +3 -0
  186. package/dist/src/protect/types.js.map +1 -0
  187. package/dist/src/protect/undo-session.d.ts +14 -0
  188. package/dist/src/protect/undo-session.js +182 -0
  189. package/dist/src/protect/undo-session.js.map +1 -0
  190. package/dist/src/restore.d.ts +39 -0
  191. package/dist/src/restore.js +141 -0
  192. package/dist/src/restore.js.map +1 -0
  193. package/dist/src/sandbox.d.ts +23 -0
  194. package/dist/src/sandbox.js +198 -0
  195. package/dist/src/sandbox.js.map +1 -0
  196. package/dist/src/session/ambient.d.ts +10 -0
  197. package/dist/src/session/ambient.js +53 -0
  198. package/dist/src/session/ambient.js.map +1 -0
  199. package/dist/src/session/attribution.d.ts +27 -0
  200. package/dist/src/session/attribution.js +201 -0
  201. package/dist/src/session/attribution.js.map +1 -0
  202. package/dist/src/session/index.d.ts +25 -0
  203. package/dist/src/session/index.js +472 -0
  204. package/dist/src/session/index.js.map +1 -0
  205. package/dist/src/session/process.d.ts +34 -0
  206. package/dist/src/session/process.js +234 -0
  207. package/dist/src/session/process.js.map +1 -0
  208. package/dist/src/session/store.d.ts +14 -0
  209. package/dist/src/session/store.js +125 -0
  210. package/dist/src/session/store.js.map +1 -0
  211. package/dist/src/session/types.d.ts +111 -0
  212. package/dist/src/session/types.js +3 -0
  213. package/dist/src/session/types.js.map +1 -0
  214. package/dist/src/session/watcher.d.ts +32 -0
  215. package/dist/src/session/watcher.js +186 -0
  216. package/dist/src/session/watcher.js.map +1 -0
  217. package/dist/src/timing.d.ts +7 -0
  218. package/dist/src/timing.js +19 -0
  219. package/dist/src/timing.js.map +1 -0
  220. package/dist/src/types.d.ts +101 -0
  221. package/dist/src/types.js +3 -0
  222. package/dist/src/types.js.map +1 -0
  223. package/dist/src/verify.d.ts +8 -0
  224. package/dist/src/verify.js +126 -0
  225. package/dist/src/verify.js.map +1 -0
  226. package/docs/ADAPTERS.md +37 -0
  227. package/docs/APPROVALS.md +32 -0
  228. package/docs/ARCHITECTURE.md +57 -0
  229. package/docs/ATTRIBUTION.md +179 -0
  230. package/docs/COMMERCIAL.md +51 -0
  231. package/docs/CURSOR-ENFORCEMENT.md +73 -0
  232. package/docs/ENFORCEMENT.md +134 -0
  233. package/docs/FUTURE.md +91 -0
  234. package/docs/HUMAN-SETUP.md +98 -0
  235. package/docs/IDENTITY-AUTHORITY.md +35 -0
  236. package/docs/MCP.md +107 -0
  237. package/docs/PACKAGING.md +77 -0
  238. package/docs/PERMISSIONS.md +53 -0
  239. package/docs/PRODUCT-V5.md +63 -0
  240. package/docs/PRODUCT-V6.md +69 -0
  241. package/docs/PROTECTED-SESSIONS.md +155 -0
  242. package/docs/THREAT-MODEL.md +84 -0
  243. package/docs/TRANSACTIONS.md +57 -0
  244. package/package.json +85 -0
@@ -0,0 +1,469 @@
1
+ /**
2
+ * Stripe TEST MODE integration.
3
+ * Secrets via env only — never commit.
4
+ *
5
+ * REWIND_STRIPE_SECRET_KEY=sk_test_…
6
+ * REWIND_STRIPE_WEBHOOK_SECRET=whsec_…
7
+ * REWIND_STRIPE_PRICE_ID=price_… (REWIND Personal £2.99 GBP/mo)
8
+ * REWIND_STRIPE_PUBLISHABLE_KEY=pk_test_…
9
+ */
10
+ import { createHmac, timingSafeEqual } from "node:crypto";
11
+ import Stripe from "stripe";
12
+ import { loadStore, saveStore, appendEntitlementEvent, commercialDataDir, } from "../store.js";
13
+ import { LIST_CURRENCY, LIST_PRICE_GBP_MONTHLY, PRODUCT_NAME } from "../product.js";
14
+ import { loadRewindEnv } from "../env.js";
15
+ let stripeClientOverride = null;
16
+ /** Test-only: inject a mock Stripe client (no network). */
17
+ export function setStripeClientForTests(client) {
18
+ stripeClientOverride = client;
19
+ }
20
+ export function loadStripeConfig() {
21
+ loadRewindEnv();
22
+ const secretKey = process.env.REWIND_STRIPE_SECRET_KEY ?? null;
23
+ const testMode = !secretKey || secretKey.startsWith("sk_test_");
24
+ return {
25
+ secretKey,
26
+ webhookSecret: process.env.REWIND_STRIPE_WEBHOOK_SECRET ?? null,
27
+ priceId: process.env.REWIND_STRIPE_PRICE_ID ?? null,
28
+ publishableKey: process.env.REWIND_STRIPE_PUBLISHABLE_KEY ?? null,
29
+ testMode,
30
+ };
31
+ }
32
+ /** True when TEST secret + price are set — real Checkout, not simulated. */
33
+ export function isRealStripeTestConfigured() {
34
+ const cfg = loadStripeConfig();
35
+ return Boolean(cfg.secretKey &&
36
+ cfg.secretKey.startsWith("sk_test_") &&
37
+ cfg.priceId &&
38
+ cfg.priceId.startsWith("price_"));
39
+ }
40
+ export function assertTestModeOrThrow() {
41
+ const cfg = loadStripeConfig();
42
+ if (cfg.secretKey && !cfg.testMode && process.env.REWIND_ALLOW_LIVE_STRIPE !== "1") {
43
+ throw new Error("Refusing live Stripe keys unless REWIND_ALLOW_LIVE_STRIPE=1. Use sk_test_ keys.");
44
+ }
45
+ }
46
+ function getStripeClient(secretKey) {
47
+ if (stripeClientOverride)
48
+ return stripeClientOverride;
49
+ return new Stripe(secretKey);
50
+ }
51
+ /** Verify Stripe-Signature header (idempotent-friendly). */
52
+ export function verifyStripeWebhookSignature(payload, header, secret, toleranceSec = 300) {
53
+ const parts = Object.fromEntries(header.split(",").map((p) => {
54
+ const [k, v] = p.split("=");
55
+ return [k?.trim() ?? "", v?.trim() ?? ""];
56
+ }));
57
+ const ts = parts.t;
58
+ const sig = parts.v1;
59
+ if (!ts || !sig)
60
+ return { ok: false, reason: "missing signature fields" };
61
+ const age = Math.abs(Date.now() / 1000 - Number(ts));
62
+ if (!Number.isFinite(Number(ts)) || age > toleranceSec) {
63
+ return { ok: false, reason: "timestamp outside tolerance" };
64
+ }
65
+ const expected = createHmac("sha256", secret)
66
+ .update(`${ts}.${payload}`)
67
+ .digest("hex");
68
+ const a = Buffer.from(expected, "utf8");
69
+ const b = Buffer.from(sig, "utf8");
70
+ if (a.length !== b.length || !timingSafeEqual(a, b)) {
71
+ return { ok: false, reason: "signature mismatch" };
72
+ }
73
+ return { ok: true };
74
+ }
75
+ function ensureSubscriptionRow(store, userId, eventId) {
76
+ let sub = store.subscriptions.find((s) => s.userId === userId);
77
+ if (!sub) {
78
+ sub = {
79
+ id: `sub_${eventId}`,
80
+ userId,
81
+ status: "none",
82
+ plan: "free",
83
+ stripeSubscriptionId: null,
84
+ stripePriceId: null,
85
+ currentPeriodEnd: null,
86
+ cancelAtPeriodEnd: false,
87
+ updatedAt: new Date().toISOString(),
88
+ };
89
+ store.subscriptions.push(sub);
90
+ }
91
+ return sub;
92
+ }
93
+ function findUser(store, opts) {
94
+ if (opts.userId) {
95
+ const byId = store.users.find((u) => u.id === opts.userId);
96
+ if (byId)
97
+ return byId;
98
+ }
99
+ if (opts.customerId) {
100
+ return store.users.find((u) => u.stripeCustomerId === opts.customerId);
101
+ }
102
+ return undefined;
103
+ }
104
+ function mapStripeStatus(status) {
105
+ const statusMap = {
106
+ active: "active",
107
+ trialing: "trialing",
108
+ past_due: "past_due",
109
+ canceled: "canceled",
110
+ unpaid: "unpaid",
111
+ incomplete: "none",
112
+ incomplete_expired: "canceled",
113
+ paused: "past_due",
114
+ };
115
+ if (!status)
116
+ return null;
117
+ return statusMap[status] ?? null;
118
+ }
119
+ function applyPlanFromStatus(status) {
120
+ return status === "active" || status === "trialing" ? "personal" : "free";
121
+ }
122
+ /**
123
+ * Create checkout. Without Stripe TEST credentials, simulates locally
124
+ * (activates Personal on confirm) so the product flow is provable offline.
125
+ * With sk_test_ + price_…, creates a real Stripe Checkout Session.
126
+ */
127
+ export async function createCheckoutSession(input) {
128
+ assertTestModeOrThrow();
129
+ const cfg = loadStripeConfig();
130
+ if (!isRealStripeTestConfigured()) {
131
+ const sessionId = `cs_test_${Date.now().toString(16)}`;
132
+ return {
133
+ mode: "test-simulated",
134
+ url: null,
135
+ sessionId,
136
+ message: `SIMULATED DEVELOPMENT MODE — Stripe TEST credentials not configured. ` +
137
+ `Simulated checkout for ${PRODUCT_NAME} ` +
138
+ `(£${LIST_PRICE_GBP_MONTHLY} ${LIST_CURRENCY}/mo) for ${input.email}. ` +
139
+ `Set REWIND_STRIPE_SECRET_KEY (sk_test_…) and REWIND_STRIPE_PRICE_ID for real sandbox Checkout.`,
140
+ };
141
+ }
142
+ const stripe = getStripeClient(cfg.secretKey);
143
+ const dir = commercialDataDir();
144
+ const store = await loadStore(dir);
145
+ const user = store.users.find((u) => u.id === input.userId);
146
+ if (!user) {
147
+ throw new Error(`Unknown REWIND user ${input.userId}. Run: rewind login`);
148
+ }
149
+ let customerId = user.stripeCustomerId;
150
+ if (!customerId) {
151
+ const customer = await stripe.customers.create({
152
+ email: input.email,
153
+ metadata: { rewindUserId: input.userId },
154
+ });
155
+ customerId = customer.id;
156
+ user.stripeCustomerId = customerId;
157
+ await saveStore(store, dir);
158
+ }
159
+ const session = await stripe.checkout.sessions.create({
160
+ mode: "subscription",
161
+ customer: customerId,
162
+ client_reference_id: input.userId,
163
+ metadata: { rewindUserId: input.userId },
164
+ line_items: [{ price: cfg.priceId, quantity: 1 }],
165
+ success_url: input.successUrl,
166
+ cancel_url: input.cancelUrl,
167
+ subscription_data: {
168
+ metadata: { rewindUserId: input.userId },
169
+ },
170
+ });
171
+ if (!session.url) {
172
+ throw new Error("Stripe Checkout Session created without a URL");
173
+ }
174
+ await appendEntitlementEvent({
175
+ type: "checkout_session_created",
176
+ userId: input.userId,
177
+ sessionId: session.id,
178
+ mode: "stripe",
179
+ }, dir);
180
+ return {
181
+ mode: "stripe",
182
+ url: session.url,
183
+ sessionId: session.id,
184
+ message: `STRIPE TEST MODE — real Checkout Session for ${PRODUCT_NAME} ` +
185
+ `(£${LIST_PRICE_GBP_MONTHLY} ${LIST_CURRENCY}/mo). ` +
186
+ `Complete payment in the browser. Personal activates only after a signed Stripe webhook.`,
187
+ };
188
+ }
189
+ export async function confirmSimulatedCheckout(userId, sessionId) {
190
+ const dir = commercialDataDir();
191
+ const store = await loadStore(dir);
192
+ let sub = store.subscriptions.find((s) => s.userId === userId);
193
+ if (!sub) {
194
+ sub = {
195
+ id: `sub_${sessionId}`,
196
+ userId,
197
+ status: "active",
198
+ plan: "personal",
199
+ stripeSubscriptionId: `sub_sim_${sessionId}`,
200
+ stripePriceId: "price_test_simulated",
201
+ currentPeriodEnd: new Date(Date.now() + 30 * 86400_000).toISOString(),
202
+ cancelAtPeriodEnd: false,
203
+ updatedAt: new Date().toISOString(),
204
+ };
205
+ store.subscriptions.push(sub);
206
+ }
207
+ else {
208
+ sub.status = "active";
209
+ sub.plan = "personal";
210
+ sub.stripeSubscriptionId = `sub_sim_${sessionId}`;
211
+ sub.stripePriceId = "price_test_simulated";
212
+ sub.currentPeriodEnd = new Date(Date.now() + 30 * 86400_000).toISOString();
213
+ sub.cancelAtPeriodEnd = false;
214
+ sub.updatedAt = new Date().toISOString();
215
+ }
216
+ await saveStore(store, dir);
217
+ await appendEntitlementEvent({
218
+ type: "subscription_activated",
219
+ userId,
220
+ sessionId,
221
+ plan: "personal",
222
+ mode: "test-simulated",
223
+ }, dir);
224
+ }
225
+ /**
226
+ * Legacy/test helper: apply a simplified webhook payload.
227
+ * Prefer applyStripeEvent for real Stripe Event objects.
228
+ */
229
+ export async function applyStripeWebhookEvent(eventId, type, data) {
230
+ return applyNormalizedWebhook({
231
+ eventId,
232
+ type,
233
+ userId: data.userId ?? null,
234
+ customerId: data.customerId ?? null,
235
+ subscriptionId: data.subscriptionId ?? null,
236
+ status: data.status ?? null,
237
+ priceId: data.priceId ?? null,
238
+ ...(data.cancelAtPeriodEnd !== undefined
239
+ ? { cancelAtPeriodEnd: data.cancelAtPeriodEnd }
240
+ : {}),
241
+ ...(data.currentPeriodEnd !== undefined
242
+ ? { currentPeriodEnd: data.currentPeriodEnd }
243
+ : {}),
244
+ });
245
+ }
246
+ async function applyNormalizedWebhook(input) {
247
+ const dir = commercialDataDir();
248
+ const store = await loadStore(dir);
249
+ if (store.processedStripeEvents.includes(input.eventId)) {
250
+ return {
251
+ applied: false,
252
+ duplicate: true,
253
+ userId: null,
254
+ plan: null,
255
+ status: null,
256
+ };
257
+ }
258
+ store.processedStripeEvents.push(input.eventId);
259
+ if (store.processedStripeEvents.length > 5000) {
260
+ store.processedStripeEvents = store.processedStripeEvents.slice(-2500);
261
+ }
262
+ const user = findUser(store, {
263
+ userId: input.userId,
264
+ customerId: input.customerId,
265
+ });
266
+ let plan = null;
267
+ let status = null;
268
+ if (user) {
269
+ if (input.customerId && !user.stripeCustomerId) {
270
+ user.stripeCustomerId = input.customerId;
271
+ }
272
+ const sub = ensureSubscriptionRow(store, user.id, input.eventId);
273
+ if (input.subscriptionId)
274
+ sub.stripeSubscriptionId = input.subscriptionId;
275
+ if (input.priceId)
276
+ sub.stripePriceId = input.priceId;
277
+ if (input.cancelAtPeriodEnd !== undefined) {
278
+ sub.cancelAtPeriodEnd = input.cancelAtPeriodEnd;
279
+ }
280
+ if (input.currentPeriodEnd) {
281
+ sub.currentPeriodEnd = new Date(input.currentPeriodEnd * 1000).toISOString();
282
+ }
283
+ if (input.type === "customer.subscription.deleted" ||
284
+ input.type === "invoice.payment_failed") {
285
+ if (input.type === "customer.subscription.deleted") {
286
+ sub.status = "canceled";
287
+ sub.plan = "free";
288
+ }
289
+ else {
290
+ sub.status = "past_due";
291
+ // past_due is not Personal
292
+ sub.plan = "free";
293
+ }
294
+ }
295
+ else {
296
+ const mapped = mapStripeStatus(input.status);
297
+ if (mapped) {
298
+ sub.status = mapped;
299
+ sub.plan = applyPlanFromStatus(mapped);
300
+ }
301
+ }
302
+ sub.updatedAt = new Date().toISOString();
303
+ plan = sub.plan;
304
+ status = sub.status;
305
+ }
306
+ await saveStore(store, dir);
307
+ await appendEntitlementEvent({
308
+ type: "stripe_webhook",
309
+ eventId: input.eventId,
310
+ stripeType: input.type,
311
+ userId: user?.id ?? null,
312
+ plan,
313
+ status,
314
+ }, dir);
315
+ if (user) {
316
+ try {
317
+ const { issueEntitlementForUser } = await import("../entitlement/provider.js");
318
+ await issueEntitlementForUser(user.id);
319
+ }
320
+ catch {
321
+ /* store updated; cache refresh best-effort */
322
+ }
323
+ }
324
+ return {
325
+ applied: true,
326
+ duplicate: false,
327
+ userId: user?.id ?? null,
328
+ plan,
329
+ status,
330
+ };
331
+ }
332
+ function metaUserId(obj) {
333
+ return (obj.metadata?.rewindUserId ??
334
+ obj.client_reference_id ??
335
+ null);
336
+ }
337
+ function priceFromSubscription(sub) {
338
+ const item = sub.items?.data?.[0];
339
+ if (!item?.price)
340
+ return null;
341
+ return typeof item.price === "string" ? item.price : item.price.id ?? null;
342
+ }
343
+ /** Apply a real Stripe Event object (after signature verification). */
344
+ export async function applyStripeEvent(event) {
345
+ const obj = event.data.object;
346
+ const type = event.type;
347
+ if (type === "checkout.session.completed") {
348
+ const session = obj;
349
+ const customerId = typeof session.customer === "string"
350
+ ? session.customer
351
+ : session.customer?.id ?? null;
352
+ const subscriptionId = typeof session.subscription === "string"
353
+ ? session.subscription
354
+ : session.subscription?.id ?? null;
355
+ const userId = metaUserId(session);
356
+ // Link customer; mark active when subscription present (Checkout completed).
357
+ return applyNormalizedWebhook({
358
+ eventId: event.id,
359
+ type,
360
+ userId,
361
+ customerId,
362
+ subscriptionId,
363
+ status: subscriptionId ? "active" : null,
364
+ priceId: null,
365
+ });
366
+ }
367
+ if (type === "customer.subscription.created" ||
368
+ type === "customer.subscription.updated" ||
369
+ type === "customer.subscription.deleted") {
370
+ const sub = obj;
371
+ const customerId = typeof sub.customer === "string" ? sub.customer : sub.customer?.id ?? null;
372
+ return applyNormalizedWebhook({
373
+ eventId: event.id,
374
+ type,
375
+ userId: metaUserId(sub),
376
+ customerId,
377
+ subscriptionId: sub.id ?? null,
378
+ status: sub.status ?? null,
379
+ priceId: priceFromSubscription(sub),
380
+ ...(sub.cancel_at_period_end !== undefined
381
+ ? { cancelAtPeriodEnd: sub.cancel_at_period_end }
382
+ : {}),
383
+ ...(sub.current_period_end !== undefined
384
+ ? { currentPeriodEnd: sub.current_period_end }
385
+ : {}),
386
+ });
387
+ }
388
+ if (type === "invoice.payment_failed") {
389
+ const invoice = obj;
390
+ const customerId = typeof invoice.customer === "string"
391
+ ? invoice.customer
392
+ : invoice.customer?.id ?? null;
393
+ const subscriptionId = typeof invoice.subscription === "string"
394
+ ? invoice.subscription
395
+ : invoice.subscription?.id ?? null;
396
+ return applyNormalizedWebhook({
397
+ eventId: event.id,
398
+ type,
399
+ userId: metaUserId(invoice),
400
+ customerId,
401
+ subscriptionId,
402
+ status: "past_due",
403
+ priceId: null,
404
+ });
405
+ }
406
+ // Unhandled types: still record idempotency so retries are no-ops
407
+ return applyNormalizedWebhook({
408
+ eventId: event.id,
409
+ type,
410
+ userId: null,
411
+ customerId: null,
412
+ subscriptionId: null,
413
+ status: null,
414
+ priceId: null,
415
+ });
416
+ }
417
+ /**
418
+ * HTTP webhook entry: verify raw body signature, then apply event.
419
+ * Never log secrets.
420
+ */
421
+ export async function handleStripeWebhookHttp(rawBody, signatureHeader) {
422
+ loadRewindEnv();
423
+ const cfg = loadStripeConfig();
424
+ if (!cfg.webhookSecret) {
425
+ return {
426
+ httpStatus: 503,
427
+ body: { error: "REWIND_STRIPE_WEBHOOK_SECRET not configured" },
428
+ };
429
+ }
430
+ if (!signatureHeader) {
431
+ return { httpStatus: 400, body: { error: "missing Stripe-Signature header" } };
432
+ }
433
+ const verified = verifyStripeWebhookSignature(rawBody, signatureHeader, cfg.webhookSecret);
434
+ if (!verified.ok) {
435
+ return {
436
+ httpStatus: 400,
437
+ body: { error: "invalid signature", reason: verified.reason },
438
+ };
439
+ }
440
+ let event;
441
+ try {
442
+ event = JSON.parse(rawBody);
443
+ if (!event?.id || !event?.type || !event?.data?.object) {
444
+ return { httpStatus: 400, body: { error: "invalid event payload" } };
445
+ }
446
+ }
447
+ catch {
448
+ return { httpStatus: 400, body: { error: "invalid JSON body" } };
449
+ }
450
+ const result = await applyStripeEvent(event);
451
+ return {
452
+ httpStatus: 200,
453
+ body: {
454
+ received: true,
455
+ duplicate: result.duplicate,
456
+ applied: result.applied,
457
+ userId: result.userId,
458
+ plan: result.plan,
459
+ status: result.status,
460
+ },
461
+ };
462
+ }
463
+ export function billingPortalMessage() {
464
+ return ("Open Stripe Customer Portal when REWIND_STRIPE_SECRET_KEY is set. " +
465
+ "Test mode: use Stripe Dashboard → Customers → manage subscription.");
466
+ }
467
+ /** Default local API port (loopback). */
468
+ export const LOCAL_API_DEFAULT_PORT = 7429;
469
+ //# sourceMappingURL=checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../../../src/commercial/stripe/checkout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Bidirectional mapping between V2 ActionRecord and V5 Transaction.
3
+ * On-disk ledger remains act_*.json ActionRecord for FS backwards compatibility.
4
+ */
5
+ import type { ActionRecord, ActionTool } from "../action/types.js";
6
+ import { emptyUndoInfo, type Transaction } from "./types.js";
7
+ export declare function operationToTool(operation: string, createOnly?: boolean): ActionTool;
8
+ export declare function actionRecordToTransaction(action: ActionRecord): Transaction;
9
+ /**
10
+ * Convert a filesystem Transaction back to ActionRecord for the v2 ledger.
11
+ * Only valid for adapter === filesystem with filesystem state payloads.
12
+ */
13
+ export declare function transactionToActionRecord(txn: Transaction): ActionRecord;
14
+ export declare function isActionRecord(raw: unknown): raw is ActionRecord;
15
+ export { emptyUndoInfo };