@e2edev/e2e 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 (399) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/dist/agent/act-validation.d.ts +27 -0
  4. package/dist/agent/act-validation.d.ts.map +1 -0
  5. package/dist/agent/act-validation.js +121 -0
  6. package/dist/agent/act-validation.js.map +1 -0
  7. package/dist/agent/act.d.ts +27 -0
  8. package/dist/agent/act.d.ts.map +1 -0
  9. package/dist/agent/act.js +775 -0
  10. package/dist/agent/act.js.map +1 -0
  11. package/dist/agent/actions.d.ts +66 -0
  12. package/dist/agent/actions.d.ts.map +1 -0
  13. package/dist/agent/actions.js +82 -0
  14. package/dist/agent/actions.js.map +1 -0
  15. package/dist/agent/ai-sdk.d.ts +16 -0
  16. package/dist/agent/ai-sdk.d.ts.map +1 -0
  17. package/dist/agent/ai-sdk.js +59 -0
  18. package/dist/agent/ai-sdk.js.map +1 -0
  19. package/dist/agent/call-options.d.ts +10 -0
  20. package/dist/agent/call-options.d.ts.map +1 -0
  21. package/dist/agent/call-options.js +28 -0
  22. package/dist/agent/call-options.js.map +1 -0
  23. package/dist/agent/default-agent.d.ts +22 -0
  24. package/dist/agent/default-agent.d.ts.map +1 -0
  25. package/dist/agent/default-agent.js +354 -0
  26. package/dist/agent/default-agent.js.map +1 -0
  27. package/dist/agent/error.d.ts +53 -0
  28. package/dist/agent/error.d.ts.map +1 -0
  29. package/dist/agent/error.js +94 -0
  30. package/dist/agent/error.js.map +1 -0
  31. package/dist/agent/executor.d.ts +238 -0
  32. package/dist/agent/executor.d.ts.map +1 -0
  33. package/dist/agent/executor.js +56 -0
  34. package/dist/agent/executor.js.map +1 -0
  35. package/dist/agent/index.d.ts +15 -0
  36. package/dist/agent/index.d.ts.map +1 -0
  37. package/dist/agent/index.js +304 -0
  38. package/dist/agent/index.js.map +1 -0
  39. package/dist/agent/invocation.d.ts +194 -0
  40. package/dist/agent/invocation.d.ts.map +1 -0
  41. package/dist/agent/invocation.js +389 -0
  42. package/dist/agent/invocation.js.map +1 -0
  43. package/dist/agent/ledger.d.ts +24 -0
  44. package/dist/agent/ledger.d.ts.map +1 -0
  45. package/dist/agent/ledger.js +48 -0
  46. package/dist/agent/ledger.js.map +1 -0
  47. package/dist/agent/loop-guards.d.ts +35 -0
  48. package/dist/agent/loop-guards.d.ts.map +1 -0
  49. package/dist/agent/loop-guards.js +110 -0
  50. package/dist/agent/loop-guards.js.map +1 -0
  51. package/dist/agent/model/adapter.d.ts +97 -0
  52. package/dist/agent/model/adapter.d.ts.map +1 -0
  53. package/dist/agent/model/adapter.js +40 -0
  54. package/dist/agent/model/adapter.js.map +1 -0
  55. package/dist/agent/model/router.d.ts +36 -0
  56. package/dist/agent/model/router.d.ts.map +1 -0
  57. package/dist/agent/model/router.js +45 -0
  58. package/dist/agent/model/router.js.map +1 -0
  59. package/dist/agent/model/schema.d.ts +16 -0
  60. package/dist/agent/model/schema.d.ts.map +1 -0
  61. package/dist/agent/model/schema.js +37 -0
  62. package/dist/agent/model/schema.js.map +1 -0
  63. package/dist/agent/model/sdk.d.ts +28 -0
  64. package/dist/agent/model/sdk.d.ts.map +1 -0
  65. package/dist/agent/model/sdk.js +258 -0
  66. package/dist/agent/model/sdk.js.map +1 -0
  67. package/dist/agent/observation.d.ts +70 -0
  68. package/dist/agent/observation.d.ts.map +1 -0
  69. package/dist/agent/observation.js +174 -0
  70. package/dist/agent/observation.js.map +1 -0
  71. package/dist/agent/phases.d.ts +71 -0
  72. package/dist/agent/phases.d.ts.map +1 -0
  73. package/dist/agent/phases.js +124 -0
  74. package/dist/agent/phases.js.map +1 -0
  75. package/dist/agent/prompts.d.ts +40 -0
  76. package/dist/agent/prompts.d.ts.map +1 -0
  77. package/dist/agent/prompts.js +104 -0
  78. package/dist/agent/prompts.js.map +1 -0
  79. package/dist/agent/protocol.d.ts +31 -0
  80. package/dist/agent/protocol.d.ts.map +1 -0
  81. package/dist/agent/protocol.js +67 -0
  82. package/dist/agent/protocol.js.map +1 -0
  83. package/dist/agent/public.d.ts +12 -0
  84. package/dist/agent/public.d.ts.map +1 -0
  85. package/dist/agent/public.js +12 -0
  86. package/dist/agent/public.js.map +1 -0
  87. package/dist/agent/replay.d.ts +61 -0
  88. package/dist/agent/replay.d.ts.map +1 -0
  89. package/dist/agent/replay.js +185 -0
  90. package/dist/agent/replay.js.map +1 -0
  91. package/dist/agent/secrets.d.ts +22 -0
  92. package/dist/agent/secrets.d.ts.map +1 -0
  93. package/dist/agent/secrets.js +63 -0
  94. package/dist/agent/secrets.js.map +1 -0
  95. package/dist/agent/step-cache.d.ts +156 -0
  96. package/dist/agent/step-cache.d.ts.map +1 -0
  97. package/dist/agent/step-cache.js +301 -0
  98. package/dist/agent/step-cache.js.map +1 -0
  99. package/dist/agent/tool-loop.d.ts +51 -0
  100. package/dist/agent/tool-loop.d.ts.map +1 -0
  101. package/dist/agent/tool-loop.js +331 -0
  102. package/dist/agent/tool-loop.js.map +1 -0
  103. package/dist/agent/tool.d.ts +39 -0
  104. package/dist/agent/tool.d.ts.map +1 -0
  105. package/dist/agent/tool.js +52 -0
  106. package/dist/agent/tool.js.map +1 -0
  107. package/dist/backend/contract.d.ts +186 -0
  108. package/dist/backend/contract.d.ts.map +1 -0
  109. package/dist/backend/contract.js +65 -0
  110. package/dist/backend/contract.js.map +1 -0
  111. package/dist/backend/index.d.ts +316 -0
  112. package/dist/backend/index.d.ts.map +1 -0
  113. package/dist/backend/index.js +219 -0
  114. package/dist/backend/index.js.map +1 -0
  115. package/dist/backend/session.d.ts +23 -0
  116. package/dist/backend/session.d.ts.map +1 -0
  117. package/dist/backend/session.js +213 -0
  118. package/dist/backend/session.js.map +1 -0
  119. package/dist/backend/surface.d.ts +83 -0
  120. package/dist/backend/surface.d.ts.map +1 -0
  121. package/dist/backend/surface.js +11 -0
  122. package/dist/backend/surface.js.map +1 -0
  123. package/dist/cache/anchors.d.ts +37 -0
  124. package/dist/cache/anchors.d.ts.map +1 -0
  125. package/dist/cache/anchors.js +89 -0
  126. package/dist/cache/anchors.js.map +1 -0
  127. package/dist/cache/context.d.ts +74 -0
  128. package/dist/cache/context.d.ts.map +1 -0
  129. package/dist/cache/context.js +82 -0
  130. package/dist/cache/context.js.map +1 -0
  131. package/dist/cache/decide.d.ts +42 -0
  132. package/dist/cache/decide.d.ts.map +1 -0
  133. package/dist/cache/decide.js +47 -0
  134. package/dist/cache/decide.js.map +1 -0
  135. package/dist/cache/identity.d.ts +113 -0
  136. package/dist/cache/identity.d.ts.map +1 -0
  137. package/dist/cache/identity.js +109 -0
  138. package/dist/cache/identity.js.map +1 -0
  139. package/dist/cache/recorder.d.ts +76 -0
  140. package/dist/cache/recorder.d.ts.map +1 -0
  141. package/dist/cache/recorder.js +143 -0
  142. package/dist/cache/recorder.js.map +1 -0
  143. package/dist/cache/relocate.d.ts +69 -0
  144. package/dist/cache/relocate.d.ts.map +1 -0
  145. package/dist/cache/relocate.js +125 -0
  146. package/dist/cache/relocate.js.map +1 -0
  147. package/dist/cache/store.d.ts +68 -0
  148. package/dist/cache/store.d.ts.map +1 -0
  149. package/dist/cache/store.js +106 -0
  150. package/dist/cache/store.js.map +1 -0
  151. package/dist/cache/trace.d.ts +146 -0
  152. package/dist/cache/trace.d.ts.map +1 -0
  153. package/dist/cache/trace.js +249 -0
  154. package/dist/cache/trace.js.map +1 -0
  155. package/dist/cli/bin.d.ts +3 -0
  156. package/dist/cli/bin.d.ts.map +1 -0
  157. package/dist/cli/bin.js +4 -0
  158. package/dist/cli/bin.js.map +1 -0
  159. package/dist/cli/index.d.ts +4 -0
  160. package/dist/cli/index.d.ts.map +1 -0
  161. package/dist/cli/index.js +108 -0
  162. package/dist/cli/index.js.map +1 -0
  163. package/dist/cli/init.d.ts +6 -0
  164. package/dist/cli/init.d.ts.map +1 -0
  165. package/dist/cli/init.js +101 -0
  166. package/dist/cli/init.js.map +1 -0
  167. package/dist/collect/collect.d.ts +44 -0
  168. package/dist/collect/collect.d.ts.map +1 -0
  169. package/dist/collect/collect.js +89 -0
  170. package/dist/collect/collect.js.map +1 -0
  171. package/dist/collect/registry.d.ts +47 -0
  172. package/dist/collect/registry.d.ts.map +1 -0
  173. package/dist/collect/registry.js +262 -0
  174. package/dist/collect/registry.js.map +1 -0
  175. package/dist/collect/select.d.ts +54 -0
  176. package/dist/collect/select.d.ts.map +1 -0
  177. package/dist/collect/select.js +230 -0
  178. package/dist/collect/select.js.map +1 -0
  179. package/dist/config/agent.d.ts +91 -0
  180. package/dist/config/agent.d.ts.map +1 -0
  181. package/dist/config/agent.js +232 -0
  182. package/dist/config/agent.js.map +1 -0
  183. package/dist/config/load.d.ts +23 -0
  184. package/dist/config/load.d.ts.map +1 -0
  185. package/dist/config/load.js +75 -0
  186. package/dist/config/load.js.map +1 -0
  187. package/dist/config/resolve.d.ts +94 -0
  188. package/dist/config/resolve.d.ts.map +1 -0
  189. package/dist/config/resolve.js +500 -0
  190. package/dist/config/resolve.js.map +1 -0
  191. package/dist/config/validate.d.ts +6 -0
  192. package/dist/config/validate.d.ts.map +1 -0
  193. package/dist/config/validate.js +21 -0
  194. package/dist/config/validate.js.map +1 -0
  195. package/dist/credentials.d.ts +7 -0
  196. package/dist/credentials.d.ts.map +1 -0
  197. package/dist/credentials.js +42 -0
  198. package/dist/credentials.js.map +1 -0
  199. package/dist/expect/async.d.ts +5 -0
  200. package/dist/expect/async.d.ts.map +1 -0
  201. package/dist/expect/async.js +186 -0
  202. package/dist/expect/async.js.map +1 -0
  203. package/dist/expect/index.d.ts +7 -0
  204. package/dist/expect/index.d.ts.map +1 -0
  205. package/dist/expect/index.js +23 -0
  206. package/dist/expect/index.js.map +1 -0
  207. package/dist/expect/values.d.ts +4 -0
  208. package/dist/expect/values.d.ts.map +1 -0
  209. package/dist/expect/values.js +108 -0
  210. package/dist/expect/values.js.map +1 -0
  211. package/dist/index.d.ts +13 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +15 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/internal/ai-trace.d.ts +151 -0
  216. package/dist/internal/ai-trace.d.ts.map +1 -0
  217. package/dist/internal/ai-trace.js +360 -0
  218. package/dist/internal/ai-trace.js.map +1 -0
  219. package/dist/internal/brands.d.ts +9 -0
  220. package/dist/internal/brands.d.ts.map +1 -0
  221. package/dist/internal/brands.js +9 -0
  222. package/dist/internal/brands.js.map +1 -0
  223. package/dist/internal/debug.d.ts +43 -0
  224. package/dist/internal/debug.d.ts.map +1 -0
  225. package/dist/internal/debug.js +102 -0
  226. package/dist/internal/debug.js.map +1 -0
  227. package/dist/internal/errors.d.ts +98 -0
  228. package/dist/internal/errors.d.ts.map +1 -0
  229. package/dist/internal/errors.js +212 -0
  230. package/dist/internal/errors.js.map +1 -0
  231. package/dist/internal/globs.d.ts +29 -0
  232. package/dist/internal/globs.d.ts.map +1 -0
  233. package/dist/internal/globs.js +126 -0
  234. package/dist/internal/globs.js.map +1 -0
  235. package/dist/internal/ids.d.ts +32 -0
  236. package/dist/internal/ids.d.ts.map +1 -0
  237. package/dist/internal/ids.js +124 -0
  238. package/dist/internal/ids.js.map +1 -0
  239. package/dist/internal/json-value.d.ts +15 -0
  240. package/dist/internal/json-value.d.ts.map +1 -0
  241. package/dist/internal/json-value.js +61 -0
  242. package/dist/internal/json-value.js.map +1 -0
  243. package/dist/internal/package-version.d.ts +6 -0
  244. package/dist/internal/package-version.d.ts.map +1 -0
  245. package/dist/internal/package-version.js +14 -0
  246. package/dist/internal/package-version.js.map +1 -0
  247. package/dist/internal/realm-slot.d.ts +13 -0
  248. package/dist/internal/realm-slot.d.ts.map +1 -0
  249. package/dist/internal/realm-slot.js +23 -0
  250. package/dist/internal/realm-slot.js.map +1 -0
  251. package/dist/internal/redact.d.ts +33 -0
  252. package/dist/internal/redact.d.ts.map +1 -0
  253. package/dist/internal/redact.js +56 -0
  254. package/dist/internal/redact.js.map +1 -0
  255. package/dist/internal/regexp.d.ts +10 -0
  256. package/dist/internal/regexp.d.ts.map +1 -0
  257. package/dist/internal/regexp.js +27 -0
  258. package/dist/internal/regexp.js.map +1 -0
  259. package/dist/internal/text.d.ts +39 -0
  260. package/dist/internal/text.d.ts.map +1 -0
  261. package/dist/internal/text.js +66 -0
  262. package/dist/internal/text.js.map +1 -0
  263. package/dist/internal/time.d.ts +37 -0
  264. package/dist/internal/time.d.ts.map +1 -0
  265. package/dist/internal/time.js +91 -0
  266. package/dist/internal/time.js.map +1 -0
  267. package/dist/internal/trace.d.ts +18 -0
  268. package/dist/internal/trace.d.ts.map +1 -0
  269. package/dist/internal/trace.js +46 -0
  270. package/dist/internal/trace.js.map +1 -0
  271. package/dist/internal/urls.d.ts +31 -0
  272. package/dist/internal/urls.d.ts.map +1 -0
  273. package/dist/internal/urls.js +95 -0
  274. package/dist/internal/urls.js.map +1 -0
  275. package/dist/locator/engine.d.ts +65 -0
  276. package/dist/locator/engine.d.ts.map +1 -0
  277. package/dist/locator/engine.js +164 -0
  278. package/dist/locator/engine.js.map +1 -0
  279. package/dist/locator/expression.d.ts +19 -0
  280. package/dist/locator/expression.d.ts.map +1 -0
  281. package/dist/locator/expression.js +85 -0
  282. package/dist/locator/expression.js.map +1 -0
  283. package/dist/locator/screen.d.ts +36 -0
  284. package/dist/locator/screen.d.ts.map +1 -0
  285. package/dist/locator/screen.js +281 -0
  286. package/dist/locator/screen.js.map +1 -0
  287. package/dist/report/build.d.ts +214 -0
  288. package/dist/report/build.d.ts.map +1 -0
  289. package/dist/report/build.js +346 -0
  290. package/dist/report/build.js.map +1 -0
  291. package/dist/report/code-frame.d.ts +20 -0
  292. package/dist/report/code-frame.d.ts.map +1 -0
  293. package/dist/report/code-frame.js +73 -0
  294. package/dist/report/code-frame.js.map +1 -0
  295. package/dist/report/debug-steps.d.ts +14 -0
  296. package/dist/report/debug-steps.d.ts.map +1 -0
  297. package/dist/report/debug-steps.js +85 -0
  298. package/dist/report/debug-steps.js.map +1 -0
  299. package/dist/report/list.d.ts +80 -0
  300. package/dist/report/list.d.ts.map +1 -0
  301. package/dist/report/list.js +372 -0
  302. package/dist/report/list.js.map +1 -0
  303. package/dist/report/live-status.d.ts +51 -0
  304. package/dist/report/live-status.d.ts.map +1 -0
  305. package/dist/report/live-status.js +162 -0
  306. package/dist/report/live-status.js.map +1 -0
  307. package/dist/report/write.d.ts +4 -0
  308. package/dist/report/write.d.ts.map +1 -0
  309. package/dist/report/write.js +13 -0
  310. package/dist/report/write.js.map +1 -0
  311. package/dist/run/app-process.d.ts +18 -0
  312. package/dist/run/app-process.d.ts.map +1 -0
  313. package/dist/run/app-process.js +112 -0
  314. package/dist/run/app-process.js.map +1 -0
  315. package/dist/run/artifacts.d.ts +51 -0
  316. package/dist/run/artifacts.d.ts.map +1 -0
  317. package/dist/run/artifacts.js +114 -0
  318. package/dist/run/artifacts.js.map +1 -0
  319. package/dist/run/events.d.ts +100 -0
  320. package/dist/run/events.d.ts.map +1 -0
  321. package/dist/run/events.js +59 -0
  322. package/dist/run/events.js.map +1 -0
  323. package/dist/run/execute.d.ts +119 -0
  324. package/dist/run/execute.d.ts.map +1 -0
  325. package/dist/run/execute.js +555 -0
  326. package/dist/run/execute.js.map +1 -0
  327. package/dist/run/fixtures.d.ts +40 -0
  328. package/dist/run/fixtures.d.ts.map +1 -0
  329. package/dist/run/fixtures.js +408 -0
  330. package/dist/run/fixtures.js.map +1 -0
  331. package/dist/run/in-process.d.ts +24 -0
  332. package/dist/run/in-process.d.ts.map +1 -0
  333. package/dist/run/in-process.js +120 -0
  334. package/dist/run/in-process.js.map +1 -0
  335. package/dist/run/public.d.ts +19 -0
  336. package/dist/run/public.d.ts.map +1 -0
  337. package/dist/run/public.js +11 -0
  338. package/dist/run/public.js.map +1 -0
  339. package/dist/run/realm.d.ts +52 -0
  340. package/dist/run/realm.d.ts.map +1 -0
  341. package/dist/run/realm.js +101 -0
  342. package/dist/run/realm.js.map +1 -0
  343. package/dist/run/records.d.ts +87 -0
  344. package/dist/run/records.d.ts.map +1 -0
  345. package/dist/run/records.js +3 -0
  346. package/dist/run/records.js.map +1 -0
  347. package/dist/run/retry.d.ts +18 -0
  348. package/dist/run/retry.d.ts.map +1 -0
  349. package/dist/run/retry.js +33 -0
  350. package/dist/run/retry.js.map +1 -0
  351. package/dist/run/runner.d.ts +49 -0
  352. package/dist/run/runner.d.ts.map +1 -0
  353. package/dist/run/runner.js +375 -0
  354. package/dist/run/runner.js.map +1 -0
  355. package/dist/run/scheduler.d.ts +45 -0
  356. package/dist/run/scheduler.d.ts.map +1 -0
  357. package/dist/run/scheduler.js +512 -0
  358. package/dist/run/scheduler.js.map +1 -0
  359. package/dist/run/serial.d.ts +52 -0
  360. package/dist/run/serial.d.ts.map +1 -0
  361. package/dist/run/serial.js +247 -0
  362. package/dist/run/serial.js.map +1 -0
  363. package/dist/run/sessions.d.ts +54 -0
  364. package/dist/run/sessions.d.ts.map +1 -0
  365. package/dist/run/sessions.js +221 -0
  366. package/dist/run/sessions.js.map +1 -0
  367. package/dist/run/steps.d.ts +196 -0
  368. package/dist/run/steps.d.ts.map +1 -0
  369. package/dist/run/steps.js +151 -0
  370. package/dist/run/steps.js.map +1 -0
  371. package/dist/run/unit-runner.d.ts +30 -0
  372. package/dist/run/unit-runner.d.ts.map +1 -0
  373. package/dist/run/unit-runner.js +11 -0
  374. package/dist/run/unit-runner.js.map +1 -0
  375. package/dist/run/units.d.ts +50 -0
  376. package/dist/run/units.d.ts.map +1 -0
  377. package/dist/run/units.js +103 -0
  378. package/dist/run/units.js.map +1 -0
  379. package/dist/run/worker/entry.d.ts +8 -0
  380. package/dist/run/worker/entry.d.ts.map +1 -0
  381. package/dist/run/worker/entry.js +137 -0
  382. package/dist/run/worker/entry.js.map +1 -0
  383. package/dist/run/worker/handle.d.ts +10 -0
  384. package/dist/run/worker/handle.d.ts.map +1 -0
  385. package/dist/run/worker/handle.js +74 -0
  386. package/dist/run/worker/handle.js.map +1 -0
  387. package/dist/run/worker/protocol.d.ts +129 -0
  388. package/dist/run/worker/protocol.d.ts.map +1 -0
  389. package/dist/run/worker/protocol.js +18 -0
  390. package/dist/run/worker/protocol.js.map +1 -0
  391. package/dist/run/worker/session.d.ts +69 -0
  392. package/dist/run/worker/session.d.ts.map +1 -0
  393. package/dist/run/worker/session.js +123 -0
  394. package/dist/run/worker/session.js.map +1 -0
  395. package/dist/types.d.ts +630 -0
  396. package/dist/types.d.ts.map +1 -0
  397. package/dist/types.js +6 -0
  398. package/dist/types.js.map +1 -0
  399. package/package.json +91 -0
