@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
@@ -0,0 +1,360 @@
1
+ import { readdirSync, readFileSync, readlinkSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { performance } from "node:perf_hooks";
4
+ import { SDK_VERSION } from "./sdk-version.js";
5
+ /**
6
+ * Internal runtime diagnostics route on the provider's primary listener, next
7
+ * to `/health` and `/readyz`. It answers one JSON report that tells an idle
8
+ * process that still burns CPU apart from a busy one without `exec`: process
9
+ * CPU sampled over a short window, memory, the Node event-loop and
10
+ * active-resource APIs, and on Linux the per-thread CPU and file-descriptor
11
+ * picture from `/proc/self`.
12
+ *
13
+ * Read-only and secret-free. It shares the boundary of `/health` and `/readyz`:
14
+ * the generated provider NetworkPolicy admits only the gateway on this port and
15
+ * the gateway dials canonical operation paths only, so a tenant cannot reach
16
+ * it; operators use `kubectl port-forward`.
17
+ */
18
+ export const RUNTIME_DIAGNOSTICS_ROUTE = "/__apifuse/diagnostics/runtime";
19
+ export const RUNTIME_DIAGNOSTICS_SCHEMA_VERSION = 1;
20
+ /** Query parameter naming the sampling window; clamped, never rejected. */
21
+ export const RUNTIME_DIAGNOSTICS_WINDOW_QUERY = "windowMs";
22
+ export const DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS = 250;
23
+ export const MIN_RUNTIME_DIAGNOSTICS_WINDOW_MS = 50;
24
+ export const MAX_RUNTIME_DIAGNOSTICS_WINDOW_MS = 5_000;
25
+ /**
26
+ * Linux USER_HZ. The unit of `utime`/`stime` in `/proc` stat files is an ABI
27
+ * constant (100 Hz) independent of the kernel's CONFIG_HZ.
28
+ */
29
+ export const PROCFS_CLOCK_TICKS_PER_SECOND = 100;
30
+ export const DEFAULT_PROCFS_SELF_ROOT = "/proc/self";
31
+ const defaultClock = {
32
+ now: () => performance.now(),
33
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
34
+ };
35
+ export function normalizeRuntimeDiagnosticsWindowMs(value) {
36
+ if (value === undefined || !Number.isFinite(value))
37
+ return DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS;
38
+ return Math.min(MAX_RUNTIME_DIAGNOSTICS_WINDOW_MS, Math.max(MIN_RUNTIME_DIAGNOSTICS_WINDOW_MS, Math.trunc(value)));
39
+ }
40
+ /** Parses the `windowMs` query value; anything unparsable falls back to the default. */
41
+ export function resolveRuntimeDiagnosticsWindowMs(raw) {
42
+ if (raw === undefined || raw === null || raw.trim() === "") {
43
+ return DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS;
44
+ }
45
+ const parsed = Number.parseInt(raw, 10);
46
+ return normalizeRuntimeDiagnosticsWindowMs(Number.isNaN(parsed) ? undefined : parsed);
47
+ }
48
+ export async function collectRuntimeDiagnostics(input) {
49
+ const clock = input.clock ?? defaultClock;
50
+ const procfsRoot = input.procfsRoot ?? DEFAULT_PROCFS_SELF_ROOT;
51
+ const requestedMs = normalizeRuntimeDiagnosticsWindowMs(input.windowMs);
52
+ // Two nested brackets. The procfs scans are synchronous work on the main
53
+ // thread, so the process-level CPU bracket starts after the first scan and
54
+ // closes before the second one: the scans' own CPU never lands inside it.
55
+ // The thread bracket encloses the scans and divides their tick deltas by
56
+ // its own elapsed time, so the scan cost is attributed over the interval it
57
+ // actually spans instead of inflating a short window.
58
+ const threadsStartedAt = clock.now();
59
+ const threadsStart = sampleThreads(procfsRoot);
60
+ const cpuStart = process.cpuUsage();
61
+ const eventLoopStart = sampleEventLoopUtilization();
62
+ const startedAt = clock.now();
63
+ await clock.sleep(requestedMs);
64
+ const observedMs = Math.max(0, clock.now() - startedAt);
65
+ const cpuWindow = process.cpuUsage(cpuStart);
66
+ const eventLoopEnd = sampleEventLoopUtilization();
67
+ const threadsEnd = sampleThreads(procfsRoot);
68
+ const threadsObservedMs = Math.max(0, clock.now() - threadsStartedAt);
69
+ const fileDescriptors = sampleFileDescriptors(procfsRoot);
70
+ const cpuLifetime = process.cpuUsage();
71
+ const uptimeSeconds = process.uptime();
72
+ const sampledAt = new Date().toISOString();
73
+ const memory = process.memoryUsage();
74
+ const activeResources = sampleActiveResources();
75
+ return {
76
+ schemaVersion: RUNTIME_DIAGNOSTICS_SCHEMA_VERSION,
77
+ provider: { id: input.provider.id, version: input.provider.version },
78
+ sdkVersion: SDK_VERSION,
79
+ runtime: {
80
+ bunVersion: process.versions.bun ?? null,
81
+ nodeCompatVersion: process.versions.node,
82
+ platform: process.platform,
83
+ arch: process.arch,
84
+ pid: process.pid,
85
+ },
86
+ sampledAt,
87
+ uptimeSeconds,
88
+ window: { requestedMs, observedMs },
89
+ cpu: {
90
+ lifetime: {
91
+ userMicros: cpuLifetime.user,
92
+ systemMicros: cpuLifetime.system,
93
+ averageCores: coresFromMicros(cpuLifetime.user + cpuLifetime.system, uptimeSeconds * 1000),
94
+ },
95
+ window: {
96
+ userMicros: cpuWindow.user,
97
+ systemMicros: cpuWindow.system,
98
+ userCores: coresFromMicros(cpuWindow.user, observedMs),
99
+ systemCores: coresFromMicros(cpuWindow.system, observedMs),
100
+ totalCores: coresFromMicros(cpuWindow.user + cpuWindow.system, observedMs),
101
+ },
102
+ },
103
+ memory: {
104
+ rss: memory.rss,
105
+ heapTotal: memory.heapTotal,
106
+ heapUsed: memory.heapUsed,
107
+ external: memory.external,
108
+ arrayBuffers: memory.arrayBuffers,
109
+ },
110
+ eventLoop: {
111
+ reported: eventLoopEnd.idle + eventLoopEnd.active > 0,
112
+ lifetime: eventLoopEnd,
113
+ window: eventLoopUtilizationDelta(eventLoopEnd, eventLoopStart),
114
+ },
115
+ activeResources,
116
+ procfs: threadsEnd === null || fileDescriptors === null
117
+ ? null
118
+ : {
119
+ clockTicksPerSecond: PROCFS_CLOCK_TICKS_PER_SECOND,
120
+ observedMs: threadsObservedMs,
121
+ threads: summarizeThreads(threadsStart, threadsEnd, threadsObservedMs),
122
+ fileDescriptors,
123
+ },
124
+ };
125
+ }
126
+ function coresFromMicros(micros, elapsedMs) {
127
+ if (!(elapsedMs > 0))
128
+ return 0;
129
+ return micros / 1000 / elapsedMs;
130
+ }
131
+ function sampleEventLoopUtilization() {
132
+ const eventLoopUtilization = performance.eventLoopUtilization;
133
+ if (typeof eventLoopUtilization !== "function")
134
+ return { idle: 0, active: 0, utilization: 0 };
135
+ try {
136
+ const sample = eventLoopUtilization.call(performance);
137
+ return {
138
+ idle: numberProperty(sample, "idle"),
139
+ active: numberProperty(sample, "active"),
140
+ utilization: numberProperty(sample, "utilization"),
141
+ };
142
+ }
143
+ catch {
144
+ return { idle: 0, active: 0, utilization: 0 };
145
+ }
146
+ }
147
+ function eventLoopUtilizationDelta(end, start) {
148
+ const idle = Math.max(0, end.idle - start.idle);
149
+ const active = Math.max(0, end.active - start.active);
150
+ const total = idle + active;
151
+ return { idle, active, utilization: total > 0 ? active / total : 0 };
152
+ }
153
+ function sampleActiveResources() {
154
+ const getActiveResourcesInfo = process.getActiveResourcesInfo;
155
+ let types = [];
156
+ if (typeof getActiveResourcesInfo === "function") {
157
+ try {
158
+ const listed = getActiveResourcesInfo.call(process);
159
+ if (Array.isArray(listed)) {
160
+ types = listed.filter((entry) => typeof entry === "string");
161
+ }
162
+ }
163
+ catch {
164
+ types = [];
165
+ }
166
+ }
167
+ const byType = {};
168
+ for (const type of types)
169
+ byType[type] = (byType[type] ?? 0) + 1;
170
+ return { reported: types.length > 0, total: types.length, byType };
171
+ }
172
+ function numberProperty(value, key) {
173
+ if (value === null || typeof value !== "object")
174
+ return 0;
175
+ const candidate = value[key];
176
+ return typeof candidate === "number" && Number.isFinite(candidate) ? candidate : 0;
177
+ }
178
+ function sampleThreads(root) {
179
+ let entries;
180
+ try {
181
+ entries = readdirSync(join(root, "task"));
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ const samples = new Map();
187
+ for (const entry of entries) {
188
+ if (!/^\d+$/.test(entry))
189
+ continue;
190
+ const sample = sampleThread(join(root, "task", entry), Number.parseInt(entry, 10));
191
+ if (sample)
192
+ samples.set(sample.tid, sample);
193
+ }
194
+ return samples;
195
+ }
196
+ function sampleThread(taskDir, tid) {
197
+ let stat;
198
+ try {
199
+ stat = readFileSync(join(taskDir, "stat"), "utf8");
200
+ }
201
+ catch {
202
+ // The thread exited between the directory listing and this read.
203
+ return null;
204
+ }
205
+ const open = stat.indexOf("(");
206
+ const close = stat.lastIndexOf(")");
207
+ if (open < 0 || close < open)
208
+ return null;
209
+ const fields = stat
210
+ .slice(close + 2)
211
+ .trimEnd()
212
+ .split(" ");
213
+ const userTicks = Number.parseInt(fields[11] ?? "", 10);
214
+ const systemTicks = Number.parseInt(fields[12] ?? "", 10);
215
+ if (!Number.isFinite(userTicks) || !Number.isFinite(systemTicks))
216
+ return null;
217
+ const switches = readContextSwitches(join(taskDir, "status"));
218
+ return {
219
+ tid,
220
+ name: stat.slice(open + 1, close),
221
+ state: fields[0] ?? "?",
222
+ userTicks,
223
+ systemTicks,
224
+ voluntary: switches.voluntary,
225
+ nonvoluntary: switches.nonvoluntary,
226
+ waitChannel: readWaitChannel(join(taskDir, "wchan")),
227
+ };
228
+ }
229
+ function readContextSwitches(statusPath) {
230
+ let voluntary = 0;
231
+ let nonvoluntary = 0;
232
+ let status;
233
+ try {
234
+ status = readFileSync(statusPath, "utf8");
235
+ }
236
+ catch {
237
+ return { voluntary, nonvoluntary };
238
+ }
239
+ for (const line of status.split("\n")) {
240
+ const separator = line.indexOf(":");
241
+ if (separator < 0)
242
+ continue;
243
+ const key = line.slice(0, separator);
244
+ if (key !== "voluntary_ctxt_switches" && key !== "nonvoluntary_ctxt_switches")
245
+ continue;
246
+ const parsed = Number.parseInt(line.slice(separator + 1).trim(), 10);
247
+ if (!Number.isFinite(parsed))
248
+ continue;
249
+ if (key === "voluntary_ctxt_switches")
250
+ voluntary = parsed;
251
+ else
252
+ nonvoluntary = parsed;
253
+ }
254
+ return { voluntary, nonvoluntary };
255
+ }
256
+ function readWaitChannel(wchanPath) {
257
+ try {
258
+ const value = readFileSync(wchanPath, "utf8").trim();
259
+ return value === "" ? null : value;
260
+ }
261
+ catch {
262
+ return null;
263
+ }
264
+ }
265
+ function summarizeThreads(start, end, observedMs) {
266
+ const byName = {};
267
+ const items = [];
268
+ for (const sample of end.values()) {
269
+ byName[sample.name] = (byName[sample.name] ?? 0) + 1;
270
+ const baseline = start?.get(sample.tid);
271
+ let window = null;
272
+ if (baseline) {
273
+ const userTicks = Math.max(0, sample.userTicks - baseline.userTicks);
274
+ const systemTicks = Math.max(0, sample.systemTicks - baseline.systemTicks);
275
+ window = {
276
+ userTicks,
277
+ systemTicks,
278
+ cores: coresFromTicks(userTicks + systemTicks, observedMs),
279
+ contextSwitches: {
280
+ voluntary: Math.max(0, sample.voluntary - baseline.voluntary),
281
+ nonvoluntary: Math.max(0, sample.nonvoluntary - baseline.nonvoluntary),
282
+ },
283
+ };
284
+ }
285
+ items.push({
286
+ tid: sample.tid,
287
+ name: sample.name,
288
+ state: sample.state,
289
+ waitChannel: sample.waitChannel,
290
+ lifetime: { userTicks: sample.userTicks, systemTicks: sample.systemTicks },
291
+ window,
292
+ });
293
+ }
294
+ items.sort(compareThreads);
295
+ return { total: items.length, byName, items };
296
+ }
297
+ function coresFromTicks(ticks, elapsedMs) {
298
+ if (!(elapsedMs > 0))
299
+ return 0;
300
+ return ((ticks / PROCFS_CLOCK_TICKS_PER_SECOND) * 1000) / elapsedMs;
301
+ }
302
+ function compareThreads(left, right) {
303
+ const leftCores = left.window?.cores ?? -1;
304
+ const rightCores = right.window?.cores ?? -1;
305
+ if (leftCores !== rightCores)
306
+ return rightCores - leftCores;
307
+ const leftLifetime = left.lifetime.userTicks + left.lifetime.systemTicks;
308
+ const rightLifetime = right.lifetime.userTicks + right.lifetime.systemTicks;
309
+ if (leftLifetime !== rightLifetime)
310
+ return rightLifetime - leftLifetime;
311
+ return left.tid - right.tid;
312
+ }
313
+ function sampleFileDescriptors(root) {
314
+ let entries;
315
+ try {
316
+ entries = readdirSync(join(root, "fd"));
317
+ }
318
+ catch {
319
+ return null;
320
+ }
321
+ const byKind = {
322
+ socket: 0,
323
+ eventpoll: 0,
324
+ timerfd: 0,
325
+ eventfd: 0,
326
+ pipe: 0,
327
+ file: 0,
328
+ other: 0,
329
+ };
330
+ let total = 0;
331
+ for (const entry of entries) {
332
+ let target;
333
+ try {
334
+ target = readlinkSync(join(root, "fd", entry));
335
+ }
336
+ catch {
337
+ // Closed between the listing and the readlink (the listing's own
338
+ // directory handle always lands here).
339
+ continue;
340
+ }
341
+ byKind[classifyFileDescriptor(target)] += 1;
342
+ total += 1;
343
+ }
344
+ return { total, byKind };
345
+ }
346
+ function classifyFileDescriptor(target) {
347
+ if (target.startsWith("socket:"))
348
+ return "socket";
349
+ if (target === "anon_inode:[eventpoll]")
350
+ return "eventpoll";
351
+ if (target === "anon_inode:[timerfd]")
352
+ return "timerfd";
353
+ if (target === "anon_inode:[eventfd]")
354
+ return "eventfd";
355
+ if (target.startsWith("pipe:"))
356
+ return "pipe";
357
+ if (target.startsWith("/"))
358
+ return "file";
359
+ return "other";
360
+ }
@@ -0,0 +1,3 @@
1
+ /** Published @apifuse/provider-sdk version, read from the package manifest; "unknown" when unreadable. */
2
+ export declare function resolveSdkVersion(): string;
3
+ export declare const SDK_VERSION: string;
@@ -0,0 +1,19 @@
1
+ import { readFileSync } from "node:fs";
2
+ /** Published @apifuse/provider-sdk version, read from the package manifest; "unknown" when unreadable. */
3
+ export function resolveSdkVersion() {
4
+ try {
5
+ const packageJsonUrl = new URL("../../package.json", import.meta.url);
6
+ const parsed = JSON.parse(readFileSync(packageJsonUrl, "utf8"));
7
+ if (parsed &&
8
+ typeof parsed === "object" &&
9
+ "version" in parsed &&
10
+ typeof parsed.version === "string") {
11
+ return parsed.version;
12
+ }
13
+ }
14
+ catch {
15
+ // fall through to unknown
16
+ }
17
+ return "unknown";
18
+ }
19
+ export const SDK_VERSION = resolveSdkVersion();
@@ -1 +1,2 @@
1
- export declare function resolveHealthCheckInputDateTokens(value: unknown, now?: Date): unknown;
1
+ export type InputDateTokenCalendar = "KST" | "UTC";
2
+ export declare function resolveHealthCheckInputDateTokens(value: unknown, now?: Date, calendar?: InputDateTokenCalendar): unknown;
@@ -1,20 +1,20 @@
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;
9
- function dateFromKstDaysAhead(daysAhead, now = new Date(), format = "YYYY-MM-DD") {
10
- const kstNow = new Date(now.getTime() + 9 * 60 * 60 * 1000);
11
- const date = new Date(Date.UTC(kstNow.getUTCFullYear(), kstNow.getUTCMonth(), kstNow.getUTCDate() + daysAhead));
8
+ const RELATIVE_DATE_TOKEN = /^\+(\d{1,3})d(?::(YYYYMMDD))?$/i;
9
+ function dateFromDaysAhead(daysAhead, now = new Date(), format = "YYYY-MM-DD", calendar = "KST") {
10
+ const calendarNow = new Date(now.getTime() + (calendar === "KST" ? 9 * 60 * 60 * 1000 : 0));
11
+ const date = new Date(Date.UTC(calendarNow.getUTCFullYear(), calendarNow.getUTCMonth(), calendarNow.getUTCDate() + daysAhead));
12
12
  const isoDate = date.toISOString().slice(0, 10);
13
13
  return format === "YYYYMMDD" ? isoDate.replace(/-/g, "") : isoDate;
14
14
  }
15
- export function resolveHealthCheckInputDateTokens(value, now = new Date()) {
15
+ export function resolveHealthCheckInputDateTokens(value, now = new Date(), calendar = "KST") {
16
16
  if (typeof value === "string") {
17
- const relative = value.match(RELATIVE_KST_DATE_TOKEN);
17
+ const relative = value.match(RELATIVE_DATE_TOKEN);
18
18
  if (!relative)
19
19
  return value;
20
20
  const daysAhead = Number(relative[1]);
@@ -22,16 +22,20 @@ export function resolveHealthCheckInputDateTokens(value, now = new Date()) {
22
22
  return value;
23
23
  }
24
24
  const format = relative[2]?.toUpperCase() === "YYYYMMDD" ? "YYYYMMDD" : "YYYY-MM-DD";
25
- return dateFromKstDaysAhead(daysAhead, now, format);
25
+ return dateFromDaysAhead(daysAhead, now, format, calendar);
26
26
  }
27
27
  if (Array.isArray(value)) {
28
- return value.map((entry) => resolveHealthCheckInputDateTokens(entry, now));
28
+ const resolved = value.map((entry) => resolveHealthCheckInputDateTokens(entry, now, calendar));
29
+ return resolved.some((entry, index) => entry !== value[index]) ? resolved : value;
29
30
  }
30
31
  if (value && typeof value === "object") {
31
- return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
32
+ const resolved = Object.fromEntries(Object.entries(value).map(([key, entry]) => [
32
33
  key,
33
- resolveHealthCheckInputDateTokens(entry, now),
34
+ resolveHealthCheckInputDateTokens(entry, now, calendar),
34
35
  ]));
36
+ return Object.entries(resolved).some(([key, entry]) => entry !== Reflect.get(value, key))
37
+ ? resolved
38
+ : value;
35
39
  }
36
40
  return value;
37
41
  }
@@ -1,4 +1,4 @@
1
- import { PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV, } from "./self-test-token.js";
1
+ import { collectDiagnosticSensitiveValues, SELF_TEST_SENSITIVE_SOURCE_KINDS, } from "./sensitive-values.js";
2
2
  export const SELF_TEST_REDACTED_PLACEHOLDER = "[REDACTED]";
3
3
  /** Maximum length of any string echoed in a self-test response. */
4
4
  export const SELF_TEST_MAX_TEXT_LENGTH = 300;
@@ -16,37 +16,12 @@ const HEADER_SHAPED_SECRETS = [
16
16
  * credential inputs.
17
17
  */
18
18
  export function collectSelfTestSensitiveValues(provider, options = {}) {
19
- const env = options.env ?? process.env;
20
- const envNames = new Set([
21
- PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV,
22
- PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV,
23
- ]);
24
- for (const secret of provider.secrets ?? []) {
25
- envNames.add(secret.name);
26
- }
27
- const healthProbe = provider.healthProbe ?? provider.healthMonitor;
28
- for (const name of healthProbe?.requiredSecrets ?? []) {
29
- envNames.add(name);
30
- }
31
- for (const name of Object.values(healthProbe?.credentialInputs ?? {})) {
32
- envNames.add(name);
33
- }
34
- const values = new Set();
35
- for (const name of envNames) {
36
- const value = env[name];
37
- if (typeof value === "string" && value.length >= MIN_SENSITIVE_VALUE_LENGTH) {
38
- values.add(value);
39
- }
40
- }
41
- for (const value of Object.values(options.credentialInputs ?? {})) {
42
- if (value.length >= MIN_SENSITIVE_VALUE_LENGTH) {
43
- values.add(value);
44
- }
45
- }
46
- return [...values];
47
- }
48
- function escapeRegExp(value) {
49
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
19
+ return collectDiagnosticSensitiveValues(provider, {
20
+ ...options,
21
+ sourceKinds: SELF_TEST_SENSITIVE_SOURCE_KINDS,
22
+ minimumLength: MIN_SENSITIVE_VALUE_LENGTH,
23
+ includeResolvedEnvVariants: false,
24
+ });
50
25
  }
51
26
  /**
52
27
  * Scrubs known secret values and header-shaped credentials from a string and
@@ -58,7 +33,7 @@ export function redactSelfTestText(text, sensitiveValues, maxLength = SELF_TEST_
58
33
  for (const value of sensitiveValues) {
59
34
  if (value.length < MIN_SENSITIVE_VALUE_LENGTH)
60
35
  continue;
61
- redacted = redacted.replace(new RegExp(escapeRegExp(value), "g"), SELF_TEST_REDACTED_PLACEHOLDER);
36
+ redacted = redacted.replaceAll(value, SELF_TEST_REDACTED_PLACEHOLDER);
62
37
  }
63
38
  for (const pattern of HEADER_SHAPED_SECRETS) {
64
39
  redacted = redacted.replace(pattern, (_match, prefix) => `${prefix}${SELF_TEST_REDACTED_PLACEHOLDER}`);
@@ -51,11 +51,21 @@ export interface SelfTestResponse {
51
51
  result?: SelfTestCaseResult;
52
52
  results: SelfTestCaseResult[];
53
53
  }
54
+ export interface SelfTestCancellationLogEvent {
55
+ level: "info";
56
+ event: "self_test_run_cancelled";
57
+ providerId: string;
58
+ requestId: string;
59
+ operationId: string;
60
+ caseName: string;
61
+ reason: string;
62
+ }
54
63
  export type SelfTestOperationInvoke = (args: {
55
64
  operationId: string;
56
65
  input: unknown;
57
66
  connection?: OperationConnection;
58
67
  requestId: string;
68
+ signal?: AbortSignal;
59
69
  }) => Promise<{
60
70
  status: number;
61
71
  data: unknown;
@@ -78,6 +88,11 @@ export type SelfTestAuthFlowInvoke = (args: {
78
88
  externalRef?: string;
79
89
  input?: Record<string, unknown>;
80
90
  context?: Record<string, unknown>;
91
+ /** Opaque engine state from the previous turn (`engine` in the auth response), sent verbatim. */
92
+ engine?: {
93
+ egressLease: string;
94
+ };
95
+ signal?: AbortSignal;
81
96
  }) => Promise<{
82
97
  status: number;
83
98
  body: unknown;
@@ -112,6 +127,8 @@ export interface SelfTestAppOptions {
112
127
  requestBudgetMs?: number;
113
128
  /** Env override for secret collection + budget resolution (tests). */
114
129
  env?: Readonly<Record<string, string | undefined>>;
130
+ /** Structured server logger; defaults to the same JSON console shape as the provider server. */
131
+ logger?: (event: SelfTestCancellationLogEvent) => void;
115
132
  }
116
133
  /**
117
134
  * Stable sha256 over the provider's declared health plan (operations, case
@@ -121,9 +138,7 @@ export interface SelfTestAppOptions {
121
138
  export declare function computeSelfTestPlanDigest(provider: ProviderDefinition): string;
122
139
  /**
123
140
  * Fail-closed read-only classification: an operation may self-test only when
124
- * its own metadata marks it read-only (annotations.readOnly or
125
- * toolRouter.riskClass "read") and nothing marks it side-effecting. Unclassified
126
- * operations are refused so the endpoint cannot become a mutation oracle.
141
+ * its authored safety source of truth classifies it as read-only.
127
142
  */
128
143
  export declare function isSelfTestReadOnlyOperation(operation: OperationDefinition): boolean;
129
144
  /** Binds the self-test executor to a tenant app's /v1 pipeline in-process. */