catelog 1.0.0 → 1.0.2

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.
Files changed (48) hide show
  1. package/DECISION.md +183 -183
  2. package/README.md +98 -74
  3. package/USAGE.md +958 -0
  4. package/dist/adapters.d.ts +84 -0
  5. package/dist/adapters.d.ts.map +1 -0
  6. package/dist/adapters.js +267 -0
  7. package/dist/adapters.js.map +1 -0
  8. package/dist/agent.d.ts +73 -13
  9. package/dist/agent.d.ts.map +1 -1
  10. package/dist/agent.js +373 -154
  11. package/dist/agent.js.map +1 -1
  12. package/dist/banner.d.ts +6 -3
  13. package/dist/banner.d.ts.map +1 -1
  14. package/dist/banner.js +29 -18
  15. package/dist/banner.js.map +1 -1
  16. package/dist/context.d.ts +18 -0
  17. package/dist/context.d.ts.map +1 -0
  18. package/dist/context.js +82 -0
  19. package/dist/context.js.map +1 -0
  20. package/dist/index.d.ts +9 -6
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +24 -6
  23. package/dist/index.js.map +1 -1
  24. package/dist/schema.d.ts +4 -4
  25. package/dist/schema.d.ts.map +1 -1
  26. package/dist/schema.js +46 -20
  27. package/dist/schema.js.map +1 -1
  28. package/dist/security.d.ts +25 -16
  29. package/dist/security.d.ts.map +1 -1
  30. package/dist/security.js +132 -55
  31. package/dist/security.js.map +1 -1
  32. package/dist/server.d.ts +2 -2
  33. package/dist/server.d.ts.map +1 -1
  34. package/dist/server.js +8 -3
  35. package/dist/server.js.map +1 -1
  36. package/dist/sse.d.ts +31 -7
  37. package/dist/sse.d.ts.map +1 -1
  38. package/dist/sse.js +94 -26
  39. package/dist/sse.js.map +1 -1
  40. package/dist/telemetry.d.ts +41 -0
  41. package/dist/telemetry.d.ts.map +1 -0
  42. package/dist/telemetry.js +93 -0
  43. package/dist/telemetry.js.map +1 -0
  44. package/dist/types.d.ts +115 -27
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/types.js +4 -0
  47. package/dist/types.js.map +1 -1
  48. package/package.json +5 -2
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Framework Adapters
3
+ *
4
+ * Translates framework-specific streaming patterns into the Catelog
5
+ * task lifecycle contract. Each adapter is a thin transformer that:
6
+ *
7
+ * 1. Pipes framework chunks → stream.delta() / stream.progress()
8
+ * 2. Extracts telemetry (tokens, tool calls) when available
9
+ * 3. Returns the final result in Catelog's { output, telemetry } format
10
+ *
11
+ * All adapters are framework-optional — if the framework library
12
+ * isn't installed, the adapter gracefully skips enrichment.
13
+ */
14
+ import type { AgentExecutionResult, AgentStream } from "./types.js";
15
+ /**
16
+ * Pipes a Vercel AI SDK streamText/generateText result into Catelog events.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { streamText } from "ai";
21
+ * import { openai } from "@ai-sdk/openai";
22
+ *
23
+ * async execute({ input, stream }) {
24
+ * const result = streamText({
25
+ * model: openai("gpt-4o"),
26
+ * prompt: input.prompt,
27
+ * });
28
+ * return pipeAiSdkStream(result, stream);
29
+ * }
30
+ * ```
31
+ */
32
+ export declare function pipeAiSdkStream(aiResult: any, stream: AgentStream): Promise<AgentExecutionResult>;
33
+ /**
34
+ * Pipes an OpenAI SDK chat.completions.create({ stream: true }) result.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import OpenAI from "openai";
39
+ * const client = new OpenAI();
40
+ *
41
+ * async execute({ input, stream }) {
42
+ * const openaiStream = await client.chat.completions.create({
43
+ * model: "gpt-4o-mini",
44
+ * messages: [{ role: "user", content: input.prompt }],
45
+ * stream: true,
46
+ * });
47
+ * return pipeOpenAiStream(openaiStream, stream);
48
+ * }
49
+ * ```
50
+ */
51
+ export declare function pipeOpenAiStream(openaiStream: any, stream: AgentStream): Promise<AgentExecutionResult>;
52
+ /**
53
+ * Pipes a LangGraph compiled graph's stream into Catelog events.
54
+ * Translates graph node transitions to progress events and token
55
+ * deltas to stream chunks.
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * async execute({ input, stream }) {
60
+ * return pipeLangGraphStream(compiledGraph, { input }, stream);
61
+ * }
62
+ * ```
63
+ */
64
+ export declare function pipeLangGraphStream(graph: any, graphInput: Record<string, unknown>, stream: AgentStream, options?: {
65
+ signal?: AbortSignal;
66
+ }): Promise<AgentExecutionResult>;
67
+ /**
68
+ * For any framework that produces an async iterable of text chunks
69
+ * (CrewAI, LlamaIndex, custom generators, etc.)
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * async execute({ input, stream }) {
74
+ * const chunks = myCustomAgentStream(input);
75
+ * return pipeAsyncIterableStream(chunks, stream);
76
+ * }
77
+ * ```
78
+ */
79
+ export declare function pipeAsyncIterableStream(iterable: AsyncIterable<string | {
80
+ text?: string;
81
+ content?: string;
82
+ delta?: string;
83
+ }>, stream: AgentStream): Promise<AgentExecutionResult>;
84
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EAEZ,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAwD/B;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,GAAG,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAkE/B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,GAAG,EACV,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAwD/B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,aAAa,CAAC,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACrF,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAgB/B"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Framework Adapters
3
+ *
4
+ * Translates framework-specific streaming patterns into the Catelog
5
+ * task lifecycle contract. Each adapter is a thin transformer that:
6
+ *
7
+ * 1. Pipes framework chunks → stream.delta() / stream.progress()
8
+ * 2. Extracts telemetry (tokens, tool calls) when available
9
+ * 3. Returns the final result in Catelog's { output, telemetry } format
10
+ *
11
+ * All adapters are framework-optional — if the framework library
12
+ * isn't installed, the adapter gracefully skips enrichment.
13
+ */
14
+ // ─────────────────────────────────────────────────
15
+ // Vercel AI SDK Adapter
16
+ // ─────────────────────────────────────────────────
17
+ /**
18
+ * Pipes a Vercel AI SDK streamText/generateText result into Catelog events.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { streamText } from "ai";
23
+ * import { openai } from "@ai-sdk/openai";
24
+ *
25
+ * async execute({ input, stream }) {
26
+ * const result = streamText({
27
+ * model: openai("gpt-4o"),
28
+ * prompt: input.prompt,
29
+ * });
30
+ * return pipeAiSdkStream(result, stream);
31
+ * }
32
+ * ```
33
+ */
34
+ export async function pipeAiSdkStream(aiResult, stream) {
35
+ let fullText = "";
36
+ const telemetry = { framework: { adapter: "vercel-ai-sdk" } };
37
+ try {
38
+ // streamText returns a StreamTextResult with textStream
39
+ if (aiResult?.textStream && Symbol.asyncIterator in aiResult.textStream) {
40
+ for await (const chunk of aiResult.textStream) {
41
+ if (typeof chunk === "string" && chunk.length > 0) {
42
+ stream.delta(chunk);
43
+ fullText += chunk;
44
+ }
45
+ }
46
+ }
47
+ // generateText returns a GenerateTextResult with .text
48
+ else if (typeof aiResult?.text === "string") {
49
+ fullText = aiResult.text;
50
+ stream.delta(fullText);
51
+ }
52
+ // Fallback: try to iterate directly
53
+ else if (aiResult && Symbol.asyncIterator in aiResult) {
54
+ for await (const chunk of aiResult) {
55
+ const text = typeof chunk === "string" ? chunk : chunk?.textDelta || chunk?.delta || "";
56
+ if (text) {
57
+ stream.delta(text);
58
+ fullText += text;
59
+ }
60
+ }
61
+ }
62
+ // Extract token usage if available
63
+ if (aiResult?.usage) {
64
+ telemetry.llm_tokens = {
65
+ prompt: aiResult.usage.promptTokens ?? aiResult.usage.prompt_tokens,
66
+ completion: aiResult.usage.completionTokens ?? aiResult.usage.completion_tokens,
67
+ total: aiResult.usage.totalTokens ?? aiResult.usage.total_tokens,
68
+ };
69
+ }
70
+ // Extract tool calls if present
71
+ if (aiResult?.toolCalls && Array.isArray(aiResult.toolCalls)) {
72
+ telemetry.framework = {
73
+ ...telemetry.framework,
74
+ tool_calls: aiResult.toolCalls.length,
75
+ tools_used: aiResult.toolCalls.map((tc) => tc.toolName || tc.name),
76
+ };
77
+ }
78
+ }
79
+ catch (err) {
80
+ // Graceful fallback — adapter failures don't crash the agent
81
+ if (fullText) {
82
+ return { output: { text: fullText }, telemetry };
83
+ }
84
+ throw err;
85
+ }
86
+ return { output: { text: fullText }, telemetry };
87
+ }
88
+ // ─────────────────────────────────────────────────
89
+ // OpenAI SDK Stream Adapter
90
+ // ─────────────────────────────────────────────────
91
+ /**
92
+ * Pipes an OpenAI SDK chat.completions.create({ stream: true }) result.
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * import OpenAI from "openai";
97
+ * const client = new OpenAI();
98
+ *
99
+ * async execute({ input, stream }) {
100
+ * const openaiStream = await client.chat.completions.create({
101
+ * model: "gpt-4o-mini",
102
+ * messages: [{ role: "user", content: input.prompt }],
103
+ * stream: true,
104
+ * });
105
+ * return pipeOpenAiStream(openaiStream, stream);
106
+ * }
107
+ * ```
108
+ */
109
+ export async function pipeOpenAiStream(openaiStream, stream) {
110
+ let fullText = "";
111
+ let model;
112
+ let promptTokens;
113
+ let completionTokens;
114
+ const telemetry = { framework: { adapter: "openai" } };
115
+ try {
116
+ if (openaiStream && Symbol.asyncIterator in openaiStream) {
117
+ for await (const chunk of openaiStream) {
118
+ // Standard OpenAI chat completion chunk
119
+ const delta = chunk?.choices?.[0]?.delta;
120
+ if (delta?.content) {
121
+ stream.delta(delta.content);
122
+ fullText += delta.content;
123
+ }
124
+ // Tool calls in streaming mode
125
+ if (delta?.tool_calls) {
126
+ for (const tc of delta.tool_calls) {
127
+ stream.activity("tool_call", {
128
+ name: tc.function?.name,
129
+ arguments: tc.function?.arguments,
130
+ });
131
+ }
132
+ }
133
+ // Capture model name
134
+ if (chunk?.model && !model) {
135
+ model = chunk.model;
136
+ }
137
+ // Usage in final chunk (OpenAI includes this with stream_options: { include_usage: true })
138
+ if (chunk?.usage) {
139
+ promptTokens = chunk.usage.prompt_tokens;
140
+ completionTokens = chunk.usage.completion_tokens;
141
+ }
142
+ }
143
+ }
144
+ // Non-streaming response
145
+ else if (openaiStream?.choices?.[0]?.message?.content) {
146
+ fullText = openaiStream.choices[0].message.content;
147
+ stream.delta(fullText);
148
+ model = openaiStream.model;
149
+ if (openaiStream.usage) {
150
+ promptTokens = openaiStream.usage.prompt_tokens;
151
+ completionTokens = openaiStream.usage.completion_tokens;
152
+ }
153
+ }
154
+ if (model)
155
+ telemetry.model_used = model;
156
+ if (promptTokens !== undefined || completionTokens !== undefined) {
157
+ telemetry.llm_tokens = {
158
+ prompt: promptTokens,
159
+ completion: completionTokens,
160
+ total: (promptTokens ?? 0) + (completionTokens ?? 0),
161
+ };
162
+ }
163
+ }
164
+ catch (err) {
165
+ if (fullText) {
166
+ return { output: { text: fullText }, telemetry };
167
+ }
168
+ throw err;
169
+ }
170
+ return { output: { text: fullText }, telemetry };
171
+ }
172
+ // ─────────────────────────────────────────────────
173
+ // LangGraph / LangChain Adapter
174
+ // ─────────────────────────────────────────────────
175
+ /**
176
+ * Pipes a LangGraph compiled graph's stream into Catelog events.
177
+ * Translates graph node transitions to progress events and token
178
+ * deltas to stream chunks.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * async execute({ input, stream }) {
183
+ * return pipeLangGraphStream(compiledGraph, { input }, stream);
184
+ * }
185
+ * ```
186
+ */
187
+ export async function pipeLangGraphStream(graph, graphInput, stream, options) {
188
+ let lastOutput = undefined;
189
+ let nodeCount = 0;
190
+ const nodesVisited = [];
191
+ const telemetry = { framework: { adapter: "langgraph" } };
192
+ try {
193
+ // LangGraph .stream() returns an async iterable of state snapshots
194
+ const streamMethod = graph.stream || graph.streamEvents;
195
+ if (!streamMethod) {
196
+ // Fallback: invoke synchronously
197
+ const result = await graph.invoke(graphInput, { signal: options?.signal });
198
+ return { output: result, telemetry };
199
+ }
200
+ const graphStream = await streamMethod.call(graph, graphInput, {
201
+ signal: options?.signal,
202
+ streamMode: "updates",
203
+ });
204
+ for await (const event of graphStream) {
205
+ // Each event is typically { nodeName: nodeOutput }
206
+ if (typeof event === "object" && event !== null) {
207
+ for (const [nodeName, nodeOutput] of Object.entries(event)) {
208
+ nodeCount++;
209
+ nodesVisited.push(nodeName);
210
+ stream.activity("graph_node", { node: nodeName, step: nodeCount });
211
+ // If node output has messages with content, stream them
212
+ if (nodeOutput && typeof nodeOutput === "object") {
213
+ const messages = nodeOutput.messages || [];
214
+ for (const msg of messages) {
215
+ if (msg?.content && typeof msg.content === "string") {
216
+ stream.delta(msg.content);
217
+ }
218
+ }
219
+ }
220
+ lastOutput = nodeOutput;
221
+ }
222
+ }
223
+ }
224
+ telemetry.framework = {
225
+ ...telemetry.framework,
226
+ nodes_visited: nodesVisited,
227
+ node_count: nodeCount,
228
+ };
229
+ }
230
+ catch (err) {
231
+ if (lastOutput) {
232
+ return { output: lastOutput, telemetry };
233
+ }
234
+ throw err;
235
+ }
236
+ return { output: (lastOutput ?? {}), telemetry };
237
+ }
238
+ // ─────────────────────────────────────────────────
239
+ // Generic Async Iterable Adapter
240
+ // ─────────────────────────────────────────────────
241
+ /**
242
+ * For any framework that produces an async iterable of text chunks
243
+ * (CrewAI, LlamaIndex, custom generators, etc.)
244
+ *
245
+ * @example
246
+ * ```ts
247
+ * async execute({ input, stream }) {
248
+ * const chunks = myCustomAgentStream(input);
249
+ * return pipeAsyncIterableStream(chunks, stream);
250
+ * }
251
+ * ```
252
+ */
253
+ export async function pipeAsyncIterableStream(iterable, stream) {
254
+ let fullText = "";
255
+ const telemetry = { framework: { adapter: "generic-iterable" } };
256
+ for await (const chunk of iterable) {
257
+ const text = typeof chunk === "string"
258
+ ? chunk
259
+ : (chunk?.text || chunk?.content || chunk?.delta || "");
260
+ if (text) {
261
+ stream.delta(text);
262
+ fullText += text;
263
+ }
264
+ }
265
+ return { output: { text: fullText }, telemetry };
266
+ }
267
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
package/dist/agent.d.ts CHANGED
@@ -1,38 +1,98 @@
1
1
  import { SecurityManager } from "./security.js";
