@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/dist/schema.js CHANGED
@@ -41,6 +41,8 @@ export function safeParseSchemaSync(schema, value, fieldPath) {
41
41
  export const APIFUSE_SENSITIVE_META_KEY = "x-apifuse-sensitive";
42
42
  export const APIFUSE_SENSITIVE_KIND_META_KEY = "x-apifuse-sensitive-kind";
43
43
  export const APIFUSE_DESCRIPTION_KEY_META_KEY = "x-apifuse-description-key";
44
+ export const APIFUSE_CONTENT_TRUST_META_KEY = "x-apifuse-content-trust";
45
+ export const APIFUSE_CONTENT_PROVENANCE_META_KEY = "x-apifuse-content-provenance";
44
46
  export const APIFUSE_REDACTION_MARKER = "<redacted>";
45
47
  export function describeKey(schema, key) {
46
48
  const descriptionKey = providerLocaleKey(key);
@@ -50,6 +52,20 @@ export function describeKey(schema, key) {
50
52
  [APIFUSE_DESCRIPTION_KEY_META_KEY]: descriptionKey,
51
53
  });
52
54
  }
55
+ /**
56
+ * Mark an output field as externally authored text (listing bodies, reviews,
57
+ * posts) that the provider relays verbatim. Sets both content-trust JSON Schema
58
+ * meta keys on the field node so the platform can enforce the boundary when it
59
+ * assembles tool output; validation and the parsed value are unchanged.
60
+ */
61
+ export function untrustedContent(schema) {
62
+ const metadata = schema.meta() ?? {};
63
+ return schema.meta({
64
+ ...metadata,
65
+ [APIFUSE_CONTENT_TRUST_META_KEY]: "untrusted",
66
+ [APIFUSE_CONTENT_PROVENANCE_META_KEY]: "external",
67
+ });
68
+ }
53
69
  const describeKeyMethod = function (key) {
54
70
  return describeKey(this, key);
55
71
  };
@@ -97,15 +113,41 @@ export function field(schema, options = {}) {
97
113
  ? schema.describe(options.description)
98
114
  : schema;
99
115
  const metadata = described.meta() ?? {};
116
+ const isSensitive = options.sensitive ?? true;
117
+ // A public declaration only rewrites the meta of the node it receives;
118
+ // z.toJSONSchema folds that over the inner leaf, so `false` on a wrapper
119
+ // around a sensitive() leaf would publish `false` next to the leaf's kind
120
+ // while collectSensitivePaths() still redacts. Refuse the contradiction.
121
+ if (!isSensitive && wrapsSensitiveDeclaration(described)) {
122
+ throw new TypeError("publicField()/field({ sensitive: false }) wraps a sensitive() declaration; apply it to the leaf, before .optional(), .nullable(), .default(), .pipe(), z.lazy() or similar wrappers.");
123
+ }
124
+ // Zod merges meta with the parent chain, so an inherited kind can only be
125
+ // cleared by writing undefined over it (dropped from JSON Schema output).
126
+ const kind = isSensitive
127
+ ? (options.kind ?? Reflect.get(metadata, APIFUSE_SENSITIVE_KIND_META_KEY))
128
+ : undefined;
100
129
  return described.meta({
101
130
  ...metadata,
102
- ...((options.sensitive ?? true) ? { [APIFUSE_SENSITIVE_META_KEY]: true } : {}),
103
- ...(options.kind ? { [APIFUSE_SENSITIVE_KIND_META_KEY]: options.kind } : {}),
131
+ [APIFUSE_SENSITIVE_META_KEY]: isSensitive,
132
+ ...(kind !== undefined || APIFUSE_SENSITIVE_KIND_META_KEY in metadata
133
+ ? { [APIFUSE_SENSITIVE_KIND_META_KEY]: kind }
134
+ : {}),
104
135
  });
105
136
  }
106
137
  export function sensitive(schema, kind) {
107
138
  return field(schema, { sensitive: true, kind });
108
139
  }
