@introspection-sdk/introspection-node 0.4.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/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-check-types.log +5 -0
- package/.turbo/turbo-lint.log +5 -0
- package/dist/ai-sdk-integration.d.ts +123 -0
- package/dist/ai-sdk-integration.d.ts.map +1 -0
- package/dist/ai-sdk-integration.js +475 -0
- package/dist/anthropic.d.ts +54 -0
- package/dist/anthropic.d.ts.map +1 -0
- package/dist/anthropic.js +375 -0
- package/dist/claude-hooks.d.ts +328 -0
- package/dist/claude-hooks.d.ts.map +1 -0
- package/dist/claude-hooks.js +571 -0
- package/dist/claude-wrapper.d.ts +93 -0
- package/dist/claude-wrapper.d.ts.map +1 -0
- package/dist/claude-wrapper.js +154 -0
- package/dist/client.d.ts +157 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +394 -0
- package/dist/converters/ai-sdk.d.ts +65 -0
- package/dist/converters/ai-sdk.d.ts.map +1 -0
- package/dist/converters/ai-sdk.js +238 -0
- package/dist/converters/claude.d.ts +146 -0
- package/dist/converters/claude.d.ts.map +1 -0
- package/dist/converters/claude.js +202 -0
- package/dist/converters/index.d.ts +9 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +8 -0
- package/dist/converters/openai.d.ts +51 -0
- package/dist/converters/openai.d.ts.map +1 -0
- package/dist/converters/openai.js +268 -0
- package/dist/converters/openclaw.d.ts +16 -0
- package/dist/converters/openclaw.d.ts.map +1 -0
- package/dist/converters/openclaw.js +49 -0
- package/dist/converters/openinference.d.ts +107 -0
- package/dist/converters/openinference.d.ts.map +1 -0
- package/dist/converters/openinference.js +552 -0
- package/dist/converters/vercel.d.ts +21 -0
- package/dist/converters/vercel.d.ts.map +1 -0
- package/dist/converters/vercel.js +208 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/langchain-handler.d.ts +101 -0
- package/dist/langchain-handler.d.ts.map +1 -0
- package/dist/langchain-handler.js +489 -0
- package/dist/mastra-exporter.d.ts +85 -0
- package/dist/mastra-exporter.d.ts.map +1 -0
- package/dist/mastra-exporter.js +471 -0
- package/dist/span-processor.d.ts +62 -0
- package/dist/span-processor.d.ts.map +1 -0
- package/dist/span-processor.js +310 -0
- package/dist/tracing-processor.d.ts +136 -0
- package/dist/tracing-processor.d.ts.map +1 -0
- package/dist/tracing-processor.js +368 -0
- package/dist/types/genai.d.ts +165 -0
- package/dist/types/genai.d.ts.map +1 -0
- package/dist/types/genai.js +82 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +57 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/eslint.config.mjs +4 -0
- package/package.json +78 -0
- package/src/ai-sdk-integration.ts +689 -0
- package/src/anthropic.ts +465 -0
- package/src/claude-hooks.ts +1010 -0
- package/src/claude-wrapper.ts +240 -0
- package/src/client.ts +513 -0
- package/src/converters/ai-sdk.ts +298 -0
- package/src/converters/claude.ts +334 -0
- package/src/converters/index.ts +44 -0
- package/src/converters/openai.ts +302 -0
- package/src/converters/openinference.ts +673 -0
- package/src/converters/vercel.ts +264 -0
- package/src/index.ts +121 -0
- package/src/langchain-handler.ts +722 -0
- package/src/mastra-exporter.ts +650 -0
- package/src/span-processor.ts +418 -0
- package/src/tracing-processor.ts +548 -0
- package/src/types/genai.ts +264 -0
- package/src/types.ts +13 -0
- package/src/utils.ts +69 -0
- package/src/version.ts +2 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Agent SDK Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Provides a zero-friction `withIntrospection()` wrapper for the Claude Agent SDK.
|
|
5
|
+
* Automatically instruments all query() calls with OpenTelemetry tracing via
|
|
6
|
+
* IntrospectionClaudeHooks — no manual hook wiring or recordUsage() calls needed.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import * as sdk from "@anthropic-ai/claude-agent-sdk";
|
|
11
|
+
* import { withIntrospection } from "@introspection-sdk/introspection-node";
|
|
12
|
+
*
|
|
13
|
+
* const tracedSdk = withIntrospection(sdk, { serviceName: "my-agent" });
|
|
14
|
+
*
|
|
15
|
+
* for await (const message of tracedSdk.query({ prompt: "Hello" })) {
|
|
16
|
+
* // messages yielded normally — tracing happens automatically
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* await tracedSdk.shutdown();
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { IntrospectionClaudeHooks, } from "./claude-hooks.js";
|
|
23
|
+
import { logger } from "./utils.js";
|
|
24
|
+
// --- Implementation ---
|
|
25
|
+
/**
|
|
26
|
+
* Wrap the Claude Agent SDK module to automatically instrument every
|
|
27
|
+
* `query()` call with OpenTelemetry tracing.
|
|
28
|
+
*
|
|
29
|
+
* The returned SDK:
|
|
30
|
+
* - Auto-captures `prompt` and `systemPrompt` from query params
|
|
31
|
+
* - Injects instrumentation hooks (merged with any user-provided hooks)
|
|
32
|
+
* - Calls {@link IntrospectionClaudeHooks.recordUsage | recordUsage()} on
|
|
33
|
+
* every streamed message automatically
|
|
34
|
+
* - Flushes spans when each query stream completes
|
|
35
|
+
*
|
|
36
|
+
* @param sdk - The Claude Agent SDK module
|
|
37
|
+
* (`import * as sdk from "@anthropic-ai/claude-agent-sdk"`).
|
|
38
|
+
* @param options - Introspection configuration (token, serviceName, baseUrl, etc.).
|
|
39
|
+
* @returns An {@link InstrumentedClaudeAgentSDK} with the same API plus
|
|
40
|
+
* `forceFlush()`, `shutdown()`, and `hooks`.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* import * as sdk from "@anthropic-ai/claude-agent-sdk";
|
|
45
|
+
* import { withIntrospection } from "@introspection-sdk/introspection-node";
|
|
46
|
+
*
|
|
47
|
+
* const traced = withIntrospection(sdk, { serviceName: "my-agent" });
|
|
48
|
+
* for await (const msg of traced.query({ prompt: "Hello" })) { /* … *\/ }
|
|
49
|
+
* await traced.shutdown();
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export function withIntrospection(sdk, options) {
|
|
53
|
+
const hooks = new IntrospectionClaudeHooks(options);
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
+
function wrappedQuery(params) {
|
|
56
|
+
// Auto-capture prompt
|
|
57
|
+
if (typeof params?.prompt === "string") {
|
|
58
|
+
hooks.setInputPrompt(params.prompt);
|
|
59
|
+
}
|
|
60
|
+
// Auto-capture systemPrompt from options
|
|
61
|
+
const opts = (params?.options || {});
|
|
62
|
+
if (typeof opts.systemPrompt === "string") {
|
|
63
|
+
hooks.setSystemInstructions(opts.systemPrompt);
|
|
64
|
+
}
|
|
65
|
+
// Merge instrumentation hooks with any user-provided hooks
|
|
66
|
+
const introspectionHooks = hooks.getHooks();
|
|
67
|
+
const userHooks = opts.hooks;
|
|
68
|
+
const mergedHooks = mergeHooks(introspectionHooks, userHooks);
|
|
69
|
+
// Call original query with merged hooks
|
|
70
|
+
const modifiedOptions = { ...opts, hooks: mergedHooks };
|
|
71
|
+
const originalQuery = sdk.query({
|
|
72
|
+
...params,
|
|
73
|
+
options: modifiedOptions,
|
|
74
|
+
});
|
|
75
|
+
// Wrap the async generator to intercept messages
|
|
76
|
+
return wrapQueryResult(originalQuery, hooks);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
...sdk,
|
|
80
|
+
query: wrappedQuery,
|
|
81
|
+
hooks,
|
|
82
|
+
forceFlush: () => hooks.forceFlush(),
|
|
83
|
+
shutdown: () => hooks.shutdown(),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Merges introspection hooks with user-provided hooks.
|
|
88
|
+
* Introspection hooks fire first, then user hooks.
|
|
89
|
+
* User hooks on events we don't handle pass through untouched.
|
|
90
|
+
*/
|
|
91
|
+
function mergeHooks(introspectionHooks, userHooks) {
|
|
92
|
+
if (!userHooks) {
|
|
93
|
+
return introspectionHooks;
|
|
94
|
+
}
|
|
95
|
+
const merged = {};
|
|
96
|
+
const allEvents = new Set([
|
|
97
|
+
...Object.keys(introspectionHooks),
|
|
98
|
+
...Object.keys(userHooks),
|
|
99
|
+
]);
|
|
100
|
+
for (const event of allEvents) {
|
|
101
|
+
const ours = introspectionHooks[event] || [];
|
|
102
|
+
const theirs = userHooks[event] || [];
|
|
103
|
+
merged[event] = [...ours, ...theirs];
|
|
104
|
+
}
|
|
105
|
+
return merged;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Wraps a Query async generator to intercept messages for usage recording.
|
|
109
|
+
* Uses a Proxy to transparently forward all non-iterator properties
|
|
110
|
+
* (interrupt, close, setModel, etc.) to the original Query object.
|
|
111
|
+
*/
|
|
112
|
+
function wrapQueryResult(originalQuery, hooks) {
|
|
113
|
+
const query = originalQuery;
|
|
114
|
+
async function* instrumentedIterator() {
|
|
115
|
+
try {
|
|
116
|
+
for await (const message of query) {
|
|
117
|
+
hooks.recordUsage(message);
|
|
118
|
+
yield message;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
try {
|
|
123
|
+
await hooks.forceFlush();
|
|
124
|
+
}
|
|
125
|
+
catch (flushError) {
|
|
126
|
+
logger.warn("Failed to flush spans after query completed", flushError);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const wrapped = instrumentedIterator();
|
|
131
|
+
// Use Proxy to transparently delegate non-iterator properties to original query.
|
|
132
|
+
// Iterator protocol methods come from our wrapper (bound to the actual generator
|
|
133
|
+
// to avoid "incompatible receiver" errors); everything else (interrupt, close,
|
|
134
|
+
// setModel, setPermissionMode, etc.) delegates to the original Query.
|
|
135
|
+
return new Proxy(wrapped, {
|
|
136
|
+
get(target, prop) {
|
|
137
|
+
if (prop === Symbol.asyncIterator ||
|
|
138
|
+
prop === "next" ||
|
|
139
|
+
prop === "return" ||
|
|
140
|
+
prop === "throw") {
|
|
141
|
+
const value = Reflect.get(target, prop);
|
|
142
|
+
if (typeof value === "function") {
|
|
143
|
+
return value.bind(target);
|
|
144
|
+
}
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
const original = query[prop];
|
|
148
|
+
if (typeof original === "function") {
|
|
149
|
+
return original.bind(query);
|
|
150
|
+
}
|
|
151
|
+
return original;
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Introspection Client for Node.js
|
|
3
|
+
* Provides an API for tracking events and feedback using OTLP Logs.
|
|
4
|
+
*
|
|
5
|
+
* Identity and gen_ai context are automatically extracted from OpenTelemetry
|
|
6
|
+
* baggage.
|
|
7
|
+
*/
|
|
8
|
+
import { type IntrospectionClientOptions, type FeedbackOptions, type UserTraits } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Introspection client for tracking events and feedback using OTLP Logs.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const client = new IntrospectionClient({
|
|
15
|
+
* token: process.env.INTROSPECTION_TOKEN,
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* client.identify("user_123", { email: "user@example.com" });
|
|
19
|
+
* client.feedback("thumbs_up", { comments: "Great response!" });
|
|
20
|
+
*
|
|
21
|
+
* await client.shutdown();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class IntrospectionClient {
|
|
25
|
+
private loggerProvider;
|
|
26
|
+
private otelLogger;
|
|
27
|
+
private userId;
|
|
28
|
+
private anonymousId;
|
|
29
|
+
private traits;
|
|
30
|
+
constructor(options?: IntrospectionClientOptions);
|
|
31
|
+
/** Get gen_ai context from baggage */
|
|
32
|
+
private getGenAiFromContext;
|
|
33
|
+
/** Get identity from baggage or client instance */
|
|
34
|
+
private getIdentityFromContext;
|
|
35
|
+
/**
|
|
36
|
+
* Get current timestamp as OpenTelemetry HrTime.
|
|
37
|
+
* Uses process.hrtime.bigint() for nanosecond precision in Node.js.
|
|
38
|
+
*/
|
|
39
|
+
private getTimestamp;
|
|
40
|
+
/**
|
|
41
|
+
* Build log record attributes.
|
|
42
|
+
*/
|
|
43
|
+
private buildAttributes;
|
|
44
|
+
/**
|
|
45
|
+
* Track a custom event.
|
|
46
|
+
*
|
|
47
|
+
* @param eventName - A descriptive name for the event (e.g. `"page_view"`).
|
|
48
|
+
* @param properties - Arbitrary key/value pairs attached to the event.
|
|
49
|
+
* @param options - Optional overrides such as a custom `eventId`.
|
|
50
|
+
*/
|
|
51
|
+
track(eventName: string, properties?: Record<string, unknown>, options?: {
|
|
52
|
+
eventId?: string;
|
|
53
|
+
}): void;
|
|
54
|
+
/**
|
|
55
|
+
* Track feedback on a message or response.
|
|
56
|
+
*
|
|
57
|
+
* @param name - Feedback type (e.g. `"thumbs_up"`, `"thumbs_down"`).
|
|
58
|
+
* @param options - Additional feedback context such as comments or conversation ID.
|
|
59
|
+
*/
|
|
60
|
+
feedback(name: string, options?: FeedbackOptions): void;
|
|
61
|
+
/**
|
|
62
|
+
* Identify a user and associate traits with them.
|
|
63
|
+
*
|
|
64
|
+
* @param userId - Unique identifier for the user.
|
|
65
|
+
* @param traits - Key/value user properties (e.g. `{ email: "…" }`).
|
|
66
|
+
* @param anonymousId - Optional anonymous identifier to link pre-auth sessions.
|
|
67
|
+
* @param eventId - Optional custom event ID override.
|
|
68
|
+
*/
|
|
69
|
+
identify(userId: string, traits?: UserTraits, anonymousId?: string, eventId?: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Create an OTel context with the given baggage values set.
|
|
72
|
+
*
|
|
73
|
+
* @param values - Key/value pairs to store in OTel baggage.
|
|
74
|
+
* @returns A new context containing the baggage entries.
|
|
75
|
+
*/
|
|
76
|
+
createBaggageContext(values: Record<string, string>): import("@opentelemetry/api").Context;
|
|
77
|
+
/**
|
|
78
|
+
* Set multiple baggage values and run a callback within that context.
|
|
79
|
+
*
|
|
80
|
+
* @param values - Key/value pairs to store in OTel baggage.
|
|
81
|
+
* @param callback - Function to execute with the baggage context active.
|
|
82
|
+
* @returns The value returned by `callback`.
|
|
83
|
+
*/
|
|
84
|
+
withBaggage<T>(values: Record<string, string>, callback: () => T | Promise<T>): Promise<T>;
|
|
85
|
+
/**
|
|
86
|
+
* Set `gen_ai.agent.name` (and optionally `gen_ai.agent.id`) baggage and run
|
|
87
|
+
* a callback within that context.
|
|
88
|
+
*
|
|
89
|
+
* @param agentName - The agent name to propagate.
|
|
90
|
+
* @param agentId - Optional agent identifier.
|
|
91
|
+
* @param callback - Function to execute with the agent baggage active.
|
|
92
|
+
* @returns The value returned by `callback`.
|
|
93
|
+
*/
|
|
94
|
+
withAgent<T>(agentName: string, agentId: string | undefined, callback: () => T | Promise<T>): Promise<T>;
|
|
95
|
+
/**
|
|
96
|
+
* Set conversation-related baggage (`gen_ai.conversation.id`,
|
|
97
|
+
* `gen_ai.request.previous_response_id`) and run a callback within that
|
|
98
|
+
* context.
|
|
99
|
+
*
|
|
100
|
+
* @param conversationId - The conversation identifier.
|
|
101
|
+
* @param previousResponseId - The ID of the previous response in the conversation.
|
|
102
|
+
* @param callback - Function to execute with the conversation baggage active.
|
|
103
|
+
* @returns The value returned by `callback`.
|
|
104
|
+
*/
|
|
105
|
+
withConversation<T>(conversationId: string | undefined, previousResponseId: string | undefined, callback: () => T | Promise<T>): Promise<T>;
|
|
106
|
+
/**
|
|
107
|
+
* Set the user ID on this client instance.
|
|
108
|
+
*
|
|
109
|
+
* @param userId - Unique identifier for the user.
|
|
110
|
+
*/
|
|
111
|
+
setUserId(userId: string): void;
|
|
112
|
+
/**
|
|
113
|
+
* Set the anonymous ID on this client instance.
|
|
114
|
+
*
|
|
115
|
+
* @param anonymousId - Anonymous identifier used before authentication.
|
|
116
|
+
*/
|
|
117
|
+
setAnonymousId(anonymousId: string): void;
|
|
118
|
+
/**
|
|
119
|
+
* Set `identity.user_id` baggage and run a callback within that context.
|
|
120
|
+
*
|
|
121
|
+
* @param userId - The user identifier to propagate.
|
|
122
|
+
* @param callback - Function to execute with the user-ID baggage active.
|
|
123
|
+
* @returns The value returned by `callback`.
|
|
124
|
+
*/
|
|
125
|
+
withUserId<T>(userId: string, callback: () => T | Promise<T>): Promise<T>;
|
|
126
|
+
/**
|
|
127
|
+
* Set `identity.anonymous_id` baggage and run a callback within that context.
|
|
128
|
+
*
|
|
129
|
+
* @param anonymousId - The anonymous identifier to propagate.
|
|
130
|
+
* @param callback - Function to execute with the anonymous-ID baggage active.
|
|
131
|
+
* @returns The value returned by `callback`.
|
|
132
|
+
*/
|
|
133
|
+
withAnonymousId<T>(anonymousId: string, callback: () => T | Promise<T>): Promise<T>;
|
|
134
|
+
/**
|
|
135
|
+
* Get the current anonymous ID stored on this client instance.
|
|
136
|
+
*
|
|
137
|
+
* @returns The anonymous ID, or `undefined` if not set.
|
|
138
|
+
*/
|
|
139
|
+
getAnonymousId(): string | undefined;
|
|
140
|
+
/**
|
|
141
|
+
* Reset all client-side state (user ID, anonymous ID, and traits).
|
|
142
|
+
*/
|
|
143
|
+
reset(): void;
|
|
144
|
+
/**
|
|
145
|
+
* Flush all queued log records to the backend.
|
|
146
|
+
*
|
|
147
|
+
* @returns A promise that resolves once the flush completes.
|
|
148
|
+
*/
|
|
149
|
+
flush(): Promise<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Shut down the client, flushing all pending log records.
|
|
152
|
+
*
|
|
153
|
+
* @returns A promise that resolves once shutdown is complete.
|
|
154
|
+
*/
|
|
155
|
+
shutdown(): Promise<void>;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,UAAU,EAGhB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAA0C;IAC5D,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAA+B;gBAEjC,OAAO,GAAE,0BAA+B;IAqEpD,sCAAsC;IACtC,OAAO,CAAC,mBAAmB;IAY3B,mDAAmD;IACnD,OAAO,CAAC,sBAAsB;IAS9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuFvB;;;;;;OAMG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7B,IAAI;IAiBP;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,IAAI;IA2B3D;;;;;;;OAOG;IACH,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,UAAU,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAsBP;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAWnD;;;;;;OAMG;IACG,WAAW,CAAC,CAAC,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAKb;;;;;;;;OAQG;IACG,SAAS,CAAC,CAAC,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAQb;;;;;;;;;OASG;IACG,gBAAgB,CAAC,CAAC,EACtB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAWb;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC;;;;;;OAMG;IACG,UAAU,CAAC,CAAC,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAOb;;;;;;OAMG;IACG,eAAe,CAAC,CAAC,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAOb;;;;OAIG;IACH,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
|