@apifuse/provider-sdk 2.2.0-beta.4 → 2.2.0-beta.40

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 (303) hide show
  1. package/AUTHORING.md +501 -13
  2. package/CHANGELOG.md +165 -1
  3. package/README.md +72 -14
  4. package/SUBMISSION.md +1 -1
  5. package/bin/apifuse-check.ts +88 -4
  6. package/bin/apifuse-dev.ts +38 -5
  7. package/bin/apifuse-pack-check.ts +22 -2
  8. package/bin/apifuse-pack-smoke.ts +57 -2
  9. package/bin/apifuse-pack-types.ts +356 -38
  10. package/bin/apifuse-perf.ts +14 -13
  11. package/bin/apifuse-record.ts +691 -68
  12. package/bin/apifuse-submit-check.ts +518 -37
  13. package/bin/apifuse-sync-assets.ts +117 -0
  14. package/bin/submit-check-delimited-text.ts +50 -0
  15. package/dist/auth-turn/index.d.ts +3 -3
  16. package/dist/auth-turn/index.js +1 -1
  17. package/dist/auth.d.ts +14 -0
  18. package/dist/auth.js +67 -0
  19. package/dist/ceremonies/index.d.ts +16 -0
  20. package/dist/ceremonies/index.js +141 -36
  21. package/dist/cli/commands.d.ts +1 -1
  22. package/dist/cli/commands.js +8 -0
  23. package/dist/cli/create.d.ts +3 -0
  24. package/dist/cli/create.js +34 -35
  25. package/dist/cli/prompt-assets.d.ts +80 -0
  26. package/dist/cli/prompt-assets.js +743 -0
  27. package/dist/cli/templates/provider/AGENTS.md.tpl +17 -8
  28. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  29. package/dist/cli/templates/provider/README.md.tpl +4 -4
  30. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  31. package/dist/cli/templates/provider/operations/ping.ts.tpl +2 -1
  32. package/dist/config/loader.d.ts +177 -16
  33. package/dist/config/loader.js +424 -127
  34. package/dist/contract-serialization.js +4 -8
  35. package/dist/contract-types.d.ts +1 -0
  36. package/dist/contract.js +2 -0
  37. package/dist/declaration-validation.d.ts +32 -0
  38. package/dist/declaration-validation.js +207 -0
  39. package/dist/define.d.ts +51 -25
  40. package/dist/define.js +752 -38
  41. package/dist/error-resolution.d.ts +4 -0
  42. package/dist/error-resolution.js +122 -0
  43. package/dist/errors.d.ts +18 -0
  44. package/dist/errors.js +40 -0
  45. package/dist/fixture-sanitization.d.ts +28 -0
  46. package/dist/fixture-sanitization.js +217 -0
  47. package/dist/health-scenario.d.ts +1842 -0
  48. package/dist/health-scenario.js +624 -0
  49. package/dist/index.d.ts +19 -9
  50. package/dist/index.js +10 -6
  51. package/dist/lint.d.ts +6 -1
  52. package/dist/lint.js +362 -3
  53. package/dist/native-address.d.ts +43 -0
  54. package/dist/native-address.js +281 -0
  55. package/dist/native-egress-policy.d.ts +31 -0
  56. package/dist/native-egress-policy.js +288 -0
  57. package/dist/observability.d.ts +5 -2
  58. package/dist/observability.js +48 -1
  59. package/dist/provider.d.ts +8 -2
  60. package/dist/provider.js +3 -1
  61. package/dist/runtime/auth-flow.d.ts +5 -1
  62. package/dist/runtime/auth-flow.js +6 -0
  63. package/dist/runtime/browser.d.ts +1 -0
  64. package/dist/runtime/browser.js +492 -49
  65. package/dist/runtime/cache.d.ts +1 -0
  66. package/dist/runtime/cache.js +169 -15
  67. package/dist/runtime/choice-wordlist.d.ts +9 -0
  68. package/dist/runtime/choice-wordlist.js +138 -0
  69. package/dist/runtime/choice.d.ts +13 -1
  70. package/dist/runtime/choice.js +490 -102
  71. package/dist/runtime/executor.d.ts +2 -2
  72. package/dist/runtime/executor.js +26 -2
  73. package/dist/runtime/http.d.ts +1 -0
  74. package/dist/runtime/http.js +515 -53
  75. package/dist/runtime/instrumentation.d.ts +2 -2
  76. package/dist/runtime/instrumentation.js +366 -8
  77. package/dist/runtime/native-network-errors.d.ts +33 -0
  78. package/dist/runtime/native-network-errors.js +69 -0
  79. package/dist/runtime/native-network.d.ts +96 -0
  80. package/dist/runtime/native-network.js +1232 -0
  81. package/dist/runtime/ocr.d.ts +29 -0
  82. package/dist/runtime/ocr.js +440 -0
  83. package/dist/runtime/proxy-errors.js +6 -2
  84. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  85. package/dist/runtime/proxy-nodemaven.js +146 -0
  86. package/dist/runtime/proxy-telemetry.d.ts +80 -1
  87. package/dist/runtime/proxy-telemetry.js +154 -47
  88. package/dist/runtime/redirects.d.ts +29 -0
  89. package/dist/runtime/redirects.js +36 -0
  90. package/dist/runtime/redis.d.ts +1 -1
  91. package/dist/runtime/redis.js +4 -2
  92. package/dist/runtime/request-options.d.ts +68 -1
  93. package/dist/runtime/request-options.js +548 -0
  94. package/dist/runtime/resolver-config.d.ts +6 -0
  95. package/dist/runtime/resolver-config.js +6 -0
  96. package/dist/runtime/resolver-public.d.ts +1 -0
  97. package/dist/runtime/resolver-public.js +1 -0
  98. package/dist/runtime/resolver-shared.d.ts +3 -0
  99. package/dist/runtime/resolver-shared.js +12 -0
  100. package/dist/runtime/resolver-vendors/bindings.d.ts +48 -0
  101. package/dist/runtime/resolver-vendors/bindings.js +40 -0
  102. package/dist/runtime/resolver-vendors/browser.d.ts +22 -0
  103. package/dist/runtime/resolver-vendors/browser.js +377 -0
  104. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  105. package/dist/runtime/resolver-vendors/capsolver.js +526 -0
  106. package/dist/runtime/resolver-vendors/hosts.d.ts +2 -0
  107. package/dist/runtime/resolver-vendors/hosts.js +33 -0
  108. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  109. package/dist/runtime/resolver-vendors/twocaptcha.js +407 -0
  110. package/dist/runtime/resolver-vendors/types.d.ts +94 -0
  111. package/dist/runtime/resolver-vendors/types.js +96 -0
  112. package/dist/runtime/resolver.d.ts +60 -0
  113. package/dist/runtime/resolver.js +737 -0
  114. package/dist/runtime/secrets.d.ts +27 -0
  115. package/dist/runtime/secrets.js +51 -0
  116. package/dist/runtime/state.d.ts +3 -0
  117. package/dist/runtime/state.js +277 -71
  118. package/dist/runtime/stealth-cookies.d.ts +20 -0
  119. package/dist/runtime/stealth-cookies.js +111 -0
  120. package/dist/runtime/stealth.d.ts +28 -3
  121. package/dist/runtime/stealth.js +519 -255
  122. package/dist/runtime/stt.js +1 -12
  123. package/dist/runtime/timeout.d.ts +5 -0
  124. package/dist/runtime/timeout.js +12 -0
  125. package/dist/runtime/trace-config.d.ts +12 -0
  126. package/dist/runtime/trace-config.js +61 -0
  127. package/dist/serve.d.ts +1 -1
  128. package/dist/serve.js +1 -1
  129. package/dist/server/index.d.ts +5 -3
  130. package/dist/server/index.js +3 -3
  131. package/dist/server/self-test-input-tokens.d.ts +2 -1
  132. package/dist/server/self-test-input-tokens.js +18 -14
  133. package/dist/server/self-test.d.ts +114 -0
  134. package/dist/server/self-test.js +784 -148
  135. package/dist/server/serve-implementation.d.ts +213 -0
  136. package/dist/server/serve-implementation.js +2173 -0
  137. package/dist/server/serve.d.ts +1 -70
  138. package/dist/server/serve.js +1 -1130
  139. package/dist/server/trace-output.d.ts +4 -0
  140. package/dist/server/trace-output.js +20 -0
  141. package/dist/server/types.d.ts +30 -5
  142. package/dist/server/types.js +13 -1
  143. package/dist/stateful/errors.d.ts +19 -0
  144. package/dist/stateful/errors.js +24 -0
  145. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  146. package/dist/stateful/http-provider-event-emitter.js +237 -0
  147. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  148. package/dist/stateful/http-session-owner-registry.js +210 -0
  149. package/dist/stateful/index.d.ts +18 -0
  150. package/dist/stateful/index.js +18 -0
  151. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  152. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  153. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  154. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  155. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  156. package/dist/stateful/provider-event-pipeline.js +1 -0
  157. package/dist/stateful/provider-events.d.ts +101 -0
  158. package/dist/stateful/provider-events.js +289 -0
  159. package/dist/stateful/session-key.d.ts +15 -0
  160. package/dist/stateful/session-key.js +86 -0
  161. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  162. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  163. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  164. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  165. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  166. package/dist/stateful/stateful-provider-adapter.js +287 -0
  167. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  168. package/dist/stateful/stateful-provider-observability.js +161 -0
  169. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  170. package/dist/stateful/stateful-provider-owner-forwarder.js +215 -0
  171. package/dist/stateful/stateful-provider-runtime-context.d.ts +32 -0
  172. package/dist/stateful/stateful-provider-runtime-context.js +60 -0
  173. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  174. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  175. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  176. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  177. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  178. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  179. package/dist/stateful-signing.d.ts +18 -0
  180. package/dist/stateful-signing.js +27 -0
  181. package/dist/stealth/profiles.js +16 -7
  182. package/dist/stream-evidence.d.ts +74 -0
  183. package/dist/stream-evidence.js +785 -0
  184. package/dist/stream.js +7 -1
  185. package/dist/testing/index.d.ts +2 -1
  186. package/dist/testing/index.js +2 -1
  187. package/dist/testing/run.d.ts +32 -2
  188. package/dist/testing/run.js +489 -21
  189. package/dist/trace-sanitization.d.ts +5 -0
  190. package/dist/trace-sanitization.js +45 -0
  191. package/dist/types.d.ts +545 -23
  192. package/dist/types.js +1 -0
  193. package/package.json +44 -5
  194. package/src/auth-turn/index.ts +1 -1
  195. package/src/auth.ts +118 -0
  196. package/src/ceremonies/index.ts +189 -46
  197. package/src/cli/commands.ts +10 -0
  198. package/src/cli/create.ts +42 -35
  199. package/src/cli/prompt-assets.ts +865 -0
  200. package/src/cli/templates/provider/AGENTS.md.tpl +17 -8
  201. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  202. package/src/cli/templates/provider/README.md.tpl +4 -4
  203. package/src/cli/templates/provider/index.ts.tpl +6 -3
  204. package/src/cli/templates/provider/operations/ping.ts.tpl +2 -1
  205. package/src/config/loader.ts +665 -163
  206. package/src/contract-serialization.ts +5 -7
  207. package/src/contract-types.ts +1 -0
  208. package/src/contract.ts +2 -0
  209. package/src/declaration-validation.ts +266 -0
  210. package/src/define.ts +970 -87
  211. package/src/error-resolution.ts +127 -0
  212. package/src/errors.ts +52 -0
  213. package/src/fixture-sanitization.ts +248 -0
  214. package/src/health-scenario.ts +875 -0
  215. package/src/index.ts +204 -8
  216. package/src/lint.ts +408 -4
  217. package/src/native-address.ts +340 -0
  218. package/src/native-egress-policy.ts +358 -0
  219. package/src/observability.ts +51 -1
  220. package/src/provider.ts +133 -0
  221. package/src/runtime/auth-flow.ts +12 -0
  222. package/src/runtime/browser.ts +661 -63
  223. package/src/runtime/cache.ts +189 -14
  224. package/src/runtime/choice-wordlist.ts +145 -0
  225. package/src/runtime/choice.ts +631 -120
  226. package/src/runtime/executor.ts +40 -7
  227. package/src/runtime/http.ts +641 -61
  228. package/src/runtime/instrumentation.ts +520 -15
  229. package/src/runtime/native-network-errors.ts +99 -0
  230. package/src/runtime/native-network.ts +1605 -0
  231. package/src/runtime/ocr.ts +523 -0
  232. package/src/runtime/proxy-errors.ts +12 -4
  233. package/src/runtime/proxy-nodemaven.ts +221 -0
  234. package/src/runtime/proxy-telemetry.ts +244 -75
  235. package/src/runtime/redirects.ts +66 -0
  236. package/src/runtime/redis.ts +7 -2
  237. package/src/runtime/request-options.ts +680 -1
  238. package/src/runtime/resolver-config.ts +6 -0
  239. package/src/runtime/resolver-public.ts +20 -0
  240. package/src/runtime/resolver-shared.ts +17 -0
  241. package/src/runtime/resolver-vendors/bindings.ts +56 -0
  242. package/src/runtime/resolver-vendors/browser.ts +533 -0
  243. package/src/runtime/resolver-vendors/capsolver.ts +700 -0
  244. package/src/runtime/resolver-vendors/hosts.ts +38 -0
  245. package/src/runtime/resolver-vendors/twocaptcha.ts +539 -0
  246. package/src/runtime/resolver-vendors/types.ts +212 -0
  247. package/src/runtime/resolver.ts +1103 -0
  248. package/src/runtime/secrets.ts +64 -0
  249. package/src/runtime/state.ts +394 -77
  250. package/src/runtime/stealth-cookies.ts +132 -0
  251. package/src/runtime/stealth.ts +675 -289
  252. package/src/runtime/stt.ts +1 -19
  253. package/src/runtime/timeout.ts +18 -0
  254. package/src/runtime/trace-config.ts +77 -0
  255. package/src/serve.ts +6 -1
  256. package/src/server/index.ts +37 -2
  257. package/src/server/self-test-input-tokens.ts +29 -14
  258. package/src/server/self-test.ts +1025 -175
  259. package/src/server/serve-implementation.ts +3250 -0
  260. package/src/server/serve.ts +1 -1626
  261. package/src/server/trace-output.ts +32 -0
  262. package/src/server/types.ts +13 -1
  263. package/src/stateful/README.md +146 -0
  264. package/src/stateful/errors.ts +35 -0
  265. package/src/stateful/http-provider-event-emitter.ts +314 -0
  266. package/src/stateful/http-session-owner-registry.ts +306 -0
  267. package/src/stateful/index.ts +18 -0
  268. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  269. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  270. package/src/stateful/provider-event-pipeline.ts +61 -0
  271. package/src/stateful/provider-events.ts +462 -0
  272. package/src/stateful/session-key.ts +111 -0
  273. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  274. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  275. package/src/stateful/stateful-provider-adapter.ts +562 -0
  276. package/src/stateful/stateful-provider-observability.ts +261 -0
  277. package/src/stateful/stateful-provider-owner-forwarder.ts +287 -0
  278. package/src/stateful/stateful-provider-runtime-context.ts +92 -0
  279. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  280. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  281. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  282. package/src/stateful-signing.ts +46 -0
  283. package/src/stealth/profiles.ts +17 -7
  284. package/src/stream-evidence.ts +988 -0
  285. package/src/stream.ts +8 -1
  286. package/src/testing/index.ts +10 -1
  287. package/src/testing/run.ts +658 -15
  288. package/src/trace-sanitization.ts +63 -0
  289. package/src/types.ts +660 -38
  290. package/dist/cli/templates/provider/CLAUDE.md.tpl +0 -1
  291. package/src/cli/templates/provider/CLAUDE.md.tpl +0 -1
  292. /package/dist/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  293. /package/dist/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  294. /package/dist/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  295. /package/dist/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  296. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  297. /package/dist/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
  298. /package/src/cli/templates/provider/{skills → .agents/skills}/fixtures-and-recording/SKILL.md.tpl +0 -0
  299. /package/src/cli/templates/provider/{skills → .agents/skills}/health-checks-and-fail-closed/SKILL.md.tpl +0 -0
  300. /package/src/cli/templates/provider/{skills → .agents/skills}/normalization-standards/SKILL.md.tpl +0 -0
  301. /package/src/cli/templates/provider/{skills → .agents/skills}/pagination-and-counts/SKILL.md.tpl +0 -0
  302. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-contract-verification/SKILL.md.tpl +0 -0
  303. /package/src/cli/templates/provider/{skills → .agents/skills}/upstream-notes/README.md.tpl +0 -0
