@attest-ai/core 1.0.0-rc.5 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/proto/constants.ts","../../src/proto/types.ts","../../src/proto/errors.ts","../../src/proto/diagnostics.ts","../../src/proto/codec.ts","../../src/version.ts","../../src/engine-manager.ts","../../src/engine-downloader.ts","../../src/config.ts","../../src/usage.ts","../../src/client.ts","../../src/trace.ts","../../src/simulation/context.ts","../../src/result.ts","../../src/diagnostics.ts","../../src/trace-tree.ts","../../src/expect.ts","../../src/capture.ts","../../src/replay.ts","../../src/egress.ts","../../src/world.ts","../../src/context.ts","../../src/agent.ts","../../src/delegate.ts","../../src/tier.ts","../../src/plugins.ts","../../src/continuous.ts","../../src/calibration.ts","../../src/personas.ts","../../src/simulation/mock-tools.ts","../../src/simulation/fault-inject.ts","../../src/simulation/verdict.ts","../../src/simulation/repeat.ts","../../src/simulation/scenario.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 DriftReport,\n ConversationMessage,\n SimulatePersona,\n SimulateFaultConfig,\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, requireSimulationCapability } from \"./client.js\";\nexport type { AttestClientOptions } from \"./client.js\";\nexport { TraceBuilder } from \"./trace.js\";\nexport { AgentResult } from \"./result.js\";\nexport { addUsage, formatUsage, parseUsage, sumUsage, usageSummaryLine, zeroUsage } from \"./usage.js\";\nexport {\n renderAssertionFailure,\n renderDiagnostics,\n renderSummary,\n} from \"./diagnostics.js\";\nexport type { RenderOptions } from \"./diagnostics.js\";\nexport { TraceTree } from \"./trace-tree.js\";\nexport { ExpectChain, WorldChecks, attestExpect } from \"./expect.js\";\nexport {\n CaptureError,\n loadFixture,\n record,\n emitVitest,\n renderVitest,\n dslCall,\n testPathFor,\n} from \"./capture.js\";\nexport type {\n Capture,\n Contract,\n ContractResult,\n Fixture,\n RecordOptions,\n RecordResult,\n} from \"./capture.js\";\nexport {\n ReplayError,\n ReplayMissError,\n ReplayNotEvaluatedError,\n firstMiss,\n liveLine,\n resolveMode,\n startReplay,\n} from \"./replay.js\";\nexport { WorldError, startWorld } from \"./world.js\";\nexport type { WorldOptions, WorldSession, WorldSnapshot } from \"./world.js\";\nexport type {\n ReplayMode,\n ReplayModeSetting,\n ReplayOptions,\n ReplayRecord,\n ReplaySession,\n ReplaySummary,\n} from \"./replay.js\";\nexport {\n EgressBlockedError,\n egressBlockRequested,\n installEgressGuard,\n isProviderHost,\n uninstallEgressGuard,\n} from \"./egress.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 {\n config,\n isSimulationMode,\n simulationEnvEnabled,\n getSampleRate,\n resetConfig,\n} from \"./config.js\";\nexport type { AttestPlugin, PluginResult } from \"./plugins.js\";\nexport {\n PluginRegistry,\n executePluginAssertion,\n loadPackagePlugins,\n registerPlugin,\n} from \"./plugins.js\";\nexport { ContinuousEvalRunner, Sampler, AlertDispatcher } from \"./continuous.js\";\nexport {\n computeAgreement,\n loadLabelsCSV,\n loadLabelsJSONL,\n promptHash,\n} from \"./calibration.js\";\nexport type { AgreementResult, LabelPair, LabeledRecord } from \"./calibration.js\";\nexport {\n FRIENDLY_USER,\n ADVERSARIAL_USER,\n CONFUSED_USER,\n COOPERATIVE_USER,\n} from \"./personas.js\";\nexport {\n MockToolRegistry,\n RepeatResult,\n ScenarioResult,\n faultInject,\n mockTool,\n renderVerdictDiagnostics,\n repeat,\n scenario,\n} from \"./simulation/index.js\";\nexport type {\n FaultInjectOptions,\n MockTool,\n MockToolFn,\n ScenarioConfig,\n ScenarioContext,\n ScenarioOptions,\n Verdict,\n} from \"./simulation/index.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;\nexport const STATUS_NOT_EVALUATED = \"not_evaluated\" as const;\n\n// Reasons carried by a not_evaluated result (AssertionResult.reason)\nexport const REASON_PROVIDER_UNAVAILABLE = \"provider_unavailable\" as const;\nexport const REASON_PROVIDER_NOT_CONFIGURED = \"provider_not_configured\" as const;\nexport const REASON_SIMULATION = \"simulation\" as const;\nexport const REASON_MISSING_EVIDENCE = \"missing_evidence\" as const;\nexport const REASON_SHORT_CIRCUITED = \"short_circuited\" as const;\nexport const REASON_BUDGET_EXHAUSTED = \"budget_exhausted\" as const;\nexport const REASON_JUDGE_ABSTAINED = \"judge_abstained\" as const;\nexport const REASON_REPLAY_MISS = \"replay_miss\" as const;\n\n// Test outcomes derived from a batch of assertion results (AgentResult.outcome)\nexport const OUTCOME_PASS = \"pass\" as const;\nexport const OUTCOME_FAIL = \"fail\" as const;\nexport const OUTCOME_SKIP = \"skip\" as const;\nexport type Outcome = typeof OUTCOME_PASS | typeof OUTCOME_FAIL | typeof OUTCOME_SKIP;\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_EFFECT = \"effect\" 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 EffectSpec {\n readonly type: \"effect\";\n readonly check: \"count\" | \"unique\" | \"idempotent\";\n /** A world-v1 snapshot, or `null` when the test ran without a world helper. */\n readonly world: Record<string, unknown> | null;\n readonly resource: string;\n readonly where?: Record<string, unknown>;\n readonly equals?: number;\n readonly at_most?: number;\n readonly at_least?: number;\n readonly fields?: string[];\n readonly field?: string;\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 | \"dynamic\";\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 | \"dynamic\";\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 | EffectSpec\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\n/** Trace v2: a step whose span ended in error. */\nexport interface StepError {\n readonly type: string;\n readonly message?: string;\n}\n\n/** Trace v2: a recorded model request/response pair. */\nexport interface Exchange {\n readonly request: Record<string, unknown>;\n readonly response: Record<string, unknown>;\n}\n\n/** Trace v2: one conversation turn and the indices of its steps. */\nexport interface Turn {\n readonly index: number;\n readonly span_id?: string;\n readonly input?: unknown;\n readonly output?: unknown;\n readonly step_indices: readonly number[];\n}\n\n/** Trace v2: control passing from one agent to another at an agent_call step. */\nexport interface Handoff {\n readonly from_agent: string;\n readonly to_agent: string;\n readonly step_index: number;\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 // Trace v2 (schema_version 2) fields.\n readonly span_id?: string;\n readonly parent_span_id?: string;\n readonly tool_call_id?: string;\n readonly retry_of?: number;\n readonly error?: StepError;\n readonly exchange?: Exchange;\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 // Trace v2 (schema_version 2) fields.\n readonly conversation_id?: string;\n readonly turns?: readonly Turn[];\n readonly handoffs?: readonly Handoff[];\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\n/**\n * Audit trail for an LLM-judge evaluation. Mirrors\n * engine/pkg/types/assertion.go::JudgeMetadata so report v2 payloads\n * round-trip without losing the model / rubric / variance evidence\n * reviewers need to triage a judge failure.\n */\nexport interface JudgeMetadata {\n readonly provider?: string;\n readonly model?: string;\n readonly rubric_name?: string;\n readonly rubric_version?: string;\n readonly prompt_hash?: string;\n readonly sample_scores?: readonly number[];\n readonly score_mean?: number;\n readonly score_stddev?: number;\n readonly high_variance?: boolean;\n readonly bias_probes?: readonly BiasProbe[];\n readonly calibration?: JudgeAgreement;\n}\n\n/**\n * One judge-bias probe result. Score is the score the judge produced on\n * the mutated input; delta is `score - baseline`. A well-calibrated\n * judge has |delta| close to zero. Mirrors\n * engine/pkg/types/assertion.go::BiasProbe.\n */\nexport interface BiasProbe {\n readonly name: string;\n readonly score: number;\n readonly delta: number;\n}\n\n/**\n * Calibration agreement summary keyed by\n * (rubric_name, rubric_version, prompt_hash). Mirrors\n * engine/pkg/types/assertion.go::JudgeAgreement.\n */\nexport interface JudgeAgreement {\n readonly label_count: number;\n readonly agreement: number;\n readonly cohen_kappa: number;\n readonly roc_auc?: number;\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 /** Set only when status is \"not_evaluated\" (REASON_* constants). */\n readonly reason?: string;\n readonly threshold_source?: string;\n readonly layer?: number;\n readonly type?: string;\n readonly trace_node_path?: string;\n readonly expected?: string;\n readonly actual?: string;\n readonly suggested_action?: string;\n readonly judge_metadata?: JudgeMetadata;\n /**\n * Heuristic root-cause label set by the engine\n * (broken_code / flaky_judge / bad_rubric / missing_trace_data /\n * stochastic_variance). Empty/undefined for passes and any result the\n * engine declined to label. Mirrors\n * engine/pkg/types/failure_class.go.\n */\n readonly failure_class?: string;\n}\n\n/**\n * FailureClass values mirror engine/pkg/types/failure_class.go. Use\n * these constants when matching on AssertionResult.failure_class so a\n * typo in either codebase fails fast.\n */\nexport const FailureClass = {\n BrokenCode: \"broken_code\",\n FlakyJudge: \"flaky_judge\",\n BadRubric: \"bad_rubric\",\n MissingTraceData: \"missing_trace_data\",\n StochasticVariance: \"stochastic_variance\",\n} as const;\nexport type FailureClass = (typeof FailureClass)[keyof typeof FailureClass];\n\n/**\n * Map an assertion-type string to its pipeline layer (1–8). Returns 0\n * when the type is unknown so callers can route uncategorised results\n * into their own bucket.\n */\nexport function layerForType(assertionType: string | undefined): number {\n switch (assertionType) {\n case \"schema\":\n return 1;\n case \"constraint\":\n return 2;\n case \"trace\":\n case \"trace_tree\":\n case \"effect\":\n return 3;\n case \"content\":\n return 4;\n case \"embedding\":\n return 5;\n case \"llm_judge\":\n return 6;\n case \"plugin\":\n return 8;\n default:\n return 0;\n }\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\n/**\n * Limits for one evaluate_batch call on top of the session budget. A judge or\n * embedding call that cannot reserve against them is not sent and its\n * assertion is not_evaluated with reason \"budget_exhausted\".\n */\nexport interface BatchBudget {\n readonly max_judge_calls?: number;\n readonly max_cost_usd?: number;\n}\n\n/**\n * The test an evaluate_batch call belongs to. The engine records it next to\n * each assertion spec when ATTEST_CONTRACTS_DIR is set and uses it for\n * nothing else.\n */\nexport interface BatchContext {\n readonly test_id?: string;\n readonly file?: string;\n /** 1-based line the test starts on. */\n readonly line?: number;\n}\n\nexport interface EvaluateBatchParams {\n readonly trace: Trace;\n readonly assertions: readonly Assertion[];\n /** Omitted when no per-batch budget applies. */\n readonly budget?: BatchBudget;\n /** Omitted outside a test. */\n readonly context?: BatchContext;\n}\n\n/**\n * Attest-initiated model usage (embeddings, judges, judge repeats, bias\n * probes, simulated-user messages). Agent calls not routed through attest\n * are not counted.\n */\nexport interface Usage {\n readonly model_calls: number;\n /** Judge-provider requests, the part of model_calls that max_judge_calls limits. */\n readonly judge_calls: number;\n readonly input_tokens: number;\n readonly output_tokens: number;\n readonly cached_tokens: number;\n readonly cost_usd: number;\n readonly retry_cost_usd: number;\n readonly unpriced_calls: number;\n readonly budget_refused: number;\n}\n\nexport interface EvaluateBatchResult {\n readonly results: readonly AssertionResult[];\n readonly total_cost?: number;\n readonly total_duration_ms?: number;\n /** Always sent by the engine; validated by AttestClient.evaluateBatch. */\n readonly usage: Usage;\n /**\n * True when this result was produced by an SDK simulation shim rather\n * than a real engine evaluation. Engine-produced results always carry\n * simulated=false. CI gates can fail builds that accidentally evaluate\n * against the simulator by checking this flag.\n */\n readonly simulated?: boolean;\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\n// ---------------------------------------------------------------------------\n// Drift detection types\n// ---------------------------------------------------------------------------\n\nexport interface DriftReport {\n readonly assertion_id: string;\n readonly mean: number;\n readonly stddev: number;\n readonly count: number;\n readonly latest_score: number;\n readonly deviation: number;\n readonly status: string;\n}\n\nexport interface QueryDriftParams {\n readonly assertion_id: string;\n readonly window_size: number;\n}\n\nexport interface QueryDriftResult {\n readonly report: DriftReport;\n}\n\n// ---------------------------------------------------------------------------\n// Simulation types\n// ---------------------------------------------------------------------------\n\nexport interface SimulatePersona {\n readonly name: string;\n readonly system_prompt: string;\n readonly style: string;\n readonly temperature: number;\n readonly max_tokens?: number;\n}\n\nexport interface SimulateFaultConfig {\n readonly error_rate: number;\n readonly latency_jitter_ms: number;\n readonly content_corruption: boolean;\n readonly timeout_after_ms: number;\n}\n\nexport interface ConversationMessage {\n readonly role: string;\n readonly content: string;\n}\n\nexport interface GenerateUserMessageParams {\n readonly persona: SimulatePersona;\n readonly conversation_history: readonly ConversationMessage[];\n readonly fault_config?: SimulateFaultConfig;\n}\n\nexport interface GenerateUserMessageResult {\n readonly message: string;\n}\n","import type { ErrorData } from \"./types.js\";\nimport type { ProtocolDiagnostic } from \"./diagnostics.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\n/**\n * Raised when the reader loop detects that engine output has lost\n * framing or contains repeated unparseable lines. All in-flight requests\n * are rejected with this error so callers see a visible failure rather\n * than a hung promise.\n */\nexport class ProtocolDesyncError extends Error {\n readonly diagnostics: readonly ProtocolDiagnostic[];\n\n constructor(message: string, diagnostics: readonly ProtocolDiagnostic[]) {\n super(message);\n this.name = \"ProtocolDesyncError\";\n this.diagnostics = diagnostics;\n }\n}\n\n/**\n * The engine rejected an OTLP/JSON export (`attest-engine trace convert`). The message is\n * the engine's error, which names the offending span or field.\n */\nexport class OTLPConversionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OTLPConversionError\";\n }\n}\n","/**\n * Protocol diagnostic types for client-side observability.\n *\n * The reader loop emits diagnostics whenever it cannot route a response\n * line: malformed JSON, missing id, unknown id, or non-routable protocol\n * errors. Diagnostics are buffered in a bounded ring (32 entries) and\n * trigger a desync error when the rate exceeds the configured threshold.\n */\n\nexport type ProtocolDiagnosticKind =\n | \"malformed_json\"\n | \"non_object_response\"\n | \"invalid_jsonrpc_version\"\n | \"missing_id\"\n | \"unknown_id\"\n | \"non_routable_error\";\n\nexport interface ProtocolDiagnostic {\n readonly kind: ProtocolDiagnosticKind;\n readonly message: string;\n readonly rawLine: string;\n readonly timestampMs: number;\n}\n\nexport interface ProtocolLogger {\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n}\n\nconst DEFAULT_BUFFER_SIZE = 32;\nconst MAX_LINE_PREVIEW = 512;\n\nexport class ProtocolDiagnosticBuffer {\n private readonly capacity: number;\n private readonly entries: ProtocolDiagnostic[] = [];\n\n constructor(capacity: number = DEFAULT_BUFFER_SIZE) {\n if (capacity <= 0) {\n throw new Error(\n `ProtocolDiagnosticBuffer capacity must be positive, got ${capacity}`,\n );\n }\n this.capacity = capacity;\n }\n\n push(diagnostic: ProtocolDiagnostic): void {\n if (this.entries.length >= this.capacity) {\n this.entries.shift();\n }\n this.entries.push(diagnostic);\n }\n\n snapshot(): readonly ProtocolDiagnostic[] {\n return this.entries.slice();\n }\n\n countWithin(windowMs: number, nowMs: number): number {\n const cutoff = nowMs - windowMs;\n let count = 0;\n for (let i = this.entries.length - 1; i >= 0; i -= 1) {\n if (this.entries[i]!.timestampMs >= cutoff) {\n count += 1;\n } else {\n break;\n }\n }\n return count;\n }\n\n clear(): void {\n this.entries.length = 0;\n }\n}\n\nexport function previewLine(line: string): string {\n if (line.length <= MAX_LINE_PREVIEW) return line;\n return line.slice(0, MAX_LINE_PREVIEW) + \"…\";\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 = \"1.0.0-rc.5\";\nexport const ENGINE_VERSION = \"1.0.0-rc.5\";\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface as ReadlineInterface } from \"node:readline\";\nimport { existsSync, accessSync, statSync, constants as fsConstants } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\nimport type { InitializeResult } from \"./proto/types.js\";\nimport { decodeResponse, encodeRequest, extractResult } from \"./proto/codec.js\";\nimport { ENGINE_VERSION, VERSION } from \"./version.js\";\nimport { binaryFilename, cachedEnginePath, downloadEngine } from \"./engine-downloader.js\";\n\nconst ENGINE_BINARY_NAME = \"attest-engine\";\nconst VERSION_PROBE_TIMEOUT_MS = 10_000;\n\n/** A discovered engine does not report the version this SDK requires. */\nexport class EngineVersionMismatchError extends Error {\n readonly enginePath: string;\n readonly source: string;\n readonly found: string | null;\n readonly required: string;\n\n constructor(enginePath: string, source: string, found: string | null, required: string) {\n const reported = found === null ? \"reports no version\" : `reports version ${found}`;\n super(\n `attest-engine at ${enginePath} (from ${source}) ${reported}; ` +\n `this SDK requires attest-engine ${required}. ` +\n \"Point ATTEST_ENGINE_PATH at a matching engine, or remove the mismatched one \" +\n `from PATH so the SDK can download ${required} into ~/.attest/bin/${required}/.`,\n );\n this.name = \"EngineVersionMismatchError\";\n this.enginePath = enginePath;\n this.source = source;\n this.found = found;\n this.required = required;\n }\n}\n\n/**\n * The version `<path> version` reports, or null if it reports none.\n *\n * Every engine since 0.4 answers `version` with `attest-engine <version>`. stdin is\n * closed so a binary that starts the JSON-RPC server instead reads EOF and exits.\n */\nexport function engineVersion(enginePath: string): string | null {\n const proc = spawnSync(enginePath, [\"version\"], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n timeout: VERSION_PROBE_TIMEOUT_MS,\n });\n if (proc.error) throw proc.error;\n const out = proc.stdout.trim();\n const prefix = `${ENGINE_BINARY_NAME} `;\n if (proc.status !== 0 || !out.startsWith(prefix)) return null;\n return out.slice(prefix.length).trim();\n}\n\nfunction onPath(): string | null {\n for (const dir of (process.env[\"PATH\"] ?? \"\").split(delimiter)) {\n if (!dir) continue;\n const candidate = join(dir, binaryFilename());\n try {\n accessSync(candidate, fsConstants.X_OK);\n } catch {\n continue;\n }\n if (statSync(candidate).isFile()) return candidate;\n }\n return null;\n}\n\nfunction requireFile(enginePath: string, label: string): void {\n if (!existsSync(enginePath) || !statSync(enginePath).isFile()) {\n throw new Error(`${label}=${enginePath} does not exist or is not a file.`);\n }\n}\n\nasync function locateEngine(\n explicitPath: string | undefined,\n allowDownload: boolean,\n): Promise<[string, string]> {\n if (explicitPath) {\n requireFile(explicitPath, \"Engine path\");\n return [explicitPath, \"explicit engine path\"];\n }\n const envPath = process.env[\"ATTEST_ENGINE_PATH\"];\n if (envPath) {\n requireFile(envPath, \"ATTEST_ENGINE_PATH\");\n return [envPath, \"ATTEST_ENGINE_PATH\"];\n }\n const found = onPath();\n if (found) return [found, \"PATH\"];\n const cached = cachedEnginePath();\n if (cached) return [cached, \"engine cache\"];\n\n if (!allowDownload) {\n throw new Error(\n `No '${ENGINE_BINARY_NAME}' ${ENGINE_VERSION} in ATTEST_ENGINE_PATH, PATH or ` +\n `~/.attest/bin/${ENGINE_VERSION}/.`,\n );\n }\n\n const noDownload = process.env[\"ATTEST_ENGINE_NO_DOWNLOAD\"]?.toLowerCase();\n if (noDownload === \"1\" || noDownload === \"true\" || noDownload === \"yes\") {\n throw new Error(\n `Cannot find '${ENGINE_BINARY_NAME}' ${ENGINE_VERSION} and ATTEST_ENGINE_NO_DOWNLOAD is set.\\n` +\n \"Install options:\\n\" +\n \" 1. Build from source: make engine, then set ATTEST_ENGINE_PATH\\n\" +\n ` 2. Download release v${ENGINE_VERSION}: https://github.com/attest-framework/attest/releases\\n` +\n \" 3. Allow auto-download by unsetting ATTEST_ENGINE_NO_DOWNLOAD\",\n );\n }\n return [await downloadEngine(), \"download\"];\n}\n\n/**\n * Find an engine whose version matches this SDK and return its path.\n *\n * The single discovery function behind `EngineManager` and the `attest` CLI. Order:\n * explicit path → `ATTEST_ENGINE_PATH` → `attest-engine` on `PATH` →\n * `~/.attest/bin/<ENGINE_VERSION>/` → download (unless `ATTEST_ENGINE_NO_DOWNLOAD` is set or\n * `allowDownload` is false).\n * The first engine found must report exactly `ENGINE_VERSION`; a mismatched engine is\n * never skipped in favor of the next location.\n */\nexport async function resolveEngine(\n explicitPath?: string,\n options: { allowDownload?: boolean } = {},\n): Promise<string> {\n const [enginePath, source] = await locateEngine(explicitPath, options.allowDownload ?? true);\n const found = engineVersion(enginePath);\n if (found !== ENGINE_VERSION) {\n throw new EngineVersionMismatchError(enginePath, source, found, ENGINE_VERSION);\n }\n return enginePath;\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 this.enginePath = await resolveEngine(this.enginePath || undefined);\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 try {\n this.initResult = await this.initialize();\n } catch (err) {\n await this.stop();\n throw err;\n }\n this.initialized = true;\n return this.initResult;\n }\n\n /** Send initialize and check the engine's version and capabilities. */\n private async initialize(): Promise<InitializeResult> {\n const init = (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 })) as InitializeResult;\n if (init.engine_version !== ENGINE_VERSION) {\n throw new EngineVersionMismatchError(\n this.enginePath,\n \"initialize\",\n init.engine_version,\n ENGINE_VERSION,\n );\n }\n if (!init.compatible) {\n throw new Error(`Engine incompatible. Missing capabilities: ${JSON.stringify(init.missing)}`);\n }\n return init;\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\n/**\n * Cache directory for this SDK's engine: `~/.attest/bin/<ENGINE_VERSION>/`.\n *\n * The directory name is the canonical engine version (`1.0.0-rc.N`). The legacy\n * unversioned `~/.attest/bin/attest-engine` is neither read nor modified.\n */\nexport function versionedBinDir(): string {\n return path.join(os.homedir(), \".attest\", \"bin\", ENGINE_VERSION);\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\n/** The engine binary in the versioned cache, or null if it is absent. */\nexport function cachedEnginePath(): string | null {\n const binPath = path.join(versionedBinDir(), binaryFilename());\n return fs.statSync(binPath, { throwIfNoEntry: false })?.isFile() ? binPath : null;\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}${os.platform() === \"win32\" ? \".exe\" : \"\"}`;\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. Retry or download manually.`\n );\n }\n process.stderr.write(`[attest] Checksum verified.\\n`);\n\n // Atomic write: temp file + rename\n const dir = versionedBinDir();\n fs.mkdirSync(dir, { recursive: true });\n const destPath = path.join(dir, binaryFilename());\n const suffix = `${String(process.pid)}.${crypto.randomBytes(8).toString(\"hex\")}`;\n const tmpPath = path.join(dir, `.${binaryFilename()}.tmp.${suffix}`);\n try {\n fs.writeFileSync(tmpPath, data, { flag: \"wx\", mode: 0o755 });\n fs.chmodSync(tmpPath, 0o755);\n fs.renameSync(tmpPath, destPath);\n } catch (err) {\n // EEXIST means the temp name belongs to someone else; leave it alone.\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") fs.rmSync(tmpPath, { force: true });\n throw err;\n }\n\n process.stderr.write(`[attest] Engine installed at ${destPath}\\n`);\n return destPath;\n}\n","let _simulationMode = false;\nlet _sampleRate = 0;\n\n/**\n * Configure global SDK options.\n *\n * @param options.simulation - Enable simulation mode: the engine evaluates\n * layers 1-4 and reports layers 5-6 as not evaluated (reason \"simulation\")\n * without calling any provider. The engine reads `ATTEST_SIMULATION` when it\n * starts; the Vitest fixtures set it from this flag. Equivalent to setting\n * `ATTEST_SIMULATION=1` in the environment.\n * @param options.sampleRate - Sampling rate for continuous evaluation (0.0–1.0).\n * Equivalent to setting `ATTEST_SAMPLE_RATE` in the environment.\n */\nexport function config(options: {\n simulation?: boolean;\n sampleRate?: number;\n}): void {\n if (options.simulation !== undefined) {\n _simulationMode = options.simulation;\n }\n if (options.sampleRate !== undefined) {\n if (options.sampleRate < 0 || options.sampleRate > 1) {\n throw new RangeError(\n `sampleRate must be between 0.0 and 1.0, got ${options.sampleRate}`,\n );\n }\n _sampleRate = options.sampleRate;\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 _simulationMode || simulationEnvEnabled();\n}\n\n/**\n * True when `ATTEST_SIMULATION` is set for this process (and so for an\n * engine it spawns): \"1\", \"true\" or \"yes\", trimmed and case-insensitive.\n */\nexport function simulationEnvEnabled(): boolean {\n const env = (process.env[\"ATTEST_SIMULATION\"] ?? \"\").trim().toLowerCase();\n return env === \"1\" || env === \"true\" || env === \"yes\";\n}\n\n/**\n * Returns the sampling rate for continuous evaluation. Priority:\n * programmatic `config({ sampleRate })` > `ATTEST_SAMPLE_RATE` env var > 0.\n */\nexport function getSampleRate(): number {\n if (_sampleRate > 0) return _sampleRate;\n const env = process.env[\"ATTEST_SAMPLE_RATE\"];\n if (env !== undefined && env !== \"\") {\n const parsed = Number(env);\n if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {\n throw new RangeError(\n `ATTEST_SAMPLE_RATE must be between 0.0 and 1.0, got '${env}'`,\n );\n }\n return parsed;\n }\n return 0;\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 _sampleRate = 0;\n}\n","import type { Usage } from \"./proto/types.js\";\n\nconst INT_FIELDS = [\n \"model_calls\",\n \"judge_calls\",\n \"input_tokens\",\n \"output_tokens\",\n \"cached_tokens\",\n \"unpriced_calls\",\n \"budget_refused\",\n] as const;\nconst USD_FIELDS = [\"cost_usd\", \"retry_cost_usd\"] as const;\n\n/** Usage of an evaluation that made no model calls. */\nexport function zeroUsage(): Usage {\n return {\n model_calls: 0,\n judge_calls: 0,\n input_tokens: 0,\n output_tokens: 0,\n cached_tokens: 0,\n cost_usd: 0,\n retry_cost_usd: 0,\n unpriced_calls: 0,\n budget_refused: 0,\n };\n}\n\n/** Field-wise sum of two usages. */\nexport function addUsage(a: Usage, b: Usage): Usage {\n return {\n model_calls: a.model_calls + b.model_calls,\n judge_calls: a.judge_calls + b.judge_calls,\n input_tokens: a.input_tokens + b.input_tokens,\n output_tokens: a.output_tokens + b.output_tokens,\n cached_tokens: a.cached_tokens + b.cached_tokens,\n cost_usd: a.cost_usd + b.cost_usd,\n retry_cost_usd: a.retry_cost_usd + b.retry_cost_usd,\n unpriced_calls: a.unpriced_calls + b.unpriced_calls,\n budget_refused: a.budget_refused + b.budget_refused,\n };\n}\n\n/** Field-wise sum of any number of usages; zero for none. */\nexport function sumUsage(usages: Iterable<Usage>): Usage {\n let total = zeroUsage();\n for (const u of usages) total = addUsage(total, u);\n return total;\n}\n\n/**\n * Validate the `usage` object of an evaluate_batch result: all nine fields\n * present, non-negative, integers except the two `*_usd` amounts.\n */\nexport function parseUsage(raw: unknown): Usage {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(`evaluate_batch result: usage must be an object, got ${JSON.stringify(raw)}`);\n }\n const obj = raw as Record<string, unknown>;\n const field = (name: string, integer: boolean): number => {\n const v = obj[name];\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < 0 || (integer && !Number.isInteger(v))) {\n const kind = integer ? \"a non-negative integer\" : \"a non-negative number\";\n throw new TypeError(`evaluate_batch result: usage.${name} must be ${kind}, got ${JSON.stringify(v)}`);\n }\n return v;\n };\n const ints = Object.fromEntries(INT_FIELDS.map((f) => [f, field(f, true)])) as Record<\n (typeof INT_FIELDS)[number],\n number\n >;\n const usd = Object.fromEntries(USD_FIELDS.map((f) => [f, field(f, false)])) as Record<\n (typeof USD_FIELDS)[number],\n number\n >;\n return { ...ints, ...usd };\n}\n\n/**\n * \"{model_calls} model calls · {tokens} tokens ({cached} cached) · ${cost} · retry cost ${retry}\",\n * plus refused and unpriced calls when present. Same format as the engine's\n * report.FormatUsage.\n */\nexport function formatUsage(u: Usage): string {\n let line =\n `${u.model_calls} model calls · ${u.input_tokens + u.output_tokens} tokens ` +\n `(${u.cached_tokens} cached) · $${u.cost_usd.toFixed(4)} · retry cost $${u.retry_cost_usd.toFixed(4)}`;\n if (u.budget_refused > 0) line += ` · ${u.budget_refused} calls refused by budget`;\n if (u.unpriced_calls > 0) line += ` · ${u.unpriced_calls} unpriced calls not in $`;\n return line;\n}\n\n/**\n * The run-summary line \"attest usage: …\" when the session made a model call\n * or refused one by budget; undefined otherwise.\n */\nexport function usageSummaryLine(u: Usage): string | undefined {\n if (u.model_calls === 0 && u.budget_refused === 0) return undefined;\n return `attest usage: ${formatUsage(u)}`;\n}\n","import type {\n Assertion,\n BatchBudget,\n BatchContext,\n ConversationMessage,\n DriftReport,\n EvaluateBatchParams,\n EvaluateBatchResult,\n InitializeResult,\n SimulateFaultConfig,\n SimulatePersona,\n Trace,\n AssertionResult,\n} from \"./proto/types.js\";\nimport {\n ProtocolError,\n EngineTimeoutError,\n ProtocolDesyncError,\n} from \"./proto/errors.js\";\nimport {\n decodeResponse,\n encodeRequest,\n extractId,\n extractResult,\n} from \"./proto/codec.js\";\nimport {\n ProtocolDiagnosticBuffer,\n previewLine,\n type ProtocolDiagnostic,\n type ProtocolDiagnosticKind,\n type ProtocolLogger,\n} from \"./proto/diagnostics.js\";\nimport type { EngineManager } from \"./engine-manager.js\";\nimport { isSimulationMode } from \"./config.js\";\nimport { parseUsage } from \"./usage.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_DIAGNOSTIC_BUFFER = 32;\nconst DEFAULT_DESYNC_THRESHOLD = 3;\nconst DEFAULT_DESYNC_WINDOW_MS = 1_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 interface AttestClientOptions {\n /** Logger override. When omitted, warnings only emit if ATTEST_DEBUG_PROTOCOL=1. */\n logger?: ProtocolLogger;\n /** Listener invoked for every protocol diagnostic. */\n onDiagnostic?: (diagnostic: ProtocolDiagnostic) => void;\n /** Diagnostic ring-buffer capacity. Default 32. */\n diagnosticBufferSize?: number;\n /** Number of diagnostics in `desyncWindowMs` that triggers desync rejection. Default 3. */\n desyncThreshold?: number;\n /** Window length for desync detection in milliseconds. Default 1000. */\n desyncWindowMs?: number;\n}\n\nfunction debugProtocolEnabled(): boolean {\n const flag = process.env[\"ATTEST_DEBUG_PROTOCOL\"];\n return flag === \"1\" || flag === \"true\" || flag === \"yes\";\n}\n\nfunction envLoggerDefault(): ProtocolLogger {\n if (debugProtocolEnabled()) {\n return {\n warn: (msg: string, ...args: unknown[]) => console.warn(msg, ...args),\n error: (msg: string, ...args: unknown[]) => console.error(msg, ...args),\n };\n }\n return {\n warn: () => {\n /* silent unless ATTEST_DEBUG_PROTOCOL=1 */\n },\n error: () => {\n /* silent unless ATTEST_DEBUG_PROTOCOL=1 */\n },\n };\n}\n\n/**\n * AttestClient owns request/response correlation over the engine's\n * NDJSON protocol.\n *\n * Desync detection is a one-way latch: once the diagnostic rate breaches\n * `desyncThreshold` within `desyncWindowMs` the client refuses further\n * sends for the lifetime of the instance. There is no reset hook by\n * design — recovery requires constructing a new client over a fresh\n * engine subprocess.\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 private readonly logger: ProtocolLogger;\n private readonly diagnosticBuffer: ProtocolDiagnosticBuffer;\n private readonly diagnosticListeners = new Set<\n (diagnostic: ProtocolDiagnostic) => void\n >();\n private readonly desyncThreshold: number;\n private readonly desyncWindowMs: number;\n private desynced = false;\n\n constructor(engine: EngineManager, options?: AttestClientOptions) {\n this.engine = engine;\n this.logger = options?.logger ?? envLoggerDefault();\n this.diagnosticBuffer = new ProtocolDiagnosticBuffer(\n options?.diagnosticBufferSize ?? DEFAULT_DIAGNOSTIC_BUFFER,\n );\n this.desyncThreshold = options?.desyncThreshold ?? DEFAULT_DESYNC_THRESHOLD;\n this.desyncWindowMs = options?.desyncWindowMs ?? DEFAULT_DESYNC_WINDOW_MS;\n if (options?.onDiagnostic !== undefined) {\n this.diagnosticListeners.add(options.onDiagnostic);\n }\n }\n\n /** Subscribe to protocol diagnostics. Returns an unsubscribe function. */\n onProtocolDiagnostic(\n listener: (diagnostic: ProtocolDiagnostic) => void,\n ): () => void {\n this.diagnosticListeners.add(listener);\n return () => {\n this.diagnosticListeners.delete(listener);\n };\n }\n\n /** Snapshot of the diagnostic ring buffer (most recent last). */\n protocolDiagnostics(): readonly ProtocolDiagnostic[] {\n return this.diagnosticBuffer.snapshot();\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 recordDiagnostic(\n kind: ProtocolDiagnosticKind,\n message: string,\n rawLine: string,\n ): void {\n const diagnostic: ProtocolDiagnostic = {\n kind,\n message,\n rawLine: previewLine(rawLine),\n timestampMs: Date.now(),\n };\n this.diagnosticBuffer.push(diagnostic);\n this.logger.warn(`[attest.protocol] ${kind}: ${message}`);\n for (const listener of this.diagnosticListeners) {\n try {\n listener(diagnostic);\n } catch (err) {\n // Listener bugs must not break the reader or shadow other subscribers.\n this.logger.error(\n `[attest.protocol] diagnostic listener threw: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n this.maybeTriggerDesync(diagnostic.timestampMs);\n }\n\n private maybeTriggerDesync(nowMs: number): void {\n if (this.desynced) return;\n const recent = this.diagnosticBuffer.countWithin(this.desyncWindowMs, nowMs);\n if (recent >= this.desyncThreshold) {\n this.desynced = true;\n const snapshot = this.diagnosticBuffer.snapshot();\n const err = new ProtocolDesyncError(\n `Engine protocol desync: ${recent} unroutable response lines within ${this.desyncWindowMs}ms.`,\n snapshot,\n );\n this.logger.error(`[attest.protocol] ${err.message}`);\n this.failAll(err);\n }\n }\n\n private handleLine(line: string): void {\n let response;\n try {\n response = decodeResponse(line);\n } catch (err) {\n this.handleDecodeFailure(line, err);\n return;\n }\n\n let reqId: number;\n try {\n reqId = extractId(response);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.recordDiagnostic(\"missing_id\", message, line);\n return;\n }\n\n const pending = this.pending.get(reqId);\n if (pending === undefined) {\n this.recordDiagnostic(\n \"unknown_id\",\n `no pending request for id=${reqId}`,\n line,\n );\n return;\n }\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 }\n\n private handleDecodeFailure(line: string, err: unknown): void {\n if (err instanceof ProtocolError) {\n // Try to route a JSON-RPC error response to its waiting request.\n let reqId = -1;\n try {\n const raw = JSON.parse(line.trim()) as Record<string, unknown>;\n const idCandidate = raw[\"id\"];\n if (typeof idCandidate === \"number\" && Number.isFinite(idCandidate)) {\n reqId = idCandidate;\n }\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 return;\n }\n this.recordDiagnostic(\n \"non_routable_error\",\n `engine error code=${err.code} (${err.errorMessage}) had no matching pending id`,\n line,\n );\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const kind = classifyDecodeError(message);\n this.recordDiagnostic(kind, message, line);\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 if (this.desynced) {\n throw new ProtocolDesyncError(\n \"Engine protocol is desynced; AttestClient will not send further requests.\",\n this.diagnosticBuffer.snapshot(),\n );\n }\n\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; budget?: BatchBudget; context?: BatchContext },\n ): Promise<EvaluateBatchResult> {\n // Simulation is decided by the engine: started with ATTEST_SIMULATION\n // set, it evaluates layers 1-4 for real and returns not_evaluated\n // (reason \"simulation\") for layers 5-6. Refuse to send when the running\n // engine did not advertise that mode: it would call real providers.\n if (isSimulationMode()) {\n // EngineManager keeps the initialize result private.\n requireSimulationCapability(this.engine[\"initResult\"]);\n }\n const params: EvaluateBatchParams = {\n trace,\n assertions: [...assertions],\n ...(options?.budget !== undefined ? { budget: options.budget } : {}),\n ...(options?.context !== undefined ? { context: options.context } : {}),\n };\n const raw = (await this.sendRequest(\n \"evaluate_batch\",\n params as unknown as Record<string, unknown>,\n options?.timeout,\n )) as Record<string, unknown>;\n return { ...(raw as unknown as EvaluateBatchResult), usage: parseUsage(raw[\"usage\"]) };\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 async queryDrift(\n assertionId: string,\n windowSize = 50,\n options?: { timeout?: number },\n ): Promise<DriftReport> {\n if (isSimulationMode()) {\n return {\n assertion_id: assertionId,\n mean: 0.0,\n stddev: 0,\n count: 0,\n latest_score: 0.0,\n deviation: 0,\n status: \"no_data\",\n };\n }\n\n const raw = await this.sendRequest(\n \"query_drift\",\n { assertion_id: assertionId, window_size: windowSize },\n options?.timeout,\n );\n return (raw as { report: DriftReport }).report;\n }\n\n async generateUserMessage(\n persona: SimulatePersona,\n conversationHistory: readonly ConversationMessage[],\n faultConfig?: SimulateFaultConfig,\n options?: { timeout?: number },\n ): Promise<string> {\n if (isSimulationMode()) {\n return `[simulation] Hello from ${persona.name}`;\n }\n\n const params: Record<string, unknown> = {\n persona,\n conversation_history: conversationHistory,\n };\n if (faultConfig !== undefined) {\n params.fault_config = faultConfig;\n }\n const raw = await this.sendRequest(\n \"generate_user_message\",\n params,\n options?.timeout,\n );\n return String((raw as { message: string }).message);\n }\n}\n\nfunction classifyDecodeError(message: string): ProtocolDiagnosticKind {\n if (message.startsWith(\"malformed JSON\")) return \"malformed_json\";\n if (message.startsWith(\"expected JSON object\")) return \"non_object_response\";\n if (message.startsWith(\"invalid jsonrpc version\")) return \"invalid_jsonrpc_version\";\n if (message.startsWith(\"empty response line\")) return \"malformed_json\";\n return \"malformed_json\";\n}\n\n/**\n * Throw unless the engine advertised `simulation_mode` at initialize. An\n * engine started without ATTEST_SIMULATION (or older than 1.0) would call\n * real embedding and judge providers in simulation mode.\n */\nexport function requireSimulationCapability(init: InitializeResult | null | undefined): void {\n if (init === null || init === undefined) {\n throw new Error(\"simulation mode: the engine has not been initialized\");\n }\n if (!(init.capabilities ?? []).includes(\"simulation_mode\")) {\n throw new Error(\n `simulation mode is on but attest-engine ${init.engine_version} was not started in ` +\n \"simulation mode (capability 'simulation_mode' missing), so it would call real \" +\n \"providers. Set ATTEST_SIMULATION=1 before the engine starts (the Vitest fixtures do \" +\n \"this for you) and use attest-engine 1.0 or later.\",\n );\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\";\nimport { activeMockRegistry } from \"./simulation/context.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 const mock = activeMockRegistry.getStore()?.get(name);\n let result = options?.result;\n if (mock !== undefined) {\n const mocked = mock(options?.args ?? {});\n if (typeof (mocked as { then?: unknown } | null)?.then === \"function\") {\n throw new Error(`mock for tool '${name}' returned a Promise; mock tools must be synchronous`);\n }\n if (typeof mocked === \"object\" && mocked !== null && !Array.isArray(mocked)) {\n result = mocked as Record<string, unknown>;\n }\n }\n this.steps.push({\n type: STEP_TOOL_CALL,\n name,\n args: options?.args,\n 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 { AsyncLocalStorage } from \"node:async_hooks\";\n\n/** Mock tool implementations active for the current async scope. */\nexport type MockToolFn = (args: Record<string, unknown>) => unknown;\n\nexport const activeMockRegistry = new AsyncLocalStorage<ReadonlyMap<string, MockToolFn>>();\n\n/**\n * Seeded PRNG (mulberry32): the same seed yields the same sequence. An\n * undefined seed uses `Math.random`. Sequences differ from Python's\n * `random.Random`; determinism holds within TS only.\n */\nexport function createRng(seed?: number): () => number {\n if (seed === undefined) return Math.random;\n let state = seed >>> 0;\n return () => {\n state = (state + 0x6d2b79f5) >>> 0;\n let t = state;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { AssertionResult, Trace, Usage } from \"./proto/types.js\";\nimport { zeroUsage } from \"./usage.js\";\nimport {\n STATUS_PASS,\n STATUS_SOFT_FAIL,\n STATUS_HARD_FAIL,\n STATUS_NOT_EVALUATED,\n OUTCOME_FAIL,\n OUTCOME_PASS,\n OUTCOME_SKIP,\n type Outcome,\n} from \"./proto/constants.js\";\n\nconst KNOWN_STATUSES: ReadonlySet<string> = new Set([\n STATUS_PASS,\n STATUS_SOFT_FAIL,\n STATUS_HARD_FAIL,\n STATUS_NOT_EVALUATED,\n]);\n\n/**\n * Normalize an engine result row. Protocol rule: an unknown status is\n * never a pass, so it becomes \"not_evaluated\".\n */\nexport function normalizeAssertionResult(r: AssertionResult): AssertionResult {\n if (KNOWN_STATUSES.has(r.status)) return r;\n return {\n ...r,\n status: STATUS_NOT_EVALUATED,\n explanation: `[unknown status '${r.status}'] ${r.explanation}`,\n };\n}\n\nexport class AgentResult {\n readonly trace: Trace;\n readonly assertionResults: readonly AssertionResult[];\n readonly totalCost: number;\n readonly totalDurationMs: number;\n /** Attest model usage of the evaluation that produced this result. */\n readonly usage: Usage;\n\n constructor(\n trace: Trace,\n assertionResults: readonly AssertionResult[] = [],\n totalCost = 0.0,\n totalDurationMs = 0,\n usage: Usage = zeroUsage(),\n ) {\n this.trace = trace;\n this.assertionResults = assertionResults.map(normalizeAssertionResult);\n this.totalCost = totalCost;\n this.totalDurationMs = totalDurationMs;\n this.usage = usage;\n }\n\n /** True if every assertion has status \"pass\". */\n get passed(): boolean {\n return this.assertionResults.every((r) => r.status === STATUS_PASS);\n }\n\n /**\n * Test outcome after the whole batch. Any hard_fail fails; otherwise any\n * not_evaluated skips (fails when `strict`); otherwise pass, including\n * when only soft_fail rows are present (see `softFailures`).\n */\n outcome(options?: { strict?: boolean }): Outcome {\n if (this.hardFailures.length > 0) return OUTCOME_FAIL;\n if (this.notEvaluated.length > 0) {\n return options?.strict === true ? OUTCOME_FAIL : OUTCOME_SKIP;\n }\n return OUTCOME_PASS;\n }\n\n /** Failed assertions: hard_fail and soft_fail only. */\n get failedAssertions(): readonly AssertionResult[] {\n return this.assertionResults.filter(\n (r) => r.status === STATUS_HARD_FAIL || r.status === STATUS_SOFT_FAIL,\n );\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 /** Assertions the engine did not evaluate; each carries a `reason`. */\n get notEvaluated(): readonly AssertionResult[] {\n return this.assertionResults.filter((r) => r.status === STATUS_NOT_EVALUATED);\n }\n\n /** Count of not_evaluated assertions per reason, in first-seen order. */\n get notEvaluatedReasons(): Readonly<Record<string, number>> {\n const counts: Record<string, number> = {};\n for (const r of this.notEvaluated) {\n const key = r.reason || \"unknown\";\n counts[key] = (counts[key] ?? 0) + 1;\n }\n return counts;\n }\n\n /**\n * Passed / evaluated assertions; null when nothing was evaluated.\n * not_evaluated rows are excluded from the denominator.\n */\n get passRate(): number | null {\n const evaluated = this.assertionResults.length - this.notEvaluated.length;\n return evaluated === 0 ? null : this.passCount / evaluated;\n }\n\n get passCount(): number {\n return this.assertionResults.filter((r) => r.status === STATUS_PASS).length;\n }\n\n /** Number of failed assertions (hard_fail + soft_fail). */\n get failCount(): number {\n return this.failedAssertions.length;\n }\n\n /** \"not evaluated: <reason>[, <reason> ×n ...]\" for skipped tests. */\n skipReason(): string {\n const parts = Object.entries(this.notEvaluatedReasons).map(([reason, n]) =>\n n === 1 ? reason : `${reason} ×${n}`,\n );\n return `not evaluated: ${parts.join(\", \")}`;\n }\n}\n","/**\n * Terminal-grade rendering of Attest assertion failures.\n *\n * Mirrors the Python attest.cli.diagnostics module so PR comments,\n * pytest output, and vitest output show the same fields. Use as the\n * message argument when asserting the verdict, e.g.\n * `expect(result.outcome(), renderDiagnostics(result)).not.toBe(\"fail\")`, so\n * reviewers see trace path, expected vs actual, and judge metadata.\n */\n\nimport type { AssertionResult, JudgeMetadata } from \"./proto/types.js\";\nimport {\n STATUS_HARD_FAIL,\n STATUS_NOT_EVALUATED,\n STATUS_PASS,\n STATUS_SOFT_FAIL,\n} from \"./proto/constants.js\";\nimport type { AgentResult } from \"./result.js\";\n\nconst ANSI_RESET = \"\u001b[0m\";\nconst ANSI_RED = \"\u001b[31m\";\nconst ANSI_YELLOW = \"\u001b[33m\";\nconst ANSI_GREEN = \"\u001b[32m\";\nconst ANSI_DIM = \"\u001b[2m\";\nconst ANSI_BOLD = \"\u001b[1m\";\n\nconst LAYER_NAMES: Record<number, string> = {\n 1: \"schema\",\n 2: \"constraint\",\n 3: \"trace\",\n 4: \"content\",\n 5: \"embedding\",\n 6: \"llm_judge\",\n 7: \"trace_tree\",\n 8: \"plugin\",\n};\n\nfunction layerLabel(layer: number, assertionType: string | undefined): string {\n if (layer === 0 && assertionType) {\n return `L? ${assertionType}`;\n }\n const name = LAYER_NAMES[layer] ?? assertionType ?? \"uncategorized\";\n return `L${layer} ${name}`;\n}\n\nfunction statusGlyph(status: string, color: boolean): string {\n let glyph: string;\n let c: string;\n if (status === STATUS_PASS) {\n glyph = \"PASS\";\n c = ANSI_GREEN;\n } else if (status === STATUS_SOFT_FAIL) {\n glyph = \"SOFT\";\n c = ANSI_YELLOW;\n } else if (status === STATUS_HARD_FAIL) {\n glyph = \"FAIL\";\n c = ANSI_RED;\n } else if (status === STATUS_NOT_EVALUATED) {\n glyph = \"N/E\";\n c = ANSI_DIM;\n } else {\n glyph = status.toUpperCase() || \"????\";\n c = ANSI_DIM;\n }\n return color ? `${c}${glyph}${ANSI_RESET}` : glyph;\n}\n\nfunction bold(s: string, color: boolean): string {\n return color ? `${ANSI_BOLD}${s}${ANSI_RESET}` : s;\n}\n\nfunction dim(s: string, color: boolean): string {\n return color ? `${ANSI_DIM}${s}${ANSI_RESET}` : s;\n}\n\nfunction truncate(value: string, limit = 280): string {\n if (value.length <= limit) {\n return value;\n }\n return value.slice(0, limit - 3) + \"...\";\n}\n\nexport interface RenderOptions {\n /** Emit ANSI colour escapes. Default false (plain text). */\n color?: boolean;\n /** Source location annotation appended after each block. */\n testFile?: string;\n /** Render passing assertions in addition to failures. Default false. */\n includePassing?: boolean;\n}\n\nexport function renderAssertionFailure(\n result: AssertionResult,\n options: RenderOptions = {},\n): string {\n const color = options.color ?? false;\n const testFile = options.testFile;\n const layer = result.layer ?? 0;\n const label = layerLabel(layer, result.type);\n\n const lines: string[] = [];\n lines.push(\n ` ${statusGlyph(result.status, color)} ${bold(result.assertion_id, color)} ${dim(`— ${label}`, color)}`,\n );\n if (result.reason) {\n lines.push(` reason: not evaluated: ${result.reason}`);\n }\n if (result.trace_node_path) {\n lines.push(` trace path: ${result.trace_node_path}`);\n }\n if (result.status !== STATUS_NOT_EVALUATED) {\n lines.push(` score: ${result.score.toFixed(3)}`);\n }\n if (result.expected) {\n lines.push(` expected: ${truncate(result.expected)}`);\n }\n if (result.actual) {\n lines.push(` actual: ${truncate(result.actual)}`);\n }\n if (result.explanation) {\n lines.push(` detail: ${truncate(result.explanation)}`);\n }\n if (result.threshold_source && result.threshold_source !== \"static\") {\n lines.push(` threshold: ${result.threshold_source}`);\n }\n if (result.failure_class) {\n lines.push(` class: ${result.failure_class}`);\n }\n if (result.judge_metadata) {\n appendJudgeMetadata(lines, result.judge_metadata);\n }\n if (result.suggested_action) {\n lines.push(` hint: ${truncate(result.suggested_action)}`);\n }\n if ((result.cost ?? 0) > 0 || (result.duration_ms ?? 0) > 0) {\n const cost = result.cost ?? 0;\n const durMs = result.duration_ms ?? 0;\n lines.push(` cost/lat: $${cost.toFixed(6)} / ${durMs}ms`);\n }\n if (testFile) {\n lines.push(` source: ${testFile}`);\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nfunction appendJudgeMetadata(lines: string[], meta: JudgeMetadata): void {\n if (meta.model) {\n let rubric = meta.rubric_name ?? \"default\";\n if (meta.rubric_version) {\n rubric = `${rubric} @ ${meta.rubric_version}`;\n }\n const judge = meta.provider ? `${meta.provider}/${meta.model}` : meta.model;\n lines.push(` judge: ${judge} / ${rubric}`);\n }\n if (meta.prompt_hash) {\n lines.push(` prompt: #${meta.prompt_hash}`);\n }\n const samples = meta.sample_scores ?? [];\n if (samples.length > 1) {\n const formatted = samples.map((s) => s.toFixed(2)).join(\", \");\n const mean = (meta.score_mean ?? 0).toFixed(2);\n const stddev = (meta.score_stddev ?? 0).toFixed(2);\n const flag = meta.high_variance ? \" ⚠ HIGH VARIANCE\" : \"\";\n lines.push(\n ` samples: [${formatted}] mean=${mean} stddev=${stddev}${flag}`,\n );\n }\n const probes = meta.bias_probes ?? [];\n if (probes.length > 0) {\n const formatted = probes\n .map((p) => `${p.name} Δ${p.delta >= 0 ? \"+\" : \"\"}${p.delta.toFixed(2)}`)\n .join(\", \");\n lines.push(` bias: ${formatted}`);\n }\n if (meta.calibration) {\n const c = meta.calibration;\n lines.push(\n ` calibrated: ${c.label_count} labels, agreement=${c.agreement.toFixed(2)}, κ=${c.cohen_kappa.toFixed(2)}`,\n );\n }\n}\n\nexport function renderSummary(\n result: AgentResult,\n options: { color?: boolean } = {},\n): string {\n const color = options.color ?? false;\n const passN = result.passCount;\n const soft = result.assertionResults.filter(\n (r) => r.status === STATUS_SOFT_FAIL,\n ).length;\n const hard = result.assertionResults.filter(\n (r) => r.status === STATUS_HARD_FAIL,\n ).length;\n const parts = [\n `${statusGlyph(STATUS_PASS, color)} ${passN}`,\n `${statusGlyph(STATUS_SOFT_FAIL, color)} ${soft}`,\n `${statusGlyph(STATUS_HARD_FAIL, color)} ${hard}`,\n `${statusGlyph(STATUS_NOT_EVALUATED, color)} ${result.notEvaluated.length}`,\n `cost $${result.totalCost.toFixed(6)}`,\n `dur ${result.totalDurationMs}ms`,\n ];\n return parts.join(\" | \");\n}\n\nexport function renderDiagnostics(\n result: AgentResult,\n options: RenderOptions = {},\n): string {\n const color = options.color ?? false;\n const includePassing = options.includePassing ?? false;\n const rows = includePassing\n ? result.assertionResults\n : result.assertionResults.filter((r) => r.status !== STATUS_PASS);\n if (rows.length === 0) {\n return dim(\" (no failures)\\n\", color);\n }\n const out: string[] = [\"\"];\n out.push(bold(`Attest diagnostic — ${headerCounts(result)}:`, color));\n for (const r of rows) {\n out.push(renderAssertionFailure(r, options));\n }\n out.push(dim(` Summary: ${renderSummary(result, { color })}`, color));\n return out.join(\"\\n\");\n}\n\n/** \"F of N assertions failed[, K not evaluated]\" — counts failures, not rows. */\nfunction headerCounts(result: AgentResult): string {\n const total = result.assertionResults.length;\n const notEvaluated = result.notEvaluated.length;\n if (result.failCount === 0 && notEvaluated > 0) {\n return `${notEvaluated} of ${total} assertions not evaluated`;\n }\n const text = `${result.failCount} of ${total} assertions failed`;\n return notEvaluated > 0 ? `${text}, ${notEvaluated} not evaluated` : text;\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_EFFECT,\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\ntype TrajectoryMode = \"strict\" | \"unordered\" | \"subset\" | \"superset\";\ntype ArgOperator = \"eq\" | \"ne\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"in\" | \"not_in\";\n\n/**\n * Each effect assertion embeds the world snapshot, and the engine refuses a request line over\n * 10 MiB; 1 MiB of that is left for the rest of the batch.\n */\nexport const MAX_WORLD_BYTES = 9 * 1024 * 1024;\n\n/** A resource's records filtered by exact field values. */\ntype Where = Record<string, unknown>;\n\n/**\n * Effect checks against one world snapshot, from {@link ExpectChain.world}. Each method adds\n * an `effect` assertion (Layer 3) to the parent chain and returns it.\n */\nexport class WorldChecks<C> {\n private readonly _snapshot: Record<string, unknown> | null;\n private readonly _add: (spec: Record<string, unknown>) => C;\n\n constructor(snapshot: Record<string, unknown> | null, add: (spec: Record<string, unknown>) => C) {\n this._snapshot = snapshot;\n this._add = add;\n }\n\n private addCheck(spec: Record<string, unknown>, where: Where | undefined): C {\n const full: Record<string, unknown> = { ...spec, world: this._snapshot };\n if (where !== undefined && Object.keys(where).length > 0) full.where = where;\n return this._add(full);\n }\n\n /**\n * Assert how many records of `resource` match `where`. Give `equals`, or `atMost` and/or\n * `atLeast`. A violation reads `effect violated: 2 refunds for O-1042 (expected 1)`.\n *\n * @throws Error when no bound is given, or `equals` is combined with another bound.\n *\n * @example\n * ```ts\n * expect(trace).world(await world.state()).count(\"refunds\", { equals: 1, where: { order_id: \"O-1042\" } });\n * ```\n */\n count(\n resource: string,\n opts: { equals?: number; atMost?: number; atLeast?: number; where?: Where },\n ): C {\n if (opts.equals === undefined && opts.atMost === undefined && opts.atLeast === undefined) {\n throw new Error(\"count needs equals, atMost or atLeast\");\n }\n if (opts.equals !== undefined && (opts.atMost !== undefined || opts.atLeast !== undefined)) {\n throw new Error(\"count: equals excludes atMost and atLeast\");\n }\n const spec: Record<string, unknown> = { check: \"count\", resource };\n if (opts.equals !== undefined) spec.equals = opts.equals;\n if (opts.atMost !== undefined) spec.at_most = opts.atMost;\n if (opts.atLeast !== undefined) spec.at_least = opts.atLeast;\n return this.addCheck(spec, opts.where);\n }\n\n /** Assert no two matching records share the same values for field(s) `by`. */\n unique(resource: string, opts: { by: string | string[]; where?: Where }): C {\n const fields = typeof opts.by === \"string\" ? [opts.by] : [...opts.by];\n if (fields.length === 0) throw new Error(\"unique needs at least one field in by\");\n return this.addCheck({ check: \"unique\", resource, fields }, opts.where);\n }\n\n /**\n * Assert every matching record carries a distinct value in field `key` (default\n * `idempotency_key`), the record field that stores the idempotency key.\n */\n idempotent(resource: string, opts: { key?: string; where?: Where } = {}): C {\n return this.addCheck(\n { check: \"idempotent\", resource, field: opts.key ?? \"idempotency_key\" },\n opts.where,\n );\n }\n}\n\nexport class ExpectChain {\n private readonly _result: AgentResult;\n private readonly _assertions: Assertion[] = [];\n private _worldBytes = 0;\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 3: Behavior contracts (tool calls only, retries counted) --\n\n /**\n * Assert how many times a tool is called, per value of argument `per` when set.\n *\n * @example\n * ```ts\n * // fails with \"issue_refund called 2× for order_id=O-1042 (max 1)\"\n * expect(result).toolCardinality(\"issue_refund\", { per: \"order_id\", atMost: 1 });\n * ```\n */\n toolCardinality(\n tool: string,\n opts: { per?: string; atMost?: number; atLeast?: number; soft?: boolean },\n ): this {\n if (opts.atMost === undefined && opts.atLeast === undefined) {\n throw new Error(\"toolCardinality needs atMost, atLeast or both\");\n }\n const spec: Record<string, unknown> = { check: \"tool_cardinality\", tool };\n if (opts.per !== undefined) spec.per = opts.per;\n if (opts.atLeast !== undefined) spec.min = opts.atLeast;\n if (opts.atMost !== undefined) spec.max = opts.atMost;\n spec.soft = opts.soft ?? false;\n return this.add(TYPE_TRACE, spec);\n }\n\n /**\n * Assert the tool-call trajectory matches `tools`: `strict` (same sequence,\n * the default), `unordered` (same calls, any order), `subset` (no call\n * outside `tools`) or `superset` (every call in `tools` made). Use\n * {@link trajectoryPartialOrder} for ordering constraints.\n */\n trajectory(tools: string[], opts?: { mode?: TrajectoryMode; soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"trajectory\",\n mode: opts?.mode ?? \"strict\",\n tools,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert every tool in `tools` and `order` is called and each\n * `[before, after]` pair holds as in {@link toolCalledBefore}.\n */\n trajectoryPartialOrder(\n order: Array<[string, string]>,\n opts?: { tools?: string[]; soft?: boolean },\n ): this {\n const spec: Record<string, unknown> = {\n check: \"trajectory\",\n mode: \"partial_order\",\n order: order.map(([before, after]) => [before, after]),\n };\n if (opts?.tools !== undefined) spec.tools = opts.tools;\n spec.soft = opts?.soft ?? false;\n return this.add(TYPE_TRACE, spec);\n }\n\n /** Assert every call to `after` has an earlier call to `before`; holds when `after` is never called. */\n toolCalledBefore(before: string, after: string, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, { check: \"tool_order\", before, after, soft: opts?.soft ?? false });\n }\n\n /** Assert no block of `period` (1–4) tool calls repeats `minRepeats` (default 2) times in a row; A→B→A→B fails period 2. */\n noToolCycles(period: number, opts?: { minRepeats?: number; soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"cycle\",\n period,\n min_repeats: opts?.minRepeats ?? 2,\n soft: opts?.soft ?? false,\n });\n }\n\n /** Assert at most `maxStreak` consecutive tool calls end in error (trace v2). */\n maxToolFailureStreak(maxStreak: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, { check: \"failure_streak\", max: maxStreak, soft: opts?.soft ?? false });\n }\n\n /**\n * Assert every call to `tool` has argument `arg` (a dot path) satisfying\n * `op value`; holds when `tool` is never called.\n */\n toolArgSatisfies(\n tool: string,\n arg: string,\n op: ArgOperator,\n value: unknown,\n opts?: { soft?: boolean },\n ): this {\n return this.add(TYPE_TRACE, {\n check: \"arg_predicate\",\n tool,\n arg,\n op,\n value,\n soft: opts?.soft ?? false,\n });\n }\n\n // -- Layer 3: Effect checks (the external system the agent acted on) --\n\n /**\n * Check effects in a world snapshot:\n * `expect(trace).world(await world.state()).count(...)`. `null` means the test ran without\n * a world helper: the checks are `not_evaluated` (`missing_evidence`).\n */\n world(snapshot: Record<string, unknown> | null): WorldChecks<this> {\n const size = new TextEncoder().encode(JSON.stringify(snapshot)).length;\n return new WorldChecks<this>(snapshot, (spec) => {\n this._worldBytes += size;\n if (this._worldBytes > MAX_WORLD_BYTES) {\n throw new Error(\n `effect checks would send the ${size}-byte world snapshot ` +\n `${Math.floor(this._worldBytes / Math.max(size, 1))} times (${this._worldBytes} bytes), ` +\n `over the ${MAX_WORLD_BYTES}-byte limit of one request; use fewer checks per test ` +\n `or scope the world to less state`,\n );\n }\n return this.add(TYPE_EFFECT, spec);\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 | \"dynamic\"; 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 | \"dynamic\"; 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","/**\n * Capture: turn a run into a verified fixture, and fixtures into tests.\n *\n * `attest capture --name <name> -- <command>` (the engine) records a run's trace and model\n * exchanges into `tests/attest/fixtures/<name>.attest.json`. This module is the TypeScript\n * side:\n *\n * - `record()` captures the code in a callback in this process.\n * - `loadFixture()` reads a fixture (`proto/attest/v1/fixture-v1.schema.json`).\n * - `emitVitest()` writes the fixture's drafted contracts as a Vitest file, using the\n * `attestExpect()` DSL. `attest capture` and `record()` call it.\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolveEngine } from \"./engine-manager.js\";\nimport type { Trace } from \"./proto/types.js\";\n\nexport const FIXTURE_VERSION = 1;\nexport const DEFAULT_FIXTURE_DIR = path.join(\"tests\", \"attest\", \"fixtures\");\n\n/** A capture did not produce a fixture, or produced one that is not verified. */\nexport class CaptureError extends Error {\n /** The fixture written, when the engine wrote one. */\n readonly fixture: string | null;\n\n constructor(message: string, fixture: string | null = null) {\n super(message);\n this.name = \"CaptureError\";\n this.fixture = fixture;\n }\n}\n\n/** A drafted contract: an engine assertion spec plus its id and description. */\nexport interface Contract {\n id: string;\n kind: string;\n description: string;\n type: string;\n spec: Record<string, unknown>;\n}\n\n/** A contract's status on the captured trace. */\nexport interface ContractResult {\n contract: string;\n status: string;\n explanation: string;\n}\n\n/** A capture fixture (fixture-v1). */\nexport interface Fixture {\n name: string;\n source: { kind: string; replay_capable: boolean; command?: string[]; exit_code?: number };\n trace: Trace;\n exchanges: Record<string, unknown>[];\n contracts: Contract[];\n verification: {\n verified: boolean;\n expect_fail: boolean;\n trace_check: { ok: boolean; errors: number; warnings: number };\n results: ContractResult[];\n expected_failures: string[];\n };\n world: Record<string, unknown> | null;\n}\n\nfunction toPath(p: string | URL): string {\n return p instanceof URL ? fileURLToPath(p) : p;\n}\n\n/** Read a capture fixture written by `attest capture` or `record()`. */\nexport function loadFixture(file: string | URL): Fixture {\n const p = toPath(file);\n const doc = JSON.parse(fs.readFileSync(p, \"utf8\")) as unknown;\n if (!isObject(doc) || doc[\"fixture_version\"] !== FIXTURE_VERSION) {\n throw new CaptureError(`${p}: not a fixture_version ${FIXTURE_VERSION} capture fixture`);\n }\n validate(p, doc);\n return doc as unknown as Fixture;\n}\n\n/** Fixture names, as the engine accepts them (they become file names). */\nexport const NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;\n\ntype Kind = \"string\" | \"boolean\" | \"object\" | \"array\";\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction kindOf(v: unknown): Kind | \"other\" {\n if (Array.isArray(v)) return \"array\";\n if (isObject(v)) return \"object\";\n if (typeof v === \"string\" || typeof v === \"boolean\") return typeof v as Kind;\n return \"other\";\n}\n\n/** Check the fixture-v1 fields this module reads before using any of them. */\nfunction validate(p: string, doc: Record<string, unknown>): void {\n const need = (where: string, obj: unknown, fields: Record<string, Kind>): Record<string, unknown> => {\n if (!isObject(obj)) throw new CaptureError(`${p}: ${where} is not an object`);\n for (const [key, kind] of Object.entries(fields)) {\n if (kindOf(obj[key]) !== kind) throw new CaptureError(`${p}: ${where}.${key} is missing or not a ${kind}`);\n }\n return obj;\n };\n need(\"fixture\", doc, { name: \"string\", source: \"object\", trace: \"object\", exchanges: \"array\", contracts: \"array\", verification: \"object\" });\n if (!(\"world\" in doc)) throw new CaptureError(`${p}: fixture.world is missing`);\n if (!NAME_PATTERN.test(doc[\"name\"] as string)) {\n throw new CaptureError(`${p}: fixture name ${JSON.stringify(doc[\"name\"])} is not a valid fixture name`);\n }\n const v = need(\"fixture.verification\", doc[\"verification\"], {\n verified: \"boolean\",\n expect_fail: \"boolean\",\n results: \"array\",\n expected_failures: \"array\",\n });\n (doc[\"contracts\"] as unknown[]).forEach((c, i) =>\n need(`fixture.contracts[${i}]`, c, { id: \"string\", kind: \"string\", description: \"string\", type: \"string\", spec: \"object\" }),\n );\n (v[\"results\"] as unknown[]).forEach((r, i) =>\n need(`fixture.verification.results[${i}]`, r, { contract: \"string\", status: \"string\", explanation: \"string\" }),\n );\n}\n\n// ---------------------------------------------------------------------------- emitter\n\n/**\n * An object-literal key for `k`. `__proto__` must be a computed key: written plain or\n * quoted it sets the object's prototype instead of a property.\n */\nfunction objectKey(k: string): string {\n if (k === \"__proto__\") return `[${JSON.stringify(k)}]`;\n return /^[A-Za-z_$][\\w$]*$/.test(k) ? k : JSON.stringify(k);\n}\n\n/** Make captured text safe inside a `//` comment: one line, no control characters. */\nfunction comment(text: string): string {\n return text.replace(/[\\p{Cc}\\p{Zl}\\p{Zp}]/gu, \" \");\n}\n\n/** Render a JSON value as a TypeScript literal. */\nfunction ts(value: unknown): string {\n if (value === null || typeof value === \"boolean\" || typeof value === \"number\") {\n return JSON.stringify(value);\n }\n if (typeof value === \"string\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(ts).join(\", \")}]`;\n if (typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>).map(\n ([k, v]) => `${objectKey(k)}: ${ts(v)}`,\n );\n return entries.length === 0 ? \"{}\" : `{ ${entries.join(\", \")} }`;\n }\n throw new Error(`value ${String(value)} has no literal`);\n}\n\nfunction str(spec: Record<string, unknown>, key: string): string {\n const v = spec[key];\n if (typeof v !== \"string\") throw new Error(`missing ${key}`);\n return v;\n}\n\nfunction options(entries: Array<[string, unknown]>): string {\n const set = entries.filter(([, v]) => v !== undefined && v !== null && v !== false);\n return set.length === 0 ? \"\" : `{ ${set.map(([k, v]) => `${k}: ${ts(v)}`).join(\", \")} }`;\n}\n\nfunction call(method: string, args: string[], opts: string): string {\n return `.${method}(${[...args, ...(opts ? [opts] : [])].join(\", \")})`;\n}\n\n/** The `ExpectChain` method call that emits `contract`'s spec; throws when there is none. */\nexport function dslCall(contract: Contract): string {\n const s = contract.spec;\n const soft = s[\"soft\"] === true ? true : undefined;\n try {\n if (contract.type === \"trace\") {\n const check = s[\"check\"];\n if (check === \"trajectory\" && s[\"mode\"] !== \"partial_order\") {\n const mode = s[\"mode\"] === \"strict\" || s[\"mode\"] === undefined ? undefined : s[\"mode\"];\n if (!Array.isArray(s[\"tools\"])) throw new Error(\"missing tools\");\n return call(\"trajectory\", [ts(s[\"tools\"])], options([[\"mode\", mode], [\"soft\", soft]]));\n }\n if (check === \"tool_order\") {\n return call(\"toolCalledBefore\", [ts(str(s, \"before\")), ts(str(s, \"after\"))], options([[\"soft\", soft]]));\n }\n if (check === \"tool_cardinality\") {\n return call(\n \"toolCardinality\",\n [ts(str(s, \"tool\"))],\n options([\n [\"per\", s[\"per\"]],\n [\"atLeast\", s[\"min\"]],\n [\"atMost\", s[\"max\"]],\n [\"soft\", soft],\n ]),\n );\n }\n }\n if (contract.type === \"schema\" && s[\"target\"] === \"output.structured\") {\n if (typeof s[\"schema\"] !== \"object\" || s[\"schema\"] === null) throw new Error(\"missing schema\");\n return call(\"outputMatchesSchema\", [ts(s[\"schema\"])], \"\");\n }\n if (contract.type === \"constraint\" && s[\"field\"] === \"metadata.cost_usd\" && s[\"operator\"] === \"lte\") {\n if (typeof s[\"value\"] !== \"number\") throw new Error(\"missing value\");\n return call(\"costUnder\", [ts(s[\"value\"])], options([[\"soft\", soft]]));\n }\n } catch (err) {\n throw new Error(`contract ${contract.id}: malformed spec (${(err as Error).message})`);\n }\n throw new Error(`contract ${contract.id}: no TypeScript DSL call for ${contract.type} spec`);\n}\n\n/**\n * Where the drafted test for a fixture goes: `tests/attest/<name>.test.ts` for\n * `tests/attest/fixtures/<name>.attest.json`.\n */\nexport function testPathFor(fixturePath: string): string {\n const name = path.basename(fixturePath).replace(/\\.attest\\.json$/, \"\");\n return path.join(path.dirname(path.dirname(fixturePath)), `${name}.test.ts`);\n}\n\n/**\n * Render a fixture's drafted contracts as a Vitest module.\n *\n * A verified fixture becomes a test that enforces every contract with `evaluate`. An\n * incident reproduction (`expect_fail`) becomes a test that checks, with `inspect`, that\n * the expected failures still fail and the other contracts still pass; it stays green\n * while it reproduces the incident.\n */\nexport function renderVitest(fixture: Fixture, fixturePath: string, testPath: string): string {\n const calls: Array<[Contract, string]> = [];\n const skipped: string[] = [];\n for (const c of fixture.contracts) {\n try {\n calls.push([c, dslCall(c)]);\n } catch (err) {\n skipped.push((err as Error).message);\n }\n }\n const rel = path.relative(path.dirname(testPath), fixturePath).split(path.sep).join(\"/\");\n const status = new Map(fixture.verification.results.map((r) => [r.contract, r.status]));\n const expectFail = fixture.verification.expect_fail;\n\n const lines = [\n `// Contracts drafted by \\`attest capture\\` from fixture ${comment(ts(fixture.name))}.`,\n \"//\",\n \"// Review and edit before committing: they check the captured trace without running\",\n \"// the agent. Re-capturing does not overwrite this file.\",\n `import { attestExpect, loadFixture, type ExpectChain } from \"@attest-ai/core\";`,\n `import { ${expectFail ? \"inspect\" : \"evaluate\"} } from \"@attest-ai/vitest\";`,\n `import { describe, ${expectFail ? \"expect, \" : \"\"}it } from \"vitest\";`,\n \"\",\n `const FIXTURE = loadFixture(new URL(${ts(rel.startsWith(\".\") ? rel : `./${rel}`)}, import.meta.url));`,\n ];\n if (skipped.length > 0) {\n lines.push(\"\", \"// Drafted contracts without a TypeScript DSL call (left out):\");\n for (const s of skipped) lines.push(`// - ${comment(s)}`);\n }\n lines.push(\"\", \"function contracts(): ExpectChain {\", \" return attestExpect(FIXTURE.trace)\");\n for (const [c, dsl] of calls) {\n lines.push(` // ${comment(`${c.id}: ${c.description}`)}`, ` ${dsl}`);\n }\n lines[lines.length - 1] += \";\";\n lines.push(\"}\");\n if (expectFail) {\n lines.push(\"\", \"// Status of each contract on the captured incident, in contracts() order.\");\n lines.push(\"const EXPECTED: Array<[string, string]> = [\");\n for (const [c] of calls) lines.push(` [${ts(c.id)}, ${ts(status.get(c.id) ?? \"pass\")}],`);\n lines.push(\n \"];\",\n \"\",\n `describe(${ts(fixture.name)}, () => {`,\n ` it(\"reproduces the incident\", async () => {`,\n \" const result = await inspect(contracts());\",\n \"\",\n \" expect(result.assertionResults.map((row) => row.status)).toEqual(EXPECTED.map(([, s]) => s));\",\n \" });\",\n \"});\",\n );\n } else {\n lines.push(\n \"\",\n `describe(${ts(fixture.name)}, () => {`,\n ` it(\"keeps its drafted contracts\", async () => {`,\n \" await evaluate(contracts());\",\n \" });\",\n \"});\",\n );\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Write the drafted Vitest file for a fixture unless it already exists. Returns the path\n * written, or null when a test file is already there (re-capturing never overwrites an\n * edited test).\n */\nexport function emitVitest(fixturePath: string): string | null {\n const testPath = testPathFor(fixturePath);\n const existing = fs.lstatSync(testPath, { throwIfNoEntry: false });\n if (existing?.isSymbolicLink()) {\n throw new CaptureError(`${testPath} is a symbolic link; refusing to draft a test through it`);\n }\n if (existing !== undefined) return null;\n const source = renderVitest(loadFixture(fixturePath), fixturePath, testPath);\n fs.mkdirSync(path.dirname(testPath), { recursive: true });\n // Create exclusively: \"wx\" fails on any existing path, a link planted after\n // the check included, and never writes through it.\n try {\n fs.writeFileSync(testPath, source, { encoding: \"utf8\", flag: \"wx\" });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw new CaptureError(`${testPath} appeared while drafting; left unchanged`);\n }\n throw err;\n }\n return testPath;\n}\n\n// ---------------------------------------------------------------------------- record()\n\n/** A running in-process capture. */\nexport interface Capture {\n name: string;\n /** The variables `record()` set in `process.env` for the callback. */\n env: Record<string, string>;\n}\n\nexport interface RecordOptions {\n /** Fixture directory (default `tests/attest/fixtures`). */\n outDir?: string;\n /** Save an incident reproduction: verified when drafted contracts fail. */\n expectFail?: boolean;\n /** Trace `agent_id` (default: the first turn's agent name). */\n agentId?: string;\n /** Write the drafted Vitest file (default true). */\n emitTest?: boolean;\n /** Engine binary (default: the SDK's engine discovery). */\n enginePath?: string;\n /**\n * A `world.yaml` to host for the callback (the engine's `--world`): its base URL variable\n * (`PAYMENTS_BASE_URL`) is set for the callback and the world's final state is saved in\n * the fixture's `world` section.\n */\n world?: string;\n /**\n * Called after the callback returns and before the fixture is built; pass the tracer\n * provider's `forceFlush` so batched spans reach the receiver.\n */\n flush?: () => unknown;\n}\n\nexport interface RecordResult<T> {\n value: T;\n fixture: string;\n verified: boolean;\n testFile: string | null;\n}\n\ninterface ServeExit {\n code: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n}\n\ninterface ServeProcess {\n ready: Promise<string | null>;\n finish(finalize: boolean): Promise<ServeExit>;\n}\n\nfunction serve(engine: string, args: string[]): ServeProcess {\n const child = spawn(engine, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n let resolveReady: (line: string | null) => void = () => undefined;\n const ready = new Promise<string | null>((resolve) => {\n resolveReady = resolve;\n });\n const exited = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) => {\n child.on(\"close\", (code, signal) => {\n resolveReady(null);\n resolve({ code, signal });\n });\n child.on(\"error\", (err) => {\n stderr += err.message;\n resolveReady(null);\n resolve({ code: null, signal: null });\n });\n });\n child.stdout.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stdout += chunk;\n const nl = stdout.indexOf(\"\\n\");\n if (nl >= 0) resolveReady(stdout.slice(0, nl));\n });\n child.stderr.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n // An engine that already exited cannot take \"finalize\"; its exit still says why.\n child.stdin.on(\"error\", () => undefined);\n return {\n ready,\n async finish(finalize) {\n // The environment as it is now: secrets the callback loaded (a dotenv\n // file, for example) are redacted too.\n if (finalize) {\n const environ = Object.entries(process.env).flatMap(([k, v]) => (v === undefined ? [] : [`${k}=${v}`]));\n child.stdin.write(`${JSON.stringify({ finalize: true, environ })}\\n`);\n }\n child.stdin.end();\n const { code, signal } = await exited;\n return { code, signal, stdout, stderr };\n },\n };\n}\n\nfunction readyEnv(line: string | null): Record<string, string> | null {\n if (line === null) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return null;\n }\n const env = (parsed as { env?: unknown } | null)?.env;\n if (typeof env !== \"object\" || env === null) return null;\n const entries = Object.entries(env);\n if (!entries.every(([, v]) => typeof v === \"string\")) return null;\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\nfunction exitDetail(exit: ServeExit): string {\n const how = exit.signal !== null ? `killed by ${exit.signal}` : `exit ${String(exit.code)}`;\n const err = exit.stderr.trim();\n return err ? `${how}: ${err}` : how;\n}\n\nfunction restore(saved: Map<string, string | undefined>): void {\n for (const [k, v] of saved) {\n if (v === undefined) delete process.env[k];\n else process.env[k] = v;\n }\n}\n\n// record() sets process-wide environment variables, so a second concurrent capture\n// would save and later restore the first one's values.\nlet recording = false;\n\n/**\n * Capture `fn` as fixture `<outDir>/<name>.attest.json`.\n *\n * Starts `attest-engine capture --serve`, which hosts the recording proxy and the\n * OTLP/HTTP receiver on 127.0.0.1, and sets `OPENAI_BASE_URL`, `ANTHROPIC_BASE_URL` and\n * `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` while `fn` runs. Model clients and the\n * OpenTelemetry exporter read these when they are constructed, so construct them inside\n * `fn`, and pass the tracer provider's `forceFlush` as `flush`. Afterwards the variables\n * are restored and the engine writes the fixture; for a verified fixture with `emitTest`\n * the drafted Vitest file is written unless one exists. If `fn` throws, the capture is\n * abandoned and no fixture is written. Captures cannot overlap.\n *\n * @throws CaptureError when another capture is running, the engine writes no fixture,\n * or the fixture is not verified (its drafted contracts did not hold; the fixture is\n * still written and no test is drafted).\n */\nexport async function record<T>(\n name: string,\n fn: (capture: Capture) => T | Promise<T>,\n opts: RecordOptions = {},\n): Promise<RecordResult<T>> {\n if (recording) throw new CaptureError(\"record() is already running; captures cannot overlap\");\n recording = true;\n try {\n return await recordExclusive(name, fn, opts);\n } finally {\n recording = false;\n }\n}\n\nasync function recordExclusive<T>(\n name: string,\n fn: (capture: Capture) => T | Promise<T>,\n opts: RecordOptions,\n): Promise<RecordResult<T>> {\n const engine = await resolveEngine(opts.enginePath);\n const args = [\"capture\", \"--serve\", \"--name\", name, \"--out-dir\", opts.outDir ?? DEFAULT_FIXTURE_DIR];\n if (opts.expectFail) args.push(\"--expect-fail\");\n if (opts.agentId !== undefined) args.push(\"--agent-id\", opts.agentId);\n if (opts.world !== undefined) args.push(\"--world\", path.resolve(opts.world));\n const proc = serve(engine, args);\n const env = readyEnv(await proc.ready);\n if (env === null) {\n const exit = await proc.finish(false);\n throw new CaptureError(`attest-engine capture --serve did not start (${exitDetail(exit)})`);\n }\n const saved = new Map(Object.keys(env).map((k) => [k, process.env[k]]));\n Object.assign(process.env, env);\n let value: T;\n try {\n value = await fn({ name, env });\n if (opts.flush) await opts.flush();\n } catch (err) {\n restore(saved);\n await proc.finish(false);\n throw err;\n }\n restore(saved);\n const exit = await proc.finish(true);\n process.stderr.write(exit.stderr);\n const lines = exit.stdout.trim().split(\"\\n\");\n if (lines.length < 2) {\n throw new CaptureError(`capture ${name} wrote no fixture (${exitDetail(exit)})`);\n }\n const outcome = JSON.parse(lines[lines.length - 1] ?? \"\") as { fixture: string; verified: boolean };\n if (exit.code !== 0 || !outcome.verified) {\n throw new CaptureError(`capture ${name}: fixture ${outcome.fixture} is not verified; no test drafted`, outcome.fixture);\n }\n const testFile = opts.emitTest === false ? null : emitVitest(outcome.fixture);\n return { value, fixture: outcome.fixture, verified: true, testFile };\n}\n","/**\n * Replay: run the agent's real code with model responses served from a fixture.\n *\n * `startReplay(name)` starts `attest-engine replay --serve`, which hosts the replay\n * proxy on 127.0.0.1, and sets `OPENAI_BASE_URL`, `ANTHROPIC_BASE_URL` and\n * `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` until `finish()`. The proxy answers every model\n * request from `<fixturesDir>/<name>.attest.json` and makes no provider call. A request\n * that matches no recording is a miss; `finish()` returns the engine's summary.\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { DEFAULT_FIXTURE_DIR, NAME_PATTERN } from \"./capture.js\";\nimport { egressBlockRequested, egressGuardActive } from \"./egress.js\";\nimport { resolveEngine } from \"./engine-manager.js\";\n\nexport type ReplayMode = \"strict\" | \"auto\";\nexport type ReplayModeSetting = ReplayMode | \"off\";\n\n/** One request the agent made during the replay. */\nexport interface ReplayRecord {\n seq: number;\n provider: string;\n api: string;\n outcome: \"replayed\" | \"live\" | \"miss\";\n exchange?: number;\n message?: string;\n}\n\n/** What the replay session served, as the engine reports it. */\nexport interface ReplaySummary {\n fixture: string;\n mode: ReplayMode;\n replayed: number;\n live: number;\n misses: number;\n unused: number;\n live_cost_usd: number;\n unpriced_live_calls: number;\n records: ReplayRecord[];\n}\n\n/** A strict-mode replay request matched no recording. `message` is the engine's miss message. */\nexport class ReplayMissError extends Error {\n constructor(\n message: string,\n readonly summary: ReplaySummary,\n ) {\n super(message);\n this.name = \"ReplayMissError\";\n }\n}\n\n/** An auto-mode replay request matched no recording and no provider key was set: `not_evaluated: replay_miss`. */\nexport class ReplayNotEvaluatedError extends Error {\n constructor(\n message: string,\n readonly summary: ReplaySummary,\n ) {\n super(message);\n this.name = \"ReplayNotEvaluatedError\";\n }\n}\n\n/** Escape control and format characters (Unicode Cc, Cf; newlines, ESC) as \\uXXXX. */\nexport function escapeControl(text: string): string {\n return text.replace(/[\\p{Cc}\\p{Cf}]/gu, (c) => `\\\\u${(c.codePointAt(0) ?? 0).toString(16).padStart(4, \"0\")}`);\n}\n\nexport class ReplayError extends Error {\n constructor(message: string) {\n super(escapeControl(message));\n this.name = \"ReplayError\";\n }\n}\n\nexport interface ReplayOptions {\n /** Fixture directory (default `tests/attest/fixtures`). */\n fixturesDir?: string;\n /** `strict`, `auto` or `off`; default per `resolveMode`. `off` starts nothing. */\n mode?: ReplayModeSetting;\n /**\n * Pass `--no-live` to the engine: no miss is forwarded live. Default: `ATTEST_EGRESS=block`.\n * An installed egress guard always implies it.\n */\n noLive?: boolean;\n /** Engine binary (default: the SDK's engine discovery). */\n enginePath?: string;\n}\n\nexport interface ReplaySession {\n readonly name: string;\n readonly mode: ReplayModeSetting;\n /** The variables the session set in `process.env`. */\n readonly env: Record<string, string>;\n /** The summary once `finish()` has run, else `null`. */\n readonly summary: ReplaySummary | null;\n /** Stop the engine, restore the environment and return the summary (`null` for `off`). Idempotent. */\n finish(): Promise<ReplaySummary | null>;\n /** The error a miss raises (valid after `finish()`): strict => miss, auto => not evaluated. */\n error(): ReplayMissError | ReplayNotEvaluatedError | null;\n /** `finish()`, then throw `error()` if any. */\n check(): Promise<void>;\n}\n\n/**\n * Replay mode from `explicit`, else `ATTEST_REPLAY` (`strict|auto|off`), else `strict`\n * when `CI` is set, else `auto`.\n */\nexport function resolveMode(\n explicit?: ReplayModeSetting,\n env: NodeJS.ProcessEnv = process.env,\n): ReplayModeSetting {\n if (explicit !== undefined) return checkMode(explicit, \"mode\");\n const fromEnv = (env.ATTEST_REPLAY ?? \"\").trim().toLowerCase();\n if (fromEnv !== \"\") return checkMode(fromEnv, \"ATTEST_REPLAY\");\n const ci = (env.CI ?? \"\").trim().toLowerCase();\n return ci !== \"\" && ci !== \"false\" && ci !== \"0\" ? \"strict\" : \"auto\";\n}\n\nfunction checkMode(value: string, where: string): ReplayModeSetting {\n if (value === \"strict\" || value === \"auto\" || value === \"off\") return value;\n throw new ReplayError(`${where} must be strict, auto or off, got ${JSON.stringify(value)}`);\n}\n\n// startReplay() sets process-wide environment variables, so sessions cannot overlap.\nlet active: string | null = null;\n\n/** Start a replay session for fixture `name`. Sessions cannot overlap. */\nexport async function startReplay(name: string, opts: ReplayOptions = {}): Promise<ReplaySession> {\n if (!NAME_PATTERN.test(name)) throw new ReplayError(`invalid fixture name ${JSON.stringify(name)}`);\n const resolved = resolveMode(opts.mode);\n if (resolved === \"off\") return offSession(name);\n const mode: ReplayMode = resolved;\n if (active !== null) throw new ReplayError(`replay of ${active} is already running; sessions cannot overlap`);\n active = name;\n try {\n return await start(name, mode, opts);\n } catch (err) {\n active = null;\n throw err;\n }\n}\n\nfunction offSession(name: string): ReplaySession {\n return {\n name,\n mode: \"off\",\n env: {},\n summary: null,\n finish: () => Promise.resolve(null),\n error: () => null,\n check: () => Promise.resolve(),\n };\n}\n\nfunction missError(mode: ReplayMode, summary: ReplaySummary): ReplayMissError | ReplayNotEvaluatedError | null {\n if (summary.misses === 0) return null;\n const message = escapeControl(firstMiss(summary) ?? \"replay miss\");\n return mode === \"auto\" ? new ReplayNotEvaluatedError(message, summary) : new ReplayMissError(message, summary);\n}\n\nasync function start(name: string, mode: ReplayMode, opts: ReplayOptions): Promise<ReplaySession> {\n const engine = await resolveEngine(opts.enginePath);\n const fixturesDir = path.resolve(opts.fixturesDir ?? DEFAULT_FIXTURE_DIR);\n const blocking = egressGuardActive() || (opts.noLive ?? egressBlockRequested());\n const args = [\"replay\", \"--serve\", \"--name\", name, \"--fixtures-dir\", fixturesDir, \"--mode\", mode];\n if (blocking) args.push(\"--no-live\");\n const child = spawn(engine, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n let resolveReady: (line: string | null) => void = () => undefined;\n const ready = new Promise<string | null>((resolve) => {\n resolveReady = resolve;\n });\n const exited = new Promise<number | null>((resolve) => {\n child.on(\"close\", (code) => {\n resolveReady(null);\n resolve(code);\n });\n child.on(\"error\", (err) => {\n stderr += err.message;\n resolveReady(null);\n resolve(null);\n });\n });\n child.stdout.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stdout += chunk;\n const nl = stdout.indexOf(\"\\n\");\n if (nl >= 0) resolveReady(stdout.slice(0, nl));\n });\n child.stderr.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.stdin.on(\"error\", () => undefined);\n\n const stop = async (): Promise<{ code: number | null; stdout: string; stderr: string }> => {\n child.stdin.write(\"stop\\n\");\n child.stdin.end();\n return { code: await exited, stdout, stderr };\n };\n\n const env = parseEnv(await ready);\n if (env === null) {\n const out = await stop();\n active = null;\n throw new ReplayError(`attest-engine replay --serve did not start: ${out.stderr.trim() || `exit ${String(out.code)}`}`);\n }\n const saved = new Map<string, string | undefined>(Object.keys(env).map((k) => [k, process.env[k]]));\n Object.assign(process.env, env);\n\n let summary: ReplaySummary | null = null;\n let finishing: Promise<ReplaySummary> | null = null;\n const finish = (): Promise<ReplaySummary> => {\n finishing ??= (async () => {\n for (const [k, v] of saved) {\n if (v === undefined) delete process.env[k];\n else process.env[k] = v;\n }\n const out = await stop();\n active = null;\n const parsed = parseSummary(out.stdout);\n if (parsed === null) {\n throw new ReplayError(`replay ${name} wrote no summary (exit ${String(out.code)}): ${out.stderr.trim()}`);\n }\n if (blocking && parsed.live > 0) {\n throw new ReplayError(\n `replay ${name}: ${String(parsed.live)} live model calls while the egress guard is blocking`,\n );\n }\n summary = parsed;\n return parsed;\n })();\n return finishing;\n };\n return {\n name,\n mode,\n env,\n get summary() {\n return summary;\n },\n finish,\n error: () => (summary === null ? null : missError(mode, summary)),\n check: async () => {\n await finish();\n const err = summary === null ? null : missError(mode, summary);\n if (err !== null) throw err;\n },\n };\n}\n\nexport function parseEnv(line: string | null): Record<string, string> | null {\n if (line === null) return null;\n try {\n const env = (JSON.parse(line) as { env?: unknown }).env;\n if (typeof env !== \"object\" || env === null) return null;\n const entries = Object.entries(env);\n if (!entries.every(([, v]) => typeof v === \"string\")) return null;\n return Object.fromEntries(entries) as Record<string, string>;\n } catch {\n return null;\n }\n}\n\nfunction parseSummary(out: string): ReplaySummary | null {\n const lines = out.trim().split(\"\\n\");\n try {\n const s = (JSON.parse(lines[lines.length - 1] ?? \"\") as { summary?: ReplaySummary }).summary;\n if (s === undefined || !Array.isArray(s.records)) return null;\n for (const r of s.records) if (r.message !== undefined) r.message = escapeControl(r.message);\n return s;\n } catch {\n return null;\n }\n}\n\n/** The first miss message of a summary, or `null`. */\nexport function firstMiss(summary: ReplaySummary): string | null {\n return summary.records.find((r) => r.outcome === \"miss\")?.message ?? null;\n}\n\n/** `N live model calls · $X.XX`, plus ` (+N unpriced)`. */\nexport function liveLine(live: number, costUsd: number, unpriced = 0): string {\n const line = `${String(live)} live model ${live === 1 ? \"call\" : \"calls\"} · $${costUsd.toFixed(2)}`;\n return unpriced > 0 ? `${line} (+${String(unpriced)} unpriced)` : line;\n}\n","/**\n * Egress guard: fail in-process connections to known model-provider hosts.\n *\n * Replay serves model responses from a fixture, so a connection to a provider means the\n * agent bypassed the proxy. `installEgressGuard()` patches `net.Socket.prototype.connect`\n * (which every client reaches: undici `fetch`, `http`, `https`, `tls`), refuses provider\n * hostnames and always allows loopback.\n */\n\nimport * as net from \"node:net\";\n\nexport const PROVIDER_HOSTS: readonly (string | RegExp)[] = [\n \"api.openai.com\",\n \"api.anthropic.com\",\n \"generativelanguage.googleapis.com\",\n /\\.openai\\.azure\\.com$/,\n];\n\nexport class EgressBlockedError extends Error {\n constructor(readonly host: string) {\n super(\n `attest egress guard: connection to model provider ${host} blocked; ` +\n `the agent must reach models through the replay proxy (OPENAI_BASE_URL / ANTHROPIC_BASE_URL)`,\n );\n this.name = \"EgressBlockedError\";\n }\n}\n\nexport function isProviderHost(host: string): boolean {\n const h = host.toLowerCase().replace(/\\.$/, \"\");\n return PROVIDER_HOSTS.some((p) => (typeof p === \"string\" ? p === h : p.test(h)));\n}\n\n/** True when `ATTEST_EGRESS=block`. */\nexport function egressBlockRequested(env: NodeJS.ProcessEnv = process.env): boolean {\n const v = (env.ATTEST_EGRESS ?? \"\").trim().toLowerCase();\n if (v !== \"\" && v !== \"block\" && v !== \"allow\") {\n throw new Error(`ATTEST_EGRESS must be block or allow, got ${JSON.stringify(env.ATTEST_EGRESS)}`);\n }\n return v === \"block\";\n}\n\ntype Connect = (this: net.Socket, ...args: unknown[]) => net.Socket;\nlet original: Connect | null = null;\n// Installs outstanding; the guard comes off when the last one is released.\nlet installs = 0;\n\nfunction hostOf(args: unknown[]): string | null {\n // net.createConnection hands connect() its arguments already normalized: [options, cb].\n const first = Array.isArray(args[0]) ? (args[0] as unknown[])[0] : args[0];\n if (typeof first === \"object\" && first !== null) {\n const o = first as { host?: unknown; path?: unknown };\n return typeof o.host === \"string\" ? o.host : null;\n }\n // connect(port, host?) or connect(path)\n if (typeof first === \"number\" || (typeof first === \"string\" && /^\\d+$/.test(first))) {\n return typeof args[1] === \"string\" ? args[1] : null;\n }\n return null;\n}\n\n/**\n * Install the guard. Installs are counted: the returned function releases only this\n * install (once), and the guard comes off when every install has been released.\n */\nexport function installEgressGuard(): () => void {\n installs++;\n if (original === null) {\n const proto = net.Socket.prototype as unknown as { connect: Connect };\n const orig = proto.connect;\n original = orig;\n proto.connect = function (this: net.Socket, ...args: unknown[]): net.Socket {\n const host = hostOf(args);\n if (host !== null && isProviderHost(host)) {\n const err = new EgressBlockedError(host);\n process.nextTick(() => this.destroy(err));\n return this;\n }\n return orig.apply(this, args);\n };\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n installs--;\n if (installs === 0) uninstallEgressGuard();\n };\n}\n\n/** True while an egress guard is installed in this process. */\nexport function egressGuardActive(): boolean {\n return installs > 0;\n}\n\n/** Remove the guard now, whatever the install count. */\nexport function uninstallEgressGuard(): void {\n installs = 0;\n if (original === null) return;\n (net.Socket.prototype as unknown as { connect: Connect }).connect = original;\n original = null;\n}\n","/**\n * World: a stateful HTTP stand-in for the system an agent acts on.\n *\n * `attest-engine world --file world.yaml --serve` hosts the world on 127.0.0.1 and prints\n * the environment variable (for example `PAYMENTS_BASE_URL`) the agent's HTTP client reads.\n * {@link startWorld} starts it and sets that variable. When the session stops the engine\n * prints the final world-v1 snapshot; {@link WorldSession.state} reads the current one while\n * it runs. Pass either to `expect(trace).world(...)` to assert on the effects. In Vitest,\n * `useWorld` wraps this; it composes with `useReplay`.\n */\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { resolveEngine } from \"./engine-manager.js\";\nimport { escapeControl, parseEnv } from \"./replay.js\";\n\n/** The path under the world's base URL that serves the current snapshot. */\nexport const STATE_PATH = \"/_attest/state\";\nconst STATE_TIMEOUT_MS = 10_000;\n\n/** A world-v1 snapshot. */\nexport type WorldSnapshot = Record<string, unknown>;\n\nexport class WorldError extends Error {\n constructor(message: string) {\n super(escapeControl(message));\n this.name = \"WorldError\";\n }\n}\n\nexport interface WorldOptions {\n /** Engine binary (default: the SDK's engine discovery). */\n enginePath?: string;\n}\n\nexport interface WorldSession {\n /** The absolute `world.yaml` path. */\n readonly path: string;\n /** The variable the session set in `process.env`: the world's base URL. */\n readonly env: Record<string, string>;\n /** The world's base URL. */\n readonly baseUrl: string;\n /** The current world-v1 snapshot, read from the running world. */\n state(): Promise<WorldSnapshot>;\n /** Stop the world, restore the environment and return the final snapshot. Idempotent. */\n stop(): Promise<WorldSnapshot>;\n}\n\n// startWorld() sets process-wide environment variables, so worlds cannot overlap.\nlet active: string | null = null;\n\n/** Host the world defined by `worldFile` until the session stops. Worlds cannot overlap. */\nexport async function startWorld(worldFile: string, opts: WorldOptions = {}): Promise<WorldSession> {\n if (active !== null) throw new WorldError(`world ${active} is already running; worlds cannot overlap`);\n const file = path.resolve(worldFile);\n active = file;\n try {\n return await start(file, opts);\n } catch (err) {\n active = null;\n throw err;\n }\n}\n\nasync function start(file: string, opts: WorldOptions): Promise<WorldSession> {\n const engine = await resolveEngine(opts.enginePath);\n const child = spawn(engine, [\"world\", \"--file\", file, \"--serve\"], { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n let resolveReady: (line: string | null) => void = () => undefined;\n const ready = new Promise<string | null>((resolve) => {\n resolveReady = resolve;\n });\n const exited = new Promise<number | null>((resolve) => {\n child.on(\"close\", (code) => {\n resolveReady(null);\n resolve(code);\n });\n child.on(\"error\", (err) => {\n stderr += err.message;\n resolveReady(null);\n resolve(null);\n });\n });\n child.stdout.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stdout += chunk;\n const nl = stdout.indexOf(\"\\n\");\n if (nl >= 0) resolveReady(stdout.slice(0, nl));\n });\n child.stderr.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.stdin.on(\"error\", () => undefined);\n\n const halt = async (): Promise<{ code: number | null; stdout: string; stderr: string }> => {\n child.stdin.write(\"stop\\n\");\n child.stdin.end();\n return { code: await exited, stdout, stderr };\n };\n\n const env = parseEnv(await ready);\n if (env === null) {\n const out = await halt();\n throw new WorldError(`attest-engine world ${file} did not start: ${out.stderr.trim() || `exit ${String(out.code)}`}`);\n }\n const urls = Object.values(env);\n if (urls.length !== 1) {\n await halt();\n throw new WorldError(`attest-engine world ${file}: want one env variable, got ${JSON.stringify(env)}`);\n }\n const baseUrl = urls[0] as string;\n const saved = new Map<string, string | undefined>(Object.keys(env).map((k) => [k, process.env[k]]));\n Object.assign(process.env, env);\n\n let stopped = false;\n let stopping: Promise<WorldSnapshot> | null = null;\n const stop = (): Promise<WorldSnapshot> => {\n stopped = true;\n stopping ??= (async () => {\n for (const [k, v] of saved) {\n if (v === undefined) delete process.env[k];\n else process.env[k] = v;\n }\n const out = await halt();\n active = null;\n const final = parseFinal(out.stdout);\n if (out.code !== 0 || final === null) {\n throw new WorldError(`attest-engine world ${file} failed (exit ${String(out.code)}): ${out.stderr.trim()}`);\n }\n return final;\n })();\n return stopping;\n };\n const state = async (): Promise<WorldSnapshot> => {\n if (stopped) throw new WorldError(`world ${file} is stopped; use the snapshot stop() returned`);\n const url = baseUrl + STATE_PATH;\n let res: Response;\n try {\n res = await fetch(url, { signal: AbortSignal.timeout(STATE_TIMEOUT_MS) });\n } catch (err) {\n throw new WorldError(`GET ${url}: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (res.status !== 200) throw new WorldError(`GET ${url}: HTTP ${String(res.status)}`);\n const body: unknown = await res.json().catch(() => {\n throw new WorldError(`GET ${url}: the body is not JSON`);\n });\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new WorldError(`GET ${url}: the body is not a snapshot object`);\n }\n return body as WorldSnapshot;\n };\n return { path: file, env, baseUrl, state, stop };\n}\n\nfunction parseFinal(out: string): WorldSnapshot | null {\n const lines = out.trim().split(\"\\n\");\n try {\n const world = (JSON.parse(lines[lines.length - 1] ?? \"\") as { world?: unknown }).world;\n if (typeof world !== \"object\" || world === null || Array.isArray(world)) return null;\n return world as WorldSnapshot;\n } catch {\n return null;\n }\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 { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { dirname, join, relative, resolve, isAbsolute, sep } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport 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 let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Plugin '${plugin.name}' timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n\n let result: PluginResult;\n try {\n result = await Promise.race([resultPromise, timeoutPromise]);\n } finally {\n clearTimeout(timer);\n }\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\n/** Explicitly register a plugin instance into the registry. */\nexport function registerPlugin(registry: PluginRegistry, name: string, plugin: AttestPlugin): void {\n registry.register(name, plugin);\n}\n\nfunction isAttestPlugin(value: unknown): value is AttestPlugin {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"name\"] === \"string\" &&\n typeof v[\"pluginType\"] === \"string\" &&\n typeof v[\"execute\"] === \"function\"\n );\n}\n\nfunction readJson(path: string): Record<string, unknown> {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n}\n\nfunction findInstalledPackage(projectRoot: string, name: string): string | undefined {\n let dir = resolve(projectRoot);\n for (;;) {\n const candidate = join(dir, \"node_modules\", name);\n if (existsSync(join(candidate, \"package.json\"))) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\nfunction declaredPluginPaths(pkgJson: Record<string, unknown>, dep: string): string[] {\n const attest = pkgJson[\"attest\"];\n if (attest === undefined) return [];\n const plugins =\n typeof attest === \"object\" && attest !== null\n ? (attest as Record<string, unknown>)[\"plugins\"]\n : undefined;\n if (plugins === undefined) return [];\n if (!Array.isArray(plugins) || !plugins.every((p) => typeof p === \"string\")) {\n throw new Error(`'${dep}': \"attest.plugins\" must be an array of strings`);\n }\n return plugins as string[];\n}\n\n/**\n * Plugins exported by a loaded module: the default export if it is a plugin\n * (a CommonJS build puts `module.exports` there, so also look one `default`\n * deeper), otherwise every plugin-shaped named export.\n */\nfunction pluginsOf(mod: Record<string, unknown>): AttestPlugin[] {\n const def = mod[\"default\"];\n const nested = typeof def === \"object\" && def !== null ? (def as Record<string, unknown>) : undefined;\n for (const candidate of [def, nested?.[\"default\"]]) {\n if (isAttestPlugin(candidate)) return [candidate];\n }\n return [...new Set([...Object.values(mod), ...Object.values(nested ?? {})])].filter(isAttestPlugin);\n}\n\nfunction isInside(root: string, file: string): boolean {\n const within = (r: string, f: string): boolean => {\n const rel = relative(r, f);\n return rel !== \"\" && rel !== \"..\" && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);\n };\n // Lexical check first, then resolve symlinks on both sides (throws when the file is missing).\n return within(root, file) && within(realpathSync(root), realpathSync(file));\n}\n\n/**\n * Discover and load plugins declared by the project's direct dependencies.\n *\n * An installed dependency declares plugins in its `package.json` as\n * `\"attest\": {\"plugins\": [\"./dist/plugin.js\"]}`. Each entry is imported and\n * its default export (or, without one, every export implementing the\n * plugin shape) is registered under the plugin's `name`. A failure loading\n * one entry, or reading the project's `package.json`, is logged and does not\n * raise, as with Python's `load_entrypoint_plugins`. Dependencies that are declared but not\n * installed are skipped. Returns the number of plugins loaded.\n */\nexport async function loadPackagePlugins(\n registry: PluginRegistry,\n projectRoot: string = process.cwd(),\n): Promise<number> {\n let project: Record<string, unknown>;\n try {\n project = readJson(join(projectRoot, \"package.json\"));\n } catch (err) {\n console.error(`attest: cannot read ${join(projectRoot, \"package.json\")}; no plugins loaded:`, err);\n return 0;\n }\n const depNames = new Set<string>();\n for (const field of [\"dependencies\", \"devDependencies\", \"optionalDependencies\"]) {\n const deps = project[field];\n if (typeof deps === \"object\" && deps !== null) {\n for (const dep of Object.keys(deps)) depNames.add(dep);\n }\n }\n\n let loaded = 0;\n for (const dep of depNames) {\n const pkgDir = findInstalledPackage(projectRoot, dep);\n if (pkgDir === undefined) continue;\n let entries: string[];\n try {\n entries = declaredPluginPaths(readJson(join(pkgDir, \"package.json\")), dep);\n } catch (err) {\n console.error(`attest: failed to read plugins declared by '${dep}':`, err);\n continue;\n }\n for (const entry of entries) {\n try {\n const file = resolve(pkgDir, entry);\n if (!isInside(pkgDir, file)) {\n throw new Error(`plugin path '${entry}' escapes package '${dep}'`);\n }\n const mod = (await import(pathToFileURL(file).href)) as Record<string, unknown>;\n const plugins = pluginsOf(mod);\n if (plugins.length === 0) {\n throw new Error(`'${entry}' exports no plugin (name, pluginType, execute)`);\n }\n for (const plugin of plugins) {\n registry.register(plugin.name, plugin);\n loaded++;\n }\n } catch (err) {\n console.error(`attest: failed to load plugin '${entry}' from '${dep}':`, err);\n }\n }\n }\n return loaded;\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","/**\n * Calibration helpers — TS parity with engine/internal/assertion/judge/calibration.go\n * and sdks/python/src/attest/calibration.py.\n *\n * Computes Cohen's κ, agreement %, and ROC-AUC over (human, judge) score\n * pairs and parses CSV/JSONL labels files. Metrics match the engine\n * byte-for-byte on the same input.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport interface LabelPair {\n readonly human: number;\n readonly judge: number;\n}\n\nexport interface AgreementResult {\n readonly threshold: number;\n readonly n: number;\n readonly agreement: number;\n readonly cohenKappa: number;\n readonly rocAuc: number;\n}\n\nexport interface LabeledRecord {\n input: string;\n humanLabel: number;\n judgeScore: number;\n judgeKnown: boolean;\n}\n\n/**\n * Compute Cohen's κ, agreement %, and ROC-AUC over labeled pairs.\n *\n * Throws when pairs is empty or threshold is outside (0, 1). Cohen's κ\n * degenerates to 0 when all labels land in a single class for both\n * raters; ROC-AUC is reported as 0 when only one human-class is\n * present.\n */\nexport function computeAgreement(\n pairs: readonly LabelPair[],\n threshold: number,\n): AgreementResult {\n if (pairs.length === 0) {\n throw new Error(\"no labeled pairs available\");\n }\n if (threshold <= 0 || threshold >= 1) {\n throw new Error(\"threshold must be in (0, 1)\");\n }\n\n const n = pairs.length;\n let humanPos = 0;\n let judgePos = 0;\n let bothPos = 0;\n let bothNeg = 0;\n for (const p of pairs) {\n const hPos = p.human >= threshold;\n const jPos = p.judge >= threshold;\n if (hPos) humanPos++;\n if (jPos) judgePos++;\n if (hPos && jPos) bothPos++;\n if (!hPos && !jPos) bothNeg++;\n }\n const humanNeg = n - humanPos;\n const judgeNeg = n - judgePos;\n\n const agreement = (bothPos + bothNeg) / n;\n const expected =\n (humanPos * judgePos + humanNeg * judgeNeg) / (n * n);\n const cohenKappa =\n expected < 1 ? (agreement - expected) / (1 - expected) : 0;\n\n const rocAuc = rocAUC(pairs, threshold);\n\n return { threshold, n, agreement, cohenKappa, rocAuc };\n}\n\nfunction rocAUC(pairs: readonly LabelPair[], threshold: number): number {\n const rows: { score: number; pos: boolean }[] = pairs.map((p) => ({\n score: p.judge,\n pos: p.human >= threshold,\n }));\n const pos = rows.filter((r) => r.pos).length;\n const neg = rows.length - pos;\n if (pos === 0 || neg === 0) return 0;\n\n rows.sort((a, b) => a.score - b.score);\n\n let rankSumPos = 0;\n let i = 0;\n while (i < rows.length) {\n let j = i;\n while (j < rows.length && rows[j]!.score === rows[i]!.score) {\n j++;\n }\n const avgRank = (i + j + 1) / 2;\n for (let k = i; k < j; k++) {\n if (rows[k]!.pos) rankSumPos += avgRank;\n }\n i = j;\n }\n\n const auc = (rankSumPos - (pos * (pos + 1)) / 2) / (pos * neg);\n if (Number.isNaN(auc) || !Number.isFinite(auc)) return 0;\n return auc;\n}\n\n/**\n * Parse a 2- or 3-column CSV (input, human_label[, judge_score]).\n * Header detected when row[0][1] does not parse as a float. Lines\n * beginning with `#` are skipped.\n */\nexport function loadLabelsCSV(text: string): LabeledRecord[] {\n const rows = parseCSV(text);\n if (rows.length === 0) {\n throw new Error(\"empty CSV\");\n }\n let start = 0;\n if (rows[0]!.length >= 2) {\n const firstHuman = parseFloatStrict(rows[0]![1]!);\n if (firstHuman === null) start = 1;\n }\n const out: LabeledRecord[] = [];\n for (let idx = start; idx < rows.length; idx++) {\n const row = rows[idx]!;\n const lineNum = idx + 1;\n if (row.length === 0) continue;\n if (row[0]!.trimStart().startsWith(\"#\")) continue;\n if (row.length < 2) {\n throw new Error(\n `CSV line ${lineNum}: want at least 2 columns (input, human_label)`,\n );\n }\n const human = parseFloatStrict(row[1]!);\n if (human === null) {\n throw new Error(`CSV line ${lineNum}: human_label not a float: ${row[1]}`);\n }\n const rec: LabeledRecord = {\n input: row[0]!,\n humanLabel: human,\n judgeScore: 0,\n judgeKnown: false,\n };\n if (row.length >= 3 && row[2]!.trim() !== \"\") {\n const judge = parseFloatStrict(row[2]!);\n if (judge === null) {\n throw new Error(\n `CSV line ${lineNum}: judge_score not a float: ${row[2]}`,\n );\n }\n rec.judgeScore = judge;\n rec.judgeKnown = true;\n }\n out.push(rec);\n }\n if (out.length === 0) {\n throw new Error(\"CSV contained no labeled rows\");\n }\n return out;\n}\n\n/**\n * Parse a newline-delimited JSON file. Each line is an object with the\n * shape {\"input\": \"...\", \"human_label\": 0.9, \"judge_score\": 0.8}.\n * `judge_score` is optional.\n */\nexport function loadLabelsJSONL(text: string): LabeledRecord[] {\n const out: LabeledRecord[] = [];\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const stripped = lines[i]!.trim();\n if (!stripped) continue;\n let obj: Record<string, unknown>;\n try {\n obj = JSON.parse(stripped) as Record<string, unknown>;\n } catch (err) {\n throw new Error(`JSONL line ${i + 1}: ${(err as Error).message}`);\n }\n if (Object.keys(obj).length === 0) continue;\n if (obj[\"human_label\"] === undefined) {\n throw new Error(`JSONL line ${i + 1}: missing human_label`);\n }\n const human = parseJSONNumber(obj[\"human_label\"]);\n if (human === null) {\n throw new Error(`JSONL line ${i + 1}: human_label is not a number`);\n }\n const rec: LabeledRecord = {\n input: typeof obj[\"input\"] === \"string\" ? obj[\"input\"] : \"\",\n humanLabel: human,\n judgeScore: 0,\n judgeKnown: false,\n };\n if (obj[\"judge_score\"] !== undefined && obj[\"judge_score\"] !== null) {\n const judge = parseJSONNumber(obj[\"judge_score\"]);\n if (judge === null) {\n throw new Error(`JSONL line ${i + 1}: judge_score is not a number`);\n }\n rec.judgeScore = judge;\n rec.judgeKnown = true;\n }\n out.push(rec);\n }\n if (out.length === 0) {\n throw new Error(\"JSONL contained no labeled rows\");\n }\n return out;\n}\n\n/**\n * Return the 16-character SHA-256 prefix used by the engine for prompt\n * hashes. Mirrors promptHash in engine/internal/assertion/judge_eval.go\n * so SDK-recorded calibration rows align with JudgeMetadata.prompt_hash.\n */\nexport function promptHash(text: string): string {\n return createHash(\"sha256\").update(text).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Parse a string as a number, rejecting empty input and values that\n * JavaScript's `Number()` would silently coerce to 0. Returns null on\n * rejection so callers can throw a useful error. Matches Go's\n * strconv.ParseFloat and Python's float() — both error on the empty\n * string, while bare `Number(\"\")` returns 0.\n *\n * Permits \"Infinity\" so the loader stays consistent with strconv.ParseFloat;\n * downstream consumers (CalibrationStore.Record, computeAgreement) handle\n * the [0, 1] range check separately.\n */\nfunction parseFloatStrict(raw: string): number | null {\n const trimmed = raw.trim();\n if (trimmed === \"\") return null;\n const n = Number(trimmed);\n if (Number.isNaN(n)) return null;\n return n;\n}\n\n/**\n * Coerce a JSON value to a finite number. Accepts only `number` (rejects\n * stringly-typed numbers and booleans) so calibration files cannot\n * accidentally smuggle non-numeric labels past type-loose JSON parsing.\n */\nfunction parseJSONNumber(value: unknown): number | null {\n if (typeof value !== \"number\") return null;\n if (Number.isNaN(value)) return null;\n return value;\n}\n\n/**\n * Minimal RFC-4180-ish CSV parser. Handles quoted fields with embedded\n * commas and CRLF line endings. Sufficient for calibration label files;\n * callers needing full CSV support should bring their own parser.\n */\nfunction parseCSV(text: string): string[][] {\n const rows: string[][] = [];\n let current: string[] = [];\n let field = \"\";\n let inQuotes = false;\n let i = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n field += ch;\n i++;\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === \",\") {\n current.push(field);\n field = \"\";\n i++;\n continue;\n }\n if (ch === \"\\n\") {\n current.push(field);\n rows.push(current);\n current = [];\n field = \"\";\n i++;\n continue;\n }\n if (ch === \"\\r\") {\n i++;\n continue;\n }\n field += ch;\n i++;\n }\n if (field.length > 0 || current.length > 0) {\n current.push(field);\n rows.push(current);\n }\n return rows;\n}\n","import type { SimulatePersona } from \"./proto/types.js\";\n\nexport const FRIENDLY_USER: SimulatePersona = {\n name: \"FriendlyUser\",\n system_prompt: `You are a friendly, cooperative user interacting with an AI assistant.\nYou make clear, well-formed requests. You respond positively to helpful answers and\nask straightforward follow-up questions. Keep responses concise (1-3 sentences).`,\n style: \"friendly\",\n temperature: 0.7,\n max_tokens: 200,\n};\n\nexport const ADVERSARIAL_USER: SimulatePersona = {\n name: \"AdversarialUser\",\n system_prompt: `You are an adversarial user testing the limits of an AI assistant.\nYou ask edge case questions, make ambiguous requests, and probe boundary conditions.\nTry to find inconsistencies or unexpected behaviors. Keep responses concise (1-3 sentences).`,\n style: \"adversarial\",\n temperature: 0.9,\n max_tokens: 200,\n};\n\nexport const CONFUSED_USER: SimulatePersona = {\n name: \"ConfusedUser\",\n system_prompt: `You are a confused user who has trouble articulating what you want.\nYou make vague requests, sometimes contradict yourself, and frequently ask for clarification.\nYou may misunderstand the assistant's responses. Keep responses concise (1-3 sentences).`,\n style: \"confused\",\n temperature: 0.8,\n max_tokens: 200,\n};\n\nexport const COOPERATIVE_USER: SimulatePersona = {\n name: \"CooperativeUser\",\n system_prompt: `You are a cooperative user who actively helps the AI assistant succeed.\nYou provide clear context, answer clarifying questions thoroughly, and confirm when\nthe assistant's response meets your needs. Keep responses concise (1-3 sentences).`,\n style: \"cooperative\",\n temperature: 0.6,\n max_tokens: 200,\n};\n","import { activeMockRegistry, type MockToolFn } from \"./context.js\";\n\n/** Registry of mock tool implementations, activated for the duration of `run`. */\nexport class MockToolRegistry {\n private readonly tools = new Map<string, MockToolFn>();\n\n register(name: string, fn: MockToolFn): void {\n this.tools.set(name, fn);\n }\n\n /**\n * Run `fn` with the registered mocks active. `TraceBuilder.addToolCall`\n * returns the mock's result for a registered tool name. Scopes are\n * isolated per async call chain (AsyncLocalStorage).\n */\n run<T>(fn: () => T): T {\n return activeMockRegistry.run(new Map(this.tools), fn);\n }\n}\n\nexport type MockTool<F extends MockToolFn> = F & { readonly mockToolName: string };\n\n/** Tag `fn` as the mock for tool `name`; the returned function behaves like `fn`. */\nexport function mockTool<F extends MockToolFn>(name: string, fn: F): MockTool<F> {\n const wrapper = ((args: Record<string, unknown>) => fn(args)) as F;\n return Object.assign(wrapper, { mockToolName: name });\n}\n","import { createRng, sleep } from \"./context.js\";\n\nexport interface FaultInjectOptions {\n /** Probability in [0, 1] that a call throws. Default 0. */\n errorRate?: number;\n /** Upper bound of uniform random delay per call, in ms. Default 0. */\n latencyJitterMs?: number;\n /** Seed for a deterministic fault sequence. */\n seed?: number;\n}\n\n/**\n * Wrap `fn` so calls throw `Error(\"Injected fault in <name>\")` at\n * `errorRate` and are delayed by up to `latencyJitterMs`. The RNG is\n * created once per wrapped function, so a fixed seed gives a fixed\n * sequence across calls.\n */\nexport function faultInject<A extends unknown[], R>(\n options: FaultInjectOptions,\n fn: (...args: A) => R | Promise<R>,\n): (...args: A) => Promise<R> {\n const errorRate = options.errorRate ?? 0;\n const latencyJitterMs = options.latencyJitterMs ?? 0;\n const rng = createRng(options.seed);\n return async (...args: A): Promise<R> => {\n if (errorRate > 0 && rng() < errorRate) {\n throw new Error(`Injected fault in ${fn.name || \"anonymous\"}`);\n }\n if (latencyJitterMs > 0) {\n await sleep(rng() * latencyJitterMs);\n }\n return fn(...args);\n };\n}\n","import { OUTCOME_FAIL, OUTCOME_PASS, OUTCOME_SKIP, type Outcome } from \"../proto/constants.js\";\nimport { renderDiagnostics } from \"../diagnostics.js\";\nimport { AgentResult } from \"../result.js\";\n\n/**\n * Anything with a test outcome: `AgentResult`, `RepeatResult` and\n * `ScenarioResult`. Aggregates nest.\n */\nexport interface Verdict {\n readonly notEvaluatedReasons: Readonly<Record<string, number>>;\n outcome(options?: { strict?: boolean }): Outcome;\n skipReason(): string;\n}\n\n/** Any failing outcome fails; otherwise any skip skips; otherwise pass. */\nexport function aggregateOutcomes(outcomes: readonly Outcome[]): Outcome {\n if (outcomes.includes(OUTCOME_FAIL)) return OUTCOME_FAIL;\n if (outcomes.includes(OUTCOME_SKIP)) return OUTCOME_SKIP;\n return OUTCOME_PASS;\n}\n\n/** Not-evaluated reasons summed across verdicts, in first-seen order. */\nexport function sumNotEvaluatedReasons(results: readonly Verdict[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const r of results) {\n for (const [reason, n] of Object.entries(r.notEvaluatedReasons)) {\n counts[reason] = (counts[reason] ?? 0) + n;\n }\n }\n return counts;\n}\n\nexport function formatSkipReason(counts: Readonly<Record<string, number>>): string {\n const parts = Object.entries(counts).map(([reason, n]) => (n === 1 ? reason : `${reason} ×${n}`));\n return `not evaluated: ${parts.join(\", \")}`;\n}\n\ntype Renderable = Verdict & { renderDiagnostics?(options?: { color?: boolean }): string };\n\n/** Diagnostics of one verdict: an `AgentResult` or an aggregate. */\nexport function renderVerdictDiagnostics(verdict: Renderable, color = false): string {\n return verdict instanceof AgentResult\n ? renderDiagnostics(verdict, { color })\n : (verdict.renderDiagnostics?.({ color }) ?? \"\");\n}\n\n/** Diagnostics of every verdict whose outcome is not pass, headed by its index. */\nexport function verdictsDiagnostics(\n results: readonly Renderable[],\n label: string,\n color = false,\n): string {\n const blocks = results.flatMap((r, i) =>\n r.outcome() === OUTCOME_PASS\n ? []\n : [`${label} ${i + 1}/${results.length}:${renderVerdictDiagnostics(r, color)}`],\n );\n return blocks.length > 0 ? blocks.join(\"\\n\") : ` (no failing ${label}s)\\n`;\n}\n","import { OUTCOME_PASS, OUTCOME_SKIP, type Outcome } from \"../proto/constants.js\";\nimport {\n aggregateOutcomes,\n formatSkipReason,\n sumNotEvaluatedReasons,\n verdictsDiagnostics,\n type Verdict,\n} from \"./verdict.js\";\n\n/** Results of `n` trials, aggregated under the assertion-status rules. */\nexport class RepeatResult implements Verdict {\n readonly results: readonly Verdict[];\n\n constructor(results: readonly Verdict[] = []) {\n this.results = results;\n }\n\n get count(): number {\n return this.results.length;\n }\n\n /** Trials skipped because an assertion was not evaluated. */\n get notEvaluated(): number {\n return this.results.filter((r) => r.outcome() === OUTCOME_SKIP).length;\n }\n\n /** Passing / evaluated trials; null when no trial was evaluated. */\n get passRate(): number | null {\n const evaluated = this.count - this.notEvaluated;\n if (evaluated === 0) return null;\n return this.results.filter((r) => r.outcome() === OUTCOME_PASS).length / evaluated;\n }\n\n /** True when every trial's outcome is pass (soft failures included). */\n get allPassed(): boolean {\n return this.results.every((r) => r.outcome() === OUTCOME_PASS);\n }\n\n outcome(options?: { strict?: boolean }): Outcome {\n return aggregateOutcomes(this.results.map((r) => r.outcome(options)));\n }\n\n get notEvaluatedReasons(): Readonly<Record<string, number>> {\n return sumNotEvaluatedReasons(this.results);\n }\n\n skipReason(): string {\n return formatSkipReason(this.notEvaluatedReasons);\n }\n\n renderDiagnostics(options?: { color?: boolean }): string {\n return verdictsDiagnostics(this.results, \"trial\", options?.color);\n }\n}\n\n/** Run `fn` `n` times sequentially and collect the verdicts. */\nexport function repeat<A extends unknown[]>(\n n: number,\n fn: (...args: A) => Verdict | Promise<Verdict>,\n): (...args: A) => Promise<RepeatResult> {\n return async (...args: A): Promise<RepeatResult> => {\n const results: Verdict[] = [];\n for (let i = 0; i < n; i++) {\n results.push(await fn(...args));\n }\n return new RepeatResult(results);\n };\n}\n","import type { SimulatePersona } from \"../proto/types.js\";\nimport { OUTCOME_PASS, type Outcome } from \"../proto/constants.js\";\nimport type { AgentResult } from \"../result.js\";\nimport { activeMockRegistry, createRng, sleep, type MockToolFn } from \"./context.js\";\nimport {\n aggregateOutcomes,\n formatSkipReason,\n sumNotEvaluatedReasons,\n verdictsDiagnostics,\n type Verdict,\n} from \"./verdict.js\";\n\nexport interface ScenarioConfig {\n persona?: SimulatePersona;\n mockTools: Readonly<Record<string, MockToolFn>>;\n faultErrorRate: number;\n faultLatencyJitterMs: number;\n maxTurns: number;\n seed?: number;\n}\n\n/** Passed to the scenario body on every turn. */\nexport interface ScenarioContext {\n readonly persona: SimulatePersona | undefined;\n /** Zero-based turn index. */\n readonly turn: number;\n}\n\n/** One verdict per turn; the aggregate follows the assertion-status rules. */\nexport class ScenarioResult implements Verdict {\n readonly config: ScenarioConfig;\n readonly results: readonly AgentResult[];\n\n constructor(config: ScenarioConfig, results: readonly AgentResult[] = []) {\n this.config = config;\n this.results = results;\n }\n\n /** True when the aggregate `outcome()` is pass. */\n get passed(): boolean {\n return this.outcome() === OUTCOME_PASS;\n }\n\n outcome(options?: { strict?: boolean }): Outcome {\n return aggregateOutcomes(this.results.map((r) => r.outcome(options)));\n }\n\n get notEvaluatedReasons(): Readonly<Record<string, number>> {\n return sumNotEvaluatedReasons(this.results);\n }\n\n skipReason(): string {\n return formatSkipReason(this.notEvaluatedReasons);\n }\n\n renderDiagnostics(options?: { color?: boolean }): string {\n return verdictsDiagnostics(this.results, \"turn\", options?.color);\n }\n}\n\nexport interface ScenarioOptions {\n persona?: SimulatePersona;\n mockTools?: Record<string, MockToolFn>;\n /** Probability per turn of throwing `Injected fault at turn N`. Default 0. */\n faultErrorRate?: number;\n /** Upper bound of uniform random delay per turn, in ms. Default 0. */\n faultLatencyJitterMs?: number;\n /** Turns to run. Default 1. */\n maxTurns?: number;\n /** Seed for a deterministic fault sequence. */\n seed?: number;\n}\n\n/**\n * Run `fn` for `maxTurns` turns with mock tools active, injecting faults\n * and latency per turn. `fn` receives the persona and turn index.\n */\nexport function scenario<A extends unknown[]>(\n options: ScenarioOptions,\n fn: (ctx: ScenarioContext, ...args: A) => AgentResult | Promise<AgentResult>,\n): (...args: A) => Promise<ScenarioResult> {\n const config: ScenarioConfig = {\n persona: options.persona,\n mockTools: { ...options.mockTools },\n faultErrorRate: options.faultErrorRate ?? 0,\n faultLatencyJitterMs: options.faultLatencyJitterMs ?? 0,\n maxTurns: options.maxTurns ?? 1,\n seed: options.seed,\n };\n\n return async (...args: A): Promise<ScenarioResult> => {\n const run = async (): Promise<ScenarioResult> => {\n const results: AgentResult[] = [];\n const rng = createRng(config.seed);\n for (let turn = 0; turn < config.maxTurns; turn++) {\n if (config.faultErrorRate > 0 && rng() < config.faultErrorRate) {\n throw new Error(`Injected fault at turn ${turn}`);\n }\n if (config.faultLatencyJitterMs > 0) {\n await sleep(rng() * config.faultLatencyJitterMs);\n }\n results.push(await fn({ persona: config.persona, turn }, ...args));\n }\n return new ScenarioResult(config, results);\n };\n\n const mocks = new Map(Object.entries(config.mockTools));\n return mocks.size > 0 ? activeMockRegistry.run(mocks, run) : run();\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","/**\n * OpenTelemetry trace adapter.\n *\n * OTLP → Attest trace conversion runs in the engine (`attest-engine trace convert`), the\n * single implementation of the OpenTelemetry GenAI semantic convention mapping shared by\n * every SDK. This module only encodes spans as OTLP/JSON, calls the engine and returns the\n * trace v2 it prints; it holds no mapping of its own. See `docs/guides/trace-check.md`.\n */\nimport { spawn } from \"node:child_process\";\nimport { resolveEngine } from \"../engine-manager.js\";\nimport { OTLPConversionError } from \"../proto/errors.js\";\nimport type { Trace } from \"../proto/types.js\";\n\n/** Upper bound for one `attest-engine trace convert` run. */\nconst CONVERT_TIMEOUT_MS = 60_000;\n/** Largest converted trace accepted from the engine (its trace limit is 10 MB). */\nconst MAX_TRACE_OUTPUT_BYTES = 64 * 1024 * 1024;\n/** OTLP status code for an error span. */\nconst STATUS_CODE_ERROR = 2;\n\ntype AttributeValue =\n | string\n | number\n | boolean\n | readonly (string | number | boolean | null | undefined)[];\n\n/** The parts of an `@opentelemetry/sdk-trace-base` `ReadableSpan` the adapter reads. */\nexport interface OTelSpan {\n readonly name: string;\n /** `[seconds, nanoseconds]` */\n readonly startTime: readonly [number, number];\n readonly endTime: readonly [number, number];\n readonly attributes?: Readonly<Record<string, AttributeValue | undefined>>;\n /** Parent span id (sdk-trace-base 1.x). */\n readonly parentSpanId?: string;\n /** Parent span context (sdk-trace-base 2.x). */\n readonly parentSpanContext?: { readonly spanId: string };\n readonly status?: { readonly code: number; readonly message?: string };\n spanContext(): { readonly traceId: string; readonly spanId: string };\n}\n\n/** An OTLP/JSON export: a parsed `ExportTraceServiceRequest`, its JSON text, or its bytes. */\nexport type OTLPInput = Record<string, unknown> | string | Uint8Array;\n\nexport class OTelAdapter {\n /**\n * Build a trace from finished OpenTelemetry spans of one trace.\n *\n * @param agentId Trace `agent_id`; defaults to the first turn's `gen_ai.agent.name`.\n * @throws OTLPConversionError when the engine rejects the spans.\n */\n static async fromSpans(spans: readonly OTelSpan[], agentId?: string): Promise<Trace> {\n return OTelAdapter.fromOtlp(spansToOtlp(spans), agentId);\n }\n\n /**\n * Convert an OTLP/JSON export (`resourceSpans` → `scopeSpans` → `spans`).\n *\n * @param agentId Trace `agent_id`; defaults to the first turn's `gen_ai.agent.name`.\n * @throws OTLPConversionError when the engine rejects the export (malformed JSON, invalid\n * ids or timestamps, more than one trace, non-numeric token counts, ...).\n * @throws RangeError when a parsed export holds a non-finite number.\n * @throws OTLPConversionError when the engine times out, overflows the output buffer or\n * prints no trace.\n * @throws Error when the engine cannot start.\n */\n static async fromOtlp(otlp: OTLPInput, agentId?: string): Promise<Trace> {\n const payload =\n typeof otlp === \"string\" || otlp instanceof Uint8Array\n ? otlp\n : JSON.stringify(otlp, (_key, v: unknown) => {\n if (typeof v === \"number\" && !Number.isFinite(v)) {\n throw new RangeError(`OTLP export holds a non-finite number: ${String(v)}`);\n }\n return v;\n });\n const args = [\"trace\", \"convert\"];\n if (agentId !== undefined) args.push(\"--agent-id\", agentId);\n args.push(\"-\");\n const stdout = await runConvert(await resolveEngine(), args, payload);\n try {\n return JSON.parse(stdout) as Trace;\n } catch (err) {\n throw new OTLPConversionError(\n `attest-engine trace convert printed output that is not JSON: ${String(err)}`,\n );\n }\n }\n}\n\n/**\n * Run `attest-engine trace convert` with `payload` on stdin and return its stdout.\n *\n * Asynchronous on purpose: `spawnSync` with `input` occasionally never returns under\n * parallel load (observed on macOS: about 1 call in 100 with 8 concurrent callers, each\n * hanging until the timeout), and it blocks the event loop while the engine runs.\n */\nfunction runConvert(engine: string, args: string[], payload: string | Uint8Array): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(engine, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let timer: NodeJS.Timeout | undefined;\n // Registered first: a spawn that fails (ENOENT, or EMFILE/ENFILE under load) emits\n // \"error\" on the next tick, and with EMFILE/ENFILE its stdio streams are null.\n child.on(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n const { stdin, stdout, stderr } = child;\n if (stdin === null || stdout === null || stderr === null) return;\n const out: Buffer[] = [];\n const err: Buffer[] = [];\n let outBytes = 0;\n let failure: Error | null = null;\n const fail = (e: Error): void => {\n failure ??= e;\n child.kill(\"SIGKILL\");\n };\n timer = setTimeout(() => {\n fail(\n new OTLPConversionError(\n `attest-engine trace convert timed out after ${CONVERT_TIMEOUT_MS / 1000}s`,\n ),\n );\n }, CONVERT_TIMEOUT_MS);\n stdout.on(\"data\", (chunk: Buffer) => {\n outBytes += chunk.length;\n if (outBytes > MAX_TRACE_OUTPUT_BYTES) {\n fail(\n new OTLPConversionError(\n `attest-engine trace convert printed more than ${MAX_TRACE_OUTPUT_BYTES} bytes`,\n ),\n );\n return;\n }\n out.push(chunk);\n });\n stderr.on(\"data\", (chunk: Buffer) => err.push(chunk));\n // An engine that exits before reading all of stdin (for example on a usage error)\n // makes the write fail with EPIPE; its exit status and stderr report the real error.\n stdin.on(\"error\", () => undefined);\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer);\n if (failure !== null) {\n reject(failure);\n return;\n }\n if (code !== 0) {\n const message = Buffer.concat(err).toString(\"utf8\").trim();\n reject(\n new OTLPConversionError(\n message || `attest-engine trace convert exited ${String(code ?? signal)}`,\n ),\n );\n return;\n }\n resolve(Buffer.concat(out).toString(\"utf8\"));\n });\n stdin.end(payload);\n });\n}\n\nfunction hrTimeToNanos(time: readonly [number, number], spanName: string): string {\n if (!Number.isSafeInteger(time[0]) || !Number.isSafeInteger(time[1])) {\n throw new RangeError(`span ${JSON.stringify(spanName)} has a non-integer HrTime`);\n }\n return (BigInt(time[0]) * 1_000_000_000n + BigInt(time[1])).toString();\n}\n\nfunction anyValue(value: AttributeValue | null | undefined): Record<string, unknown> {\n if (value === null || value === undefined) return {};\n if (typeof value === \"boolean\") return { boolValue: value };\n if (typeof value === \"string\") return { stringValue: value };\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new RangeError(`OTel attribute value must be finite, got ${String(value)}`);\n }\n return Number.isSafeInteger(value) ? { intValue: String(value) } : { doubleValue: value };\n }\n return { arrayValue: { values: value.map((v) => anyValue(v)) } };\n}\n\n/** Encode spans as an OTLP/JSON `ExportTraceServiceRequest`. */\nexport function spansToOtlp(spans: readonly OTelSpan[]): Record<string, unknown> {\n const encoded = spans.map((span) => {\n const ctx = span.spanContext();\n const out: Record<string, unknown> = {\n traceId: ctx.traceId,\n spanId: ctx.spanId,\n name: span.name,\n startTimeUnixNano: hrTimeToNanos(span.startTime, span.name),\n endTimeUnixNano: hrTimeToNanos(span.endTime, span.name),\n attributes: Object.entries(span.attributes ?? {})\n .filter(([, v]) => v !== undefined)\n .map(([key, v]) => ({ key, value: anyValue(v) })),\n };\n const parent = span.parentSpanContext?.spanId ?? span.parentSpanId;\n if (parent) out[\"parentSpanId\"] = parent;\n if (span.status?.code === STATUS_CODE_ERROR) {\n out[\"status\"] = { code: STATUS_CODE_ERROR, message: span.status.message ?? \"\" };\n }\n return out;\n });\n return { resourceSpans: [{ scopeSpans: [{ spans: encoded }] }] };\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","options","resolve","options","options","resolve","traceId","assertionId","resolve","agentId","traceId","options","options","options","agentId","import_node_crypto","agentId","config","import_node_child_process","fs","path","resolve","exit","import_node_child_process","path","resolve","import_node_child_process","path","active","start","resolve","import_node_async_hooks","agentId","import_node_fs","import_node_path","import_node_url","traceId","assertionId","path","options","import_node_crypto","start","options","options","config","options","agentId","agentId","options","agentId","options","agentId","options","agentId","options","import_node_child_process","agentId","resolve","agentId","options"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/proto/constants.ts","../../src/proto/types.ts","../../src/proto/errors.ts","../../src/proto/diagnostics.ts","../../src/proto/codec.ts","../../src/version.ts","../../src/engine-manager.ts","../../src/config.ts","../../src/usage.ts","../../src/client.ts","../../src/engine-downloader.ts","../../src/trace.ts","../../src/simulation/context.ts","../../src/result.ts","../../src/diagnostics.ts","../../src/trace-tree.ts","../../src/expect.ts","../../src/capture.ts","../../src/replay.ts","../../src/egress.ts","../../src/world.ts","../../src/context.ts","../../src/agent.ts","../../src/delegate.ts","../../src/tier.ts","../../src/plugins.ts","../../src/continuous.ts","../../src/calibration.ts","../../src/personas.ts","../../src/simulation/mock-tools.ts","../../src/simulation/fault-inject.ts","../../src/simulation/verdict.ts","../../src/simulation/repeat.ts","../../src/simulation/scenario.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 DriftReport,\n ConversationMessage,\n SimulatePersona,\n SimulateFaultConfig,\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, requireSimulationCapability } from \"./client.js\";\nexport type { AttestClientOptions } from \"./client.js\";\nexport { TraceBuilder } from \"./trace.js\";\nexport { AgentResult } from \"./result.js\";\nexport { addUsage, formatUsage, parseUsage, sumUsage, usageSummaryLine, zeroUsage } from \"./usage.js\";\nexport {\n renderAssertionFailure,\n renderDiagnostics,\n renderSummary,\n} from \"./diagnostics.js\";\nexport type { RenderOptions } from \"./diagnostics.js\";\nexport { TraceTree } from \"./trace-tree.js\";\nexport { ExpectChain, WorldChecks, attestExpect } from \"./expect.js\";\nexport {\n CaptureError,\n loadFixture,\n record,\n emitVitest,\n renderVitest,\n dslCall,\n testPathFor,\n} from \"./capture.js\";\nexport type {\n Capture,\n Contract,\n ContractResult,\n Fixture,\n RecordOptions,\n RecordResult,\n} from \"./capture.js\";\nexport {\n ReplayError,\n ReplayMissError,\n ReplayNotEvaluatedError,\n firstMiss,\n liveLine,\n resolveMode,\n startReplay,\n} from \"./replay.js\";\nexport { WorldError, startWorld } from \"./world.js\";\nexport type { WorldOptions, WorldSession, WorldSnapshot } from \"./world.js\";\nexport type {\n ReplayMode,\n ReplayModeSetting,\n ReplayOptions,\n ReplayRecord,\n ReplaySession,\n ReplaySummary,\n} from \"./replay.js\";\nexport {\n EgressBlockedError,\n egressBlockRequested,\n installEgressGuard,\n isProviderHost,\n uninstallEgressGuard,\n} from \"./egress.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 {\n config,\n isSimulationMode,\n simulationEnvEnabled,\n getSampleRate,\n resetConfig,\n} from \"./config.js\";\nexport type { AttestPlugin, PluginResult } from \"./plugins.js\";\nexport {\n PluginRegistry,\n executePluginAssertion,\n loadPackagePlugins,\n registerPlugin,\n} from \"./plugins.js\";\nexport { ContinuousEvalRunner, Sampler, AlertDispatcher } from \"./continuous.js\";\nexport {\n computeAgreement,\n loadLabelsCSV,\n loadLabelsJSONL,\n promptHash,\n} from \"./calibration.js\";\nexport type { AgreementResult, LabelPair, LabeledRecord } from \"./calibration.js\";\nexport {\n FRIENDLY_USER,\n ADVERSARIAL_USER,\n CONFUSED_USER,\n COOPERATIVE_USER,\n} from \"./personas.js\";\nexport {\n MockToolRegistry,\n RepeatResult,\n ScenarioResult,\n faultInject,\n mockTool,\n renderVerdictDiagnostics,\n repeat,\n scenario,\n} from \"./simulation/index.js\";\nexport type {\n FaultInjectOptions,\n MockTool,\n MockToolFn,\n ScenarioConfig,\n ScenarioContext,\n ScenarioOptions,\n Verdict,\n} from \"./simulation/index.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;\nexport const STATUS_NOT_EVALUATED = \"not_evaluated\" as const;\n\n// Reasons carried by a not_evaluated result (AssertionResult.reason)\nexport const REASON_PROVIDER_UNAVAILABLE = \"provider_unavailable\" as const;\nexport const REASON_PROVIDER_NOT_CONFIGURED = \"provider_not_configured\" as const;\nexport const REASON_SIMULATION = \"simulation\" as const;\nexport const REASON_MISSING_EVIDENCE = \"missing_evidence\" as const;\nexport const REASON_SHORT_CIRCUITED = \"short_circuited\" as const;\nexport const REASON_BUDGET_EXHAUSTED = \"budget_exhausted\" as const;\nexport const REASON_JUDGE_ABSTAINED = \"judge_abstained\" as const;\nexport const REASON_REPLAY_MISS = \"replay_miss\" as const;\n\n// Test outcomes derived from a batch of assertion results (AgentResult.outcome)\nexport const OUTCOME_PASS = \"pass\" as const;\nexport const OUTCOME_FAIL = \"fail\" as const;\nexport const OUTCOME_SKIP = \"skip\" as const;\nexport type Outcome = typeof OUTCOME_PASS | typeof OUTCOME_FAIL | typeof OUTCOME_SKIP;\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_EFFECT = \"effect\" 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 EffectSpec {\n readonly type: \"effect\";\n readonly check: \"count\" | \"unique\" | \"idempotent\";\n /** A world-v1 snapshot, or `null` when the test ran without a world helper. */\n readonly world: Record<string, unknown> | null;\n readonly resource: string;\n readonly where?: Record<string, unknown>;\n readonly equals?: number;\n readonly at_most?: number;\n readonly at_least?: number;\n readonly fields?: string[];\n readonly field?: string;\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 | \"dynamic\";\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 | \"dynamic\";\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 | EffectSpec\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\n/** Trace v2: a step whose span ended in error. */\nexport interface StepError {\n readonly type: string;\n readonly message?: string;\n}\n\n/** Trace v2: a recorded model request/response pair. */\nexport interface Exchange {\n readonly request: Record<string, unknown>;\n readonly response: Record<string, unknown>;\n}\n\n/** Trace v2: one conversation turn and the indices of its steps. */\nexport interface Turn {\n readonly index: number;\n readonly span_id?: string;\n readonly input?: unknown;\n readonly output?: unknown;\n readonly step_indices: readonly number[];\n}\n\n/** Trace v2: control passing from one agent to another at an agent_call step. */\nexport interface Handoff {\n readonly from_agent: string;\n readonly to_agent: string;\n readonly step_index: number;\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 // Trace v2 (schema_version 2) fields.\n readonly span_id?: string;\n readonly parent_span_id?: string;\n readonly tool_call_id?: string;\n readonly retry_of?: number;\n readonly error?: StepError;\n readonly exchange?: Exchange;\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 // Trace v2 (schema_version 2) fields.\n readonly conversation_id?: string;\n readonly turns?: readonly Turn[];\n readonly handoffs?: readonly Handoff[];\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\n/**\n * Audit trail for an LLM-judge evaluation. Mirrors\n * engine/pkg/types/assertion.go::JudgeMetadata so report v2 payloads\n * round-trip without losing the model / rubric / variance evidence\n * reviewers need to triage a judge failure.\n */\nexport interface JudgeMetadata {\n readonly provider?: string;\n readonly model?: string;\n readonly rubric_name?: string;\n readonly rubric_version?: string;\n readonly prompt_hash?: string;\n readonly sample_scores?: readonly number[];\n readonly score_mean?: number;\n readonly score_stddev?: number;\n readonly high_variance?: boolean;\n readonly bias_probes?: readonly BiasProbe[];\n readonly calibration?: JudgeAgreement;\n}\n\n/**\n * One judge-bias probe result. Score is the score the judge produced on\n * the mutated input; delta is `score - baseline`. A well-calibrated\n * judge has |delta| close to zero. Mirrors\n * engine/pkg/types/assertion.go::BiasProbe.\n */\nexport interface BiasProbe {\n readonly name: string;\n readonly score: number;\n readonly delta: number;\n}\n\n/**\n * Calibration agreement summary keyed by\n * (rubric_name, rubric_version, prompt_hash). Mirrors\n * engine/pkg/types/assertion.go::JudgeAgreement.\n */\nexport interface JudgeAgreement {\n readonly label_count: number;\n readonly agreement: number;\n readonly cohen_kappa: number;\n readonly roc_auc?: number;\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 /** Set only when status is \"not_evaluated\" (REASON_* constants). */\n readonly reason?: string;\n readonly threshold_source?: string;\n readonly layer?: number;\n readonly type?: string;\n readonly trace_node_path?: string;\n readonly expected?: string;\n readonly actual?: string;\n readonly suggested_action?: string;\n readonly judge_metadata?: JudgeMetadata;\n /**\n * Heuristic root-cause label set by the engine\n * (broken_code / flaky_judge / bad_rubric / missing_trace_data /\n * stochastic_variance). Empty/undefined for passes and any result the\n * engine declined to label. Mirrors\n * engine/pkg/types/failure_class.go.\n */\n readonly failure_class?: string;\n}\n\n/**\n * FailureClass values mirror engine/pkg/types/failure_class.go. Use\n * these constants when matching on AssertionResult.failure_class so a\n * typo in either codebase fails fast.\n */\nexport const FailureClass = {\n BrokenCode: \"broken_code\",\n FlakyJudge: \"flaky_judge\",\n BadRubric: \"bad_rubric\",\n MissingTraceData: \"missing_trace_data\",\n StochasticVariance: \"stochastic_variance\",\n} as const;\nexport type FailureClass = (typeof FailureClass)[keyof typeof FailureClass];\n\n/**\n * Map an assertion-type string to its pipeline layer (1–8). Returns 0\n * when the type is unknown so callers can route uncategorised results\n * into their own bucket.\n */\nexport function layerForType(assertionType: string | undefined): number {\n switch (assertionType) {\n case \"schema\":\n return 1;\n case \"constraint\":\n return 2;\n case \"trace\":\n case \"trace_tree\":\n case \"effect\":\n return 3;\n case \"content\":\n return 4;\n case \"embedding\":\n return 5;\n case \"llm_judge\":\n return 6;\n case \"plugin\":\n return 8;\n default:\n return 0;\n }\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\n/**\n * Limits for one evaluate_batch call on top of the session budget. A judge or\n * embedding call that cannot reserve against them is not sent and its\n * assertion is not_evaluated with reason \"budget_exhausted\".\n */\nexport interface BatchBudget {\n readonly max_judge_calls?: number;\n readonly max_cost_usd?: number;\n}\n\n/**\n * The test an evaluate_batch call belongs to. The engine records it next to\n * each assertion spec when ATTEST_CONTRACTS_DIR is set and uses it for\n * nothing else.\n */\nexport interface BatchContext {\n readonly test_id?: string;\n readonly file?: string;\n /** 1-based line the test starts on. */\n readonly line?: number;\n}\n\nexport interface EvaluateBatchParams {\n readonly trace: Trace;\n readonly assertions: readonly Assertion[];\n /** Omitted when no per-batch budget applies. */\n readonly budget?: BatchBudget;\n /** Omitted outside a test. */\n readonly context?: BatchContext;\n}\n\n/**\n * Attest-initiated model usage (embeddings, judges, judge repeats, bias\n * probes, simulated-user messages). Agent calls not routed through attest\n * are not counted.\n */\nexport interface Usage {\n readonly model_calls: number;\n /** Judge-provider requests, the part of model_calls that max_judge_calls limits. */\n readonly judge_calls: number;\n readonly input_tokens: number;\n readonly output_tokens: number;\n readonly cached_tokens: number;\n readonly cost_usd: number;\n readonly retry_cost_usd: number;\n readonly unpriced_calls: number;\n readonly budget_refused: number;\n}\n\nexport interface EvaluateBatchResult {\n readonly results: readonly AssertionResult[];\n readonly total_cost?: number;\n readonly total_duration_ms?: number;\n /** Always sent by the engine; validated by AttestClient.evaluateBatch. */\n readonly usage: Usage;\n /**\n * True when this result was produced by an SDK simulation shim rather\n * than a real engine evaluation. Engine-produced results always carry\n * simulated=false. CI gates can fail builds that accidentally evaluate\n * against the simulator by checking this flag.\n */\n readonly simulated?: boolean;\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\n// ---------------------------------------------------------------------------\n// Drift detection types\n// ---------------------------------------------------------------------------\n\nexport interface DriftReport {\n readonly assertion_id: string;\n readonly mean: number;\n readonly stddev: number;\n readonly count: number;\n readonly latest_score: number;\n readonly deviation: number;\n readonly status: string;\n}\n\nexport interface QueryDriftParams {\n readonly assertion_id: string;\n readonly window_size: number;\n}\n\nexport interface QueryDriftResult {\n readonly report: DriftReport;\n}\n\n// ---------------------------------------------------------------------------\n// Simulation types\n// ---------------------------------------------------------------------------\n\nexport interface SimulatePersona {\n readonly name: string;\n readonly system_prompt: string;\n readonly style: string;\n readonly temperature: number;\n readonly max_tokens?: number;\n}\n\nexport interface SimulateFaultConfig {\n readonly error_rate: number;\n readonly latency_jitter_ms: number;\n readonly content_corruption: boolean;\n readonly timeout_after_ms: number;\n}\n\nexport interface ConversationMessage {\n readonly role: string;\n readonly content: string;\n}\n\nexport interface GenerateUserMessageParams {\n readonly persona: SimulatePersona;\n readonly conversation_history: readonly ConversationMessage[];\n readonly fault_config?: SimulateFaultConfig;\n}\n\nexport interface GenerateUserMessageResult {\n readonly message: string;\n}\n","import type { ErrorData } from \"./types.js\";\nimport type { ProtocolDiagnostic } from \"./diagnostics.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\n/**\n * Raised when the reader loop detects that engine output has lost\n * framing or contains repeated unparseable lines. All in-flight requests\n * are rejected with this error so callers see a visible failure rather\n * than a hung promise.\n */\nexport class ProtocolDesyncError extends Error {\n readonly diagnostics: readonly ProtocolDiagnostic[];\n\n constructor(message: string, diagnostics: readonly ProtocolDiagnostic[]) {\n super(message);\n this.name = \"ProtocolDesyncError\";\n this.diagnostics = diagnostics;\n }\n}\n\n/**\n * The engine rejected an OTLP/JSON export (`attest-engine trace convert`). The message is\n * the engine's error, which names the offending span or field.\n */\nexport class OTLPConversionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OTLPConversionError\";\n }\n}\n","/**\n * Protocol diagnostic types for client-side observability.\n *\n * The reader loop emits diagnostics whenever it cannot route a response\n * line: malformed JSON, missing id, unknown id, or non-routable protocol\n * errors. Diagnostics are buffered in a bounded ring (32 entries) and\n * trigger a desync error when the rate exceeds the configured threshold.\n */\n\nexport type ProtocolDiagnosticKind =\n | \"malformed_json\"\n | \"non_object_response\"\n | \"invalid_jsonrpc_version\"\n | \"missing_id\"\n | \"unknown_id\"\n | \"non_routable_error\";\n\nexport interface ProtocolDiagnostic {\n readonly kind: ProtocolDiagnosticKind;\n readonly message: string;\n readonly rawLine: string;\n readonly timestampMs: number;\n}\n\nexport interface ProtocolLogger {\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n}\n\nconst DEFAULT_BUFFER_SIZE = 32;\nconst MAX_LINE_PREVIEW = 512;\n\nexport class ProtocolDiagnosticBuffer {\n private readonly capacity: number;\n private readonly entries: ProtocolDiagnostic[] = [];\n\n constructor(capacity: number = DEFAULT_BUFFER_SIZE) {\n if (capacity <= 0) {\n throw new Error(\n `ProtocolDiagnosticBuffer capacity must be positive, got ${capacity}`,\n );\n }\n this.capacity = capacity;\n }\n\n push(diagnostic: ProtocolDiagnostic): void {\n if (this.entries.length >= this.capacity) {\n this.entries.shift();\n }\n this.entries.push(diagnostic);\n }\n\n snapshot(): readonly ProtocolDiagnostic[] {\n return this.entries.slice();\n }\n\n countWithin(windowMs: number, nowMs: number): number {\n const cutoff = nowMs - windowMs;\n let count = 0;\n for (let i = this.entries.length - 1; i >= 0; i -= 1) {\n if (this.entries[i]!.timestampMs >= cutoff) {\n count += 1;\n } else {\n break;\n }\n }\n return count;\n }\n\n clear(): void {\n this.entries.length = 0;\n }\n}\n\nexport function previewLine(line: string): string {\n if (line.length <= MAX_LINE_PREVIEW) return line;\n return line.slice(0, MAX_LINE_PREVIEW) + \"…\";\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 = \"1.0.1\";\nexport const ENGINE_VERSION = \"1.0.1\";\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\nimport { createInterface, type Interface as ReadlineInterface } from \"node:readline\";\nimport { existsSync, accessSync, statSync, constants as fsConstants } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\nimport { AttestClient, type BudgetReservation } from \"./client.js\";\nimport type { InitializeResult, Usage } from \"./proto/types.js\";\nimport { ENGINE_VERSION, VERSION } from \"./version.js\";\nimport { binaryFilename, cachedEnginePath, downloadEngine } from \"./engine-downloader.js\";\n\nconst ENGINE_BINARY_NAME = \"attest-engine\";\nconst VERSION_PROBE_TIMEOUT_MS = 10_000;\nconst DEFAULT_INITIALIZE_TIMEOUT_MS = 30_000;\nconst SHUTDOWN_TIMEOUT_MS = 5_000;\nconst STDERR_TAIL_BYTES = 4_096;\n/** How long a failed pipe write waits for the exiting engine's own report (exit status and stderr). */\nconst EXIT_REPORT_GRACE_MS = 1_000;\nconst PIPE_WRITE_ERROR_CODES = new Set([\"EPIPE\", \"ECONNRESET\", \"ERR_STREAM_DESTROYED\"]);\n\nfunction isPipeWriteError(err: unknown): boolean {\n for (let e: unknown = err; e instanceof Error; e = e.cause) {\n const code = (e as NodeJS.ErrnoException).code;\n if (code !== undefined && PIPE_WRITE_ERROR_CODES.has(code)) return true;\n }\n return false;\n}\n\n/** A discovered engine does not report the version this SDK requires. */\nexport class EngineVersionMismatchError extends Error {\n readonly enginePath: string;\n readonly source: string;\n readonly found: string | null;\n readonly required: string;\n\n constructor(enginePath: string, source: string, found: string | null, required: string) {\n const reported = found === null ? \"reports no version\" : `reports version ${found}`;\n super(\n `attest-engine at ${enginePath} (from ${source}) ${reported}; ` +\n `this SDK requires attest-engine ${required}. ` +\n \"Point ATTEST_ENGINE_PATH at a matching engine, or remove the mismatched one \" +\n `from PATH so the SDK can download ${required} into ~/.attest/bin/${required}/.`,\n );\n this.name = \"EngineVersionMismatchError\";\n this.enginePath = enginePath;\n this.source = source;\n this.found = found;\n this.required = required;\n }\n}\n\n/**\n * The version `<path> version` reports, or null if it reports none.\n *\n * Every engine since 0.4 answers `version` with `attest-engine <version>`. stdin is\n * closed so a binary that starts the JSON-RPC server instead reads EOF and exits.\n */\nexport function engineVersion(enginePath: string): string | null {\n const proc = spawnSync(enginePath, [\"version\"], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n timeout: VERSION_PROBE_TIMEOUT_MS,\n });\n if (proc.error) throw proc.error;\n const out = proc.stdout.trim();\n const prefix = `${ENGINE_BINARY_NAME} `;\n if (proc.status !== 0 || !out.startsWith(prefix)) return null;\n return out.slice(prefix.length).trim();\n}\n\nfunction onPath(): string | null {\n for (const dir of (process.env[\"PATH\"] ?? \"\").split(delimiter)) {\n if (!dir) continue;\n const candidate = join(dir, binaryFilename());\n try {\n accessSync(candidate, fsConstants.X_OK);\n } catch {\n continue;\n }\n if (statSync(candidate).isFile()) return candidate;\n }\n return null;\n}\n\nfunction requireFile(enginePath: string, label: string): void {\n if (!existsSync(enginePath) || !statSync(enginePath).isFile()) {\n throw new Error(`${label}=${enginePath} does not exist or is not a file.`);\n }\n}\n\nasync function locateEngine(\n explicitPath: string | undefined,\n allowDownload: boolean,\n): Promise<[string, string]> {\n if (explicitPath) {\n requireFile(explicitPath, \"Engine path\");\n return [explicitPath, \"explicit engine path\"];\n }\n const envPath = process.env[\"ATTEST_ENGINE_PATH\"];\n if (envPath) {\n requireFile(envPath, \"ATTEST_ENGINE_PATH\");\n return [envPath, \"ATTEST_ENGINE_PATH\"];\n }\n const found = onPath();\n if (found) return [found, \"PATH\"];\n const cached = cachedEnginePath();\n if (cached) return [cached, \"engine cache\"];\n\n if (!allowDownload) {\n throw new Error(\n `No '${ENGINE_BINARY_NAME}' ${ENGINE_VERSION} in ATTEST_ENGINE_PATH, PATH or ` +\n `~/.attest/bin/${ENGINE_VERSION}/.`,\n );\n }\n\n const noDownload = process.env[\"ATTEST_ENGINE_NO_DOWNLOAD\"]?.toLowerCase();\n if (noDownload === \"1\" || noDownload === \"true\" || noDownload === \"yes\") {\n throw new Error(\n `Cannot find '${ENGINE_BINARY_NAME}' ${ENGINE_VERSION} and ATTEST_ENGINE_NO_DOWNLOAD is set.\\n` +\n \"Install options:\\n\" +\n \" 1. Build from source: make engine, then set ATTEST_ENGINE_PATH\\n\" +\n ` 2. Download release v${ENGINE_VERSION}: https://github.com/attest-framework/attest/releases\\n` +\n \" 3. Allow auto-download by unsetting ATTEST_ENGINE_NO_DOWNLOAD\",\n );\n }\n return [await downloadEngine(), \"download\"];\n}\n\n/**\n * Find an engine whose version matches this SDK and return its path.\n *\n * The single discovery function behind `EngineManager` and the `attest` CLI. Order:\n * explicit path → `ATTEST_ENGINE_PATH` → `attest-engine` on `PATH` →\n * `~/.attest/bin/<ENGINE_VERSION>/` → download (unless `ATTEST_ENGINE_NO_DOWNLOAD` is set or\n * `allowDownload` is false).\n * The first engine found must report exactly `ENGINE_VERSION`; a mismatched engine is\n * never skipped in favor of the next location.\n */\nexport async function resolveEngine(\n explicitPath?: string,\n options: { allowDownload?: boolean } = {},\n): Promise<string> {\n const [enginePath, source] = await locateEngine(explicitPath, options.allowDownload ?? true);\n const found = engineVersion(enginePath);\n if (found !== ENGINE_VERSION) {\n throw new EngineVersionMismatchError(enginePath, source, found, ENGINE_VERSION);\n }\n return enginePath;\n}\n\n/** Session budget limits read from the environment; null means unlimited. */\ninterface SessionBudget {\n readonly judgeCalls: number | null;\n readonly usd: number | null;\n}\n\nfunction envNumber(name: string): number | null {\n const raw = process.env[name];\n if (raw === undefined || raw === \"\") return null;\n const parsed = Number(raw);\n // A malformed value is the engine's startup error to report, not ours.\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n}\n\n/**\n * Rethrow the engine's exit report (status and stderr tail) when it arrives within `graceMs`.\n * A pipe write fails before the child's 'close' fires; a grandchild holding stderr open can\n * delay 'close' indefinitely, hence the bound.\n */\nasync function reportExit(exited: Promise<never>, graceMs: number): Promise<void> {\n let timer: NodeJS.Timeout | undefined;\n const grace = new Promise<void>((done) => {\n timer = setTimeout(done, graceMs);\n });\n try {\n await Promise.race([exited, grace]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport class EngineManager {\n private enginePath: string;\n private readonly logLevel: string;\n private readonly initializeTimeoutMs: number;\n private process: ChildProcess | null = null;\n private reader: ReadlineInterface | null = null;\n private initialized = false;\n private initResult: InitializeResult | null = null;\n private routedClient: AttestClient | undefined;\n /** The running engine's stderr tail; each launch owns a fresh one so a killed engine cannot write into it. */\n private stderr: { text: string } = { text: \"\" };\n private restarting: Promise<void> | null = null;\n\n private configuredBudget: SessionBudget = { judgeCalls: null, usd: null };\n private usedJudgeCalls = 0;\n private usedUsd = 0;\n private heldJudgeCalls = 0;\n private heldUsd = 0;\n /** Spend the SDK cannot observe may have happened; a restart then leaves no budget. */\n private unknownSpend = false;\n\n constructor(options?: { enginePath?: string; logLevel?: string; initializeTimeoutMs?: number }) {\n this.enginePath = options?.enginePath ?? \"\";\n this.logLevel = options?.logLevel ?? \"warn\";\n this.initializeTimeoutMs = options?.initializeTimeoutMs ?? DEFAULT_INITIALIZE_TIMEOUT_MS;\n }\n\n /**\n * Start the engine and complete the `initialize` handshake. Rejects when the engine exits,\n * closes its pipes or fails to answer within the initialize timeout; the error carries the\n * tail of the engine's stderr.\n */\n async start(): Promise<InitializeResult> {\n this.enginePath = await resolveEngine(this.enginePath || undefined);\n this.configuredBudget = {\n judgeCalls: envNumber(\"ATTEST_MAX_JUDGE_CALLS\"),\n usd: envNumber(\"ATTEST_BUDGET_USD\"),\n };\n this.usedJudgeCalls = this.usedUsd = this.heldJudgeCalls = this.heldUsd = 0;\n this.unknownSpend = false;\n\n this.initResult = await this.launch(undefined);\n this.initialized = true;\n return this.initResult;\n }\n\n /** Spawn the engine and run `initialize` on it; the engine is stopped when that fails. */\n private async launch(envOverrides: Record<string, string> | undefined): Promise<InitializeResult> {\n const stderr = { text: \"\" };\n this.stderr = stderr;\n const child = spawn(this.enginePath, [`--log-level=${this.logLevel}`], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...envOverrides },\n });\n this.process = child;\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk: string) => {\n stderr.text = (stderr.text + chunk).slice(-STDERR_TAIL_BYTES);\n });\n // A write to a dead engine fails through the write callback (launch() then waits for the\n // exit report below); the stream's own 'error' event would only duplicate that as an\n // uncaught exception.\n child.stdin.on(\"error\", () => undefined);\n\n this.reader = createInterface({ input: child.stdout });\n const client = new AttestClient(this);\n this.routedClient = client;\n client.startReader();\n\n const exited = new Promise<never>((_, reject) => {\n child.once(\"error\", (err) => reject(new Error(`attest-engine failed to start: ${err.message}`)));\n child.once(\"close\", (code, signal) => {\n const how = signal !== null ? `signal ${signal}` : `exit code ${String(code)}`;\n reject(\n new Error(\n `attest-engine exited before it was ready (${how}).` +\n (stderr.text === \"\" ? \"\" : ` stderr:\\n${stderr.text.trimEnd()}`),\n ),\n );\n });\n });\n // After a successful start this rejection is just the engine stopping.\n exited.catch(() => undefined);\n\n try {\n return await Promise.race([this.initialize(client), exited]);\n } catch (err) {\n await this.terminate();\n if (isPipeWriteError(err)) await reportExit(exited, EXIT_REPORT_GRACE_MS);\n throw err;\n }\n }\n\n /** Send initialize and check the engine's version and capabilities. */\n private async initialize(client: AttestClient): Promise<InitializeResult> {\n const init = (await client.sendWithoutRestart(\n \"initialize\",\n {\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 this.initializeTimeoutMs,\n )) as InitializeResult;\n if (init.engine_version !== ENGINE_VERSION) {\n throw new EngineVersionMismatchError(\n this.enginePath,\n \"initialize\",\n init.engine_version,\n ENGINE_VERSION,\n );\n }\n if (!init.compatible) {\n throw new Error(`Engine incompatible. Missing capabilities: ${JSON.stringify(init.missing)}`);\n }\n return init;\n }\n\n async stop(): Promise<void> {\n if (this.restarting !== null) await this.restarting.catch(() => undefined);\n if (this.process === null) return;\n\n if (this.initialized && this.routedClient !== undefined && this.isRunning) {\n try {\n await this.routedClient.sendWithoutRestart(\"shutdown\", {}, SHUTDOWN_TIMEOUT_MS);\n } catch {\n // shutdown failed, will kill\n }\n }\n await this.terminate();\n this.initialized = false;\n }\n\n /** Close the pipes, reject pending requests and stop the engine process (SIGKILL when `force`). */\n private async terminate(force = false): Promise<void> {\n const child = this.process;\n this.routedClient?.stopReader();\n this.routedClient?.rejectPending(new Error(\"Engine stopped.\"));\n this.reader?.close();\n this.reader = null;\n this.process = null;\n if (child === null) return;\n\n if (child.exitCode === null && child.signalCode === null) {\n await new Promise<void>((res) => {\n const timer = force ? undefined : setTimeout(() => child.kill(\"SIGKILL\"), 5000);\n child.once(\"exit\", () => {\n clearTimeout(timer);\n res();\n });\n child.kill(force ? \"SIGKILL\" : \"SIGTERM\");\n });\n }\n }\n\n /**\n * Replace the engine after a request timed out: its late response can no longer be told\n * apart from a new one. The new engine gets the remaining session budget: the configured\n * limit minus the usage already returned, minus what the abandoned requests may still have\n * reserved. A restart that leaves no budget makes later model calls\n * `not_evaluated(budget_exhausted)`.\n */\n restartAfterTimeout(abandoned: readonly BudgetReservation[]): Promise<void> {\n for (const r of abandoned) {\n this.heldJudgeCalls += r.judgeCalls ?? Number.POSITIVE_INFINITY;\n this.heldUsd += r.usd ?? Number.POSITIVE_INFINITY;\n }\n this.restarting ??= this.restart().finally(() => {\n this.restarting = null;\n });\n return this.restarting;\n }\n\n /** An engine reply the SDK cannot account for (no usage, an RPC error, a dropped reply) may have spent budget. */\n markUnknownSpend(): void {\n this.unknownSpend = true;\n }\n\n private async restart(): Promise<void> {\n // The abandoned engine may sit in a slow model call; nothing it says is wanted any more.\n await this.terminate(true);\n const overrides: Record<string, string> = {};\n const { judgeCalls, usd } = this.configuredBudget;\n const unknown = this.unknownSpend ? Number.POSITIVE_INFINITY : 0;\n if (judgeCalls !== null) {\n overrides[\"ATTEST_MAX_JUDGE_CALLS\"] = String(\n Math.max(0, Math.floor(judgeCalls - this.usedJudgeCalls - this.heldJudgeCalls - unknown)),\n );\n }\n if (usd !== null) {\n overrides[\"ATTEST_BUDGET_USD\"] = String(Math.max(0, usd - this.usedUsd - this.heldUsd - unknown));\n }\n this.initResult = await this.launch(overrides);\n }\n\n /** Count the usage an evaluate_batch result reported against the session budget. */\n recordUsage(usage: Usage): void {\n this.usedJudgeCalls += usage.judge_calls;\n this.usedUsd += usage.cost_usd;\n }\n\n /** Resolves once an engine restart in progress has finished. */\n async whenReady(): Promise<void> {\n if (this.restarting !== null) await this.restarting;\n }\n\n /** Tail of the engine's stderr: the reason an engine died. */\n get stderrTail(): string {\n return this.stderr.text.trimEnd();\n }\n\n /** The client that routes this engine's responses by id; replaced when the engine restarts. */\n get client(): AttestClient | undefined {\n return this.routedClient;\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 if (this.routedClient === undefined) throw new Error(\"Engine process not started.\");\n return this.routedClient.sendRequest(method, params);\n }\n\n get isRunning(): boolean {\n return this.process !== null && this.process.exitCode === null && this.process.signalCode === 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","let _simulationMode = false;\nlet _sampleRate = 0;\n\n/**\n * Configure global SDK options.\n *\n * @param options.simulation - Enable simulation mode: the engine evaluates\n * layers 1-4 and reports layers 5-6 as not evaluated (reason \"simulation\")\n * without calling any provider. The engine reads `ATTEST_SIMULATION` when it\n * starts; the Vitest fixtures set it from this flag. Equivalent to setting\n * `ATTEST_SIMULATION=1` in the environment.\n * @param options.sampleRate - Sampling rate for continuous evaluation (0.0–1.0).\n * Equivalent to setting `ATTEST_SAMPLE_RATE` in the environment.\n */\nexport function config(options: {\n simulation?: boolean;\n sampleRate?: number;\n}): void {\n if (options.simulation !== undefined) {\n _simulationMode = options.simulation;\n }\n if (options.sampleRate !== undefined) {\n if (options.sampleRate < 0 || options.sampleRate > 1) {\n throw new RangeError(\n `sampleRate must be between 0.0 and 1.0, got ${options.sampleRate}`,\n );\n }\n _sampleRate = options.sampleRate;\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 _simulationMode || simulationEnvEnabled();\n}\n\n/**\n * True when `ATTEST_SIMULATION` is set for this process (and so for an\n * engine it spawns): \"1\", \"true\" or \"yes\", trimmed and case-insensitive.\n */\nexport function simulationEnvEnabled(): boolean {\n const env = (process.env[\"ATTEST_SIMULATION\"] ?? \"\").trim().toLowerCase();\n return env === \"1\" || env === \"true\" || env === \"yes\";\n}\n\n/**\n * Returns the sampling rate for continuous evaluation. Priority:\n * programmatic `config({ sampleRate })` > `ATTEST_SAMPLE_RATE` env var > 0.\n */\nexport function getSampleRate(): number {\n if (_sampleRate > 0) return _sampleRate;\n const env = process.env[\"ATTEST_SAMPLE_RATE\"];\n if (env !== undefined && env !== \"\") {\n const parsed = Number(env);\n if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {\n throw new RangeError(\n `ATTEST_SAMPLE_RATE must be between 0.0 and 1.0, got '${env}'`,\n );\n }\n return parsed;\n }\n return 0;\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 _sampleRate = 0;\n}\n","import type { Usage } from \"./proto/types.js\";\n\nconst INT_FIELDS = [\n \"model_calls\",\n \"judge_calls\",\n \"input_tokens\",\n \"output_tokens\",\n \"cached_tokens\",\n \"unpriced_calls\",\n \"budget_refused\",\n] as const;\nconst USD_FIELDS = [\"cost_usd\", \"retry_cost_usd\"] as const;\n\n/** Usage of an evaluation that made no model calls. */\nexport function zeroUsage(): Usage {\n return {\n model_calls: 0,\n judge_calls: 0,\n input_tokens: 0,\n output_tokens: 0,\n cached_tokens: 0,\n cost_usd: 0,\n retry_cost_usd: 0,\n unpriced_calls: 0,\n budget_refused: 0,\n };\n}\n\n/** Field-wise sum of two usages. */\nexport function addUsage(a: Usage, b: Usage): Usage {\n return {\n model_calls: a.model_calls + b.model_calls,\n judge_calls: a.judge_calls + b.judge_calls,\n input_tokens: a.input_tokens + b.input_tokens,\n output_tokens: a.output_tokens + b.output_tokens,\n cached_tokens: a.cached_tokens + b.cached_tokens,\n cost_usd: a.cost_usd + b.cost_usd,\n retry_cost_usd: a.retry_cost_usd + b.retry_cost_usd,\n unpriced_calls: a.unpriced_calls + b.unpriced_calls,\n budget_refused: a.budget_refused + b.budget_refused,\n };\n}\n\n/** Field-wise sum of any number of usages; zero for none. */\nexport function sumUsage(usages: Iterable<Usage>): Usage {\n let total = zeroUsage();\n for (const u of usages) total = addUsage(total, u);\n return total;\n}\n\n/**\n * Validate the `usage` object of an evaluate_batch result: all nine fields\n * present, non-negative, integers except the two `*_usd` amounts.\n */\nexport function parseUsage(raw: unknown): Usage {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(`evaluate_batch result: usage must be an object, got ${JSON.stringify(raw)}`);\n }\n const obj = raw as Record<string, unknown>;\n const field = (name: string, integer: boolean): number => {\n const v = obj[name];\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < 0 || (integer && !Number.isInteger(v))) {\n const kind = integer ? \"a non-negative integer\" : \"a non-negative number\";\n throw new TypeError(`evaluate_batch result: usage.${name} must be ${kind}, got ${JSON.stringify(v)}`);\n }\n return v;\n };\n const ints = Object.fromEntries(INT_FIELDS.map((f) => [f, field(f, true)])) as Record<\n (typeof INT_FIELDS)[number],\n number\n >;\n const usd = Object.fromEntries(USD_FIELDS.map((f) => [f, field(f, false)])) as Record<\n (typeof USD_FIELDS)[number],\n number\n >;\n return { ...ints, ...usd };\n}\n\n/**\n * \"{model_calls} model calls · {tokens} tokens ({cached} cached) · ${cost} · retry cost ${retry}\",\n * plus refused and unpriced calls when present. Same format as the engine's\n * report.FormatUsage.\n */\nexport function formatUsage(u: Usage): string {\n let line =\n `${u.model_calls} model calls · ${u.input_tokens + u.output_tokens} tokens ` +\n `(${u.cached_tokens} cached) · $${u.cost_usd.toFixed(4)} · retry cost $${u.retry_cost_usd.toFixed(4)}`;\n if (u.budget_refused > 0) line += ` · ${u.budget_refused} calls refused by budget`;\n if (u.unpriced_calls > 0) line += ` · ${u.unpriced_calls} unpriced calls not in $`;\n return line;\n}\n\n/**\n * The run-summary line \"attest usage: …\" when the session made a model call\n * or refused one by budget; undefined otherwise.\n */\nexport function usageSummaryLine(u: Usage): string | undefined {\n if (u.model_calls === 0 && u.budget_refused === 0) return undefined;\n return `attest usage: ${formatUsage(u)}`;\n}\n","import type {\n Assertion,\n BatchBudget,\n BatchContext,\n ConversationMessage,\n DriftReport,\n EvaluateBatchParams,\n EvaluateBatchResult,\n InitializeResult,\n SimulateFaultConfig,\n SimulatePersona,\n Trace,\n AssertionResult,\n} from \"./proto/types.js\";\nimport {\n ProtocolError,\n EngineTimeoutError,\n ProtocolDesyncError,\n} from \"./proto/errors.js\";\nimport {\n decodeResponse,\n encodeRequest,\n extractId,\n extractResult,\n} from \"./proto/codec.js\";\nimport {\n ProtocolDiagnosticBuffer,\n previewLine,\n type ProtocolDiagnostic,\n type ProtocolDiagnosticKind,\n type ProtocolLogger,\n} from \"./proto/diagnostics.js\";\nimport type { Interface as ReadlineInterface } from \"node:readline\";\nimport type { EngineManager } from \"./engine-manager.js\";\nimport { isSimulationMode } from \"./config.js\";\nimport { parseUsage } from \"./usage.js\";\n\n/** Budget a timed-out request may have consumed; null means the whole remaining budget. */\nexport interface BudgetReservation {\n readonly judgeCalls: number | null;\n readonly usd: number | null;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_DIAGNOSTIC_BUFFER = 32;\nconst DEFAULT_DESYNC_THRESHOLD = 3;\nconst DEFAULT_DESYNC_WINDOW_MS = 1_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\ninterface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n reservation: BudgetReservation;\n}\n\nexport interface AttestClientOptions {\n /** Logger override. When omitted, warnings only emit if ATTEST_DEBUG_PROTOCOL=1. */\n logger?: ProtocolLogger;\n /** Listener invoked for every protocol diagnostic. */\n onDiagnostic?: (diagnostic: ProtocolDiagnostic) => void;\n /** Diagnostic ring-buffer capacity. Default 32. */\n diagnosticBufferSize?: number;\n /** Number of diagnostics in `desyncWindowMs` that triggers desync rejection. Default 3. */\n desyncThreshold?: number;\n /** Window length for desync detection in milliseconds. Default 1000. */\n desyncWindowMs?: number;\n}\n\nfunction debugProtocolEnabled(): boolean {\n const flag = process.env[\"ATTEST_DEBUG_PROTOCOL\"];\n return flag === \"1\" || flag === \"true\" || flag === \"yes\";\n}\n\nfunction envLoggerDefault(): ProtocolLogger {\n if (debugProtocolEnabled()) {\n return {\n warn: (msg: string, ...args: unknown[]) => console.warn(msg, ...args),\n error: (msg: string, ...args: unknown[]) => console.error(msg, ...args),\n };\n }\n return {\n warn: () => {\n /* silent unless ATTEST_DEBUG_PROTOCOL=1 */\n },\n error: () => {\n /* silent unless ATTEST_DEBUG_PROTOCOL=1 */\n },\n };\n}\n\n/**\n * AttestClient owns request/response correlation over the engine's\n * NDJSON protocol.\n *\n * Desync detection is a one-way latch: once the diagnostic rate breaches\n * `desyncThreshold` within `desyncWindowMs` the client refuses further\n * sends for the lifetime of the instance. There is no reset hook by\n * design — recovery requires constructing a new client over a fresh\n * engine subprocess.\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 private attachedReader: ReadlineInterface | null = null;\n\n private readonly logger: ProtocolLogger;\n private readonly diagnosticBuffer: ProtocolDiagnosticBuffer;\n private readonly diagnosticListeners = new Set<\n (diagnostic: ProtocolDiagnostic) => void\n >();\n private readonly desyncThreshold: number;\n private readonly desyncWindowMs: number;\n private desynced = false;\n\n constructor(engine: EngineManager, options?: AttestClientOptions) {\n this.engine = engine;\n this.logger = options?.logger ?? envLoggerDefault();\n this.diagnosticBuffer = new ProtocolDiagnosticBuffer(\n options?.diagnosticBufferSize ?? DEFAULT_DIAGNOSTIC_BUFFER,\n );\n this.desyncThreshold = options?.desyncThreshold ?? DEFAULT_DESYNC_THRESHOLD;\n this.desyncWindowMs = options?.desyncWindowMs ?? DEFAULT_DESYNC_WINDOW_MS;\n if (options?.onDiagnostic !== undefined) {\n this.diagnosticListeners.add(options.onDiagnostic);\n }\n }\n\n /** Subscribe to protocol diagnostics. Returns an unsubscribe function. */\n onProtocolDiagnostic(\n listener: (diagnostic: ProtocolDiagnostic) => void,\n ): () => void {\n this.diagnosticListeners.add(listener);\n return () => {\n this.diagnosticListeners.delete(listener);\n };\n }\n\n /** Snapshot of the diagnostic ring buffer (most recent last). */\n protocolDiagnostics(): readonly ProtocolDiagnostic[] {\n return this.diagnosticBuffer.snapshot();\n }\n\n /**\n * Attach the id-routed reader to the engine's stdout. Idempotent; `sendRequest` starts it\n * on first use, so calling it is optional.\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.attachedReader = rl;\n this.lineHandler = (line: string) => this.handleLine(line);\n rl.on(\"line\", this.lineHandler);\n\n rl.on(\"close\", () => {\n // A restarted engine has a new readline; the old one closing is not a failure.\n if (this.attachedReader !== rl) return;\n const tail = this.engine.stderrTail ?? \"\";\n this.failAll(\n new Error(tail === \"\" ? \"Engine closed stdout.\" : `Engine closed stdout. stderr:\\n${tail}`),\n );\n this.readerActive = false;\n this.attachedReader = null;\n });\n }\n\n stopReader(): void {\n if (!this.readerActive) return;\n\n const rl = this.attachedReader;\n if (rl !== null && this.lineHandler !== null) {\n rl.removeListener(\"line\", this.lineHandler);\n }\n\n this.lineHandler = null;\n this.readerActive = false;\n this.attachedReader = null;\n }\n\n private recordDiagnostic(\n kind: ProtocolDiagnosticKind,\n message: string,\n rawLine: string,\n countsTowardDesync = true,\n ): void {\n const diagnostic: ProtocolDiagnostic = {\n kind,\n message,\n rawLine: previewLine(rawLine),\n timestampMs: Date.now(),\n };\n this.diagnosticBuffer.push(diagnostic);\n this.logger.warn(`[attest.protocol] ${kind}: ${message}`);\n for (const listener of this.diagnosticListeners) {\n try {\n listener(diagnostic);\n } catch (err) {\n // Listener bugs must not break the reader or shadow other subscribers.\n this.logger.error(\n `[attest.protocol] diagnostic listener threw: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n if (countsTowardDesync) this.maybeTriggerDesync(diagnostic.timestampMs);\n }\n\n private maybeTriggerDesync(nowMs: number): void {\n if (this.desynced) return;\n const recent = this.diagnosticBuffer.countWithin(this.desyncWindowMs, nowMs);\n if (recent >= this.desyncThreshold) {\n this.desynced = true;\n const snapshot = this.diagnosticBuffer.snapshot();\n const err = new ProtocolDesyncError(\n `Engine protocol desync: ${recent} unroutable response lines within ${this.desyncWindowMs}ms.`,\n snapshot,\n );\n this.logger.error(`[attest.protocol] ${err.message}`);\n this.failAll(err);\n }\n }\n\n private handleLine(line: string): void {\n let response;\n try {\n response = decodeResponse(line);\n } catch (err) {\n this.handleDecodeFailure(line, err);\n return;\n }\n\n let reqId: number;\n try {\n reqId = extractId(response);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // An id-less line (a notification) answers no request: drop it. It is logged but never\n // counts toward desync, since the engine may legitimately write one.\n this.recordDiagnostic(\"missing_id\", message, line, false);\n return;\n }\n\n const pending = this.pending.get(reqId);\n if (pending === undefined) {\n this.recordDiagnostic(\n \"unknown_id\",\n `no pending request for id=${reqId}`,\n line,\n );\n return;\n }\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 }\n\n private handleDecodeFailure(line: string, err: unknown): void {\n if (err instanceof ProtocolError) {\n // Try to route a JSON-RPC error response to its waiting request.\n let reqId = -1;\n try {\n const raw = JSON.parse(line.trim()) as Record<string, unknown>;\n const idCandidate = raw[\"id\"];\n if (typeof idCandidate === \"number\" && Number.isFinite(idCandidate)) {\n reqId = idCandidate;\n }\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 return;\n }\n this.recordDiagnostic(\n \"non_routable_error\",\n `engine error code=${err.code} (${err.errorMessage}) had no matching pending id`,\n line,\n );\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const kind = classifyDecodeError(message);\n this.recordDiagnostic(kind, message, line);\n }\n\n /** Reject every request still waiting for a response. */\n rejectPending(err: Error): void {\n this.failAll(err);\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 /**\n * Send one request and resolve with the result of the response that carries its id.\n *\n * After a timeout the engine is restarted (its late response can no longer be matched),\n * every other pending request is rejected, and the new engine gets the remaining session\n * budget.\n */\n async sendRequest(\n method: string,\n params: Record<string, unknown>,\n timeoutMs?: number,\n ): Promise<unknown> {\n return this.send(method, params, timeoutMs, true);\n }\n\n /** `sendRequest` without the restart-on-timeout step, for the engine's own handshake. */\n async sendWithoutRestart(\n method: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n ): Promise<unknown> {\n return this.send(method, params, timeoutMs, false);\n }\n\n private async send(\n method: string,\n params: Record<string, unknown>,\n timeoutMs: number | undefined,\n restartOnTimeout: boolean,\n ): Promise<unknown> {\n // The engine's own handshake runs inside a restart and must not wait for it.\n if (restartOnTimeout) await this.engine.whenReady?.();\n // Every client over one EngineManager shares that engine's id space and reader.\n const shared = this.engine.client;\n if (shared !== undefined && shared !== this) {\n return restartOnTimeout\n ? shared.sendRequest(method, params, timeoutMs)\n : shared.sendWithoutRestart(method, params, resolveTimeoutMs(timeoutMs));\n }\n\n if (this.desynced) {\n throw new ProtocolDesyncError(\n \"Engine protocol is desynced; AttestClient will not send further requests.\",\n this.diagnosticBuffer.snapshot(),\n );\n }\n\n const resolvedTimeout = resolveTimeoutMs(timeoutMs);\n if (this.engine.isRunning === false) {\n const tail = this.engine.stderrTail ?? \"\";\n throw new Error(`Engine process is not running.${tail === \"\" ? \"\" : ` stderr:\\n${tail}`}`);\n }\n const cp = this.engine.childProcess;\n if (cp === null || cp.stdin === null) {\n throw new Error(\"Engine process not started.\");\n }\n this.startReader();\n\n const reservation = worstCaseReservation(method, params);\n let capturedReqId: number | undefined;\n let timer: NodeJS.Timeout | 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, reservation });\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(this.describeWriteError(err));\n }\n });\n });\n });\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new EngineTimeoutError(method, resolvedTimeout)), resolvedTimeout);\n });\n\n try {\n return await Promise.race([requestPromise, timeoutPromise]);\n } catch (err) {\n if (err instanceof EngineTimeoutError) {\n if (capturedReqId !== undefined) this.pending.delete(capturedReqId);\n if (restartOnTimeout) await this.recoverFromTimeout(method, params, err);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** A failed pipe write names the engine's stderr tail; the original error stays as `cause` and `code`. */\n private describeWriteError(err: Error): Error {\n const tail = this.engine.stderrTail ?? \"\";\n const wrapped = new Error(\n `Failed to write to the engine: ${err.message}.${tail === \"\" ? \"\" : ` stderr:\\n${tail}`}`,\n { cause: err },\n );\n return Object.assign(wrapped, { code: (err as NodeJS.ErrnoException).code });\n }\n\n private async recoverFromTimeout(\n method: string,\n params: Record<string, unknown>,\n timeout: EngineTimeoutError,\n ): Promise<void> {\n // A client replaced by an engine restart no longer owns the engine.\n if (this.engine.restartAfterTimeout === undefined || this.engine.client !== this) return;\n const abandoned = [\n worstCaseReservation(method, params),\n ...[...this.pending.values()].map((p) => p.reservation),\n ];\n this.failAll(new Error(`Engine restarted after '${method}' timed out; request abandoned.`));\n try {\n await this.engine.restartAfterTimeout(abandoned);\n } catch (err) {\n throw new Error(\n `Engine request '${method}' timed out and the engine could not be restarted: ` +\n (err instanceof Error ? err.message : String(err)),\n { cause: timeout },\n );\n }\n }\n\n async evaluateBatch(\n trace: Trace,\n assertions: readonly Assertion[],\n options?: { timeout?: number; budget?: BatchBudget; context?: BatchContext },\n ): Promise<EvaluateBatchResult> {\n // Simulation is decided by the engine: started with ATTEST_SIMULATION\n // set, it evaluates layers 1-4 for real and returns not_evaluated\n // (reason \"simulation\") for layers 5-6. Refuse to send when the running\n // engine did not advertise that mode: it would call real providers.\n if (isSimulationMode()) {\n // EngineManager keeps the initialize result private.\n requireSimulationCapability(this.engine[\"initResult\"]);\n }\n const params: EvaluateBatchParams = {\n trace,\n assertions: [...assertions],\n ...(options?.budget !== undefined ? { budget: options.budget } : {}),\n ...(options?.context !== undefined ? { context: options.context } : {}),\n };\n let raw: Record<string, unknown>;\n try {\n raw = (await this.sendRequest(\n \"evaluate_batch\",\n params as unknown as Record<string, unknown>,\n options?.timeout,\n )) as Record<string, unknown>;\n } catch (err) {\n // An RPC error carries no usage, yet the engine may have called the judge first.\n if (err instanceof ProtocolError) this.engine.markUnknownSpend?.();\n throw err;\n }\n const usage = parseUsage(raw[\"usage\"]);\n this.engine.recordUsage?.(usage);\n const result = raw as unknown as EvaluateBatchResult;\n this.requireSentAssertionIds(assertions, result);\n return { ...result, usage };\n }\n\n /** Reject a response whose assertion ids differ from the ids that were sent. */\n private requireSentAssertionIds(\n assertions: readonly Assertion[],\n result: EvaluateBatchResult,\n ): void {\n const sent = new Set(assertions.map((a) => a.assertion_id));\n const returned = new Set((result.results ?? []).map((r) => r.assertion_id));\n const missing = [...sent].filter((id) => !returned.has(id));\n const unexpected = [...returned].filter((id) => !sent.has(id));\n if (missing.length === 0 && unexpected.length === 0) return;\n throw new ProtocolDesyncError(\n \"evaluate_batch response does not match the request: \" +\n `missing assertion ids [${missing.join(\", \")}], unexpected [${unexpected.join(\", \")}].`,\n this.diagnosticBuffer.snapshot(),\n );\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 async queryDrift(\n assertionId: string,\n windowSize = 50,\n options?: { timeout?: number },\n ): Promise<DriftReport> {\n if (isSimulationMode()) {\n return {\n assertion_id: assertionId,\n mean: 0.0,\n stddev: 0,\n count: 0,\n latest_score: 0.0,\n deviation: 0,\n status: \"no_data\",\n };\n }\n\n const raw = await this.sendRequest(\n \"query_drift\",\n { assertion_id: assertionId, window_size: windowSize },\n options?.timeout,\n );\n return (raw as { report: DriftReport }).report;\n }\n\n async generateUserMessage(\n persona: SimulatePersona,\n conversationHistory: readonly ConversationMessage[],\n faultConfig?: SimulateFaultConfig,\n options?: { timeout?: number },\n ): Promise<string> {\n if (isSimulationMode()) {\n return `[simulation] Hello from ${persona.name}`;\n }\n\n const params: Record<string, unknown> = {\n persona,\n conversation_history: conversationHistory,\n };\n if (faultConfig !== undefined) {\n params.fault_config = faultConfig;\n }\n let raw: unknown;\n try {\n raw = await this.sendRequest(\n \"generate_user_message\",\n params,\n options?.timeout,\n );\n } catch (err) {\n // An engine error can follow the simulated user's model call; that call keeps its reservation.\n if (err instanceof ProtocolError) this.engine.markUnknownSpend?.();\n throw err;\n }\n // The reply carries no usage: the simulated user's model call is spend the SDK cannot see.\n this.engine.markUnknownSpend?.();\n return String((raw as { message: string }).message);\n }\n}\n\n/**\n * What the engine may have spent on a request that timed out: its per-batch limits when it\n * sent any, otherwise (null) the whole remaining session budget. Methods that cannot call a\n * model reserve nothing.\n */\nfunction worstCaseReservation(method: string, params: Record<string, unknown>): BudgetReservation {\n if (method === \"generate_user_message\") return { judgeCalls: null, usd: null };\n if (method !== \"evaluate_batch\") return { judgeCalls: 0, usd: 0 };\n const assertions = (params[\"assertions\"] ?? []) as readonly Assertion[];\n const judges = assertions.some((a) => a.type === \"llm_judge\");\n const paid = judges || assertions.some((a) => a.type === \"embedding\");\n const budget = params[\"budget\"] as BatchBudget | undefined;\n return {\n judgeCalls: judges ? (budget?.max_judge_calls ?? null) : 0,\n usd: paid ? (budget?.max_cost_usd ?? null) : 0,\n };\n}\n\nfunction classifyDecodeError(message: string): ProtocolDiagnosticKind {\n if (message.startsWith(\"malformed JSON\")) return \"malformed_json\";\n if (message.startsWith(\"expected JSON object\")) return \"non_object_response\";\n if (message.startsWith(\"invalid jsonrpc version\")) return \"invalid_jsonrpc_version\";\n if (message.startsWith(\"empty response line\")) return \"malformed_json\";\n return \"malformed_json\";\n}\n\n/**\n * Throw unless the engine advertised `simulation_mode` at initialize. An\n * engine started without ATTEST_SIMULATION (or older than 1.0) would call\n * real embedding and judge providers in simulation mode.\n */\nexport function requireSimulationCapability(init: InitializeResult | null | undefined): void {\n if (init === null || init === undefined) {\n throw new Error(\"simulation mode: the engine has not been initialized\");\n }\n if (!(init.capabilities ?? []).includes(\"simulation_mode\")) {\n throw new Error(\n `simulation mode is on but attest-engine ${init.engine_version} was not started in ` +\n \"simulation mode (capability 'simulation_mode' missing), so it would call real \" +\n \"providers. Set ATTEST_SIMULATION=1 before the engine starts (the Vitest fixtures do \" +\n \"this for you) and use attest-engine 1.0 or later.\",\n );\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\n/**\n * Cache directory for this SDK's engine: `~/.attest/bin/<ENGINE_VERSION>/`.\n *\n * The directory name is the canonical engine version (for example `1.0.0`). The legacy\n * unversioned `~/.attest/bin/attest-engine` is neither read nor modified.\n */\nexport function versionedBinDir(): string {\n return path.join(os.homedir(), \".attest\", \"bin\", ENGINE_VERSION);\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\n/** The engine binary in the versioned cache, or null if it is absent. */\nexport function cachedEnginePath(): string | null {\n const binPath = path.join(versionedBinDir(), binaryFilename());\n return fs.statSync(binPath, { throwIfNoEntry: false })?.isFile() ? binPath : null;\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}${os.platform() === \"win32\" ? \".exe\" : \"\"}`;\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. Retry or download manually.`\n );\n }\n process.stderr.write(`[attest] Checksum verified.\\n`);\n\n // Atomic write: temp file + rename\n const dir = versionedBinDir();\n fs.mkdirSync(dir, { recursive: true });\n const destPath = path.join(dir, binaryFilename());\n const suffix = `${String(process.pid)}.${crypto.randomBytes(8).toString(\"hex\")}`;\n const tmpPath = path.join(dir, `.${binaryFilename()}.tmp.${suffix}`);\n try {\n fs.writeFileSync(tmpPath, data, { flag: \"wx\", mode: 0o755 });\n fs.chmodSync(tmpPath, 0o755);\n fs.renameSync(tmpPath, destPath);\n } catch (err) {\n // EEXIST means the temp name belongs to someone else; leave it alone.\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") fs.rmSync(tmpPath, { force: true });\n throw err;\n }\n\n process.stderr.write(`[attest] Engine installed at ${destPath}\\n`);\n return destPath;\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\";\nimport { activeMockRegistry } from \"./simulation/context.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 const mock = activeMockRegistry.getStore()?.get(name);\n let result = options?.result;\n if (mock !== undefined) {\n const mocked = mock(options?.args ?? {});\n if (typeof (mocked as { then?: unknown } | null)?.then === \"function\") {\n throw new Error(`mock for tool '${name}' returned a Promise; mock tools must be synchronous`);\n }\n if (typeof mocked === \"object\" && mocked !== null && !Array.isArray(mocked)) {\n result = mocked as Record<string, unknown>;\n }\n }\n this.steps.push({\n type: STEP_TOOL_CALL,\n name,\n args: options?.args,\n 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 { AsyncLocalStorage } from \"node:async_hooks\";\n\n/** Mock tool implementations active for the current async scope. */\nexport type MockToolFn = (args: Record<string, unknown>) => unknown;\n\nexport const activeMockRegistry = new AsyncLocalStorage<ReadonlyMap<string, MockToolFn>>();\n\n/**\n * Seeded PRNG (mulberry32): the same seed yields the same sequence. An\n * undefined seed uses `Math.random`. Sequences differ from Python's\n * `random.Random`; determinism holds within TS only.\n */\nexport function createRng(seed?: number): () => number {\n if (seed === undefined) return Math.random;\n let state = seed >>> 0;\n return () => {\n state = (state + 0x6d2b79f5) >>> 0;\n let t = state;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { AssertionResult, Trace, Usage } from \"./proto/types.js\";\nimport { zeroUsage } from \"./usage.js\";\nimport {\n STATUS_PASS,\n STATUS_SOFT_FAIL,\n STATUS_HARD_FAIL,\n STATUS_NOT_EVALUATED,\n OUTCOME_FAIL,\n OUTCOME_PASS,\n OUTCOME_SKIP,\n type Outcome,\n} from \"./proto/constants.js\";\n\nconst KNOWN_STATUSES: ReadonlySet<string> = new Set([\n STATUS_PASS,\n STATUS_SOFT_FAIL,\n STATUS_HARD_FAIL,\n STATUS_NOT_EVALUATED,\n]);\n\n/**\n * Normalize an engine result row. Protocol rule: an unknown status is\n * never a pass, so it becomes \"not_evaluated\".\n */\nexport function normalizeAssertionResult(r: AssertionResult): AssertionResult {\n if (KNOWN_STATUSES.has(r.status)) return r;\n return {\n ...r,\n status: STATUS_NOT_EVALUATED,\n explanation: `[unknown status '${r.status}'] ${r.explanation}`,\n };\n}\n\nexport class AgentResult {\n readonly trace: Trace;\n readonly assertionResults: readonly AssertionResult[];\n readonly totalCost: number;\n readonly totalDurationMs: number;\n /** Attest model usage of the evaluation that produced this result. */\n readonly usage: Usage;\n\n constructor(\n trace: Trace,\n assertionResults: readonly AssertionResult[] = [],\n totalCost = 0.0,\n totalDurationMs = 0,\n usage: Usage = zeroUsage(),\n ) {\n this.trace = trace;\n this.assertionResults = assertionResults.map(normalizeAssertionResult);\n this.totalCost = totalCost;\n this.totalDurationMs = totalDurationMs;\n this.usage = usage;\n }\n\n /** True if every assertion has status \"pass\". */\n get passed(): boolean {\n return this.assertionResults.every((r) => r.status === STATUS_PASS);\n }\n\n /**\n * Test outcome after the whole batch. Any hard_fail fails; otherwise any\n * not_evaluated skips (fails when `strict`); otherwise pass, including\n * when only soft_fail rows are present (see `softFailures`).\n */\n outcome(options?: { strict?: boolean }): Outcome {\n if (this.hardFailures.length > 0) return OUTCOME_FAIL;\n if (this.notEvaluated.length > 0) {\n return options?.strict === true ? OUTCOME_FAIL : OUTCOME_SKIP;\n }\n return OUTCOME_PASS;\n }\n\n /** Failed assertions: hard_fail and soft_fail only. */\n get failedAssertions(): readonly AssertionResult[] {\n return this.assertionResults.filter(\n (r) => r.status === STATUS_HARD_FAIL || r.status === STATUS_SOFT_FAIL,\n );\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 /** Assertions the engine did not evaluate; each carries a `reason`. */\n get notEvaluated(): readonly AssertionResult[] {\n return this.assertionResults.filter((r) => r.status === STATUS_NOT_EVALUATED);\n }\n\n /** Count of not_evaluated assertions per reason, in first-seen order. */\n get notEvaluatedReasons(): Readonly<Record<string, number>> {\n const counts: Record<string, number> = {};\n for (const r of this.notEvaluated) {\n const key = r.reason || \"unknown\";\n counts[key] = (counts[key] ?? 0) + 1;\n }\n return counts;\n }\n\n /**\n * Passed / evaluated assertions; null when nothing was evaluated.\n * not_evaluated rows are excluded from the denominator.\n */\n get passRate(): number | null {\n const evaluated = this.assertionResults.length - this.notEvaluated.length;\n return evaluated === 0 ? null : this.passCount / evaluated;\n }\n\n get passCount(): number {\n return this.assertionResults.filter((r) => r.status === STATUS_PASS).length;\n }\n\n /** Number of failed assertions (hard_fail + soft_fail). */\n get failCount(): number {\n return this.failedAssertions.length;\n }\n\n /** \"not evaluated: <reason>[, <reason> ×n ...]\" for skipped tests. */\n skipReason(): string {\n const parts = Object.entries(this.notEvaluatedReasons).map(([reason, n]) =>\n n === 1 ? reason : `${reason} ×${n}`,\n );\n return `not evaluated: ${parts.join(\", \")}`;\n }\n}\n","/**\n * Terminal-grade rendering of Attest assertion failures.\n *\n * Mirrors the Python attest.cli.diagnostics module so PR comments,\n * pytest output, and vitest output show the same fields. Use as the\n * message argument when asserting the verdict, e.g.\n * `expect(result.outcome(), renderDiagnostics(result)).not.toBe(\"fail\")`, so\n * reviewers see trace path, expected vs actual, and judge metadata.\n */\n\nimport type { AssertionResult, JudgeMetadata } from \"./proto/types.js\";\nimport {\n STATUS_HARD_FAIL,\n STATUS_NOT_EVALUATED,\n STATUS_PASS,\n STATUS_SOFT_FAIL,\n} from \"./proto/constants.js\";\nimport type { AgentResult } from \"./result.js\";\n\nconst ANSI_RESET = \"\u001b[0m\";\nconst ANSI_RED = \"\u001b[31m\";\nconst ANSI_YELLOW = \"\u001b[33m\";\nconst ANSI_GREEN = \"\u001b[32m\";\nconst ANSI_DIM = \"\u001b[2m\";\nconst ANSI_BOLD = \"\u001b[1m\";\n\nconst LAYER_NAMES: Record<number, string> = {\n 1: \"schema\",\n 2: \"constraint\",\n 3: \"trace\",\n 4: \"content\",\n 5: \"embedding\",\n 6: \"llm_judge\",\n 7: \"trace_tree\",\n 8: \"plugin\",\n};\n\nfunction layerLabel(layer: number, assertionType: string | undefined): string {\n if (layer === 0 && assertionType) {\n return `L? ${assertionType}`;\n }\n const name = LAYER_NAMES[layer] ?? assertionType ?? \"uncategorized\";\n return `L${layer} ${name}`;\n}\n\nfunction statusGlyph(status: string, color: boolean): string {\n let glyph: string;\n let c: string;\n if (status === STATUS_PASS) {\n glyph = \"PASS\";\n c = ANSI_GREEN;\n } else if (status === STATUS_SOFT_FAIL) {\n glyph = \"SOFT\";\n c = ANSI_YELLOW;\n } else if (status === STATUS_HARD_FAIL) {\n glyph = \"FAIL\";\n c = ANSI_RED;\n } else if (status === STATUS_NOT_EVALUATED) {\n glyph = \"N/E\";\n c = ANSI_DIM;\n } else {\n glyph = status.toUpperCase() || \"????\";\n c = ANSI_DIM;\n }\n return color ? `${c}${glyph}${ANSI_RESET}` : glyph;\n}\n\nfunction bold(s: string, color: boolean): string {\n return color ? `${ANSI_BOLD}${s}${ANSI_RESET}` : s;\n}\n\nfunction dim(s: string, color: boolean): string {\n return color ? `${ANSI_DIM}${s}${ANSI_RESET}` : s;\n}\n\nfunction truncate(value: string, limit = 280): string {\n if (value.length <= limit) {\n return value;\n }\n return value.slice(0, limit - 3) + \"...\";\n}\n\nexport interface RenderOptions {\n /** Emit ANSI colour escapes. Default false (plain text). */\n color?: boolean;\n /** Source location annotation appended after each block. */\n testFile?: string;\n /** Render passing assertions in addition to failures. Default false. */\n includePassing?: boolean;\n}\n\nexport function renderAssertionFailure(\n result: AssertionResult,\n options: RenderOptions = {},\n): string {\n const color = options.color ?? false;\n const testFile = options.testFile;\n const layer = result.layer ?? 0;\n const label = layerLabel(layer, result.type);\n\n const lines: string[] = [];\n lines.push(\n ` ${statusGlyph(result.status, color)} ${bold(result.assertion_id, color)} ${dim(`— ${label}`, color)}`,\n );\n if (result.reason) {\n lines.push(` reason: not evaluated: ${result.reason}`);\n }\n if (result.trace_node_path) {\n lines.push(` trace path: ${result.trace_node_path}`);\n }\n if (result.status !== STATUS_NOT_EVALUATED) {\n lines.push(` score: ${result.score.toFixed(3)}`);\n }\n if (result.expected) {\n lines.push(` expected: ${truncate(result.expected)}`);\n }\n if (result.actual) {\n lines.push(` actual: ${truncate(result.actual)}`);\n }\n if (result.explanation) {\n lines.push(` detail: ${truncate(result.explanation)}`);\n }\n if (result.threshold_source && result.threshold_source !== \"static\") {\n lines.push(` threshold: ${result.threshold_source}`);\n }\n if (result.failure_class) {\n lines.push(` class: ${result.failure_class}`);\n }\n if (result.judge_metadata) {\n appendJudgeMetadata(lines, result.judge_metadata);\n }\n if (result.suggested_action) {\n lines.push(` hint: ${truncate(result.suggested_action)}`);\n }\n if ((result.cost ?? 0) > 0 || (result.duration_ms ?? 0) > 0) {\n const cost = result.cost ?? 0;\n const durMs = result.duration_ms ?? 0;\n lines.push(` cost/lat: $${cost.toFixed(6)} / ${durMs}ms`);\n }\n if (testFile) {\n lines.push(` source: ${testFile}`);\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nfunction appendJudgeMetadata(lines: string[], meta: JudgeMetadata): void {\n if (meta.model) {\n let rubric = meta.rubric_name ?? \"default\";\n if (meta.rubric_version) {\n rubric = `${rubric} @ ${meta.rubric_version}`;\n }\n const judge = meta.provider ? `${meta.provider}/${meta.model}` : meta.model;\n lines.push(` judge: ${judge} / ${rubric}`);\n }\n if (meta.prompt_hash) {\n lines.push(` prompt: #${meta.prompt_hash}`);\n }\n const samples = meta.sample_scores ?? [];\n if (samples.length > 1) {\n const formatted = samples.map((s) => s.toFixed(2)).join(\", \");\n const mean = (meta.score_mean ?? 0).toFixed(2);\n const stddev = (meta.score_stddev ?? 0).toFixed(2);\n const flag = meta.high_variance ? \" ⚠ HIGH VARIANCE\" : \"\";\n lines.push(\n ` samples: [${formatted}] mean=${mean} stddev=${stddev}${flag}`,\n );\n }\n const probes = meta.bias_probes ?? [];\n if (probes.length > 0) {\n const formatted = probes\n .map((p) => `${p.name} Δ${p.delta >= 0 ? \"+\" : \"\"}${p.delta.toFixed(2)}`)\n .join(\", \");\n lines.push(` bias: ${formatted}`);\n }\n if (meta.calibration) {\n const c = meta.calibration;\n lines.push(\n ` calibrated: ${c.label_count} labels, agreement=${c.agreement.toFixed(2)}, κ=${c.cohen_kappa.toFixed(2)}`,\n );\n }\n}\n\nexport function renderSummary(\n result: AgentResult,\n options: { color?: boolean } = {},\n): string {\n const color = options.color ?? false;\n const passN = result.passCount;\n const soft = result.assertionResults.filter(\n (r) => r.status === STATUS_SOFT_FAIL,\n ).length;\n const hard = result.assertionResults.filter(\n (r) => r.status === STATUS_HARD_FAIL,\n ).length;\n const parts = [\n `${statusGlyph(STATUS_PASS, color)} ${passN}`,\n `${statusGlyph(STATUS_SOFT_FAIL, color)} ${soft}`,\n `${statusGlyph(STATUS_HARD_FAIL, color)} ${hard}`,\n `${statusGlyph(STATUS_NOT_EVALUATED, color)} ${result.notEvaluated.length}`,\n `cost $${result.totalCost.toFixed(6)}`,\n `dur ${result.totalDurationMs}ms`,\n ];\n return parts.join(\" | \");\n}\n\nexport function renderDiagnostics(\n result: AgentResult,\n options: RenderOptions = {},\n): string {\n const color = options.color ?? false;\n const includePassing = options.includePassing ?? false;\n const rows = includePassing\n ? result.assertionResults\n : result.assertionResults.filter((r) => r.status !== STATUS_PASS);\n if (rows.length === 0) {\n return dim(\" (no failures)\\n\", color);\n }\n const out: string[] = [\"\"];\n out.push(bold(`Attest diagnostic — ${headerCounts(result)}:`, color));\n for (const r of rows) {\n out.push(renderAssertionFailure(r, options));\n }\n out.push(dim(` Summary: ${renderSummary(result, { color })}`, color));\n return out.join(\"\\n\");\n}\n\n/** \"F of N assertions failed[, K not evaluated]\" — counts failures, not rows. */\nfunction headerCounts(result: AgentResult): string {\n const total = result.assertionResults.length;\n const notEvaluated = result.notEvaluated.length;\n if (result.failCount === 0 && notEvaluated > 0) {\n return `${notEvaluated} of ${total} assertions not evaluated`;\n }\n const text = `${result.failCount} of ${total} assertions failed`;\n return notEvaluated > 0 ? `${text}, ${notEvaluated} not evaluated` : text;\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_EFFECT,\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\ntype TrajectoryMode = \"strict\" | \"unordered\" | \"subset\" | \"superset\";\ntype ArgOperator = \"eq\" | \"ne\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"in\" | \"not_in\";\n\n/**\n * Each effect assertion embeds the world snapshot, and the engine refuses a request line over\n * 10 MiB; 1 MiB of that is left for the rest of the batch.\n */\nexport const MAX_WORLD_BYTES = 9 * 1024 * 1024;\n\n/** A resource's records filtered by exact field values. */\ntype Where = Record<string, unknown>;\n\n/**\n * Effect checks against one world snapshot, from {@link ExpectChain.world}. Each method adds\n * an `effect` assertion (Layer 3) to the parent chain and returns it.\n */\nexport class WorldChecks<C> {\n private readonly _snapshot: Record<string, unknown> | null;\n private readonly _add: (spec: Record<string, unknown>) => C;\n\n constructor(snapshot: Record<string, unknown> | null, add: (spec: Record<string, unknown>) => C) {\n this._snapshot = snapshot;\n this._add = add;\n }\n\n private addCheck(spec: Record<string, unknown>, where: Where | undefined): C {\n const full: Record<string, unknown> = { ...spec, world: this._snapshot };\n if (where !== undefined && Object.keys(where).length > 0) full.where = where;\n return this._add(full);\n }\n\n /**\n * Assert how many records of `resource` match `where`. Give `equals`, or `atMost` and/or\n * `atLeast`. A violation reads `effect violated: 2 refunds for O-1042 (expected 1)`.\n *\n * @throws Error when no bound is given, or `equals` is combined with another bound.\n *\n * @example\n * ```ts\n * expect(trace).world(await world.state()).count(\"refunds\", { equals: 1, where: { order_id: \"O-1042\" } });\n * ```\n */\n count(\n resource: string,\n opts: { equals?: number; atMost?: number; atLeast?: number; where?: Where },\n ): C {\n if (opts.equals === undefined && opts.atMost === undefined && opts.atLeast === undefined) {\n throw new Error(\"count needs equals, atMost or atLeast\");\n }\n if (opts.equals !== undefined && (opts.atMost !== undefined || opts.atLeast !== undefined)) {\n throw new Error(\"count: equals excludes atMost and atLeast\");\n }\n const spec: Record<string, unknown> = { check: \"count\", resource };\n if (opts.equals !== undefined) spec.equals = opts.equals;\n if (opts.atMost !== undefined) spec.at_most = opts.atMost;\n if (opts.atLeast !== undefined) spec.at_least = opts.atLeast;\n return this.addCheck(spec, opts.where);\n }\n\n /** Assert no two matching records share the same values for field(s) `by`. */\n unique(resource: string, opts: { by: string | string[]; where?: Where }): C {\n const fields = typeof opts.by === \"string\" ? [opts.by] : [...opts.by];\n if (fields.length === 0) throw new Error(\"unique needs at least one field in by\");\n return this.addCheck({ check: \"unique\", resource, fields }, opts.where);\n }\n\n /**\n * Assert every matching record carries a distinct value in field `key` (default\n * `idempotency_key`), the record field that stores the idempotency key.\n */\n idempotent(resource: string, opts: { key?: string; where?: Where } = {}): C {\n return this.addCheck(\n { check: \"idempotent\", resource, field: opts.key ?? \"idempotency_key\" },\n opts.where,\n );\n }\n}\n\nexport class ExpectChain {\n private readonly _result: AgentResult;\n private readonly _assertions: Assertion[] = [];\n private _worldBytes = 0;\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 3: Behavior contracts (tool calls only, retries counted) --\n\n /**\n * Assert how many times a tool is called, per value of argument `per` when set.\n *\n * @example\n * ```ts\n * // fails with \"issue_refund called 2× for order_id=O-1042 (max 1)\"\n * expect(result).toolCardinality(\"issue_refund\", { per: \"order_id\", atMost: 1 });\n * ```\n */\n toolCardinality(\n tool: string,\n opts: { per?: string; atMost?: number; atLeast?: number; soft?: boolean },\n ): this {\n if (opts.atMost === undefined && opts.atLeast === undefined) {\n throw new Error(\"toolCardinality needs atMost, atLeast or both\");\n }\n const spec: Record<string, unknown> = { check: \"tool_cardinality\", tool };\n if (opts.per !== undefined) spec.per = opts.per;\n if (opts.atLeast !== undefined) spec.min = opts.atLeast;\n if (opts.atMost !== undefined) spec.max = opts.atMost;\n spec.soft = opts.soft ?? false;\n return this.add(TYPE_TRACE, spec);\n }\n\n /**\n * Assert the tool-call trajectory matches `tools`: `strict` (same sequence,\n * the default), `unordered` (same calls, any order), `subset` (no call\n * outside `tools`) or `superset` (every call in `tools` made). Use\n * {@link trajectoryPartialOrder} for ordering constraints.\n */\n trajectory(tools: string[], opts?: { mode?: TrajectoryMode; soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"trajectory\",\n mode: opts?.mode ?? \"strict\",\n tools,\n soft: opts?.soft ?? false,\n });\n }\n\n /**\n * Assert every tool in `tools` and `order` is called and each\n * `[before, after]` pair holds as in {@link toolCalledBefore}.\n */\n trajectoryPartialOrder(\n order: Array<[string, string]>,\n opts?: { tools?: string[]; soft?: boolean },\n ): this {\n const spec: Record<string, unknown> = {\n check: \"trajectory\",\n mode: \"partial_order\",\n order: order.map(([before, after]) => [before, after]),\n };\n if (opts?.tools !== undefined) spec.tools = opts.tools;\n spec.soft = opts?.soft ?? false;\n return this.add(TYPE_TRACE, spec);\n }\n\n /** Assert every call to `after` has an earlier call to `before`; holds when `after` is never called. */\n toolCalledBefore(before: string, after: string, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, { check: \"tool_order\", before, after, soft: opts?.soft ?? false });\n }\n\n /** Assert no block of `period` (1–4) tool calls repeats `minRepeats` (default 2) times in a row; A→B→A→B fails period 2. */\n noToolCycles(period: number, opts?: { minRepeats?: number; soft?: boolean }): this {\n return this.add(TYPE_TRACE, {\n check: \"cycle\",\n period,\n min_repeats: opts?.minRepeats ?? 2,\n soft: opts?.soft ?? false,\n });\n }\n\n /** Assert at most `maxStreak` consecutive tool calls end in error (trace v2). */\n maxToolFailureStreak(maxStreak: number, opts?: { soft?: boolean }): this {\n return this.add(TYPE_TRACE, { check: \"failure_streak\", max: maxStreak, soft: opts?.soft ?? false });\n }\n\n /**\n * Assert every call to `tool` has argument `arg` (a dot path) satisfying\n * `op value`; holds when `tool` is never called.\n */\n toolArgSatisfies(\n tool: string,\n arg: string,\n op: ArgOperator,\n value: unknown,\n opts?: { soft?: boolean },\n ): this {\n return this.add(TYPE_TRACE, {\n check: \"arg_predicate\",\n tool,\n arg,\n op,\n value,\n soft: opts?.soft ?? false,\n });\n }\n\n // -- Layer 3: Effect checks (the external system the agent acted on) --\n\n /**\n * Check effects in a world snapshot:\n * `expect(trace).world(await world.state()).count(...)`. `null` means the test ran without\n * a world helper: the checks are `not_evaluated` (`missing_evidence`).\n */\n world(snapshot: Record<string, unknown> | null): WorldChecks<this> {\n const size = new TextEncoder().encode(JSON.stringify(snapshot)).length;\n return new WorldChecks<this>(snapshot, (spec) => {\n this._worldBytes += size;\n if (this._worldBytes > MAX_WORLD_BYTES) {\n throw new Error(\n `effect checks would send the ${size}-byte world snapshot ` +\n `${Math.floor(this._worldBytes / Math.max(size, 1))} times (${this._worldBytes} bytes), ` +\n `over the ${MAX_WORLD_BYTES}-byte limit of one request; use fewer checks per test ` +\n `or scope the world to less state`,\n );\n }\n return this.add(TYPE_EFFECT, spec);\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 | \"dynamic\"; 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 | \"dynamic\"; 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","/**\n * Capture: turn a run into a verified fixture, and fixtures into tests.\n *\n * `attest capture --name <name> -- <command>` (the engine) records a run's trace and model\n * exchanges into `tests/attest/fixtures/<name>.attest.json`. This module is the TypeScript\n * side:\n *\n * - `record()` captures the code in a callback in this process.\n * - `loadFixture()` reads a fixture (`proto/attest/v1/fixture-v1.schema.json`).\n * - `emitVitest()` writes the fixture's drafted contracts as a Vitest file, using the\n * `attestExpect()` DSL. `attest capture` and `record()` call it.\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolveEngine } from \"./engine-manager.js\";\nimport type { Trace } from \"./proto/types.js\";\n\nexport const FIXTURE_VERSION = 1;\nexport const DEFAULT_FIXTURE_DIR = path.join(\"tests\", \"attest\", \"fixtures\");\n\n/** A capture did not produce a fixture, or produced one that is not verified. */\nexport class CaptureError extends Error {\n /** The fixture written, when the engine wrote one. */\n readonly fixture: string | null;\n\n constructor(message: string, fixture: string | null = null) {\n super(message);\n this.name = \"CaptureError\";\n this.fixture = fixture;\n }\n}\n\n/** A drafted contract: an engine assertion spec plus its id and description. */\nexport interface Contract {\n id: string;\n kind: string;\n description: string;\n type: string;\n spec: Record<string, unknown>;\n}\n\n/** A contract's status on the captured trace. */\nexport interface ContractResult {\n contract: string;\n status: string;\n explanation: string;\n}\n\n/** A capture fixture (fixture-v1). */\nexport interface Fixture {\n name: string;\n source: { kind: string; replay_capable: boolean; command?: string[]; exit_code?: number };\n trace: Trace;\n exchanges: Record<string, unknown>[];\n contracts: Contract[];\n verification: {\n verified: boolean;\n expect_fail: boolean;\n trace_check: { ok: boolean; errors: number; warnings: number };\n results: ContractResult[];\n expected_failures: string[];\n };\n world: Record<string, unknown> | null;\n}\n\nfunction toPath(p: string | URL): string {\n return p instanceof URL ? fileURLToPath(p) : p;\n}\n\n/** Read a capture fixture written by `attest capture` or `record()`. */\nexport function loadFixture(file: string | URL): Fixture {\n const p = toPath(file);\n const doc = JSON.parse(fs.readFileSync(p, \"utf8\")) as unknown;\n if (!isObject(doc) || doc[\"fixture_version\"] !== FIXTURE_VERSION) {\n throw new CaptureError(`${p}: not a fixture_version ${FIXTURE_VERSION} capture fixture`);\n }\n validate(p, doc);\n return doc as unknown as Fixture;\n}\n\n/** Fixture names, as the engine accepts them (they become file names). */\nexport const NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;\n\ntype Kind = \"string\" | \"boolean\" | \"object\" | \"array\";\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction kindOf(v: unknown): Kind | \"other\" {\n if (Array.isArray(v)) return \"array\";\n if (isObject(v)) return \"object\";\n if (typeof v === \"string\" || typeof v === \"boolean\") return typeof v as Kind;\n return \"other\";\n}\n\n/** Check the fixture-v1 fields this module reads before using any of them. */\nfunction validate(p: string, doc: Record<string, unknown>): void {\n const need = (where: string, obj: unknown, fields: Record<string, Kind>): Record<string, unknown> => {\n if (!isObject(obj)) throw new CaptureError(`${p}: ${where} is not an object`);\n for (const [key, kind] of Object.entries(fields)) {\n if (kindOf(obj[key]) !== kind) throw new CaptureError(`${p}: ${where}.${key} is missing or not a ${kind}`);\n }\n return obj;\n };\n need(\"fixture\", doc, { name: \"string\", source: \"object\", trace: \"object\", exchanges: \"array\", contracts: \"array\", verification: \"object\" });\n if (!(\"world\" in doc)) throw new CaptureError(`${p}: fixture.world is missing`);\n if (!NAME_PATTERN.test(doc[\"name\"] as string)) {\n throw new CaptureError(`${p}: fixture name ${JSON.stringify(doc[\"name\"])} is not a valid fixture name`);\n }\n const v = need(\"fixture.verification\", doc[\"verification\"], {\n verified: \"boolean\",\n expect_fail: \"boolean\",\n results: \"array\",\n expected_failures: \"array\",\n });\n (doc[\"contracts\"] as unknown[]).forEach((c, i) =>\n need(`fixture.contracts[${i}]`, c, { id: \"string\", kind: \"string\", description: \"string\", type: \"string\", spec: \"object\" }),\n );\n (v[\"results\"] as unknown[]).forEach((r, i) =>\n need(`fixture.verification.results[${i}]`, r, { contract: \"string\", status: \"string\", explanation: \"string\" }),\n );\n}\n\n// ---------------------------------------------------------------------------- emitter\n\n/**\n * An object-literal key for `k`. `__proto__` must be a computed key: written plain or\n * quoted it sets the object's prototype instead of a property.\n */\nfunction objectKey(k: string): string {\n if (k === \"__proto__\") return `[${JSON.stringify(k)}]`;\n return /^[A-Za-z_$][\\w$]*$/.test(k) ? k : JSON.stringify(k);\n}\n\n/** Make captured text safe inside a `//` comment: one line, no control characters. */\nfunction comment(text: string): string {\n return text.replace(/[\\p{Cc}\\p{Zl}\\p{Zp}]/gu, \" \");\n}\n\n/** Render a JSON value as a TypeScript literal. */\nfunction ts(value: unknown): string {\n if (value === null || typeof value === \"boolean\" || typeof value === \"number\") {\n return JSON.stringify(value);\n }\n if (typeof value === \"string\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(ts).join(\", \")}]`;\n if (typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>).map(\n ([k, v]) => `${objectKey(k)}: ${ts(v)}`,\n );\n return entries.length === 0 ? \"{}\" : `{ ${entries.join(\", \")} }`;\n }\n throw new Error(`value ${String(value)} has no literal`);\n}\n\nfunction str(spec: Record<string, unknown>, key: string): string {\n const v = spec[key];\n if (typeof v !== \"string\") throw new Error(`missing ${key}`);\n return v;\n}\n\nfunction options(entries: Array<[string, unknown]>): string {\n const set = entries.filter(([, v]) => v !== undefined && v !== null && v !== false);\n return set.length === 0 ? \"\" : `{ ${set.map(([k, v]) => `${k}: ${ts(v)}`).join(\", \")} }`;\n}\n\nfunction call(method: string, args: string[], opts: string): string {\n return `.${method}(${[...args, ...(opts ? [opts] : [])].join(\", \")})`;\n}\n\n/** The `ExpectChain` method call that emits `contract`'s spec; throws when there is none. */\nexport function dslCall(contract: Contract): string {\n const s = contract.spec;\n const soft = s[\"soft\"] === true ? true : undefined;\n try {\n if (contract.type === \"trace\") {\n const check = s[\"check\"];\n if (check === \"trajectory\" && s[\"mode\"] !== \"partial_order\") {\n const mode = s[\"mode\"] === \"strict\" || s[\"mode\"] === undefined ? undefined : s[\"mode\"];\n if (!Array.isArray(s[\"tools\"])) throw new Error(\"missing tools\");\n return call(\"trajectory\", [ts(s[\"tools\"])], options([[\"mode\", mode], [\"soft\", soft]]));\n }\n if (check === \"tool_order\") {\n return call(\"toolCalledBefore\", [ts(str(s, \"before\")), ts(str(s, \"after\"))], options([[\"soft\", soft]]));\n }\n if (check === \"tool_cardinality\") {\n return call(\n \"toolCardinality\",\n [ts(str(s, \"tool\"))],\n options([\n [\"per\", s[\"per\"]],\n [\"atLeast\", s[\"min\"]],\n [\"atMost\", s[\"max\"]],\n [\"soft\", soft],\n ]),\n );\n }\n }\n if (contract.type === \"schema\" && s[\"target\"] === \"output.structured\") {\n if (typeof s[\"schema\"] !== \"object\" || s[\"schema\"] === null) throw new Error(\"missing schema\");\n return call(\"outputMatchesSchema\", [ts(s[\"schema\"])], \"\");\n }\n if (contract.type === \"constraint\" && s[\"field\"] === \"metadata.cost_usd\" && s[\"operator\"] === \"lte\") {\n if (typeof s[\"value\"] !== \"number\") throw new Error(\"missing value\");\n return call(\"costUnder\", [ts(s[\"value\"])], options([[\"soft\", soft]]));\n }\n } catch (err) {\n throw new Error(`contract ${contract.id}: malformed spec (${(err as Error).message})`);\n }\n throw new Error(`contract ${contract.id}: no TypeScript DSL call for ${contract.type} spec`);\n}\n\n/**\n * Where the drafted test for a fixture goes: `tests/attest/<name>.test.ts` for\n * `tests/attest/fixtures/<name>.attest.json`.\n */\nexport function testPathFor(fixturePath: string): string {\n const name = path.basename(fixturePath).replace(/\\.attest\\.json$/, \"\");\n return path.join(path.dirname(path.dirname(fixturePath)), `${name}.test.ts`);\n}\n\n/**\n * Render a fixture's drafted contracts as a Vitest module.\n *\n * A verified fixture becomes a test that enforces every contract with `evaluate`. An\n * incident reproduction (`expect_fail`) becomes a test that checks, with `inspect`, that\n * the expected failures still fail and the other contracts still pass; it stays green\n * while it reproduces the incident.\n */\nexport function renderVitest(fixture: Fixture, fixturePath: string, testPath: string): string {\n const calls: Array<[Contract, string]> = [];\n const skipped: string[] = [];\n for (const c of fixture.contracts) {\n try {\n calls.push([c, dslCall(c)]);\n } catch (err) {\n skipped.push((err as Error).message);\n }\n }\n const rel = path.relative(path.dirname(testPath), fixturePath).split(path.sep).join(\"/\");\n const status = new Map(fixture.verification.results.map((r) => [r.contract, r.status]));\n const expectFail = fixture.verification.expect_fail;\n\n const lines = [\n `// Contracts drafted by \\`attest capture\\` from fixture ${comment(ts(fixture.name))}.`,\n \"//\",\n \"// Review and edit before committing: they check the captured trace without running\",\n \"// the agent. Re-capturing does not overwrite this file.\",\n `import { attestExpect, loadFixture, type ExpectChain } from \"@attest-ai/core\";`,\n `import { ${expectFail ? \"inspect\" : \"evaluate\"} } from \"@attest-ai/vitest\";`,\n `import { describe, ${expectFail ? \"expect, \" : \"\"}it } from \"vitest\";`,\n \"\",\n `const FIXTURE = loadFixture(new URL(${ts(rel.startsWith(\".\") ? rel : `./${rel}`)}, import.meta.url));`,\n ];\n if (skipped.length > 0) {\n lines.push(\"\", \"// Drafted contracts without a TypeScript DSL call (left out):\");\n for (const s of skipped) lines.push(`// - ${comment(s)}`);\n }\n lines.push(\"\", \"function contracts(): ExpectChain {\", \" return attestExpect(FIXTURE.trace)\");\n for (const [c, dsl] of calls) {\n lines.push(` // ${comment(`${c.id}: ${c.description}`)}`, ` ${dsl}`);\n }\n lines[lines.length - 1] += \";\";\n lines.push(\"}\");\n if (expectFail) {\n lines.push(\"\", \"// Status of each contract on the captured incident, in contracts() order.\");\n lines.push(\"const EXPECTED: Array<[string, string]> = [\");\n for (const [c] of calls) lines.push(` [${ts(c.id)}, ${ts(status.get(c.id) ?? \"pass\")}],`);\n lines.push(\n \"];\",\n \"\",\n `describe(${ts(fixture.name)}, () => {`,\n ` it(\"reproduces the incident\", async () => {`,\n \" const result = await inspect(contracts());\",\n \"\",\n \" expect(result.assertionResults.map((row) => row.status)).toEqual(EXPECTED.map(([, s]) => s));\",\n \" });\",\n \"});\",\n );\n } else {\n lines.push(\n \"\",\n `describe(${ts(fixture.name)}, () => {`,\n ` it(\"keeps its drafted contracts\", async () => {`,\n \" await evaluate(contracts());\",\n \" });\",\n \"});\",\n );\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Write the drafted Vitest file for a fixture unless it already exists. Returns the path\n * written, or null when a test file is already there (re-capturing never overwrites an\n * edited test).\n */\nexport function emitVitest(fixturePath: string): string | null {\n const testPath = testPathFor(fixturePath);\n const existing = fs.lstatSync(testPath, { throwIfNoEntry: false });\n if (existing?.isSymbolicLink()) {\n throw new CaptureError(`${testPath} is a symbolic link; refusing to draft a test through it`);\n }\n if (existing !== undefined) return null;\n const source = renderVitest(loadFixture(fixturePath), fixturePath, testPath);\n fs.mkdirSync(path.dirname(testPath), { recursive: true });\n // Create exclusively: \"wx\" fails on any existing path, a link planted after\n // the check included, and never writes through it.\n try {\n fs.writeFileSync(testPath, source, { encoding: \"utf8\", flag: \"wx\" });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw new CaptureError(`${testPath} appeared while drafting; left unchanged`);\n }\n throw err;\n }\n return testPath;\n}\n\n// ---------------------------------------------------------------------------- record()\n\n/** A running in-process capture. */\nexport interface Capture {\n name: string;\n /** The variables `record()` set in `process.env` for the callback. */\n env: Record<string, string>;\n}\n\nexport interface RecordOptions {\n /** Fixture directory (default `tests/attest/fixtures`). */\n outDir?: string;\n /** Save an incident reproduction: verified when drafted contracts fail. */\n expectFail?: boolean;\n /** Trace `agent_id` (default: the first turn's agent name). */\n agentId?: string;\n /** Write the drafted Vitest file (default true). */\n emitTest?: boolean;\n /** Engine binary (default: the SDK's engine discovery). */\n enginePath?: string;\n /**\n * A `world.yaml` to host for the callback (the engine's `--world`): its base URL variable\n * (`PAYMENTS_BASE_URL`) is set for the callback and the world's final state is saved in\n * the fixture's `world` section.\n */\n world?: string;\n /**\n * Called after the callback returns and before the fixture is built; pass the tracer\n * provider's `forceFlush` so batched spans reach the receiver.\n */\n flush?: () => unknown;\n}\n\nexport interface RecordResult<T> {\n value: T;\n fixture: string;\n verified: boolean;\n /**\n * `verified`, `not_verified` or `nothing_to_verify`: a healthy run with no tool call,\n * structured output or cost to draft a contract from. `record` throws for\n * `not_verified`; `nothing_to_verify` returns `verified: false` and no test file.\n */\n outcome: \"verified\" | \"nothing_to_verify\";\n testFile: string | null;\n}\n\ninterface ServeExit {\n code: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n}\n\ninterface ServeProcess {\n ready: Promise<string | null>;\n finish(finalize: boolean): Promise<ServeExit>;\n}\n\nfunction serve(engine: string, args: string[]): ServeProcess {\n const child = spawn(engine, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n let resolveReady: (line: string | null) => void = () => undefined;\n const ready = new Promise<string | null>((resolve) => {\n resolveReady = resolve;\n });\n const exited = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve) => {\n child.on(\"close\", (code, signal) => {\n resolveReady(null);\n resolve({ code, signal });\n });\n child.on(\"error\", (err) => {\n stderr += err.message;\n resolveReady(null);\n resolve({ code: null, signal: null });\n });\n });\n child.stdout.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stdout += chunk;\n const nl = stdout.indexOf(\"\\n\");\n if (nl >= 0) resolveReady(stdout.slice(0, nl));\n });\n child.stderr.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n // An engine that already exited cannot take \"finalize\"; its exit still says why.\n child.stdin.on(\"error\", () => undefined);\n return {\n ready,\n async finish(finalize) {\n // The environment as it is now: secrets the callback loaded (a dotenv\n // file, for example) are redacted too.\n if (finalize) {\n const environ = Object.entries(process.env).flatMap(([k, v]) => (v === undefined ? [] : [`${k}=${v}`]));\n child.stdin.write(`${JSON.stringify({ finalize: true, environ })}\\n`);\n }\n child.stdin.end();\n const { code, signal } = await exited;\n return { code, signal, stdout, stderr };\n },\n };\n}\n\nfunction readyEnv(line: string | null): Record<string, string> | null {\n if (line === null) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return null;\n }\n const env = (parsed as { env?: unknown } | null)?.env;\n if (typeof env !== \"object\" || env === null) return null;\n const entries = Object.entries(env);\n if (!entries.every(([, v]) => typeof v === \"string\")) return null;\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\nfunction exitDetail(exit: ServeExit): string {\n const how = exit.signal !== null ? `killed by ${exit.signal}` : `exit ${String(exit.code)}`;\n const err = exit.stderr.trim();\n return err ? `${how}: ${err}` : how;\n}\n\nfunction restore(saved: Map<string, string | undefined>): void {\n for (const [k, v] of saved) {\n if (v === undefined) delete process.env[k];\n else process.env[k] = v;\n }\n}\n\n// record() sets process-wide environment variables, so a second concurrent capture\n// would save and later restore the first one's values.\nlet recording = false;\n\n/**\n * Capture `fn` as fixture `<outDir>/<name>.attest.json`.\n *\n * Starts `attest-engine capture --serve`, which hosts the recording proxy and the\n * OTLP/HTTP receiver on 127.0.0.1, and sets `OPENAI_BASE_URL`, `ANTHROPIC_BASE_URL` and\n * `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` while `fn` runs. Model clients and the\n * OpenTelemetry exporter read these when they are constructed, so construct them inside\n * `fn`, and pass the tracer provider's `forceFlush` as `flush`. Afterwards the variables\n * are restored and the engine writes the fixture; for a verified fixture with `emitTest`\n * the drafted Vitest file is written unless one exists. If `fn` throws, the capture is\n * abandoned and no fixture is written. Captures cannot overlap.\n *\n * @throws CaptureError when another capture is running, the engine writes no fixture,\n * or the fixture is not verified (a drafted contract did not hold, the trace check\n * failed or no model call was recorded; the fixture is still written and no test is\n * drafted). A healthy run with nothing to draft a contract from does not throw: the\n * result has `outcome: \"nothing_to_verify\"`, `verified: false` and no test file.\n */\nexport async function record<T>(\n name: string,\n fn: (capture: Capture) => T | Promise<T>,\n opts: RecordOptions = {},\n): Promise<RecordResult<T>> {\n if (recording) throw new CaptureError(\"record() is already running; captures cannot overlap\");\n recording = true;\n try {\n return await recordExclusive(name, fn, opts);\n } finally {\n recording = false;\n }\n}\n\nasync function recordExclusive<T>(\n name: string,\n fn: (capture: Capture) => T | Promise<T>,\n opts: RecordOptions,\n): Promise<RecordResult<T>> {\n const engine = await resolveEngine(opts.enginePath);\n const args = [\"capture\", \"--serve\", \"--name\", name, \"--out-dir\", opts.outDir ?? DEFAULT_FIXTURE_DIR];\n if (opts.expectFail) args.push(\"--expect-fail\");\n if (opts.agentId !== undefined) args.push(\"--agent-id\", opts.agentId);\n if (opts.world !== undefined) args.push(\"--world\", path.resolve(opts.world));\n const proc = serve(engine, args);\n const env = readyEnv(await proc.ready);\n if (env === null) {\n const exit = await proc.finish(false);\n throw new CaptureError(`attest-engine capture --serve did not start (${exitDetail(exit)})`);\n }\n const saved = new Map(Object.keys(env).map((k) => [k, process.env[k]]));\n Object.assign(process.env, env);\n let value: T;\n try {\n value = await fn({ name, env });\n if (opts.flush) await opts.flush();\n } catch (err) {\n restore(saved);\n await proc.finish(false);\n throw err;\n }\n restore(saved);\n const exit = await proc.finish(true);\n process.stderr.write(exit.stderr);\n const lines = exit.stdout.trim().split(\"\\n\");\n if (lines.length < 2) {\n throw new CaptureError(`capture ${name} wrote no fixture (${exitDetail(exit)})`);\n }\n const outcome = JSON.parse(lines[lines.length - 1] ?? \"\") as {\n fixture: string;\n verified: boolean;\n outcome: \"verified\" | \"not_verified\" | \"nothing_to_verify\";\n };\n if (exit.code !== 0 || outcome.outcome === \"not_verified\") {\n throw new CaptureError(`capture ${name}: fixture ${outcome.fixture} is not verified; no test drafted`, outcome.fixture);\n }\n if (outcome.outcome === \"nothing_to_verify\") {\n return { value, fixture: outcome.fixture, verified: false, outcome: \"nothing_to_verify\", testFile: null };\n }\n const testFile = opts.emitTest === false ? null : emitVitest(outcome.fixture);\n return { value, fixture: outcome.fixture, verified: true, outcome: \"verified\", testFile };\n}\n","/**\n * Replay: run the agent's real code with model responses served from a fixture.\n *\n * `startReplay(name)` starts `attest-engine replay --serve`, which hosts the replay\n * proxy on 127.0.0.1, and sets `OPENAI_BASE_URL`, `ANTHROPIC_BASE_URL` and\n * `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` until `finish()`. The proxy answers every model\n * request from `<fixturesDir>/<name>.attest.json` and makes no provider call. A request\n * that matches no recording is a miss; `finish()` returns the engine's summary.\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { DEFAULT_FIXTURE_DIR, NAME_PATTERN } from \"./capture.js\";\nimport { egressBlockRequested, egressGuardActive } from \"./egress.js\";\nimport { resolveEngine } from \"./engine-manager.js\";\n\nexport type ReplayMode = \"strict\" | \"auto\";\nexport type ReplayModeSetting = ReplayMode | \"off\";\n\n/** One request the agent made during the replay. */\nexport interface ReplayRecord {\n seq: number;\n provider: string;\n api: string;\n outcome: \"replayed\" | \"live\" | \"miss\";\n exchange?: number;\n message?: string;\n}\n\n/** What the replay session served, as the engine reports it. */\nexport interface ReplaySummary {\n fixture: string;\n mode: ReplayMode;\n replayed: number;\n live: number;\n misses: number;\n unused: number;\n live_cost_usd: number;\n unpriced_live_calls: number;\n records: ReplayRecord[];\n}\n\n/** A strict-mode replay request matched no recording. `message` is the engine's miss message. */\nexport class ReplayMissError extends Error {\n constructor(\n message: string,\n readonly summary: ReplaySummary,\n ) {\n super(message);\n this.name = \"ReplayMissError\";\n }\n}\n\n/** An auto-mode replay request matched no recording and no provider key was set: `not_evaluated: replay_miss`. */\nexport class ReplayNotEvaluatedError extends Error {\n constructor(\n message: string,\n readonly summary: ReplaySummary,\n ) {\n super(message);\n this.name = \"ReplayNotEvaluatedError\";\n }\n}\n\n/** Escape control and format characters (Unicode Cc, Cf; newlines, ESC) as \\uXXXX. */\nexport function escapeControl(text: string): string {\n return text.replace(/[\\p{Cc}\\p{Cf}]/gu, (c) => `\\\\u${(c.codePointAt(0) ?? 0).toString(16).padStart(4, \"0\")}`);\n}\n\nexport class ReplayError extends Error {\n constructor(message: string) {\n super(escapeControl(message));\n this.name = \"ReplayError\";\n }\n}\n\nexport interface ReplayOptions {\n /** Fixture directory (default `tests/attest/fixtures`). */\n fixturesDir?: string;\n /** `strict`, `auto` or `off`; default per `resolveMode`. `off` starts nothing. */\n mode?: ReplayModeSetting;\n /**\n * Pass `--no-live` to the engine: no miss is forwarded live. Default: `ATTEST_EGRESS=block`.\n * An installed egress guard always implies it.\n */\n noLive?: boolean;\n /** Engine binary (default: the SDK's engine discovery). */\n enginePath?: string;\n}\n\nexport interface ReplaySession {\n readonly name: string;\n readonly mode: ReplayModeSetting;\n /** The variables the session set in `process.env`. */\n readonly env: Record<string, string>;\n /** The summary once `finish()` has run, else `null`. */\n readonly summary: ReplaySummary | null;\n /** Stop the engine, restore the environment and return the summary (`null` for `off`). Idempotent. */\n finish(): Promise<ReplaySummary | null>;\n /** The error a miss raises (valid after `finish()`): strict => miss, auto => not evaluated. */\n error(): ReplayMissError | ReplayNotEvaluatedError | null;\n /** `finish()`, then throw `error()` if any. */\n check(): Promise<void>;\n}\n\n/**\n * Replay mode from `explicit`, else `ATTEST_REPLAY` (`strict|auto|off`), else `strict`\n * when `CI` is set, else `auto`.\n */\nexport function resolveMode(\n explicit?: ReplayModeSetting,\n env: NodeJS.ProcessEnv = process.env,\n): ReplayModeSetting {\n if (explicit !== undefined) return checkMode(explicit, \"mode\");\n const fromEnv = (env.ATTEST_REPLAY ?? \"\").trim().toLowerCase();\n if (fromEnv !== \"\") return checkMode(fromEnv, \"ATTEST_REPLAY\");\n const ci = (env.CI ?? \"\").trim().toLowerCase();\n return ci !== \"\" && ci !== \"false\" && ci !== \"0\" ? \"strict\" : \"auto\";\n}\n\nfunction checkMode(value: string, where: string): ReplayModeSetting {\n if (value === \"strict\" || value === \"auto\" || value === \"off\") return value;\n throw new ReplayError(`${where} must be strict, auto or off, got ${JSON.stringify(value)}`);\n}\n\n// startReplay() sets process-wide environment variables, so sessions cannot overlap.\nlet active: string | null = null;\n\n/** Start a replay session for fixture `name`. Sessions cannot overlap. */\nexport async function startReplay(name: string, opts: ReplayOptions = {}): Promise<ReplaySession> {\n if (!NAME_PATTERN.test(name)) throw new ReplayError(`invalid fixture name ${JSON.stringify(name)}`);\n const resolved = resolveMode(opts.mode);\n if (resolved === \"off\") return offSession(name);\n const mode: ReplayMode = resolved;\n if (active !== null) throw new ReplayError(`replay of ${active} is already running; sessions cannot overlap`);\n active = name;\n try {\n return await start(name, mode, opts);\n } catch (err) {\n active = null;\n throw err;\n }\n}\n\nfunction offSession(name: string): ReplaySession {\n return {\n name,\n mode: \"off\",\n env: {},\n summary: null,\n finish: () => Promise.resolve(null),\n error: () => null,\n check: () => Promise.resolve(),\n };\n}\n\nfunction missError(mode: ReplayMode, summary: ReplaySummary): ReplayMissError | ReplayNotEvaluatedError | null {\n if (summary.misses === 0) return null;\n const message = escapeControl(firstMiss(summary) ?? \"replay miss\");\n return mode === \"auto\" ? new ReplayNotEvaluatedError(message, summary) : new ReplayMissError(message, summary);\n}\n\nasync function start(name: string, mode: ReplayMode, opts: ReplayOptions): Promise<ReplaySession> {\n const engine = await resolveEngine(opts.enginePath);\n const fixturesDir = path.resolve(opts.fixturesDir ?? DEFAULT_FIXTURE_DIR);\n const blocking = egressGuardActive() || (opts.noLive ?? egressBlockRequested());\n const args = [\"replay\", \"--serve\", \"--name\", name, \"--fixtures-dir\", fixturesDir, \"--mode\", mode];\n if (blocking) args.push(\"--no-live\");\n const child = spawn(engine, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n let resolveReady: (line: string | null) => void = () => undefined;\n const ready = new Promise<string | null>((resolve) => {\n resolveReady = resolve;\n });\n const exited = new Promise<number | null>((resolve) => {\n child.on(\"close\", (code) => {\n resolveReady(null);\n resolve(code);\n });\n child.on(\"error\", (err) => {\n stderr += err.message;\n resolveReady(null);\n resolve(null);\n });\n });\n child.stdout.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stdout += chunk;\n const nl = stdout.indexOf(\"\\n\");\n if (nl >= 0) resolveReady(stdout.slice(0, nl));\n });\n child.stderr.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.stdin.on(\"error\", () => undefined);\n\n const stop = async (): Promise<{ code: number | null; stdout: string; stderr: string }> => {\n child.stdin.write(\"stop\\n\");\n child.stdin.end();\n return { code: await exited, stdout, stderr };\n };\n\n const env = parseEnv(await ready);\n if (env === null) {\n const out = await stop();\n active = null;\n throw new ReplayError(`attest-engine replay --serve did not start: ${out.stderr.trim() || `exit ${String(out.code)}`}`);\n }\n const saved = new Map<string, string | undefined>(Object.keys(env).map((k) => [k, process.env[k]]));\n Object.assign(process.env, env);\n\n let summary: ReplaySummary | null = null;\n let finishing: Promise<ReplaySummary> | null = null;\n const finish = (): Promise<ReplaySummary> => {\n finishing ??= (async () => {\n for (const [k, v] of saved) {\n if (v === undefined) delete process.env[k];\n else process.env[k] = v;\n }\n const out = await stop();\n active = null;\n const parsed = parseSummary(out.stdout);\n if (parsed === null) {\n throw new ReplayError(`replay ${name} wrote no summary (exit ${String(out.code)}): ${out.stderr.trim()}`);\n }\n if (blocking && parsed.live > 0) {\n throw new ReplayError(\n `replay ${name}: ${String(parsed.live)} live model calls while the egress guard is blocking`,\n );\n }\n summary = parsed;\n return parsed;\n })();\n return finishing;\n };\n return {\n name,\n mode,\n env,\n get summary() {\n return summary;\n },\n finish,\n error: () => (summary === null ? null : missError(mode, summary)),\n check: async () => {\n await finish();\n const err = summary === null ? null : missError(mode, summary);\n if (err !== null) throw err;\n },\n };\n}\n\nexport function parseEnv(line: string | null): Record<string, string> | null {\n if (line === null) return null;\n try {\n const env = (JSON.parse(line) as { env?: unknown }).env;\n if (typeof env !== \"object\" || env === null) return null;\n const entries = Object.entries(env);\n if (!entries.every(([, v]) => typeof v === \"string\")) return null;\n return Object.fromEntries(entries) as Record<string, string>;\n } catch {\n return null;\n }\n}\n\nfunction parseSummary(out: string): ReplaySummary | null {\n const lines = out.trim().split(\"\\n\");\n try {\n const s = (JSON.parse(lines[lines.length - 1] ?? \"\") as { summary?: ReplaySummary }).summary;\n if (s === undefined || !Array.isArray(s.records)) return null;\n for (const r of s.records) if (r.message !== undefined) r.message = escapeControl(r.message);\n return s;\n } catch {\n return null;\n }\n}\n\n/** The first miss message of a summary, or `null`. */\nexport function firstMiss(summary: ReplaySummary): string | null {\n return summary.records.find((r) => r.outcome === \"miss\")?.message ?? null;\n}\n\n/** `N live model calls · $X.XX`, plus ` (+N unpriced)`. */\nexport function liveLine(live: number, costUsd: number, unpriced = 0): string {\n const line = `${String(live)} live model ${live === 1 ? \"call\" : \"calls\"} · $${costUsd.toFixed(2)}`;\n return unpriced > 0 ? `${line} (+${String(unpriced)} unpriced)` : line;\n}\n","/**\n * Egress guard: fail in-process connections to known model-provider hosts.\n *\n * Replay serves model responses from a fixture, so a connection to a provider means the\n * agent bypassed the proxy. `installEgressGuard()` patches `net.Socket.prototype.connect`\n * (which every client reaches: undici `fetch`, `http`, `https`, `tls`), refuses provider\n * hostnames and always allows loopback.\n */\n\nimport * as net from \"node:net\";\n\nexport const PROVIDER_HOSTS: readonly (string | RegExp)[] = [\n \"api.openai.com\",\n \"api.anthropic.com\",\n \"generativelanguage.googleapis.com\",\n /\\.openai\\.azure\\.com$/,\n];\n\nexport class EgressBlockedError extends Error {\n constructor(readonly host: string) {\n super(\n `attest egress guard: connection to model provider ${host} blocked; ` +\n `the agent must reach models through the replay proxy (OPENAI_BASE_URL / ANTHROPIC_BASE_URL)`,\n );\n this.name = \"EgressBlockedError\";\n }\n}\n\nexport function isProviderHost(host: string): boolean {\n const h = host.toLowerCase().replace(/\\.$/, \"\");\n return PROVIDER_HOSTS.some((p) => (typeof p === \"string\" ? p === h : p.test(h)));\n}\n\n/** True when `ATTEST_EGRESS=block`. */\nexport function egressBlockRequested(env: NodeJS.ProcessEnv = process.env): boolean {\n const v = (env.ATTEST_EGRESS ?? \"\").trim().toLowerCase();\n if (v !== \"\" && v !== \"block\" && v !== \"allow\") {\n throw new Error(`ATTEST_EGRESS must be block or allow, got ${JSON.stringify(env.ATTEST_EGRESS)}`);\n }\n return v === \"block\";\n}\n\ntype Connect = (this: net.Socket, ...args: unknown[]) => net.Socket;\nlet original: Connect | null = null;\n// Installs outstanding; the guard comes off when the last one is released.\nlet installs = 0;\n\nfunction hostOf(args: unknown[]): string | null {\n // net.createConnection hands connect() its arguments already normalized: [options, cb].\n const first = Array.isArray(args[0]) ? (args[0] as unknown[])[0] : args[0];\n if (typeof first === \"object\" && first !== null) {\n const o = first as { host?: unknown; path?: unknown };\n return typeof o.host === \"string\" ? o.host : null;\n }\n // connect(port, host?) or connect(path)\n if (typeof first === \"number\" || (typeof first === \"string\" && /^\\d+$/.test(first))) {\n return typeof args[1] === \"string\" ? args[1] : null;\n }\n return null;\n}\n\n/**\n * Install the guard. Installs are counted: the returned function releases only this\n * install (once), and the guard comes off when every install has been released.\n */\nexport function installEgressGuard(): () => void {\n installs++;\n if (original === null) {\n const proto = net.Socket.prototype as unknown as { connect: Connect };\n const orig = proto.connect;\n original = orig;\n proto.connect = function (this: net.Socket, ...args: unknown[]): net.Socket {\n const host = hostOf(args);\n if (host !== null && isProviderHost(host)) {\n const err = new EgressBlockedError(host);\n process.nextTick(() => this.destroy(err));\n return this;\n }\n return orig.apply(this, args);\n };\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n installs--;\n if (installs === 0) uninstallEgressGuard();\n };\n}\n\n/** True while an egress guard is installed in this process. */\nexport function egressGuardActive(): boolean {\n return installs > 0;\n}\n\n/** Remove the guard now, whatever the install count. */\nexport function uninstallEgressGuard(): void {\n installs = 0;\n if (original === null) return;\n (net.Socket.prototype as unknown as { connect: Connect }).connect = original;\n original = null;\n}\n","/**\n * World: a stateful HTTP stand-in for the system an agent acts on.\n *\n * `attest-engine world --file world.yaml --serve` hosts the world on 127.0.0.1 and prints\n * the environment variable (for example `PAYMENTS_BASE_URL`) the agent's HTTP client reads.\n * {@link startWorld} starts it and sets that variable. When the session stops the engine\n * prints the final world-v1 snapshot; {@link WorldSession.state} reads the current one while\n * it runs. Pass either to `expect(trace).world(...)` to assert on the effects. In Vitest,\n * `useWorld` wraps this; it composes with `useReplay`.\n */\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { resolveEngine } from \"./engine-manager.js\";\nimport { escapeControl, parseEnv } from \"./replay.js\";\n\n/** The path under the world's base URL that serves the current snapshot. */\nexport const STATE_PATH = \"/_attest/state\";\nconst STATE_TIMEOUT_MS = 10_000;\n\n/** A world-v1 snapshot. */\nexport type WorldSnapshot = Record<string, unknown>;\n\nexport class WorldError extends Error {\n constructor(message: string) {\n super(escapeControl(message));\n this.name = \"WorldError\";\n }\n}\n\nexport interface WorldOptions {\n /** Engine binary (default: the SDK's engine discovery). */\n enginePath?: string;\n}\n\nexport interface WorldSession {\n /** The absolute `world.yaml` path. */\n readonly path: string;\n /** The variable the session set in `process.env`: the world's base URL. */\n readonly env: Record<string, string>;\n /** The world's base URL. */\n readonly baseUrl: string;\n /** The current world-v1 snapshot, read from the running world. */\n state(): Promise<WorldSnapshot>;\n /** Stop the world, restore the environment and return the final snapshot. Idempotent. */\n stop(): Promise<WorldSnapshot>;\n}\n\n// startWorld() sets process-wide environment variables, so worlds cannot overlap.\nlet active: string | null = null;\n\n/** Host the world defined by `worldFile` until the session stops. Worlds cannot overlap. */\nexport async function startWorld(worldFile: string, opts: WorldOptions = {}): Promise<WorldSession> {\n if (active !== null) throw new WorldError(`world ${active} is already running; worlds cannot overlap`);\n const file = path.resolve(worldFile);\n active = file;\n try {\n return await start(file, opts);\n } catch (err) {\n active = null;\n throw err;\n }\n}\n\nasync function start(file: string, opts: WorldOptions): Promise<WorldSession> {\n const engine = await resolveEngine(opts.enginePath);\n const child = spawn(engine, [\"world\", \"--file\", file, \"--serve\"], { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n let resolveReady: (line: string | null) => void = () => undefined;\n const ready = new Promise<string | null>((resolve) => {\n resolveReady = resolve;\n });\n const exited = new Promise<number | null>((resolve) => {\n child.on(\"close\", (code) => {\n resolveReady(null);\n resolve(code);\n });\n child.on(\"error\", (err) => {\n stderr += err.message;\n resolveReady(null);\n resolve(null);\n });\n });\n child.stdout.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stdout += chunk;\n const nl = stdout.indexOf(\"\\n\");\n if (nl >= 0) resolveReady(stdout.slice(0, nl));\n });\n child.stderr.setEncoding(\"utf8\").on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.stdin.on(\"error\", () => undefined);\n\n const halt = async (): Promise<{ code: number | null; stdout: string; stderr: string }> => {\n child.stdin.write(\"stop\\n\");\n child.stdin.end();\n return { code: await exited, stdout, stderr };\n };\n\n const env = parseEnv(await ready);\n if (env === null) {\n const out = await halt();\n throw new WorldError(`attest-engine world ${file} did not start: ${out.stderr.trim() || `exit ${String(out.code)}`}`);\n }\n const urls = Object.values(env);\n if (urls.length !== 1) {\n await halt();\n throw new WorldError(`attest-engine world ${file}: want one env variable, got ${JSON.stringify(env)}`);\n }\n const baseUrl = urls[0] as string;\n const saved = new Map<string, string | undefined>(Object.keys(env).map((k) => [k, process.env[k]]));\n Object.assign(process.env, env);\n\n let stopped = false;\n let stopping: Promise<WorldSnapshot> | null = null;\n const stop = (): Promise<WorldSnapshot> => {\n stopped = true;\n stopping ??= (async () => {\n for (const [k, v] of saved) {\n if (v === undefined) delete process.env[k];\n else process.env[k] = v;\n }\n const out = await halt();\n active = null;\n const final = parseFinal(out.stdout);\n if (out.code !== 0 || final === null) {\n throw new WorldError(`attest-engine world ${file} failed (exit ${String(out.code)}): ${out.stderr.trim()}`);\n }\n return final;\n })();\n return stopping;\n };\n const state = async (): Promise<WorldSnapshot> => {\n if (stopped) throw new WorldError(`world ${file} is stopped; use the snapshot stop() returned`);\n const url = baseUrl + STATE_PATH;\n let res: Response;\n try {\n res = await fetch(url, { signal: AbortSignal.timeout(STATE_TIMEOUT_MS) });\n } catch (err) {\n throw new WorldError(`GET ${url}: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (res.status !== 200) throw new WorldError(`GET ${url}: HTTP ${String(res.status)}`);\n const body: unknown = await res.json().catch(() => {\n throw new WorldError(`GET ${url}: the body is not JSON`);\n });\n if (typeof body !== \"object\" || body === null || Array.isArray(body)) {\n throw new WorldError(`GET ${url}: the body is not a snapshot object`);\n }\n return body as WorldSnapshot;\n };\n return { path: file, env, baseUrl, state, stop };\n}\n\nfunction parseFinal(out: string): WorldSnapshot | null {\n const lines = out.trim().split(\"\\n\");\n try {\n const world = (JSON.parse(lines[lines.length - 1] ?? \"\") as { world?: unknown }).world;\n if (typeof world !== \"object\" || world === null || Array.isArray(world)) return null;\n return world as WorldSnapshot;\n } catch {\n return null;\n }\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 { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { dirname, join, relative, resolve, isAbsolute, sep } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport 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 let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Plugin '${plugin.name}' timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n\n let result: PluginResult;\n try {\n result = await Promise.race([resultPromise, timeoutPromise]);\n } finally {\n clearTimeout(timer);\n }\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\n/** Explicitly register a plugin instance into the registry. */\nexport function registerPlugin(registry: PluginRegistry, name: string, plugin: AttestPlugin): void {\n registry.register(name, plugin);\n}\n\nfunction isAttestPlugin(value: unknown): value is AttestPlugin {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"name\"] === \"string\" &&\n typeof v[\"pluginType\"] === \"string\" &&\n typeof v[\"execute\"] === \"function\"\n );\n}\n\nfunction readJson(path: string): Record<string, unknown> {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n}\n\nfunction findInstalledPackage(projectRoot: string, name: string): string | undefined {\n let dir = resolve(projectRoot);\n for (;;) {\n const candidate = join(dir, \"node_modules\", name);\n if (existsSync(join(candidate, \"package.json\"))) return candidate;\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\nfunction declaredPluginPaths(pkgJson: Record<string, unknown>, dep: string): string[] {\n const attest = pkgJson[\"attest\"];\n if (attest === undefined) return [];\n const plugins =\n typeof attest === \"object\" && attest !== null\n ? (attest as Record<string, unknown>)[\"plugins\"]\n : undefined;\n if (plugins === undefined) return [];\n if (!Array.isArray(plugins) || !plugins.every((p) => typeof p === \"string\")) {\n throw new Error(`'${dep}': \"attest.plugins\" must be an array of strings`);\n }\n return plugins as string[];\n}\n\n/**\n * Plugins exported by a loaded module: the default export if it is a plugin\n * (a CommonJS build puts `module.exports` there, so also look one `default`\n * deeper), otherwise every plugin-shaped named export.\n */\nfunction pluginsOf(mod: Record<string, unknown>): AttestPlugin[] {\n const def = mod[\"default\"];\n const nested = typeof def === \"object\" && def !== null ? (def as Record<string, unknown>) : undefined;\n for (const candidate of [def, nested?.[\"default\"]]) {\n if (isAttestPlugin(candidate)) return [candidate];\n }\n return [...new Set([...Object.values(mod), ...Object.values(nested ?? {})])].filter(isAttestPlugin);\n}\n\nfunction isInside(root: string, file: string): boolean {\n const within = (r: string, f: string): boolean => {\n const rel = relative(r, f);\n return rel !== \"\" && rel !== \"..\" && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);\n };\n // Lexical check first, then resolve symlinks on both sides (throws when the file is missing).\n return within(root, file) && within(realpathSync(root), realpathSync(file));\n}\n\n/**\n * Discover and load plugins declared by the project's direct dependencies.\n *\n * An installed dependency declares plugins in its `package.json` as\n * `\"attest\": {\"plugins\": [\"./dist/plugin.js\"]}`. Each entry is imported and\n * its default export (or, without one, every export implementing the\n * plugin shape) is registered under the plugin's `name`. A failure loading\n * one entry, or reading the project's `package.json`, is logged and does not\n * raise, as with Python's `load_entrypoint_plugins`. Dependencies that are declared but not\n * installed are skipped. Returns the number of plugins loaded.\n */\nexport async function loadPackagePlugins(\n registry: PluginRegistry,\n projectRoot: string = process.cwd(),\n): Promise<number> {\n let project: Record<string, unknown>;\n try {\n project = readJson(join(projectRoot, \"package.json\"));\n } catch (err) {\n console.error(`attest: cannot read ${join(projectRoot, \"package.json\")}; no plugins loaded:`, err);\n return 0;\n }\n const depNames = new Set<string>();\n for (const field of [\"dependencies\", \"devDependencies\", \"optionalDependencies\"]) {\n const deps = project[field];\n if (typeof deps === \"object\" && deps !== null) {\n for (const dep of Object.keys(deps)) depNames.add(dep);\n }\n }\n\n let loaded = 0;\n for (const dep of depNames) {\n const pkgDir = findInstalledPackage(projectRoot, dep);\n if (pkgDir === undefined) continue;\n let entries: string[];\n try {\n entries = declaredPluginPaths(readJson(join(pkgDir, \"package.json\")), dep);\n } catch (err) {\n console.error(`attest: failed to read plugins declared by '${dep}':`, err);\n continue;\n }\n for (const entry of entries) {\n try {\n const file = resolve(pkgDir, entry);\n if (!isInside(pkgDir, file)) {\n throw new Error(`plugin path '${entry}' escapes package '${dep}'`);\n }\n const mod = (await import(pathToFileURL(file).href)) as Record<string, unknown>;\n const plugins = pluginsOf(mod);\n if (plugins.length === 0) {\n throw new Error(`'${entry}' exports no plugin (name, pluginType, execute)`);\n }\n for (const plugin of plugins) {\n registry.register(plugin.name, plugin);\n loaded++;\n }\n } catch (err) {\n console.error(`attest: failed to load plugin '${entry}' from '${dep}':`, err);\n }\n }\n }\n return loaded;\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","/**\n * Calibration helpers — TS parity with engine/internal/assertion/judge/calibration.go\n * and sdks/python/src/attest/calibration.py.\n *\n * Computes Cohen's κ, agreement %, and ROC-AUC over (human, judge) score\n * pairs and parses CSV/JSONL labels files. Metrics match the engine\n * byte-for-byte on the same input.\n */\n\nimport { createHash } from \"node:crypto\";\n\nexport interface LabelPair {\n readonly human: number;\n readonly judge: number;\n}\n\nexport interface AgreementResult {\n readonly threshold: number;\n readonly n: number;\n readonly agreement: number;\n readonly cohenKappa: number;\n readonly rocAuc: number;\n}\n\nexport interface LabeledRecord {\n input: string;\n humanLabel: number;\n judgeScore: number;\n judgeKnown: boolean;\n}\n\n/**\n * Compute Cohen's κ, agreement %, and ROC-AUC over labeled pairs.\n *\n * Throws when pairs is empty or threshold is outside (0, 1). Cohen's κ\n * degenerates to 0 when all labels land in a single class for both\n * raters; ROC-AUC is reported as 0 when only one human-class is\n * present.\n */\nexport function computeAgreement(\n pairs: readonly LabelPair[],\n threshold: number,\n): AgreementResult {\n if (pairs.length === 0) {\n throw new Error(\"no labeled pairs available\");\n }\n if (threshold <= 0 || threshold >= 1) {\n throw new Error(\"threshold must be in (0, 1)\");\n }\n\n const n = pairs.length;\n let humanPos = 0;\n let judgePos = 0;\n let bothPos = 0;\n let bothNeg = 0;\n for (const p of pairs) {\n const hPos = p.human >= threshold;\n const jPos = p.judge >= threshold;\n if (hPos) humanPos++;\n if (jPos) judgePos++;\n if (hPos && jPos) bothPos++;\n if (!hPos && !jPos) bothNeg++;\n }\n const humanNeg = n - humanPos;\n const judgeNeg = n - judgePos;\n\n const agreement = (bothPos + bothNeg) / n;\n const expected =\n (humanPos * judgePos + humanNeg * judgeNeg) / (n * n);\n const cohenKappa =\n expected < 1 ? (agreement - expected) / (1 - expected) : 0;\n\n const rocAuc = rocAUC(pairs, threshold);\n\n return { threshold, n, agreement, cohenKappa, rocAuc };\n}\n\nfunction rocAUC(pairs: readonly LabelPair[], threshold: number): number {\n const rows: { score: number; pos: boolean }[] = pairs.map((p) => ({\n score: p.judge,\n pos: p.human >= threshold,\n }));\n const pos = rows.filter((r) => r.pos).length;\n const neg = rows.length - pos;\n if (pos === 0 || neg === 0) return 0;\n\n rows.sort((a, b) => a.score - b.score);\n\n let rankSumPos = 0;\n let i = 0;\n while (i < rows.length) {\n let j = i;\n while (j < rows.length && rows[j]!.score === rows[i]!.score) {\n j++;\n }\n const avgRank = (i + j + 1) / 2;\n for (let k = i; k < j; k++) {\n if (rows[k]!.pos) rankSumPos += avgRank;\n }\n i = j;\n }\n\n const auc = (rankSumPos - (pos * (pos + 1)) / 2) / (pos * neg);\n if (Number.isNaN(auc) || !Number.isFinite(auc)) return 0;\n return auc;\n}\n\n/**\n * Parse a 2- or 3-column CSV (input, human_label[, judge_score]).\n * Header detected when row[0][1] does not parse as a float. Lines\n * beginning with `#` are skipped.\n */\nexport function loadLabelsCSV(text: string): LabeledRecord[] {\n const rows = parseCSV(text);\n if (rows.length === 0) {\n throw new Error(\"empty CSV\");\n }\n let start = 0;\n if (rows[0]!.length >= 2) {\n const firstHuman = parseFloatStrict(rows[0]![1]!);\n if (firstHuman === null) start = 1;\n }\n const out: LabeledRecord[] = [];\n for (let idx = start; idx < rows.length; idx++) {\n const row = rows[idx]!;\n const lineNum = idx + 1;\n if (row.length === 0) continue;\n if (row[0]!.trimStart().startsWith(\"#\")) continue;\n if (row.length < 2) {\n throw new Error(\n `CSV line ${lineNum}: want at least 2 columns (input, human_label)`,\n );\n }\n const human = parseFloatStrict(row[1]!);\n if (human === null) {\n throw new Error(`CSV line ${lineNum}: human_label not a float: ${row[1]}`);\n }\n const rec: LabeledRecord = {\n input: row[0]!,\n humanLabel: human,\n judgeScore: 0,\n judgeKnown: false,\n };\n if (row.length >= 3 && row[2]!.trim() !== \"\") {\n const judge = parseFloatStrict(row[2]!);\n if (judge === null) {\n throw new Error(\n `CSV line ${lineNum}: judge_score not a float: ${row[2]}`,\n );\n }\n rec.judgeScore = judge;\n rec.judgeKnown = true;\n }\n out.push(rec);\n }\n if (out.length === 0) {\n throw new Error(\"CSV contained no labeled rows\");\n }\n return out;\n}\n\n/**\n * Parse a newline-delimited JSON file. Each line is an object with the\n * shape {\"input\": \"...\", \"human_label\": 0.9, \"judge_score\": 0.8}.\n * `judge_score` is optional.\n */\nexport function loadLabelsJSONL(text: string): LabeledRecord[] {\n const out: LabeledRecord[] = [];\n const lines = text.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const stripped = lines[i]!.trim();\n if (!stripped) continue;\n let obj: Record<string, unknown>;\n try {\n obj = JSON.parse(stripped) as Record<string, unknown>;\n } catch (err) {\n throw new Error(`JSONL line ${i + 1}: ${(err as Error).message}`);\n }\n if (Object.keys(obj).length === 0) continue;\n if (obj[\"human_label\"] === undefined) {\n throw new Error(`JSONL line ${i + 1}: missing human_label`);\n }\n const human = parseJSONNumber(obj[\"human_label\"]);\n if (human === null) {\n throw new Error(`JSONL line ${i + 1}: human_label is not a number`);\n }\n const rec: LabeledRecord = {\n input: typeof obj[\"input\"] === \"string\" ? obj[\"input\"] : \"\",\n humanLabel: human,\n judgeScore: 0,\n judgeKnown: false,\n };\n if (obj[\"judge_score\"] !== undefined && obj[\"judge_score\"] !== null) {\n const judge = parseJSONNumber(obj[\"judge_score\"]);\n if (judge === null) {\n throw new Error(`JSONL line ${i + 1}: judge_score is not a number`);\n }\n rec.judgeScore = judge;\n rec.judgeKnown = true;\n }\n out.push(rec);\n }\n if (out.length === 0) {\n throw new Error(\"JSONL contained no labeled rows\");\n }\n return out;\n}\n\n/**\n * Return the 16-character SHA-256 prefix used by the engine for prompt\n * hashes. Mirrors promptHash in engine/internal/assertion/judge_eval.go\n * so SDK-recorded calibration rows align with JudgeMetadata.prompt_hash.\n */\nexport function promptHash(text: string): string {\n return createHash(\"sha256\").update(text).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Parse a string as a number, rejecting empty input and values that\n * JavaScript's `Number()` would silently coerce to 0. Returns null on\n * rejection so callers can throw a useful error. Matches Go's\n * strconv.ParseFloat and Python's float() — both error on the empty\n * string, while bare `Number(\"\")` returns 0.\n *\n * Permits \"Infinity\" so the loader stays consistent with strconv.ParseFloat;\n * downstream consumers (CalibrationStore.Record, computeAgreement) handle\n * the [0, 1] range check separately.\n */\nfunction parseFloatStrict(raw: string): number | null {\n const trimmed = raw.trim();\n if (trimmed === \"\") return null;\n const n = Number(trimmed);\n if (Number.isNaN(n)) return null;\n return n;\n}\n\n/**\n * Coerce a JSON value to a finite number. Accepts only `number` (rejects\n * stringly-typed numbers and booleans) so calibration files cannot\n * accidentally smuggle non-numeric labels past type-loose JSON parsing.\n */\nfunction parseJSONNumber(value: unknown): number | null {\n if (typeof value !== \"number\") return null;\n if (Number.isNaN(value)) return null;\n return value;\n}\n\n/**\n * Minimal RFC-4180-ish CSV parser. Handles quoted fields with embedded\n * commas and CRLF line endings. Sufficient for calibration label files;\n * callers needing full CSV support should bring their own parser.\n */\nfunction parseCSV(text: string): string[][] {\n const rows: string[][] = [];\n let current: string[] = [];\n let field = \"\";\n let inQuotes = false;\n let i = 0;\n while (i < text.length) {\n const ch = text[i]!;\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i++;\n continue;\n }\n field += ch;\n i++;\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n i++;\n continue;\n }\n if (ch === \",\") {\n current.push(field);\n field = \"\";\n i++;\n continue;\n }\n if (ch === \"\\n\") {\n current.push(field);\n rows.push(current);\n current = [];\n field = \"\";\n i++;\n continue;\n }\n if (ch === \"\\r\") {\n i++;\n continue;\n }\n field += ch;\n i++;\n }\n if (field.length > 0 || current.length > 0) {\n current.push(field);\n rows.push(current);\n }\n return rows;\n}\n","import type { SimulatePersona } from \"./proto/types.js\";\n\nexport const FRIENDLY_USER: SimulatePersona = {\n name: \"FriendlyUser\",\n system_prompt: `You are a friendly, cooperative user interacting with an AI assistant.\nYou make clear, well-formed requests. You respond positively to helpful answers and\nask straightforward follow-up questions. Keep responses concise (1-3 sentences).`,\n style: \"friendly\",\n temperature: 0.7,\n max_tokens: 200,\n};\n\nexport const ADVERSARIAL_USER: SimulatePersona = {\n name: \"AdversarialUser\",\n system_prompt: `You are an adversarial user testing the limits of an AI assistant.\nYou ask edge case questions, make ambiguous requests, and probe boundary conditions.\nTry to find inconsistencies or unexpected behaviors. Keep responses concise (1-3 sentences).`,\n style: \"adversarial\",\n temperature: 0.9,\n max_tokens: 200,\n};\n\nexport const CONFUSED_USER: SimulatePersona = {\n name: \"ConfusedUser\",\n system_prompt: `You are a confused user who has trouble articulating what you want.\nYou make vague requests, sometimes contradict yourself, and frequently ask for clarification.\nYou may misunderstand the assistant's responses. Keep responses concise (1-3 sentences).`,\n style: \"confused\",\n temperature: 0.8,\n max_tokens: 200,\n};\n\nexport const COOPERATIVE_USER: SimulatePersona = {\n name: \"CooperativeUser\",\n system_prompt: `You are a cooperative user who actively helps the AI assistant succeed.\nYou provide clear context, answer clarifying questions thoroughly, and confirm when\nthe assistant's response meets your needs. Keep responses concise (1-3 sentences).`,\n style: \"cooperative\",\n temperature: 0.6,\n max_tokens: 200,\n};\n","import { activeMockRegistry, type MockToolFn } from \"./context.js\";\n\n/** Registry of mock tool implementations, activated for the duration of `run`. */\nexport class MockToolRegistry {\n private readonly tools = new Map<string, MockToolFn>();\n\n register(name: string, fn: MockToolFn): void {\n this.tools.set(name, fn);\n }\n\n /**\n * Run `fn` with the registered mocks active. `TraceBuilder.addToolCall`\n * returns the mock's result for a registered tool name. Scopes are\n * isolated per async call chain (AsyncLocalStorage).\n */\n run<T>(fn: () => T): T {\n return activeMockRegistry.run(new Map(this.tools), fn);\n }\n}\n\nexport type MockTool<F extends MockToolFn> = F & { readonly mockToolName: string };\n\n/** Tag `fn` as the mock for tool `name`; the returned function behaves like `fn`. */\nexport function mockTool<F extends MockToolFn>(name: string, fn: F): MockTool<F> {\n const wrapper = ((args: Record<string, unknown>) => fn(args)) as F;\n return Object.assign(wrapper, { mockToolName: name });\n}\n","import { createRng, sleep } from \"./context.js\";\n\nexport interface FaultInjectOptions {\n /** Probability in [0, 1] that a call throws. Default 0. */\n errorRate?: number;\n /** Upper bound of uniform random delay per call, in ms. Default 0. */\n latencyJitterMs?: number;\n /** Seed for a deterministic fault sequence. */\n seed?: number;\n}\n\n/**\n * Wrap `fn` so calls throw `Error(\"Injected fault in <name>\")` at\n * `errorRate` and are delayed by up to `latencyJitterMs`. The RNG is\n * created once per wrapped function, so a fixed seed gives a fixed\n * sequence across calls.\n */\nexport function faultInject<A extends unknown[], R>(\n options: FaultInjectOptions,\n fn: (...args: A) => R | Promise<R>,\n): (...args: A) => Promise<R> {\n const errorRate = options.errorRate ?? 0;\n const latencyJitterMs = options.latencyJitterMs ?? 0;\n const rng = createRng(options.seed);\n return async (...args: A): Promise<R> => {\n if (errorRate > 0 && rng() < errorRate) {\n throw new Error(`Injected fault in ${fn.name || \"anonymous\"}`);\n }\n if (latencyJitterMs > 0) {\n await sleep(rng() * latencyJitterMs);\n }\n return fn(...args);\n };\n}\n","import { OUTCOME_FAIL, OUTCOME_PASS, OUTCOME_SKIP, type Outcome } from \"../proto/constants.js\";\nimport { renderDiagnostics } from \"../diagnostics.js\";\nimport { AgentResult } from \"../result.js\";\n\n/**\n * Anything with a test outcome: `AgentResult`, `RepeatResult` and\n * `ScenarioResult`. Aggregates nest.\n */\nexport interface Verdict {\n readonly notEvaluatedReasons: Readonly<Record<string, number>>;\n outcome(options?: { strict?: boolean }): Outcome;\n skipReason(): string;\n}\n\n/** Any failing outcome fails; otherwise any skip skips; otherwise pass. */\nexport function aggregateOutcomes(outcomes: readonly Outcome[]): Outcome {\n if (outcomes.includes(OUTCOME_FAIL)) return OUTCOME_FAIL;\n if (outcomes.includes(OUTCOME_SKIP)) return OUTCOME_SKIP;\n return OUTCOME_PASS;\n}\n\n/** Not-evaluated reasons summed across verdicts, in first-seen order. */\nexport function sumNotEvaluatedReasons(results: readonly Verdict[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const r of results) {\n for (const [reason, n] of Object.entries(r.notEvaluatedReasons)) {\n counts[reason] = (counts[reason] ?? 0) + n;\n }\n }\n return counts;\n}\n\nexport function formatSkipReason(counts: Readonly<Record<string, number>>): string {\n const parts = Object.entries(counts).map(([reason, n]) => (n === 1 ? reason : `${reason} ×${n}`));\n return `not evaluated: ${parts.join(\", \")}`;\n}\n\ntype Renderable = Verdict & { renderDiagnostics?(options?: { color?: boolean }): string };\n\n/** Diagnostics of one verdict: an `AgentResult` or an aggregate. */\nexport function renderVerdictDiagnostics(verdict: Renderable, color = false): string {\n return verdict instanceof AgentResult\n ? renderDiagnostics(verdict, { color })\n : (verdict.renderDiagnostics?.({ color }) ?? \"\");\n}\n\n/** Diagnostics of every verdict whose outcome is not pass, headed by its index. */\nexport function verdictsDiagnostics(\n results: readonly Renderable[],\n label: string,\n color = false,\n): string {\n const blocks = results.flatMap((r, i) =>\n r.outcome() === OUTCOME_PASS\n ? []\n : [`${label} ${i + 1}/${results.length}:${renderVerdictDiagnostics(r, color)}`],\n );\n return blocks.length > 0 ? blocks.join(\"\\n\") : ` (no failing ${label}s)\\n`;\n}\n","import { OUTCOME_PASS, OUTCOME_SKIP, type Outcome } from \"../proto/constants.js\";\nimport {\n aggregateOutcomes,\n formatSkipReason,\n sumNotEvaluatedReasons,\n verdictsDiagnostics,\n type Verdict,\n} from \"./verdict.js\";\n\n/** Results of `n` trials, aggregated under the assertion-status rules. */\nexport class RepeatResult implements Verdict {\n readonly results: readonly Verdict[];\n\n constructor(results: readonly Verdict[] = []) {\n this.results = results;\n }\n\n get count(): number {\n return this.results.length;\n }\n\n /** Trials skipped because an assertion was not evaluated. */\n get notEvaluated(): number {\n return this.results.filter((r) => r.outcome() === OUTCOME_SKIP).length;\n }\n\n /** Passing / evaluated trials; null when no trial was evaluated. */\n get passRate(): number | null {\n const evaluated = this.count - this.notEvaluated;\n if (evaluated === 0) return null;\n return this.results.filter((r) => r.outcome() === OUTCOME_PASS).length / evaluated;\n }\n\n /** True when every trial's outcome is pass (soft failures included). */\n get allPassed(): boolean {\n return this.results.every((r) => r.outcome() === OUTCOME_PASS);\n }\n\n outcome(options?: { strict?: boolean }): Outcome {\n return aggregateOutcomes(this.results.map((r) => r.outcome(options)));\n }\n\n get notEvaluatedReasons(): Readonly<Record<string, number>> {\n return sumNotEvaluatedReasons(this.results);\n }\n\n skipReason(): string {\n return formatSkipReason(this.notEvaluatedReasons);\n }\n\n renderDiagnostics(options?: { color?: boolean }): string {\n return verdictsDiagnostics(this.results, \"trial\", options?.color);\n }\n}\n\n/** Run `fn` `n` times sequentially and collect the verdicts. */\nexport function repeat<A extends unknown[]>(\n n: number,\n fn: (...args: A) => Verdict | Promise<Verdict>,\n): (...args: A) => Promise<RepeatResult> {\n return async (...args: A): Promise<RepeatResult> => {\n const results: Verdict[] = [];\n for (let i = 0; i < n; i++) {\n results.push(await fn(...args));\n }\n return new RepeatResult(results);\n };\n}\n","import type { SimulatePersona } from \"../proto/types.js\";\nimport { OUTCOME_PASS, type Outcome } from \"../proto/constants.js\";\nimport type { AgentResult } from \"../result.js\";\nimport { activeMockRegistry, createRng, sleep, type MockToolFn } from \"./context.js\";\nimport {\n aggregateOutcomes,\n formatSkipReason,\n sumNotEvaluatedReasons,\n verdictsDiagnostics,\n type Verdict,\n} from \"./verdict.js\";\n\nexport interface ScenarioConfig {\n persona?: SimulatePersona;\n mockTools: Readonly<Record<string, MockToolFn>>;\n faultErrorRate: number;\n faultLatencyJitterMs: number;\n maxTurns: number;\n seed?: number;\n}\n\n/** Passed to the scenario body on every turn. */\nexport interface ScenarioContext {\n readonly persona: SimulatePersona | undefined;\n /** Zero-based turn index. */\n readonly turn: number;\n}\n\n/** One verdict per turn; the aggregate follows the assertion-status rules. */\nexport class ScenarioResult implements Verdict {\n readonly config: ScenarioConfig;\n readonly results: readonly AgentResult[];\n\n constructor(config: ScenarioConfig, results: readonly AgentResult[] = []) {\n this.config = config;\n this.results = results;\n }\n\n /** True when the aggregate `outcome()` is pass. */\n get passed(): boolean {\n return this.outcome() === OUTCOME_PASS;\n }\n\n outcome(options?: { strict?: boolean }): Outcome {\n return aggregateOutcomes(this.results.map((r) => r.outcome(options)));\n }\n\n get notEvaluatedReasons(): Readonly<Record<string, number>> {\n return sumNotEvaluatedReasons(this.results);\n }\n\n skipReason(): string {\n return formatSkipReason(this.notEvaluatedReasons);\n }\n\n renderDiagnostics(options?: { color?: boolean }): string {\n return verdictsDiagnostics(this.results, \"turn\", options?.color);\n }\n}\n\nexport interface ScenarioOptions {\n persona?: SimulatePersona;\n mockTools?: Record<string, MockToolFn>;\n /** Probability per turn of throwing `Injected fault at turn N`. Default 0. */\n faultErrorRate?: number;\n /** Upper bound of uniform random delay per turn, in ms. Default 0. */\n faultLatencyJitterMs?: number;\n /** Turns to run. Default 1. */\n maxTurns?: number;\n /** Seed for a deterministic fault sequence. */\n seed?: number;\n}\n\n/**\n * Run `fn` for `maxTurns` turns with mock tools active, injecting faults\n * and latency per turn. `fn` receives the persona and turn index.\n */\nexport function scenario<A extends unknown[]>(\n options: ScenarioOptions,\n fn: (ctx: ScenarioContext, ...args: A) => AgentResult | Promise<AgentResult>,\n): (...args: A) => Promise<ScenarioResult> {\n const config: ScenarioConfig = {\n persona: options.persona,\n mockTools: { ...options.mockTools },\n faultErrorRate: options.faultErrorRate ?? 0,\n faultLatencyJitterMs: options.faultLatencyJitterMs ?? 0,\n maxTurns: options.maxTurns ?? 1,\n seed: options.seed,\n };\n\n return async (...args: A): Promise<ScenarioResult> => {\n const run = async (): Promise<ScenarioResult> => {\n const results: AgentResult[] = [];\n const rng = createRng(config.seed);\n for (let turn = 0; turn < config.maxTurns; turn++) {\n if (config.faultErrorRate > 0 && rng() < config.faultErrorRate) {\n throw new Error(`Injected fault at turn ${turn}`);\n }\n if (config.faultLatencyJitterMs > 0) {\n await sleep(rng() * config.faultLatencyJitterMs);\n }\n results.push(await fn({ persona: config.persona, turn }, ...args));\n }\n return new ScenarioResult(config, results);\n };\n\n const mocks = new Map(Object.entries(config.mockTools));\n return mocks.size > 0 ? activeMockRegistry.run(mocks, run) : run();\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","/**\n * OpenTelemetry trace adapter.\n *\n * OTLP → Attest trace conversion runs in the engine (`attest-engine trace convert`), the\n * single implementation of the OpenTelemetry GenAI semantic convention mapping shared by\n * every SDK. This module only encodes spans as OTLP/JSON, calls the engine and returns the\n * trace v2 it prints; it holds no mapping of its own. See `docs/guides/trace-check.md`.\n */\nimport { spawn } from \"node:child_process\";\nimport { resolveEngine } from \"../engine-manager.js\";\nimport { OTLPConversionError } from \"../proto/errors.js\";\nimport type { Trace } from \"../proto/types.js\";\n\n/** Upper bound for one `attest-engine trace convert` run. */\nconst CONVERT_TIMEOUT_MS = 60_000;\n/** Largest converted trace accepted from the engine (its trace limit is 10 MB). */\nconst MAX_TRACE_OUTPUT_BYTES = 64 * 1024 * 1024;\n/** OTLP status code for an error span. */\nconst STATUS_CODE_ERROR = 2;\n\ntype AttributeValue =\n | string\n | number\n | boolean\n | readonly (string | number | boolean | null | undefined)[];\n\n/** The parts of an `@opentelemetry/sdk-trace-base` `ReadableSpan` the adapter reads. */\nexport interface OTelSpan {\n readonly name: string;\n /** `[seconds, nanoseconds]` */\n readonly startTime: readonly [number, number];\n readonly endTime: readonly [number, number];\n readonly attributes?: Readonly<Record<string, AttributeValue | undefined>>;\n /** Parent span id (sdk-trace-base 1.x). */\n readonly parentSpanId?: string;\n /** Parent span context (sdk-trace-base 2.x). */\n readonly parentSpanContext?: { readonly spanId: string };\n readonly status?: { readonly code: number; readonly message?: string };\n spanContext(): { readonly traceId: string; readonly spanId: string };\n}\n\n/** An OTLP/JSON export: a parsed `ExportTraceServiceRequest`, its JSON text, or its bytes. */\nexport type OTLPInput = Record<string, unknown> | string | Uint8Array;\n\nexport class OTelAdapter {\n /**\n * Build a trace from finished OpenTelemetry spans of one trace.\n *\n * @param agentId Trace `agent_id`; defaults to the first turn's `gen_ai.agent.name`.\n * @throws OTLPConversionError when the engine rejects the spans.\n */\n static async fromSpans(spans: readonly OTelSpan[], agentId?: string): Promise<Trace> {\n return OTelAdapter.fromOtlp(spansToOtlp(spans), agentId);\n }\n\n /**\n * Convert an OTLP/JSON export (`resourceSpans` → `scopeSpans` → `spans`).\n *\n * @param agentId Trace `agent_id`; defaults to the first turn's `gen_ai.agent.name`.\n * @throws OTLPConversionError when the engine rejects the export (malformed JSON, invalid\n * ids or timestamps, more than one trace, non-numeric token counts, ...).\n * @throws RangeError when a parsed export holds a non-finite number.\n * @throws OTLPConversionError when the engine times out, overflows the output buffer or\n * prints no trace.\n * @throws Error when the engine cannot start.\n */\n static async fromOtlp(otlp: OTLPInput, agentId?: string): Promise<Trace> {\n const payload =\n typeof otlp === \"string\" || otlp instanceof Uint8Array\n ? otlp\n : JSON.stringify(otlp, (_key, v: unknown) => {\n if (typeof v === \"number\" && !Number.isFinite(v)) {\n throw new RangeError(`OTLP export holds a non-finite number: ${String(v)}`);\n }\n return v;\n });\n const args = [\"trace\", \"convert\"];\n if (agentId !== undefined) args.push(\"--agent-id\", agentId);\n args.push(\"-\");\n const stdout = await runConvert(await resolveEngine(), args, payload);\n try {\n return JSON.parse(stdout) as Trace;\n } catch (err) {\n throw new OTLPConversionError(\n `attest-engine trace convert printed output that is not JSON: ${String(err)}`,\n );\n }\n }\n}\n\n/**\n * Run `attest-engine trace convert` with `payload` on stdin and return its stdout.\n *\n * Asynchronous on purpose: `spawnSync` with `input` occasionally never returns under\n * parallel load (observed on macOS: about 1 call in 100 with 8 concurrent callers, each\n * hanging until the timeout), and it blocks the event loop while the engine runs.\n */\nfunction runConvert(engine: string, args: string[], payload: string | Uint8Array): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(engine, args, { stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n let timer: NodeJS.Timeout | undefined;\n // Registered first: a spawn that fails (ENOENT, or EMFILE/ENFILE under load) emits\n // \"error\" on the next tick, and with EMFILE/ENFILE its stdio streams are null.\n child.on(\"error\", (e) => {\n clearTimeout(timer);\n reject(e);\n });\n const { stdin, stdout, stderr } = child;\n if (stdin === null || stdout === null || stderr === null) return;\n const out: Buffer[] = [];\n const err: Buffer[] = [];\n let outBytes = 0;\n let failure: Error | null = null;\n const fail = (e: Error): void => {\n failure ??= e;\n child.kill(\"SIGKILL\");\n };\n timer = setTimeout(() => {\n fail(\n new OTLPConversionError(\n `attest-engine trace convert timed out after ${CONVERT_TIMEOUT_MS / 1000}s`,\n ),\n );\n }, CONVERT_TIMEOUT_MS);\n stdout.on(\"data\", (chunk: Buffer) => {\n outBytes += chunk.length;\n if (outBytes > MAX_TRACE_OUTPUT_BYTES) {\n fail(\n new OTLPConversionError(\n `attest-engine trace convert printed more than ${MAX_TRACE_OUTPUT_BYTES} bytes`,\n ),\n );\n return;\n }\n out.push(chunk);\n });\n stderr.on(\"data\", (chunk: Buffer) => err.push(chunk));\n // An engine that exits before reading all of stdin (for example on a usage error)\n // makes the write fail with EPIPE; its exit status and stderr report the real error.\n stdin.on(\"error\", () => undefined);\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer);\n if (failure !== null) {\n reject(failure);\n return;\n }\n if (code !== 0) {\n const message = Buffer.concat(err).toString(\"utf8\").trim();\n reject(\n new OTLPConversionError(\n message || `attest-engine trace convert exited ${String(code ?? signal)}`,\n ),\n );\n return;\n }\n resolve(Buffer.concat(out).toString(\"utf8\"));\n });\n stdin.end(payload);\n });\n}\n\nfunction hrTimeToNanos(time: readonly [number, number], spanName: string): string {\n if (!Number.isSafeInteger(time[0]) || !Number.isSafeInteger(time[1])) {\n throw new RangeError(`span ${JSON.stringify(spanName)} has a non-integer HrTime`);\n }\n return (BigInt(time[0]) * 1_000_000_000n + BigInt(time[1])).toString();\n}\n\nfunction anyValue(value: AttributeValue | null | undefined): Record<string, unknown> {\n if (value === null || value === undefined) return {};\n if (typeof value === \"boolean\") return { boolValue: value };\n if (typeof value === \"string\") return { stringValue: value };\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new RangeError(`OTel attribute value must be finite, got ${String(value)}`);\n }\n return Number.isSafeInteger(value) ? { intValue: String(value) } : { doubleValue: value };\n }\n return { arrayValue: { values: value.map((v) => anyValue(v)) } };\n}\n\n/** Encode spans as an OTLP/JSON `ExportTraceServiceRequest`. */\nexport function spansToOtlp(spans: readonly OTelSpan[]): Record<string, unknown> {\n const encoded = spans.map((span) => {\n const ctx = span.spanContext();\n const out: Record<string, unknown> = {\n traceId: ctx.traceId,\n spanId: ctx.spanId,\n name: span.name,\n startTimeUnixNano: hrTimeToNanos(span.startTime, span.name),\n endTimeUnixNano: hrTimeToNanos(span.endTime, span.name),\n attributes: Object.entries(span.attributes ?? {})\n .filter(([, v]) => v !== undefined)\n .map(([key, v]) => ({ key, value: anyValue(v) })),\n };\n const parent = span.parentSpanContext?.spanId ?? span.parentSpanId;\n if (parent) out[\"parentSpanId\"] = parent;\n if (span.status?.code === STATUS_CODE_ERROR) {\n out[\"status\"] = { code: STATUS_CODE_ERROR, message: span.status.message ?? \"\" };\n }\n return out;\n });\n return { resourceSpans: [{ scopeSpans: [{ spans: encoded }] }] };\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":["options","options","resolve","traceId","assertionId","platform","arch","resolve","fsConstants","options","resolve","agentId","traceId","options","options","options","agentId","import_node_crypto","agentId","config","import_node_child_process","fs","path","resolve","exit","import_node_child_process","path","resolve","import_node_child_process","path","active","start","resolve","import_node_async_hooks","agentId","import_node_fs","import_node_path","import_node_url","traceId","assertionId","path","options","import_node_crypto","start","options","options","config","options","agentId","agentId","options","agentId","options","agentId","options","agentId","options","import_node_child_process","agentId","resolve","agentId","options"]}