codebuff 1.0.227 → 1.0.229
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.d.ts +4 -2
- package/dist/background-process-manager.js +75 -56
- package/dist/background-process-manager.js.map +1 -1
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +15 -2
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +7 -5
- package/dist/client.js +49 -29
- package/dist/client.js.map +1 -1
- package/dist/code-map/tsconfig.tsbuildinfo +1 -1
- package/dist/common/actions.d.ts +114 -108
- package/dist/common/actions.js +5 -1
- package/dist/common/actions.js.map +1 -1
- package/dist/common/bigquery/client.d.ts +15 -0
- package/dist/common/bigquery/client.js +245 -0
- package/dist/common/bigquery/client.js.map +1 -0
- package/dist/common/bigquery/schema.d.ts +54 -0
- package/dist/common/bigquery/schema.js +24 -0
- package/dist/common/bigquery/schema.js.map +1 -0
- package/dist/common/billing/balance-calculator.d.ts +3 -0
- package/dist/common/billing/balance-calculator.js +6 -2
- package/dist/common/billing/balance-calculator.js.map +1 -1
- package/dist/common/billing/grant-credits.d.ts +16 -1
- package/dist/common/billing/grant-credits.js +67 -2
- package/dist/common/billing/grant-credits.js.map +1 -1
- package/dist/common/constants/tools.d.ts +1 -0
- package/dist/common/constants/tools.js +21 -1
- package/dist/common/constants/tools.js.map +1 -1
- package/dist/common/constants.d.ts +2 -1
- package/dist/common/constants.js +2 -5
- package/dist/common/constants.js.map +1 -1
- package/dist/common/db/transaction.d.ts +12 -0
- package/dist/common/db/transaction.js +36 -0
- package/dist/common/db/transaction.js.map +1 -0
- package/dist/common/json-config/__tests__/stringify-schema.test.d.ts +1 -0
- package/dist/common/json-config/__tests__/stringify-schema.test.js +66 -0
- package/dist/common/json-config/__tests__/stringify-schema.test.js.map +1 -0
- package/dist/common/json-config/constants.d.ts +77 -0
- package/dist/common/json-config/constants.js +42 -0
- package/dist/common/json-config/constants.js.map +1 -0
- package/dist/common/json-config/stringify-schema.d.ts +10 -0
- package/dist/common/json-config/stringify-schema.js +87 -0
- package/dist/common/json-config/stringify-schema.js.map +1 -0
- package/dist/common/types/usage.d.ts +4 -4
- package/dist/common/util/__tests__/string.test.js +2 -3
- package/dist/common/util/__tests__/string.test.js.map +1 -1
- package/dist/common/util/string.d.ts +3 -2
- package/dist/common/util/string.js +14 -4
- package/dist/common/util/string.js.map +1 -1
- package/dist/common/websockets/websocket-client.d.ts +2 -1
- package/dist/common/websockets/websocket-client.js +12 -0
- package/dist/common/websockets/websocket-client.js.map +1 -1
- package/dist/common/websockets/websocket-schema.d.ts +222 -202
- package/dist/{json-config/dev-process-manager.d.ts → dev-process-manager.d.ts} +1 -1
- package/dist/{json-config/dev-process-manager.js → dev-process-manager.js} +15 -5
- package/dist/dev-process-manager.js.map +1 -0
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/__tests__/response-example-4-files.txt +621 -0
- package/dist/utils/__tests__/tool-renderers.test.js +16 -8
- package/dist/utils/__tests__/tool-renderers.test.js.map +1 -1
- package/dist/utils/__tests__/xml-stream-parser.test.js +23 -11
- package/dist/utils/__tests__/xml-stream-parser.test.js.map +1 -1
- package/dist/utils/terminal.d.ts +10 -3
- package/dist/utils/terminal.js +53 -14
- package/dist/utils/terminal.js.map +1 -1
- package/package.json +2 -2
- package/dist/common/billing/quota-manager.d.ts +0 -29
- package/dist/common/billing/quota-manager.js +0 -251
- package/dist/common/billing/quota-manager.js.map +0 -1
- package/dist/common/logger.d.ts +0 -1
- package/dist/common/logger.js +0 -7
- package/dist/common/logger.js.map +0 -1
- package/dist/common/util/constants.d.ts +0 -1
- package/dist/common/util/constants.js +0 -7
- package/dist/common/util/constants.js.map +0 -1
- package/dist/common/util/helpers.d.ts +0 -1
- package/dist/common/util/helpers.js +0 -6
- package/dist/common/util/helpers.js.map +0 -1
- package/dist/common/util/token-counter.d.ts +0 -3
- package/dist/common/util/token-counter.js +0 -27
- package/dist/common/util/token-counter.js.map +0 -1
- package/dist/common/util/tools.d.ts +0 -2
- package/dist/common/util/tools.js +0 -13
- package/dist/common/util/tools.js.map +0 -1
- package/dist/json-config/constants.d.ts +0 -43
- package/dist/json-config/constants.js +0 -13
- package/dist/json-config/constants.js.map +0 -1
- package/dist/json-config/dev-process-manager.js.map +0 -1
- /package/dist/{json-config → common/json-config}/parser.d.ts +0 -0
- /package/dist/{json-config → common/json-config}/parser.js +0 -0
- /package/dist/{json-config → common/json-config}/parser.js.map +0 -0
package/dist/common/actions.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SERVER_ACTION_SCHEMA = exports.PromptResponseSchema = exports.MessageCostResponseSchema = exports.ResponseCompleteSchema = exports.InitResponseSchema = exports.UsageReponseSchema = exports.CLIENT_ACTION_SCHEMA = exports.ToolCallSchema = exports.CHANGES = exports.FileChangeSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
-
const file_1 = require("./util/file");
|
|
6
5
|
const constants_1 = require("./constants");
|
|
7
6
|
const agent_state_1 = require("./types/agent-state");
|
|
8
7
|
const grant_1 = require("./types/grant");
|
|
8
|
+
const file_1 = require("./util/file");
|
|
9
9
|
exports.FileChangeSchema = zod_1.z.object({
|
|
10
10
|
type: zod_1.z.enum(['patch', 'file']),
|
|
11
11
|
path: zod_1.z.string(),
|
|
@@ -136,5 +136,9 @@ exports.SERVER_ACTION_SCHEMA = zod_1.z.discriminatedUnion('type', [
|
|
|
136
136
|
type: zod_1.z.literal('commit-message-response'),
|
|
137
137
|
commitMessage: zod_1.z.string(),
|
|
138
138
|
}),
|
|
139
|
+
zod_1.z.object({
|
|
140
|
+
// The server is imminently going to shutdown, and the client should reconnect
|
|
141
|
+
type: zod_1.z.literal('request-reconnect'),
|
|
142
|
+
}),
|
|
139
143
|
]);
|
|
140
144
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { GetRelevantFilesTrace, Relabel, Trace } from './schema';
|
|
2
|
+
export declare function setupBigQuery(dataset?: string): Promise<void>;
|
|
3
|
+
export declare function insertTrace(trace: Trace, dataset?: string): Promise<boolean>;
|
|
4
|
+
export declare function insertRelabel(relabel: Relabel, dataset?: string): Promise<boolean>;
|
|
5
|
+
export declare function getRecentTraces(limit?: number, dataset?: string): Promise<Trace[]>;
|
|
6
|
+
export declare function getRecentRelabels(limit?: number, dataset?: string): Promise<Relabel[]>;
|
|
7
|
+
export declare function getTracesWithoutRelabels(model: string, limit?: number, userId?: string | undefined, dataset?: string): Promise<GetRelevantFilesTrace[]>;
|
|
8
|
+
export declare function getTracesWithRelabels(model: string, limit?: number, dataset?: string): Promise<{
|
|
9
|
+
trace: GetRelevantFilesTrace;
|
|
10
|
+
relabel: Relabel;
|
|
11
|
+
}[]>;
|
|
12
|
+
export declare function getTracesAndRelabelsForUser(userId: string, limit?: number, dataset?: string): Promise<{
|
|
13
|
+
trace: GetRelevantFilesTrace;
|
|
14
|
+
relabels: Relabel[];
|
|
15
|
+
}[]>;
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setupBigQuery = setupBigQuery;
|
|
4
|
+
exports.insertTrace = insertTrace;
|
|
5
|
+
exports.insertRelabel = insertRelabel;
|
|
6
|
+
exports.getRecentTraces = getRecentTraces;
|
|
7
|
+
exports.getRecentRelabels = getRecentRelabels;
|
|
8
|
+
exports.getTracesWithoutRelabels = getTracesWithoutRelabels;
|
|
9
|
+
exports.getTracesWithRelabels = getTracesWithRelabels;
|
|
10
|
+
exports.getTracesAndRelabelsForUser = getTracesAndRelabelsForUser;
|
|
11
|
+
const bigquery_1 = require("@google-cloud/bigquery");
|
|
12
|
+
const logger_1 = require("../util/logger");
|
|
13
|
+
const schema_1 = require("./schema");
|
|
14
|
+
const DATASET = process.env.ENVIRONMENT === 'production'
|
|
15
|
+
? 'codebuff_data'
|
|
16
|
+
: 'codebuff_data_dev';
|
|
17
|
+
const TRACES_TABLE = 'traces';
|
|
18
|
+
const RELABELS_TABLE = 'relabels';
|
|
19
|
+
// Create a single BigQuery client instance to be used by all functions
|
|
20
|
+
const client = new bigquery_1.BigQuery();
|
|
21
|
+
async function setupBigQuery(dataset = DATASET) {
|
|
22
|
+
try {
|
|
23
|
+
// Ensure dataset exists
|
|
24
|
+
const [ds] = await client.dataset(dataset).get({ autoCreate: true });
|
|
25
|
+
// Ensure tables exist
|
|
26
|
+
await ds.table(TRACES_TABLE).get({
|
|
27
|
+
autoCreate: true,
|
|
28
|
+
schema: schema_1.TRACES_SCHEMA,
|
|
29
|
+
timePartitioning: {
|
|
30
|
+
type: 'MONTH',
|
|
31
|
+
field: 'created_at',
|
|
32
|
+
},
|
|
33
|
+
clustering: {
|
|
34
|
+
fields: ['user_id', 'agent_step_id'],
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
await ds.table(RELABELS_TABLE).get({
|
|
38
|
+
autoCreate: true,
|
|
39
|
+
schema: schema_1.RELABELS_SCHEMA,
|
|
40
|
+
timePartitioning: {
|
|
41
|
+
type: 'MONTH',
|
|
42
|
+
field: 'created_at',
|
|
43
|
+
},
|
|
44
|
+
clustering: {
|
|
45
|
+
fields: ['user_id', 'agent_step_id'],
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.log('Failed to initialize BigQuery', JSON.stringify(error));
|
|
51
|
+
logger_1.logger.error({ error }, 'Failed to initialize BigQuery');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function insertTrace(trace, dataset = DATASET) {
|
|
55
|
+
try {
|
|
56
|
+
// Create a copy of the trace and stringify payload if needed
|
|
57
|
+
const traceToInsert = {
|
|
58
|
+
...trace,
|
|
59
|
+
payload: trace.payload && typeof trace.payload !== 'string'
|
|
60
|
+
? JSON.stringify(trace.payload)
|
|
61
|
+
: trace.payload,
|
|
62
|
+
};
|
|
63
|
+
await client.dataset(dataset).table(TRACES_TABLE).insert(traceToInsert);
|
|
64
|
+
logger_1.logger.debug({ traceId: trace.id, type: trace.type }, 'Inserted trace into BigQuery');
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger_1.logger.error({ error, traceId: trace.id }, 'Failed to insert trace into BigQuery');
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function insertRelabel(relabel, dataset = DATASET) {
|
|
73
|
+
try {
|
|
74
|
+
// Stringify payload if needed
|
|
75
|
+
const relabelToInsert = {
|
|
76
|
+
...relabel,
|
|
77
|
+
payload: relabel.payload && typeof relabel.payload !== 'string'
|
|
78
|
+
? JSON.stringify(relabel.payload)
|
|
79
|
+
: relabel.payload,
|
|
80
|
+
};
|
|
81
|
+
await client.dataset(dataset).table(RELABELS_TABLE).insert(relabelToInsert);
|
|
82
|
+
logger_1.logger.debug({ relabelId: relabel.id }, 'Inserted relabel into BigQuery');
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
logger_1.logger.error({ error, relabelId: relabel.id }, 'Failed to insert relabel into BigQuery');
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function getRecentTraces(limit = 10, dataset = DATASET) {
|
|
91
|
+
const query = `
|
|
92
|
+
SELECT * FROM ${dataset}.${TRACES_TABLE}
|
|
93
|
+
ORDER BY created_at DESC
|
|
94
|
+
LIMIT ${limit}
|
|
95
|
+
`;
|
|
96
|
+
const [rows] = await client.query(query);
|
|
97
|
+
// Parse the payload as JSON if it's a string
|
|
98
|
+
return rows.map((row) => ({
|
|
99
|
+
...row,
|
|
100
|
+
payload: typeof row.payload === 'string' ? JSON.parse(row.payload) : row.payload,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
async function getRecentRelabels(limit = 10, dataset = DATASET) {
|
|
104
|
+
const query = `
|
|
105
|
+
SELECT * FROM ${dataset}.${RELABELS_TABLE}
|
|
106
|
+
ORDER BY created_at DESC
|
|
107
|
+
LIMIT ${limit}
|
|
108
|
+
`;
|
|
109
|
+
const [rows] = await client.query(query);
|
|
110
|
+
// Parse the payload as JSON if it's a string
|
|
111
|
+
return rows.map((row) => ({
|
|
112
|
+
...row,
|
|
113
|
+
payload: typeof row.payload === 'string' ? JSON.parse(row.payload) : row.payload,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
async function getTracesWithoutRelabels(model, limit = 100, userId = undefined, dataset = DATASET) {
|
|
117
|
+
// TODO: Optimize query, maybe only get traces in last 30 days etc
|
|
118
|
+
const query = `
|
|
119
|
+
SELECT t.*
|
|
120
|
+
FROM \`${dataset}.${TRACES_TABLE}\` t
|
|
121
|
+
LEFT JOIN (
|
|
122
|
+
SELECT r.agent_step_id, r.user_id, JSON_EXTRACT_SCALAR(r.payload, '$.user_input_id') as user_input_id
|
|
123
|
+
FROM \`${dataset}.${RELABELS_TABLE}\` r
|
|
124
|
+
WHERE r.model = '${model}'
|
|
125
|
+
${userId ? `AND r.user_id = '${userId}'` : ''}
|
|
126
|
+
) r
|
|
127
|
+
ON t.agent_step_id = r.agent_step_id
|
|
128
|
+
AND t.user_id = r.user_id
|
|
129
|
+
AND JSON_EXTRACT_SCALAR(t.payload, '$.user_input_id') = r.user_input_id
|
|
130
|
+
WHERE t.type = 'get-relevant-files'
|
|
131
|
+
AND r.agent_step_id IS NULL
|
|
132
|
+
${userId ? `AND t.user_id = '${userId}'` : ''}
|
|
133
|
+
ORDER BY t.created_at DESC
|
|
134
|
+
LIMIT ${limit}
|
|
135
|
+
`;
|
|
136
|
+
const [rows] = await client.query(query);
|
|
137
|
+
// Parse the payload as JSON if it's a string
|
|
138
|
+
return rows.map((row) => ({
|
|
139
|
+
...row,
|
|
140
|
+
payload: typeof row.payload === 'string' ? JSON.parse(row.payload) : row.payload,
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
async function getTracesWithRelabels(model, limit = 100, dataset = DATASET) {
|
|
144
|
+
// Get traces that DO have matching relabels for the specified model
|
|
145
|
+
const query = `
|
|
146
|
+
SELECT
|
|
147
|
+
t as trace,
|
|
148
|
+
r as relabel
|
|
149
|
+
FROM \`${dataset}.${TRACES_TABLE}\` t
|
|
150
|
+
INNER JOIN (
|
|
151
|
+
SELECT *
|
|
152
|
+
FROM \`${dataset}.${RELABELS_TABLE}\` r
|
|
153
|
+
WHERE r.model = '${model}'
|
|
154
|
+
) r
|
|
155
|
+
ON t.agent_step_id = r.agent_step_id
|
|
156
|
+
AND t.user_id = r.user_id
|
|
157
|
+
AND JSON_EXTRACT_SCALAR(t.payload, '$.user_input_id') = JSON_EXTRACT_SCALAR(r.payload, '$.user_input_id')
|
|
158
|
+
WHERE t.type = 'get-relevant-files'
|
|
159
|
+
AND JSON_EXTRACT_SCALAR(t.payload, '$.output') IS NOT NULL
|
|
160
|
+
AND JSON_EXTRACT_SCALAR(r.payload, '$.output') IS NOT NULL
|
|
161
|
+
ORDER BY t.created_at DESC
|
|
162
|
+
LIMIT ${limit}
|
|
163
|
+
`;
|
|
164
|
+
const [rows] = await client.query(query);
|
|
165
|
+
// Filter out any results where either trace or relabel data is missing
|
|
166
|
+
const res = rows
|
|
167
|
+
.filter((row) => row.trace && row.relabel)
|
|
168
|
+
.map((row) => ({
|
|
169
|
+
trace: row.trace,
|
|
170
|
+
relabel: row.relabel,
|
|
171
|
+
}));
|
|
172
|
+
// Parse the payload as JSON if it's a string
|
|
173
|
+
return res.map((row) => ({
|
|
174
|
+
...row,
|
|
175
|
+
trace: {
|
|
176
|
+
...row.trace,
|
|
177
|
+
payload: typeof row.trace.payload === 'string'
|
|
178
|
+
? JSON.parse(row.trace.payload)
|
|
179
|
+
: row.trace.payload,
|
|
180
|
+
},
|
|
181
|
+
relabel: {
|
|
182
|
+
...row.relabel,
|
|
183
|
+
payload: typeof row.relabel.payload === 'string'
|
|
184
|
+
? JSON.parse(row.relabel.payload)
|
|
185
|
+
: row.relabel.payload,
|
|
186
|
+
},
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
async function getTracesAndRelabelsForUser(userId, limit = 50, dataset = DATASET) {
|
|
190
|
+
// Get recent traces for the user and any associated relabels
|
|
191
|
+
const query = `
|
|
192
|
+
WITH traces AS (
|
|
193
|
+
SELECT
|
|
194
|
+
id,
|
|
195
|
+
agent_step_id,
|
|
196
|
+
user_id,
|
|
197
|
+
created_at,
|
|
198
|
+
type,
|
|
199
|
+
payload
|
|
200
|
+
FROM \`${dataset}.${TRACES_TABLE}\`
|
|
201
|
+
WHERE user_id = '${userId}' AND type = 'get-relevant-files'
|
|
202
|
+
ORDER BY created_at DESC
|
|
203
|
+
LIMIT ${limit}
|
|
204
|
+
)
|
|
205
|
+
SELECT
|
|
206
|
+
t.id,
|
|
207
|
+
ANY_VALUE(t.agent_step_id) as agent_step_id,
|
|
208
|
+
ANY_VALUE(t.user_id) as user_id,
|
|
209
|
+
ANY_VALUE(t.created_at) as created_at,
|
|
210
|
+
ANY_VALUE(t.type) as type,
|
|
211
|
+
ANY_VALUE(t.payload) as payload,
|
|
212
|
+
ARRAY_AGG(r IGNORE NULLS) as relabels
|
|
213
|
+
FROM traces t
|
|
214
|
+
LEFT JOIN \`${dataset}.${RELABELS_TABLE}\` r
|
|
215
|
+
ON t.agent_step_id = r.agent_step_id
|
|
216
|
+
AND t.user_id = r.user_id
|
|
217
|
+
AND JSON_EXTRACT_SCALAR(t.payload, '$.user_input_id') = JSON_EXTRACT_SCALAR(r.payload, '$.user_input_id')
|
|
218
|
+
GROUP BY t.id
|
|
219
|
+
ORDER BY ANY_VALUE(t.created_at) DESC
|
|
220
|
+
`;
|
|
221
|
+
const [rows] = await client.query(query);
|
|
222
|
+
// Process and parse the results
|
|
223
|
+
return rows.map((row) => {
|
|
224
|
+
// Create trace object from individual fields
|
|
225
|
+
const trace = {
|
|
226
|
+
id: row.id,
|
|
227
|
+
agent_step_id: row.agent_step_id,
|
|
228
|
+
user_id: row.user_id,
|
|
229
|
+
created_at: row.created_at,
|
|
230
|
+
type: row.type,
|
|
231
|
+
payload: typeof row.payload === 'string' ? JSON.parse(row.payload) : row.payload,
|
|
232
|
+
};
|
|
233
|
+
// Parse relabel payloads (if any exist)
|
|
234
|
+
const relabels = row.relabels && row.relabels.length > 0
|
|
235
|
+
? row.relabels.map((relabel) => ({
|
|
236
|
+
...relabel,
|
|
237
|
+
payload: typeof relabel.payload === 'string'
|
|
238
|
+
? JSON.parse(relabel.payload)
|
|
239
|
+
: relabel.payload,
|
|
240
|
+
}))
|
|
241
|
+
: [];
|
|
242
|
+
return { trace, relabels };
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bigquery/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { TableSchema } from '@google-cloud/bigquery';
|
|
2
|
+
interface BaseEvent {
|
|
3
|
+
id: string;
|
|
4
|
+
agent_step_id: string;
|
|
5
|
+
user_id: string;
|
|
6
|
+
}
|
|
7
|
+
interface BasePayload {
|
|
8
|
+
user_input_id: string;
|
|
9
|
+
client_session_id: string;
|
|
10
|
+
fingerprint_id: string;
|
|
11
|
+
}
|
|
12
|
+
export type TraceType = 'get-relevant-files' | 'file-trees' | 'agent-response';
|
|
13
|
+
export interface BaseTrace extends BaseEvent {
|
|
14
|
+
created_at: Date;
|
|
15
|
+
type: TraceType;
|
|
16
|
+
payload: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface GetRelevantFilesPayload extends BasePayload {
|
|
19
|
+
messages: unknown;
|
|
20
|
+
system: unknown;
|
|
21
|
+
output: string;
|
|
22
|
+
request_type: string;
|
|
23
|
+
cost_mode: string;
|
|
24
|
+
}
|
|
25
|
+
export interface GetRelevantFilesTrace extends BaseTrace {
|
|
26
|
+
type: 'get-relevant-files';
|
|
27
|
+
payload: GetRelevantFilesPayload;
|
|
28
|
+
}
|
|
29
|
+
interface FileTreePayload extends BasePayload {
|
|
30
|
+
filetrees: Record<number, string>;
|
|
31
|
+
}
|
|
32
|
+
export interface FileTreeTrace extends BaseTrace {
|
|
33
|
+
type: 'file-trees';
|
|
34
|
+
payload: FileTreePayload;
|
|
35
|
+
}
|
|
36
|
+
interface AgentResponsePayload extends BasePayload {
|
|
37
|
+
output: string;
|
|
38
|
+
}
|
|
39
|
+
export interface AgentResponseTrace extends BaseTrace {
|
|
40
|
+
type: 'agent-response';
|
|
41
|
+
payload: AgentResponsePayload;
|
|
42
|
+
}
|
|
43
|
+
export type Trace = GetRelevantFilesTrace | FileTreeTrace | AgentResponseTrace;
|
|
44
|
+
export declare const TRACES_SCHEMA: TableSchema;
|
|
45
|
+
interface RelabelPayload extends BasePayload {
|
|
46
|
+
output: string;
|
|
47
|
+
}
|
|
48
|
+
export interface Relabel extends BaseEvent {
|
|
49
|
+
created_at: Date;
|
|
50
|
+
model: string;
|
|
51
|
+
payload: RelabelPayload;
|
|
52
|
+
}
|
|
53
|
+
export declare const RELABELS_SCHEMA: TableSchema;
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RELABELS_SCHEMA = exports.TRACES_SCHEMA = void 0;
|
|
4
|
+
exports.TRACES_SCHEMA = {
|
|
5
|
+
fields: [
|
|
6
|
+
{ name: 'id', type: 'STRING', mode: 'REQUIRED' }, // UUID
|
|
7
|
+
{ name: 'agent_step_id', type: 'STRING', mode: 'REQUIRED' }, // Used to link traces together within a single agent step
|
|
8
|
+
{ name: 'user_id', type: 'STRING', mode: 'REQUIRED' }, // user ID
|
|
9
|
+
{ name: 'created_at', type: 'TIMESTAMP', mode: 'REQUIRED' },
|
|
10
|
+
{ name: 'type', type: 'STRING', mode: 'REQUIRED' },
|
|
11
|
+
{ name: 'payload', type: 'JSON', mode: 'REQUIRED' },
|
|
12
|
+
],
|
|
13
|
+
};
|
|
14
|
+
exports.RELABELS_SCHEMA = {
|
|
15
|
+
fields: [
|
|
16
|
+
{ name: 'id', type: 'STRING', mode: 'REQUIRED' }, // UUID
|
|
17
|
+
{ name: 'agent_step_id', type: 'STRING', mode: 'REQUIRED' }, // Used to link traces together within a single agent step
|
|
18
|
+
{ name: 'user_id', type: 'STRING', mode: 'REQUIRED' }, // user ID
|
|
19
|
+
{ name: 'created_at', type: 'TIMESTAMP', mode: 'REQUIRED' },
|
|
20
|
+
{ name: 'model', type: 'STRING', mode: 'REQUIRED' },
|
|
21
|
+
{ name: 'payload', type: 'JSON', mode: 'REQUIRED' },
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/bigquery/schema.ts"],"names":[],"mappings":";;;AA2Da,QAAA,aAAa,GAAgB;IACxC,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO;QACzD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,0DAA0D;QACvH,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,UAAU;QACjE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE;QAC3D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;QAClD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;KACpD;CACF,CAAA;AAYY,QAAA,eAAe,GAAgB;IAC1C,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO;QACzD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,0DAA0D;QACvH,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,UAAU;QACjE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE;QAC3D,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;QACnD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;KACpD;CACF,CAAA"}
|
|
@@ -41,6 +41,9 @@ export declare function calculateUsageAndBalance(userId: string, quotaResetDate:
|
|
|
41
41
|
* Follows priority order strictly - higher priority grants (lower number) are consumed first.
|
|
42
42
|
* Returns details about credit consumption including how many came from purchased credits.
|
|
43
43
|
*
|
|
44
|
+
* Uses SERIALIZABLE isolation to prevent concurrent modifications that could lead to
|
|
45
|
+
* incorrect credit usage (e.g., "double spending" credits).
|
|
46
|
+
*
|
|
44
47
|
* @param userId The ID of the user
|
|
45
48
|
* @param creditsToConsume Number of credits being consumed
|
|
46
49
|
* @returns Promise resolving to number of credits consumed
|
|
@@ -34,6 +34,7 @@ const db_1 = __importDefault(require("../db"));
|
|
|
34
34
|
const schema = __importStar(require("../db/schema"));
|
|
35
35
|
const drizzle_orm_1 = require("drizzle-orm");
|
|
36
36
|
const logger_1 = require("../util/logger");
|
|
37
|
+
const transaction_1 = require("../db/transaction");
|
|
37
38
|
/**
|
|
38
39
|
* Gets active grants for a user, ordered by expiration (soonest first), then priority, and creation date.
|
|
39
40
|
* Added optional `conn` param so callers inside a transaction can supply their TX object.
|
|
@@ -180,12 +181,15 @@ async function calculateUsageAndBalance(userId, quotaResetDate, now = new Date()
|
|
|
180
181
|
* Follows priority order strictly - higher priority grants (lower number) are consumed first.
|
|
181
182
|
* Returns details about credit consumption including how many came from purchased credits.
|
|
182
183
|
*
|
|
184
|
+
* Uses SERIALIZABLE isolation to prevent concurrent modifications that could lead to
|
|
185
|
+
* incorrect credit usage (e.g., "double spending" credits).
|
|
186
|
+
*
|
|
183
187
|
* @param userId The ID of the user
|
|
184
188
|
* @param creditsToConsume Number of credits being consumed
|
|
185
189
|
* @returns Promise resolving to number of credits consumed
|
|
186
190
|
*/
|
|
187
191
|
async function consumeCredits(userId, creditsToConsume) {
|
|
188
|
-
return await
|
|
192
|
+
return await (0, transaction_1.withSerializableTransaction)(async (tx) => {
|
|
189
193
|
const now = new Date();
|
|
190
194
|
const activeGrants = await getOrderedActiveGrants(userId, now, tx);
|
|
191
195
|
if (activeGrants.length === 0) {
|
|
@@ -194,7 +198,7 @@ async function consumeCredits(userId, creditsToConsume) {
|
|
|
194
198
|
}
|
|
195
199
|
const result = await consumeFromOrderedGrants(userId, creditsToConsume, activeGrants, tx);
|
|
196
200
|
return result;
|
|
197
|
-
});
|
|
201
|
+
}, { userId, creditsToConsume });
|
|
198
202
|
}
|
|
199
203
|
/**
|
|
200
204
|
* Calculate the total credits used during the current billing cycle for a user
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balance-calculator.js","sourceRoot":"","sources":["../../src/billing/balance-calculator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"balance-calculator.js","sourceRoot":"","sources":["../../src/billing/balance-calculator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,wDAuBC;AAwHD,4DAyEC;AAcD,wCA4BC;AAMD,0DA0BC;AAtUD,+CAAsB;AACtB,qDAAsC;AACtC,6CAA+D;AAE/D,2CAAuC;AAEvC,mDAA+D;AA0B/D;;;GAGG;AACI,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,GAAS,EACT,OAAe,YAAE,CAAC,kCAAkC;;IAEpD,OAAO,IAAI;SACR,MAAM,EAAE;SACR,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;SACzB,KAAK,CACJ,IAAA,iBAAG,EACD,IAAA,gBAAE,EAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EACvC,IAAA,gBAAE,EACA,IAAA,oBAAM,EAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EACtC,IAAA,gBAAE,EAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CACxC,CACF,CACF;SACA,OAAO;IACN,yEAAyE;IACzE,IAAA,iBAAG,EAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EACjC,IAAA,iBAAG,EAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EACnC,IAAA,iBAAG,EAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CACpC,CAAA;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,KAA8C,EAC9C,QAAgB,EAChB,UAAkB,EAClB,EAAU;IAEV,MAAM,EAAE;SACL,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;SAC3B,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;SAC5B,KAAK,CAAC,IAAA,gBAAE,EAAC,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;IAElE,eAAM,CAAC,KAAK,CACV;QACE,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,YAAY;QAC3B,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,QAAQ;QACR,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,KAAK,CAAC,UAAU;KAC5B,EACD,kDAAkD,CACnD,CAAA;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,MAAc,EACd,gBAAwB,EACxB,MAAmD,EACnD,EAAU;IAEV,IAAI,kBAAkB,GAAG,gBAAgB,CAAA;IACzC,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,oCAAoC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;YAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,WAAW,CAAA;YAC9C,kBAAkB,IAAI,WAAW,CAAA;YACjC,QAAQ,IAAI,WAAW,CAAA;YAEvB,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;YAErE,eAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,EAChE,sBAAsB,CACvB,CAAA;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,kBAAkB,IAAI,CAAC;YAAE,MAAK;QAClC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC;YAAE,SAAQ;QAEhC,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACxE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,oBAAoB,CAAA;QACvD,kBAAkB,IAAI,oBAAoB,CAAA;QAC1C,QAAQ,IAAI,oBAAoB,CAAA;QAEhC,2CAA2C;QAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,aAAa,IAAI,oBAAoB,CAAA;QACvC,CAAC;QAED,MAAM,kBAAkB,CACtB,MAAM,EACN,KAAK,EACL,oBAAoB,EACpB,UAAU,EACV,EAAE,CACH,CAAA;IACH,CAAC;IAED,0FAA0F;IAC1F,IAAI,kBAAkB,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAE3C,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,GAAG,kBAAkB,CAAA;YACzD,MAAM,kBAAkB,CACtB,MAAM,EACN,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,EAAE,CACH,CAAA;YACD,QAAQ,IAAI,kBAAkB,CAAA;YAE9B,eAAM,CAAC,IAAI,CACT;gBACE,MAAM;gBACN,OAAO,EAAE,SAAS,CAAC,YAAY;gBAC/B,SAAS,EAAE,kBAAkB;gBAC7B,QAAQ,EAAE,kBAAkB;gBAC5B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;aAC9B,EACD,2BAA2B,CAC5B,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;AACpC,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,cAAoB,EACpB,MAAY,IAAI,IAAI,EAAE;IAEtB,uCAAuC;IACvC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAExD,+BAA+B;IAC/B,MAAM,OAAO,GAAkB;QAC7B,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;KACf,CAAA;IAED,qCAAqC;IACrC,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,IAAI,oBAAoB,GAAG,CAAC,CAAA;IAC5B,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,iDAAiD;IACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAiB,CAAA;QAEzC,oDAAoD;QACpD,IACE,KAAK,CAAC,UAAU,GAAG,cAAc;YACjC,CAAC,KAAK,CAAC,UAAU;YACjB,KAAK,CAAC,UAAU,GAAG,cAAc,EACjC,CAAC;YACD,cAAc,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAA;QACnD,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACtB,oBAAoB,IAAI,KAAK,CAAC,OAAO,CAAA;gBACrC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;oBAC1B,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAA;gBACrD,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;oBAC3B,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAA;YAC1D,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBAC7B,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,IAAI,SAAS,GAAG,CAAC,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;QAClE,eAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,EAC7D,iCAAiC,CAClC,CAAA;QAED,oBAAoB;QACpB,oBAAoB,IAAI,gBAAgB,CAAA;QACxC,SAAS,IAAI,gBAAgB,CAAA;IAC/B,CAAC;IAED,4CAA4C;IAC5C,OAAO,CAAC,cAAc,GAAG,oBAAoB,CAAA;IAC7C,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;IAC7B,OAAO,CAAC,UAAU,GAAG,oBAAoB,GAAG,SAAS,CAAA;IAErD,eAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,EAC/D,sCAAsC,CACvC,CAAA;IAED,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,CAAA;AACpC,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,gBAAwB;IAExB,OAAO,MAAM,IAAA,yCAA2B,EACtC,KAAK,EAAE,EAAE,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAElE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,eAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAC5B,gDAAgD,CACjD,CAAA;YACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAC3C,MAAM,EACN,gBAAgB,EAChB,YAAY,EACZ,EAAE,CACH,CAAA;QAED,OAAO,MAAM,CAAA;IACf,CAAC,EACD,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAC7B,CAAA;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,cAAoB;IAEpB,MAAM,WAAW,GAAG,MAAM,YAAE;SACzB,MAAM,CAAC;QACN,SAAS,EAAE,IAAA,iBAAG,EAAQ,gBAAgB,MAAM,CAAC,YAAY,CAAC,SAAS,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,OAAO;KAC5G,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;SACzB,KAAK,CACJ,IAAA,iBAAG,EACD,IAAA,gBAAE,EAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;IACvC,mGAAmG;IACnG,IAAA,gBAAE,EACA,IAAA,gBAAE,EAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,cAAc,CAAC,EAClD,IAAA,iBAAG,EACD,IAAA,gBAAE,EACA,IAAA,oBAAM,EAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EACtC,IAAA,gBAAE,EAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,cAAc,CAAC,CACnD,CACF,CACF,CACF,CACF,CAAA;IAEH,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACjC,CAAC"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { GrantType } from '../db/schema';
|
|
2
2
|
/**
|
|
3
3
|
* Finds the amount of the most recent expired 'free' grant for a user.
|
|
4
|
+
* Finds the amount of the most recent expired 'free' grant for a user,
|
|
5
|
+
* excluding migration grants (operation_id starting with 'migration-').
|
|
6
|
+
* If there is a previous grant, caps the amount at 2000 credits.
|
|
4
7
|
* If no expired 'free' grant is found, returns the default free limit.
|
|
5
8
|
* @param userId The ID of the user.
|
|
6
|
-
* @returns The amount of the last expired free grant or the default.
|
|
9
|
+
* @returns The amount of the last expired free grant (capped at 2000) or the default.
|
|
7
10
|
*/
|
|
8
11
|
export declare function getPreviousFreeGrantAmount(userId: string): Promise<number>;
|
|
9
12
|
/**
|
|
@@ -26,3 +29,15 @@ export declare function processAndGrantCredit(userId: string, amount: number, ty
|
|
|
26
29
|
* @returns true if the grant was found and revoked, false otherwise
|
|
27
30
|
*/
|
|
28
31
|
export declare function revokeGrantByOperationId(operationId: string, reason: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Checks if a user's quota needs to be reset, and if so:
|
|
34
|
+
* 1. Calculates their new monthly grant amount
|
|
35
|
+
* 2. Issues the grant with the appropriate expiry
|
|
36
|
+
* 3. Updates their next_quota_reset date
|
|
37
|
+
* All of this is done in a single transaction with SERIALIZABLE isolation
|
|
38
|
+
* to prevent concurrent resets from creating duplicate grants.
|
|
39
|
+
*
|
|
40
|
+
* @param userId The ID of the user
|
|
41
|
+
* @returns The effective quota reset date (either existing or new)
|
|
42
|
+
*/
|
|
43
|
+
export declare function triggerMonthlyResetAndGrant(userId: string): Promise<Date>;
|
|
@@ -30,19 +30,27 @@ exports.getPreviousFreeGrantAmount = getPreviousFreeGrantAmount;
|
|
|
30
30
|
exports.calculateTotalReferralBonus = calculateTotalReferralBonus;
|
|
31
31
|
exports.processAndGrantCredit = processAndGrantCredit;
|
|
32
32
|
exports.revokeGrantByOperationId = revokeGrantByOperationId;
|
|
33
|
+
exports.triggerMonthlyResetAndGrant = triggerMonthlyResetAndGrant;
|
|
33
34
|
const db_1 = __importDefault(require("../db"));
|
|
34
35
|
const schema = __importStar(require("../db/schema"));
|
|
35
36
|
const logger_1 = require("../util/logger");
|
|
36
37
|
const grant_priorities_1 = require("../constants/grant-priorities");
|
|
37
38
|
const drizzle_orm_1 = require("drizzle-orm");
|
|
39
|
+
const string_1 = require("../util/string");
|
|
38
40
|
const constants_1 = require("../constants");
|
|
39
41
|
const promise_1 = require("../util/promise");
|
|
40
42
|
const sync_failure_1 = require("../util/sync-failure");
|
|
43
|
+
const dates_1 = require("../util/dates");
|
|
44
|
+
const plans_1 = require("./plans");
|
|
45
|
+
const transaction_1 = require("../db/transaction");
|
|
41
46
|
/**
|
|
42
47
|
* Finds the amount of the most recent expired 'free' grant for a user.
|
|
48
|
+
* Finds the amount of the most recent expired 'free' grant for a user,
|
|
49
|
+
* excluding migration grants (operation_id starting with 'migration-').
|
|
50
|
+
* If there is a previous grant, caps the amount at 2000 credits.
|
|
43
51
|
* If no expired 'free' grant is found, returns the default free limit.
|
|
44
52
|
* @param userId The ID of the user.
|
|
45
|
-
* @returns The amount of the last expired free grant or the default.
|
|
53
|
+
* @returns The amount of the last expired free grant (capped at 2000) or the default.
|
|
46
54
|
*/
|
|
47
55
|
async function getPreviousFreeGrantAmount(userId) {
|
|
48
56
|
const now = new Date();
|
|
@@ -56,8 +64,10 @@ async function getPreviousFreeGrantAmount(userId) {
|
|
|
56
64
|
.orderBy((0, drizzle_orm_1.desc)(schema.creditLedger.expires_at)) // Most recent expiry first
|
|
57
65
|
.limit(1);
|
|
58
66
|
if (lastExpiredFreeGrant.length > 0) {
|
|
67
|
+
// TODO: remove this once it's past May 22nd, after all users have been migrated over
|
|
68
|
+
const cappedAmount = Math.min(lastExpiredFreeGrant[0].principal, 2000);
|
|
59
69
|
logger_1.logger.debug({ userId, amount: lastExpiredFreeGrant[0].principal }, 'Found previous expired free grant amount.');
|
|
60
|
-
return
|
|
70
|
+
return cappedAmount;
|
|
61
71
|
}
|
|
62
72
|
else {
|
|
63
73
|
logger_1.logger.debug({ userId, defaultAmount: constants_1.CREDITS_USAGE_LIMITS.FREE }, 'No previous expired free grant found. Using default.');
|
|
@@ -198,4 +208,59 @@ async function revokeGrantByOperationId(operationId, reason) {
|
|
|
198
208
|
return true;
|
|
199
209
|
});
|
|
200
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Checks if a user's quota needs to be reset, and if so:
|
|
213
|
+
* 1. Calculates their new monthly grant amount
|
|
214
|
+
* 2. Issues the grant with the appropriate expiry
|
|
215
|
+
* 3. Updates their next_quota_reset date
|
|
216
|
+
* All of this is done in a single transaction with SERIALIZABLE isolation
|
|
217
|
+
* to prevent concurrent resets from creating duplicate grants.
|
|
218
|
+
*
|
|
219
|
+
* @param userId The ID of the user
|
|
220
|
+
* @returns The effective quota reset date (either existing or new)
|
|
221
|
+
*/
|
|
222
|
+
async function triggerMonthlyResetAndGrant(userId) {
|
|
223
|
+
return await (0, transaction_1.withSerializableTransaction)(async (tx) => {
|
|
224
|
+
const now = new Date();
|
|
225
|
+
// Get user's current reset date and plan
|
|
226
|
+
const user = await tx.query.user.findFirst({
|
|
227
|
+
where: (0, drizzle_orm_1.eq)(schema.user.id, userId),
|
|
228
|
+
columns: {
|
|
229
|
+
next_quota_reset: true,
|
|
230
|
+
stripe_price_id: true,
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
if (!user) {
|
|
234
|
+
throw new Error(`User ${userId} not found`);
|
|
235
|
+
}
|
|
236
|
+
const currentResetDate = user.next_quota_reset;
|
|
237
|
+
// If reset date is in the future, no action needed
|
|
238
|
+
if (currentResetDate && currentResetDate > now) {
|
|
239
|
+
return currentResetDate;
|
|
240
|
+
}
|
|
241
|
+
// Calculate new reset date
|
|
242
|
+
const newResetDate = (0, dates_1.getNextQuotaReset)(currentResetDate);
|
|
243
|
+
// Calculate grant amount based on user's plan
|
|
244
|
+
const currentPlan = (0, plans_1.getPlanFromPriceId)(user.stripe_price_id, process.env.STRIPE_PRO_PRICE_ID, process.env.STRIPE_MOAR_PRO_PRICE_ID);
|
|
245
|
+
const grantAmount = await (0, plans_1.getMonthlyGrantForPlan)(currentPlan, userId);
|
|
246
|
+
// Generate a unique operation ID for this grant
|
|
247
|
+
const operationId = `free-${userId}-${(0, string_1.generateCompactId)()}`;
|
|
248
|
+
// Update the user's next reset date first
|
|
249
|
+
await tx
|
|
250
|
+
.update(schema.user)
|
|
251
|
+
.set({ next_quota_reset: newResetDate })
|
|
252
|
+
.where((0, drizzle_orm_1.eq)(schema.user.id, userId));
|
|
253
|
+
// Then issue the grant
|
|
254
|
+
await grantCreditOperation(userId, grantAmount, 'free', 'Monthly free credits', newResetDate, // Grant expires at next reset
|
|
255
|
+
operationId);
|
|
256
|
+
logger_1.logger.info({
|
|
257
|
+
userId,
|
|
258
|
+
operationId,
|
|
259
|
+
grantAmount,
|
|
260
|
+
newResetDate,
|
|
261
|
+
previousResetDate: currentResetDate,
|
|
262
|
+
}, 'Processed monthly credit grant and reset');
|
|
263
|
+
return newResetDate;
|
|
264
|
+
}, { userId });
|
|
265
|
+
}
|
|
201
266
|
//# sourceMappingURL=grant-credits.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grant-credits.js","sourceRoot":"","sources":["../../src/billing/grant-credits.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"grant-credits.js","sourceRoot":"","sources":["../../src/billing/grant-credits.ts"],"names":[],"mappings":"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"}
|