e2e 0.15.2 → 0.17.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 (1024) hide show
  1. package/dist/.build.json +1 -1
  2. package/dist/agent/act-validation.d.ts +10 -1
  3. package/dist/agent/act-validation.js +48 -1
  4. package/dist/agent/act.d.ts +1 -2
  5. package/dist/agent/act.js +29 -9
  6. package/dist/agent/action-dispatcher.d.ts +0 -1
  7. package/dist/agent/action-dispatcher.js +4 -6
  8. package/dist/agent/action-names.d.ts +0 -1
  9. package/dist/agent/action-names.js +0 -1
  10. package/dist/agent/actions.d.ts +32 -24
  11. package/dist/agent/actions.js +38 -25
  12. package/dist/agent/agent-brand.d.ts +0 -1
  13. package/dist/agent/agent-brand.js +0 -1
  14. package/dist/agent/ai-sdk.d.ts +7 -1
  15. package/dist/agent/ai-sdk.js +11 -1
  16. package/dist/agent/call-options.d.ts +0 -1
  17. package/dist/agent/call-options.js +0 -1
  18. package/dist/agent/default-agent.d.ts +0 -1
  19. package/dist/agent/default-agent.js +0 -1
  20. package/dist/agent/derived.d.ts +0 -1
  21. package/dist/agent/derived.js +0 -1
  22. package/dist/agent/error.d.ts +0 -1
  23. package/dist/agent/error.js +0 -1
  24. package/dist/agent/executor.d.ts +0 -1
  25. package/dist/agent/executor.js +0 -1
  26. package/dist/agent/index.d.ts +0 -1
  27. package/dist/agent/index.js +0 -1
  28. package/dist/agent/interactive-step.d.ts +0 -1
  29. package/dist/agent/interactive-step.js +0 -1
  30. package/dist/agent/invocation.d.ts +0 -1
  31. package/dist/agent/invocation.js +10 -5
  32. package/dist/agent/ledger.d.ts +0 -1
  33. package/dist/agent/ledger.js +0 -1
  34. package/dist/agent/loop-guards.d.ts +0 -1
  35. package/dist/agent/loop-guards.js +0 -1
  36. package/dist/agent/model/adapter.d.ts +0 -1
  37. package/dist/agent/model/adapter.js +0 -1
  38. package/dist/agent/model/overflow.d.ts +0 -1
  39. package/dist/agent/model/overflow.js +0 -1
  40. package/dist/agent/model/provider-hints.d.ts +0 -1
  41. package/dist/agent/model/provider-hints.js +0 -1
  42. package/dist/agent/model/schema.d.ts +0 -1
  43. package/dist/agent/model/schema.js +0 -1
  44. package/dist/agent/model/sdk.d.ts +0 -1
  45. package/dist/agent/model/sdk.js +2 -1
  46. package/dist/agent/model/stall.d.ts +0 -1
  47. package/dist/agent/model/stall.js +0 -1
  48. package/dist/agent/model/tool-choice.d.ts +0 -1
  49. package/dist/agent/model/tool-choice.js +0 -1
  50. package/dist/agent/observation-budget.d.ts +0 -1
  51. package/dist/agent/observation-budget.js +0 -1
  52. package/dist/agent/observation-feed.d.ts +5 -7
  53. package/dist/agent/observation-feed.js +5 -8
  54. package/dist/agent/observation.d.ts +40 -12
  55. package/dist/agent/observation.js +109 -60
  56. package/dist/agent/operation-queue.d.ts +0 -1
  57. package/dist/agent/operation-queue.js +0 -1
  58. package/dist/agent/phases.d.ts +0 -1
  59. package/dist/agent/phases.js +0 -1
  60. package/dist/agent/pixels.d.ts +0 -1
  61. package/dist/agent/pixels.js +0 -1
  62. package/dist/agent/point-tap.d.ts +8 -9
  63. package/dist/agent/point-tap.js +1 -2
  64. package/dist/agent/primitives.d.ts +6 -1
  65. package/dist/agent/primitives.js +4 -2
  66. package/dist/agent/prompts.d.ts +0 -1
  67. package/dist/agent/prompts.js +0 -1
  68. package/dist/agent/protocol.d.ts +0 -1
  69. package/dist/agent/protocol.js +0 -1
  70. package/dist/agent/public.d.ts +0 -1
  71. package/dist/agent/public.js +0 -1
  72. package/dist/agent/reading.d.ts +0 -1
  73. package/dist/agent/reading.js +0 -1
  74. package/dist/agent/replay.d.ts +19 -9
  75. package/dist/agent/replay.js +11 -15
  76. package/dist/agent/screen-update.d.ts +0 -1
  77. package/dist/agent/screen-update.js +0 -1
  78. package/dist/agent/scroll-target.d.ts +2 -4
  79. package/dist/agent/scroll-target.js +0 -1
  80. package/dist/agent/secrets.d.ts +0 -1
  81. package/dist/agent/secrets.js +0 -1
  82. package/dist/agent/settle-policy.d.ts +0 -1
  83. package/dist/agent/settle-policy.js +0 -1
  84. package/dist/agent/step-accounting.d.ts +0 -1
  85. package/dist/agent/step-accounting.js +0 -1
  86. package/dist/agent/step-cache.d.ts +41 -15
  87. package/dist/agent/step-cache.js +147 -63
  88. package/dist/agent/tool-loop.d.ts +0 -1
  89. package/dist/agent/tool-loop.js +2 -1
  90. package/dist/agent/tool-output.d.ts +0 -1
  91. package/dist/agent/tool-output.js +0 -1
  92. package/dist/agent/tool.d.ts +0 -1
  93. package/dist/agent/tool.js +0 -1
  94. package/dist/agent/transcript-compaction.d.ts +0 -1
  95. package/dist/agent/transcript-compaction.js +0 -1
  96. package/dist/agent/upload-paths.d.ts +0 -1
  97. package/dist/agent/upload-paths.js +0 -1
  98. package/dist/agent/usage.d.ts +0 -1
  99. package/dist/agent/usage.js +0 -1
  100. package/dist/cache/anchors.d.ts +72 -24
  101. package/dist/cache/anchors.js +233 -61
  102. package/dist/cache/context.d.ts +25 -15
  103. package/dist/cache/context.js +50 -9
  104. package/dist/cache/decide.d.ts +2 -3
  105. package/dist/cache/decide.js +4 -7
  106. package/dist/cache/identity.d.ts +18 -5
  107. package/dist/cache/identity.js +9 -5
  108. package/dist/cache/recorder.d.ts +15 -2
  109. package/dist/cache/recorder.js +36 -24
  110. package/dist/cache/rekeyed.d.ts +46 -0
  111. package/dist/cache/rekeyed.js +89 -0
  112. package/dist/cache/relocate.d.ts +14 -15
  113. package/dist/cache/relocate.js +33 -26
  114. package/dist/cache/route.d.ts +32 -34
  115. package/dist/cache/route.js +94 -51
  116. package/dist/cache/store.d.ts +6 -1
  117. package/dist/cache/store.js +21 -2
  118. package/dist/cache/template.d.ts +0 -1
  119. package/dist/cache/template.js +0 -1
  120. package/dist/cache/trace.d.ts +53 -15
  121. package/dist/cache/trace.js +70 -29
  122. package/dist/cli/bin.d.ts +0 -1
  123. package/dist/cli/bin.js +0 -1
  124. package/dist/cli/cache.d.ts +0 -1
  125. package/dist/cli/cache.js +0 -1
  126. package/dist/cli/docs-url.d.ts +0 -1
  127. package/dist/cli/docs-url.js +0 -1
  128. package/dist/cli/feedback.d.ts +0 -1
  129. package/dist/cli/feedback.js +0 -1
  130. package/dist/cli/guide.d.ts +0 -1
  131. package/dist/cli/guide.js +0 -1
  132. package/dist/cli/index.d.ts +0 -1
  133. package/dist/cli/index.js +10 -11
  134. package/dist/cli/init/agent-skill.d.ts +0 -1
  135. package/dist/cli/init/agent-skill.js +0 -1
  136. package/dist/cli/init/engines.d.ts +1 -4
  137. package/dist/cli/init/engines.js +2 -3
  138. package/dist/cli/init/gateways.d.ts +1 -2
  139. package/dist/cli/init/gateways.js +11 -2
  140. package/dist/cli/init/mcp-config.d.ts +0 -1
  141. package/dist/cli/init/mcp-config.js +0 -1
  142. package/dist/cli/init/package.d.ts +0 -1
  143. package/dist/cli/init/package.js +0 -1
  144. package/dist/cli/init/scaffold.d.ts +0 -1
  145. package/dist/cli/init/scaffold.js +0 -1
  146. package/dist/cli/init/sibling-versions.json +1 -1
  147. package/dist/cli/init/versions.d.ts +0 -9
  148. package/dist/cli/init/versions.js +1 -11
  149. package/dist/cli/init.d.ts +0 -1
  150. package/dist/cli/init.js +0 -1
  151. package/dist/cli/mcp.d.ts +9 -2
  152. package/dist/cli/mcp.js +14 -2
  153. package/dist/cli/signals.d.ts +0 -1
  154. package/dist/cli/signals.js +0 -1
  155. package/dist/cli/skill.d.ts +0 -1
  156. package/dist/cli/skill.js +0 -1
  157. package/dist/cli/telemetry.d.ts +0 -1
  158. package/dist/cli/telemetry.js +1 -2
  159. package/dist/cli/wordmark.d.ts +0 -1
  160. package/dist/cli/wordmark.js +0 -1
  161. package/dist/collect/collect.d.ts +0 -1
  162. package/dist/collect/collect.js +3 -2
  163. package/dist/collect/registry.d.ts +6 -3
  164. package/dist/collect/registry.js +31 -14
  165. package/dist/collect/select.d.ts +0 -1
  166. package/dist/collect/select.js +0 -1
  167. package/dist/config/agent.d.ts +0 -1
  168. package/dist/config/agent.js +0 -1
  169. package/dist/config/app.d.ts +0 -1
  170. package/dist/config/app.js +0 -1
  171. package/dist/config/command.d.ts +0 -1
  172. package/dist/config/command.js +0 -1
  173. package/dist/config/diagnose.d.ts +0 -1
  174. package/dist/config/diagnose.js +0 -1
  175. package/dist/config/esm-hooks.d.ts +0 -1
  176. package/dist/config/esm-hooks.js +0 -1
  177. package/dist/config/load.d.ts +0 -1
  178. package/dist/config/load.js +0 -1
  179. package/dist/config/resolve.d.ts +1 -1
  180. package/dist/config/resolve.js +33 -2
  181. package/dist/config/secrets.d.ts +0 -1
  182. package/dist/config/secrets.js +0 -1
  183. package/dist/config/targets.d.ts +0 -1
  184. package/dist/config/targets.js +0 -1
  185. package/dist/config/validate.d.ts +0 -1
  186. package/dist/config/validate.js +0 -1
  187. package/dist/engine/contract.d.ts +0 -1
  188. package/dist/engine/contract.js +0 -1
  189. package/dist/engine/index.d.ts +3 -4
  190. package/dist/engine/index.js +4 -4
  191. package/dist/engine/manifest.d.ts +0 -1
  192. package/dist/engine/manifest.js +0 -1
  193. package/dist/engine/recording.d.ts +0 -1
  194. package/dist/engine/recording.js +0 -1
  195. package/dist/engine/resolve.d.ts +0 -1
  196. package/dist/engine/resolve.js +0 -1
  197. package/dist/engine/session.d.ts +0 -1
  198. package/dist/engine/session.js +0 -1
  199. package/dist/engine/surface.d.ts +0 -1
  200. package/dist/engine/surface.js +0 -1
  201. package/dist/engine/timing.d.ts +0 -1
  202. package/dist/engine/timing.js +0 -1
  203. package/dist/expect/async.d.ts +0 -1
  204. package/dist/expect/async.js +101 -59
  205. package/dist/expect/attempt.d.ts +0 -1
  206. package/dist/expect/attempt.js +0 -1
  207. package/dist/expect/index.d.ts +0 -1
  208. package/dist/expect/index.js +0 -1
  209. package/dist/expect/poll-scope.d.ts +52 -0
  210. package/dist/expect/poll-scope.js +113 -0
  211. package/dist/expect/poll.d.ts +0 -1
  212. package/dist/expect/poll.js +31 -5
  213. package/dist/expect/soft.d.ts +0 -1
  214. package/dist/expect/soft.js +0 -1
  215. package/dist/expect/values.d.ts +0 -1
  216. package/dist/expect/values.js +11 -5
  217. package/dist/explore/body.d.ts +0 -1
  218. package/dist/explore/body.js +0 -1
  219. package/dist/explore/executor.d.ts +0 -1
  220. package/dist/explore/executor.js +0 -1
  221. package/dist/explore/index.d.ts +0 -1
  222. package/dist/explore/index.js +16 -2
  223. package/dist/explore/plan.d.ts +0 -1
  224. package/dist/explore/plan.js +0 -1
  225. package/dist/explore/progress.d.ts +0 -1
  226. package/dist/explore/progress.js +0 -1
  227. package/dist/explore/state.d.ts +0 -1
  228. package/dist/explore/state.js +0 -1
  229. package/dist/index.d.ts +0 -1
  230. package/dist/index.js +0 -1
  231. package/dist/internal/abandoned.d.ts +11 -0
  232. package/dist/internal/abandoned.js +23 -0
  233. package/dist/internal/ai-trace.d.ts +0 -1
  234. package/dist/internal/ai-trace.js +0 -1
  235. package/dist/internal/atomic-write.d.ts +0 -1
  236. package/dist/internal/atomic-write.js +0 -1
  237. package/dist/internal/brands.d.ts +2 -1
  238. package/dist/internal/brands.js +2 -1
  239. package/dist/internal/client-identity.d.ts +9 -0
  240. package/dist/internal/client-identity.js +14 -0
  241. package/dist/internal/debug.d.ts +0 -1
  242. package/dist/internal/debug.js +0 -1
  243. package/dist/internal/env.d.ts +0 -1
  244. package/dist/internal/env.js +0 -1
  245. package/dist/internal/errors.d.ts +0 -1
  246. package/dist/internal/errors.js +0 -1
  247. package/dist/internal/geometry.d.ts +0 -1
  248. package/dist/internal/geometry.js +0 -1
  249. package/dist/internal/git.d.ts +0 -1
  250. package/dist/internal/git.js +0 -1
  251. package/dist/internal/globs.d.ts +0 -1
  252. package/dist/internal/globs.js +0 -1
  253. package/dist/internal/ids.d.ts +0 -1
  254. package/dist/internal/ids.js +0 -1
  255. package/dist/internal/json-value.d.ts +0 -1
  256. package/dist/internal/json-value.js +0 -1
  257. package/dist/internal/keys.d.ts +0 -1
  258. package/dist/internal/keys.js +0 -1
  259. package/dist/internal/node-version.d.ts +0 -1
  260. package/dist/internal/node-version.js +0 -1
  261. package/dist/internal/objects.d.ts +0 -1
  262. package/dist/internal/objects.js +0 -1
  263. package/dist/internal/options.d.ts +0 -1
  264. package/dist/internal/options.js +0 -1
  265. package/dist/internal/package-manager.d.ts +0 -1
  266. package/dist/internal/package-manager.js +0 -1
  267. package/dist/internal/package-version.d.ts +0 -1
  268. package/dist/internal/package-version.js +0 -1
  269. package/dist/internal/paths.d.ts +0 -1
  270. package/dist/internal/paths.js +0 -1
  271. package/dist/internal/realm-slot.d.ts +0 -1
  272. package/dist/internal/realm-slot.js +0 -1
  273. package/dist/internal/recording-modes.d.ts +0 -1
  274. package/dist/internal/recording-modes.js +0 -1
  275. package/dist/internal/redact.d.ts +7 -5
  276. package/dist/internal/redact.js +116 -24
  277. package/dist/internal/regexp.d.ts +0 -1
  278. package/dist/internal/regexp.js +0 -1
  279. package/dist/internal/roles.d.ts +0 -1
  280. package/dist/internal/roles.js +0 -1
  281. package/dist/internal/skip.d.ts +0 -1
  282. package/dist/internal/skip.js +0 -1
  283. package/dist/internal/source.d.ts +0 -1
  284. package/dist/internal/source.js +0 -1
  285. package/dist/internal/standard-schema.d.ts +0 -1
  286. package/dist/internal/standard-schema.js +0 -1
  287. package/dist/internal/suggest.d.ts +0 -1
  288. package/dist/internal/suggest.js +0 -1
  289. package/dist/internal/text.d.ts +8 -1
  290. package/dist/internal/text.js +13 -2
  291. package/dist/internal/time.d.ts +6 -1
  292. package/dist/internal/time.js +25 -14
  293. package/dist/internal/urls.d.ts +9 -6
  294. package/dist/internal/urls.js +19 -11
  295. package/dist/internal/vcs.d.ts +0 -1
  296. package/dist/internal/vcs.js +0 -1
  297. package/dist/internal/zip.d.ts +0 -1
  298. package/dist/internal/zip.js +0 -1
  299. package/dist/locator/engine.d.ts +12 -3
  300. package/dist/locator/engine.js +8 -4
  301. package/dist/locator/expression.d.ts +0 -1
  302. package/dist/locator/expression.js +0 -1
  303. package/dist/locator/screen.d.ts +0 -1
  304. package/dist/locator/screen.js +28 -5
  305. package/dist/mcp/catalog.d.ts +7 -3
  306. package/dist/mcp/catalog.js +8 -9
  307. package/dist/mcp/config.d.ts +0 -1
  308. package/dist/mcp/config.js +0 -1
  309. package/dist/mcp/recording.d.ts +0 -1
  310. package/dist/mcp/recording.js +0 -1
  311. package/dist/mcp/server.d.ts +8 -1
  312. package/dist/mcp/server.js +8 -5
  313. package/dist/mcp/session.d.ts +4 -2
  314. package/dist/mcp/session.js +44 -22
  315. package/dist/mcp/sessions.d.ts +2 -1
  316. package/dist/mcp/sessions.js +5 -2
  317. package/dist/mcp/tools.d.ts +7 -6
  318. package/dist/mcp/tools.js +36 -11
  319. package/dist/mcp/usage.d.ts +61 -0
  320. package/dist/mcp/usage.js +73 -0
  321. package/dist/oauth/callback-server.d.ts +0 -1
  322. package/dist/oauth/callback-server.js +0 -1
  323. package/dist/oauth/chatgpt.d.ts +0 -1
  324. package/dist/oauth/chatgpt.js +3 -24
  325. package/dist/oauth/cli.d.ts +0 -1
  326. package/dist/oauth/cli.js +1 -1
  327. package/dist/oauth/copilot.d.ts +5 -5
  328. package/dist/oauth/copilot.js +80 -8
  329. package/dist/oauth/device-code.d.ts +0 -1
  330. package/dist/oauth/device-code.js +0 -1
  331. package/dist/oauth/errors.d.ts +0 -1
  332. package/dist/oauth/errors.js +0 -1
  333. package/dist/oauth/fetch.d.ts +0 -1
  334. package/dist/oauth/fetch.js +0 -1
  335. package/dist/oauth/grok.d.ts +0 -1
  336. package/dist/oauth/grok.js +2 -2
  337. package/dist/oauth/jwt.d.ts +0 -1
  338. package/dist/oauth/jwt.js +0 -1
  339. package/dist/oauth/login.d.ts +0 -1
  340. package/dist/oauth/login.js +0 -1
  341. package/dist/oauth/models.d.ts +0 -1
  342. package/dist/oauth/models.js +2 -2
  343. package/dist/oauth/opencode-console.d.ts +10 -0
  344. package/dist/oauth/opencode-console.js +133 -0
  345. package/dist/oauth/pkce.d.ts +0 -1
  346. package/dist/oauth/pkce.js +0 -1
  347. package/dist/oauth/providers/github-copilot.d.ts +12 -1
  348. package/dist/oauth/providers/github-copilot.js +80 -19
  349. package/dist/oauth/providers/openai.d.ts +0 -1
  350. package/dist/oauth/providers/openai.js +1 -2
  351. package/dist/oauth/providers/opencode-console.d.ts +31 -0
  352. package/dist/oauth/providers/opencode-console.js +148 -0
  353. package/dist/oauth/providers/xai.d.ts +0 -1
  354. package/dist/oauth/providers/xai.js +0 -1
  355. package/dist/oauth/providers.d.ts +2 -7
  356. package/dist/oauth/providers.js +3 -8
  357. package/dist/oauth/responses.d.ts +9 -0
  358. package/dist/oauth/responses.js +23 -0
  359. package/dist/oauth/sse.d.ts +0 -1
  360. package/dist/oauth/sse.js +0 -1
  361. package/dist/oauth/store.d.ts +0 -1
  362. package/dist/oauth/store.js +0 -1
  363. package/dist/oauth/token-endpoint.d.ts +0 -1
  364. package/dist/oauth/token-endpoint.js +0 -1
  365. package/dist/oauth/types.d.ts +0 -1
  366. package/dist/oauth/types.js +0 -1
  367. package/dist/params.d.ts +0 -1
  368. package/dist/params.js +0 -1
  369. package/dist/report/build.d.ts +26 -1
  370. package/dist/report/build.js +16 -9
  371. package/dist/report/builtin.d.ts +0 -1
  372. package/dist/report/builtin.js +0 -1
  373. package/dist/report/code-frame.d.ts +0 -1
  374. package/dist/report/code-frame.js +0 -1
  375. package/dist/report/debug-steps.d.ts +0 -1
  376. package/dist/report/debug-steps.js +0 -1
  377. package/dist/report/explore-text.d.ts +0 -1
  378. package/dist/report/explore-text.js +0 -1
  379. package/dist/report/failure-text.d.ts +6 -2
  380. package/dist/report/failure-text.js +14 -5
  381. package/dist/report/format.d.ts +10 -6
  382. package/dist/report/format.js +12 -6
  383. package/dist/report/json.d.ts +0 -1
  384. package/dist/report/json.js +0 -1
  385. package/dist/report/junit.d.ts +0 -1
  386. package/dist/report/junit.js +11 -13
  387. package/dist/report/list-explore.d.ts +0 -1
  388. package/dist/report/list-explore.js +0 -1
  389. package/dist/report/list-model.d.ts +0 -1
  390. package/dist/report/list-model.js +0 -1
  391. package/dist/report/list-steps.d.ts +0 -1
  392. package/dist/report/list-steps.js +0 -1
  393. package/dist/report/list.d.ts +1 -1
  394. package/dist/report/list.js +38 -19
  395. package/dist/report/live-window.d.ts +0 -1
  396. package/dist/report/live-window.js +0 -1
  397. package/dist/report/markdown-text.d.ts +0 -1
  398. package/dist/report/markdown-text.js +0 -1
  399. package/dist/report/markdown.d.ts +1 -2
  400. package/dist/report/markdown.js +37 -15
  401. package/dist/report/outcome.d.ts +0 -1
  402. package/dist/report/outcome.js +0 -1
  403. package/dist/report/repeats.d.ts +6 -2
  404. package/dist/report/repeats.js +12 -4
  405. package/dist/report/running-tree.d.ts +0 -1
  406. package/dist/report/running-tree.js +0 -1
  407. package/dist/report/write.d.ts +0 -1
  408. package/dist/report/write.js +0 -1
  409. package/dist/run/app-ports.d.ts +0 -1
  410. package/dist/run/app-ports.js +0 -1
  411. package/dist/run/artifacts.d.ts +18 -1
  412. package/dist/run/artifacts.js +68 -2
  413. package/dist/run/budget.d.ts +0 -1
  414. package/dist/run/budget.js +0 -1
  415. package/dist/run/declared-processes.d.ts +0 -1
  416. package/dist/run/declared-processes.js +0 -1
  417. package/dist/run/events.d.ts +0 -1
  418. package/dist/run/events.js +0 -1
  419. package/dist/run/execute.d.ts +9 -1
  420. package/dist/run/execute.js +55 -29
  421. package/dist/run/extended-fixtures.d.ts +0 -1
  422. package/dist/run/extended-fixtures.js +6 -3
  423. package/dist/run/failure-evidence.d.ts +0 -1
  424. package/dist/run/failure-evidence.js +4 -3
  425. package/dist/run/fixture-recording.d.ts +0 -1
  426. package/dist/run/fixture-recording.js +0 -1
  427. package/dist/run/fixtures.d.ts +0 -1
  428. package/dist/run/fixtures.js +6 -9
  429. package/dist/run/in-process.d.ts +2 -1
  430. package/dist/run/in-process.js +1 -1
  431. package/dist/run/last-run.d.ts +42 -9
  432. package/dist/run/last-run.js +121 -15
  433. package/dist/run/managed-process.d.ts +0 -1
  434. package/dist/run/managed-process.js +0 -1
  435. package/dist/run/output.d.ts +0 -1
  436. package/dist/run/output.js +0 -1
  437. package/dist/run/process-pool.d.ts +0 -1
  438. package/dist/run/process-pool.js +0 -1
  439. package/dist/run/provision.d.ts +0 -1
  440. package/dist/run/provision.js +0 -1
  441. package/dist/run/realm.d.ts +6 -2
  442. package/dist/run/realm.js +21 -8
  443. package/dist/run/records.d.ts +16 -1
  444. package/dist/run/records.js +26 -1
  445. package/dist/run/retry.d.ts +3 -2
  446. package/dist/run/retry.js +4 -3
  447. package/dist/run/runner.d.ts +3 -2
  448. package/dist/run/runner.js +70 -32
  449. package/dist/run/scheduler.d.ts +0 -1
  450. package/dist/run/scheduler.js +0 -1
  451. package/dist/run/secrecy.d.ts +15 -1
  452. package/dist/run/secrecy.js +27 -2
  453. package/dist/run/serial.d.ts +2 -1
  454. package/dist/run/serial.js +8 -6
  455. package/dist/run/sessions.d.ts +0 -1
  456. package/dist/run/sessions.js +0 -1
  457. package/dist/run/standalone.d.ts +0 -1
  458. package/dist/run/standalone.js +3 -3
  459. package/dist/run/steps.d.ts +2 -9
  460. package/dist/run/steps.js +7 -22
  461. package/dist/run/trace-redaction.d.ts +0 -1
  462. package/dist/run/trace-redaction.js +0 -1
  463. package/dist/run/unit-runner.d.ts +0 -1
  464. package/dist/run/unit-runner.js +0 -1
  465. package/dist/run/units.d.ts +0 -1
  466. package/dist/run/units.js +0 -1
  467. package/dist/run/worker/entry.d.ts +0 -1
  468. package/dist/run/worker/entry.js +7 -7
  469. package/dist/run/worker/handle.d.ts +0 -1
  470. package/dist/run/worker/handle.js +0 -1
  471. package/dist/run/worker/protocol.d.ts +2 -1
  472. package/dist/run/worker/protocol.js +0 -1
  473. package/dist/run/worker/session.d.ts +2 -1
  474. package/dist/run/worker/session.js +1 -1
  475. package/dist/run/worker-models.d.ts +0 -1
  476. package/dist/run/worker-models.js +0 -1
  477. package/dist/secrets.d.ts +0 -1
  478. package/dist/secrets.js +0 -1
  479. package/dist/telemetry/checkout.d.ts +0 -1
  480. package/dist/telemetry/checkout.js +0 -1
  481. package/dist/telemetry/environment.d.ts +0 -1
  482. package/dist/telemetry/environment.js +0 -1
  483. package/dist/telemetry/events.d.ts +26 -10
  484. package/dist/telemetry/events.js +108 -13
  485. package/dist/telemetry/failure-kind.d.ts +0 -1
  486. package/dist/telemetry/failure-kind.js +0 -1
  487. package/dist/telemetry/posthog.d.ts +0 -1
  488. package/dist/telemetry/posthog.js +0 -1
  489. package/dist/telemetry/project.d.ts +0 -1
  490. package/dist/telemetry/project.js +0 -1
  491. package/dist/telemetry/store.d.ts +0 -1
  492. package/dist/telemetry/store.js +0 -1
  493. package/dist/telemetry/telemetry.d.ts +19 -8
  494. package/dist/telemetry/telemetry.js +26 -9
  495. package/dist/telemetry/token.d.ts +0 -1
  496. package/dist/telemetry/token.js +0 -1
  497. package/dist/types.d.ts +34 -26
  498. package/dist/types.js +0 -1
  499. package/docs/agents.mdx +6 -3
  500. package/docs/assertions.mdx +94 -0
  501. package/docs/authentication.mdx +3 -1
  502. package/docs/browser.mdx +42 -6
  503. package/docs/cache.mdx +64 -18
  504. package/docs/ci.mdx +11 -7
  505. package/docs/debugging.mdx +6 -3
  506. package/docs/executors.mdx +5 -3
  507. package/docs/github.mdx +12 -4
  508. package/docs/{writing-tests.mdx → goals.mdx} +21 -101
  509. package/docs/index.mdx +4 -4
  510. package/docs/integrations/kernel.mdx +1 -1
  511. package/docs/locators.mdx +64 -0
  512. package/docs/migrate/cypress.mdx +2 -2
  513. package/docs/migrate/maestro.mdx +2 -2
  514. package/docs/migrate/playwright.mdx +22 -16
  515. package/docs/migrate/selenium.mdx +2 -2
  516. package/docs/mobile.mdx +61 -4
  517. package/docs/models.mdx +53 -7
  518. package/docs/physical-devices.mdx +76 -0
  519. package/docs/quickstart.mdx +4 -3
  520. package/docs/reference/app.mdx +1 -1
  521. package/docs/reference/cli.mdx +30 -11
  522. package/docs/reference/config.mdx +25 -7
  523. package/docs/reference/engine.mdx +4 -3
  524. package/docs/reference/environment.mdx +8 -1
  525. package/docs/reference/errors.mdx +5 -5
  526. package/docs/reference/expect.mdx +79 -24
  527. package/docs/reference/mcp.mdx +3 -0
  528. package/docs/reference/mobile.mdx +23 -13
  529. package/docs/reference/reporters.mdx +8 -2
  530. package/docs/reference/screen.mdx +30 -7
  531. package/docs/reference/test.mdx +11 -4
  532. package/docs/reference/web.mdx +131 -23
  533. package/docs/security.mdx +45 -19
  534. package/docs/subscriptions.mdx +97 -9
  535. package/docs/telemetry.mdx +48 -6
  536. package/package.json +18 -4
  537. package/schema/report-v1.schema.json +14 -1
  538. package/skills/e2e/SKILL.md +2 -2
  539. package/skills/e2e/references/agent.md +22 -11
  540. package/skills/e2e/references/debugging.md +4 -4
  541. package/skills/e2e/references/mcp.md +3 -0
  542. package/skills/e2e/references/running.md +13 -8
  543. package/skills/e2e/references/setup.md +42 -15
  544. package/skills/e2e/references/writing-tests.md +43 -15
  545. package/dist/agent/act-validation.d.ts.map +0 -1
  546. package/dist/agent/act-validation.js.map +0 -1
  547. package/dist/agent/act.d.ts.map +0 -1
  548. package/dist/agent/act.js.map +0 -1
  549. package/dist/agent/action-dispatcher.d.ts.map +0 -1
  550. package/dist/agent/action-dispatcher.js.map +0 -1
  551. package/dist/agent/action-names.d.ts.map +0 -1
  552. package/dist/agent/action-names.js.map +0 -1
  553. package/dist/agent/actions.d.ts.map +0 -1
  554. package/dist/agent/actions.js.map +0 -1
  555. package/dist/agent/agent-brand.d.ts.map +0 -1
  556. package/dist/agent/agent-brand.js.map +0 -1
  557. package/dist/agent/ai-sdk.d.ts.map +0 -1
  558. package/dist/agent/ai-sdk.js.map +0 -1
  559. package/dist/agent/call-options.d.ts.map +0 -1
  560. package/dist/agent/call-options.js.map +0 -1
  561. package/dist/agent/default-agent.d.ts.map +0 -1
  562. package/dist/agent/default-agent.js.map +0 -1
  563. package/dist/agent/derived.d.ts.map +0 -1
  564. package/dist/agent/derived.js.map +0 -1
  565. package/dist/agent/error.d.ts.map +0 -1
  566. package/dist/agent/error.js.map +0 -1
  567. package/dist/agent/executor.d.ts.map +0 -1
  568. package/dist/agent/executor.js.map +0 -1
  569. package/dist/agent/index.d.ts.map +0 -1
  570. package/dist/agent/index.js.map +0 -1
  571. package/dist/agent/interactive-step.d.ts.map +0 -1
  572. package/dist/agent/interactive-step.js.map +0 -1
  573. package/dist/agent/invocation.d.ts.map +0 -1
  574. package/dist/agent/invocation.js.map +0 -1
  575. package/dist/agent/ledger.d.ts.map +0 -1
  576. package/dist/agent/ledger.js.map +0 -1
  577. package/dist/agent/loop-guards.d.ts.map +0 -1
  578. package/dist/agent/loop-guards.js.map +0 -1
  579. package/dist/agent/model/adapter.d.ts.map +0 -1
  580. package/dist/agent/model/adapter.js.map +0 -1
  581. package/dist/agent/model/overflow.d.ts.map +0 -1
  582. package/dist/agent/model/overflow.js.map +0 -1
  583. package/dist/agent/model/provider-hints.d.ts.map +0 -1
  584. package/dist/agent/model/provider-hints.js.map +0 -1
  585. package/dist/agent/model/schema.d.ts.map +0 -1
  586. package/dist/agent/model/schema.js.map +0 -1
  587. package/dist/agent/model/sdk.d.ts.map +0 -1
  588. package/dist/agent/model/sdk.js.map +0 -1
  589. package/dist/agent/model/stall.d.ts.map +0 -1
  590. package/dist/agent/model/stall.js.map +0 -1
  591. package/dist/agent/model/tool-choice.d.ts.map +0 -1
  592. package/dist/agent/model/tool-choice.js.map +0 -1
  593. package/dist/agent/observation-budget.d.ts.map +0 -1
  594. package/dist/agent/observation-budget.js.map +0 -1
  595. package/dist/agent/observation-feed.d.ts.map +0 -1
  596. package/dist/agent/observation-feed.js.map +0 -1
  597. package/dist/agent/observation.d.ts.map +0 -1
  598. package/dist/agent/observation.js.map +0 -1
  599. package/dist/agent/operation-queue.d.ts.map +0 -1
  600. package/dist/agent/operation-queue.js.map +0 -1
  601. package/dist/agent/phases.d.ts.map +0 -1
  602. package/dist/agent/phases.js.map +0 -1
  603. package/dist/agent/pixels.d.ts.map +0 -1
  604. package/dist/agent/pixels.js.map +0 -1
  605. package/dist/agent/point-tap.d.ts.map +0 -1
  606. package/dist/agent/point-tap.js.map +0 -1
  607. package/dist/agent/primitives.d.ts.map +0 -1
  608. package/dist/agent/primitives.js.map +0 -1
  609. package/dist/agent/prompts.d.ts.map +0 -1
  610. package/dist/agent/prompts.js.map +0 -1
  611. package/dist/agent/protocol.d.ts.map +0 -1
  612. package/dist/agent/protocol.js.map +0 -1
  613. package/dist/agent/public.d.ts.map +0 -1
  614. package/dist/agent/public.js.map +0 -1
  615. package/dist/agent/reading.d.ts.map +0 -1
  616. package/dist/agent/reading.js.map +0 -1
  617. package/dist/agent/replay.d.ts.map +0 -1
  618. package/dist/agent/replay.js.map +0 -1
  619. package/dist/agent/screen-update.d.ts.map +0 -1
  620. package/dist/agent/screen-update.js.map +0 -1
  621. package/dist/agent/scroll-target.d.ts.map +0 -1
  622. package/dist/agent/scroll-target.js.map +0 -1
  623. package/dist/agent/secrets.d.ts.map +0 -1
  624. package/dist/agent/secrets.js.map +0 -1
  625. package/dist/agent/settle-policy.d.ts.map +0 -1
  626. package/dist/agent/settle-policy.js.map +0 -1
  627. package/dist/agent/step-accounting.d.ts.map +0 -1
  628. package/dist/agent/step-accounting.js.map +0 -1
  629. package/dist/agent/step-cache.d.ts.map +0 -1
  630. package/dist/agent/step-cache.js.map +0 -1
  631. package/dist/agent/tool-loop.d.ts.map +0 -1
  632. package/dist/agent/tool-loop.js.map +0 -1
  633. package/dist/agent/tool-output.d.ts.map +0 -1
  634. package/dist/agent/tool-output.js.map +0 -1
  635. package/dist/agent/tool.d.ts.map +0 -1
  636. package/dist/agent/tool.js.map +0 -1
  637. package/dist/agent/transcript-compaction.d.ts.map +0 -1
  638. package/dist/agent/transcript-compaction.js.map +0 -1
  639. package/dist/agent/upload-paths.d.ts.map +0 -1
  640. package/dist/agent/upload-paths.js.map +0 -1
  641. package/dist/agent/usage.d.ts.map +0 -1
  642. package/dist/agent/usage.js.map +0 -1
  643. package/dist/cache/anchors.d.ts.map +0 -1
  644. package/dist/cache/anchors.js.map +0 -1
  645. package/dist/cache/context.d.ts.map +0 -1
  646. package/dist/cache/context.js.map +0 -1
  647. package/dist/cache/decide.d.ts.map +0 -1
  648. package/dist/cache/decide.js.map +0 -1
  649. package/dist/cache/identity.d.ts.map +0 -1
  650. package/dist/cache/identity.js.map +0 -1
  651. package/dist/cache/recorder.d.ts.map +0 -1
  652. package/dist/cache/recorder.js.map +0 -1
  653. package/dist/cache/relocate.d.ts.map +0 -1
  654. package/dist/cache/relocate.js.map +0 -1
  655. package/dist/cache/route.d.ts.map +0 -1
  656. package/dist/cache/route.js.map +0 -1
  657. package/dist/cache/store.d.ts.map +0 -1
  658. package/dist/cache/store.js.map +0 -1
  659. package/dist/cache/template.d.ts.map +0 -1
  660. package/dist/cache/template.js.map +0 -1
  661. package/dist/cache/trace.d.ts.map +0 -1
  662. package/dist/cache/trace.js.map +0 -1
  663. package/dist/cli/bin.d.ts.map +0 -1
  664. package/dist/cli/bin.js.map +0 -1
  665. package/dist/cli/cache.d.ts.map +0 -1
  666. package/dist/cli/cache.js.map +0 -1
  667. package/dist/cli/docs-url.d.ts.map +0 -1
  668. package/dist/cli/docs-url.js.map +0 -1
  669. package/dist/cli/feedback.d.ts.map +0 -1
  670. package/dist/cli/feedback.js.map +0 -1
  671. package/dist/cli/guide.d.ts.map +0 -1
  672. package/dist/cli/guide.js.map +0 -1
  673. package/dist/cli/index.d.ts.map +0 -1
  674. package/dist/cli/index.js.map +0 -1
  675. package/dist/cli/init/agent-skill.d.ts.map +0 -1
  676. package/dist/cli/init/agent-skill.js.map +0 -1
  677. package/dist/cli/init/engines.d.ts.map +0 -1
  678. package/dist/cli/init/engines.js.map +0 -1
  679. package/dist/cli/init/gateways.d.ts.map +0 -1
  680. package/dist/cli/init/gateways.js.map +0 -1
  681. package/dist/cli/init/mcp-config.d.ts.map +0 -1
  682. package/dist/cli/init/mcp-config.js.map +0 -1
  683. package/dist/cli/init/package.d.ts.map +0 -1
  684. package/dist/cli/init/package.js.map +0 -1
  685. package/dist/cli/init/scaffold.d.ts.map +0 -1
  686. package/dist/cli/init/scaffold.js.map +0 -1
  687. package/dist/cli/init/versions.d.ts.map +0 -1
  688. package/dist/cli/init/versions.js.map +0 -1
  689. package/dist/cli/init.d.ts.map +0 -1
  690. package/dist/cli/init.js.map +0 -1
  691. package/dist/cli/mcp.d.ts.map +0 -1
  692. package/dist/cli/mcp.js.map +0 -1
  693. package/dist/cli/signals.d.ts.map +0 -1
  694. package/dist/cli/signals.js.map +0 -1
  695. package/dist/cli/skill.d.ts.map +0 -1
  696. package/dist/cli/skill.js.map +0 -1
  697. package/dist/cli/telemetry.d.ts.map +0 -1
  698. package/dist/cli/telemetry.js.map +0 -1
  699. package/dist/cli/wordmark.d.ts.map +0 -1
  700. package/dist/cli/wordmark.js.map +0 -1
  701. package/dist/collect/collect.d.ts.map +0 -1
  702. package/dist/collect/collect.js.map +0 -1
  703. package/dist/collect/registry.d.ts.map +0 -1
  704. package/dist/collect/registry.js.map +0 -1
  705. package/dist/collect/select.d.ts.map +0 -1
  706. package/dist/collect/select.js.map +0 -1
  707. package/dist/config/agent.d.ts.map +0 -1
  708. package/dist/config/agent.js.map +0 -1
  709. package/dist/config/app.d.ts.map +0 -1
  710. package/dist/config/app.js.map +0 -1
  711. package/dist/config/command.d.ts.map +0 -1
  712. package/dist/config/command.js.map +0 -1
  713. package/dist/config/diagnose.d.ts.map +0 -1
  714. package/dist/config/diagnose.js.map +0 -1
  715. package/dist/config/esm-hooks.d.ts.map +0 -1
  716. package/dist/config/esm-hooks.js.map +0 -1
  717. package/dist/config/load.d.ts.map +0 -1
  718. package/dist/config/load.js.map +0 -1
  719. package/dist/config/resolve.d.ts.map +0 -1
  720. package/dist/config/resolve.js.map +0 -1
  721. package/dist/config/secrets.d.ts.map +0 -1
  722. package/dist/config/secrets.js.map +0 -1
  723. package/dist/config/targets.d.ts.map +0 -1
  724. package/dist/config/targets.js.map +0 -1
  725. package/dist/config/validate.d.ts.map +0 -1
  726. package/dist/config/validate.js.map +0 -1
  727. package/dist/engine/contract.d.ts.map +0 -1
  728. package/dist/engine/contract.js.map +0 -1
  729. package/dist/engine/index.d.ts.map +0 -1
  730. package/dist/engine/index.js.map +0 -1
  731. package/dist/engine/manifest.d.ts.map +0 -1
  732. package/dist/engine/manifest.js.map +0 -1
  733. package/dist/engine/recording.d.ts.map +0 -1
  734. package/dist/engine/recording.js.map +0 -1
  735. package/dist/engine/resolve.d.ts.map +0 -1
  736. package/dist/engine/resolve.js.map +0 -1
  737. package/dist/engine/session.d.ts.map +0 -1
  738. package/dist/engine/session.js.map +0 -1
  739. package/dist/engine/surface.d.ts.map +0 -1
  740. package/dist/engine/surface.js.map +0 -1
  741. package/dist/engine/timing.d.ts.map +0 -1
  742. package/dist/engine/timing.js.map +0 -1
  743. package/dist/expect/async.d.ts.map +0 -1
  744. package/dist/expect/async.js.map +0 -1
  745. package/dist/expect/attempt.d.ts.map +0 -1
  746. package/dist/expect/attempt.js.map +0 -1
  747. package/dist/expect/index.d.ts.map +0 -1
  748. package/dist/expect/index.js.map +0 -1
  749. package/dist/expect/poll.d.ts.map +0 -1
  750. package/dist/expect/poll.js.map +0 -1
  751. package/dist/expect/soft.d.ts.map +0 -1
  752. package/dist/expect/soft.js.map +0 -1
  753. package/dist/expect/values.d.ts.map +0 -1
  754. package/dist/expect/values.js.map +0 -1
  755. package/dist/explore/body.d.ts.map +0 -1
  756. package/dist/explore/body.js.map +0 -1
  757. package/dist/explore/executor.d.ts.map +0 -1
  758. package/dist/explore/executor.js.map +0 -1
  759. package/dist/explore/index.d.ts.map +0 -1
  760. package/dist/explore/index.js.map +0 -1
  761. package/dist/explore/plan.d.ts.map +0 -1
  762. package/dist/explore/plan.js.map +0 -1
  763. package/dist/explore/progress.d.ts.map +0 -1
  764. package/dist/explore/progress.js.map +0 -1
  765. package/dist/explore/state.d.ts.map +0 -1
  766. package/dist/explore/state.js.map +0 -1
  767. package/dist/index.d.ts.map +0 -1
  768. package/dist/index.js.map +0 -1
  769. package/dist/internal/ai-trace.d.ts.map +0 -1
  770. package/dist/internal/ai-trace.js.map +0 -1
  771. package/dist/internal/atomic-write.d.ts.map +0 -1
  772. package/dist/internal/atomic-write.js.map +0 -1
  773. package/dist/internal/brands.d.ts.map +0 -1
  774. package/dist/internal/brands.js.map +0 -1
  775. package/dist/internal/debug.d.ts.map +0 -1
  776. package/dist/internal/debug.js.map +0 -1
  777. package/dist/internal/env.d.ts.map +0 -1
  778. package/dist/internal/env.js.map +0 -1
  779. package/dist/internal/errors.d.ts.map +0 -1
  780. package/dist/internal/errors.js.map +0 -1
  781. package/dist/internal/geometry.d.ts.map +0 -1
  782. package/dist/internal/geometry.js.map +0 -1
  783. package/dist/internal/git.d.ts.map +0 -1
  784. package/dist/internal/git.js.map +0 -1
  785. package/dist/internal/globs.d.ts.map +0 -1
  786. package/dist/internal/globs.js.map +0 -1
  787. package/dist/internal/ids.d.ts.map +0 -1
  788. package/dist/internal/ids.js.map +0 -1
  789. package/dist/internal/json-value.d.ts.map +0 -1
  790. package/dist/internal/json-value.js.map +0 -1
  791. package/dist/internal/keys.d.ts.map +0 -1
  792. package/dist/internal/keys.js.map +0 -1
  793. package/dist/internal/node-version.d.ts.map +0 -1
  794. package/dist/internal/node-version.js.map +0 -1
  795. package/dist/internal/objects.d.ts.map +0 -1
  796. package/dist/internal/objects.js.map +0 -1
  797. package/dist/internal/options.d.ts.map +0 -1
  798. package/dist/internal/options.js.map +0 -1
  799. package/dist/internal/package-manager.d.ts.map +0 -1
  800. package/dist/internal/package-manager.js.map +0 -1
  801. package/dist/internal/package-version.d.ts.map +0 -1
  802. package/dist/internal/package-version.js.map +0 -1
  803. package/dist/internal/paths.d.ts.map +0 -1
  804. package/dist/internal/paths.js.map +0 -1
  805. package/dist/internal/realm-slot.d.ts.map +0 -1
  806. package/dist/internal/realm-slot.js.map +0 -1
  807. package/dist/internal/recording-modes.d.ts.map +0 -1
  808. package/dist/internal/recording-modes.js.map +0 -1
  809. package/dist/internal/redact.d.ts.map +0 -1
  810. package/dist/internal/redact.js.map +0 -1
  811. package/dist/internal/regexp.d.ts.map +0 -1
  812. package/dist/internal/regexp.js.map +0 -1
  813. package/dist/internal/roles.d.ts.map +0 -1
  814. package/dist/internal/roles.js.map +0 -1
  815. package/dist/internal/skip.d.ts.map +0 -1
  816. package/dist/internal/skip.js.map +0 -1
  817. package/dist/internal/source.d.ts.map +0 -1
  818. package/dist/internal/source.js.map +0 -1
  819. package/dist/internal/standard-schema.d.ts.map +0 -1
  820. package/dist/internal/standard-schema.js.map +0 -1
  821. package/dist/internal/suggest.d.ts.map +0 -1
  822. package/dist/internal/suggest.js.map +0 -1
  823. package/dist/internal/text.d.ts.map +0 -1
  824. package/dist/internal/text.js.map +0 -1
  825. package/dist/internal/time.d.ts.map +0 -1
  826. package/dist/internal/time.js.map +0 -1
  827. package/dist/internal/urls.d.ts.map +0 -1
  828. package/dist/internal/urls.js.map +0 -1
  829. package/dist/internal/vcs.d.ts.map +0 -1
  830. package/dist/internal/vcs.js.map +0 -1
  831. package/dist/internal/zip.d.ts.map +0 -1
  832. package/dist/internal/zip.js.map +0 -1
  833. package/dist/locator/engine.d.ts.map +0 -1
  834. package/dist/locator/engine.js.map +0 -1
  835. package/dist/locator/expression.d.ts.map +0 -1
  836. package/dist/locator/expression.js.map +0 -1
  837. package/dist/locator/screen.d.ts.map +0 -1
  838. package/dist/locator/screen.js.map +0 -1
  839. package/dist/mcp/catalog.d.ts.map +0 -1
  840. package/dist/mcp/catalog.js.map +0 -1
  841. package/dist/mcp/config.d.ts.map +0 -1
  842. package/dist/mcp/config.js.map +0 -1
  843. package/dist/mcp/recording.d.ts.map +0 -1
  844. package/dist/mcp/recording.js.map +0 -1
  845. package/dist/mcp/server.d.ts.map +0 -1
  846. package/dist/mcp/server.js.map +0 -1
  847. package/dist/mcp/session.d.ts.map +0 -1
  848. package/dist/mcp/session.js.map +0 -1
  849. package/dist/mcp/sessions.d.ts.map +0 -1
  850. package/dist/mcp/sessions.js.map +0 -1
  851. package/dist/mcp/tools.d.ts.map +0 -1
  852. package/dist/mcp/tools.js.map +0 -1
  853. package/dist/oauth/callback-server.d.ts.map +0 -1
  854. package/dist/oauth/callback-server.js.map +0 -1
  855. package/dist/oauth/chatgpt.d.ts.map +0 -1
  856. package/dist/oauth/chatgpt.js.map +0 -1
  857. package/dist/oauth/cli.d.ts.map +0 -1
  858. package/dist/oauth/cli.js.map +0 -1
  859. package/dist/oauth/copilot.d.ts.map +0 -1
  860. package/dist/oauth/copilot.js.map +0 -1
  861. package/dist/oauth/device-code.d.ts.map +0 -1
  862. package/dist/oauth/device-code.js.map +0 -1
  863. package/dist/oauth/errors.d.ts.map +0 -1
  864. package/dist/oauth/errors.js.map +0 -1
  865. package/dist/oauth/fetch.d.ts.map +0 -1
  866. package/dist/oauth/fetch.js.map +0 -1
  867. package/dist/oauth/grok.d.ts.map +0 -1
  868. package/dist/oauth/grok.js.map +0 -1
  869. package/dist/oauth/jwt.d.ts.map +0 -1
  870. package/dist/oauth/jwt.js.map +0 -1
  871. package/dist/oauth/login.d.ts.map +0 -1
  872. package/dist/oauth/login.js.map +0 -1
  873. package/dist/oauth/models.d.ts.map +0 -1
  874. package/dist/oauth/models.js.map +0 -1
  875. package/dist/oauth/pkce.d.ts.map +0 -1
  876. package/dist/oauth/pkce.js.map +0 -1
  877. package/dist/oauth/providers/github-copilot.d.ts.map +0 -1
  878. package/dist/oauth/providers/github-copilot.js.map +0 -1
  879. package/dist/oauth/providers/openai.d.ts.map +0 -1
  880. package/dist/oauth/providers/openai.js.map +0 -1
  881. package/dist/oauth/providers/xai.d.ts.map +0 -1
  882. package/dist/oauth/providers/xai.js.map +0 -1
  883. package/dist/oauth/providers.d.ts.map +0 -1
  884. package/dist/oauth/providers.js.map +0 -1
  885. package/dist/oauth/sse.d.ts.map +0 -1
  886. package/dist/oauth/sse.js.map +0 -1
  887. package/dist/oauth/store.d.ts.map +0 -1
  888. package/dist/oauth/store.js.map +0 -1
  889. package/dist/oauth/token-endpoint.d.ts.map +0 -1
  890. package/dist/oauth/token-endpoint.js.map +0 -1
  891. package/dist/oauth/types.d.ts.map +0 -1
  892. package/dist/oauth/types.js.map +0 -1
  893. package/dist/params.d.ts.map +0 -1
  894. package/dist/params.js.map +0 -1
  895. package/dist/report/build.d.ts.map +0 -1
  896. package/dist/report/build.js.map +0 -1
  897. package/dist/report/builtin.d.ts.map +0 -1
  898. package/dist/report/builtin.js.map +0 -1
  899. package/dist/report/code-frame.d.ts.map +0 -1
  900. package/dist/report/code-frame.js.map +0 -1
  901. package/dist/report/debug-steps.d.ts.map +0 -1
  902. package/dist/report/debug-steps.js.map +0 -1
  903. package/dist/report/explore-text.d.ts.map +0 -1
  904. package/dist/report/explore-text.js.map +0 -1
  905. package/dist/report/failure-text.d.ts.map +0 -1
  906. package/dist/report/failure-text.js.map +0 -1
  907. package/dist/report/format.d.ts.map +0 -1
  908. package/dist/report/format.js.map +0 -1
  909. package/dist/report/json.d.ts.map +0 -1
  910. package/dist/report/json.js.map +0 -1
  911. package/dist/report/junit.d.ts.map +0 -1
  912. package/dist/report/junit.js.map +0 -1
  913. package/dist/report/list-explore.d.ts.map +0 -1
  914. package/dist/report/list-explore.js.map +0 -1
  915. package/dist/report/list-model.d.ts.map +0 -1
  916. package/dist/report/list-model.js.map +0 -1
  917. package/dist/report/list-steps.d.ts.map +0 -1
  918. package/dist/report/list-steps.js.map +0 -1
  919. package/dist/report/list.d.ts.map +0 -1
  920. package/dist/report/list.js.map +0 -1
  921. package/dist/report/live-window.d.ts.map +0 -1
  922. package/dist/report/live-window.js.map +0 -1
  923. package/dist/report/markdown-text.d.ts.map +0 -1
  924. package/dist/report/markdown-text.js.map +0 -1
  925. package/dist/report/markdown.d.ts.map +0 -1
  926. package/dist/report/markdown.js.map +0 -1
  927. package/dist/report/outcome.d.ts.map +0 -1
  928. package/dist/report/outcome.js.map +0 -1
  929. package/dist/report/repeats.d.ts.map +0 -1
  930. package/dist/report/repeats.js.map +0 -1
  931. package/dist/report/running-tree.d.ts.map +0 -1
  932. package/dist/report/running-tree.js.map +0 -1
  933. package/dist/report/write.d.ts.map +0 -1
  934. package/dist/report/write.js.map +0 -1
  935. package/dist/run/app-ports.d.ts.map +0 -1
  936. package/dist/run/app-ports.js.map +0 -1
  937. package/dist/run/artifacts.d.ts.map +0 -1
  938. package/dist/run/artifacts.js.map +0 -1
  939. package/dist/run/budget.d.ts.map +0 -1
  940. package/dist/run/budget.js.map +0 -1
  941. package/dist/run/declared-processes.d.ts.map +0 -1
  942. package/dist/run/declared-processes.js.map +0 -1
  943. package/dist/run/events.d.ts.map +0 -1
  944. package/dist/run/events.js.map +0 -1
  945. package/dist/run/execute.d.ts.map +0 -1
  946. package/dist/run/execute.js.map +0 -1
  947. package/dist/run/extended-fixtures.d.ts.map +0 -1
  948. package/dist/run/extended-fixtures.js.map +0 -1
  949. package/dist/run/failure-evidence.d.ts.map +0 -1
  950. package/dist/run/failure-evidence.js.map +0 -1
  951. package/dist/run/fixture-recording.d.ts.map +0 -1
  952. package/dist/run/fixture-recording.js.map +0 -1
  953. package/dist/run/fixtures.d.ts.map +0 -1
  954. package/dist/run/fixtures.js.map +0 -1
  955. package/dist/run/in-process.d.ts.map +0 -1
  956. package/dist/run/in-process.js.map +0 -1
  957. package/dist/run/last-run.d.ts.map +0 -1
  958. package/dist/run/last-run.js.map +0 -1
  959. package/dist/run/managed-process.d.ts.map +0 -1
  960. package/dist/run/managed-process.js.map +0 -1
  961. package/dist/run/output.d.ts.map +0 -1
  962. package/dist/run/output.js.map +0 -1
  963. package/dist/run/process-pool.d.ts.map +0 -1
  964. package/dist/run/process-pool.js.map +0 -1
  965. package/dist/run/provision.d.ts.map +0 -1
  966. package/dist/run/provision.js.map +0 -1
  967. package/dist/run/realm.d.ts.map +0 -1
  968. package/dist/run/realm.js.map +0 -1
  969. package/dist/run/records.d.ts.map +0 -1
  970. package/dist/run/records.js.map +0 -1
  971. package/dist/run/retry.d.ts.map +0 -1
  972. package/dist/run/retry.js.map +0 -1
  973. package/dist/run/runner.d.ts.map +0 -1
  974. package/dist/run/runner.js.map +0 -1
  975. package/dist/run/scheduler.d.ts.map +0 -1
  976. package/dist/run/scheduler.js.map +0 -1
  977. package/dist/run/secrecy.d.ts.map +0 -1
  978. package/dist/run/secrecy.js.map +0 -1
  979. package/dist/run/serial.d.ts.map +0 -1
  980. package/dist/run/serial.js.map +0 -1
  981. package/dist/run/sessions.d.ts.map +0 -1
  982. package/dist/run/sessions.js.map +0 -1
  983. package/dist/run/standalone.d.ts.map +0 -1
  984. package/dist/run/standalone.js.map +0 -1
  985. package/dist/run/steps.d.ts.map +0 -1
  986. package/dist/run/steps.js.map +0 -1
  987. package/dist/run/trace-redaction.d.ts.map +0 -1
  988. package/dist/run/trace-redaction.js.map +0 -1
  989. package/dist/run/unit-runner.d.ts.map +0 -1
  990. package/dist/run/unit-runner.js.map +0 -1
  991. package/dist/run/units.d.ts.map +0 -1
  992. package/dist/run/units.js.map +0 -1
  993. package/dist/run/worker/entry.d.ts.map +0 -1
  994. package/dist/run/worker/entry.js.map +0 -1
  995. package/dist/run/worker/handle.d.ts.map +0 -1
  996. package/dist/run/worker/handle.js.map +0 -1
  997. package/dist/run/worker/protocol.d.ts.map +0 -1
  998. package/dist/run/worker/protocol.js.map +0 -1
  999. package/dist/run/worker/session.d.ts.map +0 -1
  1000. package/dist/run/worker/session.js.map +0 -1
  1001. package/dist/run/worker-models.d.ts.map +0 -1
  1002. package/dist/run/worker-models.js.map +0 -1
  1003. package/dist/secrets.d.ts.map +0 -1
  1004. package/dist/secrets.js.map +0 -1
  1005. package/dist/telemetry/checkout.d.ts.map +0 -1
  1006. package/dist/telemetry/checkout.js.map +0 -1
  1007. package/dist/telemetry/environment.d.ts.map +0 -1
  1008. package/dist/telemetry/environment.js.map +0 -1
  1009. package/dist/telemetry/events.d.ts.map +0 -1
  1010. package/dist/telemetry/events.js.map +0 -1
  1011. package/dist/telemetry/failure-kind.d.ts.map +0 -1
  1012. package/dist/telemetry/failure-kind.js.map +0 -1
  1013. package/dist/telemetry/posthog.d.ts.map +0 -1
  1014. package/dist/telemetry/posthog.js.map +0 -1
  1015. package/dist/telemetry/project.d.ts.map +0 -1
  1016. package/dist/telemetry/project.js.map +0 -1
  1017. package/dist/telemetry/store.d.ts.map +0 -1
  1018. package/dist/telemetry/store.js.map +0 -1
  1019. package/dist/telemetry/telemetry.d.ts.map +0 -1
  1020. package/dist/telemetry/telemetry.js.map +0 -1
  1021. package/dist/telemetry/token.d.ts.map +0 -1
  1022. package/dist/telemetry/token.js.map +0 -1
  1023. package/dist/types.d.ts.map +0 -1
  1024. package/dist/types.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  /** URL normalization and origin policy helpers. */
