@apifuse/provider-sdk 2.2.0-beta.3 → 2.2.0-beta.31

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 (342) hide show
  1. package/AUTHORING.md +493 -5
  2. package/CHANGELOG.md +131 -1
  3. package/README.md +52 -6
  4. package/SUBMISSION.md +1 -1
  5. package/bin/apifuse-check.ts +106 -62
  6. package/bin/apifuse-create.ts +1 -1
  7. package/bin/apifuse-dev.ts +63 -55
  8. package/bin/apifuse-pack-check.ts +22 -2
  9. package/bin/apifuse-pack-smoke.ts +78 -82
  10. package/bin/apifuse-pack-types.ts +583 -0
  11. package/bin/apifuse-perf.ts +59 -140
  12. package/bin/apifuse-record.ts +698 -113
  13. package/bin/apifuse-submit-check.ts +517 -44
  14. package/bin/apifuse-sync-assets.ts +117 -0
  15. package/bin/apifuse.ts +1 -1
  16. package/bin/submit-check-delimited-text.ts +50 -0
  17. package/bin/submit-check-xml.ts +1 -1
  18. package/dist/auth-turn/index.d.ts +4 -4
  19. package/dist/auth-turn/index.js +1 -1
  20. package/dist/auth.d.ts +16 -2
  21. package/dist/auth.js +76 -18
  22. package/dist/ceremonies/index.d.ts +9 -1
  23. package/dist/ceremonies/index.js +117 -29
  24. package/dist/cli/commands.d.ts +1 -1
  25. package/dist/cli/commands.js +8 -0
  26. package/dist/cli/create.d.ts +3 -0
  27. package/dist/cli/create.js +34 -35
  28. package/dist/cli/prompt-assets.d.ts +80 -0
  29. package/dist/cli/prompt-assets.js +743 -0
  30. package/dist/cli/templates/provider/AGENTS.md.tpl +17 -8
  31. package/dist/cli/templates/provider/README.md.tpl +4 -4
  32. package/dist/config/loader.d.ts +176 -17
  33. package/dist/config/loader.js +434 -161
  34. package/dist/contract-serialization.d.ts +2 -2
  35. package/dist/contract-serialization.js +7 -14
  36. package/dist/contract-types.d.ts +3 -2
  37. package/dist/contract.d.ts +3 -3
  38. package/dist/contract.js +6 -6
  39. package/dist/declaration-validation.d.ts +23 -0
  40. package/dist/declaration-validation.js +159 -0
  41. package/dist/define.d.ts +13 -1
  42. package/dist/define.js +391 -122
  43. package/dist/dev.d.ts +1 -1
  44. package/dist/dev.js +1 -1
  45. package/dist/error-resolution.d.ts +4 -0
  46. package/dist/error-resolution.js +123 -0
  47. package/dist/errors.d.ts +19 -1
  48. package/dist/errors.js +41 -3
  49. package/dist/fixture-sanitization.d.ts +26 -0
  50. package/dist/fixture-sanitization.js +216 -0
  51. package/dist/i18n/catalog.d.ts +2 -2
  52. package/dist/i18n/catalog.js +4 -10
  53. package/dist/i18n/index.d.ts +2 -2
  54. package/dist/i18n/index.js +2 -2
  55. package/dist/i18n/keys.d.ts +2 -2
  56. package/dist/index.d.ts +50 -42
  57. package/dist/index.js +41 -37
  58. package/dist/lint.d.ts +6 -1
  59. package/dist/lint.js +370 -18
  60. package/dist/native-address.d.ts +43 -0
  61. package/dist/native-address.js +281 -0
  62. package/dist/native-egress-policy.d.ts +31 -0
  63. package/dist/native-egress-policy.js +288 -0
  64. package/dist/observability.d.ts +5 -2
  65. package/dist/observability.js +48 -1
  66. package/dist/provider.d.ts +13 -11
  67. package/dist/provider.js +10 -9
  68. package/dist/public-schema-field-lint.d.ts +1 -1
  69. package/dist/recipes/gov-api.js +1 -1
  70. package/dist/runtime/auth-flow.d.ts +3 -1
  71. package/dist/runtime/auth-flow.js +8 -3
  72. package/dist/runtime/browser.d.ts +1 -1
  73. package/dist/runtime/browser.js +138 -40
  74. package/dist/runtime/cache.d.ts +2 -1
  75. package/dist/runtime/cache.js +173 -23
  76. package/dist/runtime/choice-wordlist.d.ts +9 -0
  77. package/dist/runtime/choice-wordlist.js +138 -0
  78. package/dist/runtime/choice.d.ts +14 -1
  79. package/dist/runtime/choice.js +566 -101
  80. package/dist/runtime/credential.d.ts +1 -1
  81. package/dist/runtime/credential.js +1 -1
  82. package/dist/runtime/env.d.ts +1 -1
  83. package/dist/runtime/executor.d.ts +1 -1
  84. package/dist/runtime/executor.js +25 -3
  85. package/dist/runtime/http.d.ts +3 -2
  86. package/dist/runtime/http.js +517 -55
  87. package/dist/runtime/insights.d.ts +1 -1
  88. package/dist/runtime/insights.js +6 -13
  89. package/dist/runtime/instrumentation.d.ts +2 -2
  90. package/dist/runtime/instrumentation.js +371 -23
  91. package/dist/runtime/keyring.js +1 -1
  92. package/dist/runtime/namespace.js +1 -1
  93. package/dist/runtime/native-network-errors.d.ts +33 -0
  94. package/dist/runtime/native-network-errors.js +69 -0
  95. package/dist/runtime/native-network.d.ts +96 -0
  96. package/dist/runtime/native-network.js +1232 -0
  97. package/dist/runtime/ocr.d.ts +29 -0
  98. package/dist/runtime/ocr.js +440 -0
  99. package/dist/runtime/otlp.d.ts +1 -1
  100. package/dist/runtime/perf.d.ts +1 -1
  101. package/dist/runtime/provider.d.ts +1 -1
  102. package/dist/runtime/provider.js +1 -2
  103. package/dist/runtime/proxy-errors.d.ts +1 -1
  104. package/dist/runtime/proxy-errors.js +9 -7
  105. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  106. package/dist/runtime/proxy-nodemaven.js +146 -0
  107. package/dist/runtime/proxy-retry-policy.d.ts +2 -2
  108. package/dist/runtime/proxy-retry-policy.js +2 -2
  109. package/dist/runtime/proxy-telemetry.d.ts +2 -1
  110. package/dist/runtime/proxy-telemetry.js +58 -52
  111. package/dist/runtime/redirects.d.ts +29 -0
  112. package/dist/runtime/redirects.js +36 -0
  113. package/dist/runtime/redis.d.ts +1 -1
  114. package/dist/runtime/redis.js +5 -5
  115. package/dist/runtime/request-options.d.ts +68 -1
  116. package/dist/runtime/request-options.js +548 -0
  117. package/dist/runtime/resolver-config.d.ts +6 -0
  118. package/dist/runtime/resolver-config.js +6 -0
  119. package/dist/runtime/resolver-public.d.ts +1 -0
  120. package/dist/runtime/resolver-public.js +1 -0
  121. package/dist/runtime/resolver-shared.d.ts +3 -0
  122. package/dist/runtime/resolver-shared.js +12 -0
  123. package/dist/runtime/resolver-vendors/bindings.d.ts +48 -0
  124. package/dist/runtime/resolver-vendors/bindings.js +40 -0
  125. package/dist/runtime/resolver-vendors/browser.d.ts +20 -0
  126. package/dist/runtime/resolver-vendors/browser.js +282 -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 +368 -0
  131. package/dist/runtime/resolver-vendors/types.d.ts +83 -0
  132. package/dist/runtime/resolver-vendors/types.js +69 -0
  133. package/dist/runtime/resolver.d.ts +59 -0
  134. package/dist/runtime/resolver.js +705 -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 +5 -2
  138. package/dist/runtime/state.js +280 -74
  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 +30 -5
  142. package/dist/runtime/stealth.js +523 -259
  143. package/dist/runtime/stt.d.ts +1 -1
  144. package/dist/runtime/stt.js +12 -27
  145. package/dist/runtime/timeout.d.ts +5 -0
  146. package/dist/runtime/timeout.js +12 -0
  147. package/dist/runtime/trace.d.ts +2 -2
  148. package/dist/runtime/trace.js +2 -4
  149. package/dist/runtime/waterfall.d.ts +1 -1
  150. package/dist/schema.d.ts +1 -1
  151. package/dist/schema.js +7 -15
  152. package/dist/serve.d.ts +1 -1
  153. package/dist/serve.js +1 -1
  154. package/dist/server/index.d.ts +7 -7
  155. package/dist/server/index.js +6 -6
  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-redaction.d.ts +1 -1
  159. package/dist/server/self-test-redaction.js +1 -1
  160. package/dist/server/self-test.d.ts +117 -3
  161. package/dist/server/self-test.js +787 -151
  162. package/dist/server/serve-implementation.d.ts +210 -0
  163. package/dist/server/serve-implementation.js +2078 -0
  164. package/dist/server/serve.d.ts +1 -70
  165. package/dist/server/serve.js +1 -1143
  166. package/dist/server/types.d.ts +34 -9
  167. package/dist/server/types.js +8 -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 +1 -1
  207. package/dist/stealth/profiles.js +21 -21
  208. package/dist/stream-evidence.d.ts +74 -0
  209. package/dist/stream-evidence.js +785 -0
  210. package/dist/stream.d.ts +1 -1
  211. package/dist/stream.js +7 -1
  212. package/dist/testing/index.d.ts +3 -2
  213. package/dist/testing/index.js +3 -2
  214. package/dist/testing/run.d.ts +32 -2
  215. package/dist/testing/run.js +488 -28
  216. package/dist/types.d.ts +566 -19
  217. package/dist/types.js +1 -0
  218. package/dist/user-input.d.ts +30 -0
  219. package/dist/user-input.js +66 -0
  220. package/package.json +42 -7
  221. package/src/auth-turn/index.ts +2 -2
  222. package/src/auth.ts +146 -86
  223. package/src/ceremonies/index.ts +167 -92
  224. package/src/cli/commands.ts +10 -0
  225. package/src/cli/create.ts +42 -35
  226. package/src/cli/prompt-assets.ts +865 -0
  227. package/src/cli/templates/provider/AGENTS.md.tpl +17 -8
  228. package/src/cli/templates/provider/README.md.tpl +4 -4
  229. package/src/config/loader.ts +667 -289
  230. package/src/contract-serialization.ts +10 -18
  231. package/src/contract-types.ts +3 -2
  232. package/src/contract.ts +14 -28
  233. package/src/declaration-validation.ts +202 -0
  234. package/src/define.ts +631 -495
  235. package/src/dev.ts +4 -9
  236. package/src/error-resolution.ts +128 -0
  237. package/src/errors.ts +56 -11
  238. package/src/fixture-sanitization.ts +247 -0
  239. package/src/i18n/catalog.ts +10 -32
  240. package/src/i18n/index.ts +2 -2
  241. package/src/i18n/keys.ts +5 -11
  242. package/src/index.ts +158 -44
  243. package/src/lint.ts +488 -154
  244. package/src/native-address.ts +340 -0
  245. package/src/native-egress-policy.ts +358 -0
  246. package/src/observability.ts +51 -1
  247. package/src/provider.ts +66 -11
  248. package/src/public-schema-field-lint.ts +7 -33
  249. package/src/recipes/gov-api.ts +2 -5
  250. package/src/runtime/auth-flow.ts +13 -7
  251. package/src/runtime/browser.ts +252 -207
  252. package/src/runtime/cache.ts +209 -81
  253. package/src/runtime/choice-wordlist.ts +145 -0
  254. package/src/runtime/choice.ts +758 -197
  255. package/src/runtime/credential.ts +2 -2
  256. package/src/runtime/env.ts +1 -1
  257. package/src/runtime/executor.ts +37 -19
  258. package/src/runtime/http.ts +645 -65
  259. package/src/runtime/insights.ts +15 -53
  260. package/src/runtime/instrumentation.ts +530 -67
  261. package/src/runtime/keyring.ts +7 -19
  262. package/src/runtime/namespace.ts +2 -7
  263. package/src/runtime/native-network-errors.ts +99 -0
  264. package/src/runtime/native-network.ts +1605 -0
  265. package/src/runtime/ocr.ts +523 -0
  266. package/src/runtime/otlp.ts +12 -23
  267. package/src/runtime/perf.ts +1 -1
  268. package/src/runtime/provider.ts +4 -9
  269. package/src/runtime/proxy-errors.ts +29 -42
  270. package/src/runtime/proxy-nodemaven.ts +221 -0
  271. package/src/runtime/proxy-retry-policy.ts +3 -3
  272. package/src/runtime/proxy-telemetry.ts +84 -77
  273. package/src/runtime/redirects.ts +66 -0
  274. package/src/runtime/redis.ts +10 -13
  275. package/src/runtime/request-options.ts +679 -9
  276. package/src/runtime/resolver-config.ts +6 -0
  277. package/src/runtime/resolver-public.ts +18 -0
  278. package/src/runtime/resolver-shared.ts +17 -0
  279. package/src/runtime/resolver-vendors/bindings.ts +56 -0
  280. package/src/runtime/resolver-vendors/browser.ts +408 -0
  281. package/src/runtime/resolver-vendors/hosts.ts +38 -0
  282. package/src/runtime/resolver-vendors/twocaptcha.ts +500 -0
  283. package/src/runtime/resolver-vendors/types.ts +173 -0
  284. package/src/runtime/resolver.ts +1060 -0
  285. package/src/runtime/secrets.ts +64 -0
  286. package/src/runtime/state.ts +399 -161
  287. package/src/runtime/stealth-cookies.ts +132 -0
  288. package/src/runtime/stealth.ts +681 -295
  289. package/src/runtime/stt.ts +39 -113
  290. package/src/runtime/timeout.ts +18 -0
  291. package/src/runtime/trace.ts +14 -44
  292. package/src/runtime/waterfall.ts +5 -18
  293. package/src/schema.ts +23 -84
  294. package/src/serve.ts +6 -1
  295. package/src/server/index.ts +30 -7
  296. package/src/server/self-test-input-tokens.ts +29 -14
  297. package/src/server/self-test-redaction.ts +2 -2
  298. package/src/server/self-test.ts +1030 -180
  299. package/src/server/serve-implementation.ts +3062 -0
  300. package/src/server/serve.ts +1 -1781
  301. package/src/server/types.ts +12 -13
  302. package/src/stateful/README.md +146 -0
  303. package/src/stateful/errors.ts +35 -0
  304. package/src/stateful/http-provider-event-emitter.ts +314 -0
  305. package/src/stateful/http-session-owner-registry.ts +306 -0
  306. package/src/stateful/index.ts +18 -0
  307. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  308. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  309. package/src/stateful/provider-event-pipeline.ts +61 -0
  310. package/src/stateful/provider-events.ts +462 -0
  311. package/src/stateful/session-key.ts +111 -0
  312. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  313. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  314. package/src/stateful/stateful-provider-adapter.ts +562 -0
  315. package/src/stateful/stateful-provider-observability.ts +261 -0
  316. package/src/stateful/stateful-provider-owner-forwarder.ts +287 -0
  317. package/src/stateful/stateful-provider-runtime-context.ts +92 -0
  318. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  319. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  320. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  321. package/src/stateful-signing.ts +46 -0
  322. package/src/stealth/profiles.ts +27 -33
  323. package/src/stream-evidence.ts +988 -0
  324. package/src/stream.ts +16 -20
  325. package/src/testing/index.ts +11 -2
  326. package/src/testing/run.ts +668 -74
  327. package/src/types.ts +665 -35
  328. package/src/user-input.ts +118 -0
  329. package/dist/cli/templates/provider/CLAUDE.md.tpl +0 -1
  330. package/src/cli/templates/provider/CLAUDE.md.tpl +0 -1
  331. /package/dist/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  332. /package/dist/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  333. /package/dist/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  334. /package/dist/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  335. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  336. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
  337. /package/src/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  338. /package/src/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  339. /package/src/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  340. /package/src/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  341. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  342. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
