@attest-ai/core 0.4.2 → 0.5.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/dist/cjs/index.cjs +2484 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +1085 -0
- package/dist/cjs/proto/index.cjs +208 -0
- package/dist/cjs/proto/index.cjs.map +1 -0
- package/dist/cjs/proto/index.d.cts +228 -0
- package/dist/client.d.ts +7 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +48 -9
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +31 -0
- package/dist/config.js.map +1 -0
- package/dist/delegate.d.ts.map +1 -1
- package/dist/delegate.js +1 -7
- package/dist/delegate.js.map +1 -1
- package/dist/esm/cli.d.ts +9 -0
- package/dist/esm/cli.js +154 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/index.d.ts +1085 -0
- package/dist/esm/index.js +2385 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/proto/index.d.ts +228 -0
- package/dist/esm/proto/index.js +152 -0
- package/dist/esm/proto/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/proto/errors.d.ts +5 -0
- package/dist/proto/errors.d.ts.map +1 -1
- package/dist/proto/errors.js +11 -0
- package/dist/proto/errors.js.map +1 -1
- package/dist/simulation.d.ts +8 -0
- package/dist/simulation.d.ts.map +1 -0
- package/dist/simulation.js +21 -0
- package/dist/simulation.js.map +1 -0
- package/dist/trace.d.ts +1 -0
- package/dist/trace.d.ts.map +1 -1
- package/dist/trace.js +3 -0
- package/dist/trace.js.map +1 -1
- package/package.json +34 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/proto/constants.ts","../../src/proto/types.ts","../../src/proto/errors.ts","../../src/proto/codec.ts","../../src/version.ts","../../src/engine-manager.ts","../../src/engine-downloader.ts","../../src/config.ts","../../src/simulation.ts","../../src/client.ts","../../src/trace.ts","../../src/result.ts","../../src/trace-tree.ts","../../src/expect.ts","../../src/context.ts","../../src/agent.ts","../../src/delegate.ts","../../src/tier.ts","../../src/plugins.ts","../../src/continuous.ts","../../src/adapters/manual.ts","../../src/adapters/openai.ts","../../src/adapters/anthropic.ts","../../src/adapters/gemini.ts","../../src/adapters/ollama.ts","../../src/adapters/otel.ts","../../src/adapters/langchain.ts"],"sourcesContent":["export * from \"./proto/index.js\";\nexport type {\n AssertionSpec,\n SchemaSpec,\n ConstraintSpec,\n TraceSpec,\n ContentSpec,\n EmbeddingSpec,\n LlmJudgeSpec,\n TraceTreeSpec,\n PluginSpec,\n TraceId,\n AssertionId,\n AgentId,\n} from \"./proto/types.js\";\nexport { traceId, assertionId, agentId } from \"./proto/types.js\";\nexport { VERSION, ENGINE_VERSION } from \"./version.js\";\nexport { EngineManager } from \"./engine-manager.js\";\nexport { AttestClient } from \"./client.js\";\nexport { TraceBuilder } from \"./trace.js\";\nexport { AgentResult } from \"./result.js\";\nexport { TraceTree } from \"./trace-tree.js\";\nexport { ExpectChain, attestExpect } from \"./expect.js\";\nexport { Agent, agent } from \"./agent.js\";\nexport { delegate } from \"./delegate.js\";\nexport { activeBuilder } from \"./context.js\";\nexport { TIER_1, TIER_2, TIER_3, tier } from \"./tier.js\";\nexport { config, isSimulationMode, resetConfig } from \"./config.js\";\nexport type { AttestPlugin, PluginResult } from \"./plugins.js\";\nexport { PluginRegistry, executePluginAssertion } from \"./plugins.js\";\nexport { ContinuousEvalRunner, Sampler, AlertDispatcher } from \"./continuous.js\";\nexport type { AlertPayload } from \"./continuous.js\";\nexport type { TraceAdapter } from \"./adapters/index.js\";\nexport {\n ManualAdapter,\n OpenAIAdapter,\n AnthropicAdapter,\n GeminiAdapter,\n OllamaAdapter,\n OTelAdapter,\n LangChainAdapter,\n} from \"./adapters/index.js\";\n","// Step type constants\nexport const STEP_LLM_CALL = \"llm_call\" as const;\nexport const STEP_TOOL_CALL = \"tool_call\" as const;\nexport const STEP_RETRIEVAL = \"retrieval\" as const;\nexport const STEP_AGENT_CALL = \"agent_call\" as const;\n\n// Status constants\nexport const STATUS_PASS = \"pass\" as const;\nexport const STATUS_SOFT_FAIL = \"soft_fail\" as const;\nexport const STATUS_HARD_FAIL = \"hard_fail\" as const;\n\n// Assertion type constants\nexport const TYPE_SCHEMA = \"schema\" as const;\nexport const TYPE_CONSTRAINT = \"constraint\" as const;\nexport const TYPE_TRACE = \"trace\" as const;\nexport const TYPE_CONTENT = \"content\" as const;\nexport const TYPE_EMBEDDING = \"embedding\" as const;\nexport const TYPE_LLM_JUDGE = \"llm_judge\" as const;\nexport const TYPE_TRACE_TREE = \"trace_tree\" as const;\nexport const TYPE_PLUGIN = \"plugin\" as const;\n\n// Error code constants\nexport const ERR_INVALID_TRACE = 1001 as const;\nexport const ERR_ASSERTION_ERROR = 1002 as const;\nexport const ERR_PROVIDER_ERROR = 2001 as const;\nexport const ERR_ENGINE_ERROR = 3001 as const;\nexport const ERR_TIMEOUT = 3002 as const;\nexport const ERR_SESSION_ERROR = 3003 as const;\n","// ---------------------------------------------------------------------------\n// Branded ID types (T6)\n// ---------------------------------------------------------------------------\n\ndeclare const __brand: unique symbol;\ntype Brand<T, B extends string> = T & { readonly [__brand]: B };\n\nexport type TraceId = Brand<string, \"TraceId\">;\nexport type AssertionId = Brand<string, \"AssertionId\">;\nexport type AgentId = Brand<string, \"AgentId\">;\n\nexport function traceId(id: string): TraceId {\n return id as TraceId;\n}\n\nexport function assertionId(id: string): AssertionId {\n return id as AssertionId;\n}\n\nexport function agentId(id: string): AgentId {\n return id as AgentId;\n}\n\n// ---------------------------------------------------------------------------\n// Assertion spec discriminated unions (T5)\n// ---------------------------------------------------------------------------\n\nexport interface SchemaSpec {\n readonly type: \"schema\";\n readonly target: string;\n readonly schema: Record<string, unknown>;\n}\n\nexport interface ConstraintSpec {\n readonly type: \"constraint\";\n readonly field: string;\n readonly operator: string;\n readonly value?: number;\n readonly min?: number;\n readonly max?: number;\n readonly soft: boolean;\n}\n\nexport interface TraceSpec {\n readonly type: \"trace\";\n readonly check: string;\n readonly tools?: string[];\n readonly tool?: string;\n readonly max_repetitions?: number;\n readonly soft: boolean;\n}\n\nexport interface ContentSpec {\n readonly type: \"content\";\n readonly target: string;\n readonly check: string;\n readonly value?: string;\n readonly values?: string[];\n readonly case_sensitive?: boolean;\n readonly soft?: boolean;\n}\n\nexport interface EmbeddingSpec {\n readonly type: \"embedding\";\n readonly target: string;\n readonly reference: string;\n readonly threshold: number;\n readonly model?: string;\n readonly soft: boolean;\n}\n\nexport interface LlmJudgeSpec {\n readonly type: \"llm_judge\";\n readonly target: string;\n readonly criteria: string;\n readonly rubric: string;\n readonly threshold: number;\n readonly model?: string;\n readonly soft: boolean;\n}\n\nexport interface TraceTreeSpec {\n readonly type: \"trace_tree\";\n readonly check: string;\n readonly [key: string]: unknown;\n}\n\nexport interface PluginSpec {\n readonly type: \"plugin\";\n readonly plugin_id: string;\n readonly config?: Record<string, unknown>;\n readonly soft: boolean;\n}\n\nexport type AssertionSpec =\n | SchemaSpec\n | ConstraintSpec\n | TraceSpec\n | ContentSpec\n | EmbeddingSpec\n | LlmJudgeSpec\n | TraceTreeSpec\n | PluginSpec;\n\n// ---------------------------------------------------------------------------\n// Core protocol types\n// ---------------------------------------------------------------------------\n\nexport interface TraceMetadata {\n readonly total_tokens?: number;\n readonly cost_usd?: number;\n readonly latency_ms?: number;\n readonly model?: string;\n readonly timestamp?: string;\n}\n\nexport interface Step {\n readonly type: string;\n readonly name: string;\n readonly args?: Record<string, unknown>;\n readonly result?: Record<string, unknown>;\n readonly sub_trace?: Trace;\n readonly metadata?: Record<string, unknown>;\n readonly started_at_ms?: number;\n readonly ended_at_ms?: number;\n readonly agent_id?: string;\n readonly agent_role?: string;\n}\n\nexport interface Trace {\n readonly trace_id: string;\n readonly output: Record<string, unknown>;\n readonly schema_version?: number;\n readonly agent_id?: string;\n readonly input?: Record<string, unknown>;\n readonly steps: readonly Step[];\n readonly metadata?: TraceMetadata;\n readonly parent_trace_id?: string;\n}\n\nexport interface Assertion {\n readonly assertion_id: string;\n readonly type: string;\n readonly spec: Record<string, unknown>;\n readonly request_id?: string;\n}\n\nexport interface AssertionResult {\n readonly assertion_id: string;\n readonly status: string;\n readonly score: number;\n readonly explanation: string;\n readonly cost?: number;\n readonly duration_ms?: number;\n readonly request_id?: string;\n}\n\nexport interface ErrorData {\n readonly error_type: string;\n readonly retryable: boolean;\n readonly detail: string;\n}\n\nexport interface RPCError {\n readonly code: number;\n readonly message: string;\n readonly data?: ErrorData;\n}\n\nexport interface RPCRequest {\n readonly jsonrpc: \"2.0\";\n readonly id: number;\n readonly method: string;\n readonly params: Record<string, unknown>;\n}\n\nexport interface RPCResponse {\n readonly jsonrpc: \"2.0\";\n readonly id: number;\n readonly result?: unknown;\n readonly error?: RPCError;\n}\n\nexport interface InitializeParams {\n readonly sdk_name: string;\n readonly sdk_version: string;\n readonly protocol_version: number;\n readonly required_capabilities: readonly string[];\n readonly preferred_encoding?: string;\n}\n\nexport interface InitializeResult {\n readonly engine_version: string;\n readonly protocol_version: number;\n readonly capabilities: readonly string[];\n readonly missing: readonly string[];\n readonly compatible: boolean;\n readonly encoding?: string;\n readonly max_concurrent_requests?: number;\n readonly max_trace_size_bytes?: number;\n readonly max_steps_per_trace?: number;\n}\n\nexport interface EvaluateBatchParams {\n readonly trace: Trace;\n readonly assertions: readonly Assertion[];\n}\n\nexport interface EvaluateBatchResult {\n readonly results: readonly AssertionResult[];\n readonly total_cost?: number;\n readonly total_duration_ms?: number;\n}\n\nexport interface ShutdownResult {\n readonly sessions_completed: number;\n readonly assertions_evaluated: number;\n}\n\nexport interface SubmitPluginResultParams {\n readonly trace_id: string;\n readonly plugin_name: string;\n readonly assertion_id: string;\n readonly result: AssertionResult;\n}\n","import type { ErrorData } from \"./types.js\";\n\nexport class ProtocolError extends Error {\n readonly code: number;\n readonly errorMessage: string;\n readonly data: ErrorData | undefined;\n\n constructor(code: number, message: string, data?: ErrorData) {\n super(message);\n this.name = \"ProtocolError\";\n this.code = code;\n this.errorMessage = message;\n this.data = data;\n }\n}\n\nexport class EngineTimeoutError extends Error {\n readonly method: string;\n readonly timeoutMs: number;\n\n constructor(method: string, timeoutMs: number) {\n super(\n `Engine request '${method}' timed out after ${timeoutMs}ms. ` +\n \"Set ATTEST_ENGINE_TIMEOUT to increase the limit.\",\n );\n this.name = \"EngineTimeoutError\";\n this.method = method;\n this.timeoutMs = timeoutMs;\n }\n}\n","import type { ErrorData, RPCResponse } from \"./types.js\";\nimport { ProtocolError } from \"./errors.js\";\n\n/**\n * Encode a JSON-RPC 2.0 request as an NDJSON line.\n */\nexport function encodeRequest(\n id: number,\n method: string,\n params: Record<string, unknown>,\n): string {\n const msg = {\n jsonrpc: \"2.0\" as const,\n id,\n method,\n params,\n };\n return JSON.stringify(msg) + \"\\n\";\n}\n\n/**\n * Decode a JSON-RPC 2.0 response from an NDJSON line.\n * Throws ProtocolError if the response contains an error.\n * Throws Error for malformed JSON or invalid responses.\n */\nexport function decodeResponse(line: string): RPCResponse {\n const text = line.trim();\n if (!text) {\n throw new Error(\"empty response line\");\n }\n\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch (e) {\n throw new Error(`malformed JSON response: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) {\n throw new Error(`expected JSON object, got ${Array.isArray(data) ? \"array\" : typeof data}`);\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.jsonrpc !== \"2.0\") {\n throw new Error(`invalid jsonrpc version: ${String(obj.jsonrpc)}`);\n }\n\n if (obj.error != null) {\n const err = obj.error as Record<string, unknown>;\n let errorData: ErrorData | undefined;\n\n if (err.data != null) {\n const raw = err.data as Record<string, unknown>;\n errorData = {\n error_type: (raw.error_type as string) ?? \"\",\n retryable: (raw.retryable as boolean) ?? false,\n detail: (raw.detail as string) ?? \"\",\n };\n }\n\n throw new ProtocolError(\n (err.code as number) ?? -1,\n (err.message as string) ?? \"unknown error\",\n errorData,\n );\n }\n\n return obj as unknown as RPCResponse;\n}\n\n/**\n * Extract the result field from a decoded response.\n */\nexport function extractResult(response: RPCResponse): unknown {\n if (response.result === undefined) {\n throw new Error(\"response missing 'result' field\");\n }\n return response.result;\n}\n\n/**\n * Extract the request ID from a decoded response.\n */\nexport function extractId(response: RPCResponse): number {\n if (response.id === undefined) {\n throw new Error(\"response missing 'id' field\");\n }\n return Number(response.id);\n}\n","export const VERSION = \"0.5.0\";\nexport const ENGINE_VERSION = \"0.5.0\";\n","import { spawn, execSync, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface as ReadlineInterface } from \"node:readline\";\nimport { existsSync, accessSync, constants as fsConstants } from \"node:fs\";\nimport { resolve, join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { InitializeResult } from \"./proto/types.js\";\nimport { decodeResponse, encodeRequest, extractResult } from \"./proto/codec.js\";\nimport { VERSION } from \"./version.js\";\nimport { cachedEnginePath, downloadEngine } from \"./engine-downloader.js\";\n\nconst ENGINE_BINARY_NAME = \"attest-engine\";\n\nasync function findEngineBinary(): Promise<string> {\n // 1. Explicit env var override\n const envPath = process.env[\"ATTEST_ENGINE_PATH\"];\n if (envPath) {\n if (!existsSync(envPath)) {\n throw new Error(\n `ATTEST_ENGINE_PATH is set to '${envPath}' but the file does not exist.`\n );\n }\n return envPath;\n }\n\n // 2. Check PATH via which/where\n try {\n const cmd = process.platform === \"win32\" ? \"where\" : \"which\";\n const found = execSync(`${cmd} ${ENGINE_BINARY_NAME}`, { encoding: \"utf-8\" }).trim();\n if (found) return found;\n } catch {\n // not on PATH\n }\n\n // 3. Cached download in ~/.attest/bin/\n const cached = cachedEnginePath();\n if (cached) return cached;\n\n // 4. Monorepo dev layout (../../bin/ relative to this file)\n // 5. CWD ./bin/\n const candidates = [\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"..\", \"..\", \"..\", \"bin\", ENGINE_BINARY_NAME),\n join(process.cwd(), \"bin\", ENGINE_BINARY_NAME)\n ];\n\n for (const candidate of candidates) {\n const resolved = resolve(candidate);\n try {\n accessSync(resolved, fsConstants.X_OK);\n if (existsSync(resolved)) return resolved;\n } catch {\n // not accessible\n }\n }\n\n // 6. Auto-download\n const noDownload = process.env[\"ATTEST_ENGINE_NO_DOWNLOAD\"];\n if (noDownload === \"1\" || noDownload === \"true\" || noDownload === \"yes\") {\n throw new Error(\n `Cannot find '${ENGINE_BINARY_NAME}' binary and auto-download is disabled ` +\n \"(ATTEST_ENGINE_NO_DOWNLOAD is set). Install the engine manually:\\n\" +\n \" 1. Download from https://github.com/attest-framework/attest/releases\\n\" +\n \" 2. Place the binary on your PATH or set ATTEST_ENGINE_PATH\"\n );\n }\n\n return downloadEngine();\n}\n\nexport class EngineManager {\n private enginePath: string;\n private readonly logLevel: string;\n private process: ChildProcess | null = null;\n private reader: ReadlineInterface | null = null;\n private initialized = false;\n private requestId = 0;\n private initResult: InitializeResult | null = null;\n\n constructor(options?: { enginePath?: string; logLevel?: string }) {\n this.enginePath = options?.enginePath ?? \"\";\n this.logLevel = options?.logLevel ?? \"warn\";\n }\n\n async start(): Promise<InitializeResult> {\n if (!this.enginePath) {\n this.enginePath = await findEngineBinary();\n }\n\n this.process = spawn(this.enginePath, [`--log-level=${this.logLevel}`], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n this.reader = createInterface({ input: this.process.stdout! });\n\n const result = await this.sendRequestInternal(\"initialize\", {\n sdk_name: \"attest-typescript\",\n sdk_version: VERSION,\n protocol_version: 1,\n required_capabilities: [\"layers_1_4\"],\n preferred_encoding: \"json\",\n });\n\n this.initResult = result as InitializeResult;\n if (!this.initResult.compatible) {\n throw new Error(\n `Engine incompatible. Missing capabilities: ${JSON.stringify(this.initResult.missing)}`,\n );\n }\n this.initialized = true;\n return this.initResult;\n }\n\n async stop(): Promise<void> {\n if (this.process === null) return;\n\n if (this.initialized) {\n try {\n await this.sendRequestInternal(\"shutdown\", {});\n } catch {\n // shutdown failed, will kill\n }\n }\n\n if (this.reader) {\n this.reader.close();\n this.reader = null;\n }\n\n if (this.process.exitCode === null) {\n this.process.kill(\"SIGTERM\");\n await new Promise<void>((res) => {\n const timer = setTimeout(() => {\n this.process?.kill(\"SIGKILL\");\n }, 5000);\n this.process!.on(\"exit\", () => {\n clearTimeout(timer);\n res();\n });\n });\n }\n\n this.initialized = false;\n this.process = null;\n }\n\n async sendRequest(method: string, params: Record<string, unknown>): Promise<unknown> {\n if (!this.initialized && method !== \"initialize\") {\n throw new Error(\"Engine not initialized. Call start() first.\");\n }\n return this.sendRequestInternal(method, params);\n }\n\n private async sendRequestInternal(method: string, params: Record<string, unknown>): Promise<unknown> {\n if (this.process === null || this.process.stdin === null || this.reader === null) {\n throw new Error(\"Engine process not started.\");\n }\n\n this.requestId += 1;\n const requestStr = encodeRequest(this.requestId, method, params);\n\n return new Promise<unknown>((resolve, reject) => {\n const onLine = (line: string): void => {\n try {\n const response = decodeResponse(line);\n resolve(extractResult(response));\n } catch (err) {\n reject(err);\n }\n };\n\n this.reader!.once(\"line\", onLine);\n\n const ok = this.process!.stdin!.write(requestStr, (err: Error | null | undefined) => {\n if (err) {\n this.reader!.removeListener(\"line\", onLine);\n reject(err);\n }\n });\n\n if (!ok) {\n this.process!.stdin!.once(\"drain\", () => {\n // write will proceed after drain\n });\n }\n });\n }\n\n get isRunning(): boolean {\n return this.process !== null && this.process.exitCode === null;\n }\n\n /** Expose process for AttestClient reader loop access */\n get childProcess(): ChildProcess | null {\n return this.process;\n }\n\n /** Expose readline interface for AttestClient reader loop */\n get readlineInterface(): ReadlineInterface | null {\n return this.reader;\n }\n}\n","import * as https from \"node:https\";\nimport * as http from \"node:http\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport * as crypto from \"node:crypto\";\nimport { ENGINE_VERSION } from \"./version.js\";\n\nconst RELEASE_BASE = `https://github.com/attest-framework/attest/releases/download/v${ENGINE_VERSION}`;\nconst CHECKSUMS_URL = `${RELEASE_BASE}/checksums-sha256.txt`;\nconst MAX_REDIRECTS = 5;\n\nexport function attestBinDir(): string {\n const dir = path.join(os.homedir(), \".attest\", \"bin\");\n fs.mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nexport function platformKey(): string {\n const platform = os.platform();\n const arch = os.arch();\n\n const mapping: Record<string, Record<string, string>> = {\n darwin: { arm64: \"darwin-arm64\", x64: \"darwin-amd64\" },\n linux: { arm64: \"linux-arm64\", x64: \"linux-amd64\" },\n win32: { x64: \"windows-amd64\", arm64: \"windows-arm64\" }\n };\n\n const osMap = mapping[platform];\n if (!osMap) {\n throw new Error(\n `Unsupported platform: ${platform}. Supported: darwin, linux, win32.`\n );\n }\n\n const key = osMap[arch];\n if (!key) {\n throw new Error(\n `Unsupported architecture '${arch}' on platform '${platform}'. ` +\n `Supported architectures: ${Object.keys(osMap).join(\", \")}.`\n );\n }\n\n return key;\n}\n\nexport function binaryFilename(): string {\n return os.platform() === \"win32\" ? \"attest-engine.exe\" : \"attest-engine\";\n}\n\nexport function cachedEnginePath(): string | null {\n const dir = path.join(os.homedir(), \".attest\", \"bin\");\n const binPath = path.join(dir, binaryFilename());\n const versionFile = path.join(dir, \".engine-version\");\n\n if (!fs.existsSync(binPath)) {\n return null;\n }\n\n if (!fs.existsSync(versionFile)) {\n return null;\n }\n\n const cachedVersion = fs.readFileSync(versionFile, \"utf-8\").trim();\n if (cachedVersion !== ENGINE_VERSION) {\n return null;\n }\n\n return binPath;\n}\n\nexport function parseChecksums(text: string): Map<string, string> {\n const checksums = new Map<string, string>();\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n // Format: \"{hash} {filename}\" (two spaces between hash and filename)\n const match = trimmed.match(/^([a-f0-9]{64})\\s+(.+)$/);\n if (match) {\n checksums.set(match[2], match[1]);\n }\n }\n return checksums;\n}\n\nfunction httpsGet(url: string, redirectCount = 0): Promise<Buffer> {\n if (redirectCount > MAX_REDIRECTS) {\n return Promise.reject(\n new Error(`Too many redirects (>${MAX_REDIRECTS}) following ${url}`)\n );\n }\n\n return new Promise<Buffer>((resolve, reject) => {\n const client = url.startsWith(\"https:\") ? https : http;\n client.get(url, (res) => {\n const status = res.statusCode ?? 0;\n\n if (status === 301 || status === 302) {\n const location = res.headers.location;\n if (!location) {\n reject(new Error(`Redirect ${status} without Location header from ${url}`));\n return;\n }\n res.resume();\n resolve(httpsGet(location, redirectCount + 1));\n return;\n }\n\n if (status < 200 || status >= 300) {\n res.resume();\n reject(new Error(`HTTP ${status} fetching ${url}`));\n return;\n }\n\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => resolve(Buffer.concat(chunks)));\n res.on(\"error\", reject);\n }).on(\"error\", reject);\n });\n}\n\nexport async function downloadEngine(): Promise<string> {\n const key = platformKey();\n const filename = `attest-engine-${key}`;\n const binaryUrl = `${RELEASE_BASE}/${filename}`;\n\n process.stderr.write(`[attest] Downloading engine v${ENGINE_VERSION} for ${key}...\\n`);\n\n // Fetch checksums\n process.stderr.write(`[attest] Fetching checksums...\\n`);\n const checksumsText = (await httpsGet(CHECKSUMS_URL)).toString(\"utf-8\");\n const checksums = parseChecksums(checksumsText);\n const expectedHash = checksums.get(filename);\n if (!expectedHash) {\n throw new Error(\n `No checksum found for '${filename}' in checksums-sha256.txt. ` +\n `Available files: ${[...checksums.keys()].join(\", \")}`\n );\n }\n\n // Download binary\n process.stderr.write(`[attest] Downloading ${binaryUrl}...\\n`);\n const data = await httpsGet(binaryUrl);\n\n // Verify SHA256\n const actualHash = crypto.createHash(\"sha256\").update(data).digest(\"hex\");\n if (actualHash !== expectedHash) {\n throw new Error(\n `SHA256 mismatch for ${filename}. ` +\n `Expected: ${expectedHash}, got: ${actualHash}. ` +\n `The download may be corrupted. Delete ~/.attest/bin/ and retry.`\n );\n }\n process.stderr.write(`[attest] Checksum verified.\\n`);\n\n // Atomic write: temp file + rename\n const dir = attestBinDir();\n const destFilename = binaryFilename();\n const destPath = path.join(dir, destFilename);\n const tmpPath = path.join(dir, `.${destFilename}.tmp.${process.pid}`);\n\n fs.writeFileSync(tmpPath, data);\n fs.chmodSync(tmpPath, 0o755);\n fs.renameSync(tmpPath, destPath);\n\n // Write version marker\n fs.writeFileSync(path.join(dir, \".engine-version\"), ENGINE_VERSION);\n\n process.stderr.write(`[attest] Engine installed at ${destPath}\\n`);\n return destPath;\n}\n","let _simulationMode = false;\n\n/**\n * Configure global SDK options.\n *\n * @param options.simulation - Enable simulation mode. All `evaluateBatch` calls\n * return deterministic pass results without spawning the engine or calling any\n * LLM. Equivalent to setting `ATTEST_SIMULATION=1` in the environment.\n */\nexport function config(options: { simulation?: boolean }): void {\n if (options.simulation !== undefined) {\n _simulationMode = options.simulation;\n }\n}\n\n/**\n * Returns true when simulation mode is active via either the programmatic API\n * or the `ATTEST_SIMULATION` environment variable.\n */\nexport function isSimulationMode(): boolean {\n return (\n _simulationMode ||\n process.env[\"ATTEST_SIMULATION\"] === \"1\" ||\n process.env[\"ATTEST_SIMULATION\"] === \"true\" ||\n process.env[\"ATTEST_SIMULATION\"] === \"yes\"\n );\n}\n\n/**\n * Reset all programmatic config to defaults. Primarily for use in tests.\n * Environment variables are not affected.\n */\nexport function resetConfig(): void {\n _simulationMode = false;\n}\n","import type { Assertion, AssertionResult, EvaluateBatchResult } from \"./proto/types.js\";\n\n/**\n * Return a deterministic all-pass result for every assertion without\n * contacting the engine or any LLM provider. Used when simulation mode\n * is active (`ATTEST_SIMULATION=1` or `config({ simulation: true })`).\n */\nexport function simulationEvaluateBatch(\n assertions: readonly Assertion[],\n): EvaluateBatchResult {\n const results: AssertionResult[] = assertions.map((assertion) => ({\n assertion_id: assertion.assertion_id,\n status: \"pass\",\n score: 1.0,\n explanation: `[simulation] assertion '${assertion.assertion_id}' passed (type: ${assertion.type})`,\n cost: 0,\n duration_ms: 0,\n }));\n\n return {\n results,\n total_cost: 0,\n total_duration_ms: 0,\n };\n}\n","import type { Interface as ReadlineInterface } from \"node:readline\";\nimport type {\n Assertion,\n EvaluateBatchResult,\n Trace,\n AssertionResult,\n} from \"./proto/types.js\";\nimport { ProtocolError, EngineTimeoutError } from \"./proto/errors.js\";\nimport {\n decodeResponse,\n encodeRequest,\n extractId,\n extractResult,\n} from \"./proto/codec.js\";\nimport type { EngineManager } from \"./engine-manager.js\";\nimport { isSimulationMode } from \"./config.js\";\nimport { simulationEvaluateBatch } from \"./simulation.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction resolveTimeoutMs(override?: number): number {\n if (override !== undefined) return override;\n const env = process.env[\"ATTEST_ENGINE_TIMEOUT\"];\n if (env !== undefined && env !== \"\") {\n const parsed = Number(env);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(\n `ATTEST_ENGINE_TIMEOUT must be a positive number of milliseconds, got: '${env}'`,\n );\n }\n return parsed;\n }\n return DEFAULT_TIMEOUT_MS;\n}\n\nfunction makeTimeoutPromise(method: string, timeoutMs: number): Promise<never> {\n return new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new EngineTimeoutError(method, timeoutMs));\n }, timeoutMs);\n });\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n}\n\nexport class AttestClient {\n private readonly engine: EngineManager;\n private requestId = 0;\n private readonly pending = new Map<number, PendingRequest>();\n private writeChain: Promise<void> = Promise.resolve();\n private readerActive = false;\n private lineHandler: ((line: string) => void) | null = null;\n\n constructor(engine: EngineManager) {\n this.engine = engine;\n }\n\n startReader(): void {\n if (this.readerActive) return;\n\n const rl = this.engine.readlineInterface;\n if (rl === null) {\n throw new Error(\"Engine readline interface not available. Call engine.start() first.\");\n }\n\n this.readerActive = true;\n this.lineHandler = (line: string) => this.handleLine(line);\n rl.on(\"line\", this.lineHandler);\n\n rl.on(\"close\", () => {\n this.failAll(new Error(\"Engine closed stdout.\"));\n this.readerActive = false;\n });\n }\n\n stopReader(): void {\n if (!this.readerActive) return;\n\n const rl = this.engine.readlineInterface;\n if (rl !== null && this.lineHandler !== null) {\n rl.removeListener(\"line\", this.lineHandler);\n }\n\n this.lineHandler = null;\n this.readerActive = false;\n }\n\n private handleLine(line: string): void {\n let reqId: number;\n\n try {\n const response = decodeResponse(line);\n reqId = extractId(response);\n\n const pending = this.pending.get(reqId);\n if (pending === undefined) return;\n this.pending.delete(reqId);\n\n try {\n const result = extractResult(response);\n pending.resolve(result);\n } catch (err) {\n pending.reject(err);\n }\n } catch (err) {\n if (err instanceof ProtocolError) {\n // Try to extract id from raw JSON for error routing\n try {\n const raw = JSON.parse(line.trim()) as Record<string, unknown>;\n reqId = Number(raw.id ?? -1);\n } catch {\n reqId = -1;\n }\n const pending = this.pending.get(reqId);\n if (pending !== undefined) {\n this.pending.delete(reqId);\n pending.reject(err);\n }\n }\n // Malformed responses are silently discarded (logged in production)\n }\n }\n\n private failAll(err: Error): void {\n for (const pending of this.pending.values()) {\n pending.reject(err);\n }\n this.pending.clear();\n }\n\n async sendRequest(\n method: string,\n params: Record<string, unknown>,\n timeoutMs?: number,\n ): Promise<unknown> {\n const resolvedTimeout = resolveTimeoutMs(timeoutMs);\n\n if (!this.readerActive) {\n // Delegate to engine sequential mode with timeout\n return Promise.race([\n this.engine.sendRequest(method, params),\n makeTimeoutPromise(method, resolvedTimeout),\n ]);\n }\n\n const cp = this.engine.childProcess;\n if (cp === null || cp.stdin === null) {\n throw new Error(\"Engine process not started.\");\n }\n\n let capturedReqId: number | undefined;\n\n const requestPromise = new Promise<unknown>((resolve, reject) => {\n // Serialize writes through promise chain\n this.writeChain = this.writeChain.then(() => {\n this.requestId += 1;\n const reqId = this.requestId;\n capturedReqId = reqId;\n this.pending.set(reqId, { resolve, reject });\n\n const requestStr = encodeRequest(reqId, method, params);\n cp.stdin!.write(requestStr, (err: Error | null | undefined) => {\n if (err) {\n this.pending.delete(reqId);\n reject(err);\n }\n });\n });\n });\n\n const timeoutPromise = makeTimeoutPromise(method, resolvedTimeout);\n\n return Promise.race([requestPromise, timeoutPromise]).catch((err: unknown) => {\n if (err instanceof EngineTimeoutError && capturedReqId !== undefined) {\n this.pending.delete(capturedReqId);\n }\n throw err;\n });\n }\n\n async evaluateBatch(\n trace: Trace,\n assertions: readonly Assertion[],\n options?: { timeout?: number },\n ): Promise<EvaluateBatchResult> {\n if (isSimulationMode()) {\n return simulationEvaluateBatch(assertions);\n }\n\n const params = {\n trace,\n assertions: [...assertions],\n };\n const raw = await this.sendRequest(\n \"evaluate_batch\",\n params as Record<string, unknown>,\n options?.timeout,\n );\n return raw as EvaluateBatchResult;\n }\n\n async submitPluginResult(\n traceId: string,\n pluginName: string,\n assertionId: string,\n status: string,\n score: number,\n explanation: string,\n options?: { timeout?: number },\n ): Promise<boolean> {\n const result: AssertionResult = {\n assertion_id: assertionId,\n status,\n score,\n explanation,\n cost: 0.0,\n duration_ms: 0,\n };\n const params = {\n trace_id: traceId,\n plugin_name: pluginName,\n assertion_id: assertionId,\n result,\n };\n const raw = await this.sendRequest(\n \"submit_plugin_result\",\n params as Record<string, unknown>,\n options?.timeout,\n );\n return Boolean((raw as Record<string, unknown>)?.accepted ?? false);\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Step, Trace, TraceMetadata } from \"./proto/types.js\";\nimport {\n STEP_LLM_CALL,\n STEP_TOOL_CALL,\n STEP_RETRIEVAL,\n} from \"./proto/constants.js\";\n\nexport class TraceBuilder {\n private traceId: string;\n private agentId: string | undefined;\n private input: Record<string, unknown> | undefined;\n private readonly steps: Step[] = [];\n private output: Record<string, unknown> | undefined;\n private metadata: TraceMetadata | undefined;\n private parentTraceId: string | undefined;\n\n constructor(agentId?: string) {\n this.traceId = `trc_${randomUUID().replace(/-/g, \"\").slice(0, 12)}`;\n this.agentId = agentId;\n }\n\n setTraceId(traceId: string): this {\n this.traceId = traceId;\n return this;\n }\n\n setInput(input: Record<string, unknown>): this {\n this.input = input;\n return this;\n }\n\n addLlmCall(\n name: string,\n options?: {\n args?: Record<string, unknown>;\n result?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n },\n ): this {\n this.steps.push({\n type: STEP_LLM_CALL,\n name,\n args: options?.args,\n result: options?.result,\n metadata: options?.metadata,\n });\n return this;\n }\n\n addToolCall(\n name: string,\n options?: {\n args?: Record<string, unknown>;\n result?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n },\n ): this {\n this.steps.push({\n type: STEP_TOOL_CALL,\n name,\n args: options?.args,\n result: options?.result,\n metadata: options?.metadata,\n });\n return this;\n }\n\n addRetrieval(\n name: string,\n options?: {\n args?: Record<string, unknown>;\n result?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n },\n ): this {\n this.steps.push({\n type: STEP_RETRIEVAL,\n name,\n args: options?.args,\n result: options?.result,\n metadata: options?.metadata,\n });\n return this;\n }\n\n addStep(step: Step): this {\n this.steps.push(step);\n return this;\n }\n\n setOutput(output: Record<string, unknown>): this {\n this.output = output;\n return this;\n }\n\n setMetadata(metadata: {\n total_tokens?: number;\n cost_usd?: number;\n latency_ms?: number;\n model?: string;\n timestamp?: string;\n }): this {\n this.metadata = metadata;\n return this;\n }\n\n getTraceId(): string {\n return this.traceId;\n }\n\n setParentTraceId(parentId: string): this {\n this.parentTraceId = parentId;\n return this;\n }\n\n build(): Trace {\n if (this.output === undefined) {\n throw new Error(\"Trace output is required. Call setOutput() before build().\");\n }\n return {\n trace_id: this.traceId,\n output: this.output,\n schema_version: 1,\n agent_id: this.agentId,\n input: this.input,\n steps: [...this.steps],\n metadata: this.metadata,\n parent_trace_id: this.parentTraceId,\n };\n }\n}\n","import type { AssertionResult, Trace } from \"./proto/types.js\";\nimport {\n STATUS_PASS,\n STATUS_SOFT_FAIL,\n STATUS_HARD_FAIL,\n} from \"./proto/constants.js\";\n\nexport class AgentResult {\n readonly trace: Trace;\n readonly assertionResults: readonly AssertionResult[];\n readonly totalCost: number;\n readonly totalDurationMs: number;\n\n constructor(\n trace: Trace,\n assertionResults: readonly AssertionResult[] = [],\n totalCost = 0.0,\n totalDurationMs = 0,\n ) {\n this.trace = trace;\n this.assertionResults = assertionResults;\n this.totalCost = totalCost;\n this.totalDurationMs = totalDurationMs;\n }\n\n get passed(): boolean {\n return this.assertionResults.every((r) => r.status === STATUS_PASS);\n }\n\n get failedAssertions(): readonly AssertionResult[] {\n return this.assertionResults.filter((r) => r.status !== STATUS_PASS);\n }\n\n get hardFailures(): readonly AssertionResult[] {\n return this.assertionResults.filter((r) => r.status === STATUS_HARD_FAIL);\n }\n\n get softFailures(): readonly AssertionResult[] {\n return this.assertionResults.filter((r) => r.status === STATUS_SOFT_FAIL);\n }\n\n get passCount(): number {\n return this.assertionResults.filter((r) => r.status === STATUS_PASS).length;\n }\n\n get failCount(): number {\n return this.assertionResults.length - this.passCount;\n }\n}\n","import type { Step, Trace } from \"./proto/types.js\";\nimport { STEP_AGENT_CALL, STEP_TOOL_CALL } from \"./proto/constants.js\";\n\nexport class TraceTree {\n readonly root: Trace;\n\n constructor(root: Trace) {\n this.root = root;\n }\n\n get agents(): string[] {\n const result: string[] = [];\n this.collectAgents(this.root, result);\n return result;\n }\n\n private collectAgents(trace: Trace, acc: string[]): void {\n if (trace.agent_id != null) {\n acc.push(trace.agent_id);\n }\n for (const step of trace.steps) {\n if (step.type === STEP_AGENT_CALL && step.sub_trace != null) {\n this.collectAgents(step.sub_trace, acc);\n }\n }\n }\n\n findAgent(agentId: string): Trace | undefined {\n return this.findAgentIn(this.root, agentId);\n }\n\n private findAgentIn(trace: Trace, agentId: string): Trace | undefined {\n if (trace.agent_id === agentId) return trace;\n for (const step of trace.steps) {\n if (step.type === STEP_AGENT_CALL && step.sub_trace != null) {\n const found = this.findAgentIn(step.sub_trace, agentId);\n if (found !== undefined) return found;\n }\n }\n return undefined;\n }\n\n get depth(): number {\n return this.computeDepth(this.root);\n }\n\n private computeDepth(trace: Trace): number {\n let maxChild = -1;\n for (const step of trace.steps) {\n if (step.type === STEP_AGENT_CALL && step.sub_trace != null) {\n const childDepth = this.computeDepth(step.sub_trace);\n if (childDepth > maxChild) maxChild = childDepth;\n }\n }\n return maxChild >= 0 ? maxChild + 1 : 0;\n }\n\n flatten(): Trace[] {\n const result: Trace[] = [];\n this.flattenInto(this.root, result);\n return result;\n }\n\n private flattenInto(trace: Trace, acc: Trace[]): void {\n acc.push(trace);\n for (const step of trace.steps) {\n if (step.type === STEP_AGENT_CALL && step.sub_trace != null) {\n this.flattenInto(step.sub_trace, acc);\n }\n }\n }\n\n get delegations(): [string, string][] {\n const result: [string, string][] = [];\n this.collectDelegations(this.root, result);\n return result;\n }\n\n private collectDelegations(trace: Trace, acc: [string, string][]): void {\n const parentId = trace.agent_id ?? \"\";\n for (const step of trace.steps) {\n if (step.type === STEP_AGENT_CALL && step.sub_trace != null) {\n const childId = step.sub_trace.agent_id ?? \"\";\n acc.push([parentId, childId]);\n this.collectDelegations(step.sub_trace, acc);\n }\n }\n }\n\n allToolCalls(): Step[] {\n return this.flatten().flatMap((t) =>\n t.steps.filter((step) => step.type === STEP_TOOL_CALL),\n );\n }\n\n get aggregateTokens(): number {\n return this.flatten().reduce(\n (sum, t) => sum + (t.metadata?.total_tokens ?? 0),\n 0,\n );\n }\n\n get aggregateCost(): number {\n return this.flatten().reduce(\n (sum, t) => sum + (t.metadata?.cost_usd ?? 0),\n 0,\n );\n }\n\n get aggregateLatency(): number {\n return this.flatten().reduce(\n (sum, t) => sum + (t.metadata?.latency_ms ?? 0),\n 0,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Assertion, Trace } from \"./proto/types.js\";\nimport {\n TYPE_CONSTRAINT,\n TYPE_CONTENT,\n TYPE_EMBEDDING,\n TYPE_LLM_JUDGE,\n TYPE_PLUGIN,\n TYPE_SCHEMA,\n TYPE_TRACE,\n TYPE_TRACE_TREE,\n} from \"./proto/constants.js\";\nimport { AgentResult } from \"./result.js\";\n\nexport class ExpectChain {\n private readonly _result: AgentResult;\n private readonly _assertions: Assertion[] = [];\n\n constructor(result: AgentResult) {\n this._result = result;\n }\n\n get assertions(): Assertion[] {\n return [...this._assertions];\n }\n\n get trace(): Trace {\n return this._result.trace;\n }\n\n private add(assertionType: string, spec: Record<string, unknown>): this {\n this._assertions.push({\n assertion_id: `assert_${randomUUID().replace(/-/g, \"\").slice(0, 8)}`,\n type: assertionType,\n spec,\n });\n return this;\n }\n\n // -- Layer 1: Schema --\n\n /**\n * Assert that `output.structured` conforms to the given JSON Schema.\n *\n * @param schema - A JSON Schema object to validate against.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputMatchesSchema({ type: \"object\", required: [\"answer\"] });\n * ```\n */\n outputMatchesSchema(schema: Record<string, unknown>): this {\n return this.add(TYPE_SCHEMA, { target: \"output.structured\", schema });\n }\n\n /**\n * Assert that a specific output field conforms to the given JSON Schema.\n *\n * @param field - Dot-delimited path under `output` (e.g. `\"structured.items\"`).\n * @param schema - A JSON Schema object to validate against.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputFieldMatchesSchema(\"structured.items\", { type: \"array\" });\n * ```\n */\n outputFieldMatchesSchema(field: string, schema: Record<string, unknown>): this {\n return this.add(TYPE_SCHEMA, { target: `output.${field}`, schema });\n }\n\n /**\n * Assert that a named tool's arguments conform to the given JSON Schema.\n *\n * @param toolName - The tool name to match in `steps`.\n * @param schema - A JSON Schema object to validate against.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).toolArgsMatchSchema(\"search\", { type: \"object\", required: [\"query\"] });\n * ```\n */\n toolArgsMatchSchema(toolName: string, schema: Record<string, unknown>): this {\n return this.add(TYPE_SCHEMA, {\n target: `steps[?name=='${toolName}'].args`,\n schema,\n });\n }\n\n /**\n * Assert that a named tool's result conforms to the given JSON Schema.\n *\n * @param toolName - The tool name to match in `steps`.\n * @param schema - A JSON Schema object to validate against.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).toolResultMatchesSchema(\"search\", { type: \"object\" });\n * ```\n */\n toolResultMatchesSchema(toolName: string, schema: Record<string, unknown>): this {\n return this.add(TYPE_SCHEMA, {\n target: `steps[?name=='${toolName}'].result`,\n schema,\n });\n }\n\n // -- Layer 2: Constraints --\n\n /**\n * Assert total cost (in USD) is at or below `maxCost`.\n *\n * @param maxCost - Maximum allowed cost in USD.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).costUnder(0.05);\n * expect(result).costUnder(0.05, { soft: true });\n * ```\n */\n costUnder(maxCost: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_CONSTRAINT, {\n field: \"metadata.cost_usd\",\n operator: \"lte\",\n value: maxCost,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert total latency is at or below `maxMs` milliseconds.\n *\n * @param maxMs - Maximum allowed latency in milliseconds.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).latencyUnder(2000);\n * ```\n */\n latencyUnder(maxMs: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_CONSTRAINT, {\n field: \"metadata.latency_ms\",\n operator: \"lte\",\n value: maxMs,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert total token usage is at or below `maxTokens`.\n *\n * @param maxTokens - Maximum allowed token count.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).tokensUnder(500);\n * ```\n */\n tokensUnder(maxTokens: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_CONSTRAINT, {\n field: \"metadata.total_tokens\",\n operator: \"lte\",\n value: maxTokens,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert total token usage is between `minTokens` and `maxTokens` (inclusive).\n *\n * @param minTokens - Minimum allowed token count.\n * @param maxTokens - Maximum allowed token count.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).tokensBetween(100, 500);\n * ```\n */\n tokensBetween(minTokens: number, maxTokens: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_CONSTRAINT, {\n field: \"metadata.total_tokens\",\n operator: \"between\",\n min: minTokens,\n max: maxTokens,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the number of steps satisfies the given comparison.\n *\n * @param operator - Comparison operator (e.g. `\"eq\"`, `\"lte\"`, `\"gte\"`).\n * @param value - The reference count to compare against.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).stepCount(\"lte\", 5);\n * ```\n */\n stepCount(operator: string, value: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_CONSTRAINT, {\n field: \"steps.length\",\n operator,\n value,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the number of tool-call steps satisfies the given comparison.\n *\n * @param operator - Comparison operator (e.g. `\"eq\"`, `\"lte\"`, `\"gte\"`).\n * @param value - The reference count to compare against.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).toolCallCount(\"gte\", 1);\n * ```\n */\n toolCallCount(operator: string, value: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_CONSTRAINT, {\n field: \"steps[?type=='tool_call'].length\",\n operator,\n value,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Generic constraint assertion on any field.\n *\n * @param field - Dot-delimited path into the trace (e.g. `\"metadata.cost_usd\"`).\n * @param operator - Comparison operator.\n * @param opts.value - Reference value for single-operand operators.\n * @param opts.min - Minimum for `\"between\"` operator.\n * @param opts.max - Maximum for `\"between\"` operator.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).constraint(\"metadata.cost_usd\", \"lte\", { value: 0.1 });\n * ```\n */\n constraint(\n field: string,\n operator: string,\n opts?: { value?: number; min?: number; max?: number; soft?: boolean },\n ): this {\n const spec: Record<string, unknown> = {\n field,\n operator,\n soft: opts?.soft ?? false,\n };\n if (opts?.value !== undefined) spec.value = opts.value;\n if (opts?.min !== undefined) spec.min = opts.min;\n if (opts?.max !== undefined) spec.max = opts.max;\n return this.add(TYPE_CONSTRAINT, spec);\n }\n\n // -- Layer 3: Trace --\n\n /**\n * Assert that tools were called in the given order (non-contiguous allowed).\n *\n * @param tools - Ordered list of tool names expected.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).toolsCalledInOrder([\"search\", \"write\"]);\n * ```\n */\n toolsCalledInOrder(tools: string[], opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"contains_in_order\",\n tools,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert that tools were called in exact contiguous order.\n *\n * @param tools - Exact ordered list of tool names.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).toolsCalledExactly([\"search\", \"summarize\", \"respond\"]);\n * ```\n */\n toolsCalledExactly(tools: string[], opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"exact_order\",\n tools,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert a tool is not called more than `maxRepetitions` times consecutively.\n *\n * @param tool - The tool name to check.\n * @param maxRepetitions - Maximum allowed consecutive calls (default `1`).\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).noToolLoops(\"fetch\", 2);\n * ```\n */\n noToolLoops(tool: string, maxRepetitions = 1, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"loop_detection\",\n tool,\n max_repetitions: maxRepetitions,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert no tool is called more than once.\n *\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).noDuplicateTools();\n * ```\n */\n noDuplicateTools(opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, { check: \"no_duplicates\", soft: opts?.soft ?? false });\n }\n\n /**\n * Assert that all listed tools were called at least once.\n *\n * @param tools - Tool names that must appear in the trace.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).requiredTools([\"search\", \"respond\"]);\n * ```\n */\n requiredTools(tools: string[], opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"required_tools\",\n tools,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert that none of the listed tools were called.\n *\n * @param tools - Tool names that must not appear in the trace.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).forbiddenTools([\"delete_user\", \"drop_table\"]);\n * ```\n */\n forbiddenTools(tools: string[], opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"forbidden_tools\",\n tools,\n soft: opts?.soft ?? false,\n });\n }\n\n // -- Layer 4: Content --\n\n /**\n * Assert the output message contains the given string.\n *\n * @param value - Substring to search for.\n * @param opts.caseSensitive - Enable case-sensitive matching (default `false`).\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputContains(\"refund approved\");\n * ```\n */\n outputContains(value: string, opts?: { caseSensitive?: boolean; soft?: boolean }): this {\n return this.add(TYPE_CONTENT, {\n target: \"output.message\",\n check: \"contains\",\n value,\n case_sensitive: opts?.caseSensitive ?? false,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the output message does not contain the given string.\n *\n * @param value - Substring that must be absent.\n * @param opts.caseSensitive - Enable case-sensitive matching (default `false`).\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputNotContains(\"internal error\");\n * ```\n */\n outputNotContains(value: string, opts?: { caseSensitive?: boolean; soft?: boolean }): this {\n return this.add(TYPE_CONTENT, {\n target: \"output.message\",\n check: \"not_contains\",\n value,\n case_sensitive: opts?.caseSensitive ?? false,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the output message matches the given regular expression.\n *\n * @param pattern - Regex pattern string.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputMatchesRegex(\"order #\\\\d{5}\");\n * ```\n */\n outputMatchesRegex(pattern: string, opts?: { soft?: boolean }): this {\n return this.add(TYPE_CONTENT, {\n target: \"output.message\",\n check: \"regex_match\",\n value: pattern,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the output message contains all of the given keywords.\n *\n * @param keywords - Keywords that must all be present.\n * @param opts.caseSensitive - Enable case-sensitive matching (default `false`).\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputHasAllKeywords([\"refund\", \"processed\"]);\n * ```\n */\n outputHasAllKeywords(\n keywords: string[],\n opts?: { caseSensitive?: boolean; soft?: boolean },\n ): this {\n return this.add(TYPE_CONTENT, {\n target: \"output.message\",\n check: \"keyword_all\",\n values: keywords,\n case_sensitive: opts?.caseSensitive ?? false,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the output message contains at least one of the given keywords.\n *\n * @param keywords - Keywords where at least one must be present.\n * @param opts.caseSensitive - Enable case-sensitive matching (default `false`).\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputHasAnyKeyword([\"yes\", \"confirmed\"]);\n * ```\n */\n outputHasAnyKeyword(\n keywords: string[],\n opts?: { caseSensitive?: boolean; soft?: boolean },\n ): this {\n return this.add(TYPE_CONTENT, {\n target: \"output.message\",\n check: \"keyword_any\",\n values: keywords,\n case_sensitive: opts?.caseSensitive ?? false,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the output message contains none of the forbidden terms.\n *\n * @param terms - Terms that must not appear in the output.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputForbids([\"password\", \"api_key\"]);\n * ```\n */\n outputForbids(terms: string[]): this {\n return this.add(TYPE_CONTENT, {\n target: \"output.message\",\n check: \"forbidden\",\n values: terms,\n });\n }\n\n /**\n * Generic content-contains check on any target path.\n *\n * @param target - Dot-delimited path into the trace.\n * @param value - Substring to search for.\n * @param opts.caseSensitive - Enable case-sensitive matching (default `false`).\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).contentContains(\"steps[0].result.text\", \"success\");\n * ```\n */\n contentContains(\n target: string,\n value: string,\n opts?: { caseSensitive?: boolean; soft?: boolean },\n ): this {\n return this.add(TYPE_CONTENT, {\n target,\n check: \"contains\",\n value,\n case_sensitive: opts?.caseSensitive ?? false,\n soft: opts?.soft ?? false,\n });\n }\n\n // -- Layer 5: Embedding Similarity --\n\n /**\n * Assert the output is semantically similar to a reference string via embeddings.\n *\n * @param reference - The reference text to compare against.\n * @param opts.threshold - Minimum cosine similarity (default `0.8`).\n * @param opts.model - Override the embedding model.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).outputSimilarTo(\"The order has been refunded\", { threshold: 0.85 });\n * ```\n */\n outputSimilarTo(\n reference: string,\n opts?: { threshold?: number; model?: string; soft?: boolean },\n ): this {\n return this.add(TYPE_EMBEDDING, {\n target: \"output.message\",\n reference,\n threshold: opts?.threshold ?? 0.8,\n model: opts?.model,\n soft: opts?.soft ?? false,\n });\n }\n\n // -- Layer 6: LLM Judge --\n\n /**\n * Assert the output passes LLM judge evaluation against given criteria.\n *\n * @param criteria - Natural language description of what makes a good response.\n * @param opts.rubric - Rubric name (default `\"default\"`).\n * @param opts.threshold - Minimum passing score (default `0.8`).\n * @param opts.model - Override the judge model.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).passesJudge(\"Response is polite and helpful\", { threshold: 0.9 });\n * ```\n */\n passesJudge(\n criteria: string,\n opts?: { rubric?: string; threshold?: number; model?: string; soft?: boolean },\n ): this {\n return this.add(TYPE_LLM_JUDGE, {\n target: \"output.message\",\n criteria,\n rubric: opts?.rubric ?? \"default\",\n threshold: opts?.threshold ?? 0.8,\n model: opts?.model,\n soft: opts?.soft ?? false,\n });\n }\n\n // -- Layer 7: Trace Tree (Multi-Agent) --\n\n /**\n * Assert that a specific agent was called in the trace tree.\n *\n * @param agentId - The agent identifier to look for.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).agentCalled(\"summarizer\");\n * ```\n */\n agentCalled(agentId: string, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"agent_called\",\n agent_id: agentId,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert the trace tree delegation depth does not exceed `maxDepth`.\n *\n * @param maxDepth - Maximum allowed delegation depth.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).delegationDepth(3);\n * ```\n */\n delegationDepth(maxDepth: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"delegation_depth\",\n max_depth: maxDepth,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert a sub-agent's output contains the given string.\n *\n * @param agentId - The agent whose output to check.\n * @param value - Substring to search for.\n * @param opts.caseSensitive - Enable case-sensitive matching (default `false`).\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).agentOutputContains(\"summarizer\", \"key findings\");\n * ```\n */\n agentOutputContains(\n agentId: string,\n value: string,\n opts?: { caseSensitive?: boolean; soft?: boolean },\n ): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"agent_output_contains\",\n agent_id: agentId,\n value,\n case_sensitive: opts?.caseSensitive ?? false,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert data flows from one agent's output to another agent's input.\n *\n * @param fromAgent - Source agent ID.\n * @param toAgent - Destination agent ID.\n * @param field - The data field that must flow between agents.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).crossAgentDataFlow(\"researcher\", \"writer\", \"findings\");\n * ```\n */\n crossAgentDataFlow(\n fromAgent: string,\n toAgent: string,\n field: string,\n opts?: { soft?: boolean },\n ): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"cross_agent_data_flow\",\n from_agent: fromAgent,\n to_agent: toAgent,\n field,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert agent delegations follow the specified transitions.\n *\n * @param transitions - Array of `[fromAgent, toAgent]` pairs.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).followsTransitions([[\"root\", \"planner\"], [\"planner\", \"executor\"]]);\n * ```\n */\n followsTransitions(transitions: [string, string][], opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"follows_transitions\",\n transitions,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert aggregate cost across the entire trace tree is at or below `maxCost`.\n *\n * @param maxCost - Maximum allowed aggregate cost in USD.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).aggregateCostUnder(0.50);\n * ```\n */\n aggregateCostUnder(maxCost: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"aggregate_cost\",\n operator: \"lte\",\n value: maxCost,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert aggregate tokens across the entire trace tree is at or below `maxTokens`.\n *\n * @param maxTokens - Maximum allowed aggregate token count.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).aggregateTokensUnder(10000);\n * ```\n */\n aggregateTokensUnder(maxTokens: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"aggregate_tokens\",\n operator: \"lte\",\n value: maxTokens,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert `agentA` started before `agentB` in the trace tree.\n *\n * @param agentA - The agent expected to run first.\n * @param agentB - The agent expected to run second.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).agentOrderedBefore(\"planner\", \"executor\");\n * ```\n */\n agentOrderedBefore(agentA: string, agentB: string, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"agent_ordered_before\",\n agent_a: agentA,\n agent_b: agentB,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert `agentA` and `agentB` ran concurrently (overlapping wall-clock time).\n *\n * @param agentA - First agent ID.\n * @param agentB - Second agent ID.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).agentsOverlap(\"worker-1\", \"worker-2\");\n * ```\n */\n agentsOverlap(agentA: string, agentB: string, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"agents_overlap\",\n agent_a: agentA,\n agent_b: agentB,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert a specific agent's wall-clock duration is under `maxMs` milliseconds.\n *\n * @param agentId - The agent to check.\n * @param maxMs - Maximum allowed wall-clock time in milliseconds.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).agentWallTimeUnder(\"summarizer\", 5000);\n * ```\n */\n agentWallTimeUnder(agentId: string, maxMs: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"agent_wall_time_under\",\n agent_id: agentId,\n max_ms: maxMs,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert agents ran in ordered groups (parallel within each group, sequential across groups).\n *\n * @param groups - Array of agent-ID arrays. Each sub-array is a parallel group.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).orderedAgents([[\"planner\"], [\"worker-1\", \"worker-2\"], [\"aggregator\"]]);\n * ```\n */\n orderedAgents(groups: string[][], opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"ordered_agents\",\n groups,\n soft: opts?.soft ?? false,\n });\n }\n\n // -- Layer 8: Plugin --\n\n /**\n * Assert via a registered plugin (Layer 8).\n *\n * @param pluginId - Identifier of the plugin registered with the engine.\n * @param config - Plugin-specific configuration passed at evaluation time.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).plugin(\"custom-safety-check\", { threshold: 0.95 });\n * ```\n */\n plugin(\n pluginId: string,\n config?: Record<string, unknown>,\n opts?: { soft?: boolean },\n ): this {\n const spec: Record<string, unknown> = { plugin_id: pluginId, soft: opts?.soft ?? false };\n if (config !== undefined) spec.config = config;\n return this.add(TYPE_PLUGIN, spec);\n }\n\n // -- TraceTree Analytics (P9 parity) --\n\n /**\n * Assert aggregate latency across the trace tree is at or below `maxMs`.\n *\n * @param maxMs - Maximum allowed aggregate latency in milliseconds.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).aggregateLatencyUnder(5000);\n * ```\n */\n aggregateLatencyUnder(maxMs: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"aggregate_latency\",\n operator: \"lte\",\n value: maxMs,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert that all specified tools were called across the entire trace tree.\n *\n * @param toolNames - Tool names that must appear somewhere in the tree.\n * @param opts.soft - When `true` the failure is non-blocking.\n * @returns The chain for fluent composition.\n *\n * @example\n * ```ts\n * expect(result).allToolsCalled([\"search\", \"summarize\"]);\n * ```\n */\n allToolsCalled(toolNames: string[], opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE_TREE, {\n check: \"all_tools_called\",\n tools: toolNames,\n soft: opts?.soft ?? false,\n });\n }\n}\n\n/**\n * Create an assertion chain for an agent result.\n *\n * Accepts either an {@link AgentResult} or a raw {@link Trace}. When a\n * `Trace` is passed it is automatically wrapped in an `AgentResult`.\n *\n * @param result - An `AgentResult` or raw `Trace` to build assertions on.\n * @returns A new {@link ExpectChain} for fluent assertion building.\n *\n * @example\n * ```ts\n * attestExpect(result).outputContains(\"hello\").costUnder(0.05);\n * attestExpect(trace).requiredTools([\"search\"]);\n * ```\n */\nexport function attestExpect(result: AgentResult | Trace): ExpectChain {\n if (result instanceof AgentResult) {\n return new ExpectChain(result);\n }\n // Treat as Trace — wrap in AgentResult\n return new ExpectChain(new AgentResult(result));\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { TraceBuilder } from \"./trace.js\";\n\nexport const activeBuilder = new AsyncLocalStorage<TraceBuilder>();\n","import type { Trace } from \"./proto/types.js\";\nimport { AgentResult } from \"./result.js\";\nimport { TraceBuilder } from \"./trace.js\";\nimport { activeBuilder } from \"./context.js\";\n\nexport class Agent {\n readonly name: string;\n private readonly fn: ((builder: TraceBuilder, args: Record<string, unknown>) => unknown) | undefined;\n\n constructor(\n name: string,\n fn?: (builder: TraceBuilder, args: Record<string, unknown>) => unknown,\n ) {\n this.name = name;\n this.fn = fn;\n }\n\n run(args: Record<string, unknown> = {}): AgentResult {\n if (this.fn === undefined) {\n throw new Error(\"No agent function provided. Pass fn to Agent().\");\n }\n\n const builder = new TraceBuilder(this.name);\n builder.setInput(args);\n\n const output = activeBuilder.run(builder, () => this.fn!(builder, args));\n this.setOutput(builder, output);\n\n return new AgentResult(builder.build());\n }\n\n async arun(args: Record<string, unknown> = {}): Promise<AgentResult> {\n if (this.fn === undefined) {\n throw new Error(\"No agent function provided. Pass fn to Agent().\");\n }\n\n const builder = new TraceBuilder(this.name);\n builder.setInput(args);\n\n const output = await activeBuilder.run(builder, async () => this.fn!(builder, args));\n this.setOutput(builder, output);\n\n return new AgentResult(builder.build());\n }\n\n private setOutput(builder: TraceBuilder, output: unknown): void {\n if (output !== null && output !== undefined && typeof output === \"object\" && !Array.isArray(output)) {\n builder.setOutput(output as Record<string, unknown>);\n } else if (output !== undefined) {\n builder.setOutput({ result: output });\n } else {\n builder.setOutput({ result: null });\n }\n }\n\n withTrace(trace: Trace): AgentResult {\n return new AgentResult(trace);\n }\n}\n\nexport function agent(\n name: string,\n fn: (builder: TraceBuilder, args: Record<string, unknown>) => unknown,\n): (args?: Record<string, unknown>) => AgentResult {\n const wrapped = new Agent(name, fn);\n\n const wrapper = (args?: Record<string, unknown>): AgentResult => {\n return wrapped.run(args ?? {});\n };\n\n (wrapper as unknown as Record<string, unknown>).agent = wrapped;\n return wrapper;\n}\n","import { STEP_AGENT_CALL } from \"./proto/constants.js\";\nimport { TraceBuilder } from \"./trace.js\";\nimport { activeBuilder } from \"./context.js\";\n\nexport async function delegate(\n agentId: string,\n fn: (child: TraceBuilder) => Promise<void> | void,\n): Promise<void> {\n const parent = activeBuilder.getStore();\n if (parent === undefined) {\n throw new Error(\n \"delegate() must be used within an Agent.run() context. \" +\n \"No active TraceBuilder found.\",\n );\n }\n\n const child = new TraceBuilder(agentId);\n child.setParentTraceId(parent.getTraceId());\n\n await activeBuilder.run(child, async () => {\n await fn(child);\n });\n\n const childTrace = child.build();\n\n parent.addStep({\n type: STEP_AGENT_CALL,\n name: agentId,\n args: undefined,\n result: childTrace.output,\n sub_trace: childTrace,\n });\n}\n","export const TIER_1 = 1 as const;\nexport const TIER_2 = 2 as const;\nexport const TIER_3 = 3 as const;\n\nexport function tier(level: number): <T extends (...args: never[]) => unknown>(fn: T) => T {\n return <T extends (...args: never[]) => unknown>(fn: T): T => {\n (fn as Record<string, unknown>)._attest_tier = level;\n return fn;\n };\n}\n","import type { Trace } from \"./proto/types.js\";\nimport type { AttestClient } from \"./client.js\";\n\nexport interface PluginResult {\n readonly status: string;\n readonly score: number;\n readonly explanation: string;\n readonly metadata?: Record<string, unknown>;\n}\n\nexport interface AttestPlugin {\n readonly name: string;\n readonly pluginType: string; // \"adapter\" | \"assertion\" | \"judge\" | \"reporter\"\n execute(trace: Trace, spec: Record<string, unknown>): PluginResult | Promise<PluginResult>;\n}\n\nexport class PluginRegistry {\n private readonly plugins = new Map<string, Map<string, AttestPlugin>>();\n\n register(name: string, plugin: AttestPlugin): void {\n const pluginType = plugin.pluginType;\n let typeMap = this.plugins.get(pluginType);\n if (typeMap === undefined) {\n typeMap = new Map();\n this.plugins.set(pluginType, typeMap);\n }\n typeMap.set(name, plugin);\n }\n\n get(pluginType: string, name: string): AttestPlugin | undefined {\n return this.plugins.get(pluginType)?.get(name);\n }\n\n listPlugins(pluginType?: string): string[] {\n if (pluginType !== undefined) {\n const typeMap = this.plugins.get(pluginType);\n return typeMap !== undefined ? [...typeMap.keys()] : [];\n }\n const result: string[] = [];\n for (const [ptype, typeMap] of this.plugins) {\n for (const pname of typeMap.keys()) {\n result.push(`${ptype}/${pname}`);\n }\n }\n return result;\n }\n}\n\nexport async function executePluginAssertion(\n plugin: AttestPlugin,\n trace: Trace,\n spec: Record<string, unknown>,\n client: AttestClient,\n traceId: string,\n assertionId: string,\n timeoutMs = 30_000,\n): Promise<PluginResult> {\n const resultPromise = Promise.resolve(plugin.execute(trace, spec));\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Plugin '${plugin.name}' timed out after ${timeoutMs}ms`)), timeoutMs);\n });\n\n const result = await Promise.race([resultPromise, timeoutPromise]);\n\n await client.submitPluginResult(\n traceId,\n plugin.name,\n assertionId,\n result.status,\n result.score,\n result.explanation,\n );\n\n return result;\n}\n","import { EventEmitter } from \"node:events\";\nimport type { Assertion, EvaluateBatchResult, Trace } from \"./proto/types.js\";\nimport type { AttestClient } from \"./client.js\";\n\nconst DEFAULT_QUEUE_SIZE = 1000;\n\nfunction resolveQueueSize(): number {\n const raw = process.env[\"ATTEST_CONTINUOUS_QUEUE_SIZE\"];\n if (raw !== undefined && raw !== \"\") {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n }\n return DEFAULT_QUEUE_SIZE;\n}\n\nexport class Sampler {\n private readonly rate: number;\n\n constructor(rate: number) {\n if (rate < 0 || rate > 1) {\n throw new Error(`sample_rate must be in [0.0, 1.0], got ${rate}`);\n }\n this.rate = rate;\n }\n\n shouldSample(): boolean {\n return Math.random() < this.rate;\n }\n}\n\nexport interface AlertPayload {\n drift_type: string;\n score: number | string;\n trace_id: string;\n [key: string]: unknown;\n}\n\nexport class AlertDispatcher extends EventEmitter {\n private readonly webhookUrl: string | undefined;\n private readonly slackUrl: string | undefined;\n\n constructor(webhookUrl?: string, slackUrl?: string) {\n super();\n this.webhookUrl = webhookUrl;\n this.slackUrl = slackUrl;\n }\n\n async dispatch(alert: AlertPayload): Promise<void> {\n this.emit(\"alert\", alert);\n\n const tasks: Promise<void>[] = [];\n\n if (this.webhookUrl) {\n tasks.push(this.postJson(this.webhookUrl, alert));\n }\n if (this.slackUrl) {\n const text = `[attest] drift alert -- type=${alert.drift_type} score=${alert.score} trace_id=${alert.trace_id}`;\n tasks.push(this.postJson(this.slackUrl, { text }));\n }\n\n const results = await Promise.allSettled(tasks);\n for (const result of results) {\n if (result.status === \"rejected\") {\n this.emit(\"alertError\", result.reason);\n }\n }\n }\n\n private async postJson(url: string, payload: Record<string, unknown>): Promise<void> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new Error(`POST to ${url} returned ${response.status}`);\n }\n }\n}\n\nexport class ContinuousEvalRunner {\n private readonly client: AttestClient;\n private readonly assertions: readonly Assertion[];\n private readonly sampler: Sampler;\n private readonly dispatcher: AlertDispatcher;\n private readonly queue: Trace[] = [];\n private readonly maxSize: number;\n private running = false;\n private loopTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n client: AttestClient,\n assertions: readonly Assertion[],\n options?: {\n sampleRate?: number;\n alertWebhook?: string;\n alertSlackUrl?: string;\n maxSize?: number;\n },\n ) {\n this.client = client;\n this.assertions = assertions;\n this.sampler = new Sampler(options?.sampleRate ?? 1.0);\n this.dispatcher = new AlertDispatcher(options?.alertWebhook, options?.alertSlackUrl);\n this.maxSize = options?.maxSize ?? resolveQueueSize();\n }\n\n get alertEmitter(): AlertDispatcher {\n return this.dispatcher;\n }\n\n async evaluateTrace(trace: Trace): Promise<EvaluateBatchResult | null> {\n if (!this.sampler.shouldSample()) return null;\n return this.client.evaluateBatch(trace, this.assertions);\n }\n\n submit(trace: Trace): boolean {\n if (this.queue.length >= this.maxSize) {\n return false;\n }\n this.queue.push(trace);\n return true;\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n stop(): void {\n this.running = false;\n if (this.loopTimer !== null) {\n clearTimeout(this.loopTimer);\n this.loopTimer = null;\n }\n }\n\n get queueLength(): number {\n return this.queue.length;\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.loopTimer = setTimeout(async () => {\n if (!this.running) return;\n\n const trace = this.queue.shift();\n if (trace !== undefined) {\n try {\n await this.evaluateTrace(trace);\n } catch {\n // logged via alertEmitter events if needed\n }\n }\n\n this.scheduleNext();\n }, this.queue.length > 0 ? 0 : 100);\n }\n}\n","import type { Trace } from \"../proto/types.js\";\nimport { TraceBuilder } from \"../trace.js\";\n\nexport class ManualAdapter {\n private readonly agentId: string | undefined;\n\n constructor(agentId?: string) {\n this.agentId = agentId;\n }\n\n capture(builderFn: (builder: TraceBuilder) => void): Trace {\n const builder = new TraceBuilder(this.agentId);\n builderFn(builder);\n return builder.build();\n }\n\n createBuilder(): TraceBuilder {\n return new TraceBuilder(this.agentId);\n }\n}\n","import type { Trace } from \"../proto/types.js\";\nimport { TraceBuilder } from \"../trace.js\";\n\ninterface OpenAIUsage {\n total_tokens?: number;\n}\n\ninterface OpenAIToolCall {\n function: { name: string; arguments: string };\n}\n\ninterface OpenAIMessage {\n content: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIChoice {\n message: OpenAIMessage;\n}\n\ninterface OpenAIChatCompletion {\n model?: string;\n usage?: OpenAIUsage;\n choices: OpenAIChoice[];\n}\n\nexport class OpenAIAdapter {\n private readonly agentId: string | undefined;\n\n constructor(agentId?: string) {\n this.agentId = agentId;\n }\n\n traceFromResponse(\n response: OpenAIChatCompletion,\n options?: {\n inputMessages?: Record<string, unknown>[];\n costUsd?: number;\n latencyMs?: number;\n structuredOutput?: Record<string, unknown>;\n },\n ): Trace {\n const builder = new TraceBuilder(this.agentId);\n\n if (options?.inputMessages) {\n builder.setInput({ messages: options.inputMessages });\n }\n\n const message = response.choices[0].message;\n const completionText = message.content ?? \"\";\n\n const stepArgs: Record<string, unknown> = {};\n if (response.model !== undefined) stepArgs.model = response.model;\n\n const stepResult: Record<string, unknown> = { completion: completionText };\n if (response.usage?.total_tokens !== undefined) {\n stepResult.tokens = response.usage.total_tokens;\n }\n\n builder.addLlmCall(\"completion\", { args: stepArgs, result: stepResult });\n\n if (message.tool_calls) {\n for (const tc of message.tool_calls) {\n builder.addToolCall(tc.function.name, {\n args: { arguments: tc.function.arguments },\n });\n }\n }\n\n builder.setOutput({\n message: completionText,\n structured: options?.structuredOutput ?? {},\n });\n\n builder.setMetadata({\n total_tokens: response.usage?.total_tokens,\n cost_usd: options?.costUsd,\n latency_ms: options?.latencyMs,\n model: response.model,\n });\n\n return builder.build();\n }\n}\n","import type { Trace } from \"../proto/types.js\";\nimport { TraceBuilder } from \"../trace.js\";\n\ninterface AnthropicTextBlock {\n type: \"text\";\n text: string;\n}\n\ninterface AnthropicToolUseBlock {\n type: \"tool_use\";\n name: string;\n input: Record<string, unknown>;\n}\n\ntype AnthropicContentBlock = AnthropicTextBlock | AnthropicToolUseBlock;\n\ninterface AnthropicUsage {\n input_tokens: number;\n output_tokens: number;\n}\n\ninterface AnthropicMessage {\n model?: string;\n usage?: AnthropicUsage;\n content: AnthropicContentBlock[];\n}\n\nexport class AnthropicAdapter {\n private readonly agentId: string | undefined;\n\n constructor(agentId?: string) {\n this.agentId = agentId;\n }\n\n traceFromResponse(\n response: AnthropicMessage,\n options?: {\n inputMessages?: Record<string, unknown>[];\n costUsd?: number;\n latencyMs?: number;\n },\n ): Trace {\n const builder = new TraceBuilder(this.agentId);\n\n if (options?.inputMessages) {\n builder.setInput({ messages: options.inputMessages });\n }\n\n const completionParts: string[] = [];\n for (const block of response.content) {\n if (block.type === \"text\") {\n completionParts.push(block.text);\n } else if (block.type === \"tool_use\") {\n builder.addToolCall(block.name, {\n args: block.input,\n });\n }\n }\n\n const completionText = completionParts.join(\"\\n\");\n\n const stepArgs: Record<string, unknown> = {};\n if (response.model !== undefined) stepArgs.model = response.model;\n\n builder.addLlmCall(\"completion\", { args: stepArgs, result: { completion: completionText } });\n builder.setOutput({ message: completionText });\n\n let totalTokens: number | undefined;\n if (response.usage) {\n totalTokens = response.usage.input_tokens + response.usage.output_tokens;\n }\n\n builder.setMetadata({\n total_tokens: totalTokens,\n cost_usd: options?.costUsd,\n latency_ms: options?.latencyMs,\n model: response.model,\n });\n\n return builder.build();\n }\n}\n","import type { Trace } from \"../proto/types.js\";\nimport { TraceBuilder } from \"../trace.js\";\n\ninterface GeminiFunctionCall {\n name: string;\n args?: Record<string, unknown>;\n}\n\ninterface GeminiPart {\n text?: string;\n functionCall?: GeminiFunctionCall;\n}\n\ninterface GeminiCandidate {\n content: { parts: GeminiPart[] };\n}\n\ninterface GeminiResponse {\n text?: string;\n candidates?: GeminiCandidate[];\n}\n\nexport class GeminiAdapter {\n private readonly agentId: string | undefined;\n\n constructor(agentId?: string) {\n this.agentId = agentId;\n }\n\n traceFromResponse(\n response: GeminiResponse,\n options?: {\n inputText?: string;\n costUsd?: number;\n latencyMs?: number;\n model?: string;\n },\n ): Trace {\n const builder = new TraceBuilder(this.agentId);\n\n if (options?.inputText) {\n builder.setInput({ text: options.inputText });\n }\n\n let completionText = \"\";\n if (response.text != null) {\n completionText = response.text;\n } else if (response.candidates && response.candidates.length > 0) {\n completionText = response.candidates[0].content.parts\n .filter((p) => p.text != null)\n .map((p) => p.text!)\n .join(\"\");\n }\n\n if (response.candidates && response.candidates.length > 0) {\n for (const part of response.candidates[0].content.parts) {\n if (part.functionCall) {\n builder.addToolCall(part.functionCall.name, {\n args: part.functionCall.args ?? {},\n });\n }\n }\n }\n\n builder.addLlmCall(\"completion\", { result: { completion: completionText } });\n builder.setOutput({ message: completionText });\n\n builder.setMetadata({\n cost_usd: options?.costUsd,\n latency_ms: options?.latencyMs,\n model: options?.model,\n });\n\n return builder.build();\n }\n}\n","import type { Trace } from \"../proto/types.js\";\nimport { TraceBuilder } from \"../trace.js\";\n\ninterface OllamaResponse {\n model?: string;\n message?: { content?: string };\n eval_count?: number;\n prompt_eval_count?: number;\n}\n\nexport class OllamaAdapter {\n private readonly agentId: string | undefined;\n\n constructor(agentId?: string) {\n this.agentId = agentId;\n }\n\n traceFromResponse(\n response: OllamaResponse,\n options?: {\n inputMessages?: Record<string, unknown>[];\n latencyMs?: number;\n },\n ): Trace {\n const builder = new TraceBuilder(this.agentId);\n\n if (options?.inputMessages) {\n builder.setInput({ messages: options.inputMessages });\n }\n\n const completionText = response.message?.content ?? \"\";\n\n builder.addLlmCall(\"completion\", {\n args: { model: response.model ?? \"\" },\n result: { completion: completionText },\n });\n\n builder.setOutput({ message: completionText });\n\n let totalTokens: number | undefined;\n if (response.eval_count !== undefined && response.prompt_eval_count !== undefined) {\n totalTokens = response.eval_count + response.prompt_eval_count;\n }\n\n builder.setMetadata({\n total_tokens: totalTokens,\n latency_ms: options?.latencyMs,\n model: response.model,\n });\n\n return builder.build();\n }\n}\n","import type { Trace } from \"../proto/types.js\";\nimport { TraceBuilder } from \"../trace.js\";\n\ninterface OTelSpanContext {\n traceId: string;\n}\n\ninterface OTelSpan {\n name: string;\n startTime: [number, number]; // [seconds, nanoseconds]\n endTime: [number, number];\n attributes?: Record<string, unknown>;\n parentSpanId?: string;\n spanContext(): OTelSpanContext;\n}\n\nexport class OTelAdapter {\n private readonly agentId: string | undefined;\n\n constructor(agentId?: string) {\n this.agentId = agentId;\n }\n\n static fromSpans(spans: OTelSpan[], agentId?: string): Trace {\n const adapter = new OTelAdapter(agentId);\n return adapter.buildTrace(spans);\n }\n\n private buildTrace(spans: OTelSpan[]): Trace {\n const sorted = [...spans].sort((a, b) => {\n const aTime = a.startTime[0] * 1e9 + a.startTime[1];\n const bTime = b.startTime[0] * 1e9 + b.startTime[1];\n return aTime - bTime;\n });\n\n const builder = new TraceBuilder(this.agentId);\n const rootSpan = this.findRootSpan(sorted);\n\n if (rootSpan) {\n const traceId = rootSpan.spanContext().traceId;\n if (traceId) {\n builder.setTraceId(`otel_${traceId.slice(0, 16)}`);\n }\n }\n\n let outputMessage = \"\";\n let totalTokens: number | undefined;\n let latencyMs: number | undefined;\n let model: string | undefined;\n\n for (const span of sorted) {\n const attrs = span.attributes ?? {};\n const stepType = this.classifySpan(attrs, span.name);\n\n if (stepType === \"llm_call\") {\n const [stepArgs, stepResult] = this.extractLlmStep(attrs);\n builder.addLlmCall(span.name, {\n args: stepArgs,\n result: stepResult,\n metadata: this.spanMetadata(span),\n });\n\n const completion = attrs[\"gen_ai.completion\"];\n if (completion) outputMessage = String(completion);\n\n const inputTokens = Number(attrs[\"gen_ai.usage.input_tokens\"] ?? 0);\n const outputTokens = Number(attrs[\"gen_ai.usage.output_tokens\"] ?? 0);\n const spanTokens = inputTokens + outputTokens;\n if (spanTokens > 0) totalTokens = (totalTokens ?? 0) + spanTokens;\n\n if (model === undefined) {\n const responseModel = attrs[\"gen_ai.response.model\"];\n const requestModel = attrs[\"gen_ai.request.model\"];\n if (responseModel) model = String(responseModel);\n else if (requestModel) model = String(requestModel);\n }\n } else if (stepType === \"tool_call\") {\n const [stepArgs, stepResult] = this.extractToolStep(attrs);\n const toolName = String(attrs[\"gen_ai.tool.name\"] ?? span.name);\n builder.addToolCall(toolName, {\n args: stepArgs,\n result: stepResult,\n metadata: this.spanMetadata(span),\n });\n }\n }\n\n if (rootSpan) {\n const startNs = rootSpan.startTime[0] * 1e9 + rootSpan.startTime[1];\n const endNs = rootSpan.endTime[0] * 1e9 + rootSpan.endTime[1];\n latencyMs = Math.floor((endNs - startNs) / 1_000_000);\n }\n\n builder.setOutput({ message: outputMessage });\n builder.setMetadata({ total_tokens: totalTokens, latency_ms: latencyMs, model });\n\n return builder.build();\n }\n\n private findRootSpan(spans: OTelSpan[]): OTelSpan | undefined {\n for (const span of spans) {\n if (!span.parentSpanId) return span;\n }\n return spans[0];\n }\n\n private classifySpan(attrs: Record<string, unknown>, name: string): string | undefined {\n const op = String(attrs[\"gen_ai.operation.name\"] ?? \"\");\n if (op === \"chat\" || op === \"completion\" || op === \"generate_content\" || \"gen_ai.completion\" in attrs) {\n return \"llm_call\";\n }\n if (op === \"tool\" || \"gen_ai.tool.name\" in attrs) {\n return \"tool_call\";\n }\n const lower = name.toLowerCase();\n if (lower.includes(\"completion\") || lower.includes(\"chat\")) return \"llm_call\";\n if (lower.includes(\"tool\")) return \"tool_call\";\n return undefined;\n }\n\n private extractLlmStep(attrs: Record<string, unknown>): [Record<string, unknown>, Record<string, unknown>] {\n const args: Record<string, unknown> = {};\n const result: Record<string, unknown> = {};\n\n if (\"gen_ai.request.model\" in attrs) args.model = String(attrs[\"gen_ai.request.model\"]);\n if (\"gen_ai.system\" in attrs) args.system = String(attrs[\"gen_ai.system\"]);\n if (\"gen_ai.prompt\" in attrs) args.prompt = String(attrs[\"gen_ai.prompt\"]);\n\n if (\"gen_ai.completion\" in attrs) result.completion = String(attrs[\"gen_ai.completion\"]);\n if (\"gen_ai.usage.input_tokens\" in attrs) result.input_tokens = Number(attrs[\"gen_ai.usage.input_tokens\"]);\n if (\"gen_ai.usage.output_tokens\" in attrs) result.output_tokens = Number(attrs[\"gen_ai.usage.output_tokens\"]);\n if (\"gen_ai.response.model\" in attrs) result.model = String(attrs[\"gen_ai.response.model\"]);\n\n return [args, result];\n }\n\n private extractToolStep(attrs: Record<string, unknown>): [Record<string, unknown>, Record<string, unknown>] {\n const args: Record<string, unknown> = {};\n const result: Record<string, unknown> = {};\n\n if (\"gen_ai.tool.call.id\" in attrs) args.call_id = String(attrs[\"gen_ai.tool.call.id\"]);\n if (\"gen_ai.tool.parameters\" in attrs) args.parameters = attrs[\"gen_ai.tool.parameters\"];\n if (\"gen_ai.tool.output\" in attrs) result.output = attrs[\"gen_ai.tool.output\"];\n\n return [args, result];\n }\n\n private spanMetadata(span: OTelSpan): Record<string, unknown> {\n const startNs = span.startTime[0] * 1e9 + span.startTime[1];\n const endNs = span.endTime[0] * 1e9 + span.endTime[1];\n return { duration_ms: Math.floor((endNs - startNs) / 1_000_000) };\n }\n}\n","import type { Trace } from \"../proto/types.js\";\nimport { TraceBuilder } from \"../trace.js\";\n\n/**\n * Minimal type definitions for `@langchain/core` callback handler.\n * These avoid a hard dependency on `@langchain/core` — the actual types\n * are checked at runtime when the user provides real LangChain objects.\n */\n\ninterface LangChainLLMResult {\n generations: Array<Array<{ text: string; [key: string]: unknown }>>;\n llmOutput?: Record<string, unknown>;\n}\n\ninterface LangChainToolEnd {\n name?: string;\n output: string;\n [key: string]: unknown;\n}\n\ninterface LangChainChainValues {\n [key: string]: unknown;\n}\n\ninterface AccumulatedLLMCall {\n name: string;\n text: string;\n tokens?: number;\n model?: string;\n}\n\ninterface AccumulatedToolCall {\n name: string;\n output: string;\n}\n\nexport class LangChainAdapter {\n private readonly agentId: string | undefined;\n private readonly llmCalls: AccumulatedLLMCall[] = [];\n private readonly toolCalls: AccumulatedToolCall[] = [];\n private chainOutput: string = \"\";\n private startTime: number = 0;\n\n constructor(agentId?: string) {\n this.agentId = agentId;\n }\n\n /**\n * Reset accumulated state for a new trace capture session.\n */\n reset(): void {\n this.llmCalls.length = 0;\n this.toolCalls.length = 0;\n this.chainOutput = \"\";\n this.startTime = 0;\n }\n\n /**\n * Call this when a chain starts (maps to `handleChainStart`).\n */\n handleChainStart(): void {\n if (this.startTime === 0) {\n this.startTime = Date.now();\n }\n }\n\n /**\n * Call this when an LLM call completes (maps to `handleLLMEnd`).\n */\n handleLLMEnd(output: LangChainLLMResult): void {\n const text = output.generations[0]?.[0]?.text ?? \"\";\n const tokens = output.llmOutput?.[\"tokenUsage\"] as\n | { totalTokens?: number }\n | undefined;\n const model = output.llmOutput?.[\"modelName\"] as string | undefined;\n\n this.llmCalls.push({\n name: \"completion\",\n text,\n tokens: tokens?.totalTokens,\n model,\n });\n }\n\n /**\n * Call this when a tool call completes (maps to `handleToolEnd`).\n */\n handleToolEnd(output: string, metadata?: LangChainToolEnd): void {\n this.toolCalls.push({\n name: metadata?.name ?? \"unknown_tool\",\n output,\n });\n }\n\n /**\n * Call this when a chain completes (maps to `handleChainEnd`).\n */\n handleChainEnd(output: LangChainChainValues): void {\n const text = output[\"output\"] ?? output[\"text\"] ?? output[\"result\"];\n if (typeof text === \"string\") {\n this.chainOutput = text;\n }\n }\n\n /**\n * Build a Trace from accumulated callback events.\n *\n * @param options.costUsd - Total cost override.\n * @param options.model - Model name override.\n * @returns A finalized Trace object.\n */\n buildTrace(options?: { costUsd?: number; model?: string }): Trace {\n const builder = new TraceBuilder(this.agentId);\n const latencyMs = this.startTime > 0 ? Date.now() - this.startTime : undefined;\n\n let totalTokens: number | undefined;\n\n for (const llm of this.llmCalls) {\n const args: Record<string, unknown> = {};\n if (llm.model ?? options?.model) args.model = llm.model ?? options?.model;\n\n const result: Record<string, unknown> = { completion: llm.text };\n if (llm.tokens !== undefined) {\n result.tokens = llm.tokens;\n totalTokens = (totalTokens ?? 0) + llm.tokens;\n }\n\n builder.addLlmCall(llm.name, { args, result });\n }\n\n for (const tool of this.toolCalls) {\n builder.addToolCall(tool.name, {\n result: { output: tool.output },\n });\n }\n\n const outputMessage =\n this.chainOutput ||\n (this.llmCalls.length > 0 ? this.llmCalls[this.llmCalls.length - 1].text : \"\");\n\n builder.setOutput({ message: outputMessage });\n builder.setMetadata({\n total_tokens: totalTokens,\n cost_usd: options?.costUsd,\n latency_ms: latencyMs,\n model: options?.model ?? this.llmCalls[0]?.model,\n });\n\n return builder.build();\n }\n}\n"],"mappings":"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","names":["platform","arch","resolve","fsConstants","resolve","resolve","traceId","assertionId","agentId","traceId","agentId","import_node_crypto","agentId","config","agentId","traceId","assertionId","agentId","agentId","agentId","agentId","agentId","agentId","traceId","agentId"]}
|