@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,263 @@
1
1
  # @apifuse/provider-sdk Changelog
2
2
 
3
+ ## 2.2.0-beta.70
4
+
5
+ - Release candidate for main commit 429f8f7658812835aa4ca1465ef682c2934dfe3e.
6
+
7
+ ## 2.2.0-beta.69
8
+
9
+ - Release candidate for main commit 0f4bd33ef5bd41cb6813005e923abf4324158582.
10
+
11
+ ## 2.2.0-beta.68
12
+
13
+ - Release candidate for main commit d630a344c18b2b192edfd09ef92bc30a482b6b8d.
14
+
15
+ ## 2.2.0-beta.67
16
+
17
+ - Release candidate for main commit 9ef92b86b293253597801e29764d76beb0a3f3b7.
18
+
19
+ ## 2.2.0-beta.66
20
+
21
+ - Release candidate for main commit e7f93a6c71e3bca3a680861c0968e22dbe5d1d40.
22
+
23
+ ## 2.2.0-beta.65
24
+
25
+ - Release candidate for main commit 4731ac76145caf85a6c340ad0c446371bd24b052.
26
+
27
+ ## 2.2.0-beta.64
28
+
29
+ - Release candidate for main commit 0505a938340d08db3ea3e2302cab5f6b5dd2b4e5.
30
+
31
+ ## 2.2.0-beta.63
32
+
33
+ - Release candidate for main commit a9b85acc5af4c40ec59774b0d1e864e7ed21828e.
34
+
35
+ ## 2.2.0-beta.62
36
+
37
+ - Release candidate for main commit 98c623f799268b6d13ce59844b2b33ed78dcd0c3.
38
+
39
+ ## 2.2.0-beta.61
40
+
41
+ - Release candidate for main commit 8ba435285f6f448bb1b8d01b1d65d2e1a4b42aaa.
42
+
43
+ ## 2.2.0-beta.60
44
+
45
+ - Release candidate for main commit 5f417c6282b3a4d92bf31c8258ba913b5e53dc8b.
46
+
47
+ ## 2.2.0-beta.59
48
+
49
+ - Release candidate for main commit 55ae556fcf33e28a228c2d54ce76e7afa41e5dc7.
50
+
51
+ ## 2.2.0-beta.58
52
+
53
+ - Release candidate for main commit e137940caa8bc32ce768571a6197651e581c2270.
54
+
55
+ ## 2.2.0-beta.57
56
+
57
+ - Release candidate for main commit 4087dafdeab771eb91691884ce7315b8c399f863.
58
+
59
+ ## 2.2.0-beta.56
60
+
61
+ - Release candidate for main commit 390167b3f51488be0beba25a1ea5eb425d3bf839.
62
+
63
+ ## 2.2.0-beta.55
64
+
65
+ - Release candidate for main commit 1c495af089940a4c666e6baf58dc0dd577771a40.
66
+
67
+ ## 2.2.0-beta.54
68
+
69
+ - Release candidate for main commit 4dccd0cd9d3443cde4edebf98ffc6c11beecb9ea.
70
+
71
+ ## 2.2.0-beta.53
72
+
73
+ - Release candidate for main commit 40a916bac16bb2b2bbda7fc4a96132d10ca103bf.
74
+
75
+ ## 2.2.0-beta.52
76
+
77
+ - Release candidate for main commit 6e64ae0ad2e735b3de0c115f5ea29517efcf4ff2.
78
+
79
+ ## 2.2.0-beta.51
80
+
81
+ - Release candidate for main commit a1269b0a7161618e5fc25e532aaa45de0efd632f.
82
+
83
+ ## 2.2.0-beta.50
84
+
85
+ - Release candidate for main commit 341c2f0e55a4159cac423fec0bf4f84625191731.
86
+
87
+ ## 2.2.0-beta.49
88
+
89
+ - Release candidate for main commit 694b145f65c2c81e298c2516dde221ce19cb52da.
90
+
91
+ ## 2.2.0-beta.48
92
+
93
+ - Release candidate for main commit ba6636fa8dd53a35af3091ae6efd797f5ef3d836.
94
+
95
+ ## 2.2.0-beta.47
96
+
97
+ - Release candidate for main commit 0ff0c6c90153af3aab75978eb73040c9adaa2609.
98
+
99
+ ## 2.2.0-beta.46
100
+
101
+ - Release candidate for main commit 0340fbc51b4ad71689bb1ec61b9b818dedda4587.
102
+
103
+ ## 2.2.0-beta.45
104
+
105
+ - Release candidate for main commit 5d337d9fc1c77cd814ec7a4e1aa44ba0f8b2a5a9.
106
+
107
+ ## 2.2.0-beta.44
108
+
109
+ - Release candidate for main commit a3091c0b4931c5ae48fe01b9776e4dc213db2716.
110
+
111
+ ## 2.2.0-beta.43
112
+
113
+ - Release candidate for main commit 5b8b6048514fb500ead400495bd5e1ed8695ed6d.
114
+
115
+ ## 2.2.0-beta.42
116
+
117
+ - Release candidate for main commit efbdbb409c9400e6211b061705b634e659f298bd.
118
+
119
+ ## 2.2.0-beta.41
120
+
121
+ - Release candidate for main commit e1bde60e6a9e0424074a357afd9e8af56549080d.
122
+
123
+ ## 2.2.0-beta.40
124
+
125
+ - Release candidate for main commit 7e2f05a954c23593a77e89e463a9bcbc2cdc7695.
126
+
127
+ ## 2.2.0-beta.39
128
+
129
+ - Release candidate for main commit ecbe349c44e15c873b7c58b42e14610db029eb5f.
130
+
131
+ ## 2.2.0-beta.38
132
+
133
+ - Release candidate for main commit 448775077dbc9ab907209f1feee4e6e4e5ef4283.
134
+
135
+ ## 2.2.0-beta.37
136
+
137
+ - Release candidate for main commit aa14b268dffe1196f25c2b6b314598fe0896edec.
138
+
139
+ ## 2.2.0-beta.36
140
+
141
+ - Release candidate for main commit c6858f8b87d78b3b755adeb28982e875434be406.
142
+
143
+ ## 2.2.0-beta.35
144
+
145
+ - Release candidate for main commit 027fa0087b883a6281bc6d8bdaaf6d0be382000f.
146
+
147
+ ## 2.2.0-beta.34
148
+
149
+ - Release candidate for main commit 383a97e7d0ce995d098d5f95c9ffdcbeed13de31.
150
+
151
+ ## 2.2.0-beta.33
152
+
153
+ - Release candidate for main commit e7d854ec3e859702b22e2b37eaa2ae6bd4545c80.
154
+
155
+ ## 2.2.0-beta.32
156
+
157
+ - Release candidate for main commit 82f1c0c1de916a40c8c74b1d6470a493b134c0ed.
158
+
159
+ ## 2.2.0-beta.31
160
+
161
+ - Release candidate for main commit 94006be0852918867d254dc23d0fa8420a07be9c.
162
+
163
+ ## 2.2.0-beta.30
164
+
165
+ - Release candidate for main commit ccf3d56bfcbe9683c6e7ad45dde8e6703467f9e7.
166
+
167
+ ## 2.2.0-beta.29
168
+
169
+ - Release candidate for main commit b7243459ab12403e11d7b5b93292f09b734b0a96.
170
+
171
+ ## 2.2.0-beta.28
172
+
173
+ - Release candidate for main commit 2936f1891d4e2326502f0585081f8a58060d6dd7.
174
+
175
+ ## 2.2.0-beta.27
176
+
177
+ - Release candidate for main commit 579d9e7fd22d8414b151be2b71a43a0990456911.
178
+
179
+ ## 2.2.0-beta.26
180
+
181
+ - Release candidate for main commit 924fe13d1101e7840d799a562a7a70174355185d.
182
+
183
+ ## 2.2.0-beta.25
184
+
185
+ - Release candidate for main commit e6df658b95c0728b671fd221919ec2f85f82b0b7.
186
+
187
+ ## 2.2.0-beta.24
188
+
189
+ - Release candidate for main commit 0f21a2959dcbb9b96fe426259259d0870cfc537f.
190
+
191
+ ## 2.2.0-beta.23
192
+
193
+ - Release candidate for main commit 36b3bedc9c14913c4152c4631cc87de71062f21f.
194
+
195
+ ## 2.2.0-beta.22
196
+
197
+ - Release candidate for main commit b8bf920b5ca053d1bf43018167fd4eedff01700d.
198
+
199
+ ## Unreleased
200
+
201
+ - Server-stored provider choices now issue word-format tokens unconditionally. The runtime issuance setting and legacy issuance path were removed.
202
+ - **Breaking:** Legacy encrypted server-handle choice tokens are no longer parsed. They are rejected with the uniform choice-not-found error; server-stored choices are now word-only. Encrypted inline choice tokens remain supported.
203
+ - Added the `thrown-error-code-undeclared` authoring lint (warning level): `apifuse check` now statically flags literal `ProviderError`/`ValidationError` codes that are neither SDK-registered nor declared in any operation's `docs.errorCodes`, surfacing the runtime `unregistered_provider_error_code` signal at check time. The canonical SDK code→status mapping moved to `SDK_STATUS_MAPPED_PROVIDER_ERROR_CODES` in `error-resolution.ts`, shared by the runtime status resolver and the lint.
204
+
205
+ ## 2.2.0-beta.21
206
+
207
+ - Release candidate for main commit 00f61024fb18db39711dc5076c4621508baa49f5.
208
+
209
+ ## 2.2.0-beta.20
210
+
211
+ - Release candidate for main commit 8043d2ef0047e431aace750d8abca2e1149ec1d6.
212
+
213
+ ## 2.2.0-beta.19
214
+
215
+ - Release candidate for main commit fd93ae68d0472fae68d908312249163373ec5d22.
216
+
217
+ ## 2.2.0-beta.18
218
+
219
+ - Release candidate for main commit cebaf4b994918d2641c0fe6681fbffd3a3284c5d.
220
+
221
+ ## 2.2.0-beta.17
222
+
223
+ - Release candidate for main commit 5a0f9127a5861992d5c144b07ad379a085756544.
224
+
225
+ ## 2.2.0-beta.16
226
+
227
+ - Release candidate for main commit c5deb2bc31a4a4a236d27a2ce3d214b533ed358f.
228
+
229
+ ## 2.2.0-beta.15
230
+
231
+ - Release candidate for main commit b5ebd25e48f6502e4ddb775d4e0a25f5c8276712.
232
+
233
+ ## 2.2.0-beta.14
234
+
235
+ - Release candidate for main commit 3491acd253ca17b517985e8a618f1c2904a664a9.
236
+
237
+ ## 2.2.0-beta.13
238
+
239
+ - Release candidate for main commit 75e840d0614aea3b99a1e5cef4f93f8cdccf0507.
240
+
241
+ ## 2.2.0-beta.12
242
+
243
+ - Release candidate for main commit c66789c4745c72fc94ad3c10b3e0d7e5ed83fd25.
244
+
245
+ ## 2.2.0-beta.11
246
+
247
+ - Release candidate for main commit f6f739bd5265afe714bbace9900edc2695fcf826.
248
+
249
+ ## 2.2.0-beta.10
250
+
251
+ - Release candidate for main commit c41bd919739e0293ae8fa4d72a8a32f034cef4b8.
252
+
253
+ ## 2.2.0-beta.9
254
+
255
+ - Release candidate for main commit 5c78c8b (bundles #67 nodemaven required-secret + #68 transport vendor-advance).
256
+
257
+ ## 2.2.0-beta.8
258
+
259
+ - Release candidate for main commit 9e8a3f028ee78b9cab29d4aa3f5494ac9cffa65f.
260
+
3
261
  ## 2.2.0-beta.7
4
262
 
5
263
  - Release candidate for main commit 2ce4ea4bd36ce333eba8b3b474bf6e82b5e9216c.
@@ -58,8 +316,22 @@
58
316
 
59
317
  ## Unreleased
60
318
 
319
+ - Upstream the platform monorepo's beta.16 dist patch: OAuth2-proxied auth ceremony (`createOAuth2ProxiedStart`, `OAUTH2_PROXIED_PKCE_VERIFIER_KEY`, `APIFUSE__AUTH_PROXY__URL` origin key, proxied redirect/callback turns) and the provider runtime state upgrades it depends on (in-memory compareAndSet with quota-aware write policy, Redis CAS/set Lua scripts with entry quotas and legacy index migration). The monorepo drops `patchedDependencies` once it pins this release.
320
+ - **honest-provider-error-contract (phase 2):** `UPSTREAM_REJECTED` is a registered code family serving HTTP 409 with `retryable: false` — deterministic upstream business refusals are no longer 502s. Operation-declared `docs.errorCodes` may now use 409/410/422. Public error envelopes carry a `source` field (`client` | `upstream_rule` | `upstream_failure` | `apifuse`) derived from the observability category. Taxonomy version bumps to `2026-08-07` with the `upstream_rejected`, `dependency_unavailable`, `unsupported_transport`, and `client_cancelled` categories (409/410/422 map to `upstream_rejected`), matching the platform monorepo SoT. The `unregistered_provider_error_code` signal now carries a `signalFix` pointing at `docs.errorCodes` declaration.
321
+ - **Breaking for custom native gateway adapters:** `NativeGatewayProxySynthesisInput` now includes an injected `credentials` resolver and selected `protocol`; synthesizers may return promises and structured skip reasons, and `resolveNativeGatewayProxy` is async. Default callers retain env-backed behavior. Native transport now supports both HTTP CONNECT and SOCKS5, defaults per vendor with an explicit runtime override, registers smartproxy allocation ahead of nodemaven when declared in that order, and reports every exhausted vendor reason without exposing proxy credentials.
322
+ - Honor operation `docs.errorCodes` at runtime: declared provider-owned statuses and retryability now drive the HTTP envelope, observability header, and structured log; invalid statuses fail `defineProvider`, declared codes no longer emit the unregistered-code signal, and `TransportError` status-preservation workarounds are obsolete.
323
+ - Add an opt-in same-origin redirect hop policy to `ctx.http`, with bounded manual following and typed failures before a refused target is requested.
324
+ - Enforce provider-declared native TCP/TLS egress before proxy or socket setup, with revocable and expiring dynamic grants plus typed authorization failures; providers without a native egress declaration retain legacy behavior.
325
+ - **Breaking:** Provider error `details` is now passed through verbatim; SDK observability fields (`category`, `taxonomyVersion`, `upstreamStatus`, and derived `retryable`) are no longer merged into the public body. Emitted error envelopes now require top-level `retryable`, while inbound stateful forwarding tolerates an older owner response that omits it and defaults it to `false`. The removed observability metadata is available in the new `X-ApiFuse-Error-Observability` response header.
326
+ - Unregistered `ProviderError` codes now default to HTTP 500 instead of 400 and emit an `unregistered_provider_error_code` structured-log signal; registered mappings remain unchanged and take precedence over the HTTP 400 fallback for unregistered input `ValidationError` codes.
327
+ - Add an opt-in native connection idle read timeout with a typed error, independently from TCP/SOCKS/TLS establishment deadlines.
328
+ - Add opt-in `maxBodyBytes` enforcement to stealth fetches and redirect hops, aborting oversized decoded response streams with `response_too_large`.
329
+ - Resolve relative date tokens in fixture requests before input-schema validation, add KST capture-date `fixtures.recordedAt` metadata, and support explicit KST/UTC calendars in the shared health-input resolver.
330
+ - Add opt-in `runStandardTests(provider, { upstreamStub })` real-handler E2E coverage with strict offline transport stubs, output-schema validation, and per-operation warnings when handler E2E is not enabled.
331
+ - Export native-network and request-file TypeScript contracts from the package root and `./provider`, including typed native provider declarations and optional runtime capabilities on provider/auth contexts.
61
332
  - Add `arrayBuffer()` and `bytes()` to `HttpResponse` so `ctx.http` consumers can read binary-safe upstream bodies; internal response handling is now byte-first.
62
333
  - Preserve identity-only operation `connectionId` values in `ProviderContext` without requiring credential material.
334
+ - Accept and validate `proxy.session.drainLeadSeconds` in `defineProvider`, so providers can actually declare the native sticky-expiry drain lead time the type surface already exposed; a non-positive value, or one that meets or exceeds the sticky lifetime, is rejected at define time.
63
335
 
64
336
  ## 2.1.0-beta.15
65
337
 
@@ -115,7 +387,7 @@
115
387
 
116
388
  ## 2.1.0-beta.3
117
389
 
118
- - Replace the legacy TypeScript request transport with `ctx.stealth`, backed by `impit` browser-grade TLS/HTTP2 impersonation without Python runtime dependencies.
390
+ - Replace the legacy TypeScript request transport with `ctx.stealth`, backed by browser-grade TLS/HTTP2 impersonation without Python runtime dependencies.
119
391
  - Add the public `apifuse submit-check` / `apifuse bounty-check` CLI for score-based pre-submission provider quality checks.
120
392
  - Ship `SUBMISSION.md` in the npm package so bounty contributors can follow the checklist without access to the private monorepo.
121
393
  - Include submit-check in generated provider validation scripts and packed-artifact smoke coverage.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vooy Korea, Inc. (주식회사 부이코리아)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -40,6 +40,8 @@ Do not use internal monorepo placement for bounty workspaces. Accepted provider
40
40
  - Dev default: `3900`
41
41
  - Start/Docker/container contract: `3000`
42
42
  - `GET /health`
43
+ - `GET /readyz`
44
+ - `GET /__apifuse/diagnostics/runtime` (internal runtime diagnostics, see `AUTHORING.md`)
43
45
  - `POST /v1/{operation}`
44
46
  - `POST /auth/start`
45
47
  - `POST /auth/continue`
@@ -76,7 +78,15 @@ The operation request body is the same envelope used by the APIFuse gateway:
76
78
  | `requestId` | yes | Any unique string is fine for local debugging; it is echoed in structured errors. |
77
79
  | `input` | yes | The operation input after schema validation. |
78
80
  | `headers` | no | Extra caller headers to expose through `ctx.request.headers`. |
79
- | `connection` | no | Omit for no-auth/public operations. For credential debugging, pass an object with `id`, `mode`, `secrets`, `metadata`, and `externalRef`. Do not pass `null`. |
81
+ | `connectionId` | no | Connection identity only; it does not include credentials. The gateway sends it for `optional` connection mode, and only when the caller supplied a connection that passed authorization. Exposed as `ctx.request.connectionId`. |
82
+ | `connection` | no | Credential-bearing connection data. The gateway sends it for `required` connection mode; omit it for no-auth/public (`none` mode) operations. For local debugging, pass an object with `id`, `mode`, `secrets`, `metadata`, and `externalRef`. Do not pass `null`. |
83
+ | `tenantId` | no | Gateway-asserted principal scope: the organization id for customer subjects, the service-account id for platform service accounts. Sent for every connection mode, including `none`; absent on direct calls and self-test. Exposed as `ctx.request.tenantId` (`undefined` when absent or empty). Caller headers never populate it. |
84
+
85
+ The gateway sends only `connection` for `required` mode, only `connectionId`
86
+ for `optional` mode (and nothing when the caller passed no connection), and
87
+ neither field for `none` mode. If a malformed or manually constructed envelope
88
+ contains both, a non-empty nested `connection.id` takes precedence over the
89
+ top-level `connectionId`; an empty string is treated as absent.
80
90
 
81
91
  Credential-bearing local smoke example:
82
92
 
@@ -115,9 +125,10 @@ the bad request path; provider/runtime failures include `code`, `message`, and
115
125
  - **`invalid_request` on `/v1/{operation}`**: confirm the request body includes
116
126
  `requestId` and `input`. Omit `connection` for public/no-auth operations;
117
127
  never send `connection: null`.
118
- - **Credential-backed operations**: declare `credential.keys`, then pass matching
119
- local-only values through `connection.secrets`. Read them in handlers with
120
- `ctx.credential.get("key")` or `ctx.credential.getAccessToken()`.
128
+ - **Credential-backed operations**: declare `credential.keys`, except when
129
+ `auth.mode` is `platform-managed`; that auth declaration implies an unfiltered
130
+ credential capability. Pass local-only values through `connection.secrets` and
131
+ read them with `ctx.credential.get("key")` or `ctx.credential.getAccessToken()`.
121
132
  - **Provider env secrets**: declare `secrets[]`, set values in your shell or
122
133
  `.env`, and read only those names through `ctx.env.get("NAME")`. The SDK
123
134
  enforces presence of `required: true` declarations before handlers and auth
@@ -137,15 +148,70 @@ the bad request path; provider/runtime failures include `code`, `message`, and
137
148
  `context` object.
138
149
  - **Stealth-sensitive providers**: use `ctx.http` for normal JSON/REST calls and
139
150
  `ctx.stealth.fetch()` when you need browser-like session or cookie control.
140
- `ctx.stealth.fetch()` uses the impit-backed browser stealth transport and
141
- accepts request controls for `params`, `proxy`, `timeout`, `profile`,
142
- `redirect`, `throwOnHttpError`, and `stealth.insecureSkipVerify`. For login
151
+ `ctx.stealth.fetch()` uses the `wreq-js`-backed browser stealth transport and
152
+ accepts request controls for `params`, `sensitiveParams`, `proxy`, `timeout`,
153
+ `maxBodyBytes`, `redirect`, `redirectPolicy`, `throwOnHttpError`, and
154
+ `stealth.insecureSkipVerify`. A followed redirect drops `Authorization` when
155
+ it leaves the origin and an explicit `Cookie` when it leaves the site (the
156
+ session cookie jar takes over there); set
157
+ `redirectPolicy: { mode: "same-origin", maxHops }` to refuse a cross-origin
158
+ hop with `HttpRedirectError` before any request reaches it. For login
143
159
  flows that must inspect intermediate `Location`/`Set-Cookie` headers, create
144
160
  a session with `ctx.stealth.createSession()` and use `session.redirects.run()`;
145
161
  inspect accumulated cookies through `session.cookies`. Select an SDK stealth
146
- `profile` such as `chrome-146`; do not tune JA3, HTTP/2 SETTINGS, or
147
- pseudo-header order in provider code. Chrome/Firefox-style profiles are
148
- supported; use `ctx.browser` when Safari-specific behavior is required.
162
+ identity with structured `stealth: { browser, os }` options; omitted `os`
163
+ explicitly defaults to `macos`. The transport owns `User-Agent`,
164
+ `Accept-Encoding`, `sec-ch-ua*`, and every `Sec-Fetch-*` header and throws
165
+ `STEALTH_HEADER_OVERRIDE_UNSUPPORTED` if you set one; declare
166
+ `stealth.requestClass: "navigation" | "form-post" | "xhr" | "post"` instead
167
+ (`form-post` for an HTML form submission). The offline
168
+ `ctx.stealth` in `runStandardTests` runs the same check, so a provider test
169
+ fails wherever production would. Do not pin a
170
+ browser version
171
+ or tune JA3, HTTP/2 SETTINGS, or
172
+ pseudo-header order in provider code. Chrome, Firefox, and Safari profiles
173
+ are supported; use `ctx.browser` when the provider needs browser execution.
174
+ - **Query-parameter credentials**: when an upstream requires a credential in
175
+ its URL query, pass it through `sensitiveParams`, not `params` and never a
176
+ hand-built URL. It is sent as a normal query parameter while the SDK redacts
177
+ its value from transport errors, traces, and recorded fixtures:
178
+
179
+ ```ts
180
+ const response = await ctx.http.get("/openapi/service", {
181
+ params: { page: 1 },
182
+ sensitiveParams: { serviceKey: ctx.env.get("APIFUSE__PROVIDER__EXAMPLE__API_KEY")! },
183
+ });
184
+ ```
185
+
186
+ Use this only when the upstream offers no header or body credential channel.
187
+ Declared query-key positions and exact scalar diagnostics are always redacted.
188
+ Free-text values of four or more characters are redacted as substrings; shorter
189
+ values require token boundaries so low-entropy values do not corrupt unrelated
190
+ words or timestamps. Consequently, a sub-four-character secret embedded in a
191
+ larger alphanumeric token can remain in free text; prefer higher-entropy or
192
+ non-query credentials when possible. `sensitiveParams: {}` is equivalent to
193
+ omitting the option. Redirect results structurally redact declared keys and
194
+ common response-only credential keys from hop URLs; use
195
+ `redirects.run({ stopWhen })` to inspect a real intermediate `Location` during
196
+ the run when a login flow needs a rotated value.
197
+ - **Proxy URLs for non-stealth consumers**: use `resolveProxy()` when a
198
+ provider-owned client outside `ctx.stealth` needs the provider's proxy, such
199
+ as a CAPTCHA solver that must use matching egress. Pass the provider proxy
200
+ policy used by the provider and consume the returned `url`; the SDK owns
201
+ vendor selection, allocation, failover, and URL formats. Never call proxy
202
+ allocator APIs or hardcode proxy vendor hostnames in provider code.
203
+
204
+ ```ts
205
+ import { resolveProxy } from "@apifuse/provider-sdk"
206
+
207
+ const resolvedProxy = await resolveProxy({
208
+ proxyPolicy,
209
+ affinityKey: connectionId,
210
+ })
211
+
212
+ if (!resolvedProxy.url) throw new Error("This login requires proxy egress")
213
+ const captchaTask = { proxy: resolvedProxy.url }
214
+ ```
149
215
  - **Browser providers**: for TypeScript Providers use `runtime: "browser"` plus
150
216
  `browser.engine: "playwright-stealth"`; `nodriver` is a Python-runtime path.
151
217
  Install local browser assets with `bunx playwright install chromium` when
@@ -154,12 +220,29 @@ the bad request path; provider/runtime failures include `code`, `message`, and
154
220
 
155
221
  ## Authoring ergonomics
156
222
 
157
- `defineProvider()` infers each operation handler input from the operation `input` schema. For larger providers, factor operations with `defineOperation()` and compose them later:
223
+ `defineProvider()` establishes the capability declaration before its returned
224
+ builder contextually types operations. For larger providers, export the derived
225
+ context once and use it with `defineOperation()` in separate files:
158
226
 
159
227
  ```ts
160
- import { defineOperation, defineProvider, z } from "@apifuse/provider-sdk/provider"
228
+ import {
229
+ defineOperation,
230
+ defineProvider,
231
+ type ProviderContextOf,
232
+ z,
233
+ } from "@apifuse/provider-sdk/provider"
234
+
235
+ const buildProvider = defineProvider({
236
+ id: "factored-provider",
237
+ version: "1.0.0",
238
+ runtime: "standard",
239
+ meta: { displayName: "Factored", category: "demo" },
240
+ })
161
241
 
162
- const search = defineOperation({
242
+ export type ProviderContext = ProviderContextOf<typeof buildProvider>
243
+
244
+ const search = defineOperation<ProviderContext>()({
245
+ riskClass: "read",
163
246
  input: z.object({ q: z.string().describe("Search query") }),
164
247
  output: z.object({ count: z.number().describe("Result count") }),
165
248
  async handler(ctx, input) {
@@ -170,11 +253,7 @@ const search = defineOperation({
170
253
  },
171
254
  })
172
255
 
173
- export default defineProvider({
174
- id: "factored-provider",
175
- version: "1.0.0",
176
- runtime: "standard",
177
- meta: { displayName: "Factored", category: "demo" },
256
+ export default buildProvider({
178
257
  operations: { search },
179
258
  })
180
259
  ```
@@ -211,17 +290,17 @@ healthCheck: {
211
290
  }
212
291
  ```
213
292
 
214
- ### Operation annotations
293
+ ### Flat operation metadata
215
294
 
216
- Operations declare non-functional metadata via `annotations`:
295
+ Operations declare access, safety, and execution metadata directly on the
296
+ operation. `riskClass` is required and is the safety source of truth:
217
297
 
218
298
  | Field | Type | Notes |
219
299
  |---|---|---|
220
- | `readOnly` | `boolean` | Operation has no side effects (safe to test in production). |
221
- | `destructive` | `boolean` | Operation modifies/deletes state. |
222
- | `idempotent` | `boolean` | Safe to retry without duplicate side effects. |
223
- | `openWorld` | `boolean` | Callable without authentication. |
224
- | `rateLimit` | `{ calls, window }` | Per-operation rate hint. `window` is `"minute"\|"hour"\|"day"`. |
300
+ | `riskClass` | `"read" \| "write" \| "destructive" \| "external-send"` | Required safety classification. |
301
+ | `approval` | `"never" \| "risk-based" \| "always"` | Optional override; omit when it matches the risk-class default. |
302
+ | `connectionMode` | `"none" \| "optional" \| "required"` | Access requirement. Required by lint for credential-bearing providers. |
303
+ | `connectionExternalRefParam` | `string` | Public argument used to resolve a Connection. |
225
304
  | `timeoutMs` | `number` | Per-operation upstream timeout (1–60000 ms). Omit to inherit the gateway global default. |
226
305
 
227
306
  `defineProvider()` validates `timeoutMs` is an integer in `[1, 60000]` and throws `ValidationError` otherwise. The gateway applies the value via `context.WithTimeout` on every proxied call and clamps defensively to the same bound.
@@ -239,10 +318,14 @@ apifuse bounty-check [path]
239
318
  apifuse perf providers/korea-air-quality --operation realtime --params '{"stationName":"종로구"}'
240
319
  ```
241
320
 
242
- `apifuse record` is for real upstream-backed operations that declare
243
- `upstream.baseUrl` and call the upstream through `ctx.http` or `ctx.stealth`. The
244
- generated local-only `ping` operation intentionally has no upstream and should
245
- be replaced before recording fixtures.
321
+ `apifuse record` is for real upstream-backed operations that call the upstream
322
+ through `ctx.http` or `ctx.stealth`. Absolute request URLs need no declaration; a
323
+ relative URL resolves the way `serve` resolves it — against the operation's
324
+ `upstream.baseUrl`, else the provider's first declared one (`ctx.stealth` then
325
+ falls back to `https://<allowedHosts[0]>`). A relative `ctx.http` URL with no base
326
+ is refused with the `upstream.baseUrl` to declare. The generated local-only `ping`
327
+ operation intentionally has no upstream and should be replaced before recording
328
+ fixtures.
246
329
 
