codebuff 1.0.249 → 1.0.250

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 (82) hide show
  1. package/dist/background-process-manager.js +359 -0
  2. package/dist/background-process-manager.js.map +1 -0
  3. package/dist/browser-runner.js +680 -0
  4. package/dist/browser-runner.js.map +1 -0
  5. package/dist/chat-storage.js +93 -0
  6. package/dist/chat-storage.js.map +1 -0
  7. package/dist/checkpoints/checkpoint-manager.js +280 -0
  8. package/dist/checkpoints/checkpoint-manager.js.map +1 -0
  9. package/dist/cli-handlers/api-key.js +66 -0
  10. package/dist/cli-handlers/api-key.js.map +1 -0
  11. package/dist/cli-handlers/checkpoint.js +195 -0
  12. package/dist/cli-handlers/checkpoint.js.map +1 -0
  13. package/dist/cli-handlers/diff.js +31 -0
  14. package/dist/cli-handlers/diff.js.map +1 -0
  15. package/dist/cli-handlers/inititalization-flow.js +24 -0
  16. package/dist/cli-handlers/inititalization-flow.js.map +1 -0
  17. package/dist/cli.js +478 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/client.js +836 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/common/actions.d.ts +32 -32
  22. package/dist/common/types/usage.d.ts +2 -2
  23. package/dist/common/websockets/websocket-schema.d.ts +68 -68
  24. package/dist/credentials.js +38 -0
  25. package/dist/credentials.js.map +1 -0
  26. package/dist/dev-process-manager.js +54 -0
  27. package/dist/dev-process-manager.js.map +1 -0
  28. package/dist/index.js +117 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/menu.js +126 -0
  31. package/dist/menu.js.map +1 -0
  32. package/dist/project-files.js +513 -0
  33. package/dist/project-files.js.map +1 -0
  34. package/dist/startup-process-handler.js +21 -0
  35. package/dist/startup-process-handler.js.map +1 -0
  36. package/dist/tool-handlers.js +240 -0
  37. package/dist/tool-handlers.js.map +1 -0
  38. package/dist/{common/types/plan.js → types.js} +1 -1
  39. package/dist/types.js.map +1 -0
  40. package/dist/utils/__tests__/tool-renderers.test.js +51 -0
  41. package/dist/utils/__tests__/tool-renderers.test.js.map +1 -0
  42. package/dist/utils/__tests__/xml-stream-parser.test.js +229 -0
  43. package/dist/utils/__tests__/xml-stream-parser.test.js.map +1 -0
  44. package/dist/utils/analytics.js +59 -0
  45. package/dist/utils/analytics.js.map +1 -0
  46. package/dist/utils/logger.js +105 -0
  47. package/dist/utils/logger.js.map +1 -0
  48. package/dist/utils/terminal.js +474 -0
  49. package/dist/utils/terminal.js.map +1 -0
  50. package/dist/utils/tool-renderers.js +145 -0
  51. package/dist/utils/tool-renderers.js.map +1 -0
  52. package/dist/utils/xml-stream-parser.js +128 -0
  53. package/dist/utils/xml-stream-parser.js.map +1 -0
  54. package/dist/web-scraper.js +57 -0
  55. package/dist/web-scraper.js.map +1 -0
  56. package/dist/workers/project-context.js +17 -0
  57. package/dist/workers/project-context.js.map +1 -0
  58. package/package.json +1 -1
  59. package/dist/common/billing/auto-topup.d.ts +0 -8
  60. package/dist/common/billing/auto-topup.js +0 -192
  61. package/dist/common/billing/auto-topup.js.map +0 -1
  62. package/dist/common/billing/balance-calculator.d.ts +0 -57
  63. package/dist/common/billing/balance-calculator.js +0 -218
  64. package/dist/common/billing/balance-calculator.js.map +0 -1
  65. package/dist/common/billing/conversion.d.ts +0 -9
  66. package/dist/common/billing/conversion.js +0 -20
  67. package/dist/common/billing/conversion.js.map +0 -1
  68. package/dist/common/billing/credit-conversion.d.ts +0 -24
  69. package/dist/common/billing/credit-conversion.js +0 -48
  70. package/dist/common/billing/credit-conversion.js.map +0 -1
  71. package/dist/common/billing/grant-credits.d.ts +0 -43
  72. package/dist/common/billing/grant-credits.js +0 -266
  73. package/dist/common/billing/grant-credits.js.map +0 -1
  74. package/dist/common/billing/plans.d.ts +0 -13
  75. package/dist/common/billing/plans.js +0 -44
  76. package/dist/common/billing/plans.js.map +0 -1
  77. package/dist/common/json-config/__tests__/__snapshots__/stringify-schema.test.js.snap +0 -66
  78. package/dist/common/types/plan.d.ts +0 -24
  79. package/dist/common/types/plan.js.map +0 -1
  80. package/dist/common/util/server/referral.d.ts +0 -14
  81. package/dist/common/util/server/referral.js +0 -85
  82. package/dist/common/util/server/referral.js.map +0 -1
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toolRenderers = exports.defaultToolCallRenderer = void 0;
4
+ const string_1 = require("../common/util/string");
5
+ const picocolors_1 = require("picocolors");
6
+ /**
7
+ * Default renderer for tool calls that formats them nicely for the console
8
+ */
9
+ exports.defaultToolCallRenderer = {
10
+ onToolStart: (toolName) => {
11
+ return (0, picocolors_1.gray)(`[${(0, picocolors_1.bold)((0, string_1.snakeToTitleCase)(toolName))}]`) + '\n';
12
+ },
13
+ onParamChunk: (content, paramName, toolName) => {
14
+ return (0, picocolors_1.gray)(content);
15
+ },
16
+ onParamEnd: () => null,
17
+ onToolEnd: () => null,
18
+ };
19
+ exports.toolRenderers = {
20
+ run_terminal_command: {
21
+ // Don't render anything
22
+ },
23
+ code_search: {
24
+ // Don't render anything
25
+ },
26
+ end_turn: {
27
+ // Don't render anything
28
+ },
29
+ browser_logs: {
30
+ // Don't render anything
31
+ },
32
+ read_files: {
33
+ ...exports.defaultToolCallRenderer,
34
+ onParamChunk: (content, paramName, toolName) => {
35
+ // Don't render chunks for paths, wait for the full list
36
+ return null;
37
+ },
38
+ onParamEnd: (paramName, toolName, content) => {
39
+ const files = content.trim().split('\n').filter(Boolean); // Split by newline and remove empty entries
40
+ const numFiles = files.length;
41
+ const maxInitialFiles = 3;
42
+ if (numFiles <= maxInitialFiles) {
43
+ // If 3 or fewer files, list them all on new lines
44
+ return (0, picocolors_1.gray)(files.join('\n'));
45
+ }
46
+ else {
47
+ // If more than 3 files
48
+ const initialFiles = files.slice(0, maxInitialFiles);
49
+ const remainingFiles = files.slice(maxInitialFiles);
50
+ const numRemaining = remainingFiles.length;
51
+ const remainingFilesString = remainingFiles.join(' ');
52
+ return (0, picocolors_1.gray)(`${initialFiles.map((file) => '- ' + file).join('\n')}\nand ${numRemaining} more: ${remainingFilesString}`);
53
+ }
54
+ },
55
+ onToolEnd: (toolName, params) => {
56
+ // Add a final newline after the file list
57
+ return '\n';
58
+ },
59
+ },
60
+ think_deeply: {
61
+ ...exports.defaultToolCallRenderer,
62
+ },
63
+ create_plan: {
64
+ ...exports.defaultToolCallRenderer,
65
+ onParamStart: (paramName) => {
66
+ if (paramName === 'path') {
67
+ return (0, picocolors_1.gray)('Editing plan at ');
68
+ }
69
+ return null;
70
+ },
71
+ onParamChunk: (content, paramName) => {
72
+ if (paramName === 'path') {
73
+ return (0, picocolors_1.gray)(content);
74
+ }
75
+ return null;
76
+ },
77
+ onParamEnd: (paramName) => {
78
+ if (paramName === 'path') {
79
+ return (0, picocolors_1.gray)('...') + '\n';
80
+ }
81
+ return null;
82
+ },
83
+ },
84
+ write_file: {
85
+ ...exports.defaultToolCallRenderer,
86
+ onParamStart: (paramName) => {
87
+ if (paramName === 'path') {
88
+ return (0, picocolors_1.gray)('Editing file at ');
89
+ }
90
+ return null;
91
+ },
92
+ onParamChunk: (content, paramName, toolName) => {
93
+ if (paramName === 'path') {
94
+ return (0, picocolors_1.gray)(content);
95
+ }
96
+ return null;
97
+ },
98
+ onParamEnd: (paramName) => paramName === 'path' ? (0, picocolors_1.gray)('...') + '\n' : null,
99
+ },
100
+ add_subgoal: {
101
+ ...exports.defaultToolCallRenderer,
102
+ onParamStart: (paramName, toolName) => {
103
+ if (paramName === 'id') {
104
+ return null;
105
+ }
106
+ return (0, picocolors_1.gray)((0, string_1.capitalize)(paramName) + ': ');
107
+ },
108
+ onParamChunk: (content, paramName, toolName) => {
109
+ if (paramName === 'id') {
110
+ return null;
111
+ }
112
+ return (0, picocolors_1.gray)(content);
113
+ },
114
+ onParamEnd: (paramName) => {
115
+ const paramsWithNewLine = ['objective', 'status'];
116
+ if (paramsWithNewLine.includes(paramName)) {
117
+ return '\n';
118
+ }
119
+ return null;
120
+ },
121
+ },
122
+ update_subgoal: {
123
+ ...exports.defaultToolCallRenderer,
124
+ onParamStart: (paramName, toolName) => {
125
+ if (paramName === 'id') {
126
+ return null;
127
+ }
128
+ return (0, picocolors_1.gray)((0, string_1.capitalize)(paramName) + ': ');
129
+ },
130
+ onParamChunk: (content, paramName, toolName) => {
131
+ if (paramName === 'id') {
132
+ return null;
133
+ }
134
+ return (0, picocolors_1.gray)(content);
135
+ },
136
+ onParamEnd: (paramName) => {
137
+ const paramsWithNewLine = ['status'];
138
+ if (paramsWithNewLine.includes(paramName)) {
139
+ return '\n';
140
+ }
141
+ return null;
142
+ },
143
+ },
144
+ };
145
+ //# sourceMappingURL=tool-renderers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-renderers.js","sourceRoot":"","sources":["../../src/utils/tool-renderers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createXMLStreamParser = createXMLStreamParser;
4
+ const tools_1 = require("../common/constants/tools");
5
+ const saxy_1 = require("../common/util/saxy");
6
+ const tool_renderers_1 = require("./tool-renderers");
7
+ /**
8
+ * Creates a transform stream that processes XML tool calls
9
+ * @param renderer Custom renderer for tool calls or a map of renderers per tool
10
+ * @param callback Optional callback function to receive processed chunks
11
+ * @returns Transform stream
12
+ */
13
+ function createXMLStreamParser(renderer, callback) {
14
+ // Create parser with tool schema validation
15
+ const parser = new saxy_1.Saxy(tools_1.toolSchema);
16
+ // Current state
17
+ let currentTool = null;
18
+ let currentParam = null;
19
+ let params = {};
20
+ let paramContent = '';
21
+ // Helper to get the appropriate renderer for the current tool
22
+ const getRenderer = (toolName) => {
23
+ if (!renderer)
24
+ return tool_renderers_1.defaultToolCallRenderer;
25
+ // If renderer is a map of tool-specific renderers
26
+ if (typeof renderer === 'object' && !('onToolStart' in renderer)) {
27
+ return (renderer[toolName] ||
28
+ tool_renderers_1.defaultToolCallRenderer);
29
+ }
30
+ // If renderer is a single renderer
31
+ return renderer;
32
+ };
33
+ // Set up event handlers
34
+ parser.on('tagopen', (tag) => {
35
+ const { name } = tag;
36
+ // Check if this is a tool tag
37
+ if (tools_1.TOOL_LIST.includes(name)) {
38
+ currentTool = name;
39
+ params = {};
40
+ // Call renderer if available
41
+ const toolRenderer = getRenderer(name);
42
+ if (toolRenderer.onToolStart) {
43
+ const output = toolRenderer.onToolStart(name, saxy_1.Saxy.parseAttrs(tag.attrs));
44
+ if (output !== null) {
45
+ parser.push(output);
46
+ if (callback)
47
+ callback(output);
48
+ }
49
+ }
50
+ }
51
+ // Check if this is a parameter tag inside a tool
52
+ else if (currentTool && !currentParam) {
53
+ currentParam = name;
54
+ paramContent = '';
55
+ // Call renderer if available
56
+ const toolRenderer = getRenderer(currentTool);
57
+ if (toolRenderer.onParamStart) {
58
+ const output = toolRenderer.onParamStart(name, currentTool);
59
+ if (output !== null) {
60
+ parser.push(output);
61
+ if (callback)
62
+ callback(output);
63
+ }
64
+ }
65
+ }
66
+ });
67
+ parser.on('text', (data) => {
68
+ if (currentTool && currentParam) {
69
+ paramContent += data.contents;
70
+ // Call renderer if available
71
+ const toolRenderer = getRenderer(currentTool);
72
+ if (toolRenderer.onParamChunk) {
73
+ const output = toolRenderer.onParamChunk(data.contents, currentParam, currentTool);
74
+ if (output !== null) {
75
+ parser.push(output);
76
+ if (callback)
77
+ callback(output);
78
+ }
79
+ }
80
+ }
81
+ else {
82
+ // Text outside of tool tags
83
+ parser.push(data.contents);
84
+ if (callback)
85
+ callback(data.contents);
86
+ }
87
+ });
88
+ parser.on('tagclose', (tag) => {
89
+ const { name } = tag;
90
+ // Check if this is a parameter tag closing
91
+ if (currentTool && currentParam && name === currentParam) {
92
+ // Store parameter content
93
+ params[currentParam] = paramContent;
94
+ // Call renderer if available
95
+ const toolRenderer = getRenderer(currentTool);
96
+ if (toolRenderer.onParamEnd) {
97
+ const output = toolRenderer.onParamEnd(currentParam, currentTool, paramContent);
98
+ if (output !== null) {
99
+ parser.push(output);
100
+ if (callback)
101
+ callback(output);
102
+ }
103
+ }
104
+ currentParam = null;
105
+ paramContent = '';
106
+ }
107
+ // Check if this is a tool tag closing
108
+ else if (currentTool && name === currentTool) {
109
+ // Call renderer if available
110
+ const toolRenderer = getRenderer(currentTool);
111
+ if (toolRenderer.onToolEnd) {
112
+ const output = toolRenderer.onToolEnd(currentTool, params);
113
+ if (output !== null) {
114
+ parser.push(output);
115
+ if (callback)
116
+ callback(output);
117
+ }
118
+ }
119
+ currentTool = null;
120
+ params = {};
121
+ }
122
+ });
123
+ parser.on('end', () => {
124
+ parser.end();
125
+ });
126
+ return parser;
127
+ }
128
+ //# sourceMappingURL=xml-stream-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-stream-parser.js","sourceRoot":"","sources":["../../src/utils/xml-stream-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scrapeWebPage = scrapeWebPage;
4
+ exports.parseUrlsFromContent = parseUrlsFromContent;
5
+ exports.getScrapedContentBlocks = getScrapedContentBlocks;
6
+ const string_1 = require("./common/util/string");
7
+ // Global cache for scraped web pages
8
+ const scrapedPagesCache = {};
9
+ async function scrapeWebPage(url) {
10
+ // Check if the page is already in the cache
11
+ if (scrapedPagesCache[url] !== undefined) {
12
+ return scrapedPagesCache[url];
13
+ }
14
+ try {
15
+ let content = '';
16
+ const fullUrl = (0, string_1.ensureUrlProtocol)(url);
17
+ if (fullUrl.startsWith('https://raw.githubusercontent.com/')) {
18
+ const response = await fetch(url);
19
+ content = await response.text();
20
+ }
21
+ else {
22
+ const response = await fetch(`https://r.jina.ai/${url}`);
23
+ content = await response.text();
24
+ }
25
+ // Store the scraped content in the cache
26
+ scrapedPagesCache[url] = content;
27
+ return content;
28
+ }
29
+ catch (error) {
30
+ // console.error(
31
+ // `Error scraping web page ${url}:`,
32
+ // error instanceof Error ? error.message : error
33
+ // )
34
+ scrapedPagesCache[url] = '';
35
+ return '';
36
+ }
37
+ }
38
+ function parseUrlsFromContent(content) {
39
+ const urlRegex = /https?:\/\/[^\s]+/g;
40
+ return content.match(urlRegex) || [];
41
+ }
42
+ const MAX_SCRAPED_CONTENT_LENGTH = 75_000;
43
+ async function getScrapedContentBlocks(urls) {
44
+ const blocks = [];
45
+ for (const url of urls) {
46
+ const scrapedContent = await scrapeWebPage(url);
47
+ const truncatedScrapedContent = scrapedContent.length > MAX_SCRAPED_CONTENT_LENGTH
48
+ ? scrapedContent.slice(0, MAX_SCRAPED_CONTENT_LENGTH) +
49
+ '[...TRUNCATED: WEB PAGE CONTENT TOO LONG...]'
50
+ : scrapedContent;
51
+ if (truncatedScrapedContent) {
52
+ blocks.push(`<web_scraped_content url="${url}">\n${truncatedScrapedContent}\n</web_scraped_content>`);
53
+ }
54
+ }
55
+ return blocks;
56
+ }
57
+ //# sourceMappingURL=web-scraper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-scraper.js","sourceRoot":"","sources":["../src/web-scraper.ts"],"names":[],"mappings":";;AAKA,sCA4BC;AAED,oDAGC;AAGD,0DAgBC;AAzDD,+CAAsD;AAEtD,qCAAqC;AACrC,MAAM,iBAAiB,GAA2B,EAAE,CAAA;AAE7C,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,4CAA4C;IAC5C,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,MAAM,OAAO,GAAG,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAA;QACtC,IAAI,OAAO,CAAC,UAAU,CAAC,oCAAoC,CAAC,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;YACjC,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAA;YACxD,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACjC,CAAC;QACD,yCAAyC;QACzC,iBAAiB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;QAEhC,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iBAAiB;QACjB,uCAAuC;QACvC,mDAAmD;QACnD,IAAI;QACJ,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;QAC3B,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAe;IAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAA;IACrC,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;AACtC,CAAC;AAED,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAClC,KAAK,UAAU,uBAAuB,CAAC,IAAc;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;QAC/C,MAAM,uBAAuB,GAC3B,cAAc,CAAC,MAAM,GAAG,0BAA0B;YAChD,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC;gBACnD,8CAA8C;YAChD,CAAC,CAAC,cAAc,CAAA;QACpB,IAAI,uBAAuB,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CACT,6BAA6B,GAAG,OAAO,uBAAuB,0BAA0B,CACzF,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const worker_threads_1 = require("worker_threads");
4
+ const project_files_1 = require("../project-files");
5
+ const file_manager_1 = require("../checkpoints/file-manager");
6
+ const project_file_tree_1 = require("../common/project-file-tree");
7
+ if (worker_threads_1.parentPort) {
8
+ const parentPort = worker_threads_1.parentPort;
9
+ parentPort.on('message', async ({ dir }) => {
10
+ (0, project_files_1.setProjectRoot)(dir);
11
+ const initFileContext = await (0, project_files_1.getProjectFileContext)(dir, {});
12
+ const relativeFilepaths = (0, project_file_tree_1.getAllFilePaths)(initFileContext.fileTree);
13
+ await (0, file_manager_1.initializeCheckpointFileManager)({ projectDir: dir, relativeFilepaths });
14
+ parentPort.postMessage(initFileContext);
15
+ });
16
+ }
17
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/workers/project-context.ts"],"names":[],"mappings":";;AAAA,mDAA8D;AAC9D,oDAAwE;AACxE,8DAA6E;AAC7E,gEAA0D;AAE1D,IAAI,2BAAe,EAAE,CAAC;IACpB,MAAM,UAAU,GAAG,2BAAe,CAAA;IAElC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QACzC,IAAA,8BAAc,EAAC,GAAG,CAAC,CAAA;QACnB,MAAM,eAAe,GAAG,MAAM,IAAA,qCAAqB,EAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAE5D,MAAM,iBAAiB,GAAG,IAAA,mCAAe,EAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;QACnE,MAAM,IAAA,8CAA+B,EAAC,EAAE,UAAU,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,CAAA;QAE7E,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebuff",
3
- "version": "1.0.249",
3
+ "version": "1.0.250",
4
4
  "description": "AI dev assistant",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -1,8 +0,0 @@
