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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/AUTHORING.md +537 -33
  2. package/CHANGELOG.md +205 -1
  3. package/README.md +83 -22
  4. package/SUBMISSION.md +2 -2
  5. package/bin/apifuse-check.ts +165 -11
  6. package/bin/apifuse-dev.ts +57 -13
  7. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  8. package/bin/apifuse-migrate-shape.ts +202 -0
  9. package/bin/apifuse-pack-check.ts +22 -2
  10. package/bin/apifuse-pack-smoke.ts +57 -2
  11. package/bin/apifuse-pack-types.ts +357 -38
  12. package/bin/apifuse-perf.ts +14 -13
  13. package/bin/apifuse-record.ts +709 -72
  14. package/bin/apifuse-submit-check.ts +2344 -324
  15. package/bin/apifuse-sync-assets.ts +117 -0
  16. package/bin/submit-check-delimited-text.ts +50 -0
  17. package/dist/auth-turn/index.d.ts +3 -3
  18. package/dist/auth-turn/index.js +1 -1
  19. package/dist/auth.d.ts +14 -0
  20. package/dist/auth.js +67 -0
  21. package/dist/ceremonies/index.d.ts +16 -0
  22. package/dist/ceremonies/index.js +141 -36
  23. package/dist/cli/commands.d.ts +1 -1
  24. package/dist/cli/commands.js +27 -0
  25. package/dist/cli/create.d.ts +4 -1
  26. package/dist/cli/create.js +42 -37
  27. package/dist/cli/migrate-operation-declaration.d.ts +59 -0
  28. package/dist/cli/migrate-operation-declaration.js +1249 -0
  29. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  30. package/dist/cli/migrate-operation-shape.js +113 -0
  31. package/dist/cli/migrate-provider-shape.d.ts +52 -0
  32. package/dist/cli/migrate-provider-shape.js +578 -0
  33. package/dist/cli/prompt-assets.d.ts +80 -0
  34. package/dist/cli/prompt-assets.js +743 -0
  35. package/dist/cli/templates/provider/AGENTS.md.tpl +17 -8
  36. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  37. package/dist/cli/templates/provider/README.md.tpl +5 -5
  38. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  39. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  40. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  41. package/dist/config/loader.d.ts +179 -16
  42. package/dist/config/loader.js +435 -127
  43. package/dist/contract-serialization.js +4 -8
  44. package/dist/contract-types.d.ts +12 -5
  45. package/dist/contract.js +24 -10
  46. package/dist/declaration-validation.d.ts +33 -0
  47. package/dist/declaration-validation.js +266 -0
  48. package/dist/define.d.ts +66 -29
  49. package/dist/define.js +778 -69
  50. package/dist/dev.d.ts +3 -0
  51. package/dist/dev.js +1 -1
  52. package/dist/engine.d.ts +78 -0
  53. package/dist/engine.js +133 -0
  54. package/dist/error-observability.d.ts +7 -0
  55. package/dist/error-observability.js +61 -0
  56. package/dist/error-resolution.d.ts +4 -0
  57. package/dist/error-resolution.js +122 -0
  58. package/dist/errors.d.ts +33 -0
  59. package/dist/errors.js +40 -0
  60. package/dist/fixture-sanitization.d.ts +28 -0
  61. package/dist/fixture-sanitization.js +227 -0
  62. package/dist/health-scenario.d.ts +1842 -0
  63. package/dist/health-scenario.js +624 -0
  64. package/dist/index.d.ts +21 -10
  65. package/dist/index.js +12 -7
  66. package/dist/lint.d.ts +23 -11
  67. package/dist/lint.js +572 -69
  68. package/dist/native-address.d.ts +43 -0
  69. package/dist/native-address.js +281 -0
  70. package/dist/native-egress-policy.d.ts +31 -0
  71. package/dist/native-egress-policy.js +288 -0
  72. package/dist/observability.d.ts +5 -2
  73. package/dist/observability.js +48 -1
  74. package/dist/provider.d.ts +10 -2
  75. package/dist/provider.js +4 -1
  76. package/dist/runtime/auth-flow.d.ts +5 -1
  77. package/dist/runtime/auth-flow.js +6 -0
  78. package/dist/runtime/browser.d.ts +1 -0
  79. package/dist/runtime/browser.js +492 -49
  80. package/dist/runtime/cache.d.ts +1 -0
  81. package/dist/runtime/cache.js +169 -15
  82. package/dist/runtime/choice-wordlist.d.ts +9 -0
  83. package/dist/runtime/choice-wordlist.js +138 -0
  84. package/dist/runtime/choice.d.ts +13 -1
  85. package/dist/runtime/choice.js +490 -102
  86. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  87. package/dist/runtime/chrome149-header-order.js +289 -0
  88. package/dist/runtime/env.js +12 -0
  89. package/dist/runtime/executor.d.ts +3 -2
  90. package/dist/runtime/executor.js +26 -25
  91. package/dist/runtime/http.d.ts +1 -0
  92. package/dist/runtime/http.js +515 -53
  93. package/dist/runtime/insights.js +2 -2
  94. package/dist/runtime/instrumentation.d.ts +2 -2
  95. package/dist/runtime/instrumentation.js +366 -8
  96. package/dist/runtime/native-network-errors.d.ts +33 -0
  97. package/dist/runtime/native-network-errors.js +69 -0
  98. package/dist/runtime/native-network.d.ts +96 -0
  99. package/dist/runtime/native-network.js +1232 -0
  100. package/dist/runtime/ocr.d.ts +29 -0
  101. package/dist/runtime/ocr.js +440 -0
  102. package/dist/runtime/otlp.d.ts +71 -2
  103. package/dist/runtime/otlp.js +397 -16
  104. package/dist/runtime/proxy-errors.js +6 -2
  105. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  106. package/dist/runtime/proxy-nodemaven.js +146 -0
  107. package/dist/runtime/proxy-telemetry.d.ts +80 -1
  108. package/dist/runtime/proxy-telemetry.js +154 -47
  109. package/dist/runtime/redirects.d.ts +29 -0
  110. package/dist/runtime/redirects.js +36 -0
  111. package/dist/runtime/redis.d.ts +1 -1
  112. package/dist/runtime/redis.js +4 -2
  113. package/dist/runtime/request-options.d.ts +68 -1
  114. package/dist/runtime/request-options.js +548 -0
  115. package/dist/runtime/resolver-config.d.ts +6 -0
  116. package/dist/runtime/resolver-config.js +6 -0
  117. package/dist/runtime/resolver-public.d.ts +1 -0
  118. package/dist/runtime/resolver-public.js +1 -0
  119. package/dist/runtime/resolver-shared.d.ts +14 -0
  120. package/dist/runtime/resolver-shared.js +12 -0
  121. package/dist/runtime/resolver-vendors/bindings.d.ts +48 -0
  122. package/dist/runtime/resolver-vendors/bindings.js +40 -0
  123. package/dist/runtime/resolver-vendors/browser.d.ts +22 -0
  124. package/dist/runtime/resolver-vendors/browser.js +377 -0
  125. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  126. package/dist/runtime/resolver-vendors/capsolver.js +531 -0
  127. package/dist/runtime/resolver-vendors/hosts.d.ts +2 -0
  128. package/dist/runtime/resolver-vendors/hosts.js +33 -0
  129. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  130. package/dist/runtime/resolver-vendors/twocaptcha.js +408 -0
  131. package/dist/runtime/resolver-vendors/types.d.ts +94 -0
  132. package/dist/runtime/resolver-vendors/types.js +96 -0
  133. package/dist/runtime/resolver.d.ts +72 -0
  134. package/dist/runtime/resolver.js +771 -0
  135. package/dist/runtime/secrets.d.ts +27 -0
  136. package/dist/runtime/secrets.js +51 -0
  137. package/dist/runtime/state.d.ts +3 -0
  138. package/dist/runtime/state.js +277 -71
  139. package/dist/runtime/stealth-cookies.d.ts +20 -0
  140. package/dist/runtime/stealth-cookies.js +111 -0
  141. package/dist/runtime/stealth.d.ts +41 -5
  142. package/dist/runtime/stealth.js +997 -291
  143. package/dist/runtime/stt.js +1 -12
  144. package/dist/runtime/timeout.d.ts +5 -0
  145. package/dist/runtime/timeout.js +12 -0
  146. package/dist/runtime/trace-config.d.ts +12 -0
  147. package/dist/runtime/trace-config.js +62 -0
  148. package/dist/runtime/trace.d.ts +5 -0
  149. package/dist/runtime/trace.js +43 -10
  150. package/dist/serve.d.ts +1 -1
  151. package/dist/serve.js +1 -1
  152. package/dist/server/error-observability.d.ts +1 -0
  153. package/dist/server/error-observability.js +1 -0
  154. package/dist/server/index.d.ts +5 -2
  155. package/dist/server/index.js +2 -2
  156. package/dist/server/self-test-input-tokens.d.ts +2 -1
  157. package/dist/server/self-test-input-tokens.js +18 -14
  158. package/dist/server/self-test.d.ts +14 -3
  159. package/dist/server/self-test.js +129 -58
  160. package/dist/server/serve-implementation.d.ts +230 -0
  161. package/dist/server/serve-implementation.js +2265 -0
  162. package/dist/server/serve.d.ts +1 -70
  163. package/dist/server/serve.js +1 -1131
  164. package/dist/server/trace-output.d.ts +6 -0
  165. package/dist/server/trace-output.js +79 -0
  166. package/dist/server/types.d.ts +30 -5
  167. package/dist/server/types.js +13 -1
  168. package/dist/stateful/errors.d.ts +19 -0
  169. package/dist/stateful/errors.js +24 -0
  170. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  171. package/dist/stateful/http-provider-event-emitter.js +237 -0
  172. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  173. package/dist/stateful/http-session-owner-registry.js +210 -0
  174. package/dist/stateful/index.d.ts +18 -0
  175. package/dist/stateful/index.js +18 -0
  176. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  177. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  178. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  179. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  180. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  181. package/dist/stateful/provider-event-pipeline.js +1 -0
  182. package/dist/stateful/provider-events.d.ts +101 -0
  183. package/dist/stateful/provider-events.js +289 -0
  184. package/dist/stateful/session-key.d.ts +15 -0
  185. package/dist/stateful/session-key.js +86 -0
  186. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  187. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  188. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  189. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  190. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  191. package/dist/stateful/stateful-provider-adapter.js +287 -0
  192. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  193. package/dist/stateful/stateful-provider-observability.js +161 -0
  194. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  195. package/dist/stateful/stateful-provider-owner-forwarder.js +215 -0
  196. package/dist/stateful/stateful-provider-runtime-context.d.ts +32 -0
  197. package/dist/stateful/stateful-provider-runtime-context.js +60 -0
  198. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  199. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  200. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  201. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  202. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  203. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  204. package/dist/stateful-signing.d.ts +18 -0
  205. package/dist/stateful-signing.js +27 -0
  206. package/dist/stealth/profiles.d.ts +9 -4
  207. package/dist/stealth/profiles.js +160 -211
  208. package/dist/stream-evidence.d.ts +74 -0
  209. package/dist/stream-evidence.js +785 -0
  210. package/dist/stream.js +7 -1
  211. package/dist/testing/index.d.ts +2 -1
  212. package/dist/testing/index.js +2 -1
  213. package/dist/testing/run.d.ts +32 -2
  214. package/dist/testing/run.js +489 -21
  215. package/dist/trace-sanitization.d.ts +5 -0
  216. package/dist/trace-sanitization.js +45 -0
  217. package/dist/types.d.ts +673 -131
  218. package/dist/types.js +1 -0
  219. package/package.json +45 -5
  220. package/src/auth-turn/index.ts +1 -1
  221. package/src/auth.ts +118 -0
  222. package/src/ceremonies/index.ts +189 -46
  223. package/src/cli/__tests__/fixtures/migrate-operation-declaration/approval-override.ts.txt +6 -0
  224. package/src/cli/__tests__/fixtures/migrate-operation-declaration/codemod-syntax.ts.txt +3 -0
  225. package/src/cli/__tests__/fixtures/migrate-operation-declaration/connection-precedence.ts.txt +10 -0
  226. package/src/cli/__tests__/fixtures/migrate-operation-declaration/docs-conflict.ts.txt +8 -0
  227. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-hoisted-array-spread.ts.txt +15 -0
  228. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-imported-array-spread.ts.txt +9 -0
  229. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-map.ts.txt +5 -0
  230. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-mixed-array-spread.ts.txt +24 -0
  231. package/src/cli/__tests__/fixtures/migrate-operation-declaration/examples-operation.ts.txt +16 -0
  232. package/src/cli/__tests__/fixtures/migrate-operation-declaration/factory-map.ts.txt +3 -0
  233. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoist-all.ts.txt +31 -0
  234. package/src/cli/__tests__/fixtures/migrate-operation-declaration/hoisted-const.ts.txt +11 -0
  235. package/src/cli/__tests__/fixtures/migrate-operation-declaration/imported-spread.ts.txt +11 -0
  236. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-map.ts.txt +11 -0
  237. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-cast-tail.ts.txt +21 -0
  238. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-ekitan.ts.txt +11 -0
  239. package/src/cli/__tests__/fixtures/migrate-operation-declaration/inline-spread-override.ts.txt +14 -0
  240. package/src/cli/__tests__/fixtures/migrate-operation-declaration/missing-english-locale.ts.txt +7 -0
  241. package/src/cli/__tests__/fixtures/migrate-operation-declaration/no-safety.ts.txt +6 -0
  242. package/src/cli/__tests__/fixtures/migrate-operation-declaration/non-literal.ts.txt +7 -0
  243. package/src/cli/__tests__/fixtures/migrate-operation-declaration/redundant-approval.ts.txt +6 -0
  244. package/src/cli/__tests__/fixtures/migrate-operation-declaration/safety-conflict.ts.txt +7 -0
  245. package/src/cli/__tests__/fixtures/migrate-operation-declaration/stream.ts.txt +7 -0
  246. package/src/cli/__tests__/fixtures/migrate-operation-declaration/tool-router-spread.ts.txt +15 -0
  247. package/src/cli/__tests__/fixtures/migrate-operation-declaration/unparseable.ts.txt +4 -0
  248. package/src/cli/__tests__/fixtures/migrate-operation-declaration/verbatim-template.ts.txt +12 -0
  249. package/src/cli/commands.ts +33 -0
  250. package/src/cli/create.ts +50 -37
  251. package/src/cli/migrate-operation-declaration.ts +1751 -0
  252. package/src/cli/migrate-operation-shape.ts +184 -0
  253. package/src/cli/migrate-provider-shape.ts +772 -0
  254. package/src/cli/prompt-assets.ts +865 -0
  255. package/src/cli/templates/provider/AGENTS.md.tpl +17 -8
  256. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  257. package/src/cli/templates/provider/README.md.tpl +5 -5
  258. package/src/cli/templates/provider/index.ts.tpl +6 -3
  259. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  260. package/src/cli/templates/provider/provider.json.tpl +6 -0
  261. package/src/config/loader.ts +690 -163
  262. package/src/contract-serialization.ts +5 -7
  263. package/src/contract-types.ts +12 -5
  264. package/src/contract.ts +24 -10
  265. package/src/declaration-validation.ts +330 -0
  266. package/src/define.ts +1048 -131
  267. package/src/dev.ts +4 -1
  268. package/src/engine.ts +279 -0
  269. package/src/error-observability.ts +64 -0
  270. package/src/error-resolution.ts +127 -0
  271. package/src/errors.ts +68 -0
  272. package/src/fixture-sanitization.ts +264 -0
  273. package/src/health-scenario.ts +875 -0
  274. package/src/index.ts +220 -13
  275. package/src/lint.ts +698 -90
  276. package/src/native-address.ts +340 -0
  277. package/src/native-egress-policy.ts +358 -0
  278. package/src/observability.ts +51 -1
  279. package/src/provider.ts +161 -3
  280. package/src/runtime/auth-flow.ts +12 -0
  281. package/src/runtime/browser.ts +661 -63
  282. package/src/runtime/cache.ts +189 -14
  283. package/src/runtime/choice-wordlist.ts +145 -0
  284. package/src/runtime/choice.ts +631 -120
  285. package/src/runtime/chrome149-header-order.ts +330 -0
  286. package/src/runtime/env.ts +13 -0
  287. package/src/runtime/executor.ts +43 -31
  288. package/src/runtime/http.ts +641 -61
  289. package/src/runtime/insights.ts +2 -2
  290. package/src/runtime/instrumentation.ts +520 -15
  291. package/src/runtime/native-network-errors.ts +99 -0
  292. package/src/runtime/native-network.ts +1605 -0
  293. package/src/runtime/ocr.ts +523 -0
  294. package/src/runtime/otlp.ts +467 -21
  295. package/src/runtime/proxy-errors.ts +12 -4
  296. package/src/runtime/proxy-nodemaven.ts +221 -0
  297. package/src/runtime/proxy-telemetry.ts +244 -75
  298. package/src/runtime/redirects.ts +66 -0
  299. package/src/runtime/redis.ts +7 -2
  300. package/src/runtime/request-options.ts +680 -1
  301. package/src/runtime/resolver-config.ts +6 -0
  302. package/src/runtime/resolver-public.ts +23 -0
  303. package/src/runtime/resolver-shared.ts +33 -0
  304. package/src/runtime/resolver-vendors/bindings.ts +56 -0
  305. package/src/runtime/resolver-vendors/browser.ts +533 -0
  306. package/src/runtime/resolver-vendors/capsolver.ts +707 -0
  307. package/src/runtime/resolver-vendors/hosts.ts +38 -0
  308. package/src/runtime/resolver-vendors/twocaptcha.ts +540 -0
  309. package/src/runtime/resolver-vendors/types.ts +212 -0
  310. package/src/runtime/resolver.ts +1157 -0
  311. package/src/runtime/secrets.ts +64 -0
  312. package/src/runtime/state.ts +394 -77
  313. package/src/runtime/stealth-cookies.ts +132 -0
  314. package/src/runtime/stealth.ts +1280 -336
  315. package/src/runtime/stt.ts +1 -19
  316. package/src/runtime/timeout.ts +18 -0
  317. package/src/runtime/trace-config.ts +78 -0
  318. package/src/runtime/trace.ts +57 -17
  319. package/src/serve.ts +6 -1
  320. package/src/server/error-observability.ts +1 -0
  321. package/src/server/index.ts +34 -2
  322. package/src/server/self-test-input-tokens.ts +29 -14
  323. package/src/server/self-test.ts +191 -68
  324. package/src/server/serve-implementation.ts +3378 -0
  325. package/src/server/serve.ts +1 -1632
  326. package/src/server/trace-output.ts +129 -0
  327. package/src/server/types.ts +13 -1
  328. package/src/stateful/README.md +146 -0
  329. package/src/stateful/errors.ts +35 -0
  330. package/src/stateful/http-provider-event-emitter.ts +314 -0
  331. package/src/stateful/http-session-owner-registry.ts +306 -0
  332. package/src/stateful/index.ts +18 -0
  333. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  334. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  335. package/src/stateful/provider-event-pipeline.ts +61 -0
  336. package/src/stateful/provider-events.ts +462 -0
  337. package/src/stateful/session-key.ts +111 -0
  338. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  339. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  340. package/src/stateful/stateful-provider-adapter.ts +562 -0
  341. package/src/stateful/stateful-provider-observability.ts +261 -0
  342. package/src/stateful/stateful-provider-owner-forwarder.ts +287 -0
  343. package/src/stateful/stateful-provider-runtime-context.ts +92 -0
  344. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  345. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  346. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  347. package/src/stateful-signing.ts +46 -0
  348. package/src/stealth/profiles.ts +202 -231
  349. package/src/stream-evidence.ts +988 -0
  350. package/src/stream.ts +8 -1
  351. package/src/testing/index.ts +10 -1
  352. package/src/testing/run.ts +658 -15
  353. package/src/trace-sanitization.ts +63 -0
  354. package/src/types.ts +788 -174
  355. package/dist/cli/templates/provider/CLAUDE.md.tpl +0 -1
  356. package/src/cli/templates/provider/CLAUDE.md.tpl +0 -1
  357. /package/dist/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  358. /package/dist/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  359. /package/dist/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  360. /package/dist/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  361. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  362. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
  363. /package/src/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  364. /package/src/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  365. /package/src/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  366. /package/src/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  367. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  368. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
