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

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 (166) hide show
  1. package/AUTHORING.md +14 -0
  2. package/CHANGELOG.md +8 -0
  3. package/bin/apifuse-check.ts +18 -58
  4. package/bin/apifuse-create.ts +1 -1
  5. package/bin/apifuse-dev.ts +27 -52
  6. package/bin/apifuse-pack-smoke.ts +22 -81
  7. package/bin/apifuse-pack-types.ts +266 -0
  8. package/bin/apifuse-perf.ts +45 -127
  9. package/bin/apifuse-record.ts +23 -61
  10. package/bin/apifuse-submit-check.ts +73 -30
  11. package/bin/apifuse.ts +1 -1
  12. package/bin/submit-check-xml-semantics.ts +204 -0
  13. package/bin/submit-check-xml.ts +134 -0
  14. package/dist/auth-turn/index.d.ts +1 -1
  15. package/dist/auth.d.ts +2 -2
  16. package/dist/auth.js +9 -18
  17. package/dist/ceremonies/index.d.ts +1 -1
  18. package/dist/ceremonies/index.js +8 -18
  19. package/dist/config/loader.d.ts +2 -2
  20. package/dist/config/loader.js +19 -42
  21. package/dist/contract-serialization.d.ts +2 -2
  22. package/dist/contract-serialization.js +3 -6
  23. package/dist/contract-types.d.ts +2 -2
  24. package/dist/contract.d.ts +3 -3
  25. package/dist/contract.js +4 -6
  26. package/dist/define.d.ts +8 -1
  27. package/dist/define.js +57 -115
  28. package/dist/dev.d.ts +1 -1
  29. package/dist/dev.js +1 -1
  30. package/dist/errors.d.ts +4 -1
  31. package/dist/errors.js +48 -0
  32. package/dist/i18n/catalog.d.ts +2 -2
  33. package/dist/i18n/catalog.js +4 -10
  34. package/dist/i18n/index.d.ts +2 -2
  35. package/dist/i18n/index.js +2 -2
  36. package/dist/i18n/keys.d.ts +2 -2
  37. package/dist/index.d.ts +43 -42
  38. package/dist/index.js +38 -37
  39. package/dist/lint.js +8 -15
  40. package/dist/provider.d.ts +11 -11
  41. package/dist/provider.js +9 -9
  42. package/dist/public-schema-field-lint.d.ts +1 -1
  43. package/dist/recipes/gov-api.js +1 -1
  44. package/dist/runtime/auth-flow.d.ts +1 -1
  45. package/dist/runtime/auth-flow.js +3 -3
  46. package/dist/runtime/browser.d.ts +1 -1
  47. package/dist/runtime/browser.js +15 -29
  48. package/dist/runtime/cache.d.ts +1 -1
  49. package/dist/runtime/cache.js +4 -8
  50. package/dist/runtime/choice.d.ts +1 -1
  51. package/dist/runtime/choice.js +12 -34
  52. package/dist/runtime/credential.d.ts +1 -1
  53. package/dist/runtime/credential.js +1 -1
  54. package/dist/runtime/env.d.ts +1 -1
  55. package/dist/runtime/executor.d.ts +1 -1
  56. package/dist/runtime/executor.js +8 -3
  57. package/dist/runtime/http.d.ts +2 -2
  58. package/dist/runtime/http.js +5 -5
  59. package/dist/runtime/insights.d.ts +1 -1
  60. package/dist/runtime/insights.js +6 -13
  61. package/dist/runtime/instrumentation.d.ts +2 -2
  62. package/dist/runtime/instrumentation.js +5 -15
  63. package/dist/runtime/keyring.js +1 -1
  64. package/dist/runtime/namespace.js +1 -1
  65. package/dist/runtime/otlp.d.ts +1 -1
  66. package/dist/runtime/perf.d.ts +1 -1
  67. package/dist/runtime/provider.d.ts +1 -1
  68. package/dist/runtime/provider.js +1 -2
  69. package/dist/runtime/proxy-errors.d.ts +1 -1
  70. package/dist/runtime/proxy-errors.js +3 -5
  71. package/dist/runtime/proxy-retry-policy.d.ts +2 -2
  72. package/dist/runtime/proxy-retry-policy.js +2 -2
  73. package/dist/runtime/proxy-telemetry.d.ts +1 -1
  74. package/dist/runtime/proxy-telemetry.js +16 -48
  75. package/dist/runtime/redis.d.ts +1 -1
  76. package/dist/runtime/redis.js +2 -4
  77. package/dist/runtime/request-options.d.ts +1 -1
  78. package/dist/runtime/state.d.ts +2 -2
  79. package/dist/runtime/state.js +3 -3
  80. package/dist/runtime/stealth.d.ts +2 -2
  81. package/dist/runtime/stealth.js +6 -6
  82. package/dist/runtime/stt.d.ts +1 -1
  83. package/dist/runtime/stt.js +11 -15
  84. package/dist/runtime/trace.d.ts +2 -2
  85. package/dist/runtime/trace.js +2 -4
  86. package/dist/runtime/waterfall.d.ts +1 -1
  87. package/dist/schema.d.ts +1 -1
  88. package/dist/schema.js +7 -15
  89. package/dist/serve.d.ts +1 -1
  90. package/dist/serve.js +1 -1
  91. package/dist/server/index.d.ts +7 -7
  92. package/dist/server/index.js +6 -6
  93. package/dist/server/self-test-redaction.d.ts +1 -1
  94. package/dist/server/self-test-redaction.js +1 -1
  95. package/dist/server/self-test.d.ts +3 -3
  96. package/dist/server/self-test.js +3 -3
  97. package/dist/server/serve.d.ts +3 -3
  98. package/dist/server/serve.js +49 -57
  99. package/dist/server/types.js +2 -7
  100. package/dist/stealth/profiles.d.ts +1 -1
  101. package/dist/stealth/profiles.js +5 -14
  102. package/dist/stream.d.ts +1 -1
  103. package/dist/testing/index.d.ts +2 -2
  104. package/dist/testing/index.js +2 -2
  105. package/dist/testing/run.d.ts +1 -1
  106. package/dist/testing/run.js +7 -14
  107. package/dist/types.d.ts +57 -0
  108. package/dist/user-input.d.ts +30 -0
  109. package/dist/user-input.js +66 -0
  110. package/package.json +7 -4
  111. package/src/auth-turn/index.ts +1 -1
  112. package/src/auth.ts +28 -86
  113. package/src/ceremonies/index.ts +24 -78
  114. package/src/config/loader.ts +58 -176
  115. package/src/contract-serialization.ts +5 -11
  116. package/src/contract-types.ts +2 -2
  117. package/src/contract.ts +12 -28
  118. package/src/define.ts +174 -495
  119. package/src/dev.ts +4 -9
  120. package/src/errors.ts +58 -5
  121. package/src/i18n/catalog.ts +10 -32
  122. package/src/i18n/index.ts +2 -2
  123. package/src/i18n/keys.ts +5 -11
  124. package/src/index.ts +44 -42
  125. package/src/lint.ts +89 -159
  126. package/src/provider.ts +15 -11
  127. package/src/public-schema-field-lint.ts +7 -33
  128. package/src/recipes/gov-api.ts +2 -5
  129. package/src/runtime/auth-flow.ts +5 -7
  130. package/src/runtime/browser.ts +64 -187
  131. package/src/runtime/cache.ts +20 -67
  132. package/src/runtime/choice.ts +55 -129
  133. package/src/runtime/credential.ts +2 -2
  134. package/src/runtime/env.ts +1 -1
  135. package/src/runtime/executor.ts +15 -20
  136. package/src/runtime/http.ts +7 -7
  137. package/src/runtime/insights.ts +15 -53
  138. package/src/runtime/instrumentation.ts +19 -58
  139. package/src/runtime/keyring.ts +7 -19
  140. package/src/runtime/namespace.ts +2 -7
  141. package/src/runtime/otlp.ts +12 -23
  142. package/src/runtime/perf.ts +1 -1
  143. package/src/runtime/provider.ts +4 -9
  144. package/src/runtime/proxy-errors.ts +17 -38
  145. package/src/runtime/proxy-retry-policy.ts +3 -3
  146. package/src/runtime/proxy-telemetry.ts +23 -72
  147. package/src/runtime/redis.ts +4 -12
  148. package/src/runtime/request-options.ts +4 -13
  149. package/src/runtime/state.ts +30 -109
  150. package/src/runtime/stealth.ts +8 -8
  151. package/src/runtime/stt.ts +38 -94
  152. package/src/runtime/trace.ts +14 -44
  153. package/src/runtime/waterfall.ts +5 -18
  154. package/src/schema.ts +23 -84
  155. package/src/serve.ts +1 -1
  156. package/src/server/index.ts +7 -7
  157. package/src/server/self-test-redaction.ts +2 -2
  158. package/src/server/self-test.ts +5 -5
  159. package/src/server/serve.ts +103 -252
  160. package/src/server/types.ts +6 -19
  161. package/src/stealth/profiles.ts +10 -26
  162. package/src/stream.ts +8 -19
  163. package/src/testing/index.ts +2 -2
  164. package/src/testing/run.ts +19 -67
  165. package/src/types.ts +58 -0
  166. package/src/user-input.ts +118 -0
