@tangle-network/agent-eval 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/analyst/index.js +5 -5
- package/dist/{benchmark-command-BeDZB3BQ.js → benchmark-command-C3mZhNh7.js} +5 -5
- package/dist/{benchmark-command-BeDZB3BQ.js.map → benchmark-command-C3mZhNh7.js.map} +1 -1
- package/dist/benchmarks/index.js +3 -3
- package/dist/builder-eval/index.d.ts +1 -1
- package/dist/builder-eval/index.d.ts.map +1 -1
- package/dist/builder-eval/index.js +12 -138
- package/dist/builder-eval/index.js.map +1 -1
- package/dist/campaign/index.d.ts +2 -1
- package/dist/campaign/index.js +6 -5
- package/dist/{campaign-DKZiYHUq.js → campaign-CqCWhH7v.js} +5 -5
- package/dist/{campaign-DKZiYHUq.js.map → campaign-CqCWhH7v.js.map} +1 -1
- package/dist/cli.js +1 -1
- package/dist/contract/index.js +4 -4
- package/dist/{define-agent-eval-BVhGn7VV.js → define-agent-eval-BT1SOjkZ.js} +3 -3
- package/dist/{define-agent-eval-BVhGn7VV.js.map → define-agent-eval-BT1SOjkZ.js.map} +1 -1
- package/dist/{dspy-rlm-engine-C0zR2xiM.js → dspy-rlm-engine-Xt3znknf.js} +2 -2
- package/dist/{dspy-rlm-engine-C0zR2xiM.js.map → dspy-rlm-engine-Xt3znknf.js.map} +1 -1
- package/dist/{external-optimizer-process-DKgrrX0J.js → external-optimizer-process-BgitfZ-Q.js} +2 -2
- package/dist/{external-optimizer-process-DKgrrX0J.js.map → external-optimizer-process-BgitfZ-Q.js.map} +1 -1
- package/dist/{external-optimizer-subprocess-wzMaA0oN.js → external-optimizer-subprocess-CeHuAaMJ.js} +8 -17
- package/dist/{external-optimizer-subprocess-wzMaA0oN.js.map → external-optimizer-subprocess-CeHuAaMJ.js.map} +1 -1
- package/dist/{feedback-trajectory-Ck7K7AhK.d.ts → feedback-trajectory-BgomnFOe.d.ts} +2 -2
- package/dist/{feedback-trajectory-Ck7K7AhK.d.ts.map → feedback-trajectory-BgomnFOe.d.ts.map} +1 -1
- package/dist/{findings-store-DNSvmy8U.js → findings-store-Bp-0Guuv.js} +2 -2
- package/dist/{findings-store-DNSvmy8U.js.map → findings-store-Bp-0Guuv.js.map} +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/{llm-judge-BYBLxREr.js → llm-judge-BiUljZDR.js} +3 -3
- package/dist/{llm-judge-BYBLxREr.js.map → llm-judge-BiUljZDR.js.map} +1 -1
- package/dist/openapi.json +1 -1
- package/dist/{proposal-findings-duV5flPv.js → proposal-findings-BclX0PFh.js} +2 -2
- package/dist/{proposal-findings-duV5flPv.js.map → proposal-findings-BclX0PFh.js.map} +1 -1
- package/dist/sandbox-harness-BDr1GRm0.js +192 -0
- package/dist/sandbox-harness-BDr1GRm0.js.map +1 -0
- package/dist/sandbox-harness-CdO35T2g.d.ts +116 -0
- package/dist/sandbox-harness-CdO35T2g.d.ts.map +1 -0
- package/dist/{skillopt-optimization-method-DmfZz-2d.js → skillopt-optimization-method-DpasRfXS.js} +4 -4
- package/dist/{skillopt-optimization-method-DmfZz-2d.js.map → skillopt-optimization-method-DpasRfXS.js.map} +1 -1
- package/dist/traces.d.ts +1 -1
- package/dist/wire/index.d.ts +3 -3
- package/docs/concepts.md +22 -0
- package/package.json +1 -1
- package/dist/sandbox-harness-B3Kx1fOA.d.ts +0 -68
- package/dist/sandbox-harness-B3Kx1fOA.d.ts.map +0 -1
|
@@ -2,8 +2,8 @@ import { o as FailureClass } from "./schema-CkIvnmLU.js";
|
|
|
2
2
|
import { i as AnalystFinding, m as EvidenceRef, u as AnalystRunResult } from "./types-DzCO-S1m.js";
|
|
3
3
|
import { s as TraceStore } from "./store-CMs5wGXP.js";
|
|
4
4
|
import { i as DatasetSplit, r as DatasetScenario } from "./dataset-DThC1S6G.js";
|
|
5
|
-
import "./exact-types-CIViGj98.js";
|
|
6
5
|
import { o as TraceEmitter } from "./emitter-mAXC5PSN.js";
|
|
6
|
+
import "./exact-types-CIViGj98.js";
|
|
7
7
|
type ControlSeverity = 'info' | 'warning' | 'error' | 'critical';
|
|
8
8
|
type ControlActionFailureMode = 'continue' | 'stop';
|
|
9
9
|
interface ControlEvalResult {
|
|
@@ -383,4 +383,4 @@ declare function controlRunToFeedbackTrajectory<TState, TAction, TActionResult>(
|
|
|
383
383
|
createdAt?: string;
|
|
384
384
|
}): FeedbackTrajectory;
|
|
385
385
|
export { AnalystFindingDigest as A, ControlRuntimeConfig as B, createFeedbackTrajectory as C, renderPreferenceMemoryMarkdown as D, feedbackTrajectoryToOptimizerRow as E, ControlBudget as F, ControlSeverity as H, ControlContext as I, ControlDecision as L, AnalystRunDigest as M, analystRunDigest as N, summarizePreferenceMemory as O, ControlActionOutcome as P, ControlEvalResult as R, controlRunToFeedbackTrajectory as S, feedbackTrajectoriesToOptimizerRows as T, ControlStep as U, ControlRuntimeError as V, StopDecision as W, PreferenceMemoryEntry as _, FeedbackLabel as a, analystRunToReviewRequests as b, FeedbackOptimizerRow as c, FeedbackTask as d, FeedbackTrajectory as f, InMemoryFeedbackTrajectoryStore as g, FileSystemFeedbackTrajectoryStore as h, FeedbackAttempt as i, AnalystReviewDecision as j, withAssignedFeedbackSplit as k, FeedbackOutcome as l, FeedbackTrajectoryStore as m, AnalystReviewRequest as n, FeedbackLabelKind as o, FeedbackTrajectoryFilter as p, FeedbackArtifactType as r, FeedbackLabelSource as s, AnalystFeedbackTrajectoryOptions as t, FeedbackSplitPolicy as u, ProposedSideEffect as v, feedbackTrajectoriesToDatasetScenarios as w, assignFeedbackSplit as x, analystRunToFeedbackTrajectory as y, ControlRunResult as z };
|
|
386
|
-
//# sourceMappingURL=feedback-trajectory-
|
|
386
|
+
//# sourceMappingURL=feedback-trajectory-BgomnFOe.d.ts.map
|
package/dist/{feedback-trajectory-Ck7K7AhK.d.ts.map → feedback-trajectory-BgomnFOe.d.ts.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-trajectory-
|
|
1
|
+
{"version":3,"file":"feedback-trajectory-BgomnFOe.d.ts","names":[],"sources":["../src/control-runtime/contract.ts","../src/feedback-trajectory-review.ts","../src/feedback-trajectory.ts"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { t as extractJsonPayload } from "./json-DtvZNAU9.js";
|
|
|
4
4
|
import { A as RawAnalystFindingSchema } from "./kind-factory-VKysp1ds.js";
|
|
5
5
|
import "./llm-client-BdSiZ4qz.js";
|
|
6
6
|
import { t as paidChat } from "./chat-json-call-C473CwTt.js";
|
|
7
|
-
import { n as decodeRawFindingArray } from "./dspy-rlm-engine-
|
|
7
|
+
import { n as decodeRawFindingArray } from "./dspy-rlm-engine-Xt3znknf.js";
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
10
10
|
import { dirname } from "node:path";
|
|
@@ -532,4 +532,4 @@ function diffFindings(previous, current, policy = {}) {
|
|
|
532
532
|
}
|
|
533
533
|
export { diffFindings as n, createChatTraceEngine as r, FindingsStore as t };
|
|
534
534
|
|
|
535
|
-
//# sourceMappingURL=findings-store-
|
|
535
|
+
//# sourceMappingURL=findings-store-Bp-0Guuv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findings-store-DNSvmy8U.js","names":["messageOf"],"sources":["../src/analyst/chat-trace-engine.ts","../src/locked-jsonl-appender.ts","../src/analyst/findings-store.ts"],"sourcesContent":["/**\n * A `TraceAnalysisEngine` that runs entirely inside Node against a\n * caller-owned `ChatClient`.\n *\n * The other engine in this package, `createDspyRlmTraceEngine`, reaches the\n * DSPy RLM through a Python subprocess. That made every model-backed analyst\n * unreachable for a consumer that already owns a model seam and no Python:\n * `createTraceAnalyst` requires an engine, the only exported constructor\n * required a Python runner, so `buildDefaultAnalystRegistry()` registered the\n * deterministic analyst alone and `analystsFromRegistry` refused the result.\n *\n * This engine closes that path. It drives the same investigation contract —\n * bounded trace tools, a prose answer, a strict findings array — with native\n * function calls over the transport the caller already bound with\n * `createChatClient`. A caller holding a bare\n * `(request: LlmCallRequest) => Promise<LlmCallResult>` adapts it in one line:\n *\n * createChatClient({ transport: 'custom', chat: call, defaultModel, maximumAttempts })\n *\n * agent-eval still executes no paid model and holds no provider credential.\n * Every call goes through `paidChat`, so the shared cost ledger reserves the\n * priced maximum before the call and settles the receipt after it.\n *\n * Shape of one investigation:\n * 1. Investigation turns. The model reads the trace store through the tools\n * its analyst kind was given. A turn that requests no tool ends the\n * phase; an exhausted iteration or tool budget also ends it.\n * 2. One report turn. The model returns `{ answer, findings }` as JSON,\n * decoded by the same `decodeRawFindingArray` the Python bridge uses, so\n * a row this engine accepts is a row that engine could report.\n */\n\nimport { z } from 'zod'\nimport { paidChat } from '../chat-json-call'\nimport type { CustomTokenPricing } from '../cost-ledger'\nimport { errorMessage as messageOf } from '../errors'\nimport {\n extractJsonPayload,\n type LlmCallRequest,\n type LlmMessage,\n type LlmThinkingMode,\n type LlmToolCall,\n type LlmToolDefinition,\n} from '../llm-client'\nimport type { TraceAnalysisToolDescriptor } from '../trace-analyst/tools'\nimport type { ChatClient } from './chat-client'\nimport {\n DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS,\n type TraceAnalysisEngine,\n type TraceAnalysisEngineRequest,\n type TraceAnalysisEngineResult,\n} from './engine'\nimport { decodeRawFindingArray } from './finding-codec'\nimport { RawAnalystFindingSchema } from './finding-signature'\n\n/** Bumped whenever this engine's execution behavior changes. */\nconst CHAT_TRACE_ENGINE_VERSION = '1.0.0'\nconst ENGINE_ID = 'chat-trace'\n\n/** Marker appended to a tool result cut down to the retained-output budget. */\nconst TRUNCATION_MARKER = '\\n…[truncated to the analyst maxOutputChars budget]'\n\nexport interface ChatTraceEngineOptions {\n /**\n * Caller-owned transport. Build it with `createChatClient`; agent-eval never\n * receives the provider credential.\n */\n chat: ChatClient\n /** Model for every call. Defaults to the client's `defaultModel`. */\n model?: string\n /** Endpoint rates used when the transport reports no billed amount. */\n pricing?: CustomTokenPricing\n /** Completion cap per turn. Default: {@link DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS}. */\n maxOutputTokens?: number\n /** Sampling temperature. Omitted from the request when absent. */\n temperature?: number\n /** Provider reasoning mode. Omitted when the provider default should apply. */\n thinking?: LlmThinkingMode\n /** Per-call deadline handed to the transport. */\n requestTimeoutMs?: number\n /**\n * How the report turn asks for structured output.\n *\n * `json-object` sends JSON mode, which every OpenAI-compatible endpoint\n * accepts, and relies on the finding grammar the analyst kind already puts\n * in its instructions. `json-schema` sends the generated response schema as\n * well, which stricter endpoints honour and older ones reject. Default:\n * `json-object`.\n */\n reportFormat?: 'json-object' | 'json-schema'\n}\n\n/**\n * The report envelope. Its `findings` rows are generated from\n * `RawAnalystFindingSchema`, so the schema offered to a provider and the\n * decoder that accepts the answer cannot drift apart.\n */\nfunction buildReportJsonSchema(): { name: string; schema: Record<string, unknown> } {\n const row = z.toJSONSchema(RawAnalystFindingSchema, { target: 'draft-7' }) as Record<\n string,\n unknown\n >\n delete row.$schema\n return {\n name: 'trace_analysis_report',\n schema: {\n type: 'object',\n additionalProperties: false,\n required: ['answer', 'findings'],\n properties: {\n answer: { type: 'string', description: 'Direct prose answer to the question.' },\n findings: { type: 'array', items: row },\n },\n },\n }\n}\n\nconst REPORT_JSON_SCHEMA = buildReportJsonSchema()\n\n/**\n * Run bounded recursive trace analysis in-process over a caller-owned chat\n * transport. No Python, no subprocess, no loopback proxy.\n */\nexport function createChatTraceEngine(options: ChatTraceEngineOptions): TraceAnalysisEngine {\n const model = resolveModel(options)\n const maxOutputTokens = options.maxOutputTokens ?? DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS\n if (!Number.isSafeInteger(maxOutputTokens) || maxOutputTokens <= 0) {\n throw new TypeError('chat trace engine maxOutputTokens must be a positive safe integer')\n }\n if (\n options.temperature !== undefined &&\n (!Number.isFinite(options.temperature) || options.temperature < 0)\n ) {\n throw new TypeError('chat trace engine temperature must be a non-negative finite number')\n }\n if (\n options.requestTimeoutMs !== undefined &&\n (!Number.isSafeInteger(options.requestTimeoutMs) || options.requestTimeoutMs <= 0)\n ) {\n throw new TypeError('chat trace engine requestTimeoutMs must be a positive safe integer')\n }\n const reportFormat = options.reportFormat ?? 'json-object'\n if (reportFormat !== 'json-object' && reportFormat !== 'json-schema') {\n throw new TypeError(`chat trace engine reportFormat must be json-object or json-schema`)\n }\n\n return {\n id: ENGINE_ID,\n description:\n 'In-process recursive trace analysis over a caller-owned ChatClient with native tool calls.',\n model,\n version: CHAT_TRACE_ENGINE_VERSION,\n executionConfig: {\n kind: ENGINE_ID,\n model,\n transport: options.chat.transport,\n maximum_attempts: options.chat.maximumAttempts ?? null,\n pricing: options.pricing ? { ...options.pricing } : null,\n max_output_tokens: maxOutputTokens,\n temperature: options.temperature ?? null,\n thinking: options.thinking ?? null,\n request_timeout_ms: options.requestTimeoutMs ?? null,\n report_format: reportFormat,\n report_schema_name: REPORT_JSON_SCHEMA.name,\n },\n analyze: (request) => analyze(request, { ...options, model, maxOutputTokens, reportFormat }),\n }\n}\n\ninterface ResolvedOptions extends ChatTraceEngineOptions {\n model: string\n maxOutputTokens: number\n reportFormat: 'json-object' | 'json-schema'\n}\n\nasync function analyze(\n request: TraceAnalysisEngineRequest,\n options: ResolvedOptions,\n): Promise<TraceAnalysisEngineResult> {\n // One model call is spent on the report, so a budget of one call would buy\n // an answer with no investigation behind it. Refuse instead of pretending.\n if (request.limits.maxLlmCalls < 2) {\n throw new Error(\n `chat trace engine reserves one model call for the report, so maxLlmCalls must be at least 2 (analyst '${request.analystId}' declared ${request.limits.maxLlmCalls})`,\n )\n }\n const toolsByName = new Map(request.tools.map((tool) => [tool.name, tool]))\n if (toolsByName.size !== request.tools.length) {\n throw new Error(`chat trace engine received duplicate tool names for '${request.analystId}'`)\n }\n const toolDefinitions: LlmToolDefinition[] = request.tools.map((tool) => ({\n type: 'function',\n function: { name: tool.name, description: tool.description, parameters: tool.parameters },\n }))\n const investigationTurns = Math.max(\n 1,\n Math.min(request.limits.maxIterations, request.limits.maxLlmCalls - 1),\n )\n\n const messages: LlmMessage[] = [\n { role: 'system', content: systemPrompt(request, investigationTurns) },\n ]\n if (request.taskInputs) {\n messages.push({ role: 'user', content: renderTaskInputs(request.taskInputs) })\n }\n messages.push({ role: 'user', content: request.question })\n\n request.log?.('trace analyst engine started', {\n engine: ENGINE_ID,\n model: options.model,\n transport: options.chat.transport,\n tools: request.tools.map((tool) => tool.name),\n limits: request.limits,\n })\n\n const trajectory: unknown[] = []\n const servedModels = new Set<string>()\n let modelCalls = 0\n let toolCalls = 0\n let truncatedToolResults = 0\n let toolBudgetExhausted = false\n let turnsUsed = 0\n let stoppedOnAnswer = false\n\n for (let turn = 0; turn < investigationTurns; turn++) {\n turnsUsed = turn + 1\n const response = await callModel(request, options, {\n messages,\n tools: toolDefinitions,\n toolChoice: 'auto',\n purpose: 'investigation',\n })\n modelCalls += 1\n servedModels.add(response.servedModel ?? 'unreported')\n const requested = response.toolCalls ?? []\n messages.push({\n role: 'assistant',\n content: response.content,\n ...(requested.length > 0 ? { toolCalls: requested } : {}),\n })\n trajectory.push({\n turn: turnsUsed,\n phase: 'investigation',\n content: response.content,\n tool_calls: requested.map((call) => ({ id: call.id, name: call.name })),\n finish_reason: response.finishReason ?? null,\n })\n if (requested.length === 0) {\n stoppedOnAnswer = true\n break\n }\n for (const call of requested) {\n if (toolCalls >= request.limits.maxToolCalls) {\n toolBudgetExhausted = true\n // Every requested id still needs an answer: a provider rejects the\n // next turn when one tool call is left unanswered.\n messages.push(toolMessage(call, exhaustedToolBudget(request.limits.maxToolCalls)))\n continue\n }\n toolCalls += 1\n const executed = await executeTool(call, toolsByName, request)\n if (executed.truncated) truncatedToolResults += 1\n messages.push(toolMessage(call, executed.payload))\n trajectory.push({\n turn: turnsUsed,\n phase: 'tool',\n name: call.name,\n ok: executed.ok,\n truncated: executed.truncated,\n result_chars: executed.payload.length,\n })\n }\n if (toolBudgetExhausted) break\n }\n\n messages.push({ role: 'user', content: reportPrompt(options.reportFormat) })\n const report = await callModel(request, options, {\n messages,\n purpose: 'report',\n json: options.reportFormat,\n })\n modelCalls += 1\n servedModels.add(report.servedModel ?? 'unreported')\n trajectory.push({\n turn: turnsUsed + 1,\n phase: 'report',\n content: report.content,\n finish_reason: report.finishReason ?? null,\n })\n\n const parsed = parseReport(report.content, request.analystId, (index, reason) => {\n request.log?.('finding rejected: report row failed schema validation', {\n engine: ENGINE_ID,\n index,\n reason,\n })\n })\n\n const result: TraceAnalysisEngineResult = {\n answer: parsed.answer,\n findings: parsed.findings,\n trajectory,\n modelCalls,\n toolCalls,\n runtime: {\n engine: ENGINE_ID,\n model: options.model,\n transport: options.chat.transport,\n report_format: options.reportFormat,\n investigation_turns: turnsUsed,\n investigation_stopped_on_answer: stoppedOnAnswer,\n tool_budget_exhausted: toolBudgetExhausted,\n truncated_tool_results: truncatedToolResults,\n rejected_findings: parsed.rejectedFindings,\n // A gateway can answer `model: X` from another model on HTTP 200, so the\n // ids the provider echoed travel with the result as evidence.\n served_models: [...servedModels].sort(),\n task_inputs: request.taskInputs ? 'prompt-delivered' : 'none',\n },\n }\n request.log?.('trace analyst engine completed', {\n engine: ENGINE_ID,\n model_calls: result.modelCalls,\n tool_calls: result.toolCalls,\n findings: result.findings.length,\n })\n return result\n}\n\ninterface ModelTurn {\n content: string\n toolCalls?: LlmToolCall[]\n servedModel?: string | null\n finishReason?: string | null\n}\n\nasync function callModel(\n request: TraceAnalysisEngineRequest,\n options: ResolvedOptions,\n turn: {\n messages: LlmMessage[]\n tools?: LlmToolDefinition[]\n toolChoice?: LlmCallRequest['toolChoice']\n purpose: 'investigation' | 'report'\n json?: 'json-object' | 'json-schema'\n },\n): Promise<ModelTurn> {\n const chatRequest: LlmCallRequest = {\n model: options.model,\n // The transport may mutate what it is handed; the conversation is ours.\n messages: turn.messages.map((message) => ({ ...message })),\n maxTokens: options.maxOutputTokens,\n ...(turn.tools && turn.tools.length > 0\n ? { tools: turn.tools, ...(turn.toolChoice ? { toolChoice: turn.toolChoice } : {}) }\n : {}),\n ...(turn.json ? { jsonMode: true } : {}),\n ...(turn.json === 'json-schema' ? { jsonSchema: REPORT_JSON_SCHEMA } : {}),\n ...(options.temperature === undefined ? {} : { temperature: options.temperature }),\n ...(options.thinking === undefined ? {} : { thinking: options.thinking }),\n ...(options.requestTimeoutMs === undefined ? {} : { timeoutMs: options.requestTimeoutMs }),\n }\n const paid = await paidChat({\n chat: options.chat,\n request: chatRequest,\n ledger: request.costLedger,\n channel: 'analyst',\n phase: request.costPhase,\n actor: request.analystId,\n ...(request.costTags ? { tags: request.costTags } : {}),\n ...(options.pricing ? { pricing: options.pricing } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n })\n if (!paid.succeeded) {\n // The transport already spent its own attempts. A failure here ends the\n // investigation: continuing would report an answer the model never gave.\n throw new Error(\n `chat trace engine ${turn.purpose} call failed for '${request.analystId}': ${paid.error.message}`,\n { cause: paid.error },\n )\n }\n return {\n content: paid.response.content,\n ...(paid.response.toolCalls ? { toolCalls: paid.response.toolCalls } : {}),\n ...(paid.response.servedModel === undefined ? {} : { servedModel: paid.response.servedModel }),\n ...(paid.response.finishReason === undefined\n ? {}\n : { finishReason: paid.response.finishReason }),\n }\n}\n\ninterface ExecutedTool {\n ok: boolean\n truncated: boolean\n payload: string\n}\n\nasync function executeTool(\n call: LlmToolCall,\n toolsByName: ReadonlyMap<string, TraceAnalysisToolDescriptor>,\n request: TraceAnalysisEngineRequest,\n): Promise<ExecutedTool> {\n const descriptor = toolsByName.get(call.name)\n if (!descriptor) {\n return {\n ok: false,\n truncated: false,\n payload: toolError(\n `unknown tool '${call.name}'; available tools are ${[...toolsByName.keys()].sort().join(', ')}`,\n ),\n }\n }\n let args: unknown\n try {\n args = call.argumentsJson.trim() === '' ? {} : JSON.parse(call.argumentsJson)\n } catch (error) {\n return {\n ok: false,\n truncated: false,\n payload: toolError(\n `arguments for '${call.name}' were not JSON: ${messageOf(error)}. Send valid JSON arguments.`,\n ),\n }\n }\n try {\n const value = await descriptor.handler(\n args,\n request.signal ? { signal: request.signal } : undefined,\n )\n return truncateToolPayload(JSON.stringify(value ?? null), request.limits.maxOutputChars)\n } catch (error) {\n // A bounded store refuses an oversized or malformed read by design. That\n // refusal is the model's next instruction, not the run's failure.\n if (request.signal?.aborted) throw error\n request.log?.('trace tool failed', {\n engine: ENGINE_ID,\n analyst_id: request.analystId,\n tool: call.name,\n reason: messageOf(error),\n })\n return { ok: false, truncated: false, payload: toolError(messageOf(error)) }\n }\n}\n\nfunction truncateToolPayload(payload: string, maxOutputChars: number): ExecutedTool {\n if (payload.length <= maxOutputChars) return { ok: true, truncated: false, payload }\n const keep = Math.max(0, maxOutputChars - TRUNCATION_MARKER.length)\n return { ok: true, truncated: true, payload: `${payload.slice(0, keep)}${TRUNCATION_MARKER}` }\n}\n\nfunction toolMessage(call: LlmToolCall, content: string): LlmMessage {\n return { role: 'tool', toolCallId: call.id, content }\n}\n\nfunction toolError(reason: string): string {\n return JSON.stringify({ error: reason })\n}\n\nfunction exhaustedToolBudget(maxToolCalls: number): string {\n return toolError(\n `the trace-tool budget of ${maxToolCalls} calls is spent; answer from the evidence already read`,\n )\n}\n\nfunction systemPrompt(request: TraceAnalysisEngineRequest, investigationTurns: number): string {\n return [\n request.instructions.trim(),\n [\n 'HOW THIS INVESTIGATION RUNS:',\n `- You have ${investigationTurns} investigation turns and at most ${request.limits.maxToolCalls} trace-tool calls.`,\n '- Call the trace tools to read the store. Never state a trace fact you did not read.',\n `- A tool result longer than ${request.limits.maxOutputChars} characters is truncated; narrow the query instead of asking again.`,\n '- A tool result carrying an \"error\" field is feedback: fix the call or take another route.',\n '- Answer with no tool call once you have the evidence. You are then asked for the final report.',\n ].join('\\n'),\n ].join('\\n\\n')\n}\n\nfunction reportPrompt(reportFormat: 'json-object' | 'json-schema'): string {\n return [\n 'Report now. Do not call any more tools.',\n 'Return one JSON object with exactly two fields:',\n ' \"answer\": a direct prose answer to the question.',\n ' \"findings\": an array of findings in the schema above. Emit [] when there is nothing to report.',\n reportFormat === 'json-object'\n ? 'Return the object alone, with no surrounding prose and no code fence.'\n : 'Return the object in the response schema you were given.',\n ].join('\\n')\n}\n\nfunction renderTaskInputs(taskInputs: Readonly<Record<string, unknown>>): string {\n // The engine contract forbids dropping structured inputs. This engine has no\n // code environment to bind them as variables, so they are delivered whole as\n // conversation material and the runtime record says which way they arrived.\n return [\n 'TASK INPUTS — structured material delivered with the question, not fetched through tools:',\n JSON.stringify(taskInputs, null, 2),\n ].join('\\n')\n}\n\ninterface ParsedReport {\n answer: string\n findings: TraceAnalysisEngineResult['findings']\n rejectedFindings: number\n}\n\nfunction parseReport(\n content: string,\n analystId: string,\n onRejectedFinding: (index: number, reason: string) => void,\n): ParsedReport {\n const envelope = coerceReportEnvelope(content, analystId)\n if (typeof envelope.answer !== 'string' || !envelope.answer.trim()) {\n throw new Error(`chat trace engine report for '${analystId}' carried no answer`)\n }\n // Findings are model output: one malformed row is model noise, not an engine\n // fault, and the rest of the paid investigation must survive it.\n const decoded = decodeRawFindingArray(envelope.findings)\n if (decoded.topLevelError !== undefined) {\n throw new Error(\n `chat trace engine report for '${analystId}' had a malformed findings array: ${decoded.topLevelError}`,\n )\n }\n for (const rejection of decoded.rejected) {\n onRejectedFinding(\n rejection.index,\n `${rejection.code}${rejection.path ? ` at ${rejection.path}` : ''}: ${rejection.message}`,\n )\n }\n return {\n answer: envelope.answer,\n findings: decoded.accepted,\n rejectedFindings: decoded.rejected.length,\n }\n}\n\nfunction coerceReportEnvelope(content: string, analystId: string): Record<string, unknown> {\n let value: unknown\n try {\n value = JSON.parse(extractJsonPayload(content))\n } catch (error) {\n throw new Error(`chat trace engine report for '${analystId}' was not JSON: ${messageOf(error)}`)\n }\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`chat trace engine report for '${analystId}' was not a JSON object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction resolveModel(options: ChatTraceEngineOptions): string {\n const model = options.model ?? options.chat.defaultModel\n if (typeof model !== 'string' || !model.trim() || model !== model.trim()) {\n throw new TypeError(\n 'chat trace engine needs a model: pass ChatTraceEngineOptions.model or bind defaultModel on the ChatClient',\n )\n }\n return model\n}\n","/**\n * LockedJsonlAppender — mutex-serialized JSONL append helper for arbitrary\n * payloads. The reference-replay store does the same thing for typed\n * `ReferenceReplayRun` rows; this is the generic version used by\n * `MutationTelemetry`, `TrialTelemetry`, and any other consumer that wants\n * append-only durable telemetry without rolling its own lock.\n *\n * Locks are per absolute file path (process-local). Cross-process\n * concurrency is NOT addressed — that's an fcntl/flock problem.\n */\n\nimport { appendFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { Mutex } from './concurrency'\n\nconst mutexes = new Map<string, Mutex>()\n\nfunction getMutex(path: string): Mutex {\n let m = mutexes.get(path)\n if (!m) {\n m = new Mutex()\n mutexes.set(path, m)\n }\n return m\n}\n\nexport class LockedJsonlAppender {\n private readonly mutex: Mutex\n constructor(public readonly path: string) {\n this.mutex = getMutex(path)\n if (!existsSync(dirname(path))) {\n mkdirSync(dirname(path), { recursive: true })\n }\n }\n\n async append(entry: unknown): Promise<void> {\n const line = `${JSON.stringify(entry)}\\n`\n await this.mutex.runExclusive(() => {\n appendFileSync(this.path, line)\n })\n }\n}\n\n/** Reset all internal mutex state — tests only. */\nexport function resetLockedAppendersForTesting(): void {\n mutexes.clear()\n}\n","/**\n * FindingsStore — durable persistence for AnalystFinding rows + a diff\n * helper so we can answer \"what changed since the last run?\" without\n * recomputing analysts.\n *\n * On-disk shape is JSONL: one finding per line, append-only, locked via\n * LockedJsonlAppender. Operators get crash-safety (no partial JSON),\n * cheap reads (sequential parse), and trivial backup (rsync the file).\n *\n * Reads are non-locking: a reader sees a consistent snapshot of all\n * fully-written lines and skips an incomplete trailing line if the\n * writer is mid-append. Cross-process locking is intentionally out of\n * scope (see locked-jsonl-appender.ts).\n *\n * The store is run-scoped: callers pass `runId` on append and on load,\n * which keeps multi-run files cleanly partitioned. The `diffFindings`\n * helper compares two run-id sets using stable `finding_id` semantics —\n * the diff is the cross-run signal the regression dashboard renders.\n */\n\nimport { existsSync, readFileSync } from 'node:fs'\n\nimport { LockedJsonlAppender } from '../locked-jsonl-appender'\nimport type { AnalystFinding } from './types'\n\n/**\n * One persisted row. We attach `run_id` on disk so a single file can\n * hold multiple runs and the diff helper can query without re-walking\n * separate files.\n */\nexport interface PersistedFinding extends AnalystFinding {\n run_id: string\n}\n\nexport class FindingsStore {\n private readonly appender: LockedJsonlAppender\n\n constructor(public readonly path: string) {\n this.appender = new LockedJsonlAppender(path)\n }\n\n async append(runId: string, findings: AnalystFinding[]): Promise<void> {\n for (const f of findings) {\n const row: PersistedFinding = { ...f, run_id: runId }\n await this.appender.append(row)\n }\n }\n\n /** Load every persisted finding. Discards malformed trailing lines silently. */\n loadAll(): PersistedFinding[] {\n if (!existsSync(this.path)) return []\n const raw = readFileSync(this.path, 'utf8')\n if (!raw) return []\n const out: PersistedFinding[] = []\n for (const line of raw.split('\\n')) {\n if (!line) continue\n try {\n out.push(JSON.parse(line) as PersistedFinding)\n } catch {\n // Skip torn trailing line — the lock guarantees no torn lines\n // mid-file, only at EOF when a writer is in-flight.\n }\n }\n return out\n }\n\n /** Filter to a single run. */\n loadRun(runId: string): PersistedFinding[] {\n return this.loadAll().filter((r) => r.run_id === runId)\n }\n}\n\n// ── Cross-run diff ──────────────────────────────────────────────────\n\nexport interface FindingsDiff {\n /** New finding ids in `current` that weren't in `previous`. */\n appeared: PersistedFinding[]\n /** Finding ids in `previous` that aren't in `current`. */\n disappeared: PersistedFinding[]\n /** Same finding id present in both runs and unchanged per the materiality test. */\n persisted: PersistedFinding[]\n /**\n * Same finding id in both runs but at least one non-identity field\n * shifted per `DiffPolicy.isMaterial`. Reported as [previous, current].\n */\n changed: Array<{ previous: PersistedFinding; current: PersistedFinding }>\n}\n\nexport interface DiffPolicy {\n /**\n * Predicate that decides whether two findings (same finding_id) count\n * as a material change. Defaults to {@link defaultIsMaterial}: severity\n * shift, confidence Δ > 0.05, or evidence count change. Compliance /\n * perf consumers MAY supply a stricter predicate (e.g. rationale text\n * diff, metric Δ thresholds).\n */\n isMaterial?: (previous: AnalystFinding, current: AnalystFinding) => boolean\n}\n\n/**\n * Default materiality test. Deliberately narrow so LLM-reword churn\n * doesn't flood the diff. Stricter tests are opt-in via DiffPolicy.\n */\nfunction defaultIsMaterial(a: AnalystFinding, b: AnalystFinding): boolean {\n if (a.severity !== b.severity) return true\n if (Math.abs((a.confidence ?? 0) - (b.confidence ?? 0)) > 0.05) return true\n if (a.evidence_refs.length !== b.evidence_refs.length) return true\n return false\n}\n\n/**\n * Diff two findings sets by stable finding_id. Callers typically load\n * the two run-id slices from the same store and pass them in.\n */\nexport function diffFindings(\n previous: PersistedFinding[],\n current: PersistedFinding[],\n policy: DiffPolicy = {},\n): FindingsDiff {\n const isMaterial = policy.isMaterial ?? defaultIsMaterial\n const prevById = new Map(previous.map((f) => [f.finding_id, f]))\n const curById = new Map(current.map((f) => [f.finding_id, f]))\n\n const appeared: PersistedFinding[] = []\n const disappeared: PersistedFinding[] = []\n const persisted: PersistedFinding[] = []\n const changed: FindingsDiff['changed'] = []\n\n for (const [id, cur] of curById) {\n const prev = prevById.get(id)\n if (!prev) {\n appeared.push(cur)\n continue\n }\n if (isMaterial(prev, cur)) {\n changed.push({ previous: prev, current: cur })\n } else {\n persisted.push(cur)\n }\n }\n for (const [id, prev] of prevById) {\n if (!curById.has(id)) disappeared.push(prev)\n }\n return { appeared, disappeared, persisted, changed }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"findings-store-Bp-0Guuv.js","names":["messageOf"],"sources":["../src/analyst/chat-trace-engine.ts","../src/locked-jsonl-appender.ts","../src/analyst/findings-store.ts"],"sourcesContent":["/**\n * A `TraceAnalysisEngine` that runs entirely inside Node against a\n * caller-owned `ChatClient`.\n *\n * The other engine in this package, `createDspyRlmTraceEngine`, reaches the\n * DSPy RLM through a Python subprocess. That made every model-backed analyst\n * unreachable for a consumer that already owns a model seam and no Python:\n * `createTraceAnalyst` requires an engine, the only exported constructor\n * required a Python runner, so `buildDefaultAnalystRegistry()` registered the\n * deterministic analyst alone and `analystsFromRegistry` refused the result.\n *\n * This engine closes that path. It drives the same investigation contract —\n * bounded trace tools, a prose answer, a strict findings array — with native\n * function calls over the transport the caller already bound with\n * `createChatClient`. A caller holding a bare\n * `(request: LlmCallRequest) => Promise<LlmCallResult>` adapts it in one line:\n *\n * createChatClient({ transport: 'custom', chat: call, defaultModel, maximumAttempts })\n *\n * agent-eval still executes no paid model and holds no provider credential.\n * Every call goes through `paidChat`, so the shared cost ledger reserves the\n * priced maximum before the call and settles the receipt after it.\n *\n * Shape of one investigation:\n * 1. Investigation turns. The model reads the trace store through the tools\n * its analyst kind was given. A turn that requests no tool ends the\n * phase; an exhausted iteration or tool budget also ends it.\n * 2. One report turn. The model returns `{ answer, findings }` as JSON,\n * decoded by the same `decodeRawFindingArray` the Python bridge uses, so\n * a row this engine accepts is a row that engine could report.\n */\n\nimport { z } from 'zod'\nimport { paidChat } from '../chat-json-call'\nimport type { CustomTokenPricing } from '../cost-ledger'\nimport { errorMessage as messageOf } from '../errors'\nimport {\n extractJsonPayload,\n type LlmCallRequest,\n type LlmMessage,\n type LlmThinkingMode,\n type LlmToolCall,\n type LlmToolDefinition,\n} from '../llm-client'\nimport type { TraceAnalysisToolDescriptor } from '../trace-analyst/tools'\nimport type { ChatClient } from './chat-client'\nimport {\n DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS,\n type TraceAnalysisEngine,\n type TraceAnalysisEngineRequest,\n type TraceAnalysisEngineResult,\n} from './engine'\nimport { decodeRawFindingArray } from './finding-codec'\nimport { RawAnalystFindingSchema } from './finding-signature'\n\n/** Bumped whenever this engine's execution behavior changes. */\nconst CHAT_TRACE_ENGINE_VERSION = '1.0.0'\nconst ENGINE_ID = 'chat-trace'\n\n/** Marker appended to a tool result cut down to the retained-output budget. */\nconst TRUNCATION_MARKER = '\\n…[truncated to the analyst maxOutputChars budget]'\n\nexport interface ChatTraceEngineOptions {\n /**\n * Caller-owned transport. Build it with `createChatClient`; agent-eval never\n * receives the provider credential.\n */\n chat: ChatClient\n /** Model for every call. Defaults to the client's `defaultModel`. */\n model?: string\n /** Endpoint rates used when the transport reports no billed amount. */\n pricing?: CustomTokenPricing\n /** Completion cap per turn. Default: {@link DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS}. */\n maxOutputTokens?: number\n /** Sampling temperature. Omitted from the request when absent. */\n temperature?: number\n /** Provider reasoning mode. Omitted when the provider default should apply. */\n thinking?: LlmThinkingMode\n /** Per-call deadline handed to the transport. */\n requestTimeoutMs?: number\n /**\n * How the report turn asks for structured output.\n *\n * `json-object` sends JSON mode, which every OpenAI-compatible endpoint\n * accepts, and relies on the finding grammar the analyst kind already puts\n * in its instructions. `json-schema` sends the generated response schema as\n * well, which stricter endpoints honour and older ones reject. Default:\n * `json-object`.\n */\n reportFormat?: 'json-object' | 'json-schema'\n}\n\n/**\n * The report envelope. Its `findings` rows are generated from\n * `RawAnalystFindingSchema`, so the schema offered to a provider and the\n * decoder that accepts the answer cannot drift apart.\n */\nfunction buildReportJsonSchema(): { name: string; schema: Record<string, unknown> } {\n const row = z.toJSONSchema(RawAnalystFindingSchema, { target: 'draft-7' }) as Record<\n string,\n unknown\n >\n delete row.$schema\n return {\n name: 'trace_analysis_report',\n schema: {\n type: 'object',\n additionalProperties: false,\n required: ['answer', 'findings'],\n properties: {\n answer: { type: 'string', description: 'Direct prose answer to the question.' },\n findings: { type: 'array', items: row },\n },\n },\n }\n}\n\nconst REPORT_JSON_SCHEMA = buildReportJsonSchema()\n\n/**\n * Run bounded recursive trace analysis in-process over a caller-owned chat\n * transport. No Python, no subprocess, no loopback proxy.\n */\nexport function createChatTraceEngine(options: ChatTraceEngineOptions): TraceAnalysisEngine {\n const model = resolveModel(options)\n const maxOutputTokens = options.maxOutputTokens ?? DEFAULT_TRACE_ANALYST_OUTPUT_TOKENS\n if (!Number.isSafeInteger(maxOutputTokens) || maxOutputTokens <= 0) {\n throw new TypeError('chat trace engine maxOutputTokens must be a positive safe integer')\n }\n if (\n options.temperature !== undefined &&\n (!Number.isFinite(options.temperature) || options.temperature < 0)\n ) {\n throw new TypeError('chat trace engine temperature must be a non-negative finite number')\n }\n if (\n options.requestTimeoutMs !== undefined &&\n (!Number.isSafeInteger(options.requestTimeoutMs) || options.requestTimeoutMs <= 0)\n ) {\n throw new TypeError('chat trace engine requestTimeoutMs must be a positive safe integer')\n }\n const reportFormat = options.reportFormat ?? 'json-object'\n if (reportFormat !== 'json-object' && reportFormat !== 'json-schema') {\n throw new TypeError(`chat trace engine reportFormat must be json-object or json-schema`)\n }\n\n return {\n id: ENGINE_ID,\n description:\n 'In-process recursive trace analysis over a caller-owned ChatClient with native tool calls.',\n model,\n version: CHAT_TRACE_ENGINE_VERSION,\n executionConfig: {\n kind: ENGINE_ID,\n model,\n transport: options.chat.transport,\n maximum_attempts: options.chat.maximumAttempts ?? null,\n pricing: options.pricing ? { ...options.pricing } : null,\n max_output_tokens: maxOutputTokens,\n temperature: options.temperature ?? null,\n thinking: options.thinking ?? null,\n request_timeout_ms: options.requestTimeoutMs ?? null,\n report_format: reportFormat,\n report_schema_name: REPORT_JSON_SCHEMA.name,\n },\n analyze: (request) => analyze(request, { ...options, model, maxOutputTokens, reportFormat }),\n }\n}\n\ninterface ResolvedOptions extends ChatTraceEngineOptions {\n model: string\n maxOutputTokens: number\n reportFormat: 'json-object' | 'json-schema'\n}\n\nasync function analyze(\n request: TraceAnalysisEngineRequest,\n options: ResolvedOptions,\n): Promise<TraceAnalysisEngineResult> {\n // One model call is spent on the report, so a budget of one call would buy\n // an answer with no investigation behind it. Refuse instead of pretending.\n if (request.limits.maxLlmCalls < 2) {\n throw new Error(\n `chat trace engine reserves one model call for the report, so maxLlmCalls must be at least 2 (analyst '${request.analystId}' declared ${request.limits.maxLlmCalls})`,\n )\n }\n const toolsByName = new Map(request.tools.map((tool) => [tool.name, tool]))\n if (toolsByName.size !== request.tools.length) {\n throw new Error(`chat trace engine received duplicate tool names for '${request.analystId}'`)\n }\n const toolDefinitions: LlmToolDefinition[] = request.tools.map((tool) => ({\n type: 'function',\n function: { name: tool.name, description: tool.description, parameters: tool.parameters },\n }))\n const investigationTurns = Math.max(\n 1,\n Math.min(request.limits.maxIterations, request.limits.maxLlmCalls - 1),\n )\n\n const messages: LlmMessage[] = [\n { role: 'system', content: systemPrompt(request, investigationTurns) },\n ]\n if (request.taskInputs) {\n messages.push({ role: 'user', content: renderTaskInputs(request.taskInputs) })\n }\n messages.push({ role: 'user', content: request.question })\n\n request.log?.('trace analyst engine started', {\n engine: ENGINE_ID,\n model: options.model,\n transport: options.chat.transport,\n tools: request.tools.map((tool) => tool.name),\n limits: request.limits,\n })\n\n const trajectory: unknown[] = []\n const servedModels = new Set<string>()\n let modelCalls = 0\n let toolCalls = 0\n let truncatedToolResults = 0\n let toolBudgetExhausted = false\n let turnsUsed = 0\n let stoppedOnAnswer = false\n\n for (let turn = 0; turn < investigationTurns; turn++) {\n turnsUsed = turn + 1\n const response = await callModel(request, options, {\n messages,\n tools: toolDefinitions,\n toolChoice: 'auto',\n purpose: 'investigation',\n })\n modelCalls += 1\n servedModels.add(response.servedModel ?? 'unreported')\n const requested = response.toolCalls ?? []\n messages.push({\n role: 'assistant',\n content: response.content,\n ...(requested.length > 0 ? { toolCalls: requested } : {}),\n })\n trajectory.push({\n turn: turnsUsed,\n phase: 'investigation',\n content: response.content,\n tool_calls: requested.map((call) => ({ id: call.id, name: call.name })),\n finish_reason: response.finishReason ?? null,\n })\n if (requested.length === 0) {\n stoppedOnAnswer = true\n break\n }\n for (const call of requested) {\n if (toolCalls >= request.limits.maxToolCalls) {\n toolBudgetExhausted = true\n // Every requested id still needs an answer: a provider rejects the\n // next turn when one tool call is left unanswered.\n messages.push(toolMessage(call, exhaustedToolBudget(request.limits.maxToolCalls)))\n continue\n }\n toolCalls += 1\n const executed = await executeTool(call, toolsByName, request)\n if (executed.truncated) truncatedToolResults += 1\n messages.push(toolMessage(call, executed.payload))\n trajectory.push({\n turn: turnsUsed,\n phase: 'tool',\n name: call.name,\n ok: executed.ok,\n truncated: executed.truncated,\n result_chars: executed.payload.length,\n })\n }\n if (toolBudgetExhausted) break\n }\n\n messages.push({ role: 'user', content: reportPrompt(options.reportFormat) })\n const report = await callModel(request, options, {\n messages,\n purpose: 'report',\n json: options.reportFormat,\n })\n modelCalls += 1\n servedModels.add(report.servedModel ?? 'unreported')\n trajectory.push({\n turn: turnsUsed + 1,\n phase: 'report',\n content: report.content,\n finish_reason: report.finishReason ?? null,\n })\n\n const parsed = parseReport(report.content, request.analystId, (index, reason) => {\n request.log?.('finding rejected: report row failed schema validation', {\n engine: ENGINE_ID,\n index,\n reason,\n })\n })\n\n const result: TraceAnalysisEngineResult = {\n answer: parsed.answer,\n findings: parsed.findings,\n trajectory,\n modelCalls,\n toolCalls,\n runtime: {\n engine: ENGINE_ID,\n model: options.model,\n transport: options.chat.transport,\n report_format: options.reportFormat,\n investigation_turns: turnsUsed,\n investigation_stopped_on_answer: stoppedOnAnswer,\n tool_budget_exhausted: toolBudgetExhausted,\n truncated_tool_results: truncatedToolResults,\n rejected_findings: parsed.rejectedFindings,\n // A gateway can answer `model: X` from another model on HTTP 200, so the\n // ids the provider echoed travel with the result as evidence.\n served_models: [...servedModels].sort(),\n task_inputs: request.taskInputs ? 'prompt-delivered' : 'none',\n },\n }\n request.log?.('trace analyst engine completed', {\n engine: ENGINE_ID,\n model_calls: result.modelCalls,\n tool_calls: result.toolCalls,\n findings: result.findings.length,\n })\n return result\n}\n\ninterface ModelTurn {\n content: string\n toolCalls?: LlmToolCall[]\n servedModel?: string | null\n finishReason?: string | null\n}\n\nasync function callModel(\n request: TraceAnalysisEngineRequest,\n options: ResolvedOptions,\n turn: {\n messages: LlmMessage[]\n tools?: LlmToolDefinition[]\n toolChoice?: LlmCallRequest['toolChoice']\n purpose: 'investigation' | 'report'\n json?: 'json-object' | 'json-schema'\n },\n): Promise<ModelTurn> {\n const chatRequest: LlmCallRequest = {\n model: options.model,\n // The transport may mutate what it is handed; the conversation is ours.\n messages: turn.messages.map((message) => ({ ...message })),\n maxTokens: options.maxOutputTokens,\n ...(turn.tools && turn.tools.length > 0\n ? { tools: turn.tools, ...(turn.toolChoice ? { toolChoice: turn.toolChoice } : {}) }\n : {}),\n ...(turn.json ? { jsonMode: true } : {}),\n ...(turn.json === 'json-schema' ? { jsonSchema: REPORT_JSON_SCHEMA } : {}),\n ...(options.temperature === undefined ? {} : { temperature: options.temperature }),\n ...(options.thinking === undefined ? {} : { thinking: options.thinking }),\n ...(options.requestTimeoutMs === undefined ? {} : { timeoutMs: options.requestTimeoutMs }),\n }\n const paid = await paidChat({\n chat: options.chat,\n request: chatRequest,\n ledger: request.costLedger,\n channel: 'analyst',\n phase: request.costPhase,\n actor: request.analystId,\n ...(request.costTags ? { tags: request.costTags } : {}),\n ...(options.pricing ? { pricing: options.pricing } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n })\n if (!paid.succeeded) {\n // The transport already spent its own attempts. A failure here ends the\n // investigation: continuing would report an answer the model never gave.\n throw new Error(\n `chat trace engine ${turn.purpose} call failed for '${request.analystId}': ${paid.error.message}`,\n { cause: paid.error },\n )\n }\n return {\n content: paid.response.content,\n ...(paid.response.toolCalls ? { toolCalls: paid.response.toolCalls } : {}),\n ...(paid.response.servedModel === undefined ? {} : { servedModel: paid.response.servedModel }),\n ...(paid.response.finishReason === undefined\n ? {}\n : { finishReason: paid.response.finishReason }),\n }\n}\n\ninterface ExecutedTool {\n ok: boolean\n truncated: boolean\n payload: string\n}\n\nasync function executeTool(\n call: LlmToolCall,\n toolsByName: ReadonlyMap<string, TraceAnalysisToolDescriptor>,\n request: TraceAnalysisEngineRequest,\n): Promise<ExecutedTool> {\n const descriptor = toolsByName.get(call.name)\n if (!descriptor) {\n return {\n ok: false,\n truncated: false,\n payload: toolError(\n `unknown tool '${call.name}'; available tools are ${[...toolsByName.keys()].sort().join(', ')}`,\n ),\n }\n }\n let args: unknown\n try {\n args = call.argumentsJson.trim() === '' ? {} : JSON.parse(call.argumentsJson)\n } catch (error) {\n return {\n ok: false,\n truncated: false,\n payload: toolError(\n `arguments for '${call.name}' were not JSON: ${messageOf(error)}. Send valid JSON arguments.`,\n ),\n }\n }\n try {\n const value = await descriptor.handler(\n args,\n request.signal ? { signal: request.signal } : undefined,\n )\n return truncateToolPayload(JSON.stringify(value ?? null), request.limits.maxOutputChars)\n } catch (error) {\n // A bounded store refuses an oversized or malformed read by design. That\n // refusal is the model's next instruction, not the run's failure.\n if (request.signal?.aborted) throw error\n request.log?.('trace tool failed', {\n engine: ENGINE_ID,\n analyst_id: request.analystId,\n tool: call.name,\n reason: messageOf(error),\n })\n return { ok: false, truncated: false, payload: toolError(messageOf(error)) }\n }\n}\n\nfunction truncateToolPayload(payload: string, maxOutputChars: number): ExecutedTool {\n if (payload.length <= maxOutputChars) return { ok: true, truncated: false, payload }\n const keep = Math.max(0, maxOutputChars - TRUNCATION_MARKER.length)\n return { ok: true, truncated: true, payload: `${payload.slice(0, keep)}${TRUNCATION_MARKER}` }\n}\n\nfunction toolMessage(call: LlmToolCall, content: string): LlmMessage {\n return { role: 'tool', toolCallId: call.id, content }\n}\n\nfunction toolError(reason: string): string {\n return JSON.stringify({ error: reason })\n}\n\nfunction exhaustedToolBudget(maxToolCalls: number): string {\n return toolError(\n `the trace-tool budget of ${maxToolCalls} calls is spent; answer from the evidence already read`,\n )\n}\n\nfunction systemPrompt(request: TraceAnalysisEngineRequest, investigationTurns: number): string {\n return [\n request.instructions.trim(),\n [\n 'HOW THIS INVESTIGATION RUNS:',\n `- You have ${investigationTurns} investigation turns and at most ${request.limits.maxToolCalls} trace-tool calls.`,\n '- Call the trace tools to read the store. Never state a trace fact you did not read.',\n `- A tool result longer than ${request.limits.maxOutputChars} characters is truncated; narrow the query instead of asking again.`,\n '- A tool result carrying an \"error\" field is feedback: fix the call or take another route.',\n '- Answer with no tool call once you have the evidence. You are then asked for the final report.',\n ].join('\\n'),\n ].join('\\n\\n')\n}\n\nfunction reportPrompt(reportFormat: 'json-object' | 'json-schema'): string {\n return [\n 'Report now. Do not call any more tools.',\n 'Return one JSON object with exactly two fields:',\n ' \"answer\": a direct prose answer to the question.',\n ' \"findings\": an array of findings in the schema above. Emit [] when there is nothing to report.',\n reportFormat === 'json-object'\n ? 'Return the object alone, with no surrounding prose and no code fence.'\n : 'Return the object in the response schema you were given.',\n ].join('\\n')\n}\n\nfunction renderTaskInputs(taskInputs: Readonly<Record<string, unknown>>): string {\n // The engine contract forbids dropping structured inputs. This engine has no\n // code environment to bind them as variables, so they are delivered whole as\n // conversation material and the runtime record says which way they arrived.\n return [\n 'TASK INPUTS — structured material delivered with the question, not fetched through tools:',\n JSON.stringify(taskInputs, null, 2),\n ].join('\\n')\n}\n\ninterface ParsedReport {\n answer: string\n findings: TraceAnalysisEngineResult['findings']\n rejectedFindings: number\n}\n\nfunction parseReport(\n content: string,\n analystId: string,\n onRejectedFinding: (index: number, reason: string) => void,\n): ParsedReport {\n const envelope = coerceReportEnvelope(content, analystId)\n if (typeof envelope.answer !== 'string' || !envelope.answer.trim()) {\n throw new Error(`chat trace engine report for '${analystId}' carried no answer`)\n }\n // Findings are model output: one malformed row is model noise, not an engine\n // fault, and the rest of the paid investigation must survive it.\n const decoded = decodeRawFindingArray(envelope.findings)\n if (decoded.topLevelError !== undefined) {\n throw new Error(\n `chat trace engine report for '${analystId}' had a malformed findings array: ${decoded.topLevelError}`,\n )\n }\n for (const rejection of decoded.rejected) {\n onRejectedFinding(\n rejection.index,\n `${rejection.code}${rejection.path ? ` at ${rejection.path}` : ''}: ${rejection.message}`,\n )\n }\n return {\n answer: envelope.answer,\n findings: decoded.accepted,\n rejectedFindings: decoded.rejected.length,\n }\n}\n\nfunction coerceReportEnvelope(content: string, analystId: string): Record<string, unknown> {\n let value: unknown\n try {\n value = JSON.parse(extractJsonPayload(content))\n } catch (error) {\n throw new Error(`chat trace engine report for '${analystId}' was not JSON: ${messageOf(error)}`)\n }\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`chat trace engine report for '${analystId}' was not a JSON object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction resolveModel(options: ChatTraceEngineOptions): string {\n const model = options.model ?? options.chat.defaultModel\n if (typeof model !== 'string' || !model.trim() || model !== model.trim()) {\n throw new TypeError(\n 'chat trace engine needs a model: pass ChatTraceEngineOptions.model or bind defaultModel on the ChatClient',\n )\n }\n return model\n}\n","/**\n * LockedJsonlAppender — mutex-serialized JSONL append helper for arbitrary\n * payloads. The reference-replay store does the same thing for typed\n * `ReferenceReplayRun` rows; this is the generic version used by\n * `MutationTelemetry`, `TrialTelemetry`, and any other consumer that wants\n * append-only durable telemetry without rolling its own lock.\n *\n * Locks are per absolute file path (process-local). Cross-process\n * concurrency is NOT addressed — that's an fcntl/flock problem.\n */\n\nimport { appendFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { Mutex } from './concurrency'\n\nconst mutexes = new Map<string, Mutex>()\n\nfunction getMutex(path: string): Mutex {\n let m = mutexes.get(path)\n if (!m) {\n m = new Mutex()\n mutexes.set(path, m)\n }\n return m\n}\n\nexport class LockedJsonlAppender {\n private readonly mutex: Mutex\n constructor(public readonly path: string) {\n this.mutex = getMutex(path)\n if (!existsSync(dirname(path))) {\n mkdirSync(dirname(path), { recursive: true })\n }\n }\n\n async append(entry: unknown): Promise<void> {\n const line = `${JSON.stringify(entry)}\\n`\n await this.mutex.runExclusive(() => {\n appendFileSync(this.path, line)\n })\n }\n}\n\n/** Reset all internal mutex state — tests only. */\nexport function resetLockedAppendersForTesting(): void {\n mutexes.clear()\n}\n","/**\n * FindingsStore — durable persistence for AnalystFinding rows + a diff\n * helper so we can answer \"what changed since the last run?\" without\n * recomputing analysts.\n *\n * On-disk shape is JSONL: one finding per line, append-only, locked via\n * LockedJsonlAppender. Operators get crash-safety (no partial JSON),\n * cheap reads (sequential parse), and trivial backup (rsync the file).\n *\n * Reads are non-locking: a reader sees a consistent snapshot of all\n * fully-written lines and skips an incomplete trailing line if the\n * writer is mid-append. Cross-process locking is intentionally out of\n * scope (see locked-jsonl-appender.ts).\n *\n * The store is run-scoped: callers pass `runId` on append and on load,\n * which keeps multi-run files cleanly partitioned. The `diffFindings`\n * helper compares two run-id sets using stable `finding_id` semantics —\n * the diff is the cross-run signal the regression dashboard renders.\n */\n\nimport { existsSync, readFileSync } from 'node:fs'\n\nimport { LockedJsonlAppender } from '../locked-jsonl-appender'\nimport type { AnalystFinding } from './types'\n\n/**\n * One persisted row. We attach `run_id` on disk so a single file can\n * hold multiple runs and the diff helper can query without re-walking\n * separate files.\n */\nexport interface PersistedFinding extends AnalystFinding {\n run_id: string\n}\n\nexport class FindingsStore {\n private readonly appender: LockedJsonlAppender\n\n constructor(public readonly path: string) {\n this.appender = new LockedJsonlAppender(path)\n }\n\n async append(runId: string, findings: AnalystFinding[]): Promise<void> {\n for (const f of findings) {\n const row: PersistedFinding = { ...f, run_id: runId }\n await this.appender.append(row)\n }\n }\n\n /** Load every persisted finding. Discards malformed trailing lines silently. */\n loadAll(): PersistedFinding[] {\n if (!existsSync(this.path)) return []\n const raw = readFileSync(this.path, 'utf8')\n if (!raw) return []\n const out: PersistedFinding[] = []\n for (const line of raw.split('\\n')) {\n if (!line) continue\n try {\n out.push(JSON.parse(line) as PersistedFinding)\n } catch {\n // Skip torn trailing line — the lock guarantees no torn lines\n // mid-file, only at EOF when a writer is in-flight.\n }\n }\n return out\n }\n\n /** Filter to a single run. */\n loadRun(runId: string): PersistedFinding[] {\n return this.loadAll().filter((r) => r.run_id === runId)\n }\n}\n\n// ── Cross-run diff ──────────────────────────────────────────────────\n\nexport interface FindingsDiff {\n /** New finding ids in `current` that weren't in `previous`. */\n appeared: PersistedFinding[]\n /** Finding ids in `previous` that aren't in `current`. */\n disappeared: PersistedFinding[]\n /** Same finding id present in both runs and unchanged per the materiality test. */\n persisted: PersistedFinding[]\n /**\n * Same finding id in both runs but at least one non-identity field\n * shifted per `DiffPolicy.isMaterial`. Reported as [previous, current].\n */\n changed: Array<{ previous: PersistedFinding; current: PersistedFinding }>\n}\n\nexport interface DiffPolicy {\n /**\n * Predicate that decides whether two findings (same finding_id) count\n * as a material change. Defaults to {@link defaultIsMaterial}: severity\n * shift, confidence Δ > 0.05, or evidence count change. Compliance /\n * perf consumers MAY supply a stricter predicate (e.g. rationale text\n * diff, metric Δ thresholds).\n */\n isMaterial?: (previous: AnalystFinding, current: AnalystFinding) => boolean\n}\n\n/**\n * Default materiality test. Deliberately narrow so LLM-reword churn\n * doesn't flood the diff. Stricter tests are opt-in via DiffPolicy.\n */\nfunction defaultIsMaterial(a: AnalystFinding, b: AnalystFinding): boolean {\n if (a.severity !== b.severity) return true\n if (Math.abs((a.confidence ?? 0) - (b.confidence ?? 0)) > 0.05) return true\n if (a.evidence_refs.length !== b.evidence_refs.length) return true\n return false\n}\n\n/**\n * Diff two findings sets by stable finding_id. Callers typically load\n * the two run-id slices from the same store and pass them in.\n */\nexport function diffFindings(\n previous: PersistedFinding[],\n current: PersistedFinding[],\n policy: DiffPolicy = {},\n): FindingsDiff {\n const isMaterial = policy.isMaterial ?? defaultIsMaterial\n const prevById = new Map(previous.map((f) => [f.finding_id, f]))\n const curById = new Map(current.map((f) => [f.finding_id, f]))\n\n const appeared: PersistedFinding[] = []\n const disappeared: PersistedFinding[] = []\n const persisted: PersistedFinding[] = []\n const changed: FindingsDiff['changed'] = []\n\n for (const [id, cur] of curById) {\n const prev = prevById.get(id)\n if (!prev) {\n appeared.push(cur)\n continue\n }\n if (isMaterial(prev, cur)) {\n changed.push({ previous: prev, current: cur })\n } else {\n persisted.push(cur)\n }\n }\n for (const [id, prev] of prevById) {\n if (!curById.has(id)) disappeared.push(prev)\n }\n return { appeared, disappeared, persisted, changed }\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ import { a as MultiLayerVerifier, c as VerifyOptions, i as LayerStatus, l as gra
|
|
|
24
24
|
import { C as HeldOutGateRejectionCode, S as HeldOutGateDecision, _ as gainHistogram, a as ResearchReportOptions, b as HeldOutGate, d as GainDistributionOptions, g as SummaryTableRow, h as SummaryTableOptions, l as GainDistributionBin, m as SummaryTable, p as ParetoPoint, t as ResearchReport, u as GainDistributionFigureSpec, v as summaryTable, w as SplitCoverage, x as HeldOutGateConfig, y as GateEvidence } from "./summary-report-0La5vejY.js";
|
|
25
25
|
import { a as FailureClassification, c as FailureRule, d as failureBlame, i as FailureBlame, l as classifyFailure, o as FailureContext, r as failureClusterView, s as FailureReasonRule, u as classifyFailureReason } from "./failure-cluster-DOoa7CBg.js";
|
|
26
26
|
import { d as InsightReport, n as analyzeRuns, t as AnalyzeRunsOptions } from "./analyze-runs-BYyMShsj.js";
|
|
27
|
+
import { a as SpanHandle, n as CaptureWrite, o as TraceEmitter, s as TraceEmitterOptions, t as CaptureErrorHandler } from "./emitter-mAXC5PSN.js";
|
|
28
|
+
import { s as SandboxDriver } from "./sandbox-harness-CdO35T2g.js";
|
|
27
29
|
import { a as ProducedProposal, c as SatisfiedBy, d as createLlmCorrectnessChecker, f as verifyCompletion, i as LlmCorrectnessCheckerOpts, l as TaskGold, n as CompletionVerdict, o as ProducedState, r as CorrectnessChecker, s as RequirementCheck, t as CompletionRequirement, u as completionVerdict } from "./completion-verifier-7KEfroqx.js";
|
|
28
30
|
import { _ as SelfImproveMethodResult, a as DefinedAgentEval, c as SelfImproveMethodOptions, d as SelfImproveProposerOptions, f as SelfImproveProposerResult, g as SelfImproveMethodProvenance, h as selfImprove, i as DefineAgentEvalOptions, l as SelfImproveOptions, n as AgentEvalEvaluateOptions, o as defineAgentEval, p as SelfImproveResult, r as AgentEvalImproveOptions, s as SelfImproveBudget, t as AgentEvalAgent, u as SelfImproveProgressEvent } from "./define-agent-eval-B9zPWFSK.js";
|
|
29
31
|
import { a as createTraceAnalyst, i as TraceAnalystDefinition, n as buildDefaultAnalystRegistry, r as CreateTraceAnalystOptions, t as DefaultAnalystRegistryOptions } from "./default-registry-DKlKVXMx.js";
|
|
@@ -33,12 +35,10 @@ import { r as TraceAnalysisEngineResult, s as RawAnalystFinding, t as TraceAnaly
|
|
|
33
35
|
import { a as BudgetPolicy, c as RegistryRunOpts, i as AnalystRegistryOptions, s as ExactRegistryRunOpts, t as AnalystRegistry } from "./registry-CMtGAxOw.js";
|
|
34
36
|
import { C as SEMANTIC_CONCEPT_JUDGE_VERSION, D as runSemanticConceptJudge, E as SemanticConceptJudgeResult, S as ConceptSpec, T as SemanticConceptJudgeOptions, _ as DspyRlmTraceEngineOptions, a as FAILURE_MODE_KIND_SPEC, b as createChatTraceEngine, d as FindingSubject, f as FindingSubjectKind, t as DEFAULT_TRACE_ANALYST_KINDS, v as createDspyRlmTraceEngine, w as SemanticConceptJudgeInput, x as ConceptFinding, y as ChatTraceEngineOptions } from "./index-Bn-P_XAl.js";
|
|
35
37
|
import { i as BenchmarkEvaluation } from "./types-yofaDmQa.js";
|
|
36
|
-
import { a as SpanHandle, n as CaptureWrite, o as TraceEmitter, s as TraceEmitterOptions, t as CaptureErrorHandler } from "./emitter-mAXC5PSN.js";
|
|
37
|
-
import { n as SandboxDriver } from "./sandbox-harness-B3Kx1fOA.js";
|
|
38
38
|
import { _ as redactText, d as ShareSafetyVerdict, f as assessShareSafety, g as redactForShare, h as redact, i as RedactOptions, o as RedactionProfile, r as REDACTION_VERSION, s as RedactionReport, u as ShareSafetyStatus, v as shareAllowed } from "./redact-jrT0APTU.js";
|
|
39
39
|
import { a as PairedEvalueStep, c as SequentialDecision, i as PairedEvalueSequence, l as evaluateInterimReleaseConfidence, n as InterimReleaseConfidenceInput, r as PairedEvalueOptions, t as InterimReleaseConfidence, u as pairedEvalueSequence } from "./sequential-Bb_pdTqG.js";
|
|
40
40
|
import { S as welchsTTest, _ as computeToolUseMetrics, b as WelchTestStatus, d as Trajectory, f as TrajectoryStep, g as ToolUseOptions, h as ToolUseMetrics, i as toolWasteView, m as ToolStats, p as buildTrajectory, s as judgeAgreementView, u as budgetBreachView, x as iqr, y as WelchTestResult } from "./tool-waste-BFG1vwTV.js";
|
|
41
|
-
import { A as AnalystFindingDigest, B as ControlRuntimeConfig, C as createFeedbackTrajectory, D as renderPreferenceMemoryMarkdown, E as feedbackTrajectoryToOptimizerRow, F as ControlBudget, H as ControlSeverity, I as ControlContext, L as ControlDecision, M as AnalystRunDigest, N as analystRunDigest, O as summarizePreferenceMemory, P as ControlActionOutcome, R as ControlEvalResult, S as controlRunToFeedbackTrajectory, T as feedbackTrajectoriesToOptimizerRows, U as ControlStep, V as ControlRuntimeError, W as StopDecision, _ as PreferenceMemoryEntry, a as FeedbackLabel, b as analystRunToReviewRequests, c as FeedbackOptimizerRow, d as FeedbackTask, f as FeedbackTrajectory, g as InMemoryFeedbackTrajectoryStore, h as FileSystemFeedbackTrajectoryStore, i as FeedbackAttempt, j as AnalystReviewDecision, k as withAssignedFeedbackSplit, l as FeedbackOutcome, m as FeedbackTrajectoryStore, n as AnalystReviewRequest, o as FeedbackLabelKind, p as FeedbackTrajectoryFilter, r as FeedbackArtifactType, s as FeedbackLabelSource, t as AnalystFeedbackTrajectoryOptions, u as FeedbackSplitPolicy, v as ProposedSideEffect, w as feedbackTrajectoriesToDatasetScenarios, x as assignFeedbackSplit, y as analystRunToFeedbackTrajectory, z as ControlRunResult } from "./feedback-trajectory-
|
|
41
|
+
import { A as AnalystFindingDigest, B as ControlRuntimeConfig, C as createFeedbackTrajectory, D as renderPreferenceMemoryMarkdown, E as feedbackTrajectoryToOptimizerRow, F as ControlBudget, H as ControlSeverity, I as ControlContext, L as ControlDecision, M as AnalystRunDigest, N as analystRunDigest, O as summarizePreferenceMemory, P as ControlActionOutcome, R as ControlEvalResult, S as controlRunToFeedbackTrajectory, T as feedbackTrajectoriesToOptimizerRows, U as ControlStep, V as ControlRuntimeError, W as StopDecision, _ as PreferenceMemoryEntry, a as FeedbackLabel, b as analystRunToReviewRequests, c as FeedbackOptimizerRow, d as FeedbackTask, f as FeedbackTrajectory, g as InMemoryFeedbackTrajectoryStore, h as FileSystemFeedbackTrajectoryStore, i as FeedbackAttempt, j as AnalystReviewDecision, k as withAssignedFeedbackSplit, l as FeedbackOutcome, m as FeedbackTrajectoryStore, n as AnalystReviewRequest, o as FeedbackLabelKind, p as FeedbackTrajectoryFilter, r as FeedbackArtifactType, s as FeedbackLabelSource, t as AnalystFeedbackTrajectoryOptions, u as FeedbackSplitPolicy, v as ProposedSideEffect, w as feedbackTrajectoriesToDatasetScenarios, x as assignFeedbackSplit, y as analystRunToFeedbackTrajectory, z as ControlRunResult } from "./feedback-trajectory-BgomnFOe.js";
|
|
42
42
|
import { A as TraceInsightReadiness, F as describeTraceInsightScope, G as AnalyzeTracesResult, H as tokenizeDomainWords, I as domainEvidencePattern, K as analyzeTraces, L as inferDomainKeywords, N as buildTraceInsightContext, P as buildTraceInsightPrompt, V as scoreTraceInsightReadiness, a as captureFetchToRawSink, b as OtlpSpan, c as ExtractedUsage, d as extractUsageFromSse, f as OtlpFileTraceStore, g as spanRecordsToTraceAnalysisStore, h as otlpTextToTraceAnalysisStore, j as TraceInsightSuite, m as SpanRecordsToTraceAnalysisStoreOptions, n as toolSpansToTraceAnalysisStore, o as OtlpFlatLine, u as extractUsage, v as OtlpExport, x as exportRunAsOtlp } from "./store-tool-spans-lWf6INTH.js";
|
|
43
43
|
import { a as RunIntegrityReport, o as assertRunCaptured, t as RunIntegrityError } from "./integrity-BAdVzT8u.js";
|
|
44
44
|
import { a as SteeringChange, c as CampaignRunContext, d as CampaignVariant, f as EvalCampaignOptions, h as runEvalCampaign, i as Researcher, l as CampaignRunOutcome, m as FailedRun, n as ExperimentResult, o as CampaignFactoryParams, p as EvalCampaignResult, r as FailureMode, s as CampaignIntegrityPolicy, t as ExperimentPlan, u as CampaignScenario } from "./researcher-CLnNJ7Or.js";
|
package/dist/index.js
CHANGED
|
@@ -23,7 +23,7 @@ import { t as eProcess } from "./sequential-eprocess-C1YLwFaz.js";
|
|
|
23
23
|
import { i as pairedDeltaTest, n as pairedDecisionShape, r as minimumPairsForPairedDeltaTest, t as decidePairedPromotion } from "./paired-promotion-decision-5Pl_qJLX.js";
|
|
24
24
|
import { c as runsForScenario, i as judgeSpans, t as argHash } from "./query-CGXzO9d4.js";
|
|
25
25
|
import { n as contentHash, r as fileVerdictCache, t as canonicalJson } from "./verdict-cache-BVH-fl18.js";
|
|
26
|
-
import { B as DEFAULT_RED_TEAM_CORPUS, H as redTeamReport, U as scoreRedTeamOutput, V as redTeamDataset, W as runCanaries, Z as runCampaign, a as clamp01, i as aggregateRunScore, r as transientDispatchFailure, t as llmJudge } from "./llm-judge-
|
|
26
|
+
import { B as DEFAULT_RED_TEAM_CORPUS, H as redTeamReport, U as scoreRedTeamOutput, V as redTeamDataset, W as runCanaries, Z as runCampaign, a as clamp01, i as aggregateRunScore, r as transientDispatchFailure, t as llmJudge } from "./llm-judge-BiUljZDR.js";
|
|
27
27
|
import { a as resolveModelPricing, i as isModelPriced, n as estimateCost, r as estimateTokens, t as MODEL_PRICING } from "./metrics-DNCAUtuB.js";
|
|
28
28
|
import { c as costForTokenPricing, i as CostCeilingReachedError, l as costForUsage, n as CostAccountingIncompleteError, t as CostLedger } from "./cost-ledger-CS8R3IZj.js";
|
|
29
29
|
import { C as assertRealBackend, S as BackendIntegrityError, _ as parseReflectionResponse, a as ATTESTATION_ALGORITHM, g as buildReflectionPrompt, o as attest, s as verifyAttestation, w as summarizeBackendIntegrity } from "./campaign-evidence-BICB3a9Z.js";
|
|
@@ -32,7 +32,7 @@ import { c as redactText, l as shareAllowed, n as REDACTION_VERSION, o as redact
|
|
|
32
32
|
import { a as makeProposalFinding, i as makeFinding, r as computeFindingId } from "./types-BK0blWhe.js";
|
|
33
33
|
import { S as requiredPairsForPairedPromotion, n as paretoFrontier, t as dominates, x as pairedPromotionPower } from "./pareto-DY_x3HHg.js";
|
|
34
34
|
import { a as LlmCallError, i as stripFencedJson, n as isRecord, o as LlmResponseError } from "./json-DtvZNAU9.js";
|
|
35
|
-
import { r as selfImprove, t as defineAgentEval } from "./define-agent-eval-
|
|
35
|
+
import { r as selfImprove, t as defineAgentEval } from "./define-agent-eval-BT1SOjkZ.js";
|
|
36
36
|
import { n as equivalenceVerdict, t as certificationEvidenceDigest } from "./verdict-C8TcdwfD.js";
|
|
37
37
|
import { c as createBoundedTraceAnalysisStore, p as DEFAULT_TRACE_ANALYST_BUDGETS, t as createTraceAnalyst } from "./kind-factory-VKysp1ds.js";
|
|
38
38
|
import { C as assertUniqueFindingIds, D as validateAnalystReviewDecisions, E as snapshotAnalystRun, S as analystRunDigest, T as readAnalystReview, c as FAILURE_MODE_KIND_SPEC, i as DEFAULT_TRACE_ANALYST_KINDS, n as AnalystRegistry, t as buildDefaultAnalystRegistry, w as completedAnalystReviewQuality, x as analystFindingDigest } from "./default-registry-gmDeN0KT.js";
|
|
@@ -54,8 +54,8 @@ import "./rollout-BC4u-d_I.js";
|
|
|
54
54
|
import { t as mintRolloutRows } from "./mint-D9ZysYtY.js";
|
|
55
55
|
import { n as pairedEvalueSequence, t as evaluateInterimReleaseConfidence } from "./sequential-Bjs5roiK.js";
|
|
56
56
|
import { n as paidJsonChat } from "./chat-json-call-C473CwTt.js";
|
|
57
|
-
import { t as createDspyRlmTraceEngine } from "./dspy-rlm-engine-
|
|
58
|
-
import { n as diffFindings, r as createChatTraceEngine, t as FindingsStore } from "./findings-store-
|
|
57
|
+
import { t as createDspyRlmTraceEngine } from "./dspy-rlm-engine-Xt3znknf.js";
|
|
58
|
+
import { n as diffFindings, r as createChatTraceEngine, t as FindingsStore } from "./findings-store-Bp-0Guuv.js";
|
|
59
59
|
import { a as budgetBreachView, i as failureClusterView, n as computeToolUseMetrics, r as judgeAgreementView, t as toolWasteView } from "./tool-waste-CRJqOASv.js";
|
|
60
60
|
import { _ as analyzeSeries, a as judgeGateDecision, c as snapshotFromJudgeAgreement, g as withJudgeRetry, i as assertJudgeMayGate, n as JudgeGateRefusedError, o as measureJudgeAgreement, r as addCalibrationVerdicts, s as registerCalibrationSet, t as DEFAULT_JUDGE_GATE_POLICY } from "./judge-gate-C9sLLJ-v.js";
|
|
61
61
|
import { a as spanRecordsToTraceAnalysisStore, i as otlpTextToTraceAnalysisStore, r as OtlpFileTraceStore } from "./store-otlp-DmLm65XW.js";
|
|
@@ -12,12 +12,12 @@ import { r as projectCampaignCellQuality, t as campaignCellCostProvenance } from
|
|
|
12
12
|
import { n as CostAccountingIncompleteError, t as CostLedger } from "./cost-ledger-CS8R3IZj.js";
|
|
13
13
|
import { A as campaignSplitDigest, D as assertCompleteCampaign, E as assertCampaignSplitIdentity, M as formatCoverageFailures, O as campaignCoverage, S as BackendIntegrityError, T as assertCampaignDesign, b as FinalEvidenceError, f as campaignBreakdown, k as campaignScenarioIdentity, m as campaignMeanCompositeOrNull, p as campaignMeanComposite, y as FinalEvidenceConflictError } from "./campaign-evidence-BICB3a9Z.js";
|
|
14
14
|
import { t as deepFreezeCanonicalJson } from "./deep-freeze-CK8-2W7p.js";
|
|
15
|
-
import { M as fsCampaignStorage, h as isExternalTextCandidate, j as createRunCostLedger } from "./external-optimizer-subprocess-
|
|
15
|
+
import { M as fsCampaignStorage, h as isExternalTextCandidate, j as createRunCostLedger } from "./external-optimizer-subprocess-CeHuAaMJ.js";
|
|
16
16
|
import { c as surfaceDispatchRef, l as surfaceHash, o as renderSurfaceDiff, s as surfaceContentHash, u as surfaceHashMatches } from "./json-recovery-DK4MDm5r.js";
|
|
17
17
|
import { r as summarizeEvaluationUnits, t as defineEvaluationClaim } from "./claim-Dod_mjk3.js";
|
|
18
18
|
import { c as redactText, m as detectPersonalData, n as REDACTION_VERSION, p as detectCredential } from "./redact-zp_ILC4l.js";
|
|
19
19
|
import { t as detectRewardHacking } from "./reward-hacking-D-Vi9-fE.js";
|
|
20
|
-
import { t as assertProposalFindings } from "./proposal-findings-
|
|
20
|
+
import { t as assertProposalFindings } from "./proposal-findings-BclX0PFh.js";
|
|
21
21
|
import { i as runSearch, m as searchExpansionIndex, n as paretoFrontier, o as searchPolicyView, p as SEARCH_KERNEL_SOURCE, r as paretoFrontierWithCrowding, s as EXPANSION_OPERATORS, w as estimateNode } from "./pareto-DY_x3HHg.js";
|
|
22
22
|
import { a as validateSearchLedgerEvent, d as searchNodeId, f as searchTaskSetDigest, i as replaySearchLedgerText, n as openSearchLedger, u as searchCellId } from "./search-ledger-BsVi-Ngv.js";
|
|
23
23
|
import { n as searchProposerView, t as renderSearchSummary } from "./search-summary-DedyTdiM.js";
|
|
@@ -5877,4 +5877,4 @@ function firstString(value) {
|
|
|
5877
5877
|
}
|
|
5878
5878
|
export { resolveRunDir as $, campaignCellSearchResult as A, DEFAULT_RED_TEAM_CORPUS as B, surfaceDiff as C, createSearchHistoryReceipt as D, assertSearchHistoryMatchesState as E, uniform as F, assertIndependentEvaluationSplit as G, redTeamReport as H, runFinalComparison as I, exposeFinalEvidence as J, captureFinalEvidencePolicy as K, openAutoPr as L, searchProposalExecution as M, searchReceiptAccounting as N, verifySearchHistoryArtifact as O, asha as P, planCampaignRun as Q, captureJudge as R, searchEdgeId as S, assertSearchHistoryAdmissionOptions as T, scoreRedTeamOutput as U, redTeamDataset as V, runCanaries as W, runEval as X, reserveFinalEvidence as Y, runCampaign as Z, crowdedFrontierParent as _, clamp01 as a, SearchRecorder as b, readGepaCandidatePopulationArtifact as c, optimizationTokenUsageFromSummary as d, buildCellSchedule as et, runImprovementLoop as f, beam as g, aide as h, aggregateRunScore as i, searchModelIdentity as j, verifySearchHistoryReceipt as k, combineComparisonCosts as l, isProposedCandidate as m, isTransientTransportFailure as n, computeManifestHash as nt, executeOptimizationMethod as o, runOptimization as p, evaluationUnitMap as q, transientDispatchFailure as r, assertGepaCandidatePopulationSummary as s, llmJudge as t, cellCachePath as tt, costFromLedgerSummary as u, incumbent as v, surfaceNode as w, developmentClaim as x, incumbentWithOperatorBandit as y, defaultProductionGate as z };
|
|
5879
5879
|
|
|
5880
|
-
//# sourceMappingURL=llm-judge-
|
|
5880
|
+
//# sourceMappingURL=llm-judge-BiUljZDR.js.map
|