cencori 1.0.4 → 1.2.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/README.md +28 -6
- package/dist/ai/index.d.mts +71 -2
- package/dist/ai/index.d.ts +71 -2
- package/dist/ai/index.js +136 -8
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +136 -8
- package/dist/ai/index.mjs.map +1 -1
- package/dist/compute/index.d.mts +1 -1
- package/dist/compute/index.d.ts +1 -1
- package/dist/index.d.mts +17 -3
- package/dist/index.d.ts +17 -3
- package/dist/index.js +179 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +178 -8
- package/dist/index.mjs.map +1 -1
- package/dist/memory/index.d.mts +1 -1
- package/dist/memory/index.d.ts +1 -1
- package/dist/storage/index.d.mts +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/tanstack/index.d.mts +1 -1
- package/dist/tanstack/index.d.ts +1 -1
- package/dist/tanstack/index.js +14 -1
- package/dist/tanstack/index.js.map +1 -1
- package/dist/tanstack/index.mjs +14 -1
- package/dist/tanstack/index.mjs.map +1 -1
- package/dist/telemetry/index.d.mts +73 -0
- package/dist/telemetry/index.d.ts +73 -0
- package/dist/telemetry/index.js +68 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/index.mjs +43 -0
- package/dist/telemetry/index.mjs.map +1 -0
- package/dist/{types-Azq6TqIA.d.mts → types-Cr0muEt3.d.mts} +14 -0
- package/dist/{types-Azq6TqIA.d.ts → types-Cr0muEt3.d.ts} +14 -0
- package/dist/workflow/index.d.mts +1 -1
- package/dist/workflow/index.d.ts +1 -1
- package/package.json +7 -2
package/dist/tanstack/index.mjs
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
// src/tanstack/index.ts
|
|
2
2
|
var CENCORI_CHAT_MODELS = [
|
|
3
3
|
// OpenAI
|
|
4
|
+
"gpt-5.5",
|
|
5
|
+
"gpt-5.4",
|
|
6
|
+
"gpt-5.4-pro",
|
|
7
|
+
"gpt-5.3-chat-latest",
|
|
8
|
+
"gpt-5.2",
|
|
9
|
+
"gpt-5.1",
|
|
10
|
+
"gpt-5",
|
|
11
|
+
"gpt-5-mini",
|
|
12
|
+
"gpt-5-nano",
|
|
13
|
+
"gpt-4.1",
|
|
4
14
|
"gpt-4o",
|
|
5
15
|
"gpt-4o-mini",
|
|
16
|
+
"o3-pro",
|
|
17
|
+
"o3",
|
|
18
|
+
"o4-mini",
|
|
6
19
|
"o1",
|
|
7
|
-
"o1-mini",
|
|
8
20
|
// Anthropic
|
|
9
21
|
"claude-3-5-sonnet",
|
|
10
22
|
"claude-3-opus",
|
|
@@ -14,6 +26,7 @@ var CENCORI_CHAT_MODELS = [
|
|
|
14
26
|
"gemini-2.0-flash",
|
|
15
27
|
"gemini-3-pro",
|
|
16
28
|
// xAI
|
|
29
|
+
"grok-voice-think-fast",
|
|
17
30
|
"grok-4",
|
|
18
31
|
"grok-3",
|
|
19
32
|
// Mistral
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tanstack/index.ts"],"sourcesContent":["/**\n * Cencori AI SDK - TanStack AI Integration\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * @packageDocumentation\n */\n\nimport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n ContentStreamChunk,\n DoneStreamChunk,\n ErrorStreamChunk,\n ToolCallStreamChunk,\n Modality,\n DefaultMessageMetadataByModality,\n} from '@tanstack/ai';\n\n// Re-export types for convenience\nexport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n};\n\n/**\n * Cencori provider options\n */\nexport interface CencoriProviderOptions {\n /** Cencori API key */\n apiKey?: string;\n /** Base URL for Cencori API (defaults to https://cencori.com) */\n baseUrl?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Cencori model-specific options\n */\nexport interface CencoriModelOptions {\n /** User ID for attribution */\n userId?: string;\n}\n\n// All models supported through Cencori Gateway\nexport const CENCORI_CHAT_MODELS = [\n // OpenAI\n 'gpt-4o',\n 'gpt-4o-mini',\n 'o1',\n 'o1-mini',\n // Anthropic\n 'claude-3-5-sonnet',\n 'claude-3-opus',\n 'claude-3-haiku',\n // Google\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n 'gemini-3-pro',\n // xAI\n 'grok-4',\n 'grok-3',\n // Mistral\n 'mistral-large',\n 'codestral',\n // DeepSeek\n 'deepseek-v3.2',\n 'deepseek-reasoner',\n // Groq\n 'llama-3-70b',\n 'mixtral-8x7b',\n] as const;\n\nexport type CencoriChatModel = (typeof CENCORI_CHAT_MODELS)[number];\n\n/**\n * Cencori adapter for TanStack AI\n */\nclass CencoriTextAdapter implements TextAdapter<\n CencoriChatModel,\n CencoriModelOptions,\n readonly ['text', 'image'],\n DefaultMessageMetadataByModality\n> {\n readonly kind = 'text' as const;\n readonly name = 'cencori';\n readonly model: CencoriChatModel;\n\n '~types': {\n providerOptions: CencoriModelOptions;\n inputModalities: readonly ['text', 'image'];\n messageMetadataByModality: DefaultMessageMetadataByModality;\n } = {} as any;\n\n private config: {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n };\n private providerOptions: CencoriProviderOptions;\n\n constructor(model: CencoriChatModel, options: CencoriProviderOptions = {}) {\n this.model = model;\n this.providerOptions = options;\n\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: options.baseUrl ?? 'https://cencori.com',\n headers: options.headers,\n };\n }\n\n /**\n * Stream chat completions from the model\n */\n async *chatStream(options: TextOptions<CencoriModelOptions>): AsyncIterable<StreamChunk> {\n // Convert tools to Cencori format if present\n const tools = options.tools ? Object.values(options.tools).map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema || {},\n },\n })) : undefined;\n\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.messages,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n stream: true,\n userId: options.modelOptions?.userId,\n tools,\n }),\n signal: options.abortController?.signal,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n const errorChunk: ErrorStreamChunk = {\n type: 'error',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n error: {\n message: errorData.error || response.statusText,\n code: String(response.status),\n },\n };\n yield errorChunk;\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is null');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let content = '';\n const promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Emit done chunk\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (!line.startsWith('data: ')) continue;\n\n const data = line.slice(6);\n if (data === '[DONE]') {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n if (chunk.delta) {\n content += chunk.delta;\n completionTokens += Math.ceil(chunk.delta.length / 4);\n\n const contentChunk: ContentStreamChunk = {\n type: 'content',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n delta: chunk.delta,\n content: content,\n role: 'assistant',\n };\n yield contentChunk;\n }\n\n // Handle tool calls\n if (chunk.tool_calls && chunk.tool_calls.length > 0) {\n for (const tc of chunk.tool_calls) {\n const toolCallChunk: ToolCallStreamChunk = {\n type: 'tool_call',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n toolCall: {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n },\n index: 0,\n };\n yield toolCallChunk;\n }\n }\n\n if (chunk.finish_reason) {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: chunk.finish_reason === 'tool_calls' ? 'tool_calls'\n : chunk.finish_reason === 'stop' ? 'stop' : null,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate structured output\n */\n async structuredOutput(options: {\n chatOptions: TextOptions<CencoriModelOptions>;\n outputSchema: any;\n }): Promise<{ data: unknown; rawText: string }> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.chatOptions.messages,\n temperature: options.chatOptions.temperature,\n maxTokens: options.chatOptions.maxTokens,\n stream: false,\n responseFormat: {\n type: 'json_schema',\n json_schema: {\n name: 'structured_output',\n schema: options.outputSchema,\n strict: true,\n },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${errorData.error || response.statusText}`);\n }\n\n const result = await response.json() as { content: string };\n const rawText = result.content;\n\n try {\n const data = JSON.parse(rawText);\n return { data, rawText };\n } catch {\n throw new Error(`Failed to parse structured output: ${rawText}`);\n }\n }\n\n private generateId(): string {\n return `cencori-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Create a Cencori adapter for TanStack AI\n * \n * @example\n * import { createCencori } from 'cencori/tanstack';\n * \n * const myProvider = createCencori({ apiKey: 'csk_...' });\n * const adapter = myProvider('gpt-4o');\n */\nexport function createCencori(options: CencoriProviderOptions = {}) {\n return function cencoriProvider<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, options);\n };\n}\n\n/**\n * Default Cencori provider\n * Uses CENCORI_API_KEY environment variable\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function cencori<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, {});\n}\n\n// Export adapter class for advanced use cases\nexport { CencoriTextAdapter };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/tanstack/index.ts"],"sourcesContent":["/**\n * Cencori AI SDK - TanStack AI Integration\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * \n * @packageDocumentation\n */\n\nimport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n ContentStreamChunk,\n DoneStreamChunk,\n ErrorStreamChunk,\n ToolCallStreamChunk,\n Modality,\n DefaultMessageMetadataByModality,\n} from '@tanstack/ai';\n\n// Re-export types for convenience\nexport type {\n TextAdapter,\n TextOptions,\n StreamChunk,\n};\n\n/**\n * Cencori provider options\n */\nexport interface CencoriProviderOptions {\n /** Cencori API key */\n apiKey?: string;\n /** Base URL for Cencori API (defaults to https://cencori.com) */\n baseUrl?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Cencori model-specific options\n */\nexport interface CencoriModelOptions {\n /** User ID for attribution */\n userId?: string;\n}\n\n// All models supported through Cencori Gateway\nexport const CENCORI_CHAT_MODELS = [\n // OpenAI\n 'gpt-5.5',\n 'gpt-5.4',\n 'gpt-5.4-pro',\n 'gpt-5.3-chat-latest',\n 'gpt-5.2',\n 'gpt-5.1',\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4o-mini',\n 'o3-pro',\n 'o3',\n 'o4-mini',\n 'o1',\n // Anthropic\n 'claude-3-5-sonnet',\n 'claude-3-opus',\n 'claude-3-haiku',\n // Google\n 'gemini-2.5-flash',\n 'gemini-2.0-flash',\n 'gemini-3-pro',\n // xAI\n 'grok-voice-think-fast',\n 'grok-4',\n 'grok-3',\n // Mistral\n 'mistral-large',\n 'codestral',\n // DeepSeek\n 'deepseek-v3.2',\n 'deepseek-reasoner',\n // Groq\n 'llama-3-70b',\n 'mixtral-8x7b',\n] as const;\n\nexport type CencoriChatModel = (typeof CENCORI_CHAT_MODELS)[number];\n\n/**\n * Cencori adapter for TanStack AI\n */\nclass CencoriTextAdapter implements TextAdapter<\n CencoriChatModel,\n CencoriModelOptions,\n readonly ['text', 'image'],\n DefaultMessageMetadataByModality\n> {\n readonly kind = 'text' as const;\n readonly name = 'cencori';\n readonly model: CencoriChatModel;\n\n '~types': {\n providerOptions: CencoriModelOptions;\n inputModalities: readonly ['text', 'image'];\n messageMetadataByModality: DefaultMessageMetadataByModality;\n } = {} as any;\n\n private config: {\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n };\n private providerOptions: CencoriProviderOptions;\n\n constructor(model: CencoriChatModel, options: CencoriProviderOptions = {}) {\n this.model = model;\n this.providerOptions = options;\n\n const apiKey = options.apiKey ?? process.env.CENCORI_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Cencori API key is required. Pass it via options.apiKey or set CENCORI_API_KEY environment variable.'\n );\n }\n\n this.config = {\n apiKey,\n baseUrl: options.baseUrl ?? 'https://cencori.com',\n headers: options.headers,\n };\n }\n\n /**\n * Stream chat completions from the model\n */\n async *chatStream(options: TextOptions<CencoriModelOptions>): AsyncIterable<StreamChunk> {\n // Convert tools to Cencori format if present\n const tools = options.tools ? Object.values(options.tools).map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema || {},\n },\n })) : undefined;\n\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.messages,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n stream: true,\n userId: options.modelOptions?.userId,\n tools,\n }),\n signal: options.abortController?.signal,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n const errorChunk: ErrorStreamChunk = {\n type: 'error',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n error: {\n message: errorData.error || response.statusText,\n code: String(response.status),\n },\n };\n yield errorChunk;\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is null');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let content = '';\n const promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Emit done chunk\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (!line.startsWith('data: ')) continue;\n\n const data = line.slice(6);\n if (data === '[DONE]') {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: 'stop',\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n if (chunk.delta) {\n content += chunk.delta;\n completionTokens += Math.ceil(chunk.delta.length / 4);\n\n const contentChunk: ContentStreamChunk = {\n type: 'content',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n delta: chunk.delta,\n content: content,\n role: 'assistant',\n };\n yield contentChunk;\n }\n\n // Handle tool calls\n if (chunk.tool_calls && chunk.tool_calls.length > 0) {\n for (const tc of chunk.tool_calls) {\n const toolCallChunk: ToolCallStreamChunk = {\n type: 'tool_call',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n toolCall: {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n },\n index: 0,\n };\n yield toolCallChunk;\n }\n }\n\n if (chunk.finish_reason) {\n const doneChunk: DoneStreamChunk = {\n type: 'done',\n id: this.generateId(),\n model: this.model,\n timestamp: Date.now(),\n finishReason: chunk.finish_reason === 'tool_calls' ? 'tool_calls'\n : chunk.finish_reason === 'stop' ? 'stop' : null,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n yield doneChunk;\n return;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate structured output\n */\n async structuredOutput(options: {\n chatOptions: TextOptions<CencoriModelOptions>;\n outputSchema: any;\n }): Promise<{ data: unknown; rawText: string }> {\n const response = await fetch(`${this.config.baseUrl}/api/ai/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey!,\n ...this.config.headers,\n },\n body: JSON.stringify({\n model: this.model,\n messages: options.chatOptions.messages,\n temperature: options.chatOptions.temperature,\n maxTokens: options.chatOptions.maxTokens,\n stream: false,\n responseFormat: {\n type: 'json_schema',\n json_schema: {\n name: 'structured_output',\n schema: options.outputSchema,\n strict: true,\n },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n throw new Error(`Cencori API error: ${errorData.error || response.statusText}`);\n }\n\n const result = await response.json() as { content: string };\n const rawText = result.content;\n\n try {\n const data = JSON.parse(rawText);\n return { data, rawText };\n } catch {\n throw new Error(`Failed to parse structured output: ${rawText}`);\n }\n }\n\n private generateId(): string {\n return `cencori-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Create a Cencori adapter for TanStack AI\n * \n * @example\n * import { createCencori } from 'cencori/tanstack';\n * \n * const myProvider = createCencori({ apiKey: 'csk_...' });\n * const adapter = myProvider('gpt-4o');\n */\nexport function createCencori(options: CencoriProviderOptions = {}) {\n return function cencoriProvider<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, options);\n };\n}\n\n/**\n * Default Cencori provider\n * Uses CENCORI_API_KEY environment variable\n * \n * @example\n * import { cencori } from 'cencori/tanstack';\n * import { chat } from '@tanstack/ai';\n * \n * const result = await chat({\n * adapter: cencori('gpt-4o'),\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\nexport function cencori<T extends CencoriChatModel>(model: T) {\n return new CencoriTextAdapter(model, {});\n}\n\n// Export adapter class for advanced use cases\nexport { CencoriTextAdapter };\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { C as CencoriConfig } from '../types-Cr0muEt3.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cencori Telemetry Client
|
|
5
|
+
*
|
|
6
|
+
* Report web traffic from your application to the Cencori dashboard.
|
|
7
|
+
* Logs appear under the project's "Web Gateway" tab with your app's
|
|
8
|
+
* real domain as the host.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const cencori = new Cencori({ apiKey: 'csk_...' });
|
|
12
|
+
*
|
|
13
|
+
* // In your server middleware / API route handler:
|
|
14
|
+
* await cencori.telemetry.reportWebRequest({
|
|
15
|
+
* host: 'dochat-zeta.vercel.app',
|
|
16
|
+
* method: 'GET',
|
|
17
|
+
* path: '/api/chat',
|
|
18
|
+
* statusCode: 200,
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
interface WebTelemetryPayload {
|
|
23
|
+
/** The hostname of your application, e.g. "dochat-zeta.vercel.app" */
|
|
24
|
+
host: string;
|
|
25
|
+
/** HTTP method: GET, POST, PUT, DELETE, etc. */
|
|
26
|
+
method: string;
|
|
27
|
+
/** Request path, e.g. "/api/chat" */
|
|
28
|
+
path: string;
|
|
29
|
+
/** HTTP status code returned */
|
|
30
|
+
statusCode: number;
|
|
31
|
+
/** Optional unique request ID for tracing */
|
|
32
|
+
requestId?: string;
|
|
33
|
+
/** Query string without the leading "?" */
|
|
34
|
+
queryString?: string;
|
|
35
|
+
/** Human-readable log message */
|
|
36
|
+
message?: string;
|
|
37
|
+
/** Client User-Agent string */
|
|
38
|
+
userAgent?: string;
|
|
39
|
+
/** Referer header value */
|
|
40
|
+
referer?: string;
|
|
41
|
+
/** Client IP address */
|
|
42
|
+
ipAddress?: string;
|
|
43
|
+
/** ISO 3166-1 alpha-2 country code */
|
|
44
|
+
countryCode?: string;
|
|
45
|
+
/** Request latency in milliseconds */
|
|
46
|
+
latencyMs?: number;
|
|
47
|
+
}
|
|
48
|
+
declare class TelemetryClient {
|
|
49
|
+
private config;
|
|
50
|
+
constructor(config: Required<CencoriConfig>);
|
|
51
|
+
/**
|
|
52
|
+
* Report a web request to the Cencori dashboard.
|
|
53
|
+
*
|
|
54
|
+
* Fire-and-forget — this method never throws and never blocks
|
|
55
|
+
* your application. If the request fails, the error is silently
|
|
56
|
+
* swallowed so it cannot disrupt your app's critical path.
|
|
57
|
+
*
|
|
58
|
+
* @param payload - Web request details to log
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* await cencori.telemetry.reportWebRequest({
|
|
62
|
+
* host: req.headers.get('host') || 'unknown',
|
|
63
|
+
* method: req.method,
|
|
64
|
+
* path: new URL(req.url).pathname,
|
|
65
|
+
* statusCode: response.status,
|
|
66
|
+
* userAgent: req.headers.get('user-agent') || undefined,
|
|
67
|
+
* latencyMs: Date.now() - startTime,
|
|
68
|
+
* });
|
|
69
|
+
*/
|
|
70
|
+
reportWebRequest(payload: WebTelemetryPayload): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { TelemetryClient, type WebTelemetryPayload };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { C as CencoriConfig } from '../types-Cr0muEt3.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cencori Telemetry Client
|
|
5
|
+
*
|
|
6
|
+
* Report web traffic from your application to the Cencori dashboard.
|
|
7
|
+
* Logs appear under the project's "Web Gateway" tab with your app's
|
|
8
|
+
* real domain as the host.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const cencori = new Cencori({ apiKey: 'csk_...' });
|
|
12
|
+
*
|
|
13
|
+
* // In your server middleware / API route handler:
|
|
14
|
+
* await cencori.telemetry.reportWebRequest({
|
|
15
|
+
* host: 'dochat-zeta.vercel.app',
|
|
16
|
+
* method: 'GET',
|
|
17
|
+
* path: '/api/chat',
|
|
18
|
+
* statusCode: 200,
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
interface WebTelemetryPayload {
|
|
23
|
+
/** The hostname of your application, e.g. "dochat-zeta.vercel.app" */
|
|
24
|
+
host: string;
|
|
25
|
+
/** HTTP method: GET, POST, PUT, DELETE, etc. */
|
|
26
|
+
method: string;
|
|
27
|
+
/** Request path, e.g. "/api/chat" */
|
|
28
|
+
path: string;
|
|
29
|
+
/** HTTP status code returned */
|
|
30
|
+
statusCode: number;
|
|
31
|
+
/** Optional unique request ID for tracing */
|
|
32
|
+
requestId?: string;
|
|
33
|
+
/** Query string without the leading "?" */
|
|
34
|
+
queryString?: string;
|
|
35
|
+
/** Human-readable log message */
|
|
36
|
+
message?: string;
|
|
37
|
+
/** Client User-Agent string */
|
|
38
|
+
userAgent?: string;
|
|
39
|
+
/** Referer header value */
|
|
40
|
+
referer?: string;
|
|
41
|
+
/** Client IP address */
|
|
42
|
+
ipAddress?: string;
|
|
43
|
+
/** ISO 3166-1 alpha-2 country code */
|
|
44
|
+
countryCode?: string;
|
|
45
|
+
/** Request latency in milliseconds */
|
|
46
|
+
latencyMs?: number;
|
|
47
|
+
}
|
|
48
|
+
declare class TelemetryClient {
|
|
49
|
+
private config;
|
|
50
|
+
constructor(config: Required<CencoriConfig>);
|
|
51
|
+
/**
|
|
52
|
+
* Report a web request to the Cencori dashboard.
|
|
53
|
+
*
|
|
54
|
+
* Fire-and-forget — this method never throws and never blocks
|
|
55
|
+
* your application. If the request fails, the error is silently
|
|
56
|
+
* swallowed so it cannot disrupt your app's critical path.
|
|
57
|
+
*
|
|
58
|
+
* @param payload - Web request details to log
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* await cencori.telemetry.reportWebRequest({
|
|
62
|
+
* host: req.headers.get('host') || 'unknown',
|
|
63
|
+
* method: req.method,
|
|
64
|
+
* path: new URL(req.url).pathname,
|
|
65
|
+
* statusCode: response.status,
|
|
66
|
+
* userAgent: req.headers.get('user-agent') || undefined,
|
|
67
|
+
* latencyMs: Date.now() - startTime,
|
|
68
|
+
* });
|
|
69
|
+
*/
|
|
70
|
+
reportWebRequest(payload: WebTelemetryPayload): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { TelemetryClient, type WebTelemetryPayload };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/telemetry/index.ts
|
|
21
|
+
var telemetry_exports = {};
|
|
22
|
+
__export(telemetry_exports, {
|
|
23
|
+
TelemetryClient: () => TelemetryClient
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(telemetry_exports);
|
|
26
|
+
var TelemetryClient = class {
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.config = config;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Report a web request to the Cencori dashboard.
|
|
32
|
+
*
|
|
33
|
+
* Fire-and-forget — this method never throws and never blocks
|
|
34
|
+
* your application. If the request fails, the error is silently
|
|
35
|
+
* swallowed so it cannot disrupt your app's critical path.
|
|
36
|
+
*
|
|
37
|
+
* @param payload - Web request details to log
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* await cencori.telemetry.reportWebRequest({
|
|
41
|
+
* host: req.headers.get('host') || 'unknown',
|
|
42
|
+
* method: req.method,
|
|
43
|
+
* path: new URL(req.url).pathname,
|
|
44
|
+
* statusCode: response.status,
|
|
45
|
+
* userAgent: req.headers.get('user-agent') || undefined,
|
|
46
|
+
* latencyMs: Date.now() - startTime,
|
|
47
|
+
* });
|
|
48
|
+
*/
|
|
49
|
+
async reportWebRequest(payload) {
|
|
50
|
+
try {
|
|
51
|
+
const url = `${this.config.baseUrl}/api/v1/telemetry/web`;
|
|
52
|
+
await fetch(url, {
|
|
53
|
+
method: "POST",
|
|
54
|
+
headers: {
|
|
55
|
+
"Content-Type": "application/json",
|
|
56
|
+
"CENCORI_API_KEY": this.config.apiKey
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify(payload)
|
|
59
|
+
});
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
65
|
+
0 && (module.exports = {
|
|
66
|
+
TelemetryClient
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/telemetry/index.ts"],"sourcesContent":["/**\n * Cencori Telemetry Client\n *\n * Report web traffic from your application to the Cencori dashboard.\n * Logs appear under the project's \"Web Gateway\" tab with your app's\n * real domain as the host.\n *\n * @example\n * const cencori = new Cencori({ apiKey: 'csk_...' });\n *\n * // In your server middleware / API route handler:\n * await cencori.telemetry.reportWebRequest({\n * host: 'dochat-zeta.vercel.app',\n * method: 'GET',\n * path: '/api/chat',\n * statusCode: 200,\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport interface WebTelemetryPayload {\n /** The hostname of your application, e.g. \"dochat-zeta.vercel.app\" */\n host: string;\n /** HTTP method: GET, POST, PUT, DELETE, etc. */\n method: string;\n /** Request path, e.g. \"/api/chat\" */\n path: string;\n /** HTTP status code returned */\n statusCode: number;\n\n /** Optional unique request ID for tracing */\n requestId?: string;\n /** Query string without the leading \"?\" */\n queryString?: string;\n /** Human-readable log message */\n message?: string;\n /** Client User-Agent string */\n userAgent?: string;\n /** Referer header value */\n referer?: string;\n /** Client IP address */\n ipAddress?: string;\n /** ISO 3166-1 alpha-2 country code */\n countryCode?: string;\n /** Request latency in milliseconds */\n latencyMs?: number;\n}\n\nexport class TelemetryClient {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * Report a web request to the Cencori dashboard.\n *\n * Fire-and-forget — this method never throws and never blocks\n * your application. If the request fails, the error is silently\n * swallowed so it cannot disrupt your app's critical path.\n *\n * @param payload - Web request details to log\n *\n * @example\n * await cencori.telemetry.reportWebRequest({\n * host: req.headers.get('host') || 'unknown',\n * method: req.method,\n * path: new URL(req.url).pathname,\n * statusCode: response.status,\n * userAgent: req.headers.get('user-agent') || undefined,\n * latencyMs: Date.now() - startTime,\n * });\n */\n async reportWebRequest(payload: WebTelemetryPayload): Promise<void> {\n try {\n const url = `${this.config.baseUrl}/api/v1/telemetry/web`;\n\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n });\n } catch {\n // Telemetry is best-effort — never disrupt the customer's app.\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDO,IAAM,kBAAN,MAAsB;AAAA,EAGzB,YAAY,QAAiC;AACzC,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,iBAAiB,SAA6C;AAChE,QAAI;AACA,YAAM,MAAM,GAAG,KAAK,OAAO,OAAO;AAElC,YAAM,MAAM,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,mBAAmB,KAAK,OAAO;AAAA,QACnC;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAChC,CAAC;AAAA,IACL,QAAQ;AAAA,IAER;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// src/telemetry/index.ts
|
|
2
|
+
var TelemetryClient = class {
|
|
3
|
+
constructor(config) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Report a web request to the Cencori dashboard.
|
|
8
|
+
*
|
|
9
|
+
* Fire-and-forget — this method never throws and never blocks
|
|
10
|
+
* your application. If the request fails, the error is silently
|
|
11
|
+
* swallowed so it cannot disrupt your app's critical path.
|
|
12
|
+
*
|
|
13
|
+
* @param payload - Web request details to log
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* await cencori.telemetry.reportWebRequest({
|
|
17
|
+
* host: req.headers.get('host') || 'unknown',
|
|
18
|
+
* method: req.method,
|
|
19
|
+
* path: new URL(req.url).pathname,
|
|
20
|
+
* statusCode: response.status,
|
|
21
|
+
* userAgent: req.headers.get('user-agent') || undefined,
|
|
22
|
+
* latencyMs: Date.now() - startTime,
|
|
23
|
+
* });
|
|
24
|
+
*/
|
|
25
|
+
async reportWebRequest(payload) {
|
|
26
|
+
try {
|
|
27
|
+
const url = `${this.config.baseUrl}/api/v1/telemetry/web`;
|
|
28
|
+
await fetch(url, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: {
|
|
31
|
+
"Content-Type": "application/json",
|
|
32
|
+
"CENCORI_API_KEY": this.config.apiKey
|
|
33
|
+
},
|
|
34
|
+
body: JSON.stringify(payload)
|
|
35
|
+
});
|
|
36
|
+
} catch {
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
export {
|
|
41
|
+
TelemetryClient
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/telemetry/index.ts"],"sourcesContent":["/**\n * Cencori Telemetry Client\n *\n * Report web traffic from your application to the Cencori dashboard.\n * Logs appear under the project's \"Web Gateway\" tab with your app's\n * real domain as the host.\n *\n * @example\n * const cencori = new Cencori({ apiKey: 'csk_...' });\n *\n * // In your server middleware / API route handler:\n * await cencori.telemetry.reportWebRequest({\n * host: 'dochat-zeta.vercel.app',\n * method: 'GET',\n * path: '/api/chat',\n * statusCode: 200,\n * });\n */\n\nimport type { CencoriConfig } from '../types';\n\nexport interface WebTelemetryPayload {\n /** The hostname of your application, e.g. \"dochat-zeta.vercel.app\" */\n host: string;\n /** HTTP method: GET, POST, PUT, DELETE, etc. */\n method: string;\n /** Request path, e.g. \"/api/chat\" */\n path: string;\n /** HTTP status code returned */\n statusCode: number;\n\n /** Optional unique request ID for tracing */\n requestId?: string;\n /** Query string without the leading \"?\" */\n queryString?: string;\n /** Human-readable log message */\n message?: string;\n /** Client User-Agent string */\n userAgent?: string;\n /** Referer header value */\n referer?: string;\n /** Client IP address */\n ipAddress?: string;\n /** ISO 3166-1 alpha-2 country code */\n countryCode?: string;\n /** Request latency in milliseconds */\n latencyMs?: number;\n}\n\nexport class TelemetryClient {\n private config: Required<CencoriConfig>;\n\n constructor(config: Required<CencoriConfig>) {\n this.config = config;\n }\n\n /**\n * Report a web request to the Cencori dashboard.\n *\n * Fire-and-forget — this method never throws and never blocks\n * your application. If the request fails, the error is silently\n * swallowed so it cannot disrupt your app's critical path.\n *\n * @param payload - Web request details to log\n *\n * @example\n * await cencori.telemetry.reportWebRequest({\n * host: req.headers.get('host') || 'unknown',\n * method: req.method,\n * path: new URL(req.url).pathname,\n * statusCode: response.status,\n * userAgent: req.headers.get('user-agent') || undefined,\n * latencyMs: Date.now() - startTime,\n * });\n */\n async reportWebRequest(payload: WebTelemetryPayload): Promise<void> {\n try {\n const url = `${this.config.baseUrl}/api/v1/telemetry/web`;\n\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'CENCORI_API_KEY': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n });\n } catch {\n // Telemetry is best-effort — never disrupt the customer's app.\n }\n }\n}\n"],"mappings":";AAiDO,IAAM,kBAAN,MAAsB;AAAA,EAGzB,YAAY,QAAiC;AACzC,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,iBAAiB,SAA6C;AAChE,QAAI;AACA,YAAM,MAAM,GAAG,KAAK,OAAO,OAAO;AAElC,YAAM,MAAM,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,mBAAmB,KAAK,OAAO;AAAA,QACnC;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAChC,CAAC;AAAA,IACL,QAAQ;AAAA,IAER;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -81,6 +81,20 @@ interface ChatRequest {
|
|
|
81
81
|
tools?: ToolDefinition[];
|
|
82
82
|
/** How the model chooses to call tools */
|
|
83
83
|
toolChoice?: ToolChoice;
|
|
84
|
+
/**
|
|
85
|
+
* Reference a named prompt from the Cencori Prompt Registry.
|
|
86
|
+
* When provided, the gateway resolves the active version and
|
|
87
|
+
* injects it as the system message — no need to hardcode prompts.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* prompt: { name: 'support-agent', variables: { tier: 'pro' } }
|
|
91
|
+
*/
|
|
92
|
+
prompt?: {
|
|
93
|
+
/** Prompt name or slug as shown in the dashboard */
|
|
94
|
+
name: string;
|
|
95
|
+
/** Template variables to interpolate (e.g. {{tier}} → 'pro') */
|
|
96
|
+
variables?: Record<string, string>;
|
|
97
|
+
};
|
|
84
98
|
}
|
|
85
99
|
interface ChatResponse {
|
|
86
100
|
id: string;
|
|
@@ -81,6 +81,20 @@ interface ChatRequest {
|
|
|
81
81
|
tools?: ToolDefinition[];
|
|
82
82
|
/** How the model chooses to call tools */
|
|
83
83
|
toolChoice?: ToolChoice;
|
|
84
|
+
/**
|
|
85
|
+
* Reference a named prompt from the Cencori Prompt Registry.
|
|
86
|
+
* When provided, the gateway resolves the active version and
|
|
87
|
+
* injects it as the system message — no need to hardcode prompts.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* prompt: { name: 'support-agent', variables: { tier: 'pro' } }
|
|
91
|
+
*/
|
|
92
|
+
prompt?: {
|
|
93
|
+
/** Prompt name or slug as shown in the dashboard */
|
|
94
|
+
name: string;
|
|
95
|
+
/** Template variables to interpolate (e.g. {{tier}} → 'pro') */
|
|
96
|
+
variables?: Record<string, string>;
|
|
97
|
+
};
|
|
84
98
|
}
|
|
85
99
|
interface ChatResponse {
|
|
86
100
|
id: string;
|
package/dist/workflow/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "cencori",
|
|
4
|
-
"version": "1.0
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"description": "Cencori - The unified infrastructure layer for AI applications. One SDK for AI Gateway, Compute, Workflow, and Storage.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"module": "dist/index.mjs",
|
|
@@ -41,6 +41,11 @@
|
|
|
41
41
|
"types": "./dist/storage/index.d.ts",
|
|
42
42
|
"import": "./dist/storage/index.mjs",
|
|
43
43
|
"require": "./dist/storage/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./telemetry": {
|
|
46
|
+
"types": "./dist/telemetry/index.d.ts",
|
|
47
|
+
"import": "./dist/telemetry/index.mjs",
|
|
48
|
+
"require": "./dist/telemetry/index.js"
|
|
44
49
|
}
|
|
45
50
|
},
|
|
46
51
|
"files": [
|
|
@@ -96,4 +101,4 @@
|
|
|
96
101
|
"tsup": "^8.0.0",
|
|
97
102
|
"typescript": "^5.3.0"
|
|
98
103
|
}
|
|
99
|
-
}
|
|
104
|
+
}
|