codecane 1.0.146 → 1.0.148

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 (56) 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.d.ts +2 -0
  6. package/dist/cli.js +33 -18
  7. package/dist/cli.js.map +1 -1
  8. package/dist/client.d.ts +3 -1
  9. package/dist/client.js +30 -10
  10. package/dist/client.js.map +1 -1
  11. package/dist/code-map/languages.js +17 -7
  12. package/dist/code-map/languages.js.map +1 -1
  13. package/dist/code-map/parse.js +17 -7
  14. package/dist/code-map/parse.js.map +1 -1
  15. package/dist/code-map/tsconfig.tsbuildinfo +1 -1
  16. package/dist/common/constants.js +5 -3
  17. package/dist/common/constants.js.map +1 -1
  18. package/dist/common/types/usage.d.ts +2 -2
  19. package/dist/common/util/credentials.d.ts +2 -2
  20. package/dist/common/util/promise.d.ts +1 -0
  21. package/dist/common/util/promise.js +3 -1
  22. package/dist/common/util/promise.js.map +1 -1
  23. package/dist/common/util/string.d.ts +1 -0
  24. package/dist/common/util/string.js +21 -11
  25. package/dist/common/util/string.js.map +1 -1
  26. package/dist/common/websockets/websocket-client.d.ts +2 -1
  27. package/dist/common/websockets/websocket-client.js +4 -3
  28. package/dist/common/websockets/websocket-client.js.map +1 -1
  29. package/dist/index.js +3 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/menu.js +17 -7
  32. package/dist/menu.js.map +1 -1
  33. package/dist/project-files.js +17 -7
  34. package/dist/project-files.js.map +1 -1
  35. package/dist/tool-handlers.d.ts +0 -1
  36. package/dist/tool-handlers.js +35 -281
  37. package/dist/tool-handlers.js.map +1 -1
  38. package/dist/utils/terminal.d.ts +5 -0
  39. package/dist/utils/terminal.js +321 -0
  40. package/dist/utils/terminal.js.map +1 -0
  41. package/package.json +5 -3
  42. package/dist/common/billing/payment-guards.d.ts +0 -11
  43. package/dist/common/billing/payment-guards.js +0 -136
  44. package/dist/common/billing/payment-guards.js.map +0 -1
  45. package/dist/common/billing/subscription-state.d.ts +0 -13
  46. package/dist/common/billing/subscription-state.js +0 -117
  47. package/dist/common/billing/subscription-state.js.map +0 -1
  48. package/dist/common/billing/webhook-processor.d.ts +0 -21
  49. package/dist/common/billing/webhook-processor.js +0 -315
  50. package/dist/common/billing/webhook-processor.js.map +0 -1
  51. package/dist/common/scripts/update-subscriptions.d.ts +0 -1
  52. package/dist/common/scripts/update-subscriptions.js +0 -92
  53. package/dist/common/scripts/update-subscriptions.js.map +0 -1
  54. package/dist/common/websockets/logger-interface.d.ts +0 -6
  55. package/dist/common/websockets/logger-interface.js +0 -9
  56. package/dist/common/websockets/logger-interface.js.map +0 -1