@@ -0,0 +1,346 @@
1
+ /** report-1 document construction (spec 13-reporting.md). */
2
+ import os from 'node:os';
3
+ import { BACKEND_SPI_VERSION } from '../backend/contract.js';
4
+ import { BLOCKABLE_CODES } from '../agent/executor.js';
5
+ import { DEFAULT_OBSERVATION_BYTES, resolveLimits } from '../config/agent.js';
6
+ import { resultId, timestamp } from '../internal/ids.js';
7
+ import { packageVersion } from '../internal/package-version.js';
8
+ /**
9
+ * What a target's backend declaration says about it: the one description the
10
+ * runner grades against and the report records. A target without a backend is
11
+ * agent-tools-only and honestly reports no capabilities.
12
+ */
13
+ export function describeTarget(target) {
14
+ const backend = target.backend;
15
+ const artifactCapabilities = [];
16
+ if (backend?.artifacts !== undefined) {
17
+ artifactCapabilities.push('screenshot');
18
+ if (backend.artifacts.startTrace !== undefined)
19
+ artifactCapabilities.push('trace');
20
+ }
21
+ return {
22
+ backend: {
23
+ name: backend?.name ?? 'none',
24
+ version: backend?.version ?? 'unversioned',
25
+ spiVersion: backend?.spiVersion ?? BACKEND_SPI_VERSION,
26
+ },
27
+ capabilities: [...(backend?.capabilities ?? [])].toSorted(),
28
+ artifactCapabilities,
29
+ stateCapability: backend?.state !== undefined,
30
+ };
31
+ }
32
+ function relativeSource(config, source, fallbackFile) {
33
+ if (source === undefined)
34
+ return { file: fallbackFile, line: 1, column: 1 };
35
+ let file = source.file;
36
+ if (config !== undefined && file.startsWith(config.projectRoot)) {
37
+ file = file.slice(config.projectRoot.length).replace(/^[/\\]/, '').split('\\').join('/');
38
+ }
39
+ if (file.startsWith('/') || /^[A-Za-z]:/.test(file)) {
40
+ file = fallbackFile;
41
+ }
42
+ return { file, line: Math.max(1, source.line), column: Math.max(1, source.column) };
43
+ }
44
+ /** Step source capture is not implemented yet (spec 13-reporting.md). */
45
+ const UNIMPLEMENTED_STEP_SOURCE = { file: 'unknown', line: 1, column: 1 };
46
+ function serializeStep(step) {
47
+ const { error, ...rest } = step;
48
+ return {
49
+ ...rest,
50
+ source: UNIMPLEMENTED_STEP_SOURCE,
51
+ error: error === undefined ? undefined : serializeErrorRecord(error),
52
+ };
53
+ }
54
+ /** SerializedError minus the stack, which never enters the report. */
55
+ function serializeErrorRecord(error) {
56
+ const { stack, ...report } = error;
57
+ void stack;
58
+ return report;
59
+ }
60
+ function serializeAttemptBase(attempt) {
61
+ return {
62
+ id: attempt.id,
63
+ index: attempt.index,
64
+ status: attempt.status,
65
+ startedAt: attempt.startedAt,
66
+ durationMs: attempt.durationMs,
67
+ artifacts: attempt.artifacts,
68
+ error: attempt.error === undefined ? undefined : serializeErrorRecord(attempt.error),
69
+ secondaryErrors: attempt.secondaryErrors.map(serializeErrorRecord),
70
+ cleanup: attempt.cleanup,
71
+ };
72
+ }
73
+ function serializeAttempt(attempt) {
74
+ return { ...serializeAttemptBase(attempt), steps: attempt.steps.map(serializeStep) };
75
+ }
76
+ function serializeSerialMember(member) {
77
+ return {
78
+ id: member.id,
79
+ index: member.index,
80
+ testId: member.testId,
81
+ status: member.status,
82
+ startedAt: member.startedAt,
83
+ durationMs: member.durationMs,
84
+ steps: member.status === 'skipped' ? [] : member.steps.map(serializeStep),
85
+ error: member.error === undefined ? undefined : serializeErrorRecord(member.error),
86
+ skip: member.status === 'skipped' ? member.skip : undefined,
87
+ secondaryErrors: member.secondaryErrors.map(serializeErrorRecord),
88
+ };
89
+ }
90
+ function serializeSerialAttempt(attempt) {
91
+ return { ...serializeAttemptBase(attempt), members: attempt.members.map(serializeSerialMember) };
92
+ }
93
+ function serializeSerialGroup(group) {
94
+ return {
95
+ id: group.id,
96
+ serialId: group.serialId,
97
+ declarationIndex: group.declarationIndex,
98
+ file: group.file,
99
+ source: { file: group.file, line: 1, column: 1 },
100
+ titlePath: group.titlePath,
101
+ targetId: group.targetId,
102
+ platform: group.platform,
103
+ memberTestIds: group.memberTestIds,
104
+ status: group.status,
105
+ skip: group.status === 'skipped' ? group.skip : undefined,
106
+ attempts: group.attempts.map(serializeSerialAttempt),
107
+ };
108
+ }
109
+ function serializeResult(config, result) {
110
+ return {
111
+ id: resultId(result.test.id, result.target.name),
112
+ testId: result.test.id,
113
+ kind: result.test.kind,
114
+ declarationIndex: result.test.declarationIndex,
115
+ titlePath: result.test.titlePath,
116
+ file: result.test.file,
117
+ source: relativeSource(config, result.test.source, result.test.file),
118
+ targetId: result.target.name,
119
+ platform: result.target.platform,
120
+ serialGroupId: result.serialGroupId,
121
+ status: result.status,
122
+ skip: result.status === 'skipped' ? result.skip : undefined,
123
+ attempts: result.serialGroupId !== undefined ? [] : result.attempts.map(serializeAttempt),
124
+ };
125
+ }
126
+ function serializeTarget(config, target, provenance) {
127
+ // Provenance exists for every selected target; an unselected one is
128
+ // described from its declaration the same way.
129
+ return {
130
+ id: target.name,
131
+ index: target.index,
132
+ platform: target.platform,
133
+ baseOrigin: config.app.base.origin,
134
+ environment: config.app.environment,
135
+ allowProduction: config.app.allowProduction,
136
+ testIdAttribute: config.testIdAttribute,
137
+ ...(provenance ?? describeTarget(target)),
138
+ };
139
+ }
140
+ /** Computes report-1 summary counts from results. */
141
+ function computeSummary(results) {
142
+ let selected = 0;
143
+ let executed = 0;
144
+ let passed = 0;
145
+ let failed = 0;
146
+ let flaky = 0;
147
+ let skipped = 0;
148
+ for (const result of results) {
149
+ if (result.selected)
150
+ selected += 1;
151
+ if (result.attempts.length > 0 || (result.serialGroupId !== undefined && result.status !== 'skipped')) {
152
+ executed += 1;
153
+ }
154
+ switch (result.status) {
155
+ case 'passed':
156
+ passed += 1;
157
+ break;
158
+ case 'flaky':
159
+ flaky += 1;
160
+ break;
161
+ case 'failed':
162
+ case 'timed-out':
163
+ case 'interrupted':
164
+ failed += 1;
165
+ break;
166
+ case 'skipped':
167
+ skipped += 1;
168
+ break;
169
+ }
170
+ }
171
+ return { discovered: results.length, selected, executed, passed, failed, flaky, skipped };
172
+ }
173
+ /**
174
+ * A run is `blocked` — not failed — when it did not pass and *every*
175
+ * non-passing result carries a blockable error code: credentials, the
176
+ * environment, or the agent's own budget prevented a product verdict, and
177
+ * nothing contradicts that. One genuine failure keeps the run failed;
178
+ * derivation requires positive evidence, never absence of it.
179
+ */
180
+ function deriveRunStatus(status, results, serialGroups) {
181
+ if (status !== 'failed' && status !== 'error')
182
+ return status;
183
+ // Serial members carry no attempts of their own; their failing error lives
184
+ // on the group's last attempt (or its failing member).
185
+ const groupCode = new Map();
186
+ for (const group of serialGroups) {
187
+ const attempt = group.attempts.at(-1);
188
+ const member = attempt?.members.find((candidate) => candidate.status !== 'passed' && candidate.status !== 'skipped');
189
+ groupCode.set(group.id, member?.error?.code ?? attempt?.error?.code);
190
+ }
191
+ let sawFailure = false;
192
+ for (const result of results) {
193
+ if (result.status !== 'failed' &&
194
+ result.status !== 'timed-out' &&
195
+ result.status !== 'interrupted') {
196
+ continue;
197
+ }
198
+ sawFailure = true;
199
+ const code = result.serialGroupId === undefined
200
+ ? result.attempts.at(-1)?.error?.code
201
+ : groupCode.get(result.serialGroupId);
202
+ if (code === undefined || !BLOCKABLE_CODES.has(code))
203
+ return status;
204
+ }
205
+ return sawFailure ? 'blocked' : status;
206
+ }
207
+ /**
208
+ * Fallback limits used when the run failed before config resolution: the
209
+ * resolver's own defaults, so the report never disagrees with the config.
210
+ */
211
+ const DEFAULT_LIMITS = {
212
+ ...resolveLimits({}),
213
+ maxObservationBytes: DEFAULT_OBSERVATION_BYTES,
214
+ };
215
+ /** Aggregates observed usage against the resolved limits (13-reporting.md). */
216
+ function computeUsage(options) {
217
+ const usage = {
218
+ discoveredResults: options.discovered,
219
+ maxAgentContextBytes: 0,
220
+ maxLedgerBytes: 0,
221
+ maxObservationBytes: 0,
222
+ artifactBytes: 0,
223
+ downloads: 0,
224
+ events: 0,
225
+ modelTokens: 0,
226
+ maxModelCallsInStep: 0,
227
+ maxActionStepsInStep: 0,
228
+ };
229
+ let cost = 0;
230
+ let costSeen = false;
231
+ const countStep = (step) => {
232
+ usage.events += step.events.length;
233
+ const metrics = step.metrics;
234
+ if (metrics !== undefined) {
235
+ usage.maxAgentContextBytes = Math.max(usage.maxAgentContextBytes, metrics.contextBytes);
236
+ usage.maxLedgerBytes = Math.max(usage.maxLedgerBytes, metrics.ledgerBytes);
237
+ usage.maxObservationBytes = Math.max(usage.maxObservationBytes, metrics.observationBytes);
238
+ usage.maxModelCallsInStep = Math.max(usage.maxModelCallsInStep, metrics.modelCalls);
239
+ usage.maxActionStepsInStep = Math.max(usage.maxActionStepsInStep, metrics.actionSteps);
240
+ }
241
+ const model = step.model;
242
+ if (model !== undefined) {
243
+ usage.modelTokens += model.inputTokens + model.outputTokens;
244
+ if (model.estimatedCostUsd !== undefined) {
245
+ cost += model.estimatedCostUsd;
246
+ costSeen = true;
247
+ }
248
+ }
249
+ };
250
+ const countArtifacts = (artifacts) => {
251
+ for (const artifact of artifacts) {
252
+ usage.artifactBytes += artifact.size ?? 0;
253
+ if (artifact.kind === 'download')
254
+ usage.downloads += 1;
255
+ }
256
+ };
257
+ for (const result of options.results) {
258
+ for (const attempt of result.attempts) {
259
+ countArtifacts(attempt.artifacts);
260
+ for (const step of attempt.steps)
261
+ countStep(step);
262
+ }
263
+ }
264
+ for (const group of options.serialGroups) {
265
+ for (const attempt of group.attempts) {
266
+ countArtifacts(attempt.artifacts);
267
+ for (const member of attempt.members) {
268
+ for (const step of member.steps)
269
+ countStep(step);
270
+ }
271
+ }
272
+ }
273
+ return costSeen ? { ...usage, estimatedCostUsd: cost } : usage;
274
+ }
275
+ /** Builds the complete report-1 document. */
276
+ export function buildReport(options) {
277
+ const { config } = options;
278
+ const targets = config === undefined
279
+ ? []
280
+ : config.targets.map((target) => serializeTarget(config, target, options.targetProvenance.get(target.name)));
281
+ const results = options.results
282
+ .toSorted(compareResults)
283
+ .map((result) => serializeResult(config, result));
284
+ const targetIndex = new Map();
285
+ for (const target of config?.targets ?? [])
286
+ targetIndex.set(target.name, target.index);
287
+ const serialGroups = options.serialGroups
288
+ .toSorted((a, b) => compareSerialGroups(a, b, targetIndex))
289
+ .map(serializeSerialGroup);
290
+ const summary = computeSummary(options.results);
291
+ return {
292
+ schemaVersion: 'report-1',
293
+ run: {
294
+ id: options.runId,
295
+ specVersion: '0.1',
296
+ runner: {
297
+ name: 'e2e',
298
+ version: packageVersion(import.meta.url, '../../package.json', '0.0.0'),
299
+ },
300
+ status: deriveRunStatus(options.status, options.results, options.serialGroups),
301
+ exitCode: options.exitCode,
302
+ startedAt: options.startedAt,
303
+ finishedAt: timestamp(),
304
+ project: {
305
+ id: config?.projectId ?? 'unknown',
306
+ configDigest: config?.configDigest ?? '0'.repeat(64),
307
+ },
308
+ environment: {
309
+ ci: config?.ci ?? false,
310
+ // The trust model is documented and report-recorded, never printed.
311
+ trustNoticeShown: false,
312
+ os: `${os.platform()} ${os.release()}`,
313
+ arch: os.arch(),
314
+ runtime: `node ${process.version}`,
315
+ },
316
+ targets,
317
+ serialGroups,
318
+ results,
319
+ errors: options.runErrors.map((runError) => serializeErrorRecord(runError.error)),
320
+ summary,
321
+ limits: config?.limits ?? DEFAULT_LIMITS,
322
+ usage: computeUsage({
323
+ results: options.results,
324
+ serialGroups: options.serialGroups,
325
+ discovered: summary.discovered,
326
+ }),
327
+ },
328
+ };
329
+ }
330
+ function compareResults(a, b) {
331
+ if (a.test.file !== b.test.file)
332
+ return a.test.file < b.test.file ? -1 : 1;
333
+ if (a.test.declarationIndex !== b.test.declarationIndex) {
334
+ return a.test.declarationIndex - b.test.declarationIndex;
335
+ }
336
+ return a.target.index - b.target.index;
337
+ }
338
+ /** Report order is completion-time independent (spec 13-reporting.md). */
339
+ function compareSerialGroups(a, b, targetIndex) {
340
+ if (a.file !== b.file)
341
+ return a.file < b.file ? -1 : 1;
342
+ if (a.declarationIndex !== b.declarationIndex)
343
+ return a.declarationIndex - b.declarationIndex;
344
+ return (targetIndex.get(a.targetId) ?? 0) - (targetIndex.get(b.targetId) ?? 0);
345
+ }
346
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/report/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Failure-location presentation: finds the user's failing line in a stack and
3
+ * renders a small annotated code frame around it. Generic over reporters; the
4
+ * list reporter is simply its first consumer.
5
+ */
6
+ export interface StackFrame {
7
+ readonly file: string;
8
+ readonly line: number;
9
+ readonly column: number;
10
+ }
11
+ /**
12
+ * First stack frame inside the project and outside node_modules: the line in
13
+ * the user's test file that the failure unwound through. Runner frames never
14
+ * match because the runner lives in node_modules (or outside the project root
15
+ * in a workspace).
16
+ */
17
+ export declare function userFrame(stack: string | undefined, projectRoot: string | undefined): StackFrame | undefined;
18
+ /** Renders the failing line with one line of context and a column caret. */
19
+ export declare function codeFrame(frame: StackFrame): string[];
20
+ //# sourceMappingURL=code-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-frame.d.ts","sourceRoot":"","sources":["../../src/report/code-frame.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,UAAU,GAAG,SAAS,CAkBxB;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAyBrD"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Failure-location presentation: finds the user's failing line in a stack and
3
+ * renders a small annotated code frame around it. Generic over reporters; the
4
+ * list reporter is simply its first consumer.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import pc from 'picocolors';
10
+ import { sanitizeText, truncateUtf8 } from '../internal/errors.js';
11
+ const MAX_FIELD_BYTES = 8192;
12
+ const FRAME_PATTERN = /((?:file:\/\/)?\/[^):]+):(\d+):(\d+)\)?\s*$/;
13
+ /**
14
+ * First stack frame inside the project and outside node_modules: the line in
15
+ * the user's test file that the failure unwound through. Runner frames never
16
+ * match because the runner lives in node_modules (or outside the project root
17
+ * in a workspace).
18
+ */
19
+ export function userFrame(stack, projectRoot) {
20
+ if (stack === undefined || projectRoot === undefined)
21
+ return undefined;
22
+ for (const raw of stack.split('\n')) {
23
+ const match = FRAME_PATTERN.exec(raw);
24
+ if (match === null)
25
+ continue;
26
+ const [, location, line, column] = match;
27
+ const withoutQuery = location.split('?')[0];
28
+ let file;
29
+ try {
30
+ file = withoutQuery.startsWith('file://') ? fileURLToPath(withoutQuery) : withoutQuery;
31
+ }
32
+ catch {
33
+ continue;
34
+ }
35
+ if (!file.startsWith(`${projectRoot}${path.sep}`))
36
+ continue;
37
+ if (file.includes(`${path.sep}node_modules${path.sep}`))
38
+ continue;
39
+ return { file, line: Number(line), column: Number(column) };
40
+ }
41
+ return undefined;
42
+ }
43
+ /** Renders the failing line with one line of context and a column caret. */
44
+ export function codeFrame(frame) {
45
+ let source;
46
+ try {
47
+ source = readFileSync(frame.file, 'utf8');
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ const lines = source.split('\n');
53
+ const index = frame.line - 1;
54
+ if (index < 0 || index >= lines.length)
55
+ return [];
56
+ const start = Math.max(0, index - 1);
57
+ const end = Math.min(lines.length - 1, index + 1);
58
+ const width = String(end + 1).length;
59
+ const rows = [];
60
+ for (let i = start; i <= end; i += 1) {
61
+ const text = truncateUtf8(sanitizeText(lines[i] ?? ''), MAX_FIELD_BYTES);
62
+ const number = String(i + 1).padStart(width);
63
+ if (i === index) {
64
+ rows.push(`${pc.red('>')} ${number} | ${text}`);
65
+ rows.push(` ${' '.repeat(width)} | ${' '.repeat(Math.max(0, frame.column - 1))}${pc.red('^')}`);
66
+ }
67
+ else {
68
+ rows.push(pc.dim(` ${number} | ${text}`));
69
+ }
70
+ }
71
+ return rows;
72
+ }
73
+ //# sourceMappingURL=code-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-frame.js","sourceRoot":"","sources":["../../src/report/code-frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `--debug` presentation of agent steps, derived entirely from the step
3
+ * records every run already collects for the report. There is no separate
4
+ * debug telemetry channel for agent steps: the timeline is the single account
5
+ * of what happened.
6
+ */
7
+ import type { ResultRecord, SerialGroupRecord } from '../run/records.ts';
8
+ /**
9
+ * Renders one aligned table of every agent step in the run, in execution
10
+ * order, with per-phase splits summed from the step's child events. Returns
11
+ * the empty string when the run performed no agent steps.
12
+ */
13
+ export declare function agentStepTable(results: readonly ResultRecord[], serialGroups: readonly SerialGroupRecord[]): string;
14
+ //# sourceMappingURL=debug-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-steps.d.ts","sourceRoot":"","sources":["../../src/report/debug-steps.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGzE;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,YAAY,EAAE,SAAS,iBAAiB,EAAE,GACzC,MAAM,CAoDR"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * `--debug` presentation of agent steps, derived entirely from the step
3
+ * records every run already collects for the report. There is no separate
4
+ * debug telemetry channel for agent steps: the timeline is the single account
5
+ * of what happened.
6
+ */
7
+ import { formatMs, table } from '../internal/debug.js';
8
+ /**
9
+ * Renders one aligned table of every agent step in the run, in execution
10
+ * order, with per-phase splits summed from the step's child events. Returns
11
+ * the empty string when the run performed no agent steps.
12
+ */
13
+ export function agentStepTable(results, serialGroups) {
14
+ const steps = collectAgentSteps(results, serialGroups);
15
+ if (steps.length === 0)
16
+ return '';
17
+ const models = new Set(steps
18
+ .map((step) => (step.model === undefined ? undefined : `${step.model.provider}/${step.model.model}`))
19
+ .filter((model) => model !== undefined));
20
+ const mixedModels = models.size > 1;
21
+ const rows = steps.map((step) => [
22
+ truncate(step.label === '' ? step.api : `${step.api} ${JSON.stringify(step.label)}`, 64),
23
+ ...(mixedModels
24
+ ? [step.model === undefined ? '-' : `${step.model.provider}/${step.model.model}`]
25
+ : []),
26
+ formatMs(step.durationMs),
27
+ formatMs(eventMs(step, 'model')),
28
+ formatMs(eventMs(step, 'observation')),
29
+ formatMs(eventMs(step, 'backend')),
30
+ String(step.model?.calls ?? 0),
31
+ `${String(step.model?.inputTokens ?? 0)}/${String(step.model?.outputTokens ?? 0)}`,
32
+ step.model?.estimatedCostUsd === undefined ? '-' : formatUsd(step.model.estimatedCostUsd),
33
+ ]);
34
+ const knownCosts = steps
35
+ .map((step) => step.model?.estimatedCostUsd)
36
+ .filter((cost) => cost !== undefined);
37
+ const total = knownCosts.length === 0
38
+ ? ''
39
+ : `, total ${formatUsd(knownCosts.reduce((sum, cost) => sum + cost, 0))}${knownCosts.length < steps.length ? '+' : ''}`;
40
+ const sharedModel = mixedModels || models.size === 0 ? '' : `, model ${[...models][0] ?? ''}`;
41
+ return table(`[e2e debug] agent steps (execution order${sharedModel}${total})`, [
42
+ 'step',
43
+ ...(mixedModels ? ['via'] : []),
44
+ 'total',
45
+ 'model',
46
+ 'observe',
47
+ 'action',
48
+ 'calls',
49
+ 'tokens in/out',
50
+ 'cost',
51
+ ], rows, '(no agent steps recorded)');
52
+ }
53
+ /** Agent steps from every attempt and serial member, in record order. */
54
+ function collectAgentSteps(results, serialGroups) {
55
+ const steps = [];
56
+ for (const result of results) {
57
+ for (const attempt of result.attempts) {
58
+ steps.push(...attempt.steps.filter((step) => step.kind === 'agent'));
59
+ }
60
+ }
61
+ for (const group of serialGroups) {
62
+ for (const attempt of group.attempts) {
63
+ for (const member of attempt.members) {
64
+ steps.push(...member.steps.filter((step) => step.kind === 'agent'));
65
+ }
66
+ }
67
+ }
68
+ return steps;
69
+ }
70
+ function eventMs(step, kind) {
71
+ return step.events
72
+ .filter((event) => event.kind === kind)
73
+ .reduce((total, event) => total + event.durationMs, 0);
74
+ }
75
+ function truncate(value, maxLength) {
76
+ if (value.length <= maxLength)
77
+ return value;
78
+ return `${value.slice(0, maxLength - 1)}…`;
79
+ }
80
+ function formatUsd(value) {
81
+ const digits = value >= 0.1 ? 2 : 6;
82
+ const trimmed = value.toFixed(digits).replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, '');
83
+ return `$${trimmed}`;
84
+ }
85
+ //# sourceMappingURL=debug-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-steps.js","sourceRoot":"","sources":["../../src/report/debug-steps.ts"],"names":[],"mappings":"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"}