2
2
  import { ConfigurationError } from './errors.js';
3
3
  import { testPattern } from './regexp.js';
4
- import { toTextPattern } from './text.js';
4
+ import { toTextPattern, withIgnoreCase } from './text.js';
5
5
  /**
6
6
  * Parses and normalizes the app base URL. Rejects userinfo, query, and
7
7
  * fragment. WHATWG parsing handles IDNA ASCII hosts, dot segments, and
@@ -94,12 +94,16 @@ export function isLoopbackHost(hostname) {
94
94
  export function isImplicitTestHost(hostname) {
95
95
  return isLoopbackHost(hostname) || hostname.endsWith('.test');
96
96
  }
97
- const FORBIDDEN_PROTOCOLS = new Set(['file:', 'data:', 'javascript:']);
97
+ const NAVIGABLE_PROTOCOLS = new Set(['http:', 'https:']);
98
+ /** The one non-http(s) page navigation opens: empty, with no local or inline content. */
99
+ const BLANK_PAGE = 'about:blank';
98
100
  /**
99
- * Resolves a navigation URL against the base and refuses the schemes no test
100
- * may open. Returns the absolute URL string. Any http(s) origin is admitted:
101
- * a click can reach one just as well, so a gate on typed navigation alone
102
- * would guard nothing.
101
+ * Resolves a navigation URL against the base and refuses every scheme but
102
+ * http(s), except the exact `about:blank`. Returns the absolute URL string.
103
+ * Any http(s) origin is admitted: a click can reach one just as well, so a
104
+ * gate on typed navigation alone would guard nothing. The rule is an
105
+ * allowlist because a browser wraps and nests schemes (`view-source:file:`,
106
+ * `blob:`, `filesystem:`), and a list of forbidden ones misses the wrapper.
103
107
  */
