@apifuse/provider-sdk 2.2.0-beta.7 → 2.2.0-beta.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUTHORING.md +943 -51
- package/CHANGELOG.md +273 -1
- package/LICENSE +21 -0
- package/README.md +117 -29
- package/SUBMISSION.md +3 -2
- package/bin/apifuse-check.ts +293 -13
- package/bin/apifuse-dev.ts +42 -19
- package/bin/apifuse-migrate-deployment.ts +200 -0
- package/bin/apifuse-migrate-operation-declaration.ts +55 -0
- package/bin/apifuse-migrate-shape.ts +202 -0
- package/bin/apifuse-pack-check.ts +19 -6
- package/bin/apifuse-pack-smoke.ts +57 -2
- package/bin/apifuse-pack-types.ts +736 -38
- package/bin/apifuse-perf.ts +59 -23
- package/bin/apifuse-record.ts +923 -94
- package/bin/apifuse-submit-check.ts +2313 -281
- package/bin/apifuse-test.ts +3 -1
- package/bin/submit-check-delimited-text.ts +50 -0
- package/dist/auth-turn/index.d.ts +3 -3
- package/dist/auth-turn/index.js +1 -1
- package/dist/auth.d.ts +14 -0
- package/dist/auth.js +67 -0
- package/dist/ceremonies/index.d.ts +16 -0
- package/dist/ceremonies/index.js +141 -36
- package/dist/cli/commands.d.ts +1 -1
- package/dist/cli/commands.js +30 -0
- package/dist/cli/create.d.ts +1 -1
- package/dist/cli/create.js +8 -2
- package/dist/cli/deployment-intent.d.ts +178 -0
- package/dist/cli/deployment-intent.js +277 -0
- package/dist/cli/local-connection.d.ts +111 -0
- package/dist/cli/local-connection.js +151 -0
- package/dist/cli/migrate-deployment-intent.d.ts +132 -0
- package/dist/cli/migrate-deployment-intent.js +1552 -0
- package/dist/cli/migrate-operation-declaration.d.ts +70 -0
- package/dist/cli/migrate-operation-declaration.js +2206 -0
- package/dist/cli/migrate-operation-shape.d.ts +44 -0
- package/dist/cli/migrate-operation-shape.js +113 -0
- package/dist/cli/migrate-provider-shape.d.ts +56 -0
- package/dist/cli/migrate-provider-shape.js +580 -0
- package/dist/cli/resolver-runtime.d.ts +21 -0
- package/dist/cli/resolver-runtime.js +31 -0
- package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
- package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
- package/dist/cli/templates/provider/README.md.tpl +41 -19
- package/dist/cli/templates/provider/index.ts.tpl +6 -3
- package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
- package/dist/cli/templates/provider/provider.json.tpl +6 -0
- package/dist/config/loader.d.ts +202 -16
- package/dist/config/loader.js +491 -141
- package/dist/contract-serialization.js +4 -8
- package/dist/contract-types.d.ts +12 -5
- package/dist/contract.js +24 -10
- package/dist/declaration-validation.d.ts +34 -0
- package/dist/declaration-validation.js +305 -0
- package/dist/define.d.ts +71 -29
- package/dist/define.js +807 -69
- package/dist/dev.d.ts +5 -0
- package/dist/dev.js +8 -1
- package/dist/engine.d.ts +129 -0
- package/dist/engine.js +209 -0
- package/dist/error-observability.d.ts +7 -0
- package/dist/error-observability.js +61 -0
- package/dist/error-resolution.d.ts +18 -0
- package/dist/error-resolution.js +243 -0
- package/dist/errors.d.ts +74 -0
- package/dist/errors.js +99 -0
- package/dist/fixture-sanitization.d.ts +28 -0
- package/dist/fixture-sanitization.js +371 -0
- package/dist/handle-meta.d.ts +90 -0
- package/dist/handle-meta.js +73 -0
- package/dist/handle.d.ts +226 -0
- package/dist/handle.js +345 -0
- package/dist/health-scenario.d.ts +1901 -0
- package/dist/health-scenario.js +653 -0
- package/dist/i18n/catalog.js +21 -1
- package/dist/i18n/error-messages.d.ts +86 -0
- package/dist/i18n/error-messages.js +192 -0
- package/dist/i18n/index.d.ts +1 -0
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/keys.d.ts +12 -0
- package/dist/i18n/keys.js +76 -5
- package/dist/i18n/operation-locale-namespace.d.ts +2 -0
- package/dist/i18n/operation-locale-namespace.js +7 -0
- package/dist/index.d.ts +40 -15
- package/dist/index.js +29 -11
- package/dist/lint.d.ts +43 -11
- package/dist/lint.js +2512 -177
- package/dist/native-address.d.ts +43 -0
- package/dist/native-address.js +281 -0
- package/dist/native-egress-policy.d.ts +31 -0
- package/dist/native-egress-policy.js +288 -0
- package/dist/observability.d.ts +5 -2
- package/dist/observability.js +48 -1
- package/dist/provider.d.ts +18 -8
- package/dist/provider.js +11 -6
- package/dist/runtime/auth-flow.d.ts +6 -1
- package/dist/runtime/auth-flow.js +8 -0
- package/dist/runtime/bounded-expiring-map.d.ts +21 -0
- package/dist/runtime/bounded-expiring-map.js +64 -0
- package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
- package/dist/runtime/browser-telemetry-binding.js +83 -0
- package/dist/runtime/browser-telemetry.d.ts +76 -0
- package/dist/runtime/browser-telemetry.js +165 -0
- package/dist/runtime/browser.d.ts +4 -0
- package/dist/runtime/browser.js +688 -83
- package/dist/runtime/cache-telemetry.d.ts +71 -0
- package/dist/runtime/cache-telemetry.js +177 -0
- package/dist/runtime/cache.d.ts +3 -0
- package/dist/runtime/cache.js +245 -23
- package/dist/runtime/capability-response.d.ts +3 -0
- package/dist/runtime/capability-response.js +56 -0
- package/dist/runtime/capability-telemetry.d.ts +46 -0
- package/dist/runtime/capability-telemetry.js +68 -0
- package/dist/runtime/chrome149-header-order.d.ts +58 -0
- package/dist/runtime/chrome149-header-order.js +289 -0
- package/dist/runtime/diagnostic-env-values.d.ts +5 -0
- package/dist/runtime/diagnostic-env-values.js +57 -0
- package/dist/runtime/diagnostic-env.d.ts +14 -0
- package/dist/runtime/diagnostic-env.js +44 -0
- package/dist/runtime/diagnostic-redactor.d.ts +54 -0
- package/dist/runtime/diagnostic-redactor.js +571 -0
- package/dist/runtime/egress-lease.d.ts +65 -0
- package/dist/runtime/egress-lease.js +236 -0
- package/dist/runtime/engine-mode.d.ts +74 -0
- package/dist/runtime/engine-mode.js +152 -0
- package/dist/runtime/env.js +14 -1
- package/dist/runtime/executor.d.ts +3 -2
- package/dist/runtime/executor.js +23 -26
- package/dist/runtime/handle-wordlist.d.ts +43 -0
- package/dist/runtime/handle-wordlist.js +256 -0
- package/dist/runtime/handle.d.ts +71 -0
- package/dist/runtime/handle.js +908 -0
- package/dist/runtime/http-telemetry-binding.d.ts +10 -0
- package/dist/runtime/http-telemetry-binding.js +152 -0
- package/dist/runtime/http-telemetry-guard.d.ts +16 -0
- package/dist/runtime/http-telemetry-guard.js +202 -0
- package/dist/runtime/http-telemetry.d.ts +104 -0
- package/dist/runtime/http-telemetry.js +190 -0
- package/dist/runtime/http.d.ts +34 -0
- package/dist/runtime/http.js +680 -121
- package/dist/runtime/insights.js +2 -2
- package/dist/runtime/instrumentation.d.ts +2 -2
- package/dist/runtime/instrumentation.js +462 -19
- package/dist/runtime/native-network-errors.d.ts +33 -0
- package/dist/runtime/native-network-errors.js +69 -0
- package/dist/runtime/native-network.d.ts +105 -0
- package/dist/runtime/native-network.js +1433 -0
- package/dist/runtime/native-telemetry.d.ts +142 -0
- package/dist/runtime/native-telemetry.js +231 -0
- package/dist/runtime/ocr-telemetry.d.ts +82 -0
- package/dist/runtime/ocr-telemetry.js +192 -0
- package/dist/runtime/ocr.d.ts +29 -0
- package/dist/runtime/ocr.js +468 -0
- package/dist/runtime/otlp.d.ts +71 -2
- package/dist/runtime/otlp.js +398 -16
- package/dist/runtime/provider.d.ts +7 -0
- package/dist/runtime/provider.js +14 -0
- package/dist/runtime/proxy-errors.js +6 -2
- package/dist/runtime/proxy-nodemaven.d.ts +56 -0
- package/dist/runtime/proxy-nodemaven.js +147 -0
- package/dist/runtime/proxy-retry-policy.d.ts +4 -1
- package/dist/runtime/proxy-retry-policy.js +11 -2
- package/dist/runtime/proxy-telemetry.d.ts +133 -3
- package/dist/runtime/proxy-telemetry.js +218 -70
- package/dist/runtime/redirect-hop-headers.d.ts +19 -0
- package/dist/runtime/redirect-hop-headers.js +58 -0
- package/dist/runtime/redirects.d.ts +61 -0
- package/dist/runtime/redirects.js +149 -0
- package/dist/runtime/redis.d.ts +1 -1
- package/dist/runtime/redis.js +4 -2
- package/dist/runtime/request-options.d.ts +75 -1
- package/dist/runtime/request-options.js +588 -0
- package/dist/runtime/request-telemetry.d.ts +70 -0
- package/dist/runtime/request-telemetry.js +229 -0
- package/dist/runtime/resolver-config.d.ts +13 -0
- package/dist/runtime/resolver-config.js +14 -0
- package/dist/runtime/resolver-public.d.ts +3 -0
- package/dist/runtime/resolver-public.js +1 -0
- package/dist/runtime/resolver-runtime-options.d.ts +14 -0
- package/dist/runtime/resolver-runtime-options.js +33 -0
- package/dist/runtime/resolver-shared.d.ts +24 -0
- package/dist/runtime/resolver-shared.js +69 -0
- package/dist/runtime/resolver-span-attributes.d.ts +34 -0
- package/dist/runtime/resolver-span-attributes.js +93 -0
- package/dist/runtime/resolver-telemetry.d.ts +135 -0
- package/dist/runtime/resolver-telemetry.js +204 -0
- package/dist/runtime/resolver-usage.d.ts +32 -0
- package/dist/runtime/resolver-usage.js +54 -0
- package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
- package/dist/runtime/resolver-vendors/bindings.js +45 -0
- package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
- package/dist/runtime/resolver-vendors/browser.js +423 -0
- package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
- package/dist/runtime/resolver-vendors/capsolver.js +544 -0
- package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
- package/dist/runtime/resolver-vendors/hosts.js +68 -0
- package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
- package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
- package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
- package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
- package/dist/runtime/resolver-vendors/types.d.ts +125 -0
- package/dist/runtime/resolver-vendors/types.js +106 -0
- package/dist/runtime/resolver.d.ts +79 -0
- package/dist/runtime/resolver.js +1094 -0
- package/dist/runtime/state-telemetry.d.ts +79 -0
- package/dist/runtime/state-telemetry.js +194 -0
- package/dist/runtime/state.d.ts +10 -1
- package/dist/runtime/state.js +322 -82
- package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
- package/dist/runtime/stealth-akamai-sbsd.js +142 -0
- package/dist/runtime/stealth-cookies.d.ts +24 -0
- package/dist/runtime/stealth-cookies.js +131 -0
- package/dist/runtime/stealth-owned-headers.d.ts +39 -0
- package/dist/runtime/stealth-owned-headers.js +57 -0
- package/dist/runtime/stealth-telemetry.d.ts +92 -0
- package/dist/runtime/stealth-telemetry.js +179 -0
- package/dist/runtime/stealth.d.ts +45 -6
- package/dist/runtime/stealth.js +1775 -320
- package/dist/runtime/stt-telemetry.d.ts +77 -0
- package/dist/runtime/stt-telemetry.js +176 -0
- package/dist/runtime/stt.js +18 -19
- package/dist/runtime/timeout.d.ts +5 -0
- package/dist/runtime/timeout.js +12 -0
- package/dist/runtime/trace-config.d.ts +12 -0
- package/dist/runtime/trace-config.js +62 -0
- package/dist/runtime/trace.d.ts +17 -0
- package/dist/runtime/trace.js +176 -25
- package/dist/runtime-boundary-lint.d.ts +137 -0
- package/dist/runtime-boundary-lint.js +590 -0
- package/dist/schema.d.ts +20 -0
- package/dist/schema.js +72 -2
- package/dist/serve.d.ts +1 -1
- package/dist/serve.js +1 -1
- package/dist/server/error-observability.d.ts +1 -0
- package/dist/server/error-observability.js +1 -0
- package/dist/server/error-stack-frames.d.ts +35 -0
- package/dist/server/error-stack-frames.js +219 -0
- package/dist/server/index.d.ts +21 -2
- package/dist/server/index.js +11 -2
- package/dist/server/runtime-diagnostics.d.ts +165 -0
- package/dist/server/runtime-diagnostics.js +360 -0
- package/dist/server/sdk-version.d.ts +3 -0
- package/dist/server/sdk-version.js +19 -0
- package/dist/server/self-test-input-tokens.d.ts +2 -1
- package/dist/server/self-test-input-tokens.js +18 -14
- package/dist/server/self-test-redaction.js +8 -33
- package/dist/server/self-test.d.ts +18 -3
- package/dist/server/self-test.js +139 -76
- package/dist/server/sensitive-values.d.ts +26 -0
- package/dist/server/sensitive-values.js +137 -0
- package/dist/server/serve-implementation.d.ts +285 -0
- package/dist/server/serve-implementation.js +3172 -0
- package/dist/server/serve.d.ts +1 -75
- package/dist/server/serve.js +1 -1170
- package/dist/server/state-backend-report.d.ts +70 -0
- package/dist/server/state-backend-report.js +113 -0
- package/dist/server/trace-output.d.ts +7 -0
- package/dist/server/trace-output.js +111 -0
- package/dist/server/types.d.ts +37 -5
- package/dist/server/types.js +34 -1
- package/dist/stateful/errors.d.ts +19 -0
- package/dist/stateful/errors.js +24 -0
- package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
- package/dist/stateful/http-provider-event-emitter.js +237 -0
- package/dist/stateful/http-session-owner-registry.d.ts +44 -0
- package/dist/stateful/http-session-owner-registry.js +210 -0
- package/dist/stateful/index.d.ts +18 -0
- package/dist/stateful/index.js +18 -0
- package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
- package/dist/stateful/provider-event-delivery-failures.js +43 -0
- package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
- package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
- package/dist/stateful/provider-event-pipeline.d.ts +50 -0
- package/dist/stateful/provider-event-pipeline.js +1 -0
- package/dist/stateful/provider-events.d.ts +101 -0
- package/dist/stateful/provider-events.js +289 -0
- package/dist/stateful/session-key.d.ts +15 -0
- package/dist/stateful/session-key.js +86 -0
- package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
- package/dist/stateful/stateful-provider-adapter-context.js +42 -0
- package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
- package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
- package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
- package/dist/stateful/stateful-provider-adapter.js +287 -0
- package/dist/stateful/stateful-provider-observability.d.ts +62 -0
- package/dist/stateful/stateful-provider-observability.js +161 -0
- package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
- package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
- package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
- package/dist/stateful/stateful-provider-runtime-context.js +61 -0
- package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
- package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
- package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
- package/dist/stateful/stateful-provider-session-routing.js +345 -0
- package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
- package/dist/stateful/stateful-provider-session-runtime.js +245 -0
- package/dist/stateful-signing.d.ts +18 -0
- package/dist/stateful-signing.js +27 -0
- package/dist/stealth/profiles.d.ts +15 -4
- package/dist/stealth/profiles.js +169 -211
- package/dist/stream-evidence.d.ts +74 -0
- package/dist/stream-evidence.js +785 -0
- package/dist/stream.js +7 -1
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/run.d.ts +32 -2
- package/dist/testing/run.js +509 -25
- package/dist/trace-sanitization.d.ts +6 -0
- package/dist/trace-sanitization.js +68 -0
- package/dist/types.d.ts +899 -210
- package/dist/types.js +1 -0
- package/dist/typescript-module.d.ts +39 -0
- package/dist/typescript-module.js +72 -0
- package/package.json +52 -6
- package/src/auth-turn/index.ts +1 -1
- package/src/auth.ts +118 -0
- package/src/ceremonies/index.ts +189 -46
- package/src/cli/commands.ts +37 -0
- package/src/cli/create.ts +8 -2
- package/src/cli/deployment-intent.ts +364 -0
- package/src/cli/local-connection.ts +221 -0
- package/src/cli/migrate-deployment-intent.ts +1908 -0
- package/src/cli/migrate-operation-declaration.ts +3026 -0
- package/src/cli/migrate-operation-shape.ts +184 -0
- package/src/cli/migrate-provider-shape.ts +778 -0
- package/src/cli/resolver-runtime.ts +72 -0
- package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
- package/src/cli/templates/provider/Dockerfile.tpl +1 -1
- package/src/cli/templates/provider/README.md.tpl +41 -19
- package/src/cli/templates/provider/index.ts.tpl +6 -3
- package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
- package/src/cli/templates/provider/provider.json.tpl +6 -0
- package/src/config/loader.ts +774 -181
- package/src/contract-serialization.ts +5 -7
- package/src/contract-types.ts +12 -5
- package/src/contract.ts +24 -10
- package/src/declaration-validation.ts +376 -0
- package/src/define.ts +1105 -131
- package/src/dev.ts +13 -1
- package/src/engine.ts +390 -0
- package/src/error-observability.ts +64 -0
- package/src/error-resolution.ts +269 -0
- package/src/errors.ts +157 -0
- package/src/fixture-sanitization.ts +422 -0
- package/src/handle-meta.ts +143 -0
- package/src/handle.ts +694 -0
- package/src/health-scenario.ts +960 -0
- package/src/i18n/catalog.ts +23 -1
- package/src/i18n/error-messages.ts +255 -0
- package/src/i18n/index.ts +1 -0
- package/src/i18n/keys.ts +80 -6
- package/src/i18n/operation-locale-namespace.ts +10 -0
- package/src/index.ts +390 -23
- package/src/lint.ts +2975 -234
- package/src/native-address.ts +340 -0
- package/src/native-egress-policy.ts +358 -0
- package/src/observability.ts +51 -1
- package/src/provider.ts +207 -27
- package/src/runtime/auth-flow.ts +15 -0
- package/src/runtime/bounded-expiring-map.ts +67 -0
- package/src/runtime/browser-telemetry-binding.ts +92 -0
- package/src/runtime/browser-telemetry.ts +289 -0
- package/src/runtime/browser.ts +882 -99
- package/src/runtime/cache-telemetry.ts +247 -0
- package/src/runtime/cache.ts +258 -22
- package/src/runtime/capability-response.ts +53 -0
- package/src/runtime/capability-telemetry.ts +101 -0
- package/src/runtime/chrome149-header-order.ts +330 -0
- package/src/runtime/diagnostic-env-values.ts +56 -0
- package/src/runtime/diagnostic-env.ts +65 -0
- package/src/runtime/diagnostic-redactor.ts +668 -0
- package/src/runtime/egress-lease.ts +341 -0
- package/src/runtime/engine-mode.ts +233 -0
- package/src/runtime/env.ts +15 -1
- package/src/runtime/executor.ts +39 -32
- package/src/runtime/handle-wordlist.ts +266 -0
- package/src/runtime/handle.ts +1180 -0
- package/src/runtime/http-telemetry-binding.ts +162 -0
- package/src/runtime/http-telemetry-guard.ts +208 -0
- package/src/runtime/http-telemetry.ts +292 -0
- package/src/runtime/http.ts +896 -150
- package/src/runtime/insights.ts +2 -2
- package/src/runtime/instrumentation.ts +628 -28
- package/src/runtime/native-network-errors.ts +99 -0
- package/src/runtime/native-network.ts +1853 -0
- package/src/runtime/native-telemetry.ts +366 -0
- package/src/runtime/ocr-telemetry.ts +308 -0
- package/src/runtime/ocr.ts +564 -0
- package/src/runtime/otlp.ts +468 -21
- package/src/runtime/provider.ts +15 -0
- package/src/runtime/proxy-errors.ts +12 -4
- package/src/runtime/proxy-nodemaven.ts +222 -0
- package/src/runtime/proxy-retry-policy.ts +12 -1
- package/src/runtime/proxy-telemetry.ts +358 -103
- package/src/runtime/redirect-hop-headers.ts +71 -0
- package/src/runtime/redirects.ts +215 -0
- package/src/runtime/redis.ts +7 -2
- package/src/runtime/request-options.ts +728 -1
- package/src/runtime/request-telemetry.ts +375 -0
- package/src/runtime/resolver-config.ts +18 -0
- package/src/runtime/resolver-public.ts +44 -0
- package/src/runtime/resolver-runtime-options.ts +50 -0
- package/src/runtime/resolver-shared.ts +113 -0
- package/src/runtime/resolver-span-attributes.ts +139 -0
- package/src/runtime/resolver-telemetry.ts +362 -0
- package/src/runtime/resolver-usage.ts +99 -0
- package/src/runtime/resolver-vendors/bindings.ts +61 -0
- package/src/runtime/resolver-vendors/browser.ts +591 -0
- package/src/runtime/resolver-vendors/capsolver.ts +727 -0
- package/src/runtime/resolver-vendors/hosts.ts +81 -0
- package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
- package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
- package/src/runtime/resolver-vendors/types.ts +261 -0
- package/src/runtime/resolver.ts +1543 -0
- package/src/runtime/state-telemetry.ts +298 -0
- package/src/runtime/state.ts +435 -89
- package/src/runtime/stealth-akamai-sbsd.ts +207 -0
- package/src/runtime/stealth-cookies.ts +155 -0
- package/src/runtime/stealth-owned-headers.ts +67 -0
- package/src/runtime/stealth-telemetry.ts +309 -0
- package/src/runtime/stealth.ts +2275 -372
- package/src/runtime/stt-telemetry.ts +282 -0
- package/src/runtime/stt.ts +96 -91
- package/src/runtime/timeout.ts +18 -0
- package/src/runtime/trace-config.ts +78 -0
- package/src/runtime/trace.ts +257 -35
- package/src/runtime-boundary-lint.ts +707 -0
- package/src/schema.ts +80 -2
- package/src/serve.ts +6 -1
- package/src/server/error-observability.ts +1 -0
- package/src/server/error-stack-frames.ts +214 -0
- package/src/server/index.ts +184 -2
- package/src/server/runtime-diagnostics.ts +522 -0
- package/src/server/sdk-version.ts +22 -0
- package/src/server/self-test-input-tokens.ts +29 -14
- package/src/server/self-test-redaction.ts +10 -40
- package/src/server/self-test.ts +205 -89
- package/src/server/sensitive-values.ts +211 -0
- package/src/server/serve-implementation.ts +4596 -0
- package/src/server/serve.ts +1 -1685
- package/src/server/state-backend-report.ts +185 -0
- package/src/server/trace-output.ts +189 -0
- package/src/server/types.ts +34 -1
- package/src/stateful/README.md +146 -0
- package/src/stateful/errors.ts +35 -0
- package/src/stateful/http-provider-event-emitter.ts +314 -0
- package/src/stateful/http-session-owner-registry.ts +306 -0
- package/src/stateful/index.ts +18 -0
- package/src/stateful/provider-event-delivery-failures.ts +80 -0
- package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
- package/src/stateful/provider-event-pipeline.ts +61 -0
- package/src/stateful/provider-events.ts +462 -0
- package/src/stateful/session-key.ts +111 -0
- package/src/stateful/stateful-provider-adapter-context.ts +59 -0
- package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
- package/src/stateful/stateful-provider-adapter.ts +562 -0
- package/src/stateful/stateful-provider-observability.ts +261 -0
- package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
- package/src/stateful/stateful-provider-runtime-context.ts +96 -0
- package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
- package/src/stateful/stateful-provider-session-routing.ts +546 -0
- package/src/stateful/stateful-provider-session-runtime.ts +403 -0
- package/src/stateful-signing.ts +46 -0
- package/src/stealth/profiles.ts +212 -231
- package/src/stream-evidence.ts +988 -0
- package/src/stream.ts +8 -1
- package/src/testing/index.ts +10 -1
- package/src/testing/run.ts +685 -19
- package/src/trace-sanitization.ts +110 -0
- package/src/types.ts +1014 -273
- package/src/typescript-module.ts +100 -0
- package/dist/choice-token.d.ts +0 -24
- package/dist/choice-token.js +0 -74
- package/dist/runtime/choice.d.ts +0 -15
- package/dist/runtime/choice.js +0 -413
- package/src/choice-token.ts +0 -165
- package/src/runtime/choice.ts +0 -686
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { SttContext } from "../types.js";
|
|
2
|
+
import { type ClosedEnum, type SpanIndex, type TelemetryContributor } from "./request-telemetry.js";
|
|
3
|
+
export type SttTelemetryBackend = "cloudflare-workers-ai" | "custom" | "unavailable";
|
|
4
|
+
export type SttTelemetryEngine = "workers-ai" | "custom";
|
|
5
|
+
export type SttTelemetryErrorCode = "STT_UNAVAILABLE" | "UNSUPPORTED_STT_BACKEND" | "STT_UPSTREAM_FAILED" | "STT_AUDIO_TOO_LARGE" | "UNSUPPORTED_STT_OPTION" | "INVALID_STT_AUDIO" | "INVALID_STT_VERIFICATION_CODE_OPTIONS" | "NO_CODE_FOUND" | "AMBIGUOUS_CODE" | "transport_network_error" | "transport_timeout" | "other";
|
|
6
|
+
export type SttTelemetryModel = "whisper-large-v3-turbo";
|
|
7
|
+
export type SttTelemetryEvent = {
|
|
8
|
+
backend: SttTelemetryBackend;
|
|
9
|
+
engine: SttTelemetryEngine;
|
|
10
|
+
model?: string;
|
|
11
|
+
ms: number;
|
|
12
|
+
status?: number;
|
|
13
|
+
audioBytes?: number;
|
|
14
|
+
durationMs?: number;
|
|
15
|
+
usage?: number;
|
|
16
|
+
warnings?: number;
|
|
17
|
+
errorCode?: SttTelemetryErrorCode;
|
|
18
|
+
diagnostics?: string;
|
|
19
|
+
};
|
|
20
|
+
export interface SttTelemetrySink {
|
|
21
|
+
record(event: SttTelemetryEvent): void;
|
|
22
|
+
markTelemetryFailed?(): void;
|
|
23
|
+
}
|
|
24
|
+
export type SttTelemetryLogPayload = {
|
|
25
|
+
telemetryFailed?: true;
|
|
26
|
+
diagnostics?: string[];
|
|
27
|
+
backend: SttTelemetryBackend;
|
|
28
|
+
engine: SttTelemetryEngine;
|
|
29
|
+
model?: string;
|
|
30
|
+
ms: number;
|
|
31
|
+
status?: number;
|
|
32
|
+
audioBytes: number;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
usage: number;
|
|
35
|
+
warnings: number;
|
|
36
|
+
lastErrorCode?: SttTelemetryErrorCode;
|
|
37
|
+
samples?: Array<Omit<SttTelemetryEvent, "backend" | "engine" | "model" | "diagnostics">>;
|
|
38
|
+
samplesDropped?: number;
|
|
39
|
+
};
|
|
40
|
+
export type SttTelemetryHeaderPayload = {
|
|
41
|
+
backend: ClosedEnum<SttTelemetryBackend>;
|
|
42
|
+
engine: ClosedEnum<SttTelemetryEngine>;
|
|
43
|
+
model?: ClosedEnum<SttTelemetryModel>;
|
|
44
|
+
ms: number;
|
|
45
|
+
status?: number;
|
|
46
|
+
audioBytes: number;
|
|
47
|
+
durationMs: number;
|
|
48
|
+
usage: number;
|
|
49
|
+
warnings: number;
|
|
50
|
+
lastErrorCode?: ClosedEnum<SttTelemetryErrorCode>;
|
|
51
|
+
samples?: Array<{
|
|
52
|
+
ms: number;
|
|
53
|
+
status?: number;
|
|
54
|
+
audioBytes?: number;
|
|
55
|
+
durationMs?: number;
|
|
56
|
+
usage?: number;
|
|
57
|
+
warnings?: number;
|
|
58
|
+
errorCode?: ClosedEnum<SttTelemetryErrorCode>;
|
|
59
|
+
}>;
|
|
60
|
+
samplesDropped?: number;
|
|
61
|
+
};
|
|
62
|
+
export declare class SttTelemetryCollector implements SttTelemetrySink, TelemetryContributor<SttTelemetryLogPayload, SttTelemetryHeaderPayload> {
|
|
63
|
+
#private;
|
|
64
|
+
readonly key: "stt";
|
|
65
|
+
constructor(options?: {
|
|
66
|
+
redact?: (text: string) => string;
|
|
67
|
+
});
|
|
68
|
+
markTelemetryFailed(): void;
|
|
69
|
+
record(event: SttTelemetryEvent): void;
|
|
70
|
+
toLogPayload(_spans: SpanIndex): SttTelemetryLogPayload | undefined;
|
|
71
|
+
toHeaderPayload(log: SttTelemetryLogPayload): SttTelemetryHeaderPayload;
|
|
72
|
+
}
|
|
73
|
+
export declare function bindSttTelemetry(context: SttContext, sink: SttTelemetrySink, options?: {
|
|
74
|
+
backend?: SttTelemetryBackend;
|
|
75
|
+
engine?: SttTelemetryEngine;
|
|
76
|
+
model?: string;
|
|
77
|
+
}): SttContext;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { add, capabilityErrorText, capabilityFacts, capabilityMetadata, capabilityText, inputBytes, integer, observeCapability, registerCapabilityInput, } from "./capability-telemetry.js";
|
|
2
|
+
import { closedEnum, } from "./request-telemetry.js";
|
|
3
|
+
const ERROR_CODES = new Set([
|
|
4
|
+
"STT_UNAVAILABLE",
|
|
5
|
+
"UNSUPPORTED_STT_BACKEND",
|
|
6
|
+
"STT_UPSTREAM_FAILED",
|
|
7
|
+
"STT_AUDIO_TOO_LARGE",
|
|
8
|
+
"UNSUPPORTED_STT_OPTION",
|
|
9
|
+
"INVALID_STT_AUDIO",
|
|
10
|
+
"INVALID_STT_VERIFICATION_CODE_OPTIONS",
|
|
11
|
+
"NO_CODE_FOUND",
|
|
12
|
+
"AMBIGUOUS_CODE",
|
|
13
|
+
"transport_network_error",
|
|
14
|
+
"transport_timeout",
|
|
15
|
+
"other",
|
|
16
|
+
]);
|
|
17
|
+
const MODELS = new Map([
|
|
18
|
+
["@cf/openai/whisper-large-v3-turbo", "whisper-large-v3-turbo"],
|
|
19
|
+
]);
|
|
20
|
+
function errorCode(error) {
|
|
21
|
+
const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
|
|
22
|
+
return typeof code === "string" && ERROR_CODES.has(code)
|
|
23
|
+
? code
|
|
24
|
+
: "other";
|
|
25
|
+
}
|
|
26
|
+
export class SttTelemetryCollector {
|
|
27
|
+
key = "stt";
|
|
28
|
+
#redact;
|
|
29
|
+
#samples = [];
|
|
30
|
+
#summary;
|
|
31
|
+
#diagnostics = [];
|
|
32
|
+
#dropped = 0;
|
|
33
|
+
#failed = false;
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.#redact = options.redact;
|
|
36
|
+
}
|
|
37
|
+
markTelemetryFailed() {
|
|
38
|
+
this.#failed = true;
|
|
39
|
+
this.#summary ??= {
|
|
40
|
+
backend: "custom",
|
|
41
|
+
engine: "custom",
|
|
42
|
+
ms: 0,
|
|
43
|
+
audioBytes: 0,
|
|
44
|
+
durationMs: 0,
|
|
45
|
+
usage: 0,
|
|
46
|
+
warnings: 0,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
record(event) {
|
|
50
|
+
const sample = {
|
|
51
|
+
ms: integer(event.ms),
|
|
52
|
+
...(event.status === undefined ? {} : { status: integer(event.status) }),
|
|
53
|
+
...(event.audioBytes === undefined ? {} : { audioBytes: integer(event.audioBytes) }),
|
|
54
|
+
...(event.durationMs === undefined ? {} : { durationMs: integer(event.durationMs) }),
|
|
55
|
+
...(event.usage === undefined ? {} : { usage: integer(event.usage) }),
|
|
56
|
+
...(event.warnings === undefined ? {} : { warnings: integer(event.warnings) }),
|
|
57
|
+
...(event.errorCode ? { errorCode: event.errorCode } : {}),
|
|
58
|
+
...(event.diagnostics === undefined
|
|
59
|
+
? {}
|
|
60
|
+
: { diagnostics: capabilityText(event.diagnostics, this.#redact, true) }),
|
|
61
|
+
};
|
|
62
|
+
const prior = this.#summary;
|
|
63
|
+
this.#summary = {
|
|
64
|
+
backend: event.backend,
|
|
65
|
+
engine: event.engine,
|
|
66
|
+
...(event.model === undefined ? {} : { model: capabilityText(event.model, this.#redact) }),
|
|
67
|
+
ms: add(prior?.ms ?? 0, sample.ms),
|
|
68
|
+
...(sample.status === undefined ? {} : { status: sample.status }),
|
|
69
|
+
audioBytes: add(prior?.audioBytes ?? 0, sample.audioBytes ?? 0),
|
|
70
|
+
durationMs: add(prior?.durationMs ?? 0, sample.durationMs ?? 0),
|
|
71
|
+
usage: add(prior?.usage ?? 0, sample.usage ?? 0),
|
|
72
|
+
warnings: add(prior?.warnings ?? 0, sample.warnings ?? 0),
|
|
73
|
+
...(event.errorCode ? { lastErrorCode: event.errorCode } : {}),
|
|
74
|
+
};
|
|
75
|
+
if (this.#samples.length < 24) {
|
|
76
|
+
const { diagnostics, ...closedSample } = sample;
|
|
77
|
+
this.#samples.push(closedSample);
|
|
78
|
+
if (diagnostics !== undefined)
|
|
79
|
+
this.#diagnostics.push(diagnostics);
|
|
80
|
+
}
|
|
81
|
+
else
|
|
82
|
+
this.#dropped = add(this.#dropped, 1);
|
|
83
|
+
}
|
|
84
|
+
toLogPayload(_spans) {
|
|
85
|
+
if (!this.#summary)
|
|
86
|
+
return undefined;
|
|
87
|
+
return {
|
|
88
|
+
...this.#summary,
|
|
89
|
+
...(this.#diagnostics.length ? { diagnostics: [...this.#diagnostics] } : {}),
|
|
90
|
+
...(this.#failed ? { telemetryFailed: true } : {}),
|
|
91
|
+
samples: this.#samples.map((s) => ({ ...s })),
|
|
92
|
+
...(this.#dropped ? { samplesDropped: this.#dropped } : {}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
toHeaderPayload(log) {
|
|
96
|
+
return {
|
|
97
|
+
backend: closedEnum(log.backend),
|
|
98
|
+
engine: closedEnum(log.engine),
|
|
99
|
+
...(log.model && MODELS.has(log.model) ? { model: closedEnum(MODELS.get(log.model)) } : {}),
|
|
100
|
+
ms: log.ms,
|
|
101
|
+
...(log.status === undefined ? {} : { status: log.status }),
|
|
102
|
+
audioBytes: log.audioBytes,
|
|
103
|
+
durationMs: log.durationMs,
|
|
104
|
+
usage: log.usage,
|
|
105
|
+
warnings: log.warnings,
|
|
106
|
+
...(log.lastErrorCode ? { lastErrorCode: closedEnum(log.lastErrorCode) } : {}),
|
|
107
|
+
...(log.samples
|
|
108
|
+
? {
|
|
109
|
+
samples: log.samples.map((s) => ({
|
|
110
|
+
ms: s.ms,
|
|
111
|
+
...(s.status === undefined ? {} : { status: s.status }),
|
|
112
|
+
...(s.audioBytes === undefined ? {} : { audioBytes: s.audioBytes }),
|
|
113
|
+
...(s.durationMs === undefined ? {} : { durationMs: s.durationMs }),
|
|
114
|
+
...(s.usage === undefined ? {} : { usage: s.usage }),
|
|
115
|
+
...(s.warnings === undefined ? {} : { warnings: s.warnings }),
|
|
116
|
+
...(s.errorCode ? { errorCode: closedEnum(s.errorCode) } : {}),
|
|
117
|
+
})),
|
|
118
|
+
}
|
|
119
|
+
: {}),
|
|
120
|
+
...(log.samplesDropped ? { samplesDropped: log.samplesDropped } : {}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export function bindSttTelemetry(context, sink, options = {}) {
|
|
125
|
+
const metadata = capabilityMetadata(context);
|
|
126
|
+
const backend = options.backend ?? metadata?.backend ?? "custom";
|
|
127
|
+
const engine = options.engine ?? metadata?.engine ?? "custom";
|
|
128
|
+
const model = options.model ?? metadata?.model;
|
|
129
|
+
async function run(input, operation) {
|
|
130
|
+
const started = performance.now();
|
|
131
|
+
const facts = {};
|
|
132
|
+
observeCapability(sink, () => registerCapabilityInput(input));
|
|
133
|
+
let result;
|
|
134
|
+
try {
|
|
135
|
+
result = await capabilityFacts.run(facts, operation);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
observeCapability(sink, () => {
|
|
139
|
+
const status = error &&
|
|
140
|
+
typeof error === "object" &&
|
|
141
|
+
"status" in error &&
|
|
142
|
+
typeof error.status === "number"
|
|
143
|
+
? error.status
|
|
144
|
+
: undefined;
|
|
145
|
+
return sink.record({
|
|
146
|
+
backend,
|
|
147
|
+
engine,
|
|
148
|
+
model,
|
|
149
|
+
ms: performance.now() - started,
|
|
150
|
+
status: facts.status ?? status,
|
|
151
|
+
audioBytes: inputBytes(input),
|
|
152
|
+
errorCode: errorCode(error),
|
|
153
|
+
diagnostics: `${capabilityErrorText(error)} ${facts.diagnostics ?? ""}`,
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
observeCapability(sink, () => sink.record({
|
|
159
|
+
backend,
|
|
160
|
+
engine,
|
|
161
|
+
model: model,
|
|
162
|
+
ms: performance.now() - started,
|
|
163
|
+
status: facts.status,
|
|
164
|
+
audioBytes: result.usage?.audioBytes ?? inputBytes(input),
|
|
165
|
+
durationMs: result.durationMs,
|
|
166
|
+
usage: result.usage?.audioDurationMs,
|
|
167
|
+
warnings: result.warnings?.length ?? 0,
|
|
168
|
+
}));
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
...context,
|
|
173
|
+
transcribe: (request) => run(request.audio, () => context.transcribe(request)),
|
|
174
|
+
extractVerificationCode: (text, opts) => context.extractVerificationCode(text, opts),
|
|
175
|
+
};
|
|
176
|
+
}
|
package/dist/runtime/stt.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { ProviderError, TransportError, ValidationError } from "../errors.js";
|
|
2
|
+
import { readCapabilityErrorBody } from "./capability-response.js";
|
|
3
|
+
import { captureCapability, registerCapabilityInput, tagCapability, } from "./capability-telemetry.js";
|
|
4
|
+
import { readDiagnosticEnv, registerDiagnosticValue } from "./diagnostic-env.js";
|
|
5
|
+
import { createTimeoutController, isTimeoutLikeError } from "./timeout.js";
|
|
2
6
|
export const APIFUSE__STT__BACKEND_ENV = "APIFUSE__STT__BACKEND";
|
|
3
7
|
export const APIFUSE__STT__MODEL_ENV = "APIFUSE__STT__MODEL";
|
|
4
8
|
export const CLOUDFLARE_ACCOUNT_ID_ENV = "APIFUSE__CLOUDFLARE__ACCOUNT_ID";
|
|
@@ -13,7 +17,7 @@ function providerError(message, options) {
|
|
|
13
17
|
return new ProviderError(message, options);
|
|
14
18
|
}
|
|
15
19
|
function createErrorSttClient(options) {
|
|
16
|
-
return {
|
|
20
|
+
return tagCapability({
|
|
17
21
|
async transcribe() {
|
|
18
22
|
throw providerError(options.message, {
|
|
19
23
|
code: options.code,
|
|
@@ -21,7 +25,7 @@ function createErrorSttClient(options) {
|
|
|
21
25
|
});
|
|
22
26
|
},
|
|
23
27
|
extractVerificationCode,
|
|
24
|
-
};
|
|
28
|
+
}, { backend: "unavailable", engine: "custom" });
|
|
25
29
|
}
|
|
26
30
|
export function createUnsupportedSttClient(reason) {
|
|
27
31
|
return createErrorSttClient({
|
|
@@ -31,7 +35,7 @@ export function createUnsupportedSttClient(reason) {
|
|
|
31
35
|
});
|
|
32
36
|
}
|
|
33
37
|
function normalizedEnvValue(env, key) {
|
|
34
|
-
const value = env
|
|
38
|
+
const value = readDiagnosticEnv(key, env)?.trim();
|
|
35
39
|
return value ? value : undefined;
|
|
36
40
|
}
|
|
37
41
|
export function createSttClientFromEnv(config, env = process.env) {
|
|
@@ -52,7 +56,7 @@ export function createSttClientFromEnv(config, env = process.env) {
|
|
|
52
56
|
});
|
|
53
57
|
}
|
|
54
58
|
const accountId = env.APIFUSE__CLOUDFLARE__ACCOUNT_ID?.trim();
|
|
55
|
-
const apiToken = env
|
|
59
|
+
const apiToken = readDiagnosticEnv(APIFUSE__STT__CLOUDFLARE_API_TOKEN_ENV, env)?.trim();
|
|
56
60
|
if (!accountId || !apiToken) {
|
|
57
61
|
return createUnsupportedSttClient(`STT backend ${backend} requires ${CLOUDFLARE_ACCOUNT_ID_ENV} and ${APIFUSE__STT__CLOUDFLARE_API_TOKEN_ENV}`);
|
|
58
62
|
}
|
|
@@ -112,12 +116,6 @@ function warnOrThrowUnsupportedOption(request, message) {
|
|
|
112
116
|
function normalizeCloudflareLanguage(language) {
|
|
113
117
|
return language?.split("-")[0]?.toLowerCase();
|
|
114
118
|
}
|
|
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
119
|
function toSttTransportError(error) {
|
|
122
120
|
if (error instanceof TransportError)
|
|
123
121
|
return error;
|
|
@@ -134,12 +132,6 @@ function toSttTransportError(error) {
|
|
|
134
132
|
cause: error instanceof Error ? error : undefined,
|
|
135
133
|
});
|
|
136
134
|
}
|
|
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
135
|
function toCloudflareInput(request) {
|
|
144
136
|
const prompt = resolveSttPrompt(request);
|
|
145
137
|
const input = {
|
|
@@ -219,8 +211,11 @@ function toSttTranscript(payload, audioBytes) {
|
|
|
219
211
|
export function createCloudflareWorkersAiSttClient(options) {
|
|
220
212
|
const model = options.model ?? DEFAULT_CLOUDFLARE_WORKERS_AI_STT_MODEL;
|
|
221
213
|
const runFetch = options.fetch ?? fetch;
|
|
222
|
-
return {
|
|
214
|
+
return tagCapability({
|
|
223
215
|
async transcribe(request) {
|
|
216
|
+
registerCapabilityInput(request.audio);
|
|
217
|
+
registerDiagnosticValue(options.apiToken);
|
|
218
|
+
registerDiagnosticValue(`Bearer ${options.apiToken}`);
|
|
224
219
|
const warnings = [];
|
|
225
220
|
if (request.initialPrompt && effectivePromptPolicy(request) !== "custom-hint") {
|
|
226
221
|
const warning = warnOrThrowUnsupportedOption(request, "initialPrompt is honored only when promptPolicy is custom-hint");
|
|
@@ -245,16 +240,20 @@ export function createCloudflareWorkersAiSttClient(options) {
|
|
|
245
240
|
catch (error) {
|
|
246
241
|
throw toSttTransportError(error);
|
|
247
242
|
}
|
|
248
|
-
|
|
243
|
+
captureCapability({ status: response.status });
|
|
249
244
|
if (!response.ok) {
|
|
245
|
+
const echoed = await readCapabilityErrorBody(response, timeout.controller.signal);
|
|
246
|
+
captureCapability({ diagnostics: echoed });
|
|
250
247
|
throw new TransportError("STT upstream request failed", {
|
|
251
248
|
code: "STT_UPSTREAM_FAILED",
|
|
252
249
|
status: response.status,
|
|
253
250
|
upstreamStatus: response.status,
|
|
254
251
|
});
|
|
255
252
|
}
|
|
253
|
+
const payload = await response.json().catch(() => undefined);
|
|
256
254
|
const envelope = unknownRecord(payload);
|
|
257
255
|
if (envelope?.success === false) {
|
|
256
|
+
captureCapability({ diagnostics: JSON.stringify(payload) });
|
|
258
257
|
throw new TransportError("STT upstream returned an error", {
|
|
259
258
|
code: "STT_UPSTREAM_FAILED",
|
|
260
259
|
status: 502,
|
|
@@ -280,7 +279,7 @@ export function createCloudflareWorkersAiSttClient(options) {
|
|
|
280
279
|
}
|
|
281
280
|
},
|
|
282
281
|
extractVerificationCode,
|
|
283
|
-
};
|
|
282
|
+
}, { backend: "cloudflare-workers-ai", engine: "workers-ai", model });
|
|
284
283
|
}
|
|
285
284
|
const EN_DIGITS = {
|
|
286
285
|
zero: "0",
|
|
@@ -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,62 @@
|
|
|
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
|
+
otlp: true,
|
|
8
|
+
none: true,
|
|
9
|
+
};
|
|
10
|
+
const TRACE_EXPORTERS = new Set(Object.keys(TRACE_EXPORTER_LOOKUP));
|
|
11
|
+
const emittedWarnings = new Set();
|
|
12
|
+
function warnOnce(key, message) {
|
|
13
|
+
if (emittedWarnings.has(key))
|
|
14
|
+
return;
|
|
15
|
+
emittedWarnings.add(key);
|
|
16
|
+
console.warn(message);
|
|
17
|
+
}
|
|
18
|
+
function parseEnabled(raw) {
|
|
19
|
+
if (raw === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
switch (raw.trim().toLowerCase()) {
|
|
22
|
+
case "1":
|
|
23
|
+
case "true":
|
|
24
|
+
case "yes":
|
|
25
|
+
case "on":
|
|
26
|
+
return true;
|
|
27
|
+
case "0":
|
|
28
|
+
case "false":
|
|
29
|
+
case "no":
|
|
30
|
+
case "off":
|
|
31
|
+
return false;
|
|
32
|
+
default:
|
|
33
|
+
warnOnce(APIFUSE__TRACE__ENABLED, "[apifuse] Invalid APIFUSE__TRACE__ENABLED; falling back to disabled tracing.");
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve server trace output configuration from SDK-owned environment
|
|
39
|
+
* variables. Invalid exporter values fail closed so a provider cannot crash at
|
|
40
|
+
* startup because of an observability setting.
|
|
41
|
+
*/
|
|
42
|
+
export function resolveTraceConfigFromEnv(env = process.env) {
|
|
43
|
+
const enabledRaw = env[APIFUSE__TRACE__ENABLED];
|
|
44
|
+
const exporterRaw = env[APIFUSE__TRACE__EXPORTER];
|
|
45
|
+
if (enabledRaw === undefined && exporterRaw === undefined) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const enabled = parseEnabled(enabledRaw);
|
|
49
|
+
const normalizedExporter = exporterRaw?.trim().toLowerCase();
|
|
50
|
+
const exporter = TRACE_EXPORTERS.has(normalizedExporter)
|
|
51
|
+
? normalizedExporter
|
|
52
|
+
: exporterRaw === undefined
|
|
53
|
+
? undefined
|
|
54
|
+
: "none";
|
|
55
|
+
if (exporterRaw !== undefined && exporter === "none" && normalizedExporter !== "none") {
|
|
56
|
+
warnOnce(APIFUSE__TRACE__EXPORTER, `[apifuse] Invalid APIFUSE__TRACE__EXPORTER value "${normalizedExporter ?? exporterRaw}"; supported exporters are "console", "json", "otlp", and "none"; falling back to exporter "none".`);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
...(enabled !== undefined ? { enabled } : {}),
|
|
60
|
+
...(exporter !== undefined ? { exporter } : {}),
|
|
61
|
+
};
|
|
62
|
+
}
|
package/dist/runtime/trace.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TraceContext as BaseTraceContext, TraceAttributeValue, TraceConfig, TraceSpan } from "../types.js";
|
|
2
|
+
import { type DiagnosticRedactor } from "./diagnostic-redactor.js";
|
|
2
3
|
import { type OTLPExportOptions } from "./otlp.js";
|
|
3
4
|
export type SpanAttributeValue = TraceAttributeValue;
|
|
4
5
|
export type Span = TraceSpan;
|
|
@@ -8,8 +9,17 @@ export interface TraceContext extends BaseTraceContext {
|
|
|
8
9
|
export interface CreateTraceContextOptions {
|
|
9
10
|
maxSpans?: number;
|
|
10
11
|
onSpan?: (span: Span) => void;
|
|
12
|
+
/** Redacts diagnostic attribute values and errors before recording or calling onSpan. */
|
|
13
|
+
redact?: DiagnosticRedactor;
|
|
11
14
|
exportOptions?: OTLPExportOptions;
|
|
12
15
|
resourceAttributes?: Record<string, string>;
|
|
16
|
+
/** W3C-compatible 32-character lowercase hexadecimal trace id used for export. */
|
|
17
|
+
traceId?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Applied to a detached copy of each span immediately before OTLP export; never touches
|
|
20
|
+
* getSpans() or onSpan. Returning nothing (or throwing) drops that export batch.
|
|
21
|
+
*/
|
|
22
|
+
sanitizeSpanForExport?: (span: Span) => Span | undefined;
|
|
13
23
|
}
|
|
14
24
|
type SpanHookOptions<T> = {
|
|
15
25
|
attributes?: Record<string, unknown>;
|
|
@@ -20,7 +30,14 @@ export interface TraceRecorder {
|
|
|
20
30
|
runSpan<T>(name: string, fn: () => Promise<T> | T, options?: SpanHookOptions<T>): Promise<T>;
|
|
21
31
|
}
|
|
22
32
|
export declare const TRACE_RECORDER: unique symbol;
|
|
33
|
+
/** Updates request metadata before its pending root span completes and exports. */
|
|
34
|
+
export declare function updateTraceContextExportMetadata(trace: BaseTraceContext, input: {
|
|
35
|
+
traceId?: string;
|
|
36
|
+
resourceAttributes?: Record<string, string>;
|
|
37
|
+
}): void;
|
|
23
38
|
export declare function resolveTraceContextOptions(config?: TraceConfig): CreateTraceContextOptions;
|
|
24
39
|
export declare function getTraceRecorder(trace: BaseTraceContext): TraceRecorder | null;
|
|
40
|
+
/** Internal, read-only process counters; no reset can re-arm a warning. */
|
|
41
|
+
export declare function getDroppedOTLPSpanCount(reason: string): number;
|
|
25
42
|
export declare function createTraceContext(options?: CreateTraceContextOptions): TraceContext;
|
|
26
43
|
export {};
|