@prefactor/langchain 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,177 @@
1
+ # @prefactor/langchain
2
+
3
+ LangChain.js integration for Prefactor observability. Provides automatic tracing of LLM calls, tool executions, and agent workflows with minimal setup.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @prefactor/langchain
9
+ # or
10
+ bun add @prefactor/langchain
11
+ ```
12
+
13
+ Note: This package requires `@prefactor/core` as a peer dependency, which will be installed automatically.
14
+
15
+ ## Peer Dependencies
16
+
17
+ This package requires LangChain.js v1.0.0 or later:
18
+
19
+ ```bash
20
+ npm install langchain@^1.0.0
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ```typescript
26
+ import { createAgent, tool } from 'langchain';
27
+ import { z } from 'zod';
28
+ import { init, shutdown } from '@prefactor/langchain';
29
+
30
+ // Initialize Prefactor
31
+ const middleware = init();
32
+
33
+ // Create agent with middleware
34
+ const agent = createAgent({
35
+ model: 'claude-sonnet-4-5-20250929',
36
+ tools: [],
37
+ systemPrompt: 'You are a helpful assistant.',
38
+ middleware: [middleware],
39
+ });
40
+
41
+ // All operations are automatically traced
42
+ const result = await agent.invoke({
43
+ messages: [{ role: 'user', content: 'Hello!' }],
44
+ });
45
+
46
+ // Graceful shutdown
47
+ await shutdown();
48
+ ```
49
+
50
+ ## Exports
51
+
52
+ ### Main Entry Points
53
+
54
+ ```typescript
55
+ import {
56
+ init, // Initialize SDK and return middleware
57
+ shutdown, // Flush spans and close connections
58
+ getTracer, // Get tracer for manual instrumentation
59
+ } from '@prefactor/langchain';
60
+ ```
61
+
62
+ ### Middleware
63
+
64
+ ```typescript
65
+ import { PrefactorMiddleware } from '@prefactor/langchain';
66
+ ```
67
+
68
+ ### Utilities
69
+
70
+ ```typescript
71
+ import { extractTokenUsage } from '@prefactor/langchain';
72
+ ```
73
+
74
+ ### Re-exports from @prefactor/core
75
+
76
+ For convenience, common types are re-exported:
77
+
78
+ ```typescript
79
+ import {
80
+ type Config,
81
+ type CoreRuntime,
82
+ type HttpTransportConfig,
83
+ type Span,
84
+ SpanStatus,
85
+ SpanType,
86
+ } from '@prefactor/langchain';
87
+ ```
88
+
89
+ ## Configuration
90
+
91
+ ### Environment Variables
92
+
93
+ - `PREFACTOR_TRANSPORT`: `"stdio"` | `"http"` (default: `"stdio"`)
94
+ - `PREFACTOR_API_URL`: API endpoint for HTTP transport
95
+ - `PREFACTOR_API_TOKEN`: Authentication token
96
+ - `PREFACTOR_SAMPLE_RATE`: Sampling rate 0.0-1.0 (default: `1.0`)
97
+ - `PREFACTOR_CAPTURE_INPUTS`: Capture span inputs (default: `true`)
98
+ - `PREFACTOR_CAPTURE_OUTPUTS`: Capture span outputs (default: `true`)
99
+ - `PREFACTOR_MAX_INPUT_LENGTH`: Max input string length (default: `10000`)
100
+ - `PREFACTOR_MAX_OUTPUT_LENGTH`: Max output string length (default: `10000`)
101
+ - `PREFACTOR_LOG_LEVEL`: `"debug"` | `"info"` | `"warn"` | `"error"` (default: `"info")`
102
+
103
+ ### Programmatic Configuration
104
+
105
+ ```typescript
106
+ import { init } from '@prefactor/langchain';
107
+
108
+ // STDIO transport (default)
109
+ const middleware = init();
110
+
111
+ // HTTP transport
112
+ const middleware = init({
113
+ transportType: 'http',
114
+ httpConfig: {
115
+ apiUrl: 'https://api.prefactor.ai',
116
+ apiToken: process.env.PREFACTOR_API_TOKEN!,
117
+ agentId: 'my-agent',
118
+ agentIdentifier: '1.0.0',
119
+ agentName: 'My Agent',
120
+ agentDescription: 'An agent description',
121
+ },
122
+ });
123
+ ```
124
+
125
+ ## What Gets Traced
126
+
127
+ The middleware automatically captures:
128
+
129
+ - **LLM Calls**: Model name, inputs, outputs, token usage
130
+ - **Tool Executions**: Tool name, inputs, outputs, duration
131
+ - **Agent Operations**: Full workflow with parent-child relationships
132
+ - **Errors**: Stack traces and error messages
133
+
134
+ ## Manual Instrumentation
135
+
136
+ For operations not automatically traced:
137
+
138
+ ```typescript
139
+ import { getTracer, SpanType } from '@prefactor/langchain';
140
+
141
+ const tracer = getTracer();
142
+
143
+ const span = tracer.startSpan({
144
+ name: 'custom-operation',
145
+ spanType: SpanType.TOOL,
146
+ inputs: { data: 'example' },
147
+ });
148
+
149
+ try {
150
+ const result = await doWork();
151
+ tracer.endSpan(span, { outputs: { result } });
152
+ } catch (error) {
153
+ tracer.endSpan(span, { error });
154
+ }
155
+ ```
156
+
157
+ ## Graceful Shutdown
158
+
159
+ Always call `shutdown()` before your application exits to ensure all pending spans are flushed:
160
+
161
+ ```typescript
162
+ import { shutdown } from '@prefactor/langchain';
163
+
164
+ process.on('SIGTERM', async () => {
165
+ await shutdown();
166
+ process.exit(0);
167
+ });
168
+ ```
169
+
170
+ ## Requirements
171
+
172
+ - Node.js >= 24.0.0
173
+ - LangChain.js >= 1.0.0
174
+
175
+ ## License
176
+
177
+ MIT
package/dist/index.cjs CHANGED
@@ -42,7 +42,6 @@ var import_core3 = require("@prefactor/core");
42
42
 
43
43
  // packages/langchain/src/init.ts
44
44
  var import_core2 = require("@prefactor/core");
45
- var import_pfid = require("@prefactor/pfid");
46
45
  var import_langchain = require("langchain");
47
46
 
48
47
  // packages/langchain/src/middleware.ts
@@ -84,22 +83,24 @@ function extractTokenUsage(response) {
84
83
  // packages/langchain/src/middleware.ts
85
84
  class PrefactorMiddleware {
86
85
  tracer;
86
+ agentManager;
87
+ agentInfo;
87
88
  rootSpan = null;
88
- constructor(tracer) {
89
+ constructor(tracer, agentManager, agentInfo) {
89
90
  this.tracer = tracer;
91
+ this.agentManager = agentManager;
92
+ this.agentInfo = agentInfo;
90
93
  }
91
94
  async beforeAgent(state) {
92
- const parentSpan = import_core.SpanContext.getCurrent();
93
95
  const messages = state?.messages ?? [];
94
- this.tracer.startAgentInstance();
96
+ this.agentManager.startInstance(this.agentInfo);
95
97
  const span = this.tracer.startSpan({
96
- name: "agent",
98
+ name: "langchain:agent",
97
99
  spanType: import_core.SpanType.AGENT,
98
- inputs: { messages: messages.slice(-3).map((m) => String(m)) },
99
- parentSpanId: parentSpan?.spanId,
100
- traceId: parentSpan?.traceId
100
+ inputs: { messages: messages.slice(-3).map((m) => String(m)) }
101
101
  });
102
102
  this.rootSpan = span;
103
+ import_core.SpanContext.enter(span);
103
104
  }
104
105
  async afterAgent(state) {
105
106
  if (!this.rootSpan) {
@@ -109,18 +110,15 @@ class PrefactorMiddleware {
109
110
  this.tracer.endSpan(this.rootSpan, {
110
111
  outputs: { messages: messages.slice(-3).map((m) => String(m)) }
111
112
  });
112
- this.tracer.finishAgentInstance();
113
- import_core.SpanContext.clear();
113
+ this.agentManager.finishInstance();
114
+ import_core.SpanContext.exit();
114
115
  this.rootSpan = null;
115
116
  }
116
117
  async wrapModelCall(request, handler) {
117
- const parentSpan = import_core.SpanContext.getCurrent();
118
118
  const span = this.tracer.startSpan({
119
119
  name: this.extractModelName(request),
120
120
  spanType: import_core.SpanType.LLM,
121
- inputs: this.extractModelInputs(request),
122
- parentSpanId: parentSpan?.spanId,
123
- traceId: parentSpan?.traceId
121
+ inputs: this.extractModelInputs(request)
124
122
  });
125
123
  try {
126
124
  const response = await import_core.SpanContext.runAsync(span, async () => {
@@ -136,13 +134,10 @@ class PrefactorMiddleware {
136
134
  }
137
135
  }
138
136
  async wrapToolCall(request, handler) {
139
- const parentSpan = import_core.SpanContext.getCurrent();
140
137
  const span = this.tracer.startSpan({
141
138
  name: this.extractToolName(request),
142
139
  spanType: import_core.SpanType.TOOL,
143
- inputs: this.extractToolInputs(request),
144
- parentSpanId: parentSpan?.spanId,
145
- traceId: parentSpan?.traceId
140
+ inputs: this.extractToolInputs(request)
146
141
  });
147
142
  try {
148
143
  const response = await import_core.SpanContext.runAsync(span, async () => {
@@ -181,36 +176,40 @@ class PrefactorMiddleware {
181
176
 
182
177
  // packages/langchain/src/init.ts
183
178
  var logger = import_core2.getLogger("init");
179
+ var globalCore = null;
184
180
  var globalTracer = null;
185
181
  var globalMiddleware = null;
186
182
  function init(config) {
187
183
  import_core2.configureLogging();
188
- const finalConfig = import_core2.createConfig(config);
189
- logger.info("Initializing Prefactor SDK", { transport: finalConfig.transportType });
184
+ const configWithDefaults = {
185
+ ...config,
186
+ httpConfig: config?.httpConfig ? {
187
+ schemaName: "langchain:agent",
188
+ ...config.httpConfig
189
+ } : undefined
190
+ };
191
+ const finalConfig = import_core2.createConfig(configWithDefaults);
190
192
  if (globalMiddleware !== null) {
191
193
  return globalMiddleware;
192
194
  }
193
- let transport;
194
- if (finalConfig.transportType === "stdio") {
195
- transport = new import_core2.StdioTransport;
195
+ const core = import_core2.createCore(finalConfig);
196
+ globalCore = core;
197
+ globalTracer = core.tracer;
198
+ const httpConfig = finalConfig.httpConfig;
199
+ if (httpConfig?.agentSchema) {
200
+ core.agentManager.registerSchema(httpConfig.agentSchema);
201
+ } else if (finalConfig.transportType === "http" && (httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)) {
202
+ logger.debug("Skipping default schema registration based on httpConfig");
196
203
  } else {
197
- if (!finalConfig.httpConfig) {
198
- throw new Error("HTTP transport requires httpConfig to be provided in configuration");
199
- }
200
- const httpConfig = import_core2.HttpTransportConfigSchema.parse(finalConfig.httpConfig);
201
- transport = new import_core2.HttpTransport(httpConfig);
202
- }
203
- let partition;
204
- if (finalConfig.httpConfig?.agentId) {
205
- try {
206
- partition = import_pfid.extractPartition(finalConfig.httpConfig.agentId);
207
- logger.debug("Extracted partition from agent_id", { partition });
208
- } catch (error) {
209
- logger.warn("Failed to extract partition from agent_id, using random partition", { error });
210
- }
211
- }
212
- globalTracer = new import_core2.Tracer(transport, partition);
213
- const prefactorMiddleware = new PrefactorMiddleware(globalTracer);
204
+ core.agentManager.registerSchema(import_core2.DEFAULT_AGENT_SCHEMA);
205
+ }
206
+ const agentInfo = finalConfig.httpConfig ? {
207
+ agentId: finalConfig.httpConfig.agentId,
208
+ agentIdentifier: finalConfig.httpConfig.agentIdentifier,
209
+ agentName: finalConfig.httpConfig.agentName,
210
+ agentDescription: finalConfig.httpConfig.agentDescription
211
+ } : undefined;
212
+ const prefactorMiddleware = new PrefactorMiddleware(core.tracer, core.agentManager, agentInfo);
214
213
  const middleware = import_langchain.createMiddleware({
215
214
  name: "prefactor",
216
215
  wrapModelCall: async (request, handler) => {
@@ -236,10 +235,11 @@ function getTracer() {
236
235
  return globalTracer;
237
236
  }
238
237
  async function shutdown() {
239
- if (globalTracer) {
238
+ if (globalCore) {
240
239
  logger.info("Shutting down Prefactor SDK");
241
- await globalTracer.close();
240
+ await globalCore.shutdown();
242
241
  }
242
+ globalCore = null;
243
243
  globalTracer = null;
244
244
  globalMiddleware = null;
245
245
  }
@@ -249,4 +249,4 @@ process.on("beforeExit", () => {
249
249
  });
250
250
  });
251
251
 
252
- //# debugId=46B60F8DD9AA982064756E2164756E21
252
+ //# debugId=476C65B0424F525B64756E2164756E21
@@ -2,12 +2,12 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/init.ts", "../src/middleware.ts", "../src/metadata-extractor.ts"],
4
4
  "sourcesContent": [
5
- "// Main entry points\n\n// Convenience re-exports from core\nexport {\n type Config,\n type HttpTransportConfig,\n type Span,\n SpanStatus,\n SpanType,\n} from '@prefactor/core';\nexport { getTracer, init, shutdown } from './init.js';\nexport { extractTokenUsage } from './metadata-extractor.js';\n// Middleware\nexport { PrefactorMiddleware } from './middleware.js';\n",
6
- "import {\n type Config,\n configureLogging,\n createConfig,\n getLogger,\n HttpTransport,\n HttpTransportConfigSchema,\n StdioTransport,\n Tracer,\n type Transport,\n} from '@prefactor/core';\nimport { extractPartition, type Partition } from '@prefactor/pfid';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nlet globalTracer: Tracer | null = null;\nlet globalMiddleware: AgentMiddleware | null = null;\n\n/**\n * Initialize the Prefactor SDK and return middleware for LangChain.js\n *\n * This is the main entry point for the SDK. Call this function to create a middleware\n * instance that you can pass to your LangChain.js agents.\n *\n * @param config - Optional configuration object\n * @returns PrefactorMiddleware instance to use with LangChain.js agents\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createAgent } from 'langchain';\n *\n * // Initialize with defaults (stdio transport)\n * const middleware = init();\n *\n * // Or configure HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * }\n * });\n *\n * const agent = createAgent({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport function init(config?: Partial<Config>): AgentMiddleware {\n configureLogging();\n\n const finalConfig = createConfig(config);\n logger.info('Initializing Prefactor SDK', { transport: finalConfig.transportType });\n\n if (globalMiddleware !== null) {\n return globalMiddleware;\n }\n\n let transport: Transport;\n if (finalConfig.transportType === 'stdio') {\n transport = new StdioTransport();\n } else {\n if (!finalConfig.httpConfig) {\n throw new Error('HTTP transport requires httpConfig to be provided in configuration');\n }\n // Parse httpConfig to apply defaults from schema\n const httpConfig = HttpTransportConfigSchema.parse(finalConfig.httpConfig);\n transport = new HttpTransport(httpConfig);\n }\n\n // Extract partition from agent_id if provided (for HTTP transport)\n let partition: Partition | undefined;\n if (finalConfig.httpConfig?.agentId) {\n try {\n partition = extractPartition(finalConfig.httpConfig.agentId);\n logger.debug('Extracted partition from agent_id', { partition });\n } catch (error) {\n logger.warn('Failed to extract partition from agent_id, using random partition', { error });\n }\n }\n\n globalTracer = new Tracer(transport, partition);\n const prefactorMiddleware = new PrefactorMiddleware(globalTracer);\n\n const middleware = createMiddleware({\n name: 'prefactor',\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapModelCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapModelCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapToolCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapToolCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n beforeAgent: async (state: any) => {\n await prefactorMiddleware.beforeAgent(state);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n afterAgent: async (state: any) => {\n await prefactorMiddleware.afterAgent(state);\n },\n });\n\n globalMiddleware = middleware;\n return middleware;\n}\n\n/**\n * Get the current tracer instance.\n *\n * If no tracer has been created yet, this will call init() with default configuration.\n *\n * @returns Tracer instance\n *\n * @example\n * ```typescript\n * import { getTracer } from '@prefactor/langchain';\n *\n * const tracer = getTracer();\n * const span = tracer.startSpan({\n * name: 'custom-operation',\n * spanType: SpanType.TOOL,\n * inputs: { data: 'example' }\n * });\n * ```\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n init();\n }\n // Safe because init() always sets globalTracer\n return globalTracer as Tracer;\n}\n\n/**\n * Shutdown the SDK and flush any pending spans.\n *\n * Call this before your application exits to ensure all spans are sent to the transport.\n * This is especially important for HTTP transport which has a queue of pending requests.\n *\n * @returns Promise that resolves when shutdown is complete\n *\n * @example\n * ```typescript\n * import { shutdown } from '@prefactor/langchain';\n *\n * process.on('SIGTERM', async () => {\n * await shutdown();\n * process.exit(0);\n * });\n * ```\n */\nexport async function shutdown(): Promise<void> {\n if (globalTracer) {\n logger.info('Shutting down Prefactor SDK');\n await globalTracer.close();\n }\n globalTracer = null;\n globalMiddleware = null;\n}\n\n// Automatic shutdown on process exit\nprocess.on('beforeExit', () => {\n shutdown().catch((error) => {\n console.error('Error during Prefactor SDK shutdown:', error);\n });\n});\n",
7
- "import { type Span, SpanContext, SpanType, type Tracer } from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: Span | null = null;\n\n constructor(private tracer: Tracer) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const parentSpan = SpanContext.getCurrent();\n const messages = state?.messages ?? [];\n\n this.tracer.startAgentInstance();\n\n const span = this.tracer.startSpan({\n name: 'agent',\n spanType: SpanType.AGENT,\n inputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n parentSpanId: parentSpan?.spanId,\n traceId: parentSpan?.traceId,\n });\n\n this.rootSpan = span;\n }\n\n /**\n * Called after agent execution completes\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async afterAgent(state: any): Promise<void> {\n if (!this.rootSpan) {\n return;\n }\n\n const messages = state?.messages ?? [];\n this.tracer.endSpan(this.rootSpan, {\n outputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n });\n\n this.tracer.finishAgentInstance();\n SpanContext.clear();\n this.rootSpan = null;\n }\n\n /**\n * Wrap a model call to trace LLM invocations\n *\n * @param request - Model invocation request\n * @param handler - The actual model call function\n * @returns Promise resolving to the model response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapModelCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const parentSpan = SpanContext.getCurrent();\n\n const span = this.tracer.startSpan({\n name: this.extractModelName(request),\n spanType: SpanType.LLM,\n inputs: this.extractModelInputs(request),\n parentSpanId: parentSpan?.spanId,\n traceId: parentSpan?.traceId,\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n const outputs = this.extractModelOutputs(response);\n const tokenUsage = extractTokenUsage(response);\n\n this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Wrap a tool call to trace tool executions\n *\n * @param request - Tool invocation request\n * @param handler - The actual tool call function\n * @returns Promise resolving to the tool response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapToolCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const parentSpan = SpanContext.getCurrent();\n\n const span = this.tracer.startSpan({\n name: this.extractToolName(request),\n spanType: SpanType.TOOL,\n inputs: this.extractToolInputs(request),\n parentSpanId: parentSpan?.spanId,\n traceId: parentSpan?.traceId,\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n this.tracer.endSpan(span, {\n outputs: this.extractToolOutputs(response),\n });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Extract model name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelName(request: any): string {\n return request?.model ?? request?.modelName ?? 'unknown';\n }\n\n /**\n * Extract model inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelInputs(request: any): Record<string, unknown> {\n const messages = request?.messages ?? [];\n return { messages: messages.slice(-3).map((m: unknown) => String(m)) };\n }\n\n /**\n * Extract model outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractModelOutputs(response: any): Record<string, unknown> {\n const content = response?.content ?? response?.text ?? '';\n return { content: String(content) };\n }\n\n /**\n * Extract tool name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolName(request: any): string {\n return request?.name ?? request?.tool ?? 'unknown';\n }\n\n /**\n * Extract tool inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolInputs(request: any): Record<string, unknown> {\n return { input: request?.input ?? request?.args ?? {} };\n }\n\n /**\n * Extract tool outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractToolOutputs(response: any): Record<string, unknown> {\n return { output: response?.output ?? response };\n }\n}\n",
5
+ "// Main entry points\n\n// Convenience re-exports from core\nexport {\n type Config,\n type CoreRuntime,\n type HttpTransportConfig,\n type Span,\n SpanStatus,\n SpanType,\n} from '@prefactor/core';\nexport { getTracer, init, shutdown } from './init.js';\nexport { extractTokenUsage } from './metadata-extractor.js';\n// Middleware\nexport { PrefactorMiddleware } from './middleware.js';\n",
6
+ "import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n DEFAULT_AGENT_SCHEMA,\n getLogger,\n type Tracer,\n} from '@prefactor/core';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nlet globalCore: CoreRuntime | null = null;\nlet globalTracer: Tracer | null = null;\nlet globalMiddleware: AgentMiddleware | null = null;\n\n/**\n * Initialize the Prefactor SDK and return middleware for LangChain.js\n *\n * This is the main entry point for the SDK. Call this function to create a middleware\n * instance that you can pass to your LangChain.js agents.\n *\n * @param config - Optional configuration object\n * @returns PrefactorMiddleware instance to use with LangChain.js agents\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createAgent } from 'langchain';\n *\n * // Initialize with defaults (stdio transport)\n * const middleware = init();\n *\n * // Or configure HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * agentIdentifier: 'my-langchain-agent', // Required\n * agentId: 'legacy-agent-id', // Optional legacy identifier\n * }\n * });\n *\n * const agent = createAgent({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport function init(config?: Partial<Config>): AgentMiddleware {\n configureLogging();\n\n // Set default schema namespace for LangChain adaptor\n const configWithDefaults: Partial<Config> = {\n ...config,\n httpConfig: config?.httpConfig\n ? {\n schemaName: 'langchain:agent',\n ...config.httpConfig,\n }\n : undefined,\n };\n\n const finalConfig = createConfig(configWithDefaults);\n\n if (globalMiddleware !== null) {\n return globalMiddleware;\n }\n\n const core = createCore(finalConfig);\n globalCore = core;\n globalTracer = core.tracer;\n\n const httpConfig = finalConfig.httpConfig;\n if (httpConfig?.agentSchema) {\n core.agentManager.registerSchema(httpConfig.agentSchema);\n } else if (\n finalConfig.transportType === 'http' &&\n (httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)\n ) {\n logger.debug('Skipping default schema registration based on httpConfig');\n } else {\n core.agentManager.registerSchema(DEFAULT_AGENT_SCHEMA);\n }\n\n const agentInfo = finalConfig.httpConfig\n ? {\n agentId: finalConfig.httpConfig.agentId,\n agentIdentifier: finalConfig.httpConfig.agentIdentifier,\n agentName: finalConfig.httpConfig.agentName,\n agentDescription: finalConfig.httpConfig.agentDescription,\n }\n : undefined;\n\n const prefactorMiddleware = new PrefactorMiddleware(core.tracer, core.agentManager, agentInfo);\n\n const middleware = createMiddleware({\n name: 'prefactor',\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapModelCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapModelCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapToolCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapToolCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n beforeAgent: async (state: any) => {\n await prefactorMiddleware.beforeAgent(state);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n afterAgent: async (state: any) => {\n await prefactorMiddleware.afterAgent(state);\n },\n });\n\n globalMiddleware = middleware;\n return middleware;\n}\n\n/**\n * Get the current tracer instance.\n *\n * If no tracer has been created yet, this will call init() with default configuration.\n *\n * @returns Tracer instance\n *\n * @example\n * ```typescript\n * import { getTracer } from '@prefactor/langchain';\n *\n * const tracer = getTracer();\n * const span = tracer.startSpan({\n * name: 'custom-operation',\n * spanType: SpanType.TOOL,\n * inputs: { data: 'example' }\n * });\n * ```\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n init();\n }\n // Safe because init() always sets globalTracer\n return globalTracer as Tracer;\n}\n\n/**\n * Shutdown the SDK and flush any pending spans.\n *\n * Call this before your application exits to ensure all spans are sent to the transport.\n * This is especially important for HTTP transport which has a queue of pending requests.\n *\n * @returns Promise that resolves when shutdown is complete\n *\n * @example\n * ```typescript\n * import { shutdown } from '@prefactor/langchain';\n *\n * process.on('SIGTERM', async () => {\n * await shutdown();\n * process.exit(0);\n * });\n * ```\n */\nexport async function shutdown(): Promise<void> {\n if (globalCore) {\n logger.info('Shutting down Prefactor SDK');\n await globalCore.shutdown();\n }\n globalCore = null;\n globalTracer = null;\n globalMiddleware = null;\n}\n\n// Automatic shutdown on process exit\nprocess.on('beforeExit', () => {\n shutdown().catch((error) => {\n console.error('Error during Prefactor SDK shutdown:', error);\n });\n});\n",
7
+ "import { type AgentInstanceManager, SpanContext, SpanType, type Tracer } from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: ReturnType<Tracer['startSpan']> | null = null;\n\n constructor(\n private tracer: Tracer,\n private agentManager: AgentInstanceManager,\n private agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]\n ) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const messages = state?.messages ?? [];\n\n this.agentManager.startInstance(this.agentInfo);\n\n const span = this.tracer.startSpan({\n name: 'langchain:agent',\n spanType: SpanType.AGENT,\n inputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n });\n\n this.rootSpan = span;\n SpanContext.enter(span);\n }\n\n /**\n * Called after agent execution completes\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async afterAgent(state: any): Promise<void> {\n if (!this.rootSpan) {\n return;\n }\n\n const messages = state?.messages ?? [];\n this.tracer.endSpan(this.rootSpan, {\n outputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n });\n\n this.agentManager.finishInstance();\n SpanContext.exit();\n this.rootSpan = null;\n }\n\n /**\n * Wrap a model call to trace LLM invocations\n *\n * @param request - Model invocation request\n * @param handler - The actual model call function\n * @returns Promise resolving to the model response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapModelCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const span = this.tracer.startSpan({\n name: this.extractModelName(request),\n spanType: SpanType.LLM,\n inputs: this.extractModelInputs(request),\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n const outputs = this.extractModelOutputs(response);\n const tokenUsage = extractTokenUsage(response);\n\n this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Wrap a tool call to trace tool executions\n *\n * @param request - Tool invocation request\n * @param handler - The actual tool call function\n * @returns Promise resolving to the tool response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapToolCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const span = this.tracer.startSpan({\n name: this.extractToolName(request),\n spanType: SpanType.TOOL,\n inputs: this.extractToolInputs(request),\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n this.tracer.endSpan(span, {\n outputs: this.extractToolOutputs(response),\n });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Extract model name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelName(request: any): string {\n return request?.model ?? request?.modelName ?? 'unknown';\n }\n\n /**\n * Extract model inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelInputs(request: any): Record<string, unknown> {\n const messages = request?.messages ?? [];\n return { messages: messages.slice(-3).map((m: unknown) => String(m)) };\n }\n\n /**\n * Extract model outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractModelOutputs(response: any): Record<string, unknown> {\n const content = response?.content ?? response?.text ?? '';\n return { content: String(content) };\n }\n\n /**\n * Extract tool name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolName(request: any): string {\n return request?.name ?? request?.tool ?? 'unknown';\n }\n\n /**\n * Extract tool inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolInputs(request: any): Record<string, unknown> {\n return { input: request?.input ?? request?.args ?? {} };\n }\n\n /**\n * Extract tool outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractToolOutputs(response: any): Record<string, unknown> {\n return { output: response?.output ?? response };\n }\n}\n",
8
8
  "import type { TokenUsage } from '@prefactor/core';\n\n/**\n * Extract token usage information from LLM responses.\n *\n * Handles multiple response formats from different LLM providers and LangChain versions.\n *\n * @param response - The LLM response object\n * @returns TokenUsage object or null if no usage data found\n *\n * @example\n * ```typescript\n * const response = await model.invoke(messages);\n * const tokenUsage = extractTokenUsage(response);\n * if (tokenUsage) {\n * console.log(`Tokens used: ${tokenUsage.totalTokens}`);\n * }\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: LLM response structure varies by provider\nexport function extractTokenUsage(response: any): TokenUsage | null {\n try {\n // Try token_usage field (common format)\n const tokenUsage = response?.token_usage ?? response?.usage;\n if (tokenUsage) {\n return {\n promptTokens: tokenUsage.prompt_tokens ?? 0,\n completionTokens: tokenUsage.completion_tokens ?? 0,\n totalTokens: tokenUsage.total_tokens ?? 0,\n };\n }\n\n // Try usage_metadata field (LangChain format)\n const usageMetadata = response?.usage_metadata;\n if (usageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens ?? 0,\n completionTokens: usageMetadata.output_tokens ?? 0,\n totalTokens: usageMetadata.total_tokens ?? 0,\n };\n }\n\n // Try response_metadata.token_usage (nested format)\n const responseMetadata = response?.response_metadata;\n if (responseMetadata?.token_usage) {\n return {\n promptTokens: responseMetadata.token_usage.prompt_tokens ?? 0,\n completionTokens: responseMetadata.token_usage.completion_tokens ?? 0,\n totalTokens: responseMetadata.token_usage.total_tokens ?? 0,\n };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "46B60F8DD9AA982064756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "476C65B0424F525B64756E2164756E21",
12
12
  "names": []
13
13
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { type Config, type HttpTransportConfig, type Span, SpanStatus, SpanType, } from '@prefactor/core';
1
+ export { type Config, type CoreRuntime, type HttpTransportConfig, type Span, SpanStatus, SpanType, } from '@prefactor/core';
2
2
  export { getTracer, init, shutdown } from './init.js';
3
3
  export { extractTokenUsage } from './metadata-extractor.js';
4
4
  export { PrefactorMiddleware } from './middleware.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,MAAM,EACX,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,UAAU,EACV,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,UAAU,EACV,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -8,13 +8,10 @@ import {
8
8
  import {
9
9
  configureLogging,
10
10
  createConfig,
11
- getLogger,
12
- HttpTransport,
13
- HttpTransportConfigSchema,
14
- StdioTransport,
15
- Tracer
11
+ createCore,
12
+ DEFAULT_AGENT_SCHEMA,
13
+ getLogger
16
14
  } from "@prefactor/core";
17
- import { extractPartition } from "@prefactor/pfid";
18
15
  import { createMiddleware } from "langchain";
19
16
 
20
17
  // packages/langchain/src/middleware.ts
@@ -56,22 +53,24 @@ function extractTokenUsage(response) {
56
53
  // packages/langchain/src/middleware.ts
57
54
  class PrefactorMiddleware {
58
55
  tracer;
56
+ agentManager;
57
+ agentInfo;
59
58
  rootSpan = null;
60
- constructor(tracer) {
59
+ constructor(tracer, agentManager, agentInfo) {
61
60
  this.tracer = tracer;
61
+ this.agentManager = agentManager;
62
+ this.agentInfo = agentInfo;
62
63
  }
63
64
  async beforeAgent(state) {
64
- const parentSpan = SpanContext.getCurrent();
65
65
  const messages = state?.messages ?? [];
66
- this.tracer.startAgentInstance();
66
+ this.agentManager.startInstance(this.agentInfo);
67
67
  const span = this.tracer.startSpan({
68
- name: "agent",
68
+ name: "langchain:agent",
69
69
  spanType: SpanType.AGENT,
70
- inputs: { messages: messages.slice(-3).map((m) => String(m)) },
71
- parentSpanId: parentSpan?.spanId,
72
- traceId: parentSpan?.traceId
70
+ inputs: { messages: messages.slice(-3).map((m) => String(m)) }
73
71
  });
74
72
  this.rootSpan = span;
73
+ SpanContext.enter(span);
75
74
  }
76
75
  async afterAgent(state) {
77
76
  if (!this.rootSpan) {
@@ -81,18 +80,15 @@ class PrefactorMiddleware {
81
80
  this.tracer.endSpan(this.rootSpan, {
82
81
  outputs: { messages: messages.slice(-3).map((m) => String(m)) }
83
82
  });
84
- this.tracer.finishAgentInstance();
85
- SpanContext.clear();
83
+ this.agentManager.finishInstance();
84
+ SpanContext.exit();
86
85
  this.rootSpan = null;
87
86
  }
88
87
  async wrapModelCall(request, handler) {
89
- const parentSpan = SpanContext.getCurrent();
90
88
  const span = this.tracer.startSpan({
91
89
  name: this.extractModelName(request),
92
90
  spanType: SpanType.LLM,
93
- inputs: this.extractModelInputs(request),
94
- parentSpanId: parentSpan?.spanId,
95
- traceId: parentSpan?.traceId
91
+ inputs: this.extractModelInputs(request)
96
92
  });
97
93
  try {
98
94
  const response = await SpanContext.runAsync(span, async () => {
@@ -108,13 +104,10 @@ class PrefactorMiddleware {
108
104
  }
109
105
  }
110
106
  async wrapToolCall(request, handler) {
111
- const parentSpan = SpanContext.getCurrent();
112
107
  const span = this.tracer.startSpan({
113
108
  name: this.extractToolName(request),
114
109
  spanType: SpanType.TOOL,
115
- inputs: this.extractToolInputs(request),
116
- parentSpanId: parentSpan?.spanId,
117
- traceId: parentSpan?.traceId
110
+ inputs: this.extractToolInputs(request)
118
111
  });
119
112
  try {
120
113
  const response = await SpanContext.runAsync(span, async () => {
@@ -153,36 +146,40 @@ class PrefactorMiddleware {
153
146
 
154
147
  // packages/langchain/src/init.ts
155
148
  var logger = getLogger("init");
149
+ var globalCore = null;
156
150
  var globalTracer = null;
157
151
  var globalMiddleware = null;
158
152
  function init(config) {
159
153
  configureLogging();
160
- const finalConfig = createConfig(config);
161
- logger.info("Initializing Prefactor SDK", { transport: finalConfig.transportType });
154
+ const configWithDefaults = {
155
+ ...config,
156
+ httpConfig: config?.httpConfig ? {
157
+ schemaName: "langchain:agent",
158
+ ...config.httpConfig
159
+ } : undefined
160
+ };
161
+ const finalConfig = createConfig(configWithDefaults);
162
162
  if (globalMiddleware !== null) {
163
163
  return globalMiddleware;
164
164
  }
165
- let transport;
166
- if (finalConfig.transportType === "stdio") {
167
- transport = new StdioTransport;
165
+ const core = createCore(finalConfig);
166
+ globalCore = core;
167
+ globalTracer = core.tracer;
168
+ const httpConfig = finalConfig.httpConfig;
169
+ if (httpConfig?.agentSchema) {
170
+ core.agentManager.registerSchema(httpConfig.agentSchema);
171
+ } else if (finalConfig.transportType === "http" && (httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)) {
172
+ logger.debug("Skipping default schema registration based on httpConfig");
168
173
  } else {
169
- if (!finalConfig.httpConfig) {
170
- throw new Error("HTTP transport requires httpConfig to be provided in configuration");
171
- }
172
- const httpConfig = HttpTransportConfigSchema.parse(finalConfig.httpConfig);
173
- transport = new HttpTransport(httpConfig);
174
- }
175
- let partition;
176
- if (finalConfig.httpConfig?.agentId) {
177
- try {
178
- partition = extractPartition(finalConfig.httpConfig.agentId);
179
- logger.debug("Extracted partition from agent_id", { partition });
180
- } catch (error) {
181
- logger.warn("Failed to extract partition from agent_id, using random partition", { error });
182
- }
183
- }
184
- globalTracer = new Tracer(transport, partition);
185
- const prefactorMiddleware = new PrefactorMiddleware(globalTracer);
174
+ core.agentManager.registerSchema(DEFAULT_AGENT_SCHEMA);
175
+ }
176
+ const agentInfo = finalConfig.httpConfig ? {
177
+ agentId: finalConfig.httpConfig.agentId,
178
+ agentIdentifier: finalConfig.httpConfig.agentIdentifier,
179
+ agentName: finalConfig.httpConfig.agentName,
180
+ agentDescription: finalConfig.httpConfig.agentDescription
181
+ } : undefined;
182
+ const prefactorMiddleware = new PrefactorMiddleware(core.tracer, core.agentManager, agentInfo);
186
183
  const middleware = createMiddleware({
187
184
  name: "prefactor",
188
185
  wrapModelCall: async (request, handler) => {
@@ -208,10 +205,11 @@ function getTracer() {
208
205
  return globalTracer;
209
206
  }
210
207
  async function shutdown() {
211
- if (globalTracer) {
208
+ if (globalCore) {
212
209
  logger.info("Shutting down Prefactor SDK");
213
- await globalTracer.close();
210
+ await globalCore.shutdown();
214
211
  }
212
+ globalCore = null;
215
213
  globalTracer = null;
216
214
  globalMiddleware = null;
217
215
  }
@@ -230,4 +228,4 @@ export {
230
228
  PrefactorMiddleware
231
229
  };
232
230
 
233
- //# debugId=B136D336DD9CEBB764756E2164756E21
231
+ //# debugId=7CF7D7FD596ED20564756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,12 +2,12 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/init.ts", "../src/middleware.ts", "../src/metadata-extractor.ts"],
4
4
  "sourcesContent": [
5
- "// Main entry points\n\n// Convenience re-exports from core\nexport {\n type Config,\n type HttpTransportConfig,\n type Span,\n SpanStatus,\n SpanType,\n} from '@prefactor/core';\nexport { getTracer, init, shutdown } from './init.js';\nexport { extractTokenUsage } from './metadata-extractor.js';\n// Middleware\nexport { PrefactorMiddleware } from './middleware.js';\n",
6
- "import {\n type Config,\n configureLogging,\n createConfig,\n getLogger,\n HttpTransport,\n HttpTransportConfigSchema,\n StdioTransport,\n Tracer,\n type Transport,\n} from '@prefactor/core';\nimport { extractPartition, type Partition } from '@prefactor/pfid';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nlet globalTracer: Tracer | null = null;\nlet globalMiddleware: AgentMiddleware | null = null;\n\n/**\n * Initialize the Prefactor SDK and return middleware for LangChain.js\n *\n * This is the main entry point for the SDK. Call this function to create a middleware\n * instance that you can pass to your LangChain.js agents.\n *\n * @param config - Optional configuration object\n * @returns PrefactorMiddleware instance to use with LangChain.js agents\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createAgent } from 'langchain';\n *\n * // Initialize with defaults (stdio transport)\n * const middleware = init();\n *\n * // Or configure HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * }\n * });\n *\n * const agent = createAgent({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport function init(config?: Partial<Config>): AgentMiddleware {\n configureLogging();\n\n const finalConfig = createConfig(config);\n logger.info('Initializing Prefactor SDK', { transport: finalConfig.transportType });\n\n if (globalMiddleware !== null) {\n return globalMiddleware;\n }\n\n let transport: Transport;\n if (finalConfig.transportType === 'stdio') {\n transport = new StdioTransport();\n } else {\n if (!finalConfig.httpConfig) {\n throw new Error('HTTP transport requires httpConfig to be provided in configuration');\n }\n // Parse httpConfig to apply defaults from schema\n const httpConfig = HttpTransportConfigSchema.parse(finalConfig.httpConfig);\n transport = new HttpTransport(httpConfig);\n }\n\n // Extract partition from agent_id if provided (for HTTP transport)\n let partition: Partition | undefined;\n if (finalConfig.httpConfig?.agentId) {\n try {\n partition = extractPartition(finalConfig.httpConfig.agentId);\n logger.debug('Extracted partition from agent_id', { partition });\n } catch (error) {\n logger.warn('Failed to extract partition from agent_id, using random partition', { error });\n }\n }\n\n globalTracer = new Tracer(transport, partition);\n const prefactorMiddleware = new PrefactorMiddleware(globalTracer);\n\n const middleware = createMiddleware({\n name: 'prefactor',\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapModelCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapModelCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapToolCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapToolCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n beforeAgent: async (state: any) => {\n await prefactorMiddleware.beforeAgent(state);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n afterAgent: async (state: any) => {\n await prefactorMiddleware.afterAgent(state);\n },\n });\n\n globalMiddleware = middleware;\n return middleware;\n}\n\n/**\n * Get the current tracer instance.\n *\n * If no tracer has been created yet, this will call init() with default configuration.\n *\n * @returns Tracer instance\n *\n * @example\n * ```typescript\n * import { getTracer } from '@prefactor/langchain';\n *\n * const tracer = getTracer();\n * const span = tracer.startSpan({\n * name: 'custom-operation',\n * spanType: SpanType.TOOL,\n * inputs: { data: 'example' }\n * });\n * ```\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n init();\n }\n // Safe because init() always sets globalTracer\n return globalTracer as Tracer;\n}\n\n/**\n * Shutdown the SDK and flush any pending spans.\n *\n * Call this before your application exits to ensure all spans are sent to the transport.\n * This is especially important for HTTP transport which has a queue of pending requests.\n *\n * @returns Promise that resolves when shutdown is complete\n *\n * @example\n * ```typescript\n * import { shutdown } from '@prefactor/langchain';\n *\n * process.on('SIGTERM', async () => {\n * await shutdown();\n * process.exit(0);\n * });\n * ```\n */\nexport async function shutdown(): Promise<void> {\n if (globalTracer) {\n logger.info('Shutting down Prefactor SDK');\n await globalTracer.close();\n }\n globalTracer = null;\n globalMiddleware = null;\n}\n\n// Automatic shutdown on process exit\nprocess.on('beforeExit', () => {\n shutdown().catch((error) => {\n console.error('Error during Prefactor SDK shutdown:', error);\n });\n});\n",
7
- "import { type Span, SpanContext, SpanType, type Tracer } from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: Span | null = null;\n\n constructor(private tracer: Tracer) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const parentSpan = SpanContext.getCurrent();\n const messages = state?.messages ?? [];\n\n this.tracer.startAgentInstance();\n\n const span = this.tracer.startSpan({\n name: 'agent',\n spanType: SpanType.AGENT,\n inputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n parentSpanId: parentSpan?.spanId,\n traceId: parentSpan?.traceId,\n });\n\n this.rootSpan = span;\n }\n\n /**\n * Called after agent execution completes\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async afterAgent(state: any): Promise<void> {\n if (!this.rootSpan) {\n return;\n }\n\n const messages = state?.messages ?? [];\n this.tracer.endSpan(this.rootSpan, {\n outputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n });\n\n this.tracer.finishAgentInstance();\n SpanContext.clear();\n this.rootSpan = null;\n }\n\n /**\n * Wrap a model call to trace LLM invocations\n *\n * @param request - Model invocation request\n * @param handler - The actual model call function\n * @returns Promise resolving to the model response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapModelCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const parentSpan = SpanContext.getCurrent();\n\n const span = this.tracer.startSpan({\n name: this.extractModelName(request),\n spanType: SpanType.LLM,\n inputs: this.extractModelInputs(request),\n parentSpanId: parentSpan?.spanId,\n traceId: parentSpan?.traceId,\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n const outputs = this.extractModelOutputs(response);\n const tokenUsage = extractTokenUsage(response);\n\n this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Wrap a tool call to trace tool executions\n *\n * @param request - Tool invocation request\n * @param handler - The actual tool call function\n * @returns Promise resolving to the tool response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapToolCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const parentSpan = SpanContext.getCurrent();\n\n const span = this.tracer.startSpan({\n name: this.extractToolName(request),\n spanType: SpanType.TOOL,\n inputs: this.extractToolInputs(request),\n parentSpanId: parentSpan?.spanId,\n traceId: parentSpan?.traceId,\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n this.tracer.endSpan(span, {\n outputs: this.extractToolOutputs(response),\n });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Extract model name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelName(request: any): string {\n return request?.model ?? request?.modelName ?? 'unknown';\n }\n\n /**\n * Extract model inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelInputs(request: any): Record<string, unknown> {\n const messages = request?.messages ?? [];\n return { messages: messages.slice(-3).map((m: unknown) => String(m)) };\n }\n\n /**\n * Extract model outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractModelOutputs(response: any): Record<string, unknown> {\n const content = response?.content ?? response?.text ?? '';\n return { content: String(content) };\n }\n\n /**\n * Extract tool name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolName(request: any): string {\n return request?.name ?? request?.tool ?? 'unknown';\n }\n\n /**\n * Extract tool inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolInputs(request: any): Record<string, unknown> {\n return { input: request?.input ?? request?.args ?? {} };\n }\n\n /**\n * Extract tool outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractToolOutputs(response: any): Record<string, unknown> {\n return { output: response?.output ?? response };\n }\n}\n",
5
+ "// Main entry points\n\n// Convenience re-exports from core\nexport {\n type Config,\n type CoreRuntime,\n type HttpTransportConfig,\n type Span,\n SpanStatus,\n SpanType,\n} from '@prefactor/core';\nexport { getTracer, init, shutdown } from './init.js';\nexport { extractTokenUsage } from './metadata-extractor.js';\n// Middleware\nexport { PrefactorMiddleware } from './middleware.js';\n",
6
+ "import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n DEFAULT_AGENT_SCHEMA,\n getLogger,\n type Tracer,\n} from '@prefactor/core';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nlet globalCore: CoreRuntime | null = null;\nlet globalTracer: Tracer | null = null;\nlet globalMiddleware: AgentMiddleware | null = null;\n\n/**\n * Initialize the Prefactor SDK and return middleware for LangChain.js\n *\n * This is the main entry point for the SDK. Call this function to create a middleware\n * instance that you can pass to your LangChain.js agents.\n *\n * @param config - Optional configuration object\n * @returns PrefactorMiddleware instance to use with LangChain.js agents\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createAgent } from 'langchain';\n *\n * // Initialize with defaults (stdio transport)\n * const middleware = init();\n *\n * // Or configure HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * agentIdentifier: 'my-langchain-agent', // Required\n * agentId: 'legacy-agent-id', // Optional legacy identifier\n * }\n * });\n *\n * const agent = createAgent({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport function init(config?: Partial<Config>): AgentMiddleware {\n configureLogging();\n\n // Set default schema namespace for LangChain adaptor\n const configWithDefaults: Partial<Config> = {\n ...config,\n httpConfig: config?.httpConfig\n ? {\n schemaName: 'langchain:agent',\n ...config.httpConfig,\n }\n : undefined,\n };\n\n const finalConfig = createConfig(configWithDefaults);\n\n if (globalMiddleware !== null) {\n return globalMiddleware;\n }\n\n const core = createCore(finalConfig);\n globalCore = core;\n globalTracer = core.tracer;\n\n const httpConfig = finalConfig.httpConfig;\n if (httpConfig?.agentSchema) {\n core.agentManager.registerSchema(httpConfig.agentSchema);\n } else if (\n finalConfig.transportType === 'http' &&\n (httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)\n ) {\n logger.debug('Skipping default schema registration based on httpConfig');\n } else {\n core.agentManager.registerSchema(DEFAULT_AGENT_SCHEMA);\n }\n\n const agentInfo = finalConfig.httpConfig\n ? {\n agentId: finalConfig.httpConfig.agentId,\n agentIdentifier: finalConfig.httpConfig.agentIdentifier,\n agentName: finalConfig.httpConfig.agentName,\n agentDescription: finalConfig.httpConfig.agentDescription,\n }\n : undefined;\n\n const prefactorMiddleware = new PrefactorMiddleware(core.tracer, core.agentManager, agentInfo);\n\n const middleware = createMiddleware({\n name: 'prefactor',\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapModelCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapModelCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapToolCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapToolCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n beforeAgent: async (state: any) => {\n await prefactorMiddleware.beforeAgent(state);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n afterAgent: async (state: any) => {\n await prefactorMiddleware.afterAgent(state);\n },\n });\n\n globalMiddleware = middleware;\n return middleware;\n}\n\n/**\n * Get the current tracer instance.\n *\n * If no tracer has been created yet, this will call init() with default configuration.\n *\n * @returns Tracer instance\n *\n * @example\n * ```typescript\n * import { getTracer } from '@prefactor/langchain';\n *\n * const tracer = getTracer();\n * const span = tracer.startSpan({\n * name: 'custom-operation',\n * spanType: SpanType.TOOL,\n * inputs: { data: 'example' }\n * });\n * ```\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n init();\n }\n // Safe because init() always sets globalTracer\n return globalTracer as Tracer;\n}\n\n/**\n * Shutdown the SDK and flush any pending spans.\n *\n * Call this before your application exits to ensure all spans are sent to the transport.\n * This is especially important for HTTP transport which has a queue of pending requests.\n *\n * @returns Promise that resolves when shutdown is complete\n *\n * @example\n * ```typescript\n * import { shutdown } from '@prefactor/langchain';\n *\n * process.on('SIGTERM', async () => {\n * await shutdown();\n * process.exit(0);\n * });\n * ```\n */\nexport async function shutdown(): Promise<void> {\n if (globalCore) {\n logger.info('Shutting down Prefactor SDK');\n await globalCore.shutdown();\n }\n globalCore = null;\n globalTracer = null;\n globalMiddleware = null;\n}\n\n// Automatic shutdown on process exit\nprocess.on('beforeExit', () => {\n shutdown().catch((error) => {\n console.error('Error during Prefactor SDK shutdown:', error);\n });\n});\n",
7
+ "import { type AgentInstanceManager, SpanContext, SpanType, type Tracer } from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: ReturnType<Tracer['startSpan']> | null = null;\n\n constructor(\n private tracer: Tracer,\n private agentManager: AgentInstanceManager,\n private agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]\n ) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const messages = state?.messages ?? [];\n\n this.agentManager.startInstance(this.agentInfo);\n\n const span = this.tracer.startSpan({\n name: 'langchain:agent',\n spanType: SpanType.AGENT,\n inputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n });\n\n this.rootSpan = span;\n SpanContext.enter(span);\n }\n\n /**\n * Called after agent execution completes\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async afterAgent(state: any): Promise<void> {\n if (!this.rootSpan) {\n return;\n }\n\n const messages = state?.messages ?? [];\n this.tracer.endSpan(this.rootSpan, {\n outputs: { messages: messages.slice(-3).map((m: unknown) => String(m)) },\n });\n\n this.agentManager.finishInstance();\n SpanContext.exit();\n this.rootSpan = null;\n }\n\n /**\n * Wrap a model call to trace LLM invocations\n *\n * @param request - Model invocation request\n * @param handler - The actual model call function\n * @returns Promise resolving to the model response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapModelCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const span = this.tracer.startSpan({\n name: this.extractModelName(request),\n spanType: SpanType.LLM,\n inputs: this.extractModelInputs(request),\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n const outputs = this.extractModelOutputs(response);\n const tokenUsage = extractTokenUsage(response);\n\n this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Wrap a tool call to trace tool executions\n *\n * @param request - Tool invocation request\n * @param handler - The actual tool call function\n * @returns Promise resolving to the tool response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapToolCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n const span = this.tracer.startSpan({\n name: this.extractToolName(request),\n spanType: SpanType.TOOL,\n inputs: this.extractToolInputs(request),\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\n\n this.tracer.endSpan(span, {\n outputs: this.extractToolOutputs(response),\n });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Extract model name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelName(request: any): string {\n return request?.model ?? request?.modelName ?? 'unknown';\n }\n\n /**\n * Extract model inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelInputs(request: any): Record<string, unknown> {\n const messages = request?.messages ?? [];\n return { messages: messages.slice(-3).map((m: unknown) => String(m)) };\n }\n\n /**\n * Extract model outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractModelOutputs(response: any): Record<string, unknown> {\n const content = response?.content ?? response?.text ?? '';\n return { content: String(content) };\n }\n\n /**\n * Extract tool name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolName(request: any): string {\n return request?.name ?? request?.tool ?? 'unknown';\n }\n\n /**\n * Extract tool inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolInputs(request: any): Record<string, unknown> {\n return { input: request?.input ?? request?.args ?? {} };\n }\n\n /**\n * Extract tool outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractToolOutputs(response: any): Record<string, unknown> {\n return { output: response?.output ?? response };\n }\n}\n",
8
8
  "import type { TokenUsage } from '@prefactor/core';\n\n/**\n * Extract token usage information from LLM responses.\n *\n * Handles multiple response formats from different LLM providers and LangChain versions.\n *\n * @param response - The LLM response object\n * @returns TokenUsage object or null if no usage data found\n *\n * @example\n * ```typescript\n * const response = await model.invoke(messages);\n * const tokenUsage = extractTokenUsage(response);\n * if (tokenUsage) {\n * console.log(`Tokens used: ${tokenUsage.totalTokens}`);\n * }\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: LLM response structure varies by provider\nexport function extractTokenUsage(response: any): TokenUsage | null {\n try {\n // Try token_usage field (common format)\n const tokenUsage = response?.token_usage ?? response?.usage;\n if (tokenUsage) {\n return {\n promptTokens: tokenUsage.prompt_tokens ?? 0,\n completionTokens: tokenUsage.completion_tokens ?? 0,\n totalTokens: tokenUsage.total_tokens ?? 0,\n };\n }\n\n // Try usage_metadata field (LangChain format)\n const usageMetadata = response?.usage_metadata;\n if (usageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens ?? 0,\n completionTokens: usageMetadata.output_tokens ?? 0,\n totalTokens: usageMetadata.total_tokens ?? 0,\n };\n }\n\n // Try response_metadata.token_usage (nested format)\n const responseMetadata = response?.response_metadata;\n if (responseMetadata?.token_usage) {\n return {\n promptTokens: responseMetadata.token_usage.prompt_tokens ?? 0,\n completionTokens: responseMetadata.token_usage.completion_tokens ?? 0,\n totalTokens: responseMetadata.token_usage.total_tokens ?? 0,\n };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "B136D336DD9CEBB764756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "7CF7D7FD596ED20564756E2164756E21",
12
12
  "names": []
13
13
  }
package/dist/init.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type Config, Tracer } from '@prefactor/core';
1
+ import { type Config, type Tracer } from '@prefactor/core';
2
2
  import { type AgentMiddleware } from 'langchain';
3
3
  /**
4
4
  * Initialize the Prefactor SDK and return middleware for LangChain.js
@@ -23,6 +23,8 @@ import { type AgentMiddleware } from 'langchain';
23
23
  * httpConfig: {
24
24
  * apiUrl: 'https://api.prefactor.ai',
25
25
  * apiToken: process.env.PREFACTOR_API_TOKEN!,
26
+ * agentIdentifier: 'my-langchain-agent', // Required
27
+ * agentId: 'legacy-agent-id', // Optional legacy identifier
26
28
  * }
27
29
  * });
28
30
  *
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAOX,MAAM,EAEP,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,WAAW,CAAC;AAQnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,eAAe,CA0D9D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAOX,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,WAAW,CAAC;AASnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,eAAe,CAqE9D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ9C"}
package/dist/init.js CHANGED
@@ -1,8 +1,8 @@
1
- import { configureLogging, createConfig, getLogger, HttpTransport, HttpTransportConfigSchema, StdioTransport, Tracer, } from '@prefactor/core';
2
- import { extractPartition } from '@prefactor/pfid';
1
+ import { configureLogging, createConfig, createCore, DEFAULT_AGENT_SCHEMA, getLogger, } from '@prefactor/core';
3
2
  import { createMiddleware } from 'langchain';
4
3
  import { PrefactorMiddleware } from './middleware.js';
5
4
  const logger = getLogger('init');
5
+ let globalCore = null;
6
6
  let globalTracer = null;
7
7
  let globalMiddleware = null;
8
8
  /**
@@ -28,6 +28,8 @@ let globalMiddleware = null;
28
28
  * httpConfig: {
29
29
  * apiUrl: 'https://api.prefactor.ai',
30
30
  * apiToken: process.env.PREFACTOR_API_TOKEN!,
31
+ * agentIdentifier: 'my-langchain-agent', // Required
32
+ * agentId: 'legacy-agent-id', // Optional legacy identifier
31
33
  * }
32
34
  * });
33
35
  *
@@ -40,36 +42,43 @@ let globalMiddleware = null;
40
42
  */
41
43
  export function init(config) {
42
44
  configureLogging();
43
- const finalConfig = createConfig(config);
44
- logger.info('Initializing Prefactor SDK', { transport: finalConfig.transportType });
45
+ // Set default schema namespace for LangChain adaptor
46
+ const configWithDefaults = {
47
+ ...config,
48
+ httpConfig: config?.httpConfig
49
+ ? {
50
+ schemaName: 'langchain:agent',
51
+ ...config.httpConfig,
52
+ }
53
+ : undefined,
54
+ };
55
+ const finalConfig = createConfig(configWithDefaults);
45
56
  if (globalMiddleware !== null) {
46
57
  return globalMiddleware;
47
58
  }
48
- let transport;
49
- if (finalConfig.transportType === 'stdio') {
50
- transport = new StdioTransport();
59
+ const core = createCore(finalConfig);
60
+ globalCore = core;
61
+ globalTracer = core.tracer;
62
+ const httpConfig = finalConfig.httpConfig;
63
+ if (httpConfig?.agentSchema) {
64
+ core.agentManager.registerSchema(httpConfig.agentSchema);
65
+ }
66
+ else if (finalConfig.transportType === 'http' &&
67
+ (httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)) {
68
+ logger.debug('Skipping default schema registration based on httpConfig');
51
69
  }
52
70
  else {
53
- if (!finalConfig.httpConfig) {
54
- throw new Error('HTTP transport requires httpConfig to be provided in configuration');
55
- }
56
- // Parse httpConfig to apply defaults from schema
57
- const httpConfig = HttpTransportConfigSchema.parse(finalConfig.httpConfig);
58
- transport = new HttpTransport(httpConfig);
71
+ core.agentManager.registerSchema(DEFAULT_AGENT_SCHEMA);
59
72
  }
60
- // Extract partition from agent_id if provided (for HTTP transport)
61
- let partition;
62
- if (finalConfig.httpConfig?.agentId) {
63
- try {
64
- partition = extractPartition(finalConfig.httpConfig.agentId);
65
- logger.debug('Extracted partition from agent_id', { partition });
73
+ const agentInfo = finalConfig.httpConfig
74
+ ? {
75
+ agentId: finalConfig.httpConfig.agentId,
76
+ agentIdentifier: finalConfig.httpConfig.agentIdentifier,
77
+ agentName: finalConfig.httpConfig.agentName,
78
+ agentDescription: finalConfig.httpConfig.agentDescription,
66
79
  }
67
- catch (error) {
68
- logger.warn('Failed to extract partition from agent_id, using random partition', { error });
69
- }
70
- }
71
- globalTracer = new Tracer(transport, partition);
72
- const prefactorMiddleware = new PrefactorMiddleware(globalTracer);
80
+ : undefined;
81
+ const prefactorMiddleware = new PrefactorMiddleware(core.tracer, core.agentManager, agentInfo);
73
82
  const middleware = createMiddleware({
74
83
  name: 'prefactor',
75
84
  // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types
@@ -137,10 +146,11 @@ export function getTracer() {
137
146
  * ```
138
147
  */
139
148
  export async function shutdown() {
140
- if (globalTracer) {
149
+ if (globalCore) {
141
150
  logger.info('Shutting down Prefactor SDK');
142
- await globalTracer.close();
151
+ await globalCore.shutdown();
143
152
  }
153
+ globalCore = null;
144
154
  globalTracer = null;
145
155
  globalMiddleware = null;
146
156
  }
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,yBAAyB,EACzB,cAAc,EACd,MAAM,GAEP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAkB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAwB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAEjC,IAAI,YAAY,GAAkB,IAAI,CAAC;AACvC,IAAI,gBAAgB,GAA2B,IAAI,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,IAAI,CAAC,MAAwB;IAC3C,gBAAgB,EAAE,CAAC;IAEnB,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;IAEpF,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,SAAoB,CAAC;IACzB,IAAI,WAAW,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;QAC1C,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QACD,iDAAiD;QACjD,MAAM,UAAU,GAAG,yBAAyB,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC3E,SAAS,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,mEAAmE;IACnE,IAAI,SAAgC,CAAC;IACrC,IAAI,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,YAAY,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAElE,MAAM,UAAU,GAAG,gBAAgB,CAAC;QAClC,IAAI,EAAE,WAAW;QACjB,2FAA2F;QAC3F,aAAa,EAAE,KAAK,EAAE,OAAY,EAAE,OAAY,EAAE,EAAE;YAClD,OAAO,mBAAmB,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QACD,2FAA2F;QAC3F,YAAY,EAAE,KAAK,EAAE,OAAY,EAAE,OAAY,EAAE,EAAE;YACjD,OAAO,mBAAmB,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,2FAA2F;QAC3F,WAAW,EAAE,KAAK,EAAE,KAAU,EAAE,EAAE;YAChC,MAAM,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,2FAA2F;QAC3F,UAAU,EAAE,KAAK,EAAE,KAAU,EAAE,EAAE;YAC/B,MAAM,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC,CAAC;IAEH,gBAAgB,GAAG,UAAU,CAAC;IAC9B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,EAAE,CAAC;IACT,CAAC;IACD,+CAA+C;IAC/C,OAAO,YAAsB,CAAC;AAChC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,YAAY,GAAG,IAAI,CAAC;IACpB,gBAAgB,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,qCAAqC;AACrC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;IAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type Tracer } from '@prefactor/core';
1
+ import { type AgentInstanceManager, type Tracer } from '@prefactor/core';
2
2
  /**
3
3
  * Prefactor middleware for LangChain.js agents.
4
4
  *
@@ -26,8 +26,10 @@ import { type Tracer } from '@prefactor/core';
26
26
  */
27
27
  export declare class PrefactorMiddleware {
28
28
  private tracer;
29
+ private agentManager;
30
+ private agentInfo?;
29
31
  private rootSpan;
30
- constructor(tracer: Tracer);
32
+ constructor(tracer: Tracer, agentManager: AgentInstanceManager, agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]);
31
33
  /**
32
34
  * Called before agent execution starts
33
35
  *
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGhF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,mBAAmB;IAGlB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,QAAQ,CAAqB;gBAEjB,MAAM,EAAE,MAAM;IAElC;;;;OAIG;IAEG,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB5C;;;;OAIG;IAEG,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAe3C;;;;;;OAMG;IAEG,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA4BnF;;;;;;OAMG;IAEG,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2BlF;;OAEG;IAEH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IAEH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IAEH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IAEH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IAEH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IAEH,OAAO,CAAC,kBAAkB;CAG3B"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAyB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGhG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,SAAS,CAAC;IALpB,OAAO,CAAC,QAAQ,CAAgD;gBAGtD,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,oBAAoB,EAClC,SAAS,CAAC,EAAE,UAAU,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAG1E;;;;OAIG;IAEG,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C;;;;OAIG;IAEG,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAe3C;;;;;;OAMG;IAEG,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAwBnF;;;;;;OAMG;IAEG,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAuBlF;;OAEG;IAEH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IAEH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IAEH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IAEH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IAEH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IAEH,OAAO,CAAC,kBAAkB;CAG3B"}
@@ -27,9 +27,13 @@ import { extractTokenUsage } from './metadata-extractor.js';
27
27
  */
28
28
  export class PrefactorMiddleware {
29
29
  tracer;
30
+ agentManager;
31
+ agentInfo;
30
32
  rootSpan = null;
31
- constructor(tracer) {
33
+ constructor(tracer, agentManager, agentInfo) {
32
34
  this.tracer = tracer;
35
+ this.agentManager = agentManager;
36
+ this.agentInfo = agentInfo;
33
37
  }
34
38
  /**
35
39
  * Called before agent execution starts
@@ -38,17 +42,15 @@ export class PrefactorMiddleware {
38
42
  */
39
43
  // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure
40
44
  async beforeAgent(state) {
41
- const parentSpan = SpanContext.getCurrent();
42
45
  const messages = state?.messages ?? [];
43
- this.tracer.startAgentInstance();
46
+ this.agentManager.startInstance(this.agentInfo);
44
47
  const span = this.tracer.startSpan({
45
- name: 'agent',
48
+ name: 'langchain:agent',
46
49
  spanType: SpanType.AGENT,
47
50
  inputs: { messages: messages.slice(-3).map((m) => String(m)) },
48
- parentSpanId: parentSpan?.spanId,
49
- traceId: parentSpan?.traceId,
50
51
  });
51
52
  this.rootSpan = span;
53
+ SpanContext.enter(span);
52
54
  }
53
55
  /**
54
56
  * Called after agent execution completes
@@ -64,8 +66,8 @@ export class PrefactorMiddleware {
64
66
  this.tracer.endSpan(this.rootSpan, {
65
67
  outputs: { messages: messages.slice(-3).map((m) => String(m)) },
66
68
  });
67
- this.tracer.finishAgentInstance();
68
- SpanContext.clear();
69
+ this.agentManager.finishInstance();
70
+ SpanContext.exit();
69
71
  this.rootSpan = null;
70
72
  }
71
73
  /**
@@ -77,13 +79,10 @@ export class PrefactorMiddleware {
77
79
  */
78
80
  // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic
79
81
  async wrapModelCall(request, handler) {
80
- const parentSpan = SpanContext.getCurrent();
81
82
  const span = this.tracer.startSpan({
82
83
  name: this.extractModelName(request),
83
84
  spanType: SpanType.LLM,
84
85
  inputs: this.extractModelInputs(request),
85
- parentSpanId: parentSpan?.spanId,
86
- traceId: parentSpan?.traceId,
87
86
  });
88
87
  try {
89
88
  // CRITICAL: Wrap handler in context so child operations see this span
@@ -109,13 +108,10 @@ export class PrefactorMiddleware {
109
108
  */
110
109
  // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic
111
110
  async wrapToolCall(request, handler) {
112
- const parentSpan = SpanContext.getCurrent();
113
111
  const span = this.tracer.startSpan({
114
112
  name: this.extractToolName(request),
115
113
  spanType: SpanType.TOOL,
116
114
  inputs: this.extractToolInputs(request),
117
- parentSpanId: parentSpan?.spanId,
118
- traceId: parentSpan?.traceId,
119
115
  });
120
116
  try {
121
117
  // CRITICAL: Wrap handler in context so child operations see this span
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,WAAW,EAAE,QAAQ,EAAe,MAAM,iBAAiB,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,mBAAmB;IAIpB;IACA;IACA;IALF,QAAQ,GAA2C,IAAI,CAAC;IAEhE,YACU,MAAc,EACd,YAAkC,EAClC,SAAgE;QAFhE,WAAM,GAAN,MAAM,CAAQ;QACd,iBAAY,GAAZ,YAAY,CAAsB;QAClC,cAAS,GAAT,SAAS,CAAuD;IACvE,CAAC;IAEJ;;;;OAIG;IACH,mFAAmF;IACnF,KAAK,CAAC,WAAW,CAAC,KAAU;QAC1B,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;QAEvC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEhD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACjC,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,QAAQ,CAAC,KAAK;YACxB,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;SACxE,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,mFAAmF;IACnF,KAAK,CAAC,UAAU,CAAC,KAAU;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;YACjC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;SACzE,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QACnC,WAAW,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACH,0FAA0F;IAC1F,KAAK,CAAC,aAAa,CAAI,OAAY,EAAE,OAAiC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACjC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACpC,QAAQ,EAAE,QAAQ,CAAC,GAAG;YACtB,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,sEAAsE;YACtE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;gBAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC;YAC5E,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,0FAA0F;IAC1F,KAAK,CAAC,YAAY,CAAI,OAAY,EAAE,OAAiC;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACjC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACnC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;SACxC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,sEAAsE;YACtE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;gBAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;gBACxB,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;aAC3C,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,qFAAqF;IAC7E,gBAAgB,CAAC,OAAY;QACnC,OAAO,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,qFAAqF;IAC7E,kBAAkB,CAAC,OAAY;QACrC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;QACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,sFAAsF;IAC9E,mBAAmB,CAAC,QAAa;QACvC,MAAM,OAAO,GAAG,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,qFAAqF;IAC7E,eAAe,CAAC,OAAY;QAClC,OAAO,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,qFAAqF;IAC7E,iBAAiB,CAAC,OAAY;QACpC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,sFAAsF;IAC9E,kBAAkB,CAAC,QAAa;QACtC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,EAAE,CAAC;IAClD,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prefactor/langchain",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "LangChain.js integration for Prefactor observability",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -28,7 +28,7 @@
28
28
  "author": "Prefactor",
29
29
  "license": "MIT",
30
30
  "dependencies": {
31
- "@prefactor/core": "0.1.0",
31
+ "@prefactor/core": "0.1.1",
32
32
  "@prefactor/pfid": "^0.1.0"
33
33
  },
34
34
  "peerDependencies": {