104
108
  export function resolveNavigationUrl(input, base) {
105
109
  let url;
@@ -114,7 +118,7 @@ export function resolveNavigationUrl(input, base) {
114
118
  }
115
119
  throw new ConfigurationError('POLICY_DENIED', `malformed URL: ${input}`);
116
120
  }
117
- if (FORBIDDEN_PROTOCOLS.has(url.protocol)) {
121
+ if (!NAVIGABLE_PROTOCOLS.has(url.protocol) && url.href !== BLANK_PAGE) {
118
122
  throw new ConfigurationError('POLICY_DENIED', `forbidden URL scheme: ${url.protocol}`);
119
123
  }
120
124
  return { url: url.href };
@@ -160,9 +164,11 @@ export function sameSite(url, site) {
160
164
  * Relative expected strings resolve against the base URL; string comparison is
161
165
  * exact after WHATWG serialization; regexps test the complete serialized URL.
162
166
  * Anything else is `INVALID_ARGUMENT`, the `toTextPattern` rule.
167
+ * `ignoreCase` is Playwright's: `true` compares a string case-insensitively
168
+ * and adds the `i` flag to a regexp, `false` removes it.
163
169
  */
164
- export function urlMatches(current, expected, baseHref) {
165
- const pattern = toTextPattern(expected);
170
+ export function urlMatches(current, expected, baseHref, ignoreCase) {
171
+ const pattern = withIgnoreCase(toTextPattern(expected), ignoreCase);
166
172
  if (pattern.kind === 'regexp') {
167
173
  return testPattern(pattern.source, pattern.flags, serializeForComparison(current));
168
174
  }
@@ -173,7 +179,10 @@ export function urlMatches(current, expected, baseHref) {
173
179
  catch {
174
180
  return false;
175
181
  }
176
- return serializeForComparison(current) === expectedUrl.href;
182
+ const actual = serializeForComparison(current);
183
+ return ignoreCase === true
184
+ ? actual.toLowerCase() === expectedUrl.href.toLowerCase()
185
+ : actual === expectedUrl.href;
177
186
  }
178
187
  function serializeForComparison(url) {
179
188
  try {
@@ -183,4 +192,3 @@ function serializeForComparison(url) {
183
192
  return url;
184
193
  }
185
194
  }
186
- //# sourceMappingURL=urls.js.map
@@ -18,4 +18,3 @@ export interface VcsInfo {
18
18
  * answers, else from the CI variables GitHub Actions sets, else undefined.
19
19
  */
20
20
  export declare function detectVcs(projectRoot: string, env: NodeJS.ProcessEnv): Promise<VcsInfo | undefined>;
21
- //# sourceMappingURL=vcs.d.ts.map
@@ -29,4 +29,3 @@ export async function detectVcs(projectRoot, env) {
29
29
  const ciBranch = env['GITHUB_HEAD_REF'] || env['GITHUB_REF_NAME'];
30
30
  return { commit: ciCommit, ...(ciBranch === undefined || ciBranch === '' ? {} : { branch: ciBranch }) };
31
31
  }
32
- //# sourceMappingURL=vcs.js.map
@@ -29,4 +29,3 @@ export declare function zipEntry(name: string, data: Uint8Array, like?: Pick<Zip
29
29
  /** Serializes entries into one archive. */
30
30
  export declare function writeZip(entries: readonly ZipEntry[]): Buffer;
31
31
  export {};
32
- //# sourceMappingURL=zip.d.ts.map
@@ -180,4 +180,3 @@ function dosStamp(date) {
180
180
  dosDate: ((year - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate(),
181
181
  };
182
182
  }
183
- //# sourceMappingURL=zip.js.map
@@ -18,6 +18,11 @@ export declare function attributeOf(node: SemanticNode, name: string): string |
18
18
  * empty or absent.
19
19
  */
20
20
  export declare function denySecureRead(nodes: readonly SemanticNode[], label: string): void;
21
+ /**
22
+ * What a frame the engine reports missing means to a resolve: `wait` treats
23
+ * it like a node that is not there yet, `empty` answers zero matches.
24
+ */
25
+ type MissingFrame = 'wait' | 'empty';
21
26
  interface LocatorEngineOptions {
22
27
  readonly session: TargetSession;
23
28
  /** The running phase's signal and deadline, read per operation. */
@@ -95,8 +100,13 @@ export declare class LocatorEngine {
95
100
  /** Reads every current match at once, for `allTextContents`: a missing frame reads as no matches. */
96
101
  readAllNow(expression: LocatorExpression): Promise<readonly SemanticNode[]>;
97
102
  private readEvery;
98
- /** Reads one node for polling surfaces; returns null while zero matches. */
99
- tryRead(expression: LocatorExpression, deadline: Deadline): Promise<{
103
+ /**
104
+ * Reads one node for polling surfaces; returns null while zero matches.
105
+ * A poll that waits for absence passes `missingFrame: 'empty'`: nothing
106
+ * under a frame that is not in the document is attached, so the sample is
107
+ * zero matches rather than a wait for the frame.
108
+ */
109
+ tryRead(expression: LocatorExpression, deadline: Deadline, missingFrame?: MissingFrame): Promise<{
100
110
  node: SemanticNode | null;
101
111
  count: number;
102
112
  }>;
@@ -150,4 +160,3 @@ export declare function locatorDetails(expression: LocatorExpression, waitedMs?:
150
160
  /** Translates an engine error into the runner-owned public taxonomy. */
151
161
  export declare function translateLocatorError(cause: unknown, expression?: LocatorExpression): E2EError;
152
162
  export {};
153
- //# sourceMappingURL=engine.d.ts.map
@@ -213,9 +213,14 @@ export class LocatorEngine {
213
213
  }
214
214
  }
215
215
  }
216
- /** Reads one node for polling surfaces; returns null while zero matches. */
217
- async tryRead(expression, deadline) {
218
- return this.readOne(expression, deadline, 'wait');
216
+ /**
217
+ * Reads one node for polling surfaces; returns null while zero matches.
218
+ * A poll that waits for absence passes `missingFrame: 'empty'`: nothing
219
+ * under a frame that is not in the document is attached, so the sample is
220
+ * zero matches rather than a wait for the frame.
221
+ */
222
+ async tryRead(expression, deadline, missingFrame = 'wait') {
223
+ return this.readOne(expression, deadline, missingFrame);
219
224
  }
220
225
  /**
221
226
  * Reads the one current match at once, for `isVisible` and `isHidden`:
@@ -378,4 +383,3 @@ export function translateLocatorError(cause, expression) {
378
383
  const suffix = expression === undefined ? '' : `: ${describeExpression(expression)}`;
379
384
  return translateEngineError(cause, suffix);
380
385
  }
381
- //# sourceMappingURL=engine.js.map
@@ -28,4 +28,3 @@ export declare function indexExpression(source: LocatorExpression, index: number
28
28
  export declare function expressionHints(expression: LocatorExpression): Pick<ErrorDetails, 'role' | 'name' | 'testId'>;
29
29
  /** Renders an expression for diagnostics. */
30
30
  export declare function describeExpression(expression: LocatorExpression): string;
31
- //# sourceMappingURL=expression.d.ts.map
@@ -140,4 +140,3 @@ export function describeExpression(expression) {
140
140
  return `frameLocator(${JSON.stringify(expression.selector)}) >> ${describeExpression(expression.source)}`;
141
141
  }
142
142
  }
143
- //# sourceMappingURL=expression.js.map
@@ -32,4 +32,3 @@ export declare function createScreen(context: ScreenContext): Screen;
32
32
  export declare function createScopedScreen(context: ScreenContext, wrap: (expression: LocatorExpression) => LocatorExpression): Screen;
33
33
  /** Creates a public locator from a raw expression (a contributed fixture's platform selector). */
34
34
  export declare function createLocator(context: ScreenContext, expression: LocatorExpression): Locator;
35
- //# sourceMappingURL=screen.d.ts.map
@@ -55,6 +55,27 @@ const TEXT_OPTION_KEYS = ['exact', 'visible'];
55
55
  const ROLE_FILTER_KEYS = [...TEXT_OPTION_KEYS, 'checked', 'disabled', 'selected', 'expanded', 'pressed', 'level'];
56
56
  /** The keys of `RoleOptions`: the accessible name and the filters. */
57
57
  const ROLE_OPTION_KEYS = ['name', ...ROLE_FILTER_KEYS];
58
+ /** The states `locator.waitFor` waits for, Playwright's four. */
59
+ const WAIT_FOR_STATES = ['attached', 'detached', 'visible', 'hidden'];
60
+ /** The states absence satisfies: a frame missing from the document reads as zero matches for them. */
61
+ const ABSENCE_STATES = new Set(['detached', 'hidden']);
62
+ /**
63
+ * Whether the one match, or its absence, is in `state`: `attached` is any
64
+ * match, `detached` none, `visible` a match that is not hidden, and `hidden`
65
+ * a hidden match or none.
66
+ */
67
+ function inWaitForState(node, state) {
68
+ switch (state) {
69
+ case 'attached':
70
+ return node !== null;
71
+ case 'detached':
72
+ return node === null;
73
+ case 'visible':
74
+ return isNodeVisible(node);
75
+ case 'hidden':
76
+ return !isNodeVisible(node);
77
+ }
78
+ }
58
79
  class ScreenImpl {
59
80
  context;
60
81
  scope;
@@ -361,7 +382,11 @@ class LocatorImpl extends ScreenImpl {
361
382
  return nodes.map((node) => normalizeText(node.text ?? ''));
362
383
  }
363
384
  async waitFor(options) {
364
- const state = options?.state ?? 'visible';
385
+ rejectUnknownOptions('waitFor', options, ['state', 'timeout']);
386
+ const state = options?.state === undefined ? 'visible' : options.state;
387
+ if (!WAIT_FOR_STATES.includes(state)) {
388
+ throw new TestError('INVALID_ARGUMENT', `waitFor state must be one of ${WAIT_FOR_STATES.join(', ')}, got ${JSON.stringify(state)}`);
389
+ }
365
390
  await this.context.steps.run('locator', 'locator.waitFor', `${this.label} → ${state}`, async () => {
366
391
  const { engine } = this.context;
367
392
  const deadline = engine.deadline(options?.timeout);
@@ -371,9 +396,8 @@ class LocatorImpl extends ScreenImpl {
371
396
  signal: engine.signal,
372
397
  negated: false,
373
398
  evaluate: async () => {
374
- const { node } = await engine.tryRead(this.expression, deadline);
375
- const visible = isNodeVisible(node);
376
- return state === 'visible' ? visible : !visible;
399
+ const { node } = await engine.tryRead(this.expression, deadline, ABSENCE_STATES.has(state) ? 'empty' : 'wait');
400
+ return inWaitForState(node, state);
377
401
  },
378
402
  onTimeout: () => new TestError('LOCATOR_NOT_FOUND', `locator did not become ${state}: ${this.label}`, {
379
403
  details: locatorDetails(this.expression, Date.now() - startedMs),
@@ -482,4 +506,3 @@ function requireModifiers(value, api) {
482
506
  }
483
507
  return modifiers.length === 0 ? {} : { modifiers };
484
508
  }
485
- //# sourceMappingURL=screen.js.map
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import type { ToolSet } from 'ai';
14
14
  import type { StepExecutorContext } from '../agent/executor.ts';
15
+ import { type NodeRedaction } from '../agent/observation.ts';
15
16
  import type { ScreenPresenter } from '../agent/screen-update.ts';
16
17
  import type { LocatorExpression, SemanticNode, TargetSession } from '../engine/surface.ts';
17
18
  import type { LocatorEngine } from '../locator/engine.ts';
@@ -24,6 +25,8 @@ export interface SessionCatalog {
24
25
  readonly tools: ToolSet;
25
26
  /** The tools that change nothing on the app. */
26
27
  readonly readOnly: ReadonlySet<string>;
28
+ /** The project's own tools among them. */
29
+ readonly project: ReadonlySet<string>;
27
30
  }
28
31
  export interface CatalogOptions {
29
32
  readonly context: StepExecutorContext;
@@ -33,10 +36,12 @@ export interface CatalogOptions {
33
36
  /** The agent's project tools (`agents.<name>.tools`), served beside the built-in ones. */
34
37
  readonly tools: Readonly<Record<string, AgentTool>>;
35
38
  /** The attempt's secret ledger: what `locate` shows of a node passes through it, as `observe` does. */
36
- readonly redact: (text: string) => string;
39
+ readonly redaction: NodeRedaction;
37
40
  /** The session's recorder, when the engine records video. */
38
41
  readonly recorder: SessionRecorder | undefined;
39
42
  readonly warn: (message: string) => void;
43
+ /** Told the cause of every grammar action that failed into a result. */
44
+ readonly onActionFailed?: ((cause: unknown) => void) | undefined;
40
45
  }
41
46
  /** Builds the session's catalog from the step context and the target. */
42
47
  export declare function createSessionCatalog(options: CatalogOptions): SessionCatalog;
@@ -56,5 +61,4 @@ export interface LocateQuery {
56
61
  /** Builds the expression and the matching `screen.*` call from the tool arguments. */
57
62
  export declare function locateQuery(args: LocateArgs): LocateQuery;
58
63
  /** Renders a locate result: the count, the verdict a test would get, and the nodes, each through the attempt's redactor. */
59
- export declare function describeLocate(query: LocateQuery, count: number, nodes: readonly SemanticNode[], redact: (text: string) => string): string;
60
- //# sourceMappingURL=catalog.d.ts.map
64
+ export declare function describeLocate(query: LocateQuery, count: number, nodes: readonly SemanticNode[], redaction: NodeRedaction): string;
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import { z } from 'zod';
14
14
  import { projectTools } from '../agent/default-agent.js';
15
- import { projectTree } from '../agent/observation.js';
15
+ import { projectTree, redactNode } from '../agent/observation.js';
16
16
  import { GRAMMAR_TOOL_NAMES } from '../agent/action-names.js';
17
17
  import { createGrammarTools } from '../agent/primitives.js';
18
18
  import { ConfigurationError } from '../internal/errors.js';
@@ -29,12 +29,12 @@ export function createSessionCatalog(options) {
29
29
  const { context, screen } = options;
30
30
  // The grammar's own observe reports a diff for the model loop; the
31
31
  // session's shows the whole screen, so it replaces the grammar's.
32
- const { observe: _diffObserve, ...verbs } = createGrammarTools(context, { screen });
32
+ const { observe: _diffObserve, ...verbs } = createGrammarTools(context, { screen, onActionFailed: options.onActionFailed });
33
33
  const recording = options.recorder === undefined ? {} : recordingTools(options.recorder);
34
34
  const builtIn = {
35
35
  observe: fullObserveTool(context, screen),
36
36
  ...verbs,
37
- locate: locateTool(options.locator, options.session, options.redact),
37
+ locate: locateTool(options.locator, options.session, options.redaction),
38
38
  ...recording,
39
39
  };
40
40
  const defined = options.tools;
@@ -49,7 +49,7 @@ export function createSessionCatalog(options) {
49
49
  if (defined[name]?.annotations.mutates === false)
50
50
  readOnly.add(name);
51
51
  }
52
- return { tools: { ...builtIn, ...project }, readOnly };
52
+ return { tools: { ...builtIn, ...project }, readOnly, project: new Set(Object.keys(project)) };
53
53
  }
54
54
  /**
55
55
  * The session's `observe`: the whole screen, every time. Action results
@@ -65,7 +65,7 @@ function fullObserveTool(context, screen) {
65
65
  };
66
66
  }
67
67
  /** The session's `locate`: a semantic locator tried against the live screen, with the verdict a test would get. */
68
- function locateTool(locator, session, redact) {
68
+ function locateTool(locator, session, redaction) {
69
69
  return {
70
70
  description: 'Try a semantic locator against the live screen before writing it into a test: screen.getByRole(role, name), getByText, getByLabel, getByPlaceholder, or getByTestId. Returns how many nodes match and which, plus the test code to use. Exactly one of role, text, label, placeholder, or testId; name narrows a role query. Matching is exact unless exact is false.',
71
71
  inputSchema: z.object({
@@ -84,7 +84,7 @@ function locateTool(locator, session, redact) {
84
84
  for (const ref of refs.slice(0, MAX_LOCATE_NODES)) {
85
85
  read.push(await session.read(ref, locator.operation()));
86
86
  }
87
- return describeLocate(query, refs.length, read, redact);
87
+ return describeLocate(query, refs.length, read, redaction);
88
88
  },
89
89
  };
90
90
  }
@@ -115,7 +115,7 @@ export function locateQuery(args) {
115
115
  return { expression: textQuery('placeholder', placeholder, { exact }, undefined), code: `screen.getByPlaceholder(${JSON.stringify(placeholder)}${options})` };
116
116
  }
117
117
  /** Renders a locate result: the count, the verdict a test would get, and the nodes, each through the attempt's redactor. */
118
- export function describeLocate(query, count, nodes, redact) {
118
+ export function describeLocate(query, count, nodes, redaction) {
119
119
  const lines = [`${count === 1 ? '1 node matches' : `${count} nodes match`} ${describeExpression(query.expression)}.`];
120
120
  if (count === 1)
121
121
  lines.push(`Use: ${query.code}`);
@@ -124,7 +124,7 @@ export function describeLocate(query, count, nodes, redact) {
124
124
  else
125
125
  lines.push(`A test action on ${query.code} would fail with LOCATOR_AMBIGUOUS. Narrow it with a name, getByRole(role, name), .filter({ hasText }), .first(), or .nth(i), or scope it under a container.`);
126
126
  for (const node of nodes)
127
- lines.push(`- ${describeNode(projectTree(node, redact))}`);
127
+ lines.push(`- ${describeNode(projectTree(redactNode(node, redaction)))}`);
128
128
  if (count > nodes.length)
129
129
  lines.push(`- and ${count - nodes.length} more`);
130
130
  return lines.join('\n');
@@ -149,4 +149,3 @@ function describeNode(node) {
149
149
  parts.push(`[${states.join(', ')}]`);
150
150
  return parts.join(' ');
151
151
  }
152
- //# sourceMappingURL=catalog.js.map
@@ -20,4 +20,3 @@ export declare function locateProjectConfig(options: ProjectOptions): string;
20
20
  * config. The project root is the config's directory.
21
21
  */
22
22
  export declare function loadProjectConfig(configPath: string, env: NodeJS.ProcessEnv): Promise<LoadedConfig>;
23
- //# sourceMappingURL=config.d.ts.map
@@ -21,4 +21,3 @@ export async function loadProjectConfig(configPath, env) {
21
21
  const raw = await loadConfigModule(configPath, { graph: true });
22
22
  return { ...resolveConfig(raw, { projectRoot: path.dirname(configPath), configPath, env }), configPath };
23
23
  }
24
- //# sourceMappingURL=config.js.map
@@ -74,4 +74,3 @@ export declare class SessionRecorder {
74
74
  export declare function describeRecording(recording: FinishedRecording): string;
75
75
  /** The session's `start_recording` and `stop_recording` tools. */
76
76
  export declare function recordingTools(recorder: SessionRecorder): ToolSet;
77
- //# sourceMappingURL=recording.d.ts.map
@@ -152,4 +152,3 @@ export function recordingTools(recorder) {
152
152
  },
153
153
  };
154
154
  }
155
- //# sourceMappingURL=recording.js.map
@@ -7,6 +7,12 @@
7
7
  * it the process's and a test hands it pipes.
8
8
  */
9
9
  import type { Readable, Writable } from 'node:stream';
10
+ import type { McpSessionSummary } from './usage.ts';
11
+ /** The client as it named itself in `initialize`. */
12
+ export interface McpClient {
13
+ readonly name: string;
14
+ readonly version: string;
15
+ }
10
16
  export interface ServeOptions {
11
17
  readonly cwd: string;
12
18
  /** The config every session loads unless `open_session` names one. */
@@ -25,7 +31,8 @@ export interface ServeOptions {
25
31
  readonly log: (line: string) => void;
26
32
  /** Ends the server from outside: a process signal. */
27
33
  readonly signal?: AbortSignal | undefined;
34
+ /** Told once per `open_session`, when its session closes or its open fails, with the client that asked; undefined before `initialize`. */
35
+ readonly onSessionEnd?: ((summary: McpSessionSummary, client: McpClient | undefined) => void) | undefined;
28
36
  }
29
37
  /** Serves until the client disconnects or `signal` aborts; resolves with the exit code. */
30
38
  export declare function serveMcp(options: ServeOptions): Promise<number>;
31
- //# sourceMappingURL=server.d.ts.map
@@ -6,8 +6,8 @@
6
6
  * config the server started next to. Streams are injected, so the CLI hands
7
7
  * it the process's and a test hands it pipes.
8
8
  */
9
- import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
10
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { McpServer, ResourceTemplate } from '@modelcontextprotocol/server';
10
+ import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
11
11
  import { readGuide, skillTopics } from '../cli/skill.js';
12
12
  import { ConfigurationError, errorMessage } from '../internal/errors.js';
13
13
  import { loadProjectConfig, locateProjectConfig } from './config.js';
@@ -34,16 +34,20 @@ export async function serveMcp(options) {
34
34
  maxSessions: options.maxSessions,
35
35
  defaultTarget: options.target,
36
36
  log,
37
+ onSessionEnd: (summary) => {
38
+ const client = server.server.getClientVersion();
39
+ options.onSessionEnd?.(summary, client === undefined ? undefined : { name: client.name, version: client.version });
40
+ },
37
41
  });
38
42
  for (const spec of host.toolSpecs()) {
39
43
  server.registerTool(spec.name, {
40
44
  description: spec.description,
41
45
  inputSchema: spec.inputSchema,
42
46
  annotations: { readOnlyHint: spec.readOnly, openWorldHint: false },
43
- }, async (args, extra) => {
47
+ }, async (args, ctx) => {
44
48
  // A failure is a result the agent can react to, never a protocol error.
45
49
  try {
46
- return await spec.call(args, { signal: extra.signal });
50
+ return await spec.call(args, { signal: ctx.mcpReq.signal });
47
51
  }
48
52
  catch (cause) {
49
53
  return errorResult(cause);
@@ -100,4 +104,3 @@ function registerGuide(server) {
100
104
  return { contents: [{ uri: uri.href, mimeType: 'text/markdown', text }] };
101
105
  });
102
106
  }
103
- //# sourceMappingURL=server.js.map
@@ -12,6 +12,7 @@
12
12
  * restart and the client's tool list never changes.
13
13
  */
14
14
  import type { LoadedConfig } from './config.ts';
15
+ import { type McpSessionSummary, type SessionEndedBy } from './usage.ts';
15
16
  import { type McpToolCallExtra, type McpToolResult, type McpToolSpec } from './tools.ts';
16
17
  /** How many sessions `e2e mcp --max-sessions` allows at once, each a browser or a device. */
17
18
  export declare const SESSION_BOUNDS: {
@@ -39,6 +40,8 @@ export interface SessionHostOptions {
39
40
  readonly ttlMs?: number | undefined;
40
41
  /** How many sessions may be open at once, from `--max-sessions`; default `SESSION_BOUNDS.default`. */
41
42
  readonly maxSessions?: number | undefined;
43
+ /** Told once per `open_session`, when its session closes or its open fails. */
44
+ readonly onSessionEnd?: ((summary: McpSessionSummary) => void) | undefined;
42
45
  }
43
46
  /** Owns the live sessions, up to the server's limit, and the fixed MCP tools that drive them. */
44
47
  export declare class SessionHost {
@@ -60,7 +63,7 @@ export declare class SessionHost {
60
63
  */
61
64
  open(options: OpenSessionOptions, signal?: AbortSignal): Promise<string>;
62
65
  /** Closes one session, the only one when `session` is omitted, and returns what happened; a session already closing returns that close. */
63
- close(reason: string, session?: string): Promise<string>;
66
+ close(reason: string, session?: string, endedBy?: SessionEndedBy): Promise<string>;
64
67
  /** Closes every session, for a server that is shutting down; undefined when none was open. */
65
68
  closeAll(reason: string): Promise<string | undefined>;
66
69
  private teardown;
@@ -101,4 +104,3 @@ export declare class SessionHost {
101
104
  private callSpec;
102
105
  private closeSpec;
103
106
  }
104
- //# sourceMappingURL=session.d.ts.map
@@ -12,11 +12,11 @@
12
12
  * restart and the client's tool list never changes.
13
13
  */
14
14
  import { z } from 'zod';
15
- import { loadAiSdk } from '../agent/ai-sdk.js';
15
+ import { loadAiSdkIfInstalled } from '../agent/ai-sdk.js';
16
16
  import { openInteractiveStep } from '../agent/interactive-step.js';
17
17
  import { ScreenPresenter } from '../agent/screen-update.js';
18
18
  import { secretHandle } from '../secrets.js';
19
- import { ConfigurationError, errorMessage, InfrastructureError } from '../internal/errors.js';
19
+ import { classifyError, ConfigurationError, errorMessage, InfrastructureError } from '../internal/errors.js';
20
20
  import { LocatorEngine } from '../locator/engine.js';
21
21
  import { allocateAppPorts } from '../run/app-ports.js';
22
22
  import { SharedAppProcesses } from '../run/process-pool.js';
@@ -26,6 +26,7 @@ import { openStandaloneAttempt } from '../run/standalone.js';
26
26
  import { createSessionCatalog, isGrammarVerb } from './catalog.js';
27
27
  import { describeRecording, SessionRecorder } from './recording.js';
28
28
  import { SessionRegistry } from './sessions.js';
29
+ import { SessionUsage } from './usage.js';
29
30
  import { actionResult, catalogLine, defineMcpTool, describeToolDetail, errorResult, invokeTool, redactResult, textResult } from './tools.js';
30
31
  /** How long one session may live, whatever happens. */
31
32
  const SESSION_TTL_MS = 4 * 60 * 60 * 1000;
@@ -64,21 +65,25 @@ export class SessionHost {
64
65
  * it, or disconnects, aborts the open and what it started.
65
66
  */
66
67
  open(options, signal) {
67
- return this.sessions.admit((id) => this.openSession(id, options, signal));
68
+ const usage = new SessionUsage(this.sessions.liveCount, this.options.headed);
69
+ return this.sessions.admit((id) => this.openSession(id, options, usage, signal)).catch((cause) => {
70
+ this.options.onSessionEnd?.(usage.openFailed(classifyError(cause).code));
71
+ throw cause;
72
+ });
68
73
  }
69
74
  /** Closes one session, the only one when `session` is omitted, and returns what happened; a session already closing returns that close. */
70
- async close(reason, session) {
75
+ async close(reason, session, endedBy = 'agent') {
71
76
  if (session === undefined && !this.sessions.hasLive)
72
77
  return 'No session is open.';
73
- return this.sessions.close(session, reason, (live) => this.teardown(live, reason));
78
+ return this.sessions.close(session, reason, (live) => this.teardown(live, reason, endedBy));
74
79
  }
75
80
  /** Closes every session, for a server that is shutting down; undefined when none was open. */
76
81
  async closeAll(reason) {
77
82
  this.shutdown.abort();
78
- const summaries = await this.sessions.closeAll(reason, (live) => this.teardown(live, reason));
83
+ const summaries = await this.sessions.closeAll(reason, (live) => this.teardown(live, reason, 'server'));
79
84
  return summaries.length === 0 ? undefined : summaries.join('\n');
80
85
  }
81
- async teardown(live, reason) {
86
+ async teardown(live, reason, endedBy) {
82
87
  if (live.idleTimer !== undefined)
83
88
  clearTimeout(live.idleTimer);
84
89
  const { value, cleanupErrors } = await this.closeAttempt(live.attempt, live.abort, async () => {
@@ -86,7 +91,7 @@ export class SessionHost {
86
91
  const outcome = await live.step.done;
87
92
  // The recorder runs this after a start or stop still in flight, even one the step's deadline abandoned.
88
93
  return { outcome, saved: await this.saveRecording(live) };
89
- });
94
+ }).finally(() => this.options.onSessionEnd?.(live.usage.closed(endedBy)));
90
95
  const lines = [`Session ${live.id} closed (${reason}); ${live.actions} tool calls ran.`];
91
96
  if (value.saved !== undefined)
92
97
  lines.push(value.saved);
@@ -124,16 +129,31 @@ export class SessionHost {
124
129
  call(session, name, args, extra) {
125
130
  const live = this.sessions.resolve(session);
126
131
  const tool = live.catalog.tools[name];
127
- if (tool === undefined)
128
- throw this.unknownTool(live, name);
132
+ live.usage.called(name, live.catalog.project.has(name));
133
+ if (tool === undefined) {
134
+ const error = this.unknownTool(live, name);
135
+ live.usage.failed(error.code);
136
+ throw error;
137
+ }
129
138
  const redact = live.attempt.agentRuntime.redact;
130
- return this.run(live, () => invokeTool(name, tool, args, extra)).then((result) => redactResult(isGrammarVerb(name) ? actionResult(name, result) : result, redact), (cause) => redactResult(errorResult(cause), redact));
139
+ return this.run(live, () => invokeTool(name, tool, args, extra)).then((result) => {
140
+ if (!isGrammarVerb(name)) {
141
+ // A grammar action's failure was counted with its code as it happened; a project tool's result carries none.
142
+ if (result.isError === true)
143
+ live.usage.failed(undefined);
144
+ return redactResult(result, redact);
145
+ }
146
+ return redactResult(actionResult(name, result), redact);
147
+ }, (cause) => {
148
+ live.usage.failed(classifyError(cause).code);
149
+ return redactResult(errorResult(cause), redact);
150
+ });
131
151
  }
132
- async openSession(id, options, request) {
133
- // The catalog reads the tools' schemas through the AI SDK, synchronously
134
- // and on every render, so the optional SDK is loaded once here: a project
135
- // without it learns so before an attempt opens a browser.
136
- await loadAiSdk();
152
+ async openSession(id, options, usage, request) {
153
+ // The catalog renders synchronously, so the optional SDK is loaded once
154
+ // here when installed. Without it the catalog reads the tools' Standard
155
+ // Schemas, and only a model-backed call needs the package.
156
+ await loadAiSdkIfInstalled();
137
157
  // The config is claimed before it evaluates: its top-level code resolves
138
158
  // secrets against the registry an open session installed, which only
139
159
  // knows that session's config.
@@ -143,6 +163,7 @@ export class SessionHost {
143
163
  // A session is its own run: a URL declared with port 0 gets a port here.
144
164
  const config = await allocateAppPorts(loaded);
145
165
  const target = this.resolveTarget(config, options.target);
166
+ usage.resolved(target.platform, target.engine);
146
167
  this.sessions.claimEngine(id, target.name, target.engine);
147
168
  const ttlMs = this.options.ttlMs ?? SESSION_TTL_MS;
148
169
  const abort = new AbortController();
@@ -186,7 +207,7 @@ export class SessionHost {
186
207
  screen,
187
208
  session: attempt.session,
188
209
  tools: config.agent.tools,
189
- redact: attempt.agentRuntime.redact,
210
+ redaction: { redact: attempt.agentRuntime.redact, redactCut: attempt.agentRuntime.redactCut },
190
211
  recorder,
191
212
  locator: new LocatorEngine({
192
213
  session: attempt.session,
@@ -197,6 +218,7 @@ export class SessionHost {
197
218
  assertionTimeout: config.assertionTimeout,
198
219
  }),
199
220
  warn: (message) => this.options.log('warning', message),
221
+ onActionFailed: (cause) => usage.failed(classifyError(cause).code),
200
222
  });
201
223
  const live = {
202
224
  id,
@@ -210,6 +232,7 @@ export class SessionHost {
210
232
  abort,
211
233
  idleTimer: undefined,
212
234
  actions: 0,
235
+ usage,
213
236
  };
214
237
  const text = this.openingText(live, config, await this.firstScreen(live));
215
238
  // A first screen that came back despite the cancel must not become a live session nobody asked for.
@@ -218,7 +241,7 @@ export class SessionHost {
218
241
  opening.removeEventListener('abort', cancel);
219
242
  this.sessions.activate(live);
220
243
  // A step that ends on its own (the TTL, a hard stop) ends the session.
221
- void step.done.then((outcome) => this.endOnItsOwn(live, outcome.error === undefined ? 'the session step concluded' : errorMessage(outcome.error)));
244
+ void step.done.then((outcome) => this.endOnItsOwn(live, outcome.error === undefined ? 'the session step concluded' : errorMessage(outcome.error), 'step'));
222
245
  this.touch(live);
223
246
  return text;
224
247
  }
@@ -231,11 +254,11 @@ export class SessionHost {
231
254
  }
232
255
  }
233
256
  /** Closes a live session that ended without a close_session: its step concluded, or it sat idle. */
234
- endOnItsOwn(live, why) {
257
+ endOnItsOwn(live, why, endedBy) {
235
258
  if (!this.sessions.isLive(live.id))
236
259
  return;
237
260
  this.options.log('warning', `session ${live.id} ended: ${why}`);
238
- this.close(why, live.id).catch((cause) => this.options.log('error', `closing session ${live.id} failed: ${errorMessage(cause)}`));
261
+ this.close(why, live.id, endedBy).catch((cause) => this.options.log('error', `closing session ${live.id} failed: ${errorMessage(cause)}`));
239
262
  }
240
263
  /** A recorder writing to `<output>/videos/<session>/`, when the engine records video. */
241
264
  recorder(id, config, attempt) {
@@ -345,7 +368,7 @@ export class SessionHost {
345
368
  if (live.idleTimer !== undefined)
346
369
  clearTimeout(live.idleTimer);
347
370
  const idleMs = this.options.idleMs ?? SESSION_IDLE_MS;
348
- live.idleTimer = setTimeout(() => this.endOnItsOwn(live, `idle for ${Math.round(idleMs / 60_000)} minutes`), idleMs);
371
+ live.idleTimer = setTimeout(() => this.endOnItsOwn(live, `idle for ${Math.round(idleMs / 60_000)} minutes`, 'idle'), idleMs);
349
372
  live.idleTimer.unref();
350
373
  }
351
374
  /** Runs one tool body inside the live session's step. */
@@ -404,4 +427,3 @@ export class SessionHost {
404
427
  });
405
428
  }
406
429
  }
407
- //# sourceMappingURL=session.js.map
@@ -25,6 +25,8 @@ export declare class SessionRegistry<S extends NamedSession> {
25
25
  constructor(limit: number);
26
26
  /** Whether any session is live. */
27
27
  get hasLive(): boolean;
28
+ /** How many sessions are live. */
29
+ get liveCount(): number;
28
30
  /**
29
31
  * Admits a session and runs `open` for it under a fresh id. A session whose
30
32
  * open fails leaves once `open` has settled, after the host tore down what
@@ -63,4 +65,3 @@ export declare class SessionRegistry<S extends NamedSession> {
63
65
  /** Keeps why a session ended, forgetting the oldest beyond `ENDED_KEPT`. */
64
66
  private remember;
65
67
  }
66
- //# sourceMappingURL=sessions.d.ts.map