@frugalco/frugal-sdk-node 0.1.0
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/LICENSE +201 -0
- package/README.md +227 -0
- package/dist/block-hash-lru.d.ts +18 -0
- package/dist/block-hash-lru.d.ts.map +1 -0
- package/dist/block-hash-lru.js +48 -0
- package/dist/block-hash-lru.js.map +1 -0
- package/dist/caller.d.ts +23 -0
- package/dist/caller.d.ts.map +1 -0
- package/dist/caller.js +204 -0
- package/dist/caller.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +165 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/instrument.d.ts +49 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +194 -0
- package/dist/instrument.js.map +1 -0
- package/dist/otel.d.ts +27 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +211 -0
- package/dist/otel.js.map +1 -0
- package/dist/prompt-analyzer.d.ts +26 -0
- package/dist/prompt-analyzer.d.ts.map +1 -0
- package/dist/prompt-analyzer.js +210 -0
- package/dist/prompt-analyzer.js.map +1 -0
- package/dist/semconv.d.ts +52 -0
- package/dist/semconv.d.ts.map +1 -0
- package/dist/semconv.js +53 -0
- package/dist/semconv.js.map +1 -0
- package/dist/streams.d.ts +21 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +85 -0
- package/dist/streams.js.map +1 -0
- package/dist/track.d.ts +44 -0
- package/dist/track.d.ts.map +1 -0
- package/dist/track.js +170 -0
- package/dist/track.js.map +1 -0
- package/dist/wrappers/anthropic.d.ts +2 -0
- package/dist/wrappers/anthropic.d.ts.map +1 -0
- package/dist/wrappers/anthropic.js +229 -0
- package/dist/wrappers/anthropic.js.map +1 -0
- package/dist/wrappers/bedrock-models.d.ts +26 -0
- package/dist/wrappers/bedrock-models.d.ts.map +1 -0
- package/dist/wrappers/bedrock-models.js +320 -0
- package/dist/wrappers/bedrock-models.js.map +1 -0
- package/dist/wrappers/bedrock.d.ts +2 -0
- package/dist/wrappers/bedrock.d.ts.map +1 -0
- package/dist/wrappers/bedrock.js +284 -0
- package/dist/wrappers/bedrock.js.map +1 -0
- package/dist/wrappers/openai.d.ts +2 -0
- package/dist/wrappers/openai.d.ts.map +1 -0
- package/dist/wrappers/openai.js +347 -0
- package/dist/wrappers/openai.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
// OpenAI client wrapper.
|
|
2
|
+
//
|
|
3
|
+
// Patches chat.completions.create, completions.create, embeddings.create, and
|
|
4
|
+
// responses.create on an OpenAI / AzureOpenAI client instance (Node SDK). All
|
|
5
|
+
// OpenAI Node methods are async, so we only need one wrapper shape.
|
|
6
|
+
import { packageDirFor } from "../caller.js";
|
|
7
|
+
import { loadConfig } from "../config.js";
|
|
8
|
+
import { getInstruments } from "../otel.js";
|
|
9
|
+
import { startCall, } from "../instrument.js";
|
|
10
|
+
import { FRUGAL_CUSTOMER_ID, FRUGAL_PROJECT_ID, OP_CHAT, OP_EMBEDDINGS, OP_TEXT_COMPLETION, SYSTEM_OPENAI, } from "../semconv.js";
|
|
11
|
+
import { wrapStreamObject } from "../streams.js";
|
|
12
|
+
const FRUGAL_MARK = "__frugalWrapped";
|
|
13
|
+
export function wrapOpenAI(client) {
|
|
14
|
+
const config = loadConfig();
|
|
15
|
+
if (config === null)
|
|
16
|
+
return client;
|
|
17
|
+
const c = client;
|
|
18
|
+
if (c[FRUGAL_MARK])
|
|
19
|
+
return client;
|
|
20
|
+
const system = detectSystem(client);
|
|
21
|
+
const skipDirs = buildSkipDirs();
|
|
22
|
+
patch(c, ["chat", "completions"], "create", {
|
|
23
|
+
operation: OP_CHAT,
|
|
24
|
+
system,
|
|
25
|
+
skipDirs,
|
|
26
|
+
config,
|
|
27
|
+
usageExtractor: chatUsage,
|
|
28
|
+
streamHandler: chatStreamEvent,
|
|
29
|
+
capturePayload: true,
|
|
30
|
+
});
|
|
31
|
+
patch(c, ["completions"], "create", {
|
|
32
|
+
operation: OP_TEXT_COMPLETION,
|
|
33
|
+
system,
|
|
34
|
+
skipDirs,
|
|
35
|
+
config,
|
|
36
|
+
usageExtractor: completionUsage,
|
|
37
|
+
streamHandler: chatStreamEvent,
|
|
38
|
+
capturePayload: true,
|
|
39
|
+
});
|
|
40
|
+
patch(c, ["embeddings"], "create", {
|
|
41
|
+
operation: OP_EMBEDDINGS,
|
|
42
|
+
system,
|
|
43
|
+
skipDirs,
|
|
44
|
+
config,
|
|
45
|
+
usageExtractor: embeddingUsage,
|
|
46
|
+
streamHandler: null,
|
|
47
|
+
});
|
|
48
|
+
patch(c, ["responses"], "create", {
|
|
49
|
+
operation: OP_CHAT,
|
|
50
|
+
system,
|
|
51
|
+
skipDirs,
|
|
52
|
+
config,
|
|
53
|
+
usageExtractor: responsesUsage,
|
|
54
|
+
streamHandler: responsesStreamEvent,
|
|
55
|
+
required: false,
|
|
56
|
+
capturePayload: true,
|
|
57
|
+
});
|
|
58
|
+
try {
|
|
59
|
+
Object.defineProperty(c, FRUGAL_MARK, {
|
|
60
|
+
value: true,
|
|
61
|
+
writable: false,
|
|
62
|
+
enumerable: false,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// ignore
|
|
67
|
+
}
|
|
68
|
+
return client;
|
|
69
|
+
}
|
|
70
|
+
function detectSystem(_client) {
|
|
71
|
+
// v1 supports OpenAI only. AzureOpenAI clients land here too but are tagged
|
|
72
|
+
// as plain `openai` until native Azure support ships.
|
|
73
|
+
return SYSTEM_OPENAI;
|
|
74
|
+
}
|
|
75
|
+
function buildSkipDirs() {
|
|
76
|
+
const ourDir = packageDirFor(import.meta.url);
|
|
77
|
+
const dirs = [ourDir];
|
|
78
|
+
// Best-effort locate the openai package dir. Resolution can fail if the
|
|
79
|
+
// package is absent — our wrapper still works because the wrapped client's
|
|
80
|
+
// methods are defined in that package, so filename matching via the client
|
|
81
|
+
// prototype's source location would be ideal... but we don't have that.
|
|
82
|
+
// The import.meta-based approach means our own package dir skip handles the
|
|
83
|
+
// wrapper frame, and the wrapped SDK's frames are bypassed because the SDK
|
|
84
|
+
// method is invoked *from* our wrapper, not the other way around: the stack
|
|
85
|
+
// frame above our wrapper is the customer. We don't need to skip SDK frames
|
|
86
|
+
// in practice.
|
|
87
|
+
return dirs;
|
|
88
|
+
}
|
|
89
|
+
function patch(client, chain, methodName, opts) {
|
|
90
|
+
let target = client;
|
|
91
|
+
for (const step of chain) {
|
|
92
|
+
if (!target || typeof target !== "object") {
|
|
93
|
+
target = undefined;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
target = target[step];
|
|
97
|
+
if (!target)
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
if (!target)
|
|
101
|
+
return;
|
|
102
|
+
const original = target[methodName];
|
|
103
|
+
if (typeof original !== "function")
|
|
104
|
+
return;
|
|
105
|
+
if (original[FRUGAL_MARK])
|
|
106
|
+
return;
|
|
107
|
+
const wrapped = makeWrapper(original.bind(target), opts);
|
|
108
|
+
wrapped[FRUGAL_MARK] = true;
|
|
109
|
+
try {
|
|
110
|
+
target[methodName] = wrapped;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// ignore — nothing we can do if the property is non-writable
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function makeWrapper(original, opts) {
|
|
117
|
+
return function wrapped(...args) {
|
|
118
|
+
// If ANY of our instrumentation logic fails, fall through to the
|
|
119
|
+
// original call unmodified — we must never break customer code.
|
|
120
|
+
let emit;
|
|
121
|
+
let streaming;
|
|
122
|
+
try {
|
|
123
|
+
const params = (args[0] ?? {});
|
|
124
|
+
streaming = Boolean(params.stream);
|
|
125
|
+
if (streaming && opts.streamHandler === null) {
|
|
126
|
+
return original(...args);
|
|
127
|
+
}
|
|
128
|
+
const ctx = {
|
|
129
|
+
system: opts.system,
|
|
130
|
+
operation: opts.operation,
|
|
131
|
+
requestModel: typeof params.model === "string" ? params.model : "<unknown>",
|
|
132
|
+
skipPackageDirs: opts.skipDirs,
|
|
133
|
+
batched: false,
|
|
134
|
+
requestPayload: opts.capturePayload ? captureOpenAIPayload(params) : undefined,
|
|
135
|
+
};
|
|
136
|
+
emit = startCall(opts.config, ctx);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
recordInternalError("setup_failed", err, opts.config);
|
|
140
|
+
return original(...args);
|
|
141
|
+
}
|
|
142
|
+
let result;
|
|
143
|
+
try {
|
|
144
|
+
result = original(...args);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
safe(() => emit.error(err));
|
|
148
|
+
throw err;
|
|
149
|
+
}
|
|
150
|
+
if (isPromiseLike(result)) {
|
|
151
|
+
return (async () => {
|
|
152
|
+
let awaited;
|
|
153
|
+
try {
|
|
154
|
+
awaited = await result;
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
safe(() => emit.error(err));
|
|
158
|
+
throw err;
|
|
159
|
+
}
|
|
160
|
+
if (streaming && opts.streamHandler !== null) {
|
|
161
|
+
try {
|
|
162
|
+
return wrapStreamObject(awaited, emit, opts.streamHandler);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
recordInternalError("stream_proxy_failed", err, opts.config);
|
|
166
|
+
return awaited;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
safe(() => emit.success(opts.usageExtractor(awaited)));
|
|
170
|
+
return awaited;
|
|
171
|
+
})();
|
|
172
|
+
}
|
|
173
|
+
if (streaming && opts.streamHandler !== null) {
|
|
174
|
+
try {
|
|
175
|
+
return wrapStreamObject(result, emit, opts.streamHandler);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
recordInternalError("stream_proxy_failed", err, opts.config);
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
safe(() => emit.success(opts.usageExtractor(result)));
|
|
183
|
+
return result;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function safe(fn) {
|
|
187
|
+
try {
|
|
188
|
+
fn();
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
recordInternalError("emission", err, null);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function recordInternalError(stage, err, config) {
|
|
195
|
+
try {
|
|
196
|
+
// Try to record the failure as an internal_errors metric so we can track it.
|
|
197
|
+
if (!config)
|
|
198
|
+
return;
|
|
199
|
+
const instruments = getInstruments(config);
|
|
200
|
+
instruments.internalErrors.add(1, {
|
|
201
|
+
...(config.customerId ? { [FRUGAL_CUSTOMER_ID]: config.customerId } : {}),
|
|
202
|
+
[FRUGAL_PROJECT_ID]: config.projectId,
|
|
203
|
+
"frugal.internal_error.stage": stage,
|
|
204
|
+
"frugal.internal_error.type": errorName(err),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// swallow — nothing left to try
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function errorName(err) {
|
|
212
|
+
if (err && typeof err === "object" && "name" in err && typeof err.name === "string") {
|
|
213
|
+
return err.name;
|
|
214
|
+
}
|
|
215
|
+
if (err instanceof Error)
|
|
216
|
+
return err.constructor.name;
|
|
217
|
+
return "UnknownError";
|
|
218
|
+
}
|
|
219
|
+
function isPromiseLike(value) {
|
|
220
|
+
return (value !== null &&
|
|
221
|
+
typeof value === "object" &&
|
|
222
|
+
typeof value.then === "function");
|
|
223
|
+
}
|
|
224
|
+
// --- request payload capture ----------------------------------------------
|
|
225
|
+
function captureOpenAIPayload(params) {
|
|
226
|
+
const maxTokensRaw = params.max_tokens ?? params.max_completion_tokens;
|
|
227
|
+
const maxTokens = typeof maxTokensRaw === "number" ? maxTokensRaw : null;
|
|
228
|
+
// The Responses API uses `input` instead of `messages`. Treat both as messages
|
|
229
|
+
// for analyzer purposes — they share the role/content shape.
|
|
230
|
+
const messages = (params.messages ?? params.input);
|
|
231
|
+
return {
|
|
232
|
+
messages,
|
|
233
|
+
tools: params.tools,
|
|
234
|
+
responseFormat: params.response_format,
|
|
235
|
+
maxTokens,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
// --- usage extractors ------------------------------------------------------
|
|
239
|
+
function attr(obj, key) {
|
|
240
|
+
if (obj === null || obj === undefined)
|
|
241
|
+
return undefined;
|
|
242
|
+
if (typeof obj !== "object")
|
|
243
|
+
return undefined;
|
|
244
|
+
return obj[key];
|
|
245
|
+
}
|
|
246
|
+
function asNumber(v) {
|
|
247
|
+
return typeof v === "number" ? v : null;
|
|
248
|
+
}
|
|
249
|
+
function asString(v) {
|
|
250
|
+
return typeof v === "string" ? v : null;
|
|
251
|
+
}
|
|
252
|
+
function chatUsage(response) {
|
|
253
|
+
const usage = attr(response, "usage");
|
|
254
|
+
const compDetails = attr(usage, "completion_tokens_details");
|
|
255
|
+
const promptDetails = attr(usage, "prompt_tokens_details");
|
|
256
|
+
return {
|
|
257
|
+
responseModel: asString(attr(response, "model")),
|
|
258
|
+
inputTokens: asNumber(attr(usage, "prompt_tokens")),
|
|
259
|
+
outputTokens: asNumber(attr(usage, "completion_tokens")),
|
|
260
|
+
reasoningTokens: asNumber(attr(compDetails, "reasoning_tokens")),
|
|
261
|
+
cacheReadTokens: asNumber(attr(promptDetails, "cached_tokens")),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function completionUsage(response) {
|
|
265
|
+
const usage = attr(response, "usage");
|
|
266
|
+
return {
|
|
267
|
+
responseModel: asString(attr(response, "model")),
|
|
268
|
+
inputTokens: asNumber(attr(usage, "prompt_tokens")),
|
|
269
|
+
outputTokens: asNumber(attr(usage, "completion_tokens")),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function embeddingUsage(response) {
|
|
273
|
+
const usage = attr(response, "usage");
|
|
274
|
+
return {
|
|
275
|
+
responseModel: asString(attr(response, "model")),
|
|
276
|
+
inputTokens: asNumber(attr(usage, "prompt_tokens")),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function responsesUsage(response) {
|
|
280
|
+
const usage = attr(response, "usage");
|
|
281
|
+
const outDetails = attr(usage, "output_tokens_details");
|
|
282
|
+
const inDetails = attr(usage, "input_tokens_details");
|
|
283
|
+
return {
|
|
284
|
+
responseModel: asString(attr(response, "model")),
|
|
285
|
+
inputTokens: asNumber(attr(usage, "input_tokens")),
|
|
286
|
+
outputTokens: asNumber(attr(usage, "output_tokens")),
|
|
287
|
+
reasoningTokens: asNumber(attr(outDetails, "reasoning_tokens")),
|
|
288
|
+
cacheReadTokens: asNumber(attr(inDetails, "cached_tokens")),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
// --- stream handlers -------------------------------------------------------
|
|
292
|
+
function chatStreamEvent(chunk, usage) {
|
|
293
|
+
const model = asString(attr(chunk, "model"));
|
|
294
|
+
if (model && !usage.responseModel)
|
|
295
|
+
usage.responseModel = model;
|
|
296
|
+
const chunkUsage = attr(chunk, "usage");
|
|
297
|
+
if (!chunkUsage)
|
|
298
|
+
return;
|
|
299
|
+
const input = asNumber(attr(chunkUsage, "prompt_tokens"));
|
|
300
|
+
const output = asNumber(attr(chunkUsage, "completion_tokens"));
|
|
301
|
+
if (input !== null)
|
|
302
|
+
usage.inputTokens = input;
|
|
303
|
+
if (output !== null)
|
|
304
|
+
usage.outputTokens = output;
|
|
305
|
+
const compDetails = attr(chunkUsage, "completion_tokens_details");
|
|
306
|
+
if (compDetails) {
|
|
307
|
+
const reasoning = asNumber(attr(compDetails, "reasoning_tokens"));
|
|
308
|
+
if (reasoning !== null)
|
|
309
|
+
usage.reasoningTokens = reasoning;
|
|
310
|
+
}
|
|
311
|
+
const promptDetails = attr(chunkUsage, "prompt_tokens_details");
|
|
312
|
+
if (promptDetails) {
|
|
313
|
+
const cached = asNumber(attr(promptDetails, "cached_tokens"));
|
|
314
|
+
if (cached !== null)
|
|
315
|
+
usage.cacheReadTokens = cached;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function responsesStreamEvent(event, usage) {
|
|
319
|
+
const response = attr(event, "response");
|
|
320
|
+
if (!response)
|
|
321
|
+
return;
|
|
322
|
+
const model = asString(attr(response, "model"));
|
|
323
|
+
if (model)
|
|
324
|
+
usage.responseModel = model;
|
|
325
|
+
const rUsage = attr(response, "usage");
|
|
326
|
+
if (!rUsage)
|
|
327
|
+
return;
|
|
328
|
+
const input = asNumber(attr(rUsage, "input_tokens"));
|
|
329
|
+
const output = asNumber(attr(rUsage, "output_tokens"));
|
|
330
|
+
if (input !== null)
|
|
331
|
+
usage.inputTokens = input;
|
|
332
|
+
if (output !== null)
|
|
333
|
+
usage.outputTokens = output;
|
|
334
|
+
const outDetails = attr(rUsage, "output_tokens_details");
|
|
335
|
+
if (outDetails) {
|
|
336
|
+
const reasoning = asNumber(attr(outDetails, "reasoning_tokens"));
|
|
337
|
+
if (reasoning !== null)
|
|
338
|
+
usage.reasoningTokens = reasoning;
|
|
339
|
+
}
|
|
340
|
+
const inDetails = attr(rUsage, "input_tokens_details");
|
|
341
|
+
if (inDetails) {
|
|
342
|
+
const cached = asNumber(attr(inDetails, "cached_tokens"));
|
|
343
|
+
if (cached !== null)
|
|
344
|
+
usage.cacheReadTokens = cached;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/wrappers/openai.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@frugalco/frugal-sdk-node",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Instrumentation for Cost-to-Code attribution.",
|
|
5
|
+
"homepage": "https://frugal.co",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/frugalco/frugal-node-sdk.git"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public",
|
|
27
|
+
"registry": "https://registry.npmjs.org/"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@opentelemetry/api": "^1.9.0",
|
|
39
|
+
"@opentelemetry/exporter-metrics-otlp-proto": "^0.52.0",
|
|
40
|
+
"@opentelemetry/resources": "^1.25.0",
|
|
41
|
+
"@opentelemetry/sdk-metrics": "^1.25.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@anthropic-ai/sdk": ">=0.27.0",
|
|
45
|
+
"openai": ">=4.50.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependenciesMeta": {
|
|
48
|
+
"openai": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
51
|
+
"@anthropic-ai/sdk": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/node": "^20.12.0",
|
|
57
|
+
"typescript": "^5.4.0",
|
|
58
|
+
"vitest": "^1.6.0"
|
|
59
|
+
}
|
|
60
|
+
}
|