@@ -5,6 +5,7 @@ export type ProviderCacheOptions = {
5
5
  memoryMaxEntries?: number;
6
6
  now?: () => number;
7
7
  };
8
+ export declare const APIFUSE__CACHE__KEY_PEPPER_ENV = "APIFUSE__CACHE__KEY_PEPPER";
8
9
  export declare function createProviderCache(options: ProviderCacheOptions): ProviderCache;
9
10
  export declare function createBypassProviderCache(options: Pick<ProviderCacheOptions, "providerId">): ProviderCache;
10
11
  export declare function resetProviderCacheForTests(): void;
@@ -1,9 +1,12 @@
1
- import { createHash } from "node:crypto";
1
+ import { createHash, createHmac } from "node:crypto";
2
2
  import { providerCacheRedisUrlFromEnv } from "../config/loader.js";
3
+ import { ProviderError } from "../errors.js";
3
4
  import { createProviderRedisClient, ensureRedisReady, withRedisTimeout, } from "./redis.js";
5
+ export const APIFUSE__CACHE__KEY_PEPPER_ENV = "APIFUSE__CACHE__KEY_PEPPER";
4
6
  const DEFAULT_PREFIX = "apifuse:provider-cache:v1";
5
7
  const DEFAULT_MEMORY_MAX_ENTRIES = 1_000;
