@apifuse/provider-sdk 2.2.0-beta.7 → 2.2.0-beta.70

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 (478) hide show
  1. package/AUTHORING.md +943 -51
  2. package/CHANGELOG.md +273 -1
  3. package/LICENSE +21 -0
  4. package/README.md +117 -29
  5. package/SUBMISSION.md +3 -2
  6. package/bin/apifuse-check.ts +293 -13
  7. package/bin/apifuse-dev.ts +42 -19
  8. package/bin/apifuse-migrate-deployment.ts +200 -0
  9. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  10. package/bin/apifuse-migrate-shape.ts +202 -0
  11. package/bin/apifuse-pack-check.ts +19 -6
  12. package/bin/apifuse-pack-smoke.ts +57 -2
  13. package/bin/apifuse-pack-types.ts +736 -38
  14. package/bin/apifuse-perf.ts +59 -23
  15. package/bin/apifuse-record.ts +923 -94
  16. package/bin/apifuse-submit-check.ts +2313 -281
  17. package/bin/apifuse-test.ts +3 -1
  18. package/bin/submit-check-delimited-text.ts +50 -0
  19. package/dist/auth-turn/index.d.ts +3 -3
  20. package/dist/auth-turn/index.js +1 -1
  21. package/dist/auth.d.ts +14 -0
  22. package/dist/auth.js +67 -0
  23. package/dist/ceremonies/index.d.ts +16 -0
  24. package/dist/ceremonies/index.js +141 -36
  25. package/dist/cli/commands.d.ts +1 -1
  26. package/dist/cli/commands.js +30 -0
  27. package/dist/cli/create.d.ts +1 -1
  28. package/dist/cli/create.js +8 -2
  29. package/dist/cli/deployment-intent.d.ts +178 -0
  30. package/dist/cli/deployment-intent.js +277 -0
  31. package/dist/cli/local-connection.d.ts +111 -0
  32. package/dist/cli/local-connection.js +151 -0
  33. package/dist/cli/migrate-deployment-intent.d.ts +132 -0
  34. package/dist/cli/migrate-deployment-intent.js +1552 -0
  35. package/dist/cli/migrate-operation-declaration.d.ts +70 -0
  36. package/dist/cli/migrate-operation-declaration.js +2206 -0
  37. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  38. package/dist/cli/migrate-operation-shape.js +113 -0
  39. package/dist/cli/migrate-provider-shape.d.ts +56 -0
  40. package/dist/cli/migrate-provider-shape.js +580 -0
  41. package/dist/cli/resolver-runtime.d.ts +21 -0
  42. package/dist/cli/resolver-runtime.js +31 -0
  43. package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  44. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  45. package/dist/cli/templates/provider/README.md.tpl +41 -19
  46. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  47. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  48. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  49. package/dist/config/loader.d.ts +202 -16
  50. package/dist/config/loader.js +491 -141
  51. package/dist/contract-serialization.js +4 -8
  52. package/dist/contract-types.d.ts +12 -5
  53. package/dist/contract.js +24 -10
  54. package/dist/declaration-validation.d.ts +34 -0
  55. package/dist/declaration-validation.js +305 -0
  56. package/dist/define.d.ts +71 -29
  57. package/dist/define.js +807 -69
  58. package/dist/dev.d.ts +5 -0
  59. package/dist/dev.js +8 -1
  60. package/dist/engine.d.ts +129 -0
  61. package/dist/engine.js +209 -0
  62. package/dist/error-observability.d.ts +7 -0
  63. package/dist/error-observability.js +61 -0
  64. package/dist/error-resolution.d.ts +18 -0
  65. package/dist/error-resolution.js +243 -0
  66. package/dist/errors.d.ts +74 -0
  67. package/dist/errors.js +99 -0
  68. package/dist/fixture-sanitization.d.ts +28 -0
  69. package/dist/fixture-sanitization.js +371 -0
  70. package/dist/handle-meta.d.ts +90 -0
  71. package/dist/handle-meta.js +73 -0
  72. package/dist/handle.d.ts +226 -0
  73. package/dist/handle.js +345 -0
  74. package/dist/health-scenario.d.ts +1901 -0
  75. package/dist/health-scenario.js +653 -0
  76. package/dist/i18n/catalog.js +21 -1
  77. package/dist/i18n/error-messages.d.ts +86 -0
  78. package/dist/i18n/error-messages.js +192 -0
  79. package/dist/i18n/index.d.ts +1 -0
  80. package/dist/i18n/index.js +1 -0
  81. package/dist/i18n/keys.d.ts +12 -0
  82. package/dist/i18n/keys.js +76 -5
  83. package/dist/i18n/operation-locale-namespace.d.ts +2 -0
  84. package/dist/i18n/operation-locale-namespace.js +7 -0
  85. package/dist/index.d.ts +40 -15
  86. package/dist/index.js +29 -11
  87. package/dist/lint.d.ts +43 -11
  88. package/dist/lint.js +2512 -177
  89. package/dist/native-address.d.ts +43 -0
  90. package/dist/native-address.js +281 -0
  91. package/dist/native-egress-policy.d.ts +31 -0
  92. package/dist/native-egress-policy.js +288 -0
  93. package/dist/observability.d.ts +5 -2
  94. package/dist/observability.js +48 -1
  95. package/dist/provider.d.ts +18 -8
  96. package/dist/provider.js +11 -6
  97. package/dist/runtime/auth-flow.d.ts +6 -1
  98. package/dist/runtime/auth-flow.js +8 -0
  99. package/dist/runtime/bounded-expiring-map.d.ts +21 -0
  100. package/dist/runtime/bounded-expiring-map.js +64 -0
  101. package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
  102. package/dist/runtime/browser-telemetry-binding.js +83 -0
  103. package/dist/runtime/browser-telemetry.d.ts +76 -0
  104. package/dist/runtime/browser-telemetry.js +165 -0
  105. package/dist/runtime/browser.d.ts +4 -0
  106. package/dist/runtime/browser.js +688 -83
  107. package/dist/runtime/cache-telemetry.d.ts +71 -0
  108. package/dist/runtime/cache-telemetry.js +177 -0
  109. package/dist/runtime/cache.d.ts +3 -0
  110. package/dist/runtime/cache.js +245 -23
  111. package/dist/runtime/capability-response.d.ts +3 -0
  112. package/dist/runtime/capability-response.js +56 -0
  113. package/dist/runtime/capability-telemetry.d.ts +46 -0
  114. package/dist/runtime/capability-telemetry.js +68 -0
  115. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  116. package/dist/runtime/chrome149-header-order.js +289 -0
  117. package/dist/runtime/diagnostic-env-values.d.ts +5 -0
  118. package/dist/runtime/diagnostic-env-values.js +57 -0
  119. package/dist/runtime/diagnostic-env.d.ts +14 -0
  120. package/dist/runtime/diagnostic-env.js +44 -0
  121. package/dist/runtime/diagnostic-redactor.d.ts +54 -0
  122. package/dist/runtime/diagnostic-redactor.js +571 -0
  123. package/dist/runtime/egress-lease.d.ts +65 -0
  124. package/dist/runtime/egress-lease.js +236 -0
  125. package/dist/runtime/engine-mode.d.ts +74 -0
  126. package/dist/runtime/engine-mode.js +152 -0
  127. package/dist/runtime/env.js +14 -1
  128. package/dist/runtime/executor.d.ts +3 -2
  129. package/dist/runtime/executor.js +23 -26
  130. package/dist/runtime/handle-wordlist.d.ts +43 -0
  131. package/dist/runtime/handle-wordlist.js +256 -0
  132. package/dist/runtime/handle.d.ts +71 -0
  133. package/dist/runtime/handle.js +908 -0
  134. package/dist/runtime/http-telemetry-binding.d.ts +10 -0
  135. package/dist/runtime/http-telemetry-binding.js +152 -0
  136. package/dist/runtime/http-telemetry-guard.d.ts +16 -0
  137. package/dist/runtime/http-telemetry-guard.js +202 -0
  138. package/dist/runtime/http-telemetry.d.ts +104 -0
  139. package/dist/runtime/http-telemetry.js +190 -0
  140. package/dist/runtime/http.d.ts +34 -0
  141. package/dist/runtime/http.js +680 -121
  142. package/dist/runtime/insights.js +2 -2
  143. package/dist/runtime/instrumentation.d.ts +2 -2
  144. package/dist/runtime/instrumentation.js +462 -19
  145. package/dist/runtime/native-network-errors.d.ts +33 -0
  146. package/dist/runtime/native-network-errors.js +69 -0
  147. package/dist/runtime/native-network.d.ts +105 -0
  148. package/dist/runtime/native-network.js +1433 -0
  149. package/dist/runtime/native-telemetry.d.ts +142 -0
  150. package/dist/runtime/native-telemetry.js +231 -0
  151. package/dist/runtime/ocr-telemetry.d.ts +82 -0
  152. package/dist/runtime/ocr-telemetry.js +192 -0
  153. package/dist/runtime/ocr.d.ts +29 -0
  154. package/dist/runtime/ocr.js +468 -0
  155. package/dist/runtime/otlp.d.ts +71 -2
  156. package/dist/runtime/otlp.js +398 -16
  157. package/dist/runtime/provider.d.ts +7 -0
  158. package/dist/runtime/provider.js +14 -0
  159. package/dist/runtime/proxy-errors.js +6 -2
  160. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  161. package/dist/runtime/proxy-nodemaven.js +147 -0
  162. package/dist/runtime/proxy-retry-policy.d.ts +4 -1
  163. package/dist/runtime/proxy-retry-policy.js +11 -2
  164. package/dist/runtime/proxy-telemetry.d.ts +133 -3
  165. package/dist/runtime/proxy-telemetry.js +218 -70
  166. package/dist/runtime/redirect-hop-headers.d.ts +19 -0
  167. package/dist/runtime/redirect-hop-headers.js +58 -0
  168. package/dist/runtime/redirects.d.ts +61 -0
  169. package/dist/runtime/redirects.js +149 -0
  170. package/dist/runtime/redis.d.ts +1 -1
  171. package/dist/runtime/redis.js +4 -2
  172. package/dist/runtime/request-options.d.ts +75 -1
  173. package/dist/runtime/request-options.js +588 -0
  174. package/dist/runtime/request-telemetry.d.ts +70 -0
  175. package/dist/runtime/request-telemetry.js +229 -0
  176. package/dist/runtime/resolver-config.d.ts +13 -0
  177. package/dist/runtime/resolver-config.js +14 -0
  178. package/dist/runtime/resolver-public.d.ts +3 -0
  179. package/dist/runtime/resolver-public.js +1 -0
  180. package/dist/runtime/resolver-runtime-options.d.ts +14 -0
  181. package/dist/runtime/resolver-runtime-options.js +33 -0
  182. package/dist/runtime/resolver-shared.d.ts +24 -0
  183. package/dist/runtime/resolver-shared.js +69 -0
  184. package/dist/runtime/resolver-span-attributes.d.ts +34 -0
  185. package/dist/runtime/resolver-span-attributes.js +93 -0
  186. package/dist/runtime/resolver-telemetry.d.ts +135 -0
  187. package/dist/runtime/resolver-telemetry.js +204 -0
  188. package/dist/runtime/resolver-usage.d.ts +32 -0
  189. package/dist/runtime/resolver-usage.js +54 -0
  190. package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
  191. package/dist/runtime/resolver-vendors/bindings.js +45 -0
  192. package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
  193. package/dist/runtime/resolver-vendors/browser.js +423 -0
  194. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  195. package/dist/runtime/resolver-vendors/capsolver.js +544 -0
  196. package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
  197. package/dist/runtime/resolver-vendors/hosts.js +68 -0
  198. package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
  199. package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
  200. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  201. package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
  202. package/dist/runtime/resolver-vendors/types.d.ts +125 -0
  203. package/dist/runtime/resolver-vendors/types.js +106 -0
  204. package/dist/runtime/resolver.d.ts +79 -0
  205. package/dist/runtime/resolver.js +1094 -0
  206. package/dist/runtime/state-telemetry.d.ts +79 -0
  207. package/dist/runtime/state-telemetry.js +194 -0
  208. package/dist/runtime/state.d.ts +10 -1
  209. package/dist/runtime/state.js +322 -82
  210. package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
  211. package/dist/runtime/stealth-akamai-sbsd.js +142 -0
  212. package/dist/runtime/stealth-cookies.d.ts +24 -0
  213. package/dist/runtime/stealth-cookies.js +131 -0
  214. package/dist/runtime/stealth-owned-headers.d.ts +39 -0
  215. package/dist/runtime/stealth-owned-headers.js +57 -0
  216. package/dist/runtime/stealth-telemetry.d.ts +92 -0
  217. package/dist/runtime/stealth-telemetry.js +179 -0
  218. package/dist/runtime/stealth.d.ts +45 -6
  219. package/dist/runtime/stealth.js +1775 -320
  220. package/dist/runtime/stt-telemetry.d.ts +77 -0
  221. package/dist/runtime/stt-telemetry.js +176 -0
  222. package/dist/runtime/stt.js +18 -19
  223. package/dist/runtime/timeout.d.ts +5 -0
  224. package/dist/runtime/timeout.js +12 -0
  225. package/dist/runtime/trace-config.d.ts +12 -0
  226. package/dist/runtime/trace-config.js +62 -0
  227. package/dist/runtime/trace.d.ts +17 -0
  228. package/dist/runtime/trace.js +176 -25
  229. package/dist/runtime-boundary-lint.d.ts +137 -0
  230. package/dist/runtime-boundary-lint.js +590 -0
  231. package/dist/schema.d.ts +20 -0
  232. package/dist/schema.js +72 -2
  233. package/dist/serve.d.ts +1 -1
  234. package/dist/serve.js +1 -1
  235. package/dist/server/error-observability.d.ts +1 -0
  236. package/dist/server/error-observability.js +1 -0
  237. package/dist/server/error-stack-frames.d.ts +35 -0
  238. package/dist/server/error-stack-frames.js +219 -0
  239. package/dist/server/index.d.ts +21 -2
  240. package/dist/server/index.js +11 -2
  241. package/dist/server/runtime-diagnostics.d.ts +165 -0
  242. package/dist/server/runtime-diagnostics.js +360 -0
  243. package/dist/server/sdk-version.d.ts +3 -0
  244. package/dist/server/sdk-version.js +19 -0
  245. package/dist/server/self-test-input-tokens.d.ts +2 -1
  246. package/dist/server/self-test-input-tokens.js +18 -14
  247. package/dist/server/self-test-redaction.js +8 -33
  248. package/dist/server/self-test.d.ts +18 -3
  249. package/dist/server/self-test.js +139 -76
  250. package/dist/server/sensitive-values.d.ts +26 -0
  251. package/dist/server/sensitive-values.js +137 -0
  252. package/dist/server/serve-implementation.d.ts +285 -0
  253. package/dist/server/serve-implementation.js +3172 -0
  254. package/dist/server/serve.d.ts +1 -75
  255. package/dist/server/serve.js +1 -1170
  256. package/dist/server/state-backend-report.d.ts +70 -0
  257. package/dist/server/state-backend-report.js +113 -0
  258. package/dist/server/trace-output.d.ts +7 -0
  259. package/dist/server/trace-output.js +111 -0
  260. package/dist/server/types.d.ts +37 -5
  261. package/dist/server/types.js +34 -1
  262. package/dist/stateful/errors.d.ts +19 -0
  263. package/dist/stateful/errors.js +24 -0
  264. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  265. package/dist/stateful/http-provider-event-emitter.js +237 -0
  266. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  267. package/dist/stateful/http-session-owner-registry.js +210 -0
  268. package/dist/stateful/index.d.ts +18 -0
  269. package/dist/stateful/index.js +18 -0
  270. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  271. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  272. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  273. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  274. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  275. package/dist/stateful/provider-event-pipeline.js +1 -0
  276. package/dist/stateful/provider-events.d.ts +101 -0
  277. package/dist/stateful/provider-events.js +289 -0
  278. package/dist/stateful/session-key.d.ts +15 -0
  279. package/dist/stateful/session-key.js +86 -0
  280. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  281. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  282. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  283. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  284. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  285. package/dist/stateful/stateful-provider-adapter.js +287 -0
  286. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  287. package/dist/stateful/stateful-provider-observability.js +161 -0
  288. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  289. package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
  290. package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
  291. package/dist/stateful/stateful-provider-runtime-context.js +61 -0
  292. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  293. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  294. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  295. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  296. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  297. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  298. package/dist/stateful-signing.d.ts +18 -0
  299. package/dist/stateful-signing.js +27 -0
  300. package/dist/stealth/profiles.d.ts +15 -4
  301. package/dist/stealth/profiles.js +169 -211
  302. package/dist/stream-evidence.d.ts +74 -0
  303. package/dist/stream-evidence.js +785 -0
  304. package/dist/stream.js +7 -1
  305. package/dist/testing/index.d.ts +2 -1
  306. package/dist/testing/index.js +2 -1
  307. package/dist/testing/run.d.ts +32 -2
  308. package/dist/testing/run.js +509 -25
  309. package/dist/trace-sanitization.d.ts +6 -0
  310. package/dist/trace-sanitization.js +68 -0
  311. package/dist/types.d.ts +899 -210
  312. package/dist/types.js +1 -0
  313. package/dist/typescript-module.d.ts +39 -0
  314. package/dist/typescript-module.js +72 -0
  315. package/package.json +52 -6
  316. package/src/auth-turn/index.ts +1 -1
  317. package/src/auth.ts +118 -0
  318. package/src/ceremonies/index.ts +189 -46
  319. package/src/cli/commands.ts +37 -0
  320. package/src/cli/create.ts +8 -2
  321. package/src/cli/deployment-intent.ts +364 -0
  322. package/src/cli/local-connection.ts +221 -0
  323. package/src/cli/migrate-deployment-intent.ts +1908 -0
  324. package/src/cli/migrate-operation-declaration.ts +3026 -0
  325. package/src/cli/migrate-operation-shape.ts +184 -0
  326. package/src/cli/migrate-provider-shape.ts +778 -0
  327. package/src/cli/resolver-runtime.ts +72 -0
  328. package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  329. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  330. package/src/cli/templates/provider/README.md.tpl +41 -19
  331. package/src/cli/templates/provider/index.ts.tpl +6 -3
  332. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  333. package/src/cli/templates/provider/provider.json.tpl +6 -0
  334. package/src/config/loader.ts +774 -181
  335. package/src/contract-serialization.ts +5 -7
  336. package/src/contract-types.ts +12 -5
  337. package/src/contract.ts +24 -10
  338. package/src/declaration-validation.ts +376 -0
  339. package/src/define.ts +1105 -131
  340. package/src/dev.ts +13 -1
  341. package/src/engine.ts +390 -0
  342. package/src/error-observability.ts +64 -0
  343. package/src/error-resolution.ts +269 -0
  344. package/src/errors.ts +157 -0
  345. package/src/fixture-sanitization.ts +422 -0
  346. package/src/handle-meta.ts +143 -0
  347. package/src/handle.ts +694 -0
  348. package/src/health-scenario.ts +960 -0
  349. package/src/i18n/catalog.ts +23 -1
  350. package/src/i18n/error-messages.ts +255 -0
  351. package/src/i18n/index.ts +1 -0
  352. package/src/i18n/keys.ts +80 -6
  353. package/src/i18n/operation-locale-namespace.ts +10 -0
  354. package/src/index.ts +390 -23
  355. package/src/lint.ts +2975 -234
  356. package/src/native-address.ts +340 -0
  357. package/src/native-egress-policy.ts +358 -0
  358. package/src/observability.ts +51 -1
  359. package/src/provider.ts +207 -27
  360. package/src/runtime/auth-flow.ts +15 -0
  361. package/src/runtime/bounded-expiring-map.ts +67 -0
  362. package/src/runtime/browser-telemetry-binding.ts +92 -0
  363. package/src/runtime/browser-telemetry.ts +289 -0
  364. package/src/runtime/browser.ts +882 -99
  365. package/src/runtime/cache-telemetry.ts +247 -0
  366. package/src/runtime/cache.ts +258 -22
  367. package/src/runtime/capability-response.ts +53 -0
  368. package/src/runtime/capability-telemetry.ts +101 -0
  369. package/src/runtime/chrome149-header-order.ts +330 -0
  370. package/src/runtime/diagnostic-env-values.ts +56 -0
  371. package/src/runtime/diagnostic-env.ts +65 -0
  372. package/src/runtime/diagnostic-redactor.ts +668 -0
  373. package/src/runtime/egress-lease.ts +341 -0
  374. package/src/runtime/engine-mode.ts +233 -0
  375. package/src/runtime/env.ts +15 -1
  376. package/src/runtime/executor.ts +39 -32
  377. package/src/runtime/handle-wordlist.ts +266 -0
  378. package/src/runtime/handle.ts +1180 -0
  379. package/src/runtime/http-telemetry-binding.ts +162 -0
  380. package/src/runtime/http-telemetry-guard.ts +208 -0
  381. package/src/runtime/http-telemetry.ts +292 -0
  382. package/src/runtime/http.ts +896 -150
  383. package/src/runtime/insights.ts +2 -2
  384. package/src/runtime/instrumentation.ts +628 -28
  385. package/src/runtime/native-network-errors.ts +99 -0
  386. package/src/runtime/native-network.ts +1853 -0
  387. package/src/runtime/native-telemetry.ts +366 -0
  388. package/src/runtime/ocr-telemetry.ts +308 -0
  389. package/src/runtime/ocr.ts +564 -0
  390. package/src/runtime/otlp.ts +468 -21
  391. package/src/runtime/provider.ts +15 -0
  392. package/src/runtime/proxy-errors.ts +12 -4
  393. package/src/runtime/proxy-nodemaven.ts +222 -0
  394. package/src/runtime/proxy-retry-policy.ts +12 -1
  395. package/src/runtime/proxy-telemetry.ts +358 -103
  396. package/src/runtime/redirect-hop-headers.ts +71 -0
  397. package/src/runtime/redirects.ts +215 -0
  398. package/src/runtime/redis.ts +7 -2
  399. package/src/runtime/request-options.ts +728 -1
  400. package/src/runtime/request-telemetry.ts +375 -0
  401. package/src/runtime/resolver-config.ts +18 -0
  402. package/src/runtime/resolver-public.ts +44 -0
  403. package/src/runtime/resolver-runtime-options.ts +50 -0
  404. package/src/runtime/resolver-shared.ts +113 -0
  405. package/src/runtime/resolver-span-attributes.ts +139 -0
  406. package/src/runtime/resolver-telemetry.ts +362 -0
  407. package/src/runtime/resolver-usage.ts +99 -0
  408. package/src/runtime/resolver-vendors/bindings.ts +61 -0
  409. package/src/runtime/resolver-vendors/browser.ts +591 -0
  410. package/src/runtime/resolver-vendors/capsolver.ts +727 -0
  411. package/src/runtime/resolver-vendors/hosts.ts +81 -0
  412. package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
  413. package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
  414. package/src/runtime/resolver-vendors/types.ts +261 -0
  415. package/src/runtime/resolver.ts +1543 -0
  416. package/src/runtime/state-telemetry.ts +298 -0
  417. package/src/runtime/state.ts +435 -89
  418. package/src/runtime/stealth-akamai-sbsd.ts +207 -0
  419. package/src/runtime/stealth-cookies.ts +155 -0
  420. package/src/runtime/stealth-owned-headers.ts +67 -0
  421. package/src/runtime/stealth-telemetry.ts +309 -0
  422. package/src/runtime/stealth.ts +2275 -372
  423. package/src/runtime/stt-telemetry.ts +282 -0
  424. package/src/runtime/stt.ts +96 -91
  425. package/src/runtime/timeout.ts +18 -0
  426. package/src/runtime/trace-config.ts +78 -0
  427. package/src/runtime/trace.ts +257 -35
  428. package/src/runtime-boundary-lint.ts +707 -0
  429. package/src/schema.ts +80 -2
  430. package/src/serve.ts +6 -1
  431. package/src/server/error-observability.ts +1 -0
  432. package/src/server/error-stack-frames.ts +214 -0
  433. package/src/server/index.ts +184 -2
  434. package/src/server/runtime-diagnostics.ts +522 -0
  435. package/src/server/sdk-version.ts +22 -0
  436. package/src/server/self-test-input-tokens.ts +29 -14
  437. package/src/server/self-test-redaction.ts +10 -40
  438. package/src/server/self-test.ts +205 -89
  439. package/src/server/sensitive-values.ts +211 -0
  440. package/src/server/serve-implementation.ts +4596 -0
  441. package/src/server/serve.ts +1 -1685
  442. package/src/server/state-backend-report.ts +185 -0
  443. package/src/server/trace-output.ts +189 -0
  444. package/src/server/types.ts +34 -1
  445. package/src/stateful/README.md +146 -0
  446. package/src/stateful/errors.ts +35 -0
  447. package/src/stateful/http-provider-event-emitter.ts +314 -0
  448. package/src/stateful/http-session-owner-registry.ts +306 -0
  449. package/src/stateful/index.ts +18 -0
  450. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  451. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  452. package/src/stateful/provider-event-pipeline.ts +61 -0
  453. package/src/stateful/provider-events.ts +462 -0
  454. package/src/stateful/session-key.ts +111 -0
  455. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  456. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  457. package/src/stateful/stateful-provider-adapter.ts +562 -0
  458. package/src/stateful/stateful-provider-observability.ts +261 -0
  459. package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
  460. package/src/stateful/stateful-provider-runtime-context.ts +96 -0
  461. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  462. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  463. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  464. package/src/stateful-signing.ts +46 -0
  465. package/src/stealth/profiles.ts +212 -231
  466. package/src/stream-evidence.ts +988 -0
  467. package/src/stream.ts +8 -1
  468. package/src/testing/index.ts +10 -1
  469. package/src/testing/run.ts +685 -19
  470. package/src/trace-sanitization.ts +110 -0
  471. package/src/types.ts +1014 -273
  472. package/src/typescript-module.ts +100 -0
  473. package/dist/choice-token.d.ts +0 -24
  474. package/dist/choice-token.js +0 -74
  475. package/dist/runtime/choice.d.ts +0 -15
  476. package/dist/runtime/choice.js +0 -413
  477. package/src/choice-token.ts +0 -165
  478. package/src/runtime/choice.ts +0 -686
