@tangle-network/browser-agent-driver 0.6.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 (208) hide show
  1. package/LICENSE +196 -0
  2. package/README.md +149 -0
  3. package/dist/artifacts/composite-sink.d.ts +15 -0
  4. package/dist/artifacts/composite-sink.d.ts.map +1 -0
  5. package/dist/artifacts/composite-sink.js +27 -0
  6. package/dist/artifacts/composite-sink.js.map +1 -0
  7. package/dist/artifacts/filesystem-sink.d.ts +26 -0
  8. package/dist/artifacts/filesystem-sink.d.ts.map +1 -0
  9. package/dist/artifacts/filesystem-sink.js +81 -0
  10. package/dist/artifacts/filesystem-sink.js.map +1 -0
  11. package/dist/artifacts/types.d.ts +97 -0
  12. package/dist/artifacts/types.d.ts.map +1 -0
  13. package/dist/artifacts/types.js +9 -0
  14. package/dist/artifacts/types.js.map +1 -0
  15. package/dist/artifacts/webhook-sink.d.ts +71 -0
  16. package/dist/artifacts/webhook-sink.d.ts.map +1 -0
  17. package/dist/artifacts/webhook-sink.js +117 -0
  18. package/dist/artifacts/webhook-sink.js.map +1 -0
  19. package/dist/brain/index.d.ts +149 -0
  20. package/dist/brain/index.d.ts.map +1 -0
  21. package/dist/brain/index.js +1030 -0
  22. package/dist/brain/index.js.map +1 -0
  23. package/dist/browser-launch.d.ts +27 -0
  24. package/dist/browser-launch.d.ts.map +1 -0
  25. package/dist/browser-launch.js +92 -0
  26. package/dist/browser-launch.js.map +1 -0
  27. package/dist/cli.d.ts +14 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +1035 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/config.d.ts +143 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +205 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/context-budget.d.ts +14 -0
  36. package/dist/context-budget.d.ts.map +1 -0
  37. package/dist/context-budget.js +39 -0
  38. package/dist/context-budget.js.map +1 -0
  39. package/dist/design-audit.d.ts +48 -0
  40. package/dist/design-audit.d.ts.map +1 -0
  41. package/dist/design-audit.js +172 -0
  42. package/dist/design-audit.js.map +1 -0
  43. package/dist/domain-policy.d.ts +4 -0
  44. package/dist/domain-policy.d.ts.map +1 -0
  45. package/dist/domain-policy.js +69 -0
  46. package/dist/domain-policy.js.map +1 -0
  47. package/dist/drivers/block-patterns.d.ts +11 -0
  48. package/dist/drivers/block-patterns.d.ts.map +1 -0
  49. package/dist/drivers/block-patterns.js +123 -0
  50. package/dist/drivers/block-patterns.js.map +1 -0
  51. package/dist/drivers/cdp-page-state.d.ts +22 -0
  52. package/dist/drivers/cdp-page-state.d.ts.map +1 -0
  53. package/dist/drivers/cdp-page-state.js +38 -0
  54. package/dist/drivers/cdp-page-state.js.map +1 -0
  55. package/dist/drivers/cdp-snapshot.d.ts +32 -0
  56. package/dist/drivers/cdp-snapshot.d.ts.map +1 -0
  57. package/dist/drivers/cdp-snapshot.js +120 -0
  58. package/dist/drivers/cdp-snapshot.js.map +1 -0
  59. package/dist/drivers/playwright.d.ts +84 -0
  60. package/dist/drivers/playwright.d.ts.map +1 -0
  61. package/dist/drivers/playwright.js +385 -0
  62. package/dist/drivers/playwright.js.map +1 -0
  63. package/dist/drivers/snapshot.d.ts +134 -0
  64. package/dist/drivers/snapshot.d.ts.map +1 -0
  65. package/dist/drivers/snapshot.js +354 -0
  66. package/dist/drivers/snapshot.js.map +1 -0
  67. package/dist/drivers/types.d.ts +37 -0
  68. package/dist/drivers/types.d.ts.map +1 -0
  69. package/dist/drivers/types.js +5 -0
  70. package/dist/drivers/types.js.map +1 -0
  71. package/dist/env-loader.d.ts +2 -0
  72. package/dist/env-loader.d.ts.map +1 -0
  73. package/dist/env-loader.js +35 -0
  74. package/dist/env-loader.js.map +1 -0
  75. package/dist/formatters/slack.d.ts +37 -0
  76. package/dist/formatters/slack.d.ts.map +1 -0
  77. package/dist/formatters/slack.js +97 -0
  78. package/dist/formatters/slack.js.map +1 -0
  79. package/dist/index.d.ts +60 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +53 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/memory/analyzer.d.ts +67 -0
  84. package/dist/memory/analyzer.d.ts.map +1 -0
  85. package/dist/memory/analyzer.js +265 -0
  86. package/dist/memory/analyzer.js.map +1 -0
  87. package/dist/memory/knowledge.d.ts +55 -0
  88. package/dist/memory/knowledge.d.ts.map +1 -0
  89. package/dist/memory/knowledge.js +115 -0
  90. package/dist/memory/knowledge.js.map +1 -0
  91. package/dist/memory/project-store.d.ts +43 -0
  92. package/dist/memory/project-store.d.ts.map +1 -0
  93. package/dist/memory/project-store.js +119 -0
  94. package/dist/memory/project-store.js.map +1 -0
  95. package/dist/memory/selectors.d.ts +46 -0
  96. package/dist/memory/selectors.d.ts.map +1 -0
  97. package/dist/memory/selectors.js +89 -0
  98. package/dist/memory/selectors.js.map +1 -0
  99. package/dist/memory/store.d.ts +39 -0
  100. package/dist/memory/store.d.ts.map +1 -0
  101. package/dist/memory/store.js +193 -0
  102. package/dist/memory/store.js.map +1 -0
  103. package/dist/model-pricing.d.ts +41 -0
  104. package/dist/model-pricing.d.ts.map +1 -0
  105. package/dist/model-pricing.js +197 -0
  106. package/dist/model-pricing.js.map +1 -0
  107. package/dist/multi-actor.d.ts +108 -0
  108. package/dist/multi-actor.d.ts.map +1 -0
  109. package/dist/multi-actor.js +192 -0
  110. package/dist/multi-actor.js.map +1 -0
  111. package/dist/override-pipeline.d.ts +57 -0
  112. package/dist/override-pipeline.d.ts.map +1 -0
  113. package/dist/override-pipeline.js +26 -0
  114. package/dist/override-pipeline.js.map +1 -0
  115. package/dist/personas.d.ts +19 -0
  116. package/dist/personas.d.ts.map +1 -0
  117. package/dist/personas.js +86 -0
  118. package/dist/personas.js.map +1 -0
  119. package/dist/preview.d.ts +32 -0
  120. package/dist/preview.d.ts.map +1 -0
  121. package/dist/preview.js +138 -0
  122. package/dist/preview.js.map +1 -0
  123. package/dist/provider-defaults.d.ts +6 -0
  124. package/dist/provider-defaults.d.ts.map +1 -0
  125. package/dist/provider-defaults.js +40 -0
  126. package/dist/provider-defaults.js.map +1 -0
  127. package/dist/providers/sandbox-backend.d.ts +22 -0
  128. package/dist/providers/sandbox-backend.d.ts.map +1 -0
  129. package/dist/providers/sandbox-backend.js +259 -0
  130. package/dist/providers/sandbox-backend.js.map +1 -0
  131. package/dist/recovery.d.ts +91 -0
  132. package/dist/recovery.d.ts.map +1 -0
  133. package/dist/recovery.js +500 -0
  134. package/dist/recovery.js.map +1 -0
  135. package/dist/reporters/junit.d.ts +8 -0
  136. package/dist/reporters/junit.d.ts.map +1 -0
  137. package/dist/reporters/junit.js +99 -0
  138. package/dist/reporters/junit.js.map +1 -0
  139. package/dist/run-metrics.d.ts +4 -0
  140. package/dist/run-metrics.d.ts.map +1 -0
  141. package/dist/run-metrics.js +48 -0
  142. package/dist/run-metrics.js.map +1 -0
  143. package/dist/run-state.d.ts +22 -0
  144. package/dist/run-state.d.ts.map +1 -0
  145. package/dist/run-state.js +33 -0
  146. package/dist/run-state.js.map +1 -0
  147. package/dist/runner/goal-verification.d.ts +13 -0
  148. package/dist/runner/goal-verification.d.ts.map +1 -0
  149. package/dist/runner/goal-verification.js +152 -0
  150. package/dist/runner/goal-verification.js.map +1 -0
  151. package/dist/runner/index.d.ts +12 -0
  152. package/dist/runner/index.d.ts.map +1 -0
  153. package/dist/runner/index.js +18 -0
  154. package/dist/runner/index.js.map +1 -0
  155. package/dist/runner/overrides.d.ts +75 -0
  156. package/dist/runner/overrides.d.ts.map +1 -0
  157. package/dist/runner/overrides.js +385 -0
  158. package/dist/runner/overrides.js.map +1 -0
  159. package/dist/runner/page-analysis.d.ts +23 -0
  160. package/dist/runner/page-analysis.d.ts.map +1 -0
  161. package/dist/runner/page-analysis.js +91 -0
  162. package/dist/runner/page-analysis.js.map +1 -0
  163. package/dist/runner/runner.d.ts +66 -0
  164. package/dist/runner/runner.d.ts.map +1 -0
  165. package/dist/runner/runner.js +1314 -0
  166. package/dist/runner/runner.js.map +1 -0
  167. package/dist/runner/scout.d.ts +29 -0
  168. package/dist/runner/scout.d.ts.map +1 -0
  169. package/dist/runner/scout.js +81 -0
  170. package/dist/runner/scout.js.map +1 -0
  171. package/dist/runner/search-guidance.d.ts +31 -0
  172. package/dist/runner/search-guidance.d.ts.map +1 -0
  173. package/dist/runner/search-guidance.js +210 -0
  174. package/dist/runner/search-guidance.js.map +1 -0
  175. package/dist/runner/utils.d.ts +28 -0
  176. package/dist/runner/utils.d.ts.map +1 -0
  177. package/dist/runner/utils.js +119 -0
  178. package/dist/runner/utils.js.map +1 -0
  179. package/dist/runner.d.ts +8 -0
  180. package/dist/runner.d.ts.map +1 -0
  181. package/dist/runner.js +21 -0
  182. package/dist/runner.js.map +1 -0
  183. package/dist/supervisor/critic.d.ts +29 -0
  184. package/dist/supervisor/critic.d.ts.map +1 -0
  185. package/dist/supervisor/critic.js +320 -0
  186. package/dist/supervisor/critic.js.map +1 -0
  187. package/dist/supervisor/policy.d.ts +11 -0
  188. package/dist/supervisor/policy.d.ts.map +1 -0
  189. package/dist/supervisor/policy.js +118 -0
  190. package/dist/supervisor/policy.js.map +1 -0
  191. package/dist/test-report.d.ts +15 -0
  192. package/dist/test-report.d.ts.map +1 -0
  193. package/dist/test-report.js +241 -0
  194. package/dist/test-report.js.map +1 -0
  195. package/dist/test-runner.d.ts +99 -0
  196. package/dist/test-runner.d.ts.map +1 -0
  197. package/dist/test-runner.js +1075 -0
  198. package/dist/test-runner.js.map +1 -0
  199. package/dist/types.d.ts +493 -0
  200. package/dist/types.d.ts.map +1 -0
  201. package/dist/types.js +5 -0
  202. package/dist/types.js.map +1 -0
  203. package/dist/wallet/automation.d.ts +52 -0
  204. package/dist/wallet/automation.d.ts.map +1 -0
  205. package/dist/wallet/automation.js +507 -0
  206. package/dist/wallet/automation.js.map +1 -0
  207. package/package.json +101 -0
  208. package/scripts/postinstall-provider-patches.mjs +52 -0
