@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,230 @@
1
+ /** Option resolution and test-target selection (spec 11-lifecycle.md). */
2
+ import { ConfigurationError, CollectionError } from '../internal/errors.js';
3
+ import { groupChain } from './registry.js';
4
+ /** Resolves effective options: test > nearest group > outer groups > config > default. */
5
+ export function resolveOptions(test, config) {
6
+ const chain = groupChain(test.group);
7
+ const layers = [...chain.map((group) => group.options), test.options];
8
+ let timeout = config.timeout;
9
+ let retries = config.retries;
10
+ let platforms;
11
+ let requires = [];
12
+ let session;
13
+ let skipReason;
14
+ const tags = new Set();
15
+ const agentContextParts = [];
16
+ for (const layer of layers) {
17
+ if (layer.timeout !== undefined)
18
+ timeout = layer.timeout;
19
+ if (layer.retries !== undefined)
20
+ retries = layer.retries;
21
+ if (layer.platforms !== undefined)
22
+ platforms = layer.platforms;
23
+ if (layer.requires !== undefined)
24
+ requires = layer.requires;
25
+ if (layer.session !== undefined)
26
+ session = layer.session;
27
+ if (layer.tags !== undefined)
28
+ for (const tag of layer.tags)
29
+ tags.add(tag);
30
+ if (layer.agentContext !== undefined)
31
+ agentContextParts.push(layer.agentContext);
32
+ if (layer.skip !== undefined && layer.skip !== false) {
33
+ skipReason = typeof layer.skip === 'string' ? layer.skip : 'skipped';
34
+ }
35
+ }
36
+ const serialRoot = test.serialRoot;
37
+ if (serialRoot !== undefined) {
38
+ let serialRetries = config.retries;
39
+ for (const group of chain) {
40
+ if (group.options.retries !== undefined)
41
+ serialRetries = group.options.retries;
42
+ if (group === serialRoot)
43
+ break;
44
+ }
45
+ retries = serialRetries;
46
+ }
47
+ return {
48
+ timeout,
49
+ retries,
50
+ tags: [...tags],
51
+ platforms,
52
+ requires,
53
+ session,
54
+ agentContext: agentContextParts.length === 0 ? undefined : agentContextParts.join('\n'),
55
+ skipReason,
56
+ serial: serialRoot !== undefined,
57
+ };
58
+ }
59
+ function matchesTags(options, tags, tagMode) {
60
+ if (tags === undefined || tags.length === 0)
61
+ return true;
62
+ if (tagMode === 'all')
63
+ return tags.every((tag) => options.tags.includes(tag));
64
+ return tags.some((tag) => options.tags.includes(tag));
65
+ }
66
+ /**
67
+ * Expands the collection into test-target pairs and applies focus, tag,
68
+ * platform, capability, session, and serial-closure rules.
69
+ */
70
+ export function select(collection, config, filters = {}, flags = {}) {
71
+ const tagMode = filters.tagMode ?? 'any';
72
+ const targets = filters.targetIds === undefined || filters.targetIds.length === 0
73
+ ? config.targets
74
+ : config.targets.filter((target) => filters.targetIds.includes(target.name));
75
+ if (filters.targetIds !== undefined) {
76
+ for (const id of filters.targetIds) {
77
+ if (!config.targets.some((target) => target.name === id)) {
78
+ throw new ConfigurationError('UNKNOWN_TARGET', `unknown target ID "${id}"`);
79
+ }
80
+ }
81
+ }
82
+ const focused = collection.tests.filter((test) => test.mode === 'only');
83
+ if (focused.length > 0 && config.ci) {
84
+ throw new ConfigurationError('ONLY_IN_CI', `.only is rejected in CI: ${focused.map((test) => test.id).join(', ')}`);
85
+ }
86
+ const optionsByTest = new Map();
87
+ for (const test of collection.tests) {
88
+ optionsByTest.set(test.id, resolveOptions(test, config));
89
+ }
90
+ const sessionProducers = collectSessionProducers(collection.tests);
91
+ const pairs = [];
92
+ for (const target of targets) {
93
+ for (const test of collection.tests) {
94
+ const options = optionsByTest.get(test.id);
95
+ pairs.push(classifyPair(test, target, options, focused, filters, tagMode));
96
+ }
97
+ }
98
+ const withClosure = applySerialClosure(pairs);
99
+ const withSessions = applySessionSelection(withClosure, sessionProducers);
100
+ const runnableOrdinary = withSessions.filter((pair) => pair.disposition === 'run' && pair.test.kind === 'test');
101
+ if (runnableOrdinary.length === 0 && flags.passWithNoTests !== true) {
102
+ throw new ConfigurationError('NO_TESTS', 'zero runnable ordinary test-target pairs; pass --pass-with-no-tests to allow this');
103
+ }
104
+ return {
105
+ pairs: withSessions,
106
+ perTarget: targets.map((target) => ({
107
+ target,
108
+ pairs: withSessions.filter((pair) => pair.target.name === target.name),
109
+ })),
110
+ };
111
+ }
112
+ /** Maps each session name to its unique producer setup test. */
113
+ function collectSessionProducers(tests) {
114
+ const producers = new Map();
115
+ for (const test of tests) {
116
+ if (test.kind !== 'setup')
117
+ continue;
118
+ for (const session of test.sessions) {
119
+ const existing = producers.get(session);
120
+ if (existing !== undefined) {
121
+ throw new CollectionError(`session "${session}" has duplicate producers: ${existing.id} and ${test.id}`);
122
+ }
123
+ producers.set(session, test);
124
+ }
125
+ }
126
+ return producers;
127
+ }
128
+ function classifyPair(test, target, options, focused, filters, tagMode) {
129
+ const base = { test, target, options };
130
+ if (test.kind === 'test') {
131
+ if (focused.length > 0 && test.mode !== 'only') {
132
+ return {
133
+ ...base,
134
+ disposition: 'filtered',
135
+ skip: { cause: 'filtered', reason: 'not focused by .only' },
136
+ };
137
+ }
138
+ if (!matchesTags(options, filters.tags, tagMode)) {
139
+ return {
140
+ ...base,
141
+ disposition: 'filtered',
142
+ skip: { cause: 'filtered', reason: 'tag filter did not match' },
143
+ };
144
+ }
145
+ }
146
+ if (options.platforms !== undefined && !options.platforms.includes(target.platform)) {
147
+ return {
148
+ ...base,
149
+ disposition: 'filtered',
150
+ skip: {
151
+ cause: 'platform-unavailable',
152
+ reason: `test declares platforms [${options.platforms.join(', ')}]`,
153
+ },
154
+ };
155
+ }
156
+ // Targets are graded from the backend's declared capability set: harness
157
+ // tiers plus one name per contributed fixture. Selection runs at config
158
+ // load, before any backend boots, which is why the manifest is synchronous.
159
+ const capabilities = target.backend?.capabilities;
160
+ const missing = options.requires.filter((capability) => capabilities?.has(capability) !== true);
161
+ if (missing.length > 0) {
162
+ return {
163
+ ...base,
164
+ disposition: 'skip',
165
+ skip: {
166
+ cause: 'capability-unavailable',
167
+ reason: `backend lacks required capabilities: ${missing.join(', ')}`,
168
+ },
169
+ };
170
+ }
171
+ if (options.skipReason !== undefined) {
172
+ return {
173
+ ...base,
174
+ disposition: 'skip',
175
+ skip: { cause: 'explicit', reason: options.skipReason },
176
+ };
177
+ }
178
+ if (test.kind === 'setup') {
179
+ return { ...base, disposition: 'filtered', skip: { cause: 'filtered', reason: 'setup test not required by selection' } };
180
+ }
181
+ return { ...base, disposition: 'run', skip: undefined };
182
+ }
183
+ function applySerialClosure(pairs) {
184
+ const selectedSerialUnits = new Set();
185
+ for (const pair of pairs) {
186
+ if (pair.disposition === 'run' && pair.test.serialId !== undefined) {
187
+ selectedSerialUnits.add(`${pair.target.name}::${pair.test.serialId}`);
188
+ }
189
+ }
190
+ return pairs.map((pair) => {
191
+ if (pair.test.serialId === undefined)
192
+ return pair;
193
+ const key = `${pair.target.name}::${pair.test.serialId}`;
194
+ if (!selectedSerialUnits.has(key))
195
+ return pair;
196
+ if (pair.disposition === 'run')
197
+ return pair;
198
+ if (pair.disposition === 'filtered' && pair.skip?.cause === 'filtered') {
199
+ return { ...pair, disposition: 'run', skip: undefined };
200
+ }
201
+ return pair;
202
+ });
203
+ }
204
+ function applySessionSelection(pairs, sessionProducers) {
205
+ const neededSetups = new Set();
206
+ for (const pair of pairs) {
207
+ if (pair.disposition !== 'run' || pair.options.session === undefined)
208
+ continue;
209
+ const producer = sessionProducers.get(pair.options.session);
210
+ if (producer === undefined) {
211
+ throw new CollectionError(`test ${pair.test.id} consumes session "${pair.options.session}" but no setup test produces it`);
212
+ }
213
+ neededSetups.add(`${pair.target.name}::${producer.id}`);
214
+ }
215
+ return pairs.map((pair) => {
216
+ if (pair.test.kind !== 'setup')
217
+ return pair;
218
+ const key = `${pair.target.name}::${pair.test.id}`;
219
+ if (!neededSetups.has(key))
220
+ return pair;
221
+ // A producer the target cannot run - skipped for a missing capability or
222
+ // filtered out by its own platform list - cannot be promoted; a consumer
223
+ // that needs it is a configuration error, not a silent run elsewhere.
224
+ if (pair.disposition === 'skip' || pair.skip?.cause === 'platform-unavailable') {
225
+ throw new CollectionError(`setup test ${pair.test.id} is required by a session consumer but cannot run on target "${pair.target.name}": ${pair.skip?.reason ?? ''}`);
226
+ }
227
+ return { ...pair, disposition: 'run', skip: undefined };
228
+ });
229
+ }
230
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/collect/select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /** Agent, model, and resource-limit resolution (spec 05-config.md, 14-security.md). */
2
+ import type { LanguageModel } from 'ai';
3
+ import { type StepExecutor } from '../agent/executor.ts';
4
+ import type { E2EConfig, ModelInstance, VisionMode } from '../types.ts';
5
+ /** Gateway-native credential variable, used when apiKeyEnv holds no value. */
6
+ export declare const GATEWAY_API_KEY_ENV = "AI_GATEWAY_API_KEY";
7
+ /** A live AI SDK language model, as accepted by `generateText`. */
8
+ export type SdkLanguageModel = Exclude<LanguageModel, string>;
9
+ /**
10
+ * Resolved model identity. Two shapes cover every provider:
11
+ *
12
+ * - `gateway`: a `provider/model-id` reference routed through the AI Gateway.
13
+ * The credential is resolved from the environment here so nothing downstream
14
+ * needs the process environment; it never enters digests, logs, or reports.
15
+ * - `instance`: a caller-supplied AI SDK provider model (`openai('gpt-4o')`,
16
+ * `anthropic(...)`, any `LanguageModelV2+`). The instance owns its own
17
+ * transport and credentials. Instances never cross a process boundary:
18
+ * workers re-resolve the config module and construct their own.
19
+ */
20
+ export type ResolvedModel = {
21
+ readonly kind: 'gateway';
22
+ readonly provider: string;
23
+ readonly id: string;
24
+ /** Absolute endpoint override, or undefined for the gateway default. */
25
+ readonly endpoint: string | undefined;
26
+ readonly apiKeyEnv: string;
27
+ /** Resolved credential; absence fails at the first model call, not here. */
28
+ readonly apiKey: string | undefined;
29
+ } | {
30
+ readonly kind: 'instance';
31
+ readonly provider: string;
32
+ readonly id: string;
33
+ readonly model: SdkLanguageModel;
34
+ };
35
+ export interface ResolvedAgentConfig {
36
+ /**
37
+ * The step executor `agent.act()` dispatches to, configured as the `agent`
38
+ * value itself (`agent: createAgent(...)` or any StepExecutor); undefined
39
+ * selects the default AI SDK executor at fixture time. Like model
40
+ * instances, an executor never crosses a process boundary: workers
41
+ * re-resolve the config module.
42
+ */
43
+ readonly executor: StepExecutor | undefined;
44
+ /** Undefined until a model is configured; acquiring `agent` then fails. */
45
+ readonly model: ResolvedModel | undefined;
46
+ /**
47
+ * Model used by calls with `vision`. Visual grounding is a much higher bar
48
+ * than accepting an image, so the tier that needs it can be pinned
49
+ * separately. Undefined falls back to `model`.
50
+ */
51
+ readonly visionModel: ResolvedModel | undefined;
52
+ readonly maxSteps: number;
53
+ readonly maxModelCalls: number;
54
+ readonly maxObservationBytes: number;
55
+ readonly context: string | undefined;
56
+ /** Default for the per-call `vision` option; a per-call value always wins. */
57
+ readonly vision: VisionMode;
58
+ }
59
+ export interface ResolvedLimits {
60
+ readonly maxAgentContextBytes: number;
61
+ readonly maxLedgerBytes: number;
62
+ readonly maxObservationBytes: number;
63
+ readonly maxEventsPerStep: number;
64
+ readonly maxModelTokensPerCall: number;
65
+ }
66
+ /** `ResolvedLimits` before the agent-owned observation budget is attached. */
67
+ export type ResolvedBaseLimits = Omit<ResolvedLimits, 'maxObservationBytes'>;
68
+ /** Default observation byte budget, shared with the report's pre-config fallback limits. */
69
+ export declare const DEFAULT_OBSERVATION_BYTES = 1048576;
70
+ /**
71
+ * Resolves `config.agent` plus model environment fallbacks. `limits` must be
72
+ * resolved first: the context budget is a limits key, and the dependency runs
73
+ * in exactly one direction.
74
+ */
75
+ export declare function resolveAgentConfig(raw: E2EConfig, env: NodeJS.ProcessEnv, ci: boolean, limits: ResolvedBaseLimits): ResolvedAgentConfig;
76
+ /** Resolves the `limits` block. The observation budget is attached by the caller. */
77
+ export declare function resolveLimits(raw: E2EConfig): ResolvedBaseLimits;
78
+ /** True for the closed `vision` value set, wherever it is supplied. */
79
+ export declare function isVisionMode(value: unknown): value is VisionMode;
80
+ /**
81
+ * Narrows a structurally verified model instance to the SDK model type. The
82
+ * one place this cast lives; everything downstream takes the checked type.
83
+ */
84
+ export declare function asSdkLanguageModel(instance: ModelInstance): SdkLanguageModel;
85
+ /**
86
+ * True when a config value is a live AI SDK language model instance. The check
87
+ * is structural, exactly like the AI SDK's own model handling, so instances
88
+ * from any realm or provider package are accepted.
89
+ */
90
+ export declare function isModelInstance(value: unknown): value is ModelInstance;
91
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/config/agent.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzE,OAAO,KAAK,EAAe,SAAS,EAAe,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKlG,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AAExD,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAE9D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAEN,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;AAe7E,4FAA4F;AAC5F,eAAO,MAAM,yBAAyB,UAAY,CAAC;AAcnD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,EAAE,EAAE,OAAO,EACX,MAAM,EAAE,kBAAkB,GACzB,mBAAmB,CAyDrB;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,kBAAkB,CAoBhE;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAQ5E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAStE"}
@@ -0,0 +1,232 @@
1
+ /** Agent, model, and resource-limit resolution (spec 05-config.md, 14-security.md). */
2
+ import { isStepExecutor } from '../agent/executor.js';
3
+ import { boundedInt } from './validate.js';
4
+ import { ConfigurationError } from '../internal/errors.js';
5
+ import { isLoopbackHost } from '../internal/urls.js';
6
+ /** Default environment variable holding the provider credential. */
7
+ const DEFAULT_API_KEY_ENV = 'E2E_MODEL_API_KEY';
8
+ /** Gateway-native credential variable, used when apiKeyEnv holds no value. */
9
+ export const GATEWAY_API_KEY_ENV = 'AI_GATEWAY_API_KEY';
10
+ const AGENT_KEYS = new Set([
11
+ 'executor',
12
+ 'model',
13
+ 'visionModel',
14
+ 'maxSteps',
15
+ 'maxModelCalls',
16
+ 'maxObservationBytes',
17
+ 'context',
18
+ 'vision',
19
+ ]);
20
+ const MODEL_KEYS = new Set(['provider', 'id', 'endpoint', 'apiKeyEnv']);
21
+ /** Default observation byte budget, shared with the report's pre-config fallback limits. */
22
+ export const DEFAULT_OBSERVATION_BYTES = 1_048_576;
23
+ const ENV_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
24
+ /** Hard ceilings mirroring spec/schema/report-v1.schema.json `limits`. */
25
+ const LIMIT_BOUNDS = {
26
+ maxAgentContextBytes: [1_024, 65_536, 16_384],
27
+ maxLedgerBytes: [1_024, 65_536, 8_192],
28
+ maxEventsPerStep: [1, 10_000, 1_000],
29
+ maxModelTokensPerCall: [1, 1_000_000, 64_000],
30
+ };
31
+ /**
32
+ * Resolves `config.agent` plus model environment fallbacks. `limits` must be
33
+ * resolved first: the context budget is a limits key, and the dependency runs
34
+ * in exactly one direction.
35
+ */
36
+ export function resolveAgentConfig(raw, env, ci, limits) {
37
+ const value = raw.agent;
38
+ // Three accepted shapes (RFC0002): the agent itself, an options object, or
39
+ // an options object carrying `executor` — a custom brain no longer forfeits
40
+ // the model, budgets, or context.
41
+ const bare = value !== undefined && isStepExecutor(value) ? value : undefined;
42
+ const agent = bare === undefined ? value : undefined;
43
+ let executor = bare;
44
+ if (agent !== undefined) {
45
+ if (typeof agent !== 'object' || agent === null || Array.isArray(agent)) {
46
+ throw new ConfigurationError('INVALID_CONFIG', 'agent must be an options object or the agent itself: createAgent(...) or any { name, runStep(context) }');
47
+ }
48
+ for (const key of Object.keys(agent)) {
49
+ if (!AGENT_KEYS.has(key)) {
50
+ throw new ConfigurationError('INVALID_CONFIG', `unknown agent config key "${key}"`);
51
+ }
52
+ }
53
+ if (agent.executor !== undefined) {
54
+ if (!isStepExecutor(agent.executor)) {
55
+ throw new ConfigurationError('INVALID_CONFIG', 'agent.executor must be a StepExecutor: createAgent(...) or any { name, runStep(context) }');
56
+ }
57
+ executor = agent.executor;
58
+ }
59
+ }
60
+ const maxSteps = boundedInt(agent?.maxSteps, 'agent.maxSteps', 1, 100) ?? 25;
61
+ const maxModelCalls = boundedInt(agent?.maxModelCalls, 'agent.maxModelCalls', 1, 100) ?? 25;
62
+ const maxObservationBytes = boundedInt(agent?.maxObservationBytes, 'agent.maxObservationBytes', 1_024, 16_777_216) ??
63
+ DEFAULT_OBSERVATION_BYTES;
64
+ const context = resolveContext(agent?.context, limits.maxAgentContextBytes);
65
+ const vision = agent?.vision ?? false;
66
+ if (!isVisionMode(vision)) {
67
+ throw new ConfigurationError('INVALID_CONFIG', "agent.vision must be true, false, 'fallback', or 'only'");
68
+ }
69
+ return {
70
+ executor,
71
+ model: resolveModel(agent?.model, env),
72
+ visionModel: resolveModel(agent?.visionModel, env, 'agent.visionModel', 'E2E_VISION_MODEL'),
73
+ maxSteps,
74
+ maxModelCalls,
75
+ maxObservationBytes,
76
+ context,
77
+ vision,
78
+ };
79
+ }
80
+ /** Resolves the `limits` block. The observation budget is attached by the caller. */
81
+ export function resolveLimits(raw) {
82
+ const limits = raw.limits;
83
+ if (limits !== undefined) {
84
+ if (typeof limits !== 'object' || limits === null || Array.isArray(limits)) {
85
+ throw new ConfigurationError('INVALID_CONFIG', 'limits must be an object');
86
+ }
87
+ for (const key of Object.keys(limits)) {
88
+ if (!(key in LIMIT_BOUNDS)) {
89
+ throw new ConfigurationError('INVALID_CONFIG', `unknown limits key "${key}"`);
90
+ }
91
+ }
92
+ }
93
+ const resolved = {};
94
+ for (const key of Object.keys(LIMIT_BOUNDS)) {
95
+ const [min, max, fallback] = LIMIT_BOUNDS[key];
96
+ resolved[key] = boundedInt(limits?.[key], `limits.${key}`, min, max) ?? fallback;
97
+ }
98
+ return resolved;
99
+ }
100
+ /** True for the closed `vision` value set, wherever it is supplied. */
101
+ export function isVisionMode(value) {
102
+ return typeof value === 'boolean' || value === 'fallback' || value === 'only';
103
+ }
104
+ /**
105
+ * Narrows a structurally verified model instance to the SDK model type. The
106
+ * one place this cast lives; everything downstream takes the checked type.
107
+ */
108
+ export function asSdkLanguageModel(instance) {
109
+ if (!isModelInstance(instance)) {
110
+ throw new ConfigurationError('INVALID_CONFIG', 'value is not an AI SDK language model instance');
111
+ }
112
+ return instance;
113
+ }
114
+ /**
115
+ * True when a config value is a live AI SDK language model instance. The check
116
+ * is structural, exactly like the AI SDK's own model handling, so instances
117
+ * from any realm or provider package are accepted.
118
+ */
119
+ export function isModelInstance(value) {
120
+ if (typeof value !== 'object' || value === null)
121
+ return false;
122
+ const candidate = value;
123
+ return (typeof candidate['specificationVersion'] === 'string' &&
124
+ typeof candidate['provider'] === 'string' &&
125
+ typeof candidate['modelId'] === 'string' &&
126
+ typeof candidate['doGenerate'] === 'function');
127
+ }
128
+ /**
129
+ * Resolves one model reference from config or its environment override.
130
+ *
131
+ * `label` and `envName` are parameters because the same grammar serves
132
+ * `agent.model` and `agent.visionModel`; every diagnostic then names the key the
133
+ * author actually wrote. There is no implicit default model; an unconfigured
134
+ * model fails at its first model call, so a custom-executor run needs none.
135
+ */
136
+ function resolveModel(model, env, label = 'agent.model', envName = 'E2E_MODEL') {
137
+ if (model === undefined) {
138
+ const fromEnv = env[envName];
139
+ if (fromEnv === undefined || fromEnv.trim() === '')
140
+ return undefined;
141
+ return parseModelReference(fromEnv.trim(), envName, env);
142
+ }
143
+ if (typeof model === 'string') {
144
+ return parseModelReference(model, label, env);
145
+ }
146
+ if (typeof model !== 'object' || model === null || Array.isArray(model)) {
147
+ throw new ConfigurationError('INVALID_CONFIG', `${label} must be "provider/model-id", a model object, or an AI SDK model instance`);
148
+ }
149
+ if (isModelInstance(model)) {
150
+ return {
151
+ kind: 'instance',
152
+ provider: model.provider,
153
+ id: model.modelId,
154
+ // Structurally verified above; the AI SDK duck-types models the same way.
155
+ model: model,
156
+ };
157
+ }
158
+ for (const key of Object.keys(model)) {
159
+ if (!MODEL_KEYS.has(key)) {
160
+ throw new ConfigurationError('INVALID_CONFIG', `unknown ${label} key "${key}"`);
161
+ }
162
+ }
163
+ const provider = requireNonEmpty(model.provider, `${label}.provider`);
164
+ const id = requireNonEmpty(model.id, `${label}.id`);
165
+ return gatewayModel(provider, id, model.endpoint, model.apiKeyEnv, env, label);
166
+ }
167
+ /** Splits `provider/model-id` at the first slash. */
168
+ function parseModelReference(reference, label, env) {
169
+ const separator = reference.indexOf('/');
170
+ if (separator <= 0 || separator === reference.length - 1) {
171
+ throw new ConfigurationError('INVALID_CONFIG', `${label} must be "provider/model-id", got ${JSON.stringify(reference)}`);
172
+ }
173
+ return gatewayModel(reference.slice(0, separator), reference.slice(separator + 1), undefined, undefined, env, label);
174
+ }
175
+ function gatewayModel(provider, id, endpoint, apiKeyEnv, env, label) {
176
+ const keyEnv = validateApiKeyEnv(apiKeyEnv, label);
177
+ const apiKey = firstNonEmpty(env[keyEnv], env[GATEWAY_API_KEY_ENV]);
178
+ return {
179
+ kind: 'gateway',
180
+ provider,
181
+ id,
182
+ endpoint: validateEndpoint(endpoint, label),
183
+ apiKeyEnv: keyEnv,
184
+ apiKey,
185
+ };
186
+ }
187
+ function firstNonEmpty(...values) {
188
+ return values.find((value) => value !== undefined && value.trim() !== '');
189
+ }
190
+ function validateEndpoint(endpoint, label) {
191
+ if (endpoint === undefined)
192
+ return undefined;
193
+ let parsed;
194
+ try {
195
+ parsed = new URL(endpoint);
196
+ }
197
+ catch {
198
+ throw new ConfigurationError('INVALID_CONFIG', `invalid ${label}.endpoint "${endpoint}"`);
199
+ }
200
+ if (parsed.protocol === 'https:')
201
+ return parsed.href;
202
+ if (parsed.protocol === 'http:' && isLoopbackHost(parsed.hostname))
203
+ return parsed.href;
204
+ throw new ConfigurationError('INVALID_CONFIG', `${label}.endpoint must use HTTPS unless it is a loopback host: ${endpoint}`);
205
+ }
206
+ function validateApiKeyEnv(apiKeyEnv, label) {
207
+ if (apiKeyEnv === undefined)
208
+ return DEFAULT_API_KEY_ENV;
209
+ if (!ENV_NAME_PATTERN.test(apiKeyEnv)) {
210
+ throw new ConfigurationError('INVALID_CONFIG', `${label}.apiKeyEnv must be a valid environment variable name, got "${apiKeyEnv}"`);
211
+ }
212
+ return apiKeyEnv;
213
+ }
214
+ function resolveContext(context, maxBytes) {
215
+ if (context === undefined)
216
+ return undefined;
217
+ if (typeof context !== 'string') {
218
+ throw new ConfigurationError('INVALID_CONFIG', 'agent.context must be a string');
219
+ }
220
+ const bytes = new TextEncoder().encode(context).byteLength;
221
+ if (bytes > maxBytes) {
222
+ throw new ConfigurationError('INVALID_CONFIG', `agent.context is ${bytes} bytes; the resolved maximum is ${maxBytes}`);
223
+ }
224
+ return context;
225
+ }
226
+ function requireNonEmpty(value, label) {
227
+ if (typeof value !== 'string' || value.length === 0) {
228
+ throw new ConfigurationError('INVALID_CONFIG', `${label} is required`);
229
+ }
230
+ return value;
231
+ }
232
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/config/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** Config discovery and ESM/TypeScript loading (spec 05-config.md). */
2
+ import type { E2EConfig } from '../types.ts';
3
+ export interface DiscoveredConfig {
4
+ readonly configPath: string | undefined;
5
+ readonly projectRoot: string;
6
+ }
7
+ /**
8
+ * Discovers the config file. With `--config` the explicit path wins. Otherwise
9
+ * the search starts at cwd and inspects each parent, stopping after the
10
+ * repository root. The selected file's directory is the project root.
11
+ */
12
+ export declare function discoverConfig(cwd: string, explicitPath?: string): DiscoveredConfig;
13
+ /**
14
+ * Imports a TypeScript/ESM module with erasable-syntax support. Every call
15
+ * evaluates the module afresh: the query carries the caller's key (what the
16
+ * instance is for) plus a process-unique sequence, so a realm never receives
17
+ * another realm's module instance and a second `run()` in one process sees
18
+ * the config file as it is now.
19
+ */
20
+ export declare function importModule(absolutePath: string, cacheKey?: string): Promise<unknown>;
21
+ /** Loads and returns the raw default export of a config module. */
22
+ export declare function loadConfigModule(configPath: string): Promise<E2EConfig>;
23
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAOvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA2BnF;AAWD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAK9F;AAED,mEAAmE;AACnE,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAmB7E"}