playwright-intelligence-engine 0.0.0-stage → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +229 -3
  3. package/bin/pw-intel.js +37 -0
  4. package/dist/authoring/author.d.ts +83 -0
  5. package/dist/authoring/author.d.ts.map +1 -0
  6. package/dist/authoring/generation-contract.d.ts +90 -0
  7. package/dist/authoring/generation-contract.d.ts.map +1 -0
  8. package/dist/authoring/hybrid-author.d.ts +6 -0
  9. package/dist/authoring/hybrid-author.d.ts.map +1 -0
  10. package/dist/authoring/index.d.ts +7 -0
  11. package/dist/authoring/index.d.ts.map +1 -0
  12. package/dist/authoring/llm-author.d.ts +28 -0
  13. package/dist/authoring/llm-author.d.ts.map +1 -0
  14. package/dist/authoring/naming/index.d.ts +4 -0
  15. package/dist/authoring/naming/index.d.ts.map +1 -0
  16. package/dist/authoring/naming/name-plan.d.ts +45 -0
  17. package/dist/authoring/naming/name-plan.d.ts.map +1 -0
  18. package/dist/authoring/naming/name-planner.d.ts +25 -0
  19. package/dist/authoring/naming/name-planner.d.ts.map +1 -0
  20. package/dist/authoring/naming/naming-linter.d.ts +20 -0
  21. package/dist/authoring/naming/naming-linter.d.ts.map +1 -0
  22. package/dist/authoring/template-author.d.ts +6 -0
  23. package/dist/authoring/template-author.d.ts.map +1 -0
  24. package/dist/cli/index.d.ts +2 -0
  25. package/dist/cli/index.d.ts.map +1 -0
  26. package/dist/collectors/collector-interface.d.ts +7 -0
  27. package/dist/collectors/collector-interface.d.ts.map +1 -0
  28. package/dist/collectors/environment-collector.d.ts +12 -0
  29. package/dist/collectors/environment-collector.d.ts.map +1 -0
  30. package/dist/collectors/error-collector.d.ts +18 -0
  31. package/dist/collectors/error-collector.d.ts.map +1 -0
  32. package/dist/collectors/git-diff-collector.d.ts +20 -0
  33. package/dist/collectors/git-diff-collector.d.ts.map +1 -0
  34. package/dist/collectors/live-browser-collector.d.ts +45 -0
  35. package/dist/collectors/live-browser-collector.d.ts.map +1 -0
  36. package/dist/collectors/network-collector.d.ts +28 -0
  37. package/dist/collectors/network-collector.d.ts.map +1 -0
  38. package/dist/collectors/static-ast-collector.d.ts +32 -0
  39. package/dist/collectors/static-ast-collector.d.ts.map +1 -0
  40. package/dist/collectors/trace-collector.d.ts +12 -0
  41. package/dist/collectors/trace-collector.d.ts.map +1 -0
  42. package/dist/config/project-config.d.ts +33 -0
  43. package/dist/config/project-config.d.ts.map +1 -0
  44. package/dist/core/errors/engine-errors.d.ts +34 -0
  45. package/dist/core/errors/engine-errors.d.ts.map +1 -0
  46. package/dist/core/types/diagnostic-context.d.ts +151 -0
  47. package/dist/core/types/diagnostic-context.d.ts.map +1 -0
  48. package/dist/core/types/repair-evidence.d.ts +56 -0
  49. package/dist/core/types/repair-evidence.d.ts.map +1 -0
  50. package/dist/core/version.d.ts +13 -0
  51. package/dist/core/version.d.ts.map +1 -0
  52. package/dist/diagnostics/diagnostic-contract.d.ts +52 -0
  53. package/dist/diagnostics/diagnostic-contract.d.ts.map +1 -0
  54. package/dist/diagnostics/diagnostic-report.d.ts +11 -0
  55. package/dist/diagnostics/diagnostic-report.d.ts.map +1 -0
  56. package/dist/diagnostics/evidence-correlator.d.ts +22 -0
  57. package/dist/diagnostics/evidence-correlator.d.ts.map +1 -0
  58. package/dist/diagnostics/external-failure-evidence.d.ts +18 -0
  59. package/dist/diagnostics/external-failure-evidence.d.ts.map +1 -0
  60. package/dist/diagnostics/failure-category.d.ts +4 -0
  61. package/dist/diagnostics/failure-category.d.ts.map +1 -0
  62. package/dist/diagnostics/failure-classifier.d.ts +58 -0
  63. package/dist/diagnostics/failure-classifier.d.ts.map +1 -0
  64. package/dist/evaluation/evaluation-scorecard.d.ts +72 -0
  65. package/dist/evaluation/evaluation-scorecard.d.ts.map +1 -0
  66. package/dist/evaluation/repository-inspector.d.ts +21 -0
  67. package/dist/evaluation/repository-inspector.d.ts.map +1 -0
  68. package/dist/evaluation/repository-runner.d.ts +24 -0
  69. package/dist/evaluation/repository-runner.d.ts.map +1 -0
  70. package/dist/evidence/evidence-model.d.ts +88 -0
  71. package/dist/evidence/evidence-model.d.ts.map +1 -0
  72. package/dist/evidence/evidence-normalizer.d.ts +19 -0
  73. package/dist/evidence/evidence-normalizer.d.ts.map +1 -0
  74. package/dist/evidence/evidence-redactor.d.ts +37 -0
  75. package/dist/evidence/evidence-redactor.d.ts.map +1 -0
  76. package/dist/framework/config-adapter.d.ts +28 -0
  77. package/dist/framework/config-adapter.d.ts.map +1 -0
  78. package/dist/gate/index.d.ts +21 -0
  79. package/dist/gate/index.d.ts.map +1 -0
  80. package/dist/gate/oracle.d.ts +26 -0
  81. package/dist/gate/oracle.d.ts.map +1 -0
  82. package/dist/gate/quality.d.ts +27 -0
  83. package/dist/gate/quality.d.ts.map +1 -0
  84. package/dist/gate/safety.d.ts +28 -0
  85. package/dist/gate/safety.d.ts.map +1 -0
  86. package/dist/generator/architecture-generator.d.ts +55 -0
  87. package/dist/generator/architecture-generator.d.ts.map +1 -0
  88. package/dist/generator/assertion-quality-gate.d.ts +18 -0
  89. package/dist/generator/assertion-quality-gate.d.ts.map +1 -0
  90. package/dist/generator/candidate-writer.d.ts +34 -0
  91. package/dist/generator/candidate-writer.d.ts.map +1 -0
  92. package/dist/generator/test-generator.d.ts +26 -0
  93. package/dist/generator/test-generator.d.ts.map +1 -0
  94. package/dist/governance/audit-log.d.ts +23 -0
  95. package/dist/governance/audit-log.d.ts.map +1 -0
  96. package/dist/governance/governance-policy.d.ts +24 -0
  97. package/dist/governance/governance-policy.d.ts.map +1 -0
  98. package/dist/governance/team-dashboard.d.ts +51 -0
  99. package/dist/governance/team-dashboard.d.ts.map +1 -0
  100. package/dist/governance/workflow-audit.d.ts +13 -0
  101. package/dist/governance/workflow-audit.d.ts.map +1 -0
  102. package/dist/index.d.ts +90 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +20318 -0
  105. package/dist/integrations/ci-summary.d.ts +14 -0
  106. package/dist/integrations/ci-summary.d.ts.map +1 -0
  107. package/dist/integrations/playwright-report-adapter.d.ts +22 -0
  108. package/dist/integrations/playwright-report-adapter.d.ts.map +1 -0
  109. package/dist/integrations/quality-gate.d.ts +35 -0
  110. package/dist/integrations/quality-gate.d.ts.map +1 -0
  111. package/dist/integrations/sarif-report.d.ts +48 -0
  112. package/dist/integrations/sarif-report.d.ts.map +1 -0
  113. package/dist/intelligence/autonomous-repair-workflow.d.ts +31 -0
  114. package/dist/intelligence/autonomous-repair-workflow.d.ts.map +1 -0
  115. package/dist/intelligence/business-intent.d.ts +58 -0
  116. package/dist/intelligence/business-intent.d.ts.map +1 -0
  117. package/dist/intelligence/evidence-bundle.d.ts +364 -0
  118. package/dist/intelligence/evidence-bundle.d.ts.map +1 -0
  119. package/dist/intelligence/failure-clustering.d.ts +38 -0
  120. package/dist/intelligence/failure-clustering.d.ts.map +1 -0
  121. package/dist/intelligence/generation-agent.d.ts +120 -0
  122. package/dist/intelligence/generation-agent.d.ts.map +1 -0
  123. package/dist/intelligence/generation-verifier.d.ts +151 -0
  124. package/dist/intelligence/generation-verifier.d.ts.map +1 -0
  125. package/dist/intelligence/llm-proposal.d.ts +377 -0
  126. package/dist/intelligence/llm-proposal.d.ts.map +1 -0
  127. package/dist/intelligence/locator-disambiguation-engine.d.ts +38 -0
  128. package/dist/intelligence/locator-disambiguation-engine.d.ts.map +1 -0
  129. package/dist/intelligence/model-contract.d.ts +86 -0
  130. package/dist/intelligence/model-contract.d.ts.map +1 -0
  131. package/dist/intelligence/model-provider.d.ts +75 -0
  132. package/dist/intelligence/model-provider.d.ts.map +1 -0
  133. package/dist/intelligence/project-intelligence.d.ts +22 -0
  134. package/dist/intelligence/project-intelligence.d.ts.map +1 -0
  135. package/dist/intelligence/repair-agent.d.ts +46 -0
  136. package/dist/intelligence/repair-agent.d.ts.map +1 -0
  137. package/dist/intelligence/repository-profile.d.ts +131 -0
  138. package/dist/intelligence/repository-profile.d.ts.map +1 -0
  139. package/dist/intelligence/suite-intelligence.d.ts +59 -0
  140. package/dist/intelligence/suite-intelligence.d.ts.map +1 -0
  141. package/dist/intelligence/test-intelligence.d.ts +44 -0
  142. package/dist/intelligence/test-intelligence.d.ts.map +1 -0
  143. package/dist/intelligence/trace-proposal-workflow.d.ts +30 -0
  144. package/dist/intelligence/trace-proposal-workflow.d.ts.map +1 -0
  145. package/dist/intelligence/verified-llm-repair-workflow.d.ts +21 -0
  146. package/dist/intelligence/verified-llm-repair-workflow.d.ts.map +1 -0
  147. package/dist/intelligence/workflow-planner.d.ts +278 -0
  148. package/dist/intelligence/workflow-planner.d.ts.map +1 -0
  149. package/dist/mcp/server.d.ts +32 -0
  150. package/dist/mcp/server.d.ts.map +1 -0
  151. package/dist/memory/stability-ledger.d.ts +46 -0
  152. package/dist/memory/stability-ledger.d.ts.map +1 -0
  153. package/dist/perception/app-model.d.ts +55 -0
  154. package/dist/perception/app-model.d.ts.map +1 -0
  155. package/dist/perception/crawler.d.ts +18 -0
  156. package/dist/perception/crawler.d.ts.map +1 -0
  157. package/dist/perception/index.d.ts +3 -0
  158. package/dist/perception/index.d.ts.map +1 -0
  159. package/dist/repair/approval-service.d.ts +139 -0
  160. package/dist/repair/approval-service.d.ts.map +1 -0
  161. package/dist/repair/assertion-hasher.d.ts +62 -0
  162. package/dist/repair/assertion-hasher.d.ts.map +1 -0
  163. package/dist/repair/ast-patcher.d.ts +36 -0
  164. package/dist/repair/ast-patcher.d.ts.map +1 -0
  165. package/dist/repair/browser-operation-executor.d.ts +27 -0
  166. package/dist/repair/browser-operation-executor.d.ts.map +1 -0
  167. package/dist/repair/diff-allowlist.d.ts +74 -0
  168. package/dist/repair/diff-allowlist.d.ts.map +1 -0
  169. package/dist/repair/intent-validator.d.ts +157 -0
  170. package/dist/repair/intent-validator.d.ts.map +1 -0
  171. package/dist/repair/repair-operations.d.ts +40 -0
  172. package/dist/repair/repair-operations.d.ts.map +1 -0
  173. package/dist/repair/repair-planner.d.ts +98 -0
  174. package/dist/repair/repair-planner.d.ts.map +1 -0
  175. package/dist/repair/repair-workflow.d.ts +42 -0
  176. package/dist/repair/repair-workflow.d.ts.map +1 -0
  177. package/dist/repair/safe-operation-compiler.d.ts +15 -0
  178. package/dist/repair/safe-operation-compiler.d.ts.map +1 -0
  179. package/dist/repair/source-mapper.d.ts +19 -0
  180. package/dist/repair/source-mapper.d.ts.map +1 -0
  181. package/dist/repair/statement-patcher.d.ts +75 -0
  182. package/dist/repair/statement-patcher.d.ts.map +1 -0
  183. package/dist/repair/verification-gates.d.ts +25 -0
  184. package/dist/repair/verification-gates.d.ts.map +1 -0
  185. package/dist/repair/workflow-plan.d.ts +35 -0
  186. package/dist/repair/workflow-plan.d.ts.map +1 -0
  187. package/dist/repair/workspace-promoter.d.ts +43 -0
  188. package/dist/repair/workspace-promoter.d.ts.map +1 -0
  189. package/dist/reproduce/diagnostic-rerunner.d.ts +40 -0
  190. package/dist/reproduce/diagnostic-rerunner.d.ts.map +1 -0
  191. package/dist/reproduce/direct-browser-investigator.d.ts +41 -0
  192. package/dist/reproduce/direct-browser-investigator.d.ts.map +1 -0
  193. package/dist/reproduce/interactive-workflow-runner.d.ts +43 -0
  194. package/dist/reproduce/interactive-workflow-runner.d.ts.map +1 -0
  195. package/dist/sandbox/dependency-strategy.d.ts +45 -0
  196. package/dist/sandbox/dependency-strategy.d.ts.map +1 -0
  197. package/dist/sandbox/execution-runner.d.ts +81 -0
  198. package/dist/sandbox/execution-runner.d.ts.map +1 -0
  199. package/dist/sandbox/worktree-manager.d.ts +51 -0
  200. package/dist/sandbox/worktree-manager.d.ts.map +1 -0
  201. package/dist/selector/abstention-policy.d.ts +34 -0
  202. package/dist/selector/abstention-policy.d.ts.map +1 -0
  203. package/dist/selector/candidate-extractor.d.ts +71 -0
  204. package/dist/selector/candidate-extractor.d.ts.map +1 -0
  205. package/dist/selector/live-locator-verifier.d.ts +28 -0
  206. package/dist/selector/live-locator-verifier.d.ts.map +1 -0
  207. package/dist/selector/repair-candidate-ranker.d.ts +10 -0
  208. package/dist/selector/repair-candidate-ranker.d.ts.map +1 -0
  209. package/dist/selector/selector-scorer.d.ts +43 -0
  210. package/dist/selector/selector-scorer.d.ts.map +1 -0
  211. package/dist/trace/adapters/adapter-registry.d.ts +18 -0
  212. package/dist/trace/adapters/adapter-registry.d.ts.map +1 -0
  213. package/dist/trace/adapters/trace-adapter.d.ts +21 -0
  214. package/dist/trace/adapters/trace-adapter.d.ts.map +1 -0
  215. package/dist/trace/adapters/unknown-adapter.d.ts +10 -0
  216. package/dist/trace/adapters/unknown-adapter.d.ts.map +1 -0
  217. package/dist/trace/adapters/v10-adapter.d.ts +10 -0
  218. package/dist/trace/adapters/v10-adapter.d.ts.map +1 -0
  219. package/dist/trace/adapters/v4-adapter.d.ts +11 -0
  220. package/dist/trace/adapters/v4-adapter.d.ts.map +1 -0
  221. package/dist/trace/adapters/v8-adapter.d.ts +10 -0
  222. package/dist/trace/adapters/v8-adapter.d.ts.map +1 -0
  223. package/dist/trace/adapters/v9-adapter.d.ts +10 -0
  224. package/dist/trace/adapters/v9-adapter.d.ts.map +1 -0
  225. package/dist/trace/archive-reader.d.ts +44 -0
  226. package/dist/trace/archive-reader.d.ts.map +1 -0
  227. package/dist/trace/snapshot-resolver.d.ts +55 -0
  228. package/dist/trace/snapshot-resolver.d.ts.map +1 -0
  229. package/dist/trace/trace-parser.d.ts +50 -0
  230. package/dist/trace/trace-parser.d.ts.map +1 -0
  231. package/dist/trace/version-detector.d.ts +20 -0
  232. package/dist/trace/version-detector.d.ts.map +1 -0
  233. package/package.json +76 -6
  234. package/skills/README.md +20 -0
  235. package/skills/pie-failure-investigation/SKILL.md +16 -0
  236. package/skills/pie-quality-engineer/SKILL.md +66 -0
  237. package/skills/pie-release-readiness/SKILL.md +22 -0
  238. package/skills/pie-repair-review/SKILL.md +21 -0
  239. package/skills/pie-trace-to-repair/SKILL.md +35 -0
  240. package/src/authoring/author.ts +81 -0
  241. package/src/authoring/generation-contract.ts +283 -0
  242. package/src/authoring/hybrid-author.ts +115 -0
  243. package/src/authoring/index.ts +7 -0
  244. package/src/authoring/llm-author.ts +282 -0
  245. package/src/authoring/naming/index.ts +4 -0
  246. package/src/authoring/naming/name-plan.ts +28 -0
  247. package/src/authoring/naming/name-planner.ts +339 -0
  248. package/src/authoring/naming/naming-linter.ts +292 -0
  249. package/src/authoring/template-author.ts +39 -0
  250. package/src/cli/index.ts +1172 -0
  251. package/src/collectors/collector-interface.ts +8 -0
  252. package/src/collectors/environment-collector.ts +103 -0
  253. package/src/collectors/error-collector.ts +177 -0
  254. package/src/collectors/git-diff-collector.ts +190 -0
  255. package/src/collectors/live-browser-collector.ts +412 -0
  256. package/src/collectors/network-collector.ts +90 -0
  257. package/src/collectors/static-ast-collector.ts +226 -0
  258. package/src/collectors/trace-collector.ts +66 -0
  259. package/src/config/project-config.ts +114 -0
  260. package/src/core/errors/engine-errors.ts +90 -0
  261. package/src/core/types/diagnostic-context.ts +94 -0
  262. package/src/core/types/repair-evidence.ts +45 -0
  263. package/src/core/version.ts +25 -0
  264. package/src/diagnostics/diagnostic-contract.ts +79 -0
  265. package/src/diagnostics/diagnostic-report.ts +204 -0
  266. package/src/diagnostics/evidence-correlator.ts +117 -0
  267. package/src/diagnostics/external-failure-evidence.ts +72 -0
  268. package/src/diagnostics/failure-category.ts +40 -0
  269. package/src/diagnostics/failure-classifier.ts +701 -0
  270. package/src/evaluation/evaluation-scorecard.ts +198 -0
  271. package/src/evaluation/repository-inspector.ts +143 -0
  272. package/src/evaluation/repository-runner.ts +197 -0
  273. package/src/evidence/evidence-model.ts +76 -0
  274. package/src/evidence/evidence-normalizer.ts +322 -0
  275. package/src/evidence/evidence-redactor.ts +218 -0
  276. package/src/framework/config-adapter.ts +131 -0
  277. package/src/gate/index.ts +43 -0
  278. package/src/gate/oracle.ts +69 -0
  279. package/src/gate/quality.ts +101 -0
  280. package/src/gate/safety.ts +94 -0
  281. package/src/generator/architecture-generator.ts +582 -0
  282. package/src/generator/assertion-quality-gate.ts +88 -0
  283. package/src/generator/candidate-writer.ts +288 -0
  284. package/src/generator/test-generator.ts +52 -0
  285. package/src/governance/audit-log.ts +115 -0
  286. package/src/governance/governance-policy.ts +72 -0
  287. package/src/governance/team-dashboard.ts +189 -0
  288. package/src/governance/workflow-audit.ts +72 -0
  289. package/src/index.ts +107 -0
  290. package/src/integrations/ci-summary.ts +37 -0
  291. package/src/integrations/playwright-report-adapter.ts +173 -0
  292. package/src/integrations/quality-gate.ts +95 -0
  293. package/src/integrations/sarif-report.ts +110 -0
  294. package/src/intelligence/autonomous-repair-workflow.ts +139 -0
  295. package/src/intelligence/business-intent.ts +163 -0
  296. package/src/intelligence/evidence-bundle.ts +300 -0
  297. package/src/intelligence/failure-clustering.ts +134 -0
  298. package/src/intelligence/generation-agent.ts +561 -0
  299. package/src/intelligence/generation-verifier.ts +1115 -0
  300. package/src/intelligence/llm-proposal.ts +519 -0
  301. package/src/intelligence/locator-disambiguation-engine.ts +331 -0
  302. package/src/intelligence/model-contract.ts +205 -0
  303. package/src/intelligence/model-provider.ts +348 -0
  304. package/src/intelligence/project-intelligence.ts +140 -0
  305. package/src/intelligence/repair-agent.ts +297 -0
  306. package/src/intelligence/repository-profile.ts +796 -0
  307. package/src/intelligence/suite-intelligence.ts +305 -0
  308. package/src/intelligence/test-intelligence.ts +136 -0
  309. package/src/intelligence/trace-proposal-workflow.ts +318 -0
  310. package/src/intelligence/verified-llm-repair-workflow.ts +48 -0
  311. package/src/intelligence/workflow-planner.ts +966 -0
  312. package/src/mcp/server.ts +970 -0
  313. package/src/memory/stability-ledger.ts +243 -0
  314. package/src/perception/app-model.ts +32 -0
  315. package/src/perception/crawler.ts +263 -0
  316. package/src/perception/index.ts +3 -0
  317. package/src/repair/approval-service.ts +541 -0
  318. package/src/repair/assertion-hasher.ts +386 -0
  319. package/src/repair/ast-patcher.ts +223 -0
  320. package/src/repair/browser-operation-executor.ts +263 -0
  321. package/src/repair/diff-allowlist.ts +612 -0
  322. package/src/repair/intent-validator.ts +761 -0
  323. package/src/repair/repair-operations.ts +65 -0
  324. package/src/repair/repair-planner.ts +467 -0
  325. package/src/repair/repair-workflow.ts +241 -0
  326. package/src/repair/safe-operation-compiler.ts +68 -0
  327. package/src/repair/source-mapper.ts +156 -0
  328. package/src/repair/statement-patcher.ts +544 -0
  329. package/src/repair/verification-gates.ts +46 -0
  330. package/src/repair/workflow-plan.ts +59 -0
  331. package/src/repair/workspace-promoter.ts +313 -0
  332. package/src/reproduce/diagnostic-rerunner.ts +287 -0
  333. package/src/reproduce/direct-browser-investigator.ts +208 -0
  334. package/src/reproduce/interactive-workflow-runner.ts +828 -0
  335. package/src/sandbox/dependency-strategy.ts +215 -0
  336. package/src/sandbox/execution-runner.ts +408 -0
  337. package/src/sandbox/worktree-manager.ts +287 -0
  338. package/src/selector/abstention-policy.ts +175 -0
  339. package/src/selector/candidate-extractor.ts +343 -0
  340. package/src/selector/live-locator-verifier.ts +139 -0
  341. package/src/selector/repair-candidate-ranker.ts +92 -0
  342. package/src/selector/selector-scorer.ts +344 -0
  343. package/src/trace/adapters/adapter-registry.ts +49 -0
  344. package/src/trace/adapters/trace-adapter.ts +28 -0
  345. package/src/trace/adapters/unknown-adapter.ts +50 -0
  346. package/src/trace/adapters/v10-adapter.ts +39 -0
  347. package/src/trace/adapters/v4-adapter.ts +31 -0
  348. package/src/trace/adapters/v8-adapter.ts +42 -0
  349. package/src/trace/adapters/v9-adapter.ts +39 -0
  350. package/src/trace/archive-reader.ts +246 -0
  351. package/src/trace/snapshot-resolver.ts +308 -0
  352. package/src/trace/trace-parser.ts +467 -0
  353. package/src/trace/version-detector.ts +81 -0
