@netlify/axis 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/README.md +977 -0
  2. package/dist/adapters/base/acp-adapter.d.ts +44 -0
  3. package/dist/adapters/base/acp-adapter.d.ts.map +1 -0
  4. package/dist/adapters/base/acp-adapter.js +559 -0
  5. package/dist/adapters/base/acp-adapter.js.map +1 -0
  6. package/dist/adapters/base/agent-adapter.d.ts +132 -0
  7. package/dist/adapters/base/agent-adapter.d.ts.map +1 -0
  8. package/dist/adapters/base/agent-adapter.js +212 -0
  9. package/dist/adapters/base/agent-adapter.js.map +1 -0
  10. package/dist/adapters/claude-code.d.ts +3 -0
  11. package/dist/adapters/claude-code.d.ts.map +1 -0
  12. package/dist/adapters/claude-code.js +138 -0
  13. package/dist/adapters/claude-code.js.map +1 -0
  14. package/dist/adapters/claude-sdk.d.ts +11 -0
  15. package/dist/adapters/claude-sdk.d.ts.map +1 -0
  16. package/dist/adapters/claude-sdk.js +46 -0
  17. package/dist/adapters/claude-sdk.js.map +1 -0
  18. package/dist/adapters/codex.d.ts +3 -0
  19. package/dist/adapters/codex.d.ts.map +1 -0
  20. package/dist/adapters/codex.js +183 -0
  21. package/dist/adapters/codex.js.map +1 -0
  22. package/dist/adapters/gemini-acp.d.ts +11 -0
  23. package/dist/adapters/gemini-acp.d.ts.map +1 -0
  24. package/dist/adapters/gemini-acp.js +60 -0
  25. package/dist/adapters/gemini-acp.js.map +1 -0
  26. package/dist/adapters/gemini.d.ts +3 -0
  27. package/dist/adapters/gemini.d.ts.map +1 -0
  28. package/dist/adapters/gemini.js +222 -0
  29. package/dist/adapters/gemini.js.map +1 -0
  30. package/dist/adapters/goose.d.ts +3 -0
  31. package/dist/adapters/goose.d.ts.map +1 -0
  32. package/dist/adapters/goose.js +9 -0
  33. package/dist/adapters/goose.js.map +1 -0
  34. package/dist/adapters/registry.d.ts +7 -0
  35. package/dist/adapters/registry.d.ts.map +1 -0
  36. package/dist/adapters/registry.js +37 -0
  37. package/dist/adapters/registry.js.map +1 -0
  38. package/dist/adapters/utils/mcp.d.ts +23 -0
  39. package/dist/adapters/utils/mcp.d.ts.map +1 -0
  40. package/dist/adapters/utils/mcp.js +114 -0
  41. package/dist/adapters/utils/mcp.js.map +1 -0
  42. package/dist/adapters/utils/resolve.d.ts +20 -0
  43. package/dist/adapters/utils/resolve.d.ts.map +1 -0
  44. package/dist/adapters/utils/resolve.js +48 -0
  45. package/dist/adapters/utils/resolve.js.map +1 -0
  46. package/dist/adapters/utils/skills.d.ts +17 -0
  47. package/dist/adapters/utils/skills.d.ts.map +1 -0
  48. package/dist/adapters/utils/skills.js +52 -0
  49. package/dist/adapters/utils/skills.js.map +1 -0
  50. package/dist/adapters/utils/token-estimator.d.ts +21 -0
  51. package/dist/adapters/utils/token-estimator.d.ts.map +1 -0
  52. package/dist/adapters/utils/token-estimator.js +37 -0
  53. package/dist/adapters/utils/token-estimator.js.map +1 -0
  54. package/dist/baselines/diff.d.ts +9 -0
  55. package/dist/baselines/diff.d.ts.map +1 -0
  56. package/dist/baselines/diff.js +83 -0
  57. package/dist/baselines/diff.js.map +1 -0
  58. package/dist/baselines/index.d.ts +3 -0
  59. package/dist/baselines/index.d.ts.map +1 -0
  60. package/dist/baselines/index.js +3 -0
  61. package/dist/baselines/index.js.map +1 -0
  62. package/dist/baselines/store.d.ts +19 -0
  63. package/dist/baselines/store.d.ts.map +1 -0
  64. package/dist/baselines/store.js +104 -0
  65. package/dist/baselines/store.js.map +1 -0
  66. package/dist/cli.d.ts +3 -0
  67. package/dist/cli.d.ts.map +1 -0
  68. package/dist/cli.js +487 -0
  69. package/dist/cli.js.map +1 -0
  70. package/dist/config/loader.d.ts +8 -0
  71. package/dist/config/loader.d.ts.map +1 -0
  72. package/dist/config/loader.js +99 -0
  73. package/dist/config/loader.js.map +1 -0
  74. package/dist/config/validator.d.ts +11 -0
  75. package/dist/config/validator.d.ts.map +1 -0
  76. package/dist/config/validator.js +203 -0
  77. package/dist/config/validator.js.map +1 -0
  78. package/dist/docs-site/_astro/cli.DDWZtG0-.css +1 -0
  79. package/dist/docs-site/cli/index.html +18 -0
  80. package/dist/docs-site/configuration/index.html +121 -0
  81. package/dist/docs-site/content-assets.mjs +1 -0
  82. package/dist/docs-site/content-modules.mjs +1 -0
  83. package/dist/docs-site/data-store.json +9 -0
  84. package/dist/docs-site/index.html +69 -0
  85. package/dist/docs-site/quickstart/index.html +59 -0
  86. package/dist/docs-site/running/index.html +87 -0
  87. package/dist/docs-site/scoring/index.html +135 -0
  88. package/dist/index.d.ts +19 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +15 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/report-ui/index.html +291 -0
  93. package/dist/report-ui/mock-data.json +298 -0
  94. package/dist/reports/html.d.ts +7 -0
  95. package/dist/reports/html.d.ts.map +1 -0
  96. package/dist/reports/html.js +27 -0
  97. package/dist/reports/html.js.map +1 -0
  98. package/dist/reports/reader.d.ts +21 -0
  99. package/dist/reports/reader.d.ts.map +1 -0
  100. package/dist/reports/reader.js +110 -0
  101. package/dist/reports/reader.js.map +1 -0
  102. package/dist/reports/writer.d.ts +14 -0
  103. package/dist/reports/writer.d.ts.map +1 -0
  104. package/dist/reports/writer.js +106 -0
  105. package/dist/reports/writer.js.map +1 -0
  106. package/dist/runner/lifecycle.d.ts +10 -0
  107. package/dist/runner/lifecycle.d.ts.map +1 -0
  108. package/dist/runner/lifecycle.js +58 -0
  109. package/dist/runner/lifecycle.js.map +1 -0
  110. package/dist/runner/runner.d.ts +34 -0
  111. package/dist/runner/runner.d.ts.map +1 -0
  112. package/dist/runner/runner.js +330 -0
  113. package/dist/runner/runner.js.map +1 -0
  114. package/dist/scoring/category-score.d.ts +52 -0
  115. package/dist/scoring/category-score.d.ts.map +1 -0
  116. package/dist/scoring/category-score.js +157 -0
  117. package/dist/scoring/category-score.js.map +1 -0
  118. package/dist/scoring/composite.d.ts +5 -0
  119. package/dist/scoring/composite.d.ts.map +1 -0
  120. package/dist/scoring/composite.js +24 -0
  121. package/dist/scoring/composite.js.map +1 -0
  122. package/dist/scoring/deep-eval.d.ts +25 -0
  123. package/dist/scoring/deep-eval.d.ts.map +1 -0
  124. package/dist/scoring/deep-eval.js +382 -0
  125. package/dist/scoring/deep-eval.js.map +1 -0
  126. package/dist/scoring/goal-achievement.d.ts +5 -0
  127. package/dist/scoring/goal-achievement.d.ts.map +1 -0
  128. package/dist/scoring/goal-achievement.js +241 -0
  129. package/dist/scoring/goal-achievement.js.map +1 -0
  130. package/dist/scoring/index.d.ts +22 -0
  131. package/dist/scoring/index.d.ts.map +1 -0
  132. package/dist/scoring/index.js +115 -0
  133. package/dist/scoring/index.js.map +1 -0
  134. package/dist/scoring/parse-json.d.ts +6 -0
  135. package/dist/scoring/parse-json.d.ts.map +1 -0
  136. package/dist/scoring/parse-json.js +18 -0
  137. package/dist/scoring/parse-json.js.map +1 -0
  138. package/dist/scoring/sparse-index.d.ts +15 -0
  139. package/dist/scoring/sparse-index.d.ts.map +1 -0
  140. package/dist/scoring/sparse-index.js +338 -0
  141. package/dist/scoring/sparse-index.js.map +1 -0
  142. package/dist/scoring/triage.d.ts +15 -0
  143. package/dist/scoring/triage.d.ts.map +1 -0
  144. package/dist/scoring/triage.js +204 -0
  145. package/dist/scoring/triage.js.map +1 -0
  146. package/dist/skills/resolver.d.ts +19 -0
  147. package/dist/skills/resolver.d.ts.map +1 -0
  148. package/dist/skills/resolver.js +95 -0
  149. package/dist/skills/resolver.js.map +1 -0
  150. package/dist/transcript/categorize.d.ts +24 -0
  151. package/dist/transcript/categorize.d.ts.map +1 -0
  152. package/dist/transcript/categorize.js +233 -0
  153. package/dist/transcript/categorize.js.map +1 -0
  154. package/dist/transcript/classify.d.ts +7 -0
  155. package/dist/transcript/classify.d.ts.map +1 -0
  156. package/dist/transcript/classify.js +32 -0
  157. package/dist/transcript/classify.js.map +1 -0
  158. package/dist/transcript/extract.d.ts +24 -0
  159. package/dist/transcript/extract.d.ts.map +1 -0
  160. package/dist/transcript/extract.js +266 -0
  161. package/dist/transcript/extract.js.map +1 -0
  162. package/dist/transcript/index.d.ts +3 -0
  163. package/dist/transcript/index.d.ts.map +1 -0
  164. package/dist/transcript/index.js +2 -0
  165. package/dist/transcript/index.js.map +1 -0
  166. package/dist/transcript/normalize.d.ts +15 -0
  167. package/dist/transcript/normalize.d.ts.map +1 -0
  168. package/dist/transcript/normalize.js +160 -0
  169. package/dist/transcript/normalize.js.map +1 -0
  170. package/dist/transcript/types.d.ts +92 -0
  171. package/dist/transcript/types.d.ts.map +1 -0
  172. package/dist/transcript/types.js +2 -0
  173. package/dist/transcript/types.js.map +1 -0
  174. package/dist/transcript/urls.d.ts +10 -0
  175. package/dist/transcript/urls.d.ts.map +1 -0
  176. package/dist/transcript/urls.js +31 -0
  177. package/dist/transcript/urls.js.map +1 -0
  178. package/dist/types/agent.d.ts +80 -0
  179. package/dist/types/agent.d.ts.map +1 -0
  180. package/dist/types/agent.js +2 -0
  181. package/dist/types/agent.js.map +1 -0
  182. package/dist/types/baseline.d.ts +65 -0
  183. package/dist/types/baseline.d.ts.map +1 -0
  184. package/dist/types/baseline.js +2 -0
  185. package/dist/types/baseline.js.map +1 -0
  186. package/dist/types/config.d.ts +76 -0
  187. package/dist/types/config.d.ts.map +1 -0
  188. package/dist/types/config.js +2 -0
  189. package/dist/types/config.js.map +1 -0
  190. package/dist/types/index.d.ts +8 -0
  191. package/dist/types/index.d.ts.map +1 -0
  192. package/dist/types/index.js +8 -0
  193. package/dist/types/index.js.map +1 -0
  194. package/dist/types/output.d.ts +70 -0
  195. package/dist/types/output.d.ts.map +1 -0
  196. package/dist/types/output.js +15 -0
  197. package/dist/types/output.js.map +1 -0
  198. package/dist/types/report.d.ts +37 -0
  199. package/dist/types/report.d.ts.map +1 -0
  200. package/dist/types/report.js +2 -0
  201. package/dist/types/report.js.map +1 -0
  202. package/dist/types/scenario.d.ts +23 -0
  203. package/dist/types/scenario.d.ts.map +1 -0
  204. package/dist/types/scenario.js +2 -0
  205. package/dist/types/scenario.js.map +1 -0
  206. package/dist/types/scoring.d.ts +176 -0
  207. package/dist/types/scoring.d.ts.map +1 -0
  208. package/dist/types/scoring.js +2 -0
  209. package/dist/types/scoring.js.map +1 -0
  210. package/dist/ui/AnimatedTokens.d.ts +29 -0
  211. package/dist/ui/AnimatedTokens.d.ts.map +1 -0
  212. package/dist/ui/AnimatedTokens.js +53 -0
  213. package/dist/ui/AnimatedTokens.js.map +1 -0
  214. package/dist/ui/App.d.ts +6 -0
  215. package/dist/ui/App.d.ts.map +1 -0
  216. package/dist/ui/App.js +16 -0
  217. package/dist/ui/App.js.map +1 -0
  218. package/dist/ui/LiveDuration.d.ts +20 -0
  219. package/dist/ui/LiveDuration.d.ts.map +1 -0
  220. package/dist/ui/LiveDuration.js +31 -0
  221. package/dist/ui/LiveDuration.js.map +1 -0
  222. package/dist/ui/LiveStatus.d.ts +7 -0
  223. package/dist/ui/LiveStatus.d.ts.map +1 -0
  224. package/dist/ui/LiveStatus.js +52 -0
  225. package/dist/ui/LiveStatus.js.map +1 -0
  226. package/dist/ui/format.d.ts +29 -0
  227. package/dist/ui/format.d.ts.map +1 -0
  228. package/dist/ui/format.js +514 -0
  229. package/dist/ui/format.js.map +1 -0
  230. package/package.json +65 -0