@@ -1,7 +1,5 @@
1
1
  import { createHash, randomBytes, randomUUID } from "node:crypto";
2
2
 
3
- import Ajv2020 from "ajv/dist/2020.js";
4
-
5
3
  import { AUTH_TURN_SCHEMA, type KnownAuthTurnKind } from "../auth-turn/index.js";
6
4
  import {
7
5
  FlowExpiredError,
@@ -9,6 +7,7 @@ import {
9
7
  TurnValidationError,
10
8
  ValidationError,
11
9
  } from "../errors.js";
10
+ import type { AuthStartNoInputGuard } from "../define.js";
12
11
  import type { AuthFlowDefinition, AuthFlowInputHandler, AuthTurn, FlowContext } from "../types.js";
13
12
 
14
13
  type TurnKind = KnownAuthTurnKind;
@@ -16,16 +15,26 @@ type TurnKind = KnownAuthTurnKind;
16
15
  type CeremonyHandler = AuthFlowInputHandler;
17
16
 
18
17
  type JsonObject = Record<string, unknown>;
19
-
20
- const ajv = new Ajv2020({ allErrors: true, strict: true, strictSchema: true });
21
-
22
- // Runtime ceremony-output validation derives from the exported versioned
23
- // contract: it compiles the exact AUTH_TURN_SCHEMA document shipped at
24
- // dist/auth-turn/auth-turn.v1.schema.json, so the two cannot drift.
25
- const validateAuthTurn = ajv.compile(AUTH_TURN_SCHEMA);
18
+ type JsonSchemaNode = {
19
+ readonly additionalProperties?: boolean;
20
+ readonly minimum?: number;
21
+ readonly minLength?: number;
22
+ readonly properties?: Readonly<Record<string, JsonSchemaNode>>;
23
+ readonly required?: readonly string[];
24
+ readonly type?: "number" | "object" | "string";
25
+ };
26
26
 
27
27
  const OAUTH2_STATE_KEY = "__oauth2_state";
28
28
  const OAUTH2_PKCE_VERIFIER_KEY = "__oauth2_pkce_verifier";
29
+ export const OAUTH2_PROXIED_AUTH_PROXY_ORIGIN_ENV_KEY = "APIFUSE__AUTH_PROXY__URL";
30
+ export const OAUTH2_PROXIED_PKCE_VERIFIER_KEY = "__oauth2_proxied_pkce_verifier";
31
+ const OAUTH2_PROXIED_RESERVED_AUTHORIZE_PARAMS = new Set([
32
+ "client_id",
33
+ "response_type",
34
+ "state",
35
+ "code_challenge",
36
+ "code_challenge_method",
37
+ ]);
29
38
  const DEVICE_FLOW_KEY = "__device_flow";
30
39
  const MAGIC_LINK_KEY = "__magic_link";
31
40
  const COMBINED_STAGE_KEY = "__combined_stage";
@@ -36,6 +45,56 @@ function isRecord(value: unknown): value is JsonObject {
36
45
  return !!value && typeof value === "object" && !Array.isArray(value);
37
46
  }
38
47
 
48
+ function validateSchemaNode(
49
+ value: unknown,
50
+ schema: JsonSchemaNode,
51
+ path: string,
52
+ errors: string[],
53
+ ): void {
54
+ if (schema.type === "object") {
55
+ if (!isRecord(value)) {
56
+ errors.push(`${path} must be object`);
57
+ return;
58
+ }
59
+ const properties = schema.properties ?? {};
60
+ for (const required of schema.required ?? []) {
61
+ if (!Object.hasOwn(value, required) || value[required] === undefined) {
62
+ errors.push(`${path} must have required property '${required}'`);
63
+ }
64
+ }
65
+ if (schema.additionalProperties === false) {
66
+ for (const key of Object.keys(value)) {
67
+ if (!Object.hasOwn(properties, key)) {
68
+ errors.push(`${path} must NOT have additional property '${key}'`);
69
+ }
70
+ }
71
+ }
72
+ for (const [key, childSchema] of Object.entries(properties)) {
73
+ if (Object.hasOwn(value, key) && value[key] !== undefined) {
74
+ validateSchemaNode(value[key], childSchema, `${path}/${key}`, errors);
75
+ }
76
+ }
77
+ return;
78
+ }
79
+
80
+ if (schema.type === "string") {
81
+ if (typeof value !== "string") {
82
+ errors.push(`${path} must be string`);
83
+ } else if (schema.minLength !== undefined && value.length < schema.minLength) {
84
+ errors.push(`${path} must NOT have fewer than ${schema.minLength} characters`);
85
+ }
86
+ return;
87
+ }
88
+
89
+ if (schema.type === "number") {
90
+ if (typeof value !== "number" || !Number.isFinite(value)) {
91
+ errors.push(`${path} must be number`);
92
+ } else if (schema.minimum !== undefined && value < schema.minimum) {
93
+ errors.push(`${path} must be >= ${schema.minimum}`);
94
+ }
95
+ }
96
+ }
97
+
39
98
  function ensureRecord(value: unknown): JsonObject {
40
99
  return isRecord(value) ? value : {};
41
100
  }
@@ -153,14 +212,29 @@ function withDeclaredFormFieldOrder(expectedInput: JsonObject): JsonObject {
153
212
  }
154
213
 
155
214
  export function validateCeremonyOutput(turn: unknown): AuthTurn {
156
- if (!validateAuthTurn(turn)) {
157
- const detail = validateAuthTurn.errors
158
- ?.map((error) => `${error.instancePath || "$"} ${error.message ?? "invalid"}`)
159
- .join("; ");
160
- throw new TurnValidationError(detail || "Invalid AuthTurn output");
215
+ // Evaluate the exact exported versioned schema without eagerly initializing
216
+ // a general-purpose JSON Schema compiler in every provider process. Contract
217
+ // parity tests compare this focused evaluator with AJV over all fixtures and
218
+ // edge probes, so the runtime and shipped document remain locked together.
219
+ const errors: string[] = [];
220
+ validateSchemaNode(turn, AUTH_TURN_SCHEMA, "", errors);
221
+ if (errors.length > 0) {
222
+ throw new TurnValidationError(errors.join("; "));
161
223
  }
162
224
 
163
- return turn;
225
+ return turn as AuthTurn;
226
+ }
227
+
228
+ /**
229
+ * Defines an auth flow while preserving its concrete type for downstream checks.
230
+ * The compile-time guard validates the inferred literal; annotating or widening
231
+ * a flow to `AuthFlowDefinition` before passing it defeats the check. Full
232
+ * enforcement requires branding, which is deferred to a future major.
233
+ */
234
+ export function defineAuthFlow<const TFlow extends AuthFlowDefinition>(
235
+ flow: TFlow & AuthStartNoInputGuard<TFlow>,
236
+ ): TFlow {
237
+ return flow;
164
238
  }
165
239
 
166
240
  export function createOAuth2Ceremony(options: {
@@ -171,7 +245,7 @@ export function createOAuth2Ceremony(options: {
171
245
  scopes: string[];
172
246
  usePKCE?: boolean;
173
247
  }): AuthFlowDefinition {
174
- return {
248
+ return defineAuthFlow({
175
249
  start: (ctx) =>
176
250
  runCeremonyHandler(
177
251
  async () => {
@@ -245,7 +319,75 @@ export function createOAuth2Ceremony(options: {
245
319
  input,
246
320
  ),
247
321
  abort: async () => validateCeremonyOutput(createTurn("abort", { hint: "OAuth flow aborted." })),
248
- };
322
+ });
323
+ }
324
+
325
+ /**
326
+ * Builds the start handler for a custom-scheme OAuth provider. The shared
327
+ * auth-proxy owns state minting and callback capture, while the provider owns
328
+ * token exchange and any following authentication turns.
329
+ */
330
+ export function createOAuth2ProxiedStart(
331
+ options: import("../types.js").ProxiedOAuthConfig,
332
+ ): import("../types.js").AuthFlowStartHandler {
333
+ const pkce = options.pkce ?? "S256";
334
+
335
+ return (ctx) =>
336
+ runCeremonyHandler(
337
+ async () => {
338
+ for (const key of Object.keys(options.authorizeParams ?? {})) {
339
+ if (OAUTH2_PROXIED_RESERVED_AUTHORIZE_PARAMS.has(key.toLowerCase())) {
340
+ throw new ValidationError(
341
+ `OAuth2 proxied authorizeParams cannot override reserved parameter "${key}".`,
342
+ );
343
+ }
344
+ }
345
+ const proxyOrigin = ctx.env.get(OAUTH2_PROXIED_AUTH_PROXY_ORIGIN_ENV_KEY);
346
+ if (!proxyOrigin) {
347
+ throw new ProviderSecretError(
348
+ `Missing required platform environment: ${OAUTH2_PROXIED_AUTH_PROXY_ORIGIN_ENV_KEY}`,
349
+ );
350
+ }
351
+ const clientId = getRequiredEnv(ctx, options.clientIdEnvKey);
352
+ if (!ctx.flowId) {
353
+ throw new ValidationError("OAuth2 proxied start requires the gateway flow id.");
354
+ }
355
+
356
+ const authorizePath = new URL(options.authorizeUrl).pathname;
357
+ const url = new URL(
358
+ `/p/${encodeURIComponent(ctx.providerId)}/f/${encodeURIComponent(ctx.flowId)}${authorizePath}`,
359
+ proxyOrigin,
360
+ );
361
+ url.searchParams.set("client_id", clientId);
362
+ url.searchParams.set("response_type", "code");
363
+
364
+ if (pkce === "S256") {
365
+ const verifier = createCodeVerifier();
366
+ ctx.context.set(OAUTH2_PROXIED_PKCE_VERIFIER_KEY, verifier);
367
+ url.searchParams.set("code_challenge", createCodeChallenge(verifier));
368
+ url.searchParams.set("code_challenge_method", "S256");
369
+ }
370
+
371
+ for (const [key, value] of Object.entries(options.authorizeParams ?? {})) {
372
+ url.searchParams.set(key, value);
373
+ }
374
+
375
+ return createTurn("redirect", {
376
+ data: { url: url.toString() },
377
+ hint: "Open the provider authorization page to continue.",
378
+ expectedInput: {
379
+ type: "object",
380
+ required: ["code", "state"],
381
+ properties: {
382
+ code: { type: "string" },
383
+ state: { type: "string" },
384
+ },
385
+ },
386
+ });
387
+ },
388
+ "OAuth2 proxied start failed",
389
+ ctx,
390
+ );
249
391
  }
250
392
 
251
393
  export function createDeviceFlowCeremony(options: {
@@ -255,7 +397,7 @@ export function createDeviceFlowCeremony(options: {
255
397
  clientSecretEnvKey?: string;
256
398
  scopes: string[];
257
399
  }): AuthFlowDefinition {
258
- return {
400
+ return defineAuthFlow({
259
401
  start: (ctx) =>
260
402
  runCeremonyHandler(
261
403
  async () => {
@@ -332,7 +474,7 @@ export function createDeviceFlowCeremony(options: {
332
474
  ),
333
475
  abort: async () =>
334
476
  validateCeremonyOutput(createTurn("abort", { hint: "Device flow aborted." })),
335
- };
477
+ });
336
478
  }
337
479
 
338
480
  export function createWebAuthnCeremony(options: {
@@ -341,7 +483,7 @@ export function createWebAuthnCeremony(options: {
341
483
  verifyUrl?: string;
342
484
  timeoutMs?: number;
343
485
  }): AuthFlowDefinition {
344
- return {
486
+ return defineAuthFlow({
345
487
  start: (ctx) =>
346
488
  runCeremonyHandler(
347
489
  async () => {
@@ -400,7 +542,7 @@ export function createWebAuthnCeremony(options: {
400
542
  ),
401
543
  abort: async () =>
402
544
  validateCeremonyOutput(createTurn("abort", { hint: "WebAuthn ceremony aborted." })),
403
- };
545
+ });
404
546
  }
405
547
 
406
548
  export function createMagicLinkCeremony(options: {
@@ -410,23 +552,31 @@ export function createMagicLinkCeremony(options: {
410
552
  expiresInMs?: number;
411
553
  }): AuthFlowDefinition {
412
554
  const emailField = options.emailField ?? "email";
555
+ const buildEmailForm = () =>
556
+ buildJsonSchemaForm(
557
+ {
558
+ type: "object",
559
+ required: [emailField],
560
+ properties: {
561
+ [emailField]: { type: "string", format: "email" },
562
+ },
563
+ },
564
+ "Provide the email address to receive a magic link.",
565
+ );
413
566
 
414
- return {
415
- start: (ctx, input = {}) =>
567
+ return defineAuthFlow({
568
+ start: (ctx) =>
569
+ runCeremonyHandler(
570
+ async () => buildEmailForm(),
571
+ "Magic link start failed",
572
+ ctx,
573
+ ),
574
+ continue: (ctx, input = {}) =>
416
575
  runCeremonyHandler(
417
576
  async () => {
418
577
  const email = getString(input, emailField);
419
578
  if (!email) {
420
- return buildJsonSchemaForm(
421
- {
422
- type: "object",
423
- required: [emailField],
424
- properties: {
425
- [emailField]: { type: "string", format: "email" },
426
- },
427
- },
428
- "Provide the email address to receive a magic link.",
429
- );
579
+ return buildEmailForm();
430
580
  }
431
581
 
432
582
  await ctx.http.post(options.sendUrl, { email });
@@ -441,17 +591,10 @@ export function createMagicLinkCeremony(options: {
441
591
  timing: { suggestedPollIntervalMs: 5_000, maxWaitMs: 300_000 },
442
592
  });
443
593
  },
444
- "Magic link start failed",
594
+ "Magic link continuation failed",
445
595
  ctx,
446
596
  input,
447
597
  ),
448
- continue: async () =>
449
- validateCeremonyOutput(
450
- createTurn("poll", {
451
- hint: "Continue polling for magic link completion.",
452
- timing: { suggestedPollIntervalMs: 5_000, maxWaitMs: 300_000 },
453
- }),
454
- ),
455
598
  poll: (ctx) =>
456
599
  runCeremonyHandler(
457
600
  async () => {
@@ -487,7 +630,7 @@ export function createMagicLinkCeremony(options: {
487
630
  ),
488
631
  abort: async () =>
489
632
  validateCeremonyOutput(createTurn("abort", { hint: "Magic link flow aborted." })),
490
- };
633
+ });
491
634
  }
492
635
 
493
636
  export function createFormCeremony(options: {
@@ -495,7 +638,7 @@ export function createFormCeremony(options: {
495
638
  hint?: string;
496
639
  mapCredential?: (input: Record<string, unknown>) => JsonObject;
497
640
  }): AuthFlowDefinition {
498
- return {
641
+ return defineAuthFlow({
499
642
  start: async () =>
500
643
  validateCeremonyOutput(
501
644
  buildJsonSchemaForm(
@@ -527,7 +670,7 @@ export function createFormCeremony(options: {
527
670
  ),
528
671
  abort: async () =>
529
672
  validateCeremonyOutput(createTurn("abort", { hint: "Form ceremony aborted." })),
530
- };
673
+ });
531
674
  }
532
675
 
533
676
  export function combineCeremonies(...ceremonies: AuthFlowDefinition[]): AuthFlowDefinition {
@@ -610,7 +753,7 @@ export function createSwitchCeremony(options: {
610
753
  }): AuthFlowDefinition {
611
754
  const choiceKeys = Object.keys(options.choices);
612
755
 
613
- return {
756
+ return defineAuthFlow({
614
757
  start: async () =>
615
758
  validateCeremonyOutput(
616
759
  createTurn("multi_choice", {
@@ -682,5 +825,5 @@ export function createSwitchCeremony(options: {
682
825
  "Switch ceremony abort failed",
683
826
  ctx,
684
827
  ),
685
- };
828
+ });
686
829
  }
@@ -3,6 +3,9 @@ export type ApifuseCommandName =
3
3
  | "dev"
4
4
  | "check"
5
5
  | "sync-assets"
6
+ | "migrate-shape"
7
+ | "migrate-operation-declaration"
8
+ | "migrate-deployment"
6
9
  | "submit-check"
7
10
  | "bounty-check"
8
11
  | "record"
@@ -55,6 +58,37 @@ export const COMMAND_MANIFEST: Record<
55
58
  examples: ["apifuse sync-assets .", "apifuse sync-assets . --check"],
56
59
  modulePath: "./apifuse-sync-assets",
57
60
  },
61
+ "migrate-shape": {
62
+ name: "migrate-shape",
63
+ summary:
64
+ "Migrate a provider to the phase-separated SDK: two-phase defineProvider in index.ts and curried defineOperation across sources.",
65
+ usage: "apifuse migrate-shape [path] [--check] [--json]",
66
+ examples: ["apifuse migrate-shape .", "apifuse migrate-shape . --check"],
67
+ modulePath: "./apifuse-migrate-shape",
68
+ },
69
+ "migrate-operation-declaration": {
70
+ name: "migrate-operation-declaration",
71
+ summary:
72
+ "Migrate legacy nested operation declarations to the ADR-0009 flat shape, refusing ambiguous safety or metadata.",
73
+ usage: "apifuse migrate-operation-declaration [path] [--check] [--json]",
74
+ examples: [
75
+ "apifuse migrate-operation-declaration .",
76
+ "apifuse migrate-operation-declaration . --check --json",
77
+ ],
78
+ modulePath: "./apifuse-migrate-operation-declaration",
79
+ },
80
+ "migrate-deployment": {
81
+ name: "migrate-deployment",
82
+ summary:
83
+ "Retire a legacy deploy.ts: hoist its non-default values into the defineProvider() deployment key and delete the file.",
84
+ usage:
85
+ "apifuse migrate-deployment [path] [--check] [--json] [--drop-codeowners-lock]",
86
+ examples: [
87
+ "apifuse migrate-deployment .",
88
+ "apifuse migrate-deployment . --check --json",
89
+ ],
90
+ modulePath: "./apifuse-migrate-deployment",
91
+ },
58
92
  "submit-check": {
59
93
  name: "submit-check",
60
94
  summary:
@@ -113,6 +147,9 @@ export const COMMAND_ORDER: ApifuseCommandName[] = [
113
147
  "dev",
114
148
  "check",
115
149
  "sync-assets",
150
+ "migrate-shape",
151
+ "migrate-operation-declaration",
152
+ "migrate-deployment",
116
153
  "submit-check",
117
154
  "record",
118
155
  "test",
package/src/cli/create.ts CHANGED
@@ -26,7 +26,7 @@ export const CATEGORY_OPTIONS = [
26
26
  "other",
27
27
  ] as const;
28
28
  export const AUTH_MODE_OPTIONS = ["none", "platform-managed", "credentials", "oauth2"] as const;
29
- export const RUNTIME_OPTIONS = ["standard", "browser"] as const;
29
+ export const RUNTIME_OPTIONS = ["standard", "shared", "browser"] as const;
30
30
  export const PRESET_OPTIONS = ["standalone", "monorepo"] as const;
31
31
 
32
32
  export type CreateCategory = (typeof CATEGORY_OPTIONS)[number];
@@ -102,7 +102,7 @@ Options:
102
102
  --display-name <name>
103
103
  --category <category>
104
104
  --auth-mode <mode>
105
- --runtime <standard|browser>
105
+ --runtime <standard|shared|browser>
106
106
  --yes
107
107
  --dry-run
108
108
  --json
@@ -519,6 +519,12 @@ export async function buildProviderCreatePlan(
519
519
  sdkSpecifier,
520
520
  }),
521
521
  },
522
+ {
523
+ path: resolve(providerRoot, "provider.json"),
524
+ content: await renderTemplate("provider.json.tpl", {
525
+ PROVIDER_ID: options.name,
526
+ }),
527
+ },
522
528
  {
523
529
  path: resolve(providerRoot, "Dockerfile"),
524
530
  content: await renderTemplate("Dockerfile.tpl", {}),