@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,185 @@
1
+ /**
2
+ * Zero-turn trace replay (RFC0001 layer 3, cache-in decision).
3
+ *
4
+ * Replays one recorded trace through the same action grammar the executor
5
+ * uses — every replayed action runs under the step's deadline, action budget,
6
+ * origin policy, secret authorization, and recording. No model is called.
7
+ *
8
+ * Adaptive, never fatal: any reason the trace cannot finish — a gap, a target
9
+ * that moved, an action the live app rejected — ends the replayed prefix and
10
+ * hands the step to the executor mid-step. Runtime hard stops (budget,
11
+ * timeout, cancellation) rethrow untouched; they are the step's truth, not a
12
+ * divergence.
13
+ */
14
+ import { anchorsPresent } from '../cache/anchors.js';
15
+ import { relocateDescriptor } from '../cache/relocate.js';
16
+ import { sleep } from '../internal/time.js';
17
+ import { isRuntimeHardStop, } from './executor.js';
18
+ /** Backoff between looks at the screen while it settles. */
19
+ const RETRY_DELAYS_MS = [100, 300, 600, 1_000, 3_000];
20
+ /** Ceiling on one poll's total wait, inside whatever the deadline allows. */
21
+ const RETRY_TIMEOUT_MS = 15_000;
22
+ function planCall(action, actions) {
23
+ switch (action.name) {
24
+ case 'tool':
25
+ return { kind: 'gap' };
26
+ case 'tap':
27
+ return { kind: 'targeted', descriptor: action.target, invoke: (t) => actions.tap(t) };
28
+ case 'type':
29
+ return {
30
+ kind: 'targeted',
31
+ descriptor: action.target,
32
+ invoke: (t) => actions.type(t, action.value),
33
+ };
34
+ case 'typeSecret':
35
+ return {
36
+ kind: 'targeted',
37
+ descriptor: action.target,
38
+ invoke: (t) => actions.typeSecret(t, action.secret),
39
+ };
40
+ case 'press':
41
+ return {
42
+ kind: 'targeted',
43
+ descriptor: action.target,
44
+ invoke: (t) => actions.press(t, action.key),
45
+ };
46
+ case 'select':
47
+ return {
48
+ kind: 'targeted',
49
+ descriptor: action.target,
50
+ invoke: (t) => actions.select(t, action.value),
51
+ };
52
+ case 'scroll':
53
+ return action.target === undefined
54
+ ? { kind: 'free', invoke: () => actions.scroll(action.direction) }
55
+ : {
56
+ kind: 'targeted',
57
+ descriptor: action.target,
58
+ invoke: (t) => actions.scroll(action.direction, t),
59
+ };
60
+ case 'navigate':
61
+ return { kind: 'free', invoke: () => actions.navigate(action.url) };
62
+ }
63
+ }
64
+ /** Replays one trace until it completes or diverges. */
65
+ export async function replayTrace(host, trace) {
66
+ const summaries = [];
67
+ const total = trace.actions.length;
68
+ const stop = (stopReason) => ({
69
+ completed: false,
70
+ executed: summaries.length,
71
+ total,
72
+ summaries,
73
+ stopReason,
74
+ });
75
+ for (const action of trace.actions) {
76
+ const planned = planCall(action, host.actions);
77
+ if (planned.kind === 'gap')
78
+ return stop('gap');
79
+ try {
80
+ if (planned.kind === 'targeted') {
81
+ const relocated = await relocate(host, planned.descriptor);
82
+ if (relocated.kind === 'failed')
83
+ return stop(relocated.failure);
84
+ await planned.invoke({ id: relocated.id });
85
+ }
86
+ else {
87
+ await planned.invoke();
88
+ }
89
+ }
90
+ catch (cause) {
91
+ if (isReplayFatal(cause, host.signal))
92
+ throw cause;
93
+ if (isUncertainCommit(cause)) {
94
+ // Input may have reached the app (spec 09): the hand-off must name
95
+ // the uncertain action so the executor verifies before re-acting —
96
+ // the runner never repeats an unknown-commit operation itself.
97
+ return { ...stop('action-uncertain'), uncertainAction: action.summary };
98
+ }
99
+ return stop('action-failed');
100
+ }
101
+ summaries.push(action.summary);
102
+ }
103
+ return { completed: true, executed: summaries.length, total, summaries };
104
+ }
105
+ /**
106
+ * Verifies a trace's recorded end anchors against the live screen: every
107
+ * anchor must be present again (`anchors.ts`, every recorded field equal) or
108
+ * the replay must not pass on its own. Waits on the same settling backoff
109
+ * relocation uses, because the recording run's final look came seconds of
110
+ * model latency after its last action and a replay's comes right away: a
111
+ * save still in flight is a wait, not a divergence. A surface that cannot be
112
+ * observed at all is a mismatch too — the executor gets the step and judges
113
+ * the live state; only runtime hard stops propagate.
114
+ */
115
+ export async function verifyAnchors(host, anchors) {
116
+ if (anchors.length === 0)
117
+ return true;
118
+ try {
119
+ const present = await pollSettled(host, (nodes) => anchorsPresent(anchors, nodes, host) ? true : undefined);
120
+ return present === true;
121
+ }
122
+ catch (cause) {
123
+ if (isReplayFatal(cause, host.signal))
124
+ throw cause;
125
+ return false;
126
+ }
127
+ }
128
+ /**
129
+ * Relocates one descriptor against the settling screen. Only a missing target
130
+ * is worth another look; ambiguity never retries — two matching nodes will
131
+ * not become one by waiting, and acting on either would be a guess.
132
+ */
133
+ async function relocate(host, descriptor) {
134
+ const options = { redact: host.redact, testIdAttribute: host.testIdAttribute };
135
+ const settled = await pollSettled(host, (nodes) => {
136
+ const result = relocateDescriptor(descriptor, nodes, options);
137
+ return result.kind === 'failed' && result.failure === 'target-not-found' ? undefined : result;
138
+ });
139
+ return settled ?? { kind: 'failed', failure: 'target-not-found' };
140
+ }
141
+ /**
142
+ * Probes a settled observation, then re-probes fresh raw captures on a fixed
143
+ * backoff until the probe answers or the wait runs out: a screen
144
+ * mid-transition gets a few looks before replay gives the step up. The first
145
+ * look settles because replay executes recorded actions far faster than the
146
+ * run that recorded them; without that wait an action can land while the app
147
+ * is still reacting to the previous one — a form mid-clear, a list mid-update
148
+ * — and commit something the recorded run never did.
149
+ */
150
+ async function pollSettled(host, probe) {
151
+ const startedMs = Date.now();
152
+ let nodes = await host.observeSettled();
153
+ for (let attempt = 0;; attempt += 1) {
154
+ const answer = probe(nodes);
155
+ if (answer !== undefined)
156
+ return answer;
157
+ const delay = RETRY_DELAYS_MS[attempt];
158
+ if (delay === undefined ||
159
+ Date.now() - startedMs + delay > RETRY_TIMEOUT_MS ||
160
+ host.remainingMs() <= delay) {
161
+ return undefined;
162
+ }
163
+ await sleep(delay, host.signal);
164
+ nodes = await host.observe();
165
+ }
166
+ }
167
+ /** True when any error in the cause chain reports an unknown commit state. */
168
+ function isUncertainCommit(cause) {
169
+ for (let error = cause, depth = 0; depth < 8; depth += 1) {
170
+ if (typeof error !== 'object' || error === null)
171
+ return false;
172
+ if (error.code === 'ACTION_MAY_HAVE_COMMITTED')
173
+ return true;
174
+ error = error.cause;
175
+ }
176
+ return false;
177
+ }
178
+ /**
179
+ * True for errors a replay must surface rather than absorb as divergence:
180
+ * runtime hard stops and cancellation are the step's own accounting.
181
+ */
182
+ function isReplayFatal(cause, signal) {
183
+ return signal.aborted || isRuntimeHardStop(cause);
184
+ }
185
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/agent/replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** Host-side secret fill authorization (spec 04-resources.md, 14-security.md). */
2
+ import type { TargetSession, OperationContext, SemanticNode } from '../backend/surface.ts';
3
+ import type { Secret } from '../types.ts';
4
+ import type { AgentContext } from './invocation.ts';
5
+ /**
6
+ * The narrow surface a secret fill needs from its step machinery: the act
7
+ * dispatch is its one caller today, and any future tier that fills secrets
8
+ * satisfies the same three members rather than re-deriving the policy.
9
+ */
10
+ interface SecretFillHost {
11
+ readonly session: TargetSession;
12
+ operation(): OperationContext;
13
+ recordPolicy(name: string, decision: 'allowed' | 'denied', code?: string): void;
14
+ }
15
+ /**
16
+ * Authorizes one secret fill and resolves the plaintext only after every check
17
+ * passes. The value is returned to the caller for a single immediate handoff to
18
+ * the trusted backend and is never logged, cached, or sent to a model.
19
+ */
20
+ export declare function authorizeSecretFill(host: SecretFillHost, runtime: AgentContext, secret: Secret, node: SemanticNode): Promise<string>;
21
+ export {};
22
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/agent/secrets.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;GAIG;AACH,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,SAAS,IAAI,gBAAgB,CAAC;IAC9B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjF;AAKD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
@@ -0,0 +1,63 @@
1
+ /** Host-side secret fill authorization (spec 04-resources.md, 14-security.md). */
2
+ import { AgentError, toAgentError } from './error.js';
3
+ /** Roles that expose an editable secure input sink. */
4
+ const EDITABLE_ROLES = new Set(['textbox', 'searchbox', 'combobox']);
5
+ /**
6
+ * Authorizes one secret fill and resolves the plaintext only after every check
7
+ * passes. The value is returned to the caller for a single immediate handoff to
8
+ * the trusted backend and is never logged, cached, or sent to a model.
9
+ */
10
+ export async function authorizeSecretFill(host, runtime, secret, node) {
11
+ const credential = runtime.config.credentials.get(secret.name);
12
+ if (credential === undefined) {
13
+ host.recordPolicy('secret.registered', 'denied', 'AUTH_CREDENTIAL_UNAVAILABLE');
14
+ throw new AgentError('AUTH_CREDENTIAL_UNAVAILABLE', `credential "${secret.name}" is not configured`);
15
+ }
16
+ const origin = await currentOrigin(host);
17
+ const appAllows = runtime.config.app.allowedOrigins.includes(origin);
18
+ const credentialAllows = credential.allowedOrigins === undefined || credential.allowedOrigins.includes(origin);
19
+ if (!appAllows || !credentialAllows) {
20
+ host.recordPolicy('secret.origin', 'denied', 'POLICY_DENIED');
21
+ throw new AgentError('POLICY_DENIED', `origin ${origin} is not authorized for secret "${secret.name}"`);
22
+ }
23
+ if (node.states?.disabled === true) {
24
+ host.recordPolicy('secret.sink', 'denied', 'POLICY_DENIED');
25
+ throw new AgentError('POLICY_DENIED', 'the target field is disabled');
26
+ }
27
+ if (node.role === undefined || !EDITABLE_ROLES.has(node.role)) {
28
+ host.recordPolicy('secret.sink', 'denied', 'POLICY_DENIED');
29
+ throw new AgentError('POLICY_DENIED', `the target is not an editable input (role ${node.role ?? 'none'})`);
30
+ }
31
+ if (node.inputPurpose !== secret.purpose) {
32
+ host.recordPolicy('secret.purpose', 'denied', 'POLICY_DENIED');
33
+ throw new AgentError('POLICY_DENIED', `field purpose ${node.inputPurpose ?? 'none'} is incompatible with secret purpose ${secret.purpose}`);
34
+ }
35
+ host.recordPolicy('secret.fill', 'allowed');
36
+ try {
37
+ return await runtime.secrets.resolve(secret);
38
+ }
39
+ catch (cause) {
40
+ throw toAgentError(cause);
41
+ }
42
+ }
43
+ /** Reads the current top-level origin for origin policy checks. */
44
+ async function currentOrigin(host) {
45
+ const url = host.session.url;
46
+ if (url === undefined) {
47
+ throw new AgentError('POLICY_DENIED', 'secret fills require a backend that exposes the current top-level URL');
48
+ }
49
+ let href;
50
+ try {
51
+ href = await url(host.operation());
52
+ }
53
+ catch (cause) {
54
+ throw toAgentError(cause);
55
+ }
56
+ try {
57
+ return new URL(href).origin;
58
+ }
59
+ catch {
60
+ throw new AgentError('POLICY_DENIED', `the current URL ${href} is not a valid origin`);
61
+ }
62
+ }
63
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/agent/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * One step's trace-cache session (RFC0001 layer 3, cache-in decision): key
3
+ * derivation, the replay attempt, live recording, and the stage-or-evict
4
+ * decision once the step has settled — everything cache-shaped about one
5
+ * dispatched act step, kept beside the dispatch rather than threaded through
6
+ * it. The dispatch owns budgets, the grammar, and the verdict; this class owns
7
+ * nothing but the cache.
8
+ *
9
+ * Cost: in read-write mode the session takes two settled looks at the screen
10
+ * the executor never asked for — one before any action, one after the passing
11
+ * verdict — because the trace's end anchors are the delta between them. A
12
+ * read-only run pays neither.
13
+ */
14
+ import type { AgentCacheContext } from '../cache/context.ts';
15
+ import type { StepCacheInfo } from '../run/steps.ts';
16
+ import type { JsonValue } from '../types.ts';
17
+ import type { RecordableAction } from './actions.ts';
18
+ import { type ReplayedPrefix, type StepVerdict } from './executor.ts';
19
+ import { type ReplayHost } from './replay.ts';
20
+ /**
21
+ * The replay host plus the one session-level probe replay itself never needs:
22
+ * the current location path, read at both ends of the step for the trace's
23
+ * start-path precondition and end-path postcondition.
24
+ */
25
+ export interface StepCacheHost extends ReplayHost {
26
+ currentPath(): Promise<string | undefined>;
27
+ }
28
+ /** What the session needs from the dispatch beyond the host itself. */
29
+ export interface StepCacheOptions {
30
+ readonly cache: AgentCacheContext;
31
+ readonly instruction: string;
32
+ readonly params: Readonly<Record<string, JsonValue>> | undefined;
33
+ readonly executor: {
34
+ readonly name: string;
35
+ readonly version?: string;
36
+ };
37
+ readonly redact: (text: string) => string;
38
+ readonly testIdAttribute: string;
39
+ readonly maxActions: number;
40
+ /** Timeline index of the step being dispatched. */
41
+ readonly stepIndex: number;
42
+ }
43
+ /** How the step settled, as the write-side decision sees it. */
44
+ export type StepOutcome = 'passed' | 'failed' | 'cancelled';
45
+ export declare class StepTraceSession {
46
+ private readonly host;
47
+ private readonly cache;
48
+ private readonly keyHash;
49
+ private readonly recorder;
50
+ private readonly options;
51
+ private info;
52
+ private prefix;
53
+ private startPath;
54
+ /**
55
+ * The screen before any action, captured only when this step may write: the
56
+ * staged trace's end anchors are the delta between this and the passing
57
+ * observation, so a replay must reproduce the step's effect to pass alone.
58
+ * Undefined after `begin` when the surface could not be observed; the step
59
+ * still runs — an executor that never looks at the screen owes the cache
60
+ * nothing — but nothing is staged, because a trace without its baseline has
61
+ * no anchors and would replay on mechanics alone.
62
+ */
63
+ private startNodes;
64
+ /**
65
+ * The trace a full replay reproduced, kept for the re-stage: its executor
66
+ * is the write's provenance, and its summary is the original verdict prose.
67
+ * The step's own summary after a replay is the synthesized "replayed N
68
+ * actions…" wrapper; storing that would nest the summary one level deeper
69
+ * on every replay until the bound truncated it.
70
+ */
71
+ private replayed;
72
+ /** True once a cached entry's actions were run this step, fully or partly. */
73
+ private consumedReplay;
74
+ /** Grammar actions recorded so far when an end-mismatch hand-off happened. */
75
+ private actionsAtEndMismatch;
76
+ constructor(host: StepCacheHost, options: StepCacheOptions);
77
+ /** How the cache participated, for the step's report detail. */
78
+ get cacheInfo(): StepCacheInfo | undefined;
79
+ /** The mid-step hand-off, when a replay diverged after real progress. */
80
+ get replayedPrefix(): ReplayedPrefix | undefined;
81
+ /** Records one committed grammar action into the step trace. */
82
+ record(action: RecordableAction): void;
83
+ /** Records one mutating project-tool call as a replay-ending gap. */
84
+ recordGap(toolName: string): void;
85
+ /**
86
+ * Opens the step: captures the write-side preconditions — the start path
87
+ * and, when this step may write, the baseline screen — then attempts a
88
+ * zero-turn replay. Returns the self-finalized verdict on a full replay
89
+ * whose postcondition holds; undefined dispatches the executor — after a
90
+ * miss from the top, after a divergence mid-step with `replayedPrefix` set.
91
+ * Every failure to replay is a miss, never an error; only runtime hard stops
92
+ * propagate.
93
+ */
94
+ begin(): Promise<StepVerdict | undefined>;
95
+ /**
96
+ * Closes the session once the step has settled. The whole write-side
97
+ * decision lives here, in read-write mode only:
98
+ *
99
+ * - passed, after an end-mismatch the executor had to act to repair: evict.
100
+ * Every recorded action ran and the effect was still missing, so the
101
+ * recorded flow is proven not to produce it. Re-staging would freeze the
102
+ * failed flow plus its repair — a typo, its deletion, the retype — as the
103
+ * thing to replay forever; the next pass records a clean flow instead. A
104
+ * hand-off the executor settled without acting is different: the flow was
105
+ * fine and only the anchors were stale, so it heals by re-staging.
106
+ * - passed otherwise: stage the recorded trace for attempt-end settlement.
107
+ * - failed after consuming a replay: evict. Without this, a diverged replay
108
+ * whose step then fails stages nothing — and the poisoned entry would
109
+ * replay its bad prefix on every future first attempt.
110
+ * - cancelled: nothing, exactly like an interrupted attempt.
111
+ */
112
+ conclude(outcome: StepOutcome, verdictSummary: string | undefined): Promise<void>;
113
+ /**
114
+ * One store read, revalidated through the trace-1 framing whichever store
115
+ * produced it: a custom store's entry can never be trusted more loosely
116
+ * than a file entry, however the store author built their read path. A
117
+ * store outage is a slower run, never a failed test — every failure to read
118
+ * degrades to a miss.
119
+ */
120
+ private readEntry;
121
+ /**
122
+ * The trace's postcondition against the live screen: the recorded end path
123
+ * (pathname only, when the live location is known) and every recorded end
124
+ * anchor present again.
125
+ */
126
+ private endStateMatches;
127
+ private selfFinalize;
128
+ private handOff;
129
+ /**
130
+ * Stages the recorded trace for attempt-end settlement. The write is
131
+ * deferred, not immediate: the trace is confirmed or evicted at attempt end
132
+ * (`flushStagedTraces`), because the verification step after this one — not
133
+ * the verdict alone — is what proves the flow reached the right state. A
134
+ * replayed step re-stages its own entry with fresh descriptors, which is
135
+ * how staleness self-heals.
136
+ *
137
+ * The end path and a fresh settled observation are the trace's
138
+ * postcondition — the state the step passed in. The delta between the
139
+ * baseline and the passing observation becomes the end anchors. When the
140
+ * step moved to another pathname the whole screen is the delta and the path
141
+ * is the postcondition, so anchors are recorded only for a step that ended
142
+ * where it began (or on a surface without a location at all, where they are
143
+ * the only check). A postcondition that cannot be captured stages nothing:
144
+ * a trace without its check would replay on mechanics alone.
145
+ */
146
+ private stage;
147
+ /**
148
+ * Awaited so the step does not close — and a later read cannot be served
149
+ * the stale flow — before the eviction has settled. The cache is
150
+ * disposable; a failed eviction is a slower next run only.
151
+ */
152
+ private evict;
153
+ private repairedAfterEndMismatch;
154
+ private missed;
155
+ }
156
+ //# sourceMappingURL=step-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-cache.d.ts","sourceRoot":"","sources":["../../src/agent/step-cache.ts"],"names":[],"mappings":"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"}