package/dist/schema.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
- import { ValidationError } from "./errors";
3
- import { providerLocaleKey } from "./i18n/keys";
2
+ import { ValidationError } from "./errors.js";
3
+ import { providerLocaleKey } from "./i18n/keys.js";
4
4
  export { z };
5
5
  function isFailureResult(result) {
6
6
  return "issues" in result;
@@ -99,21 +99,15 @@ export function field(schema, options = {}) {
99
99
  const metadata = described.meta() ?? {};
100
100
  return described.meta({
101
101
  ...metadata,
102
- ...((options.sensitive ?? true)
103
- ? { [APIFUSE_SENSITIVE_META_KEY]: true }
104
- : {}),
105
- ...(options.kind
106
- ? { [APIFUSE_SENSITIVE_KIND_META_KEY]: options.kind }
107
- : {}),
102
+ ...((options.sensitive ?? true) ? { [APIFUSE_SENSITIVE_META_KEY]: true } : {}),
103
+ ...(options.kind ? { [APIFUSE_SENSITIVE_KIND_META_KEY]: options.kind } : {}),
108
104
  });
109
105
  }
110
106
  export function sensitive(schema, kind) {
111
107
  return field(schema, { sensitive: true, kind });
112
108
  }
113
109
  function sensitiveString(kind, description, options = {}) {
114
- const schema = options.minLength === undefined
115
- ? z.string()
116
- : z.string().min(options.minLength);
110
+ const schema = options.minLength === undefined ? z.string() : z.string().min(options.minLength);
117
111
  return field(schema, {
118
112
  kind,
119
113
  description: options.description ?? description,
@@ -132,8 +126,7 @@ export const fields = {
132
126
  };
133
127
  export function isSensitiveSchema(schema) {
134
128
  const metadata = readZodMetadata(schema);
135
- return (metadata !== undefined &&
136
- Reflect.get(metadata, APIFUSE_SENSITIVE_META_KEY) === true);
129
+ return metadata !== undefined && Reflect.get(metadata, APIFUSE_SENSITIVE_META_KEY) === true;
137
130
  }
138
131
  export function collectSensitivePaths(schema) {
139
132
  const out = [];
@@ -217,8 +210,7 @@ function pathMatches(path, patterns) {
217
210
  }
218
211
  function isReservedSensitiveKey(key) {
219
212
  const normalized = key.toLowerCase().replace(/[-_\s]/g, "");
220
- return (RESERVED_SENSITIVE_KEYS.has(normalized) ||
221
- RESERVED_SENSITIVE_KEYS.has(key.toLowerCase()));
213
+ return RESERVED_SENSITIVE_KEYS.has(normalized) || RESERVED_SENSITIVE_KEYS.has(key.toLowerCase());
222
214
  }
223
215
  function readZodMetadata(schema) {
224
216
  if (!schema || typeof schema !== "object" || !("meta" in schema)) {
package/dist/serve.d.ts CHANGED
@@ -1 +1 @@
1
- export { createServerApp, type ServeOptions, serve } from "./server/serve";
1
+ export { createServerApp, type ServeOptions, serve } from "./server/serve.js";
package/dist/serve.js CHANGED
@@ -1 +1 @@
1
- export { createServerApp, serve } from "./server/serve";
1
+ export { createServerApp, serve } from "./server/serve.js";
@@ -1,7 +1,7 @@
1
- export { createServerApp, type ServeOptions, serve } from "./serve";
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";
3
- export { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens";
4
- export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction";
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, type SelfTestMasterSecrets, verifySelfTestAuthorization, } from "./self-test-token";
6
- export type { AuthFlowRequest, AuthFlowResponse, AuthFlowSuccessResponse, ConnectionMode, OperationConnection, OperationErrorResponse, OperationRequest, OperationResponse, OperationSuccessResponse, } from "./types";
7
- export { AuthFlowRequestSchema, AuthFlowSuccessResponseSchema, ConnectionModeSchema, ErrorEnvelopeSchema, OperationConnectionSchema, OperationErrorResponseSchema, OperationRequestSchema, OperationSuccessResponseSchema, } from "./types";
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";
4
+ export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction.js";
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, type SelfTestMasterSecrets, verifySelfTestAuthorization, } from "./self-test-token.js";
6
+ export type { AuthFlowRequest, AuthFlowResponse, AuthFlowSuccessResponse, ConnectionMode, OperationConnection, OperationErrorResponse, OperationRequest, OperationResponse, OperationSuccessResponse, } from "./types.js";
7
+ export { AuthFlowRequestSchema, AuthFlowSuccessResponseSchema, ConnectionModeSchema, ErrorEnvelopeSchema, OperationConnectionSchema, OperationErrorResponseSchema, OperationRequestSchema, OperationSuccessResponseSchema, } from "./types.js";
@@ -1,6 +1,6 @@
1
- export { createServerApp, serve } from "./serve";
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";
3
- export { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens";
4
- export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction";
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";
6
- export { AuthFlowRequestSchema, AuthFlowSuccessResponseSchema, ConnectionModeSchema, ErrorEnvelopeSchema, OperationConnectionSchema, OperationErrorResponseSchema, OperationRequestSchema, OperationSuccessResponseSchema, } from "./types";
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";
4
+ export { collectSelfTestSensitiveValues, redactSelfTestText, SELF_TEST_MAX_TEXT_LENGTH, SELF_TEST_REDACTED_PLACEHOLDER, } from "./self-test-redaction.js";
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
+ export { AuthFlowRequestSchema, AuthFlowSuccessResponseSchema, ConnectionModeSchema, ErrorEnvelopeSchema, OperationConnectionSchema, OperationErrorResponseSchema, OperationRequestSchema, OperationSuccessResponseSchema, } from "./types.js";
@@ -1,4 +1,4 @@
1
- import type { ProviderDefinition } from "../types";
1
+ import type { ProviderDefinition } from "../types.js";
2
2
  export declare const SELF_TEST_REDACTED_PLACEHOLDER = "[REDACTED]";
3
3
  /** Maximum length of any string echoed in a self-test response. */
4
4
  export declare const SELF_TEST_MAX_TEXT_LENGTH = 300;
@@ -1,4 +1,4 @@
1
- import { PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV, } from "./self-test-token";
1
+ import { PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_ENV, PROVIDER_RUNTIME_SELF_TEST_MASTER_SECRET_PREVIOUS_ENV, } from "./self-test-token.js";
2
2
  export const SELF_TEST_REDACTED_PLACEHOLDER = "[REDACTED]";
3
3
  /** Maximum length of any string echoed in a self-test response. */
4
4
  export const SELF_TEST_MAX_TEXT_LENGTH = 300;
@@ -1,8 +1,8 @@
1
1
  import { Hono } from "hono";
2
2
  import { z } from "zod";
3
- import type { OperationDefinition, ProviderDefinition } from "../types";
4
- import { type SelfTestMasterSecrets } from "./self-test-token";
5
- import type { OperationConnection } from "./types";
3
+ import type { OperationDefinition, ProviderDefinition } from "../types.js";
4
+ import { type SelfTestMasterSecrets } from "./self-test-token.js";
5
+ import type { OperationConnection } from "./types.js";
6
6
  export declare const SELF_TEST_SCHEMA_VERSION: 1;
7
7
  export declare const SELF_TEST_PATH = "/internal/health/self-test";
8
8
  export declare const SELF_TEST_HEALTHZ_PATH = "/healthz";
@@ -2,9 +2,9 @@ import { createHash, randomUUID } from "node:crypto";
2
2
  import { readFileSync } from "node:fs";
3
3
  import { Hono } from "hono";
4
4
  import { z } from "zod";
5
- import { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens";
6
- import { collectSelfTestSensitiveValues, redactSelfTestText } from "./self-test-redaction";
7
- import { DEFAULT_SELF_TEST_PORT, PROVIDER_RUNTIME_SELF_TEST_PORT_ENV, verifySelfTestAuthorization, } from "./self-test-token";
5
+ import { resolveHealthCheckInputDateTokens } from "./self-test-input-tokens.js";
6
+ import { collectSelfTestSensitiveValues, redactSelfTestText } from "./self-test-redaction.js";
7
+ import { DEFAULT_SELF_TEST_PORT, PROVIDER_RUNTIME_SELF_TEST_PORT_ENV, verifySelfTestAuthorization, } from "./self-test-token.js";
8
8
  export const SELF_TEST_SCHEMA_VERSION = 1;
9
9
  export const SELF_TEST_PATH = "/internal/health/self-test";
10
10
  export const SELF_TEST_HEALTHZ_PATH = "/healthz";
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
- import { type ProviderErrorCategory } from "../observability";
3
- import type { ProviderDefinition, ProviderRuntimeState, SttContext } from "../types";
4
- import { type OperationRequest } from "./types";
2
+ import { type ProviderErrorCategory } from "../observability.js";
3
+ import type { ProviderDefinition, ProviderRuntimeState, SttContext } from "../types.js";
4
+ import { type OperationRequest } from "./types.js";
5
5
  export declare function resolveProviderProxyAffinityKey(provider: ProviderDefinition, request: OperationRequest, operationId: string): string;
6
6
  type ProviderRequestCost = {
7
7
  durationMs: number;
@@ -2,32 +2,32 @@ import { existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { Hono } from "hono";
4
4
  import { z } from "zod";
5
- import { AuthAbortError, createAuthFlowHelpers } from "../auth";
6
- import { AuthError, ProviderError, SessionExpiredError, TransportError, } from "../errors";
7
- import { loadProviderLocaleCatalogs, localizeAuthTurn, } from "../i18n/catalog";
8
- import { categoryForStatus, isRetryableCategory, PROVIDER_OBSERVABILITY_TAXONOMY_VERSION, } from "../observability";
9
- import { createScratchpad } from "../runtime/auth-flow";
10
- import { createBrowserClient } from "../runtime/browser";
11
- import { createProviderCache } from "../runtime/cache";
12
- import { createProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "../runtime/choice";
13
- import { createCredentialContext } from "../runtime/credential";
14
- import { createEnvContext } from "../runtime/env";
15
- import { executeOperation } from "../runtime/executor";
16
- import { createHttpClient } from "../runtime/http";
17
- import { wrapWithInstrumentation } from "../runtime/instrumentation";
18
- import { getProviderBaseUrl } from "../runtime/provider";
19
- import { PROXY_AUTH_IP_DENIED_CODE, PROXY_EDGE_AUTH_REJECTED_CODE, PROXY_POOL_EXHAUSTED_CODE, } from "../runtime/proxy-errors";
20
- import { PROVIDER_TELEMETRY_HEADER, ProxyTelemetryCollector, } from "../runtime/proxy-telemetry";
21
- import { createProviderRuntimeStateFromEnv, createUnsupportedProviderRuntimeState, } from "../runtime/state";
22
- import { createStealthClient } from "../runtime/stealth";
23
- import { createSttClientFromEnv } from "../runtime/stt";
24
- import { createTraceContext } from "../runtime/trace";
25
- import { parseSchema } from "../schema";
26
- import { getStealthProfile } from "../stealth/profiles";
27
- import { APIFUSE_STREAM_DONE_EVENT, APIFUSE_STREAM_ERROR_EVENT, encodeSseEvent, error as streamError, } from "../stream";
28
- import { createSelfTestApp, createSelfTestInvoke, resolveSelfTestPort, } from "./self-test";
29
- import { resolveSelfTestMasterSecrets } from "./self-test-token";
30
- import { AuthFlowRequestSchema, OperationRequestSchema, } from "./types";
5
+ import { AuthAbortError, createAuthFlowHelpers } from "../auth.js";
6
+ import { AuthError, isProviderError, isSessionExpiredError, isTransportError, ProviderError, } from "../errors.js";
7
+ import { loadProviderLocaleCatalogs, localizeAuthTurn, } from "../i18n/catalog.js";
8
+ import { categoryForStatus, isRetryableCategory, PROVIDER_OBSERVABILITY_TAXONOMY_VERSION, } from "../observability.js";
9
+ import { createScratchpad } from "../runtime/auth-flow.js";
10
+ import { createBrowserClient } from "../runtime/browser.js";
11
+ import { createProviderCache } from "../runtime/cache.js";
12
+ import { createProviderChoiceContext, PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV, } from "../runtime/choice.js";
13
+ import { createCredentialContext } from "../runtime/credential.js";
14
+ import { createEnvContext } from "../runtime/env.js";
15
+ import { executeOperation } from "../runtime/executor.js";
16
+ import { createHttpClient } from "../runtime/http.js";
17
+ import { wrapWithInstrumentation } from "../runtime/instrumentation.js";
18
+ import { getProviderBaseUrl } from "../runtime/provider.js";
19
+ import { PROXY_AUTH_IP_DENIED_CODE, PROXY_EDGE_AUTH_REJECTED_CODE, PROXY_POOL_EXHAUSTED_CODE, } from "../runtime/proxy-errors.js";
20
+ import { PROVIDER_TELEMETRY_HEADER, ProxyTelemetryCollector } from "../runtime/proxy-telemetry.js";
21
+ import { createProviderRuntimeStateFromEnv, createUnsupportedProviderRuntimeState, } from "../runtime/state.js";
22
+ import { createStealthClient } from "../runtime/stealth.js";
23
+ import { createSttClientFromEnv } from "../runtime/stt.js";
24
+ import { createTraceContext } from "../runtime/trace.js";
25
+ import { parseSchema } from "../schema.js";
26
+ import { getStealthProfile } from "../stealth/profiles.js";
27
+ import { APIFUSE_STREAM_DONE_EVENT, APIFUSE_STREAM_ERROR_EVENT, encodeSseEvent, error as streamError, } from "../stream.js";
28
+ import { createSelfTestApp, createSelfTestInvoke, resolveSelfTestPort } from "./self-test.js";
29
+ import { resolveSelfTestMasterSecrets } from "./self-test-token.js";
30
+ import { AuthFlowRequestSchema, OperationRequestSchema, } from "./types.js";
31
31
  const DEFAULT_HOST = "0.0.0.0";
32
32
  const DEFAULT_PORT = 3000;
33
33
  const AUTH_FLOW_LOCALES = ["en", "ko", "ja"];
@@ -93,9 +93,7 @@ function getProviderStealthBaseUrl(provider) {
93
93
  return firstHost ? `https://${firstHost}` : undefined;
94
94
  }
95
95
  function getProviderStealthProfile(provider) {
96
- return provider.stealth?.profile
97
- ? getStealthProfile(provider.stealth.profile)
98
- : undefined;
96
+ return provider.stealth?.profile ? getStealthProfile(provider.stealth.profile) : undefined;
99
97
  }
100
98
  function isProductionProviderBrowserMode(provider, env = process.env) {
101
99
  if (provider.runtime !== "browser") {
@@ -104,13 +102,11 @@ function isProductionProviderBrowserMode(provider, env = process.env) {
104
102
  if (env.APIFUSE__PROVIDER__RUNTIME === "browser") {
105
103
  return true;
106
104
  }
107
- return (env.NODE_ENV === "production" && env.APIFUSE__PROVIDER__ID === provider.id);
105
+ return env.NODE_ENV === "production" && env.APIFUSE__PROVIDER__ID === provider.id;
108
106
  }
109
107
  export function resolveProviderProxyAffinityKey(provider, request, operationId) {
110
108
  const connectionKey = resolveOperationConnectionId(request) ?? request.connection?.externalRef;
111
- const affinity = typeof provider.proxy === "object"
112
- ? provider.proxy.session?.affinity
113
- : undefined;
109
+ const affinity = typeof provider.proxy === "object" ? provider.proxy.session?.affinity : undefined;
114
110
  if (affinity === "operation") {
115
111
  return `${provider.id}/${operationId}`;
116
112
  }
@@ -293,7 +289,7 @@ function zodDetails(error) {
293
289
  }));
294
290
  }
295
291
  function toErrorResponse(error, requestId) {
296
- if (error instanceof ProviderError) {
292
+ if (isProviderError(error)) {
297
293
  const details = publicProviderErrorDetails(error);
298
294
  return {
299
295
  error: {
@@ -343,20 +339,25 @@ function publicProviderErrorDetails(error) {
343
339
  function isPlainRecord(value) {
344
340
  return value !== null && typeof value === "object" && !Array.isArray(value);
345
341
  }
342
+ // Accepts `unknown` so the branded guards narrow cleanly from the top: the
343
+ // subtype error classes are structurally compatible with ProviderError, so
344
+ // narrowing from a ProviderError-typed value would collapse the negative branch
345
+ // to `never`. Narrowing from unknown avoids that while still recognizing errors
346
+ // from a duplicate SDK module instance.
346
347
  function providerObservabilityDetails(error) {
347
348
  // Session-expiry surfaces the credential_expired category + the opt-in
348
349
  // retryable signal so Gateway/Credential Service can refresh and re-drive the
349
350
  // operation (see design.md §4.3 D3). Without this branch the auth error would
350
351
  // serialize as a bare 401 with no retryable/category, losing the refresh
351
352
  // signal for exactly the retryOnAuthRefresh operations it is meant to enable.
352
- if (error instanceof SessionExpiredError) {
353
+ if (isSessionExpiredError(error)) {
353
354
  return {
354
355
  category: error.options?.category ?? "credential_expired",
355
356
  taxonomyVersion: PROVIDER_OBSERVABILITY_TAXONOMY_VERSION,
356
357
  retryable: error.options?.retryable ?? false,
357
358
  };
358
359
  }
359
- if (!(error instanceof TransportError)) {
360
+ if (!isTransportError(error)) {
360
361
  return undefined;
361
362
  }
362
363
  const isProxyPoolCode = error.code === PROXY_POOL_EXHAUSTED_CODE ||
@@ -385,7 +386,7 @@ function providerObservabilityDetails(error) {
385
386
  };
386
387
  }
387
388
  function publicProviderErrorMessage(error) {
388
- if (error instanceof TransportError) {
389
+ if (isTransportError(error)) {
389
390
  if (error.code === PROXY_AUTH_IP_DENIED_CODE) {
390
391
  return error.message;
391
392
  }
@@ -413,10 +414,10 @@ function toStatusCode(error) {
413
414
  if (error instanceof z.ZodError) {
414
415
  return 400;
415
416
  }
416
- if (error instanceof TransportError) {
417
+ if (isTransportError(error)) {
417
418
  return error.code === "transport_timeout" ? 504 : 502;
418
419
  }
419
- if (error instanceof ProviderError) {
420
+ if (isProviderError(error)) {
420
421
  switch (error.code) {
421
422
  case "AUTH_REQUIRED":
422
423
  case "reauth_required":
@@ -448,16 +449,14 @@ function extractRequestId(raw) {
448
449
  return typeof value === "string" ? value : undefined;
449
450
  }
450
451
  function logProviderError(logger, provider, kind, route, requestId, error, status, cost) {
451
- const code = error instanceof ProviderError
452
+ const code = isProviderError(error)
452
453
  ? (error.code ?? "provider_error")
453
454
  : error instanceof z.ZodError
454
455
  ? "invalid_request"
455
456
  : "internal_error";
456
457
  const errorClass = error instanceof Error ? error.name : typeof error;
457
458
  const message = error instanceof Error ? error.message : String(error);
458
- const details = error instanceof ProviderError
459
- ? providerObservabilityDetails(error)
460
- : undefined;
459
+ const details = isProviderError(error) ? providerObservabilityDetails(error) : undefined;
461
460
  const emit = typeof logger === "function" ? logger : defaultProviderServerLogger;
462
461
  emit({
463
462
  level: status >= 500 ? "error" : "warn",
@@ -471,7 +470,7 @@ function logProviderError(logger, provider, kind, route, requestId, error, statu
471
470
  code,
472
471
  errorClass,
473
472
  message,
474
- ...(error instanceof TransportError && error.upstreamStatus
473
+ ...(isTransportError(error) && error.upstreamStatus
475
474
  ? { upstreamStatus: error.upstreamStatus }
476
475
  : {}),
477
476
  ...(details
@@ -594,8 +593,7 @@ async function validateSseEvent(operation, event) {
594
593
  const transport = getSseTransport(operation);
595
594
  const schema = transport?.events?.[event.event];
596
595
  if (!schema) {
597
- if (event.event === APIFUSE_STREAM_ERROR_EVENT ||
598
- event.event === APIFUSE_STREAM_DONE_EVENT) {
596
+ if (event.event === APIFUSE_STREAM_ERROR_EVENT || event.event === APIFUSE_STREAM_DONE_EVENT) {
599
597
  return event;
600
598
  }
601
599
  throw new ProviderError(`SSE event "${event.event}" is not declared in operation transport.events.`, {
@@ -714,8 +712,7 @@ function enforceStreamChunkLimit(body, maxChunkBytes) {
714
712
  }
715
713
  function toStreamingResponse(operation, result, cleanup, requestId) {
716
714
  const transport = operation.transport?.kind ?? "json";
717
- if (transport === "sse" &&
718
- (result instanceof Response || result instanceof ReadableStream)) {
715
+ if (transport === "sse" && (result instanceof Response || result instanceof ReadableStream)) {
719
716
  void cleanup();
720
717
  throw new ProviderError("SSE operations must return an AsyncIterable of typed stream.event(...) values.", {
721
718
  code: "SSE_RESULT_UNSUPPORTED",
@@ -726,9 +723,7 @@ function toStreamingResponse(operation, result, cleanup, requestId) {
726
723
  }
727
724
  if (result instanceof Response) {
728
725
  const httpTransport = getHttpStreamTransport(operation);
729
- if (httpTransport &&
730
- result.body &&
731
- httpTransport?.maxChunkBytes !== undefined) {
726
+ if (httpTransport && result.body && httpTransport?.maxChunkBytes !== undefined) {
732
727
  return responseWithCleanup(new Response(enforceStreamChunkLimit(result.body, httpTransport.maxChunkBytes), {
733
728
  headers: result.headers,
734
729
  status: result.status,
@@ -747,8 +742,7 @@ function toStreamingResponse(operation, result, cleanup, requestId) {
747
742
  ? { "Content-Type": "text/event-stream; charset=utf-8" }
748
743
  : {
749
744
  "Content-Type": operation.transport?.kind === "http-stream"
750
- ? (operation.transport.contentType ??
751
- "application/octet-stream")
745
+ ? (operation.transport.contentType ?? "application/octet-stream")
752
746
  : "application/octet-stream",
753
747
  },
754
748
  }), cleanup);
@@ -766,9 +760,7 @@ function getSseTransport(operation) {
766
760
  return operation.transport?.kind === "sse" ? operation.transport : undefined;
767
761
  }
768
762
  function getHttpStreamTransport(operation) {
769
- return operation.transport?.kind === "http-stream"
770
- ? operation.transport
771
- : undefined;
763
+ return operation.transport?.kind === "http-stream" ? operation.transport : undefined;
772
764
  }
773
765
  function toAuthFlowResponse(result, contextPatch) {
774
766
  if (result instanceof Response) {
@@ -796,7 +788,7 @@ function isAuthFlowLocale(value) {
796
788
  return value === "en" || value === "ko" || value === "ja";
797
789
  }
798
790
  function isAuthTurn(value) {
799
- return (!!value && typeof value === "object" && "kind" in value && "turnId" in value);
791
+ return !!value && typeof value === "object" && "kind" in value && "turnId" in value;
800
792
  }
801
793
  function loadAuthFlowLocaleCatalogs(provider) {
802
794
  for (const providerDir of [
@@ -1,11 +1,6 @@
1
1
  import { z } from "zod";
2
- import { HttpRetryPreset } from "../types";
3
- export const ConnectionModeSchema = z.enum([
4
- "oauth2",
5
- "credentials",
6
- "platform-managed",
7
- "none",
8
- ]);
2
+ import { HttpRetryPreset } from "../types.js";
3
+ export const ConnectionModeSchema = z.enum(["oauth2", "credentials", "platform-managed", "none"]);
9
4
  export const OperationConnectionSchema = z.object({
10
5
  id: z.string(),
11
6
  mode: ConnectionModeSchema,
@@ -1,4 +1,4 @@
1
- import type { StealthProfile } from "../types";
1
+ import type { StealthProfile } from "../types.js";
2
2
  export declare function generateLayer2Headers(profile: StealthProfile): Record<string, string>;
3
3
  export declare function getStealthProfile(name: string): StealthProfile;
4
4
  export declare function listStealthProfiles(): string[];
@@ -1,4 +1,4 @@
1
- import { SDKError } from "../errors";
1
+ import { SDKError } from "../errors.js";
2
2
  const CHROMIUM_HEADER_ORDER = [
3
3
  ":method",
4
4
  ":authority",
@@ -74,12 +74,8 @@ function createProfile(name, definition) {
74
74
  tlsClientIdentifier: definition.tlsClientIdentifier,
75
75
  ja3: definition.ja3,
76
76
  ja4: definition.ja4,
77
- h2Settings: definition.h2Settings
78
- ? { ...definition.h2Settings }
79
- : undefined,
80
- headerOrder: definition.headerOrder
81
- ? [...definition.headerOrder]
82
- : undefined,
77
+ h2Settings: definition.h2Settings ? { ...definition.h2Settings } : undefined,
78
+ headerOrder: definition.headerOrder ? [...definition.headerOrder] : undefined,
83
79
  };
84
80
  }
85
81
  function extractBrowserMajorVersion(profile) {
@@ -120,9 +116,7 @@ export function generateLayer2Headers(profile) {
120
116
  : `"Chromium";v="${majorVersion}", "Google Chrome";v="${majorVersion}", "Not)A;Brand";v="99"`;
121
117
  headers["Sec-Ch-Ua-Platform"] = toPlatformHeaderValue(profile.platform);
122
118
  headers["Sec-Ch-Ua-Mobile"] =
123
- profile.platform === "android" || profile.platform === "ios"
124
- ? "?1"
125
- : "?0";
119
+ profile.platform === "android" || profile.platform === "ios" ? "?1" : "?0";
126
120
  }
127
121
  return headers;
128
122
  }
@@ -252,8 +246,5 @@ export function getStealthProfile(name) {
252
246
  };
253
247
  }
254
248
  export function listStealthProfiles() {
255
- return [
256
- ...Object.keys(STEALTH_PROFILES),
257
- ...Object.keys(STEALTH_PROFILE_ALIASES),
258
- ];
249
+ return [...Object.keys(STEALTH_PROFILES), ...Object.keys(STEALTH_PROFILE_ALIASES)];
259
250
  }
package/dist/stream.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { SseMessage } from "./types";
1
+ import type { SseMessage } from "./types.js";
2
2
  export interface SseEvent<TData = unknown> {
3
3
  event: string;
4
4
  data: TData;
@@ -1,2 +1,2 @@
1
- export { describeTransform, snapshotTransform, toMatchShape } from "./helpers";
2
- export { runStandardTests } from "./run";
1
+ export { describeTransform, snapshotTransform, toMatchShape } from "./helpers.js";
2
+ export { runStandardTests } from "./run.js";
@@ -1,2 +1,2 @@
1
- export { describeTransform, snapshotTransform, toMatchShape } from "./helpers";
2
- export { runStandardTests } from "./run";
1
+ export { describeTransform, snapshotTransform, toMatchShape } from "./helpers.js";
2
+ export { runStandardTests } from "./run.js";
@@ -1,4 +1,4 @@
1
- import type { AuthMode, ProviderDefinition } from "../types";
1
+ import type { AuthMode, ProviderDefinition } from "../types.js";
2
2
  export interface StandardTestsManifest {
3
3
  id?: string;
4
4
  displayName?: string;
@@ -1,19 +1,14 @@
1
1
  import { describe, expect, it } from "bun:test";
2
- import { createProviderCache } from "../runtime/cache";
3
- import { createTestProviderChoiceContext } from "../runtime/choice";
4
- import { createMemoryProviderRuntimeState } from "../runtime/state";
5
- import { createUnsupportedSttClient } from "../runtime/stt";
6
- import { safeParseSchemaSync } from "../schema";
2
+ import { createProviderCache } from "../runtime/cache.js";
3
+ import { createTestProviderChoiceContext } from "../runtime/choice.js";
4
+ import { createMemoryProviderRuntimeState } from "../runtime/state.js";
5
+ import { createUnsupportedSttClient } from "../runtime/stt.js";
6
+ import { safeParseSchemaSync } from "../schema.js";
7
7
  // Mirrors CONNECTOR_ID_REGEX in ../define.ts, which defineProvider() enforces.
8
8
  // A single lowercase segment (no hyphen) is a valid id, so the trailing group
9
9
  // is optional (`*`), matching providers like `kakaomap`, `kstartup`, `triple`.
10
10
  const CONNECTOR_ID_REGEX = /^[a-z][a-z0-9]*(-[a-z][a-z0-9]*)*$/;
11
- const VALID_AUTH_MODES = [
12
- "none",
13
- "platform-managed",
14
- "credentials",
15
- "oauth2",
16
- ];
11
+ const VALID_AUTH_MODES = ["none", "platform-managed", "credentials", "oauth2"];
17
12
  const UPDATE_SNAPSHOT_ARGS = new Set(["-u", "--update-snapshots"]);
18
13
  function isFixtureEnvelope(value) {
19
14
  return (value !== null &&
@@ -60,9 +55,7 @@ function inferFixtureDir(providerId) {
60
55
  .map((line) => line.match(/\(?((?:file:\/\/)?[^():]+\.test\.ts)/)?.[1])
61
56
  .find((file) => file !== undefined);
62
57
  if (testFile) {
63
- const pathname = testFile.startsWith("file://")
64
- ? new URL(testFile).pathname
65
- : testFile;
58
+ const pathname = testFile.startsWith("file://") ? new URL(testFile).pathname : testFile;
66
59
  return `${pathname.replace(/\/[^/]+$/, "")}/../__fixtures__`;
67
60
  }
68
61
  return `providers/${providerId}/__fixtures__`;
package/dist/types.d.ts CHANGED
@@ -1418,6 +1418,19 @@ export interface OperationContractMetadata {
1418
1418
  deprecation?: OperationDeprecationMetadata;
1419
1419
  }
1420
1420
  export interface OperationDefinition<TInput extends SchemaLike = SchemaLike, TOutput extends SchemaLike = SchemaLike> {
1421
+ /**
1422
+ * Short English display title for the operation. The SDK passes it through
1423
+ * verbatim; the APIFuse registry derives the operation's en locale title
1424
+ * baseline from it (`docs.titleKey` remains available as an explicit key
1425
+ * override).
1426
+ */
1427
+ title?: string;
1428
+ /**
1429
+ * Raw English operation description. The SDK passes it through verbatim;
1430
+ * keyed descriptions via `descriptionKey` remain the primary flow, and
1431
+ * provider lint rules for raw prose descriptions still apply.
1432
+ */
1433
+ description?: string;
1421
1434
  descriptionKey?: ProviderLocaleKeyInput;
1422
1435
  docs?: OperationDocMeta;
1423
1436
  whenToUseKeys?: readonly ProviderLocaleKeyInput[];
@@ -1447,10 +1460,54 @@ export interface OperationDefinition<TInput extends SchemaLike = SchemaLike, TOu
1447
1460
  healthCheck?: HealthCheckSuite<InferSchemaOutput<TInput>, InferSchemaOutput<TOutput>>;
1448
1461
  healthCheckUnsupported?: HealthCheckUnsupported;
1449
1462
  }
1463
+ /**
1464
+ * Author-declared deployment overrides accepted as the optional top-level
1465
+ * `deployment` key on `defineProvider()`.
1466
+ *
1467
+ * The SDK passes this object through VERBATIM onto the returned provider
1468
+ * definition — it is typed here but deliberately not deep-validated: the
1469
+ * APIFuse registry builder owns deployment validation and resolves omitted
1470
+ * fields against the runtime deployment profiles. The shape mirrors the
1471
+ * registry's `ProviderDeploymentOverrides` contract; every field is
1472
+ * optional. Note that the deployment `runtime` axis
1473
+ * (`shared`/`dedicated`/`browser`) is distinct from the provider execution
1474
+ * `runtime` (`standard`/`shared`/`browser`).
1475
+ */
1476
+ export interface ProviderDeploymentOverrides {
1477
+ runtime?: "shared" | "dedicated" | "browser";
1478
+ language?: "typescript" | "python";
1479
+ replicas?: number;
1480
+ hpa?: {
1481
+ enabled: boolean;
1482
+ minReplicas?: number;
1483
+ maxReplicas?: number;
1484
+ targetCPUUtilizationPercentage?: number;
1485
+ };
1486
+ resources?: {
1487
+ cpu: string;
1488
+ memory: string;
1489
+ };
1490
+ cache?: {
1491
+ redis?: {
1492
+ enabled: boolean;
1493
+ url?: string;
1494
+ };
1495
+ };
1496
+ network?: {
1497
+ additionalTcpPorts?: number[];
1498
+ };
1499
+ buildContext?: string;
1500
+ }
1450
1501
  export interface ProviderDefinition {
1451
1502
  id: string;
1452
1503
  version: string;
1453
1504
  runtime: "standard" | "shared" | "browser";
1505
+ /**
1506
+ * Optional deployment overrides, passed through verbatim from
1507
+ * `defineProvider({ deployment })`. Validation and profile resolution are
1508
+ * owned by the APIFuse registry builder, not the SDK.
1509
+ */
1510
+ deployment?: ProviderDeploymentOverrides;
1454
1511
  allowedHosts?: string[];
1455
1512
  stealth?: {
1456
1513
  profile: string;
@@ -0,0 +1,30 @@
1
+ export declare const NEEDS_INPUT_STATUS: "needs_input";
2
+ export interface ProviderSelectionOption {
3
+ readonly selection_value: string;
4
+ readonly label: string;
5
+ readonly [extra: string]: unknown;
6
+ }
7
+ export interface ProviderRequiredSelection {
8
+ readonly selection_key: string;
9
+ readonly label: string;
10
+ readonly required: boolean;
11
+ readonly selection_type?: string;
12
+ readonly valid_options: readonly ProviderSelectionOption[];
13
+ readonly [extra: string]: unknown;
14
+ }
15
+ export interface ProviderSelectedOption {
16
+ readonly selection_key: string;
17
+ readonly selection_value: string;
18
+ /** Free-text answer for text-kind selections. */
19
+ readonly text?: string;
20
+ /** Quantity for quantity-kind selections. */
21
+ readonly quantity?: number;
22
+ }
23
+ export interface ProviderNeedsInputPayload {
24
+ readonly status: typeof NEEDS_INPUT_STATUS;
25
+ readonly required_selections: readonly ProviderRequiredSelection[];
26
+ readonly selected_options?: readonly ProviderSelectedOption[];
27
+ /** Provider-specific fresh state token(s), e.g. `reservation_state`. */
28
+ readonly [extra: string]: unknown;
29
+ }
30
+ export declare function isProviderNeedsInputPayload(value: unknown): value is ProviderNeedsInputPayload;