@@ -0,0 +1,412 @@
1
+ import { EvidenceCollector } from './collector-interface.js';
2
+ import { UnifiedEvidenceRecord } from '../evidence/evidence-model.js';
3
+ import { EvidenceRedactor } from '../evidence/evidence-redactor.js';
4
+ import { LocatorPlan } from '../selector/candidate-extractor.js';
5
+ import { LiveLocatorVerifier } from '../selector/live-locator-verifier.js';
6
+
7
+ export interface LiveBrowserCollectorOptions {
8
+ executionId?: string;
9
+ }
10
+
11
+ export class LiveBrowserCollector implements EvidenceCollector<void> {
12
+ public readonly name = 'LiveBrowserCollector';
13
+ public readonly source = 'live-browser' as const;
14
+
15
+ private records: UnifiedEvidenceRecord[] = [];
16
+ private executionId: string;
17
+ private attachedPage: any = null;
18
+ private listeners: Array<{ event: string; fn: (...args: any[]) => void }> = [];
19
+
20
+ constructor(options?: LiveBrowserCollectorOptions) {
21
+ this.executionId = options?.executionId ?? `exec-${Date.now()}`;
22
+ }
23
+
24
+ /**
25
+ * Attaches live instrumentation listeners to a Playwright Page instance (AUDIT-11).
26
+ * Captures console, page errors, dialogs, crashes, network requests, and responses with frame IDs.
27
+ */
28
+ public attach(page: any): void {
29
+ this.detach();
30
+ this.attachedPage = page;
31
+
32
+ if (!page || typeof page.on !== 'function') {
33
+ return;
34
+ }
35
+
36
+ const onConsole = (msg: any) => {
37
+ try {
38
+ const text = typeof msg.text === 'function' ? msg.text() : String(msg);
39
+ const type = typeof msg.type === 'function' ? msg.type() : 'log';
40
+ const location = typeof msg.location === 'function' ? msg.location() : undefined;
41
+ const now = Date.now();
42
+
43
+ const { redactedText } = EvidenceRedactor.redactText(text);
44
+
45
+ const rawRecord: UnifiedEvidenceRecord = {
46
+ evidenceId: `con-${now}-${Math.random().toString(36).slice(2, 8)}`,
47
+ executionId: this.executionId,
48
+ source: 'console',
49
+ timestamp: now,
50
+ evidenceType: 'console-entry',
51
+ payload: {
52
+ type,
53
+ text: redactedText,
54
+ location,
55
+ },
56
+ reliability: 'HIGH',
57
+ provenance: {
58
+ collector: this.name,
59
+ collectedAt: now,
60
+ captureMethod: 'page-console-listener',
61
+ },
62
+ redactionStatus: { isRedacted: true },
63
+ };
64
+
65
+ this.records.push(EvidenceRedactor.redactRecord(rawRecord));
66
+ } catch {
67
+ // Safe fail-through
68
+ }
69
+ };
70
+
71
+ const onPageError = (err: any) => {
72
+ try {
73
+ const message = err?.message || String(err);
74
+ const stack = err?.stack || '';
75
+ const now = Date.now();
76
+
77
+ const { redactedText: cleanMsg } = EvidenceRedactor.redactText(message);
78
+ const { redactedText: cleanStack } = EvidenceRedactor.redactText(stack);
79
+
80
+ const rawRecord: UnifiedEvidenceRecord = {
81
+ evidenceId: `err-${now}-${Math.random().toString(36).slice(2, 8)}`,
82
+ executionId: this.executionId,
83
+ source: 'error',
84
+ timestamp: now,
85
+ evidenceType: 'playwright-error',
86
+ payload: {
87
+ errorMessage: cleanMsg,
88
+ errorStack: cleanStack,
89
+ isPageError: true,
90
+ },
91
+ reliability: 'HIGH',
92
+ provenance: {
93
+ collector: this.name,
94
+ collectedAt: now,
95
+ captureMethod: 'page-pageerror-listener',
96
+ },
97
+ redactionStatus: { isRedacted: true },
98
+ };
99
+
100
+ this.records.push(EvidenceRedactor.redactRecord(rawRecord));
101
+ } catch {
102
+ // Safe fail-through
103
+ }
104
+ };
105
+
106
+ const onRequestFailed = (req: any) => {
107
+ try {
108
+ const url = typeof req.url === 'function' ? req.url() : req.url || '';
109
+ const method = typeof req.method === 'function' ? req.method() : req.method || 'GET';
110
+ const failure = typeof req.failure === 'function' ? req.failure() : null;
111
+ const errorText = failure?.errorText || 'Request Failed';
112
+ const frame = typeof req.frame === 'function' ? req.frame() : null;
113
+ const frameId = frame ? frame.name() || frame.url() : undefined;
114
+ const now = Date.now();
115
+
116
+ const { redactedText: cleanUrl } = EvidenceRedactor.redactText(url);
117
+
118
+ const rawRecord: UnifiedEvidenceRecord = {
119
+ evidenceId: `net-fail-${now}-${Math.random().toString(36).slice(2, 8)}`,
120
+ executionId: this.executionId,
121
+ source: 'network',
122
+ timestamp: now,
123
+ evidenceType: 'http-response',
124
+ payload: {
125
+ url: cleanUrl,
126
+ method,
127
+ status: 0,
128
+ errorText,
129
+ isFailed: true,
130
+ frameId,
131
+ },
132
+ reliability: 'HIGH',
133
+ provenance: {
134
+ collector: this.name,
135
+ collectedAt: now,
136
+ captureMethod: 'page-requestfailed-listener',
137
+ sourceUri: cleanUrl,
138
+ },
139
+ redactionStatus: { isRedacted: true },
140
+ };
141
+
142
+ this.records.push(EvidenceRedactor.redactRecord(rawRecord));
143
+ } catch {
144
+ // Safe fail-through
145
+ }
146
+ };
147
+
148
+ const onResponse = async (resp: any) => {
149
+ try {
150
+ const url = typeof resp.url === 'function' ? resp.url() : resp.url || '';
151
+ const status = typeof resp.status === 'function' ? resp.status() : 200;
152
+ const statusText = typeof resp.statusText === 'function' ? resp.statusText() : '';
153
+ const req = typeof resp.request === 'function' ? resp.request() : null;
154
+ const method = req && typeof req.method === 'function' ? req.method() : 'GET';
155
+ const headers = typeof resp.headers === 'function' ? resp.headers() : {};
156
+ const frame = req && typeof req.frame === 'function' ? req.frame() : null;
157
+ const frameId = frame ? frame.name() || frame.url() : undefined;
158
+ const now = Date.now();
159
+
160
+ const { redactedHeaders, redactedFields } = EvidenceRedactor.redactHeaders(headers);
161
+ const { redactedText: cleanUrl } = EvidenceRedactor.redactText(url);
162
+
163
+ const rawRecord: UnifiedEvidenceRecord = {
164
+ evidenceId: `net-resp-${now}-${Math.random().toString(36).slice(2, 8)}`,
165
+ executionId: this.executionId,
166
+ source: 'network',
167
+ timestamp: now,
168
+ evidenceType: 'http-response',
169
+ payload: {
170
+ url: cleanUrl,
171
+ method,
172
+ status,
173
+ statusText,
174
+ headers: redactedHeaders,
175
+ frameId,
176
+ },
177
+ reliability: 'HIGH',
178
+ provenance: {
179
+ collector: this.name,
180
+ collectedAt: now,
181
+ captureMethod: 'page-response-listener',
182
+ sourceUri: cleanUrl,
183
+ },
184
+ redactionStatus: {
185
+ isRedacted: true,
186
+ redactedFields,
187
+ },
188
+ };
189
+
190
+ this.records.push(EvidenceRedactor.redactRecord(rawRecord));
191
+ } catch {
192
+ // Safe fail-through
193
+ }
194
+ };
195
+
196
+ const onDialog = (dialog: any) => {
197
+ try {
198
+ const message = typeof dialog.message === 'function' ? dialog.message() : '';
199
+ const type = typeof dialog.type === 'function' ? dialog.type() : 'alert';
200
+ const now = Date.now();
201
+ const { redactedText } = EvidenceRedactor.redactText(message);
202
+
203
+ const record: UnifiedEvidenceRecord = {
204
+ evidenceId: `dlg-${now}`,
205
+ executionId: this.executionId,
206
+ source: 'live-browser',
207
+ timestamp: now,
208
+ evidenceType: 'dialog-event',
209
+ payload: { type, message: redactedText },
210
+ reliability: 'HIGH',
211
+ provenance: {
212
+ collector: this.name,
213
+ collectedAt: now,
214
+ captureMethod: 'page-dialog-listener',
215
+ },
216
+ redactionStatus: { isRedacted: true },
217
+ };
218
+ this.records.push(record);
219
+ } catch {
220
+ // Safe fail-through
221
+ }
222
+ };
223
+
224
+ page.on('console', onConsole);
225
+ page.on('pageerror', onPageError);
226
+ page.on('requestfailed', onRequestFailed);
227
+ page.on('response', onResponse);
228
+ if (typeof page.on === 'function') {
229
+ page.on('dialog', onDialog);
230
+ }
231
+
232
+ this.listeners = [
233
+ { event: 'console', fn: onConsole },
234
+ { event: 'pageerror', fn: onPageError },
235
+ { event: 'requestfailed', fn: onRequestFailed },
236
+ { event: 'response', fn: onResponse },
237
+ { event: 'dialog', fn: onDialog },
238
+ ];
239
+ }
240
+
241
+ /**
242
+ * Captures the full HTML DOM snapshot with central redaction (AUDIT-11 / B5).
243
+ */
244
+ public async captureSnapshot(phase: 'before' | 'action' | 'after' = 'action'): Promise<UnifiedEvidenceRecord | null> {
245
+ if (!this.attachedPage) return null;
246
+
247
+ try {
248
+ const now = Date.now();
249
+ let rawHtml = '';
250
+ if (typeof this.attachedPage.content === 'function') {
251
+ rawHtml = await this.attachedPage.content();
252
+ }
253
+
254
+ const cleanHtml = EvidenceRedactor.redactDomContent(rawHtml);
255
+ const url = typeof this.attachedPage.url === 'function' ? this.attachedPage.url() : undefined;
256
+ const cleanUrl = url ? EvidenceRedactor.redactText(url).redactedText : undefined;
257
+
258
+ const record: UnifiedEvidenceRecord = {
259
+ evidenceId: `dom-${phase}-${now}`,
260
+ executionId: this.executionId,
261
+ source: 'live-browser',
262
+ timestamp: now,
263
+ evidenceType: 'dom-snapshot',
264
+ payload: {
265
+ phase,
266
+ html: cleanHtml,
267
+ url: cleanUrl,
268
+ },
269
+ reliability: 'HIGH',
270
+ provenance: {
271
+ collector: this.name,
272
+ collectedAt: now,
273
+ captureMethod: 'page-content-snapshot',
274
+ },
275
+ redactionStatus: { isRedacted: true },
276
+ };
277
+
278
+ this.records.push(record);
279
+ return record;
280
+ } catch {
281
+ return null;
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Captures an accessibility snapshot using modern page.ariaSnapshot() or legacy a11y tree.
287
+ */
288
+ public async captureAriaSnapshot(): Promise<UnifiedEvidenceRecord | null> {
289
+ if (!this.attachedPage) return null;
290
+
291
+ try {
292
+ const now = Date.now();
293
+ let ariaTree = '';
294
+
295
+ if (typeof this.attachedPage.ariaSnapshot === 'function') {
296
+ ariaTree = await this.attachedPage.ariaSnapshot();
297
+ } else if (this.attachedPage.accessibility && typeof this.attachedPage.accessibility.snapshot === 'function') {
298
+ const snap = await this.attachedPage.accessibility.snapshot();
299
+ ariaTree = JSON.stringify(snap, null, 2);
300
+ }
301
+
302
+ if (!ariaTree) return null;
303
+
304
+ const cleanTree = EvidenceRedactor.redactText(ariaTree).redactedText;
305
+
306
+ const record: UnifiedEvidenceRecord = {
307
+ evidenceId: `aria-${now}`,
308
+ executionId: this.executionId,
309
+ source: 'live-browser',
310
+ timestamp: now,
311
+ evidenceType: 'accessibility-snapshot',
312
+ payload: { ariaSnapshot: cleanTree },
313
+ reliability: 'HIGH',
314
+ provenance: {
315
+ collector: this.name,
316
+ collectedAt: now,
317
+ captureMethod: 'page-aria-snapshot',
318
+ },
319
+ redactionStatus: { isRedacted: true },
320
+ };
321
+
322
+ this.records.push(record);
323
+ return record;
324
+ } catch {
325
+ return null;
326
+ }
327
+ }
328
+
329
+ /**
330
+ * Evaluates a candidate locator or typed LocatorPlan directly against the live page.
331
+ * Empirically tests count(), visibility, and accessibility (AUDIT-13).
332
+ */
333
+ public async evaluateCandidate(planOrSelector: string | LocatorPlan): Promise<{
334
+ count: number;
335
+ visibleCount: number;
336
+ accessibleNames: string[];
337
+ isUnique: boolean;
338
+ }> {
339
+ if (!this.attachedPage) {
340
+ return { count: 0, visibleCount: 0, accessibleNames: [], isUnique: false };
341
+ }
342
+
343
+ try {
344
+ if (typeof planOrSelector === 'object') {
345
+ const result = await LiveLocatorVerifier.verify(this.attachedPage, planOrSelector);
346
+ return {
347
+ count: result.count,
348
+ visibleCount: result.isVisible ? 1 : 0,
349
+ accessibleNames: [],
350
+ isUnique: result.isUnique,
351
+ };
352
+ }
353
+
354
+ // String selector fallback
355
+ if (typeof this.attachedPage.locator !== 'function') {
356
+ return { count: 0, visibleCount: 0, accessibleNames: [], isUnique: false };
357
+ }
358
+
359
+ const loc = this.attachedPage.locator(planOrSelector);
360
+ const count = await loc.count();
361
+ let visibleCount = 0;
362
+ const accessibleNames: string[] = [];
363
+
364
+ for (let i = 0; i < count; i++) {
365
+ const el = loc.nth(i);
366
+ if (typeof el.isVisible === 'function' && (await el.isVisible())) {
367
+ visibleCount++;
368
+ }
369
+ if (typeof el.innerText === 'function') {
370
+ const text = await el.innerText().catch(() => '');
371
+ if (text) accessibleNames.push(text.trim());
372
+ }
373
+ }
374
+
375
+ return {
376
+ count,
377
+ visibleCount,
378
+ accessibleNames,
379
+ isUnique: count === 1,
380
+ };
381
+ } catch {
382
+ return { count: 0, visibleCount: 0, accessibleNames: [], isUnique: false };
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Detaches all event listeners from the page.
388
+ */
389
+ public detach(): void {
390
+ if (this.attachedPage && typeof this.attachedPage.off === 'function') {
391
+ for (const { event, fn } of this.listeners) {
392
+ try {
393
+ this.attachedPage.off(event, fn);
394
+ } catch {
395
+ // Ignore
396
+ }
397
+ }
398
+ }
399
+ this.attachedPage = null;
400
+ this.listeners = [];
401
+ }
402
+
403
+ public async collect(): Promise<UnifiedEvidenceRecord[]> {
404
+ return [...this.records];
405
+ }
406
+
407
+ public drain(): UnifiedEvidenceRecord[] {
408
+ const dumped = [...this.records];
409
+ this.records = [];
410
+ return dumped;
411
+ }
412
+ }
@@ -0,0 +1,90 @@
1
+ import { EvidenceCollector } from './collector-interface.js';
2
+ import { UnifiedEvidenceRecord } from '../evidence/evidence-model.js';
3
+ import { EvidenceRedactor } from '../evidence/evidence-redactor.js';
4
+
5
+ export interface RawNetworkEvent {
6
+ url: string;
7
+ method: string;
8
+ status: number;
9
+ statusText?: string;
10
+ headers?: Record<string, string>;
11
+ timestamp?: number;
12
+ durationMs?: number;
13
+ errorText?: string;
14
+ requestId?: string;
15
+ frameId?: string;
16
+ resourceType?: string;
17
+ initiator?: string;
18
+ postData?: string;
19
+ responseBody?: string;
20
+ }
21
+
22
+ export interface NetworkCollectorInput {
23
+ events: RawNetworkEvent[];
24
+ executionId?: string;
25
+ }
26
+
27
+ export class NetworkCollector implements EvidenceCollector<NetworkCollectorInput> {
28
+ public readonly name = 'NetworkCollector';
29
+ public readonly source = 'network' as const;
30
+
31
+ public async collect(input: NetworkCollectorInput): Promise<UnifiedEvidenceRecord[]> {
32
+ const executionId = input.executionId ?? `exec-${Date.now()}`;
33
+ const records: UnifiedEvidenceRecord[] = [];
34
+
35
+ for (const evt of input.events) {
36
+ const timestamp = evt.timestamp ?? Date.now();
37
+ const { redactedHeaders, redactedFields: headerRedactions } = EvidenceRedactor.redactHeaders(
38
+ evt.headers
39
+ );
40
+ const { redactedText: cleanUrl, rulesApplied: urlRules } = EvidenceRedactor.redactText(evt.url);
41
+ const { redactedText: cleanError } = EvidenceRedactor.redactText(evt.errorText ?? '');
42
+
43
+ let cleanPostData: string | undefined;
44
+ if (evt.postData) {
45
+ cleanPostData = EvidenceRedactor.redactText(evt.postData).redactedText;
46
+ }
47
+
48
+ const isError = evt.status >= 400 || Boolean(evt.errorText);
49
+ const allRedactedFields = [...headerRedactions];
50
+ if (urlRules.length > 0) allRedactedFields.push('url');
51
+
52
+ records.push({
53
+ evidenceId: `net-${evt.requestId || Math.random().toString(36).slice(2, 8)}`,
54
+ executionId,
55
+ source: 'network',
56
+ timestamp,
57
+ requestId: evt.requestId,
58
+ frameId: evt.frameId,
59
+ evidenceType: 'http-response',
60
+ payload: {
61
+ url: cleanUrl,
62
+ method: evt.method,
63
+ status: evt.status,
64
+ statusText: evt.statusText,
65
+ headers: redactedHeaders,
66
+ durationMs: evt.durationMs,
67
+ errorText: cleanError,
68
+ resourceType: evt.resourceType,
69
+ initiator: evt.initiator,
70
+ isError,
71
+ postData: cleanPostData,
72
+ },
73
+ reliability: 'HIGH',
74
+ provenance: {
75
+ collector: this.name,
76
+ collectedAt: timestamp,
77
+ captureMethod: 'cdp-network-interception',
78
+ sourceUri: cleanUrl,
79
+ },
80
+ redactionStatus: {
81
+ isRedacted: allRedactedFields.length > 0,
82
+ redactedFields: allRedactedFields,
83
+ },
84
+ });
85
+ }
86
+
87
+ return records;
88
+ }
89
+ }
90
+