@countly/ai-sdk-anthropic 0.0.3

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/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # @countly/ai-sdk-anthropic
2
+
3
+ > Countly AI observability adapter for the [Anthropic TypeScript SDK](https://github.com/anthropics/anthropic-sdk-typescript).
4
+
5
+ Part of the [Countly AI SDK](https://github.com/Countly/countly-ai-sdk) — provider-agnostic LLM observability for every AI stack.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @countly/ai-sdk-anthropic
11
+ ```
12
+
13
+ `@countly/ai-sdk-core` is pulled in automatically.
14
+
15
+ ## Peer dependency
16
+
17
+ ```
18
+ @anthropic-ai/sdk >= 0.30.0
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ```typescript
24
+ import Anthropic from "@anthropic-ai/sdk";
25
+ import { observeAnthropic } from "@countly/ai-sdk-anthropic";
26
+ import { AsyncLocalStorage } from "node:async_hooks";
27
+
28
+ const userStore = new AsyncLocalStorage<{ userId: string }>();
29
+
30
+ app.use((req, res, next) => {
31
+ userStore.run({ userId: req.user.id }, next);
32
+ });
33
+
34
+ const anthropic = observeAnthropic(new Anthropic(), {
35
+ appKey: "YOUR_APP_KEY",
36
+ url: "https://your-countly-server.com",
37
+ getDeviceId: () => userStore.getStore()?.userId,
38
+ observabilityLevel: 1,
39
+ tags: ["chatbot", "customer-support"],
40
+ environment: "production",
41
+ });
42
+
43
+ const message = await anthropic.messages.create({
44
+ model: "claude-sonnet-4-20250514",
45
+ max_tokens: 1024,
46
+ messages: [{ role: "user", content: "Hello" }],
47
+ });
48
+ ```
49
+
50
+ ## Streaming
51
+
52
+ ```typescript
53
+ const stream = anthropic.messages.stream({
54
+ model: "claude-sonnet-4-20250514",
55
+ max_tokens: 1024,
56
+ messages: [{ role: "user", content: "Hello" }],
57
+ });
58
+
59
+ const finalMessage = await stream.finalMessage();
60
+ // Events reported automatically after stream completes
61
+ ```
62
+
63
+ ## What's captured
64
+
65
+ - Token usage (input, output, cache read, cache write)
66
+ - Cost (computed from model pricing)
67
+ - Latency (total + TTFT for streaming)
68
+ - Tool use blocks (name, arguments)
69
+ - Error tracking with categorization
70
+ - APM traces, per-user aggregation
71
+
72
+ ## Configuration
73
+
74
+ | Field | Default | Description |
75
+ |-------|---------|-------------|
76
+ | `appKey` | *required* | Countly app key |
77
+ | `url` | *required* | Countly server URL |
78
+ | `getDeviceId` | — | Per-request user ID resolver (called at event enqueue time) |
79
+ | `deviceId` | — | Static device ID (fallback) |
80
+ | `observabilityLevel` | `0` | `0` = metrics only, `1` = + tool calls, `2` = + text previews |
81
+ | `tags` | `[]` | Labels for cost attribution |
82
+ | `environment` | `"production"` | Environment tag |
83
+ | `costModel` | — | Custom pricing overrides |
84
+
85
+ ## Full documentation
86
+
87
+ See the [Countly AI SDK repository](https://github.com/Countly/countly-ai-sdk) for the unified data model, observability levels, cost calculation, privacy controls, and Countly plugin integration (Drill, Funnels, Cohorts, APM, Crash Analytics).
88
+
89
+ ## License
90
+
91
+ MIT
@@ -0,0 +1,25 @@
1
+ import { type CountlyAIConfig } from "@countly/ai-sdk-core";
2
+ export interface CountlyAnthropicOptions extends CountlyAIConfig {
3
+ }
4
+ /**
5
+ * Wraps an Anthropic client with Countly AI observability.
6
+ *
7
+ * Uses JS Proxy to intercept `client.messages.create()` and `client.messages.stream()` calls
8
+ * and automatically track LLM interactions, token usage, costs, and latency.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import Anthropic from "@anthropic-ai/sdk";
13
+ * import { observeAnthropic } from "@countly/ai-sdk-anthropic";
14
+ *
15
+ * const client = observeAnthropic(new Anthropic(), {
16
+ * appKey: "YOUR_APP_KEY",
17
+ * url: "https://your-countly-server.com",
18
+ * });
19
+ *
20
+ * // Use client as normal — all calls are automatically tracked
21
+ * const response = await client.messages.create({ ... });
22
+ * ```
23
+ */
24
+ export declare function observeAnthropic<T>(client: T, options: CountlyAIConfig): T;
25
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,eAAe,EAKrB,MAAM,sBAAsB,CAAC;AAM9B,MAAM,WAAW,uBAAwB,SAAQ,eAAe;CAAG;AAkdnE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,GAAG,CAAC,CAa1E"}
@@ -0,0 +1,417 @@
1
+ import { resolveConfig, createTransport, buildAllEvents, generatePromptId, } from "@countly/ai-sdk-core";
2
+ function extractTextInput(params) {
3
+ if (!params?.messages)
4
+ return undefined;
5
+ const messages = params.messages;
6
+ const last = messages[messages.length - 1];
7
+ if (!last)
8
+ return undefined;
9
+ if (typeof last.content === "string")
10
+ return last.content;
11
+ if (Array.isArray(last.content)) {
12
+ return last.content
13
+ .filter((b) => b.type === "text")
14
+ .map((b) => b.text)
15
+ .join("");
16
+ }
17
+ return undefined;
18
+ }
19
+ function extractFromMessage(message) {
20
+ // Anthropic reports input_tokens EXCLUDING cache tokens, unlike OpenAI/Gemini
21
+ // where the input count already includes cache-read. Fold cache-read into
22
+ // usage_input so the SDK's cost contract (cache-read is a subset of input,
23
+ // billed at the discounted rate) holds uniformly across providers. Cache
24
+ // creation stays separate (usage_cache_write, premium rate).
25
+ const cacheRead = message.usage?.cache_read_input_tokens ?? 0;
26
+ const inputTokens = (message.usage?.input_tokens ?? 0) + cacheRead;
27
+ const outputTokens = message.usage?.output_tokens ?? 0;
28
+ const contentBlocks = message.content ?? [];
29
+ const toolBlocks = contentBlocks.filter((b) => b.type === "tool_use");
30
+ const tools = toolBlocks.map((b) => ({
31
+ name: b.name ?? "unknown",
32
+ type: "function_call",
33
+ arguments: b.input ?? undefined,
34
+ }));
35
+ const textOutput = contentBlocks
36
+ .filter((b) => b.type === "text")
37
+ .map((b) => b.text)
38
+ .join("");
39
+ // Provider-specific orphan fields → metadata bag.
40
+ const meta = {};
41
+ const m = message;
42
+ if (m.stop_sequence)
43
+ meta.stop_sequence = m.stop_sequence;
44
+ if (m.container)
45
+ meta.container = m.container;
46
+ const u = message.usage;
47
+ if (u?.server_tool_use)
48
+ meta.server_tool_use = u.server_tool_use;
49
+ if (u?.cache_creation)
50
+ meta.cache_creation = u.cache_creation;
51
+ if (u?.service_tier)
52
+ meta.service_tier = u.service_tier;
53
+ if (u?.inference_geo)
54
+ meta.inference_geo = u.inference_geo;
55
+ return {
56
+ model: message.model ?? "unknown",
57
+ provider: "anthropic",
58
+ usage_input: inputTokens,
59
+ usage_output: outputTokens,
60
+ usage_total: inputTokens + outputTokens,
61
+ usage_cache_read: message.usage?.cache_read_input_tokens,
62
+ usage_cache_write: message.usage?.cache_creation_input_tokens,
63
+ finish_reason: message.stop_reason ?? undefined,
64
+ tools: tools.length > 0 ? tools : undefined,
65
+ text_output: textOutput || undefined,
66
+ latency_total: 0, // filled by caller
67
+ status: "success",
68
+ ...(m.id && { response_id: String(m.id) }),
69
+ ...(message.model && { response_model: String(message.model) }),
70
+ ...(Object.keys(meta).length > 0 && { provider_metadata: meta }),
71
+ };
72
+ }
73
+ function createMessagesProxy(messages, config, transport) {
74
+ return new Proxy(messages, {
75
+ get(target, prop, receiver) {
76
+ if (prop === "create") {
77
+ return createInterceptedCreate(target, config, transport);
78
+ }
79
+ if (prop === "stream") {
80
+ return createInterceptedStream(target, config, transport);
81
+ }
82
+ return Reflect.get(target, prop, receiver);
83
+ },
84
+ });
85
+ }
86
+ function createInterceptedCreate(messages, config, transport) {
87
+ const originalCreate = messages.create.bind(messages);
88
+ return async function interceptedCreate(...args) {
89
+ if (config.disabled) {
90
+ return originalCreate(...args);
91
+ }
92
+ const promptId = generatePromptId();
93
+ const params = args[0] ?? {};
94
+ const textInput = extractTextInput(params);
95
+ const isStream = params.stream === true;
96
+ const startTime = performance.now();
97
+ try {
98
+ const result = await originalCreate(...args);
99
+ if (isStream) {
100
+ // When stream: true is passed to create(), Anthropic SDK returns
101
+ // an async iterable of events. Wrap it to collect data.
102
+ return wrapStreamIterable(result, config, transport, promptId, textInput, startTime, params.model);
103
+ }
104
+ // Non-streaming response
105
+ const endTime = performance.now();
106
+ const raw = extractFromMessage(result);
107
+ raw.latency_total = Math.round(endTime - startTime);
108
+ raw.model_requested = params.model;
109
+ raw.config_temperature = params.temperature;
110
+ raw.config_top_p = params.top_p;
111
+ raw.config_max_tokens = params.max_tokens;
112
+ raw.config_stream = isStream;
113
+ if (config.observabilityLevel === 2 && textInput) {
114
+ raw.text_input = textInput;
115
+ }
116
+ const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
117
+ const events = buildAllEvents(raw, config, eventContext);
118
+ transport.enqueue(events);
119
+ transport.reportTrace(raw, eventContext);
120
+ transport.reportUserData(raw);
121
+ return result;
122
+ }
123
+ catch (error) {
124
+ const endTime = performance.now();
125
+ const raw = {
126
+ model: params.model ?? "unknown",
127
+ model_requested: params.model,
128
+ provider: "anthropic",
129
+ usage_input: 0,
130
+ usage_output: 0,
131
+ usage_total: 0,
132
+ latency_total: Math.round(endTime - startTime),
133
+ config_temperature: params.temperature,
134
+ config_top_p: params.top_p,
135
+ config_max_tokens: params.max_tokens,
136
+ config_stream: isStream,
137
+ status: "error",
138
+ error: error?.message ?? String(error),
139
+ };
140
+ if (config.observabilityLevel === 2 && textInput) {
141
+ raw.text_input = textInput;
142
+ }
143
+ const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
144
+ const events = buildAllEvents(raw, config, eventContext);
145
+ transport.enqueue(events);
146
+ transport.reportError(error, raw);
147
+ throw error;
148
+ }
149
+ };
150
+ }
151
+ function createInterceptedStream(messages, config, transport) {
152
+ const originalStream = messages.stream.bind(messages);
153
+ return function interceptedStream(...args) {
154
+ if (config.disabled) {
155
+ return originalStream(...args);
156
+ }
157
+ const promptId = generatePromptId();
158
+ const params = args[0] ?? {};
159
+ const textInput = extractTextInput(params);
160
+ const startTime = performance.now();
161
+ // Anthropic's messages.stream() returns a MessageStream object.
162
+ // We wrap it using a Proxy to intercept finalMessage() and the async iterator.
163
+ const stream = originalStream(...args);
164
+ return wrapMessageStream(stream, config, transport, promptId, textInput, startTime, params.model);
165
+ };
166
+ }
167
+ function wrapMessageStream(stream, config, transport, promptId, textInput, startTime, modelHint) {
168
+ let reported = false;
169
+ function reportFromMessage(message) {
170
+ if (reported)
171
+ return;
172
+ reported = true;
173
+ const endTime = performance.now();
174
+ const raw = extractFromMessage(message);
175
+ raw.latency_total = Math.round(endTime - startTime);
176
+ raw.config_stream = true;
177
+ if (config.observabilityLevel === 2 && textInput) {
178
+ raw.text_input = textInput;
179
+ }
180
+ const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
181
+ const events = buildAllEvents(raw, config, eventContext);
182
+ transport.enqueue(events);
183
+ transport.reportTrace(raw, eventContext);
184
+ transport.reportUserData(raw);
185
+ }
186
+ function reportError(error) {
187
+ if (reported)
188
+ return;
189
+ reported = true;
190
+ const endTime = performance.now();
191
+ const raw = {
192
+ model: modelHint ?? "unknown",
193
+ provider: "anthropic",
194
+ usage_input: 0,
195
+ usage_output: 0,
196
+ usage_total: 0,
197
+ latency_total: Math.round(endTime - startTime),
198
+ config_stream: true,
199
+ status: "error",
200
+ error: error?.message ?? String(error),
201
+ };
202
+ if (config.observabilityLevel === 2 && textInput) {
203
+ raw.text_input = textInput;
204
+ }
205
+ const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
206
+ const events = buildAllEvents(raw, config, eventContext);
207
+ transport.enqueue(events);
208
+ transport.reportError(error, raw);
209
+ }
210
+ const proxy = new Proxy(stream, {
211
+ get(target, prop, receiver) {
212
+ if (prop === "finalMessage") {
213
+ const originalFinalMessage = Reflect.get(target, prop, receiver);
214
+ if (typeof originalFinalMessage === "function") {
215
+ return async function wrappedFinalMessage(...fmArgs) {
216
+ try {
217
+ const message = await originalFinalMessage.apply(target, fmArgs);
218
+ reportFromMessage(message);
219
+ return message;
220
+ }
221
+ catch (error) {
222
+ reportError(error);
223
+ throw error;
224
+ }
225
+ };
226
+ }
227
+ }
228
+ // Intercept on() to capture the 'finalMessage', 'error', and 'abort' events.
229
+ // Return the proxy (not target) so chained .on() calls stay intercepted.
230
+ if (prop === "on") {
231
+ const originalOn = Reflect.get(target, prop, receiver);
232
+ if (typeof originalOn === "function") {
233
+ return function wrappedOn(event, callback, ...rest) {
234
+ if (event === "finalMessage") {
235
+ const wrappedCallback = (message) => {
236
+ reportFromMessage(message);
237
+ return callback(message);
238
+ };
239
+ originalOn.call(target, event, wrappedCallback, ...rest);
240
+ return proxy;
241
+ }
242
+ if (event === "error") {
243
+ const wrappedCallback = (error) => {
244
+ reportError(error);
245
+ return callback(error);
246
+ };
247
+ originalOn.call(target, event, wrappedCallback, ...rest);
248
+ return proxy;
249
+ }
250
+ if (event === "abort") {
251
+ const wrappedCallback = (error) => {
252
+ reportError(error ?? new Error("Request aborted"));
253
+ return callback(error);
254
+ };
255
+ originalOn.call(target, event, wrappedCallback, ...rest);
256
+ return proxy;
257
+ }
258
+ originalOn.call(target, event, callback, ...rest);
259
+ return proxy;
260
+ };
261
+ }
262
+ }
263
+ // Wrap the async iterator to capture when stream ends
264
+ if (prop === Symbol.asyncIterator) {
265
+ const originalIterator = Reflect.get(target, prop, receiver);
266
+ if (typeof originalIterator === "function") {
267
+ return function wrappedAsyncIterator() {
268
+ const iterator = originalIterator.call(target);
269
+ return {
270
+ async next() {
271
+ const result = await iterator.next();
272
+ if (result.done) {
273
+ // Try to extract final message from the stream
274
+ try {
275
+ if (typeof target.finalMessage === "function") {
276
+ const message = await target.finalMessage();
277
+ reportFromMessage(message);
278
+ }
279
+ }
280
+ catch {
281
+ // finalMessage may not be available; ignore
282
+ }
283
+ }
284
+ return result;
285
+ },
286
+ return: iterator.return?.bind(iterator),
287
+ throw: iterator.throw?.bind(iterator),
288
+ };
289
+ };
290
+ }
291
+ }
292
+ return Reflect.get(target, prop, receiver);
293
+ },
294
+ });
295
+ return proxy;
296
+ }
297
+ async function* wrapStreamIterable(stream, config, transport, promptId, textInput, startTime, modelHint) {
298
+ // If the stream object has a finalMessage method (Anthropic stream helper),
299
+ // we can use that for extraction
300
+ const streamObj = stream;
301
+ let firstChunkTime;
302
+ try {
303
+ for await (const event of stream) {
304
+ if (firstChunkTime === undefined) {
305
+ firstChunkTime = performance.now();
306
+ }
307
+ yield event;
308
+ }
309
+ // After stream completes, try to get finalMessage
310
+ if (typeof streamObj.finalMessage === "function") {
311
+ try {
312
+ const message = await streamObj.finalMessage();
313
+ const endTime = performance.now();
314
+ const raw = extractFromMessage(message);
315
+ raw.latency_total = Math.round(endTime - startTime);
316
+ if (firstChunkTime !== undefined) {
317
+ raw.latency_ttft = Math.round(firstChunkTime - startTime);
318
+ }
319
+ raw.config_stream = true;
320
+ if (config.observabilityLevel === 2 && textInput) {
321
+ raw.text_input = textInput;
322
+ }
323
+ const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
324
+ const events = buildAllEvents(raw, config, eventContext);
325
+ transport.enqueue(events);
326
+ transport.reportTrace(raw, eventContext);
327
+ transport.reportUserData(raw);
328
+ return;
329
+ }
330
+ catch {
331
+ // Fall through to basic reporting
332
+ }
333
+ }
334
+ // Basic reporting when finalMessage is not available
335
+ const endTime = performance.now();
336
+ const raw = {
337
+ model: modelHint ?? "unknown",
338
+ provider: "anthropic",
339
+ usage_input: 0,
340
+ usage_output: 0,
341
+ usage_total: 0,
342
+ latency_total: Math.round(endTime - startTime),
343
+ config_stream: true,
344
+ status: "success",
345
+ };
346
+ if (firstChunkTime !== undefined) {
347
+ raw.latency_ttft = Math.round(firstChunkTime - startTime);
348
+ }
349
+ if (config.observabilityLevel === 2 && textInput) {
350
+ raw.text_input = textInput;
351
+ }
352
+ const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
353
+ const events = buildAllEvents(raw, config, eventContext);
354
+ transport.enqueue(events);
355
+ transport.reportTrace(raw, eventContext);
356
+ transport.reportUserData(raw);
357
+ }
358
+ catch (error) {
359
+ const endTime = performance.now();
360
+ const raw = {
361
+ model: modelHint ?? "unknown",
362
+ provider: "anthropic",
363
+ usage_input: 0,
364
+ usage_output: 0,
365
+ usage_total: 0,
366
+ latency_total: Math.round(endTime - startTime),
367
+ config_stream: true,
368
+ status: "error",
369
+ error: error?.message ?? String(error),
370
+ };
371
+ if (firstChunkTime !== undefined) {
372
+ raw.latency_ttft = Math.round(firstChunkTime - startTime);
373
+ }
374
+ if (config.observabilityLevel === 2 && textInput) {
375
+ raw.text_input = textInput;
376
+ }
377
+ const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
378
+ const events = buildAllEvents(raw, config, eventContext);
379
+ transport.enqueue(events);
380
+ transport.reportError(error, raw);
381
+ throw error;
382
+ }
383
+ }
384
+ /**
385
+ * Wraps an Anthropic client with Countly AI observability.
386
+ *
387
+ * Uses JS Proxy to intercept `client.messages.create()` and `client.messages.stream()` calls
388
+ * and automatically track LLM interactions, token usage, costs, and latency.
389
+ *
390
+ * @example
391
+ * ```ts
392
+ * import Anthropic from "@anthropic-ai/sdk";
393
+ * import { observeAnthropic } from "@countly/ai-sdk-anthropic";
394
+ *
395
+ * const client = observeAnthropic(new Anthropic(), {
396
+ * appKey: "YOUR_APP_KEY",
397
+ * url: "https://your-countly-server.com",
398
+ * });
399
+ *
400
+ * // Use client as normal — all calls are automatically tracked
401
+ * const response = await client.messages.create({ ... });
402
+ * ```
403
+ */
404
+ export function observeAnthropic(client, options) {
405
+ const config = resolveConfig(options);
406
+ const transport = createTransport(config);
407
+ return new Proxy(client, {
408
+ get(target, prop, receiver) {
409
+ if (prop === "messages") {
410
+ const messages = Reflect.get(target, prop, receiver);
411
+ return createMessagesProxy(messages, config, transport);
412
+ }
413
+ return Reflect.get(target, prop, receiver);
414
+ },
415
+ });
416
+ }
417
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { observeAnthropic } from "./adapter";
2
+ export type { CountlyAnthropicOptions } from "./adapter";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { observeAnthropic } from "./adapter";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@countly/ai-sdk-anthropic",
3
+ "version": "0.0.3",
4
+ "description": "Countly AI observability adapter for Anthropic SDK",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./dist/index.js",
9
+ "types": "./dist/index.d.ts"
10
+ }
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "peerDependencies": {
19
+ "@anthropic-ai/sdk": ">=0.30.0"
20
+ },
21
+ "peerDependenciesMeta": {
22
+ "@anthropic-ai/sdk": {
23
+ "optional": false
24
+ }
25
+ },
26
+ "dependencies": {
27
+ "@countly/ai-sdk-core": "0.0.3"
28
+ },
29
+ "devDependencies": {
30
+ "typescript": "^5.8.3",
31
+ "@countly/ai-sdk-tsconfig": "0.0.0"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc --project tsconfig.build.json",
35
+ "dev": "tsc --project tsconfig.build.json --watch",
36
+ "lint": "tsc --noEmit",
37
+ "test": "vitest run"
38
+ }
39
+ }