codebuff 1.0.136 → 1.0.138

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 (48) hide show
  1. package/dist/__tests__/tool-handlers.test.js +3 -2
  2. package/dist/__tests__/tool-handlers.test.js.map +1 -1
  3. package/dist/chat-storage.js +17 -7
  4. package/dist/chat-storage.js.map +1 -1
  5. package/dist/cli.js +17 -7
  6. package/dist/cli.js.map +1 -1
  7. package/dist/client.js +18 -8
  8. package/dist/client.js.map +1 -1
  9. package/dist/code-map/languages.js +17 -7
  10. package/dist/code-map/languages.js.map +1 -1
  11. package/dist/code-map/parse.js +17 -7
  12. package/dist/code-map/parse.js.map +1 -1
  13. package/dist/code-map/tsconfig.tsbuildinfo +1 -1
  14. package/dist/common/constants.js +2 -0
  15. package/dist/common/constants.js.map +1 -1
  16. package/dist/common/types/usage.d.ts +2 -2
  17. package/dist/common/util/credentials.d.ts +2 -2
  18. package/dist/common/util/string.d.ts +1 -0
  19. package/dist/common/util/string.js +7 -1
  20. package/dist/common/util/string.js.map +1 -1
  21. package/dist/index.js +3 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/menu.js +17 -7
  24. package/dist/menu.js.map +1 -1
  25. package/dist/project-files.js +17 -7
  26. package/dist/project-files.js.map +1 -1
  27. package/dist/tool-handlers.d.ts +0 -1
  28. package/dist/tool-handlers.js +35 -282
  29. package/dist/tool-handlers.js.map +1 -1
  30. package/dist/utils/terminal.d.ts +5 -0
  31. package/dist/utils/terminal.js +322 -0
  32. package/dist/utils/terminal.js.map +1 -0
  33. package/package.json +2 -2
  34. package/dist/common/billing/payment-guards.d.ts +0 -11
  35. package/dist/common/billing/payment-guards.js +0 -136
  36. package/dist/common/billing/payment-guards.js.map +0 -1
  37. package/dist/common/billing/subscription-state.d.ts +0 -13
  38. package/dist/common/billing/subscription-state.js +0 -117
  39. package/dist/common/billing/subscription-state.js.map +0 -1
  40. package/dist/common/billing/webhook-processor.d.ts +0 -21
  41. package/dist/common/billing/webhook-processor.js +0 -315
  42. package/dist/common/billing/webhook-processor.js.map +0 -1
  43. package/dist/common/scripts/update-subscriptions.d.ts +0 -1
  44. package/dist/common/scripts/update-subscriptions.js +0 -92
  45. package/dist/common/scripts/update-subscriptions.js.map +0 -1
  46. package/dist/common/websockets/logger-interface.d.ts +0 -6
  47. package/dist/common/websockets/logger-interface.js +0 -9
  48. package/dist/common/websockets/logger-interface.js.map +0 -1
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runTerminalCommand = exports.resetPtyShell = void 0;
40
+ const child_process_1 = require("child_process");
41
+ const path_1 = __importDefault(require("path"));
42
+ const picocolors_1 = require("picocolors");
43
+ const os = __importStar(require("os"));
44
+ const detect_shell_1 = require("./detect-shell");
45
+ const project_files_1 = require("src/project-files");
46
+ const string_1 = require("../common/util/string");
47
+ let pty;
48
+ const tempConsoleError = console.error;
49
+ console.error = () => { };
50
+ try {
51
+ pty = require('@homebridge/node-pty-prebuilt-multiarch');
52
+ }
53
+ catch (error) {
54
+ }
55
+ finally {
56
+ console.error = tempConsoleError;
57
+ }
58
+ const createPty = (dir) => {
59
+ if (pty) {
60
+ const isWindows = os.platform() === 'win32';
61
+ const currShell = (0, detect_shell_1.detectShell)();
62
+ const shell = isWindows
63
+ ? currShell === 'powershell'
64
+ ? 'powershell.exe'
65
+ : 'cmd.exe'
66
+ : 'bash';
67
+ const shellWithoutExe = shell.split('.')[0];
68
+ // Prepare shell init commands
69
+ let shellInitCommands = '';
70
+ if (!isWindows) {
71
+ const rcFile = currShell === 'zsh'
72
+ ? '~/.zshrc'
73
+ : currShell === 'fish'
74
+ ? '~/.config/fish/config.fish'
75
+ : '~/.bashrc';
76
+ shellInitCommands = `source ${rcFile} 2>/dev/null || true\n`;
77
+ }
78
+ else if (currShell === 'powershell') {
79
+ // Try to source PowerShell profile if it exists
80
+ shellInitCommands =
81
+ '$PSProfile = $PROFILE.CurrentUserAllHosts; if (Test-Path $PSProfile) { . $PSProfile }\n';
82
+ }
83
+ const persistentPty = pty.spawn(shell, [], {
84
+ name: 'xterm-256color',
85
+ cols: process.stdout.columns || 80,
86
+ rows: process.stdout.rows || 24,
87
+ cwd: dir,
88
+ env: {
89
+ ...process.env,
90
+ TERM: 'xterm-256color',
91
+ PAGER: 'cat',
92
+ GIT_PAGER: 'cat',
93
+ GIT_TERMINAL_PROMPT: '0',
94
+ ...(isWindows
95
+ ? {
96
+ TERM: 'cygwin',
97
+ ANSICON: '1', // Better ANSI support in cmd.exe
98
+ PROMPT: '$P$G', // Simple prompt to avoid parsing issues
99
+ PSModulePath: process.env.PSModulePath || '', // Preserve PowerShell modules
100
+ }
101
+ : {}),
102
+ LESS: '-FRX',
103
+ TERM_PROGRAM: 'mintty',
104
+ NO_COLOR: process.env.NO_COLOR, // Respect NO_COLOR if set
105
+ FORCE_COLOR: '1', // Enable colors in CI/CD
106
+ CI: process.env.CI, // Preserve CI environment
107
+ // Locale settings for consistent output
108
+ LANG: 'en_US.UTF-8',
109
+ LC_ALL: 'en_US.UTF-8',
110
+ // Shell-specific settings
111
+ SHELL: shellWithoutExe,
112
+ },
113
+ });
114
+ // Source the shell config file if available
115
+ if (shellInitCommands) {
116
+ persistentPty.write(shellInitCommands);
117
+ }
118
+ return { type: 'pty', pty: persistentPty };
119
+ }
120
+ else {
121
+ // Fallback to child_process
122
+ const isWindows = os.platform() === 'win32';
123
+ const currShell = (0, detect_shell_1.detectShell)();
124
+ const shell = isWindows
125
+ ? currShell === 'powershell'
126
+ ? 'powershell.exe'
127
+ : 'cmd.exe'
128
+ : 'bash';
129
+ return { type: 'process', shell };
130
+ }
131
+ };
132
+ let persistentProcess = null;
133
+ process.stdout.on('resize', () => {
134
+ if (!persistentProcess)
135
+ return;
136
+ const { pty } = persistentProcess;
137
+ if (pty) {
138
+ pty.resize(process.stdout.columns, process.stdout.rows);
139
+ }
140
+ });
141
+ const resetPtyShell = (dir) => {
142
+ if (persistentProcess) {
143
+ if (persistentProcess.type === 'pty') {
144
+ persistentProcess.pty.kill();
145
+ }
146
+ }
147
+ persistentProcess = createPty(dir);
148
+ };
149
+ exports.resetPtyShell = resetPtyShell;
150
+ function formatResult(stdout, status) {
151
+ let result = '<terminal_command_result>\n';
152
+ result += `<output>${(0, string_1.truncateStringWithMessage)(stdout, 10000)}</output>\n`;
153
+ result += `<status>${status}</status>\n`;
154
+ result += '</terminal_command_result>';
155
+ return result;
156
+ }
157
+ const isNotACommand = (output) => {
158
+ return (output.includes('command not found') ||
159
+ // Linux
160
+ output.includes(': not found') ||
161
+ // Common
162
+ output.includes('syntax error:') ||
163
+ output.includes('syntax error near unexpected token') ||
164
+ // Linux
165
+ output.includes('Syntax error:') ||
166
+ // Windows
167
+ output.includes('is not recognized as an internal or external command') ||
168
+ output.includes('/bin/sh: -c: line') ||
169
+ output.includes('/bin/sh: line') ||
170
+ output.startsWith('fatal:') ||
171
+ output.startsWith('error:') ||
172
+ output.startsWith('Der Befehl') ||
173
+ output.includes('konnte nicht gefunden werden') ||
174
+ output.includes('wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren'));
175
+ };
176
+ const runTerminalCommand = async (command, mode) => {
177
+ const MAX_EXECUTION_TIME = 30_000;
178
+ const projectRoot = (0, project_files_1.getProjectRoot)();
179
+ return new Promise((resolve) => {
180
+ if (!persistentProcess) {
181
+ throw new Error('Shell not initialized');
182
+ }
183
+ if (persistentProcess.type === 'pty') {
184
+ // Use PTY implementation
185
+ const ptyProcess = persistentProcess.pty;
186
+ let commandOutput = '';
187
+ let foundFirstNewLine = false;
188
+ if (mode === 'assistant') {
189
+ console.log();
190
+ console.log((0, picocolors_1.green)(`> ${command}`));
191
+ }
192
+ const timer = setTimeout(() => {
193
+ if (mode === 'assistant') {
194
+ // Kill and recreate PTY
195
+ (0, exports.resetPtyShell)(projectRoot);
196
+ resolve({
197
+ result: formatResult(commandOutput, `Command timed out after ${MAX_EXECUTION_TIME / 1000} seconds and was terminated. Shell has been restarted.`),
198
+ stdout: commandOutput,
199
+ });
200
+ }
201
+ }, MAX_EXECUTION_TIME);
202
+ const dataDisposable = ptyProcess.onData((data) => {
203
+ const prefix = commandOutput + data;
204
+ // Skip the first line of the output, because it's the command being printed.
205
+ if (!foundFirstNewLine) {
206
+ if (!prefix.includes('\n')) {
207
+ return;
208
+ }
209
+ foundFirstNewLine = true;
210
+ const newLineIndex = prefix.indexOf('\n');
211
+ data = prefix.slice(newLineIndex + 1);
212
+ }
213
+ // Try to detect error messages in the output
214
+ if (mode === 'user' && isNotACommand(data)) {
215
+ clearTimeout(timer);
216
+ dataDisposable.dispose();
217
+ resolve({
218
+ result: 'command not found',
219
+ stdout: commandOutput,
220
+ });
221
+ return;
222
+ }
223
+ // Detect the end of the command output if the prompt is printed.
224
+ // Windows PowerShell prompt pattern: "MM/DD HH:mm Path ►"
225
+ const simpleWindowsPromptRegex = /\d{2}:\d{2}.*►/;
226
+ // Another cmd prompt: "C:\Users\Name\My Projects>"
227
+ const simpleWindowsPromptRegex2 = /[A-Z]:\\.*\\.*>/;
228
+ const hasSimplePromptOnWindows = simpleWindowsPromptRegex.test(prefix);
229
+ const hasSimplePromptOnWindows2 = simpleWindowsPromptRegex2.test(prefix);
230
+ const promptDetected = prefix.includes('bash-3.2$ ') ||
231
+ hasSimplePromptOnWindows ||
232
+ hasSimplePromptOnWindows2;
233
+ if (promptDetected) {
234
+ clearTimeout(timer);
235
+ dataDisposable.dispose();
236
+ if (command.startsWith('cd ') && mode === 'user') {
237
+ const newWorkingDirectory = command.split(' ')[1];
238
+ (0, project_files_1.setProjectRoot)(path_1.default.join(projectRoot, newWorkingDirectory));
239
+ }
240
+ if (mode === 'assistant') {
241
+ console.log((0, picocolors_1.green)(`Command completed`));
242
+ }
243
+ // Reset the PTY to the project root
244
+ ptyProcess.write(`cd ${projectRoot}\r`);
245
+ resolve({
246
+ result: formatResult(commandOutput, 'Command completed'),
247
+ stdout: commandOutput,
248
+ });
249
+ return;
250
+ }
251
+ process.stdout.write(data);
252
+ commandOutput += data;
253
+ });
254
+ // Write the command
255
+ ptyProcess.write(command + '\r');
256
+ }
257
+ else {
258
+ // Fallback to child_process implementation
259
+ const isWindows = os.platform() === 'win32';
260
+ let commandOutput = '';
261
+ if (mode === 'assistant') {
262
+ console.log();
263
+ console.log((0, picocolors_1.green)(`> ${command}`));
264
+ }
265
+ const childProcess = (0, child_process_1.spawn)(persistentProcess.shell, [isWindows ? '/c' : '-c', command], {
266
+ cwd: projectRoot,
267
+ env: {
268
+ ...process.env,
269
+ PAGER: 'cat',
270
+ GIT_PAGER: 'cat',
271
+ GIT_TERMINAL_PROMPT: '0',
272
+ LESS: '-FRX',
273
+ },
274
+ });
275
+ const timer = setTimeout(() => {
276
+ childProcess.kill();
277
+ if (mode === 'assistant') {
278
+ resolve({
279
+ result: formatResult(commandOutput, `Command timed out after ${MAX_EXECUTION_TIME / 1000} seconds and was terminated.`),
280
+ stdout: commandOutput,
281
+ });
282
+ }
283
+ }, MAX_EXECUTION_TIME);
284
+ childProcess.stdout.on('data', (data) => {
285
+ const output = data.toString();
286
+ process.stdout.write(output);
287
+ commandOutput += output;
288
+ });
289
+ childProcess.stderr.on('data', (data) => {
290
+ const output = data.toString();
291
+ // Try to detect error messages in the output
292
+ if (mode === 'user' && isNotACommand(output)) {
293
+ clearTimeout(timer);
294
+ childProcess.kill();
295
+ resolve({
296
+ result: 'command not found',
297
+ stdout: commandOutput,
298
+ });
299
+ return;
300
+ }
301
+ process.stdout.write(output);
302
+ commandOutput += output;
303
+ });
304
+ childProcess.on('close', (code) => {
305
+ clearTimeout(timer);
306
+ if (command.startsWith('cd ') && mode === 'user') {
307
+ const newWorkingDirectory = command.split(' ')[1];
308
+ (0, project_files_1.setProjectRoot)(path_1.default.join(projectRoot, newWorkingDirectory));
309
+ }
310
+ if (mode === 'assistant') {
311
+ console.log((0, picocolors_1.green)(`Command completed`));
312
+ }
313
+ resolve({
314
+ result: formatResult(commandOutput, `Command completed`),
315
+ stdout: commandOutput,
316
+ });
317
+ });
318
+ }
319
+ });
320
+ };
321
+ exports.runTerminalCommand = runTerminalCommand;
322
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebuff",
3
- "version": "1.0.136",
3
+ "version": "1.0.138",
4
4
  "description": "AI dev assistant",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -65,7 +65,7 @@
