@prefactor/sdk 0.1.2 → 0.1.4
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/dist/index.cjs +16 -1237
- package/dist/index.cjs.map +4 -17
- package/dist/index.d.ts +2 -81
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1239
- package/dist/index.js.map +4 -17
- package/package.json +6 -22
- package/LICENSE +0 -14
- package/README.md +0 -313
- package/dist/LICENSE +0 -14
- package/dist/README.md +0 -313
- package/dist/config.d.ts +0 -259
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -110
- package/dist/config.js.map +0 -1
- package/dist/instrumentation/langchain/metadata-extractor.d.ts +0 -20
- package/dist/instrumentation/langchain/metadata-extractor.d.ts.map +0 -1
- package/dist/instrumentation/langchain/metadata-extractor.js +0 -54
- package/dist/instrumentation/langchain/metadata-extractor.js.map +0 -1
- package/dist/instrumentation/langchain/middleware.d.ts +0 -84
- package/dist/instrumentation/langchain/middleware.d.ts.map +0 -1
- package/dist/instrumentation/langchain/middleware.js +0 -181
- package/dist/instrumentation/langchain/middleware.js.map +0 -1
- package/dist/package.json +0 -56
- package/dist/tracing/context.d.ts +0 -53
- package/dist/tracing/context.d.ts.map +0 -1
- package/dist/tracing/context.js +0 -65
- package/dist/tracing/context.js.map +0 -1
- package/dist/tracing/span.d.ts +0 -68
- package/dist/tracing/span.d.ts.map +0 -1
- package/dist/tracing/span.js +0 -21
- package/dist/tracing/span.js.map +0 -1
- package/dist/tracing/tracer.d.ts +0 -100
- package/dist/tracing/tracer.d.ts.map +0 -1
- package/dist/tracing/tracer.js +0 -151
- package/dist/tracing/tracer.js.map +0 -1
- package/dist/transport/base.d.ts +0 -38
- package/dist/transport/base.d.ts.map +0 -1
- package/dist/transport/base.js +0 -2
- package/dist/transport/base.js.map +0 -1
- package/dist/transport/http.d.ts +0 -90
- package/dist/transport/http.d.ts.map +0 -1
- package/dist/transport/http.js +0 -381
- package/dist/transport/http.js.map +0 -1
- package/dist/transport/stdio.d.ts +0 -48
- package/dist/transport/stdio.d.ts.map +0 -1
- package/dist/transport/stdio.js +0 -71
- package/dist/transport/stdio.js.map +0 -1
- package/dist/utils/logging.d.ts +0 -29
- package/dist/utils/logging.d.ts.map +0 -1
- package/dist/utils/logging.js +0 -71
- package/dist/utils/logging.js.map +0 -1
- package/dist/utils/serialization.d.ts +0 -24
- package/dist/utils/serialization.d.ts.map +0 -1
- package/dist/utils/serialization.js +0 -60
- package/dist/utils/serialization.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../
|
|
3
|
+
"sources": ["../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"
|
|
6
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.zero = zero;\nexports.generate = generate;\nexports.generateWithTimestamp = generateWithTimestamp;\nexports.generateExample = generateExample;\nexports.generateRelated = generateRelated;\nexports.generateRoot = generateRoot;\nexports.generateBinary = generateBinary;\nexports.generateBinaryWithTimestamp = generateBinaryWithTimestamp;\nexports.isPfid = isPfid;\nexports.encode = encode;\nexports.decode = decode;\nexports.extractPartition = extractPartition;\nexports.generatePartition = generatePartition;\nconst crypto_1 = require(\"crypto\");\nconst errors_1 = require(\"./errors\");\n// Constants\nconst MAX_TIMESTAMP = 281474976710655; // 2^48 - 1\nconst MAX_PARTITION = 1073741823; // 2^30 - 1\n// Crockford Base32 encoding/decoding\nconst ENCODE_CHARS = '0123456789abcdefghjkmnpqrstvwxyz';\nconst DECODE_MAP = {\n '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,\n '8': 8, '9': 9, 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15,\n 'g': 16, 'h': 17, 'j': 18, 'k': 19, 'm': 20, 'n': 21, 'p': 22, 'q': 23,\n 'r': 24, 's': 25, 't': 26, 'v': 27, 'w': 28, 'x': 29, 'y': 30, 'z': 31,\n};\nfunction encodeChar(value) {\n return ENCODE_CHARS[value];\n}\nfunction decodeChar(char) {\n const value = DECODE_MAP[char.toLowerCase()];\n if (value === undefined) {\n throw new Error(`Invalid character: ${char}`);\n }\n return value;\n}\n// Validation guards\nfunction isValidTimestamp(timestamp) {\n return Number.isInteger(timestamp) && timestamp >= 0 && timestamp <= MAX_TIMESTAMP;\n}\nfunction isValidPartition(partition) {\n return Number.isInteger(partition) && partition >= 0 && partition <= MAX_PARTITION;\n}\n/**\n * A zero PFID -- probably don't actually use it, but if you need a placeholder.\n */\nfunction zero() {\n return '00000000000000000000000000000000';\n}\n/**\n * Generate a Crockford Base32 encoded PFID string with current time.\n */\nfunction generate(partition) {\n if (!isValidPartition(partition)) {\n throw new Error(`Invalid partition: ${partition}`);\n }\n return unsafeEncode(generateBinary(partition));\n}\n/**\n * Generate a Crockford Base32 encoded PFID string with a provided Unix timestamp.\n */\nfunction generateWithTimestamp(partition, timestamp) {\n if (!isValidPartition(partition)) {\n throw new Error(`Invalid partition: ${partition}`);\n }\n if (!isValidTimestamp(timestamp)) {\n throw new Error(`Invalid timestamp: ${timestamp}`);\n }\n return unsafeEncode(generateBinaryWithTimestamp(partition, timestamp));\n}\n/**\n * Generate an ID suitable for use in an example -- it's well into the past.\n */\nfunction generateExample() {\n return generateWithTimestamp(123456789, 1234567890000);\n}\n/**\n * Generate an ID with the same partition as an existing PFID.\n */\nfunction generateRelated(existingPfid) {\n return generate(extractPartition(existingPfid));\n}\n/**\n * Generate an ID with a random partition.\n */\nfunction generateRoot() {\n return generate(generatePartition());\n}\n/**\n * Generate a binary PFID with current time.\n */\nfunction generateBinary(partition) {\n if (!isValidPartition(partition)) {\n throw new Error(`Invalid partition: ${partition}`);\n }\n const timestamp = Date.now();\n return generateBinaryWithTimestamp(partition, timestamp);\n}\n/**\n * Generate a binary PFID with a provided Unix timestamp.\n *\n * Binary layout (20 bytes):\n * - Bytes 0-5: timestamp (48 bits, big-endian)\n * - Bytes 6-9: partition (32 bits, big-endian, but only 30 bits used)\n * - Bytes 10-19: randomness (80 bits)\n */\nfunction generateBinaryWithTimestamp(partition, timestamp) {\n if (!isValidPartition(partition)) {\n throw new Error(`Invalid partition: ${partition}`);\n }\n if (!isValidTimestamp(timestamp)) {\n throw new Error(`Invalid timestamp: ${timestamp}`);\n }\n const buffer = Buffer.allocUnsafe(20);\n // Write timestamp (48 bits = 6 bytes) - big endian\n // JavaScript bitwise operators only work on 32 bits, so we need to use division for high bits\n buffer[0] = Math.floor(timestamp / 0x10000000000) & 0xff; // >> 40\n buffer[1] = Math.floor(timestamp / 0x100000000) & 0xff; // >> 32\n buffer[2] = (timestamp >> 24) & 0xff;\n buffer[3] = (timestamp >> 16) & 0xff;\n buffer[4] = (timestamp >> 8) & 0xff;\n buffer[5] = timestamp & 0xff;\n // Write partition (32 bits = 4 bytes) - big endian\n buffer.writeUInt32BE(partition, 6);\n // Write randomness (80 bits = 10 bytes)\n (0, crypto_1.randomBytes)(10).copy(buffer, 10);\n return buffer;\n}\n/**\n * Check if a string is a valid PFID.\n * Valid PFID: 32 characters, first character must be 0-7, rest must be valid Crockford Base32.\n */\nfunction isPfid(string) {\n if (typeof string !== 'string') {\n return false;\n }\n if (string.length !== 32) {\n return false;\n }\n // First character must be 0-7\n if (string[0] < '0' || string[0] > '7') {\n return false;\n }\n // All characters must be valid Crockford Base32\n const validPattern = /^[0-7][0-9abcdefghjkmnpqrstvwxyz]{31}$/;\n return validPattern.test(string);\n}\n/**\n * Encode a binary PFID to a Crockford Base32 string.\n * @throws {PfidError} If the binary is invalid\n */\nfunction encode(binary) {\n if (!Buffer.isBuffer(binary) || binary.length !== 20) {\n throw errors_1.PfidError.make('invalid_binary', binary);\n }\n try {\n const encoded = unsafeEncode(binary);\n if (isPfid(encoded)) {\n return encoded;\n }\n else {\n throw errors_1.PfidError.make('invalid_binary', binary);\n }\n }\n catch (error) {\n if (error instanceof errors_1.PfidError) {\n throw error;\n }\n throw errors_1.PfidError.make('invalid_binary', binary);\n }\n}\n/**\n * Decode a Crockford Base32 PFID string to binary.\n * @throws {PfidError} If the PFID is invalid\n */\nfunction decode(pfid) {\n if (typeof pfid !== 'string' || pfid.length !== 32) {\n throw errors_1.PfidError.make('invalid_pfid', pfid);\n }\n // First character must be 0-7\n if (pfid[0] < '0' || pfid[0] > '7') {\n throw errors_1.PfidError.make('invalid_pfid', pfid);\n }\n try {\n return unsafeDecode(pfid);\n }\n catch (error) {\n if (error instanceof errors_1.PfidError) {\n throw error;\n }\n throw errors_1.PfidError.make('invalid_pfid', pfid);\n }\n}\n/**\n * Extract partition from a PFID string.\n * @throws {PfidError} If the PFID is invalid\n */\nfunction extractPartition(pfid) {\n if (!isPfid(pfid)) {\n throw errors_1.PfidError.make('invalid_pfid', pfid);\n }\n try {\n // Extract the partition portion (characters 10-15, 6 characters = 30 bits)\n const partitionStr = pfid.substring(10, 16);\n return decodePartition(partitionStr);\n }\n catch (error) {\n if (error instanceof errors_1.PfidError) {\n throw error;\n }\n throw errors_1.PfidError.make('invalid_pfid', pfid);\n }\n}\n/**\n * Generate a random partition.\n */\nfunction generatePartition() {\n const buffer = (0, crypto_1.randomBytes)(4);\n // Clear top 2 bits to ensure partition is in valid range\n buffer[0] = buffer[0] & 0x3f; // Keep only bottom 6 bits of first byte\n // Read as 32-bit unsigned integer, but only use 30 bits\n const partition = buffer.readUInt32BE(0) & 0x3fffffff;\n return partition;\n}\n// Internal encoding/decoding functions\n/**\n * Unsafe encode - assumes valid 20-byte buffer.\n * Encodes 160 bits as 32 characters of Crockford Base32.\n *\n * Bit layout (reading from binary):\n * - t1::3, t2::5, t3::5, t4::5, t5::5, t6::5, t7::5, t8::5, t9::5, t10::5 (48 bits timestamp)\n * - 0::2 (2 bits padding)\n * - p1::5, p2::5, p3::5, p4::5, p5::5, p6::5 (30 bits partition)\n * - r1::5, r2::5, r3::5, r4::5, r5::5, r6::5, r7::5, r8::5, r9::5, r10::5, r11::5, r12::5, r13::5, r14::5, r15::5, r16::5 (80 bits randomness)\n */\nfunction unsafeEncode(binary) {\n // Helper to read bits across byte boundaries\n let bitOffset = 0;\n function readBits(count) {\n let value = 0;\n for (let i = 0; i < count; i++) {\n const byteIndex = Math.floor(bitOffset / 8);\n const bitIndex = 7 - (bitOffset % 8);\n const bit = (binary[byteIndex] >> bitIndex) & 1;\n value = (value << 1) | bit;\n bitOffset++;\n }\n return value;\n }\n // Read timestamp: 3 + 5*9 = 48 bits\n const t1 = readBits(3);\n const t2 = readBits(5);\n const t3 = readBits(5);\n const t4 = readBits(5);\n const t5 = readBits(5);\n const t6 = readBits(5);\n const t7 = readBits(5);\n const t8 = readBits(5);\n const t9 = readBits(5);\n const t10 = readBits(5);\n // Skip 2 padding bits\n readBits(2);\n // Read partition: 5*6 = 30 bits\n const p1 = readBits(5);\n const p2 = readBits(5);\n const p3 = readBits(5);\n const p4 = readBits(5);\n const p5 = readBits(5);\n const p6 = readBits(5);\n // Read randomness: 5*16 = 80 bits\n const r1 = readBits(5);\n const r2 = readBits(5);\n const r3 = readBits(5);\n const r4 = readBits(5);\n const r5 = readBits(5);\n const r6 = readBits(5);\n const r7 = readBits(5);\n const r8 = readBits(5);\n const r9 = readBits(5);\n const r10 = readBits(5);\n const r11 = readBits(5);\n const r12 = readBits(5);\n const r13 = readBits(5);\n const r14 = readBits(5);\n const r15 = readBits(5);\n const r16 = readBits(5);\n return (encodeChar(t1) + encodeChar(t2) + encodeChar(t3) + encodeChar(t4) + encodeChar(t5) +\n encodeChar(t6) + encodeChar(t7) + encodeChar(t8) + encodeChar(t9) + encodeChar(t10) +\n encodeChar(p1) + encodeChar(p2) + encodeChar(p3) + encodeChar(p4) + encodeChar(p5) + encodeChar(p6) +\n encodeChar(r1) + encodeChar(r2) + encodeChar(r3) + encodeChar(r4) + encodeChar(r5) + encodeChar(r6) +\n encodeChar(r7) + encodeChar(r8) + encodeChar(r9) + encodeChar(r10) + encodeChar(r11) + encodeChar(r12) +\n encodeChar(r13) + encodeChar(r14) + encodeChar(r15) + encodeChar(r16));\n}\n/**\n * Unsafe decode - assumes valid 32-character string.\n * Decodes 32 characters of Crockford Base32 to 160 bits (20 bytes).\n *\n * The decode process reads each character as a byte, decodes it to a 5-bit value,\n * then packs those bits back into the binary format.\n */\nfunction unsafeDecode(pfid) {\n // Decode each character to its 5-bit value (except t1 which is 3 bits)\n const t1 = decodeChar(pfid[0]); // 3 bits\n const t2 = decodeChar(pfid[1]); // 5 bits\n const t3 = decodeChar(pfid[2]); // 5 bits\n const t4 = decodeChar(pfid[3]); // 5 bits\n const t5 = decodeChar(pfid[4]); // 5 bits\n const t6 = decodeChar(pfid[5]); // 5 bits\n const t7 = decodeChar(pfid[6]); // 5 bits\n const t8 = decodeChar(pfid[7]); // 5 bits\n const t9 = decodeChar(pfid[8]); // 5 bits\n const t10 = decodeChar(pfid[9]); // 5 bits\n const p1 = decodeChar(pfid[10]); // 5 bits\n const p2 = decodeChar(pfid[11]); // 5 bits\n const p3 = decodeChar(pfid[12]); // 5 bits\n const p4 = decodeChar(pfid[13]); // 5 bits\n const p5 = decodeChar(pfid[14]); // 5 bits\n const p6 = decodeChar(pfid[15]); // 5 bits\n const r1 = decodeChar(pfid[16]); // 5 bits\n const r2 = decodeChar(pfid[17]); // 5 bits\n const r3 = decodeChar(pfid[18]); // 5 bits\n const r4 = decodeChar(pfid[19]); // 5 bits\n const r5 = decodeChar(pfid[20]); // 5 bits\n const r6 = decodeChar(pfid[21]); // 5 bits\n const r7 = decodeChar(pfid[22]); // 5 bits\n const r8 = decodeChar(pfid[23]); // 5 bits\n const r9 = decodeChar(pfid[24]); // 5 bits\n const r10 = decodeChar(pfid[25]); // 5 bits\n const r11 = decodeChar(pfid[26]); // 5 bits\n const r12 = decodeChar(pfid[27]); // 5 bits\n const r13 = decodeChar(pfid[28]); // 5 bits\n const r14 = decodeChar(pfid[29]); // 5 bits\n const r15 = decodeChar(pfid[30]); // 5 bits\n const r16 = decodeChar(pfid[31]); // 5 bits\n // Helper to write bits across byte boundaries\n const buffer = Buffer.alloc(20, 0);\n let bitOffset = 0;\n function writeBits(value, count) {\n for (let i = count - 1; i >= 0; i--) {\n const byteIndex = Math.floor(bitOffset / 8);\n const bitIndex = 7 - (bitOffset % 8);\n const bit = (value >> i) & 1;\n buffer[byteIndex] |= (bit << bitIndex);\n bitOffset++;\n }\n }\n // Write timestamp: 3 + 5*9 = 48 bits\n writeBits(t1, 3);\n writeBits(t2, 5);\n writeBits(t3, 5);\n writeBits(t4, 5);\n writeBits(t5, 5);\n writeBits(t6, 5);\n writeBits(t7, 5);\n writeBits(t8, 5);\n writeBits(t9, 5);\n writeBits(t10, 5);\n // Write 2 padding bits (0)\n writeBits(0, 2);\n // Write partition: 5*6 = 30 bits\n writeBits(p1, 5);\n writeBits(p2, 5);\n writeBits(p3, 5);\n writeBits(p4, 5);\n writeBits(p5, 5);\n writeBits(p6, 5);\n // Write randomness: 5*16 = 80 bits\n writeBits(r1, 5);\n writeBits(r2, 5);\n writeBits(r3, 5);\n writeBits(r4, 5);\n writeBits(r5, 5);\n writeBits(r6, 5);\n writeBits(r7, 5);\n writeBits(r8, 5);\n writeBits(r9, 5);\n writeBits(r10, 5);\n writeBits(r11, 5);\n writeBits(r12, 5);\n writeBits(r13, 5);\n writeBits(r14, 5);\n writeBits(r15, 5);\n writeBits(r16, 5);\n return buffer;\n}\n/**\n * Decode partition from 6-character encoded partition string.\n * @throws {PfidError} If the partition string is invalid\n */\nfunction decodePartition(partitionStr) {\n if (typeof partitionStr !== 'string' || partitionStr.length !== 6) {\n throw errors_1.PfidError.make('invalid_partition', partitionStr);\n }\n try {\n const p1 = decodeChar(partitionStr[0]);\n const p2 = decodeChar(partitionStr[1]);\n const p3 = decodeChar(partitionStr[2]);\n const p4 = decodeChar(partitionStr[3]);\n const p5 = decodeChar(partitionStr[4]);\n const p6 = decodeChar(partitionStr[5]);\n // Reconstruct the 30-bit partition value\n // The partition is stored as: 0 (2 bits) + p1 (5 bits) + p2 (5 bits) + ... + p6 (5 bits)\n const buffer = Buffer.allocUnsafe(4);\n buffer[0] = (0 << 6) | (p1 << 1) | (p2 >> 4);\n buffer[1] = ((p2 & 0x0f) << 4) | (p3 >> 1);\n buffer[2] = ((p3 & 0x01) << 7) | (p4 << 2) | (p5 >> 3);\n buffer[3] = ((p5 & 0x07) << 5) | (p6 >> 0);\n // Read as 32-bit unsigned integer, mask to 30 bits\n const partition = buffer.readUInt32BE(0) & 0x3fffffff;\n return partition;\n }\n catch (error) {\n if (error instanceof errors_1.PfidError) {\n throw error;\n }\n throw errors_1.PfidError.make('invalid_partition', partitionStr);\n }\n}\n//# sourceMappingURL=pfid.js.map",
|
|
7
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PfidError = exports.generatePartition = exports.extractPartition = exports.decode = exports.encode = exports.isPfid = exports.generateBinaryWithTimestamp = exports.generateBinary = exports.generateRoot = exports.generateRelated = exports.generateExample = exports.generateWithTimestamp = exports.generate = exports.zero = void 0;\nvar pfid_1 = require(\"./pfid\");\nObject.defineProperty(exports, \"zero\", { enumerable: true, get: function () { return pfid_1.zero; } });\nObject.defineProperty(exports, \"generate\", { enumerable: true, get: function () { return pfid_1.generate; } });\nObject.defineProperty(exports, \"generateWithTimestamp\", { enumerable: true, get: function () { return pfid_1.generateWithTimestamp; } });\nObject.defineProperty(exports, \"generateExample\", { enumerable: true, get: function () { return pfid_1.generateExample; } });\nObject.defineProperty(exports, \"generateRelated\", { enumerable: true, get: function () { return pfid_1.generateRelated; } });\nObject.defineProperty(exports, \"generateRoot\", { enumerable: true, get: function () { return pfid_1.generateRoot; } });\nObject.defineProperty(exports, \"generateBinary\", { enumerable: true, get: function () { return pfid_1.generateBinary; } });\nObject.defineProperty(exports, \"generateBinaryWithTimestamp\", { enumerable: true, get: function () { return pfid_1.generateBinaryWithTimestamp; } });\nObject.defineProperty(exports, \"isPfid\", { enumerable: true, get: function () { return pfid_1.isPfid; } });\nObject.defineProperty(exports, \"encode\", { enumerable: true, get: function () { return pfid_1.encode; } });\nObject.defineProperty(exports, \"decode\", { enumerable: true, get: function () { return pfid_1.decode; } });\nObject.defineProperty(exports, \"extractPartition\", { enumerable: true, get: function () { return pfid_1.extractPartition; } });\nObject.defineProperty(exports, \"generatePartition\", { enumerable: true, get: function () { return pfid_1.generatePartition; } });\nvar errors_1 = require(\"./errors\");\nObject.defineProperty(exports, \"PfidError\", { enumerable: true, get: function () { return errors_1.PfidError; } });\n//# sourceMappingURL=index.js.map",
|
|
8
|
-
"import { extractPartition, type Partition } from '@prefactor/pfid';\nimport { Tracer } from './tracing/tracer.js';\nimport { PrefactorMiddleware } from './instrumentation/langchain/middleware.js';\nimport { StdioTransport } from './transport/stdio.js';\nimport { HttpTransport } from './transport/http.js';\nimport { createConfig, HttpTransportConfigSchema, type Config } from './config.js';\nimport { configureLogging, getLogger } from './utils/logging.js';\nimport { createMiddleware, type AgentMiddleware } from 'langchain';\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/sdk';\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;\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/sdk';\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 return globalTracer!;\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/sdk';\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\n// Re-export types for consumer convenience\nexport type { Config, HttpTransportConfig } from './config.js';\nexport { SpanType, SpanStatus } from './tracing/span.js';\nexport type { Span, TokenUsage, ErrorInfo } from './tracing/span.js';\nexport { PrefactorMiddleware } from './instrumentation/langchain/middleware.js';\nexport { Tracer } from './tracing/tracer.js';\n",
|
|
9
|
-
"import { generate, generatePartition, type Partition } from '@prefactor/pfid';\nimport type { Transport } from '../transport/base.js';\nimport type { Span, SpanType, TokenUsage } from './span.js';\nimport { SpanStatus } from './span.js';\n\n/**\n * Options for starting a new span\n */\nexport interface StartSpanOptions {\n /** Name of the span */\n name: string;\n\n /** Type of operation this span represents */\n spanType: SpanType;\n\n /** Input data for this operation */\n inputs: Record<string, unknown>;\n\n /** ID of the parent span (optional) */\n parentSpanId?: string;\n\n /** Trace ID to use (optional, will generate if not provided) */\n traceId?: string;\n\n /** Additional metadata (optional) */\n metadata?: Record<string, unknown>;\n\n /** Tags for categorizing the span (optional) */\n tags?: string[];\n}\n\n/**\n * Options for ending a span\n */\nexport interface EndSpanOptions {\n /** Output data from the operation */\n outputs?: Record<string, unknown>;\n\n /** Error that occurred (if any) */\n error?: Error;\n\n /** Token usage information (for LLM calls) */\n tokenUsage?: TokenUsage;\n}\n\n/**\n * Tracer manages the lifecycle of spans.\n *\n * The tracer is responsible for:\n * - Creating spans with unique IDs\n * - Managing span lifecycle (start/end)\n * - Delegating to the transport layer for span emission\n * - Handling agent instance lifecycle\n *\n * @example\n * ```typescript\n * const tracer = new Tracer(transport);\n *\n * const span = tracer.startSpan({\n * name: 'llm-call',\n * spanType: SpanType.LLM,\n * inputs: { prompt: 'Hello' }\n * });\n *\n * try {\n * // ... do work ...\n * tracer.endSpan(span, { outputs: { response: 'Hi!' } });\n * } catch (error) {\n * tracer.endSpan(span, { error });\n * }\n * ```\n */\nexport class Tracer {\n private partition: Partition;\n\n /**\n * Initialize the tracer.\n *\n * @param transport - The transport to use for emitting spans\n * @param partition - The partition for ID generation. If not provided, a random partition will be generated.\n */\n constructor(private transport: Transport, partition?: Partition) {\n this.partition = partition ?? generatePartition();\n }\n\n /**\n * Start a new span\n *\n * @param options - Span configuration options\n * @returns The created span\n */\n startSpan(options: StartSpanOptions): Span {\n const spanId = generate(this.partition);\n const traceId = options.traceId ?? generate(this.partition);\n\n const span: Span = {\n spanId,\n parentSpanId: options.parentSpanId ?? null,\n traceId,\n name: options.name,\n spanType: options.spanType,\n startTime: Date.now(),\n endTime: null,\n status: SpanStatus.RUNNING,\n inputs: options.inputs,\n outputs: null,\n tokenUsage: null,\n error: null,\n metadata: options.metadata ?? {},\n tags: options.tags ?? [],\n };\n\n // AGENT spans are emitted immediately for real-time tracking\n // They will be finished later with finishSpan()\n if (options.spanType === 'agent') {\n try {\n this.transport.emit(span);\n } catch (error) {\n console.error('Failed to emit agent span:', error);\n }\n }\n\n return span;\n }\n\n /**\n * End a span and emit it to the transport\n *\n * @param span - The span to end\n * @param options - End span options (outputs, error, token usage)\n */\n endSpan(span: Span, options?: EndSpanOptions): void {\n span.endTime = Date.now();\n span.outputs = options?.outputs ?? null;\n span.tokenUsage = options?.tokenUsage ?? null;\n\n if (options?.error) {\n span.status = SpanStatus.ERROR;\n span.error = {\n errorType: options.error.constructor.name,\n message: options.error.message,\n stacktrace: options.error.stack ?? '',\n };\n } else {\n span.status = SpanStatus.SUCCESS;\n }\n\n try {\n // AGENT spans use finishSpan API (they were already emitted on start)\n // Other span types are emitted here\n if (span.spanType === 'agent') {\n this.transport.finishSpan(span.spanId, span.endTime);\n } else {\n this.transport.emit(span);\n }\n } catch (error) {\n console.error('Failed to emit/finish span:', error);\n }\n }\n\n /**\n * Signal the start of an agent instance execution\n */\n startAgentInstance(): void {\n try {\n this.transport.startAgentInstance();\n } catch (error) {\n console.error('Failed to start agent instance:', error);\n }\n }\n\n /**\n * Signal the completion of an agent instance execution\n */\n finishAgentInstance(): void {\n try {\n this.transport.finishAgentInstance();\n } catch (error) {\n console.error('Failed to finish agent instance:', error);\n }\n }\n\n /**\n * Close the tracer and flush any pending spans\n *\n * @returns Promise that resolves when the tracer is closed\n */\n async close(): Promise<void> {\n try {\n await this.transport.close();\n } catch (error) {\n console.error('Failed to close transport:', error);\n }\n }\n}\n",
|
|
10
|
-
"/**\n * Types of spans that can be traced\n */\nexport enum SpanType {\n AGENT = 'agent',\n LLM = 'llm',\n TOOL = 'tool',\n CHAIN = 'chain',\n RETRIEVER = 'retriever',\n}\n\n/**\n * Status of a span\n */\nexport enum SpanStatus {\n RUNNING = 'running',\n SUCCESS = 'success',\n ERROR = 'error',\n}\n\n/**\n * Token usage information for LLM calls\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n/**\n * Error information captured when a span fails\n */\nexport interface ErrorInfo {\n errorType: string;\n message: string;\n stacktrace: string;\n}\n\n/**\n * A span represents a single operation in a trace\n */\nexport interface Span {\n /** Unique identifier for this span */\n spanId: string;\n\n /** ID of the parent span, or null if this is a root span */\n parentSpanId: string | null;\n\n /** Trace ID shared by all spans in a single trace */\n traceId: string;\n\n /** Human-readable name for this span */\n name: string;\n\n /** Type of operation this span represents */\n spanType: SpanType;\n\n /** Start time in milliseconds since Unix epoch */\n startTime: number;\n\n /** End time in milliseconds since Unix epoch, or null if still running */\n endTime: number | null;\n\n /** Current status of the span */\n status: SpanStatus;\n\n /** Input data for this operation */\n inputs: Record<string, unknown>;\n\n /** Output data from this operation, or null if not completed */\n outputs: Record<string, unknown> | null;\n\n /** Token usage for LLM calls, or null if not applicable */\n tokenUsage: TokenUsage | null;\n\n /** Error information if the span failed, or null if successful */\n error: ErrorInfo | null;\n\n /** Additional metadata about this span */\n metadata: Record<string, unknown>;\n\n /** Tags for categorizing and filtering spans */\n tags: string[];\n}\n",
|
|
11
|
-
"import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Span } from './span.js';\n\n/**\n * Storage for the current span in async context\n */\nconst spanStorage = new AsyncLocalStorage<Span>();\n\n/**\n * SpanContext manages the current span in async execution contexts.\n * This enables automatic parent-child span relationships without manual tracking.\n *\n * Uses Node.js AsyncLocalStorage which provides async-safe context propagation.\n *\n * @example\n * ```typescript\n * const span = tracer.startSpan({ name: 'parent', ... });\n *\n * await SpanContext.runAsync(span, async () => {\n * // Inside this function, getCurrent() returns the parent span\n * const parent = SpanContext.getCurrent();\n *\n * const child = tracer.startSpan({\n * name: 'child',\n * parentSpanId: parent?.spanId,\n * traceId: parent?.traceId,\n * });\n * // ...\n * });\n * ```\n */\nexport class SpanContext {\n /**\n * Get the current span from the async context\n *\n * @returns The current span, or undefined if no span is active\n */\n static getCurrent(): Span | undefined {\n return spanStorage.getStore();\n }\n\n /**\n * Run a synchronous function with the given span as the current context\n *\n * @param span - The span to set as current\n * @param fn - The function to execute\n * @returns The return value of the function\n */\n static run<T>(span: Span, fn: () => T): T {\n return spanStorage.run(span, fn);\n }\n\n /**\n * Run an asynchronous function with the given span as the current context\n *\n * @param span - The span to set as current\n * @param fn - The async function to execute\n * @returns A promise resolving to the return value of the function\n */\n static async runAsync<T>(span: Span, fn: () => Promise<T>): Promise<T> {\n return spanStorage.run(span, fn);\n }\n\n /**\n * Clear the current context (primarily for testing)\n */\n static clear(): void {\n spanStorage.disable();\n }\n}\n",
|
|
12
|
-
"import type { TokenUsage } from '../../tracing/span.js';\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",
|
|
13
|
-
"import type { Tracer } from '../../tracing/tracer.js';\nimport { SpanContext } from '../../tracing/context.js';\nimport { SpanType } from '../../tracing/span.js';\nimport type { Span } from '../../tracing/span.js';\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/sdk';\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",
|
|
14
|
-
"/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated\n *\n * @param value - The string to truncate\n * @param maxLength - Maximum length\n * @returns Truncated string\n */\nexport function truncateString(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength) + '... [truncated]';\n}\n\n/**\n * Serialize a value for JSON output, handling non-serializable types and\n * truncating long strings\n *\n * @param value - Value to serialize\n * @param maxLength - Maximum length for strings (null for no truncation)\n * @returns Serialized value\n *\n * @example\n * ```typescript\n * const serialized = serializeValue({ message: 'Hello'.repeat(1000) }, 100);\n * // Result: { message: 'HelloHelloHello... [truncated]' }\n * ```\n */\nexport function serializeValue(value: unknown, maxLength: number | null = 10000): unknown {\n // Handle primitives that don't need serialization\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'boolean' || typeof value === 'number') {\n return value;\n }\n\n // Handle strings with truncation\n if (typeof value === 'string') {\n return maxLength !== null ? truncateString(value, maxLength) : value;\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map((item) => serializeValue(item, maxLength));\n }\n\n // Handle objects\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = serializeValue(val, maxLength);\n }\n return result;\n }\n\n // Handle other types by converting to string\n try {\n return String(value);\n } catch {\n return `<${typeof value} object>`;\n }\n}\n",
|
|
15
|
-
"import type { Transport } from './base.js';\nimport type { Span } from '../tracing/span.js';\nimport { serializeValue } from '../utils/serialization.js';\n\n/**\n * STDIO transport emits spans as newline-delimited JSON to stdout.\n *\n * This is the default transport and requires no configuration.\n * It's useful for local development and for piping span data to other tools.\n *\n * Features:\n * - Newline-delimited JSON output\n * - Promise-based write locking for ordering\n * - Graceful error handling\n *\n * @example\n * ```typescript\n * const transport = new StdioTransport();\n * const tracer = new Tracer(transport);\n * ```\n */\nexport class StdioTransport implements Transport {\n private closed = false;\n private writeLock = Promise.resolve();\n\n /**\n * Emit a span to stdout as JSON\n *\n * @param span - The span to emit\n */\n emit(span: Span): void {\n if (this.closed) {\n return;\n }\n\n // Queue write to maintain ordering\n this.writeLock = this.writeLock.then(async () => {\n try {\n const serialized = serializeValue(span);\n const json = JSON.stringify(serialized);\n await Bun.write(Bun.stdout, json + '\\n');\n } catch (error) {\n console.error('Failed to emit span to stdout:', error);\n }\n });\n }\n\n /**\n * No-op for stdio transport (not applicable)\n */\n finishSpan(): void {\n // No-op for stdio transport\n }\n\n /**\n * No-op for stdio transport (not applicable)\n */\n startAgentInstance(): void {\n // No-op for stdio transport\n }\n\n /**\n * No-op for stdio transport (not applicable)\n */\n finishAgentInstance(): void {\n // No-op for stdio transport\n }\n\n /**\n * Close the transport and wait for pending writes to complete\n *\n * @returns Promise that resolves when all writes are complete\n */\n async close(): Promise<void> {\n this.closed = true;\n await this.writeLock;\n }\n}\n",
|
|
16
|
-
"/**\n * Log levels for the SDK\n */\nenum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\n/**\n * Logger class for the Prefactor SDK\n */\nclass Logger {\n private static level: LogLevel = LogLevel.INFO;\n\n constructor(private namespace: string) {}\n\n debug(message: string, ...args: unknown[]): void {\n if (Logger.level <= LogLevel.DEBUG) {\n console.debug(`[prefactor:${this.namespace}] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (Logger.level <= LogLevel.INFO) {\n console.info(`[prefactor:${this.namespace}] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (Logger.level <= LogLevel.WARN) {\n console.warn(`[prefactor:${this.namespace}] ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (Logger.level <= LogLevel.ERROR) {\n console.error(`[prefactor:${this.namespace}] ${message}`, ...args);\n }\n }\n\n /**\n * Set the global log level\n */\n static setLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\n const levelMap = {\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n };\n Logger.level = levelMap[level];\n }\n}\n\n/**\n * Get a logger instance for a specific namespace\n *\n * @param namespace - The namespace for this logger\n * @returns Logger instance\n */\nexport function getLogger(namespace: string): Logger {\n return new Logger(namespace);\n}\n\n/**\n * Configure logging based on environment variables\n */\nexport function configureLogging(): void {\n const level = process.env.PREFACTOR_LOG_LEVEL?.toLowerCase() as\n | 'debug'\n | 'info'\n | 'warn'\n | 'error'\n | undefined;\n\n if (level) {\n Logger.setLevel(level);\n }\n}\n",
|
|
17
|
-
"import type { Transport } from './base.js';\nimport type { HttpTransportConfig } from '../config.js';\nimport type { Span } from '../tracing/span.js';\nimport { getLogger } from '../utils/logging.js';\n\nconst logger = getLogger('http-transport');\n\n/**\n * Queue item types for background processing\n */\ninterface QueueItem {\n type: 'span' | 'finish_span' | 'start_agent' | 'finish_agent';\n data: unknown;\n}\n\n/**\n * HTTP transport sends spans to a remote API endpoint.\n *\n * Features:\n * - Queue-based async processing\n * - Exponential backoff retry logic\n * - Span ID mapping (SDK ID → backend ID)\n * - Agent instance lifecycle management\n * - Graceful shutdown with timeout\n *\n * @example\n * ```typescript\n * const transport = new HttpTransport({\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * });\n * ```\n */\nexport class HttpTransport implements Transport {\n private queue: QueueItem[] = [];\n private processing = false;\n private closed = false;\n private agentInstanceId: string | null = null;\n private spanIdMap = new Map<string, string>();\n\n constructor(private config: HttpTransportConfig) {\n this.startProcessing();\n }\n\n /**\n * Emit a span (adds to queue for async processing)\n *\n * @param span - The span to emit\n */\n emit(span: Span): void {\n if (this.closed) {\n return;\n }\n this.queue.push({ type: 'span', data: span });\n }\n\n /**\n * Finish a previously emitted span (for AGENT spans)\n *\n * @param spanId - ID of the span to finish\n * @param endTime - End time in milliseconds since Unix epoch\n */\n finishSpan(spanId: string, endTime: number): void {\n if (this.closed) {\n return;\n }\n const timestamp = new Date(endTime).toISOString();\n this.queue.push({ type: 'finish_span', data: { spanId, timestamp } });\n }\n\n /**\n * Signal the start of an agent instance execution\n */\n startAgentInstance(): void {\n if (this.closed) {\n return;\n }\n this.queue.push({ type: 'start_agent', data: null });\n }\n\n /**\n * Signal the completion of an agent instance execution\n */\n finishAgentInstance(): void {\n if (this.closed) {\n return;\n }\n this.queue.push({ type: 'finish_agent', data: null });\n }\n\n /**\n * Start background queue processing\n */\n private async startProcessing(): Promise<void> {\n this.processing = true;\n\n while (!this.closed || this.queue.length > 0) {\n if (this.queue.length === 0) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n continue;\n }\n\n const item = this.queue.shift()!;\n\n try {\n // Ensure agent is registered before processing spans\n if (!this.agentInstanceId && item.type !== 'start_agent') {\n await this.ensureAgentRegistered();\n }\n\n switch (item.type) {\n case 'span':\n await this.sendSpan(item.data as Span);\n break;\n case 'finish_span':\n await this.finishSpanHttp(item.data as { spanId: string; timestamp: string });\n break;\n case 'start_agent':\n await this.startAgentInstanceHttp();\n break;\n case 'finish_agent':\n await this.finishAgentInstanceHttp();\n break;\n }\n } catch (error) {\n logger.error('Error processing queue item:', error);\n }\n }\n\n this.processing = false;\n }\n\n /**\n * Send a span to the API\n */\n private async sendSpan(span: Span, retry = 0): Promise<void> {\n const url = `${this.config.apiUrl}/api/v1/agent_spans`;\n const payload = this.transformSpanToApiFormat(span);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(this.config.requestTimeout),\n });\n\n if (response.ok) {\n const data = await response.json() as { details?: { id?: string } };\n const backendSpanId = data?.details?.id;\n if (backendSpanId) {\n this.spanIdMap.set(span.spanId, backendSpanId);\n }\n return;\n }\n\n // Retry on server errors or rate limiting\n if ((response.status >= 500 || response.status === 429) && retry < this.config.maxRetries) {\n const delay = Math.min(\n this.config.initialRetryDelay * Math.pow(this.config.retryMultiplier, retry),\n this.config.maxRetryDelay\n );\n logger.debug(`Retrying span send after ${delay}ms (attempt ${retry + 1})`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n return this.sendSpan(span, retry + 1);\n }\n\n logger.error(`Failed to send span: ${response.status} ${response.statusText}`);\n } catch (error) {\n logger.error('Error sending span:', error);\n\n // Retry on network errors\n if (retry < this.config.maxRetries) {\n const delay = Math.min(\n this.config.initialRetryDelay * Math.pow(this.config.retryMultiplier, retry),\n this.config.maxRetryDelay\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n return this.sendSpan(span, retry + 1);\n }\n }\n }\n\n /**\n * Transform span to backend API format (snake_case)\n */\n private transformSpanToApiFormat(span: Span): Record<string, unknown> {\n return {\n agent_instance_id: this.agentInstanceId,\n parent_span_id: span.parentSpanId ? (this.spanIdMap.get(span.parentSpanId) ?? null) : null,\n name: span.name,\n span_type: span.spanType,\n start_time: new Date(span.startTime).toISOString(),\n end_time: span.endTime ? new Date(span.endTime).toISOString() : null,\n status: span.status,\n inputs: span.inputs,\n outputs: span.outputs,\n token_usage: span.tokenUsage\n ? {\n prompt_tokens: span.tokenUsage.promptTokens,\n completion_tokens: span.tokenUsage.completionTokens,\n total_tokens: span.tokenUsage.totalTokens,\n }\n : null,\n error: span.error\n ? {\n error_type: span.error.errorType,\n message: span.error.message,\n stacktrace: span.error.stacktrace,\n }\n : null,\n metadata: span.metadata,\n tags: span.tags,\n };\n }\n\n /**\n * Get default schema (v1.0.0) with span schemas for all supported types\n */\n private getDefaultSchema(): Record<string, unknown> {\n return {\n external_identifier: '1.0.0',\n span_schemas: {\n agent: {\n type: 'object',\n properties: { type: { type: 'string', const: 'agent' } },\n },\n llm: {\n type: 'object',\n properties: { type: { type: 'string', const: 'llm' } },\n },\n tool: {\n type: 'object',\n properties: { type: { type: 'string', const: 'tool' } },\n },\n chain: {\n type: 'object',\n properties: { type: { type: 'string', const: 'chain' } },\n },\n retriever: {\n type: 'object',\n properties: { type: { type: 'string', const: 'retriever' } },\n },\n },\n };\n }\n\n /**\n * Ensure an agent instance is registered\n */\n private async ensureAgentRegistered(): Promise<void> {\n if (this.agentInstanceId) {\n return;\n }\n\n const url = `${this.config.apiUrl}/api/v1/agent_instance/register`;\n const payload: Record<string, unknown> = {};\n\n if (this.config.agentId) payload.agent_id = this.config.agentId;\n if (this.config.agentVersion) {\n payload.agent_version = {\n external_identifier: this.config.agentVersion,\n name: this.config.agentName || 'Agent',\n description: this.config.agentDescription || '',\n };\n }\n\n // Schema handling - four modes:\n // 1. skipSchema=true: No schema in payload (pre-registered on backend)\n // 2. agentSchema provided: Use full custom schema object\n // 3. agentSchemaVersion provided: Use version identifier only\n // 4. None of above: Use default v1.0.0 schema\n if (this.config.skipSchema) {\n logger.debug('Skipping schema in registration (skipSchema=true)');\n // Do not add agent_schema_version key\n } else if (this.config.agentSchema) {\n logger.debug('Using custom agent schema');\n payload.agent_schema_version = this.config.agentSchema;\n } else if (this.config.agentSchemaVersion) {\n logger.debug(`Using schema version: ${this.config.agentSchemaVersion}`);\n payload.agent_schema_version = {\n external_identifier: this.config.agentSchemaVersion,\n };\n } else {\n logger.debug('Using default hardcoded schema (v1.0.0)');\n payload.agent_schema_version = this.getDefaultSchema();\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(this.config.requestTimeout),\n });\n\n if (response.ok) {\n const data = await response.json() as { details?: { id?: string } };\n this.agentInstanceId = data?.details?.id ?? null;\n logger.debug(`Registered agent instance: ${this.agentInstanceId}`);\n } else {\n logger.error(`Failed to register agent: ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n logger.error('Error registering agent:', error);\n }\n }\n\n /**\n * Start agent instance execution\n */\n private async startAgentInstanceHttp(): Promise<void> {\n await this.ensureAgentRegistered();\n\n if (!this.agentInstanceId) {\n logger.error('Cannot start agent instance: not registered');\n return;\n }\n\n const url = `${this.config.apiUrl}/api/v1/agent_instance/${this.agentInstanceId}/start`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(this.config.requestTimeout),\n });\n\n if (!response.ok) {\n logger.error(`Failed to start agent instance: ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n logger.error('Error starting agent instance:', error);\n }\n }\n\n /**\n * Finish agent instance execution\n */\n private async finishAgentInstanceHttp(): Promise<void> {\n if (!this.agentInstanceId) {\n logger.error('Cannot finish agent instance: not registered');\n return;\n }\n\n const url = `${this.config.apiUrl}/api/v1/agent_instance/${this.agentInstanceId}/finish`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(this.config.requestTimeout),\n });\n\n if (!response.ok) {\n logger.error(`Failed to finish agent instance: ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n logger.error('Error finishing agent instance:', error);\n }\n }\n\n /**\n * Finish a span via HTTP\n */\n private async finishSpanHttp(data: { spanId: string; timestamp: string }): Promise<void> {\n const backendSpanId = this.spanIdMap.get(data.spanId);\n if (!backendSpanId) {\n logger.warn(`Cannot finish span ${data.spanId}: backend ID not found`);\n return;\n }\n\n const url = `${this.config.apiUrl}/api/v1/agent_spans/${backendSpanId}/finish`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ end_time: data.timestamp }),\n signal: AbortSignal.timeout(this.config.requestTimeout),\n });\n\n if (!response.ok) {\n logger.error(`Failed to finish span: ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n logger.error('Error finishing span:', error);\n }\n }\n\n /**\n * Close the transport and wait for queue to drain\n *\n * @returns Promise that resolves when transport is closed\n */\n async close(): Promise<void> {\n this.closed = true;\n\n // Wait for queue to drain (with timeout)\n const timeout = 10000;\n const start = Date.now();\n while (this.processing && Date.now() - start < timeout) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (this.processing) {\n logger.warn('Transport closed with pending queue items');\n }\n }\n}\n",
|
|
18
|
-
"import { z } from 'zod';\n\n/**\n * Configuration schema for HTTP transport\n */\nexport const HttpTransportConfigSchema = z.object({\n /** API endpoint URL */\n apiUrl: z.string().url(),\n\n /** Authentication token */\n apiToken: z.string().min(1),\n\n /** Optional agent identifier */\n agentId: z.string().optional(),\n\n /** Optional agent version */\n agentVersion: z.string().optional(),\n\n /** Optional agent name */\n agentName: z.string().optional(),\n\n /** Optional agent description */\n agentDescription: z.string().optional(),\n\n /** Optional agent schema for validation (full schema object) */\n agentSchema: z.record(z.unknown()).optional(),\n\n /** Optional agent schema version identifier (string) */\n agentSchemaVersion: z.string().optional(),\n\n /** Skip schema validation */\n skipSchema: z.boolean().default(false),\n\n /** Request timeout in milliseconds */\n requestTimeout: z.number().positive().default(30000),\n\n /** Connection timeout in milliseconds */\n connectTimeout: z.number().positive().default(10000),\n\n /** Maximum number of retry attempts */\n maxRetries: z.number().int().nonnegative().default(3),\n\n /** Initial delay between retries in milliseconds */\n initialRetryDelay: z.number().positive().default(1000),\n\n /** Maximum delay between retries in milliseconds */\n maxRetryDelay: z.number().positive().default(60000),\n\n /** Multiplier for exponential backoff */\n retryMultiplier: z.number().positive().default(2.0),\n});\n\nexport type HttpTransportConfig = z.infer<typeof HttpTransportConfigSchema>;\n\n/**\n * Partial HTTP config schema for user input (before defaults are applied)\n */\nexport const PartialHttpConfigSchema = z.object({\n apiUrl: z.string().url(),\n apiToken: z.string().min(1),\n agentId: z.string().optional(),\n agentVersion: z.string().optional(),\n agentName: z.string().optional(),\n agentDescription: z.string().optional(),\n agentSchema: z.record(z.unknown()).optional(),\n agentSchemaVersion: z.string().optional(),\n skipSchema: z.boolean().optional(),\n requestTimeout: z.number().positive().optional(),\n connectTimeout: z.number().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n initialRetryDelay: z.number().positive().optional(),\n maxRetryDelay: z.number().positive().optional(),\n retryMultiplier: z.number().positive().optional(),\n});\n\nexport type PartialHttpConfig = z.infer<typeof PartialHttpConfigSchema>;\n\n/**\n * Main SDK configuration schema\n */\nexport const ConfigSchema = z.object({\n /** Transport type to use for span emission */\n transportType: z.enum(['stdio', 'http']).default('stdio'),\n\n /** Sampling rate (0.0 to 1.0) */\n sampleRate: z.number().min(0).max(1).default(1.0),\n\n /** Whether to capture span inputs */\n captureInputs: z.boolean().default(true),\n\n /** Whether to capture span outputs */\n captureOutputs: z.boolean().default(true),\n\n /** Maximum length for input strings */\n maxInputLength: z.number().int().positive().default(10000),\n\n /** Maximum length for output strings */\n maxOutputLength: z.number().int().positive().default(10000),\n\n /** HTTP transport configuration (required if transportType is 'http') */\n httpConfig: PartialHttpConfigSchema.optional(),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\n/**\n * Creates a validated configuration object by merging provided options with\n * environment variables and defaults.\n *\n * @param options - Partial configuration options\n * @returns Validated configuration object\n * @throws {z.ZodError} If configuration is invalid\n *\n * @example\n * ```typescript\n * const config = createConfig({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * }\n * });\n * ```\n */\nexport function createConfig(options?: Partial<Config>): Config {\n const config = {\n transportType:\n options?.transportType ??\n (process.env.PREFACTOR_TRANSPORT as 'stdio' | 'http' | undefined) ??\n 'stdio',\n sampleRate: options?.sampleRate ?? parseFloat(process.env.PREFACTOR_SAMPLE_RATE ?? '1.0'),\n captureInputs: options?.captureInputs ?? process.env.PREFACTOR_CAPTURE_INPUTS !== 'false',\n captureOutputs: options?.captureOutputs ?? process.env.PREFACTOR_CAPTURE_OUTPUTS !== 'false',\n maxInputLength:\n options?.maxInputLength ?? parseInt(process.env.PREFACTOR_MAX_INPUT_LENGTH ?? '10000', 10),\n maxOutputLength:\n options?.maxOutputLength ?? parseInt(process.env.PREFACTOR_MAX_OUTPUT_LENGTH ?? '10000', 10),\n httpConfig: options?.httpConfig,\n };\n\n // Validate and return\n return ConfigSchema.parse(config);\n}\n"
|
|
5
|
+
"// Re-export everything from both packages for backwards compatibility\nexport * from '@prefactor/core';\nexport * from '@prefactor/langchain';\n"
|
|
19
6
|
],
|
|
20
|
-
"mappings": "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",
|
|
21
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AACA;AACA;",
|
|
8
|
+
"debugId": "51D31C5E4283DDA964756E2164756E21",
|
|
22
9
|
"names": []
|
|
23
10
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prefactor/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Automatic observability for LangChain.js agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -16,17 +16,6 @@
|
|
|
16
16
|
"files": [
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
19
|
-
"scripts": {
|
|
20
|
-
"build": "bun run scripts/build.ts",
|
|
21
|
-
"test": "bun test",
|
|
22
|
-
"test:watch": "bun test --watch",
|
|
23
|
-
"typecheck": "tsc --noEmit",
|
|
24
|
-
"lint": "biome check .",
|
|
25
|
-
"format": "biome format --write .",
|
|
26
|
-
"example:basic": "bun examples/basic.ts",
|
|
27
|
-
"example:anthropic": "bun examples/anthropic-agent/simple-agent.ts",
|
|
28
|
-
"prepublishOnly": "bun run build && bun run test && bun run typecheck"
|
|
29
|
-
},
|
|
30
19
|
"keywords": [
|
|
31
20
|
"prefactor",
|
|
32
21
|
"observability",
|
|
@@ -39,18 +28,13 @@
|
|
|
39
28
|
"author": "Prefactor",
|
|
40
29
|
"license": "MIT",
|
|
41
30
|
"dependencies": {
|
|
42
|
-
"@
|
|
43
|
-
"@prefactor/
|
|
44
|
-
"zod": "^3.23.0"
|
|
31
|
+
"@prefactor/core": "0.1.0",
|
|
32
|
+
"@prefactor/langchain": "0.1.0"
|
|
45
33
|
},
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"@types/node": "^20.0.0",
|
|
49
|
-
"bun-types": "latest",
|
|
50
|
-
"langchain": "^1.0.0",
|
|
51
|
-
"typescript": "^5.3.0"
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"langchain": "^1.0.0"
|
|
52
36
|
},
|
|
53
37
|
"engines": {
|
|
54
|
-
"node": ">=
|
|
38
|
+
"node": ">=24.0.0"
|
|
55
39
|
}
|
|
56
40
|
}
|
package/LICENSE
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
Copyright (c) 2026 Prefactor Pty Ltd
|
|
2
|
-
|
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
|
4
|
-
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
|
5
|
-
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
6
|
-
persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
7
|
-
|
|
8
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
|
9
|
-
Software.
|
|
10
|
-
|
|
11
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
12
|
-
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
13
|
-
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
14
|
-
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
DELETED
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
# Prefactor SDK for TypeScript
|
|
2
|
-
|
|
3
|
-
Automatic observability for LangChain.js agents. Capture distributed traces of LLM calls, tool executions, and agent workflows with minimal integration effort.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- ✅ Automatic tracing of LLM calls with token usage
|
|
8
|
-
- ✅ Tool execution tracking
|
|
9
|
-
- ✅ Agent workflow visualization
|
|
10
|
-
- ✅ Parent-child span relationships
|
|
11
|
-
- ✅ Error tracking and debugging
|
|
12
|
-
- ✅ Zero-overhead instrumentation
|
|
13
|
-
- ✅ TypeScript type safety
|
|
14
|
-
- ✅ Supports stdio and HTTP transports
|
|
15
|
-
|
|
16
|
-
## Installation
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm install @prefactor/sdk
|
|
20
|
-
# or
|
|
21
|
-
bun add @prefactor/sdk
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Quick Start
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
import { init } from '@prefactor/sdk';
|
|
28
|
-
import { ChatAnthropic } from '@langchain/anthropic';
|
|
29
|
-
import { createReactAgent } from '@langchain/langgraph/prebuilt';
|
|
30
|
-
|
|
31
|
-
// Initialize Prefactor (defaults to stdio transport)
|
|
32
|
-
const middleware = init();
|
|
33
|
-
|
|
34
|
-
// Create your agent with middleware
|
|
35
|
-
const model = new ChatAnthropic({ model: 'claude-sonnet-4-5-20250929' });
|
|
36
|
-
const agent = createReactAgent({
|
|
37
|
-
llm: model,
|
|
38
|
-
tools: [],
|
|
39
|
-
middleware: [middleware],
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// All operations are automatically traced!
|
|
43
|
-
const result = await agent.invoke({
|
|
44
|
-
messages: [{ role: 'user', content: 'What is 2+2?' }],
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
console.log(result.messages[result.messages.length - 1].content);
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Configuration
|
|
51
|
-
|
|
52
|
-
### Environment Variables
|
|
53
|
-
|
|
54
|
-
The SDK can be configured using environment variables:
|
|
55
|
-
|
|
56
|
-
- `PREFACTOR_TRANSPORT`: `"stdio"` | `"http"` (default: `"stdio"`)
|
|
57
|
-
- `PREFACTOR_API_URL`: API endpoint for HTTP transport
|
|
58
|
-
- `PREFACTOR_API_TOKEN`: Authentication token for HTTP transport
|
|
59
|
-
- `PREFACTOR_SAMPLE_RATE`: Sampling rate 0.0-1.0 (default: `1.0`)
|
|
60
|
-
- `PREFACTOR_CAPTURE_INPUTS`: Capture span inputs (default: `true`)
|
|
61
|
-
- `PREFACTOR_CAPTURE_OUTPUTS`: Capture span outputs (default: `true`)
|
|
62
|
-
- `PREFACTOR_MAX_INPUT_LENGTH`: Max input string length (default: `10000`)
|
|
63
|
-
- `PREFACTOR_MAX_OUTPUT_LENGTH`: Max output string length (default: `10000`)
|
|
64
|
-
- `PREFACTOR_LOG_LEVEL`: `"debug"` | `"info"` | `"warn"` | `"error"` (default: `"info"`)
|
|
65
|
-
|
|
66
|
-
### Programmatic Configuration
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
import { init } from '@prefactor/sdk';
|
|
70
|
-
|
|
71
|
-
// HTTP Transport
|
|
72
|
-
const middleware = init({
|
|
73
|
-
transportType: 'http',
|
|
74
|
-
httpConfig: {
|
|
75
|
-
apiUrl: 'https://api.prefactor.ai',
|
|
76
|
-
apiToken: process.env.PREFACTOR_API_TOKEN!,
|
|
77
|
-
agentId: 'my-agent',
|
|
78
|
-
agentVersion: '1.0.0',
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// Custom sampling
|
|
83
|
-
const middleware = init({
|
|
84
|
-
sampleRate: 0.1, // Sample 10% of traces
|
|
85
|
-
maxInputLength: 5000,
|
|
86
|
-
maxOutputLength: 5000,
|
|
87
|
-
});
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Transports
|
|
91
|
-
|
|
92
|
-
### STDIO Transport (Default)
|
|
93
|
-
|
|
94
|
-
The STDIO transport writes spans as newline-delimited JSON to stdout. This is useful for local development and piping to other tools.
|
|
95
|
-
|
|
96
|
-
```typescript
|
|
97
|
-
import { init } from '@prefactor/sdk';
|
|
98
|
-
|
|
99
|
-
const middleware = init(); // Uses stdio by default
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### HTTP Transport
|
|
103
|
-
|
|
104
|
-
The HTTP transport sends spans to a remote API endpoint with retry logic and queue-based processing.
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
import { init } from '@prefactor/sdk';
|
|
108
|
-
|
|
109
|
-
const middleware = init({
|
|
110
|
-
transportType: 'http',
|
|
111
|
-
httpConfig: {
|
|
112
|
-
apiUrl: 'https://api.prefactor.ai',
|
|
113
|
-
apiToken: process.env.PREFACTOR_API_TOKEN!,
|
|
114
|
-
agentId: 'my-agent',
|
|
115
|
-
agentVersion: '1.0.0',
|
|
116
|
-
maxRetries: 3,
|
|
117
|
-
requestTimeout: 30000,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## API Reference
|
|
123
|
-
|
|
124
|
-
### `init(config?: Partial<Config>): PrefactorMiddleware`
|
|
125
|
-
|
|
126
|
-
Initialize the SDK and return middleware instance.
|
|
127
|
-
|
|
128
|
-
**Parameters:**
|
|
129
|
-
- `config` - Optional configuration object
|
|
130
|
-
|
|
131
|
-
**Returns:**
|
|
132
|
-
- `PrefactorMiddleware` - Middleware instance to use with LangChain.js agents
|
|
133
|
-
|
|
134
|
-
**Example:**
|
|
135
|
-
```typescript
|
|
136
|
-
const middleware = init({
|
|
137
|
-
transportType: 'stdio',
|
|
138
|
-
sampleRate: 1.0,
|
|
139
|
-
});
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### `shutdown(): Promise<void>`
|
|
143
|
-
|
|
144
|
-
Flush pending spans and close connections. Call before application exit.
|
|
145
|
-
|
|
146
|
-
**Example:**
|
|
147
|
-
```typescript
|
|
148
|
-
import { shutdown } from '@prefactor/sdk';
|
|
149
|
-
|
|
150
|
-
process.on('SIGTERM', async () => {
|
|
151
|
-
await shutdown();
|
|
152
|
-
process.exit(0);
|
|
153
|
-
});
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### `getTracer(): Tracer`
|
|
157
|
-
|
|
158
|
-
Get the global tracer instance for manual instrumentation.
|
|
159
|
-
|
|
160
|
-
**Returns:**
|
|
161
|
-
- `Tracer` - Tracer instance
|
|
162
|
-
|
|
163
|
-
**Example:**
|
|
164
|
-
```typescript
|
|
165
|
-
import { getTracer, SpanType } from '@prefactor/sdk';
|
|
166
|
-
|
|
167
|
-
const tracer = getTracer();
|
|
168
|
-
const span = tracer.startSpan({
|
|
169
|
-
name: 'custom-operation',
|
|
170
|
-
spanType: SpanType.TOOL,
|
|
171
|
-
inputs: { data: 'example' },
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
try {
|
|
175
|
-
// ... do work ...
|
|
176
|
-
tracer.endSpan(span, { outputs: { result: 'done' } });
|
|
177
|
-
} catch (error) {
|
|
178
|
-
tracer.endSpan(span, { error });
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## Advanced Usage
|
|
183
|
-
|
|
184
|
-
### Manual Instrumentation
|
|
185
|
-
|
|
186
|
-
For operations not automatically traced by the middleware:
|
|
187
|
-
|
|
188
|
-
```typescript
|
|
189
|
-
import { getTracer, SpanType } from '@prefactor/sdk';
|
|
190
|
-
|
|
191
|
-
const tracer = getTracer();
|
|
192
|
-
|
|
193
|
-
const span = tracer.startSpan({
|
|
194
|
-
name: 'database-query',
|
|
195
|
-
spanType: SpanType.TOOL,
|
|
196
|
-
inputs: { query: 'SELECT * FROM users' },
|
|
197
|
-
metadata: { database: 'postgres' },
|
|
198
|
-
tags: ['database', 'query'],
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
try {
|
|
202
|
-
const result = await db.query('SELECT * FROM users');
|
|
203
|
-
tracer.endSpan(span, { outputs: { rowCount: result.rows.length } });
|
|
204
|
-
} catch (error) {
|
|
205
|
-
tracer.endSpan(span, { error });
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### Context Propagation
|
|
210
|
-
|
|
211
|
-
The SDK automatically propagates span context through async operations using Node.js AsyncLocalStorage. Child spans automatically inherit the trace ID and parent span ID from the current context.
|
|
212
|
-
|
|
213
|
-
```typescript
|
|
214
|
-
import { SpanContext } from '@prefactor/sdk';
|
|
215
|
-
|
|
216
|
-
// Get the current span (if any)
|
|
217
|
-
const currentSpan = SpanContext.getCurrent();
|
|
218
|
-
|
|
219
|
-
// Child spans automatically use the current span as parent
|
|
220
|
-
const child = tracer.startSpan({
|
|
221
|
-
name: 'child-operation',
|
|
222
|
-
spanType: SpanType.TOOL,
|
|
223
|
-
inputs: {},
|
|
224
|
-
parentSpanId: currentSpan?.spanId,
|
|
225
|
-
traceId: currentSpan?.traceId,
|
|
226
|
-
});
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
## TypeScript Support
|
|
230
|
-
|
|
231
|
-
The SDK is written in TypeScript and provides full type definitions:
|
|
232
|
-
|
|
233
|
-
```typescript
|
|
234
|
-
import type {
|
|
235
|
-
Config,
|
|
236
|
-
HttpTransportConfig,
|
|
237
|
-
Span,
|
|
238
|
-
SpanType,
|
|
239
|
-
SpanStatus,
|
|
240
|
-
TokenUsage,
|
|
241
|
-
ErrorInfo
|
|
242
|
-
} from '@prefactor/sdk';
|
|
243
|
-
|
|
244
|
-
const config: Config = {
|
|
245
|
-
transportType: 'stdio',
|
|
246
|
-
sampleRate: 1.0,
|
|
247
|
-
captureInputs: true,
|
|
248
|
-
captureOutputs: true,
|
|
249
|
-
};
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
## Examples
|
|
253
|
-
|
|
254
|
-
See the `examples/` directory for complete examples:
|
|
255
|
-
|
|
256
|
-
- `examples/basic.ts` - Simple LangChain.js agent with stdio transport
|
|
257
|
-
- `examples/http-transport.ts` - Using HTTP transport
|
|
258
|
-
- `examples/custom-tools.ts` - Tracing custom tools
|
|
259
|
-
- `examples/manual-instrumentation.ts` - Manual span creation
|
|
260
|
-
|
|
261
|
-
## Architecture
|
|
262
|
-
|
|
263
|
-
The SDK consists of five main layers:
|
|
264
|
-
|
|
265
|
-
1. **Tracing Layer**: Span data models, Tracer for lifecycle management, Context propagation
|
|
266
|
-
2. **Transport Layer**: Pluggable backends (stdio, HTTP) for span emission
|
|
267
|
-
3. **Instrumentation Layer**: LangChain.js middleware integration
|
|
268
|
-
4. **Configuration**: Environment variable support, validation with Zod
|
|
269
|
-
5. **Utilities**: Logging, serialization helpers
|
|
270
|
-
|
|
271
|
-
For more details, see `docs/architecture.md`.
|
|
272
|
-
|
|
273
|
-
## Requirements
|
|
274
|
-
|
|
275
|
-
- Node.js >= 18.0.0
|
|
276
|
-
- TypeScript >= 5.0.0 (for TypeScript projects)
|
|
277
|
-
- Bun >= 1.0.0 (optional, for development)
|
|
278
|
-
|
|
279
|
-
## Development
|
|
280
|
-
|
|
281
|
-
```bash
|
|
282
|
-
# Install dependencies
|
|
283
|
-
bun install
|
|
284
|
-
|
|
285
|
-
# Run tests
|
|
286
|
-
bun test
|
|
287
|
-
|
|
288
|
-
# Type check
|
|
289
|
-
bun run typecheck
|
|
290
|
-
|
|
291
|
-
# Lint
|
|
292
|
-
bun run lint
|
|
293
|
-
|
|
294
|
-
# Format
|
|
295
|
-
bun run format
|
|
296
|
-
|
|
297
|
-
# Build
|
|
298
|
-
bun run build
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
## Contributing
|
|
302
|
-
|
|
303
|
-
Contributions are welcome! Please see `CONTRIBUTING.md` for guidelines.
|
|
304
|
-
|
|
305
|
-
## License
|
|
306
|
-
|
|
307
|
-
MIT
|
|
308
|
-
|
|
309
|
-
## Support
|
|
310
|
-
|
|
311
|
-
- Documentation: [https://docs.prefactor.ai](https://docs.prefactor.ai)
|
|
312
|
-
- Issues: [GitHub Issues](https://github.com/prefactor/typescript-sdk/issues)
|
|
313
|
-
- Email: support@prefactor.ai
|
package/dist/LICENSE
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
Copyright (c) 2026 Prefactor Pty Ltd
|
|
2
|
-
|
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
|
4
|
-
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
|
5
|
-
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
6
|
-
persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
7
|
-
|
|
8
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
|
9
|
-
Software.
|
|
10
|
-
|
|
11
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
12
|
-
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
13
|
-
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
14
|
-
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|