@@ -1,4 +1,4 @@
1
- import { type JsonValue } from "./contract-json";
2
- import type { SchemaLike } from "./types";
1
+ import { type JsonValue } from "./contract-json.js";
2
+ import type { SchemaLike } from "./types.js";
3
3
  export declare function describeSchema(schema: SchemaLike): JsonValue;
4
4
  export declare function serializeSmsMatcher(value: Record<string, unknown>): Record<string, unknown>;
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { z } from "zod";
3
- import { canonicalJson, compactObject, isRecord, toJsonValue, } from "./contract-json";
3
+ import { canonicalJson, compactObject, isRecord, toJsonValue, } from "./contract-json.js";
4
4
  export function describeSchema(schema) {
5
5
  if (isZodSchema(schema)) {
6
6
  const jsonSchema = zodJsonSchema(schema);
@@ -9,9 +9,7 @@ export function describeSchema(schema) {
9
9
  vendor: "zod",
10
10
  typeName: getSchemaTypeName(schema),
11
11
  jsonSchema,
12
- jsonSchemaHash: jsonSchema === undefined
13
- ? undefined
14
- : digest(canonicalJson(jsonSchema)),
12
+ jsonSchemaHash: jsonSchema === undefined ? undefined : digest(canonicalJson(jsonSchema)),
15
13
  });
16
14
  }