@@ -1,4 +1,5 @@
1
1
  import { ProviderError, TransportError, ValidationError } from "../errors.js";
2
+ import { createTimeoutController, isTimeoutLikeError } from "./timeout.js";
2
3
  export const APIFUSE__STT__BACKEND_ENV = "APIFUSE__STT__BACKEND";
3
4
  export const APIFUSE__STT__MODEL_ENV = "APIFUSE__STT__MODEL";
4
5
  export const CLOUDFLARE_ACCOUNT_ID_ENV = "APIFUSE__CLOUDFLARE__ACCOUNT_ID";
@@ -112,12 +113,6 @@ function warnOrThrowUnsupportedOption(request, message) {
112
113
  function normalizeCloudflareLanguage(language) {
113
114
  return language?.split("-")[0]?.toLowerCase();
114
115
  }
115
- function isTimeoutLikeError(error) {
116
- return (error instanceof Error &&
117
- (error.name === "AbortError" ||
118
- error.name === "TimeoutError" ||
119
- /\b(timed out|timeout|deadline exceeded)\b/i.test(error.message)));
120
- }
121
116
  function toSttTransportError(error) {
122
117
  if (error instanceof TransportError)
123
118
  return error;
@@ -134,12 +129,6 @@ function toSttTransportError(error) {
134
129
  cause: error instanceof Error ? error : undefined,
135
130
  });
136
131
  }