@@ -0,0 +1,118 @@
1
+ import { snapshotHash } from '../recovery.js';
2
+ const DEFAULT_WINDOW = 4;
3
+ export function detectSupervisorSignal(input) {
4
+ const window = Math.max(3, input.window ?? DEFAULT_WINDOW);
5
+ const recent = input.recentTurns.slice(-window);
6
+ if (recent.length < 2) {
7
+ return {
8
+ severity: 'none',
9
+ reasons: [],
10
+ repeatedActionCount: 0,
11
+ unchangedTurns: 0,
12
+ errorTurns: 0,
13
+ verificationFailures: 0,
14
+ };
15
+ }
16
+ const fingerprints = [
17
+ ...recent.map((turn) => pageFingerprint(turn.state)),
18
+ pageFingerprint(input.currentState),
19
+ ];
20
+ const unchangedTurns = trailingSameCount(fingerprints);
21
+ const actionSignatures = recent
22
+ .map((turn) => actionSignature(turn.action))
23
+ .filter((signature) => signature !== 'wait');
24
+ const repeatedActionCount = trailingSameCount(actionSignatures);
25
+ const errorTurns = recent.filter((turn) => Boolean(turn.error)).length;
26
+ const verificationFailures = recent.filter((turn) => Boolean(turn.verificationFailure)).length;
27
+ const remainingTurns = Math.max(0, input.maxTurns - input.currentTurn);
28
+ const hardReasons = [];
29
+ if (unchangedTurns >= 4 && repeatedActionCount >= 3) {
30
+ hardReasons.push('same-page repeated action loop');
31
+ }
32
+ if (errorTurns >= 3) {
33
+ hardReasons.push('error burst');
34
+ }
35
+ if (unchangedTurns >= 4 && verificationFailures >= 2) {
36
+ hardReasons.push('verification deadlock');
37
+ }
38
+ if (remainingTurns <= 3 && (unchangedTurns >= 3 || errorTurns >= 2)) {
39
+ hardReasons.push('endgame stall with low turn budget');
40
+ }
41
+ const softReasons = [];
42
+ if (unchangedTurns >= 3)
43
+ softReasons.push('page unchanged');
44
+ if (repeatedActionCount >= 2)
45
+ softReasons.push('action repetition');
46
+ if (errorTurns >= 2)
47
+ softReasons.push('repeat execution errors');
48
+ if (verificationFailures >= 1)
49
+ softReasons.push('verification mismatch');
50
+ const reasons = hardReasons.length > 0 ? hardReasons : softReasons;
51
+ const severity = hardReasons.length > 0 ? 'hard' : (softReasons.length > 0 ? 'soft' : 'none');
52
+ return {
53
+ severity,
54
+ reasons,
55
+ repeatedActionCount,
56
+ unchangedTurns,
57
+ errorTurns,
58
+ verificationFailures,
59
+ };
60
+ }
61
+ export function formatSupervisorSignal(signal) {
62
+ if (signal.severity === 'none')
63
+ return 'no stall signal';
64
+ return [
65
+ `severity=${signal.severity}`,
66
+ `reasons=${signal.reasons.join(', ')}`,
67
+ `unchanged=${signal.unchangedTurns}`,
68
+ `repeatedActions=${signal.repeatedActionCount}`,
69
+ `errors=${signal.errorTurns}`,
70
+ `verificationFailures=${signal.verificationFailures}`,
71
+ ].join(' | ');
72
+ }
73
+ function pageFingerprint(state) {
74
+ return `${state.url}#${snapshotHash(state.snapshot)}`;
75
+ }
76
+ function trailingSameCount(values) {
77
+ if (values.length === 0)
78
+ return 0;
79
+ const last = values[values.length - 1];
80
+ let count = 0;
81
+ for (let i = values.length - 1; i >= 0; i--) {
82
+ if (values[i] !== last)
83
+ break;
84
+ count++;
85
+ }
86
+ return count;
87
+ }
88
+ function actionSignature(action) {
89
+ switch (action.action) {
90
+ case 'click':
91
+ return `click:${action.selector}`;
92
+ case 'type':
93
+ return `type:${action.selector}:${action.text.slice(0, 64)}`;
94
+ case 'press':
95
+ return `press:${action.selector}:${action.key}`;
96
+ case 'hover':
97
+ return `hover:${action.selector}`;
98
+ case 'select':
99
+ return `select:${action.selector}:${action.value}`;
100
+ case 'scroll':
101
+ return `scroll:${action.direction}:${action.amount ?? 500}:${action.selector ?? 'viewport'}`;
102
+ case 'navigate':
103
+ return `navigate:${action.url}`;
104
+ case 'wait':
105
+ return 'wait';
106
+ case 'evaluate':
107
+ return `evaluate:${action.criteria}`;
108
+ case 'runScript':
109
+ return `runScript:${action.script.slice(0, 64)}`;
110
+ case 'verifyPreview':
111
+ return 'verifyPreview';
112
+ case 'complete':
113
+ return 'complete';
114
+ case 'abort':
115
+ return 'abort';
116
+ }
117
+ }
118
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/supervisor/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Test Report Generation — markdown, JSON, HTML output + comparison.
3
+ */
4
+ import type { TestSuiteResult } from './types.js';
5
+ export interface ReportOptions {
6
+ format: 'json' | 'markdown' | 'html' | 'junit';
7
+ /** Include last N turns per test in report */
8
+ includeTurns?: boolean;
9
+ /** Include screenshots in report */
10
+ includeScreenshots?: boolean;
11
+ }
12
+ export declare function generateReport(suite: TestSuiteResult, options: ReportOptions): string;
13
+ /** Compare two suite results (e.g., before/after improvement) */
14
+ export declare function compareReports(before: TestSuiteResult, after: TestSuiteResult): string;
15
+ //# sourceMappingURL=test-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-report.d.ts","sourceRoot":"","sources":["../src/test-report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oCAAoC;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAarF;AAoMD,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAyCtF"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Test Report Generation — markdown, JSON, HTML output + comparison.
3
+ */
4
+ import { generateJUnitXml } from './reporters/junit.js';
5
+ export function generateReport(suite, options) {
6
+ switch (options.format) {
7
+ case 'json':
8
+ return JSON.stringify(suite, null, 2);
9
+ case 'markdown':
10
+ return generateMarkdownReport(suite, options);
11
+ case 'html':
12
+ return generateHtmlReport(suite);
13
+ case 'junit':
14
+ return generateJUnitXml(suite);
15
+ default:
16
+ throw new Error(`Unknown format: ${options.format}`);
17
+ }
18
+ }
19
+ function generateMarkdownReport(suite, options) {
20
+ const lines = [];
21
+ const { summary, results } = suite;
22
+ lines.push('# Test Suite Report\n');
23
+ lines.push(`**Model:** ${suite.model}`);
24
+ if (suite.runtime) {
25
+ lines.push(`**Runtime:** ${suite.runtime.provider}${suite.runtime.sandboxBackendType ? ` -> ${suite.runtime.sandboxBackendType}` : ''}${suite.runtime.sandboxBackendProfile ? ` (${suite.runtime.sandboxBackendProfile})` : ''}`);
26
+ }
27
+ lines.push(`**Date:** ${suite.timestamp}`);
28
+ lines.push(`**Pass Rate:** ${(summary.passRate * 100).toFixed(1)}% (${summary.passed}/${summary.total})`);
29
+ lines.push(`**Duration:** ${(summary.totalDurationMs / 1000).toFixed(1)}s\n`);
30
+ // Summary metrics
31
+ lines.push('## Summary\n');
32
+ lines.push('| Metric | Value |');
33
+ lines.push('|--------|-------|');
34
+ lines.push(`| Total | ${summary.total} |`);
35
+ lines.push(`| Passed | ${summary.passed} |`);
36
+ lines.push(`| Failed | ${summary.failed} |`);
37
+ lines.push(`| Skipped | ${summary.skipped} |`);
38
+ lines.push(`| Avg Turns | ${summary.avgTurns.toFixed(1)} |`);
39
+ lines.push(`| Avg Tokens | ${summary.avgTokens.toFixed(0)} |`);
40
+ lines.push(`| Avg Duration | ${(summary.avgDurationMs / 1000).toFixed(1)}s |`);
41
+ lines.push(`| p50 Duration | ${(summary.p50DurationMs / 1000).toFixed(1)}s |`);
42
+ lines.push(`| p95 Duration | ${(summary.p95DurationMs / 1000).toFixed(1)}s |`);
43
+ // Per-test results
44
+ lines.push('\n## Results\n');
45
+ lines.push('| Test | Category | Agent | Verified | Turns | Tokens | Duration |');
46
+ lines.push('|------|----------|-------|----------|-------|--------|----------|');
47
+ for (const r of results) {
48
+ const agent = r.skipped ? 'SKIP' : r.agentSuccess ? 'Y' : 'N';
49
+ const verified = r.skipped ? 'SKIP' : r.verified ? 'PASS' : 'FAIL';
50
+ const duration = r.skipped ? '-' : `${(r.durationMs / 1000).toFixed(1)}s`;
51
+ const category = esc(r.testCase.category || '-');
52
+ lines.push(`| ${esc(r.testCase.name)} | ${category} | ${agent} | ${verified} | ${r.turnsUsed} | ${r.tokensUsed} | ${duration} |`);
53
+ }
54
+ // Failure details
55
+ const failures = results.filter((r) => !r.skipped && !r.verified);
56
+ if (failures.length > 0) {
57
+ lines.push('\n## Failures\n');
58
+ for (const r of failures) {
59
+ lines.push(`### ${esc(r.testCase.name)} (${r.testCase.id})\n`);
60
+ lines.push(`- **Goal:** ${esc(r.testCase.goal.slice(0, 150))}`);
61
+ lines.push(`- **Agent reported:** ${r.agentSuccess ? 'success' : 'failure'}`);
62
+ lines.push(`- **Verdict:** ${esc(r.verdict)}`);
63
+ lines.push(`- **Turns:** ${r.turnsUsed}/${r.testCase.maxTurns ?? 30}`);
64
+ if (r.phaseTimings) {
65
+ const phaseSummary = [
66
+ fmtPhase('navigate', r.phaseTimings.initialNavigateMs),
67
+ fmtPhase('observe', r.phaseTimings.firstObserveMs),
68
+ fmtPhase('decide', r.phaseTimings.firstDecideMs),
69
+ fmtPhase('execute', r.phaseTimings.firstExecuteMs),
70
+ ].filter(Boolean).join(', ');
71
+ if (phaseSummary) {
72
+ lines.push(`- **Phase timings:** ${phaseSummary}`);
73
+ }
74
+ }
75
+ if (r.startupDiagnostics) {
76
+ const startupSummary = [
77
+ `first turn seen ${r.startupDiagnostics.firstTurnSeen ? 'yes' : 'no'}`,
78
+ r.startupDiagnostics.timeToFirstTurnMs !== undefined
79
+ ? `time to first turn ${(r.startupDiagnostics.timeToFirstTurnMs / 1000).toFixed(1)}s`
80
+ : '',
81
+ r.startupDiagnostics.zeroTurnFailureClass
82
+ ? `zero-turn class ${r.startupDiagnostics.zeroTurnFailureClass}`
83
+ : '',
84
+ ].filter(Boolean).join(', ');
85
+ if (startupSummary) {
86
+ lines.push(`- **Startup:** ${startupSummary}`);
87
+ }
88
+ }
89
+ if (r.wasteMetrics) {
90
+ lines.push(`- **Waste:** repeated queries ${r.wasteMetrics.repeatedQueryCount}, ` +
91
+ `verification rejections ${r.wasteMetrics.verificationRejectionCount}, ` +
92
+ `turns after evidence ${r.wasteMetrics.turnsAfterSufficientEvidence}, ` +
93
+ `error turns ${r.wasteMetrics.errorTurns}`);
94
+ }
95
+ if (r.criteriaResults?.length) {
96
+ lines.push('- **Criteria:**');
97
+ for (const c of r.criteriaResults) {
98
+ const icon = c.passed ? 'PASS' : 'FAIL';
99
+ const desc = c.criterion.description || c.criterion.type;
100
+ lines.push(` - [${icon}] ${esc(desc)}${c.detail ? ': ' + esc(c.detail) : ''}`);
101
+ }
102
+ }
103
+ // Last actions for debugging
104
+ const lastTurns = r.agentResult.turns.slice(-5);
105
+ if (lastTurns.length > 0) {
106
+ lines.push('- **Last actions:**');
107
+ for (const t of lastTurns) {
108
+ const actionStr = JSON.stringify(t.action).slice(0, 100);
109
+ const verified = t.verified === false ? ' [UNVERIFIED]' : '';
110
+ lines.push(` - Turn ${t.turn}: ${esc(actionStr)}${verified}`);
111
+ }
112
+ }
113
+ lines.push('');
114
+ }
115
+ }
116
+ // Optional turn logs
117
+ if (options.includeTurns) {
118
+ const nonSkipped = results.filter((r) => !r.skipped && r.agentResult.turns.length > 0);
119
+ if (nonSkipped.length > 0) {
120
+ lines.push('\n## Turn Logs\n');
121
+ for (const r of nonSkipped) {
122
+ lines.push(`### ${r.verified ? 'PASS' : 'FAIL'} ${esc(r.testCase.name)}\n`);
123
+ lines.push('<details><summary>Turn Log</summary>\n');
124
+ for (const turn of r.agentResult.turns.slice(-10)) {
125
+ lines.push(`- Turn ${turn.turn}: \`${esc(JSON.stringify(turn.action))}\``);
126
+ if (turn.reasoning) {
127
+ lines.push(` - Reasoning: ${esc(turn.reasoning.slice(0, 100))}`);
128
+ }
129
+ }
130
+ lines.push('\n</details>\n');
131
+ }
132
+ }
133
+ }
134
+ return lines.join('\n');
135
+ }
136
+ function generateHtmlReport(suite) {
137
+ const { summary } = suite;
138
+ return `<!DOCTYPE html>
139
+ <html>
140
+ <head>
141
+ <title>Test Suite Report</title>
142
+ <style>
143
+ body { font-family: system-ui, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }
144
+ .passed { color: #22c55e; }
145
+ .failed { color: #ef4444; }
146
+ .skipped { color: #9ca3af; }
147
+ .summary { display: flex; gap: 20px; margin: 20px 0; }
148
+ .summary-card { padding: 20px; border-radius: 8px; background: #f3f4f6; min-width: 100px; }
149
+ table { width: 100%; border-collapse: collapse; margin: 20px 0; }
150
+ th, td { padding: 12px; text-align: left; border-bottom: 1px solid #e5e7eb; }
151
+ th { background: #f9fafb; font-weight: 600; }
152
+ .metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin: 16px 0; }
153
+ .metric { padding: 12px; background: #f9fafb; border-radius: 6px; }
154
+ .metric-value { font-size: 1.5em; font-weight: 700; }
155
+ .metric-label { font-size: 0.85em; color: #6b7280; }
156
+ </style>
157
+ </head>
158
+ <body>
159
+ <h1>Test Suite Report</h1>
160
+ <p><strong>Model:</strong> ${suite.model}${suite.runtime ? ` | <strong>Runtime:</strong> ${suite.runtime.provider}${suite.runtime.sandboxBackendType ? ` -> ${suite.runtime.sandboxBackendType}` : ''}${suite.runtime.sandboxBackendProfile ? ` (${suite.runtime.sandboxBackendProfile})` : ''}` : ''} | <strong>Date:</strong> ${suite.timestamp} | <strong>Duration:</strong> ${(summary.totalDurationMs / 1000).toFixed(1)}s</p>
161
+
162
+ <div class="summary">
163
+ <div class="summary-card"><div class="metric-value passed">${summary.passed}</div><div class="metric-label">Passed</div></div>
164
+ <div class="summary-card"><div class="metric-value failed">${summary.failed}</div><div class="metric-label">Failed</div></div>
165
+ <div class="summary-card"><div class="metric-value skipped">${summary.skipped}</div><div class="metric-label">Skipped</div></div>
166
+ <div class="summary-card"><div class="metric-value">${(summary.passRate * 100).toFixed(0)}%</div><div class="metric-label">Pass Rate</div></div>
167
+ </div>
168
+
169
+ <div class="metrics">
170
+ <div class="metric"><div class="metric-value">${summary.avgTurns.toFixed(1)}</div><div class="metric-label">Avg Turns</div></div>
171
+ <div class="metric"><div class="metric-value">${summary.avgTokens.toFixed(0)}</div><div class="metric-label">Avg Tokens</div></div>
172
+ <div class="metric"><div class="metric-value">${(summary.p50DurationMs / 1000).toFixed(1)}s</div><div class="metric-label">p50 Duration</div></div>
173
+ <div class="metric"><div class="metric-value">${(summary.p95DurationMs / 1000).toFixed(1)}s</div><div class="metric-label">p95 Duration</div></div>
174
+ </div>
175
+
176
+ <table>
177
+ <thead>
178
+ <tr><th>Test</th><th>Status</th><th>Duration</th><th>Turns</th><th>Verdict</th></tr>
179
+ </thead>
180
+ <tbody>
181
+ ${suite.results.map((r) => {
182
+ const cls = r.skipped ? 'skipped' : r.verified ? 'passed' : 'failed';
183
+ const label = r.skipped ? 'SKIP' : r.verified ? 'PASS' : 'FAIL';
184
+ return `
185
+ <tr>
186
+ <td>${r.testCase.name}</td>
187
+ <td class="${cls}">${label}</td>
188
+ <td>${r.skipped ? '-' : (r.durationMs / 1000).toFixed(1) + 's'}</td>
189
+ <td>${r.turnsUsed}</td>
190
+ <td>${esc(r.verdict)}</td>
191
+ </tr>`;
192
+ }).join('')}
193
+ </tbody>
194
+ </table>
195
+ </body>
196
+ </html>`;
197
+ }
198
+ /** Compare two suite results (e.g., before/after improvement) */
199
+ export function compareReports(before, after) {
200
+ const lines = [];
201
+ lines.push('# Test Suite Comparison\n');
202
+ lines.push(`**Before:** ${before.model} (${before.timestamp})`);
203
+ lines.push(`**After:** ${after.model} (${after.timestamp})\n`);
204
+ const bSum = before.summary;
205
+ const aSum = after.summary;
206
+ lines.push('| Metric | Before | After | Delta |');
207
+ lines.push('|--------|--------|-------|-------|');
208
+ const delta = (a, b, fmt) => {
209
+ const d = a - b;
210
+ const sign = d > 0 ? '+' : '';
211
+ return `${sign}${fmt(d)}`;
212
+ };
213
+ const pct = (n) => `${(n * 100).toFixed(1)}%`;
214
+ const dec1 = (n) => n.toFixed(1);
215
+ const sec = (n) => `${(n / 1000).toFixed(1)}s`;
216
+ lines.push(`| Pass Rate | ${pct(bSum.passRate)} | ${pct(aSum.passRate)} | ${delta(aSum.passRate, bSum.passRate, pct)} |`);
217
+ lines.push(`| Passed | ${bSum.passed} | ${aSum.passed} | ${delta(aSum.passed, bSum.passed, dec1)} |`);
218
+ lines.push(`| Avg Turns | ${dec1(bSum.avgTurns)} | ${dec1(aSum.avgTurns)} | ${delta(aSum.avgTurns, bSum.avgTurns, dec1)} |`);
219
+ lines.push(`| Avg Duration | ${sec(bSum.avgDurationMs)} | ${sec(aSum.avgDurationMs)} | ${delta(aSum.avgDurationMs, bSum.avgDurationMs, sec)} |`);
220
+ // Per-test comparison
221
+ lines.push('\n## Per-Test Comparison\n');
222
+ lines.push('| Test | Before | After |');
223
+ lines.push('|------|--------|-------|');
224
+ for (const afterResult of after.results) {
225
+ const beforeResult = before.results.find((r) => r.testCase.id === afterResult.testCase.id);
226
+ const bStatus = beforeResult ? (beforeResult.verified ? 'PASS' : 'FAIL') : 'N/A';
227
+ const aStatus = afterResult.verified ? 'PASS' : 'FAIL';
228
+ lines.push(`| ${esc(afterResult.testCase.name)} | ${bStatus} | ${aStatus} |`);
229
+ }
230
+ return lines.join('\n');
231
+ }
232
+ /** Escape pipe and newline for markdown table cells */
233
+ function esc(s) {
234
+ return s.replace(/\|/g, '\\|').replace(/\n/g, ' ');
235
+ }
236
+ function fmtPhase(label, value) {
237
+ if (value === undefined)
238
+ return '';
239
+ return `${label} ${(value / 1000).toFixed(1)}s`;
240
+ }
241
+ //# sourceMappingURL=test-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-report.js","sourceRoot":"","sources":["../src/test-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Test Runner — dependency-aware orchestration with ground-truth verification.
3
+ *
4
+ * Sequential mode (default): reuses a single driver, resolves dependencies.
5
+ * Parallel mode: spawns up to N concurrent workers, each with its own driver.
6
+ */
7
+ import type { TestCase, TestResult, TestSuiteResult, AgentConfig, Turn } from './types.js';
8
+ import type { Driver } from './drivers/types.js';
9
+ import type { ArtifactSink, ProgressEvent } from './artifacts/types.js';
10
+ import { type RunAnalysis } from './memory/analyzer.js';
11
+ import type { ProjectStore } from './memory/project-store.js';
12
+ export interface TestRunnerOptions {
13
+ /** Agent configuration (model, API key, vision, etc.) */
14
+ config?: AgentConfig;
15
+ /** Default per-test timeout in ms when a case omits timeoutMs */
16
+ defaultTimeoutMs?: number;
17
+ /** Single driver for sequential execution */
18
+ driver?: Driver;
19
+ /** Factory for creating isolated drivers (required for parallel execution) */
20
+ driverFactory?: () => Promise<Driver>;
21
+ /** Max concurrent test cases (default: 1 = sequential) */
22
+ concurrency?: number;
23
+ /** Stop suite on first failure */
24
+ stopOnFailure?: boolean;
25
+ /** Enable trajectory memory (loads/saves successful runs) */
26
+ enableMemory?: boolean;
27
+ /** Path to trajectory store directory */
28
+ trajectoryStorePath?: string;
29
+ /** Project memory store — enables knowledge, selectors, and domain-scoped trajectories */
30
+ projectStore?: ProjectStore;
31
+ /** Hints from previous run analysis — injected into each agent's context */
32
+ feedbackHints?: string;
33
+ /** Capture screenshot every N turns (0 = disabled) */
34
+ screenshotInterval?: number;
35
+ /** Called when a test case starts */
36
+ onTestStart?: (tc: TestCase) => void;
37
+ /** Called when a test case completes */
38
+ onTestComplete?: (result: TestResult) => void;
39
+ /** Called after each agent turn */
40
+ onTurn?: (tc: TestCase, turn: Turn) => void;
41
+ /** Pluggable artifact storage — screenshots, video, reports flow through this */
42
+ artifactSink?: ArtifactSink;
43
+ /** Unified progress event stream for dashboards/CI/coordinators */
44
+ onProgress?: (event: ProgressEvent) => void;
45
+ /** Per-worker timeout in ms — stuck workers get force-terminated (default: none) */
46
+ workerTimeoutMs?: number;
47
+ }
48
+ interface RunTestOptions {
49
+ signal?: AbortSignal;
50
+ }
51
+ export declare class TestRunner {
52
+ private config;
53
+ private driver;
54
+ private driverFactory;
55
+ private concurrency;
56
+ private stopOnFailure;
57
+ private store;
58
+ private projectStore?;
59
+ private feedbackHints;
60
+ private screenshotInterval;
61
+ private analyzer;
62
+ private onTestStart?;
63
+ private onTestComplete?;
64
+ private onTurn?;
65
+ private artifactSink?;
66
+ private onProgress?;
67
+ private workerTimeoutMs?;
68
+ private defaultTimeoutMs?;
69
+ private pendingArtifactOps;
70
+ constructor(options: TestRunnerOptions);
71
+ /** Run a single test case */
72
+ runTest(testCase: TestCase, driver?: Driver, options?: RunTestOptions): Promise<TestResult>;
73
+ /** Run a suite of test cases with dependency resolution and optional parallelism */
74
+ runSuite(cases: TestCase[]): Promise<TestSuiteResult>;
75
+ /** Analyze a completed suite run and return structured findings */
76
+ analyzeSuite(suite: TestSuiteResult): RunAnalysis;
77
+ /** Generate optimization hints from analysis — pass to feedbackHints on the next run */
78
+ generateHints(analysis: RunAnalysis): string;
79
+ private runSequential;
80
+ private runParallel;
81
+ private verifyCriteria;
82
+ private verifySingleCriterion;
83
+ private checkDependencies;
84
+ private resolveTimeoutMs;
85
+ private makeSkippedResult;
86
+ private buildVerdict;
87
+ /**
88
+ * Extract knowledge from successful test runs and merge into domain knowledge.
89
+ * Uses the Brain's extractKnowledge method to analyze trajectories.
90
+ */
91
+ private extractAndSaveKnowledge;
92
+ private buildSuiteResult;
93
+ private buildRuntimeConfig;
94
+ private trackArtifactOp;
95
+ private flushArtifactOps;
96
+ private startRuntimeObservability;
97
+ }
98
+ export {};
99
+ //# sourceMappingURL=test-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../src/test-runner.ts"],"names":[],"mappings":"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"}