17
15
  const standard = isRecord(schema) ? schema["~standard"] : undefined;
@@ -20,8 +18,7 @@ export function describeSchema(schema) {
20
18
  kind: "schema",
21
19
  standard: "standard-schema-v1",
22
20
  vendor: typeof standard.vendor === "string" ? standard.vendor : "unknown",
23
- version: typeof standard.version === "number" ||
24
- typeof standard.version === "string"
21
+ version: typeof standard.version === "number" || typeof standard.version === "string"
25
22
  ? standard.version
26
23
  : undefined,
27
24
  });
@@ -57,15 +54,11 @@ function isZodSchema(schema) {
57
54
  return schema instanceof z.ZodType;
58
55
  }
59
56
  function zodJsonSchema(schema) {
60
- try {
61
- const jsonSchema = z.toJSONSchema(schema);
62
- return toJsonValue(jsonSchema);
63
- }
64
- catch (error) {
65
- if (error instanceof Error)
66
- return undefined;
67
- throw error;
57
+ const jsonSchema = toJsonValue(z.toJSONSchema(schema));
58
+ if (jsonSchema === undefined) {
59
+ throw new TypeError("z.toJSONSchema() returned a non-JSON value");
68
60
  }
61
+ return jsonSchema;
69
62
  }
70
63
  function getSchemaTypeName(schema) {
71
64
  if (!isRecord(schema))
@@ -1,5 +1,5 @@
1
- import type { JsonValue } from "./contract-json";
2
- import type { ProviderDefinition } from "./types";
1
+ import type { JsonValue } from "./contract-json.js";
2
+ import type { ProviderDefinition } from "./types.js";
3
3
  export declare const PROVIDER_CONTRACT_SCHEMA_VERSION = "2026-06-23";
4
4
  export interface ProviderContractSnapshot {
5
5
  readonly schemaVersion: typeof PROVIDER_CONTRACT_SCHEMA_VERSION;
@@ -11,6 +11,7 @@ export interface ProviderContractSnapshot {
11
11
  readonly allowedHosts?: readonly string[];
12
12
  readonly stealth?: JsonValue;
13
13
  readonly proxy?: JsonValue;
14
+ readonly ocr?: JsonValue;
14
15
  readonly stt?: JsonValue;
15
16
  readonly browser?: JsonValue;
16
17
  readonly auth?: JsonValue;
@@ -1,6 +1,6 @@
1
- import { canonicalJson, type JsonPrimitive, type JsonValue } from "./contract-json";
2
- import { PROVIDER_CONTRACT_SCHEMA_VERSION, type ProviderContractOperation, type ProviderContractSnapshot } from "./contract-types";
3
- import type { ProviderDefinition } from "./types";
1
+ import { canonicalJson, type JsonPrimitive, type JsonValue } from "./contract-json.js";
2
+ import { PROVIDER_CONTRACT_SCHEMA_VERSION, type ProviderContractOperation, type ProviderContractSnapshot } from "./contract-types.js";
3
+ import type { ProviderDefinition } from "./types.js";
4
4
  export { canonicalJson, type JsonPrimitive, type JsonValue, PROVIDER_CONTRACT_SCHEMA_VERSION, type ProviderContractOperation, type ProviderContractSnapshot, };
5
5
  export declare function extractProviderContract(provider: ProviderDefinition): ProviderContractSnapshot;
6
6
  export declare function digestProviderContract(snapshot: ProviderContractSnapshot): string;
package/dist/contract.js CHANGED
@@ -1,12 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
- import { canonicalJson, compactObject, copyRecordWithout, toJsonValue, } from "./contract-json";
3
- import { describeSchema, serializeSmsMatcher } from "./contract-serialization";
4
- import { PROVIDER_CONTRACT_SCHEMA_VERSION, } from "./contract-types";
2
+ import { canonicalJson, compactObject, copyRecordWithout, toJsonValue, } from "./contract-json.js";
3
+ import { describeSchema, serializeSmsMatcher } from "./contract-serialization.js";
4
+ import { PROVIDER_CONTRACT_SCHEMA_VERSION, } from "./contract-types.js";
5
5
  export { canonicalJson, PROVIDER_CONTRACT_SCHEMA_VERSION, };
6
6
  export function extractProviderContract(provider) {
7
7
  const auth = extractAuth(provider.auth);
8
8
  const stealth = toJsonValue(provider.stealth);
9
9
  const proxy = toJsonValue(provider.proxy);
10
+ const ocr = toJsonValue(provider.ocr);
10
11
  const stt = toJsonValue(provider.stt);
11
12
  const browser = toJsonValue(provider.browser);
12
13
  const reviewed = toJsonValue(provider.reviewed);
@@ -27,11 +28,10 @@ export function extractProviderContract(provider) {
27
28
  operations: Object.entries(provider.operations)
28
29
  .sort(([leftId], [rightId]) => leftId.localeCompare(rightId))
29
30
  .map(([operationId, operation]) => extractOperation(operationId, operation)),
30
- ...(provider.allowedHosts
31
- ? { allowedHosts: [...provider.allowedHosts].sort() }
32
- : {}),
31
+ ...(provider.allowedHosts ? { allowedHosts: [...provider.allowedHosts].sort() } : {}),
33
32
  ...(stealth === undefined ? {} : { stealth }),
34
33
  ...(proxy === undefined ? {} : { proxy }),
34
+ ...(ocr === undefined ? {} : { ocr }),
35
35
  ...(stt === undefined ? {} : { stt }),
36
36
  ...(browser === undefined ? {} : { browser }),
37
37
  ...(auth === undefined ? {} : { auth }),
@@ -0,0 +1,23 @@
1
+ import { ProviderError } from "./errors.js";
2
+ import type { ProviderDefinition } from "./types.js";
3
+ export declare const DECLARATION_INVALID_CODE = "DECLARATION_INVALID";
4
+ export declare const DECLARATION_RULE_IDS: {
5
+ readonly challengeShape: "credentials-challenge-shape";
6
+ readonly journeyExecutable: "health-journey-executable";
7
+ readonly schemaSerializable: "operation-schema-serializable";
8
+ readonly proxyExplicitPolicy: "proxy-explicit-policy";
9
+ readonly proxyVendorExclusive: "proxy-vendor-fields-exclusive";
10
+ readonly proxyNoMixedVendors: "proxy-no-mixed-vendors";
11
+ readonly proxySmartproxyGeo: "proxy-smartproxy-country-only";
12
+ readonly operationUpstreamProxy: "operation-upstream-proxy-unsupported";
13
+ };
14
+ export type DeclarationRuleId = (typeof DECLARATION_RULE_IDS)[keyof typeof DECLARATION_RULE_IDS];
15
+ export type DeclarationViolation = {
16
+ ruleId: DeclarationRuleId;
17
+ path: string;
18
+ message: string;
19
+ fix: string;
20
+ };
21
+ export declare function declarationInvalidError(violations: readonly DeclarationViolation[]): ProviderError;
22
+ /** Enforces declaration rules whose runtime behavior would otherwise fail open. */
23
+ export declare function validateFailClosedDeclaration(provider: ProviderDefinition): void;
@@ -0,0 +1,159 @@
1
+ import { describeSchema } from "./contract-serialization.js";
2
+ import { ProviderError } from "./errors.js";
3
+ export const DECLARATION_INVALID_CODE = "DECLARATION_INVALID";
4
+ export const DECLARATION_RULE_IDS = {
5
+ challengeShape: "credentials-challenge-shape",
6
+ journeyExecutable: "health-journey-executable",
7
+ schemaSerializable: "operation-schema-serializable",
8
+ proxyExplicitPolicy: "proxy-explicit-policy",
9
+ proxyVendorExclusive: "proxy-vendor-fields-exclusive",
10
+ proxyNoMixedVendors: "proxy-no-mixed-vendors",
11
+ proxySmartproxyGeo: "proxy-smartproxy-country-only",
12
+ operationUpstreamProxy: "operation-upstream-proxy-unsupported",
13
+ };
14
+ export function declarationInvalidError(violations) {
15
+ const summary = violations
16
+ .map((violation) => `${violation.path} [${violation.ruleId}]: ${violation.message}`)
17
+ .join("\n");
18
+ return new ProviderError(`Provider declaration is invalid (${violations.length} violation${violations.length === 1 ? "" : "s"}).${summary ? `\n${summary}` : ""}`, {
19
+ code: DECLARATION_INVALID_CODE,
20
+ details: { violations: [...violations] },
21
+ fix: "Apply every violation's fix hint, then validate the declaration again.",
22
+ });
23
+ }
24
+ /** Enforces declaration rules whose runtime behavior would otherwise fail open. */
25
+ export function validateFailClosedDeclaration(provider) {
26
+ const violations = [];
27
+ validateHealthDeclaration(provider, violations);
28
+ validateSchemaDeclaration(provider, violations);
29
+ validateProxyDeclaration(provider, violations);
30
+ validateOperationDeclaration(provider, violations);
31
+ if (violations.length > 0)
32
+ throw declarationInvalidError(violations);
33
+ }
34
+ function validateHealthDeclaration(provider, violations) {
35
+ for (const [index, journey] of (provider.healthJourneys ?? []).entries()) {
36
+ if (!journey || typeof journey !== "object")
37
+ continue;
38
+ if (typeof journey.run !== "function") {
39
+ const journeyPath = healthJourneyPath(journey, index);
40
+ violations.push({
41
+ ruleId: DECLARATION_RULE_IDS.journeyExecutable,
42
+ path: `${journeyPath}.run`,
43
+ message: "coversOperations cannot provide health coverage without executable run logic.",
44
+ fix: `Add an async run(ctx) implementation to ${journeyPath}.`,
45
+ });
46
+ }
47
+ }
48
+ // NOTE: healthCheck.cases[].enabled is intentionally NOT validated here.
49
+ // self-test.ts reports a gated case as status "skipped" with skipReason
50
+ // "disabled", so the skip is visible in results rather than silent — it is a
51
+ // supported conditional-execution feature, not a class-1 silent no-op.
52
+ }
53
+ function healthJourneyPath(journey, index) {
54
+ return typeof journey.id === "string" && journey.id.length > 0
55
+ ? `healthJourneys.${journey.id}`
56
+ : `healthJourneys[${index}]`;
57
+ }
58
+ function validateSchemaDeclaration(provider, violations) {
59
+ for (const [operationId, operation] of Object.entries(provider.operations ?? {})) {
60
+ const schemaEntries = [
61
+ [`operations.${operationId}.input`, operation.input],
62
+ [`operations.${operationId}.output`, operation.output],
63
+ ];
64
+ // SSE event schemas reach contract extraction the same way input/output do,
65
+ // so a transform-bearing event schema would abort extraction at runtime while
66
+ // passing declaration checks. Validate them under the same rule.
67
+ const transport = operation.transport;
68
+ if (transport?.kind === "sse") {
69
+ for (const [eventName, eventSchema] of Object.entries(transport.events ?? {})) {
70
+ schemaEntries.push([
71
+ `operations.${operationId}.transport.events.${eventName}`,
72
+ eventSchema,
73
+ ]);
74
+ }
75
+ }
76
+ for (const [path, schema] of schemaEntries) {
77
+ try {
78
+ describeSchema(schema);
79
+ }
80
+ catch (error) {
81
+ const reason = error instanceof Error ? error.message : String(error);
82
+ violations.push({
83
+ ruleId: DECLARATION_RULE_IDS.schemaSerializable,
84
+ path,
85
+ message: `schema conversion to JSON Schema failed: ${reason}`,
86
+ fix: `Replace unsupported constructs in ${path} so z.toJSONSchema() succeeds.`,
87
+ });
88
+ }
89
+ }
90
+ }
91
+ }
92
+ const MANAGED_PROXY_VENDORS = new Set(["smartproxy", "nodemaven"]);
93
+ const STATIC_PROXY_VENDORS = new Set(["custom", "decodo"]);
94
+ function validateProxyDeclaration(provider, violations) {
95
+ if (provider.proxy === true) {
96
+ violations.push({
97
+ ruleId: DECLARATION_RULE_IDS.proxyExplicitPolicy,
98
+ path: "proxy",
99
+ message: "proxy: true does not require resolvable proxy egress.",
100
+ fix: 'Replace proxy: true with an explicit policy such as proxy: { mode: "required", providers: ["smartproxy"] }.',
101
+ });
102
+ return;
103
+ }
104
+ if (!provider.proxy || typeof provider.proxy !== "object")
105
+ return;
106
+ const policy = provider.proxy;
107
+ const hasProvider = policy.provider !== undefined;
108
+ const hasProviders = policy.providers !== undefined;
109
+ if (hasProvider && hasProviders) {
110
+ violations.push({
111
+ ruleId: DECLARATION_RULE_IDS.proxyVendorExclusive,
112
+ path: "proxy",
113
+ message: "provider and providers are ambiguous when declared together.",
114
+ fix: "Keep either proxy.provider or proxy.providers, and remove the other field.",
115
+ });
116
+ }
117
+ const vendors = declaredProxyVendors(policy);
118
+ if (vendors.some((vendor) => MANAGED_PROXY_VENDORS.has(vendor)) &&
119
+ vendors.some((vendor) => STATIC_PROXY_VENDORS.has(vendor))) {
120
+ violations.push({
121
+ ruleId: DECLARATION_RULE_IDS.proxyNoMixedVendors,
122
+ path: hasProviders ? "proxy.providers" : "proxy.provider",
123
+ message: "managed and deprecated static proxy vendors cannot share a chain.",
124
+ fix: "Use only smartproxy/nodemaven vendors, or only deprecated static markers, in one policy.",
125
+ });
126
+ }
127
+ if (vendors.includes("smartproxy")) {
128
+ for (const field of ["subdivision", "city"]) {
129
+ if (policy.geo?.[field] === undefined)
130
+ continue;
131
+ const path = `proxy.geo.${field}`;
132
+ violations.push({
133
+ ruleId: DECLARATION_RULE_IDS.proxySmartproxyGeo,
134
+ path,
135
+ message: `smartproxy cannot honor ${field}-level geo targeting.`,
136
+ fix: `Remove ${path} or use a vendor chain that can honor it.`,
137
+ });
138
+ }
139
+ }
140
+ }
141
+ function declaredProxyVendors(policy) {
142
+ const vendors = [...(policy.providers ?? [])];
143
+ if (policy.provider !== undefined)
144
+ vendors.push(policy.provider);
145
+ return vendors;
146
+ }
147
+ function validateOperationDeclaration(provider, violations) {
148
+ for (const [operationId, operation] of Object.entries(provider.operations ?? {})) {
149
+ if (!operation.upstream?.proxy)
150
+ continue;
151
+ const path = `operations.${operationId}.upstream.proxy`;
152
+ violations.push({
153
+ ruleId: DECLARATION_RULE_IDS.operationUpstreamProxy,
154
+ path,
155
+ message: "operation-level proxy policy is not wired into operation execution.",
156
+ fix: `Remove ${path} and declare the effective policy at provider.proxy.`,
157
+ });
158
+ }
159
+ }
package/dist/define.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { AuthConfig, BrowserEngine, ContextDeclaration, CredentialDeclaration, HealthJourneyDefinition, HealthJourneySchedule, HealthScheduleRandomization, InferSchemaOutput, OperationDefinition, OperationHandlerResult, OperationHttpStreamTransport, OperationSseTransport, OperationWebSocketTransport, ProviderAccessConfig, ProviderDefinition, ProviderHealthMonitorConfig, ProviderProxyConfig, ProviderPublicProfile, ProviderReviewed, ProviderSecretDeclaration, ProviderStreamEvent, ProviderSttConfig, SchemaLike, SmsOtpMatcherDefinition, StealthPlatform } from "./types";
1
+ import type { AuthConfig, BrowserEngine, ContextDeclaration, CredentialDeclaration, HealthJourneyDefinition, HealthJourneySchedule, HealthScheduleRandomization, InferSchemaOutput, NativeProviderConfig, OperationDefinition, OperationHandlerResult, OperationHttpStreamTransport, OperationSseTransport, OperationWebSocketTransport, ProviderAccessConfig, ProviderDefinition, ProviderOcrConfig, ProviderDeploymentOverrides, ProviderHealthMonitorConfig, ProviderProxyConfig, ProviderPublicProfile, ProviderResolverConfig, ProviderReviewed, ProviderSecretDeclaration, ProviderStreamEvent, ProviderSttConfig, SchemaLike, SmsOtpMatcherDefinition, StealthPlatform } from "./types.js";
2
2
  type ProviderImplementationSourceAccess = "official_api" | "private_api" | "browser_flow" | "hybrid";
3
3
  type ProviderImplementationCredentialStrategy = "apifuse_managed" | "workspace_secret" | "user_oauth" | "user_session" | "none";
4
4
  interface ProviderImplementationProfile {
@@ -8,6 +8,8 @@ interface ProviderImplementationProfile {
8
8
  operatorNotes?: string;
9
9
  visibility: "internal" | "operator";
10
10
  }
11
+ export declare const VALID_PROVIDER_RESOLVER_VENDORS: readonly ["browser", "capsolver", "capmonster", "2captcha", "custom"];
12
+ export declare const VALID_PROVIDER_CHALLENGE_KINDS: readonly ["turnstile", "recaptcha_v2", "recaptcha_v3", "hcaptcha", "cloudflare_interstitial", "aws_waf", "akamai_sec_cpt", "akamai_sensor"];
11
13
  type ProviderOperation = OperationDefinition<SchemaLike, SchemaLike>;
12
14
  type OperationConfig<TInput extends SchemaLike, TOutput extends SchemaLike> = Omit<OperationDefinition<TInput, TOutput>, "handler"> & {
13
15
  handler(ctx: Parameters<OperationDefinition<TInput, TOutput>["handler"]>[0], input: InferSchemaOutput<TInput>): OperationHandlerResult<InferSchemaOutput<TOutput>> | Promise<OperationHandlerResult<InferSchemaOutput<TOutput>>>;
@@ -41,13 +43,23 @@ export interface ProviderConfig<TOperations extends Record<string, ProviderOpera
41
43
  id: string;
42
44
  version: string;
43
45
  runtime: "standard" | "shared" | "browser";
46
+ /**
47
+ * Optional deployment overrides, passed through verbatim onto the returned
48
+ * provider definition. The SDK types this field but does not deep-validate
49
+ * it — the APIFuse registry builder owns deployment validation and
50
+ * resolves omitted fields against the runtime deployment profiles.
51
+ */
52
+ deployment?: ProviderDeploymentOverrides;
44
53
  allowedHosts?: string[];
54
+ native?: NativeProviderConfig;
45
55
  stealth?: {
46
56
  profile: string;
47
57
  platform: StealthPlatform;
48
58
  };
49
59
  proxy?: ProviderProxyConfig;
60
+ ocr?: ProviderOcrConfig;
50
61
  stt?: ProviderSttConfig;
62
+ resolver?: ProviderResolverConfig;
51
63
  browser?: {
52
64
  engine: BrowserEngine;
53
65
  };