@introspection-sdk/introspection-node 0.20.0 → 0.21.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 +28 -8
- package/dist/auth.d.ts +1 -1
- package/dist/client.d.ts +4 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +16 -7
- package/dist/client.js.map +1 -1
- package/dist/dev-target.js +1 -1
- package/dist/index.d.ts +3 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/otel/index.d.ts +1 -14
- package/dist/otel/index.d.ts.map +1 -1
- package/dist/otel/index.js +10 -18
- package/dist/otel/index.js.map +1 -1
- package/dist/otel/init.d.ts +19 -21
- package/dist/otel/init.d.ts.map +1 -1
- package/dist/otel/init.js +62 -48
- package/dist/otel/init.js.map +1 -1
- package/dist/otel/integrations/base.d.ts +17 -37
- package/dist/otel/integrations/base.d.ts.map +1 -1
- package/dist/otel/integrations/base.js +6 -13
- package/dist/otel/integrations/base.js.map +1 -1
- package/dist/otel/integrations/index.d.ts +3 -4
- package/dist/otel/integrations/index.d.ts.map +1 -1
- package/dist/otel/integrations/index.js +6 -25
- package/dist/otel/integrations/index.js.map +1 -1
- package/dist/otel/integrations/pi.d.ts.map +1 -1
- package/dist/otel/integrations/pi.js +9 -1
- package/dist/otel/integrations/pi.js.map +1 -1
- package/dist/otel/logs.d.ts +41 -8
- package/dist/otel/logs.d.ts.map +1 -1
- package/dist/otel/logs.js +95 -66
- package/dist/otel/logs.js.map +1 -1
- package/dist/otel/pi.d.ts +18 -5
- package/dist/otel/pi.d.ts.map +1 -1
- package/dist/otel/pi.js +38 -9
- package/dist/otel/pi.js.map +1 -1
- package/dist/otel/register.d.ts +2 -2
- package/dist/otel/register.d.ts.map +1 -1
- package/dist/otel/register.js +7 -9
- package/dist/otel/register.js.map +1 -1
- package/dist/otel/setup.d.ts +2 -2
- package/dist/otel/setup.d.ts.map +1 -1
- package/dist/otel/setup.js +16 -6
- package/dist/otel/setup.js.map +1 -1
- package/dist/otel/span-processor.d.ts +18 -5
- package/dist/otel/span-processor.d.ts.map +1 -1
- package/dist/otel/span-processor.js +50 -65
- package/dist/otel/span-processor.js.map +1 -1
- package/dist/resources/experiments.d.ts +10 -5
- package/dist/resources/experiments.d.ts.map +1 -1
- package/dist/resources/experiments.js +9 -25
- package/dist/resources/experiments.js.map +1 -1
- package/dist/resources/recipes.d.ts +6 -6
- package/dist/resources/recipes.d.ts.map +1 -1
- package/dist/resources/recipes.js +5 -23
- package/dist/resources/recipes.js.map +1 -1
- package/dist/resources/runtimes.d.ts +2 -2
- package/dist/resources/runtimes.d.ts.map +1 -1
- package/dist/resources/runtimes.js +2 -2
- package/dist/resources/runtimes.js.map +1 -1
- package/dist/runner.d.ts +8 -4
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +26 -18
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +45 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +61 -2
- package/dist/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +16 -58
- package/.turbo/turbo-build.log +0 -4
- package/dist/converters/claude.d.ts +0 -150
- package/dist/converters/claude.d.ts.map +0 -1
- package/dist/converters/claude.js +0 -211
- package/dist/converters/claude.js.map +0 -1
- package/dist/converters/gemini.d.ts +0 -90
- package/dist/converters/gemini.d.ts.map +0 -1
- package/dist/converters/gemini.js +0 -171
- package/dist/converters/gemini.js.map +0 -1
- package/dist/converters/index.d.ts +0 -9
- package/dist/converters/index.d.ts.map +0 -1
- package/dist/converters/index.js +0 -9
- package/dist/converters/index.js.map +0 -1
- package/dist/converters/openai.d.ts +0 -51
- package/dist/converters/openai.d.ts.map +0 -1
- package/dist/converters/openai.js +0 -269
- package/dist/converters/openai.js.map +0 -1
- package/dist/converters/openinference.d.ts +0 -107
- package/dist/converters/openinference.d.ts.map +0 -1
- package/dist/converters/openinference.js +0 -553
- package/dist/converters/openinference.js.map +0 -1
- package/dist/converters/vercel.d.ts +0 -21
- package/dist/converters/vercel.d.ts.map +0 -1
- package/dist/converters/vercel.js +0 -236
- package/dist/converters/vercel.js.map +0 -1
- package/dist/otel/anthropic.d.ts +0 -63
- package/dist/otel/anthropic.d.ts.map +0 -1
- package/dist/otel/anthropic.js +0 -475
- package/dist/otel/anthropic.js.map +0 -1
- package/dist/otel/claude-hooks.d.ts +0 -346
- package/dist/otel/claude-hooks.d.ts.map +0 -1
- package/dist/otel/claude-hooks.js +0 -647
- package/dist/otel/claude-hooks.js.map +0 -1
- package/dist/otel/claude-wrapper.d.ts +0 -93
- package/dist/otel/claude-wrapper.d.ts.map +0 -1
- package/dist/otel/claude-wrapper.js +0 -155
- package/dist/otel/claude-wrapper.js.map +0 -1
- package/dist/otel/gemini.d.ts +0 -56
- package/dist/otel/gemini.d.ts.map +0 -1
- package/dist/otel/gemini.js +0 -350
- package/dist/otel/gemini.js.map +0 -1
- package/dist/otel/integrations/anthropic.d.ts +0 -10
- package/dist/otel/integrations/anthropic.d.ts.map +0 -1
- package/dist/otel/integrations/anthropic.js +0 -26
- package/dist/otel/integrations/anthropic.js.map +0 -1
- package/dist/otel/integrations/claude-agent.d.ts +0 -12
- package/dist/otel/integrations/claude-agent.d.ts.map +0 -1
- package/dist/otel/integrations/claude-agent.js +0 -28
- package/dist/otel/integrations/claude-agent.js.map +0 -1
- package/dist/otel/integrations/gemini.d.ts +0 -11
- package/dist/otel/integrations/gemini.d.ts.map +0 -1
- package/dist/otel/integrations/gemini.js +0 -23
- package/dist/otel/integrations/gemini.js.map +0 -1
- package/dist/otel/integrations/langchain.d.ts +0 -15
- package/dist/otel/integrations/langchain.d.ts.map +0 -1
- package/dist/otel/integrations/langchain.js +0 -43
- package/dist/otel/integrations/langchain.js.map +0 -1
- package/dist/otel/integrations/mastra.d.ts +0 -14
- package/dist/otel/integrations/mastra.d.ts.map +0 -1
- package/dist/otel/integrations/mastra.js +0 -31
- package/dist/otel/integrations/mastra.js.map +0 -1
- package/dist/otel/integrations/openai-agents.d.ts +0 -11
- package/dist/otel/integrations/openai-agents.d.ts.map +0 -1
- package/dist/otel/integrations/openai-agents.js +0 -30
- package/dist/otel/integrations/openai-agents.js.map +0 -1
- package/dist/otel/integrations/vercel.d.ts +0 -14
- package/dist/otel/integrations/vercel.d.ts.map +0 -1
- package/dist/otel/integrations/vercel.js +0 -20
- package/dist/otel/integrations/vercel.js.map +0 -1
- package/dist/otel/langchain-handler.d.ts +0 -112
- package/dist/otel/langchain-handler.d.ts.map +0 -1
- package/dist/otel/langchain-handler.js +0 -561
- package/dist/otel/langchain-handler.js.map +0 -1
- package/dist/otel/mastra-exporter.d.ts +0 -87
- package/dist/otel/mastra-exporter.d.ts.map +0 -1
- package/dist/otel/mastra-exporter.js +0 -530
- package/dist/otel/mastra-exporter.js.map +0 -1
- package/dist/otel/openai.d.ts +0 -20
- package/dist/otel/openai.d.ts.map +0 -1
- package/dist/otel/openai.js +0 -55
- package/dist/otel/openai.js.map +0 -1
- package/dist/otel/tracing-processor.d.ts +0 -139
- package/dist/otel/tracing-processor.d.ts.map +0 -1
- package/dist/otel/tracing-processor.js +0 -434
- package/dist/otel/tracing-processor.js.map +0 -1
- package/eslint.config.mjs +0 -4
- package/src/auth.ts +0 -236
- package/src/client.ts +0 -163
- package/src/converters/claude.ts +0 -343
- package/src/converters/gemini.ts +0 -243
- package/src/converters/index.ts +0 -50
- package/src/converters/openai.ts +0 -300
- package/src/converters/openinference.ts +0 -665
- package/src/converters/vercel.ts +0 -302
- package/src/dev-target.ts +0 -79
- package/src/http.ts +0 -43
- package/src/index.ts +0 -277
- package/src/otel/anthropic.ts +0 -619
- package/src/otel/claude-hooks.ts +0 -1116
- package/src/otel/claude-wrapper.ts +0 -239
- package/src/otel/gemini.ts +0 -483
- package/src/otel/index.ts +0 -128
- package/src/otel/init.ts +0 -411
- package/src/otel/integrations/anthropic.ts +0 -36
- package/src/otel/integrations/base.ts +0 -158
- package/src/otel/integrations/claude-agent.ts +0 -36
- package/src/otel/integrations/gemini.ts +0 -30
- package/src/otel/integrations/index.ts +0 -152
- package/src/otel/integrations/langchain.ts +0 -60
- package/src/otel/integrations/mastra.ts +0 -48
- package/src/otel/integrations/openai-agents.ts +0 -47
- package/src/otel/integrations/pi.ts +0 -28
- package/src/otel/integrations/vercel.ts +0 -26
- package/src/otel/langchain-handler.ts +0 -804
- package/src/otel/logs.ts +0 -395
- package/src/otel/mastra-exporter.ts +0 -714
- package/src/otel/openai.ts +0 -93
- package/src/otel/pi.ts +0 -94
- package/src/otel/register.ts +0 -50
- package/src/otel/setup.ts +0 -215
- package/src/otel/span-processor.ts +0 -512
- package/src/otel/tracing-processor.ts +0 -637
- package/src/pagination.ts +0 -10
- package/src/proxy-from-env.d.ts +0 -7
- package/src/resources/experiments.ts +0 -176
- package/src/resources/recipes.ts +0 -74
- package/src/resources/runtimes.ts +0 -31
- package/src/runner.ts +0 -213
- package/src/types.ts +0 -13
- package/src/utils.ts +0 -95
- package/src/version.ts +0 -2
- package/tsconfig.json +0 -8
|
@@ -1,239 +0,0 @@
|
|
|
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
|
-
|
|
23
|
-
import {
|
|
24
|
-
IntrospectionClaudeHooks,
|
|
25
|
-
type IntrospectionClaudeHooksOptions,
|
|
26
|
-
type ClaudeHooksConfig,
|
|
27
|
-
type ClaudeSDKMessage,
|
|
28
|
-
} from "./claude-hooks.js";
|
|
29
|
-
import { logger } from "../utils.js";
|
|
30
|
-
|
|
31
|
-
// --- Public types ---
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Configuration for {@link withIntrospection}.
|
|
35
|
-
*
|
|
36
|
-
* Alias of {@link IntrospectionClaudeHooksOptions}.
|
|
37
|
-
*/
|
|
38
|
-
export type WithIntrospectionOptions = IntrospectionClaudeHooksOptions;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Minimal interface for the Claude Agent SDK module.
|
|
42
|
-
* Accepts `import * as sdk from "@anthropic-ai/claude-agent-sdk"`.
|
|
43
|
-
*
|
|
44
|
-
* Uses `any` for the query signature to accept any SDK version's types
|
|
45
|
-
* without requiring the SDK as a compile-time dependency.
|
|
46
|
-
*/
|
|
47
|
-
export interface ClaudeAgentSDKModule {
|
|
48
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
-
query: (...args: any[]) => any;
|
|
50
|
-
[key: string]: unknown;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* The instrumented SDK returned by {@link withIntrospection}.
|
|
55
|
-
*
|
|
56
|
-
* Exposes the same surface as the original SDK module plus tracing helpers.
|
|
57
|
-
*/
|
|
58
|
-
export interface InstrumentedClaudeAgentSDK {
|
|
59
|
-
/** Instrumented `query()` — auto-captures prompt, hooks, and usage. */
|
|
60
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
-
query: (...args: any[]) => any;
|
|
62
|
-
/**
|
|
63
|
-
* Flush pending spans without shutting down.
|
|
64
|
-
*
|
|
65
|
-
* @returns A promise that resolves once the flush completes.
|
|
66
|
-
*/
|
|
67
|
-
forceFlush(): Promise<void>;
|
|
68
|
-
/**
|
|
69
|
-
* Shut down tracing and flush all pending spans.
|
|
70
|
-
*
|
|
71
|
-
* @returns A promise that resolves once shutdown is complete.
|
|
72
|
-
*/
|
|
73
|
-
shutdown(): Promise<void>;
|
|
74
|
-
/** The underlying {@link IntrospectionClaudeHooks} instance for advanced usage. */
|
|
75
|
-
readonly hooks: IntrospectionClaudeHooks;
|
|
76
|
-
/** All other SDK exports pass through unchanged. */
|
|
77
|
-
[key: string]: unknown;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// --- Implementation ---
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Wrap the Claude Agent SDK module to automatically instrument every
|
|
84
|
-
* `query()` call with OpenTelemetry tracing.
|
|
85
|
-
*
|
|
86
|
-
* The returned SDK:
|
|
87
|
-
* - Auto-captures `prompt` and `systemPrompt` from query params
|
|
88
|
-
* - Injects instrumentation hooks (merged with any user-provided hooks)
|
|
89
|
-
* - Calls {@link IntrospectionClaudeHooks.recordUsage | recordUsage()} on
|
|
90
|
-
* every streamed message automatically
|
|
91
|
-
* - Flushes spans when each query stream completes
|
|
92
|
-
*
|
|
93
|
-
* @param sdk - The Claude Agent SDK module
|
|
94
|
-
* (`import * as sdk from "@anthropic-ai/claude-agent-sdk"`).
|
|
95
|
-
* @param options - Introspection configuration (token, serviceName, baseUrl, etc.).
|
|
96
|
-
* @returns An {@link InstrumentedClaudeAgentSDK} with the same API plus
|
|
97
|
-
* `forceFlush()`, `shutdown()`, and `hooks`.
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* ```ts
|
|
101
|
-
* import * as sdk from "@anthropic-ai/claude-agent-sdk";
|
|
102
|
-
* import { withIntrospection } from "@introspection-sdk/introspection-node";
|
|
103
|
-
*
|
|
104
|
-
* const traced = withIntrospection(sdk, { serviceName: "my-agent" });
|
|
105
|
-
* for await (const msg of traced.query({ prompt: "Hello" })) { /* … *\/ }
|
|
106
|
-
* await traced.shutdown();
|
|
107
|
-
* ```
|
|
108
|
-
*/
|
|
109
|
-
export function withIntrospection(
|
|
110
|
-
sdk: ClaudeAgentSDKModule,
|
|
111
|
-
options?: WithIntrospectionOptions,
|
|
112
|
-
): InstrumentedClaudeAgentSDK {
|
|
113
|
-
const hooks = new IntrospectionClaudeHooks(options);
|
|
114
|
-
|
|
115
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
|
-
function wrappedQuery(params: any): any {
|
|
117
|
-
// Auto-capture prompt
|
|
118
|
-
if (typeof params?.prompt === "string") {
|
|
119
|
-
hooks.setInputPrompt(params.prompt);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Auto-capture systemPrompt from options
|
|
123
|
-
const opts = (params?.options || {}) as Record<string, unknown>;
|
|
124
|
-
if (typeof opts.systemPrompt === "string") {
|
|
125
|
-
hooks.setSystemInstructions(opts.systemPrompt);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Merge instrumentation hooks with any user-provided hooks
|
|
129
|
-
const introspectionHooks = hooks.getHooks();
|
|
130
|
-
const userHooks = opts.hooks as
|
|
131
|
-
Partial<Record<string, unknown[]>> | undefined;
|
|
132
|
-
const mergedHooks = mergeHooks(introspectionHooks, userHooks);
|
|
133
|
-
|
|
134
|
-
// Call original query with merged hooks
|
|
135
|
-
const modifiedOptions = { ...opts, hooks: mergedHooks };
|
|
136
|
-
const originalQuery = sdk.query({
|
|
137
|
-
...params,
|
|
138
|
-
options: modifiedOptions,
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// Wrap the async generator to intercept messages
|
|
142
|
-
return wrapQueryResult(originalQuery, hooks);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
...sdk,
|
|
147
|
-
query: wrappedQuery,
|
|
148
|
-
hooks,
|
|
149
|
-
forceFlush: () => hooks.forceFlush(),
|
|
150
|
-
shutdown: () => hooks.shutdown(),
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Merges introspection hooks with user-provided hooks.
|
|
156
|
-
* Introspection hooks fire first, then user hooks.
|
|
157
|
-
* User hooks on events we don't handle pass through untouched.
|
|
158
|
-
*/
|
|
159
|
-
function mergeHooks(
|
|
160
|
-
introspectionHooks: ClaudeHooksConfig,
|
|
161
|
-
userHooks?: Partial<Record<string, unknown[]>>,
|
|
162
|
-
): Record<string, unknown[]> {
|
|
163
|
-
if (!userHooks) {
|
|
164
|
-
return introspectionHooks as Record<string, unknown[]>;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const merged: Record<string, unknown[]> = {};
|
|
168
|
-
const allEvents = new Set([
|
|
169
|
-
...Object.keys(introspectionHooks),
|
|
170
|
-
...Object.keys(userHooks),
|
|
171
|
-
]);
|
|
172
|
-
|
|
173
|
-
for (const event of allEvents) {
|
|
174
|
-
const ours = (introspectionHooks as Record<string, unknown[]>)[event] || [];
|
|
175
|
-
const theirs = userHooks[event] || [];
|
|
176
|
-
merged[event] = [...ours, ...theirs];
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return merged;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Wraps a Query async generator to intercept messages for usage recording.
|
|
184
|
-
* Uses a Proxy to transparently forward all non-iterator properties
|
|
185
|
-
* (interrupt, close, setModel, etc.) to the original Query object.
|
|
186
|
-
*/
|
|
187
|
-
function wrapQueryResult(
|
|
188
|
-
originalQuery: unknown,
|
|
189
|
-
hooks: IntrospectionClaudeHooks,
|
|
190
|
-
): unknown {
|
|
191
|
-
const query = originalQuery as AsyncGenerator<ClaudeSDKMessage, void> &
|
|
192
|
-
Record<string, unknown>;
|
|
193
|
-
|
|
194
|
-
async function* instrumentedIterator(): AsyncGenerator<
|
|
195
|
-
ClaudeSDKMessage,
|
|
196
|
-
void
|
|
197
|
-
> {
|
|
198
|
-
try {
|
|
199
|
-
for await (const message of query) {
|
|
200
|
-
hooks.recordUsage(message);
|
|
201
|
-
yield message;
|
|
202
|
-
}
|
|
203
|
-
} finally {
|
|
204
|
-
try {
|
|
205
|
-
await hooks.forceFlush();
|
|
206
|
-
} catch (flushError) {
|
|
207
|
-
logger.warn("Failed to flush spans after query completed", flushError);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const wrapped = instrumentedIterator();
|
|
213
|
-
|
|
214
|
-
// Use Proxy to transparently delegate non-iterator properties to original query.
|
|
215
|
-
// Iterator protocol methods come from our wrapper (bound to the actual generator
|
|
216
|
-
// to avoid "incompatible receiver" errors); everything else (interrupt, close,
|
|
217
|
-
// setModel, setPermissionMode, etc.) delegates to the original Query.
|
|
218
|
-
return new Proxy(wrapped, {
|
|
219
|
-
get(target, prop) {
|
|
220
|
-
if (
|
|
221
|
-
prop === Symbol.asyncIterator ||
|
|
222
|
-
prop === "next" ||
|
|
223
|
-
prop === "return" ||
|
|
224
|
-
prop === "throw"
|
|
225
|
-
) {
|
|
226
|
-
const value = Reflect.get(target, prop);
|
|
227
|
-
if (typeof value === "function") {
|
|
228
|
-
return value.bind(target);
|
|
229
|
-
}
|
|
230
|
-
return value;
|
|
231
|
-
}
|
|
232
|
-
const original = query[prop as string];
|
|
233
|
-
if (typeof original === "function") {
|
|
234
|
-
return original.bind(query);
|
|
235
|
-
}
|
|
236
|
-
return original;
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
}
|