@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,360 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, readlinkSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { performance } from "node:perf_hooks";
|
|
4
|
+
import { SDK_VERSION } from "./sdk-version.js";
|
|
5
|
+
/**
|
|
6
|
+
* Internal runtime diagnostics route on the provider's primary listener, next
|
|
7
|
+
* to `/health` and `/readyz`. It answers one JSON report that tells an idle
|
|
8
|
+
* process that still burns CPU apart from a busy one without `exec`: process
|
|
9
|
+
* CPU sampled over a short window, memory, the Node event-loop and
|
|
10
|
+
* active-resource APIs, and on Linux the per-thread CPU and file-descriptor
|
|
11
|
+
* picture from `/proc/self`.
|
|
12
|
+
*
|
|
13
|
+
* Read-only and secret-free. It shares the boundary of `/health` and `/readyz`:
|
|
14
|
+
* the generated provider NetworkPolicy admits only the gateway on this port and
|
|
15
|
+
* the gateway dials canonical operation paths only, so a tenant cannot reach
|
|
16
|
+
* it; operators use `kubectl port-forward`.
|
|
17
|
+
*/
|
|
18
|
+
export const RUNTIME_DIAGNOSTICS_ROUTE = "/__apifuse/diagnostics/runtime";
|
|
19
|
+
export const RUNTIME_DIAGNOSTICS_SCHEMA_VERSION = 1;
|
|
20
|
+
/** Query parameter naming the sampling window; clamped, never rejected. */
|
|
21
|
+
export const RUNTIME_DIAGNOSTICS_WINDOW_QUERY = "windowMs";
|
|
22
|
+
export const DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS = 250;
|
|
23
|
+
export const MIN_RUNTIME_DIAGNOSTICS_WINDOW_MS = 50;
|
|
24
|
+
export const MAX_RUNTIME_DIAGNOSTICS_WINDOW_MS = 5_000;
|
|
25
|
+
/**
|
|
26
|
+
* Linux USER_HZ. The unit of `utime`/`stime` in `/proc` stat files is an ABI
|
|
27
|
+
* constant (100 Hz) independent of the kernel's CONFIG_HZ.
|
|
28
|
+
*/
|
|
29
|
+
export const PROCFS_CLOCK_TICKS_PER_SECOND = 100;
|
|
30
|
+
export const DEFAULT_PROCFS_SELF_ROOT = "/proc/self";
|
|
31
|
+
const defaultClock = {
|
|
32
|
+
now: () => performance.now(),
|
|
33
|
+
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
34
|
+
};
|
|
35
|
+
export function normalizeRuntimeDiagnosticsWindowMs(value) {
|
|
36
|
+
if (value === undefined || !Number.isFinite(value))
|
|
37
|
+
return DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS;
|
|
38
|
+
return Math.min(MAX_RUNTIME_DIAGNOSTICS_WINDOW_MS, Math.max(MIN_RUNTIME_DIAGNOSTICS_WINDOW_MS, Math.trunc(value)));
|
|
39
|
+
}
|
|
40
|
+
/** Parses the `windowMs` query value; anything unparsable falls back to the default. */
|
|
41
|
+
export function resolveRuntimeDiagnosticsWindowMs(raw) {
|
|
42
|
+
if (raw === undefined || raw === null || raw.trim() === "") {
|
|
43
|
+
return DEFAULT_RUNTIME_DIAGNOSTICS_WINDOW_MS;
|
|
44
|
+
}
|
|
45
|
+
const parsed = Number.parseInt(raw, 10);
|
|
46
|
+
return normalizeRuntimeDiagnosticsWindowMs(Number.isNaN(parsed) ? undefined : parsed);
|
|
47
|
+
}
|
|
48
|
+
export async function collectRuntimeDiagnostics(input) {
|
|
49
|
+
const clock = input.clock ?? defaultClock;
|
|
50
|
+
const procfsRoot = input.procfsRoot ?? DEFAULT_PROCFS_SELF_ROOT;
|
|
51
|
+
const requestedMs = normalizeRuntimeDiagnosticsWindowMs(input.windowMs);
|
|
52
|
+
// Two nested brackets. The procfs scans are synchronous work on the main
|
|
53
|
+
// thread, so the process-level CPU bracket starts after the first scan and
|
|
54
|
+
// closes before the second one: the scans' own CPU never lands inside it.
|
|
55
|
+
// The thread bracket encloses the scans and divides their tick deltas by
|
|
56
|
+
// its own elapsed time, so the scan cost is attributed over the interval it
|
|
57
|
+
// actually spans instead of inflating a short window.
|
|
58
|
+
const threadsStartedAt = clock.now();
|
|
59
|
+
const threadsStart = sampleThreads(procfsRoot);
|
|
60
|
+
const cpuStart = process.cpuUsage();
|
|
61
|
+
const eventLoopStart = sampleEventLoopUtilization();
|
|
62
|
+
const startedAt = clock.now();
|
|
63
|
+
await clock.sleep(requestedMs);
|
|
64
|
+
const observedMs = Math.max(0, clock.now() - startedAt);
|
|
65
|
+
const cpuWindow = process.cpuUsage(cpuStart);
|
|
66
|
+
const eventLoopEnd = sampleEventLoopUtilization();
|
|
67
|
+
const threadsEnd = sampleThreads(procfsRoot);
|
|
68
|
+
const threadsObservedMs = Math.max(0, clock.now() - threadsStartedAt);
|
|
69
|
+
const fileDescriptors = sampleFileDescriptors(procfsRoot);
|
|
70
|
+
const cpuLifetime = process.cpuUsage();
|
|
71
|
+
const uptimeSeconds = process.uptime();
|
|
72
|
+
const sampledAt = new Date().toISOString();
|
|
73
|
+
const memory = process.memoryUsage();
|
|
74
|
+
const activeResources = sampleActiveResources();
|
|
75
|
+
return {
|
|
76
|
+
schemaVersion: RUNTIME_DIAGNOSTICS_SCHEMA_VERSION,
|
|
77
|
+
provider: { id: input.provider.id, version: input.provider.version },
|
|
78
|
+
sdkVersion: SDK_VERSION,
|
|
79
|
+
runtime: {
|
|
80
|
+
bunVersion: process.versions.bun ?? null,
|
|
81
|
+
nodeCompatVersion: process.versions.node,
|
|
82
|
+
platform: process.platform,
|
|
83
|
+
arch: process.arch,
|
|
84
|
+
pid: process.pid,
|
|
85
|
+
},
|
|
86
|
+
sampledAt,
|
|
87
|
+
uptimeSeconds,
|
|
88
|
+
window: { requestedMs, observedMs },
|
|
89
|
+
cpu: {
|
|
90
|
+
lifetime: {
|
|
91
|
+
userMicros: cpuLifetime.user,
|
|
92
|
+
systemMicros: cpuLifetime.system,
|
|
93
|
+
averageCores: coresFromMicros(cpuLifetime.user + cpuLifetime.system, uptimeSeconds * 1000),
|
|
94
|
+
},
|
|
95
|
+
window: {
|
|
96
|
+
userMicros: cpuWindow.user,
|
|
97
|
+
systemMicros: cpuWindow.system,
|
|
98
|
+
userCores: coresFromMicros(cpuWindow.user, observedMs),
|
|
99
|
+
systemCores: coresFromMicros(cpuWindow.system, observedMs),
|
|
100
|
+
totalCores: coresFromMicros(cpuWindow.user + cpuWindow.system, observedMs),
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
memory: {
|
|
104
|
+
rss: memory.rss,
|
|
105
|
+
heapTotal: memory.heapTotal,
|
|
106
|
+
heapUsed: memory.heapUsed,
|
|
107
|
+
external: memory.external,
|
|
108
|
+
arrayBuffers: memory.arrayBuffers,
|
|
109
|
+
},
|
|
110
|
+
eventLoop: {
|
|
111
|
+
reported: eventLoopEnd.idle + eventLoopEnd.active > 0,
|
|
112
|
+
lifetime: eventLoopEnd,
|
|
113
|
+
window: eventLoopUtilizationDelta(eventLoopEnd, eventLoopStart),
|
|
114
|
+
},
|
|
115
|
+
activeResources,
|
|
116
|
+
procfs: threadsEnd === null || fileDescriptors === null
|
|
117
|
+
? null
|
|
118
|
+
: {
|
|
119
|
+
clockTicksPerSecond: PROCFS_CLOCK_TICKS_PER_SECOND,
|
|
120
|
+
observedMs: threadsObservedMs,
|
|
121
|
+
threads: summarizeThreads(threadsStart, threadsEnd, threadsObservedMs),
|
|
122
|
+
fileDescriptors,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function coresFromMicros(micros, elapsedMs) {
|
|
127
|
+
if (!(elapsedMs > 0))
|
|
128
|
+
return 0;
|
|
129
|
+
return micros / 1000 / elapsedMs;
|
|
130
|
+
}
|
|
131
|
+
function sampleEventLoopUtilization() {
|
|
132
|
+
const eventLoopUtilization = performance.eventLoopUtilization;
|
|
133
|
+
if (typeof eventLoopUtilization !== "function")
|
|
134
|
+
return { idle: 0, active: 0, utilization: 0 };
|
|
135
|
+
try {
|
|
136
|
+
const sample = eventLoopUtilization.call(performance);
|
|
137
|
+
return {
|
|
138
|
+
idle: numberProperty(sample, "idle"),
|
|
139
|
+
active: numberProperty(sample, "active"),
|
|
140
|
+
utilization: numberProperty(sample, "utilization"),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return { idle: 0, active: 0, utilization: 0 };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function eventLoopUtilizationDelta(end, start) {
|
|
148
|
+
const idle = Math.max(0, end.idle - start.idle);
|
|
149
|
+
const active = Math.max(0, end.active - start.active);
|
|
150
|
+
const total = idle + active;
|
|
151
|
+
return { idle, active, utilization: total > 0 ? active / total : 0 };
|
|
152
|
+
}
|
|
153
|
+
function sampleActiveResources() {
|
|
154
|
+
const getActiveResourcesInfo = process.getActiveResourcesInfo;
|
|
155
|
+
let types = [];
|
|
156
|
+
if (typeof getActiveResourcesInfo === "function") {
|
|
157
|
+
try {
|
|
158
|
+
const listed = getActiveResourcesInfo.call(process);
|
|
159
|
+
if (Array.isArray(listed)) {
|
|
160
|
+
types = listed.filter((entry) => typeof entry === "string");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
types = [];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const byType = {};
|
|
168
|
+
for (const type of types)
|
|
169
|
+
byType[type] = (byType[type] ?? 0) + 1;
|
|
170
|
+
return { reported: types.length > 0, total: types.length, byType };
|
|
171
|
+
}
|
|
172
|
+
function numberProperty(value, key) {
|
|
173
|
+
if (value === null || typeof value !== "object")
|
|
174
|
+
return 0;
|
|
175
|
+
const candidate = value[key];
|
|
176
|
+
return typeof candidate === "number" && Number.isFinite(candidate) ? candidate : 0;
|
|
177
|
+
}
|
|
178
|
+
function sampleThreads(root) {
|
|
179
|
+
let entries;
|
|
180
|
+
try {
|
|
181
|
+
entries = readdirSync(join(root, "task"));
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const samples = new Map();
|
|
187
|
+
for (const entry of entries) {
|
|
188
|
+
if (!/^\d+$/.test(entry))
|
|
189
|
+
continue;
|
|
190
|
+
const sample = sampleThread(join(root, "task", entry), Number.parseInt(entry, 10));
|
|
191
|
+
if (sample)
|
|
192
|
+
samples.set(sample.tid, sample);
|
|
193
|
+
}
|
|
194
|
+
return samples;
|
|
195
|
+
}
|
|
196
|
+
function sampleThread(taskDir, tid) {
|
|
197
|
+
let stat;
|
|
198
|
+
try {
|
|
199
|
+
stat = readFileSync(join(taskDir, "stat"), "utf8");
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// The thread exited between the directory listing and this read.
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const open = stat.indexOf("(");
|
|
206
|
+
const close = stat.lastIndexOf(")");
|
|
207
|
+
if (open < 0 || close < open)
|
|
208
|
+
return null;
|
|
209
|
+
const fields = stat
|
|
210
|
+
.slice(close + 2)
|
|
211
|
+
.trimEnd()
|
|
212
|
+
.split(" ");
|
|
213
|
+
const userTicks = Number.parseInt(fields[11] ?? "", 10);
|
|
214
|
+
const systemTicks = Number.parseInt(fields[12] ?? "", 10);
|
|
215
|
+
if (!Number.isFinite(userTicks) || !Number.isFinite(systemTicks))
|
|
216
|
+
return null;
|
|
217
|
+
const switches = readContextSwitches(join(taskDir, "status"));
|
|
218
|
+
return {
|
|
219
|
+
tid,
|
|
220
|
+
name: stat.slice(open + 1, close),
|
|
221
|
+
state: fields[0] ?? "?",
|
|
222
|
+
userTicks,
|
|
223
|
+
systemTicks,
|
|
224
|
+
voluntary: switches.voluntary,
|
|
225
|
+
nonvoluntary: switches.nonvoluntary,
|
|
226
|
+
waitChannel: readWaitChannel(join(taskDir, "wchan")),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function readContextSwitches(statusPath) {
|
|
230
|
+
let voluntary = 0;
|
|
231
|
+
let nonvoluntary = 0;
|
|
232
|
+
let status;
|
|
233
|
+
try {
|
|
234
|
+
status = readFileSync(statusPath, "utf8");
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return { voluntary, nonvoluntary };
|
|
238
|
+
}
|
|
239
|
+
for (const line of status.split("\n")) {
|
|
240
|
+
const separator = line.indexOf(":");
|
|
241
|
+
if (separator < 0)
|
|
242
|
+
continue;
|
|
243
|
+
const key = line.slice(0, separator);
|
|
244
|
+
if (key !== "voluntary_ctxt_switches" && key !== "nonvoluntary_ctxt_switches")
|
|
245
|
+
continue;
|
|
246
|
+
const parsed = Number.parseInt(line.slice(separator + 1).trim(), 10);
|
|
247
|
+
if (!Number.isFinite(parsed))
|
|
248
|
+
continue;
|
|
249
|
+
if (key === "voluntary_ctxt_switches")
|
|
250
|
+
voluntary = parsed;
|
|
251
|
+
else
|
|
252
|
+
nonvoluntary = parsed;
|
|
253
|
+
}
|
|
254
|
+
return { voluntary, nonvoluntary };
|
|
255
|
+
}
|
|
256
|
+
function readWaitChannel(wchanPath) {
|
|
257
|
+
try {
|
|
258
|
+
const value = readFileSync(wchanPath, "utf8").trim();
|
|
259
|
+
return value === "" ? null : value;
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
function summarizeThreads(start, end, observedMs) {
|
|
266
|
+
const byName = {};
|
|
267
|
+
const items = [];
|
|
268
|
+
for (const sample of end.values()) {
|
|
269
|
+
byName[sample.name] = (byName[sample.name] ?? 0) + 1;
|
|
270
|
+
const baseline = start?.get(sample.tid);
|
|
271
|
+
let window = null;
|
|
272
|
+
if (baseline) {
|
|
273
|
+
const userTicks = Math.max(0, sample.userTicks - baseline.userTicks);
|
|
274
|
+
const systemTicks = Math.max(0, sample.systemTicks - baseline.systemTicks);
|
|
275
|
+
window = {
|
|
276
|
+
userTicks,
|
|
277
|
+
systemTicks,
|
|
278
|
+
cores: coresFromTicks(userTicks + systemTicks, observedMs),
|
|
279
|
+
contextSwitches: {
|
|
280
|
+
voluntary: Math.max(0, sample.voluntary - baseline.voluntary),
|
|
281
|
+
nonvoluntary: Math.max(0, sample.nonvoluntary - baseline.nonvoluntary),
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
items.push({
|
|
286
|
+
tid: sample.tid,
|
|
287
|
+
name: sample.name,
|
|
288
|
+
state: sample.state,
|
|
289
|
+
waitChannel: sample.waitChannel,
|
|
290
|
+
lifetime: { userTicks: sample.userTicks, systemTicks: sample.systemTicks },
|
|
291
|
+
window,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
items.sort(compareThreads);
|
|
295
|
+
return { total: items.length, byName, items };
|
|
296
|
+
}
|
|
297
|
+
function coresFromTicks(ticks, elapsedMs) {
|
|
298
|
+
if (!(elapsedMs > 0))
|
|
299
|
+
return 0;
|
|
300
|
+
return ((ticks / PROCFS_CLOCK_TICKS_PER_SECOND) * 1000) / elapsedMs;
|
|
301
|
+
}
|
|
302
|
+
function compareThreads(left, right) {
|
|
303
|
+
const leftCores = left.window?.cores ?? -1;
|
|
304
|
+
const rightCores = right.window?.cores ?? -1;
|
|
305
|
+
if (leftCores !== rightCores)
|
|
306
|
+
return rightCores - leftCores;
|
|
307
|
+
const leftLifetime = left.lifetime.userTicks + left.lifetime.systemTicks;
|
|
308
|
+
const rightLifetime = right.lifetime.userTicks + right.lifetime.systemTicks;
|
|
309
|
+
if (leftLifetime !== rightLifetime)
|
|
310
|
+
return rightLifetime - leftLifetime;
|
|
311
|
+
return left.tid - right.tid;
|
|
312
|
+
}
|
|
313
|
+
function sampleFileDescriptors(root) {
|
|
314
|
+
let entries;
|
|
315
|
+
try {
|
|
316
|
+
entries = readdirSync(join(root, "fd"));
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
const byKind = {
|
|
322
|
+
socket: 0,
|
|
323
|
+
eventpoll: 0,
|
|
324
|
+
timerfd: 0,
|
|
325
|
+
eventfd: 0,
|
|
326
|
+
pipe: 0,
|
|
327
|
+
file: 0,
|
|
328
|
+
other: 0,
|
|
329
|
+
};
|
|
330
|
+
let total = 0;
|
|
331
|
+
for (const entry of entries) {
|
|
332
|
+
let target;
|
|
333
|
+
try {
|
|
334
|
+
target = readlinkSync(join(root, "fd", entry));
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// Closed between the listing and the readlink (the listing's own
|
|
338
|
+
// directory handle always lands here).
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
byKind[classifyFileDescriptor(target)] += 1;
|
|
342
|
+
total += 1;
|
|
343
|
+
}
|
|
344
|
+
return { total, byKind };
|
|
345
|
+
}
|
|
346
|
+
function classifyFileDescriptor(target) {
|
|
347
|
+
if (target.startsWith("socket:"))
|
|
348
|
+
return "socket";
|
|
349
|
+
if (target === "anon_inode:[eventpoll]")
|
|
350
|
+
return "eventpoll";
|
|
351
|
+
if (target === "anon_inode:[timerfd]")
|
|
352
|
+
return "timerfd";
|
|
353
|
+
if (target === "anon_inode:[eventfd]")
|
|
354
|
+
return "eventfd";
|
|
355
|
+
if (target.startsWith("pipe:"))
|
|
356
|
+
return "pipe";
|
|
357
|
+
if (target.startsWith("/"))
|
|
358
|
+
return "file";
|
|
359
|
+
return "other";
|
|
360
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
/** Published @apifuse/provider-sdk version, read from the package manifest; "unknown" when unreadable. */
|
|
3
|
+
export function resolveSdkVersion() {
|
|
4
|
+
try {
|
|
5
|
+
const packageJsonUrl = new URL("../../package.json", import.meta.url);
|
|
6
|
+
const parsed = JSON.parse(readFileSync(packageJsonUrl, "utf8"));
|
|
7
|
+
if (parsed &&
|
|
8
|
+
typeof parsed === "object" &&
|
|
9
|
+
"version" in parsed &&
|
|
10
|
+
typeof parsed.version === "string") {
|
|
11
|
+
return parsed.version;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// fall through to unknown
|
|
16
|
+
}
|
|
17
|
+
return "unknown";
|
|
18
|
+
}
|
|
19
|
+
export const SDK_VERSION = resolveSdkVersion();
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type InputDateTokenCalendar = "KST" | "UTC";
|
|
2
|
+
export declare function resolveHealthCheckInputDateTokens(value: unknown, now?: Date, calendar?: InputDateTokenCalendar): unknown;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Relative
|
|
3
|
-
*
|
|
4
|
-
* so
|
|
2
|
+
* Relative date-token resolution for health-check case inputs and fixture
|
|
3
|
+
* requests. The calendar defaults to KST; callers that need UTC must opt in
|
|
4
|
+
* explicitly so UTC and KST do not silently disagree from 15:00–23:59 UTC.
|
|
5
5
|
*
|
|
6
|
-
* Supported token: `+<days>d` or `+<days>d:YYYYMMDD` (1..365 days ahead
|
|
6
|
+
* Supported token: `+<days>d` or `+<days>d:YYYYMMDD` (1..365 days ahead).
|
|
7
7
|
*/
|
|
8
|
-
const
|
|
9
|
-
function
|
|
10
|
-
const
|
|
11
|
-
const date = new Date(Date.UTC(
|
|
8
|
+
const RELATIVE_DATE_TOKEN = /^\+(\d{1,3})d(?::(YYYYMMDD))?$/i;
|
|
9
|
+
function dateFromDaysAhead(daysAhead, now = new Date(), format = "YYYY-MM-DD", calendar = "KST") {
|
|
10
|
+
const calendarNow = new Date(now.getTime() + (calendar === "KST" ? 9 * 60 * 60 * 1000 : 0));
|
|
11
|
+
const date = new Date(Date.UTC(calendarNow.getUTCFullYear(), calendarNow.getUTCMonth(), calendarNow.getUTCDate() + daysAhead));
|
|
12
12
|
const isoDate = date.toISOString().slice(0, 10);
|
|
13
13
|
return format === "YYYYMMDD" ? isoDate.replace(/-/g, "") : isoDate;
|
|
14
14
|
}
|
|
15
|
-
export function resolveHealthCheckInputDateTokens(value, now = new Date()) {
|
|
15
|
+
export function resolveHealthCheckInputDateTokens(value, now = new Date(), calendar = "KST") {
|
|
16
16
|
if (typeof value === "string") {
|
|
17
|
-
const relative = value.match(
|
|
17
|
+
const relative = value.match(RELATIVE_DATE_TOKEN);
|
|
18
18
|
if (!relative)
|
|
19
19
|
return value;
|
|
20
20
|
const daysAhead = Number(relative[1]);
|
|
@@ -22,16 +22,20 @@ export function resolveHealthCheckInputDateTokens(value, now = new Date()) {
|
|
|
22
22
|
return value;
|
|
23
23
|
}
|
|
24
24
|
const format = relative[2]?.toUpperCase() === "YYYYMMDD" ? "YYYYMMDD" : "YYYY-MM-DD";
|
|
25
|
-
return
|
|
25
|
+
return dateFromDaysAhead(daysAhead, now, format, calendar);
|
|
26
26
|
}
|
|
27
27
|
if (Array.isArray(value)) {
|
|
28
|
-
|
|
28
|
+
const resolved = value.map((entry) => resolveHealthCheckInputDateTokens(entry, now, calendar));
|
|
29
|
+
return resolved.some((entry, index) => entry !== value[index]) ? resolved : value;
|
|
29
30
|
}
|
|
30
31
|
if (value && typeof value === "object") {
|
|
31
|
-
|
|
32
|
+
const resolved = Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
32
33
|
key,
|
|
33
|
-
resolveHealthCheckInputDateTokens(entry, now),
|
|
34
|
+
resolveHealthCheckInputDateTokens(entry, now, calendar),
|
|
34
35
|
]));
|
|
36
|
+
return Object.entries(resolved).some(([key, entry]) => entry !== Reflect.get(value, key))
|
|
37
|
+
? resolved
|
|
38
|
+
: value;
|
|
35
39
|
}
|
|
36
40
|
return value;
|
|
37
41
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { collectDiagnosticSensitiveValues, SELF_TEST_SENSITIVE_SOURCE_KINDS, } from "./sensitive-values.js";
|
|
2
2
|
export const SELF_TEST_REDACTED_PLACEHOLDER = "[REDACTED]";
|
|
3
3
|
/** Maximum length of any string echoed in a self-test response. */
|
|
4
4
|
export const SELF_TEST_MAX_TEXT_LENGTH = 300;
|
|
@@ -16,37 +16,12 @@ const HEADER_SHAPED_SECRETS = [
|
|
|
16
16
|
* credential inputs.
|
|
17
17
|
*/
|
|
18
18
|
export function collectSelfTestSensitiveValues(provider, options = {}) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
envNames.add(secret.name);
|
|
26
|
-
}
|
|
27
|
-
const healthProbe = provider.healthProbe ?? provider.healthMonitor;
|
|
28
|
-
for (const name of healthProbe?.requiredSecrets ?? []) {
|
|
29
|
-
envNames.add(name);
|
|
30
|
-
}
|
|
31
|
-
for (const name of Object.values(healthProbe?.credentialInputs ?? {})) {
|
|
32
|
-
envNames.add(name);
|
|
33
|
-
}
|
|
34
|
-
const values = new Set();
|
|
35
|
-
for (const name of envNames) {
|
|
36
|
-
const value = env[name];
|
|
37
|
-
if (typeof value === "string" && value.length >= MIN_SENSITIVE_VALUE_LENGTH) {
|
|
38
|
-
values.add(value);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
for (const value of Object.values(options.credentialInputs ?? {})) {
|
|
42
|
-
if (value.length >= MIN_SENSITIVE_VALUE_LENGTH) {
|
|
43
|
-
values.add(value);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return [...values];
|
|
47
|
-
}
|
|
48
|
-
function escapeRegExp(value) {
|
|
49
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
19
|
+
return collectDiagnosticSensitiveValues(provider, {
|
|
20
|
+
...options,
|
|
21
|
+
sourceKinds: SELF_TEST_SENSITIVE_SOURCE_KINDS,
|
|
22
|
+
minimumLength: MIN_SENSITIVE_VALUE_LENGTH,
|
|
23
|
+
includeResolvedEnvVariants: false,
|
|
24
|
+
});
|
|
50
25
|
}
|
|
51
26
|
/**
|
|
52
27
|
* Scrubs known secret values and header-shaped credentials from a string and
|
|
@@ -58,7 +33,7 @@ export function redactSelfTestText(text, sensitiveValues, maxLength = SELF_TEST_
|
|
|
58
33
|
for (const value of sensitiveValues) {
|
|
59
34
|
if (value.length < MIN_SENSITIVE_VALUE_LENGTH)
|
|
60
35
|
continue;
|
|
61
|
-
redacted = redacted.
|
|
36
|
+
redacted = redacted.replaceAll(value, SELF_TEST_REDACTED_PLACEHOLDER);
|
|
62
37
|
}
|
|
63
38
|
for (const pattern of HEADER_SHAPED_SECRETS) {
|
|
64
39
|
redacted = redacted.replace(pattern, (_match, prefix) => `${prefix}${SELF_TEST_REDACTED_PLACEHOLDER}`);
|
|
@@ -51,11 +51,21 @@ export interface SelfTestResponse {
|
|
|
51
51
|
result?: SelfTestCaseResult;
|
|
52
52
|
results: SelfTestCaseResult[];
|
|
53
53
|
}
|
|
54
|
+
export interface SelfTestCancellationLogEvent {
|
|
55
|
+
level: "info";
|
|
56
|
+
event: "self_test_run_cancelled";
|
|
57
|
+
providerId: string;
|
|
58
|
+
requestId: string;
|
|
59
|
+
operationId: string;
|
|
60
|
+
caseName: string;
|
|
61
|
+
reason: string;
|
|
62
|
+
}
|
|
54
63
|
export type SelfTestOperationInvoke = (args: {
|
|
55
64
|
operationId: string;
|
|
56
65
|
input: unknown;
|
|
57
66
|
connection?: OperationConnection;
|
|
58
67
|
requestId: string;
|
|
68
|
+
signal?: AbortSignal;
|
|
59
69
|
}) => Promise<{
|
|
60
70
|
status: number;
|
|
61
71
|
data: unknown;
|
|
@@ -78,6 +88,11 @@ export type SelfTestAuthFlowInvoke = (args: {
|
|
|
78
88
|
externalRef?: string;
|
|
79
89
|
input?: Record<string, unknown>;
|
|
80
90
|
context?: Record<string, unknown>;
|
|
91
|
+
/** Opaque engine state from the previous turn (`engine` in the auth response), sent verbatim. */
|
|
92
|
+
engine?: {
|
|
93
|
+
egressLease: string;
|
|
94
|
+
};
|
|
95
|
+
signal?: AbortSignal;
|
|
81
96
|
}) => Promise<{
|
|
82
97
|
status: number;
|
|
83
98
|
body: unknown;
|
|
@@ -112,6 +127,8 @@ export interface SelfTestAppOptions {
|
|
|
112
127
|
requestBudgetMs?: number;
|
|
113
128
|
/** Env override for secret collection + budget resolution (tests). */
|
|
114
129
|
env?: Readonly<Record<string, string | undefined>>;
|
|
130
|
+
/** Structured server logger; defaults to the same JSON console shape as the provider server. */
|
|
131
|
+
logger?: (event: SelfTestCancellationLogEvent) => void;
|
|
115
132
|
}
|
|
116
133
|
/**
|
|
117
134
|
* Stable sha256 over the provider's declared health plan (operations, case
|
|
@@ -121,9 +138,7 @@ export interface SelfTestAppOptions {
|
|
|
121
138
|
export declare function computeSelfTestPlanDigest(provider: ProviderDefinition): string;
|
|
122
139
|
/**
|
|
123
140
|
* Fail-closed read-only classification: an operation may self-test only when
|
|
124
|
-
* its
|
|
125
|
-
* toolRouter.riskClass "read") and nothing marks it side-effecting. Unclassified
|
|
126
|
-
* operations are refused so the endpoint cannot become a mutation oracle.
|
|
141
|
+
* its authored safety source of truth classifies it as read-only.
|
|
127
142
|
*/
|
|
128
143
|
export declare function isSelfTestReadOnlyOperation(operation: OperationDefinition): boolean;
|
|
129
144
|
/** Binds the self-test executor to a tenant app's /v1 pipeline in-process. */
|