@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
package/bin/apifuse-check.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
|
|
3
3
|
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
4
|
-
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
5
|
import { pathToFileURL } from "node:url";
|
|
6
6
|
|
|
7
7
|
import { z } from "zod";
|
|
@@ -11,8 +11,14 @@ import {
|
|
|
11
11
|
PROMPT_ASSET_SYNC_REMEDIATION,
|
|
12
12
|
verifyPromptAssets,
|
|
13
13
|
} from "../src/cli/prompt-assets.js";
|
|
14
|
+
import {
|
|
15
|
+
DECLARATION_INVALID_CODE,
|
|
16
|
+
validateFailClosedDeclaration,
|
|
17
|
+
} from "../src/declaration-validation.js";
|
|
18
|
+
import { redundantDeploymentDefaults } from "../src/cli/deployment-intent.js";
|
|
19
|
+
import { isProviderError } from "../src/errors.js";
|
|
14
20
|
import type { ProviderDefinition } from "../src/index.js";
|
|
15
|
-
import {
|
|
21
|
+
import { lintProviderWithInformation, type ProviderLintMode } from "../src/lint.js";
|
|
16
22
|
import { safeParseSchemaSync } from "../src/schema.js";
|
|
17
23
|
|
|
18
24
|
const HELP_TEXT = `Usage: apifuse check [path]
|
|
@@ -118,26 +124,84 @@ export async function runChecks(
|
|
|
118
124
|
const indexPath = resolve(providerRoot, "index.ts");
|
|
119
125
|
const dockerfilePath = resolve(providerRoot, "Dockerfile");
|
|
120
126
|
const packageJsonPath = resolve(providerRoot, "package.json");
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
const providerJsonPath = resolve(providerRoot, "provider.json");
|
|
128
|
+
|
|
129
|
+
let providerModule: Record<string, unknown> | undefined;
|
|
130
|
+
let providerImportError: unknown;
|
|
131
|
+
if (existsSync(indexPath)) {
|
|
132
|
+
try {
|
|
133
|
+
providerModule = (await import(pathToFileURL(indexPath).href)) as Record<string, unknown>;
|
|
134
|
+
} catch (error) {
|
|
135
|
+
if (isProviderError(error) && error.code === DECLARATION_INVALID_CODE) {
|
|
136
|
+
providerImportError = error;
|
|
137
|
+
} else {
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
125
142
|
const provider = assertProviderDefinition(providerModule?.default);
|
|
126
143
|
const providerSourceFiles = collectProviderSourceFiles(providerRoot);
|
|
144
|
+
const localeCatalogEn = readEnglishLocaleCatalog(providerRoot);
|
|
127
145
|
|
|
128
146
|
return [
|
|
129
147
|
checkIndex(indexPath, provider),
|
|
148
|
+
checkDeclaration(provider, providerImportError),
|
|
130
149
|
checkOperations(provider),
|
|
131
150
|
checkFixtures(provider),
|
|
132
151
|
checkSchemas(provider),
|
|
133
|
-
checkAuthoringLint(provider, providerSourceFiles, options.lintMode),
|
|
152
|
+
checkAuthoringLint(provider, providerSourceFiles, localeCatalogEn, options.lintMode),
|
|
134
153
|
checkProviderMetadata(provider),
|
|
154
|
+
await checkDeploymentIntent(providerRoot, provider),
|
|
135
155
|
checkDockerfile(dockerfilePath),
|
|
136
156
|
checkPackageJson(packageJsonPath),
|
|
157
|
+
checkProviderJson(providerJsonPath, packageJsonPath),
|
|
137
158
|
checkPromptAssets(providerRoot),
|
|
138
159
|
];
|
|
139
160
|
}
|
|
140
161
|
|
|
162
|
+
const DECLARATION_CHECK_MESSAGE = "Provider declaration passes fail-closed validation";
|
|
163
|
+
|
|
164
|
+
function checkDeclaration(
|
|
165
|
+
provider: ProviderDefinition | undefined,
|
|
166
|
+
importError: unknown,
|
|
167
|
+
): CheckResult {
|
|
168
|
+
if (importError !== undefined) {
|
|
169
|
+
return {
|
|
170
|
+
message: DECLARATION_CHECK_MESSAGE,
|
|
171
|
+
passed: false,
|
|
172
|
+
details: formatDeclarationError(importError),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
if (!provider) return { message: DECLARATION_CHECK_MESSAGE, passed: false };
|
|
176
|
+
try {
|
|
177
|
+
validateFailClosedDeclaration(provider);
|
|
178
|
+
return { message: DECLARATION_CHECK_MESSAGE, passed: true };
|
|
179
|
+
} catch (error) {
|
|
180
|
+
return {
|
|
181
|
+
message: DECLARATION_CHECK_MESSAGE,
|
|
182
|
+
passed: false,
|
|
183
|
+
details: formatDeclarationError(error),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function formatDeclarationError(error: unknown): string[] {
|
|
189
|
+
if (isProviderError(error) && error.code === DECLARATION_INVALID_CODE) {
|
|
190
|
+
const details = error.details;
|
|
191
|
+
if (isRecord(details) && Array.isArray(details.violations)) {
|
|
192
|
+
return details.violations.map((violation) => {
|
|
193
|
+
if (!isRecord(violation)) return String(violation);
|
|
194
|
+
const ruleId = typeof violation.ruleId === "string" ? violation.ruleId : "unknown-rule";
|
|
195
|
+
const path = typeof violation.path === "string" ? violation.path : "unknown-path";
|
|
196
|
+
const message = typeof violation.message === "string" ? `: ${violation.message}` : "";
|
|
197
|
+
const fix = typeof violation.fix === "string" ? ` Fix: ${violation.fix}` : "";
|
|
198
|
+
return `${path} [${ruleId}]${message}${fix}`;
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return [error instanceof Error ? error.message : String(error)];
|
|
203
|
+
}
|
|
204
|
+
|
|
141
205
|
export const PROMPT_ASSETS_CHECK_MESSAGE =
|
|
142
206
|
"Agent prompt assets match the installed SDK version";
|
|
143
207
|
|
|
@@ -162,6 +226,21 @@ function isScannableProviderSourceFile(relativePath: string): boolean {
|
|
|
162
226
|
);
|
|
163
227
|
}
|
|
164
228
|
|
|
229
|
+
/**
|
|
230
|
+
* A directory under the provider root that is itself a git checkout — a linked
|
|
231
|
+
* worktree (`.worktree/<branch>/`, whose `.git` is a file pointing at the main
|
|
232
|
+
* repository), a nested clone (`.git` directory), or an initialised submodule.
|
|
233
|
+
* Its files are another revision of some repository, not this provider's
|
|
234
|
+
* runtime source: an older copy of `upstream/` or `scripts/` there would be
|
|
235
|
+
* linted as if it were request-path code at the root (the tooling-directory
|
|
236
|
+
* exemption is anchored at the provider root), and its `apifuse check` is run
|
|
237
|
+
* in that checkout, not here. Git refuses to track a path named `.git`, so the
|
|
238
|
+
* marker cannot be planted in a committed tree to hide a file from the scan.
|
|
239
|
+
*/
|
|
240
|
+
function isNestedCheckout(directory: string): boolean {
|
|
241
|
+
return existsSync(join(directory, ".git"));
|
|
242
|
+
}
|
|
243
|
+
|
|
165
244
|
function collectProviderSourceFiles(providerRoot: string): Record<string, string> {
|
|
166
245
|
const sources: Record<string, string> = {};
|
|
167
246
|
// `.agents`/`.apifuse` are deliberately not skipped: managed content there
|
|
@@ -172,7 +251,7 @@ function collectProviderSourceFiles(providerRoot: string): Record<string, string
|
|
|
172
251
|
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
173
252
|
const path = resolve(directory, entry.name);
|
|
174
253
|
if (entry.isDirectory()) {
|
|
175
|
-
if (!skipDirectories.has(entry.name)) {
|
|
254
|
+
if (!skipDirectories.has(entry.name) && !isNestedCheckout(path)) {
|
|
176
255
|
visit(path);
|
|
177
256
|
}
|
|
178
257
|
continue;
|
|
@@ -306,9 +385,30 @@ function checkSchemas(provider: ProviderDefinition | undefined): CheckResult {
|
|
|
306
385
|
};
|
|
307
386
|
}
|
|
308
387
|
|
|
388
|
+
/**
|
|
389
|
+
* Reads `locales/en.json` so the error-localization lint rules can resolve
|
|
390
|
+
* declared `messageKey`/`fixKey` values. An absent or unreadable catalog is
|
|
391
|
+
* reported as an empty catalog rather than as "no catalog": a provider that
|
|
392
|
+
* references locale keys without shipping `en.json` must still fail the
|
|
393
|
+
* missing-key rule instead of silently skipping it.
|
|
394
|
+
*/
|
|
395
|
+
function readEnglishLocaleCatalog(providerRoot: string): Record<string, unknown> {
|
|
396
|
+
const catalogPath = resolve(providerRoot, "locales", "en.json");
|
|
397
|
+
if (!existsSync(catalogPath)) return {};
|
|
398
|
+
try {
|
|
399
|
+
const parsed: unknown = JSON.parse(readFileSync(catalogPath, "utf8"));
|
|
400
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
401
|
+
? (parsed as Record<string, unknown>)
|
|
402
|
+
: {};
|
|
403
|
+
} catch {
|
|
404
|
+
return {};
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
309
408
|
function checkAuthoringLint(
|
|
310
409
|
provider: ProviderDefinition | undefined,
|
|
311
410
|
providerSourceFiles: Record<string, string>,
|
|
411
|
+
localeCatalogEn: Record<string, unknown>,
|
|
312
412
|
lintMode: ProviderLintMode = "official",
|
|
313
413
|
): CheckResult {
|
|
314
414
|
if (!provider) {
|
|
@@ -318,12 +418,21 @@ function checkAuthoringLint(
|
|
|
318
418
|
};
|
|
319
419
|
}
|
|
320
420
|
|
|
321
|
-
const
|
|
421
|
+
const { diagnostics, information } = lintProviderWithInformation(
|
|
422
|
+
{ ...provider, providerSourceFiles, localeCatalogEn },
|
|
423
|
+
{ mode: lintMode },
|
|
424
|
+
);
|
|
322
425
|
const errors = diagnostics.filter((diagnostic) => diagnostic.level === "error");
|
|
323
|
-
const details =
|
|
324
|
-
const field =
|
|
325
|
-
return
|
|
426
|
+
const details = information.map((entry) => {
|
|
427
|
+
const field = entry.field ? `${entry.field}: ` : "";
|
|
428
|
+
return `INFO ${entry.rule} ${field}${entry.message}`;
|
|
326
429
|
});
|
|
430
|
+
details.push(
|
|
431
|
+
...diagnostics.map((diagnostic) => {
|
|
432
|
+
const field = diagnostic.field ? `${diagnostic.field}: ` : "";
|
|
433
|
+
return `${diagnostic.level.toUpperCase()} ${diagnostic.rule} ${field}${diagnostic.message}`;
|
|
434
|
+
}),
|
|
435
|
+
);
|
|
327
436
|
|
|
328
437
|
return {
|
|
329
438
|
message: "Provider authoring lint has no error-level diagnostics",
|
|
@@ -378,6 +487,64 @@ function checkProviderMetadata(provider: ProviderDefinition | undefined): CheckR
|
|
|
378
487
|
};
|
|
379
488
|
}
|
|
380
489
|
|
|
490
|
+
export const DEPLOYMENT_INTENT_CHECK_MESSAGE =
|
|
491
|
+
"Deployment intent lives only in defineProvider({ deployment }) without restating profile defaults";
|
|
492
|
+
export const LEGACY_DEPLOY_FILE_RULE = "deployment/legacy-deploy-file";
|
|
493
|
+
export const REDUNDANT_DEPLOYMENT_DEFAULT_RULE = "deployment/redundant-default";
|
|
494
|
+
export const SPREAD_EXPORT_DEPLOYMENT_RULE = "deployment/spread-export";
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Deployment intent has one authored home: the `deployment` key on
|
|
498
|
+
* `defineProvider()`, carrying only the fields that differ from the runtime
|
|
499
|
+
* profile. A standalone `deploy.ts` is a legacy surface and a field that
|
|
500
|
+
* restates a profile default is noise the platform derives anyway. Both are
|
|
501
|
+
* reported as warnings while the fleet migrates (`apifuse
|
|
502
|
+
* migrate-deployment`); they become errors once no repository carries the
|
|
503
|
+
* legacy file.
|
|
504
|
+
*/
|
|
505
|
+
async function checkDeploymentIntent(
|
|
506
|
+
providerRoot: string,
|
|
507
|
+
provider: ProviderDefinition | undefined,
|
|
508
|
+
): Promise<CheckResult> {
|
|
509
|
+
const details: string[] = [];
|
|
510
|
+
if (existsSync(resolve(providerRoot, "deploy.ts"))) {
|
|
511
|
+
details.push(
|
|
512
|
+
`WARN ${LEGACY_DEPLOY_FILE_RULE}: deploy.ts is a legacy deployment surface; run \`apifuse migrate-deployment .\` to move its non-default values into defineProvider({ deployment }) and delete the file.`,
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
// A `deployment` extra on `export default { ...provider, deployment }` is
|
|
516
|
+
// indistinguishable from a declaration key once the module is loaded, so
|
|
517
|
+
// inspect the source. The inspector needs the TypeScript compiler (a
|
|
518
|
+
// devDependency of provider repositories); without it this rule is skipped.
|
|
519
|
+
const indexPath = resolve(providerRoot, "index.ts");
|
|
520
|
+
if (existsSync(indexPath)) {
|
|
521
|
+
try {
|
|
522
|
+
const { findSpreadExportDeploymentProperty } = await import(
|
|
523
|
+
"../src/cli/migrate-deployment-intent.js"
|
|
524
|
+
);
|
|
525
|
+
const spread = findSpreadExportDeploymentProperty(readFileSync(indexPath, "utf8"), indexPath);
|
|
526
|
+
if (spread !== undefined) {
|
|
527
|
+
details.push(
|
|
528
|
+
`WARN ${SPREAD_EXPORT_DEPLOYMENT_RULE}: index.ts:${spread.line} attaches \`deployment\` to a spread default export; the only authored surface is the \`deployment\` key inside defineProvider({...}). Run \`apifuse migrate-deployment .\` to hoist it.`,
|
|
529
|
+
);
|
|
530
|
+
}
|
|
531
|
+
} catch {
|
|
532
|
+
// TypeScript unavailable: the source-shape rule cannot run here.
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (provider?.deployment !== undefined) {
|
|
536
|
+
for (const redundant of redundantDeploymentDefaults(provider.deployment)) {
|
|
537
|
+
details.push(`WARN ${REDUNDANT_DEPLOYMENT_DEFAULT_RULE}: ${redundant.message}`);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return {
|
|
541
|
+
message: DEPLOYMENT_INTENT_CHECK_MESSAGE,
|
|
542
|
+
// Warning-only during the fleet migration window.
|
|
543
|
+
passed: true,
|
|
544
|
+
details,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
|
|
381
548
|
function checkDockerfile(dockerfilePath: string): CheckResult {
|
|
382
549
|
return {
|
|
383
550
|
message: "Dockerfile exists",
|
|
@@ -419,6 +586,119 @@ function checkPackageJson(packageJsonPath: string): CheckResult {
|
|
|
419
586
|
}
|
|
420
587
|
}
|
|
421
588
|
|
|
589
|
+
export const PROVIDER_JSON_CHECK_MESSAGE = "provider.json exists with a valid declaration";
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* Markets a provider may declare as its primary, and the locales the platform
|
|
593
|
+
* catalogs can carry.
|
|
594
|
+
*
|
|
595
|
+
* These mirror `scripts/provider-deploy/provider-locale-coverage.mjs` in the
|
|
596
|
+
* APIFuse monorepo, which is the policy's source of truth. The duplication is
|
|
597
|
+
* deliberate and bounded: the monorepo cannot be imported from a provider
|
|
598
|
+
* checkout, and a *closed* mirror is the point — it keeps a typo
|
|
599
|
+
* (`primaryMarket: "jp-JP"`) a local failure instead of one that only surfaces
|
|
600
|
+
* in the monorepo's contract validator days later.
|
|
601
|
+
*/
|
|
602
|
+
const PROVIDER_PRIMARY_MARKETS = ["jp", "kr", "global"] as const;
|
|
603
|
+
const PROVIDER_COVERAGE_LOCALES = ["en", "ko", "ja"] as const;
|
|
604
|
+
const PROVIDER_BASELINE_LOCALE = "en";
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Declared locale coverage, optional at schemaVersion 1.
|
|
608
|
+
*
|
|
609
|
+
* `apifuse provider declare-locale-coverage` writes this block, and the
|
|
610
|
+
* monorepo declaration schema has accepted it since the rollout landed. This
|
|
611
|
+
* check used to close `provider.json` over four keys, which made the only
|
|
612
|
+
* documented way to clear the monorepo's `LOCALE_COVERAGE_UNDECLARED` finding
|
|
613
|
+
* turn a green `bun run check` red — the declaration was unfixable from either
|
|
614
|
+
* side. The fix is to mirror the monorepo schema rather than to stop
|
|
615
|
+
* validating: the block stays closed over its own two keys so a misspelled
|
|
616
|
+
* field is still caught here, at authoring time.
|
|
617
|
+
*/
|
|
618
|
+
const providerI18nDeclarationSchema = z
|
|
619
|
+
.object({
|
|
620
|
+
primaryMarket: z.enum(PROVIDER_PRIMARY_MARKETS),
|
|
621
|
+
locales: z
|
|
622
|
+
.array(z.enum(PROVIDER_COVERAGE_LOCALES))
|
|
623
|
+
.nonempty()
|
|
624
|
+
.refine((locales) => new Set(locales).size === locales.length, {
|
|
625
|
+
message: "i18n.locales must not repeat a locale",
|
|
626
|
+
})
|
|
627
|
+
.refine((locales) => locales.includes(PROVIDER_BASELINE_LOCALE), {
|
|
628
|
+
message: `i18n.locales must include "${PROVIDER_BASELINE_LOCALE}": it is the fallback every other locale resolves through`,
|
|
629
|
+
})
|
|
630
|
+
.optional(),
|
|
631
|
+
})
|
|
632
|
+
.strict();
|
|
633
|
+
|
|
634
|
+
const providerDeclarationSchema = z
|
|
635
|
+
.object({
|
|
636
|
+
schemaVersion: z.literal(1),
|
|
637
|
+
providerId: z.string(),
|
|
638
|
+
owner: z.string(),
|
|
639
|
+
lifecycle: z.enum(["draft", "ready", "live", "retired"]),
|
|
640
|
+
i18n: providerI18nDeclarationSchema.optional(),
|
|
641
|
+
})
|
|
642
|
+
.strict();
|
|
643
|
+
|
|
644
|
+
function checkProviderJson(providerJsonPath: string, packageJsonPath: string): CheckResult {
|
|
645
|
+
if (!existsSync(providerJsonPath)) {
|
|
646
|
+
return {
|
|
647
|
+
message: PROVIDER_JSON_CHECK_MESSAGE,
|
|
648
|
+
passed: false,
|
|
649
|
+
details: ["Missing provider.json at the provider root"],
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
try {
|
|
654
|
+
const declaration = providerDeclarationSchema.parse(
|
|
655
|
+
JSON.parse(readFileSync(providerJsonPath, "utf-8")) as unknown,
|
|
656
|
+
);
|
|
657
|
+
const expectedProviderId = readProviderIdFromPackageName(packageJsonPath);
|
|
658
|
+
if (expectedProviderId !== undefined && declaration.providerId !== expectedProviderId) {
|
|
659
|
+
return {
|
|
660
|
+
message: PROVIDER_JSON_CHECK_MESSAGE,
|
|
661
|
+
passed: false,
|
|
662
|
+
details: [
|
|
663
|
+
`provider.json providerId "${declaration.providerId}" does not match package.json name (expected "${expectedProviderId}")`,
|
|
664
|
+
],
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
return {
|
|
669
|
+
message: PROVIDER_JSON_CHECK_MESSAGE,
|
|
670
|
+
passed: true,
|
|
671
|
+
details: [
|
|
672
|
+
`providerId: ${declaration.providerId}`,
|
|
673
|
+
`lifecycle: ${declaration.lifecycle}`,
|
|
674
|
+
...(declaration.i18n
|
|
675
|
+
? [
|
|
676
|
+
`locale coverage: primaryMarket ${declaration.i18n.primaryMarket}${
|
|
677
|
+
declaration.i18n.locales ? ` (locales: ${declaration.i18n.locales.join(", ")})` : ""
|
|
678
|
+
}`,
|
|
679
|
+
]
|
|
680
|
+
: []),
|
|
681
|
+
],
|
|
682
|
+
};
|
|
683
|
+
} catch (error) {
|
|
684
|
+
return {
|
|
685
|
+
message: PROVIDER_JSON_CHECK_MESSAGE,
|
|
686
|
+
passed: false,
|
|
687
|
+
details: [error instanceof Error ? error.message : String(error)],
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
function readProviderIdFromPackageName(packageJsonPath: string): string | undefined {
|
|
693
|
+
try {
|
|
694
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")) as unknown;
|
|
695
|
+
if (!isRecord(packageJson) || typeof packageJson.name !== "string") return undefined;
|
|
696
|
+
return /^(?:apifuse-provider-|@apifuse\/provider-)(.+)$/.exec(packageJson.name)?.[1];
|
|
697
|
+
} catch {
|
|
698
|
+
return undefined;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
|
|
422
702
|
function assertProviderDefinition(value: unknown): ProviderDefinition | undefined {
|
|
423
703
|
return isProviderDefinition(value) ? value : undefined;
|
|
424
704
|
}
|
|
@@ -431,7 +711,7 @@ function isProviderDefinition(value: unknown): value is ProviderDefinition {
|
|
|
431
711
|
return (
|
|
432
712
|
typeof value.id === "string" &&
|
|
433
713
|
typeof value.version === "string" &&
|
|
434
|
-
(value.runtime === "standard" || value.runtime === "browser") &&
|
|
714
|
+
(value.runtime === "standard" || value.runtime === "shared" || value.runtime === "browser") &&
|
|
435
715
|
typeof value.meta.displayName === "string" &&
|
|
436
716
|
typeof value.meta.category === "string"
|
|
437
717
|
);
|
package/bin/apifuse-dev.ts
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
+
import { readDiagnosticEnv } from "../src/runtime/diagnostic-env.js";
|
|
2
3
|
|
|
3
4
|
import { existsSync } from "node:fs";
|
|
4
5
|
import { dirname, relative, resolve } from "node:path";
|
|
5
|
-
import type { ProviderDefinition } from "../src/index.js";
|
|
6
6
|
import {
|
|
7
|
-
createBrowserClient,
|
|
8
7
|
createCredentialContext,
|
|
9
|
-
createEnvContext,
|
|
10
8
|
createHttpClient,
|
|
9
|
+
createInProcessProviderEngine,
|
|
10
|
+
createOcrClientFromEnv,
|
|
11
11
|
createProviderCache,
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
createHandleContext,
|
|
13
|
+
createProviderEnvironment,
|
|
14
14
|
createSttClientFromEnv,
|
|
15
|
-
|
|
15
|
+
type ProviderDefinition,
|
|
16
|
+
type ProviderEngineBindingCandidates,
|
|
16
17
|
ProviderError,
|
|
17
18
|
} from "../src/index.js";
|
|
19
|
+
import { createCliResolverRuntime } from "../src/cli/resolver-runtime.js";
|
|
20
|
+
import { assertProcessEngineModeSupported } from "../src/runtime/engine-mode.js";
|
|
21
|
+
import { createBrowserClient } from "../src/runtime/browser.js";
|
|
18
22
|
import { createMemoryProviderRuntimeState } from "../src/runtime/state.js";
|
|
23
|
+
import { createStealthClient } from "../src/runtime/stealth.js";
|
|
24
|
+
import type { ResolverTelemetryCollector } from "../src/runtime/resolver-telemetry.js";
|
|
19
25
|
import { createTraceContext } from "../src/runtime/trace.js";
|
|
20
26
|
import type { BrowserClient, ProviderContext } from "../src/types.js";
|
|
21
27
|
|
|
@@ -35,6 +41,9 @@ export async function main() {
|
|
|
35
41
|
const providerModule = await import(resolve(providerPath, "index.ts"));
|
|
36
42
|
const provider = assertProviderDefinition(providerModule.default, providerPath);
|
|
37
43
|
|
|
44
|
+
// Fail fast before the server starts: this is a developer tool, and an
|
|
45
|
+
// explicit remote request must never silently fall back to in-process.
|
|
46
|
+
assertProcessEngineModeSupported();
|
|
38
47
|
const { startDevServer } = await import("../src/dev.js");
|
|
39
48
|
const port = Number(process.env.APIFUSE__RUNTIME__PORT) || 3900;
|
|
40
49
|
|
|
@@ -42,6 +51,7 @@ export async function main() {
|
|
|
42
51
|
|
|
43
52
|
console.log("\nEndpoints:");
|
|
44
53
|
console.log(` GET http://localhost:${port}/health`);
|
|
54
|
+
console.log(` GET http://localhost:${port}/readyz`);
|
|
45
55
|
|
|
46
56
|
for (const operationId of Object.keys(provider.operations)) {
|
|
47
57
|
console.log(` POST http://localhost:${port}/v1/${operationId}`);
|
|
@@ -73,15 +83,19 @@ export async function main() {
|
|
|
73
83
|
|
|
74
84
|
export function createProviderContext(provider: ProviderDefinition): {
|
|
75
85
|
ctx: ProviderContext;
|
|
86
|
+
resolverTelemetry: ResolverTelemetryCollector;
|
|
76
87
|
} {
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
88
|
+
const providerEnvironment = createProviderEnvironment(
|
|
89
|
+
process.env,
|
|
90
|
+
provider.secrets?.map((secret) => secret.name) ?? [],
|
|
91
|
+
);
|
|
92
|
+
const providerEnv = { get: (key: string) => readDiagnosticEnv(key, providerEnvironment) };
|
|
81
93
|
const credential = createCredentialContext();
|
|
82
94
|
const state = createMemoryProviderRuntimeState();
|
|
83
|
-
const
|
|
84
|
-
|
|
95
|
+
const cache = createProviderCache({ providerId: provider.id });
|
|
96
|
+
const { resolver, resolverTelemetry } = createCliResolverRuntime(provider, cache);
|
|
97
|
+
const candidates: ProviderEngineBindingCandidates = {
|
|
98
|
+
env: providerEnv,
|
|
85
99
|
credential,
|
|
86
100
|
auth: createUnsupportedAuthStub(),
|
|
87
101
|
browser:
|
|
@@ -92,20 +106,29 @@ export function createProviderContext(provider: ProviderDefinition): {
|
|
|
92
106
|
})
|
|
93
107
|
: createUnsupportedBrowserStub(),
|
|
94
108
|
http: createHttpClient(),
|
|
95
|
-
cache
|
|
109
|
+
cache,
|
|
96
110
|
state,
|
|
97
111
|
trace: createTraceContext(),
|
|
98
|
-
stealth: createStealthClient("http://localhost"
|
|
112
|
+
stealth: createStealthClient("http://localhost", {
|
|
113
|
+
...(provider.stealth ? { stealth: provider.stealth } : {}),
|
|
114
|
+
}),
|
|
115
|
+
ocr: createOcrClientFromEnv(provider.ocr),
|
|
99
116
|
stt: createSttClientFromEnv(provider.stt),
|
|
100
|
-
|
|
117
|
+
resolver,
|
|
118
|
+
handle: createHandleContext({
|
|
101
119
|
providerId: provider.id,
|
|
102
|
-
|
|
103
|
-
|
|
120
|
+
// Local dev is a single-user session: one stable connection scope so
|
|
121
|
+
// bound handles (drafts, default cursors) work exactly as in production.
|
|
122
|
+
request: { headers: {}, connectionId: "local-dev" },
|
|
104
123
|
state,
|
|
105
124
|
}),
|
|
106
125
|
};
|
|
126
|
+
const ctx = createInProcessProviderEngine().attach({
|
|
127
|
+
provider,
|
|
128
|
+
bindings: candidates,
|
|
129
|
+
}) as ProviderContext;
|
|
107
130
|
|
|
108
|
-
return { ctx };
|
|
131
|
+
return { ctx, resolverTelemetry };
|
|
109
132
|
}
|
|
110
133
|
|
|
111
134
|
function normalizeArgs(argv: string[]): string[] {
|
|
@@ -216,7 +239,7 @@ function isProviderDefinition(value: unknown): value is ProviderDefinition {
|
|
|
216
239
|
return (
|
|
217
240
|
typeof value.id === "string" &&
|
|
218
241
|
typeof value.version === "string" &&
|
|
219
|
-
(value.runtime === "standard" || value.runtime === "browser") &&
|
|
242
|
+
(value.runtime === "standard" || value.runtime === "shared" || value.runtime === "browser") &&
|
|
220
243
|
typeof value.meta.displayName === "string" &&
|
|
221
244
|
typeof value.meta.category === "string"
|
|
222
245
|
);
|