2
2
  import { type SchemaLike } from "./schema.js";
3
- import { type AgentCapabilities, type AgentExecutionContext, type AgentExecutionResult, type AgentManifest, type HealthCheckResponse } from "./types.js";
3
+ import { type AgentCapabilities, type AgentExecutionContext, type AgentExecutionResult, type AgentManifest, type ExecutionMode, type HealthCheckResponse, type NeedInputResult } from "./types.js";
4
4
  import { type ServerOptions } from "./server.js";
5
5
  import type { IncomingMessage, ServerResponse, Server } from "node:http";
6
- export interface MarketplaceAgentConfig<TInput = Record<string, unknown>, TOutput = Record<string, unknown>> {
6
+ export interface CatelogAgentConfig<TInput = any, TOutput = any> {
7
+ /** Unique slug ID (auto-generated from name if omitted) */
7
8
  id?: string;
9
+ /** Human-readable agent name */
8
10
  name: string;
11
+ /** Semantic version (default: "1.0.0") */
9
12
  version?: string;
13
+ /** Short description for marketplace listing */
10
14
  description?: string;
11
- secret?: string;
15
+ /**
16
+ * Secret key for HMAC / Bearer auth.
17
+ * Auto-reads CATELOG_SECRET_KEY from env if omitted.
18
+ */
19
+ secretKey?: string;
20
+ /**
21
+ * Publishable key for public endpoints.
22
+ * Auto-reads CATELOG_PUBLIC_KEY from env if omitted.
23
+ */
24
+ publicKey?: string;
25
+ /**
26
+ * Execution mode:
27
+ * - "sync" (default): Direct HTTP/SSE stream, resolves in same connection.
28
+ * - "async": Returns 202 immediately, polled via GET /tasks/:id.
29
+ * - "conversational": Supports ctx.needInput() for HITL multi-turn.
30
+ */
31
+ mode?: ExecutionMode;
32
+ /** Partial capabilities overrides */
12
33
  capabilities?: Partial<AgentCapabilities>;
13
- inputSchema: SchemaLike;
14
- outputSchema: SchemaLike;
15
- execute: (ctx: AgentExecutionContext<TInput>) => Promise<AgentExecutionResult<TOutput>>;
34
+ /**
35
+ * Input schema (Zod or JSON Schema). OPTIONAL — if omitted, accepts any JSON.
36
+ */
37
+ inputSchema?: SchemaLike;
38
+ /**
39
+ * Output schema (Zod or JSON Schema). OPTIONAL — if omitted, no output validation.
40
+ */
41
+ outputSchema?: SchemaLike;
42
+ /**
43
+ * The core execution function. This is the ONLY thing the developer MUST provide.
44
+ *
45
+ * - Return a value → task completes automatically
46
+ * - Throw an error → task fails automatically
47
+ * - Use ctx.needInput() → task suspends for human input
48
+ * - Use stream.delta() / stream.progress() → real-time events to marketplace
49
+ */
50
+ execute: (ctx: AgentExecutionContext<TInput>) => Promise<AgentExecutionResult<TOutput> | NeedInputResult | TOutput>;
51
+ /** Optional telemetry reporting config */
52
+ telemetry?: {
53
+ endpoint?: string;
54
+ disabled?: boolean;
55
+ };
16
56
  }
17
- export declare class MarketplaceAgent<TInput = Record<string, unknown>, TOutput = Record<string, unknown>> {
57
+ export declare class CatelogAgent<TInput = any, TOutput = any> {
18
58
  readonly id: string;
19
59
  readonly name: string;
20
60
  readonly version: string;
21
61
  readonly description: string;
62
+ readonly mode: ExecutionMode;
22
63
  readonly capabilities: AgentCapabilities;
23
64
  readonly security: SecurityManager;
24
65
  private readonly config;
25
66
  private readonly startTime;
26
- constructor(config: MarketplaceAgentConfig<TInput, TOutput>);
67
+ private readonly telemetryReporter;
68
+ constructor(config: CatelogAgentConfig<TInput, TOutput>);
27
69
  getHealth(): HealthCheckResponse;
28
70
  getManifest(): AgentManifest;
71
+ listen(portOrOptions?: number | ServerOptions): Server;
72
+ /** Alias for backward compat */
29
73
  serve(portOrOptions?: number | ServerOptions): Server;
30
74
  handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void>;
31
75
  private handleExecute;
32
- private writeJsonResponse;
76
+ private executeAsync;
77
+ private executeSyncOrConversational;
78
+ private executeWithSSE;
79
+ private executeWithJSON;
80
+ private handleTaskPoll;
81
+ /**
82
+ * Normalize the developer's return value into our standard result shape.
83
+ * Supports:
84
+ * - { output: T, telemetry?: ... } → standard result
85
+ * - Any other value → treated as the output directly
86
+ */
87
+ private normalizeExecuteResult;
88
+ private isNeedInputResult;
89
+ private reportTelemetry;
90
+ private writeJson;
33
91
  }
34
- /**
35
- * Convenience builder function for creating a compliant Marketplace Agent
36
- */
37
- export declare function createMarketplaceAgent<TInput = Record<string, unknown>, TOutput = Record<string, unknown>>(config: MarketplaceAgentConfig<TInput, TOutput>): MarketplaceAgent<TInput, TOutput>;
92
+ /** Create a new CatelogAgent */
93
+ export declare function createAgent<TInput = any, TOutput = any>(config: CatelogAgentConfig<TInput, TOutput>): CatelogAgent<TInput, TOutput>;
94
+ /** Legacy alias */
95
+ export declare function createMarketplaceAgent<TInput = any, TOutput = any>(config: CatelogAgentConfig<TInput, TOutput>): CatelogAgent<TInput, TOutput>;
96
+ export { CatelogAgent as MarketplaceAgent };
97
+ export type { CatelogAgentConfig as MarketplaceAgentConfig };
38
98
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAGlB,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEzE,MAAM,WAAW,sBAAsB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;IACzB,OAAO,EAAE,CAAC,GAAG,EAAE,qBAAqB,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;CACzF;AAED,qBAAa,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/F,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,SAAgB,YAAY,EAAE,iBAAiB,CAAC;IAChD,SAAgB,QAAQ,EAAE,eAAe,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,EAAE,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC;IAgBpD,SAAS,IAAI,mBAAmB;IAShC,WAAW,IAAI,aAAa;IAa5B,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM;IAK/C,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAkDtE,aAAa;IAoK3B,OAAO,CAAC,iBAAiB;CAS1B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxG,MAAM,EAAE,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9C,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}