140
+ /**
141
+ * Declare a field as reviewed public data (business, facility, product, or
142
+ * place names and contacts) so a key-based privacy classifier hit counts as
143
+ * declared instead of undeclared. Emits `x-apifuse-sensitive: false` on the
144
+ * JSON Schema leaf; nothing is redacted. Use `sensitive()` for anything that
145
+ * identifies a person. Apply it to the leaf, before `.optional()` or
146
+ * `.nullable()`; wrapping a `sensitive()` declaration throws at definition time.
147
+ */
148
+ export function publicField(schema) {
149
+ return field(schema, { sensitive: false });
150
+ }
109
151
  function sensitiveString(kind, description, options = {}) {
110
152
  const schema = options.minLength === undefined ? z.string() : z.string().min(options.minLength);
111
153
  return field(schema, {
@@ -222,6 +264,34 @@ function readZodMetadata(schema) {
222
264
  const metadata = maybeMeta.call(schema);
223
265
  return metadata && typeof metadata === "object" ? metadata : undefined;
224
266
  }
267
+ // Same-path wrappers (optional, nullable, default, catch, readonly, pipe,
268
+ // lazy, ...) share the JSON Schema leaf with the schema they wrap.
269
+ function wrapsSensitiveDeclaration(schema, seen = new Set()) {
270
+ const def = readZodDef(schema);
271
+ if (!def || seen.has(schema))
272
+ return false;
273
+ seen.add(schema);
274
+ return sameLeafChildren(def).some((child) => isSensitiveSchema(child) || wrapsSensitiveDeclaration(child, seen));
275
+ }
276
+ function sameLeafChildren(def) {
277
+ switch (Reflect.get(def, "type")) {
278
+ case "pipe":
279
+ return [Reflect.get(def, "in"), Reflect.get(def, "out")];
280
+ case "lazy": {
281
+ // A forward-reference getter can throw before its target is
282
+ // initialised; treat that as no declaration rather than failing.
283
+ const getter = Reflect.get(def, "getter");
284
+ try {
285
+ return typeof getter === "function" ? [getter()] : [];
286
+ }
287
+ catch {
288
+ return [];
289
+ }
290
+ }
291
+ default:
292
+ return [Reflect.get(def, "innerType")];
293
+ }
294
+ }
225
295
  function readZodDef(schema) {
226
296
  if (!schema || typeof schema !== "object")
227
297
  return undefined;
package/dist/serve.d.ts CHANGED
@@ -1 +1 @@
1
- export { createServerApp, type ServeOptions, serve } from "./server/serve.js";
1
+ export { createServerApp, createServerAppAsync, type ServeOptions, serve, } from "./server/serve.js";
package/dist/serve.js CHANGED
@@ -1 +1 @@
1
- export { createServerApp, serve } from "./server/serve.js";
1
+ export { createServerApp, createServerAppAsync, serve, } from "./server/serve.js";
@@ -0,0 +1 @@
1
+ export { safeProviderErrorObservability } from "../error-observability.js";
@@ -0,0 +1 @@
1
+ export { safeProviderErrorObservability } from "../error-observability.js";
@@ -0,0 +1,35 @@
1
+ import { type DiagnosticRedactor } from "../runtime/diagnostic-redactor.js";
2
+ /**
3
+ * Bounded, whitelist-shaped stack frames for masked (>=500) provider failures.
4
+ *
5
+ * `sanitizeDiagnosticText` is a blacklist scrubber for free text: a V8/Bun
6
+ * frame such as `at inner (/srv/app/probe.ts:3:30)` comes out as
7
+ * `at inner ([REDACTED])`, and even a bare `serve-implementation.ts:2039:12`
8
+ * trips the opaque-token heuristics. Stack frames therefore never go through
9
+ * it. Instead each frame is parsed against a strict grammar and re-emitted
10
+ * from its parts only: an optional `async`/`new` marker, the function name
11
+ * (identifier characters only), the file *basename* (never a filesystem
12
+ * directory, URL, or drive letter) and the numeric line:column. The sole
13
+ * exception is an engine-internal location (`native`, or a `node:` module id
14
+ * of identifier-shaped segments), which is kept verbatim because it names no
15
+ * deployment path. Frames that do not fit the grammar (eval frames, frames
16
+ * without a location, oversized lines) are dropped rather than passed
17
+ * through.
18
+ */
19
+ export declare const MAX_PROVIDER_ERROR_STACK_FRAMES = 5;
20
+ /** Parses one `at ...` line into `[async |new ][fn ](basename:line:col)`, or undefined. */
21
+ export declare function parseProviderErrorStackFrame(line: string): string | undefined;
22
+ /**
23
+ * Up to {@link MAX_PROVIDER_ERROR_STACK_FRAMES} whitelist-shaped frames from
24
+ * `error.stack`, or undefined when nothing parses. For an engine-formatted
25
+ * stack the header (which embeds the current `message`) is located and
26
+ * stripped first, so a provider-controlled *message* containing newlines
27
+ * cannot inject frame-shaped text (no header match, no frames). A provider
28
+ * that overwrites `stack` or `name` outright can still put grammar-shaped
29
+ * frames in the record: the field is a diagnostic hint, not an attested
30
+ * location, and the whitelist plus the redactor bound what it can carry.
31
+ * Each emitted frame still passes
32
+ * through the request redactor so a registered secret that happens to appear
33
+ * in a function or file name is masked (fail-closed to `[REDACTION_FAILED]`).
34
+ */
35
+ export declare function providerErrorStackFrames(error: unknown, redact?: DiagnosticRedactor): string[] | undefined;
@@ -0,0 +1,219 @@
1
+ import { redactDiagnosticText } from "../runtime/diagnostic-redactor.js";
2
+ /**
3
+ * Bounded, whitelist-shaped stack frames for masked (>=500) provider failures.
4
+ *
5
+ * `sanitizeDiagnosticText` is a blacklist scrubber for free text: a V8/Bun
6
+ * frame such as `at inner (/srv/app/probe.ts:3:30)` comes out as
7
+ * `at inner ([REDACTED])`, and even a bare `serve-implementation.ts:2039:12`
8
+ * trips the opaque-token heuristics. Stack frames therefore never go through
9
+ * it. Instead each frame is parsed against a strict grammar and re-emitted
10
+ * from its parts only: an optional `async`/`new` marker, the function name
11
+ * (identifier characters only), the file *basename* (never a filesystem
12
+ * directory, URL, or drive letter) and the numeric line:column. The sole
13
+ * exception is an engine-internal location (`native`, or a `node:` module id
14
+ * of identifier-shaped segments), which is kept verbatim because it names no
15
+ * deployment path. Frames that do not fit the grammar (eval frames, frames
16
+ * without a location, oversized lines) are dropped rather than passed
17
+ * through.
18
+ */
19
+ export const MAX_PROVIDER_ERROR_STACK_FRAMES = 5;
20
+ const MAX_STACK_SCAN_CHARS = 16 * 1024;
21
+ const MAX_STACK_SCAN_LINES = 64;
22
+ const MAX_STACK_LINE_CHARS = 1024;
23
+ const FRAME_LINE = /^\s+at\s+(\S.*)$/;
24
+ const FRAME_MODIFIER = /^(async|new)\s+(.*)$/;
25
+ const FRAME_FUNCTION_NAME = /^[\w$.<>[\] #]{1,80}$/;
26
+ const FRAME_LOCATION = /^(.*):(\d{1,7}):(\d{1,7})$/;
27
+ const MAX_NODE_MODULE_ID_CHARS = 128;
28
+ // Engine-internal module ids only: `node:` plus `/`-separated identifier-shaped
29
+ // segments (`node:async_hooks`, `node:internal/process/task_queues`). Every
30
+ // segment must start with a letter or `_`, so `..` traversal and dotfile
31
+ // segments cannot ride through this branch.
32
+ const FRAME_NODE_MODULE = /^node:[A-Za-z_][\w.-]{0,40}(?:\/[A-Za-z_][\w.-]{0,40}){0,7}$/;
33
+ const FRAME_BASENAME = /^[\w.$-]{1,120}$/;
34
+ // A basename of dots only (`.`, `..`, `...`) names no file.
35
+ const FRAME_BASENAME_HAS_NAME = /[^.]/;
36
+ function parseFunctionName(raw) {
37
+ let rest = raw.trim();
38
+ let modifier;
39
+ const modified = FRAME_MODIFIER.exec(rest);
40
+ if (modified) {
41
+ modifier = modified[1];
42
+ rest = modified[2].trim();
43
+ }
44
+ if (rest.length === 0)
45
+ return { modifier };
46
+ if (!FRAME_FUNCTION_NAME.test(rest))
47
+ return undefined;
48
+ return { modifier, name: rest };
49
+ }
50
+ function parseLocation(raw) {
51
+ if (/[\s()]/.test(raw))
52
+ return undefined;
53
+ const located = FRAME_LOCATION.exec(raw);
54
+ if (!located)
55
+ return undefined;
56
+ const [, path, line, column] = located;
57
+ let file;
58
+ if (path === "native" ||
59
+ (path.length <= MAX_NODE_MODULE_ID_CHARS && FRAME_NODE_MODULE.test(path))) {
60
+ // Not filesystem paths: engine-internal module ids carry no deployment
61
+ // information. This is the one branch that keeps a `/`, and the grammar
62
+ // above bounds it to identifier segments.
63
+ file = path;
64
+ }
65
+ else {
66
+ const separator = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
67
+ const basename = separator >= 0 ? path.slice(separator + 1) : path;
68
+ if (!FRAME_BASENAME.test(basename))
69
+ return undefined;
70
+ // `.` and `..` pass the basename character class but name no file: they
71
+ // are the traversal tokens the grammar exists to exclude, so a path such
72
+ // as `/srv/app/..:1:1` must not be emitted as `..:1:1`.
73
+ if (!FRAME_BASENAME_HAS_NAME.test(basename))
74
+ return undefined;
75
+ file = basename;
76
+ }
77
+ return `${file}:${line}:${column}`;
78
+ }
79
+ /** Parses one `at ...` line into `[async |new ][fn ](basename:line:col)`, or undefined. */
80
+ export function parseProviderErrorStackFrame(line) {
81
+ if (line.length > MAX_STACK_LINE_CHARS)
82
+ return undefined;
83
+ const frame = FRAME_LINE.exec(line);
84
+ if (!frame)
85
+ return undefined;
86
+ const rest = frame[1].trimEnd();
87
+ let functionPart;
88
+ let locationPart;
89
+ if (rest.endsWith(")")) {
90
+ const open = rest.lastIndexOf("(");
91
+ if (open < 0)
92
+ return undefined;
93
+ functionPart = rest.slice(0, open);
94
+ locationPart = rest.slice(open + 1, -1);
95
+ }
96
+ else {
97
+ // A frame with no parenthesized location still carries its `async`/`new`
98
+ // modifier inline (`at async file:///app/index.mjs:12:3`, emitted by V8
99
+ // for an anonymous async frame such as a module's top-level await).
100
+ // Split it off here: `parseLocation` rejects anything containing
101
+ // whitespace, so leaving it attached dropped the whole frame.
102
+ const modified = FRAME_MODIFIER.exec(rest);
103
+ functionPart = modified ? modified[1] : "";
104
+ locationPart = modified ? modified[2].trim() : rest;
105
+ }
106
+ // Eval frames nest parentheses inside the function part; never pass them through.
107
+ if (/[()]/.test(functionPart))
108
+ return undefined;
109
+ const location = parseLocation(locationPart);
110
+ if (!location)
111
+ return undefined;
112
+ const fn = parseFunctionName(functionPart);
113
+ if (!fn)
114
+ return undefined;
115
+ const prefix = [fn.modifier, fn.name].filter((part) => part !== undefined).join(" ");
116
+ return prefix.length > 0 ? `${prefix} (${location})` : `(${location})`;
117
+ }
118
+ // V8 (Node >= 21) installs `stack` as a shared native accessor pair on every
119
+ // Error instance; JSC (Bun) installs a data property. Capture the engine's own
120
+ // accessor once so a provider-defined accessor (a different function object) is
121
+ // still rejected while the engine's is trusted. The engine accessor itself can
122
+ // call a process-global `Error.prepareStackTrace` hook, a process-wide trust
123
+ // boundary this module cannot narrow: a provider that installs one already
124
+ // reshapes `stack` for every consumer, and the whitelist grammar below still
125
+ // bounds what the resulting text can carry.
126
+ const NATIVE_STACK_GETTER = Object.getOwnPropertyDescriptor(new Error(), "stack")?.get;
127
+ function readOwnStackString(error) {
128
+ // Only engine-captured stacks: a thrown plain object is provider-authored text.
129
+ if (!(error instanceof Error))
130
+ return undefined;
131
+ try {
132
+ const descriptor = Object.getOwnPropertyDescriptor(error, "stack");
133
+ if (descriptor === undefined)
134
+ return undefined;
135
+ let stack;
136
+ if (Object.hasOwn(descriptor, "value")) {
137
+ stack = descriptor.value;
138
+ }
139
+ else if (typeof NATIVE_STACK_GETTER === "function" &&
140
+ descriptor.get === NATIVE_STACK_GETTER) {
141
+ stack = Reflect.apply(NATIVE_STACK_GETTER, error, []);
142
+ }
143
+ else {
144
+ // A provider-defined accessor must never run inside the logger.
145
+ return undefined;
146
+ }
147
+ return typeof stack === "string" ? stack : undefined;
148
+ }
149
+ catch {
150
+ return undefined;
151
+ }
152
+ }
153
+ // Header shapes ahead of the frame block: `Name: message` (V8/JSC),
154
+ // `Name [CODE]: message` (node:assert), `Name` (empty message), or the bare
155
+ // message (Playwright rewrites `stack` as message-first). The message itself
156
+ // is matched verbatim, so anything before it must be a short name-like prefix.
157
+ const HEADER_NAME_PREFIX = /^(?:[\w$][\w$ .[\]-]{0,119}: )?$/;
158
+ const HEADER_NAME_ONLY = /^[\w$][\w$ .[\]-]{0,119}$/;
159
+ /**
160
+ * The frame block that follows the header, or undefined when the header does
161
+ * not embed the current `message` followed by a newline. Fail closed there: if
162
+ * `message` was mutated after the stack was formatted, the original message
163
+ * lines are still in the string and could be parsed as forged frames. (A
164
+ * mutation that truncates exactly at one of the message's own newlines is
165
+ * indistinguishable from the string alone; the whitelist grammar and the
166
+ * redactor still bound what such a line can carry.)
167
+ */
168
+ function frameBlock(stack, error) {
169
+ let message;
170
+ try {
171
+ message = error.message;
172
+ }
173
+ catch {
174
+ return undefined;
175
+ }
176
+ if (typeof message !== "string")
177
+ return undefined;
178
+ if (message.length === 0) {
179
+ const newline = stack.indexOf("\n");
180
+ if (newline < 0 || !HEADER_NAME_ONLY.test(stack.slice(0, newline)))
181
+ return undefined;
182
+ return stack.slice(newline + 1);
183
+ }
184
+ const at = stack.indexOf(`${message}\n`);
185
+ if (at < 0 || !HEADER_NAME_PREFIX.test(stack.slice(0, at)))
186
+ return undefined;
187
+ return stack.slice(at + message.length + 1);
188
+ }
189
+ /**
190
+ * Up to {@link MAX_PROVIDER_ERROR_STACK_FRAMES} whitelist-shaped frames from
191
+ * `error.stack`, or undefined when nothing parses. For an engine-formatted
192
+ * stack the header (which embeds the current `message`) is located and
193
+ * stripped first, so a provider-controlled *message* containing newlines
194
+ * cannot inject frame-shaped text (no header match, no frames). A provider
195
+ * that overwrites `stack` or `name` outright can still put grammar-shaped
196
+ * frames in the record: the field is a diagnostic hint, not an attested
197
+ * location, and the whitelist plus the redactor bound what it can carry.
198
+ * Each emitted frame still passes
199
+ * through the request redactor so a registered secret that happens to appear
200
+ * in a function or file name is masked (fail-closed to `[REDACTION_FAILED]`).
201
+ */
202
+ export function providerErrorStackFrames(error, redact) {
203
+ const stack = readOwnStackString(error);
204
+ if (stack === undefined)
205
+ return undefined;
206
+ const body = frameBlock(stack, error);
207
+ if (body === undefined)
208
+ return undefined;
209
+ const frames = [];
210
+ const lines = body.slice(0, MAX_STACK_SCAN_CHARS).split("\n", MAX_STACK_SCAN_LINES);
211
+ for (const line of lines) {
212
+ if (frames.length >= MAX_PROVIDER_ERROR_STACK_FRAMES)
213
+ break;
214
+ const frame = parseProviderErrorStackFrame(line);
215
+ if (frame !== undefined)
216
+ frames.push(redactDiagnosticText(frame, redact));
217
+ }
218
+ return frames.length > 0 ? frames : undefined;
219
+ }
@@ -1,7 +1,26 @@
1
- export { createServerApp, type ServeOptions, serve } from "./serve.js";
1
+ export type { ProviderLocaleCatalogMap } from "../i18n/catalog.js";
2
+ export type { ProviderLocale, ProviderLocaleCatalog } from "../i18n/keys.js";
3
+ export type { ProxyCacheStatus, ProxyProtocol, ProxyUserAgentSource, ProxyVendorName, SmartproxyAllocatorBodyClass, } from "../config/loader.js";
4
+ export type { ProxyTelemetryHeaderPayload, ProxyHash, ProxyTelemetryLogPayload, ProxyTelemetryResolvedPayload, ProxyTelemetryUnresolvedPayload, } from "../runtime/proxy-telemetry.js";
5
+ export { RequestTelemetry, closedEnum, type ClosedEnum, type GatewayIngestible, type RequestTelemetryLogPayload, type SpanIndex, type TelemetryContributor, type TelemetryKey, type TenantNeutral, } from "../runtime/request-telemetry.js";
6
+ export { OcrTelemetryCollector, bindOcrTelemetry, type OcrTelemetryBackend, type OcrTelemetryEngine, type OcrTelemetryErrorCode, type OcrTelemetryEvent, type OcrTelemetryModel, type OcrTelemetryFinishReason, type OcrTelemetryHeaderPayload, type OcrTelemetryLogPayload, type OcrTelemetrySink, } from "../runtime/ocr-telemetry.js";
7
+ export { ResolverTelemetryCollector, type ResolverAttemptSample, type ResolverCacheReadTelemetryEvent, type ResolverCacheWriteTelemetryEvent, type ResolverFailoverTelemetryEvent, type ResolverIdentityTelemetryEvent, type ResolverOutcomeTelemetryEvent, type ResolverTelemetryAttemptOutcome, type ResolverTelemetryCacheStatus, type ResolverTelemetryCacheWriteReason, type ResolverTelemetryErrorClass, type ResolverTelemetryHeaderPayload, type ResolverTelemetryIdentitySource, type ResolverTelemetryLogPayload, type ResolverTelemetryOutcome, type ResolverTelemetryPhase, type ResolverTelemetrySink, type ResolverVendorAttemptTelemetryEvent, } from "../runtime/resolver-telemetry.js";
8
+ export { StealthTelemetryCollector, type StealthTelemetryAttemptEvent, type StealthTelemetryAttemptKind, type StealthTelemetryAttemptSample, type StealthTelemetryDiagnostics, type StealthTelemetryErrorCode, type StealthTelemetryHeaderPayload, type StealthTelemetryLogPayload, type StealthTelemetryRequestClass, type StealthTelemetrySbsdEvent, type StealthTelemetrySbsdOutcome, type StealthTelemetrySink, } from "../runtime/stealth-telemetry.js";
9
+ export { SttTelemetryCollector, bindSttTelemetry, type SttTelemetryBackend, type SttTelemetryEngine, type SttTelemetryErrorCode, type SttTelemetryEvent, type SttTelemetryModel, type SttTelemetryHeaderPayload, type SttTelemetryLogPayload, type SttTelemetrySink, } from "../runtime/stt-telemetry.js";
10
+ export { BrowserTelemetryCollector, type BrowserTelemetryErrorCode, type BrowserTelemetryHeaderPayload, type BrowserTelemetryLogPayload, type BrowserTelemetryPoolAcquireOutcome, type BrowserTelemetrySink, type BrowserTelemetrySampleName, type BrowserTelemetryEngine, } from "../runtime/browser-telemetry.js";
11
+ export type { ResolverVendorUnavailableReason } from "../runtime/resolver-vendors/types.js";
12
+ export type { Span, TraceContext } from "../runtime/trace.js";
13
+ export type { StealthBrowser, StealthOS, StealthProfileDescriptor } from "../types.js";
14
+ export { createServerApp, createServerAppAsync, ERROR_OBSERVABILITY_HEADER, type ErrorObservabilityDetails, type ProviderServerCloseOptions, type ProviderServerHandle, type ProviderErrorCauseFrame, type ProviderServerLogEvent, type ProviderServerLogger, type ProviderServerOperationExecutor, type ProviderServerOperationExecutorInput, type ProviderServerOptions, type ProviderServerStatefulForwardEnvelope, type ServeOptions, serve, } from "./serve.js";
15
+ export type { ProviderStateBackendLogEvent, ProviderStoreBackendReport, } from "./state-backend-report.js";
16
+ export type { ProviderErrorObservability } from "../errors.js";
2
17
  export { computeSelfTestPlanDigest, createSelfTestApp, createSelfTestAuthFlowInvoke, createSelfTestInvoke, DEFAULT_SELF_TEST_REQUEST_BUDGET_MS, isSelfTestReadOnlyOperation, PROVIDER_RUNTIME_SELF_TEST_REQUEST_BUDGET_MS_ENV, resolveSelfTestPort, SELF_TEST_AUTH_FLOW_MULTI_TURN_SKIP_REASON, SELF_TEST_AUTH_FLOW_REJECTED_SKIP_REASON, SELF_TEST_HEALTHZ_PATH, SELF_TEST_PATH, SELF_TEST_SCHEMA_VERSION, type SelfTestAppOptions, type SelfTestAuthFlowInvoke, type SelfTestAuthFlowRoute, type SelfTestCaseResult, type SelfTestCaseStatus, type SelfTestOperationInvoke, type SelfTestRequest, SelfTestRequestSchema, type SelfTestResponse, } from "./self-test.js";
3
- export { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens.js";
18
+ export { type InputDateTokenCalendar, resolveHealthCheckInputDateTokens, } from "./self-test-input-tokens.js";
4
19
  export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction.js";
20
+ export { type CollectRuntimeDiagnosticsInput, collectRuntimeDiagnostics, DEFAULT_PROCFS_SELF_ROOT, DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS, MAX_RUNTIME_DIAGNOSTICS_WINDOW_MS, MIN_RUNTIME_DIAGNOSTICS_WINDOW_MS, normalizeRuntimeDiagnosticsWindowMs, PROCFS_CLOCK_TICKS_PER_SECOND, resolveRuntimeDiagnosticsWindowMs, RUNTIME_DIAGNOSTICS_ROUTE, RUNTIME_DIAGNOSTICS_SCHEMA_VERSION, RUNTIME_DIAGNOSTICS_WINDOW_QUERY, type RuntimeDiagnosticsActiveResources, type RuntimeDiagnosticsClock, type RuntimeDiagnosticsCpu, type RuntimeDiagnosticsCpuTotals, type RuntimeDiagnosticsEventLoop, type RuntimeDiagnosticsEventLoopUtilization, type RuntimeDiagnosticsFdKind, type RuntimeDiagnosticsMemory, type RuntimeDiagnosticsProcfs, type RuntimeDiagnosticsReport, type RuntimeDiagnosticsThread, type RuntimeDiagnosticsThreadContextSwitches, type RuntimeDiagnosticsThreadCpuTicks, type RuntimeDiagnosticsThreadWindow, } from "./runtime-diagnostics.js";
5
21
  export { DEFAULT_SELF_TEST_PORT, deriveSelfTestToken, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV, PROVIDER_RUNTIME_SELF_TEST_PORT_ENV, resolveSelfTestMasterSecrets, type SelfTestMasterSecrets, verifySelfTestAuthorization, } from "./self-test-token.js";
6
22
  export type { AuthFlowRequest, AuthFlowResponse, AuthFlowSuccessResponse, ConnectionMode, OperationConnection, OperationErrorResponse, OperationRequest, OperationResponse, OperationSuccessResponse, } from "./types.js";
7
23
  export { AuthFlowRequestSchema, AuthFlowSuccessResponseSchema, ConnectionModeSchema, ErrorEnvelopeSchema, OperationConnectionSchema, OperationErrorResponseSchema, OperationRequestSchema, OperationSuccessResponseSchema, } from "./types.js";
24
+ export { HttpTelemetryCollector, type HttpTelemetrySink, type HttpTelemetryRequestSink, type HttpAttemptTelemetryEvent, type HttpAttemptSample, type HttpTelemetryErrorCode, type HttpTelemetryRetryPayload, type HttpTelemetryLogPayload, type HttpTelemetryHeaderPayload, } from "../runtime/http-telemetry.js";
25
+ export type { HttpRetrySummary } from "../types.js";
26
+ export { NativeTelemetryCollector, type NativeAttemptSample, type NativeConnectTelemetryEvent, type NativeLifecycleTelemetryEvent, type NativeTelemetryDiagnostics, type NativeTelemetryErrorCode, type NativeTelemetryHeaderPayload, type NativeTelemetryKind, type NativeTelemetryLifecycleKind, type NativeTelemetryLogPayload, type NativeTelemetryOutcome, type NativeTelemetrySink, type NativeTelemetryVendorSkipReason, type NativeVendorSkipTelemetryEvent, } from "../runtime/native-telemetry.js";
@@ -1,6 +1,15 @@
1
- export { createServerApp, serve } from "./serve.js";
1
+ export { RequestTelemetry, closedEnum, } from "../runtime/request-telemetry.js";
2
+ export { OcrTelemetryCollector, bindOcrTelemetry, } from "../runtime/ocr-telemetry.js";
3
+ export { ResolverTelemetryCollector, } from "../runtime/resolver-telemetry.js";
4
+ export { StealthTelemetryCollector, } from "../runtime/stealth-telemetry.js";
5
+ export { SttTelemetryCollector, bindSttTelemetry, } from "../runtime/stt-telemetry.js";
6
+ export { BrowserTelemetryCollector, } from "../runtime/browser-telemetry.js";
7
+ export { createServerApp, createServerAppAsync, ERROR_OBSERVABILITY_HEADER, serve, } from "./serve.js";
2
8
  export { computeSelfTestPlanDigest, createSelfTestApp, createSelfTestAuthFlowInvoke, createSelfTestInvoke, DEFAULT_SELF_TEST_REQUEST_BUDGET_MS, isSelfTestReadOnlyOperation, PROVIDER_RUNTIME_SELF_TEST_REQUEST_BUDGET_MS_ENV, resolveSelfTestPort, SELF_TEST_AUTH_FLOW_MULTI_TURN_SKIP_REASON, SELF_TEST_AUTH_FLOW_REJECTED_SKIP_REASON, SELF_TEST_HEALTHZ_PATH, SELF_TEST_PATH, SELF_TEST_SCHEMA_VERSION, SelfTestRequestSchema, } from "./self-test.js";
3
- export { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens.js";
9
+ export { resolveHealthCheckInputDateTokens, } from "./self-test-input-tokens.js";
4
10
  export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction.js";
11
+ export { collectRuntimeDiagnostics, DEFAULT_PROCFS_SELF_ROOT, DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS, MAX_RUNTIME_DIAGNOSTICS_WINDOW_MS, MIN_RUNTIME_DIAGNOSTICS_WINDOW_MS, normalizeRuntimeDiagnosticsWindowMs, PROCFS_CLOCK_TICKS_PER_SECOND, resolveRuntimeDiagnosticsWindowMs, RUNTIME_DIAGNOSTICS_ROUTE, RUNTIME_DIAGNOSTICS_SCHEMA_VERSION, RUNTIME_DIAGNOSTICS_WINDOW_QUERY, } from "./runtime-diagnostics.js";
5
12
  export { DEFAULT_SELF_TEST_PORT, deriveSelfTestToken, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV, PROVIDER_RUNTIME_SELF_TEST_PORT_ENV, resolveSelfTestMasterSecrets, verifySelfTestAuthorization, } from "./self-test-token.js";
6
13
  export { AuthFlowRequestSchema, AuthFlowSuccessResponseSchema, ConnectionModeSchema, ErrorEnvelopeSchema, OperationConnectionSchema, OperationErrorResponseSchema, OperationRequestSchema, OperationSuccessResponseSchema, } from "./types.js";
14
+ export { HttpTelemetryCollector, } from "../runtime/http-telemetry.js";
15
+ export { NativeTelemetryCollector, } from "../runtime/native-telemetry.js";
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Internal runtime diagnostics route on the provider's primary listener, next
3
+ * to `/health` and `/readyz`. It answers one JSON report that tells an idle
4
+ * process that still burns CPU apart from a busy one without `exec`: process
5
+ * CPU sampled over a short window, memory, the Node event-loop and
6
+ * active-resource APIs, and on Linux the per-thread CPU and file-descriptor
7
+ * picture from `/proc/self`.
8
+ *
9
+ * Read-only and secret-free. It shares the boundary of `/health` and `/readyz`:
10
+ * the generated provider NetworkPolicy admits only the gateway on this port and
11
+ * the gateway dials canonical operation paths only, so a tenant cannot reach
12
+ * it; operators use `kubectl port-forward`.
13
+ */
14
+ export declare const RUNTIME_DIAGNOSTICS_ROUTE = "/__apifuse/diagnostics/runtime";
15
+ export declare const RUNTIME_DIAGNOSTICS_SCHEMA_VERSION: 1;
16
+ /** Query parameter naming the sampling window; clamped, never rejected. */
17
+ export declare const RUNTIME_DIAGNOSTICS_WINDOW_QUERY = "windowMs";
18
+ export declare const DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS = 250;
19
+ export declare const MIN_RUNTIME_DIAGNOSTICS_WINDOW_MS = 50;
20
+ export declare const MAX_RUNTIME_DIAGNOSTICS_WINDOW_MS = 5000;
21
+ /**
22
+ * Linux USER_HZ. The unit of `utime`/`stime` in `/proc` stat files is an ABI
23
+ * constant (100 Hz) independent of the kernel's CONFIG_HZ.
24
+ */
25
+ export declare const PROCFS_CLOCK_TICKS_PER_SECOND = 100;
26
+ export declare const DEFAULT_PROCFS_SELF_ROOT = "/proc/self";
27
+ export interface RuntimeDiagnosticsCpuTotals {
28
+ readonly userMicros: number;
29
+ readonly systemMicros: number;
30
+ }
31
+ export interface RuntimeDiagnosticsCpu {
32
+ /** `process.cpuUsage()` since boot and its average in cores over `uptimeSeconds`. */
33
+ readonly lifetime: RuntimeDiagnosticsCpuTotals & {
34
+ readonly averageCores: number;
35
+ };
36
+ /** `process.cpuUsage()` delta over the sampling window, as cores (1 = one CPU fully busy). */
37
+ readonly window: RuntimeDiagnosticsCpuTotals & {
38
+ readonly userCores: number;
39
+ readonly systemCores: number;
40
+ readonly totalCores: number;
41
+ };
42
+ }
43
+ export interface RuntimeDiagnosticsEventLoopUtilization {
44
+ readonly idle: number;
45
+ readonly active: number;
46
+ readonly utilization: number;
47
+ }
48
+ export interface RuntimeDiagnosticsEventLoop {
49
+ /**
50
+ * false when the runtime returned only zeros for the whole process lifetime.
51
+ * Bun 1.2 and 1.3 stub `performance.eventLoopUtilization`; read
52
+ * `cpu.window` and `procfs.threads` instead.
53
+ */
54
+ readonly reported: boolean;
55
+ readonly lifetime: RuntimeDiagnosticsEventLoopUtilization;
56
+ readonly window: RuntimeDiagnosticsEventLoopUtilization;
57
+ }
58
+ export interface RuntimeDiagnosticsActiveResources {
59
+ /**
60
+ * false when the runtime listed nothing, although at least the socket that
61
+ * answers this request is alive. Bun 1.2 and 1.3 stub
62
+ * `process.getActiveResourcesInfo`; read `procfs.fileDescriptors` instead.
63
+ */
64
+ readonly reported: boolean;
65
+ readonly total: number;
66
+ readonly byType: Readonly<Record<string, number>>;
67
+ }
68
+ export interface RuntimeDiagnosticsMemory {
69
+ readonly rss: number;
70
+ readonly heapTotal: number;
71
+ readonly heapUsed: number;
72
+ readonly external: number;
73
+ readonly arrayBuffers: number;
74
+ }
75
+ export interface RuntimeDiagnosticsThreadCpuTicks {
76
+ readonly userTicks: number;
77
+ readonly systemTicks: number;
78
+ }
79
+ export interface RuntimeDiagnosticsThreadContextSwitches {
80
+ readonly voluntary: number;
81
+ readonly nonvoluntary: number;
82
+ }
83
+ export interface RuntimeDiagnosticsThreadWindow extends RuntimeDiagnosticsThreadCpuTicks {
84
+ /** CPU consumed by this thread over the window, in cores. */
85
+ readonly cores: number;
86
+ readonly contextSwitches: RuntimeDiagnosticsThreadContextSwitches;
87
+ }
88
+ export interface RuntimeDiagnosticsThread {
89
+ readonly tid: number;
90
+ /** Kernel thread name (`comm`, 15 bytes), e.g. `bun`, `HTTP Client`, `HeapHelper`. */
91
+ readonly name: string;
92
+ /** Scheduler state letter at the second sample (`R` running, `S` sleeping, ...). */
93
+ readonly state: string;
94
+ /** Kernel wait channel at the second sample (`0` while running); null when unreadable. */
95
+ readonly waitChannel: string | null;
96
+ readonly lifetime: RuntimeDiagnosticsThreadCpuTicks;
97
+ /** null for a thread that appeared after the first sample. */
98
+ readonly window: RuntimeDiagnosticsThreadWindow | null;
99
+ }
100
+ export type RuntimeDiagnosticsFdKind = "socket" | "eventpoll" | "timerfd" | "eventfd" | "pipe" | "file" | "other";
101
+ export interface RuntimeDiagnosticsProcfs {
102
+ readonly clockTicksPerSecond: number;
103
+ /**
104
+ * Elapsed time between the two /proc/self scans. Slightly longer than
105
+ * `window.observedMs` because it encloses the scans themselves; thread
106
+ * `window.cores` is computed over this interval.
107
+ */
108
+ readonly observedMs: number;
109
+ readonly threads: {
110
+ readonly total: number;
111
+ readonly byName: Readonly<Record<string, number>>;
112
+ /** Sorted by window cores descending, so the hottest thread is first. */
113
+ readonly items: readonly RuntimeDiagnosticsThread[];
114
+ };
115
+ readonly fileDescriptors: {
116
+ readonly total: number;
117
+ readonly byKind: Readonly<Record<RuntimeDiagnosticsFdKind, number>>;
118
+ };
119
+ }
120
+ export interface RuntimeDiagnosticsReport {
121
+ readonly schemaVersion: typeof RUNTIME_DIAGNOSTICS_SCHEMA_VERSION;
122
+ readonly provider: {
123
+ readonly id: string;
124
+ readonly version: string;
125
+ };
126
+ readonly sdkVersion: string;
127
+ readonly runtime: {
128
+ readonly bunVersion: string | null;
129
+ readonly nodeCompatVersion: string;
130
+ readonly platform: string;
131
+ readonly arch: string;
132
+ readonly pid: number;
133
+ };
134
+ readonly sampledAt: string;
135
+ readonly uptimeSeconds: number;
136
+ readonly window: {
137
+ readonly requestedMs: number;
138
+ readonly observedMs: number;
139
+ };
140
+ readonly cpu: RuntimeDiagnosticsCpu;
141
+ readonly memory: RuntimeDiagnosticsMemory;
142
+ readonly eventLoop: RuntimeDiagnosticsEventLoop;
143
+ readonly activeResources: RuntimeDiagnosticsActiveResources;
144
+ /** null off Linux or when `/proc/self` is unreadable. */
145
+ readonly procfs: RuntimeDiagnosticsProcfs | null;
146
+ }
147
+ export interface RuntimeDiagnosticsClock {
148
+ now(): number;
149
+ sleep(ms: number): Promise<void>;
150
+ }
151
+ export interface CollectRuntimeDiagnosticsInput {
152
+ readonly provider: {
153
+ readonly id: string;
154
+ readonly version: string;
155
+ };
156
+ /** Sampling window; clamped to [MIN, MAX]. */
157
+ readonly windowMs?: number;
158
+ /** `/proc/self` substitute for tests. */
159
+ readonly procfsRoot?: string;
160
+ readonly clock?: RuntimeDiagnosticsClock;
161
+ }
162
+ export declare function normalizeRuntimeDiagnosticsWindowMs(value: number | undefined): number;
163
+ /** Parses the `windowMs` query value; anything unparsable falls back to the default. */
164
+ export declare function resolveRuntimeDiagnosticsWindowMs(raw: string | undefined | null): number;
165
+ export declare function collectRuntimeDiagnostics(input: CollectRuntimeDiagnosticsInput): Promise<RuntimeDiagnosticsReport>;