@apifuse/provider-sdk 2.2.0-beta.5 → 2.2.0-beta.51

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 (368) hide show
  1. package/AUTHORING.md +537 -33
  2. package/CHANGELOG.md +205 -1
  3. package/README.md +83 -22
  4. package/SUBMISSION.md +2 -2
  5. package/bin/apifuse-check.ts +165 -11
  6. package/bin/apifuse-dev.ts +57 -13
  7. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  8. package/bin/apifuse-migrate-shape.ts +202 -0
  9. package/bin/apifuse-pack-check.ts +22 -2
  10. package/bin/apifuse-pack-smoke.ts +57 -2
  11. package/bin/apifuse-pack-types.ts +357 -38
  12. package/bin/apifuse-perf.ts +14 -13
  13. package/bin/apifuse-record.ts +709 -72
  14. package/bin/apifuse-submit-check.ts +2344 -324
  15. package/bin/apifuse-sync-assets.ts +117 -0
  16. package/bin/submit-check-delimited-text.ts +50 -0
  17. package/dist/auth-turn/index.d.ts +3 -3
  18. package/dist/auth-turn/index.js +1 -1
  19. package/dist/auth.d.ts +14 -0
  20. package/dist/auth.js +67 -0
  21. package/dist/ceremonies/index.d.ts +16 -0
  22. package/dist/ceremonies/index.js +141 -36
  23. package/dist/cli/commands.d.ts +1 -1
  24. package/dist/cli/commands.js +27 -0
  25. package/dist/cli/create.d.ts +4 -1
  26. package/dist/cli/create.js +42 -37
  27. package/dist/cli/migrate-operation-declaration.d.ts +59 -0
  28. package/dist/cli/migrate-operation-declaration.js +1249 -0
  29. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  30. package/dist/cli/migrate-operation-shape.js +113 -0
  31. package/dist/cli/migrate-provider-shape.d.ts +52 -0
  32. package/dist/cli/migrate-provider-shape.js +578 -0
  33. package/dist/cli/prompt-assets.d.ts +80 -0
  34. package/dist/cli/prompt-assets.js +743 -0
  35. package/dist/cli/templates/provider/AGENTS.md.tpl +17 -8
  36. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  37. package/dist/cli/templates/provider/README.md.tpl +5 -5
  38. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  39. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  40. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  41. package/dist/config/loader.d.ts +179 -16
  42. package/dist/config/loader.js +435 -127
  43. package/dist/contract-serialization.js +4 -8
  44. package/dist/contract-types.d.ts +12 -5
  45. package/dist/contract.js +24 -10
  46. package/dist/declaration-validation.d.ts +33 -0
  47. package/dist/declaration-validation.js +266 -0
  48. package/dist/define.d.ts +66 -29
  49. package/dist/define.js +778 -69
  50. package/dist/dev.d.ts +3 -0
  51. package/dist/dev.js +1 -1
  52. package/dist/engine.d.ts +78 -0
  53. package/dist/engine.js +133 -0
  54. package/dist/error-observability.d.ts +7 -0
  55. package/dist/error-observability.js +61 -0
  56. package/dist/error-resolution.d.ts +4 -0
  57. package/dist/error-resolution.js +122 -0
  58. package/dist/errors.d.ts +33 -0
  59. package/dist/errors.js +40 -0
  60. package/dist/fixture-sanitization.d.ts +28 -0
  61. package/dist/fixture-sanitization.js +227 -0
  62. package/dist/health-scenario.d.ts +1842 -0
  63. package/dist/health-scenario.js +624 -0
  64. package/dist/index.d.ts +21 -10
  65. package/dist/index.js +12 -7
  66. package/dist/lint.d.ts +23 -11
  67. package/dist/lint.js +572 -69
  68. package/dist/native-address.d.ts +43 -0
  69. package/dist/native-address.js +281 -0
  70. package/dist/native-egress-policy.d.ts +31 -0
  71. package/dist/native-egress-policy.js +288 -0
  72. package/dist/observability.d.ts +5 -2
  73. package/dist/observability.js +48 -1
  74. package/dist/provider.d.ts +10 -2
  75. package/dist/provider.js +4 -1
  76. package/dist/runtime/auth-flow.d.ts +5 -1
  77. package/dist/runtime/auth-flow.js +6 -0
  78. package/dist/runtime/browser.d.ts +1 -0
  79. package/dist/runtime/browser.js +492 -49
  80. package/dist/runtime/cache.d.ts +1 -0
  81. package/dist/runtime/cache.js +169 -15
  82. package/dist/runtime/choice-wordlist.d.ts +9 -0
  83. package/dist/runtime/choice-wordlist.js +138 -0
  84. package/dist/runtime/choice.d.ts +13 -1
  85. package/dist/runtime/choice.js +490 -102
  86. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  87. package/dist/runtime/chrome149-header-order.js +289 -0
  88. package/dist/runtime/env.js +12 -0
  89. package/dist/runtime/executor.d.ts +3 -2
  90. package/dist/runtime/executor.js +26 -25
  91. package/dist/runtime/http.d.ts +1 -0
  92. package/dist/runtime/http.js +515 -53
  93. package/dist/runtime/insights.js +2 -2
  94. package/dist/runtime/instrumentation.d.ts +2 -2
  95. package/dist/runtime/instrumentation.js +366 -8
  96. package/dist/runtime/native-network-errors.d.ts +33 -0
  97. package/dist/runtime/native-network-errors.js +69 -0
  98. package/dist/runtime/native-network.d.ts +96 -0
  99. package/dist/runtime/native-network.js +1232 -0
  100. package/dist/runtime/ocr.d.ts +29 -0
  101. package/dist/runtime/ocr.js +440 -0
  102. package/dist/runtime/otlp.d.ts +71 -2
  103. package/dist/runtime/otlp.js +397 -16
  104. package/dist/runtime/proxy-errors.js +6 -2
  105. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  106. package/dist/runtime/proxy-nodemaven.js +146 -0
  107. package/dist/runtime/proxy-telemetry.d.ts +80 -1
  108. package/dist/runtime/proxy-telemetry.js +154 -47
  109. package/dist/runtime/redirects.d.ts +29 -0
  110. package/dist/runtime/redirects.js +36 -0
  111. package/dist/runtime/redis.d.ts +1 -1
  112. package/dist/runtime/redis.js +4 -2
  113. package/dist/runtime/request-options.d.ts +68 -1
  114. package/dist/runtime/request-options.js +548 -0
  115. package/dist/runtime/resolver-config.d.ts +6 -0
  116. package/dist/runtime/resolver-config.js +6 -0
  117. package/dist/runtime/resolver-public.d.ts +1 -0
  118. package/dist/runtime/resolver-public.js +1 -0
  119. package/dist/runtime/resolver-shared.d.ts +14 -0
  120. package/dist/runtime/resolver-shared.js +12 -0
  121. package/dist/runtime/resolver-vendors/bindings.d.ts +48 -0
  122. package/dist/runtime/resolver-vendors/bindings.js +40 -0
  123. package/dist/runtime/resolver-vendors/browser.d.ts +22 -0
  124. package/dist/runtime/resolver-vendors/browser.js +377 -0
  125. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  126. package/dist/runtime/resolver-vendors/capsolver.js +531 -0
  127. package/dist/runtime/resolver-vendors/hosts.d.ts +2 -0
  128. package/dist/runtime/resolver-vendors/hosts.js +33 -0
  129. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  130. package/dist/runtime/resolver-vendors/twocaptcha.js +408 -0
  131. package/dist/runtime/resolver-vendors/types.d.ts +94 -0
  132. package/dist/runtime/resolver-vendors/types.js +96 -0
  133. package/dist/runtime/resolver.d.ts +72 -0
  134. package/dist/runtime/resolver.js +771 -0
  135. package/dist/runtime/secrets.d.ts +27 -0
  136. package/dist/runtime/secrets.js +51 -0
  137. package/dist/runtime/state.d.ts +3 -0
  138. package/dist/runtime/state.js +277 -71
  139. package/dist/runtime/stealth-cookies.d.ts +20 -0
  140. package/dist/runtime/stealth-cookies.js +111 -0
  141. package/dist/runtime/stealth.d.ts +41 -5
  142. package/dist/runtime/stealth.js +997 -291
  143. package/dist/runtime/stt.js +1 -12
  144. package/dist/runtime/timeout.d.ts +5 -0
  145. package/dist/runtime/timeout.js +12 -0
  146. package/dist/runtime/trace-config.d.ts +12 -0
  147. package/dist/runtime/trace-config.js +62 -0
  148. package/dist/runtime/trace.d.ts +5 -0
  149. package/dist/runtime/trace.js +43 -10
  150. package/dist/serve.d.ts +1 -1
  151. package/dist/serve.js +1 -1
  152. package/dist/server/error-observability.d.ts +1 -0
  153. package/dist/server/error-observability.js +1 -0
  154. package/dist/server/index.d.ts +5 -2
  155. package/dist/server/index.js +2 -2
  156. package/dist/server/self-test-input-tokens.d.ts +2 -1
  157. package/dist/server/self-test-input-tokens.js +18 -14
  158. package/dist/server/self-test.d.ts +14 -3
  159. package/dist/server/self-test.js +129 -58
  160. package/dist/server/serve-implementation.d.ts +230 -0
  161. package/dist/server/serve-implementation.js +2265 -0
  162. package/dist/server/serve.d.ts +1 -70
  163. package/dist/server/serve.js +1 -1131
  164. package/dist/server/trace-output.d.ts +6 -0
  165. package/dist/server/trace-output.js +79 -0
  166. package/dist/server/types.d.ts +30 -5
  167. package/dist/server/types.js +13 -1
  168. package/dist/stateful/errors.d.ts +19 -0
  169. package/dist/stateful/errors.js +24 -0
  170. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  171. package/dist/stateful/http-provider-event-emitter.js +237 -0
  172. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  173. package/dist/stateful/http-session-owner-registry.js +210 -0
  174. package/dist/stateful/index.d.ts +18 -0
  175. package/dist/stateful/index.js +18 -0
  176. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  177. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  178. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  179. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  180. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  181. package/dist/stateful/provider-event-pipeline.js +1 -0
  182. package/dist/stateful/provider-events.d.ts +101 -0
  183. package/dist/stateful/provider-events.js +289 -0
  184. package/dist/stateful/session-key.d.ts +15 -0
  185. package/dist/stateful/session-key.js +86 -0
  186. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  187. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  188. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  189. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  190. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  191. package/dist/stateful/stateful-provider-adapter.js +287 -0
  192. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  193. package/dist/stateful/stateful-provider-observability.js +161 -0
  194. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  195. package/dist/stateful/stateful-provider-owner-forwarder.js +215 -0
  196. package/dist/stateful/stateful-provider-runtime-context.d.ts +32 -0
  197. package/dist/stateful/stateful-provider-runtime-context.js +60 -0
  198. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  199. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  200. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  201. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  202. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  203. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  204. package/dist/stateful-signing.d.ts +18 -0
  205. package/dist/stateful-signing.js +27 -0
  206. package/dist/stealth/profiles.d.ts +9 -4
  207. package/dist/stealth/profiles.js +160 -211
  208. package/dist/stream-evidence.d.ts +74 -0
  209. package/dist/stream-evidence.js +785 -0
  210. package/dist/stream.js +7 -1
  211. package/dist/testing/index.d.ts +2 -1
  212. package/dist/testing/index.js +2 -1
  213. package/dist/testing/run.d.ts +32 -2
  214. package/dist/testing/run.js +489 -21
  215. package/dist/trace-sanitization.d.ts +5 -0
  216. package/dist/trace-sanitization.js +45 -0
  217. package/dist/types.d.ts +673 -131
  218. package/dist/types.js +1 -0
  219. package/package.json +45 -5
  220. package/src/auth-turn/index.ts +1 -1
  221. package/src/auth.ts +118 -0
  222. package/src/ceremonies/index.ts +189 -46
  223. package/src/cli/__tests__/fixtures/migrate-operation-declaration/approval-override.ts.txt +6 -0
  224. package/src/cli/__tests__/fixtures/migrate-operation-declaration/codemod-syntax.ts.txt +3 -0
  225. package/src/cli/__tests__/fixtures/migrate-operation-declaration/connection-precedence.ts.txt +10 -0
  226. package/src/cli/__tests__/fixtures/migrate-operation-declaration/docs-conflict.ts.txt +8 -0
  227. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-hoisted-array-spread.ts.txt +15 -0
  228. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-imported-array-spread.ts.txt +9 -0
  229. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-map.ts.txt +5 -0
  230. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-mixed-array-spread.ts.txt +24 -0
  231. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-operation.ts.txt +16 -0
  232. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-map.ts.txt +3 -0
  233. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoist-all.ts.txt +31 -0
  234. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoisted-const.ts.txt +11 -0
  235. package/src/cli/__tests__/fixtures/migrate-operation-declaration/imported-spread.ts.txt +11 -0
  236. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-map.ts.txt +11 -0
  237. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-cast-tail.ts.txt +21 -0
  238. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-ekitan.ts.txt +11 -0
  239. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-override.ts.txt +14 -0
  240. package/src/cli/__tests__/fixtures/migrate-operation-declaration/missing-english-locale.ts.txt +7 -0
  241. package/src/cli/__tests__/fixtures/migrate-operation-declaration/no-safety.ts.txt +6 -0
  242. package/src/cli/__tests__/fixtures/migrate-operation-declaration/non-literal.ts.txt +7 -0
  243. package/src/cli/__tests__/fixtures/migrate-operation-declaration/redundant-approval.ts.txt +6 -0
  244. package/src/cli/__tests__/fixtures/migrate-operation-declaration/safety-conflict.ts.txt +7 -0
  245. package/src/cli/__tests__/fixtures/migrate-operation-declaration/stream.ts.txt +7 -0
  246. package/src/cli/__tests__/fixtures/migrate-operation-declaration/tool-router-spread.ts.txt +15 -0
  247. package/src/cli/__tests__/fixtures/migrate-operation-declaration/unparseable.ts.txt +4 -0
  248. package/src/cli/__tests__/fixtures/migrate-operation-declaration/verbatim-template.ts.txt +12 -0
  249. package/src/cli/commands.ts +33 -0
  250. package/src/cli/create.ts +50 -37
  251. package/src/cli/migrate-operation-declaration.ts +1751 -0
  252. package/src/cli/migrate-operation-shape.ts +184 -0
  253. package/src/cli/migrate-provider-shape.ts +772 -0
  254. package/src/cli/prompt-assets.ts +865 -0
  255. package/src/cli/templates/provider/AGENTS.md.tpl +17 -8
  256. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  257. package/src/cli/templates/provider/README.md.tpl +5 -5
  258. package/src/cli/templates/provider/index.ts.tpl +6 -3
  259. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  260. package/src/cli/templates/provider/provider.json.tpl +6 -0
  261. package/src/config/loader.ts +690 -163
  262. package/src/contract-serialization.ts +5 -7
  263. package/src/contract-types.ts +12 -5
  264. package/src/contract.ts +24 -10
  265. package/src/declaration-validation.ts +330 -0
  266. package/src/define.ts +1048 -131
  267. package/src/dev.ts +4 -1
  268. package/src/engine.ts +279 -0
  269. package/src/error-observability.ts +64 -0
  270. package/src/error-resolution.ts +127 -0
  271. package/src/errors.ts +68 -0
  272. package/src/fixture-sanitization.ts +264 -0
  273. package/src/health-scenario.ts +875 -0
  274. package/src/index.ts +220 -13
  275. package/src/lint.ts +698 -90
  276. package/src/native-address.ts +340 -0
  277. package/src/native-egress-policy.ts +358 -0
  278. package/src/observability.ts +51 -1
  279. package/src/provider.ts +161 -3
  280. package/src/runtime/auth-flow.ts +12 -0
  281. package/src/runtime/browser.ts +661 -63
  282. package/src/runtime/cache.ts +189 -14
  283. package/src/runtime/choice-wordlist.ts +145 -0
  284. package/src/runtime/choice.ts +631 -120
  285. package/src/runtime/chrome149-header-order.ts +330 -0
  286. package/src/runtime/env.ts +13 -0
  287. package/src/runtime/executor.ts +43 -31
  288. package/src/runtime/http.ts +641 -61
  289. package/src/runtime/insights.ts +2 -2
  290. package/src/runtime/instrumentation.ts +520 -15
  291. package/src/runtime/native-network-errors.ts +99 -0
  292. package/src/runtime/native-network.ts +1605 -0
  293. package/src/runtime/ocr.ts +523 -0
  294. package/src/runtime/otlp.ts +467 -21
  295. package/src/runtime/proxy-errors.ts +12 -4
  296. package/src/runtime/proxy-nodemaven.ts +221 -0
  297. package/src/runtime/proxy-telemetry.ts +244 -75
  298. package/src/runtime/redirects.ts +66 -0
  299. package/src/runtime/redis.ts +7 -2
  300. package/src/runtime/request-options.ts +680 -1
  301. package/src/runtime/resolver-config.ts +6 -0
  302. package/src/runtime/resolver-public.ts +23 -0
  303. package/src/runtime/resolver-shared.ts +33 -0
  304. package/src/runtime/resolver-vendors/bindings.ts +56 -0
  305. package/src/runtime/resolver-vendors/browser.ts +533 -0
  306. package/src/runtime/resolver-vendors/capsolver.ts +707 -0
  307. package/src/runtime/resolver-vendors/hosts.ts +38 -0
  308. package/src/runtime/resolver-vendors/twocaptcha.ts +540 -0
  309. package/src/runtime/resolver-vendors/types.ts +212 -0
  310. package/src/runtime/resolver.ts +1157 -0
  311. package/src/runtime/secrets.ts +64 -0
  312. package/src/runtime/state.ts +394 -77
  313. package/src/runtime/stealth-cookies.ts +132 -0
  314. package/src/runtime/stealth.ts +1280 -336
  315. package/src/runtime/stt.ts +1 -19
  316. package/src/runtime/timeout.ts +18 -0
  317. package/src/runtime/trace-config.ts +78 -0
  318. package/src/runtime/trace.ts +57 -17
  319. package/src/serve.ts +6 -1
  320. package/src/server/error-observability.ts +1 -0
  321. package/src/server/index.ts +34 -2
  322. package/src/server/self-test-input-tokens.ts +29 -14
  323. package/src/server/self-test.ts +191 -68
  324. package/src/server/serve-implementation.ts +3378 -0
  325. package/src/server/serve.ts +1 -1632
  326. package/src/server/trace-output.ts +129 -0
  327. package/src/server/types.ts +13 -1
  328. package/src/stateful/README.md +146 -0
  329. package/src/stateful/errors.ts +35 -0
  330. package/src/stateful/http-provider-event-emitter.ts +314 -0
  331. package/src/stateful/http-session-owner-registry.ts +306 -0
  332. package/src/stateful/index.ts +18 -0
  333. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  334. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  335. package/src/stateful/provider-event-pipeline.ts +61 -0
  336. package/src/stateful/provider-events.ts +462 -0
  337. package/src/stateful/session-key.ts +111 -0
  338. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  339. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  340. package/src/stateful/stateful-provider-adapter.ts +562 -0
  341. package/src/stateful/stateful-provider-observability.ts +261 -0
  342. package/src/stateful/stateful-provider-owner-forwarder.ts +287 -0
  343. package/src/stateful/stateful-provider-runtime-context.ts +92 -0
  344. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  345. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  346. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  347. package/src/stateful-signing.ts +46 -0
  348. package/src/stealth/profiles.ts +202 -231
  349. package/src/stream-evidence.ts +988 -0
  350. package/src/stream.ts +8 -1
  351. package/src/testing/index.ts +10 -1
  352. package/src/testing/run.ts +658 -15
  353. package/src/trace-sanitization.ts +63 -0
  354. package/src/types.ts +788 -174
  355. package/dist/cli/templates/provider/CLAUDE.md.tpl +0 -1
  356. package/src/cli/templates/provider/CLAUDE.md.tpl +0 -1
  357. /package/dist/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  358. /package/dist/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  359. /package/dist/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  360. /package/dist/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  361. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  362. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
  363. /package/src/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  364. /package/src/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  365. /package/src/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  366. /package/src/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  367. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  368. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
