assistant-cloud 0.1.43 → 0.2.1
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 +66 -0
- package/dist/AssistantCloud.d.ts +6 -1
- package/dist/AssistantCloud.d.ts.map +1 -1
- package/dist/AssistantCloud.js +13 -5
- package/dist/AssistantCloud.js.map +1 -1
- package/dist/AssistantCloudAPI.d.ts +28 -3
- package/dist/AssistantCloudAPI.d.ts.map +1 -1
- package/dist/AssistantCloudAPI.js +37 -10
- package/dist/AssistantCloudAPI.js.map +1 -1
- package/dist/AssistantCloudAuthStrategy.d.ts +4 -1
- package/dist/AssistantCloudAuthStrategy.d.ts.map +1 -1
- package/dist/AssistantCloudAuthStrategy.js +15 -3
- package/dist/AssistantCloudAuthStrategy.js.map +1 -1
- package/dist/AssistantCloudEvents.d.ts +32 -0
- package/dist/AssistantCloudEvents.d.ts.map +1 -0
- package/dist/AssistantCloudEvents.js +119 -0
- package/dist/AssistantCloudEvents.js.map +1 -0
- package/dist/AssistantCloudFiles.d.ts +12 -1
- package/dist/AssistantCloudFiles.d.ts.map +1 -1
- package/dist/AssistantCloudFiles.js +13 -1
- package/dist/AssistantCloudFiles.js.map +1 -1
- package/dist/AssistantCloudRuns.d.ts +12 -0
- package/dist/AssistantCloudRuns.d.ts.map +1 -1
- package/dist/AssistantCloudRuns.js +2 -1
- package/dist/AssistantCloudRuns.js.map +1 -1
- package/dist/AssistantCloudScores.d.ts +27 -0
- package/dist/AssistantCloudScores.d.ts.map +1 -0
- package/dist/AssistantCloudScores.js +30 -0
- package/dist/AssistantCloudScores.js.map +1 -0
- package/dist/AssistantCloudThreadMessages.d.ts +11 -1
- package/dist/AssistantCloudThreadMessages.d.ts.map +1 -1
- package/dist/AssistantCloudThreadMessages.js +12 -1
- package/dist/AssistantCloudThreadMessages.js.map +1 -1
- package/dist/AssistantCloudThreads.d.ts +8 -0
- package/dist/AssistantCloudThreads.d.ts.map +1 -1
- package/dist/AssistantCloudThreads.js +9 -1
- package/dist/AssistantCloudThreads.js.map +1 -1
- package/dist/CloudEngagementReporter.d.ts +74 -0
- package/dist/CloudEngagementReporter.d.ts.map +1 -0
- package/dist/CloudEngagementReporter.js +132 -0
- package/dist/CloudEngagementReporter.js.map +1 -0
- package/dist/CloudMessagePersistence.d.ts +12 -9
- package/dist/CloudMessagePersistence.d.ts.map +1 -1
- package/dist/CloudMessagePersistence.js +54 -20
- package/dist/CloudMessagePersistence.js.map +1 -1
- package/dist/CloudRunReporter.d.ts +20 -0
- package/dist/CloudRunReporter.d.ts.map +1 -0
- package/dist/CloudRunReporter.js +38 -0
- package/dist/CloudRunReporter.js.map +1 -0
- package/dist/FormattedCloudPersistence.d.ts +3 -8
- package/dist/FormattedCloudPersistence.d.ts.map +1 -1
- package/dist/FormattedCloudPersistence.js +3 -8
- package/dist/FormattedCloudPersistence.js.map +1 -1
- package/dist/ai-sdk/index.d.ts +33 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +147 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/cloudResponse.d.ts +4 -1
- package/dist/cloudResponse.d.ts.map +1 -1
- package/dist/cloudResponse.js +14 -1
- package/dist/cloudResponse.js.map +1 -1
- package/dist/generateThreadTitle.js +1 -0
- package/dist/generateThreadTitle.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.js +7 -2
- package/dist/instrumentMcpSampling.d.ts.map +1 -1
- package/dist/instrumentMcpSampling.js +12 -2
- package/dist/instrumentMcpSampling.js.map +1 -1
- package/dist/runTelemetry.d.ts +86 -7
- package/dist/runTelemetry.d.ts.map +1 -1
- package/dist/runTelemetry.js +144 -1
- package/dist/runTelemetry.js.map +1 -1
- package/dist/telemetry/index.d.ts +32 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +62 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +43 -6
- package/src/AssistantCloud.ts +23 -8
- package/src/AssistantCloudAPI.ts +72 -10
- package/src/AssistantCloudAuthStrategy.ts +17 -2
- package/src/AssistantCloudEvents.test.ts +149 -0
- package/src/AssistantCloudEvents.ts +190 -0
- package/src/AssistantCloudFiles.test.ts +59 -0
- package/src/AssistantCloudFiles.ts +39 -0
- package/src/AssistantCloudRuns.ts +13 -1
- package/src/AssistantCloudScores.test.ts +113 -0
- package/src/AssistantCloudScores.ts +61 -0
- package/src/AssistantCloudThreadMessages.test.ts +51 -0
- package/src/AssistantCloudThreadMessages.ts +33 -0
- package/src/AssistantCloudThreads.test.ts +21 -0
- package/src/AssistantCloudThreads.ts +21 -0
- package/src/CloudEngagementReporter.ts +231 -0
- package/src/CloudMessagePersistence.ts +70 -27
- package/src/CloudRunReporter.ts +38 -0
- package/src/FormattedCloudPersistence.ts +3 -8
- package/src/ai-sdk/index.test.ts +258 -0
- package/src/ai-sdk/index.ts +222 -0
- package/src/cloudResponse.test.ts +34 -1
- package/src/cloudResponse.ts +30 -0
- package/src/generateThreadTitle.test.ts +32 -0
- package/src/generateThreadTitle.ts +1 -0
- package/src/index.ts +35 -2
- package/src/instrumentMcpSampling.test.ts +102 -0
- package/src/instrumentMcpSampling.ts +16 -2
- package/src/runTelemetry.test.ts +325 -0
- package/src/runTelemetry.ts +274 -6
- package/src/telemetry/index.test.ts +252 -0
- package/src/telemetry/index.ts +98 -0
- package/src/tests/AssistantCloud.test.ts +55 -1
- package/src/tests/AssistantCloudAPI.test.ts +95 -4
- package/src/tests/AssistantCloudAuthStrategy.test.ts +93 -2
- package/src/tests/AssistantCloudProjects.test.ts +1 -5
- package/src/tests/CloudEngagementReporter.test.ts +184 -0
- package/src/tests/CloudMessagePersistence.test.ts +350 -0
- package/src/tests/CloudRunReporter.test.ts +100 -0
- package/src/version.ts +4 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { createRunTelemetryToolCall, extractRunTelemetryModelId, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "../runTelemetry.js";
|
|
2
|
+
//#region src/ai-sdk/index.ts
|
|
3
|
+
/** The stored form of an AI SDK message: the message without its id. */
|
|
4
|
+
const aiSDKV6FormatAdapter = {
|
|
5
|
+
format: "ai-sdk/v6",
|
|
6
|
+
encode: ({ message: { id: _id, ...message } }) => message,
|
|
7
|
+
decode: (stored) => ({
|
|
8
|
+
parentId: stored.parent_id,
|
|
9
|
+
message: {
|
|
10
|
+
id: stored.id,
|
|
11
|
+
...stored.content
|
|
12
|
+
}
|
|
13
|
+
}),
|
|
14
|
+
getId: (message) => message.id
|
|
15
|
+
};
|
|
16
|
+
function isRecord(value) {
|
|
17
|
+
return value !== null && typeof value === "object";
|
|
18
|
+
}
|
|
19
|
+
function isPart(value) {
|
|
20
|
+
return isRecord(value) && typeof value.type === "string";
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The AI SDK's own tool part rules, kept here so the entry loads without the
|
|
24
|
+
* `ai` runtime: a static tool part is `tool-<name>`, a dynamic one is
|
|
25
|
+
* `dynamic-tool` with its name in `toolName`.
|
|
26
|
+
*/
|
|
27
|
+
function toolCallOf(part) {
|
|
28
|
+
if (typeof part.toolCallId !== "string") return void 0;
|
|
29
|
+
const isStatic = part.type.startsWith("tool-");
|
|
30
|
+
if (!isStatic && part.type !== "dynamic-tool") return void 0;
|
|
31
|
+
const toolName = isStatic ? part.type.slice(5) : typeof part.toolName === "string" ? part.toolName : void 0;
|
|
32
|
+
if (!toolName) return void 0;
|
|
33
|
+
return createRunTelemetryToolCall({
|
|
34
|
+
toolName,
|
|
35
|
+
toolCallId: part.toolCallId,
|
|
36
|
+
args: part.input ?? part.args,
|
|
37
|
+
result: part.output ?? part.result,
|
|
38
|
+
toolSource: isStatic ? "frontend" : "mcp"
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function attachSamplingCalls(toolCalls, metadata) {
|
|
42
|
+
const samplingCalls = isRecord(metadata?.samplingCalls) ? metadata.samplingCalls : void 0;
|
|
43
|
+
if (!samplingCalls) return;
|
|
44
|
+
for (const toolCall of toolCalls) {
|
|
45
|
+
const calls = samplingCalls[toolCall.tool_call_id];
|
|
46
|
+
if (Array.isArray(calls) && calls.length > 0) toolCall.sampling_calls = calls;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function stepUsages(metadata) {
|
|
50
|
+
const steps = metadata?.steps;
|
|
51
|
+
if (!Array.isArray(steps)) return [];
|
|
52
|
+
return steps.map((step) => isRecord(step) && isRecord(step.usage) ? step.usage : void 0);
|
|
53
|
+
}
|
|
54
|
+
function sumUsage(usages) {
|
|
55
|
+
const total = {};
|
|
56
|
+
for (const usage of usages) {
|
|
57
|
+
if (usage.inputTokens != null) total.inputTokens = (total.inputTokens ?? 0) + usage.inputTokens;
|
|
58
|
+
if (usage.outputTokens != null) total.outputTokens = (total.outputTokens ?? 0) + usage.outputTokens;
|
|
59
|
+
if (usage.reasoningTokens != null) total.reasoningTokens = (total.reasoningTokens ?? 0) + usage.reasoningTokens;
|
|
60
|
+
if (usage.cachedInputTokens != null) total.cachedInputTokens = (total.cachedInputTokens ?? 0) + usage.cachedInputTokens;
|
|
61
|
+
}
|
|
62
|
+
return total;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The usage a message reports: `metadata.usage` when the integration copied
|
|
66
|
+
* the run total there, else the sum over `metadata.steps[].usage`.
|
|
67
|
+
*/
|
|
68
|
+
function messageUsage(metadata) {
|
|
69
|
+
const total = isRecord(metadata?.usage) ? normalizeRunTelemetryUsage(metadata.usage) : void 0;
|
|
70
|
+
if (total) return total;
|
|
71
|
+
const perStep = stepUsages(metadata).flatMap((usage) => {
|
|
72
|
+
const normalized = usage ? normalizeRunTelemetryUsage(usage) : void 0;
|
|
73
|
+
return normalized ? [normalized] : [];
|
|
74
|
+
});
|
|
75
|
+
return perStep.length > 0 ? sumUsage(perStep) : void 0;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Reads the run report fields out of the assistant messages of one run. A run
|
|
79
|
+
* the AI SDK streamed as one message is one element; a run the cloud stored as
|
|
80
|
+
* several assistant rows is aggregated, step by step, in order. Returns null
|
|
81
|
+
* when no assistant message is present. Status reads completed when the run
|
|
82
|
+
* produced text or tool calls, as a live finish with reason `tool-calls` does;
|
|
83
|
+
* an integration that observed the finish event overrides it.
|
|
84
|
+
*/
|
|
85
|
+
function extractAISDKRunTelemetry(messages) {
|
|
86
|
+
const textParts = [];
|
|
87
|
+
const toolCalls = [];
|
|
88
|
+
const steps = [];
|
|
89
|
+
const usages = [];
|
|
90
|
+
let assistant;
|
|
91
|
+
for (const message of messages) {
|
|
92
|
+
if (message.role !== "assistant") continue;
|
|
93
|
+
assistant = message;
|
|
94
|
+
const metadata = isRecord(message.metadata) ? message.metadata : void 0;
|
|
95
|
+
const usagePerStep = stepUsages(metadata);
|
|
96
|
+
const messageToolCalls = [];
|
|
97
|
+
let step;
|
|
98
|
+
let stepIndex = -1;
|
|
99
|
+
for (const part of message.parts) {
|
|
100
|
+
if (!isPart(part)) continue;
|
|
101
|
+
if (part.type === "step-start") {
|
|
102
|
+
stepIndex += 1;
|
|
103
|
+
const usage = usagePerStep[stepIndex];
|
|
104
|
+
step = usage ? { usage } : {};
|
|
105
|
+
steps.push(step);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (part.type === "text" && typeof part.text === "string" && part.text) {
|
|
109
|
+
textParts.push(part.text);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const toolCall = toolCallOf(part);
|
|
113
|
+
if (!toolCall) continue;
|
|
114
|
+
toolCalls.push(toolCall);
|
|
115
|
+
messageToolCalls.push(toolCall);
|
|
116
|
+
if (step) {
|
|
117
|
+
step.toolCalls = [...step.toolCalls ?? [], toolCall];
|
|
118
|
+
step.finishReason = "tool-calls";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
attachSamplingCalls(messageToolCalls, metadata);
|
|
122
|
+
const usage = messageUsage(metadata);
|
|
123
|
+
if (usage) usages.push(usage);
|
|
124
|
+
}
|
|
125
|
+
if (!assistant) return null;
|
|
126
|
+
const metadata = isRecord(assistant.metadata) ? assistant.metadata : void 0;
|
|
127
|
+
const usage = usages.length > 0 ? sumUsage(usages) : void 0;
|
|
128
|
+
const modelId = extractRunTelemetryModelId(metadata);
|
|
129
|
+
const completed = textParts.length > 0 || toolCalls.length > 0;
|
|
130
|
+
return {
|
|
131
|
+
...assistant.id !== void 0 ? { assistantMessageId: assistant.id } : void 0,
|
|
132
|
+
status: completed ? "completed" : "incomplete",
|
|
133
|
+
...toolCalls.length > 0 ? { toolCalls } : void 0,
|
|
134
|
+
...steps.length > 0 ? {
|
|
135
|
+
steps,
|
|
136
|
+
totalSteps: steps.length
|
|
137
|
+
} : void 0,
|
|
138
|
+
...textParts.length > 0 ? { outputText: truncateRunTelemetryText(textParts.join("")) } : void 0,
|
|
139
|
+
...usage ? { usage } : void 0,
|
|
140
|
+
...modelId ? { modelId } : void 0,
|
|
141
|
+
...metadata ? { metadata } : void 0
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//#endregion
|
|
145
|
+
export { aiSDKV6FormatAdapter, extractAISDKRunTelemetry };
|
|
146
|
+
|
|
147
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/ai-sdk/index.ts"],"sourcesContent":["import type { UIMessage } from \"ai\";\nimport type { MessageFormatAdapter } from \"../FormattedCloudPersistence\";\nimport type { SamplingCallData } from \"../instrumentMcpSampling\";\nimport {\n type AssistantCloudRunReportToolCall,\n createRunTelemetryToolCall,\n extractRunTelemetryModelId,\n normalizeRunTelemetryUsage,\n type RunMessageTelemetry,\n type RunReportStepInit,\n type RunTelemetryUsage,\n type RunTelemetryUsageInit,\n truncateRunTelemetryText,\n} from \"../runTelemetry\";\n\nexport type AISDKStorageFormat = Omit<UIMessage, \"id\">;\n\n/** The stored form of an AI SDK message: the message without its id. */\nexport const aiSDKV6FormatAdapter: MessageFormatAdapter<\n UIMessage,\n AISDKStorageFormat\n> = {\n format: \"ai-sdk/v6\",\n encode: ({ message: { id: _id, ...message } }) => message,\n decode: (stored) => ({\n parentId: stored.parent_id,\n message: { id: stored.id, ...stored.content } as UIMessage,\n }),\n getId: (message) => message.id,\n};\n\n/**\n * A message as an AI SDK integration holds it, or as the cloud stored it under\n * the ai-sdk/v6 format, which drops the id. Parts are typed by their `type`\n * alone, so this shape and the telemetry read from it need nothing from `ai`.\n */\nexport type AISDKMessageLike = {\n id?: string | undefined;\n role: string;\n parts: readonly { type: string; [key: string]: unknown }[];\n metadata?: unknown;\n};\n\ntype Part = Record<string, unknown> & { type: string };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction isPart(value: unknown): value is Part {\n return isRecord(value) && typeof value.type === \"string\";\n}\n\n/**\n * The AI SDK's own tool part rules, kept here so the entry loads without the\n * `ai` runtime: a static tool part is `tool-<name>`, a dynamic one is\n * `dynamic-tool` with its name in `toolName`.\n */\nfunction toolCallOf(part: Part): AssistantCloudRunReportToolCall | undefined {\n if (typeof part.toolCallId !== \"string\") return undefined;\n const isStatic = part.type.startsWith(\"tool-\");\n if (!isStatic && part.type !== \"dynamic-tool\") return undefined;\n const toolName = isStatic\n ? part.type.slice(\"tool-\".length)\n : typeof part.toolName === \"string\"\n ? part.toolName\n : undefined;\n if (!toolName) return undefined;\n return createRunTelemetryToolCall({\n toolName,\n toolCallId: part.toolCallId,\n args: part.input ?? part.args,\n result: part.output ?? part.result,\n toolSource: isStatic ? \"frontend\" : \"mcp\",\n });\n}\n\nfunction attachSamplingCalls(\n toolCalls: readonly AssistantCloudRunReportToolCall[],\n metadata: Record<string, unknown> | undefined,\n): void {\n const samplingCalls = isRecord(metadata?.samplingCalls)\n ? (metadata.samplingCalls as Record<string, SamplingCallData[]>)\n : undefined;\n if (!samplingCalls) return;\n for (const toolCall of toolCalls) {\n const calls = samplingCalls[toolCall.tool_call_id];\n if (Array.isArray(calls) && calls.length > 0) {\n toolCall.sampling_calls = calls;\n }\n }\n}\n\nfunction stepUsages(\n metadata: Record<string, unknown> | undefined,\n): (RunTelemetryUsageInit | undefined)[] {\n const steps = metadata?.steps;\n if (!Array.isArray(steps)) return [];\n return steps.map((step) =>\n isRecord(step) && isRecord(step.usage)\n ? (step.usage as RunTelemetryUsageInit)\n : undefined,\n );\n}\n\nfunction sumUsage(usages: readonly RunTelemetryUsage[]): RunTelemetryUsage {\n const total: RunTelemetryUsage = {};\n for (const usage of usages) {\n if (usage.inputTokens != null) {\n total.inputTokens = (total.inputTokens ?? 0) + usage.inputTokens;\n }\n if (usage.outputTokens != null) {\n total.outputTokens = (total.outputTokens ?? 0) + usage.outputTokens;\n }\n if (usage.reasoningTokens != null) {\n total.reasoningTokens =\n (total.reasoningTokens ?? 0) + usage.reasoningTokens;\n }\n if (usage.cachedInputTokens != null) {\n total.cachedInputTokens =\n (total.cachedInputTokens ?? 0) + usage.cachedInputTokens;\n }\n }\n return total;\n}\n\n/**\n * The usage a message reports: `metadata.usage` when the integration copied\n * the run total there, else the sum over `metadata.steps[].usage`.\n */\nfunction messageUsage(\n metadata: Record<string, unknown> | undefined,\n): RunTelemetryUsage | undefined {\n const total = isRecord(metadata?.usage)\n ? normalizeRunTelemetryUsage(metadata.usage as RunTelemetryUsageInit)\n : undefined;\n if (total) return total;\n const perStep = stepUsages(metadata).flatMap((usage) => {\n const normalized = usage ? normalizeRunTelemetryUsage(usage) : undefined;\n return normalized ? [normalized] : [];\n });\n return perStep.length > 0 ? sumUsage(perStep) : undefined;\n}\n\n/**\n * Reads the run report fields out of the assistant messages of one run. A run\n * the AI SDK streamed as one message is one element; a run the cloud stored as\n * several assistant rows is aggregated, step by step, in order. Returns null\n * when no assistant message is present. Status reads completed when the run\n * produced text or tool calls, as a live finish with reason `tool-calls` does;\n * an integration that observed the finish event overrides it.\n */\nexport function extractAISDKRunTelemetry(\n messages: readonly AISDKMessageLike[],\n): RunMessageTelemetry | null {\n const textParts: string[] = [];\n const toolCalls: AssistantCloudRunReportToolCall[] = [];\n const steps: RunReportStepInit[] = [];\n const usages: RunTelemetryUsage[] = [];\n let assistant: AISDKMessageLike | undefined;\n\n for (const message of messages) {\n if (message.role !== \"assistant\") continue;\n assistant = message;\n const metadata = isRecord(message.metadata) ? message.metadata : undefined;\n const usagePerStep = stepUsages(metadata);\n const messageToolCalls: AssistantCloudRunReportToolCall[] = [];\n let step: RunReportStepInit | undefined;\n let stepIndex = -1;\n\n for (const part of message.parts) {\n if (!isPart(part)) continue;\n if (part.type === \"step-start\") {\n stepIndex += 1;\n const usage = usagePerStep[stepIndex];\n step = usage ? { usage } : {};\n steps.push(step);\n continue;\n }\n if (part.type === \"text\" && typeof part.text === \"string\" && part.text) {\n textParts.push(part.text);\n continue;\n }\n const toolCall = toolCallOf(part);\n if (!toolCall) continue;\n toolCalls.push(toolCall);\n messageToolCalls.push(toolCall);\n if (step) {\n step.toolCalls = [...(step.toolCalls ?? []), toolCall];\n step.finishReason = \"tool-calls\";\n }\n }\n\n attachSamplingCalls(messageToolCalls, metadata);\n const usage = messageUsage(metadata);\n if (usage) usages.push(usage);\n }\n\n if (!assistant) return null;\n\n const metadata = isRecord(assistant.metadata)\n ? assistant.metadata\n : undefined;\n\n const usage = usages.length > 0 ? sumUsage(usages) : undefined;\n const modelId = extractRunTelemetryModelId(metadata);\n const completed = textParts.length > 0 || toolCalls.length > 0;\n return {\n ...(assistant.id !== undefined\n ? { assistantMessageId: assistant.id }\n : undefined),\n status: completed ? \"completed\" : \"incomplete\",\n ...(toolCalls.length > 0 ? { toolCalls } : undefined),\n ...(steps.length > 0 ? { steps, totalSteps: steps.length } : undefined),\n ...(textParts.length > 0\n ? { outputText: truncateRunTelemetryText(textParts.join(\"\")) }\n : undefined),\n ...(usage ? { usage } : undefined),\n ...(modelId ? { modelId } : undefined),\n ...(metadata ? { metadata } : undefined),\n };\n}\n"],"mappings":"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"}
|
package/dist/cloudResponse.d.ts
CHANGED
|
@@ -6,11 +6,14 @@ declare class CloudResponseError extends Error {
|
|
|
6
6
|
declare const readCloudRecord: (value: unknown, field: string) => Record<string, unknown>;
|
|
7
7
|
declare const readCloudArray: (value: unknown, field: string) => unknown[];
|
|
8
8
|
declare const readCloudString: (value: unknown, field: string) => string;
|
|
9
|
+
declare const readCloudNumber: (value: unknown, field: string) => number;
|
|
10
|
+
declare const readCloudNullableNumber: (value: unknown, field: string) => number | null;
|
|
11
|
+
declare const readCloudEnum: <const T extends readonly string[]>(value: unknown, field: string, allowed: T) => T[number];
|
|
9
12
|
declare const readCloudNullableString: (value: unknown, field: string) => string | null;
|
|
10
13
|
declare const readCloudBoolean: (value: unknown, field: string) => boolean;
|
|
11
14
|
declare const readCloudInteger: (value: unknown, field: string) => number;
|
|
12
15
|
declare const readCloudTimestamp: (value: unknown, field: string) => Date;
|
|
13
16
|
declare const readCloudJSONObject: (value: unknown, field: string) => ReadonlyJSONObject;
|
|
14
17
|
//#endregion
|
|
15
|
-
export { CloudResponseError, readCloudArray, readCloudBoolean, readCloudInteger, readCloudJSONObject, readCloudNullableString, readCloudRecord, readCloudString, readCloudTimestamp };
|
|
18
|
+
export { CloudResponseError, readCloudArray, readCloudBoolean, readCloudEnum, readCloudInteger, readCloudJSONObject, readCloudNullableNumber, readCloudNullableString, readCloudNumber, readCloudRecord, readCloudString, readCloudTimestamp };
|
|
16
19
|
//# sourceMappingURL=cloudResponse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudResponse.d.ts","names":[],"sources":["../src/cloudResponse.ts"],"mappings":";;cAEa,2BAA2B;EAC1B,YAAA;;cAWD,kBACX,gBACA,kBACC;cAOU,iBAAkB,gBAAgB;cAKlC,kBAAmB,gBAAgB;cAKnC,0BACX,gBACA;cAMW,mBAAoB,gBAAgB;cAOpC,mBAAoB,gBAAgB;cAKpC,qBAAsB,gBAAgB,kBAAgB;cActD,sBACX,gBACA,kBACC"}
|
|
1
|
+
{"version":3,"file":"cloudResponse.d.ts","names":[],"sources":["../src/cloudResponse.ts"],"mappings":";;cAEa,2BAA2B;EAC1B,YAAA;;cAWD,kBACX,gBACA,kBACC;cAOU,iBAAkB,gBAAgB;cAKlC,kBAAmB,gBAAgB;cAKnC,kBAAmB,gBAAgB;cAOnC,0BACX,gBACA;cAMW,sBAAuB,6BAClC,gBACA,eACA,SAAS,MACR;cAWU,0BACX,gBACA;cAMW,mBAAoB,gBAAgB;cAOpC,mBAAoB,gBAAgB;cAKpC,qBAAsB,gBAAgB,kBAAgB;cActD,sBACX,gBACA,kBACC"}
|
package/dist/cloudResponse.js
CHANGED
|
@@ -18,6 +18,19 @@ const readCloudString = (value, field) => {
|
|
|
18
18
|
if (typeof value !== "string") throw invalidCloudResponse(field, "a string");
|
|
19
19
|
return value;
|
|
20
20
|
};
|
|
21
|
+
const readCloudNumber = (value, field) => {
|
|
22
|
+
if (typeof value !== "number" || !Number.isFinite(value)) throw invalidCloudResponse(field, "a number");
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
const readCloudNullableNumber = (value, field) => {
|
|
26
|
+
if (value === null) return null;
|
|
27
|
+
return readCloudNumber(value, field);
|
|
28
|
+
};
|
|
29
|
+
const readCloudEnum = (value, field, allowed) => {
|
|
30
|
+
const text = readCloudString(value, field);
|
|
31
|
+
if (!allowed.includes(text)) throw invalidCloudResponse(field, `one of ${allowed.map((entry) => `"${entry}"`).join(", ")}`);
|
|
32
|
+
return text;
|
|
33
|
+
};
|
|
21
34
|
const readCloudNullableString = (value, field) => {
|
|
22
35
|
if (value === null) return null;
|
|
23
36
|
return readCloudString(value, field);
|
|
@@ -38,6 +51,6 @@ const readCloudTimestamp = (value, field) => {
|
|
|
38
51
|
};
|
|
39
52
|
const readCloudJSONObject = (value, field) => readCloudRecord(value, field);
|
|
40
53
|
//#endregion
|
|
41
|
-
export { CloudResponseError, readCloudArray, readCloudBoolean, readCloudInteger, readCloudJSONObject, readCloudNullableString, readCloudRecord, readCloudString, readCloudTimestamp };
|
|
54
|
+
export { CloudResponseError, readCloudArray, readCloudBoolean, readCloudEnum, readCloudInteger, readCloudJSONObject, readCloudNullableNumber, readCloudNullableString, readCloudNumber, readCloudRecord, readCloudString, readCloudTimestamp };
|
|
42
55
|
|
|
43
56
|
//# sourceMappingURL=cloudResponse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudResponse.js","names":[],"sources":["../src/cloudResponse.ts"],"sourcesContent":["import type { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\nexport class CloudResponseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CloudResponseError\";\n }\n}\n\nconst invalidCloudResponse = (field: string, expected: string) =>\n new CloudResponseError(\n `Invalid Assistant Cloud response for \"${field}\": expected ${expected}`,\n );\n\nexport const readCloudRecord = (\n value: unknown,\n field: string,\n): Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw invalidCloudResponse(field, \"an object\");\n }\n return value as Record<string, unknown>;\n};\n\nexport const readCloudArray = (value: unknown, field: string): unknown[] => {\n if (!Array.isArray(value)) throw invalidCloudResponse(field, \"an array\");\n return value;\n};\n\nexport const readCloudString = (value: unknown, field: string): string => {\n if (typeof value !== \"string\") throw invalidCloudResponse(field, \"a string\");\n return value;\n};\n\nexport const readCloudNullableString = (\n value: unknown,\n field: string,\n): string | null => {\n if (value === null) return null;\n return readCloudString(value, field);\n};\n\nexport const readCloudBoolean = (value: unknown, field: string): boolean => {\n if (typeof value !== \"boolean\") {\n throw invalidCloudResponse(field, \"a boolean\");\n }\n return value;\n};\n\nexport const readCloudInteger = (value: unknown, field: string): number => {\n if (!Number.isInteger(value)) throw invalidCloudResponse(field, \"an integer\");\n return value as number;\n};\n\nexport const readCloudTimestamp = (value: unknown, field: string): Date => {\n if (typeof value !== \"string\") {\n throw invalidCloudResponse(field, \"a canonical ISO timestamp\");\n }\n\n const date = new Date(value);\n // The round trip pins the backend DTO's Date#toISOString() wire contract.\n if (Number.isNaN(date.getTime()) || date.toISOString() !== value) {\n throw invalidCloudResponse(field, \"a canonical ISO timestamp\");\n }\n\n return date;\n};\n\nexport const readCloudJSONObject = (\n value: unknown,\n field: string,\n): ReadonlyJSONObject => readCloudRecord(value, field) as ReadonlyJSONObject;\n"],"mappings":";AAEA,IAAa,qBAAb,cAAwC,MAAM;CAC5C,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,KAAK,OAAO;CACd;AACF;AAEA,MAAM,wBAAwB,OAAe,aAC3C,IAAI,mBACF,yCAAyC,MAAM,cAAc,UAC/D;AAEF,MAAa,mBACX,OACA,UAC4B;CAC5B,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,qBAAqB,OAAO,WAAW;CAE/C,OAAO;AACT;AAEA,MAAa,kBAAkB,OAAgB,UAA6B;CAC1E,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,MAAM,qBAAqB,OAAO,UAAU;CACvE,OAAO;AACT;AAEA,MAAa,mBAAmB,OAAgB,UAA0B;CACxE,IAAI,OAAO,UAAU,UAAU,MAAM,qBAAqB,OAAO,UAAU;CAC3E,OAAO;AACT;AAEA,MAAa,2BACX,OACA,UACkB;CAClB,IAAI,UAAU,MAAM,OAAO;CAC3B,OAAO,gBAAgB,OAAO,KAAK;AACrC;AAEA,MAAa,oBAAoB,OAAgB,UAA2B;CAC1E,IAAI,OAAO,UAAU,WACnB,MAAM,qBAAqB,OAAO,WAAW;CAE/C,OAAO;AACT;AAEA,MAAa,oBAAoB,OAAgB,UAA0B;CACzE,IAAI,CAAC,OAAO,UAAU,KAAK,GAAG,MAAM,qBAAqB,OAAO,YAAY;CAC5E,OAAO;AACT;AAEA,MAAa,sBAAsB,OAAgB,UAAwB;CACzE,IAAI,OAAO,UAAU,UACnB,MAAM,qBAAqB,OAAO,2BAA2B;CAG/D,MAAM,OAAO,IAAI,KAAK,KAAK;CAE3B,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,YAAY,MAAM,OACzD,MAAM,qBAAqB,OAAO,2BAA2B;CAG/D,OAAO;AACT;AAEA,MAAa,uBACX,OACA,UACuB,gBAAgB,OAAO,KAAK"}
|
|
1
|
+
{"version":3,"file":"cloudResponse.js","names":[],"sources":["../src/cloudResponse.ts"],"sourcesContent":["import type { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\nexport class CloudResponseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CloudResponseError\";\n }\n}\n\nconst invalidCloudResponse = (field: string, expected: string) =>\n new CloudResponseError(\n `Invalid Assistant Cloud response for \"${field}\": expected ${expected}`,\n );\n\nexport const readCloudRecord = (\n value: unknown,\n field: string,\n): Record<string, unknown> => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw invalidCloudResponse(field, \"an object\");\n }\n return value as Record<string, unknown>;\n};\n\nexport const readCloudArray = (value: unknown, field: string): unknown[] => {\n if (!Array.isArray(value)) throw invalidCloudResponse(field, \"an array\");\n return value;\n};\n\nexport const readCloudString = (value: unknown, field: string): string => {\n if (typeof value !== \"string\") throw invalidCloudResponse(field, \"a string\");\n return value;\n};\n\nexport const readCloudNumber = (value: unknown, field: string): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw invalidCloudResponse(field, \"a number\");\n }\n return value;\n};\n\nexport const readCloudNullableNumber = (\n value: unknown,\n field: string,\n): number | null => {\n if (value === null) return null;\n return readCloudNumber(value, field);\n};\n\nexport const readCloudEnum = <const T extends readonly string[]>(\n value: unknown,\n field: string,\n allowed: T,\n): T[number] => {\n const text = readCloudString(value, field);\n if (!allowed.includes(text)) {\n throw invalidCloudResponse(\n field,\n `one of ${allowed.map((entry) => `\"${entry}\"`).join(\", \")}`,\n );\n }\n return text;\n};\n\nexport const readCloudNullableString = (\n value: unknown,\n field: string,\n): string | null => {\n if (value === null) return null;\n return readCloudString(value, field);\n};\n\nexport const readCloudBoolean = (value: unknown, field: string): boolean => {\n if (typeof value !== \"boolean\") {\n throw invalidCloudResponse(field, \"a boolean\");\n }\n return value;\n};\n\nexport const readCloudInteger = (value: unknown, field: string): number => {\n if (!Number.isInteger(value)) throw invalidCloudResponse(field, \"an integer\");\n return value as number;\n};\n\nexport const readCloudTimestamp = (value: unknown, field: string): Date => {\n if (typeof value !== \"string\") {\n throw invalidCloudResponse(field, \"a canonical ISO timestamp\");\n }\n\n const date = new Date(value);\n // The round trip pins the backend DTO's Date#toISOString() wire contract.\n if (Number.isNaN(date.getTime()) || date.toISOString() !== value) {\n throw invalidCloudResponse(field, \"a canonical ISO timestamp\");\n }\n\n return date;\n};\n\nexport const readCloudJSONObject = (\n value: unknown,\n field: string,\n): ReadonlyJSONObject => readCloudRecord(value, field) as ReadonlyJSONObject;\n"],"mappings":";AAEA,IAAa,qBAAb,cAAwC,MAAM;CAC5C,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,KAAK,OAAO;CACd;AACF;AAEA,MAAM,wBAAwB,OAAe,aAC3C,IAAI,mBACF,yCAAyC,MAAM,cAAc,UAC/D;AAEF,MAAa,mBACX,OACA,UAC4B;CAC5B,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,qBAAqB,OAAO,WAAW;CAE/C,OAAO;AACT;AAEA,MAAa,kBAAkB,OAAgB,UAA6B;CAC1E,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,MAAM,qBAAqB,OAAO,UAAU;CACvE,OAAO;AACT;AAEA,MAAa,mBAAmB,OAAgB,UAA0B;CACxE,IAAI,OAAO,UAAU,UAAU,MAAM,qBAAqB,OAAO,UAAU;CAC3E,OAAO;AACT;AAEA,MAAa,mBAAmB,OAAgB,UAA0B;CACxE,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GACrD,MAAM,qBAAqB,OAAO,UAAU;CAE9C,OAAO;AACT;AAEA,MAAa,2BACX,OACA,UACkB;CAClB,IAAI,UAAU,MAAM,OAAO;CAC3B,OAAO,gBAAgB,OAAO,KAAK;AACrC;AAEA,MAAa,iBACX,OACA,OACA,YACc;CACd,MAAM,OAAO,gBAAgB,OAAO,KAAK;CACzC,IAAI,CAAC,QAAQ,SAAS,IAAI,GACxB,MAAM,qBACJ,OACA,UAAU,QAAQ,KAAK,UAAU,IAAI,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,GAC1D;CAEF,OAAO;AACT;AAEA,MAAa,2BACX,OACA,UACkB;CAClB,IAAI,UAAU,MAAM,OAAO;CAC3B,OAAO,gBAAgB,OAAO,KAAK;AACrC;AAEA,MAAa,oBAAoB,OAAgB,UAA2B;CAC1E,IAAI,OAAO,UAAU,WACnB,MAAM,qBAAqB,OAAO,WAAW;CAE/C,OAAO;AACT;AAEA,MAAa,oBAAoB,OAAgB,UAA0B;CACzE,IAAI,CAAC,OAAO,UAAU,KAAK,GAAG,MAAM,qBAAqB,OAAO,YAAY;CAC5E,OAAO;AACT;AAEA,MAAa,sBAAsB,OAAgB,UAAwB;CACzE,IAAI,OAAO,UAAU,UACnB,MAAM,qBAAqB,OAAO,2BAA2B;CAG/D,MAAM,OAAO,IAAI,KAAK,KAAK;CAE3B,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,YAAY,MAAM,OACzD,MAAM,qBAAqB,OAAO,2BAA2B;CAG/D,OAAO;AACT;AAEA,MAAa,uBACX,OACA,UACuB,gBAAgB,OAAO,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateThreadTitle.js","names":[],"sources":["../src/generateThreadTitle.ts"],"sourcesContent":["import type { AssistantCloud } from \"./AssistantCloud\";\n\nexport async function generateThreadTitle(\n cloud: AssistantCloud,\n options: {\n threadId: string;\n messages: readonly {\n role: string;\n content: readonly { type: \"text\"; text: string }[];\n }[];\n },\n): Promise<string | null> {\n const stream = await cloud.runs.stream({\n thread_id: options.threadId,\n assistant_id: \"system/thread_title\",\n messages: options.messages,\n });\n\n let title = \"\";\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value: chunk } = await reader.read();\n if (done) break;\n if (chunk.type === \"text-delta\") {\n title += chunk.textDelta;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (title) {\n await cloud.threads.update(options.threadId, { title });\n }\n\n return title || null;\n}\n"],"mappings":";AAEA,eAAsB,oBACpB,OACA,SAOwB;CACxB,MAAM,SAAS,MAAM,MAAM,KAAK,OAAO;EACrC,WAAW,QAAQ;EACnB,cAAc;EACd,UAAU,QAAQ;CACpB,CAAC;CAED,IAAI,QAAQ;CACZ,MAAM,SAAS,OAAO,UAAU;CAChC,IAAI;EACF,OAAO,MAAM;GACX,MAAM,EAAE,MAAM,OAAO,UAAU,MAAM,OAAO,KAAK;GACjD,IAAI,MAAM;GACV,IAAI,MAAM,SAAS,cACjB,SAAS,MAAM;EAEnB;CACF,UAAU;EACR,OAAO,YAAY;CACrB;CAEA,IAAI,OACF,MAAM,MAAM,QAAQ,OAAO,QAAQ,UAAU,EAAE,MAAM,CAAC;CAGxD,OAAO,SAAS;AAClB"}
|
|
1
|
+
{"version":3,"file":"generateThreadTitle.js","names":[],"sources":["../src/generateThreadTitle.ts"],"sourcesContent":["import type { AssistantCloud } from \"./AssistantCloud\";\n\nexport async function generateThreadTitle(\n cloud: AssistantCloud,\n options: {\n threadId: string;\n messages: readonly {\n role: string;\n content: readonly { type: \"text\"; text: string }[];\n }[];\n },\n): Promise<string | null> {\n const stream = await cloud.runs.stream({\n thread_id: options.threadId,\n assistant_id: \"system/thread_title\",\n messages: options.messages,\n });\n\n let title = \"\";\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value: chunk } = await reader.read();\n if (done) break;\n if (chunk.type === \"text-delta\") {\n title += chunk.textDelta;\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n title = title.trim();\n if (title) {\n await cloud.threads.update(options.threadId, { title });\n }\n\n return title || null;\n}\n"],"mappings":";AAEA,eAAsB,oBACpB,OACA,SAOwB;CACxB,MAAM,SAAS,MAAM,MAAM,KAAK,OAAO;EACrC,WAAW,QAAQ;EACnB,cAAc;EACd,UAAU,QAAQ;CACpB,CAAC;CAED,IAAI,QAAQ;CACZ,MAAM,SAAS,OAAO,UAAU;CAChC,IAAI;EACF,OAAO,MAAM;GACX,MAAM,EAAE,MAAM,OAAO,UAAU,MAAM,OAAO,KAAK;GACjD,IAAI,MAAM;GACV,IAAI,MAAM,SAAS,cACjB,SAAS,MAAM;EAEnB;CACF,UAAU;EACR,OAAO,YAAY;CACrB;CAEA,QAAQ,MAAM,KAAK;CACnB,IAAI,OACF,MAAM,MAAM,QAAQ,OAAO,QAAQ,UAAU,EAAE,MAAM,CAAC;CAGxD,OAAO,SAAS;AAClB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
import { readAnonymousRefreshToken } from "./AssistantCloudAuthStrategy.js";
|
|
1
2
|
import { McpSamplingHandler, SamplingCallData, createSamplingCollector, wrapSamplingHandler } from "./instrumentMcpSampling.js";
|
|
2
|
-
import { AssistantCloudRunReportToolCall, RunTelemetryToolCallInit, RunTelemetryUsage, RunTelemetryUsageInit, createRunTelemetryToolCall, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "./runTelemetry.js";
|
|
3
|
+
import { AssistantCloudRunReportToolCall, RunMessageTelemetry, RunReportInit, RunReportOutcome, RunReportStepInit, RunTelemetryToolCallInit, RunTelemetryUsage, RunTelemetryUsageInit, createRunReport, createRunTelemetryToolCall, deriveRunOutcome, describeRunError, extractRunTelemetryModelId, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "./runTelemetry.js";
|
|
3
4
|
import { AssistantCloudRunReport } from "./AssistantCloudRuns.js";
|
|
4
|
-
import { AssistantCloudTelemetryConfig, CloudAPIError } from "./AssistantCloudAPI.js";
|
|
5
|
-
import { CloudMessage } from "./AssistantCloudThreadMessages.js";
|
|
5
|
+
import { AssistantCloudTelemetryConfig, CloudAPIError, SdkIdentity } from "./AssistantCloudAPI.js";
|
|
6
|
+
import { AssistantCloudThreadMessageFeedbackBody, AssistantCloudThreadMessageFeedbackResponse, CloudMessage } from "./AssistantCloudThreadMessages.js";
|
|
7
|
+
import { GeneratePresignedDownloadUrlResponse } from "./AssistantCloudFiles.js";
|
|
8
|
+
import { AssistantCloudEvent, AssistantCloudEventKind, AssistantCloudEvents } from "./AssistantCloudEvents.js";
|
|
9
|
+
import { AssistantCloudScoreBody, AssistantCloudScoreResponse, AssistantCloudScores } from "./AssistantCloudScores.js";
|
|
6
10
|
import { AssistantCloud } from "./AssistantCloud.js";
|
|
11
|
+
import { CloudEngagementReporter, EngagementEventIds, EngagementIdResolver } from "./CloudEngagementReporter.js";
|
|
7
12
|
import { CloudMessagePersistence } from "./CloudMessagePersistence.js";
|
|
13
|
+
import { CloudRunReportInit, CloudRunReporter } from "./CloudRunReporter.js";
|
|
8
14
|
import { MessageFormatAdapter, createFormattedPersistence } from "./FormattedCloudPersistence.js";
|
|
9
15
|
import { CloudResponseError } from "./cloudResponse.js";
|
|
10
16
|
import { generateThreadTitle } from "./generateThreadTitle.js";
|
|
11
|
-
export { AssistantCloud, type AssistantCloudRunReport, type AssistantCloudRunReportToolCall, type AssistantCloudTelemetryConfig, CloudAPIError, type CloudMessage, CloudMessagePersistence, CloudResponseError, type McpSamplingHandler, type MessageFormatAdapter, type RunTelemetryToolCallInit, type RunTelemetryUsage, type RunTelemetryUsageInit, type SamplingCallData, createFormattedPersistence, createRunTelemetryToolCall, createSamplingCollector, generateThreadTitle, normalizeRunTelemetryUsage, truncateRunTelemetryText, wrapSamplingHandler };
|
|
17
|
+
export { AssistantCloud, type AssistantCloudEvent, type AssistantCloudEventKind, AssistantCloudEvents, type AssistantCloudRunReport, type AssistantCloudRunReportToolCall, type AssistantCloudScoreBody, type AssistantCloudScoreResponse, AssistantCloudScores, type AssistantCloudTelemetryConfig, type AssistantCloudThreadMessageFeedbackBody, type AssistantCloudThreadMessageFeedbackResponse, CloudAPIError, CloudEngagementReporter, type CloudMessage, CloudMessagePersistence, CloudResponseError, type CloudRunReportInit, CloudRunReporter, type EngagementEventIds, type EngagementIdResolver, type GeneratePresignedDownloadUrlResponse, type McpSamplingHandler, type MessageFormatAdapter, type RunMessageTelemetry, type RunReportInit, type RunReportOutcome, type RunReportStepInit, type RunTelemetryToolCallInit, type RunTelemetryUsage, type RunTelemetryUsageInit, type SamplingCallData, type SdkIdentity, createFormattedPersistence, createRunReport, createRunTelemetryToolCall, createSamplingCollector, deriveRunOutcome, describeRunError, extractRunTelemetryModelId, generateThreadTitle, normalizeRunTelemetryUsage, readAnonymousRefreshToken, truncateRunTelemetryText, wrapSamplingHandler };
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { CloudResponseError } from "./cloudResponse.js";
|
|
2
|
+
import { readAnonymousRefreshToken } from "./AssistantCloudAuthStrategy.js";
|
|
2
3
|
import { CloudAPIError } from "./AssistantCloudAPI.js";
|
|
4
|
+
import { AssistantCloudEvents } from "./AssistantCloudEvents.js";
|
|
5
|
+
import { AssistantCloudScores } from "./AssistantCloudScores.js";
|
|
3
6
|
import { AssistantCloud } from "./AssistantCloud.js";
|
|
7
|
+
import { CloudEngagementReporter } from "./CloudEngagementReporter.js";
|
|
4
8
|
import { CloudMessagePersistence } from "./CloudMessagePersistence.js";
|
|
9
|
+
import { createRunReport, createRunTelemetryToolCall, deriveRunOutcome, describeRunError, extractRunTelemetryModelId, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "./runTelemetry.js";
|
|
10
|
+
import { CloudRunReporter } from "./CloudRunReporter.js";
|
|
5
11
|
import { createFormattedPersistence } from "./FormattedCloudPersistence.js";
|
|
6
12
|
import { generateThreadTitle } from "./generateThreadTitle.js";
|
|
7
|
-
import { createRunTelemetryToolCall, normalizeRunTelemetryUsage, truncateRunTelemetryText } from "./runTelemetry.js";
|
|
8
13
|
import { createSamplingCollector, wrapSamplingHandler } from "./instrumentMcpSampling.js";
|
|
9
|
-
export { AssistantCloud, CloudAPIError, CloudMessagePersistence, CloudResponseError, createFormattedPersistence, createRunTelemetryToolCall, createSamplingCollector, generateThreadTitle, normalizeRunTelemetryUsage, truncateRunTelemetryText, wrapSamplingHandler };
|
|
14
|
+
export { AssistantCloud, AssistantCloudEvents, AssistantCloudScores, CloudAPIError, CloudEngagementReporter, CloudMessagePersistence, CloudResponseError, CloudRunReporter, createFormattedPersistence, createRunReport, createRunTelemetryToolCall, createSamplingCollector, deriveRunOutcome, describeRunError, extractRunTelemetryModelId, generateThreadTitle, normalizeRunTelemetryUsage, readAnonymousRefreshToken, truncateRunTelemetryText, wrapSamplingHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentMcpSampling.d.ts","names":[],"sources":["../src/instrumentMcpSampling.ts"],"mappings":";;;;;;;;KAQY;EACV;EACA;EACA;EACA;EACA;EACA;;KAGU,sBACV,SAAS,uBACN,QAAQ;KAED;EACV;EACA;IACE;IACA;MAAqB;QAAU;;;IAC/B;KACC;;;KAIO;EACV;EACA;EACA;IACE;IACA;IACA;IACA;IACA;IACA;;GAED;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"instrumentMcpSampling.d.ts","names":[],"sources":["../src/instrumentMcpSampling.ts"],"mappings":";;;;;;;;KAQY;EACV;EACA;EACA;EACA;EACA;EACA;;KAGU,sBACV,SAAS,uBACN,QAAQ;KAED;EACV;EACA;IACE;IACA;MAAqB;QAAU;;;IAC/B;KACC;;;KAIO;EACV;EACA;EACA;IACE;IACA;IACA;IACA;IACA;IACA;;GAED;;;;;;;;;;;;;;;;;;;;iBA8Ba,oBACd,SAAS,oBACT,iBAAiB,MAAM,4BACtB;;;;;;;;;;;;;iBAkDa;EAGI,UAAA,MAAA;kBAAA"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
//#region src/instrumentMcpSampling.ts
|
|
2
|
+
const reportSamplingError = (error) => {
|
|
3
|
+
try {
|
|
4
|
+
console.error("[assistant-cloud] onSamplingCall callback threw an error", error);
|
|
5
|
+
} catch {}
|
|
6
|
+
};
|
|
2
7
|
/**
|
|
3
8
|
* Wraps an MCP sampling handler to intercept and measure sampling calls.
|
|
4
9
|
*
|
|
@@ -27,14 +32,19 @@ function wrapSamplingHandler(handler, onSamplingCall) {
|
|
|
27
32
|
const outputTokens = response.usage?.outputTokens ?? response.usage?.completionTokens;
|
|
28
33
|
const reasoningTokens = response.usage?.reasoningTokens;
|
|
29
34
|
const cachedInputTokens = response.usage?.cachedInputTokens;
|
|
30
|
-
|
|
35
|
+
const data = {
|
|
31
36
|
...modelId ? { model_id: modelId } : void 0,
|
|
32
37
|
...inputTokens != null ? { input_tokens: inputTokens } : void 0,
|
|
33
38
|
...outputTokens != null ? { output_tokens: outputTokens } : void 0,
|
|
34
39
|
...reasoningTokens != null ? { reasoning_tokens: reasoningTokens } : void 0,
|
|
35
40
|
...cachedInputTokens != null ? { cached_input_tokens: cachedInputTokens } : void 0,
|
|
36
41
|
duration_ms: durationMs
|
|
37
|
-
}
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
Promise.resolve(onSamplingCall(data)).catch(reportSamplingError);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
reportSamplingError(error);
|
|
47
|
+
}
|
|
38
48
|
return response;
|
|
39
49
|
};
|
|
40
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentMcpSampling.js","names":[],"sources":["../src/instrumentMcpSampling.ts"],"sourcesContent":["/**\n * MCP sampling instrumentation utility.\n *\n * Wraps an MCP client's sampling handler to capture nested LLM calls\n * (sampling/createMessage requests) made during tool execution.\n * The captured data can be reported as child generation spans.\n */\n\nexport type SamplingCallData = {\n model_id?: string;\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n duration_ms?: number;\n};\n\nexport type McpSamplingHandler = (\n request: McpSamplingRequest,\n) => Promise<McpSamplingResponse>;\n\nexport type McpSamplingRequest = {\n method: \"sampling/createMessage\";\n params: {\n messages: unknown[];\n modelPreferences?: { hints?: { name?: string }[] };\n maxTokens?: number;\n [key: string]: unknown;\n };\n};\n\nexport type McpSamplingResponse = {\n model?: string;\n content: unknown;\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n [key: string]: unknown;\n};\n\n/**\n * Wraps an MCP sampling handler to intercept and measure sampling calls.\n *\n * @param handler - The original sampling handler from the MCP client\n * @param onSamplingCall - Callback invoked with metrics for each sampling call\n * @returns A wrapped handler that transparently captures sampling metrics\n *\n * @example\n * ```ts\n * const samplingCalls: SamplingCallData[] = [];\n * const wrapped = wrapSamplingHandler(\n * originalHandler,\n * (data) => samplingCalls.push(data),\n * );\n * // Use `wrapped` as the MCP client's sampling handler\n * // After tool execution, `samplingCalls` contains metrics for all nested LLM calls\n * ```\n */\nexport function wrapSamplingHandler(\n handler: McpSamplingHandler,\n onSamplingCall: (data: SamplingCallData) => void,\n): McpSamplingHandler {\n return async (request) => {\n const startTime = Date.now();\n const response = await handler(request);\n const durationMs = Date.now() - startTime;\n\n const modelId =\n response.model ?? request.params.modelPreferences?.hints?.[0]?.name;\n\n const inputTokens =\n response.usage?.inputTokens ?? response.usage?.promptTokens;\n const outputTokens =\n response.usage?.outputTokens ?? response.usage?.completionTokens;\n const reasoningTokens = response.usage?.reasoningTokens;\n const cachedInputTokens = response.usage?.cachedInputTokens;\n\n
|
|
1
|
+
{"version":3,"file":"instrumentMcpSampling.js","names":[],"sources":["../src/instrumentMcpSampling.ts"],"sourcesContent":["/**\n * MCP sampling instrumentation utility.\n *\n * Wraps an MCP client's sampling handler to capture nested LLM calls\n * (sampling/createMessage requests) made during tool execution.\n * The captured data can be reported as child generation spans.\n */\n\nexport type SamplingCallData = {\n model_id?: string;\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n duration_ms?: number;\n};\n\nexport type McpSamplingHandler = (\n request: McpSamplingRequest,\n) => Promise<McpSamplingResponse>;\n\nexport type McpSamplingRequest = {\n method: \"sampling/createMessage\";\n params: {\n messages: unknown[];\n modelPreferences?: { hints?: { name?: string }[] };\n maxTokens?: number;\n [key: string]: unknown;\n };\n};\n\nexport type McpSamplingResponse = {\n model?: string;\n content: unknown;\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n cachedInputTokens?: number;\n };\n [key: string]: unknown;\n};\n\nconst reportSamplingError = (error: unknown): void => {\n try {\n console.error(\n \"[assistant-cloud] onSamplingCall callback threw an error\",\n error,\n );\n } catch {}\n};\n\n/**\n * Wraps an MCP sampling handler to intercept and measure sampling calls.\n *\n * @param handler - The original sampling handler from the MCP client\n * @param onSamplingCall - Callback invoked with metrics for each sampling call\n * @returns A wrapped handler that transparently captures sampling metrics\n *\n * @example\n * ```ts\n * const samplingCalls: SamplingCallData[] = [];\n * const wrapped = wrapSamplingHandler(\n * originalHandler,\n * (data) => samplingCalls.push(data),\n * );\n * // Use `wrapped` as the MCP client's sampling handler\n * // After tool execution, `samplingCalls` contains metrics for all nested LLM calls\n * ```\n */\nexport function wrapSamplingHandler(\n handler: McpSamplingHandler,\n onSamplingCall: (data: SamplingCallData) => void,\n): McpSamplingHandler {\n return async (request) => {\n const startTime = Date.now();\n const response = await handler(request);\n const durationMs = Date.now() - startTime;\n\n const modelId =\n response.model ?? request.params.modelPreferences?.hints?.[0]?.name;\n\n const inputTokens =\n response.usage?.inputTokens ?? response.usage?.promptTokens;\n const outputTokens =\n response.usage?.outputTokens ?? response.usage?.completionTokens;\n const reasoningTokens = response.usage?.reasoningTokens;\n const cachedInputTokens = response.usage?.cachedInputTokens;\n\n const data: SamplingCallData = {\n ...(modelId ? { model_id: modelId } : undefined),\n ...(inputTokens != null ? { input_tokens: inputTokens } : undefined),\n ...(outputTokens != null ? { output_tokens: outputTokens } : undefined),\n ...(reasoningTokens != null\n ? { reasoning_tokens: reasoningTokens }\n : undefined),\n ...(cachedInputTokens != null\n ? { cached_input_tokens: cachedInputTokens }\n : undefined),\n duration_ms: durationMs,\n };\n try {\n void Promise.resolve(onSamplingCall(data)).catch(reportSamplingError);\n } catch (error) {\n reportSamplingError(error);\n }\n\n return response;\n };\n}\n\n/**\n * Creates a collector that accumulates sampling call data during tool execution.\n * Use with `wrapSamplingHandler` to capture all sampling calls for a tool invocation.\n *\n * @example\n * ```ts\n * const collector = createSamplingCollector();\n * const wrappedHandler = wrapSamplingHandler(handler, collector.collect);\n * // ... execute MCP tool ...\n * const calls = collector.getCalls(); // SamplingCallData[]\n * ```\n */\nexport function createSamplingCollector() {\n const calls: SamplingCallData[] = [];\n return {\n collect: (data: SamplingCallData) => calls.push(data),\n getCalls: () => [...calls],\n reset: () => {\n calls.length = 0;\n },\n };\n}\n"],"mappings":";AA6CA,MAAM,uBAAuB,UAAyB;CACpD,IAAI;EACF,QAAQ,MACN,4DACA,KACF;CACF,QAAQ,CAAC;AACX;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,oBACd,SACA,gBACoB;CACpB,OAAO,OAAO,YAAY;EACxB,MAAM,YAAY,KAAK,IAAI;EAC3B,MAAM,WAAW,MAAM,QAAQ,OAAO;EACtC,MAAM,aAAa,KAAK,IAAI,IAAI;EAEhC,MAAM,UACJ,SAAS,SAAS,QAAQ,OAAO,kBAAkB,QAAQ,EAAE,EAAE;EAEjE,MAAM,cACJ,SAAS,OAAO,eAAe,SAAS,OAAO;EACjD,MAAM,eACJ,SAAS,OAAO,gBAAgB,SAAS,OAAO;EAClD,MAAM,kBAAkB,SAAS,OAAO;EACxC,MAAM,oBAAoB,SAAS,OAAO;EAE1C,MAAM,OAAyB;GAC7B,GAAI,UAAU,EAAE,UAAU,QAAQ,IAAI,KAAA;GACtC,GAAI,eAAe,OAAO,EAAE,cAAc,YAAY,IAAI,KAAA;GAC1D,GAAI,gBAAgB,OAAO,EAAE,eAAe,aAAa,IAAI,KAAA;GAC7D,GAAI,mBAAmB,OACnB,EAAE,kBAAkB,gBAAgB,IACpC,KAAA;GACJ,GAAI,qBAAqB,OACrB,EAAE,qBAAqB,kBAAkB,IACzC,KAAA;GACJ,aAAa;EACf;EACA,IAAI;GACF,QAAa,QAAQ,eAAe,IAAI,CAAC,CAAC,CAAC,MAAM,mBAAmB;EACtE,SAAS,OAAO;GACd,oBAAoB,KAAK;EAC3B;EAEA,OAAO;CACT;AACF;;;;;;;;;;;;;AAcA,SAAgB,0BAA0B;CACxC,MAAM,QAA4B,CAAC;CACnC,OAAO;EACL,UAAU,SAA2B,MAAM,KAAK,IAAI;EACpD,gBAAgB,CAAC,GAAG,KAAK;EACzB,aAAa;GACX,MAAM,SAAS;EACjB;CACF;AACF"}
|
package/dist/runTelemetry.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SamplingCallData } from "./instrumentMcpSampling.js";
|
|
2
|
+
import { AssistantCloudRunReport } from "./AssistantCloudRuns.js";
|
|
2
3
|
//#region src/runTelemetry.d.ts
|
|
3
4
|
type AssistantCloudRunReportToolCall = {
|
|
4
5
|
tool_name: string;
|
|
@@ -10,6 +11,28 @@ type AssistantCloudRunReportToolCall = {
|
|
|
10
11
|
end_ms?: number;
|
|
11
12
|
sampling_calls?: SamplingCallData[];
|
|
12
13
|
};
|
|
14
|
+
type RunReportOutcome = "aborted" | "disconnected" | "length" | "content_filter";
|
|
15
|
+
/**
|
|
16
|
+
* Maps a finish event to the report status and outcome. `fallbackStatus`
|
|
17
|
+
* applies when the event carries neither a finish reason nor a failure flag.
|
|
18
|
+
*/
|
|
19
|
+
declare function deriveRunOutcome(input: {
|
|
20
|
+
finishReason?: string | undefined;
|
|
21
|
+
isAbort?: boolean | undefined;
|
|
22
|
+
isDisconnect?: boolean | undefined;
|
|
23
|
+
isError?: boolean | undefined;
|
|
24
|
+
}, fallbackStatus?: "completed" | "incomplete"): {
|
|
25
|
+
status: "completed" | "incomplete" | "error";
|
|
26
|
+
outcome?: RunReportOutcome;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Reads the message and code the runs endpoint stores for a failed run. The
|
|
30
|
+
* code is the error's `code` when it has one, else its class name.
|
|
31
|
+
*/
|
|
32
|
+
declare function describeRunError(error: unknown): {
|
|
33
|
+
error?: string;
|
|
34
|
+
errorCode?: string;
|
|
35
|
+
};
|
|
13
36
|
/**
|
|
14
37
|
* Clamps a string to the size the runs endpoint accepts for a single span
|
|
15
38
|
* field.
|
|
@@ -33,15 +56,23 @@ type RunTelemetryToolCallInit = {
|
|
|
33
56
|
* base64 image and audio payloads that would otherwise dominate the report.
|
|
34
57
|
*/
|
|
35
58
|
declare function createRunTelemetryToolCall(init: RunTelemetryToolCallInit): AssistantCloudRunReportToolCall;
|
|
59
|
+
/**
|
|
60
|
+
* Resolves the model ID a run reports, in the order an app can supply it: an
|
|
61
|
+
* explicit `modelId`, the `custom` bag, then the per-step `response.modelId`
|
|
62
|
+
* that a `messageMetadata` callback copies off the AI SDK's finish-step part.
|
|
63
|
+
* The AI SDK puts no model ID on a UI message part, so message metadata is the
|
|
64
|
+
* only channel one arrives on.
|
|
65
|
+
*/
|
|
66
|
+
declare function extractRunTelemetryModelId(metadata: Record<string, unknown> | undefined): string | undefined;
|
|
36
67
|
type RunTelemetryUsage = {
|
|
37
|
-
inputTokens?: number;
|
|
38
|
-
outputTokens?: number;
|
|
39
|
-
reasoningTokens?: number;
|
|
40
|
-
cachedInputTokens?: number;
|
|
68
|
+
inputTokens?: number | undefined;
|
|
69
|
+
outputTokens?: number | undefined;
|
|
70
|
+
reasoningTokens?: number | undefined;
|
|
71
|
+
cachedInputTokens?: number | undefined;
|
|
41
72
|
};
|
|
42
73
|
type RunTelemetryUsageInit = RunTelemetryUsage & {
|
|
43
|
-
promptTokens?: number;
|
|
44
|
-
completionTokens?: number;
|
|
74
|
+
promptTokens?: number | undefined;
|
|
75
|
+
completionTokens?: number | undefined;
|
|
45
76
|
inputTokenDetails?: {
|
|
46
77
|
cacheReadTokens?: number;
|
|
47
78
|
};
|
|
@@ -49,6 +80,54 @@ type RunTelemetryUsageInit = RunTelemetryUsage & {
|
|
|
49
80
|
reasoningTokens?: number;
|
|
50
81
|
};
|
|
51
82
|
};
|
|
83
|
+
type RunReportStepInit = {
|
|
84
|
+
usage?: RunTelemetryUsageInit | undefined;
|
|
85
|
+
toolCalls?: AssistantCloudRunReportToolCall[] | undefined;
|
|
86
|
+
startMs?: number | undefined;
|
|
87
|
+
endMs?: number | undefined;
|
|
88
|
+
finishReason?: string | undefined;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* The run report fields read from the messages of one run, in whichever
|
|
92
|
+
* format they were stored: the status the messages imply, the tool calls, the
|
|
93
|
+
* steps, the text, the usage and the model.
|
|
94
|
+
*/
|
|
95
|
+
type RunMessageTelemetry = {
|
|
96
|
+
assistantMessageId?: string;
|
|
97
|
+
status: "completed" | "incomplete";
|
|
98
|
+
toolCalls?: AssistantCloudRunReportToolCall[];
|
|
99
|
+
steps?: RunReportStepInit[];
|
|
100
|
+
totalSteps?: number;
|
|
101
|
+
outputText?: string;
|
|
102
|
+
usage?: RunTelemetryUsage;
|
|
103
|
+
modelId?: string;
|
|
104
|
+
metadata?: Record<string, unknown>;
|
|
105
|
+
};
|
|
106
|
+
type RunReportInit = {
|
|
107
|
+
threadId: string;
|
|
108
|
+
status: AssistantCloudRunReport["status"];
|
|
109
|
+
outcome?: RunReportOutcome | undefined;
|
|
110
|
+
errorCode?: string | undefined;
|
|
111
|
+
error?: string | undefined;
|
|
112
|
+
messageId?: string | undefined;
|
|
113
|
+
traceId?: string | undefined;
|
|
114
|
+
modelId?: string | undefined;
|
|
115
|
+
provider?: string | undefined;
|
|
116
|
+
usage?: RunTelemetryUsageInit | undefined;
|
|
117
|
+
steps?: RunReportStepInit[] | undefined;
|
|
118
|
+
totalSteps?: number | undefined;
|
|
119
|
+
toolCalls?: AssistantCloudRunReportToolCall[] | undefined;
|
|
120
|
+
durationMs?: number | undefined;
|
|
121
|
+
firstTokenMs?: number | undefined;
|
|
122
|
+
outputText?: string | undefined;
|
|
123
|
+
metadata?: Record<string, unknown> | undefined;
|
|
124
|
+
telemetry?: {
|
|
125
|
+
environment?: string | undefined;
|
|
126
|
+
release?: string | undefined;
|
|
127
|
+
tags?: readonly string[] | undefined;
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
declare function createRunReport(init: RunReportInit): AssistantCloudRunReport;
|
|
52
131
|
/**
|
|
53
132
|
* Resolves the token counts a provider reports under any of the names the AI
|
|
54
133
|
* SDK has used: the current top-level ones, the legacy prompt/completion pair,
|
|
@@ -57,5 +136,5 @@ type RunTelemetryUsageInit = RunTelemetryUsage & {
|
|
|
57
136
|
*/
|
|
58
137
|
declare function normalizeRunTelemetryUsage(usage: RunTelemetryUsageInit): RunTelemetryUsage | undefined;
|
|
59
138
|
//#endregion
|
|
60
|
-
export { AssistantCloudRunReportToolCall, RunTelemetryToolCallInit, RunTelemetryUsage, RunTelemetryUsageInit, createRunTelemetryToolCall, normalizeRunTelemetryUsage, truncateRunTelemetryText };
|
|
139
|
+
export { AssistantCloudRunReportToolCall, RunMessageTelemetry, RunReportInit, RunReportOutcome, RunReportStepInit, RunTelemetryToolCallInit, RunTelemetryUsage, RunTelemetryUsageInit, createRunReport, createRunTelemetryToolCall, deriveRunOutcome, describeRunError, extractRunTelemetryModelId, normalizeRunTelemetryUsage, truncateRunTelemetryText };
|
|
61
140
|
//# sourceMappingURL=runTelemetry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runTelemetry.d.ts","names":[],"sources":["../src/runTelemetry.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"runTelemetry.d.ts","names":[],"sources":["../src/runTelemetry.ts"],"mappings":";;;KAOY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;;KAGP;;;;;iBAUI,iBACd;EACE;EACA;EACA;EACA;GAEF;EAEA;EACA,UAAU;;;;;;iBA+BI,iBAAiB;EAC/B;EACA;;;;;;iBA+Bc,yBAAyB;KAwC7B;EACV;EACA;EACA;;;;;EAKA;EACA;EACA;;;;;;;iBAQc,2BACd,MAAM,2BACL;;;;;;;;iBAuBa,2BACd,UAAU;KAmBA;EACV;EACA;EACA;EACA;;KAGU,wBAAwB;EAClC;EACA;EACA;IAAsB;;EACtB;IAAuB;;;KAGb;EACV,QAAQ;EACR,YAAY;EACZ;EACA;EACA;;;;;;;KAQU;EACV;EACA;EACA,YAAY;EACZ,QAAQ;EACR;EACA;EACA,QAAQ;EACR;EACA,WAAW;;KAGD;EACV;EACA,QAAQ;EACR,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR,QAAQ;EACR;EACA,YAAY;EACZ;EACA;EACA;EACA,WAAW;EACX;IACE;IACA;IACA;;;iBAuEY,gBAAgB,MAAM,gBAAgB;;;;;;;iBAiDtC,2BACd,OAAO,wBACN"}
|