137
- function createTimeoutController(signalTimeoutMs) {
138
- const controller = new AbortController();
139
- const timeout = setTimeout(() => controller.abort(), signalTimeoutMs);
140
- timeout.unref?.();
141
- return { controller, clear: () => clearTimeout(timeout) };
142
- }
143
132
  function toCloudflareInput(request) {
144
133
  const prompt = resolveSttPrompt(request);
145
134
  const input = {
@@ -0,0 +1,5 @@
1
+ export declare function isTimeoutLikeError(error: unknown): error is Error;
2
+ export declare function createTimeoutController(signalTimeoutMs: number): {
3
+ controller: AbortController;
4
+ clear: () => void;
5
+ };
@@ -0,0 +1,12 @@
1
+ export function isTimeoutLikeError(error) {
2
+ return (error instanceof Error &&
3
+ (error.name === "AbortError" ||
4
+ error.name === "TimeoutError" ||
5
+ /\b(timed out|timeout|deadline exceeded)\b/i.test(error.message)));
6
+ }
7
+ export function createTimeoutController(signalTimeoutMs) {
8
+ const controller = new AbortController();
9
+ const timeout = setTimeout(() => controller.abort(), signalTimeoutMs);
10
+ timeout.unref?.();
11
+ return { controller, clear: () => clearTimeout(timeout) };
12
+ }
@@ -0,0 +1,12 @@
1
+ import type { TraceConfig } from "../types.js";
2
+ /** SDK-owned environment variable names for server trace output. */
3
+ export declare const APIFUSE__TRACE__ENABLED = "APIFUSE__TRACE__ENABLED";
4
+ export declare const APIFUSE__TRACE__EXPORTER = "APIFUSE__TRACE__EXPORTER";
5
+ type EnvLike = Record<string, string | undefined>;
6
+ /**
7
+ * Resolve server trace output configuration from SDK-owned environment
8
+ * variables. Invalid exporter values fail closed so a provider cannot crash at
9
+ * startup because of an observability setting.
10
+ */
11
+ export declare function resolveTraceConfigFromEnv(env?: EnvLike): TraceConfig | undefined;
12
+ export {};
@@ -0,0 +1,61 @@
1
+ /** SDK-owned environment variable names for server trace output. */
2
+ export const APIFUSE__TRACE__ENABLED = "APIFUSE__TRACE__ENABLED";
3
+ export const APIFUSE__TRACE__EXPORTER = "APIFUSE__TRACE__EXPORTER";
4
+ const TRACE_EXPORTER_LOOKUP = {
5
+ console: true,
6
+ json: true,
7
+ none: true,
8
+ };
9
+ const TRACE_EXPORTERS = new Set(Object.keys(TRACE_EXPORTER_LOOKUP));
10
+ const emittedWarnings = new Set();
11
+ function warnOnce(key, message) {
12
+ if (emittedWarnings.has(key))
13
+ return;
14
+ emittedWarnings.add(key);
15
+ console.warn(message);
16
+ }
17
+ function parseEnabled(raw) {
18
+ if (raw === undefined)
19
+ return undefined;
20
+ switch (raw.trim().toLowerCase()) {
21
+ case "1":
22
+ case "true":
23
+ case "yes":
24
+ case "on":
25
+ return true;
26
+ case "0":
27
+ case "false":
28
+ case "no":
29
+ case "off":
30
+ return false;
31
+ default:
32
+ warnOnce(APIFUSE__TRACE__ENABLED, "[apifuse] Invalid APIFUSE__TRACE__ENABLED; falling back to disabled tracing.");
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * Resolve server trace output configuration from SDK-owned environment
38
+ * variables. Invalid exporter values fail closed so a provider cannot crash at
39
+ * startup because of an observability setting.
40
+ */
41
+ export function resolveTraceConfigFromEnv(env = process.env) {
42
+ const enabledRaw = env[APIFUSE__TRACE__ENABLED];
43
+ const exporterRaw = env[APIFUSE__TRACE__EXPORTER];
44
+ if (enabledRaw === undefined && exporterRaw === undefined) {
45
+ return undefined;
46
+ }
47
+ const enabled = parseEnabled(enabledRaw);
48
+ const normalizedExporter = exporterRaw?.trim().toLowerCase();
49
+ const exporter = TRACE_EXPORTERS.has(normalizedExporter)
50
+ ? normalizedExporter
51
+ : exporterRaw === undefined
52
+ ? undefined
53
+ : "none";
54
+ if (exporterRaw !== undefined && exporter === "none" && normalizedExporter !== "none") {
55
+ warnOnce(APIFUSE__TRACE__EXPORTER, `[apifuse] Invalid APIFUSE__TRACE__EXPORTER value "${normalizedExporter ?? exporterRaw}" (OTLP is unsupported for server output); supported exporters are "console", "json", and "none"; falling back to exporter "none".`);
56
+ }
57
+ return {
58
+ ...(enabled !== undefined ? { enabled } : {}),
59
+ ...(exporter !== undefined ? { exporter } : {}),
60
+ };
61
+ }
package/dist/serve.d.ts CHANGED
@@ -1 +1 @@
1
- export { createServerApp, type ServeOptions, serve } from "./server/serve.js";
1
+ export { createServerApp, createServerAppAsync, type ServeOptions, serve, } from "./server/serve.js";
package/dist/serve.js CHANGED
@@ -1 +1 @@
1
- export { createServerApp, serve } from "./server/serve.js";
1
+ export { createServerApp, createServerAppAsync, serve, } from "./server/serve.js";
@@ -1,6 +1,8 @@
1
- export { createServerApp, type ServeOptions, serve } from "./serve.js";
2
- export { computeSelfTestPlanDigest, createSelfTestApp, createSelfTestInvoke, DEFAULT_SELF_TEST_REQUEST_BUDGET_MS, isSelfTestReadOnlyOperation, PROVIDER_RUNTIME_SELF_TEST_REQUEST_BUDGET_MS_ENV, resolveSelfTestPort, SELF_TEST_HEALTHZ_PATH, SELF_TEST_PATH, SELF_TEST_SCHEMA_VERSION, type SelfTestAppOptions, type SelfTestCaseResult, type SelfTestCaseStatus, type SelfTestOperationInvoke, type SelfTestRequest, SelfTestRequestSchema, type SelfTestResponse, } from "./self-test.js";
3
- export { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens.js";
1
+ export type { ProxyCacheStatus, ProxyProtocol, ProxyUserAgentSource, ProxyVendorName, SmartproxyAllocatorBodyClass, } from "../config/loader.js";
2
+ export type { ProxyTelemetryLogPayload, ProxyTelemetryResolvedPayload, ProxyTelemetryUnresolvedPayload, } from "../runtime/proxy-telemetry.js";
3
+ export { createServerApp, createServerAppAsync, ERROR_OBSERVABILITY_HEADER, type ErrorObservabilityDetails, type ProviderServerCloseOptions, type ProviderServerHandle, type ProviderServerLogEvent, type ProviderServerLogger, type ProviderServerOperationExecutor, type ProviderServerOperationExecutorInput, type ProviderServerOptions, type ProviderServerStatefulForwardEnvelope, type ServeOptions, serve, } from "./serve.js";
4
+ export { computeSelfTestPlanDigest, createSelfTestApp, createSelfTestAuthFlowInvoke, createSelfTestInvoke, DEFAULT_SELF_TEST_REQUEST_BUDGET_MS, isSelfTestReadOnlyOperation, PROVIDER_RUNTIME_SELF_TEST_REQUEST_BUDGET_MS_ENV, resolveSelfTestPort, SELF_TEST_AUTH_FLOW_MULTI_TURN_SKIP_REASON, SELF_TEST_AUTH_FLOW_REJECTED_SKIP_REASON, SELF_TEST_HEALTHZ_PATH, SELF_TEST_PATH, SELF_TEST_SCHEMA_VERSION, type SelfTestAppOptions, type SelfTestAuthFlowInvoke, type SelfTestAuthFlowRoute, type SelfTestCaseResult, type SelfTestCaseStatus, type SelfTestOperationInvoke, type SelfTestRequest, SelfTestRequestSchema, type SelfTestResponse, } from "./self-test.js";
5
+ export { type InputDateTokenCalendar, resolveHealthCheckInputDateTokens, } from "./self-test-input-tokens.js";
4
6
  export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction.js";
5
7
  export { DEFAULT_SELF_TEST_PORT, deriveSelfTestToken, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV, PROVIDER_RUNTIME_SELF_TEST_PORT_ENV, resolveSelfTestMasterSecrets, type SelfTestMasterSecrets, verifySelfTestAuthorization, } from "./self-test-token.js";
6
8
  export type { AuthFlowRequest, AuthFlowResponse, AuthFlowSuccessResponse, ConnectionMode, OperationConnection, OperationErrorResponse, OperationRequest, OperationResponse, OperationSuccessResponse, } from "./types.js";
@@ -1,6 +1,6 @@
1
- export { createServerApp, serve } from "./serve.js";
2
- export { computeSelfTestPlanDigest, createSelfTestApp, createSelfTestInvoke, DEFAULT_SELF_TEST_REQUEST_BUDGET_MS, isSelfTestReadOnlyOperation, PROVIDER_RUNTIME_SELF_TEST_REQUEST_BUDGET_MS_ENV, resolveSelfTestPort, SELF_TEST_HEALTHZ_PATH, SELF_TEST_PATH, SELF_TEST_SCHEMA_VERSION, SelfTestRequestSchema, } from "./self-test.js";
3
- export { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens.js";
1
+ export { createServerApp, createServerAppAsync, ERROR_OBSERVABILITY_HEADER, serve, } from "./serve.js";
2
+ export { computeSelfTestPlanDigest, createSelfTestApp, createSelfTestAuthFlowInvoke, createSelfTestInvoke, DEFAULT_SELF_TEST_REQUEST_BUDGET_MS, isSelfTestReadOnlyOperation, PROVIDER_RUNTIME_SELF_TEST_REQUEST_BUDGET_MS_ENV, resolveSelfTestPort, SELF_TEST_AUTH_FLOW_MULTI_TURN_SKIP_REASON, SELF_TEST_AUTH_FLOW_REJECTED_SKIP_REASON, SELF_TEST_HEALTHZ_PATH, SELF_TEST_PATH, SELF_TEST_SCHEMA_VERSION, SelfTestRequestSchema, } from "./self-test.js";
3
+ export { resolveHealthCheckInputDateTokens, } from "./self-test-input-tokens.js";
4
4
  export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction.js";
5
5
  export { DEFAULT_SELF_TEST_PORT, deriveSelfTestToken, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV, PROVIDER_RUNTIME_SELF_TEST_PORT_ENV, resolveSelfTestMasterSecrets, verifySelfTestAuthorization, } from "./self-test-token.js";
6
6
  export { AuthFlowRequestSchema, AuthFlowSuccessResponseSchema, ConnectionModeSchema, ErrorEnvelopeSchema, OperationConnectionSchema, OperationErrorResponseSchema, OperationRequestSchema, OperationSuccessResponseSchema, } from "./types.js";
@@ -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
  }
@@ -51,25 +51,80 @@ 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;
62
72
  meta?: Record<string, unknown>;
63
73
  }>;
74
+ export type SelfTestAuthFlowRoute = "start" | "continue";
75
+ /**
76
+ * In-process driver for the tenant app's /auth pipeline. Self-test uses it to
77
+ * materialize `requiresConnection` credentials through the provider's declared
78
+ * auth flow — the exact path production connections take — instead of
79
+ * injecting raw credential inputs as connection secrets.
80
+ */
81
+ export type SelfTestAuthFlowInvoke = (args: {
82
+ route: SelfTestAuthFlowRoute;
83
+ requestId: string;
84
+ flowId: string;
85
+ /** Stable per-credential connection id — keeps login on the probe's affinity. */
86
+ connectionId?: string;
87
+ /** The probe connection's externalRef — flows reading ctx.externalRef see the same identity. */
88
+ externalRef?: string;
89
+ input?: Record<string, unknown>;
90
+ context?: Record<string, unknown>;
91
+ signal?: AbortSignal;
92
+ }) => Promise<{
93
+ status: number;
94
+ body: unknown;
95
+ }>;
96
+ /**
97
+ * Skip reason reported when a declared auth flow does not complete in a single
98
+ * continue (OTP, retry loop). Cross-repo contract: the health-monitor maps
99
+ * this exact string to `self_test_incapable`; never vary it.
100
+ */
101
+ export declare const SELF_TEST_AUTH_FLOW_MULTI_TURN_SKIP_REASON = "auth_flow_multi_turn";
102
+ /**
103
+ * A `retry` turn after credential submission: the flow REJECTED the
104
+ * configured inputs (bad password, exchange failure). Distinct from the
105
+ * multi-turn gap so monitoring surfaces it as a real credential outage, and
106
+ * memoized like multi-turn so the probe does not re-submit rejected
107
+ * credentials every cycle (lockout safety).
108
+ */
109
+ export declare const SELF_TEST_AUTH_FLOW_REJECTED_SKIP_REASON = "auth_flow_rejected";
64
110
  export interface SelfTestAppOptions {
65
111
  /** Derived-token verification secrets; without them every self-test route 404s. */
66
112
  secrets?: SelfTestMasterSecrets;
67
113
  /** In-process invoke bound to the tenant-facing app's /v1 pipeline. */
68
114
  invoke: SelfTestOperationInvoke;
115
+ /**
116
+ * In-process auth-flow driver bound to the tenant-facing app's /auth
117
+ * pipeline. Required for providers that declare `auth.mode: "credentials"`
118
+ * with a flow; without it their requiresConnection cases report a visible
119
+ * auth_flow_unavailable error instead of probing with raw inputs.
120
+ */
121
+ authFlow?: SelfTestAuthFlowInvoke;
69
122
  /** Overall request budget; defaults to env / 120s. */
70
123
  requestBudgetMs?: number;
71
124
  /** Env override for secret collection + budget resolution (tests). */
72
125
  env?: Readonly<Record<string, string | undefined>>;
126
+ /** Structured server logger; defaults to the same JSON console shape as the provider server. */
127
+ logger?: (event: SelfTestCancellationLogEvent) => void;
73
128
  }
74
129
  /**
75
130
  * Stable sha256 over the provider's declared health plan (operations, case
@@ -88,6 +143,65 @@ export declare function isSelfTestReadOnlyOperation(operation: OperationDefiniti
88
143
  export declare function createSelfTestInvoke(app: {
89
144
  request: (input: string, requestInit?: RequestInit) => Response | Promise<Response>;
90
145
  }): SelfTestOperationInvoke;
146
+ /** Binds the self-test auth-flow driver to a tenant app's /auth pipeline in-process. */
147
+ export declare function createSelfTestAuthFlowInvoke(app: {
148
+ request: (input: string, requestInit?: RequestInit) => Response | Promise<Response>;
149
+ }): SelfTestAuthFlowInvoke;
150
+ /**
151
+ * How long a memoized multi-turn flow outcome suppresses re-driving the auth
152
+ * flow. Generous on purpose: a multi-turn ceremony (OTP, device approval) is a
153
+ * provider property that changes on the timescale of releases, not probe
154
+ * cycles, and every re-drive is a REAL upstream login submission. The cache is
155
+ * in-process, so a pod restart also clears the entry.
156
+ */
157
+ export declare const SELF_TEST_MULTI_TURN_RETRY_AFTER_MS: number;
158
+ /**
159
+ * Age bound for POSITIVE cached credentials. Expiry modes that never produce
160
+ * a 401/403 (a 200 login page, an assertion failure) would otherwise replay
161
+ * the same stale session until pod restart — one re-login per day is the
162
+ * upstream-safe recovery for them.
163
+ */
164
+ export declare const SELF_TEST_CREDENTIAL_MAX_AGE_MS: number;
165
+ export type SelfTestCredentialSessionEntry =
166
+ /** Flow-materialized credential reused across probe cycles. */
167
+ {
168
+ kind: "credential";
169
+ credential: Record<string, string>;
170
+ cachedAtMs: number;
171
+ }
172
+ /**
173
+ * Negative entry: the flow did not complete in a single continue turn
174
+ * (`auth_flow_multi_turn`). Memoized so subsequent cycles report the skip
175
+ * WITHOUT contacting the upstream again — the first attempt already
176
+ * submitted real credentials (and may have triggered an OTP send).
177
+ */
178
+ | {
179
+ kind: "multi_turn";
180
+ cachedAtMs: number;
181
+ }
182
+ /**
183
+ * Negative entry: the flow REJECTED the submitted credential inputs
184
+ * (`retry` turn after continue — bad password, exchange failure).
185
+ * Memoized so the probe does not re-submit rejected credentials every
186
+ * cycle; a new entry is attempted when the inputs rotate (new hash),
187
+ * the TTL lapses, or the process restarts.
188
+ */
189
+ | {
190
+ kind: "rejected";
191
+ cachedAtMs: number;
192
+ };
193
+ /**
194
+ * In-process cache of per-(providerId + stable hash of credentialInputs) auth
195
+ * flow outcomes, so consecutive probe cycles reuse the session — or the
196
+ * memoized multi-turn skip — instead of logging in every cycle (upstream
197
+ * account safety, DR-7). Credential entries are invalidated on a probe auth
198
+ * failure, at most once; multi-turn entries expire after
199
+ * `SELF_TEST_MULTI_TURN_RETRY_AFTER_MS` or on process restart. Flow ERRORS
200
+ * (transport/protocol failures, thrown start/continue) are deliberately NEVER
201
+ * cached: they are typically transient, and retrying a failed request next
202
+ * cycle is not a repeated login submission.
203
+ */
204
+ export type SelfTestCredentialSessionCache = Map<string, SelfTestCredentialSessionEntry>;
91
205
  export declare function resolveSelfTestPort(env?: Readonly<Record<string, string | undefined>>): number;
92
206
  /**
93
207
  * Builds the internal self-test Hono app. This app is served on a SEPARATE