247
330
  ## Bounty submission readiness
248
331
 
@@ -267,3 +350,8 @@ External bounty contributors should submit standalone Provider source plus
267
350
  `bun run check` / `bun run test` evidence. APIFuse maintainers own monorepo
268
351
  import, registry generation, deployment projection checks, and release
269
352
  publishing.
353
+
354
+ Relayed user-generated text (listing bodies, reviews, posts) is contained by the
355
+ platform, not by the provider. Wrap such output fields in `untrustedContent(...)`
356
+ so the schema carries `x-apifuse-content-trust: untrusted` and
357
+ `x-apifuse-content-provenance: external`; do not strip instruction-like prose.
package/SUBMISSION.md CHANGED
@@ -28,7 +28,7 @@ The score is a triage aid, not a payout guarantee. Maintainers still review corr
28
28
  | Category | Points | Examples |
29
29
  |---|---:|---|
30
30
  | Definition & metadata | 15 | `defineProvider`, package, Dockerfile, SDK structural checks |
31
- | Operations & schemas | 15 | strong descriptions, annotations, input/output schemas |
31
+ | Operations & schemas | 15 | locale-keyed descriptions, explicit risk classes, input/output schemas |
32
32
  | Fixtures & tests | 15 | bidirectional fixtures that parse against schemas |
33
33
  | Health coverage | 15 | real `healthCheck` or specific `healthCheckUnsupported.reason` |
34
34
  | Runtime/local smoke | 10 | `/health` and at least one `POST /v1/{operation}` note |
@@ -46,7 +46,8 @@ Fix all blockers before submitting:
46
46
  - Missing fixture request or response.
47
47
  - Fixture data does not parse against schemas.
48
48
  - Missing `healthCheck` or `healthCheckUnsupported` on any Operation.
49
- - Credential-backed auth mode without declared credential keys.
49
+ - User-managed credential auth mode without declared credential keys
50
+ (`platform-managed` auth instead implies the credential capability and forbids keys).
50
51
  - High-confidence secret or token material in source, README, package metadata, or fixtures.
51
52
  - SDK-native source blockers: prefixed Provider ids, `vendor/` SDK shims or imports, raw `.describe()` prose instead of `describeKey`, raw global `fetch()` calls, and excessive `as Type` assertions.
52
53