1
- import type Stripe from 'stripe';
2
- interface AutoTopupValidationResult {
3
- blockedReason: string | null;
4
- validPaymentMethod: Stripe.PaymentMethod | null;
5
- }
6
- export declare function validateAutoTopupStatus(userId: string): Promise<AutoTopupValidationResult>;
7
- export declare function checkAndTriggerAutoTopup(userId: string): Promise<void>;
8
- export {};
@@ -1,192 +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.validateAutoTopupStatus = validateAutoTopupStatus;
30
- exports.checkAndTriggerAutoTopup = checkAndTriggerAutoTopup;
31
- const db_1 = __importDefault(require("../db"));
32
- const schema = __importStar(require("../db/schema"));
33
- const drizzle_orm_1 = require("drizzle-orm");
34
- const stripe_1 = require("../util/stripe");
35
- const logger_1 = require("../util/logger");
36
- const grant_credits_1 = require("./grant-credits");
37
- const balance_calculator_1 = require("./balance-calculator");
38
- const conversion_1 = require("./conversion");
39
- const string_1 = require("../util/string");
40
- const env_mjs_1 = require("src/env.mjs");
41
- const MINIMUM_PURCHASE_CREDITS = 500;
42
- class AutoTopupValidationError extends Error {
43
- constructor(message) {
44
- super(message);
45
- this.name = 'AutoTopupValidationError';
46
- }
47
- }
48
- class AutoTopupPaymentError extends Error {
49
- constructor(message) {
50
- super(message);
51
- this.name = 'AutoTopupPaymentError';
52
- }
53
- }
54
- async function validateAutoTopupStatus(userId) {
55
- const logContext = { userId };
56
- try {
57
- const user = await db_1.default.query.user.findFirst({
58
- where: (0, drizzle_orm_1.eq)(schema.user.id, userId),
59
- columns: {
60
- stripe_customer_id: true,
61
- },
62
- });
63
- if (!user?.stripe_customer_id) {
64
- throw new AutoTopupValidationError(`You don't have a valid account with us. Please log in at ${env_mjs_1.env.NEXT_PUBLIC_APP_URL}/login`);
65
- }
66
- const paymentMethods = await stripe_1.stripeServer.paymentMethods.list({
67
- customer: user.stripe_customer_id,
68
- type: 'card',
69
- });
70
- const validPaymentMethod = paymentMethods.data.find((pm) => pm.card?.exp_year &&
71
- pm.card.exp_month &&
72
- new Date(pm.card.exp_year, pm.card.exp_month - 1) > new Date());
73
- if (!validPaymentMethod) {
74
- throw new AutoTopupValidationError('You need a valid payment method to enable auto top-up. Try buying some credits!');
75
- }
76
- return {
77
- blockedReason: null,
78
- validPaymentMethod,
79
- };
80
- }
81
- catch (error) {
82
- const blockedReason = error instanceof AutoTopupValidationError
83
- ? error.message
84
- : 'Unable to verify payment method status.';
85
- await disableAutoTopup(userId, blockedReason);
86
- return {
87
- blockedReason,
88
- validPaymentMethod: null,
89
- };
90
- }
91
- }
92
- async function disableAutoTopup(userId, reason) {
93
- await db_1.default
94
- .update(schema.user)
95
- .set({ auto_topup_enabled: false })
96
- .where((0, drizzle_orm_1.eq)(schema.user.id, userId));
97
- logger_1.logger.info({ userId, reason }, 'Disabled auto top-up');
98
- }
99
- async function processAutoTopupPayment(userId, amountToTopUp, stripeCustomerId, paymentMethod) {
100
- const logContext = { userId, amountToTopUp };
101
- const operationId = `auto-${userId}-${(0, string_1.generateCompactId)()}`;
102
- const centsPerCredit = await (0, conversion_1.getUserCostPerCredit)(userId);
103
- const amountInCents = (0, conversion_1.convertCreditsToUsdCents)(amountToTopUp, centsPerCredit);
104
- if (amountInCents <= 0) {
105
- throw new AutoTopupPaymentError('Invalid payment amount calculated');
106
- }
107
- const paymentIntent = await stripe_1.stripeServer.paymentIntents.create({
108
- amount: amountInCents,
109
- currency: 'usd',
110
- customer: stripeCustomerId,
111
- payment_method: paymentMethod.id,
112
- off_session: true,
113
- confirm: true,
114
- description: `Auto top-up: ${amountToTopUp.toLocaleString()} credits`,
115
- metadata: {
116
- userId,
117
- credits: amountToTopUp.toString(),
118
- operationId,
119
- grantType: 'purchase',
120
- type: 'auto-topup',
121
- },
122
- });
123
- if (paymentIntent.status !== 'succeeded') {
124
- throw new AutoTopupPaymentError('Payment failed or requires action');
125
- }
126
- await (0, grant_credits_1.processAndGrantCredit)(userId, amountToTopUp, 'purchase', `Auto top-up of ${amountToTopUp.toLocaleString()} credits`, null, operationId);
127
- logger_1.logger.info({
128
- ...logContext,
129
- operationId,
130
- paymentIntentId: paymentIntent.id,
131
- }, 'Auto top-up payment succeeded and credits granted');
132
- }
133
- async function checkAndTriggerAutoTopup(userId) {
134
- const logContext = { userId };
135
- try {
136
- const user = await db_1.default.query.user.findFirst({
137
- where: (0, drizzle_orm_1.eq)(schema.user.id, userId),
138
- columns: {
139
- id: true,
140
- stripe_customer_id: true,
141
- auto_topup_enabled: true,
142
- auto_topup_threshold: true,
143
- auto_topup_amount: true,
144
- next_quota_reset: true,
145
- },
146
- });
147
- if (!user ||
148
- !user.auto_topup_enabled ||
149
- user.auto_topup_threshold === null ||
150
- user.auto_topup_amount === null ||
151
- !user.stripe_customer_id) {
152
- return;
153
- }
154
- const { blockedReason, validPaymentMethod } = await validateAutoTopupStatus(userId);
155
- if (blockedReason || !validPaymentMethod) {
156
- throw new Error(blockedReason || 'Auto top-up is not available.');
157
- }
158
- const { balance } = await (0, balance_calculator_1.calculateUsageAndBalance)(userId, user.next_quota_reset ?? new Date(0));
159
- if (balance.totalRemaining >= user.auto_topup_threshold && balance.totalDebt === 0) {
160
- return;
161
- }
162
- const amountToTopUp = balance.totalDebt > 0
163
- ? Math.max(user.auto_topup_amount, balance.totalDebt)
164
- : user.auto_topup_amount;
165
- if (amountToTopUp < MINIMUM_PURCHASE_CREDITS) {
166
- logger_1.logger.warn(logContext, `Auto-top-up triggered but amount ${amountToTopUp} is less than minimum ${MINIMUM_PURCHASE_CREDITS}. Skipping top-up. Check user settings.`);
167
- return;
168
- }
169
- logger_1.logger.info({
170
- ...logContext,
171
- currentBalance: balance.totalRemaining,
172
- currentDebt: balance.totalDebt,
173
- threshold: user.auto_topup_threshold,
174
- amountToTopUp,
175
- }, `Auto-top-up triggered for user ${userId}. Attempting to purchase ${amountToTopUp} credits.`);
176
- try {
177
- await processAutoTopupPayment(userId, amountToTopUp, user.stripe_customer_id, validPaymentMethod);
178
- }
179
- catch (error) {
180
- const message = error instanceof AutoTopupPaymentError
181
- ? error.message
182
- : 'Payment failed. Please check your payment method and re-enable auto top-up.';
183
- await disableAutoTopup(userId, message);
184
- throw new Error(message);
185
- }
186
- }
187
- catch (error) {
188
- logger_1.logger.error({ ...logContext, error }, `Error during auto-top-up check for user ${userId}`);
189
- throw error;
190
- }
191
- }
192
- //# sourceMappingURL=auto-topup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-topup.js","sourceRoot":"","sources":["../../src/billing/auto-topup.ts"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- import db from '../db';
2
- import { GrantType } from '../db/schema';
3
- export interface CreditBalance {
4
- totalRemaining: number;
5
- totalDebt: number;
6
- netBalance: number;
7
- breakdown: Partial<Record<GrantType, number>>;
8
- principals: Partial<Record<GrantType, number>>;
9
- }
10
- export interface CreditUsageAndBalance {
11
- usageThisCycle: number;
12
- balance: CreditBalance;
13
- }
14
- export interface CreditConsumptionResult {
15
- consumed: number;
16
- fromPurchased: number;
17
- }
18
- type DbConn = Pick<typeof db, 'select' | 'update'>;
19
- /**
20
- * Gets active grants for a user, ordered by expiration (soonest first), then priority, and creation date.
21
- * Added optional `conn` param so callers inside a transaction can supply their TX object.
22
- */
23
- export declare function getOrderedActiveGrants(userId: string, now: Date, conn?: DbConn): Promise<{
24
- created_at: Date;
25
- type: import("../types/grant").GrantType;
26
- expires_at: Date | null;
27
- operation_id: string;
28
- user_id: string;
29
- principal: number;
30
- balance: number;
31
- description: string | null;
32
- priority: number;
33
- }[]>;
34
- /**
35
- * Calculates both the current balance and usage in this cycle in a single query.
36
- * This is more efficient than calculating them separately.
37
- */
38
- export declare function calculateUsageAndBalance(userId: string, quotaResetDate: Date, now?: Date): Promise<CreditUsageAndBalance>;
39
- /**
40
- * Updates the remaining amounts in credit grants after consumption.
41
- * Follows priority order strictly - higher priority grants (lower number) are consumed first.
42
- * Returns details about credit consumption including how many came from purchased credits.
43
- *
44
- * Uses SERIALIZABLE isolation to prevent concurrent modifications that could lead to
45
- * incorrect credit usage (e.g., "double spending" credits).
46
- *
47
- * @param userId The ID of the user
48
- * @param creditsToConsume Number of credits being consumed
49
- * @returns Promise resolving to number of credits consumed
50
- */
51
- export declare function consumeCredits(userId: string, creditsToConsume: number): Promise<CreditConsumptionResult>;
52
- /**
53
- * Calculate the total credits used during the current billing cycle for a user
54
- * by summing the difference between initial and remaining amounts for all relevant grants.
55
- */
56
- export declare function calculateUsageThisCycle(userId: string, quotaResetDate: Date): Promise<number>;
57
- export {};