@defai.digital/contracts 13.0.3
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/LICENSE +214 -0
- package/dist/ability/v1/index.d.ts +5 -0
- package/dist/ability/v1/index.d.ts.map +1 -0
- package/dist/ability/v1/index.js +5 -0
- package/dist/ability/v1/index.js.map +1 -0
- package/dist/ability/v1/schema.d.ts +288 -0
- package/dist/ability/v1/schema.d.ts.map +1 -0
- package/dist/ability/v1/schema.js +138 -0
- package/dist/ability/v1/schema.js.map +1 -0
- package/dist/agent/v1/index.d.ts +8 -0
- package/dist/agent/v1/index.d.ts.map +1 -0
- package/dist/agent/v1/index.js +31 -0
- package/dist/agent/v1/index.js.map +1 -0
- package/dist/agent/v1/schema.d.ts +4055 -0
- package/dist/agent/v1/schema.d.ts.map +1 -0
- package/dist/agent/v1/schema.js +970 -0
- package/dist/agent/v1/schema.js.map +1 -0
- package/dist/agent/v1/storage-port.d.ts +172 -0
- package/dist/agent/v1/storage-port.d.ts.map +1 -0
- package/dist/agent/v1/storage-port.js +10 -0
- package/dist/agent/v1/storage-port.js.map +1 -0
- package/dist/analysis/v1/index.d.ts +7 -0
- package/dist/analysis/v1/index.d.ts.map +1 -0
- package/dist/analysis/v1/index.js +21 -0
- package/dist/analysis/v1/index.js.map +1 -0
- package/dist/analysis/v1/schema.d.ts +348 -0
- package/dist/analysis/v1/schema.d.ts.map +1 -0
- package/dist/analysis/v1/schema.js +252 -0
- package/dist/analysis/v1/schema.js.map +1 -0
- package/dist/cli/v1/index.d.ts +8 -0
- package/dist/cli/v1/index.d.ts.map +1 -0
- package/dist/cli/v1/index.js +46 -0
- package/dist/cli/v1/index.js.map +1 -0
- package/dist/cli/v1/output.d.ts +347 -0
- package/dist/cli/v1/output.d.ts.map +1 -0
- package/dist/cli/v1/output.js +288 -0
- package/dist/cli/v1/output.js.map +1 -0
- package/dist/cli/v1/schema.d.ts +494 -0
- package/dist/cli/v1/schema.d.ts.map +1 -0
- package/dist/cli/v1/schema.js +342 -0
- package/dist/cli/v1/schema.js.map +1 -0
- package/dist/config/v1/config.d.ts +887 -0
- package/dist/config/v1/config.d.ts.map +1 -0
- package/dist/config/v1/config.js +348 -0
- package/dist/config/v1/config.js.map +1 -0
- package/dist/config/v1/errors.d.ts +84 -0
- package/dist/config/v1/errors.d.ts.map +1 -0
- package/dist/config/v1/errors.js +150 -0
- package/dist/config/v1/errors.js.map +1 -0
- package/dist/config/v1/events.d.ts +416 -0
- package/dist/config/v1/events.d.ts.map +1 -0
- package/dist/config/v1/events.js +204 -0
- package/dist/config/v1/events.js.map +1 -0
- package/dist/config/v1/index.d.ts +11 -0
- package/dist/config/v1/index.d.ts.map +1 -0
- package/dist/config/v1/index.js +49 -0
- package/dist/config/v1/index.js.map +1 -0
- package/dist/config/v1/operations.d.ts +293 -0
- package/dist/config/v1/operations.d.ts.map +1 -0
- package/dist/config/v1/operations.js +172 -0
- package/dist/config/v1/operations.js.map +1 -0
- package/dist/config/v1/provider-config.d.ts +124 -0
- package/dist/config/v1/provider-config.d.ts.map +1 -0
- package/dist/config/v1/provider-config.js +123 -0
- package/dist/config/v1/provider-config.js.map +1 -0
- package/dist/constants.d.ts +292 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +370 -0
- package/dist/constants.js.map +1 -0
- package/dist/context/v1/index.d.ts +5 -0
- package/dist/context/v1/index.d.ts.map +1 -0
- package/dist/context/v1/index.js +13 -0
- package/dist/context/v1/index.js.map +1 -0
- package/dist/context/v1/schema.d.ts +289 -0
- package/dist/context/v1/schema.d.ts.map +1 -0
- package/dist/context/v1/schema.js +145 -0
- package/dist/context/v1/schema.js.map +1 -0
- package/dist/cross-cutting/v1/dead-letter.d.ts +305 -0
- package/dist/cross-cutting/v1/dead-letter.d.ts.map +1 -0
- package/dist/cross-cutting/v1/dead-letter.js +172 -0
- package/dist/cross-cutting/v1/dead-letter.js.map +1 -0
- package/dist/cross-cutting/v1/idempotency.d.ts +222 -0
- package/dist/cross-cutting/v1/idempotency.d.ts.map +1 -0
- package/dist/cross-cutting/v1/idempotency.js +170 -0
- package/dist/cross-cutting/v1/idempotency.js.map +1 -0
- package/dist/cross-cutting/v1/index.d.ts +14 -0
- package/dist/cross-cutting/v1/index.d.ts.map +1 -0
- package/dist/cross-cutting/v1/index.js +18 -0
- package/dist/cross-cutting/v1/index.js.map +1 -0
- package/dist/cross-cutting/v1/retention.d.ts +347 -0
- package/dist/cross-cutting/v1/retention.d.ts.map +1 -0
- package/dist/cross-cutting/v1/retention.js +178 -0
- package/dist/cross-cutting/v1/retention.js.map +1 -0
- package/dist/cross-cutting/v1/saga.d.ts +358 -0
- package/dist/cross-cutting/v1/saga.d.ts.map +1 -0
- package/dist/cross-cutting/v1/saga.js +219 -0
- package/dist/cross-cutting/v1/saga.js.map +1 -0
- package/dist/design/v1/index.d.ts +5 -0
- package/dist/design/v1/index.d.ts.map +1 -0
- package/dist/design/v1/index.js +5 -0
- package/dist/design/v1/index.js.map +1 -0
- package/dist/design/v1/schema.d.ts +748 -0
- package/dist/design/v1/schema.d.ts.map +1 -0
- package/dist/design/v1/schema.js +316 -0
- package/dist/design/v1/schema.js.map +1 -0
- package/dist/discussion/v1/index.d.ts +10 -0
- package/dist/discussion/v1/index.d.ts.map +1 -0
- package/dist/discussion/v1/index.js +21 -0
- package/dist/discussion/v1/index.js.map +1 -0
- package/dist/discussion/v1/schema.d.ts +1186 -0
- package/dist/discussion/v1/schema.d.ts.map +1 -0
- package/dist/discussion/v1/schema.js +560 -0
- package/dist/discussion/v1/schema.js.map +1 -0
- package/dist/file-system/v1/index.d.ts +7 -0
- package/dist/file-system/v1/index.d.ts.map +1 -0
- package/dist/file-system/v1/index.js +7 -0
- package/dist/file-system/v1/index.js.map +1 -0
- package/dist/file-system/v1/schema.d.ts +644 -0
- package/dist/file-system/v1/schema.d.ts.map +1 -0
- package/dist/file-system/v1/schema.js +278 -0
- package/dist/file-system/v1/schema.js.map +1 -0
- package/dist/guard/v1/index.d.ts +9 -0
- package/dist/guard/v1/index.d.ts.map +1 -0
- package/dist/guard/v1/index.js +10 -0
- package/dist/guard/v1/index.js.map +1 -0
- package/dist/guard/v1/schema.d.ts +308 -0
- package/dist/guard/v1/schema.d.ts.map +1 -0
- package/dist/guard/v1/schema.js +267 -0
- package/dist/guard/v1/schema.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/iterate/v1/index.d.ts +5 -0
- package/dist/iterate/v1/index.d.ts.map +1 -0
- package/dist/iterate/v1/index.js +13 -0
- package/dist/iterate/v1/index.js.map +1 -0
- package/dist/iterate/v1/schema.d.ts +693 -0
- package/dist/iterate/v1/schema.d.ts.map +1 -0
- package/dist/iterate/v1/schema.js +244 -0
- package/dist/iterate/v1/schema.js.map +1 -0
- package/dist/mcp/v1/index.d.ts +8 -0
- package/dist/mcp/v1/index.d.ts.map +1 -0
- package/dist/mcp/v1/index.js +20 -0
- package/dist/mcp/v1/index.js.map +1 -0
- package/dist/mcp/v1/prompts/index.d.ts +5 -0
- package/dist/mcp/v1/prompts/index.d.ts.map +1 -0
- package/dist/mcp/v1/prompts/index.js +5 -0
- package/dist/mcp/v1/prompts/index.js.map +1 -0
- package/dist/mcp/v1/prompts/schema.d.ts +266 -0
- package/dist/mcp/v1/prompts/schema.d.ts.map +1 -0
- package/dist/mcp/v1/prompts/schema.js +138 -0
- package/dist/mcp/v1/prompts/schema.js.map +1 -0
- package/dist/mcp/v1/rate-limit.schema.d.ts +175 -0
- package/dist/mcp/v1/rate-limit.schema.d.ts.map +1 -0
- package/dist/mcp/v1/rate-limit.schema.js +164 -0
- package/dist/mcp/v1/rate-limit.schema.js.map +1 -0
- package/dist/mcp/v1/resources/index.d.ts +5 -0
- package/dist/mcp/v1/resources/index.d.ts.map +1 -0
- package/dist/mcp/v1/resources/index.js +5 -0
- package/dist/mcp/v1/resources/index.js.map +1 -0
- package/dist/mcp/v1/resources/schema.d.ts +169 -0
- package/dist/mcp/v1/resources/schema.d.ts.map +1 -0
- package/dist/mcp/v1/resources/schema.js +118 -0
- package/dist/mcp/v1/resources/schema.js.map +1 -0
- package/dist/mcp/v1/runtime/cache.d.ts +204 -0
- package/dist/mcp/v1/runtime/cache.d.ts.map +1 -0
- package/dist/mcp/v1/runtime/cache.js +92 -0
- package/dist/mcp/v1/runtime/cache.js.map +1 -0
- package/dist/mcp/v1/runtime/index.d.ts +5 -0
- package/dist/mcp/v1/runtime/index.d.ts.map +1 -0
- package/dist/mcp/v1/runtime/index.js +9 -0
- package/dist/mcp/v1/runtime/index.js.map +1 -0
- package/dist/mcp/v1/runtime/limits.d.ts +113 -0
- package/dist/mcp/v1/runtime/limits.d.ts.map +1 -0
- package/dist/mcp/v1/runtime/limits.js +95 -0
- package/dist/mcp/v1/runtime/limits.js.map +1 -0
- package/dist/mcp/v1/runtime/response.d.ts +467 -0
- package/dist/mcp/v1/runtime/response.d.ts.map +1 -0
- package/dist/mcp/v1/runtime/response.js +130 -0
- package/dist/mcp/v1/runtime/response.js.map +1 -0
- package/dist/mcp/v1/runtime/timeout.d.ts +116 -0
- package/dist/mcp/v1/runtime/timeout.d.ts.map +1 -0
- package/dist/mcp/v1/runtime/timeout.js +116 -0
- package/dist/mcp/v1/runtime/timeout.js.map +1 -0
- package/dist/mcp/v1/schema.d.ts +171 -0
- package/dist/mcp/v1/schema.d.ts.map +1 -0
- package/dist/mcp/v1/schema.js +97 -0
- package/dist/mcp/v1/schema.js.map +1 -0
- package/dist/mcp/v1/tools/agent.d.ts +485 -0
- package/dist/mcp/v1/tools/agent.d.ts.map +1 -0
- package/dist/mcp/v1/tools/agent.js +264 -0
- package/dist/mcp/v1/tools/agent.js.map +1 -0
- package/dist/mcp/v1/tools/guard.d.ts +243 -0
- package/dist/mcp/v1/tools/guard.d.ts.map +1 -0
- package/dist/mcp/v1/tools/guard.js +136 -0
- package/dist/mcp/v1/tools/guard.js.map +1 -0
- package/dist/mcp/v1/tools/index.d.ts +15 -0
- package/dist/mcp/v1/tools/index.d.ts.map +1 -0
- package/dist/mcp/v1/tools/index.js +22 -0
- package/dist/mcp/v1/tools/index.js.map +1 -0
- package/dist/mcp/v1/tools/memory.d.ts +569 -0
- package/dist/mcp/v1/tools/memory.d.ts.map +1 -0
- package/dist/mcp/v1/tools/memory.js +319 -0
- package/dist/mcp/v1/tools/memory.js.map +1 -0
- package/dist/mcp/v1/tools/session.d.ts +545 -0
- package/dist/mcp/v1/tools/session.d.ts.map +1 -0
- package/dist/mcp/v1/tools/session.js +309 -0
- package/dist/mcp/v1/tools/session.js.map +1 -0
- package/dist/mcp/v1/tools/tool-list-schemas.d.ts +354 -0
- package/dist/mcp/v1/tools/tool-list-schemas.d.ts.map +1 -0
- package/dist/mcp/v1/tools/tool-list-schemas.js +140 -0
- package/dist/mcp/v1/tools/tool-list-schemas.js.map +1 -0
- package/dist/mcp/v1/tools/trace.d.ts +282 -0
- package/dist/mcp/v1/tools/trace.d.ts.map +1 -0
- package/dist/mcp/v1/tools/trace.js +94 -0
- package/dist/mcp/v1/tools/trace.js.map +1 -0
- package/dist/mcp/v1/tools/workflow.d.ts +146 -0
- package/dist/mcp/v1/tools/workflow.d.ts.map +1 -0
- package/dist/mcp/v1/tools/workflow.js +68 -0
- package/dist/mcp/v1/tools/workflow.js.map +1 -0
- package/dist/mcp/v1/trace/index.d.ts +5 -0
- package/dist/mcp/v1/trace/index.d.ts.map +1 -0
- package/dist/mcp/v1/trace/index.js +5 -0
- package/dist/mcp/v1/trace/index.js.map +1 -0
- package/dist/mcp/v1/trace/tool-trace.d.ts +107 -0
- package/dist/mcp/v1/trace/tool-trace.d.ts.map +1 -0
- package/dist/mcp/v1/trace/tool-trace.js +91 -0
- package/dist/mcp/v1/trace/tool-trace.js.map +1 -0
- package/dist/memory/v1/index.d.ts +2 -0
- package/dist/memory/v1/index.d.ts.map +1 -0
- package/dist/memory/v1/index.js +2 -0
- package/dist/memory/v1/index.js.map +1 -0
- package/dist/memory/v1/schema.d.ts +188 -0
- package/dist/memory/v1/schema.d.ts.map +1 -0
- package/dist/memory/v1/schema.js +108 -0
- package/dist/memory/v1/schema.js.map +1 -0
- package/dist/ml-lifecycle/v1/index.d.ts +12 -0
- package/dist/ml-lifecycle/v1/index.d.ts.map +1 -0
- package/dist/ml-lifecycle/v1/index.js +12 -0
- package/dist/ml-lifecycle/v1/index.js.map +1 -0
- package/dist/ml-lifecycle/v1/schema.d.ts +1207 -0
- package/dist/ml-lifecycle/v1/schema.d.ts.map +1 -0
- package/dist/ml-lifecycle/v1/schema.js +481 -0
- package/dist/ml-lifecycle/v1/schema.js.map +1 -0
- package/dist/orchestration/v1/index.d.ts +5 -0
- package/dist/orchestration/v1/index.d.ts.map +1 -0
- package/dist/orchestration/v1/index.js +23 -0
- package/dist/orchestration/v1/index.js.map +1 -0
- package/dist/orchestration/v1/schema.d.ts +1384 -0
- package/dist/orchestration/v1/schema.d.ts.map +1 -0
- package/dist/orchestration/v1/schema.js +394 -0
- package/dist/orchestration/v1/schema.js.map +1 -0
- package/dist/provider/v1/circuit-breaker.d.ts +151 -0
- package/dist/provider/v1/circuit-breaker.d.ts.map +1 -0
- package/dist/provider/v1/circuit-breaker.js +119 -0
- package/dist/provider/v1/circuit-breaker.js.map +1 -0
- package/dist/provider/v1/health.d.ts +246 -0
- package/dist/provider/v1/health.d.ts.map +1 -0
- package/dist/provider/v1/health.js +190 -0
- package/dist/provider/v1/health.js.map +1 -0
- package/dist/provider/v1/index.d.ts +13 -0
- package/dist/provider/v1/index.d.ts.map +1 -0
- package/dist/provider/v1/index.js +17 -0
- package/dist/provider/v1/index.js.map +1 -0
- package/dist/provider/v1/port.d.ts +237 -0
- package/dist/provider/v1/port.d.ts.map +1 -0
- package/dist/provider/v1/port.js +113 -0
- package/dist/provider/v1/port.js.map +1 -0
- package/dist/provider/v1/rate-limit.d.ts +214 -0
- package/dist/provider/v1/rate-limit.d.ts.map +1 -0
- package/dist/provider/v1/rate-limit.js +165 -0
- package/dist/provider/v1/rate-limit.js.map +1 -0
- package/dist/resilience/v1/circuit-breaker.d.ts +135 -0
- package/dist/resilience/v1/circuit-breaker.d.ts.map +1 -0
- package/dist/resilience/v1/circuit-breaker.js +105 -0
- package/dist/resilience/v1/circuit-breaker.js.map +1 -0
- package/dist/resilience/v1/index.d.ts +17 -0
- package/dist/resilience/v1/index.d.ts.map +1 -0
- package/dist/resilience/v1/index.js +17 -0
- package/dist/resilience/v1/index.js.map +1 -0
- package/dist/resilience/v1/loop-guard.d.ts +123 -0
- package/dist/resilience/v1/loop-guard.d.ts.map +1 -0
- package/dist/resilience/v1/loop-guard.js +96 -0
- package/dist/resilience/v1/loop-guard.js.map +1 -0
- package/dist/resilience/v1/metrics.d.ts +323 -0
- package/dist/resilience/v1/metrics.d.ts.map +1 -0
- package/dist/resilience/v1/metrics.js +183 -0
- package/dist/resilience/v1/metrics.js.map +1 -0
- package/dist/resilience/v1/rate-limiter.d.ts +122 -0
- package/dist/resilience/v1/rate-limiter.d.ts.map +1 -0
- package/dist/resilience/v1/rate-limiter.js +119 -0
- package/dist/resilience/v1/rate-limiter.js.map +1 -0
- package/dist/resilience/v1/resource-limits.d.ts +146 -0
- package/dist/resilience/v1/resource-limits.d.ts.map +1 -0
- package/dist/resilience/v1/resource-limits.js +130 -0
- package/dist/resilience/v1/resource-limits.js.map +1 -0
- package/dist/review/v1/index.d.ts +7 -0
- package/dist/review/v1/index.d.ts.map +1 -0
- package/dist/review/v1/index.js +23 -0
- package/dist/review/v1/index.js.map +1 -0
- package/dist/review/v1/schema.d.ts +1284 -0
- package/dist/review/v1/schema.d.ts.map +1 -0
- package/dist/review/v1/schema.js +423 -0
- package/dist/review/v1/schema.js.map +1 -0
- package/dist/routing/v1/index.d.ts +2 -0
- package/dist/routing/v1/index.d.ts.map +1 -0
- package/dist/routing/v1/index.js +2 -0
- package/dist/routing/v1/index.js.map +1 -0
- package/dist/routing/v1/schema.d.ts +315 -0
- package/dist/routing/v1/schema.d.ts.map +1 -0
- package/dist/routing/v1/schema.js +103 -0
- package/dist/routing/v1/schema.js.map +1 -0
- package/dist/scaffold/v1/index.d.ts +7 -0
- package/dist/scaffold/v1/index.d.ts.map +1 -0
- package/dist/scaffold/v1/index.js +7 -0
- package/dist/scaffold/v1/index.js.map +1 -0
- package/dist/scaffold/v1/schema.d.ts +351 -0
- package/dist/scaffold/v1/schema.d.ts.map +1 -0
- package/dist/scaffold/v1/schema.js +238 -0
- package/dist/scaffold/v1/schema.js.map +1 -0
- package/dist/session/v1/index.d.ts +7 -0
- package/dist/session/v1/index.d.ts.map +1 -0
- package/dist/session/v1/index.js +23 -0
- package/dist/session/v1/index.js.map +1 -0
- package/dist/session/v1/schema.d.ts +1156 -0
- package/dist/session/v1/schema.d.ts.map +1 -0
- package/dist/session/v1/schema.js +315 -0
- package/dist/session/v1/schema.js.map +1 -0
- package/dist/storage/v1/index.d.ts +9 -0
- package/dist/storage/v1/index.d.ts.map +1 -0
- package/dist/storage/v1/index.js +21 -0
- package/dist/storage/v1/index.js.map +1 -0
- package/dist/storage/v1/schema.d.ts +411 -0
- package/dist/storage/v1/schema.d.ts.map +1 -0
- package/dist/storage/v1/schema.js +167 -0
- package/dist/storage/v1/schema.js.map +1 -0
- package/dist/telemetry/v1/index.d.ts +5 -0
- package/dist/telemetry/v1/index.d.ts.map +1 -0
- package/dist/telemetry/v1/index.js +5 -0
- package/dist/telemetry/v1/index.js.map +1 -0
- package/dist/telemetry/v1/schema.d.ts +747 -0
- package/dist/telemetry/v1/schema.d.ts.map +1 -0
- package/dist/telemetry/v1/schema.js +300 -0
- package/dist/telemetry/v1/schema.js.map +1 -0
- package/dist/token-budget/v1/index.d.ts +7 -0
- package/dist/token-budget/v1/index.d.ts.map +1 -0
- package/dist/token-budget/v1/index.js +25 -0
- package/dist/token-budget/v1/index.js.map +1 -0
- package/dist/token-budget/v1/schema.d.ts +588 -0
- package/dist/token-budget/v1/schema.d.ts.map +1 -0
- package/dist/token-budget/v1/schema.js +239 -0
- package/dist/token-budget/v1/schema.js.map +1 -0
- package/dist/trace/v1/index.d.ts +2 -0
- package/dist/trace/v1/index.d.ts.map +1 -0
- package/dist/trace/v1/index.js +4 -0
- package/dist/trace/v1/index.js.map +1 -0
- package/dist/trace/v1/schema.d.ts +531 -0
- package/dist/trace/v1/schema.d.ts.map +1 -0
- package/dist/trace/v1/schema.js +243 -0
- package/dist/trace/v1/schema.js.map +1 -0
- package/dist/workflow/v1/index.d.ts +3 -0
- package/dist/workflow/v1/index.d.ts.map +1 -0
- package/dist/workflow/v1/index.js +8 -0
- package/dist/workflow/v1/index.js.map +1 -0
- package/dist/workflow/v1/schema.d.ts +267 -0
- package/dist/workflow/v1/schema.d.ts.map +1 -0
- package/dist/workflow/v1/schema.js +95 -0
- package/dist/workflow/v1/schema.js.map +1 -0
- package/dist/workflow/v1/step-guard.d.ts +571 -0
- package/dist/workflow/v1/step-guard.d.ts.map +1 -0
- package/dist/workflow/v1/step-guard.js +305 -0
- package/dist/workflow/v1/step-guard.js.map +1 -0
- package/dist/workflow-templates/v1/index.d.ts +8 -0
- package/dist/workflow-templates/v1/index.d.ts.map +1 -0
- package/dist/workflow-templates/v1/index.js +8 -0
- package/dist/workflow-templates/v1/index.js.map +1 -0
- package/dist/workflow-templates/v1/schema.d.ts +714 -0
- package/dist/workflow-templates/v1/schema.d.ts.map +1 -0
- package/dist/workflow-templates/v1/schema.js +168 -0
- package/dist/workflow-templates/v1/schema.js.map +1 -0
- package/package.json +142 -0
- package/src/guard/v1/policy.schema.json +56 -0
- package/src/mcp/v1/tools.schema.json +108 -0
- package/src/memory/v1/event.schema.json +136 -0
- package/src/routing/v1/decision.schema.json +155 -0
- package/src/trace/v1/event.schema.json +197 -0
- package/src/workflow/v1/workflow.schema.json +142 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Contract V1
|
|
3
|
+
*
|
|
4
|
+
* Provides rate limiting for provider requests using token bucket algorithm.
|
|
5
|
+
* Prevents overwhelming providers with too many requests.
|
|
6
|
+
*
|
|
7
|
+
* Invariants:
|
|
8
|
+
* - INV-RL-001: Tokens never exceed burst capacity
|
|
9
|
+
* - INV-RL-002: Tokens refill at configured rate
|
|
10
|
+
* - INV-RL-003: Strategy (reject/queue/backoff) honored
|
|
11
|
+
* - INV-RL-004: Queue never exceeds maxQueueSize
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
/**
|
|
15
|
+
* Rate limit strategy when limit is reached
|
|
16
|
+
*/
|
|
17
|
+
export const RateLimitStrategySchema = z.enum([
|
|
18
|
+
'reject', // Immediately reject request
|
|
19
|
+
'queue', // Queue request for later
|
|
20
|
+
'backoff', // Wait with exponential backoff
|
|
21
|
+
]);
|
|
22
|
+
/**
|
|
23
|
+
* Rate limit state
|
|
24
|
+
*/
|
|
25
|
+
export const RateLimitStateEnumSchema = z.enum([
|
|
26
|
+
'normal', // Operating normally
|
|
27
|
+
'throttled', // Rate limited but requests allowed
|
|
28
|
+
'blocked', // All requests blocked
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Rate limit configuration
|
|
32
|
+
*/
|
|
33
|
+
export const RateLimitConfigSchema = z.object({
|
|
34
|
+
/** Requests per minute per provider */
|
|
35
|
+
requestsPerMinute: z.number().int().min(1).max(10000).default(60),
|
|
36
|
+
/** Tokens per minute per provider */
|
|
37
|
+
tokensPerMinute: z.number().int().min(1000).max(10000000).default(100000),
|
|
38
|
+
/** Burst allowance multiplier (INV-RL-001) */
|
|
39
|
+
burstMultiplier: z.number().min(1).max(5).default(1.5),
|
|
40
|
+
/** Strategy when limit reached (INV-RL-003) */
|
|
41
|
+
strategy: RateLimitStrategySchema.default('backoff'),
|
|
42
|
+
/** Max queue size if strategy is 'queue' (INV-RL-004) */
|
|
43
|
+
maxQueueSize: z.number().int().min(0).max(1000).default(100),
|
|
44
|
+
/** Backoff base delay in ms */
|
|
45
|
+
backoffBaseMs: z.number().int().min(100).max(10000).default(1000),
|
|
46
|
+
/** Backoff multiplier for exponential backoff */
|
|
47
|
+
backoffMultiplier: z.number().min(1).max(4).default(2),
|
|
48
|
+
/** Maximum backoff delay in ms */
|
|
49
|
+
maxBackoffMs: z.number().int().min(1000).max(60000).default(30000),
|
|
50
|
+
/** Enable token-based rate limiting */
|
|
51
|
+
enableTokenLimit: z.boolean().default(true),
|
|
52
|
+
/** Enable request-based rate limiting */
|
|
53
|
+
enableRequestLimit: z.boolean().default(true),
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Rate limit state snapshot
|
|
57
|
+
*/
|
|
58
|
+
export const RateLimitStateSchema = z.object({
|
|
59
|
+
/** Current available request tokens */
|
|
60
|
+
requestTokens: z.number().min(0),
|
|
61
|
+
/** Current available output tokens */
|
|
62
|
+
outputTokens: z.number().min(0),
|
|
63
|
+
/** Requests in current window */
|
|
64
|
+
requestCount: z.number().int().min(0),
|
|
65
|
+
/** Tokens used in current window */
|
|
66
|
+
tokenCount: z.number().int().min(0),
|
|
67
|
+
/** Start of current rate limit window */
|
|
68
|
+
windowStart: z.string().datetime(),
|
|
69
|
+
/** Current queue size */
|
|
70
|
+
queueSize: z.number().int().min(0),
|
|
71
|
+
/** Next allowed request time (if rate limited) */
|
|
72
|
+
nextAllowedTime: z.string().datetime().optional(),
|
|
73
|
+
/** Current state */
|
|
74
|
+
state: RateLimitStateEnumSchema,
|
|
75
|
+
/** Last refill timestamp */
|
|
76
|
+
lastRefillTime: z.string().datetime(),
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* Rate limit result
|
|
80
|
+
*/
|
|
81
|
+
export const RateLimitResultSchema = z.object({
|
|
82
|
+
/** Whether request is allowed */
|
|
83
|
+
allowed: z.boolean(),
|
|
84
|
+
/** Wait time in ms (for backoff strategy) */
|
|
85
|
+
waitMs: z.number().int().min(0),
|
|
86
|
+
/** Whether request was queued */
|
|
87
|
+
queued: z.boolean().optional(),
|
|
88
|
+
/** Queue position if queued */
|
|
89
|
+
queuePosition: z.number().int().min(0).optional(),
|
|
90
|
+
/** Error code if rejected */
|
|
91
|
+
error: z.string().optional(),
|
|
92
|
+
/** Remaining requests in window */
|
|
93
|
+
remainingRequests: z.number().int().min(0).optional(),
|
|
94
|
+
/** Remaining tokens in window */
|
|
95
|
+
remainingTokens: z.number().int().min(0).optional(),
|
|
96
|
+
/** Time until rate limit resets */
|
|
97
|
+
resetInMs: z.number().int().min(0).optional(),
|
|
98
|
+
});
|
|
99
|
+
/**
|
|
100
|
+
* Rate limit event types
|
|
101
|
+
*/
|
|
102
|
+
export const RateLimitEventTypeSchema = z.enum([
|
|
103
|
+
'rateLimit.acquired',
|
|
104
|
+
'rateLimit.rejected',
|
|
105
|
+
'rateLimit.queued',
|
|
106
|
+
'rateLimit.dequeued',
|
|
107
|
+
'rateLimit.refilled',
|
|
108
|
+
'rateLimit.stateChanged',
|
|
109
|
+
]);
|
|
110
|
+
/**
|
|
111
|
+
* Rate limit event
|
|
112
|
+
*/
|
|
113
|
+
export const RateLimitEventSchema = z.object({
|
|
114
|
+
eventId: z.string().uuid(),
|
|
115
|
+
type: RateLimitEventTypeSchema,
|
|
116
|
+
providerId: z.string(),
|
|
117
|
+
timestamp: z.string().datetime(),
|
|
118
|
+
requestId: z.string().uuid().optional(),
|
|
119
|
+
details: z.record(z.unknown()).optional(),
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* Error codes for rate limit operations
|
|
123
|
+
*/
|
|
124
|
+
export const RateLimitErrorCodes = {
|
|
125
|
+
RATE_LIMITED: 'RATE_LIMIT_EXCEEDED',
|
|
126
|
+
QUEUE_FULL: 'RATE_LIMIT_QUEUE_FULL',
|
|
127
|
+
TOKEN_LIMIT: 'RATE_LIMIT_TOKEN_EXCEEDED',
|
|
128
|
+
REQUEST_LIMIT: 'RATE_LIMIT_REQUEST_EXCEEDED',
|
|
129
|
+
INVALID_CONFIG: 'RATE_LIMIT_INVALID_CONFIG',
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Validates rate limit configuration
|
|
133
|
+
*/
|
|
134
|
+
export function validateRateLimitConfig(data) {
|
|
135
|
+
return RateLimitConfigSchema.parse(data);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Validates rate limit state
|
|
139
|
+
*/
|
|
140
|
+
export function validateRateLimitState(data) {
|
|
141
|
+
return RateLimitStateSchema.parse(data);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Creates default rate limit configuration
|
|
145
|
+
*/
|
|
146
|
+
export function createDefaultRateLimitConfig() {
|
|
147
|
+
return RateLimitConfigSchema.parse({});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Creates initial rate limit state
|
|
151
|
+
*/
|
|
152
|
+
export function createInitialRateLimitState(config) {
|
|
153
|
+
const now = new Date().toISOString();
|
|
154
|
+
return {
|
|
155
|
+
requestTokens: config.requestsPerMinute * config.burstMultiplier,
|
|
156
|
+
outputTokens: config.tokensPerMinute * config.burstMultiplier,
|
|
157
|
+
requestCount: 0,
|
|
158
|
+
tokenCount: 0,
|
|
159
|
+
windowStart: now,
|
|
160
|
+
queueSize: 0,
|
|
161
|
+
state: 'normal',
|
|
162
|
+
lastRefillTime: now,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/provider/v1/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC5C,QAAQ,EAAI,6BAA6B;IACzC,OAAO,EAAK,0BAA0B;IACtC,SAAS,EAAG,gCAAgC;CAC7C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC7C,QAAQ,EAAM,qBAAqB;IACnC,WAAW,EAAG,oCAAoC;IAClD,SAAS,EAAK,uBAAuB;CACtC,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,uCAAuC;IACvC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAEjE,qCAAqC;IACrC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAEzE,8CAA8C;IAC9C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAEtD,+CAA+C;IAC/C,QAAQ,EAAE,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC;IAEpD,yDAAyD;IACzD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAE5D,+BAA+B;IAC/B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAEjE,iDAAiD;IACjD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,kCAAkC;IAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAElE,uCAAuC;IACvC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAE3C,yCAAyC;IACzC,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC9C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,uCAAuC;IACvC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhC,sCAAsC;IACtC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/B,iCAAiC;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAErC,oCAAoC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEnC,yCAAyC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAElC,yBAAyB;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAElC,kDAAkD;IAClD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAEjD,oBAAoB;IACpB,KAAK,EAAE,wBAAwB;IAE/B,4BAA4B;IAC5B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,iCAAiC;IACjC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IAEpB,6CAA6C;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/B,iCAAiC;IACjC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAE9B,+BAA+B;IAC/B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAEjD,6BAA6B;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE5B,mCAAmC;IACnC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAErD,iCAAiC;IACjC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAEnD,mCAAmC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC7C,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,oBAAoB;IACpB,wBAAwB;CACzB,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC1B,IAAI,EAAE,wBAAwB;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY,EAAE,qBAAqB;IACnC,UAAU,EAAE,uBAAuB;IACnC,WAAW,EAAE,2BAA2B;IACxC,aAAa,EAAE,6BAA6B;IAC5C,cAAc,EAAE,2BAA2B;CACnC,CAAC;AAKX;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAa;IACnD,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAa;IAClD,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAuB;IACjE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,eAAe;QAChE,YAAY,EAAE,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;QAC7D,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,QAAQ;QACf,cAAc,EAAE,GAAG;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Contract
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascade failures by stopping calls to unhealthy providers.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
export declare const CircuitBreakerStateSchema: z.ZodEnum<["closed", "open", "half-open"]>;
|
|
8
|
+
export type CircuitBreakerState = z.infer<typeof CircuitBreakerStateSchema>;
|
|
9
|
+
export declare const CircuitBreakerConfigSchema: z.ZodObject<{
|
|
10
|
+
/** Number of failures before opening circuit */
|
|
11
|
+
failureThreshold: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
/** Time in ms before attempting recovery (half-open) */
|
|
13
|
+
resetTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
14
|
+
/** Number of test requests allowed in half-open state */
|
|
15
|
+
halfOpenMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
16
|
+
/** Time window for counting failures in ms */
|
|
17
|
+
failureWindowMs: z.ZodDefault<z.ZodNumber>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
failureThreshold: number;
|
|
20
|
+
resetTimeoutMs: number;
|
|
21
|
+
halfOpenMaxAttempts: number;
|
|
22
|
+
failureWindowMs: number;
|
|
23
|
+
}, {
|
|
24
|
+
failureThreshold?: number | undefined;
|
|
25
|
+
resetTimeoutMs?: number | undefined;
|
|
26
|
+
halfOpenMaxAttempts?: number | undefined;
|
|
27
|
+
failureWindowMs?: number | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
export type CircuitBreakerConfig = z.infer<typeof CircuitBreakerConfigSchema>;
|
|
30
|
+
export declare const CircuitBreakerStatsSchema: z.ZodObject<{
|
|
31
|
+
/** Current state */
|
|
32
|
+
state: z.ZodEnum<["closed", "open", "half-open"]>;
|
|
33
|
+
/** Total successful calls */
|
|
34
|
+
successCount: z.ZodNumber;
|
|
35
|
+
/** Total failed calls */
|
|
36
|
+
failureCount: z.ZodNumber;
|
|
37
|
+
/** Failures in current window */
|
|
38
|
+
recentFailures: z.ZodNumber;
|
|
39
|
+
/** Last failure timestamp */
|
|
40
|
+
lastFailureAt: z.ZodOptional<z.ZodString>;
|
|
41
|
+
/** Last success timestamp */
|
|
42
|
+
lastSuccessAt: z.ZodOptional<z.ZodString>;
|
|
43
|
+
/** When circuit opened (if open) */
|
|
44
|
+
openedAt: z.ZodOptional<z.ZodString>;
|
|
45
|
+
/** Consecutive successes in half-open */
|
|
46
|
+
halfOpenSuccesses: z.ZodNumber;
|
|
47
|
+
}, "strip", z.ZodTypeAny, {
|
|
48
|
+
successCount: number;
|
|
49
|
+
failureCount: number;
|
|
50
|
+
state: "open" | "closed" | "half-open";
|
|
51
|
+
recentFailures: number;
|
|
52
|
+
halfOpenSuccesses: number;
|
|
53
|
+
lastFailureAt?: string | undefined;
|
|
54
|
+
lastSuccessAt?: string | undefined;
|
|
55
|
+
openedAt?: string | undefined;
|
|
56
|
+
}, {
|
|
57
|
+
successCount: number;
|
|
58
|
+
failureCount: number;
|
|
59
|
+
state: "open" | "closed" | "half-open";
|
|
60
|
+
recentFailures: number;
|
|
61
|
+
halfOpenSuccesses: number;
|
|
62
|
+
lastFailureAt?: string | undefined;
|
|
63
|
+
lastSuccessAt?: string | undefined;
|
|
64
|
+
openedAt?: string | undefined;
|
|
65
|
+
}>;
|
|
66
|
+
export type CircuitBreakerStats = z.infer<typeof CircuitBreakerStatsSchema>;
|
|
67
|
+
export declare const CircuitBreakerEventSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
|
|
68
|
+
type: z.ZodLiteral<"state-change">;
|
|
69
|
+
from: z.ZodEnum<["closed", "open", "half-open"]>;
|
|
70
|
+
to: z.ZodEnum<["closed", "open", "half-open"]>;
|
|
71
|
+
timestamp: z.ZodString;
|
|
72
|
+
}, "strip", z.ZodTypeAny, {
|
|
73
|
+
type: "state-change";
|
|
74
|
+
timestamp: string;
|
|
75
|
+
from: "open" | "closed" | "half-open";
|
|
76
|
+
to: "open" | "closed" | "half-open";
|
|
77
|
+
}, {
|
|
78
|
+
type: "state-change";
|
|
79
|
+
timestamp: string;
|
|
80
|
+
from: "open" | "closed" | "half-open";
|
|
81
|
+
to: "open" | "closed" | "half-open";
|
|
82
|
+
}>, z.ZodObject<{
|
|
83
|
+
type: z.ZodLiteral<"call-success">;
|
|
84
|
+
durationMs: z.ZodNumber;
|
|
85
|
+
timestamp: z.ZodString;
|
|
86
|
+
}, "strip", z.ZodTypeAny, {
|
|
87
|
+
type: "call-success";
|
|
88
|
+
timestamp: string;
|
|
89
|
+
durationMs: number;
|
|
90
|
+
}, {
|
|
91
|
+
type: "call-success";
|
|
92
|
+
timestamp: string;
|
|
93
|
+
durationMs: number;
|
|
94
|
+
}>, z.ZodObject<{
|
|
95
|
+
type: z.ZodLiteral<"call-failure">;
|
|
96
|
+
error: z.ZodString;
|
|
97
|
+
timestamp: z.ZodString;
|
|
98
|
+
}, "strip", z.ZodTypeAny, {
|
|
99
|
+
type: "call-failure";
|
|
100
|
+
timestamp: string;
|
|
101
|
+
error: string;
|
|
102
|
+
}, {
|
|
103
|
+
type: "call-failure";
|
|
104
|
+
timestamp: string;
|
|
105
|
+
error: string;
|
|
106
|
+
}>, z.ZodObject<{
|
|
107
|
+
type: z.ZodLiteral<"call-rejected">;
|
|
108
|
+
reason: z.ZodString;
|
|
109
|
+
timestamp: z.ZodString;
|
|
110
|
+
}, "strip", z.ZodTypeAny, {
|
|
111
|
+
type: "call-rejected";
|
|
112
|
+
timestamp: string;
|
|
113
|
+
reason: string;
|
|
114
|
+
}, {
|
|
115
|
+
type: "call-rejected";
|
|
116
|
+
timestamp: string;
|
|
117
|
+
reason: string;
|
|
118
|
+
}>]>;
|
|
119
|
+
export type CircuitBreakerEvent = z.infer<typeof CircuitBreakerEventSchema>;
|
|
120
|
+
export declare const CircuitBreakerErrorCodes: {
|
|
121
|
+
readonly CIRCUIT_OPEN: "CIRCUIT_BREAKER_OPEN";
|
|
122
|
+
readonly EXECUTION_FAILED: "CIRCUIT_BREAKER_EXECUTION_FAILED";
|
|
123
|
+
};
|
|
124
|
+
export type CircuitBreakerErrorCode = (typeof CircuitBreakerErrorCodes)[keyof typeof CircuitBreakerErrorCodes];
|
|
125
|
+
export declare function validateCircuitBreakerConfig(data: unknown): CircuitBreakerConfig;
|
|
126
|
+
export declare function safeValidateCircuitBreakerConfig(data: unknown): {
|
|
127
|
+
success: true;
|
|
128
|
+
data: CircuitBreakerConfig;
|
|
129
|
+
} | {
|
|
130
|
+
success: false;
|
|
131
|
+
error: z.ZodError;
|
|
132
|
+
};
|
|
133
|
+
export declare function createDefaultCircuitBreakerConfig(): CircuitBreakerConfig;
|
|
134
|
+
export declare function createCircuitBreakerStats(): CircuitBreakerStats;
|
|
135
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/resilience/v1/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB,4CAA0C,CAAC;AACjF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAM5E,eAAO,MAAM,0BAA0B;IACrC,gDAAgD;;IAGhD,wDAAwD;;IAGxD,yDAAyD;;IAGzD,8CAA8C;;;;;;;;;;;;EAE9C,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAM9E,eAAO,MAAM,yBAAyB;IACpC,oBAAoB;;IAGpB,6BAA6B;;IAG7B,yBAAyB;;IAGzB,iCAAiC;;IAGjC,6BAA6B;;IAG7B,6BAA6B;;IAG7B,oCAAoC;;IAGpC,yCAAyC;;;;;;;;;;;;;;;;;;;;EAEzC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAM5E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsBpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAM5E,eAAO,MAAM,wBAAwB;;;CAG3B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,OAAO,wBAAwB,CAAC,CAAC;AAM3E,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,CAEhF;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,OAAO,GACZ;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAA;CAAE,CAIvF;AAMD,wBAAgB,iCAAiC,IAAI,oBAAoB,CAExE;AAED,wBAAgB,yBAAyB,IAAI,mBAAmB,CAQ/D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Contract
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascade failures by stopping calls to unhealthy providers.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Circuit Breaker State
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export const CircuitBreakerStateSchema = z.enum(['closed', 'open', 'half-open']);
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Configuration
|
|
13
|
+
// ============================================================================
|
|
14
|
+
export const CircuitBreakerConfigSchema = z.object({
|
|
15
|
+
/** Number of failures before opening circuit */
|
|
16
|
+
failureThreshold: z.number().int().min(1).max(100).default(5),
|
|
17
|
+
/** Time in ms before attempting recovery (half-open) */
|
|
18
|
+
resetTimeoutMs: z.number().int().min(1000).max(300000).default(30000),
|
|
19
|
+
/** Number of test requests allowed in half-open state */
|
|
20
|
+
halfOpenMaxAttempts: z.number().int().min(1).max(10).default(1),
|
|
21
|
+
/** Time window for counting failures in ms */
|
|
22
|
+
failureWindowMs: z.number().int().min(1000).max(300000).default(60000),
|
|
23
|
+
});
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Stats
|
|
26
|
+
// ============================================================================
|
|
27
|
+
export const CircuitBreakerStatsSchema = z.object({
|
|
28
|
+
/** Current state */
|
|
29
|
+
state: CircuitBreakerStateSchema,
|
|
30
|
+
/** Total successful calls */
|
|
31
|
+
successCount: z.number().int().min(0),
|
|
32
|
+
/** Total failed calls */
|
|
33
|
+
failureCount: z.number().int().min(0),
|
|
34
|
+
/** Failures in current window */
|
|
35
|
+
recentFailures: z.number().int().min(0),
|
|
36
|
+
/** Last failure timestamp */
|
|
37
|
+
lastFailureAt: z.string().datetime().optional(),
|
|
38
|
+
/** Last success timestamp */
|
|
39
|
+
lastSuccessAt: z.string().datetime().optional(),
|
|
40
|
+
/** When circuit opened (if open) */
|
|
41
|
+
openedAt: z.string().datetime().optional(),
|
|
42
|
+
/** Consecutive successes in half-open */
|
|
43
|
+
halfOpenSuccesses: z.number().int().min(0),
|
|
44
|
+
});
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Events
|
|
47
|
+
// ============================================================================
|
|
48
|
+
export const CircuitBreakerEventSchema = z.discriminatedUnion('type', [
|
|
49
|
+
z.object({
|
|
50
|
+
type: z.literal('state-change'),
|
|
51
|
+
from: CircuitBreakerStateSchema,
|
|
52
|
+
to: CircuitBreakerStateSchema,
|
|
53
|
+
timestamp: z.string().datetime(),
|
|
54
|
+
}),
|
|
55
|
+
z.object({
|
|
56
|
+
type: z.literal('call-success'),
|
|
57
|
+
durationMs: z.number().int().min(0),
|
|
58
|
+
timestamp: z.string().datetime(),
|
|
59
|
+
}),
|
|
60
|
+
z.object({
|
|
61
|
+
type: z.literal('call-failure'),
|
|
62
|
+
error: z.string(),
|
|
63
|
+
timestamp: z.string().datetime(),
|
|
64
|
+
}),
|
|
65
|
+
z.object({
|
|
66
|
+
type: z.literal('call-rejected'),
|
|
67
|
+
reason: z.string(),
|
|
68
|
+
timestamp: z.string().datetime(),
|
|
69
|
+
}),
|
|
70
|
+
]);
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// Error Codes
|
|
73
|
+
// ============================================================================
|
|
74
|
+
export const CircuitBreakerErrorCodes = {
|
|
75
|
+
CIRCUIT_OPEN: 'CIRCUIT_BREAKER_OPEN',
|
|
76
|
+
EXECUTION_FAILED: 'CIRCUIT_BREAKER_EXECUTION_FAILED',
|
|
77
|
+
};
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// Validation Functions
|
|
80
|
+
// ============================================================================
|
|
81
|
+
export function validateCircuitBreakerConfig(data) {
|
|
82
|
+
return CircuitBreakerConfigSchema.parse(data);
|
|
83
|
+
}
|
|
84
|
+
export function safeValidateCircuitBreakerConfig(data) {
|
|
85
|
+
const result = CircuitBreakerConfigSchema.safeParse(data);
|
|
86
|
+
if (result.success)
|
|
87
|
+
return { success: true, data: result.data };
|
|
88
|
+
return { success: false, error: result.error };
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Factory Functions
|
|
92
|
+
// ============================================================================
|
|
93
|
+
export function createDefaultCircuitBreakerConfig() {
|
|
94
|
+
return CircuitBreakerConfigSchema.parse({});
|
|
95
|
+
}
|
|
96
|
+
export function createCircuitBreakerStats() {
|
|
97
|
+
return {
|
|
98
|
+
state: 'closed',
|
|
99
|
+
successCount: 0,
|
|
100
|
+
failureCount: 0,
|
|
101
|
+
recentFailures: 0,
|
|
102
|
+
halfOpenSuccesses: 0,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/resilience/v1/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilience Contracts v1
|
|
3
|
+
*
|
|
4
|
+
* Production-grade resilience patterns: circuit breaker, rate limiter,
|
|
5
|
+
* loop guard, resource limits, and metrics.
|
|
6
|
+
*/
|
|
7
|
+
export { CircuitBreakerStateSchema, CircuitBreakerConfigSchema, CircuitBreakerStatsSchema, CircuitBreakerEventSchema, CircuitBreakerErrorCodes, validateCircuitBreakerConfig, safeValidateCircuitBreakerConfig, createDefaultCircuitBreakerConfig, createCircuitBreakerStats, } from './circuit-breaker.js';
|
|
8
|
+
export type { CircuitBreakerState, CircuitBreakerConfig, CircuitBreakerStats, CircuitBreakerEvent, CircuitBreakerErrorCode, } from './circuit-breaker.js';
|
|
9
|
+
export { RateLimiterConfigSchema, RateLimiterStatsSchema, RateLimiterAcquireResultSchema, RateLimiterErrorCodes, validateRateLimiterConfig, safeValidateRateLimiterConfig, createDefaultRateLimiterConfig, createRateLimiterStats, DEFAULT_TOKEN_WINDOW_MS, DEFAULT_CHECK_INTERVAL_MS, TIME_MULTIPLIERS, DEFAULT_TIME_RANGE_MS, } from './rate-limiter.js';
|
|
10
|
+
export type { RateLimiterConfig, RateLimiterStats, RateLimiterAcquireResult, RateLimiterErrorCode, } from './rate-limiter.js';
|
|
11
|
+
export { LoopGuardConfigSchema, LoopGuardContextSchema, LoopGuardResultSchema, LoopGuardErrorCodes, validateLoopGuardConfig, safeValidateLoopGuardConfig, createDefaultLoopGuardConfig, createLoopGuardContext, } from './loop-guard.js';
|
|
12
|
+
export type { LoopGuardConfig, LoopGuardContext, LoopGuardResult, LoopGuardErrorCode, } from './loop-guard.js';
|
|
13
|
+
export { ResourceLimitsConfigSchema, ResourceUsageSchema, ResourceCheckResultSchema, ResourceRequestInfoSchema, ResourceLimitsErrorCodes, validateResourceLimitsConfig, safeValidateResourceLimitsConfig, createDefaultResourceLimitsConfig, createResourceUsage, estimateCost, } from './resource-limits.js';
|
|
14
|
+
export type { ResourceLimitsConfig, ResourceUsage, ResourceCheckResult, ResourceRequestInfo, ResourceLimitsErrorCode, } from './resource-limits.js';
|
|
15
|
+
export { MetricsTimeRangeSchema, RequestMetricSchema, ErrorMetricSchema, LatencyStatsSchema, MetricsSnapshotSchema, validateRequestMetric, validateErrorMetric, validateMetricsSnapshot, createEmptyMetricsSnapshot, createRequestMetric, createErrorMetric, } from './metrics.js';
|
|
16
|
+
export type { MetricsTimeRange, RequestMetric, ErrorMetric, LatencyStats, MetricsSnapshot, } from './metrics.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/resilience/v1/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,EAChC,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,EAC7B,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,EAChC,iCAAiC,EACjC,mBAAmB,EACnB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilience Contracts v1
|
|
3
|
+
*
|
|
4
|
+
* Production-grade resilience patterns: circuit breaker, rate limiter,
|
|
5
|
+
* loop guard, resource limits, and metrics.
|
|
6
|
+
*/
|
|
7
|
+
// Circuit Breaker
|
|
8
|
+
export { CircuitBreakerStateSchema, CircuitBreakerConfigSchema, CircuitBreakerStatsSchema, CircuitBreakerEventSchema, CircuitBreakerErrorCodes, validateCircuitBreakerConfig, safeValidateCircuitBreakerConfig, createDefaultCircuitBreakerConfig, createCircuitBreakerStats, } from './circuit-breaker.js';
|
|
9
|
+
// Rate Limiter
|
|
10
|
+
export { RateLimiterConfigSchema, RateLimiterStatsSchema, RateLimiterAcquireResultSchema, RateLimiterErrorCodes, validateRateLimiterConfig, safeValidateRateLimiterConfig, createDefaultRateLimiterConfig, createRateLimiterStats, DEFAULT_TOKEN_WINDOW_MS, DEFAULT_CHECK_INTERVAL_MS, TIME_MULTIPLIERS, DEFAULT_TIME_RANGE_MS, } from './rate-limiter.js';
|
|
11
|
+
// Loop Guard
|
|
12
|
+
export { LoopGuardConfigSchema, LoopGuardContextSchema, LoopGuardResultSchema, LoopGuardErrorCodes, validateLoopGuardConfig, safeValidateLoopGuardConfig, createDefaultLoopGuardConfig, createLoopGuardContext, } from './loop-guard.js';
|
|
13
|
+
// Resource Limits
|
|
14
|
+
export { ResourceLimitsConfigSchema, ResourceUsageSchema, ResourceCheckResultSchema, ResourceRequestInfoSchema, ResourceLimitsErrorCodes, validateResourceLimitsConfig, safeValidateResourceLimitsConfig, createDefaultResourceLimitsConfig, createResourceUsage, estimateCost, } from './resource-limits.js';
|
|
15
|
+
// Metrics
|
|
16
|
+
export { MetricsTimeRangeSchema, RequestMetricSchema, ErrorMetricSchema, LatencyStatsSchema, MetricsSnapshotSchema, validateRequestMetric, validateErrorMetric, validateMetricsSnapshot, createEmptyMetricsSnapshot, createRequestMetric, createErrorMetric, } from './metrics.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resilience/v1/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kBAAkB;AAClB,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,EAChC,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAU9B,eAAe;AACf,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,qBAAqB,EACrB,yBAAyB,EACzB,6BAA6B,EAC7B,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAS3B,aAAa;AACb,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AASzB,kBAAkB;AAClB,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,EAChC,iCAAiC,EACjC,mBAAmB,EACnB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAU9B,UAAU;AACV,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop Guard Contract
|
|
3
|
+
*
|
|
4
|
+
* Prevents infinite loops and runaway execution that burns resources.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
export declare const LoopGuardConfigSchema: z.ZodObject<{
|
|
8
|
+
/** Maximum iterations before hard stop */
|
|
9
|
+
maxIterations: z.ZodDefault<z.ZodNumber>;
|
|
10
|
+
/** Iteration count that triggers warning */
|
|
11
|
+
warnAtIterations: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
/** Maximum execution duration in ms */
|
|
13
|
+
maxDurationMs: z.ZodDefault<z.ZodNumber>;
|
|
14
|
+
/** Duration that triggers warning in ms */
|
|
15
|
+
warnAtDurationMs: z.ZodDefault<z.ZodNumber>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
maxIterations: number;
|
|
18
|
+
warnAtIterations: number;
|
|
19
|
+
maxDurationMs: number;
|
|
20
|
+
warnAtDurationMs: number;
|
|
21
|
+
}, {
|
|
22
|
+
maxIterations?: number | undefined;
|
|
23
|
+
warnAtIterations?: number | undefined;
|
|
24
|
+
maxDurationMs?: number | undefined;
|
|
25
|
+
warnAtDurationMs?: number | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
export type LoopGuardConfig = z.infer<typeof LoopGuardConfigSchema>;
|
|
28
|
+
export declare const LoopGuardContextSchema: z.ZodObject<{
|
|
29
|
+
/** Unique context identifier */
|
|
30
|
+
contextId: z.ZodString;
|
|
31
|
+
/** Current iteration count */
|
|
32
|
+
iterations: z.ZodNumber;
|
|
33
|
+
/** Start time */
|
|
34
|
+
startedAt: z.ZodString;
|
|
35
|
+
/** Elapsed time in ms */
|
|
36
|
+
elapsedMs: z.ZodNumber;
|
|
37
|
+
/** Whether warning was already issued */
|
|
38
|
+
warningIssued: z.ZodBoolean;
|
|
39
|
+
/** Context metadata */
|
|
40
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
startedAt: string;
|
|
43
|
+
iterations: number;
|
|
44
|
+
contextId: string;
|
|
45
|
+
elapsedMs: number;
|
|
46
|
+
warningIssued: boolean;
|
|
47
|
+
metadata?: Record<string, unknown> | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
startedAt: string;
|
|
50
|
+
iterations: number;
|
|
51
|
+
contextId: string;
|
|
52
|
+
elapsedMs: number;
|
|
53
|
+
warningIssued: boolean;
|
|
54
|
+
metadata?: Record<string, unknown> | undefined;
|
|
55
|
+
}>;
|
|
56
|
+
export type LoopGuardContext = z.infer<typeof LoopGuardContextSchema>;
|
|
57
|
+
export declare const LoopGuardResultSchema: z.ZodDiscriminatedUnion<"status", [z.ZodObject<{
|
|
58
|
+
status: z.ZodLiteral<"ok">;
|
|
59
|
+
iteration: z.ZodNumber;
|
|
60
|
+
elapsedMs: z.ZodNumber;
|
|
61
|
+
}, "strip", z.ZodTypeAny, {
|
|
62
|
+
status: "ok";
|
|
63
|
+
iteration: number;
|
|
64
|
+
elapsedMs: number;
|
|
65
|
+
}, {
|
|
66
|
+
status: "ok";
|
|
67
|
+
iteration: number;
|
|
68
|
+
elapsedMs: number;
|
|
69
|
+
}>, z.ZodObject<{
|
|
70
|
+
status: z.ZodLiteral<"warning">;
|
|
71
|
+
iteration: z.ZodNumber;
|
|
72
|
+
elapsedMs: z.ZodNumber;
|
|
73
|
+
message: z.ZodString;
|
|
74
|
+
warningType: z.ZodEnum<["iteration", "duration"]>;
|
|
75
|
+
}, "strip", z.ZodTypeAny, {
|
|
76
|
+
message: string;
|
|
77
|
+
status: "warning";
|
|
78
|
+
iteration: number;
|
|
79
|
+
elapsedMs: number;
|
|
80
|
+
warningType: "duration" | "iteration";
|
|
81
|
+
}, {
|
|
82
|
+
message: string;
|
|
83
|
+
status: "warning";
|
|
84
|
+
iteration: number;
|
|
85
|
+
elapsedMs: number;
|
|
86
|
+
warningType: "duration" | "iteration";
|
|
87
|
+
}>, z.ZodObject<{
|
|
88
|
+
status: z.ZodLiteral<"blocked">;
|
|
89
|
+
iteration: z.ZodNumber;
|
|
90
|
+
elapsedMs: z.ZodNumber;
|
|
91
|
+
reason: z.ZodString;
|
|
92
|
+
blockType: z.ZodEnum<["max-iterations", "max-duration"]>;
|
|
93
|
+
}, "strip", z.ZodTypeAny, {
|
|
94
|
+
status: "blocked";
|
|
95
|
+
reason: string;
|
|
96
|
+
iteration: number;
|
|
97
|
+
elapsedMs: number;
|
|
98
|
+
blockType: "max-iterations" | "max-duration";
|
|
99
|
+
}, {
|
|
100
|
+
status: "blocked";
|
|
101
|
+
reason: string;
|
|
102
|
+
iteration: number;
|
|
103
|
+
elapsedMs: number;
|
|
104
|
+
blockType: "max-iterations" | "max-duration";
|
|
105
|
+
}>]>;
|
|
106
|
+
export type LoopGuardResult = z.infer<typeof LoopGuardResultSchema>;
|
|
107
|
+
export declare const LoopGuardErrorCodes: {
|
|
108
|
+
readonly MAX_ITERATIONS: "LOOP_GUARD_MAX_ITERATIONS";
|
|
109
|
+
readonly MAX_DURATION: "LOOP_GUARD_MAX_DURATION";
|
|
110
|
+
readonly CONTEXT_NOT_FOUND: "LOOP_GUARD_CONTEXT_NOT_FOUND";
|
|
111
|
+
};
|
|
112
|
+
export type LoopGuardErrorCode = (typeof LoopGuardErrorCodes)[keyof typeof LoopGuardErrorCodes];
|
|
113
|
+
export declare function validateLoopGuardConfig(data: unknown): LoopGuardConfig;
|
|
114
|
+
export declare function safeValidateLoopGuardConfig(data: unknown): {
|
|
115
|
+
success: true;
|
|
116
|
+
data: LoopGuardConfig;
|
|
117
|
+
} | {
|
|
118
|
+
success: false;
|
|
119
|
+
error: z.ZodError;
|
|
120
|
+
};
|
|
121
|
+
export declare function createDefaultLoopGuardConfig(): LoopGuardConfig;
|
|
122
|
+
export declare function createLoopGuardContext(contextId: string): LoopGuardContext;
|
|
123
|
+
//# sourceMappingURL=loop-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../../src/resilience/v1/loop-guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,qBAAqB;IAChC,0CAA0C;;IAG1C,4CAA4C;;IAG5C,uCAAuC;;IAGvC,2CAA2C;;;;;;;;;;;;EAE3C,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAMpE,eAAO,MAAM,sBAAsB;IACjC,gCAAgC;;IAGhC,8BAA8B;;IAG9B,iBAAiB;;IAGjB,yBAAyB;;IAGzB,yCAAyC;;IAGzC,uBAAuB;;;;;;;;;;;;;;;;EAEvB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAMtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoBhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAMpE,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAMjE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,CAEtE;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,OAAO,GACZ;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAA;CAAE,CAIlF;AAMD,wBAAgB,4BAA4B,IAAI,eAAe,CAE9D;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAQ1E"}
|