niceeval 0.13.0 → 0.13.2-canary.35
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/INDEX.md +1 -0
- package/README.md +9 -10
- package/README.zh.md +9 -10
- package/dist/agents/ai-sdk.cjs.map +1 -1
- package/dist/agents/ai-sdk.d.cts +1 -1
- package/dist/agents/ai-sdk.d.mts +1 -1
- package/dist/agents/ai-sdk.d.ts +1 -1
- package/dist/agents/coding-cli-versions.cjs +10 -1
- package/dist/agents/coding-cli-versions.cjs.map +1 -1
- package/dist/agents/coding-cli-versions.d.cts +8 -3
- package/dist/agents/coding-cli-versions.d.mts +8 -3
- package/dist/agents/coding-cli-versions.d.ts +8 -3
- package/dist/agents/coding-cli-versions.js +18 -12
- package/dist/agents/deepseek-harness.cjs +103 -0
- package/dist/agents/deepseek-harness.cjs.map +1 -0
- package/dist/agents/deepseek-harness.d.cts +12 -0
- package/dist/agents/deepseek-harness.d.mts +12 -0
- package/dist/agents/deepseek-harness.d.ts +12 -0
- package/dist/agents/deepseek-harness.js +7 -0
- package/dist/agents/deepseek-harness.js.map +1 -0
- package/dist/agents/index.cjs +5 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +4 -0
- package/dist/agents/index.d.mts +4 -0
- package/dist/agents/index.d.ts +4 -0
- package/dist/agents/index.js +54 -50
- package/dist/agents/index.mjs +54 -50
- package/dist/agents/omp.cjs +170 -0
- package/dist/agents/omp.cjs.map +1 -0
- package/dist/agents/omp.d.cts +14 -0
- package/dist/agents/omp.d.mts +14 -0
- package/dist/agents/omp.d.ts +14 -0
- package/dist/agents/omp.js +7 -0
- package/dist/agents/omp.js.map +1 -0
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +2 -2
- package/dist/agents/types.d.mts +2 -2
- package/dist/agents/types.d.ts +2 -2
- package/dist/analysis/api.cjs +9 -1
- package/dist/analysis/api.cjs.map +1 -1
- package/dist/analysis/api.d.cts +21 -0
- package/dist/analysis/api.d.mts +21 -0
- package/dist/analysis/api.d.ts +21 -0
- package/dist/analysis/api.js +8 -6
- package/dist/cli.cjs +10 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/i18n/en.cjs +7 -2
- package/dist/i18n/en.cjs.map +1 -1
- package/dist/i18n/en.d.cts +7 -2
- package/dist/i18n/en.d.mts +7 -2
- package/dist/i18n/en.d.ts +7 -2
- package/dist/o11y/parsers/hermes.cjs +1 -1
- package/dist/o11y/parsers/hermes.cjs.map +1 -1
- package/dist/report/built-in/analysis-values.cjs +21 -5
- package/dist/report/built-in/analysis-values.cjs.map +1 -1
- package/dist/report/built-in/analysis-values.d.cts +11 -9
- package/dist/report/built-in/analysis-values.d.mts +11 -9
- package/dist/report/built-in/analysis-values.d.ts +11 -9
- package/dist/report/built-in/overview.cjs +1 -0
- package/dist/report/built-in/overview.cjs.map +1 -1
- package/dist/report/built-in/result-components.cjs +58 -12
- package/dist/report/built-in/result-components.cjs.map +1 -1
- package/dist/report/built-in/result-components.d.cts +15 -0
- package/dist/report/built-in/result-components.d.mts +15 -0
- package/dist/report/built-in/result-components.d.ts +15 -0
- package/dist/report/built-in/run-membership-overview.cjs +100 -4
- package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
- package/dist/report/built-in/standard.cjs +1 -0
- package/dist/report/built-in/standard.cjs.map +1 -1
- package/dist/report/built-in/standard.d.cts +1 -0
- package/dist/report/built-in/standard.d.mts +1 -0
- package/dist/report/built-in/standard.d.ts +1 -0
- package/dist/report/components/entity-lists/compute.cjs +40 -3
- package/dist/report/components/entity-lists/compute.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.d.cts +8 -6
- package/dist/report/components/entity-lists/compute.d.mts +8 -6
- package/dist/report/components/entity-lists/compute.d.ts +8 -6
- package/dist/report/components/entity-lists/content.cjs +31 -6
- package/dist/report/components/entity-lists/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.cjs +3 -2
- package/dist/report/components/entity-lists/index.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.d.cts +1 -1
- package/dist/report/components/entity-lists/index.d.mts +1 -1
- package/dist/report/components/entity-lists/index.d.ts +1 -1
- package/dist/report/definition/cell.cjs +3 -0
- package/dist/report/definition/cell.cjs.map +1 -1
- package/dist/report/definition/cell.d.cts +2 -0
- package/dist/report/definition/cell.d.mts +2 -0
- package/dist/report/definition/cell.d.ts +2 -0
- package/dist/report/definition/primitives.cjs +9 -2
- package/dist/report/definition/primitives.cjs.map +1 -1
- package/dist/report/execution/machine.cjs +1 -1
- package/dist/report/execution/machine.cjs.map +1 -1
- package/dist/report/host/execute.cjs +14 -4
- package/dist/report/host/execute.cjs.map +1 -1
- package/dist/report/host/execute.d.cts +5 -0
- package/dist/report/host/execute.d.mts +5 -0
- package/dist/report/host/execute.d.ts +5 -0
- package/dist/report/host/from-record.cjs +6 -1
- package/dist/report/host/from-record.cjs.map +1 -1
- package/dist/report/host/from-record.d.cts +5 -0
- package/dist/report/host/from-record.d.mts +5 -0
- package/dist/report/host/from-record.d.ts +5 -0
- package/dist/report/runtime/resolved-page.cjs +16 -6
- package/dist/report/runtime/resolved-page.cjs.map +1 -1
- package/dist/report/runtime/resolved-page.d.cts +3 -0
- package/dist/report/runtime/resolved-page.d.mts +3 -0
- package/dist/report/runtime/resolved-page.d.ts +3 -0
- package/dist/report/runtime/text.cjs +1 -0
- package/dist/report/runtime/text.cjs.map +1 -1
- package/dist/report/runtime/text.d.cts +4 -0
- package/dist/report/runtime/text.d.mts +4 -0
- package/dist/report/runtime/text.d.ts +4 -0
- package/dist/runner/feedback/human.cjs +180 -16
- package/dist/runner/feedback/human.cjs.map +1 -1
- package/dist/runner/run.cjs +43 -0
- package/dist/runner/run.cjs.map +1 -1
- package/dist/sample/capability.cjs +93 -0
- package/dist/sample/capability.cjs.map +1 -1
- package/dist/sample/capability.d.cts +3 -1
- package/dist/sample/capability.d.mts +3 -1
- package/dist/sample/capability.d.ts +3 -1
- package/dist/sample/capability.js +8 -6
- package/dist/sandbox/docker-agent-image.cjs +5 -1
- package/dist/sandbox/docker-agent-image.cjs.map +1 -1
- package/dist/sandbox/docker-agent-image.d.cts +2 -0
- package/dist/sandbox/docker-agent-image.d.mts +2 -0
- package/dist/sandbox/docker-agent-image.d.ts +2 -0
- package/dist/sandbox/docker-agent-image.js +14 -10
- package/dist/sandbox/index.cjs +4 -2
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +1 -1
- package/dist/sandbox/index.d.mts +1 -1
- package/dist/sandbox/index.d.ts +1 -1
- package/dist/sandbox/index.js +120 -116
- package/dist/sandbox/index.mjs +120 -116
- package/docs-site/images/hitl-handshake-zh.svg +3 -3
- package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +3 -3
- package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
- package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
- package/docs-site/zh/examples/integrations/langgraph.mdx +3 -3
- package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
- package/docs-site/zh/explanation/adapter.mdx +5 -5
- package/docs-site/zh/explanation/assert.mdx +1 -1
- package/docs-site/zh/explanation/drive.mdx +3 -1
- package/docs-site/zh/explanation/evals.mdx +3 -1
- package/docs-site/zh/explanation/hitl.mdx +7 -7
- package/docs-site/zh/explanation/runner.mdx +2 -2
- package/docs-site/zh/index.mdx +2 -2
- package/docs-site/zh/reference/builtin-agents.mdx +4 -4
- package/docs-site/zh/reference/capabilities.mdx +1 -1
- package/docs-site/zh/reference/cli.mdx +14 -14
- package/docs-site/zh/reference/events.mdx +11 -11
- package/docs-site/zh/reference/official-adapters.mdx +1 -1
- package/docs-site/zh/reference/results-data.mdx +6 -0
- package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
- package/docs-site/zh/tutorials/agent-feedback-loop.mdx +2 -2
- package/docs-site/zh/tutorials/ci-integration.mdx +1 -1
- package/docs-site/zh/tutorials/connect-your-agent.mdx +2 -2
- package/docs-site/zh/tutorials/custom-reports.mdx +4 -4
- package/docs-site/zh/tutorials/deploy-report-site.mdx +3 -3
- package/docs-site/zh/tutorials/docker-in-docker.mdx +3 -0
- package/docs-site/zh/tutorials/experiments.mdx +2 -2
- package/docs-site/zh/tutorials/handle-execution-failures.mdx +1 -1
- package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +1 -1
- package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
- package/docs-site/zh/tutorials/publish-report.mdx +4 -4
- package/docs-site/zh/tutorials/reporters.mdx +1 -1
- package/docs-site/zh/tutorials/rerun-and-cache.mdx +16 -0
- package/docs-site/zh/tutorials/viewing-results.mdx +28 -10
- package/docs-site/zh/tutorials/write-send.mdx +7 -6
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["hermes.ts"],"names":[],"mappings":"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","sourcesContent":["// Hermes sessions export / state.db 消息行解析器。方言只住这里,不进 core\n// (契约见 docs/feature/adapters/sdk/hermes/README.md)。\nimport type { StreamEvent, Usage, ToolName, JsonValue } from \"../../types.ts\";\nimport type { ParsedTranscript } from \"./index.ts\";\nimport { GENERIC_VERB_ALIASES, normalizeToolName as normalizeShared } from \"../tool-names.ts\";\nimport { normalizeJsonValue } from \"../../shared/json-value.ts\";\nimport { notCommandProjection, opaqueCommandProjection } from \"../command-projection.ts\";\nexport const HERMES_TOOL_ALIASES: globalThis.Record<string, ToolName> = {\n ...GENERIC_VERB_ALIASES,\n terminal: \"shell\",\n read_file: \"file_read\",\n write_file: \"file_write\",\n edit_file: \"file_edit\",\n web_extract: \"web_fetch\",\n};\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name, HERMES_TOOL_ALIASES);\n}\n/** Hermes 的 terminal tool 给的是工具 arguments,不是可验证的 native argv。 */\nfunction commandProjectionForHermesTool(name: string) {\n return name.toLowerCase() === \"terminal\"\n ? opaqueCommandProjection(\"unsupported-protocol\")\n : notCommandProjection();\n}\nfunction get(obj: unknown, key: string): unknown {\n return obj && typeof obj === \"object\" ? (obj as globalThis.Record<string, unknown>)[key] : undefined;\n}\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" && v ? v : undefined;\n}\n/**\n * Hermes 以 `skill_view({ name })` 表示实际加载了一个已安装 Skill。它不是普通\n * 文件读取:对应的标准事件是 `skill.loaded`,这样判分和 execution 读面都无需猜工具文本。\n */\nfunction skillNameFromToolCall(name: string, input: JsonValue): string | undefined {\n if (name.toLowerCase() !== \"skill_view\")\n return undefined;\n return str(get(input, \"name\"));\n}\nfunction num(obj: unknown, ...keys: string[]): number {\n for (const k of keys) {\n const v = get(obj, k);\n if (typeof v === \"number\" && Number.isFinite(v))\n return v;\n }\n return 0;\n}\nfunction optionalNum(obj: unknown, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const value = get(obj, key);\n if (typeof value === \"number\" && Number.isFinite(value))\n return value;\n }\n return undefined;\n}\nfunction coerceArgs(value: unknown): JsonValue {\n if (typeof value === \"string\") {\n try {\n const parsed: unknown = JSON.parse(value);\n return normalizeJsonValue(parsed, value);\n }\n catch {\n return value;\n }\n }\n return normalizeJsonValue(value, {});\n}\nfunction parseJsonField(value: unknown): unknown {\n if (typeof value !== \"string\")\n return value;\n try {\n return JSON.parse(value);\n }\n catch {\n return value;\n }\n}\n/**\n * Hermes sessions export JSONL(一行一 session,或一行一 message)→ 标准事件 + usage。\n */\nexport function parseHermesTranscript(raw: string | undefined): ParsedTranscript {\n const events: StreamEvent[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheReadTokens = 0;\n let cacheCreationTokens = 0;\n let observedCostUSD = 0;\n let hasObservedCostUSD = false;\n let requests = 0;\n let parseSuccess = true;\n let synth = 0;\n // `skill_view` 已转成 skill.loaded 后,其 tool result 不再重发成孤立 action 节点。\n const skillCallIds = new Set<string>();\n const nextSynthId = (): string => `hm_${++synth}`;\n if (!raw?.trim()) {\n return { events, usage: {}, compactions: 0, parseSuccess: true };\n }\n const ingestSessionMeta = (obj: globalThis.Record<string, unknown>): void => {\n inputTokens += num(obj, \"input_tokens\", \"inputTokens\");\n outputTokens += num(obj, \"output_tokens\", \"outputTokens\");\n cacheReadTokens += num(obj, \"cache_read_tokens\", \"cacheReadTokens\");\n cacheCreationTokens += num(obj, \"cache_write_tokens\", \"cacheWriteTokens\", \"cacheCreationTokens\");\n // estimated_cost_usd is an estimate owned by Hermes and is deliberately\n // not relabeled as provider-observed Usage.costUSD.\n const actual = optionalNum(obj, \"actual_cost_usd\", \"actualCostUsd\");\n if (actual !== undefined) {\n observedCostUSD += actual;\n hasObservedCostUSD = true;\n }\n const apiCalls = num(obj, \"api_call_count\", \"apiCallCount\");\n if (apiCalls)\n requests += apiCalls;\n };\n const ingestMessage = (msg: globalThis.Record<string, unknown>): void => {\n const role = str(msg.role) ?? \"assistant\";\n const content = str(msg.content);\n if (role === \"tool\" || str(msg.tool_call_id) || str(msg.toolCallId)) {\n const callId = str(msg.tool_call_id) ?? str(msg.toolCallId) ?? nextSynthId();\n if (skillCallIds.has(callId))\n return;\n const success = msg.is_error !== true && msg.isError !== true;\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: (content ?? get(msg, \"output\") ?? null) as JsonValue,\n status: success ? \"completed\" : \"failed\",\n });\n return;\n }\n const toolCallsRaw = parseJsonField(msg.tool_calls ?? msg.toolCalls);\n if (Array.isArray(toolCallsRaw)) {\n for (const call of toolCallsRaw) {\n const fn = get(call, \"function\") as globalThis.Record<string, unknown> | undefined;\n const name = str(get(fn, \"name\")) ?? str(get(call, \"name\")) ?? str(msg.tool_name) ?? \"unknown\";\n const callId = str(get(call, \"id\")) ?? nextSynthId();\n const args = coerceArgs(get(fn, \"arguments\") ?? get(call, \"arguments\") ?? get(call, \"input\"));\n const skill = skillNameFromToolCall(name, args);\n if (skill !== undefined) {\n events.push({ type: \"skill.loaded\", skill, operationId: callId });\n skillCallIds.add(callId);\n continue;\n }\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name,\n input: args,\n tool: normalizeToolName(name),\n command: commandProjectionForHermesTool(name),\n },\n });\n }\n }\n if (content?.trim() && role !== \"user\" && role !== \"system\") {\n events.push({ type: \"message\", role: \"assistant\", text: content });\n }\n else if (content?.trim() && role === \"user\" && !Array.isArray(toolCallsRaw)) {\n // 用户消息不进行为断言主路径;保留会污染 messageIncludes。跳过。\n }\n const reasoning = str(msg.reasoning) ?? str(msg.reasoning_content);\n if (reasoning?.trim())\n events.push({ type: \"thinking\", text: reasoning });\n };\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed)\n continue;\n let obj: globalThis.Record<string, unknown>;\n try {\n obj = JSON.parse(trimmed) as globalThis.Record<string, unknown>;\n }\n catch {\n parseSuccess = false;\n continue;\n }\n try {\n // 整 session 导出:带 messages[]\n if (Array.isArray(obj.messages)) {\n ingestSessionMeta(obj);\n for (const m of obj.messages) {\n if (m && typeof m === \"object\")\n ingestMessage(m as globalThis.Record<string, unknown>);\n }\n continue;\n }\n // 单行 message\n if (str(obj.role)) {\n ingestMessage(obj);\n continue;\n }\n // sqlite dump 行:{session_id, role, content, tool_calls, ...}\n if (str(obj.session_id) || str(obj.sessionId)) {\n ingestMessage(obj);\n continue;\n }\n ingestSessionMeta(obj);\n }\n catch {\n parseSuccess = false;\n }\n }\n const usage: Usage = {};\n if (inputTokens)\n usage.inputTokens = inputTokens;\n if (outputTokens)\n usage.outputTokens = outputTokens;\n if (cacheReadTokens)\n usage.cacheReadTokens = cacheReadTokens;\n if (cacheCreationTokens)\n usage.cacheCreationTokens = cacheCreationTokens;\n if (hasObservedCostUSD)\n usage.costUSD = observedCostUSD;\n if (requests)\n usage.requests = requests;\n return { events, usage, compactions: 0, parseSuccess };\n}\n/** 从 export / stdout 文本里抠 session id。 */\nexport function sessionIdFromHermesOutput(raw: string | undefined): string | undefined {\n if (!raw)\n return undefined;\n for (const line of raw.split(\"\\n\")) {\n const resume = line.match(/hermes\\s+(?:chat\\s+)?(?:--resume|-r)\\s+(\\S+)/i);\n if (resume?.[1])\n return resume[1].replace(/[\"'`]/g, \"\");\n const labeled = line.match(/Session:\\s*([A-Za-z0-9_-]+)/i);\n if (labeled?.[1])\n return labeled[1];\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"{\"))\n continue;\n try {\n const obj = JSON.parse(trimmed) as globalThis.Record<string, unknown>;\n const id = str(obj.id) ?? str(obj.session_id) ?? str(obj.sessionId);\n if (id && (Array.isArray(obj.messages) || str(obj.source)))\n return id;\n }\n catch {\n // skip\n }\n }\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["hermes.ts"],"names":[],"mappings":"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","sourcesContent":["// Hermes sessions export / state.db 消息行解析器。方言只住这里,不进 core\n// (契约见 docs/feature/adapters/sdk/hermes/README.md)。\nimport type { StreamEvent, Usage, ToolName, JsonValue } from \"../../types.ts\";\nimport type { ParsedTranscript } from \"./index.ts\";\nimport { GENERIC_VERB_ALIASES, normalizeToolName as normalizeShared } from \"../tool-names.ts\";\nimport { normalizeJsonValue } from \"../../shared/json-value.ts\";\nimport { notCommandProjection, opaqueCommandProjection } from \"../command-projection.ts\";\nexport const HERMES_TOOL_ALIASES: globalThis.Record<string, ToolName> = {\n ...GENERIC_VERB_ALIASES,\n terminal: \"shell\",\n read_file: \"file_read\",\n write_file: \"file_write\",\n edit_file: \"file_edit\",\n web_extract: \"web_fetch\",\n};\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name, HERMES_TOOL_ALIASES);\n}\n/** Hermes 的 terminal tool 给的是工具 arguments,不是可验证的 native argv。 */\nfunction commandProjectionForHermesTool(name: string) {\n return name.toLowerCase() === \"terminal\"\n ? opaqueCommandProjection(\"unsupported-protocol\")\n : notCommandProjection();\n}\nfunction get(obj: unknown, key: string): unknown {\n return obj && typeof obj === \"object\" ? (obj as globalThis.Record<string, unknown>)[key] : undefined;\n}\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" && v ? v : undefined;\n}\n/**\n * Hermes 以 `skill_view({ name })` 表示实际加载了一个已安装 Skill。它不是普通\n * 文件读取:对应的标准事件是 `skill.loaded`,这样判分和 execution 读面都无需猜工具文本。\n */\nfunction skillNameFromToolCall(name: string, input: JsonValue): string | undefined {\n if (name.toLowerCase() !== \"skill_view\")\n return undefined;\n return str(get(input, \"name\"));\n}\nfunction num(obj: unknown, ...keys: string[]): number {\n for (const k of keys) {\n const v = get(obj, k);\n if (typeof v === \"number\" && Number.isFinite(v))\n return v;\n }\n return 0;\n}\nfunction optionalNum(obj: unknown, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const value = get(obj, key);\n if (typeof value === \"number\" && Number.isFinite(value))\n return value;\n }\n return undefined;\n}\nfunction coerceArgs(value: unknown): JsonValue {\n if (typeof value === \"string\") {\n try {\n const parsed: unknown = JSON.parse(value);\n return normalizeJsonValue(parsed, value);\n }\n catch {\n return value;\n }\n }\n return normalizeJsonValue(value, {});\n}\nfunction parseJsonField(value: unknown): unknown {\n if (typeof value !== \"string\")\n return value;\n try {\n return JSON.parse(value);\n }\n catch {\n return value;\n }\n}\n/**\n * Hermes sessions export JSONL(一行一 session,或一行一 message)→ 标准事件 + usage。\n */\nexport function parseHermesTranscript(raw: string | undefined): ParsedTranscript {\n const events: StreamEvent[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheReadTokens = 0;\n let cacheCreationTokens = 0;\n let observedCostUSD = 0;\n let hasObservedCostUSD = false;\n let requests = 0;\n let parseSuccess = true;\n let synth = 0;\n // `skill_view` 已转成 skill.loaded 后,其 tool result 不再重发成孤立 action 节点。\n const skillCallIds = new Set<string>();\n const nextSynthId = (): string => `hm_${++synth}`;\n if (!raw?.trim()) {\n return { events, usage: {}, compactions: 0, parseSuccess: true };\n }\n const ingestSessionMeta = (obj: globalThis.Record<string, unknown>): void => {\n inputTokens += num(obj, \"input_tokens\", \"inputTokens\");\n outputTokens += num(obj, \"output_tokens\", \"outputTokens\");\n cacheReadTokens += num(obj, \"cache_read_tokens\", \"cacheReadTokens\");\n cacheCreationTokens += num(obj, \"cache_write_tokens\", \"cacheWriteTokens\", \"cacheCreationTokens\");\n // estimated_cost_usd is an estimate owned by Hermes and is deliberately\n // not relabeled as provider-observed Usage.costUSD.\n const actual = optionalNum(obj, \"actual_cost_usd\", \"actualCostUsd\");\n if (actual !== undefined) {\n observedCostUSD += actual;\n hasObservedCostUSD = true;\n }\n const apiCalls = num(obj, \"api_call_count\", \"apiCallCount\");\n if (apiCalls)\n requests += apiCalls;\n };\n const ingestMessage = (msg: globalThis.Record<string, unknown>): void => {\n const role = str(msg.role) ?? \"assistant\";\n const content = str(msg.content);\n if (role === \"tool\" || str(msg.tool_call_id) || str(msg.toolCallId)) {\n const callId = str(msg.tool_call_id) ?? str(msg.toolCallId) ?? nextSynthId();\n if (skillCallIds.has(callId))\n return;\n const success = msg.is_error !== true && msg.isError !== true;\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: (content ?? get(msg, \"output\") ?? null) as JsonValue,\n status: success ? \"completed\" : \"failed\",\n });\n return;\n }\n const toolCallsRaw = parseJsonField(msg.tool_calls ?? msg.toolCalls);\n if (Array.isArray(toolCallsRaw)) {\n for (const call of toolCallsRaw) {\n const fn = get(call, \"function\") as globalThis.Record<string, unknown> | undefined;\n const name = str(get(fn, \"name\")) ?? str(get(call, \"name\")) ?? str(msg.tool_name) ?? \"unknown\";\n const callId = str(get(call, \"id\")) ?? nextSynthId();\n const args = coerceArgs(get(fn, \"arguments\") ?? get(call, \"arguments\") ?? get(call, \"input\"));\n const skill = skillNameFromToolCall(name, args);\n if (skill !== undefined) {\n events.push({ type: \"skill.loaded\", skill, operationId: callId });\n skillCallIds.add(callId);\n continue;\n }\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name,\n input: args,\n tool: normalizeToolName(name),\n command: commandProjectionForHermesTool(name),\n },\n });\n }\n }\n if (content?.trim() && role !== \"user\" && role !== \"system\") {\n events.push({ type: \"message\", role: \"assistant\", text: content });\n }\n else if (content?.trim() && role === \"user\" && !Array.isArray(toolCallsRaw)) {\n // 用户消息不进行为断言主路径;保留会污染显式 message 值断言。跳过。\n }\n const reasoning = str(msg.reasoning) ?? str(msg.reasoning_content);\n if (reasoning?.trim())\n events.push({ type: \"thinking\", text: reasoning });\n };\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed)\n continue;\n let obj: globalThis.Record<string, unknown>;\n try {\n obj = JSON.parse(trimmed) as globalThis.Record<string, unknown>;\n }\n catch {\n parseSuccess = false;\n continue;\n }\n try {\n // 整 session 导出:带 messages[]\n if (Array.isArray(obj.messages)) {\n ingestSessionMeta(obj);\n for (const m of obj.messages) {\n if (m && typeof m === \"object\")\n ingestMessage(m as globalThis.Record<string, unknown>);\n }\n continue;\n }\n // 单行 message\n if (str(obj.role)) {\n ingestMessage(obj);\n continue;\n }\n // sqlite dump 行:{session_id, role, content, tool_calls, ...}\n if (str(obj.session_id) || str(obj.sessionId)) {\n ingestMessage(obj);\n continue;\n }\n ingestSessionMeta(obj);\n }\n catch {\n parseSuccess = false;\n }\n }\n const usage: Usage = {};\n if (inputTokens)\n usage.inputTokens = inputTokens;\n if (outputTokens)\n usage.outputTokens = outputTokens;\n if (cacheReadTokens)\n usage.cacheReadTokens = cacheReadTokens;\n if (cacheCreationTokens)\n usage.cacheCreationTokens = cacheCreationTokens;\n if (hasObservedCostUSD)\n usage.costUSD = observedCostUSD;\n if (requests)\n usage.requests = requests;\n return { events, usage, compactions: 0, parseSuccess };\n}\n/** 从 export / stdout 文本里抠 session id。 */\nexport function sessionIdFromHermesOutput(raw: string | undefined): string | undefined {\n if (!raw)\n return undefined;\n for (const line of raw.split(\"\\n\")) {\n const resume = line.match(/hermes\\s+(?:chat\\s+)?(?:--resume|-r)\\s+(\\S+)/i);\n if (resume?.[1])\n return resume[1].replace(/[\"'`]/g, \"\");\n const labeled = line.match(/Session:\\s*([A-Za-z0-9_-]+)/i);\n if (labeled?.[1])\n return labeled[1];\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"{\"))\n continue;\n try {\n const obj = JSON.parse(trimmed) as globalThis.Record<string, unknown>;\n const id = str(obj.id) ?? str(obj.session_id) ?? str(obj.sessionId);\n if (id && (Array.isArray(obj.messages) || str(obj.source)))\n return id;\n }\n catch {\n // skip\n }\n }\n return undefined;\n}\n"]}
|
|
@@ -5,6 +5,7 @@ exports.loadBuiltInExperimentRows = loadBuiltInExperimentRows;
|
|
|
5
5
|
exports.loadBuiltInAttemptRows = loadBuiltInAttemptRows;
|
|
6
6
|
const aggregate_ts_1 = require("../model/aggregate.cjs");
|
|
7
7
|
const metrics_ts_1 = require("../model/metrics.cjs");
|
|
8
|
+
const compute_ts_1 = require("../components/entity-lists/compute.cjs");
|
|
8
9
|
function loadBuiltInSummaryRows(sample) {
|
|
9
10
|
return (0, aggregate_ts_1.aggregate)(sample, {
|
|
10
11
|
by: {},
|
|
@@ -12,11 +13,26 @@ function loadBuiltInSummaryRows(sample) {
|
|
|
12
13
|
});
|
|
13
14
|
}
|
|
14
15
|
/** One closed row per selected Experiment for overview charts and tables. */
|
|
15
|
-
function loadBuiltInExperimentRows(sample) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
async function loadBuiltInExperimentRows(sample) {
|
|
17
|
+
const rows = await (0, compute_ts_1.experimentListData)(sample);
|
|
18
|
+
const output = rows.map((row) => Object.freeze({
|
|
19
|
+
key: String(row.experimentId),
|
|
20
|
+
experiment: String(row.experimentId),
|
|
21
|
+
evaluationKind: row.evaluationKind,
|
|
22
|
+
...(row.totalScore === undefined ? {} : { totalScore: row.totalScore }),
|
|
23
|
+
passRate: row.evaluationKind === "pass" ? row.endToEndPassRate : null,
|
|
24
|
+
durationMs: row.durationMs,
|
|
25
|
+
tokens: row.tokens,
|
|
26
|
+
}));
|
|
27
|
+
const issues = new Map();
|
|
28
|
+
for (const issue of output.flatMap((row) => [row.passRate, row.durationMs, row.tokens]
|
|
29
|
+
.filter((metric) => metric !== null)
|
|
30
|
+
.flatMap((metric) => metric.issues))) {
|
|
31
|
+
issues.set(`${issue.code}\u0000${issue.message}`, issue);
|
|
32
|
+
}
|
|
33
|
+
return Object.freeze(Object.assign(output, {
|
|
34
|
+
issues: Object.freeze([...issues.values()]),
|
|
35
|
+
}));
|
|
20
36
|
}
|
|
21
37
|
/** One closed row per selected logical Attempt; used only by the Attempts Page. */
|
|
22
38
|
function loadBuiltInAttemptRows(sample) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-values.js","sourceRoot":"","sources":["analysis-values.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"analysis-values.js","sourceRoot":"","sources":["analysis-values.ts"],"names":[],"mappings":";;AAUA,wDAKC;AAID,8DAoBC;AAID,wDAKC;AAzCD,wDAAgF;AAChF,oDAAoE;AACpE,sEAA2E;AAC3E,SAAgB,sBAAsB,CAAC,MAAc;IACjD,OAAO,IAAA,wBAAS,EAAC,MAAM,EAAE;QACrB,EAAE,EAAE,EAAE;QACN,MAAM,EAAE,EAAE,QAAQ,EAAR,qBAAQ,EAAE,UAAU,EAAV,uBAAU,EAAE,MAAM,EAAN,mBAAM,EAAE;KAC3C,CAAC,CAAC;AACP,CAAC;AAGD,6EAA6E;AACtE,KAAK,UAAU,yBAAyB,CAAC,MAAc;IAC1D,MAAM,IAAI,GAAG,MAAM,IAAA,+BAAkB,EAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3C,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QAC7B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QACpC,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;QACvE,QAAQ,EAAE,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;QACrE,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;KACrB,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqE,CAAC;IAC5F,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC;SACjF,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC;SACnC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QACvC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;KAC9C,CAAC,CAAC,CAAC;AACR,CAAC;AAGD,mFAAmF;AACnF,SAAgB,sBAAsB,CAAC,MAAc;IACjD,OAAO,IAAA,wBAAS,EAAC,MAAM,EAAE;QACrB,EAAE,EAAE,EAAE,UAAU,EAAV,yBAAU,EAAE,MAAM,EAAN,qBAAM,EAAE,OAAO,EAAP,sBAAO,EAAE;QACnC,MAAM,EAAE,EAAE,QAAQ,EAAR,qBAAQ,EAAE,UAAU,EAAV,uBAAU,EAAE,MAAM,EAAN,mBAAM,EAAE;KAC3C,CAAC,CAAC;AACP,CAAC","sourcesContent":["/**\n * The standard report only composes Analysis-issued ClosedRows. In\n * particular, it does not create a second Measure catalog or copy an Analysis\n * reducer: all denominator, missingness, provenance, and cost semantics come\n * from the public Report/Analysis facade.\n */\nimport type { Sample } from \"../../analysis/index.ts\";\nimport { aggregate, attempt, evalId, experiment, } from \"../model/aggregate.ts\";\nimport { durationMs, passRate, tokens, } from \"../model/metrics.ts\";\nimport { experimentListData } from \"../components/entity-lists/compute.ts\";\nexport function loadBuiltInSummaryRows(sample: Sample) {\n return aggregate(sample, {\n by: {},\n values: { passRate, durationMs, tokens },\n });\n}\nexport type BuiltInSummaryRows = Awaited<ReturnType<typeof loadBuiltInSummaryRows>>;\nexport type BuiltInSummaryRow = BuiltInSummaryRows[number];\n/** One closed row per selected Experiment for overview charts and tables. */\nexport async function loadBuiltInExperimentRows(sample: Sample) {\n const rows = await experimentListData(sample);\n const output = rows.map((row) => Object.freeze({\n key: String(row.experimentId),\n experiment: String(row.experimentId),\n evaluationKind: row.evaluationKind,\n ...(row.totalScore === undefined ? {} : { totalScore: row.totalScore }),\n passRate: row.evaluationKind === \"pass\" ? row.endToEndPassRate : null,\n durationMs: row.durationMs,\n tokens: row.tokens,\n }));\n const issues = new Map<string, typeof rows[number][\"endToEndPassRate\"][\"issues\"][number]>();\n for (const issue of output.flatMap((row) => [row.passRate, row.durationMs, row.tokens]\n .filter((metric) => metric !== null)\n .flatMap((metric) => metric.issues))) {\n issues.set(`${issue.code}\\u0000${issue.message}`, issue);\n }\n return Object.freeze(Object.assign(output, {\n issues: Object.freeze([...issues.values()]),\n }));\n}\nexport type BuiltInExperimentRows = Awaited<ReturnType<typeof loadBuiltInExperimentRows>>;\nexport type BuiltInExperimentRow = BuiltInExperimentRows[number];\n/** One closed row per selected logical Attempt; used only by the Attempts Page. */\nexport function loadBuiltInAttemptRows(sample: Sample) {\n return aggregate(sample, {\n by: { experiment, evalId, attempt },\n values: { passRate, durationMs, tokens },\n });\n}\nexport type BuiltInAttemptRows = Awaited<ReturnType<typeof loadBuiltInAttemptRows>>;\n"]}
|
|
@@ -15,15 +15,17 @@ export declare function loadBuiltInSummaryRows(sample: Sample): Promise<import("
|
|
|
15
15
|
export type BuiltInSummaryRows = Awaited<ReturnType<typeof loadBuiltInSummaryRows>>;
|
|
16
16
|
export type BuiltInSummaryRow = BuiltInSummaryRows[number];
|
|
17
17
|
/** One closed row per selected Experiment for overview charts and tables. */
|
|
18
|
-
export declare function loadBuiltInExperimentRows(sample: Sample): Promise<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
18
|
+
export declare function loadBuiltInExperimentRows(sample: Sample): Promise<Readonly<Readonly<{
|
|
19
|
+
passRate: import("../../analysis/contracts.cjs").MetricValue<number> | null;
|
|
20
|
+
durationMs: import("../../analysis/contracts.cjs").MetricValue<number>;
|
|
21
|
+
tokens: import("../../analysis/contracts.cjs").MetricValue<number>;
|
|
22
|
+
totalScore?: number | undefined;
|
|
23
|
+
key: string;
|
|
24
|
+
experiment: string;
|
|
25
|
+
evaluationKind: import("../components/entity-lists/compute.cjs").EvaluationKindComposition;
|
|
26
|
+
}>[] & {
|
|
27
|
+
issues: readonly import("../../analysis/contracts.cjs").AnalysisIssue[];
|
|
28
|
+
}>>;
|
|
27
29
|
export type BuiltInExperimentRows = Awaited<ReturnType<typeof loadBuiltInExperimentRows>>;
|
|
28
30
|
export type BuiltInExperimentRow = BuiltInExperimentRows[number];
|
|
29
31
|
/** One closed row per selected logical Attempt; used only by the Attempts Page. */
|
|
@@ -15,15 +15,17 @@ export declare function loadBuiltInSummaryRows(sample: Sample): Promise<import("
|
|
|
15
15
|
export type BuiltInSummaryRows = Awaited<ReturnType<typeof loadBuiltInSummaryRows>>;
|
|
16
16
|
export type BuiltInSummaryRow = BuiltInSummaryRows[number];
|
|
17
17
|
/** One closed row per selected Experiment for overview charts and tables. */
|
|
18
|
-
export declare function loadBuiltInExperimentRows(sample: Sample): Promise<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
18
|
+
export declare function loadBuiltInExperimentRows(sample: Sample): Promise<Readonly<Readonly<{
|
|
19
|
+
passRate: import("../../analysis/contracts.mjs").MetricValue<number> | null;
|
|
20
|
+
durationMs: import("../../analysis/contracts.mjs").MetricValue<number>;
|
|
21
|
+
tokens: import("../../analysis/contracts.mjs").MetricValue<number>;
|
|
22
|
+
totalScore?: number | undefined;
|
|
23
|
+
key: string;
|
|
24
|
+
experiment: string;
|
|
25
|
+
evaluationKind: import("../components/entity-lists/compute.mjs").EvaluationKindComposition;
|
|
26
|
+
}>[] & {
|
|
27
|
+
issues: readonly import("../../analysis/contracts.mjs").AnalysisIssue[];
|
|
28
|
+
}>>;
|
|
27
29
|
export type BuiltInExperimentRows = Awaited<ReturnType<typeof loadBuiltInExperimentRows>>;
|
|
28
30
|
export type BuiltInExperimentRow = BuiltInExperimentRows[number];
|
|
29
31
|
/** One closed row per selected logical Attempt; used only by the Attempts Page. */
|
|
@@ -15,15 +15,17 @@ export declare function loadBuiltInSummaryRows(sample: Sample): Promise<import("
|
|
|
15
15
|
export type BuiltInSummaryRows = Awaited<ReturnType<typeof loadBuiltInSummaryRows>>;
|
|
16
16
|
export type BuiltInSummaryRow = BuiltInSummaryRows[number];
|
|
17
17
|
/** One closed row per selected Experiment for overview charts and tables. */
|
|
18
|
-
export declare function loadBuiltInExperimentRows(sample: Sample): Promise<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
18
|
+
export declare function loadBuiltInExperimentRows(sample: Sample): Promise<Readonly<Readonly<{
|
|
19
|
+
passRate: import("../../analysis/contracts.js").MetricValue<number> | null;
|
|
20
|
+
durationMs: import("../../analysis/contracts.js").MetricValue<number>;
|
|
21
|
+
tokens: import("../../analysis/contracts.js").MetricValue<number>;
|
|
22
|
+
totalScore?: number | undefined;
|
|
23
|
+
key: string;
|
|
24
|
+
experiment: string;
|
|
25
|
+
evaluationKind: import("../components/entity-lists/compute.js").EvaluationKindComposition;
|
|
26
|
+
}>[] & {
|
|
27
|
+
issues: readonly import("../../analysis/contracts.js").AnalysisIssue[];
|
|
28
|
+
}>>;
|
|
27
29
|
export type BuiltInExperimentRows = Awaited<ReturnType<typeof loadBuiltInExperimentRows>>;
|
|
28
30
|
export type BuiltInExperimentRow = BuiltInExperimentRows[number];
|
|
29
31
|
/** One closed row per selected logical Attempt; used only by the Attempts Page. */
|
|
@@ -28,6 +28,7 @@ const overviewPage = {
|
|
|
28
28
|
counts: Object.freeze({
|
|
29
29
|
experiments: experiments.length,
|
|
30
30
|
attempts: sample.snapshot.slots.filter((slot) => slot.state === "included").length,
|
|
31
|
+
expectedResults: sample.snapshot.slots.filter((slot) => slot.state !== "excluded").length,
|
|
31
32
|
}),
|
|
32
33
|
});
|
|
33
34
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview.js","sourceRoot":"","sources":["overview.ts"],"names":[],"mappings":";;;AAEA,mDAAwC;AAGxC,6DAA+I;AAC/I,kEAAsE;AACtE,6CAA+E;
|
|
1
|
+
{"version":3,"file":"overview.js","sourceRoot":"","sources":["overview.ts"],"names":[],"mappings":";;;AAEA,mDAAwC;AAGxC,6DAA+I;AAC/I,kEAAsE;AACtE,6CAA+E;AAW/E,SAAS,QAAQ,CAAC,QAAwB;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClK,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;QACxE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;KAC7B,CAAC,CAAC;AACP,CAAC;AACD,MAAM,YAAY,GAAG;IACjB,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,KAAK,EAAE,MAAc,EAA8B,EAAE;QACvD,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,IAAA,2CAAsB,EAAC,MAAM,CAAC;YAC9B,IAAA,8CAAyB,EAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC/B,OAAO;YACP,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBAClB,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,MAAM;gBAClF,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,MAAM;aAC5F,CAAC;SACL,CAAC,CAAC;IACP,CAAC;IACD,MAAM,EAAE,CAAC,KAAwB,EAAE,EAAE,CAAC,IAAA,iBAAG,EAAC,kDAA0B,EAAE,KAAK,CAAC;CACvC,CAAC;AAC1C,2EAA2E;AAC9D,QAAA,qBAAqB,GAAG,IAAA,gCAAmB,EAAC,sCAAyB,CAAC,eAAe,EAAE;IAChG,KAAK,EAAE,mBAAmB;IAC1B,KAAK,EAAE,CAAC,YAAY,CAAC;CACxB,CAAC,CAAC;AACH,wEAAwE;AAC3D,QAAA,QAAQ,GAAG,6BAAqB,CAAC;AAC9C,kBAAe,6BAAqB,CAAC","sourcesContent":["/** The stable project-current built-in selector. */\nimport type { Sample, SampleSnapshot, } from \"../../analysis/index.ts\";\nimport { jsx } from \"react/jsx-runtime\";\nimport type { Page } from \"../definition/report.ts\";\nimport { type HeroData } from \"../components/site-components/index.tsx\";\nimport { loadBuiltInExperimentRows, loadBuiltInSummaryRows, type BuiltInExperimentRows, type BuiltInSummaryRows, } from \"./analysis-values.ts\";\nimport { StandardOverviewResultView, } from \"./result-components.tsx\";\nimport { builtInMachineProducerIds, defineBuiltInReport, } from \"./machine.ts\";\ninterface OverviewPageInput {\n readonly hero: HeroData;\n readonly summary: BuiltInSummaryRows;\n readonly experiments: BuiltInExperimentRows;\n readonly counts: {\n readonly experiments: number;\n readonly attempts: number;\n readonly expectedResults: number;\n };\n}\nfunction heroData(snapshot: SampleSnapshot): HeroData {\n const latest = snapshot.runs.reduce<number | null>((current, run) => current === null || Number(run.startedAt) > current ? Number(run.startedAt) : current, null);\n return Object.freeze({\n latestStartedAt: latest === null ? null : new Date(latest).toISOString(),\n runs: snapshot.runs.length,\n });\n}\nconst overviewPage = {\n id: \"overview\",\n path: \"/\",\n title: \"Overview\",\n load: async (sample: Sample): Promise<OverviewPageInput> => {\n const [summary, experiments] = await Promise.all([\n loadBuiltInSummaryRows(sample),\n loadBuiltInExperimentRows(sample),\n ]);\n return Object.freeze({\n hero: heroData(sample.snapshot),\n summary,\n experiments,\n counts: Object.freeze({\n experiments: experiments.length,\n attempts: sample.snapshot.slots.filter((slot) => slot.state === \"included\").length,\n expectedResults: sample.snapshot.slots.filter((slot) => slot.state !== \"excluded\").length,\n }),\n });\n },\n render: (input: OverviewPageInput) => jsx(StandardOverviewResultView, input),\n} satisfies Page<void, OverviewPageInput>;\n/** The default project-current report over Analysis-issued closed rows. */\nexport const defaultOverviewReport = defineBuiltInReport(builtInMachineProducerIds.defaultOverview, {\n title: \"NiceEval overview\",\n pages: [overviewPage],\n});\n/** Stable built-in token target for an explicit `--report overview`. */\nexport const overview = defaultOverviewReport;\nexport default defaultOverviewReport;\n"]}
|
|
@@ -12,6 +12,9 @@ const SOURCE_TEXT_MAX = 12000;
|
|
|
12
12
|
function metricCell(metric) {
|
|
13
13
|
return { kind: "metric", metric };
|
|
14
14
|
}
|
|
15
|
+
function metricValueOnlyCell(metric) {
|
|
16
|
+
return { kind: "metric", metric, showCoverage: false };
|
|
17
|
+
}
|
|
15
18
|
function limited(rows, maximum = DETAIL_ROWS_MAX) {
|
|
16
19
|
return rows.slice(0, maximum);
|
|
17
20
|
}
|
|
@@ -31,10 +34,19 @@ function issueSection(view) {
|
|
|
31
34
|
}
|
|
32
35
|
function heroAndKpis(input) {
|
|
33
36
|
const summary = input.summary[0];
|
|
34
|
-
|
|
37
|
+
const hasScore = input.experiments.some((row) => row.evaluationKind !== "pass");
|
|
38
|
+
const hasPassSummary = input.experiments.length > 0 && input.experiments.every((row) => row.evaluationKind === "pass");
|
|
39
|
+
const scores = input.experiments.flatMap((row) => row.totalScore === undefined ? [] : [row.totalScore]);
|
|
40
|
+
const meanScore = scores.length === 0 ? null : scores.reduce((sum, score) => sum + score, 0) / scores.length;
|
|
41
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(index_tsx_1.Hero, { data: input.hero }), (0, jsx_runtime_1.jsxs)(primitives_tsx_1.Grid, { children: [hasPassSummary ? (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Pass rate", value: summary === undefined ? null : metricValueOnlyCell(summary.passRate) }) : null, hasScore ? (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Mean score", value: meanScore }) : null, (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Mean duration", value: summary === undefined ? null : metricValueOnlyCell(summary.durationMs) }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Mean tokens", value: summary === undefined ? null : metricValueOnlyCell(summary.tokens) }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Experiments", value: input.counts.experiments }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Included attempts", value: input.counts.attempts })] })] }));
|
|
42
|
+
}
|
|
43
|
+
function resultCoverageSection(counts) {
|
|
44
|
+
if (counts.attempts >= counts.expectedResults)
|
|
45
|
+
return null;
|
|
46
|
+
return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Section, { title: "Result coverage", meta: `${counts.attempts} of ${counts.expectedResults} results available`, children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { children: "Some expected results do not have an analyzable Attempt. Result coverage is not a score or pass rate." }) }));
|
|
35
47
|
}
|
|
36
48
|
function experimentPoints(rows) {
|
|
37
|
-
return rows.map((row) => (0, metrics_ts_1.evidenceRow)({
|
|
49
|
+
return rows.filter((row) => row.passRate !== null).map((row) => (0, metrics_ts_1.evidenceRow)({
|
|
38
50
|
experiment: String(row.experiment),
|
|
39
51
|
passRate: row.passRate,
|
|
40
52
|
durationMs: row.durationMs,
|
|
@@ -44,13 +56,24 @@ function experimentTarget(experiment) {
|
|
|
44
56
|
return { page: "experiment", params: (0, details_ts_1.experimentDetailTarget)(experiment) };
|
|
45
57
|
}
|
|
46
58
|
function standardOverviewTree(input) {
|
|
59
|
+
const hasScore = input.experiments.some((row) => row.evaluationKind !== "pass");
|
|
60
|
+
const hasPass = input.experiments.some((row) => row.evaluationKind === "pass");
|
|
47
61
|
const points = experimentPoints(input.experiments);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
const columns = [
|
|
63
|
+
{ field: "experiment", label: "Experiment" },
|
|
64
|
+
...(hasPass ? [{ field: "passRate", label: "Pass rate" }] : []),
|
|
65
|
+
...(hasScore ? [{ field: "totalScore", label: "Score" }] : []),
|
|
66
|
+
{ field: "durationMs", label: "Mean duration" },
|
|
67
|
+
{ field: "tokens", label: "Mean tokens" },
|
|
68
|
+
];
|
|
69
|
+
const tableRows = input.experiments.map((row) => ({
|
|
70
|
+
...row,
|
|
71
|
+
passRate: row.passRate === null ? null : metricValueOnlyCell(row.passRate),
|
|
72
|
+
totalScore: row.totalScore ?? null,
|
|
73
|
+
durationMs: metricValueOnlyCell(row.durationMs),
|
|
74
|
+
tokens: metricValueOnlyCell(row.tokens),
|
|
75
|
+
}));
|
|
76
|
+
return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { children: [heroAndKpis(input), resultCoverageSection(input.counts), (0, jsx_runtime_1.jsxs)(primitives_tsx_1.Section, { title: "Experiment results", meta: `${input.experiments.length} experiments`, children: [input.experiments.length === 0 ? (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { children: "No experiment rows are available for this selection." }) : !hasPass ? null : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Bars, { points: points, x: "experiment", y: "passRate", point: "experiment", pointTarget: (point) => experimentTarget(point.key), sort: { field: "passRate", direction: "desc" }, layout: "horizontal" }) })), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Table, { rows: tableRows, columns: columns })] }), issueSection(input.experiments)] }));
|
|
54
77
|
}
|
|
55
78
|
/** The default product overview: Hero, exactly six KPIs, Bars, Scatter, and Table. */
|
|
56
79
|
exports.StandardOverviewResultView = (0, tree_ts_1.defineComponent)((input) => standardOverviewTree(input));
|
|
@@ -74,17 +97,31 @@ function standardAttemptsTree(input) {
|
|
|
74
97
|
exports.StandardAttemptsResultView = (0, tree_ts_1.defineComponent)((input) => standardAttemptsTree(input));
|
|
75
98
|
exports.StandardAttemptsResultView.displayName = "StandardAttemptsResultView";
|
|
76
99
|
function membershipTable(rows) {
|
|
77
|
-
|
|
100
|
+
const normalized = rows.map((row) => ({
|
|
101
|
+
...row,
|
|
102
|
+
outcome: row.outcome ?? null,
|
|
103
|
+
phase: row.phase ?? null,
|
|
104
|
+
error: row.error ?? null,
|
|
105
|
+
sharedFailure: row.sharedFailure ?? null,
|
|
106
|
+
}));
|
|
107
|
+
return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Table, { rows: normalized, columns: [
|
|
78
108
|
{ field: "experiment", label: "Experiment" },
|
|
79
109
|
{ field: "eval", label: "Eval" },
|
|
80
110
|
{ field: "attempt", label: "Attempt" },
|
|
111
|
+
{ field: "state", label: "Membership" },
|
|
112
|
+
{ field: "outcome", label: "Outcome" },
|
|
113
|
+
{ field: "error", label: "Error" },
|
|
114
|
+
{ field: "phase", label: "Phase" },
|
|
115
|
+
{ field: "sharedFailure", label: "Shared failure" },
|
|
81
116
|
{ field: "locator", label: "Attempt locator" },
|
|
82
117
|
{ field: "selectedRun", label: "Selected run" },
|
|
83
118
|
{ field: "slot", label: "Slot" },
|
|
84
|
-
{ field: "state", label: "Membership" },
|
|
85
119
|
{ field: "relation", label: "Relation" },
|
|
86
120
|
] }));
|
|
87
121
|
}
|
|
122
|
+
function runErrorsSection(rows) {
|
|
123
|
+
return rows.length === 0 ? null : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Section, { title: "Run errors", meta: `${rows.length} shared failure${rows.length === 1 ? "" : "s"}`, children: rows.map((row) => ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Section, { title: `${row.error} · ${row.failure}`, children: [(0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { children: `phase: ${row.phase}` }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { children: `affected: ${row.affected}` }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { children: row.message }), row.fix === null ? null : (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { children: `fix: ${row.fix}` })] }, row.key))) }));
|
|
124
|
+
}
|
|
88
125
|
function evidenceEntryRows(view, locator) {
|
|
89
126
|
return view.entries
|
|
90
127
|
.filter((entry) => locator === undefined || entry.attempt.locator === locator)
|
|
@@ -302,7 +339,7 @@ exports.SandboxHistoryResultView = (0, tree_ts_1.defineComponent)((props) => san
|
|
|
302
339
|
exports.SandboxHistoryResultView.displayName = "SandboxHistoryResultView";
|
|
303
340
|
function runMembershipTree(input) {
|
|
304
341
|
const summary = input.summary[0];
|
|
305
|
-
return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { children: [(0, jsx_runtime_1.jsx)(index_tsx_1.Hero, { data: input.hero }), (0, jsx_runtime_1.jsxs)(primitives_tsx_1.Grid, { children: [(0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Pass rate", value: summary === undefined ? null : metricCell(summary.passRate) }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Included attempts", value: input.members.filter((member) => member.state === "included").length })] }), (0, jsx_runtime_1.jsxs)(primitives_tsx_1.Section, { title: "Run membership", meta: `${input.members.length} slots`, children: [membershipTable(limited(input.members)), omittedText(input.members.length, Math.min(input.members.length, DETAIL_ROWS_MAX), "membership rows")] }), (0, jsx_runtime_1.jsx)(exports.AttemptEvidenceResultView, { view: input.evidence }), issueSection(input.summary)] }));
|
|
342
|
+
return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { children: [(0, jsx_runtime_1.jsx)(index_tsx_1.Hero, { data: input.hero }), (0, jsx_runtime_1.jsxs)(primitives_tsx_1.Grid, { children: [(0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Pass rate", value: summary === undefined ? null : metricCell(summary.passRate) }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: "Included attempts", value: input.members.filter((member) => member.state === "included").length })] }), (0, jsx_runtime_1.jsxs)(primitives_tsx_1.Section, { title: "Run membership", meta: `${input.members.length} slots`, children: [membershipTable(limited(input.members)), omittedText(input.members.length, Math.min(input.members.length, DETAIL_ROWS_MAX), "membership rows")] }), runErrorsSection(input.errors), (0, jsx_runtime_1.jsx)(exports.AttemptEvidenceResultView, { view: input.evidence }), issueSection(input.summary)] }));
|
|
306
343
|
}
|
|
307
344
|
exports.RunMembershipResultView = (0, tree_ts_1.defineComponent)((input) => runMembershipTree(input));
|
|
308
345
|
exports.RunMembershipResultView.displayName = "RunMembershipResultView";
|
|
@@ -314,7 +351,16 @@ exports.AttemptDetailResultView = (0, tree_ts_1.defineComponent)((input) => atte
|
|
|
314
351
|
exports.AttemptDetailResultView.displayName = "AttemptDetailResultView";
|
|
315
352
|
function experimentDetailTree(input) {
|
|
316
353
|
const rows = input.rows.filter((row) => String(row.experiment) === input.experiment);
|
|
317
|
-
|
|
354
|
+
const hasScore = rows.some((row) => row.evaluationKind !== "pass");
|
|
355
|
+
const hasPass = rows.some((row) => row.evaluationKind === "pass");
|
|
356
|
+
const columns = [
|
|
357
|
+
"experiment",
|
|
358
|
+
...(hasPass ? ["passRate"] : []),
|
|
359
|
+
...(hasScore ? ["totalScore"] : []),
|
|
360
|
+
"durationMs",
|
|
361
|
+
"tokens",
|
|
362
|
+
];
|
|
363
|
+
return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { children: [(0, jsx_runtime_1.jsx)(index_tsx_1.Hero, { data: input.hero }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Section, { title: `Experiment · ${input.experiment}`, children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Table, { rows: rows, columns: columns }) }), (0, jsx_runtime_1.jsxs)(primitives_tsx_1.Section, { title: "Experiment members", meta: `${input.members.length} slots`, children: [membershipTable(limited(input.members)), omittedText(input.members.length, Math.min(input.members.length, DETAIL_ROWS_MAX), "member rows")] }), issueSection(input.rows)] }));
|
|
318
364
|
}
|
|
319
365
|
exports.ExperimentDetailResultView = (0, tree_ts_1.defineComponent)((input) => experimentDetailTree(input));
|
|
320
366
|
exports.ExperimentDetailResultView.displayName = "ExperimentDetailResultView";
|