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.
- package/dist/background-process-manager.js +359 -0
- package/dist/background-process-manager.js.map +1 -0
- package/dist/browser-runner.js +680 -0
- package/dist/browser-runner.js.map +1 -0
- package/dist/chat-storage.js +93 -0
- package/dist/chat-storage.js.map +1 -0
- package/dist/checkpoints/checkpoint-manager.js +280 -0
- package/dist/checkpoints/checkpoint-manager.js.map +1 -0
- package/dist/cli-handlers/api-key.js +66 -0
- package/dist/cli-handlers/api-key.js.map +1 -0
- package/dist/cli-handlers/checkpoint.js +195 -0
- package/dist/cli-handlers/checkpoint.js.map +1 -0
- package/dist/cli-handlers/diff.js +31 -0
- package/dist/cli-handlers/diff.js.map +1 -0
- package/dist/cli-handlers/inititalization-flow.js +24 -0
- package/dist/cli-handlers/inititalization-flow.js.map +1 -0
- package/dist/cli.js +478 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.js +836 -0
- package/dist/client.js.map +1 -0
- package/dist/common/actions.d.ts +32 -32
- package/dist/common/types/usage.d.ts +2 -2
- package/dist/common/websockets/websocket-schema.d.ts +68 -68
- package/dist/credentials.js +38 -0
- package/dist/credentials.js.map +1 -0
- package/dist/dev-process-manager.js +54 -0
- package/dist/dev-process-manager.js.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/menu.js +126 -0
- package/dist/menu.js.map +1 -0
- package/dist/project-files.js +513 -0
- package/dist/project-files.js.map +1 -0
- package/dist/startup-process-handler.js +21 -0
- package/dist/startup-process-handler.js.map +1 -0
- package/dist/tool-handlers.js +240 -0
- package/dist/tool-handlers.js.map +1 -0
- package/dist/{common/types/plan.js → types.js} +1 -1
- package/dist/types.js.map +1 -0
- package/dist/utils/__tests__/tool-renderers.test.js +51 -0
- package/dist/utils/__tests__/tool-renderers.test.js.map +1 -0
- package/dist/utils/__tests__/xml-stream-parser.test.js +229 -0
- package/dist/utils/__tests__/xml-stream-parser.test.js.map +1 -0
- package/dist/utils/analytics.js +59 -0
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/logger.js +105 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/terminal.js +474 -0
- package/dist/utils/terminal.js.map +1 -0
- package/dist/utils/tool-renderers.js +145 -0
- package/dist/utils/tool-renderers.js.map +1 -0
- package/dist/utils/xml-stream-parser.js +128 -0
- package/dist/utils/xml-stream-parser.js.map +1 -0
- package/dist/web-scraper.js +57 -0
- package/dist/web-scraper.js.map +1 -0
- package/dist/workers/project-context.js +17 -0
- package/dist/workers/project-context.js.map +1 -0
- package/package.json +1 -1
- package/dist/common/billing/auto-topup.d.ts +0 -8
- package/dist/common/billing/auto-topup.js +0 -192
- package/dist/common/billing/auto-topup.js.map +0 -1
- package/dist/common/billing/balance-calculator.d.ts +0 -57
- package/dist/common/billing/balance-calculator.js +0 -218
- package/dist/common/billing/balance-calculator.js.map +0 -1
- package/dist/common/billing/conversion.d.ts +0 -9
- package/dist/common/billing/conversion.js +0 -20
- package/dist/common/billing/conversion.js.map +0 -1
- package/dist/common/billing/credit-conversion.d.ts +0 -24
- package/dist/common/billing/credit-conversion.js +0 -48
- package/dist/common/billing/credit-conversion.js.map +0 -1
- package/dist/common/billing/grant-credits.d.ts +0 -43
- package/dist/common/billing/grant-credits.js +0 -266
- package/dist/common/billing/grant-credits.js.map +0 -1
- package/dist/common/billing/plans.d.ts +0 -13
- package/dist/common/billing/plans.js +0 -44
- package/dist/common/billing/plans.js.map +0 -1
- package/dist/common/json-config/__tests__/__snapshots__/stringify-schema.test.js.snap +0 -66
- package/dist/common/types/plan.d.ts +0 -24
- package/dist/common/types/plan.js.map +0 -1
- package/dist/common/util/server/referral.d.ts +0 -14
- package/dist/common/util/server/referral.js +0 -85
- 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":";;AAUA,sDA2IC;AArJD,kDAAwE;AACxE,2CAAuC;AACvC,qDAA4E;AAE5E;;;;;GAKG;AACH,SAAgB,qBAAqB,CACnC,QAA0C,EAC1C,QAAkC;IAElC,4CAA4C;IAC5C,MAAM,MAAM,GAAG,IAAI,WAAI,CAAC,kBAAU,CAAC,CAAA;IAEnC,gBAAgB;IAChB,IAAI,WAAW,GAAkB,IAAI,CAAA;IACrC,IAAI,YAAY,GAAkB,IAAI,CAAA;IACtC,IAAI,MAAM,GAA2B,EAAE,CAAA;IACvC,IAAI,YAAY,GAAG,EAAE,CAAA;IAErB,8DAA8D;IAC9D,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAoB,EAAE;QACzD,IAAI,CAAC,QAAQ;YAAE,OAAO,wCAAuB,CAAA;QAE7C,kDAAkD;QAClD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,IAAI,QAAQ,CAAC,EAAE,CAAC;YACjE,OAAO,CACJ,QAA6C,CAAC,QAAQ,CAAC;gBACxD,wCAAuB,CACxB,CAAA;QACH,CAAC;QAED,mCAAmC;QACnC,OAAO,QAA4B,CAAA;IACrC,CAAC,CAAA;IAED,wBAAwB;IACxB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;QAEpB,8BAA8B;QAC9B,IAAI,iBAAS,CAAC,QAAQ,CAAC,IAAgB,CAAC,EAAE,CAAC;YACzC,WAAW,GAAG,IAAI,CAAA;YAClB,MAAM,GAAG,EAAE,CAAA;YAEX,6BAA6B;YAC7B,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;YACtC,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CACrC,IAAI,EACJ,WAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAA2B,CACrD,CAAA;gBACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACnB,IAAI,QAAQ;wBAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QACD,iDAAiD;aAC5C,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,YAAY,GAAG,IAAI,CAAA;YACnB,YAAY,GAAG,EAAE,CAAA;YAEjB,6BAA6B;YAC7B,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;gBAC3D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACnB,IAAI,QAAQ;wBAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;YAChC,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAA;YAE7B,6BAA6B;YAC7B,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CACtC,IAAI,CAAC,QAAQ,EACb,YAAY,EACZ,WAAW,CACZ,CAAA;gBACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACnB,IAAI,QAAQ;wBAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1B,IAAI,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;QAEpB,2CAA2C;QAC3C,IAAI,WAAW,IAAI,YAAY,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YACzD,0BAA0B;YAC1B,MAAM,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;YAEnC,6BAA6B;YAC7B,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CACpC,YAAY,EACZ,WAAW,EACX,YAAY,CACb,CAAA;gBACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACnB,IAAI,QAAQ;wBAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;YAED,YAAY,GAAG,IAAI,CAAA;YACnB,YAAY,GAAG,EAAE,CAAA;QACnB,CAAC;QACD,sCAAsC;aACjC,IAAI,WAAW,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7C,6BAA6B;YAC7B,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;gBAC1D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACnB,IAAI,QAAQ;wBAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;YAED,WAAW,GAAG,IAAI,CAAA;YAClB,MAAM,GAAG,EAAE,CAAA;QACb,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,GAAG,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -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,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 {};
|