@@ -0,0 +1,321 @@
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("../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 promptIdentifier = '@36261@';
59
+ const createPty = (dir) => {
60
+ if (pty) {
61
+ const isWindows = os.platform() === 'win32';
62
+ const currShell = (0, detect_shell_1.detectShell)();
63
+ const shell = isWindows
64
+ ? currShell === 'powershell'
65
+ ? 'powershell.exe'
66
+ : 'cmd.exe'
67
+ : 'bash';
68
+ const shellWithoutExe = shell.split('.')[0];
69
+ // Prepare shell init commands
70
+ let shellInitCommands = '';
71
+ if (!isWindows) {
72
+ const rcFile = currShell === 'zsh'
73
+ ? '~/.zshrc'
74
+ : currShell === 'fish'
75
+ ? '~/.config/fish/config.fish'
76
+ : '~/.bashrc';
77
+ shellInitCommands = `source ${rcFile} 2>/dev/null || true\n`;
78
+ }
79
+ else if (currShell === 'powershell') {
80
+ // Try to source PowerShell profile if it exists
81
+ shellInitCommands =
82
+ '$PSProfile = $PROFILE.CurrentUserAllHosts; if (Test-Path $PSProfile) { . $PSProfile }\n';
83
+ }
84
+ const persistentPty = pty.spawn(shell, isWindows ? [] : ['--login'], {
85
+ name: 'xterm-256color',
86
+ cols: process.stdout.columns || 80,
87
+ rows: process.stdout.rows || 24,
88
+ cwd: dir,
89
+ env: {
90
+ ...process.env,
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: promptIdentifier,
99
+ PSModulePath: process.env.PSModulePath || '', // Preserve PowerShell modules
100
+ }
101
+ : {
102
+ TERM: 'xterm-256color',
103
+ }),
104
+ LESS: '-FRX',
105
+ TERM_PROGRAM: 'mintty',
106
+ NO_COLOR: process.env.NO_COLOR, // Respect NO_COLOR if set
107
+ FORCE_COLOR: '1', // Enable colors in CI/CD
108
+ CI: process.env.CI, // Preserve CI environment
109
+ // Locale settings for consistent output
110
+ LANG: 'en_US.UTF-8',
111
+ LC_ALL: 'en_US.UTF-8',
112
+ // Shell-specific settings
113
+ SHELL: shellWithoutExe,
114
+ },
115
+ });
116
+ // Source the shell config file if available
117
+ if (shellInitCommands) {
118
+ persistentPty.write(shellInitCommands);
119
+ }
120
+ // Set prompt for Unix shells after sourcing config
121
+ if (!isWindows) {
122
+ persistentPty.write(`PS1='${promptIdentifier}'\n`);
123
+ }
124
+ return { type: 'pty', pty: persistentPty };
125
+ }
126
+ else {
127
+ // Fallback to child_process
128
+ const isWindows = os.platform() === 'win32';
129
+ const currShell = (0, detect_shell_1.detectShell)();
130
+ const shell = isWindows
131
+ ? currShell === 'powershell'
132
+ ? 'powershell.exe'
133
+ : 'cmd.exe'
134
+ : 'bash';
135
+ return { type: 'process', shell };
136
+ }
137
+ };
138
+ let persistentProcess = null;
139
+ process.stdout.on('resize', () => {
140
+ if (!persistentProcess)
141
+ return;
142
+ const { pty } = persistentProcess;
143
+ if (pty) {
144
+ pty.resize(process.stdout.columns, process.stdout.rows);
145
+ }
146
+ });
147
+ const resetPtyShell = (dir) => {
148
+ if (persistentProcess) {
149
+ if (persistentProcess.type === 'pty') {
150
+ persistentProcess.pty.kill();
151
+ }
152
+ }
153
+ persistentProcess = createPty(dir);
154
+ };
155
+ exports.resetPtyShell = resetPtyShell;
156
+ function formatResult(stdout, status) {
157
+ let result = '<terminal_command_result>\n';
158
+ result += `<output>${(0, string_1.truncateStringWithMessage)(stdout, 10000)}</output>\n`;
159
+ result += `<status>${status}</status>\n`;
160
+ result += '</terminal_command_result>';
161
+ return result;
162
+ }
163
+ const isNotACommand = (output) => {
164
+ return (output.includes('command not found') ||
165
+ // Linux
166
+ output.includes(': not found') ||
167
+ // Common
168
+ output.includes('syntax error:') ||
169
+ output.includes('syntax error near unexpected token') ||
170
+ // Linux
171
+ output.includes('Syntax error:') ||
172
+ // Windows
173
+ output.includes('is not recognized as an internal or external command') ||
174
+ output.includes('/bin/sh: -c: line') ||
175
+ output.includes('/bin/sh: line') ||
176
+ output.startsWith('fatal:') ||
177
+ output.startsWith('error:') ||
178
+ output.startsWith('Der Befehl') ||
179
+ output.includes('konnte nicht gefunden werden') ||
180
+ output.includes('wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren'));
181
+ };
182
+ const runTerminalCommand = async (command, mode) => {
183
+ const MAX_EXECUTION_TIME = 30_000;
184
+ const projectRoot = (0, project_files_1.getProjectRoot)();
185
+ let isFirstLine = true;
186
+ return new Promise((resolve) => {
187
+ if (!persistentProcess) {
188
+ throw new Error('Shell not initialized');
189
+ }
190
+ if (persistentProcess.type === 'pty') {
191
+ // Use PTY implementation
192
+ const ptyProcess = persistentProcess.pty;
193
+ let commandOutput = '';
194
+ let foundFirstNewLine = false;
195
+ if (mode === 'assistant') {
196
+ console.log();
197
+ console.log((0, picocolors_1.green)(`> ${command}`));
198
+ }
199
+ const timer = setTimeout(() => {
200
+ if (mode === 'assistant') {
201
+ // Kill and recreate PTY
202
+ (0, exports.resetPtyShell)(projectRoot);
203
+ resolve({
204
+ result: formatResult(commandOutput, `Command timed out after ${MAX_EXECUTION_TIME / 1000} seconds and was terminated. Shell has been restarted.`),
205
+ stdout: commandOutput,
206
+ });
207
+ }
208
+ }, MAX_EXECUTION_TIME);
209
+ const dataDisposable = ptyProcess.onData((data) => {
210
+ const prefix = commandOutput + data;
211
+ // Skip the first line of the output, because it's the command being printed.
212
+ if (!foundFirstNewLine) {
213
+ if (!prefix.includes('\n')) {
214
+ return;
215
+ }
216
+ foundFirstNewLine = true;
217
+ const newLineIndex = prefix.indexOf('\n');
218
+ data = prefix.slice(newLineIndex + 1);
219
+ }
220
+ // Try to detect error messages in the output
221
+ if (mode === 'user' && isNotACommand(data)) {
222
+ clearTimeout(timer);
223
+ dataDisposable.dispose();
224
+ resolve({
225
+ result: 'command not found',
226
+ stdout: commandOutput,
227
+ });
228
+ return;
229
+ }
230
+ const promptDetected = prefix.includes(promptIdentifier);
231
+ if (promptDetected && !isFirstLine) {
232
+ clearTimeout(timer);
233
+ dataDisposable.dispose();
234
+ if (command.startsWith('cd ') && mode === 'user') {
235
+ const newWorkingDirectory = command.split(' ')[1];
236
+ (0, project_files_1.setProjectRoot)(path_1.default.join(projectRoot, newWorkingDirectory));
237
+ }
238
+ if (mode === 'assistant') {
239
+ console.log((0, picocolors_1.green)(`Command completed`));
240
+ }
241
+ // Reset the PTY to the project root
242
+ ptyProcess.write(`cd ${projectRoot}\r`);
243
+ resolve({
244
+ result: formatResult(commandOutput, 'Command completed'),
245
+ stdout: commandOutput,
246
+ });
247
+ return;
248
+ }
249
+ isFirstLine = false;
250
+ process.stdout.write(data);
251
+ commandOutput += data;
252
+ });
253
+ // Write the command
254
+ ptyProcess.write(command + '\r');
255
+ }
256
+ else {
257
+ // Fallback to child_process implementation
258
+ const isWindows = os.platform() === 'win32';
259
+ let commandOutput = '';
260
+ if (mode === 'assistant') {
261
+ console.log();
262
+ console.log((0, picocolors_1.green)(`> ${command}`));
263
+ }
264
+ const childProcess = (0, child_process_1.spawn)(persistentProcess.shell, [isWindows ? '/c' : '-c', command], {
265
+ cwd: projectRoot,
266
+ env: {
267
+ ...process.env,
268
+ PAGER: 'cat',
269
+ GIT_PAGER: 'cat',
270
+ GIT_TERMINAL_PROMPT: '0',
271
+ LESS: '-FRX',
272
+ },
273
+ });
274
+ const timer = setTimeout(() => {
275
+ childProcess.kill();
276
+ if (mode === 'assistant') {
277
+ resolve({
278
+ result: formatResult(commandOutput, `Command timed out after ${MAX_EXECUTION_TIME / 1000} seconds and was terminated.`),
279
+ stdout: commandOutput,
280
+ });
281
+ }
282
+ }, MAX_EXECUTION_TIME);
283
+ childProcess.stdout.on('data', (data) => {
284
+ const output = data.toString();
285
+ process.stdout.write(output);
286
+ commandOutput += output;
287
+ });
288
+ childProcess.stderr.on('data', (data) => {
289
+ const output = data.toString();
290
+ // Try to detect error messages in the output
291
+ if (mode === 'user' && isNotACommand(output)) {
292
+ clearTimeout(timer);
293
+ childProcess.kill();
294
+ resolve({
295
+ result: 'command not found',
296
+ stdout: commandOutput,
297
+ });
298
+ return;
299
+ }
300
+ process.stdout.write(output);
301
+ commandOutput += output;
302
+ });
303
+ childProcess.on('close', (code) => {
304
+ clearTimeout(timer);
305
+ if (command.startsWith('cd ') && mode === 'user') {
306
+ const newWorkingDirectory = command.split(' ')[1];
307
+ (0, project_files_1.setProjectRoot)(path_1.default.join(projectRoot, newWorkingDirectory));
308
+ }
309
+ if (mode === 'assistant') {
310
+ console.log((0, picocolors_1.green)(`Command completed`));
311
+ }
312
+ resolve({
313
+ result: formatResult(commandOutput, `Command completed`),
314
+ stdout: commandOutput,
315
+ });
316
+ });
317
+ }
318
+ });
319
+ };
320
+ exports.runTerminalCommand = runTerminalCommand;
321
+ //# 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": "codecane",
3
- "version": "1.0.146",
3
+ "version": "1.0.148",
4
4
  "description": "AI dev assistant",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -26,7 +26,9 @@
26
26
  "start-jpcsp": "bun run with-env -- ts-node src/index.ts ../test/__mock-projects__/jpcsp",
27
27
  "start-vscode": "bun run with-env -- ts-node src/index.ts ../test/__mock-projects__/vscode",
28
28
  "start-nushell": "bun run with-env -- ts-node src/index.ts ../test/__mock-projects__/nushell",
29
- "start-prod": "bun run with-env -- ts-node src/index.ts"
29
+ "start-prod": "bun run with-env -- ts-node src/index.ts",
30
+ "typecheck-this-package": "tsc --noEmit && tsc-alias",
31
+ "typecheck": "bun run --cwd ../common build && bun run --cwd ../packages/code-map build && bun run typecheck-this-package"
30
32
  },
31
33
  "files": [
32
34
  "dist",
@@ -64,7 +66,7 @@
64
66
  "zod": "3.23.8"
65
67
  },
66
68
  "optionalDependencies": {
67
- "@homebridge/node-pty-prebuilt-multiarch": "0.11.14"
69
+ "@homebridge/node-pty-prebuilt-multiarch": "0.12.0-beta.5"
68
70
  },
69
71
  "trustedDependencies": [
70
72
  "@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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"}