6
8
  const DEFAULT_REDIS_TIMEOUT_MS = 150;
9
+ const SECRET_SCOPED_KEY_MARKER = "[secret-scoped";
7
10
  const SECRET_FIELD_NAMES = new Set([
8
11
  "authorization",
9
12
  "cookie",
@@ -18,6 +21,7 @@ const SECRET_FIELD_NAMES = new Set([
18
21
  "refresh_token",
19
22
  ]);
20
23
  const sharedBackends = new Map();
24
+ let warnedAboutUnpepperedSecretKeys = false;
21
25
  function backendKey(redisUrl) {
22
26
  return redisUrl ?? "memory";
23
27
  }
@@ -55,20 +59,157 @@ function shouldRedactField(name, extra) {
55
59
  normalized.includes("password") ||
56
60
  normalized.includes("secret"));
57
61
  }
58
- function normalizeKeyPart(value, extra) {
62
+ function unsupportedSecretValue(path, reason) {
63
+ throw new ProviderError(`Secret cache-key values must be JSON-safe; ${reason} at ${path}.`, {
64
+ code: "CACHE_KEY_SECRET_VALUE_UNSUPPORTED",
65
+ fix: "Convert the secret cache-key selector to JSON-safe primitives, arrays, or plain objects.",
66
+ });
67
+ }
68
+ function assertJsonSafeSecretValue(value, reportedPath, ancestors = new Set()) {
69
+ if (value === undefined)
70
+ return;
71
+ if (value === null || typeof value === "string" || typeof value === "boolean")
72
+ return;
73
+ if (typeof value === "number") {
74
+ if (!Number.isFinite(value))
75
+ unsupportedSecretValue(reportedPath, "non-finite numbers are unsupported");
76
+ if (Object.is(value, -0))
77
+ unsupportedSecretValue(reportedPath, "negative zero is unsupported");
78
+ return;
79
+ }
80
+ if (typeof value !== "object") {
81
+ unsupportedSecretValue(reportedPath, `${typeof value} values are unsupported`);
82
+ }
83
+ if (ancestors.has(value))
84
+ unsupportedSecretValue(reportedPath, "cyclic values are unsupported");
85
+ ancestors.add(value);
86
+ try {
87
+ if (Array.isArray(value)) {
88
+ if (Object.getOwnPropertySymbols(value).length > 0) {
89
+ unsupportedSecretValue(reportedPath, "symbol-keyed array properties are unsupported");
90
+ }
91
+ const expectedNames = new Set(["length"]);
92
+ for (let index = 0; index < value.length; index += 1) {
93
+ const key = String(index);
94
+ expectedNames.add(key);
95
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
96
+ if (!descriptor)
97
+ unsupportedSecretValue(reportedPath, "sparse arrays are unsupported");
98
+ if (!descriptor.enumerable || !("value" in descriptor)) {
99
+ unsupportedSecretValue(reportedPath, "array accessors are unsupported");
100
+ }
101
+ assertJsonSafeSecretValue(descriptor.value, reportedPath, ancestors);
102
+ }
103
+ if (Object.getOwnPropertyNames(value).some((name) => !expectedNames.has(name))) {
104
+ unsupportedSecretValue(reportedPath, "custom array properties are unsupported");
105
+ }
106
+ return;
107
+ }
108
+ const prototype = Object.getPrototypeOf(value);
109
+ if (prototype !== Object.prototype && prototype !== null) {
110
+ unsupportedSecretValue(reportedPath, "non-plain objects are unsupported");
111
+ }
112
+ if (Object.getOwnPropertySymbols(value).length > 0) {
113
+ unsupportedSecretValue(reportedPath, "symbol-keyed properties are unsupported");
114
+ }
115
+ for (const key of Object.getOwnPropertyNames(value)) {
116
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
117
+ if (!descriptor?.enumerable || !("value" in descriptor)) {
118
+ unsupportedSecretValue(reportedPath, "non-enumerable properties and accessors are unsupported");
119
+ }
120
+ assertJsonSafeSecretValue(descriptor.value, reportedPath, ancestors);
121
+ }
122
+ }
123
+ finally {
124
+ ancestors.delete(value);
125
+ }
126
+ }
127
+ function containsUndefined(value) {
128
+ if (value === undefined)
129
+ return true;
130
+ if (Array.isArray(value))
131
+ return value.some(containsUndefined);
132
+ if (isRecord(value))
133
+ return Object.values(value).some(containsUndefined);
134
+ return false;
135
+ }
136
+ function tagSecretValue(value) {
137
+ if (value === undefined)
138
+ return ["undefined"];
139
+ if (value === null)
140
+ return ["null"];
141
+ if (typeof value === "string")
142
+ return ["string", value];
143
+ if (typeof value === "number")
144
+ return ["number", value];
145
+ if (typeof value === "boolean")
146
+ return ["boolean", value];
147
+ if (Array.isArray(value))
148
+ return ["array", value.map(tagSecretValue)];
149
+ return [
150
+ "object",
151
+ Object.entries(value).map(([key, entry]) => [
152
+ key,
153
+ tagSecretValue(entry),
154
+ ]),
155
+ ];
156
+ }
157
+ function serializeSecretValue(value) {
158
+ if (!containsUndefined(value))
159
+ return JSON.stringify([value]);
160
+ return `undefined-v1:${JSON.stringify(tagSecretValue(value))}`;
161
+ }
162
+ function warnAboutUnpepperedSecretKey() {
163
+ if (warnedAboutUnpepperedSecretKeys)
164
+ return;
165
+ warnedAboutUnpepperedSecretKeys = true;
166
+ console.warn(JSON.stringify({
167
+ level: "warn",
168
+ event: "provider_cache_secret_key_unpeppered",
169
+ message: `Secret-bearing cache keys are using unkeyed SHA-256 because ${APIFUSE__CACHE__KEY_PEPPER_ENV} is not configured.`,
170
+ }));
171
+ }
172
+ function normalizeKeyPart(value, extra, pepper) {
59
173
  if (Array.isArray(value)) {
60
- return value.map((entry) => normalizeKeyPart(entry, extra));
174
+ const entries = value.map((entry) => normalizeKeyPart(entry, extra, pepper));
175
+ return {
176
+ value: entries.map((entry) => entry.value),
177
+ secretScoped: entries.some((entry) => entry.secretScoped),
178
+ };
61
179
  }
62
180
  if (isRecord(value)) {
63
- const normalized = {};
181
+ const normalized = Object.create(null);
182
+ let secretScoped = false;
64
183
  for (const key of Object.keys(value).sort()) {
65
- if (shouldRedactField(key, extra))
66
- continue;
67
- normalized[key] = normalizeKeyPart(value[key], extra);
184
+ const part = shouldRedactField(key, extra)
185
+ ? hashSecretValue(value[key], key, extra, pepper)
186
+ : normalizeKeyPart(value[key], extra, pepper);
187
+ normalized[key] = part.value;
188
+ secretScoped ||= part.secretScoped;
68
189
  }
69
- return normalized;
190
+ return { value: normalized, secretScoped };
70
191
  }
71
- return value;
192
+ return { value, secretScoped: false };
193
+ }
194
+ function hashSecretValue(value, fieldName, extra, pepper) {
195
+ assertJsonSafeSecretValue(value, `${fieldName} (inside secret value)`);
196
+ const canonical = serializeSecretValue(normalizeKeyPart(value, extra, pepper).value);
197
+ if (pepper === undefined) {
198
+ warnAboutUnpepperedSecretKey();
199
+ const digest = createHash("sha256").update(canonical).digest("hex");
200
+ return { value: `sha256:${digest}`, secretScoped: true };
201
+ }
202
+ const digest = createHmac("sha256", pepper).update(canonical).digest("hex");
203
+ return { value: `hmac-sha256:${digest}`, secretScoped: true };
204
+ }
205
+ function metadataKeys(events, secretScopedKeys) {
206
+ let secretScopedIndex = 0;
207
+ return Array.from(new Set(events.map((event) => event.key))).map((key) => {
208
+ if (!secretScopedKeys.has(key))
209
+ return key;
210
+ secretScopedIndex += 1;
211
+ return `${SECRET_SCOPED_KEY_MARKER}#${secretScopedIndex}]`;
212
+ });
72
213
  }
73
214
  function stableHash(value) {
74
215
  return createHash("sha256").update(JSON.stringify(value)).digest("hex").slice(0, 32);
@@ -138,10 +279,13 @@ async function withRedisFallback(operation) {
138
279
  }
139
280
  export function createProviderCache(options) {
140
281
  const redisUrl = options.redisUrl ?? providerCacheRedisUrlFromEnv();
282
+ const configuredPepper = process.env[APIFUSE__CACHE__KEY_PEPPER_ENV];
283
+ const pepper = configuredPepper && configuredPepper.length > 0 ? configuredPepper : undefined;
141
284
  const backend = getSharedBackend(redisUrl);
142
285
  const memoryMaxEntries = Math.max(1, options.memoryMaxEntries ?? DEFAULT_MEMORY_MAX_ENTRIES);
143
286
  const now = options.now ?? Date.now;
144
287
  const events = [];
288
+ const secretScopedKeys = new Set();
145
289
  function record(meta) {
146
290
  events.push(meta);
147
291
  }
@@ -266,8 +410,11 @@ export function createProviderCache(options) {
266
410
  return {
267
411
  key(namespace, parts, keyOptions) {
268
412
  const extra = new Set((keyOptions?.redactFields ?? []).map((field) => field.toLowerCase()));
269
- const normalized = normalizeKeyPart(parts, extra);
270
- return `${DEFAULT_PREFIX}:${options.providerId}:${namespace}:${stableHash(normalized)}`;
413
+ const normalized = normalizeKeyPart(parts, extra, pepper);
414
+ const key = `${DEFAULT_PREFIX}:${options.providerId}:${namespace}:${stableHash(normalized.value)}`;
415
+ if (normalized.secretScoped)
416
+ secretScopedKeys.add(key);
417
+ return key;
271
418
  },
272
419
  async get(key) {
273
420
  const result = await read(key);
@@ -312,19 +459,25 @@ export function createProviderCache(options) {
312
459
  return {
313
460
  hit: events.some((event) => event.hit),
314
461
  stale: events.some((event) => event.stale),
315
- keys: Array.from(new Set(events.map((event) => event.key))),
462
+ keys: metadataKeys(events, secretScopedKeys),
316
463
  source: sourceSummary(events),
317
464
  };
318
465
  },
319
466
  };
320
467
  }
321
468
  export function createBypassProviderCache(options) {
469
+ const configuredPepper = process.env[APIFUSE__CACHE__KEY_PEPPER_ENV];
470
+ const pepper = configuredPepper && configuredPepper.length > 0 ? configuredPepper : undefined;
322
471
  const events = [];
472
+ const secretScopedKeys = new Set();
323
473
  return {
324
474
  key(namespace, parts, keyOptions) {
325
475
  const extra = new Set((keyOptions?.redactFields ?? []).map((field) => field.toLowerCase()));
326
- const normalized = normalizeKeyPart(parts, extra);
327
- return `${DEFAULT_PREFIX}:${options.providerId}:${namespace}:${stableHash(normalized)}`;
476
+ const normalized = normalizeKeyPart(parts, extra, pepper);
477
+ const key = `${DEFAULT_PREFIX}:${options.providerId}:${namespace}:${stableHash(normalized.value)}`;
478
+ if (normalized.secretScoped)
479
+ secretScopedKeys.add(key);
480
+ return key;
328
481
  },
329
482
  async get(_key) {
330
483
  return null;
@@ -352,7 +505,7 @@ export function createBypassProviderCache(options) {
352
505
  return {
353
506
  hit: false,
354
507
  stale: false,
355
- keys: Array.from(new Set(events.map((event) => event.key))),
508
+ keys: metadataKeys(events, secretScopedKeys),
356
509
  source: sourceSummary(events),
357
510
  };
358
511
  },
@@ -365,4 +518,5 @@ export function resetProviderCacheForTests() {
365
518
  backend.redis?.disconnect();
366
519
  }
367
520
  sharedBackends.clear();
521
+ warnedAboutUnpepperedSecretKeys = false;
368
522
  }
@@ -0,0 +1,9 @@
1
+ export declare const CHOICE_WORDLIST_SIZE = 1296;
2
+ export declare const CHOICE_WORD_ENTROPY_BITS: number;
3
+ export declare const STANDARD_CHOICE_WORD_COUNT = 4;
4
+ export declare const HIGH_CHOICE_WORD_COUNT = 5;
5
+ export declare const STANDARD_CHOICE_ENTROPY_BITS: number;
6
+ export declare const HIGH_CHOICE_ENTROPY_BITS: number;
7
+ export declare const EFF_SHORT_WORDLIST_2: readonly string[];
8
+ export declare function choiceWordAt(index: number): string;
9
+ export declare function isChoiceWord(value: string): boolean;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Official EFF Short Wordlist #2, embedded unchanged from:
3
+ * https://www.eff.org/files/2016/09/08/eff_short_wordlist_2_0.txt
4
+ *
5
+ * The source's dice-roll column is intentionally omitted; word order is preserved.
6
+ */
7
+ const EFF_SHORT_WORDLIST_2_TEXT = `
8
+ aardvark abandoned abbreviate abdomen abhorrence abiding abnormal abrasion absorbing abundant abyss
9
+ academy accountant acetone achiness acid acoustics acquire acrobat actress acuteness aerosol
10
+ aesthetic affidavit afloat afraid aftershave again agency aggressor aghast agitate agnostic
11
+ agonizing agreeing aidless aimlessly ajar alarmclock albatross alchemy alfalfa algae aliens
12
+ alkaline almanac alongside alphabet already also altitude aluminum always amazingly ambulance
13
+ amendment amiable ammunition amnesty amoeba amplifier amuser anagram anchor android anesthesia
14
+ angelfish animal anklet announcer anonymous answer antelope anxiety anyplace aorta apartment apnea
15
+ apostrophe apple apricot aquamarine arachnid arbitrate ardently arena argument aristocrat armchair
16
+ aromatic arrowhead arsonist artichoke asbestos ascend aseptic ashamed asinine asleep asocial
17
+ asparagus astronaut asymmetric atlas atmosphere atom atrocious attic atypical auctioneer auditorium
18
+ augmented auspicious automobile auxiliary avalanche avenue aviator avocado awareness awhile awkward
19
+ awning awoke axially azalea babbling backpack badass bagpipe bakery balancing bamboo banana
20
+ barracuda basket bathrobe bazooka blade blender blimp blouse blurred boatyard bobcat body bogusness
21
+ bohemian boiler bonnet boots borough bossiness bottle bouquet boxlike breath briefcase broom
22
+ brushes bubblegum buckle buddhist buffalo bullfrog bunny busboy buzzard cabin cactus cadillac
23
+ cafeteria cage cahoots cajoling cakewalk calculator camera canister capsule carrot cashew cathedral
24
+ caucasian caviar ceasefire cedar celery cement census ceramics cesspool chalkboard cheesecake
25
+ chimney chlorine chopsticks chrome chute cilantro cinnamon circle cityscape civilian clay clergyman
26
+ clipboard clock clubhouse coathanger cobweb coconut codeword coexistent coffeecake cognitive
27
+ cohabitate collarbone computer confetti copier cornea cosmetics cotton couch coverless coyote
28
+ coziness crawfish crewmember crib croissant crumble crystal cubical cucumber cuddly cufflink
29
+ cuisine culprit cup curry cushion cuticle cybernetic cyclist cylinder cymbal cynicism cypress
30
+ cytoplasm dachshund daffodil dagger dairy dalmatian dandelion dartboard dastardly datebook daughter
31
+ dawn daytime dazzler dealer debris decal dedicate deepness defrost degree dehydrator deliverer
32
+ democrat dentist deodorant depot deranged desktop detergent device dexterity diamond dibs
33
+ dictionary diffuser digit dilated dimple dinnerware dioxide diploma directory dishcloth ditto
34
+ dividers dizziness doctor dodge doll dominoes donut doorstep dorsal double downstairs dozed
35
+ drainpipe dresser driftwood droppings drum dryer dubiously duckling duffel dugout dumpster duplex
36
+ durable dustpan dutiful duvet dwarfism dwelling dwindling dynamite dyslexia eagerness earlobe easel
37
+ eavesdrop ebook eccentric echoless eclipse ecosystem ecstasy edged editor educator eelworm eerie
38
+ effects eggnog egomaniac ejection elastic elbow elderly elephant elfishly eliminator elk elliptical
39
+ elongated elsewhere elusive elves emancipate embroidery emcee emerald emission emoticon emperor
40
+ emulate enactment enchilada endorphin energy enforcer engine enhance enigmatic enjoyably enlarged
41
+ enormous enquirer enrollment ensemble entryway enunciate envoy enzyme epidemic equipment erasable
42
+ ergonomic erratic eruption escalator eskimo esophagus espresso essay estrogen etching eternal
43
+ ethics etiquette eucalyptus eulogy euphemism euthanize evacuation evergreen evidence evolution exam
44
+ excerpt exerciser exfoliate exhale exist exorcist explode exquisite exterior exuberant fabric
45
+ factory faded failsafe falcon family fanfare fasten faucet favorite feasibly february federal
46
+ feedback feigned feline femur fence ferret festival fettuccine feudalist feverish fiberglass
47
+ fictitious fiddle figurine fillet finalist fiscally fixture flashlight fleshiness flight florist
48
+ flypaper foamless focus foggy folksong fondue footpath fossil fountain fox fragment freeway fridge
49
+ frosting fruit fryingpan gadget gainfully gallstone gamekeeper gangway garlic gaslight gathering
50
+ gauntlet gearbox gecko gem generator geographer gerbil gesture getaway geyser ghoulishly gibberish
51
+ giddiness giftshop gigabyte gimmick giraffe giveaway gizmo glasses gleeful glisten glove glucose
52
+ glycerin gnarly gnomish goatskin goggles goldfish gong gooey gorgeous gosling gothic gourmet
53
+ governor grape greyhound grill groundhog grumbling guacamole guerrilla guitar gullible gumdrop
54
+ gurgling gusto gutless gymnast gynecology gyration habitat hacking haggard haiku halogen hamburger
55
+ handgun happiness hardhat hastily hatchling haughty hazelnut headband hedgehog hefty heinously
56
+ helmet hemoglobin henceforth herbs hesitation hexagon hubcap huddling huff hugeness hullabaloo
57
+ human hunter hurricane hushing hyacinth hybrid hydrant hygienist hypnotist ibuprofen icepack icing
58
+ iconic identical idiocy idly igloo ignition iguana illuminate imaging imbecile imitator immigrant
59
+ imprint iodine ionosphere ipad iphone iridescent irksome iron irrigation island isotope issueless
60
+ italicize itemizer itinerary itunes ivory jabbering jackrabbit jaguar jailhouse jalapeno jamboree
61
+ janitor jarring jasmine jaundice jawbreaker jaywalker jazz jealous jeep jelly jeopardize jersey
62
+ jetski jezebel jiffy jigsaw jingling jobholder jockstrap jogging john joinable jokingly journal
63
+ jovial joystick jubilant judiciary juggle juice jujitsu jukebox jumpiness junkyard juror justifying
64
+ juvenile kabob kamikaze kangaroo karate kayak keepsake kennel kerosene ketchup khaki kickstand
65
+ kilogram kimono kingdom kiosk kissing kite kleenex knapsack kneecap knickers koala krypton
66
+ laboratory ladder lakefront lantern laptop laryngitis lasagna latch laundry lavender laxative
67
+ lazybones lecturer leftover leggings leisure lemon length leopard leprechaun lettuce leukemia
68
+ levers lewdness liability library licorice lifeboat lightbulb likewise lilac limousine lint lioness
69
+ lipstick liquid listless litter liverwurst lizard llama luau lubricant lucidity ludicrous luggage
70
+ lukewarm lullaby lumberjack lunchbox luridness luscious luxurious lyrics macaroni maestro magazine
71
+ mahogany maimed majority makeover malformed mammal mango mapmaker marbles massager matchstick
72
+ maverick maximum mayonnaise moaning mobilize moccasin modify moisture molecule momentum monastery
73
+ moonshine mortuary mosquito motorcycle mousetrap movie mower mozzarella muckiness mudflow mugshot
74
+ mule mummy mundane muppet mural mustard mutation myriad myspace myth nail namesake nanosecond
75
+ napkin narrator nastiness natives nautically navigate nearest nebula nectar nefarious negotiator
76
+ neither nemesis neoliberal nephew nervously nest netting neuron nevermore nextdoor nicotine niece
77
+ nimbleness nintendo nirvana nuclear nugget nuisance nullify numbing nuptials nursery nutcracker
78
+ nylon oasis oat obediently obituary object obliterate obnoxious observer obtain obvious occupation
79
+ oceanic octopus ocular office oftentimes oiliness ointment older olympics omissible omnivorous
80
+ oncoming onion onlooker onstage onward onyx oomph opaquely opera opium opossum opponent optical
81
+ opulently oscillator osmosis ostrich otherwise ought outhouse ovation oven owlish oxford oxidize
82
+ oxygen oyster ozone pacemaker padlock pageant pajamas palm pamphlet pantyhose paprika parakeet
83
+ passport patio pauper pavement payphone pebble peculiarly pedometer pegboard pelican penguin peony
84
+ pepperoni peroxide pesticide petroleum pewter pharmacy pheasant phonebook phrasing physician plank
85
+ pledge plotted plug plywood pneumonia podiatrist poetic pogo poison poking policeman poncho popcorn
86
+ porcupine postcard poultry powerboat prairie pretzel princess propeller prune pry pseudo psychopath
87
+ publisher pucker pueblo pulley pumpkin punchbowl puppy purse pushup putt puzzle pyramid python
88
+ quarters quesadilla quilt quote racoon radish ragweed railroad rampantly rancidity rarity raspberry
89
+ ravishing rearrange rebuilt receipt reentry refinery register rehydrate reimburse rejoicing
90
+ rekindle relic remote renovator reopen reporter request rerun reservoir retriever reunion revolver
91
+ rewrite rhapsody rhetoric rhino rhubarb rhyme ribbon riches ridden rigidness rimmed riptide riskily
92
+ ritzy riverboat roamer robe rocket romancer ropelike rotisserie roundtable royal rubber rudderless
93
+ rugby ruined rulebook rummage running rupture rustproof sabotage sacrifice saddlebag saffron
94
+ sainthood saltshaker samurai sandworm sapphire sardine sassy satchel sauna savage saxophone scarf
95
+ scenario schoolbook scientist scooter scrapbook sculpture scythe secretary sedative segregator
96
+ seismology selected semicolon senator septum sequence serpent sesame settler severely shack shelf
97
+ shirt shovel shrimp shuttle shyness siamese sibling siesta silicon simmering singles sisterhood
98
+ sitcom sixfold sizable skateboard skeleton skies skulk skylight slapping sled slingshot sloth
99
+ slumbering smartphone smelliness smitten smokestack smudge snapshot sneezing sniff snowsuit
100
+ snugness speakers sphinx spider splashing sponge sprout spur spyglass squirrel statue steamboat
101
+ stingray stopwatch strawberry student stylus suave subway suction suds suffocate sugar suitcase
102
+ sulphur superstore surfer sushi swan sweatshirt swimwear sword sycamore syllable symphony synagogue
103
+ syringes systemize tablespoon taco tadpole taekwondo tagalong takeout tallness tamale tanned
104
+ tapestry tarantula tastebud tattoo tavern thaw theater thimble thorn throat thumb thwarting tiara
105
+ tidbit tiebreaker tiger timid tinsel tiptoeing tirade tissue tractor tree tripod trousers trucks
106
+ tryout tubeless tuesday tugboat tulip tumbleweed tupperware turtle tusk tutorial tuxedo tweezers
107
+ twins tyrannical ultrasound umbrella umpire unarmored unbuttoned uncle underwear unevenness
108
+ unflavored ungloved unhinge unicycle unjustly unknown unlocking unmarked unnoticed unopened unpaved
109
+ unquenched unroll unscrewing untied unusual unveiled unwrinkled unyielding unzip upbeat upcountry
110
+ update upfront upgrade upholstery upkeep upload uppercut upright upstairs uptown upwind uranium
111
+ urban urchin urethane urgent urologist username usher utensil utility utmost utopia utterance
112
+ vacuum vagrancy valuables vanquished vaporizer varied vaseline vegetable vehicle velcro vendor
113
+ vertebrae vestibule veteran vexingly vicinity videogame viewfinder vigilante village vinegar violin
114
+ viperfish virus visor vitamins vivacious vixen vocalist vogue voicemail volleyball voucher voyage
115
+ vulnerable waffle wagon wakeup walrus wanderer wasp water waving wheat whisper wholesaler wick
116
+ widow wielder wifeless wikipedia wildcat windmill wipeout wired wishbone wizardry wobbliness
117
+ wolverine womb woolworker workbasket wound wrangle wreckage wristwatch wrongdoing xerox xylophone
118
+ yacht yahoo yard yearbook yesterday yiddish yield yo-yo yodel yogurt yuppie zealot zebra zeppelin
119
+ zestfully zigzagged zillion zipping zirconium zodiac zombie zookeeper zucchini
120
+ `;
121
+ export const CHOICE_WORDLIST_SIZE = 1_296;
122
+ export const CHOICE_WORD_ENTROPY_BITS = Math.log2(CHOICE_WORDLIST_SIZE);
123
+ export const STANDARD_CHOICE_WORD_COUNT = 4;
124
+ export const HIGH_CHOICE_WORD_COUNT = 5;
125
+ export const STANDARD_CHOICE_ENTROPY_BITS = STANDARD_CHOICE_WORD_COUNT * CHOICE_WORD_ENTROPY_BITS;
126
+ export const HIGH_CHOICE_ENTROPY_BITS = HIGH_CHOICE_WORD_COUNT * CHOICE_WORD_ENTROPY_BITS;
127
+ export const EFF_SHORT_WORDLIST_2 = Object.freeze(EFF_SHORT_WORDLIST_2_TEXT.trim().split(/\s+/));
128
+ const EFF_SHORT_WORD_SET = new Set(EFF_SHORT_WORDLIST_2);
129
+ export function choiceWordAt(index) {
130
+ const word = EFF_SHORT_WORDLIST_2[index];
131
+ if (word === undefined) {
132
+ throw new RangeError(`Choice word index is out of range: ${index}`);
133
+ }
134
+ return word;
135
+ }
136
+ export function isChoiceWord(value) {
137
+ return EFF_SHORT_WORD_SET.has(value);
138
+ }
@@ -1,5 +1,15 @@
1
- import type { CredentialContext, EnvContext, ProviderChoiceContext, ProviderRequestContext, ProviderRuntimeState } from "../types.js";
1
+ import type { CredentialContext, EnvContext, ProviderChoiceConsumeMode, ProviderChoiceContext, ProviderRequestContext, ProviderRuntimeState } from "../types.js";
2
2
  export declare const PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV = "APIFUSE__PROVIDER_RUNTIME__CHOICE_TOKEN_MASTER_SECRET";
3
+ export type ProviderChoiceTelemetryEvent = {
4
+ readonly providerId: string;
5
+ readonly purpose: string;
6
+ readonly operation: "parse" | "consume";
7
+ readonly format: "word" | "legacy";
8
+ readonly outcome: "success" | "not-found" | "invalid" | "unsupported" | "error";
9
+ readonly consumeMode: ProviderChoiceConsumeMode;
10
+ readonly consumed: boolean;
11
+ readonly replay: boolean;
12
+ };
3
13
  export type CreateProviderChoiceContextOptions = {
4
14
  readonly providerId: string;
5
15
  readonly env?: EnvContext;
@@ -8,6 +18,8 @@ export type CreateProviderChoiceContextOptions = {
8
18
  readonly state?: ProviderRuntimeState;
9
19
  readonly masterSecret?: string;
10
20
  readonly kid?: string;
21
+ /** Receives allowlisted metadata only; token and payload values are never included. */
22
+ readonly onTelemetry?: (event: ProviderChoiceTelemetryEvent) => void;
11
23
  };
12
24
  export declare function createProviderChoiceContext(options: CreateProviderChoiceContextOptions): ProviderChoiceContext;
13
25
  export declare function createTestProviderChoiceContext(options: Omit<CreateProviderChoiceContextOptions, "masterSecret"> & {