65
65
  "zod": "3.23.8"
66
66
  },
67
67
  "optionalDependencies": {
68
- "@homebridge/node-pty-prebuilt-multiarch": "0.11.14"
68
+ "@homebridge/node-pty-prebuilt-multiarch": "0.12.0-beta.5"
69
69
  },
70
70
  "trustedDependencies": [
71
71
  "@homebridge/node-pty-prebuilt-multiarch",
@@ -1,11 +0,0 @@
1
- export declare class PaymentGuards {
2
- private subscriptionId;
3
- constructor(subscriptionId: string);
4
- validatePaymentMethod(): Promise<{
5
- valid: boolean;
6
- error?: string;
7
- }>;
8
- handleFailedPayment(): Promise<void>;
9
- processPartialPayment(amountPaid: number): Promise<void>;
10
- handleRefund(amount: number): Promise<void>;
11
- }
@@ -1,136 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.PaymentGuards = void 0;
30
- const stripe_1 = require("../util/stripe");
31
- const db_1 = __importDefault(require("../db"));
32
- const schema = __importStar(require("../db/schema"));
33
- const drizzle_orm_1 = require("drizzle-orm");
34
- class PaymentGuards {
35
- subscriptionId;
36
- constructor(subscriptionId) {
37
- this.subscriptionId = subscriptionId;
38
- }
39
- async validatePaymentMethod() {
40
- try {
41
- const subscription = await stripe_1.stripeServer.subscriptions.retrieve(this.subscriptionId, {
42
- expand: ['latest_invoice.payment_intent'],
43
- });
44
- const invoice = subscription.latest_invoice;
45
- if (!invoice?.payment_intent) {
46
- return { valid: true }; // No payment needed
47
- }
48
- const paymentIntent = invoice.payment_intent;
49
- if (paymentIntent.status === 'succeeded') {
50
- return { valid: true };
51
- }
52
- return {
53
- valid: false,
54
- error: `Payment failed: ${paymentIntent.last_payment_error?.message || 'Unknown error'}`,
55
- };
56
- }
57
- catch (error) {
58
- console.error('Error validating payment method:', error);
59
- return {
60
- valid: false,
61
- error: 'Failed to validate payment method',
62
- };
63
- }
64
- }
65
- async handleFailedPayment() {
66
- // Record the failed attempt
67
- await db_1.default.insert(schema.payment_attempts).values({
68
- id: crypto.randomUUID(),
69
- subscription_id: this.subscriptionId,
70
- status: 'failed',
71
- created_at: new Date(),
72
- });
73
- // Get the subscription to check retry count
74
- const attempts = await db_1.default
75
- .select({
76
- count: (0, drizzle_orm_1.sql) `count(*)::int`,
77
- })
78
- .from(schema.payment_attempts)
79
- .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema.payment_attempts.subscription_id, this.subscriptionId), (0, drizzle_orm_1.eq)(schema.payment_attempts.status, 'failed'), (0, drizzle_orm_1.sql) `created_at > now() - interval '24 hours'`));
80
- const retryCount = attempts[0].count;
81
- if (retryCount >= 3) {
82
- // Too many failures, pause the subscription
83
- await stripe_1.stripeServer.subscriptions.update(this.subscriptionId, {
84
- pause_collection: {
85
- behavior: 'void',
86
- },
87
- });
88
- }
89
- }
90
- async processPartialPayment(amountPaid) {
91
- // Record the partial payment
92
- await db_1.default.insert(schema.payment_attempts).values({
93
- id: crypto.randomUUID(),
94
- subscription_id: this.subscriptionId,
95
- amount: amountPaid.toString(), // Convert to string for decimal type
96
- status: 'partial',
97
- created_at: new Date(),
98
- });
99
- // Update the subscription with remaining balance
100
- const subscription = await stripe_1.stripeServer.subscriptions.retrieve(this.subscriptionId, {
101
- expand: ['latest_invoice'],
102
- });
103
- const invoice = subscription.latest_invoice;
104
- if (invoice) {
105
- const remainingAmount = invoice.amount_due - amountPaid;
106
- if (remainingAmount > 0) {
107
- await stripe_1.stripeServer.invoices.update(invoice.id, {
108
- description: `Partial payment received: ${amountPaid}. Remaining: ${remainingAmount}`,
109
- });
110
- }
111
- }
112
- }
113
- async handleRefund(amount) {
114
- const subscription = await stripe_1.stripeServer.subscriptions.retrieve(this.subscriptionId, {
115
- expand: ['latest_invoice.payment_intent'],
116
- });
117
- const invoice = subscription.latest_invoice;
118
- if (!invoice?.payment_intent) {
119
- throw new Error('No payment found to refund');
120
- }
121
- await stripe_1.stripeServer.refunds.create({
122
- payment_intent: invoice.payment_intent.id,
123
- amount,
124
- });
125
- // Record the refund
126
- await db_1.default.insert(schema.payment_attempts).values({
127
- id: crypto.randomUUID(),
128
- subscription_id: this.subscriptionId,
129
- amount: (-amount).toString(), // Convert to string for decimal type
130
- status: 'refunded',
131
- created_at: new Date(),
132
- });
133
- }
134
- }
135
- exports.PaymentGuards = PaymentGuards;
136
- //# sourceMappingURL=payment-guards.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"payment-guards.js","sourceRoot":"","sources":["../../src/billing/payment-guards.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import { z } from 'zod';
2
- export type SubscriptionState = 'active' | 'past_due' | 'incomplete' | 'canceled' | 'trialing' | 'paused' | 'transitioning';
3
- export declare const subscriptionStateSchema: z.ZodEnum<["active", "past_due", "incomplete", "canceled", "trialing", "paused", "transitioning"]>;
4
- export declare class SubscriptionStateManager {
5
- private subscriptionId;
6
- private transitionLock;
7
- constructor(subscriptionId: string);
8
- getCurrentState(): Promise<SubscriptionState>;
9
- beginStateTransition(): Promise<boolean>;
10
- endStateTransition(): Promise<void>;
11
- addStateHistoryEntry(fromState: SubscriptionState, toState: SubscriptionState, reason?: string): Promise<void>;
12
- private mapStripeState;
13
- }
@@ -1,117 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.SubscriptionStateManager = exports.subscriptionStateSchema = void 0;
30
- const zod_1 = require("zod");
31
- const drizzle_orm_1 = require("drizzle-orm");
32
- const db_1 = __importDefault(require("../db"));
33
- const schema = __importStar(require("../db/schema"));
34
- const stripe_1 = require("../util/stripe");
35
- exports.subscriptionStateSchema = zod_1.z.enum([
36
- 'active',
37
- 'past_due',
38
- 'incomplete',
39
- 'canceled',
40
- 'trialing',
41
- 'paused',
42
- 'transitioning',
43
- ]);
44
- class SubscriptionStateManager {
45
- subscriptionId;
46
- transitionLock = null;
47
- constructor(subscriptionId) {
48
- this.subscriptionId = subscriptionId;
49
- }
50
- async getCurrentState() {
51
- const subscription = await stripe_1.stripeServer.subscriptions.retrieve(this.subscriptionId);
52
- return this.mapStripeState(subscription.status);
53
- }
54
- async beginStateTransition() {
55
- // Generate a new lock UUID
56
- const newLock = crypto.randomUUID();
57
- // Try to acquire lock
58
- const result = await db_1.default
59
- .update(schema.user)
60
- .set({
61
- transition_lock: newLock,
62
- })
63
- .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema.user.stripe_price_id, this.subscriptionId), (0, drizzle_orm_1.sql) `transition_lock IS NULL`))
64
- .returning({ transitionLock: schema.user.transition_lock });
65
- if (result.length === 0) {
66
- return false; // Lock acquisition failed
67
- }
68
- this.transitionLock = newLock;
69
- return true;
70
- }
71
- async endStateTransition() {
72
- if (!this.transitionLock) {
73
- throw new Error('No active transition');
74
- }
75
- await db_1.default
76
- .update(schema.user)
77
- .set({
78
- transition_lock: null,
79
- })
80
- .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema.user.stripe_price_id, this.subscriptionId), (0, drizzle_orm_1.eq)(schema.user.transition_lock, this.transitionLock)));
81
- this.transitionLock = null;
82
- }
83
- async addStateHistoryEntry(fromState, toState, reason) {
84
- const entry = {
85
- fromState,
86
- toState,
87
- reason,
88
- timestamp: new Date().toISOString(),
89
- };
90
- await db_1.default
91
- .update(schema.user)
92
- .set({
93
- state_history: (0, drizzle_orm_1.sql) `COALESCE(state_history, '[]'::jsonb) || ${JSON.stringify(entry)}::jsonb`,
94
- })
95
- .where((0, drizzle_orm_1.eq)(schema.user.stripe_price_id, this.subscriptionId));
96
- }
97
- mapStripeState(stripeStatus) {
98
- switch (stripeStatus) {
99
- case 'active':
100
- return 'active';
101
- case 'past_due':
102
- return 'past_due';
103
- case 'incomplete':
104
- return 'incomplete';
105
- case 'canceled':
106
- return 'canceled';
107
- case 'trialing':
108
- return 'trialing';
109
- case 'paused':
110
- return 'paused';
111
- default:
112
- throw new Error(`Unknown Stripe status: ${stripeStatus}`);
113
- }
114
- }
115
- }
116
- exports.SubscriptionStateManager = SubscriptionStateManager;
117
- //# sourceMappingURL=subscription-state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscription-state.js","sourceRoot":"","sources":["../../src/billing/subscription-state.ts"],"names":[],"mappings":"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"}