@@ -0,0 +1,22 @@
1
+ import type { RunOutput, RunResult } from "../types/output.js";
2
+ import type { McpServerConfig } from "../types/config.js";
3
+ import type { McpCategoryOverrides, ScoredOutput, ScoredRunResult, ScoringOptions } from "../types/scoring.js";
4
+ /**
5
+ * Score a single run result using the interaction-based evaluation pipeline:
6
+ * normalize → sparse index → triage → deep eval → category score → goal achievement → composite
7
+ */
8
+ export declare function scoreRunResult(result: RunResult, options?: ScoringOptions): Promise<ScoredRunResult>;
9
+ /**
10
+ * Assemble a ScoredOutput from run metadata and scored results.
11
+ */
12
+ export declare function buildScoredOutput(runOutput: RunOutput, scoredResults: ScoredRunResult[]): ScoredOutput;
13
+ /**
14
+ * Score all results in a RunOutput. Scores in parallel.
15
+ */
16
+ export declare function scoreResults(runOutput: RunOutput, options?: ScoringOptions): Promise<ScoredOutput>;
17
+ /**
18
+ * Build a category overrides map from MCP server config.
19
+ * Only servers with an explicit `axisCategory` are included.
20
+ */
21
+ export declare function buildMcpCategoryOverrides(mcpServers?: Record<string, McpServerConfig>): McpCategoryOverrides;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAe,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAgB5H;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAkF1G;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,YAAY,CAmBtG;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAIxG;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAC3C,oBAAoB,CAStB"}
@@ -0,0 +1,115 @@
1
+ import { normalizeTranscript, toTranscriptAnalysis } from "../transcript/normalize.js";
2
+ import { scoreGoalAchievement } from "./goal-achievement.js";
3
+ import { buildSparseIndex, populateInteractionContent } from "./sparse-index.js";
4
+ import { runTriage } from "./triage.js";
5
+ import { runDeepEval } from "./deep-eval.js";
6
+ import { computeCategoryScore } from "./category-score.js";
7
+ import { computeComposite } from "./composite.js";
8
+ const DEFAULT_WEIGHTS = {
9
+ goal_achievement: 0.4,
10
+ environment: 0.2,
11
+ service: 0.2,
12
+ agent: 0.2,
13
+ };
14
+ /**
15
+ * Score a single run result using the interaction-based evaluation pipeline:
16
+ * normalize → sparse index → triage → deep eval → category score → goal achievement → composite
17
+ */
18
+ export async function scoreRunResult(result, options) {
19
+ const weights = options?.weights ?? DEFAULT_WEIGHTS;
20
+ const logger = options?.logger;
21
+ const label = `${result.scenarioKey} (${result.agentName})`;
22
+ logger?.verbose?.(`Scoring ${label}...`);
23
+ options?.onProgress?.(result.scenarioKey, result.agentName, "start");
24
+ // Step 1: Normalize transcript (existing, unchanged)
25
+ const normalized = normalizeTranscript(result.output.transcript);
26
+ // Step 2: Build sparse index (deterministic) and populate content for reports
27
+ const sparseIndex = buildSparseIndex(normalized, options?.mcpCategoryOverrides);
28
+ populateInteractionContent(sparseIndex, normalized);
29
+ // Step 3 + 4: Triage → Deep eval (LLM calls), run in parallel with goal achievement
30
+ const [triageResult, goalAchievement] = await Promise.all([
31
+ runTriage(result, sparseIndex),
32
+ scoreGoalAchievement(result, normalized.entries),
33
+ ]);
34
+ // Step 4 continued: Deep eval needs triage results
35
+ const deepEvalResult = await runDeepEval(result, sparseIndex, triageResult, normalized);
36
+ // Step 5: Compute category scores
37
+ const necessityMap = new Map(deepEvalResult.necessity.map((n) => [n.category, n]));
38
+ const defaultNecessity = (category) => ({
39
+ category,
40
+ score: 1.0,
41
+ unnecessaryIds: [],
42
+ rationale: "default",
43
+ });
44
+ const environment = computeCategoryScore("environment", deepEvalResult.audits, necessityMap.get("environment") ?? defaultNecessity("environment"), sparseIndex.interactions);
45
+ const service = computeCategoryScore("service", deepEvalResult.audits, necessityMap.get("service") ?? defaultNecessity("service"), sparseIndex.interactions);
46
+ const agent = computeCategoryScore("agent", deepEvalResult.audits, necessityMap.get("agent") ?? defaultNecessity("agent"), sparseIndex.interactions);
47
+ // Step 7: Compute composite AXIS score
48
+ const axisScore = computeComposite(goalAchievement.score, environment.score, service.score, agent.score, weights);
49
+ const score = {
50
+ axisScore,
51
+ goalAchievement,
52
+ environment,
53
+ service,
54
+ agent,
55
+ weights,
56
+ sparseIndex,
57
+ };
58
+ options?.onProgress?.(result.scenarioKey, result.agentName, "done");
59
+ // Stamp transcript analysis onto the output so it flows into reports.
60
+ result.output.transcriptAnalysis = toTranscriptAnalysis(normalized);
61
+ return {
62
+ scenarioKey: result.scenarioKey,
63
+ scenarioName: result.scenarioName,
64
+ agentName: result.agentName,
65
+ prompt: result.prompt,
66
+ rubric: result.rubric,
67
+ agentConfig: result.agentConfig,
68
+ output: result.output,
69
+ score,
70
+ };
71
+ }
72
+ /**
73
+ * Assemble a ScoredOutput from run metadata and scored results.
74
+ */
75
+ export function buildScoredOutput(runOutput, scoredResults) {
76
+ const completedResults = scoredResults.filter((r) => r.output.metadata.exitCode === 0);
77
+ const averageAxisScore = completedResults.length > 0
78
+ ? completedResults.reduce((sum, r) => sum + r.score.axisScore, 0) / completedResults.length
79
+ : 0;
80
+ return {
81
+ version: runOutput.version,
82
+ timestamp: runOutput.timestamp,
83
+ durationMs: runOutput.durationMs,
84
+ results: scoredResults,
85
+ summary: {
86
+ total: runOutput.summary.total,
87
+ completed: runOutput.summary.completed,
88
+ failed: runOutput.summary.failed,
89
+ averageAxisScore: Math.round(averageAxisScore),
90
+ },
91
+ };
92
+ }
93
+ /**
94
+ * Score all results in a RunOutput. Scores in parallel.
95
+ */
96
+ export async function scoreResults(runOutput, options) {
97
+ const scoredResults = await Promise.all(runOutput.results.map((r) => scoreRunResult(r, options)));
98
+ return buildScoredOutput(runOutput, scoredResults);
99
+ }
100
+ /**
101
+ * Build a category overrides map from MCP server config.
102
+ * Only servers with an explicit `axisCategory` are included.
103
+ */
104
+ export function buildMcpCategoryOverrides(mcpServers) {
105
+ const overrides = new Map();
106
+ if (!mcpServers)
107
+ return overrides;
108
+ for (const [name, server] of Object.entries(mcpServers)) {
109
+ if (server.axisCategory) {
110
+ overrides.set(name, server.axisCategory);
111
+ }
112
+ }
113
+ return overrides;
114
+ }
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scoring/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Extract and parse the first JSON object from text.
3
+ * Handles LLM output that wraps JSON in markdown fences or surrounding text.
4
+ */
5
+ export declare function parseJsonFromText(text: string): Record<string, unknown> | null;
6
+ //# sourceMappingURL=parse-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-json.d.ts","sourceRoot":"","sources":["../../src/scoring/parse-json.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAS9E"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Extract and parse the first JSON object from text.
3
+ * Handles LLM output that wraps JSON in markdown fences or surrounding text.
4
+ */
5
+ export function parseJsonFromText(text) {
6
+ if (!text)
7
+ return null;
8
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
9
+ if (!jsonMatch)
10
+ return null;
11
+ try {
12
+ return JSON.parse(jsonMatch[0]);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ //# sourceMappingURL=parse-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-json.js","sourceRoot":"","sources":["../../src/scoring/parse-json.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { NormalizedTranscript } from "../transcript/types.js";
2
+ import type { McpCategoryOverrides, SparseIndex } from "../types/scoring.js";
3
+ /**
4
+ * Build a deterministic sparse index from a normalized transcript.
5
+ * Groups entries into interactions, classifies each, and produces compressed lines.
6
+ *
7
+ * Purely deterministic — no LLM calls, no side effects.
8
+ */
9
+ export declare function buildSparseIndex(normalized: NormalizedTranscript, mcpCategoryOverrides?: McpCategoryOverrides): SparseIndex;
10
+ /**
11
+ * Populate the `content` field on each interaction with formatted entry content
12
+ * for display in reports. Mutates interactions in-place.
13
+ */
14
+ export declare function populateInteractionContent(sparseIndex: SparseIndex, normalized: NormalizedTranscript): void;
15
+ //# sourceMappingURL=sparse-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparse-index.d.ts","sourceRoot":"","sources":["../../src/scoring/sparse-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EAAoC,oBAAoB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAS/G;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,oBAAoB,EAChC,oBAAoB,CAAC,EAAE,oBAAoB,GAC1C,WAAW,CAkCb;AAqSD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,GAAG,IAAI,CA2C3G"}
@@ -0,0 +1,338 @@
1
+ import { categorizeInteraction } from "../transcript/categorize.js";
2
+ /** Max characters for the detail portion of a sparse line. */
3
+ const MAX_DETAIL_CHARS = 80;
4
+ /** Max characters for the outcome portion. */
5
+ const MAX_OUTCOME_CHARS = 40;
6
+ /**
7
+ * Build a deterministic sparse index from a normalized transcript.
8
+ * Groups entries into interactions, classifies each, and produces compressed lines.
9
+ *
10
+ * Purely deterministic — no LLM calls, no side effects.
11
+ */
12
+ export function buildSparseIndex(normalized, mcpCategoryOverrides) {
13
+ const { entries } = normalized;
14
+ const interactions = [];
15
+ const lines = [];
16
+ const visited = new Set();
17
+ // Reference timestamp for computing startMs offsets
18
+ const timeZero = entries.length > 0 ? new Date(entries[0].timestamp).getTime() : 0;
19
+ let nextId = 1;
20
+ for (let i = 0; i < entries.length; i++) {
21
+ if (visited.has(i))
22
+ continue;
23
+ const entry = entries[i];
24
+ const interaction = buildInteraction(entry, entries, visited, nextId, timeZero, mcpCategoryOverrides);
25
+ interactions.push(interaction);
26
+ lines.push(interaction.sparseLine);
27
+ nextId++;
28
+ }
29
+ // Second pass: fill in durationMs for interactions that lack it (e.g. assistant thinking)
30
+ // by using the gap to the next interaction's startMs
31
+ for (let i = 0; i < interactions.length; i++) {
32
+ if (interactions[i].durationMs === null && interactions[i].startMs !== null) {
33
+ if (i + 1 < interactions.length && interactions[i + 1].startMs !== null) {
34
+ interactions[i].durationMs = interactions[i + 1].startMs - interactions[i].startMs;
35
+ }
36
+ }
37
+ }
38
+ const stats = computeStats(interactions);
39
+ return { lines, interactions, stats };
40
+ }
41
+ /**
42
+ * Build a single interaction from one or more transcript entries.
43
+ */
44
+ function buildInteraction(entry, entries, visited, id, timeZero, mcpCategoryOverrides) {
45
+ // Consecutive assistant entries merge into one agent interaction
46
+ if (entry.type === "assistant") {
47
+ return buildAssistantInteraction(entry, entries, visited, id, timeZero);
48
+ }
49
+ // tool_use + paired tool_result = 1 interaction
50
+ if (entry.type === "tool_use") {
51
+ return buildToolInteraction(entry, entries, visited, id, timeZero, mcpCategoryOverrides);
52
+ }
53
+ // Standalone error
54
+ if (entry.type === "error") {
55
+ return buildErrorInteraction(entry, visited, id, timeZero);
56
+ }
57
+ // tool_result without a pair, system, user, or other entry types
58
+ return buildStandaloneInteraction(entry, visited, id, timeZero, mcpCategoryOverrides);
59
+ }
60
+ /**
61
+ * Merge consecutive assistant entries into a single agent interaction.
62
+ */
63
+ function buildAssistantInteraction(start, entries, visited, id, timeZero) {
64
+ const indices = [start.index];
65
+ visited.add(start.index);
66
+ // Merge consecutive assistant entries
67
+ let j = start.index + 1;
68
+ while (j < entries.length && entries[j].type === "assistant") {
69
+ indices.push(j);
70
+ visited.add(j);
71
+ j++;
72
+ }
73
+ const text = indices
74
+ .map((idx) => entries[idx].text ?? "")
75
+ .filter(Boolean)
76
+ .join(" ");
77
+ const summary = truncate(text || "(thinking)", MAX_DETAIL_CHARS);
78
+ const contextBytes = textSize(text);
79
+ const sparseLine = formatSparseLine(id, "agent", "assistant", summary);
80
+ return {
81
+ id,
82
+ entryIndices: indices,
83
+ categories: ["agent"],
84
+ sparseLine,
85
+ toolName: null,
86
+ hasError: false,
87
+ durationMs: null,
88
+ startMs: computeStartMs(start.timestamp, timeZero),
89
+ contextBytes,
90
+ };
91
+ }
92
+ /**
93
+ * Build a tool_use interaction, including its paired tool_result if available.
94
+ */
95
+ function buildToolInteraction(entry, entries, visited, id, timeZero, mcpCategoryOverrides) {
96
+ const indices = [entry.index];
97
+ visited.add(entry.index);
98
+ const toolName = entry.toolName ?? "unknown";
99
+ const categories = categorizeInteraction(entry.type, entry.toolName, {
100
+ toolInputSummary: entry.toolInputSummary,
101
+ isNetworkCall: entry.isNetworkCall,
102
+ mcpCategoryOverrides,
103
+ });
104
+ let resultText = null;
105
+ let durationMs = null;
106
+ let hasError = false;
107
+ // Include paired tool_result
108
+ if (entry.pairedIndex !== null && !visited.has(entry.pairedIndex)) {
109
+ const paired = entries[entry.pairedIndex];
110
+ indices.push(entry.pairedIndex);
111
+ visited.add(entry.pairedIndex);
112
+ resultText = paired.toolResultText;
113
+ hasError = paired.isError;
114
+ // Estimate duration from timestamps
115
+ if (entry.timestamp && paired.timestamp) {
116
+ const start = new Date(entry.timestamp).getTime();
117
+ const end = new Date(paired.timestamp).getTime();
118
+ if (start > 0 && end > 0 && end >= start) {
119
+ durationMs = end - start;
120
+ }
121
+ }
122
+ }
123
+ // Check if any following error is within 2 entries (associated error)
124
+ if (!hasError) {
125
+ for (let k = entry.index + 1; k < Math.min(entry.index + 3, entries.length); k++) {
126
+ if (entries[k].type === "error" && !visited.has(k)) {
127
+ hasError = true;
128
+ indices.push(k);
129
+ visited.add(k);
130
+ break;
131
+ }
132
+ }
133
+ }
134
+ const inputSummary = entry.toolInputSummary ? `(${truncate(entry.toolInputSummary, 60)})` : "";
135
+ const detail = `${toolName}${inputSummary}`;
136
+ const inputBytes = entry.toolInput ? textSize(JSON.stringify(entry.toolInput)) : textSize(entry.toolInputSummary);
137
+ const contextBytes = inputBytes + textSize(resultText);
138
+ const outcome = buildOutcome(hasError, durationMs, contextBytes);
139
+ const sparseLine = formatSparseLineWithOutcome(id, categoriesShort(categories), "tool_use", detail, outcome);
140
+ return {
141
+ id,
142
+ entryIndices: indices,
143
+ categories,
144
+ sparseLine,
145
+ toolName,
146
+ hasError,
147
+ durationMs,
148
+ startMs: computeStartMs(entry.timestamp, timeZero),
149
+ contextBytes,
150
+ };
151
+ }
152
+ /**
153
+ * Build a standalone error interaction.
154
+ */
155
+ function buildErrorInteraction(entry, visited, id, timeZero) {
156
+ visited.add(entry.index);
157
+ const message = truncate(entry.errorMessage ?? entry.text ?? "(unknown error)", MAX_DETAIL_CHARS);
158
+ const contextBytes = textSize(entry.errorMessage ?? entry.text);
159
+ const sparseLine = formatSparseLine(id, "error", "error", `"${message}"`);
160
+ return {
161
+ id,
162
+ entryIndices: [entry.index],
163
+ categories: ["agent"],
164
+ sparseLine,
165
+ toolName: null,
166
+ hasError: true,
167
+ durationMs: null,
168
+ startMs: computeStartMs(entry.timestamp, timeZero),
169
+ contextBytes,
170
+ };
171
+ }
172
+ /**
173
+ * Build a standalone interaction for system, user, or orphaned tool_result entries.
174
+ */
175
+ function buildStandaloneInteraction(entry, visited, id, timeZero, mcpCategoryOverrides) {
176
+ visited.add(entry.index);
177
+ const categories = categorizeInteraction(entry.type, entry.toolName, { mcpCategoryOverrides });
178
+ const text = entry.text ?? entry.toolResultText ?? "(no content)";
179
+ const summary = truncate(text, MAX_DETAIL_CHARS);
180
+ const contextBytes = textSize(text);
181
+ const sparseLine = formatSparseLine(id, categoriesShort(categories), entry.type, summary);
182
+ return {
183
+ id,
184
+ entryIndices: [entry.index],
185
+ categories,
186
+ sparseLine,
187
+ toolName: entry.toolName,
188
+ hasError: entry.isError,
189
+ durationMs: null,
190
+ startMs: computeStartMs(entry.timestamp, timeZero),
191
+ contextBytes,
192
+ };
193
+ }
194
+ // --- Timeline helpers ---
195
+ function computeStartMs(timestamp, timeZero) {
196
+ if (!timestamp || !timeZero)
197
+ return null;
198
+ const t = new Date(timestamp).getTime();
199
+ if (!Number.isFinite(t) || t <= 0)
200
+ return null;
201
+ return Math.max(0, t - timeZero);
202
+ }
203
+ // --- Formatting helpers ---
204
+ function formatSparseLine(id, category, type, detail) {
205
+ const idStr = `#${id}`.padEnd(5);
206
+ const catStr = category.padEnd(9);
207
+ const typeStr = type.padEnd(12);
208
+ return `${idStr}${catStr}${typeStr}${detail}`;
209
+ }
210
+ function formatSparseLineWithOutcome(id, category, type, detail, outcome) {
211
+ const idStr = `#${id}`.padEnd(5);
212
+ const catStr = category.padEnd(9);
213
+ const typeStr = type.padEnd(12);
214
+ return `${idStr}${catStr}${typeStr}${detail} -> ${outcome}`;
215
+ }
216
+ function buildOutcome(hasError, durationMs, contextBytes) {
217
+ const parts = [];
218
+ if (hasError) {
219
+ parts.push("error");
220
+ }
221
+ else {
222
+ parts.push("ok");
223
+ }
224
+ if (contextBytes > 0) {
225
+ parts.push(formatSize(contextBytes));
226
+ }
227
+ if (durationMs !== null && durationMs > 0) {
228
+ parts.push(formatDurationShort(durationMs));
229
+ }
230
+ return truncate(parts.join(", "), MAX_OUTCOME_CHARS);
231
+ }
232
+ function categoriesShort(categories) {
233
+ return categories.map((c) => (c === "environment" ? "env" : c)).join(",");
234
+ }
235
+ function formatSize(bytes) {
236
+ if (bytes < 1024)
237
+ return `${bytes}B`;
238
+ return `${(bytes / 1024).toFixed(1)}KB`;
239
+ }
240
+ function formatDurationShort(ms) {
241
+ if (ms < 1000)
242
+ return `${Math.round(ms)}ms`;
243
+ return `${(ms / 1000).toFixed(1)}s`;
244
+ }
245
+ function truncate(text, maxLen) {
246
+ // Collapse whitespace for display
247
+ const clean = text.replace(/\s+/g, " ").trim();
248
+ if (clean.length <= maxLen)
249
+ return clean;
250
+ return clean.slice(0, maxLen - 3) + "...";
251
+ }
252
+ function textSize(text) {
253
+ return text ? new TextEncoder().encode(text).length : 0;
254
+ }
255
+ // --- Content population ---
256
+ /** Max characters of content to store per interaction for report display. */
257
+ const MAX_CONTENT_PER_INTERACTION = 2_000;
258
+ /**
259
+ * Populate the `content` field on each interaction with formatted entry content
260
+ * for display in reports. Mutates interactions in-place.
261
+ */
262
+ export function populateInteractionContent(sparseIndex, normalized) {
263
+ for (const interaction of sparseIndex.interactions) {
264
+ const parts = [];
265
+ for (const idx of interaction.entryIndices) {
266
+ const entry = normalized.entries[idx];
267
+ if (!entry)
268
+ continue;
269
+ switch (entry.type) {
270
+ case "assistant":
271
+ parts.push(`[ASSISTANT] ${entry.text ?? "(no text)"}`);
272
+ break;
273
+ case "tool_use": {
274
+ parts.push(`[TOOL_USE] ${entry.toolName ?? "unknown"}`);
275
+ if (entry.toolInputSummary)
276
+ parts.push(` Input: ${entry.toolInputSummary}`);
277
+ if (entry.toolInput) {
278
+ const inputStr = JSON.stringify(entry.toolInput);
279
+ parts.push(` Full input: ${inputStr.length > 800 ? inputStr.slice(0, 800) + "..." : inputStr}`);
280
+ }
281
+ break;
282
+ }
283
+ case "tool_result":
284
+ parts.push(`[TOOL_RESULT]`);
285
+ if (entry.toolResultText) {
286
+ const result = entry.toolResultText.length > 1200 ? entry.toolResultText.slice(0, 1200) + "..." : entry.toolResultText;
287
+ parts.push(` Result: ${result}`);
288
+ }
289
+ break;
290
+ case "error":
291
+ parts.push(`[ERROR] ${entry.errorMessage ?? entry.text ?? "(unknown error)"}`);
292
+ break;
293
+ default:
294
+ parts.push(`[${entry.type.toUpperCase()}] ${entry.text ?? "(no content)"}`);
295
+ }
296
+ }
297
+ const content = parts.join("\n");
298
+ interaction.content =
299
+ content.length > MAX_CONTENT_PER_INTERACTION
300
+ ? content.slice(0, MAX_CONTENT_PER_INTERACTION) + "\n... (truncated)"
301
+ : content;
302
+ }
303
+ }
304
+ // --- Stats ---
305
+ function computeStats(interactions) {
306
+ const byCategory = {
307
+ environment: 0,
308
+ service: 0,
309
+ agent: 0,
310
+ };
311
+ let totalErrors = 0;
312
+ let totalDurationMs = 0;
313
+ for (const interaction of interactions) {
314
+ for (const cat of interaction.categories) {
315
+ byCategory[cat]++;
316
+ }
317
+ if (interaction.hasError)
318
+ totalErrors++;
319
+ if (interaction.durationMs !== null)
320
+ totalDurationMs += interaction.durationMs;
321
+ }
322
+ // Wall-clock elapsed time from first interaction start to last interaction end
323
+ let wallClockMs = 0;
324
+ if (interactions.length > 0) {
325
+ const last = interactions[interactions.length - 1];
326
+ if (last.startMs !== null) {
327
+ wallClockMs = last.startMs + (last.durationMs ?? 0);
328
+ }
329
+ }
330
+ return {
331
+ totalInteractions: interactions.length,
332
+ byCategory,
333
+ totalErrors,
334
+ totalDurationMs,
335
+ wallClockMs,
336
+ };
337
+ }
338
+ //# sourceMappingURL=sparse-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparse-index.js","sourceRoot":"","sources":["../../src/scoring/sparse-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,8DAA8D;AAC9D,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,8CAA8C;AAC9C,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAgC,EAChC,oBAA2C;IAE3C,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;IAC/B,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,oDAAoD;IACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAE7B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QACtG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC;IACX,CAAC;IAED,0FAA0F;IAC1F,qDAAqD;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5E,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACxE,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,OAAQ,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAEzC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,KAAsB,EACtB,OAA0B,EAC1B,OAAoB,EACpB,EAAU,EACV,QAAgB,EAChB,oBAA2C;IAE3C,iEAAiE;IACjE,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,gDAAgD;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC3F,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,iEAAiE;IACjE,OAAO,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAChC,KAAsB,EACtB,OAA0B,EAC1B,OAAoB,EACpB,EAAU,EACV,QAAgB;IAEhB,MAAM,OAAO,GAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,sCAAsC;IACtC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,CAAC,EAAE,CAAC;IACN,CAAC;IAED,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;SACrC,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEvE,OAAO;QACL,EAAE;QACF,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,CAAC,OAAO,CAAC;QACrB,UAAU;QACV,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC;QAClD,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,KAAsB,EACtB,OAA0B,EAC1B,OAAoB,EACpB,EAAU,EACV,QAAgB,EAChB,oBAA2C;IAE3C,MAAM,OAAO,GAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC;IAC7C,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;QACnE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,oBAAoB;KACrB,CAAC,CAAC;IAEH,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,6BAA6B;IAC7B,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;QACnC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAE1B,oCAAoC;QACpC,IAAI,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YACjD,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACzC,UAAU,GAAG,GAAG,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACjF,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACf,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,MAAM,MAAM,GAAG,GAAG,QAAQ,GAAG,YAAY,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAClH,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,2BAA2B,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7G,OAAO;QACL,EAAE;QACF,YAAY,EAAE,OAAO;QACrB,UAAU;QACV,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC;QAClD,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,KAAsB,EACtB,OAAoB,EACpB,EAAU,EACV,QAAgB;IAEhB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,IAAI,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAClG,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC;IAE1E,OAAO;QACL,EAAE;QACF,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B,UAAU,EAAE,CAAC,OAAO,CAAC;QACrB,UAAU;QACV,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC;QAClD,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B,CACjC,KAAsB,EACtB,OAAoB,EACpB,EAAU,EACV,QAAgB,EAChB,oBAA2C;IAE3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,cAAc,IAAI,cAAc,CAAC;IAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1F,OAAO;QACL,EAAE;QACF,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B,UAAU;QACV,UAAU;QACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,OAAO;QACvB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC;QAClD,YAAY;KACb,CAAC;AACJ,CAAC;AAED,2BAA2B;AAE3B,SAAS,cAAc,CAAC,SAAiB,EAAE,QAAgB;IACzD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,6BAA6B;AAE7B,SAAS,gBAAgB,CAAC,EAAU,EAAE,QAAgB,EAAE,IAAY,EAAE,MAAc;IAClF,MAAM,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChC,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,2BAA2B,CAClC,EAAU,EACV,QAAgB,EAChB,IAAY,EACZ,MAAc,EACd,OAAe;IAEf,MAAM,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChC,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,OAAO,OAAO,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,YAAY,CAAC,QAAiB,EAAE,UAAyB,EAAE,YAAoB;IACtF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,UAAiC;IACxD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU;IACrC,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC;IAC5C,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAc;IAC5C,kCAAkC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC5C,CAAC;AAED,SAAS,QAAQ,CAAC,IAA+B;IAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,6BAA6B;AAE7B,6EAA6E;AAC7E,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAwB,EAAE,UAAgC;IACnG,KAAK,MAAM,WAAW,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;QACnD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,WAAW;oBACd,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;oBACvD,MAAM;gBACR,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;oBACxD,IAAI,KAAK,CAAC,gBAAgB;wBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;oBAC7E,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;wBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBACjD,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACnG,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,aAAa;oBAChB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBAC5B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;wBACzB,MAAM,MAAM,GACV,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;wBAC1G,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;oBACpC,CAAC;oBACD,MAAM;gBACR,KAAK,OAAO;oBACV,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,IAAI,iBAAiB,EAAE,CAAC,CAAC;oBAC/E,MAAM;gBACR;oBACE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,WAAW,CAAC,OAAO;YACjB,OAAO,CAAC,MAAM,GAAG,2BAA2B;gBAC1C,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,GAAG,mBAAmB;gBACrE,CAAC,CAAC,OAAO,CAAC;IAChB,CAAC;AACH,CAAC;AAED,gBAAgB;AAEhB,SAAS,YAAY,CAAC,YAA2B;IAC/C,MAAM,UAAU,GAAwC;QACtD,WAAW,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,CAAC;KACT,CAAC;IAEF,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YACzC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,WAAW,CAAC,QAAQ;YAAE,WAAW,EAAE,CAAC;QACxC,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI;YAAE,eAAe,IAAI,WAAW,CAAC,UAAU,CAAC;IACjF,CAAC;IAED,+EAA+E;IAC/E,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,YAAY,CAAC,MAAM;QACtC,UAAU;QACV,WAAW;QACX,eAAe;QACf,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { RunResult } from "../types/output.js";
2
+ import type { SparseIndex, TriageResult } from "../types/scoring.js";
3
+ /**
4
+ * Run the triage LLM pass on a sparse index.
5
+ * Scans the compressed transcript for patterns, classifies interactions,
6
+ * and flags areas of concern for deep evaluation.
7
+ *
8
+ * Returns an empty triage result on failure (no flags, no patterns).
9
+ */
10
+ export declare function runTriage(result: RunResult, sparseIndex: SparseIndex): Promise<TriageResult>;
11
+ /**
12
+ * Parse the triage LLM response. Returns empty result on failure.
13
+ */
14
+ export declare function parseTriageResponse(responseText: string): TriageResult;
15
+ //# sourceMappingURL=triage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/scoring/triage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAEV,WAAW,EAGX,YAAY,EACb,MAAM,qBAAqB,CAAC;AAS7B;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAIlG;AA4FD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,CAmBtE"}