@enricai/barnacle 1.0.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 (448) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +958 -0
  3. package/dist/api/errors.d.ts +88 -0
  4. package/dist/api/errors.d.ts.map +1 -0
  5. package/dist/api/errors.js +164 -0
  6. package/dist/api/errors.js.map +1 -0
  7. package/dist/api/helpers/envelope.d.ts +13 -0
  8. package/dist/api/helpers/envelope.d.ts.map +1 -0
  9. package/dist/api/helpers/envelope.js +20 -0
  10. package/dist/api/helpers/envelope.js.map +1 -0
  11. package/dist/api/helpers/reply.d.ts +9 -0
  12. package/dist/api/helpers/reply.d.ts.map +1 -0
  13. package/dist/api/helpers/reply.js +14 -0
  14. package/dist/api/helpers/reply.js.map +1 -0
  15. package/dist/api/plugins/auth.d.ts +27 -0
  16. package/dist/api/plugins/auth.d.ts.map +1 -0
  17. package/dist/api/plugins/auth.js +111 -0
  18. package/dist/api/plugins/auth.js.map +1 -0
  19. package/dist/api/plugins/error-handler.d.ts +12 -0
  20. package/dist/api/plugins/error-handler.d.ts.map +1 -0
  21. package/dist/api/plugins/error-handler.js +72 -0
  22. package/dist/api/plugins/error-handler.js.map +1 -0
  23. package/dist/api/plugins/request-context.d.ts +17 -0
  24. package/dist/api/plugins/request-context.d.ts.map +1 -0
  25. package/dist/api/plugins/request-context.js +61 -0
  26. package/dist/api/plugins/request-context.js.map +1 -0
  27. package/dist/api/routes/health.d.ts +55 -0
  28. package/dist/api/routes/health.d.ts.map +1 -0
  29. package/dist/api/routes/health.js +137 -0
  30. package/dist/api/routes/health.js.map +1 -0
  31. package/dist/api/routes/plugins-introspection.d.ts +17 -0
  32. package/dist/api/routes/plugins-introspection.d.ts.map +1 -0
  33. package/dist/api/routes/plugins-introspection.js +13 -0
  34. package/dist/api/routes/plugins-introspection.js.map +1 -0
  35. package/dist/api/schemas/common.d.ts +114 -0
  36. package/dist/api/schemas/common.d.ts.map +1 -0
  37. package/dist/api/schemas/common.js +109 -0
  38. package/dist/api/schemas/common.js.map +1 -0
  39. package/dist/api/schemas/telemetry.d.ts +66 -0
  40. package/dist/api/schemas/telemetry.d.ts.map +1 -0
  41. package/dist/api/schemas/telemetry.js +52 -0
  42. package/dist/api/schemas/telemetry.js.map +1 -0
  43. package/dist/cache/keyed-ttl-cache.d.ts +45 -0
  44. package/dist/cache/keyed-ttl-cache.d.ts.map +1 -0
  45. package/dist/cache/keyed-ttl-cache.js +69 -0
  46. package/dist/cache/keyed-ttl-cache.js.map +1 -0
  47. package/dist/cache/response-cache.d.ts +37 -0
  48. package/dist/cache/response-cache.d.ts.map +1 -0
  49. package/dist/cache/response-cache.js +114 -0
  50. package/dist/cache/response-cache.js.map +1 -0
  51. package/dist/config.d.ts +258 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +138 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/lib/applicant-payload.d.ts +28 -0
  56. package/dist/lib/applicant-payload.d.ts.map +1 -0
  57. package/dist/lib/applicant-payload.js +20 -0
  58. package/dist/lib/applicant-payload.js.map +1 -0
  59. package/dist/lib/application-address.d.ts +16 -0
  60. package/dist/lib/application-address.d.ts.map +1 -0
  61. package/dist/lib/application-address.js +20 -0
  62. package/dist/lib/application-address.js.map +1 -0
  63. package/dist/lib/application-answers.d.ts +151 -0
  64. package/dist/lib/application-answers.d.ts.map +1 -0
  65. package/dist/lib/application-answers.js +95 -0
  66. package/dist/lib/application-answers.js.map +1 -0
  67. package/dist/lib/application-identity.d.ts +18 -0
  68. package/dist/lib/application-identity.d.ts.map +1 -0
  69. package/dist/lib/application-identity.js +20 -0
  70. package/dist/lib/application-identity.js.map +1 -0
  71. package/dist/lib/application-resume.d.ts +21 -0
  72. package/dist/lib/application-resume.d.ts.map +1 -0
  73. package/dist/lib/application-resume.js +23 -0
  74. package/dist/lib/application-resume.js.map +1 -0
  75. package/dist/lib/bedrock.d.ts +22 -0
  76. package/dist/lib/bedrock.d.ts.map +1 -0
  77. package/dist/lib/bedrock.js +35 -0
  78. package/dist/lib/bedrock.js.map +1 -0
  79. package/dist/lib/case-insensitive-headers.d.ts +15 -0
  80. package/dist/lib/case-insensitive-headers.d.ts.map +1 -0
  81. package/dist/lib/case-insensitive-headers.js +29 -0
  82. package/dist/lib/case-insensitive-headers.js.map +1 -0
  83. package/dist/lib/chromium-client-hints.d.ts +11 -0
  84. package/dist/lib/chromium-client-hints.d.ts.map +1 -0
  85. package/dist/lib/chromium-client-hints.js +17 -0
  86. package/dist/lib/chromium-client-hints.js.map +1 -0
  87. package/dist/lib/cookie-value.d.ts +8 -0
  88. package/dist/lib/cookie-value.d.ts.map +1 -0
  89. package/dist/lib/cookie-value.js +14 -0
  90. package/dist/lib/cookie-value.js.map +1 -0
  91. package/dist/lib/datadog.d.ts +8 -0
  92. package/dist/lib/datadog.d.ts.map +1 -0
  93. package/dist/lib/datadog.js +27 -0
  94. package/dist/lib/datadog.js.map +1 -0
  95. package/dist/lib/dd-metrics.d.ts +28 -0
  96. package/dist/lib/dd-metrics.d.ts.map +1 -0
  97. package/dist/lib/dd-metrics.js +62 -0
  98. package/dist/lib/dd-metrics.js.map +1 -0
  99. package/dist/lib/dispatch-metrics.d.ts +19 -0
  100. package/dist/lib/dispatch-metrics.d.ts.map +1 -0
  101. package/dist/lib/dispatch-metrics.js +65 -0
  102. package/dist/lib/dispatch-metrics.js.map +1 -0
  103. package/dist/lib/env.d.ts +37 -0
  104. package/dist/lib/env.d.ts.map +1 -0
  105. package/dist/lib/env.js +70 -0
  106. package/dist/lib/env.js.map +1 -0
  107. package/dist/lib/errors.d.ts +15 -0
  108. package/dist/lib/errors.d.ts.map +1 -0
  109. package/dist/lib/errors.js +20 -0
  110. package/dist/lib/errors.js.map +1 -0
  111. package/dist/lib/http.d.ts +7 -0
  112. package/dist/lib/http.d.ts.map +1 -0
  113. package/dist/lib/http.js +14 -0
  114. package/dist/lib/http.js.map +1 -0
  115. package/dist/lib/job-tracking.d.ts +17 -0
  116. package/dist/lib/job-tracking.d.ts.map +1 -0
  117. package/dist/lib/job-tracking.js +19 -0
  118. package/dist/lib/job-tracking.js.map +1 -0
  119. package/dist/lib/llm/anthropic-client.d.ts +12 -0
  120. package/dist/lib/llm/anthropic-client.d.ts.map +1 -0
  121. package/dist/lib/llm/anthropic-client.js +23 -0
  122. package/dist/lib/llm/anthropic-client.js.map +1 -0
  123. package/dist/lib/llm/judge.d.ts +57 -0
  124. package/dist/lib/llm/judge.d.ts.map +1 -0
  125. package/dist/lib/llm/judge.js +123 -0
  126. package/dist/lib/llm/judge.js.map +1 -0
  127. package/dist/lib/llm/judges/error-messages.d.ts +38 -0
  128. package/dist/lib/llm/judges/error-messages.d.ts.map +1 -0
  129. package/dist/lib/llm/judges/error-messages.js +72 -0
  130. package/dist/lib/llm/judges/error-messages.js.map +1 -0
  131. package/dist/lib/llm/judges/invalid-fields.d.ts +43 -0
  132. package/dist/lib/llm/judges/invalid-fields.d.ts.map +1 -0
  133. package/dist/lib/llm/judges/invalid-fields.js +80 -0
  134. package/dist/lib/llm/judges/invalid-fields.js.map +1 -0
  135. package/dist/lib/llm/judges/modal-priority.d.ts +41 -0
  136. package/dist/lib/llm/judges/modal-priority.d.ts.map +1 -0
  137. package/dist/lib/llm/judges/modal-priority.js +74 -0
  138. package/dist/lib/llm/judges/modal-priority.js.map +1 -0
  139. package/dist/lib/llm/judges/select-option.d.ts +49 -0
  140. package/dist/lib/llm/judges/select-option.d.ts.map +1 -0
  141. package/dist/lib/llm/judges/select-option.js +90 -0
  142. package/dist/lib/llm/judges/select-option.js.map +1 -0
  143. package/dist/lib/llm/judges/verify-submit.d.ts +68 -0
  144. package/dist/lib/llm/judges/verify-submit.d.ts.map +1 -0
  145. package/dist/lib/llm/judges/verify-submit.js +89 -0
  146. package/dist/lib/llm/judges/verify-submit.js.map +1 -0
  147. package/dist/lib/llm/schemas.d.ts +220 -0
  148. package/dist/lib/llm/schemas.d.ts.map +1 -0
  149. package/dist/lib/llm/schemas.js +239 -0
  150. package/dist/lib/llm/schemas.js.map +1 -0
  151. package/dist/lib/logging.d.ts +39 -0
  152. package/dist/lib/logging.d.ts.map +1 -0
  153. package/dist/lib/logging.js +219 -0
  154. package/dist/lib/logging.js.map +1 -0
  155. package/dist/lib/multipart.d.ts +34 -0
  156. package/dist/lib/multipart.d.ts.map +1 -0
  157. package/dist/lib/multipart.js +55 -0
  158. package/dist/lib/multipart.js.map +1 -0
  159. package/dist/lib/option-matcher.d.ts +15 -0
  160. package/dist/lib/option-matcher.d.ts.map +1 -0
  161. package/dist/lib/option-matcher.js +69 -0
  162. package/dist/lib/option-matcher.js.map +1 -0
  163. package/dist/lib/phone.d.ts +11 -0
  164. package/dist/lib/phone.d.ts.map +1 -0
  165. package/dist/lib/phone.js +17 -0
  166. package/dist/lib/phone.js.map +1 -0
  167. package/dist/lib/random.d.ts +22 -0
  168. package/dist/lib/random.d.ts.map +1 -0
  169. package/dist/lib/random.js +33 -0
  170. package/dist/lib/random.js.map +1 -0
  171. package/dist/lib/statsd.d.ts +11 -0
  172. package/dist/lib/statsd.d.ts.map +1 -0
  173. package/dist/lib/statsd.js +68 -0
  174. package/dist/lib/statsd.js.map +1 -0
  175. package/dist/lib/telemetry/call-capture.d.ts +89 -0
  176. package/dist/lib/telemetry/call-capture.d.ts.map +1 -0
  177. package/dist/lib/telemetry/call-capture.js +190 -0
  178. package/dist/lib/telemetry/call-capture.js.map +1 -0
  179. package/dist/lib/telemetry/call-types.d.ts +65 -0
  180. package/dist/lib/telemetry/call-types.d.ts.map +1 -0
  181. package/dist/lib/telemetry/call-types.js +68 -0
  182. package/dist/lib/telemetry/call-types.js.map +1 -0
  183. package/dist/lib/telemetry/run-state.d.ts +15 -0
  184. package/dist/lib/telemetry/run-state.d.ts.map +1 -0
  185. package/dist/lib/telemetry/run-state.js +23 -0
  186. package/dist/lib/telemetry/run-state.js.map +1 -0
  187. package/dist/lib/telemetry/s3-sink.d.ts +48 -0
  188. package/dist/lib/telemetry/s3-sink.d.ts.map +1 -0
  189. package/dist/lib/telemetry/s3-sink.js +229 -0
  190. package/dist/lib/telemetry/s3-sink.js.map +1 -0
  191. package/dist/lib/telemetry/submission-capture.d.ts +45 -0
  192. package/dist/lib/telemetry/submission-capture.d.ts.map +1 -0
  193. package/dist/lib/telemetry/submission-capture.js +57 -0
  194. package/dist/lib/telemetry/submission-capture.js.map +1 -0
  195. package/dist/lib/telemetry/telemetry-paths.d.ts +59 -0
  196. package/dist/lib/telemetry/telemetry-paths.d.ts.map +1 -0
  197. package/dist/lib/telemetry/telemetry-paths.js +103 -0
  198. package/dist/lib/telemetry/telemetry-paths.js.map +1 -0
  199. package/dist/lib/tracking-click.d.ts +20 -0
  200. package/dist/lib/tracking-click.d.ts.map +1 -0
  201. package/dist/lib/tracking-click.js +75 -0
  202. package/dist/lib/tracking-click.js.map +1 -0
  203. package/dist/lib/url-capture.d.ts +8 -0
  204. package/dist/lib/url-capture.d.ts.map +1 -0
  205. package/dist/lib/url-capture.js +17 -0
  206. package/dist/lib/url-capture.js.map +1 -0
  207. package/dist/lib/us-states.d.ts +20 -0
  208. package/dist/lib/us-states.d.ts.map +1 -0
  209. package/dist/lib/us-states.js +86 -0
  210. package/dist/lib/us-states.js.map +1 -0
  211. package/dist/lib/zod-multipart.d.ts +18 -0
  212. package/dist/lib/zod-multipart.d.ts.map +1 -0
  213. package/dist/lib/zod-multipart.js +35 -0
  214. package/dist/lib/zod-multipart.js.map +1 -0
  215. package/dist/plugins/config-plugin.d.ts +77 -0
  216. package/dist/plugins/config-plugin.d.ts.map +1 -0
  217. package/dist/plugins/config-plugin.js +216 -0
  218. package/dist/plugins/config-plugin.js.map +1 -0
  219. package/dist/plugins/discover.d.ts +72 -0
  220. package/dist/plugins/discover.d.ts.map +1 -0
  221. package/dist/plugins/discover.js +265 -0
  222. package/dist/plugins/discover.js.map +1 -0
  223. package/dist/plugins/json-schema-to-zod.d.ts +47 -0
  224. package/dist/plugins/json-schema-to-zod.d.ts.map +1 -0
  225. package/dist/plugins/json-schema-to-zod.js +85 -0
  226. package/dist/plugins/json-schema-to-zod.js.map +1 -0
  227. package/dist/plugins/loader.d.ts +34 -0
  228. package/dist/plugins/loader.d.ts.map +1 -0
  229. package/dist/plugins/loader.js +348 -0
  230. package/dist/plugins/loader.js.map +1 -0
  231. package/dist/plugins/plugin-api-version.d.ts +8 -0
  232. package/dist/plugins/plugin-api-version.d.ts.map +1 -0
  233. package/dist/plugins/plugin-api-version.js +11 -0
  234. package/dist/plugins/plugin-api-version.js.map +1 -0
  235. package/dist/plugins/plugin-manifest-envelope.d.ts +16 -0
  236. package/dist/plugins/plugin-manifest-envelope.d.ts.map +1 -0
  237. package/dist/plugins/plugin-manifest-envelope.js +19 -0
  238. package/dist/plugins/plugin-manifest-envelope.js.map +1 -0
  239. package/dist/scraper/behavioral-signals.d.ts +16 -0
  240. package/dist/scraper/behavioral-signals.d.ts.map +1 -0
  241. package/dist/scraper/behavioral-signals.js +30 -0
  242. package/dist/scraper/behavioral-signals.js.map +1 -0
  243. package/dist/scraper/errors.d.ts +193 -0
  244. package/dist/scraper/errors.d.ts.map +1 -0
  245. package/dist/scraper/errors.js +226 -0
  246. package/dist/scraper/errors.js.map +1 -0
  247. package/dist/scraper/fixtures.d.ts +23 -0
  248. package/dist/scraper/fixtures.d.ts.map +1 -0
  249. package/dist/scraper/fixtures.js +48 -0
  250. package/dist/scraper/fixtures.js.map +1 -0
  251. package/dist/scraper/flow-runner.d.ts +1319 -0
  252. package/dist/scraper/flow-runner.d.ts.map +1 -0
  253. package/dist/scraper/flow-runner.js +5637 -0
  254. package/dist/scraper/flow-runner.js.map +1 -0
  255. package/dist/scraper/graphql-client.d.ts +30 -0
  256. package/dist/scraper/graphql-client.d.ts.map +1 -0
  257. package/dist/scraper/graphql-client.js +14 -0
  258. package/dist/scraper/graphql-client.js.map +1 -0
  259. package/dist/scraper/http-client.d.ts +75 -0
  260. package/dist/scraper/http-client.d.ts.map +1 -0
  261. package/dist/scraper/http-client.js +189 -0
  262. package/dist/scraper/http-client.js.map +1 -0
  263. package/dist/scraper/http-status-classifier.d.ts +12 -0
  264. package/dist/scraper/http-status-classifier.d.ts.map +1 -0
  265. package/dist/scraper/http-status-classifier.js +29 -0
  266. package/dist/scraper/http-status-classifier.js.map +1 -0
  267. package/dist/scraper/metrics.d.ts +50 -0
  268. package/dist/scraper/metrics.d.ts.map +1 -0
  269. package/dist/scraper/metrics.js +85 -0
  270. package/dist/scraper/metrics.js.map +1 -0
  271. package/dist/scraper/navigate.d.ts +20 -0
  272. package/dist/scraper/navigate.d.ts.map +1 -0
  273. package/dist/scraper/navigate.js +30 -0
  274. package/dist/scraper/navigate.js.map +1 -0
  275. package/dist/scraper/oracle-sentinels.d.ts +22 -0
  276. package/dist/scraper/oracle-sentinels.d.ts.map +1 -0
  277. package/dist/scraper/oracle-sentinels.js +40 -0
  278. package/dist/scraper/oracle-sentinels.js.map +1 -0
  279. package/dist/scraper/parse-json-response.d.ts +16 -0
  280. package/dist/scraper/parse-json-response.d.ts.map +1 -0
  281. package/dist/scraper/parse-json-response.js +37 -0
  282. package/dist/scraper/parse-json-response.js.map +1 -0
  283. package/dist/scraper/pool.d.ts +37 -0
  284. package/dist/scraper/pool.d.ts.map +1 -0
  285. package/dist/scraper/pool.js +105 -0
  286. package/dist/scraper/pool.js.map +1 -0
  287. package/dist/scraper/rate-limited-json-client.d.ts +35 -0
  288. package/dist/scraper/rate-limited-json-client.d.ts.map +1 -0
  289. package/dist/scraper/rate-limited-json-client.js +29 -0
  290. package/dist/scraper/rate-limited-json-client.js.map +1 -0
  291. package/dist/scraper/raw-fetch.d.ts +49 -0
  292. package/dist/scraper/raw-fetch.d.ts.map +1 -0
  293. package/dist/scraper/raw-fetch.js +40 -0
  294. package/dist/scraper/raw-fetch.js.map +1 -0
  295. package/dist/scraper/require-response-field.d.ts +23 -0
  296. package/dist/scraper/require-response-field.d.ts.map +1 -0
  297. package/dist/scraper/require-response-field.js +42 -0
  298. package/dist/scraper/require-response-field.js.map +1 -0
  299. package/dist/scraper/retry.d.ts +33 -0
  300. package/dist/scraper/retry.d.ts.map +1 -0
  301. package/dist/scraper/retry.js +122 -0
  302. package/dist/scraper/retry.js.map +1 -0
  303. package/dist/scraper/session-browserbase.d.ts +35 -0
  304. package/dist/scraper/session-browserbase.d.ts.map +1 -0
  305. package/dist/scraper/session-browserbase.js +198 -0
  306. package/dist/scraper/session-browserbase.js.map +1 -0
  307. package/dist/scraper/session-shared.d.ts +29 -0
  308. package/dist/scraper/session-shared.d.ts.map +1 -0
  309. package/dist/scraper/session-shared.js +35 -0
  310. package/dist/scraper/session-shared.js.map +1 -0
  311. package/dist/scraper/session-steel.d.ts +31 -0
  312. package/dist/scraper/session-steel.d.ts.map +1 -0
  313. package/dist/scraper/session-steel.js +140 -0
  314. package/dist/scraper/session-steel.js.map +1 -0
  315. package/dist/scraper/session-warmup.d.ts +31 -0
  316. package/dist/scraper/session-warmup.d.ts.map +1 -0
  317. package/dist/scraper/session-warmup.js +46 -0
  318. package/dist/scraper/session-warmup.js.map +1 -0
  319. package/dist/scraper/session.d.ts +21 -0
  320. package/dist/scraper/session.d.ts.map +1 -0
  321. package/dist/scraper/session.js +28 -0
  322. package/dist/scraper/session.js.map +1 -0
  323. package/dist/scraper/stagehand-guard.d.ts +128 -0
  324. package/dist/scraper/stagehand-guard.d.ts.map +1 -0
  325. package/dist/scraper/stagehand-guard.js +337 -0
  326. package/dist/scraper/stagehand-guard.js.map +1 -0
  327. package/dist/scraper/throttle.d.ts +21 -0
  328. package/dist/scraper/throttle.d.ts.map +1 -0
  329. package/dist/scraper/throttle.js +45 -0
  330. package/dist/scraper/throttle.js.map +1 -0
  331. package/dist/scripts/hca-inbox-poll.d.ts +19 -0
  332. package/dist/scripts/hca-inbox-poll.d.ts.map +1 -0
  333. package/dist/scripts/hca-inbox-poll.js +151 -0
  334. package/dist/scripts/hca-inbox-poll.js.map +1 -0
  335. package/dist/scripts/judge-llm-batch.d.ts +98 -0
  336. package/dist/scripts/judge-llm-batch.d.ts.map +1 -0
  337. package/dist/scripts/judge-llm-batch.js +350 -0
  338. package/dist/scripts/judge-llm-batch.js.map +1 -0
  339. package/dist/scripts/llm-heal.d.ts +165 -0
  340. package/dist/scripts/llm-heal.d.ts.map +1 -0
  341. package/dist/scripts/llm-heal.js +595 -0
  342. package/dist/scripts/llm-heal.js.map +1 -0
  343. package/dist/scripts/migrate-telemetry-dir-names.d.ts +57 -0
  344. package/dist/scripts/migrate-telemetry-dir-names.d.ts.map +1 -0
  345. package/dist/scripts/migrate-telemetry-dir-names.js +156 -0
  346. package/dist/scripts/migrate-telemetry-dir-names.js.map +1 -0
  347. package/dist/scripts/probe-setinputfiles.d.ts +28 -0
  348. package/dist/scripts/probe-setinputfiles.d.ts.map +1 -0
  349. package/dist/scripts/probe-setinputfiles.js +95 -0
  350. package/dist/scripts/probe-setinputfiles.js.map +1 -0
  351. package/dist/scripts/recon-browser.d.ts +304 -0
  352. package/dist/scripts/recon-browser.d.ts.map +1 -0
  353. package/dist/scripts/recon-browser.js +1833 -0
  354. package/dist/scripts/recon-browser.js.map +1 -0
  355. package/dist/scripts/recon-generate.d.ts +182 -0
  356. package/dist/scripts/recon-generate.d.ts.map +1 -0
  357. package/dist/scripts/recon-generate.js +2572 -0
  358. package/dist/scripts/recon-generate.js.map +1 -0
  359. package/dist/scripts/recon-heal.d.ts +176 -0
  360. package/dist/scripts/recon-heal.d.ts.map +1 -0
  361. package/dist/scripts/recon-heal.js +584 -0
  362. package/dist/scripts/recon-heal.js.map +1 -0
  363. package/dist/scripts/recon-http.d.ts +19 -0
  364. package/dist/scripts/recon-http.d.ts.map +1 -0
  365. package/dist/scripts/recon-http.js +377 -0
  366. package/dist/scripts/recon-http.js.map +1 -0
  367. package/dist/scripts/recon-replay-jobs.d.ts +21 -0
  368. package/dist/scripts/recon-replay-jobs.d.ts.map +1 -0
  369. package/dist/scripts/recon-replay-jobs.js +221 -0
  370. package/dist/scripts/recon-replay-jobs.js.map +1 -0
  371. package/dist/scripts/recon-shared.d.ts +52 -0
  372. package/dist/scripts/recon-shared.d.ts.map +1 -0
  373. package/dist/scripts/recon-shared.js +68 -0
  374. package/dist/scripts/recon-shared.js.map +1 -0
  375. package/dist/scripts/recon-summarize.d.ts +15 -0
  376. package/dist/scripts/recon-summarize.d.ts.map +1 -0
  377. package/dist/scripts/recon-summarize.js +233 -0
  378. package/dist/scripts/recon-summarize.js.map +1 -0
  379. package/dist/scripts/smoke-test.d.ts +22 -0
  380. package/dist/scripts/smoke-test.d.ts.map +1 -0
  381. package/dist/scripts/smoke-test.js +236 -0
  382. package/dist/scripts/smoke-test.js.map +1 -0
  383. package/dist/server.d.ts +10 -0
  384. package/dist/server.d.ts.map +1 -0
  385. package/dist/server.js +189 -0
  386. package/dist/server.js.map +1 -0
  387. package/dist/site-plugin.d.ts +226 -0
  388. package/dist/site-plugin.d.ts.map +1 -0
  389. package/dist/site-plugin.js +13 -0
  390. package/dist/site-plugin.js.map +1 -0
  391. package/dist/testing/answers-fixture.d.ts +13 -0
  392. package/dist/testing/answers-fixture.d.ts.map +1 -0
  393. package/dist/testing/answers-fixture.js +37 -0
  394. package/dist/testing/answers-fixture.js.map +1 -0
  395. package/dist/testing/batch-email-confirmation.d.ts +58 -0
  396. package/dist/testing/batch-email-confirmation.d.ts.map +1 -0
  397. package/dist/testing/batch-email-confirmation.js +62 -0
  398. package/dist/testing/batch-email-confirmation.js.map +1 -0
  399. package/dist/testing/batch-report.d.ts +33 -0
  400. package/dist/testing/batch-report.d.ts.map +1 -0
  401. package/dist/testing/batch-report.js +30 -0
  402. package/dist/testing/batch-report.js.map +1 -0
  403. package/dist/testing/contract-parity-suite.d.ts +55 -0
  404. package/dist/testing/contract-parity-suite.d.ts.map +1 -0
  405. package/dist/testing/contract-parity-suite.js +39 -0
  406. package/dist/testing/contract-parity-suite.js.map +1 -0
  407. package/dist/testing/coverage-guard-suite.d.ts +46 -0
  408. package/dist/testing/coverage-guard-suite.d.ts.map +1 -0
  409. package/dist/testing/coverage-guard-suite.js +39 -0
  410. package/dist/testing/coverage-guard-suite.js.map +1 -0
  411. package/dist/testing/fixtures/resume.pdf +54 -0
  412. package/dist/testing/integration-runner.d.ts +62 -0
  413. package/dist/testing/integration-runner.d.ts.map +1 -0
  414. package/dist/testing/integration-runner.js +46 -0
  415. package/dist/testing/integration-runner.js.map +1 -0
  416. package/dist/testing/mock-fetch-response.d.ts +7 -0
  417. package/dist/testing/mock-fetch-response.d.ts.map +1 -0
  418. package/dist/testing/mock-fetch-response.js +16 -0
  419. package/dist/testing/mock-fetch-response.js.map +1 -0
  420. package/dist/testing/persona-fixture.d.ts +77 -0
  421. package/dist/testing/persona-fixture.d.ts.map +1 -0
  422. package/dist/testing/persona-fixture.js +83 -0
  423. package/dist/testing/persona-fixture.js.map +1 -0
  424. package/dist/testing/replay-integration-suite.d.ts +50 -0
  425. package/dist/testing/replay-integration-suite.d.ts.map +1 -0
  426. package/dist/testing/replay-integration-suite.js +45 -0
  427. package/dist/testing/replay-integration-suite.js.map +1 -0
  428. package/dist/testing/resume-fixture.d.ts +39 -0
  429. package/dist/testing/resume-fixture.d.ts.map +1 -0
  430. package/dist/testing/resume-fixture.js +38 -0
  431. package/dist/testing/resume-fixture.js.map +1 -0
  432. package/dist/testmail/client.d.ts +61 -0
  433. package/dist/testmail/client.d.ts.map +1 -0
  434. package/dist/testmail/client.js +190 -0
  435. package/dist/testmail/client.js.map +1 -0
  436. package/dist/testmail/errors.d.ts +18 -0
  437. package/dist/testmail/errors.d.ts.map +1 -0
  438. package/dist/testmail/errors.js +29 -0
  439. package/dist/testmail/errors.js.map +1 -0
  440. package/dist/types/dispatch-metrics.d.ts +46 -0
  441. package/dist/types/dispatch-metrics.d.ts.map +1 -0
  442. package/dist/types/dispatch-metrics.js +25 -0
  443. package/dist/types/dispatch-metrics.js.map +1 -0
  444. package/dist/types/logging.d.ts +11 -0
  445. package/dist/types/logging.d.ts.map +1 -0
  446. package/dist/types/logging.js +3 -0
  447. package/dist/types/logging.js.map +1 -0
  448. package/package.json +283 -0
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * Turns a declarative plugin manifest (JSON on disk, no per-site TypeScript)
4
+ * into a live {@link SitePlugin} at load time. This is what makes a Barnacle
5
+ * site loadable from configuration alone: the manifest carries the request /
6
+ * response / extract schemas as JSON Schema and the browser flow as data, and
7
+ * `buildConfigPlugin` synthesizes the Zod instances + `execute` function the
8
+ * loader's `validatePluginShape` requires.
9
+ *
10
+ * The manifest wears the Kubernetes-style `apiVersion` / `kind` / `metadata` /
11
+ * `spec` envelope so it reads like every other declarative object operators
12
+ * already know, and the browser flow reuses the same `RECON_FLOW_STEP_SCHEMA` +
13
+ * `runHealingFlow` interpreter the recon toolchain and generated plugins use —
14
+ * this factory is the recon-generate `emitBrowserFlowTs` template made
15
+ * data-driven instead of frozen into source.
16
+ */
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.CONFIG_PLUGIN_MANIFEST = void 0;
22
+ exports.buildConfigPlugin = buildConfigPlugin;
23
+ const node_path_1 = __importDefault(require("node:path"));
24
+ const node_url_1 = require("node:url");
25
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
26
+ const v4_1 = require("zod/v4");
27
+ const schemas_1 = require("../lib/llm/schemas");
28
+ const logging_1 = require("../lib/logging");
29
+ const json_schema_to_zod_1 = require("../plugins/json-schema-to-zod");
30
+ const plugin_api_version_1 = require("../plugins/plugin-api-version");
31
+ const plugin_manifest_envelope_1 = require("../plugins/plugin-manifest-envelope");
32
+ const flow_runner_1 = require("../scraper/flow-runner");
33
+ const navigate_1 = require("../scraper/navigate");
34
+ const stagehand_guard_1 = require("../scraper/stagehand-guard");
35
+ /** JSON-Schema fragment as it appears verbatim in a manifest; converted to Zod at build time. */
36
+ const jsonSchemaFragment = v4_1.z.record(v4_1.z.string(), v4_1.z.unknown());
37
+ const flowSchema = v4_1.z.object({
38
+ steps: v4_1.z.array(schemas_1.RECON_FLOW_STEP_SCHEMA).min(1),
39
+ submitEndpointPattern: v4_1.z.string().nullish(),
40
+ submittedStateSelectors: v4_1.z.array(v4_1.z.string()).optional(),
41
+ requireSubmitEndpointMatch: v4_1.z.boolean().optional(),
42
+ advanceTransitionBodyPattern: v4_1.z.string().nullish(),
43
+ successUrlFragments: v4_1.z.array(v4_1.z.string()).optional(),
44
+ successPageTitleHints: v4_1.z.array(v4_1.z.string()).optional(),
45
+ ownBackendHostnames: v4_1.z.array(v4_1.z.string()).optional(),
46
+ knownErrorClassPrefixes: v4_1.z.array(v4_1.z.string()).optional(),
47
+ wizardExitButtonLabels: v4_1.z.array(v4_1.z.string()).optional(),
48
+ });
49
+ /**
50
+ * Structural schema for a config-plugin manifest. Validated before conversion
51
+ * so a malformed manifest fails at load with a descriptive Zod error rather
52
+ * than a runtime crash while the plugin is servicing a request.
53
+ */
54
+ exports.CONFIG_PLUGIN_MANIFEST = v4_1.z.object({
55
+ apiVersion: v4_1.z.literal(plugin_manifest_envelope_1.CONFIG_PLUGIN_API_VERSION),
56
+ kind: v4_1.z.literal(plugin_manifest_envelope_1.CONFIG_PLUGIN_KIND),
57
+ metadata: v4_1.z.object({
58
+ siteId: v4_1.z.string().min(1),
59
+ displayName: v4_1.z.string().min(1),
60
+ }),
61
+ spec: v4_1.z.object({
62
+ defaultBaseUrl: v4_1.z.string().optional(),
63
+ routeOverride: v4_1.z.string().optional(),
64
+ multipart: v4_1.z.boolean().optional(),
65
+ advancedStealth: v4_1.z.boolean().optional(),
66
+ taskTimeoutMs: v4_1.z.number().optional(),
67
+ request: jsonSchemaFragment,
68
+ response: jsonSchemaFragment,
69
+ flow: flowSchema,
70
+ extract: v4_1.z.object({
71
+ instruction: v4_1.z.string().min(1),
72
+ schema: jsonSchemaFragment,
73
+ }),
74
+ httpModule: v4_1.z.string().optional(),
75
+ }),
76
+ });
77
+ /** Matches `{{ .request.FieldName }}` — the only interpolation form a manifest step may use. */
78
+ const TEMPLATE_PATTERN = /\{\{\s*\.request\.([A-Za-z0-9_]+)\s*\}\}/g;
79
+ /**
80
+ * Resolves `{{ .request.X }}` references in a step instruction against the
81
+ * validated request payload. Distinguishes two cases via `declaredFields` (the
82
+ * request schema's property names) so an omitted *optional* field is not
83
+ * conflated with a typo: a reference to an **undeclared** field throws (the
84
+ * manifest is wrong), while a **declared** field the caller omitted resolves to
85
+ * an empty string (a legitimately optional value). Values splice as inert text
86
+ * (no expression evaluation), so there is no injection surface.
87
+ */
88
+ function resolveTemplate(instruction, payload, declaredFields) {
89
+ return instruction.replace(TEMPLATE_PATTERN, (_match, field) => {
90
+ if (!declaredFields.has(field)) {
91
+ throw new Error(`flow step references unknown request field "${field}"`);
92
+ }
93
+ return field in payload ? String(payload[field]) : "";
94
+ });
95
+ }
96
+ /** Normalizes one manifest flow step (bare string or object form) into a {@link HealingFlowStep}. */
97
+ function toHealingStep(step, payload, declaredFields) {
98
+ if (typeof step === "string") {
99
+ return {
100
+ instruction: resolveTemplate(step, payload, declaredFields),
101
+ optional: false,
102
+ upload: false,
103
+ submitStep: false,
104
+ };
105
+ }
106
+ return {
107
+ instruction: resolveTemplate(step.step, payload, declaredFields),
108
+ optional: step.optional,
109
+ upload: step.upload,
110
+ submitStep: step.submitStep,
111
+ };
112
+ }
113
+ /**
114
+ * Builds the resume fixture the browser flow uploads, mirroring the rule the
115
+ * generator's `emitBrowserFlowTs` applies: only when a step uploads AND the
116
+ * manifest declares itself multipart do the `Resume*` payload fields exist.
117
+ */
118
+ function buildResumeFixture(payload, hasUploadStep, multipart) {
119
+ if (!hasUploadStep || !multipart)
120
+ return null;
121
+ return {
122
+ buffer: Buffer.from(payload.Resume ?? "", "base64"),
123
+ name: payload.ResumeFilename ?? "resume.pdf",
124
+ mimeType: payload.ResumeContentType ?? "application/pdf",
125
+ };
126
+ }
127
+ /**
128
+ * Dynamically loads the optional `executeHttp` escape-hatch module a manifest
129
+ * may reference. Kept async and separate so a browser-only manifest never pays
130
+ * for an import it does not use, and a broken `httpModule` disables the plugin
131
+ * via the loader's normal failure path rather than crashing the factory.
132
+ *
133
+ * Resolution mirrors the loader's `resolvePluginSpecifier`: a `.`/`/` specifier
134
+ * is a filesystem path resolved against `baseDir` (so a relative `httpModule`
135
+ * resolves against the operator's `BARNACLE_PLUGINS_DIR`, not this module's
136
+ * location under `dist/`); anything else is a bare package name left for Node's
137
+ * resolver.
138
+ */
139
+ async function loadHttpModule(specifier, baseDir) {
140
+ const resolved = specifier.startsWith(".") || specifier.startsWith("/")
141
+ ? (0, node_url_1.pathToFileURL)(node_path_1.default.resolve(baseDir, specifier)).href
142
+ : specifier;
143
+ const mod = (await import(resolved));
144
+ const candidate = mod.executeHttp ?? mod.default;
145
+ if (typeof candidate !== "function") {
146
+ throw new Error(`httpModule ${specifier} must export an executeHttp function`);
147
+ }
148
+ return candidate;
149
+ }
150
+ /**
151
+ * Synthesizes a {@link SitePlugin} from a validated manifest. The returned
152
+ * object satisfies the loader's `validatePluginShape` by construction: real Zod
153
+ * schemas for `bodySchema`/`responseSchema` and a data-driven `execute` that
154
+ * drives the manifest's flow through the shared self-healing interpreter.
155
+ *
156
+ * `baseDir` resolves a relative `spec.httpModule` escape-hatch path against the
157
+ * operator's plugin directory, matching the loader's specifier resolution; it
158
+ * defaults to `process.cwd()` for callers (e.g. tests) that build a manifest
159
+ * without a manifest-file location.
160
+ */
161
+ async function buildConfigPlugin(raw, baseDir = process.cwd()) {
162
+ const manifest = exports.CONFIG_PLUGIN_MANIFEST.parse(raw);
163
+ const { metadata, spec } = manifest;
164
+ const logger = (0, logging_1.getLogger)({ name: `${metadata.siteId}-config-plugin` });
165
+ const bodySchema = (0, json_schema_to_zod_1.jsonSchemaToZod)(spec.request);
166
+ const responseSchema = (0, json_schema_to_zod_1.jsonSchemaToZod)(spec.response);
167
+ const extractSchema = (0, json_schema_to_zod_1.jsonSchemaToZod)(spec.extract.schema);
168
+ const executeHttp = spec.httpModule ? await loadHttpModule(spec.httpModule, baseDir) : undefined;
169
+ const hasUploadStep = spec.flow.steps.some((s) => typeof s !== "string" && s.upload === true);
170
+ const declaredFields = new Set(Object.keys(spec.request.properties ?? {}));
171
+ const plugin = {
172
+ meta: {
173
+ siteId: metadata.siteId,
174
+ displayName: metadata.displayName,
175
+ bodySchema,
176
+ responseSchema,
177
+ apiVersion: plugin_api_version_1.PLUGIN_API_VERSION,
178
+ ...(spec.routeOverride !== undefined && { routeOverride: spec.routeOverride }),
179
+ ...(spec.defaultBaseUrl !== undefined && { defaultBaseUrl: spec.defaultBaseUrl }),
180
+ ...(spec.taskTimeoutMs !== undefined && { taskTimeoutMs: spec.taskTimeoutMs }),
181
+ ...(spec.multipart !== undefined && { multipart: spec.multipart }),
182
+ ...(spec.advancedStealth !== undefined && { advancedStealth: spec.advancedStealth }),
183
+ },
184
+ ...(executeHttp && { executeHttp }),
185
+ async execute(rawPayload, session, context) {
186
+ const payload = rawPayload;
187
+ const { stagehand } = session;
188
+ const page = await (0, navigate_1.navigateActivePage)(stagehand, context.baseUrl, context.metricsCollector);
189
+ const steps = spec.flow.steps.map((s) => toHealingStep(s, payload, declaredFields));
190
+ const anthropic = context.config.scraper.anthropicApiKey
191
+ ? new sdk_1.default({ apiKey: context.config.scraper.anthropicApiKey })
192
+ : null;
193
+ await (0, flow_runner_1.runHealingFlow)({
194
+ stagehand,
195
+ page,
196
+ steps,
197
+ logger,
198
+ anthropic,
199
+ resumeFixture: buildResumeFixture(payload, hasUploadStep, spec.multipart ?? false),
200
+ submitEndpointPattern: spec.flow.submitEndpointPattern ?? null,
201
+ submittedStateSelectors: spec.flow.submittedStateSelectors ?? [],
202
+ requireSubmitEndpointMatch: spec.flow.requireSubmitEndpointMatch ?? false,
203
+ advanceTransitionBodyPattern: spec.flow.advanceTransitionBodyPattern ?? null,
204
+ successUrlFragments: spec.flow.successUrlFragments ?? [],
205
+ successPageTitleHints: spec.flow.successPageTitleHints ?? [],
206
+ ownBackendHostnames: spec.flow.ownBackendHostnames ?? [],
207
+ knownErrorClassPrefixes: spec.flow.knownErrorClassPrefixes ?? [],
208
+ wizardExitButtonLabels: spec.flow.wizardExitButtonLabels ?? [],
209
+ });
210
+ const data = await (0, stagehand_guard_1.guardedExtract)(stagehand, spec.extract.instruction, extractSchema);
211
+ return { data };
212
+ },
213
+ };
214
+ return plugin;
215
+ }
216
+ //# sourceMappingURL=config-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-plugin.js","sourceRoot":"","sources":["../../src/plugins/config-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { AppConfig } from "../config";
2
+ import type { SitePlugin } from "../site-plugin";
3
+ /**
4
+ * Describes the outcome of attempting to load a single plugin specifier.
5
+ * Surfaced by `GET /v1/plugins` and emitted to startup logs.
6
+ */
7
+ export interface PluginLoadRecord {
8
+ /** `null` when the module failed before `meta.siteId` was readable. */
9
+ siteId: string | null;
10
+ displayName: string | null;
11
+ /** Raw specifier from `BARNACLE_PLUGINS` or `"(builtin)"` for in-tree plugins. */
12
+ specifier: string;
13
+ /** Resolved absolute path or package entry point. `null` when resolution failed. */
14
+ resolvedPath: string | null;
15
+ route: string | null;
16
+ apiVersion: string | null;
17
+ status: "loaded" | "disabled";
18
+ /** Present only when `status === "disabled"`. */
19
+ reason?: string;
20
+ }
21
+ /**
22
+ * Aggregated result of loading a set of plugin specifiers, returned by
23
+ * `loadPlugins` and `loadAllPlugins`.
24
+ */
25
+ export interface LoadPluginsResult {
26
+ plugins: SitePlugin<unknown, unknown>[];
27
+ report: PluginLoadRecord[];
28
+ }
29
+ /**
30
+ * Statically-registered in-tree plugins. Empty by default: this engine branch
31
+ * ships no site plugins, so operators register every plugin at runtime via
32
+ * `BARNACLE_PLUGINS` (compiled module specifiers) or `*.plugin.json` config
33
+ * manifests. Kept as a mutable array so tests can push a fixture builtin and so
34
+ * a downstream branch that vendors sites in-tree can repopulate it.
35
+ *
36
+ * @see loadAllPlugins for how built-ins and out-of-tree plugins are composed.
37
+ */
38
+ export declare const BUILTIN_SITE_PLUGINS: SitePlugin<unknown, unknown>[];
39
+ /**
40
+ * Resolves a plugin specifier to a `file://` URL string that `import()` can
41
+ * consume. Follows the Babel plugin-resolution model:
42
+ *
43
+ * - Leading `.` or `/` → filesystem path resolved relative to `baseDir`.
44
+ * - Anything else → npm package resolved via `createRequire` against
45
+ * `baseDir/package.json`, so the operator's local `node_modules` wins.
46
+ *
47
+ * Throws with the specifier and baseDir in the message when resolution fails,
48
+ * so callers can build a descriptive disabled record without catching broadly.
49
+ */
50
+ export declare function resolvePluginSpecifier(spec: string, baseDir: string): string;
51
+ /**
52
+ * Loads and validates a list of plugin specifiers. Each specifier is resolved,
53
+ * imported, shape-validated, version-checked, and deduplication-checked before
54
+ * being added to the result. Failures produce disabled records; under `strict`
55
+ * mode the first failure re-throws immediately.
56
+ *
57
+ * `seenSiteIds` is mutated in place so the caller can pre-seed it with built-in
58
+ * ids before calling this function (built-ins always win collisions).
59
+ */
60
+ export declare function loadPlugins(specifiers: readonly string[], opts: {
61
+ baseDir: string;
62
+ strict: boolean;
63
+ seenSiteIds: Set<string>;
64
+ }): Promise<LoadPluginsResult>;
65
+ /**
66
+ * Composes built-in and out-of-tree plugins into a single result. Built-ins
67
+ * are always listed first and their `siteId`s seed the deduplication set, so
68
+ * an out-of-tree plugin that collides with a built-in is disabled rather than
69
+ * replacing it.
70
+ */
71
+ export declare function loadAllPlugins(cfg: AppConfig): Promise<LoadPluginsResult>;
72
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/plugins/discover.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IACxC,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAO,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc5E;AA2HD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B,GACA,OAAO,CAAC,iBAAiB,CAAC,CAyD5B;AAuBD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6B/E"}
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BUILTIN_SITE_PLUGINS = void 0;
7
+ exports.resolvePluginSpecifier = resolvePluginSpecifier;
8
+ exports.loadPlugins = loadPlugins;
9
+ exports.loadAllPlugins = loadAllPlugins;
10
+ const promises_1 = require("node:fs/promises");
11
+ const node_module_1 = require("node:module");
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const node_url_1 = require("node:url");
14
+ const v4_1 = require("zod/v4");
15
+ const logging_1 = require("../lib/logging");
16
+ const config_plugin_1 = require("../plugins/config-plugin");
17
+ const plugin_api_version_1 = require("../plugins/plugin-api-version");
18
+ const logger = (0, logging_1.getLogger)({ name: "plugins/discover" });
19
+ /**
20
+ * Statically-registered in-tree plugins. Empty by default: this engine branch
21
+ * ships no site plugins, so operators register every plugin at runtime via
22
+ * `BARNACLE_PLUGINS` (compiled module specifiers) or `*.plugin.json` config
23
+ * manifests. Kept as a mutable array so tests can push a fixture builtin and so
24
+ * a downstream branch that vendors sites in-tree can repopulate it.
25
+ *
26
+ * @see loadAllPlugins for how built-ins and out-of-tree plugins are composed.
27
+ */
28
+ exports.BUILTIN_SITE_PLUGINS = [];
29
+ /**
30
+ * Resolves a plugin specifier to a `file://` URL string that `import()` can
31
+ * consume. Follows the Babel plugin-resolution model:
32
+ *
33
+ * - Leading `.` or `/` → filesystem path resolved relative to `baseDir`.
34
+ * - Anything else → npm package resolved via `createRequire` against
35
+ * `baseDir/package.json`, so the operator's local `node_modules` wins.
36
+ *
37
+ * Throws with the specifier and baseDir in the message when resolution fails,
38
+ * so callers can build a descriptive disabled record without catching broadly.
39
+ */
40
+ function resolvePluginSpecifier(spec, baseDir) {
41
+ if (spec.startsWith(".") || spec.startsWith("/")) {
42
+ return (0, node_url_1.pathToFileURL)(node_path_1.default.resolve(baseDir, spec)).href;
43
+ }
44
+ const req = (0, node_module_1.createRequire)((0, node_url_1.pathToFileURL)(node_path_1.default.join(baseDir, "package.json")).href);
45
+ try {
46
+ const resolved = req.resolve(spec);
47
+ return (0, node_url_1.pathToFileURL)(resolved).href;
48
+ }
49
+ catch (err) {
50
+ throw new Error(`cannot resolve plugin specifier ${JSON.stringify(spec)} from baseDir ${JSON.stringify(baseDir)}: ${err instanceof Error ? err.message : String(err)}`);
51
+ }
52
+ }
53
+ /** Returns true when `s` looks like a Zod schema without relying on `instanceof`. */
54
+ function looksLikeZodSchema(s) {
55
+ return (typeof s?.safeParse === "function" &&
56
+ typeof s?.parse === "function");
57
+ }
58
+ const metaSchema = v4_1.z
59
+ .object({
60
+ siteId: v4_1.z.string().min(1),
61
+ displayName: v4_1.z.string().min(1),
62
+ routeOverride: v4_1.z.string().optional(),
63
+ defaultBaseUrl: v4_1.z.string().optional(),
64
+ taskTimeoutMs: v4_1.z.number().optional(),
65
+ multipart: v4_1.z.boolean().optional(),
66
+ advancedStealth: v4_1.z.boolean().optional(),
67
+ apiVersion: v4_1.z.string().optional(),
68
+ extraRoutes: v4_1.z.array(v4_1.z.unknown()).optional(),
69
+ })
70
+ .passthrough();
71
+ /**
72
+ * Duck-typed shape validation for an untrusted module export. Uses Zod for
73
+ * `meta` field presence/types, but checks `bodySchema`/`responseSchema` via
74
+ * duck-typing so plugins that bundle their own zod copy are not falsely
75
+ * rejected.
76
+ */
77
+ function validatePluginShape(raw) {
78
+ const obj = raw;
79
+ metaSchema.parse(obj.meta);
80
+ if (!looksLikeZodSchema(obj.meta?.bodySchema)) {
81
+ throw new Error("meta.bodySchema must be a Zod schema");
82
+ }
83
+ if (!looksLikeZodSchema(obj.meta?.responseSchema)) {
84
+ throw new Error("meta.responseSchema must be a Zod schema");
85
+ }
86
+ if (typeof obj.execute !== "function") {
87
+ throw new Error("plugin.execute must be a function");
88
+ }
89
+ return raw;
90
+ }
91
+ /**
92
+ * Parses the leading integer from a semver string, e.g. `"1.2.3"` → `1`.
93
+ * Returns `null` when the string cannot be parsed as a major version.
94
+ */
95
+ function parseMajorVersion(version) {
96
+ const match = /^(\d+)/.exec(version.trim());
97
+ return match ? parseInt(match[1] ?? "0", 10) : null;
98
+ }
99
+ /**
100
+ * Creates a disabled `PluginLoadRecord` from minimal information. Used when
101
+ * a plugin fails at any stage of loading.
102
+ */
103
+ function disabledRecord(opts) {
104
+ const meta = opts.plugin?.meta;
105
+ return {
106
+ siteId: meta?.siteId ?? null,
107
+ displayName: meta?.displayName ?? null,
108
+ specifier: opts.specifier,
109
+ resolvedPath: opts.resolvedPath,
110
+ route: meta ? (meta.routeOverride ?? `/v1/${meta.siteId}/run`) : null,
111
+ apiVersion: meta?.apiVersion ?? null,
112
+ status: "disabled",
113
+ reason: opts.reason,
114
+ };
115
+ }
116
+ /**
117
+ * Normalizes the three supported module export shapes into a single object.
118
+ *
119
+ * When CJS `module.exports = { plugin }` is loaded via dynamic `import()`,
120
+ * Node exposes the entire exports object as `m.default` AND hoists named
121
+ * exports so `m.plugin` is the actual plugin. We must resolve the `plugin`
122
+ * named export before falling back to `default`, otherwise we'd return the
123
+ * wrapper `{ plugin }` object which fails shape validation.
124
+ *
125
+ * Resolution order:
126
+ * 1. `m.plugin` — named `{ plugin }` export (CJS or ESM)
127
+ * 2. `m.default` — ESM default export
128
+ * 3. `m` itself — CJS `module.exports = plugin` (no default wrapping)
129
+ */
130
+ function normalizeExport(mod) {
131
+ const m = mod;
132
+ return m.plugin ?? m.default ?? mod;
133
+ }
134
+ /**
135
+ * Produces a raw plugin object from a resolved `file://` specifier. A `.json`
136
+ * specifier is a declarative manifest — read, parse, and run through
137
+ * `buildConfigPlugin` to synthesize a `SitePlugin` (no per-site TypeScript, no
138
+ * compile step). Anything else is a compiled module `import()`ed as before. The
139
+ * synthesized object still flows through the same `validatePluginShape` gate as
140
+ * a module plugin, so the two sources share one validation path.
141
+ *
142
+ * `baseDir` is threaded into `buildConfigPlugin` so a manifest's relative
143
+ * `spec.httpModule` escape-hatch path resolves against the operator's plugin
144
+ * directory, consistent with how module specifiers themselves are resolved.
145
+ */
146
+ async function loadRawPlugin(resolvedPath, baseDir) {
147
+ if (resolvedPath.endsWith(".json")) {
148
+ const manifest = JSON.parse(await (0, promises_1.readFile)((0, node_url_1.fileURLToPath)(resolvedPath), "utf8"));
149
+ return await (0, config_plugin_1.buildConfigPlugin)(manifest, baseDir);
150
+ }
151
+ const mod = await import(resolvedPath);
152
+ return normalizeExport(mod);
153
+ }
154
+ /**
155
+ * Loads and validates a list of plugin specifiers. Each specifier is resolved,
156
+ * imported, shape-validated, version-checked, and deduplication-checked before
157
+ * being added to the result. Failures produce disabled records; under `strict`
158
+ * mode the first failure re-throws immediately.
159
+ *
160
+ * `seenSiteIds` is mutated in place so the caller can pre-seed it with built-in
161
+ * ids before calling this function (built-ins always win collisions).
162
+ */
163
+ async function loadPlugins(specifiers, opts) {
164
+ const { baseDir, strict, seenSiteIds } = opts;
165
+ const plugins = [];
166
+ const report = [];
167
+ for (const spec of specifiers) {
168
+ let resolvedPath = null;
169
+ let plugin;
170
+ try {
171
+ resolvedPath = resolvePluginSpecifier(spec, baseDir);
172
+ const raw = await loadRawPlugin(resolvedPath, baseDir);
173
+ plugin = validatePluginShape(raw);
174
+ const meta = plugin.meta;
175
+ if (meta.apiVersion !== undefined) {
176
+ const pluginMajor = parseMajorVersion(meta.apiVersion);
177
+ const coreMajor = parseMajorVersion(plugin_api_version_1.PLUGIN_API_VERSION);
178
+ if (pluginMajor === null || coreMajor === null || pluginMajor !== coreMajor) {
179
+ const reason = `apiVersion ${meta.apiVersion} incompatible with core ${plugin_api_version_1.PLUGIN_API_VERSION}`;
180
+ logger.warn(`${spec}: ${reason}`);
181
+ report.push(disabledRecord({ specifier: spec, resolvedPath, plugin, reason }));
182
+ continue;
183
+ }
184
+ }
185
+ if (seenSiteIds.has(meta.siteId)) {
186
+ const reason = `duplicate siteId "${meta.siteId}" — already registered`;
187
+ logger.warn(`${spec}: ${reason}`);
188
+ report.push(disabledRecord({ specifier: spec, resolvedPath, plugin, reason }));
189
+ continue;
190
+ }
191
+ seenSiteIds.add(meta.siteId);
192
+ plugins.push(plugin);
193
+ logger.info(`${spec}: loaded siteId "${meta.siteId}" (${plugin_api_version_1.PLUGIN_API_VERSION})`);
194
+ report.push({
195
+ siteId: meta.siteId,
196
+ displayName: meta.displayName,
197
+ specifier: spec,
198
+ resolvedPath,
199
+ route: meta.routeOverride ?? `/v1/${meta.siteId}/run`,
200
+ apiVersion: meta.apiVersion ?? null,
201
+ status: "loaded",
202
+ });
203
+ }
204
+ catch (err) {
205
+ const reason = err instanceof Error ? err.message : String(err);
206
+ logger.warn(`${spec}: failed to load — ${reason}`);
207
+ report.push(disabledRecord({ specifier: spec, resolvedPath, plugin, reason }));
208
+ if (strict)
209
+ throw err;
210
+ }
211
+ }
212
+ return { plugins, report };
213
+ }
214
+ /**
215
+ * Scans `configDir` for `*.plugin.json` manifests and returns their absolute
216
+ * paths as loader specifiers. Best-effort: an unreadable directory yields an
217
+ * empty list with a warn log so a misconfigured `BARNACLE_PLUGINS_CONFIG_DIR`
218
+ * never crashes boot — the same failure-isolation posture as a bad plugin.
219
+ */
220
+ async function discoverConfigManifests(configDir) {
221
+ try {
222
+ const entries = await (0, promises_1.readdir)(configDir);
223
+ return entries
224
+ .filter((name) => name.endsWith(".plugin.json"))
225
+ .sort()
226
+ .map((name) => node_path_1.default.resolve(configDir, name));
227
+ }
228
+ catch (err) {
229
+ logger.warn(`plugin config dir ${JSON.stringify(configDir)} not scannable — ${err instanceof Error ? err.message : String(err)}`);
230
+ return [];
231
+ }
232
+ }
233
+ /**
234
+ * Composes built-in and out-of-tree plugins into a single result. Built-ins
235
+ * are always listed first and their `siteId`s seed the deduplication set, so
236
+ * an out-of-tree plugin that collides with a built-in is disabled rather than
237
+ * replacing it.
238
+ */
239
+ async function loadAllPlugins(cfg) {
240
+ const builtins = exports.BUILTIN_SITE_PLUGINS;
241
+ const seenSiteIds = new Set(builtins.map((p) => p.meta.siteId));
242
+ const builtinReport = builtins.map((p) => ({
243
+ siteId: p.meta.siteId,
244
+ displayName: p.meta.displayName,
245
+ specifier: "(builtin)",
246
+ resolvedPath: null,
247
+ route: p.meta.routeOverride ?? `/v1/${p.meta.siteId}/run`,
248
+ apiVersion: p.meta.apiVersion ?? null,
249
+ status: "loaded",
250
+ }));
251
+ const configManifests = cfg.plugins.configDir
252
+ ? await discoverConfigManifests(cfg.plugins.configDir)
253
+ : [];
254
+ const specifiers = [...cfg.plugins.specifiers, ...configManifests];
255
+ const { plugins, report } = await loadPlugins(specifiers, {
256
+ baseDir: cfg.plugins.baseDir,
257
+ strict: cfg.plugins.strict,
258
+ seenSiteIds,
259
+ });
260
+ return {
261
+ plugins: [...builtins, ...plugins],
262
+ report: [...builtinReport, ...report],
263
+ };
264
+ }
265
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/plugins/discover.ts"],"names":[],"mappings":";;;;;;AAiEA,wDAcC;AAoID,kCAgEC;AA6BD,wCA6BC;AA7UD,+CAAqD;AACrD,6CAA4C;AAC5C,0DAA6B;AAC7B,uCAAwD;AAExD,+BAA2B;AAG3B,2CAA0C;AAC1C,2DAA4D;AAC5D,qEAAkE;AAGlE,MAAM,MAAM,GAAG,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;AA8BvD;;;;;;;;GAQG;AACU,QAAA,oBAAoB,GAAmC,EAAE,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,SAAgB,sBAAsB,CAAC,IAAY,EAAE,OAAe;IAClE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,IAAA,wBAAa,EAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,2BAAa,EAAC,IAAA,wBAAa,EAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAA,wBAAa,EAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACvJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,SAAS,kBAAkB,CAAC,CAAU;IACpC,OAAO,CACL,OAAQ,CAA6B,EAAE,SAAS,KAAK,UAAU;QAC/D,OAAQ,CAAyB,EAAE,KAAK,KAAK,UAAU,CACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,MAAC;KACjB,MAAM,CAAC;IACN,MAAM,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,WAAW,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,aAAa,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,cAAc,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,aAAa,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,SAAS,EAAE,MAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,eAAe,EAAE,MAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACvC,UAAU,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,MAAC,CAAC,KAAK,CAAC,MAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7C,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,GAAY;IACvC,MAAM,GAAG,GAAG,GAGX,CAAC;IAEF,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAE3B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,GAAmC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,IAGC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IAC/B,OAAO;QACL,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI;QAC5B,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,IAAI;QACtC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QACrE,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,IAAI;QACpC,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,eAAe,CAAC,GAAY;IACnC,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,aAAa,CAAC,YAAoB,EAAE,OAAe;IAChE,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAA,wBAAa,EAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACjF,OAAO,MAAM,IAAA,iCAAiB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,WAAW,CAC/B,UAA6B,EAC7B,IAIC;IAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC9C,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,MAAgD,CAAC;QAErD,IAAI,CAAC;YACH,YAAY,GAAG,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAErD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAEvD,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAElC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAEzB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvD,MAAM,SAAS,GAAG,iBAAiB,CAAC,uCAAkB,CAAC,CAAC;gBACxD,IAAI,WAAW,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC5E,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,UAAU,2BAA2B,uCAAkB,EAAE,CAAC;oBAC5F,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC/E,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,qBAAqB,IAAI,CAAC,MAAM,wBAAwB,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC/E,SAAS;YACX,CAAC;YAED,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,oBAAoB,IAAI,CAAC,MAAM,MAAM,uCAAkB,GAAG,CAAC,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI;gBACf,YAAY;gBACZ,KAAK,EAAE,IAAI,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,MAAM,MAAM;gBACrD,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;gBACnC,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,sBAAsB,MAAM,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,MAAM;gBAAE,MAAM,GAAG,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,uBAAuB,CAAC,SAAiB;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,SAAS,CAAC,CAAC;QACzC,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;aAC/C,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CACT,qBAAqB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrH,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAAC,GAAc;IACjD,MAAM,QAAQ,GAAG,4BAAoB,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhE,MAAM,aAAa,GAAuB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;QACrB,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW;QAC/B,SAAS,EAAE,WAAW;QACtB,YAAY,EAAE,IAAI;QAClB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM;QACzD,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI;QACrC,MAAM,EAAE,QAAiB;KAC1B,CAAC,CAAC,CAAC;IAEJ,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS;QAC3C,CAAC,CAAC,MAAM,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;QACtD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,eAAe,CAAC,CAAC;IAEnE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE;QACxD,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;QAC5B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;QAC1B,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;QAClC,MAAM,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,MAAM,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Converts a JSON-Schema fragment into a live Zod schema instance built from
3
+ * the project's own `zod/v4` import. Config plugins declare their request,
4
+ * response, and extract shapes as inert JSON Schema in the manifest; the loader
5
+ * needs real Zod instances because `validatePluginShape`
6
+ * (`src/plugins/discover.ts`) duck-types `meta.bodySchema`/`meta.responseSchema`
7
+ * for `safeParse`/`parse`, and `guardedExtract` constrains its schema argument
8
+ * to `z.ZodTypeAny`.
9
+ *
10
+ * Why in-house and not a library: `z.fromJSONSchema` does not exist on the
11
+ * pinned `zod@3.25.76` (only the reverse `z.toJSONSchema`), and any third-party
12
+ * converter would emit an instance from a *different* Zod copy — failing both
13
+ * the loader duck-type and Stagehand's `StagehandZodSchema` union. Building from
14
+ * this module's own `z` is the only instance-safe route.
15
+ *
16
+ * Scope is deliberately the flat form real form-field payloads need
17
+ * (object/string/number/integer/boolean/array/enum + `required`). Anything
18
+ * outside that surface throws at load time rather than silently degrading, so a
19
+ * manifest that leans on unsupported JSON-Schema features fails loudly.
20
+ */
21
+ import { z } from "zod/v4";
22
+ /** Thrown when a manifest schema uses a JSON-Schema construct this converter does not support. */
23
+ export declare class UnsupportedJsonSchemaError extends Error {
24
+ constructor(message: string);
25
+ }
26
+ /**
27
+ * Recursive shape of the JSON-Schema subset this converter accepts. Validated
28
+ * structurally by {@link JSON_SCHEMA_NODE} before conversion so a malformed
29
+ * manifest schema is rejected with a Zod error rather than a runtime crash
30
+ * mid-conversion.
31
+ */
32
+ export interface JsonSchemaNode {
33
+ type?: "object" | "string" | "number" | "integer" | "boolean" | "array";
34
+ properties?: Record<string, JsonSchemaNode>;
35
+ required?: string[];
36
+ items?: JsonSchemaNode;
37
+ enum?: string[];
38
+ format?: string;
39
+ description?: string;
40
+ }
41
+ /**
42
+ * Converts a manifest's JSON-Schema fragment into a Zod schema instance.
43
+ * Validates the fragment's structure first so unsupported constructs surface as
44
+ * a descriptive error at plugin-load time instead of a downstream parse crash.
45
+ */
46
+ export declare function jsonSchemaToZod(schema: unknown): z.ZodTypeAny;
47
+ //# sourceMappingURL=json-schema-to-zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-to-zod.d.ts","sourceRoot":"","sources":["../../src/plugins/json-schema-to-zod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,kGAAkG;AAClG,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgDD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,UAAU,CAQ7D"}