@@ -14,6 +14,7 @@ import type {
14
14
  VerificationCodeCandidateSource,
15
15
  VerificationCodeExtractionResult,
16
16
  } from "../types.js";
17
+ import { createTimeoutController, isTimeoutLikeError } from "./timeout.js";
17
18
 
18
19
  export const APIFUSE__STT__BACKEND_ENV = "APIFUSE__STT__BACKEND";
19
20
  export const APIFUSE__STT__MODEL_ENV = "APIFUSE__STT__MODEL";
@@ -169,15 +170,6 @@ function normalizeCloudflareLanguage(language: Bcp47Locale | undefined): string
169
170
  return language?.split("-")[0]?.toLowerCase();
170
171
  }
171
172
 
172
- function isTimeoutLikeError(error: unknown): error is Error {
173
- return (
174
- error instanceof Error &&
175
- (error.name === "AbortError" ||
176
- error.name === "TimeoutError" ||
177
- /\b(timed out|timeout|deadline exceeded)\b/i.test(error.message))
178
- );
179
- }
180
-
181
173
  function toSttTransportError(error: unknown): TransportError {
182
174
  if (error instanceof TransportError) return error;
183
175
  if (isTimeoutLikeError(error)) {
@@ -194,16 +186,6 @@ function toSttTransportError(error: unknown): TransportError {
194
186
  });
195
187
  }
196
188
 
197
- function createTimeoutController(signalTimeoutMs: number): {
198
- controller: AbortController;
199
- clear: () => void;
200
- } {
201
- const controller = new AbortController();
202
- const timeout = setTimeout(() => controller.abort(), signalTimeoutMs);
203
- timeout.unref?.();
204
- return { controller, clear: () => clearTimeout(timeout) };
205
- }
206
-
207
189
  function toCloudflareInput(request: SttTranscribeRequest): Record<string, unknown> {
208
190
  const prompt = resolveSttPrompt(request);
209
191
  const input: Record<string, unknown> = {
@@ -0,0 +1,18 @@
1
+ export function isTimeoutLikeError(error: unknown): error is Error {
2
+ return (
3
+ error instanceof Error &&
4
+ (error.name === "AbortError" ||
5
+ error.name === "TimeoutError" ||
6
+ /\b(timed out|timeout|deadline exceeded)\b/i.test(error.message))
7
+ );
8
+ }
9
+
10
+ export function createTimeoutController(signalTimeoutMs: number): {
11
+ controller: AbortController;
12
+ clear: () => void;
13
+ } {
14
+ const controller = new AbortController();
15
+ const timeout = setTimeout(() => controller.abort(), signalTimeoutMs);
16
+ timeout.unref?.();
17
+ return { controller, clear: () => clearTimeout(timeout) };
18
+ }
@@ -0,0 +1,78 @@
1
+ import type { TraceConfig } from "../types.js";
2
+
3
+ /** SDK-owned environment variable names for server trace output. */
4
+ export const APIFUSE__TRACE__ENABLED = "APIFUSE__TRACE__ENABLED";
5
+ export const APIFUSE__TRACE__EXPORTER = "APIFUSE__TRACE__EXPORTER";
6
+
7
+ type EnvLike = Record<string, string | undefined>;
8
+
9
+ const TRACE_EXPORTER_LOOKUP: Record<NonNullable<TraceConfig["exporter"]>, true> = {
10
+ console: true,
11
+ json: true,
12
+ otlp: true,
13
+ none: true,
14
+ };
15
+ const TRACE_EXPORTERS = new Set(Object.keys(TRACE_EXPORTER_LOOKUP));
16
+
17
+ const emittedWarnings = new Set<string>();
18
+
19
+ function warnOnce(key: string, message: string): void {
20
+ if (emittedWarnings.has(key)) return;
21
+ emittedWarnings.add(key);
22
+ console.warn(message);
23
+ }
24
+
25
+ function parseEnabled(raw: string | undefined): boolean | undefined {
26
+ if (raw === undefined) return undefined;
27
+ switch (raw.trim().toLowerCase()) {
28
+ case "1":
29
+ case "true":
30
+ case "yes":
31
+ case "on":
32
+ return true;
33
+ case "0":
34
+ case "false":
35
+ case "no":
36
+ case "off":
37
+ return false;
38
+ default:
39
+ warnOnce(
40
+ APIFUSE__TRACE__ENABLED,
41
+ "[apifuse] Invalid APIFUSE__TRACE__ENABLED; falling back to disabled tracing.",
42
+ );
43
+ return false;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Resolve server trace output configuration from SDK-owned environment
49
+ * variables. Invalid exporter values fail closed so a provider cannot crash at
50
+ * startup because of an observability setting.
51
+ */
52
+ export function resolveTraceConfigFromEnv(env: EnvLike = process.env): TraceConfig | undefined {
53
+ const enabledRaw = env[APIFUSE__TRACE__ENABLED];
54
+ const exporterRaw = env[APIFUSE__TRACE__EXPORTER];
55
+
56
+ if (enabledRaw === undefined && exporterRaw === undefined) {
57
+ return undefined;
58
+ }
59
+
60
+ const enabled = parseEnabled(enabledRaw);
61
+ const normalizedExporter = exporterRaw?.trim().toLowerCase();
62
+ const exporter = TRACE_EXPORTERS.has(normalizedExporter as NonNullable<TraceConfig["exporter"]>)
63
+ ? (normalizedExporter as NonNullable<TraceConfig["exporter"]>)
64
+ : exporterRaw === undefined
65
+ ? undefined
66
+ : "none";
67
+ if (exporterRaw !== undefined && exporter === "none" && normalizedExporter !== "none") {
68
+ warnOnce(
69
+ APIFUSE__TRACE__EXPORTER,
70
+ `[apifuse] Invalid APIFUSE__TRACE__EXPORTER value "${normalizedExporter ?? exporterRaw}"; supported exporters are "console", "json", "otlp", and "none"; falling back to exporter "none".`,
71
+ );
72
+ }
73
+
74
+ return {
75
+ ...(enabled !== undefined ? { enabled } : {}),
76
+ ...(exporter !== undefined ? { exporter } : {}),
77
+ };
78
+ }
@@ -21,6 +21,11 @@ export interface CreateTraceContextOptions {
21
21
  onSpan?: (span: Span) => void;
22
22
  exportOptions?: OTLPExportOptions;
23
23
  resourceAttributes?: Record<string, string>;
24
+ /**
25
+ * Applied to a detached copy of each span immediately before OTLP export; never touches
26
+ * getSpans() or onSpan. Returning nothing (or throwing) drops that export batch.
27
+ */
28
+ sanitizeSpanForExport?: (span: Span) => Span | undefined;
24
29
  }
25
30
 
26
31
  type SpanHookOptions<T> = {
@@ -41,6 +46,8 @@ type PendingSpan = {
41
46
  type CompletedSpanEntry = {
42
47
  sequence: number;
43
48
  span: Span;
49
+ /** Set once the span has been handed to the exporter so no batch re-sends it. */
50
+ exported: boolean;
44
51
  };
45
52
 
46
53
  export interface TraceRecorder {
@@ -51,8 +58,6 @@ export const TRACE_RECORDER = Symbol.for("@apifuse/provider-sdk/runtime/trace-re
51
58
 
52
59
  type InternalTraceContext = TraceContext & {
53
60
  [TRACE_RECORDER]: TraceRecorder;
54
- _exportOptions?: OTLPExportOptions;
55
- _resourceAttributes?: Record<string, string>;
56
61
  };
57
62
 
58
63
  function buildOTLPExportOptions(config?: TraceConfig): OTLPExportOptions | undefined {
@@ -124,6 +129,20 @@ function insertCompletedSpan(
124
129
  }
125
130
  }
126
131
 
132
+ /** Hands the hook a copy whose attributes are detached from the recorded span; a hook that returns nothing fails closed. */
133
+ function prepareSpanForExport(
134
+ span: Span,
135
+ sanitize: CreateTraceContextOptions["sanitizeSpanForExport"],
136
+ ): Span {
137
+ const copy: Span = { ...span, attributes: { ...span.attributes } };
138
+ if (!sanitize) return copy;
139
+ const sanitized = sanitize(copy);
140
+ if (!sanitized || typeof sanitized !== "object") {
141
+ throw new Error("sanitizeSpanForExport returned no span");
142
+ }
143
+ return sanitized;
144
+ }
145
+
127
146
  export function getTraceRecorder(trace: BaseTraceContext): TraceRecorder | null {
128
147
  return (trace as Partial<InternalTraceContext>)[TRACE_RECORDER] ?? null;
129
148
  }
@@ -133,20 +152,41 @@ export function createTraceContext(options: CreateTraceContextOptions = {}): Tra
133
152
  const completed: CompletedSpanEntry[] = [];
134
153
  const activeSpanStorage = new AsyncLocalStorage<PendingSpan | undefined>();
135
154
  let sequence = 0;
136
- let traceContext!: InternalTraceContext;
137
-
155
+ // Export configuration (which can carry collector credentials) stays in this closure;
156
+ // the context object handed to provider code never exposes it.
157
+ const exportOptions = options.exportOptions;
158
+ const exportResourceAttributes = options.resourceAttributes
159
+ ? { ...options.resourceAttributes }
160
+ : undefined;
161
+ // One trace id per context so every export batch of this request shares it and
162
+ // two processes can never mint the same id.
163
+ const exportTraceId = crypto.randomUUID().replace(/-/g, "");
164
+ let exportScheduled = false;
165
+
166
+ // One pending batch per context: roots completing before the flush share it, and a span is
167
+ // handed to the exporter exactly once, so later roots never re-send earlier spans.
138
168
  const scheduleExport = () => {
139
- if (!traceContext._exportOptions) {
169
+ if (!exportOptions || exportScheduled) {
140
170
  return;
141
171
  }
172
+ exportScheduled = true;
142
173
 
143
- const spans = completed.map((entry) => ({ ...entry.span }));
144
174
  setImmediate(() => {
145
- void exportSpansOTLP(
146
- spans,
147
- traceContext._exportOptions as OTLPExportOptions,
148
- traceContext._resourceAttributes,
149
- );
175
+ exportScheduled = false;
176
+ const pending = completed.filter((entry) => !entry.exported);
177
+ for (const entry of pending) entry.exported = true;
178
+ if (pending.length === 0) return;
179
+ // Sanitization runs off the request path; a faulty sanitizer drops the batch, never the request.
180
+ let spans: Span[];
181
+ try {
182
+ spans = pending.map((entry) =>
183
+ prepareSpanForExport(entry.span, options.sanitizeSpanForExport),
184
+ );
185
+ } catch {
186
+ console.warn("[apifuse] OTLP export skipped; span sanitization failed.");
187
+ return;
188
+ }
189
+ void exportSpansOTLP(spans, exportOptions, exportResourceAttributes, exportTraceId);
150
190
  });
151
191
  };
152
192
 
@@ -189,7 +229,11 @@ export function createTraceContext(options: CreateTraceContextOptions = {}): Tra
189
229
  ...(pendingSpan.parentId ? { parentId: pendingSpan.parentId } : {}),
190
230
  };
191
231
 
192
- insertCompletedSpan(completed, { sequence: pendingSpan.sequence, span }, maxSpans);
232
+ insertCompletedSpan(
233
+ completed,
234
+ { sequence: pendingSpan.sequence, span, exported: false },
235
+ maxSpans,
236
+ );
193
237
  options.onSpan?.(span);
194
238
 
195
239
  if (!pendingSpan.parentId) {
@@ -213,17 +257,13 @@ export function createTraceContext(options: CreateTraceContextOptions = {}): Tra
213
257
  },
214
258
  };
215
259
 
216
- traceContext = {
260
+ const traceContext: InternalTraceContext = {
217
261
  span(name, fn) {
218
262
  return recorder.runSpan(name, fn);
219
263
  },
220
264
  getSpans() {
221
265
  return completed.map((entry) => ({ ...entry.span }));
222
266
  },
223
- ...(options.exportOptions ? { _exportOptions: options.exportOptions } : {}),
224
- ...(options.resourceAttributes
225
- ? { _resourceAttributes: { ...options.resourceAttributes } }
226
- : {}),
227
267
  [TRACE_RECORDER]: recorder,
228
268
  };
229
269
 
package/src/serve.ts CHANGED
@@ -1 +1,6 @@
1
- export { createServerApp, type ServeOptions, serve } from "./server/serve.js";
1
+ export {
2
+ createServerApp,
3
+ createServerAppAsync,
4
+ type ServeOptions,
5
+ serve,
6
+ } from "./server/serve.js";
@@ -0,0 +1 @@
1
+ export { safeProviderErrorObservability } from "../error-observability.js";
@@ -1,4 +1,33 @@
1
- export { createServerApp, type ServeOptions, serve } from "./serve.js";
1
+ export type {
2
+ ProxyCacheStatus,
3
+ ProxyProtocol,
4
+ ProxyUserAgentSource,
5
+ ProxyVendorName,
6
+ SmartproxyAllocatorBodyClass,
7
+ } from "../config/loader.js";
8
+ export type {
9
+ ProxyTelemetryLogPayload,
10
+ ProxyTelemetryResolvedPayload,
11
+ ProxyTelemetryUnresolvedPayload,
12
+ } from "../runtime/proxy-telemetry.js";
13
+ export {
14
+ createServerApp,
15
+ createServerAppAsync,
16
+ ERROR_OBSERVABILITY_HEADER,
17
+ type ErrorObservabilityDetails,
18
+ type ProviderServerCloseOptions,
19
+ type ProviderServerHandle,
20
+ type ProviderErrorCauseFrame,
21
+ type ProviderServerLogEvent,
22
+ type ProviderServerLogger,
23
+ type ProviderServerOperationExecutor,
24
+ type ProviderServerOperationExecutorInput,
25
+ type ProviderServerOptions,
26
+ type ProviderServerStatefulForwardEnvelope,
27
+ type ServeOptions,
28
+ serve,
29
+ } from "./serve.js";
30
+ export type { ProviderErrorObservability } from "../errors.js";
2
31
  export {
3
32
  computeSelfTestPlanDigest,
4
33
  createSelfTestApp,
@@ -23,7 +52,10 @@ export {
23
52
  SelfTestRequestSchema,
24
53
  type SelfTestResponse,
25
54
  } from "./self-test.js";
26
- export { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens.js";
55
+ export {
56
+ type InputDateTokenCalendar,
57
+ resolveHealthCheckInputDateTokens,
58
+ } from "./self-test-input-tokens.js";
27
59
  export {
28
60
  collectSelfTestSensitiveValues,
29
61
  redactSelfTestText,
@@ -1,46 +1,61 @@
1
1
  /**
2
- * Relative-KST date token resolution for health-check case inputs, ported from
3
- * the monorepo health-monitor (`apps/health-monitor/src/lib/health-check-input.ts`)
4
- * so provider self-tests resolve durable probe inputs identically.
2
+ * Relative date-token resolution for health-check case inputs and fixture
3
+ * requests. The calendar defaults to KST; callers that need UTC must opt in
4
+ * explicitly so UTC and KST do not silently disagree from 15:00–23:59 UTC.
5
5
  *
6
- * Supported token: `+<days>d` or `+<days>d:YYYYMMDD` (1..365 days ahead, KST).
6
+ * Supported token: `+<days>d` or `+<days>d:YYYYMMDD` (1..365 days ahead).
7
7
  */
8
- const RELATIVE_KST_DATE_TOKEN = /^\+(\d{1,3})d(?::(YYYYMMDD))?$/i;
8
+ const RELATIVE_DATE_TOKEN = /^\+(\d{1,3})d(?::(YYYYMMDD))?$/i;
9
9
 
10
- function dateFromKstDaysAhead(
10
+ export type InputDateTokenCalendar = "KST" | "UTC";
11
+
12
+ function dateFromDaysAhead(
11
13
  daysAhead: number,
12
14
  now = new Date(),
13
15
  format: "YYYY-MM-DD" | "YYYYMMDD" = "YYYY-MM-DD",
16
+ calendar: InputDateTokenCalendar = "KST",
14
17
  ): string {
15
- const kstNow = new Date(now.getTime() + 9 * 60 * 60 * 1000);
18
+ const calendarNow = new Date(now.getTime() + (calendar === "KST" ? 9 * 60 * 60 * 1000 : 0));
16
19
  const date = new Date(
17
- Date.UTC(kstNow.getUTCFullYear(), kstNow.getUTCMonth(), kstNow.getUTCDate() + daysAhead),
20
+ Date.UTC(
21
+ calendarNow.getUTCFullYear(),
22
+ calendarNow.getUTCMonth(),
23
+ calendarNow.getUTCDate() + daysAhead,
24
+ ),
18
25
  );
19
26
  const isoDate = date.toISOString().slice(0, 10);
20
27
  return format === "YYYYMMDD" ? isoDate.replace(/-/g, "") : isoDate;
21
28
  }
22
29
 
23
- export function resolveHealthCheckInputDateTokens(value: unknown, now = new Date()): unknown {
30
+ export function resolveHealthCheckInputDateTokens(
31
+ value: unknown,
32
+ now = new Date(),
33
+ calendar: InputDateTokenCalendar = "KST",
34
+ ): unknown {
24
35
  if (typeof value === "string") {
25
- const relative = value.match(RELATIVE_KST_DATE_TOKEN);
36
+ const relative = value.match(RELATIVE_DATE_TOKEN);
26
37
  if (!relative) return value;
27
38
  const daysAhead = Number(relative[1]);
28
39
  if (!Number.isInteger(daysAhead) || daysAhead < 1 || daysAhead > 365) {
29
40
  return value;
30
41
  }
31
42
  const format = relative[2]?.toUpperCase() === "YYYYMMDD" ? "YYYYMMDD" : "YYYY-MM-DD";
32
- return dateFromKstDaysAhead(daysAhead, now, format);
43
+ return dateFromDaysAhead(daysAhead, now, format, calendar);
33
44
  }
34
45
  if (Array.isArray(value)) {
35
- return value.map((entry) => resolveHealthCheckInputDateTokens(entry, now));
46
+ const resolved = value.map((entry) => resolveHealthCheckInputDateTokens(entry, now, calendar));
47
+ return resolved.some((entry, index) => entry !== value[index]) ? resolved : value;
36
48
  }
37
49
  if (value && typeof value === "object") {
38
- return Object.fromEntries(
50
+ const resolved = Object.fromEntries(
39
51
  Object.entries(value).map(([key, entry]) => [
40
52
  key,
41
- resolveHealthCheckInputDateTokens(entry, now),
53
+ resolveHealthCheckInputDateTokens(entry, now, calendar),
42
54
  ]),
43
55
  );
56
+ return Object.entries(resolved).some(([key, entry]) => entry !== Reflect.get(value, key))
57
+ ? resolved
58
+ : value;
44
59
  }
45
60
  return value;
46
61
  }