sandstream-kit 1.0.0
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 +21 -0
- package/README.md +617 -0
- package/dist/adapters/api-key-adapter.d.ts +35 -0
- package/dist/adapters/api-key-adapter.js +46 -0
- package/dist/adapters/api-key-adapter.js.map +1 -0
- package/dist/adapters/clerk-auth.d.ts +6 -0
- package/dist/adapters/clerk-auth.js +20 -0
- package/dist/adapters/clerk-auth.js.map +1 -0
- package/dist/adapters/cloudflare-r2.d.ts +6 -0
- package/dist/adapters/cloudflare-r2.js +136 -0
- package/dist/adapters/cloudflare-r2.js.map +1 -0
- package/dist/adapters/expo-eas.d.ts +6 -0
- package/dist/adapters/expo-eas.js +129 -0
- package/dist/adapters/expo-eas.js.map +1 -0
- package/dist/adapters/flagsmith-flags.d.ts +5 -0
- package/dist/adapters/flagsmith-flags.js +20 -0
- package/dist/adapters/flagsmith-flags.js.map +1 -0
- package/dist/adapters/flyio-hosting.d.ts +2 -0
- package/dist/adapters/flyio-hosting.js +143 -0
- package/dist/adapters/flyio-hosting.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.js +48 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/inngest-background.d.ts +5 -0
- package/dist/adapters/inngest-background.js +19 -0
- package/dist/adapters/inngest-background.js.map +1 -0
- package/dist/adapters/liveblocks-realtime.d.ts +11 -0
- package/dist/adapters/liveblocks-realtime.js +62 -0
- package/dist/adapters/liveblocks-realtime.js.map +1 -0
- package/dist/adapters/loops-email.d.ts +6 -0
- package/dist/adapters/loops-email.js +18 -0
- package/dist/adapters/loops-email.js.map +1 -0
- package/dist/adapters/neon-db.d.ts +10 -0
- package/dist/adapters/neon-db.js +94 -0
- package/dist/adapters/neon-db.js.map +1 -0
- package/dist/adapters/planetscale-db.d.ts +11 -0
- package/dist/adapters/planetscale-db.js +134 -0
- package/dist/adapters/planetscale-db.js.map +1 -0
- package/dist/adapters/posthog-analytics.d.ts +6 -0
- package/dist/adapters/posthog-analytics.js +22 -0
- package/dist/adapters/posthog-analytics.js.map +1 -0
- package/dist/adapters/railway-hosting.d.ts +2 -0
- package/dist/adapters/railway-hosting.js +136 -0
- package/dist/adapters/railway-hosting.js.map +1 -0
- package/dist/adapters/resend-email.d.ts +35 -0
- package/dist/adapters/resend-email.js +109 -0
- package/dist/adapters/resend-email.js.map +1 -0
- package/dist/adapters/searxng-instance.d.ts +6 -0
- package/dist/adapters/searxng-instance.js +240 -0
- package/dist/adapters/searxng-instance.js.map +1 -0
- package/dist/adapters/sentry-monitoring.d.ts +7 -0
- package/dist/adapters/sentry-monitoring.js +27 -0
- package/dist/adapters/sentry-monitoring.js.map +1 -0
- package/dist/adapters/stripe-payments.d.ts +6 -0
- package/dist/adapters/stripe-payments.js +134 -0
- package/dist/adapters/stripe-payments.js.map +1 -0
- package/dist/adapters/supabase-db.d.ts +6 -0
- package/dist/adapters/supabase-db.js +130 -0
- package/dist/adapters/supabase-db.js.map +1 -0
- package/dist/adapters/tinybird-analytics.d.ts +5 -0
- package/dist/adapters/tinybird-analytics.js +20 -0
- package/dist/adapters/tinybird-analytics.js.map +1 -0
- package/dist/adapters/trigger-background.d.ts +6 -0
- package/dist/adapters/trigger-background.js +20 -0
- package/dist/adapters/trigger-background.js.map +1 -0
- package/dist/adapters/types.d.ts +7 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/upstash-redis.d.ts +6 -0
- package/dist/adapters/upstash-redis.js +88 -0
- package/dist/adapters/upstash-redis.js.map +1 -0
- package/dist/adapters/vercel-hosting.d.ts +6 -0
- package/dist/adapters/vercel-hosting.js +112 -0
- package/dist/adapters/vercel-hosting.js.map +1 -0
- package/dist/agent-adapter-model.d.ts +108 -0
- package/dist/agent-adapter-model.js +6 -0
- package/dist/agent-adapter-model.js.map +1 -0
- package/dist/agent-adapter-service.d.ts +67 -0
- package/dist/agent-adapter-service.js +299 -0
- package/dist/agent-adapter-service.js.map +1 -0
- package/dist/agent-config.d.ts +56 -0
- package/dist/agent-config.js +129 -0
- package/dist/agent-config.js.map +1 -0
- package/dist/agent-governance-model.d.ts +128 -0
- package/dist/agent-governance-model.js +6 -0
- package/dist/agent-governance-model.js.map +1 -0
- package/dist/agent-governance-service.d.ts +101 -0
- package/dist/agent-governance-service.js +319 -0
- package/dist/agent-governance-service.js.map +1 -0
- package/dist/alert-rules-engine.d.ts +102 -0
- package/dist/alert-rules-engine.js +210 -0
- package/dist/alert-rules-engine.js.map +1 -0
- package/dist/analytics-service.d.ts +126 -0
- package/dist/analytics-service.js +318 -0
- package/dist/analytics-service.js.map +1 -0
- package/dist/analyze.d.ts +19 -0
- package/dist/analyze.js +311 -0
- package/dist/analyze.js.map +1 -0
- package/dist/apm-instrumentor.d.ts +119 -0
- package/dist/apm-instrumentor.js +225 -0
- package/dist/apm-instrumentor.js.map +1 -0
- package/dist/approval-model.d.ts +82 -0
- package/dist/approval-model.js +6 -0
- package/dist/approval-model.js.map +1 -0
- package/dist/approval-service.d.ts +39 -0
- package/dist/approval-service.js +236 -0
- package/dist/approval-service.js.map +1 -0
- package/dist/approval.d.ts +22 -0
- package/dist/approval.js +148 -0
- package/dist/approval.js.map +1 -0
- package/dist/audit-logging-model.d.ts +157 -0
- package/dist/audit-logging-model.js +6 -0
- package/dist/audit-logging-model.js.map +1 -0
- package/dist/audit-logging-service.d.ts +89 -0
- package/dist/audit-logging-service.js +367 -0
- package/dist/audit-logging-service.js.map +1 -0
- package/dist/audit-secrets.d.ts +42 -0
- package/dist/audit-secrets.js +126 -0
- package/dist/audit-secrets.js.map +1 -0
- package/dist/audit.d.ts +43 -0
- package/dist/audit.js +286 -0
- package/dist/audit.js.map +1 -0
- package/dist/author-dashboard.d.ts +84 -0
- package/dist/author-dashboard.js +204 -0
- package/dist/author-dashboard.js.map +1 -0
- package/dist/author-notifications.d.ts +130 -0
- package/dist/author-notifications.js +261 -0
- package/dist/author-notifications.js.map +1 -0
- package/dist/author-verification.d.ts +79 -0
- package/dist/author-verification.js +257 -0
- package/dist/author-verification.js.map +1 -0
- package/dist/autonomous-setup-model.d.ts +117 -0
- package/dist/autonomous-setup-model.js +6 -0
- package/dist/autonomous-setup-model.js.map +1 -0
- package/dist/autonomous-setup-service.d.ts +74 -0
- package/dist/autonomous-setup-service.js +325 -0
- package/dist/autonomous-setup-service.js.map +1 -0
- package/dist/badge-system.d.ts +70 -0
- package/dist/badge-system.js +210 -0
- package/dist/badge-system.js.map +1 -0
- package/dist/baseline.d.ts +34 -0
- package/dist/baseline.js +78 -0
- package/dist/baseline.js.map +1 -0
- package/dist/beta-program-service.d.ts +112 -0
- package/dist/beta-program-service.js +240 -0
- package/dist/beta-program-service.js.map +1 -0
- package/dist/budget.d.ts +34 -0
- package/dist/budget.js +159 -0
- package/dist/budget.js.map +1 -0
- package/dist/bumblebee.d.ts +143 -0
- package/dist/bumblebee.js +384 -0
- package/dist/bumblebee.js.map +1 -0
- package/dist/cache-manager.d.ts +97 -0
- package/dist/cache-manager.js +244 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/cdn-adapter.d.ts +64 -0
- package/dist/cdn-adapter.js +263 -0
- package/dist/cdn-adapter.js.map +1 -0
- package/dist/certification-workflow-model.d.ts +95 -0
- package/dist/certification-workflow-model.js +6 -0
- package/dist/certification-workflow-model.js.map +1 -0
- package/dist/certification-workflow-service.d.ts +72 -0
- package/dist/certification-workflow-service.js +305 -0
- package/dist/certification-workflow-service.js.map +1 -0
- package/dist/check-design.d.ts +38 -0
- package/dist/check-design.js +256 -0
- package/dist/check-design.js.map +1 -0
- package/dist/check-gitignore.d.ts +39 -0
- package/dist/check-gitignore.js +156 -0
- package/dist/check-gitignore.js.map +1 -0
- package/dist/check-hooks.d.ts +15 -0
- package/dist/check-hooks.js +72 -0
- package/dist/check-hooks.js.map +1 -0
- package/dist/check-lock.d.ts +16 -0
- package/dist/check-lock.js +94 -0
- package/dist/check-lock.js.map +1 -0
- package/dist/check-secrets.d.ts +11 -0
- package/dist/check-secrets.js +320 -0
- package/dist/check-secrets.js.map +1 -0
- package/dist/check-security.d.ts +13 -0
- package/dist/check-security.js +887 -0
- package/dist/check-security.js.map +1 -0
- package/dist/check-services.d.ts +10 -0
- package/dist/check-services.js +44 -0
- package/dist/check-services.js.map +1 -0
- package/dist/check-skills.d.ts +8 -0
- package/dist/check-skills.js +26 -0
- package/dist/check-skills.js.map +1 -0
- package/dist/check-tests.d.ts +43 -0
- package/dist/check-tests.js +175 -0
- package/dist/check-tests.js.map +1 -0
- package/dist/check-tools.d.ts +8 -0
- package/dist/check-tools.js +42 -0
- package/dist/check-tools.js.map +1 -0
- package/dist/check-web-search.d.ts +12 -0
- package/dist/check-web-search.js +168 -0
- package/dist/check-web-search.js.map +1 -0
- package/dist/ci-cd-publisher.d.ts +162 -0
- package/dist/ci-cd-publisher.js +319 -0
- package/dist/ci-cd-publisher.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +4074 -0
- package/dist/cli.js.map +1 -0
- package/dist/clone.d.ts +25 -0
- package/dist/clone.js +73 -0
- package/dist/clone.js.map +1 -0
- package/dist/completions.d.ts +8 -0
- package/dist/completions.js +250 -0
- package/dist/completions.js.map +1 -0
- package/dist/compression-manager.d.ts +107 -0
- package/dist/compression-manager.js +250 -0
- package/dist/compression-manager.js.map +1 -0
- package/dist/config.d.ts +233 -0
- package/dist/config.js +255 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +38 -0
- package/dist/context.js +86 -0
- package/dist/context.js.map +1 -0
- package/dist/cost-monitor.d.ts +72 -0
- package/dist/cost-monitor.js +218 -0
- package/dist/cost-monitor.js.map +1 -0
- package/dist/create-plugin.d.ts +22 -0
- package/dist/create-plugin.js +266 -0
- package/dist/create-plugin.js.map +1 -0
- package/dist/database.d.ts +123 -0
- package/dist/database.js +354 -0
- package/dist/database.js.map +1 -0
- package/dist/datadog-adapter.d.ts +60 -0
- package/dist/datadog-adapter.js +245 -0
- package/dist/datadog-adapter.js.map +1 -0
- package/dist/doctor.d.ts +15 -0
- package/dist/doctor.js +131 -0
- package/dist/doctor.js.map +1 -0
- package/dist/documentation-generator.d.ts +226 -0
- package/dist/documentation-generator.js +348 -0
- package/dist/documentation-generator.js.map +1 -0
- package/dist/elevation-scopes.d.ts +40 -0
- package/dist/elevation-scopes.js +110 -0
- package/dist/elevation-scopes.js.map +1 -0
- package/dist/elevation.d.ts +102 -0
- package/dist/elevation.js +449 -0
- package/dist/elevation.js.map +1 -0
- package/dist/env-diff.d.ts +27 -0
- package/dist/env-diff.js +104 -0
- package/dist/env-diff.js.map +1 -0
- package/dist/env-inspect.d.ts +28 -0
- package/dist/env-inspect.js +81 -0
- package/dist/env-inspect.js.map +1 -0
- package/dist/env-switch.d.ts +37 -0
- package/dist/env-switch.js +102 -0
- package/dist/env-switch.js.map +1 -0
- package/dist/environment.d.ts +27 -0
- package/dist/environment.js +148 -0
- package/dist/environment.js.map +1 -0
- package/dist/error-tracker.d.ts +92 -0
- package/dist/error-tracker.js +206 -0
- package/dist/error-tracker.js.map +1 -0
- package/dist/escalate.d.ts +11 -0
- package/dist/escalate.js +73 -0
- package/dist/escalate.js.map +1 -0
- package/dist/event-stream.d.ts +81 -0
- package/dist/event-stream.js +161 -0
- package/dist/event-stream.js.map +1 -0
- package/dist/fix.d.ts +42 -0
- package/dist/fix.js +419 -0
- package/dist/fix.js.map +1 -0
- package/dist/governance-middleware.d.ts +22 -0
- package/dist/governance-middleware.js +173 -0
- package/dist/governance-middleware.js.map +1 -0
- package/dist/governance.d.ts +44 -0
- package/dist/governance.js +236 -0
- package/dist/governance.js.map +1 -0
- package/dist/hooks.d.ts +25 -0
- package/dist/hooks.js +281 -0
- package/dist/hooks.js.map +1 -0
- package/dist/id-generator.d.ts +43 -0
- package/dist/id-generator.js +47 -0
- package/dist/id-generator.js.map +1 -0
- package/dist/image-optimizer.d.ts +92 -0
- package/dist/image-optimizer.js +202 -0
- package/dist/image-optimizer.js.map +1 -0
- package/dist/install.d.ts +15 -0
- package/dist/install.js +59 -0
- package/dist/install.js.map +1 -0
- package/dist/lock.d.ts +82 -0
- package/dist/lock.js +264 -0
- package/dist/lock.js.map +1 -0
- package/dist/login.d.ts +23 -0
- package/dist/login.js +132 -0
- package/dist/login.js.map +1 -0
- package/dist/mcp-kit-tools-model.d.ts +195 -0
- package/dist/mcp-kit-tools-model.js +6 -0
- package/dist/mcp-kit-tools-model.js.map +1 -0
- package/dist/mcp-kit-tools-service.d.ts +127 -0
- package/dist/mcp-kit-tools-service.js +943 -0
- package/dist/mcp-kit-tools-service.js.map +1 -0
- package/dist/mcp-orchestrator.d.ts +70 -0
- package/dist/mcp-orchestrator.js +175 -0
- package/dist/mcp-orchestrator.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.js +722 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +74 -0
- package/dist/middleware/rate-limiter.js +342 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/migration-runner.d.ts +66 -0
- package/dist/migration-runner.js +192 -0
- package/dist/migration-runner.js.map +1 -0
- package/dist/migrations.d.ts +25 -0
- package/dist/migrations.js +530 -0
- package/dist/migrations.js.map +1 -0
- package/dist/moderation-system.d.ts +153 -0
- package/dist/moderation-system.js +338 -0
- package/dist/moderation-system.js.map +1 -0
- package/dist/multi-agent-workflow-model.d.ts +125 -0
- package/dist/multi-agent-workflow-model.js +6 -0
- package/dist/multi-agent-workflow-model.js.map +1 -0
- package/dist/multi-agent-workflow-service.d.ts +102 -0
- package/dist/multi-agent-workflow-service.js +452 -0
- package/dist/multi-agent-workflow-service.js.map +1 -0
- package/dist/onepassword.d.ts +75 -0
- package/dist/onepassword.js +140 -0
- package/dist/onepassword.js.map +1 -0
- package/dist/open.d.ts +30 -0
- package/dist/open.js +166 -0
- package/dist/open.js.map +1 -0
- package/dist/output.d.ts +32 -0
- package/dist/output.js +295 -0
- package/dist/output.js.map +1 -0
- package/dist/partner-service.d.ts +101 -0
- package/dist/partner-service.js +191 -0
- package/dist/partner-service.js.map +1 -0
- package/dist/payout-service.d.ts +136 -0
- package/dist/payout-service.js +293 -0
- package/dist/payout-service.js.map +1 -0
- package/dist/pkg.d.ts +30 -0
- package/dist/pkg.js +162 -0
- package/dist/pkg.js.map +1 -0
- package/dist/plugin-loader.d.ts +16 -0
- package/dist/plugin-loader.js +124 -0
- package/dist/plugin-loader.js.map +1 -0
- package/dist/plugin-registry-model.d.ts +133 -0
- package/dist/plugin-registry-model.js +6 -0
- package/dist/plugin-registry-model.js.map +1 -0
- package/dist/plugin-registry-service.d.ts +109 -0
- package/dist/plugin-registry-service.js +361 -0
- package/dist/plugin-registry-service.js.map +1 -0
- package/dist/plugin-registry.d.ts +58 -0
- package/dist/plugin-registry.js +108 -0
- package/dist/plugin-registry.js.map +1 -0
- package/dist/plugin-updates.d.ts +135 -0
- package/dist/plugin-updates.js +326 -0
- package/dist/plugin-updates.js.map +1 -0
- package/dist/plugins-cli.d.ts +7 -0
- package/dist/plugins-cli.js +157 -0
- package/dist/plugins-cli.js.map +1 -0
- package/dist/plugins.d.ts +88 -0
- package/dist/plugins.js +251 -0
- package/dist/plugins.js.map +1 -0
- package/dist/policy.d.ts +66 -0
- package/dist/policy.js +160 -0
- package/dist/policy.js.map +1 -0
- package/dist/post-pull-audit.d.ts +39 -0
- package/dist/post-pull-audit.js +151 -0
- package/dist/post-pull-audit.js.map +1 -0
- package/dist/provision.d.ts +17 -0
- package/dist/provision.js +147 -0
- package/dist/provision.js.map +1 -0
- package/dist/query-optimizer.d.ts +102 -0
- package/dist/query-optimizer.js +199 -0
- package/dist/query-optimizer.js.map +1 -0
- package/dist/read-only-mode.d.ts +46 -0
- package/dist/read-only-mode.js +71 -0
- package/dist/read-only-mode.js.map +1 -0
- package/dist/redis-adapter.d.ts +71 -0
- package/dist/redis-adapter.js +278 -0
- package/dist/redis-adapter.js.map +1 -0
- package/dist/resilience-tests.d.ts +120 -0
- package/dist/resilience-tests.js +293 -0
- package/dist/resilience-tests.js.map +1 -0
- package/dist/revocation.d.ts +22 -0
- package/dist/revocation.js +100 -0
- package/dist/revocation.js.map +1 -0
- package/dist/run.d.ts +21 -0
- package/dist/run.js +80 -0
- package/dist/run.js.map +1 -0
- package/dist/scan-build.d.ts +18 -0
- package/dist/scan-build.js +100 -0
- package/dist/scan-build.js.map +1 -0
- package/dist/scan-plaintext.d.ts +24 -0
- package/dist/scan-plaintext.js +147 -0
- package/dist/scan-plaintext.js.map +1 -0
- package/dist/scan-staged.d.ts +15 -0
- package/dist/scan-staged.js +70 -0
- package/dist/scan-staged.js.map +1 -0
- package/dist/scan-transcripts.d.ts +23 -0
- package/dist/scan-transcripts.js +93 -0
- package/dist/scan-transcripts.js.map +1 -0
- package/dist/secret-backends.d.ts +50 -0
- package/dist/secret-backends.js +510 -0
- package/dist/secret-backends.js.map +1 -0
- package/dist/secret-expiration.d.ts +46 -0
- package/dist/secret-expiration.js +172 -0
- package/dist/secret-expiration.js.map +1 -0
- package/dist/secrets-migrate.d.ts +75 -0
- package/dist/secrets-migrate.js +185 -0
- package/dist/secrets-migrate.js.map +1 -0
- package/dist/secrets-model.d.ts +77 -0
- package/dist/secrets-model.js +6 -0
- package/dist/secrets-model.js.map +1 -0
- package/dist/secrets-onecli.d.ts +65 -0
- package/dist/secrets-onecli.js +113 -0
- package/dist/secrets-onecli.js.map +1 -0
- package/dist/secrets-propagate.d.ts +48 -0
- package/dist/secrets-propagate.js +201 -0
- package/dist/secrets-propagate.js.map +1 -0
- package/dist/secrets-pull.d.ts +34 -0
- package/dist/secrets-pull.js +118 -0
- package/dist/secrets-pull.js.map +1 -0
- package/dist/secrets-purge-history.d.ts +53 -0
- package/dist/secrets-purge-history.js +144 -0
- package/dist/secrets-purge-history.js.map +1 -0
- package/dist/secrets-rotate-cli.d.ts +54 -0
- package/dist/secrets-rotate-cli.js +438 -0
- package/dist/secrets-rotate-cli.js.map +1 -0
- package/dist/secrets-rotate.d.ts +38 -0
- package/dist/secrets-rotate.js +65 -0
- package/dist/secrets-rotate.js.map +1 -0
- package/dist/secrets-service.d.ts +73 -0
- package/dist/secrets-service.js +283 -0
- package/dist/secrets-service.js.map +1 -0
- package/dist/secrets-set.d.ts +25 -0
- package/dist/secrets-set.js +33 -0
- package/dist/secrets-set.js.map +1 -0
- package/dist/secrets-sync.d.ts +21 -0
- package/dist/secrets-sync.js +215 -0
- package/dist/secrets-sync.js.map +1 -0
- package/dist/secrets-validate.d.ts +41 -0
- package/dist/secrets-validate.js +126 -0
- package/dist/secrets-validate.js.map +1 -0
- package/dist/secrets-vault-migrate.d.ts +71 -0
- package/dist/secrets-vault-migrate.js +258 -0
- package/dist/secrets-vault-migrate.js.map +1 -0
- package/dist/secrets.d.ts +16 -0
- package/dist/secrets.js +72 -0
- package/dist/secrets.js.map +1 -0
- package/dist/security-hardening.d.ts +150 -0
- package/dist/security-hardening.js +275 -0
- package/dist/security-hardening.js.map +1 -0
- package/dist/security-policy.d.ts +89 -0
- package/dist/security-policy.js +174 -0
- package/dist/security-policy.js.map +1 -0
- package/dist/security-prescan.d.ts +117 -0
- package/dist/security-prescan.js +566 -0
- package/dist/security-prescan.js.map +1 -0
- package/dist/sentry-adapter.d.ts +49 -0
- package/dist/sentry-adapter.js +227 -0
- package/dist/sentry-adapter.js.map +1 -0
- package/dist/service-adapter.d.ts +94 -0
- package/dist/service-adapter.js +162 -0
- package/dist/service-adapter.js.map +1 -0
- package/dist/skills.d.ts +13 -0
- package/dist/skills.js +17 -0
- package/dist/skills.js.map +1 -0
- package/dist/sla-monitor.d.ts +107 -0
- package/dist/sla-monitor.js +233 -0
- package/dist/sla-monitor.js.map +1 -0
- package/dist/stack-detector.d.ts +12 -0
- package/dist/stack-detector.js +251 -0
- package/dist/stack-detector.js.map +1 -0
- package/dist/team-model.d.ts +58 -0
- package/dist/team-model.js +83 -0
- package/dist/team-model.js.map +1 -0
- package/dist/team-service.d.ts +54 -0
- package/dist/team-service.js +206 -0
- package/dist/team-service.js.map +1 -0
- package/dist/toml-generator.d.ts +8 -0
- package/dist/toml-generator.js +223 -0
- package/dist/toml-generator.js.map +1 -0
- package/dist/triage-sandbox.d.ts +34 -0
- package/dist/triage-sandbox.js +167 -0
- package/dist/triage-sandbox.js.map +1 -0
- package/dist/triage.d.ts +30 -0
- package/dist/triage.js +79 -0
- package/dist/triage.js.map +1 -0
- package/dist/update-check.d.ts +13 -0
- package/dist/update-check.js +91 -0
- package/dist/update-check.js.map +1 -0
- package/dist/utils/colors.d.ts +14 -0
- package/dist/utils/colors.js +15 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/utils/didYouMean.d.ts +15 -0
- package/dist/utils/didYouMean.js +47 -0
- package/dist/utils/didYouMean.js.map +1 -0
- package/dist/utils/exec.d.ts +21 -0
- package/dist/utils/exec.js +23 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/execFileNoThrow.d.ts +14 -0
- package/dist/utils/execFileNoThrow.js +29 -0
- package/dist/utils/execFileNoThrow.js.map +1 -0
- package/dist/utils/flags.d.ts +19 -0
- package/dist/utils/flags.js +36 -0
- package/dist/utils/flags.js.map +1 -0
- package/dist/utils/parseCommand.d.ts +16 -0
- package/dist/utils/parseCommand.js +13 -0
- package/dist/utils/parseCommand.js.map +1 -0
- package/dist/utils/prompt.d.ts +13 -0
- package/dist/utils/prompt.js +35 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/promptSelect.d.ts +19 -0
- package/dist/utils/promptSelect.js +89 -0
- package/dist/utils/promptSelect.js.map +1 -0
- package/dist/utils/redactSecrets.d.ts +24 -0
- package/dist/utils/redactSecrets.js +134 -0
- package/dist/utils/redactSecrets.js.map +1 -0
- package/dist/validation/dynamic-schema.d.ts +29 -0
- package/dist/validation/dynamic-schema.js +76 -0
- package/dist/validation/dynamic-schema.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
2
|
+
// ─── QueryOptimizer ───────────────────────────────────────────────────────────
|
|
3
|
+
export class QueryOptimizer {
|
|
4
|
+
queryCache = new Map();
|
|
5
|
+
indexes = new Map();
|
|
6
|
+
executionStats = [];
|
|
7
|
+
batchQueue = new Map();
|
|
8
|
+
// ─── Index Management ─────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Create an index for faster queries.
|
|
11
|
+
*/
|
|
12
|
+
createIndex(indexDef) {
|
|
13
|
+
this.indexes.set(indexDef.name, indexDef);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get index definition by name.
|
|
17
|
+
*/
|
|
18
|
+
getIndex(indexName) {
|
|
19
|
+
return this.indexes.get(indexName) || null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get all indexes.
|
|
23
|
+
*/
|
|
24
|
+
getAllIndexes() {
|
|
25
|
+
return [...this.indexes.values()];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Drop an index.
|
|
29
|
+
*/
|
|
30
|
+
dropIndex(indexName) {
|
|
31
|
+
return this.indexes.delete(indexName);
|
|
32
|
+
}
|
|
33
|
+
// ─── Query Planning ───────────────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* Generate optimized query plan.
|
|
36
|
+
*/
|
|
37
|
+
planQuery(query, columns = []) {
|
|
38
|
+
// Check cache first
|
|
39
|
+
if (this.queryCache.has(query)) {
|
|
40
|
+
return this.queryCache.get(query);
|
|
41
|
+
}
|
|
42
|
+
// Analyze query and find applicable indexes
|
|
43
|
+
const indexesUsed = this.findApplicableIndexes(query, columns);
|
|
44
|
+
const estimatedCost = this.calculateQueryCost(query, indexesUsed);
|
|
45
|
+
const batchSize = this.recommendBatchSize(estimatedCost);
|
|
46
|
+
const useConnection = estimatedCost >= 1000;
|
|
47
|
+
const plan = {
|
|
48
|
+
query,
|
|
49
|
+
estimatedCost,
|
|
50
|
+
indexesUsed,
|
|
51
|
+
batchSize,
|
|
52
|
+
useConnection,
|
|
53
|
+
};
|
|
54
|
+
this.queryCache.set(query, plan);
|
|
55
|
+
return plan;
|
|
56
|
+
}
|
|
57
|
+
findApplicableIndexes(query, columns) {
|
|
58
|
+
const applicable = [];
|
|
59
|
+
for (const index of this.indexes.values()) {
|
|
60
|
+
// Check if index columns are referenced in query
|
|
61
|
+
if (index.columns.some((col) => query.includes(col) || columns.includes(col))) {
|
|
62
|
+
applicable.push(index.name);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return applicable;
|
|
66
|
+
}
|
|
67
|
+
calculateQueryCost(query, indexesUsed) {
|
|
68
|
+
// Simple cost calculation: base cost minus index benefits
|
|
69
|
+
let cost = 200;
|
|
70
|
+
// Penalize complex queries
|
|
71
|
+
if (query.includes("JOIN"))
|
|
72
|
+
cost += 400;
|
|
73
|
+
if (query.includes("GROUP BY"))
|
|
74
|
+
cost += 300;
|
|
75
|
+
if (query.includes("ORDER BY"))
|
|
76
|
+
cost += 200;
|
|
77
|
+
// Reward index usage
|
|
78
|
+
cost -= indexesUsed.length * 50;
|
|
79
|
+
return Math.max(10, cost);
|
|
80
|
+
}
|
|
81
|
+
recommendBatchSize(estimatedCost) {
|
|
82
|
+
if (estimatedCost < 50)
|
|
83
|
+
return 1000;
|
|
84
|
+
if (estimatedCost < 100)
|
|
85
|
+
return 500;
|
|
86
|
+
if (estimatedCost < 500)
|
|
87
|
+
return 100;
|
|
88
|
+
return 10;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get cached query plan.
|
|
92
|
+
*/
|
|
93
|
+
getCachedPlan(query) {
|
|
94
|
+
return this.queryCache.get(query) || null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Clear query plan cache.
|
|
98
|
+
*/
|
|
99
|
+
clearCache() {
|
|
100
|
+
this.queryCache.clear();
|
|
101
|
+
}
|
|
102
|
+
// ─── Query Execution ──────────────────────────────────────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* Execute query with optimization.
|
|
105
|
+
*/
|
|
106
|
+
executeQuery(query, columns = []) {
|
|
107
|
+
const startTime = Date.now();
|
|
108
|
+
const plan = this.planQuery(query, columns);
|
|
109
|
+
// Simulate query execution
|
|
110
|
+
const result = {
|
|
111
|
+
rows: [],
|
|
112
|
+
executionTime: Date.now() - startTime,
|
|
113
|
+
indexesUsed: plan.indexesUsed,
|
|
114
|
+
};
|
|
115
|
+
// Track statistics
|
|
116
|
+
this.executionStats.push({
|
|
117
|
+
query,
|
|
118
|
+
executionTime: result.executionTime,
|
|
119
|
+
timestamp: new Date().toISOString(),
|
|
120
|
+
});
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get query execution statistics.
|
|
125
|
+
*/
|
|
126
|
+
getExecutionStats(limit = 100) {
|
|
127
|
+
return this.executionStats.slice(-limit);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get average query execution time.
|
|
131
|
+
*/
|
|
132
|
+
getAverageExecutionTime(query) {
|
|
133
|
+
const stats = query
|
|
134
|
+
? this.executionStats.filter((s) => s.query === query)
|
|
135
|
+
: this.executionStats;
|
|
136
|
+
if (stats.length === 0)
|
|
137
|
+
return 0;
|
|
138
|
+
const total = stats.reduce((sum, s) => sum + s.executionTime, 0);
|
|
139
|
+
return total / stats.length;
|
|
140
|
+
}
|
|
141
|
+
// ─── Batch Operations ─────────────────────────────────────────────────────
|
|
142
|
+
/**
|
|
143
|
+
* Queue batch operation.
|
|
144
|
+
*/
|
|
145
|
+
queueBatchOperation(id, operations) {
|
|
146
|
+
const batchOp = {
|
|
147
|
+
id,
|
|
148
|
+
operations,
|
|
149
|
+
status: "pending",
|
|
150
|
+
};
|
|
151
|
+
this.batchQueue.set(id, batchOp);
|
|
152
|
+
return batchOp;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Execute queued batch operation.
|
|
156
|
+
*/
|
|
157
|
+
executeBatch(id) {
|
|
158
|
+
const batch = this.batchQueue.get(id);
|
|
159
|
+
if (!batch)
|
|
160
|
+
return null;
|
|
161
|
+
batch.status = "executing";
|
|
162
|
+
try {
|
|
163
|
+
// Simulate batch execution
|
|
164
|
+
batch.result = {
|
|
165
|
+
inserted: batch.operations.filter((op) => op.type === "insert").length,
|
|
166
|
+
updated: batch.operations.filter((op) => op.type === "update").length,
|
|
167
|
+
deleted: batch.operations.filter((op) => op.type === "delete").length,
|
|
168
|
+
};
|
|
169
|
+
batch.status = "completed";
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
batch.status = "failed";
|
|
173
|
+
}
|
|
174
|
+
return batch;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get batch operation by ID.
|
|
178
|
+
*/
|
|
179
|
+
getBatchOperation(id) {
|
|
180
|
+
return this.batchQueue.get(id) || null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get all pending batches.
|
|
184
|
+
*/
|
|
185
|
+
getPendingBatches() {
|
|
186
|
+
return [...this.batchQueue.values()].filter((b) => b.status === "pending");
|
|
187
|
+
}
|
|
188
|
+
// ─── Cache helpers ────────────────────────────────────────────────────────
|
|
189
|
+
getIndexCache() {
|
|
190
|
+
return this.indexes;
|
|
191
|
+
}
|
|
192
|
+
getQueryCacheSize() {
|
|
193
|
+
return this.queryCache.size;
|
|
194
|
+
}
|
|
195
|
+
getBatchQueueSize() {
|
|
196
|
+
return this.batchQueue.size;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=query-optimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-optimizer.js","sourceRoot":"","sources":["../src/query-optimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session read-only mode.
|
|
3
|
+
*
|
|
4
|
+
* When kit is invoked with `--read-only` (or `.kit.toml [policy]
|
|
5
|
+
* .default_mode = "read-only"`), every write-capable code path refuses
|
|
6
|
+
* the mutation and audit-logs the refusal. The set of guarded operations
|
|
7
|
+
* includes: vault writes, env-var sets, hook installs, elevation grants,
|
|
8
|
+
* and every plugin's create/update/delete surface.
|
|
9
|
+
*
|
|
10
|
+
* Implementation choice: a single env var `KIT_READ_ONLY=1` is the
|
|
11
|
+
* source of truth so plugins running in the same process tree honor the
|
|
12
|
+
* flag without explicit coupling to a TypeScript module.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Returns true when the active process should refuse mutating operations.
|
|
16
|
+
* Honors:
|
|
17
|
+
* 1. Explicit `--read-only` flag (parsed by main(), sets env var)
|
|
18
|
+
* 2. `KIT_READ_ONLY=1` env var (for nested invocations)
|
|
19
|
+
* 3. `.kit.toml [policy].default_mode = "read-only"` (read at boot)
|
|
20
|
+
*/
|
|
21
|
+
export declare function isReadOnlyMode(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Activates read-only mode for this process and any child processes.
|
|
24
|
+
* Idempotent. Called from main() after argv parsing or from
|
|
25
|
+
* `.kit.toml`-policy loader.
|
|
26
|
+
*/
|
|
27
|
+
export declare function activateReadOnlyMode(source: "flag" | "env" | "policy"): void;
|
|
28
|
+
/**
|
|
29
|
+
* Refuses a mutating operation. Returns a structured result that callers
|
|
30
|
+
* forward; also appends an audit-log entry. Never throws — callers handle
|
|
31
|
+
* the {ok: false} branch and surface the reason to the user.
|
|
32
|
+
*
|
|
33
|
+
* Pattern:
|
|
34
|
+
* if (isReadOnlyMode()) {
|
|
35
|
+
* const refusal = await refuseWrite("rotate-jwt", { vault: "supabase" });
|
|
36
|
+
* return { ok: false, detail: refusal.reason };
|
|
37
|
+
* }
|
|
38
|
+
*/
|
|
39
|
+
export declare function refuseWrite(operation: string, metadata?: Record<string, unknown>): Promise<{
|
|
40
|
+
ok: false;
|
|
41
|
+
reason: string;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Test-only: reset env var so tests can exercise both modes.
|
|
45
|
+
*/
|
|
46
|
+
export declare function _resetReadOnlyModeForTests(): void;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-session read-only mode.
|
|
3
|
+
*
|
|
4
|
+
* When kit is invoked with `--read-only` (or `.kit.toml [policy]
|
|
5
|
+
* .default_mode = "read-only"`), every write-capable code path refuses
|
|
6
|
+
* the mutation and audit-logs the refusal. The set of guarded operations
|
|
7
|
+
* includes: vault writes, env-var sets, hook installs, elevation grants,
|
|
8
|
+
* and every plugin's create/update/delete surface.
|
|
9
|
+
*
|
|
10
|
+
* Implementation choice: a single env var `KIT_READ_ONLY=1` is the
|
|
11
|
+
* source of truth so plugins running in the same process tree honor the
|
|
12
|
+
* flag without explicit coupling to a TypeScript module.
|
|
13
|
+
*/
|
|
14
|
+
import { appendAuditEventDirect } from "./audit.js";
|
|
15
|
+
const READ_ONLY_ENV = "KIT_READ_ONLY";
|
|
16
|
+
/**
|
|
17
|
+
* Returns true when the active process should refuse mutating operations.
|
|
18
|
+
* Honors:
|
|
19
|
+
* 1. Explicit `--read-only` flag (parsed by main(), sets env var)
|
|
20
|
+
* 2. `KIT_READ_ONLY=1` env var (for nested invocations)
|
|
21
|
+
* 3. `.kit.toml [policy].default_mode = "read-only"` (read at boot)
|
|
22
|
+
*/
|
|
23
|
+
export function isReadOnlyMode() {
|
|
24
|
+
const v = process.env[READ_ONLY_ENV];
|
|
25
|
+
return v === "1" || v === "true";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Activates read-only mode for this process and any child processes.
|
|
29
|
+
* Idempotent. Called from main() after argv parsing or from
|
|
30
|
+
* `.kit.toml`-policy loader.
|
|
31
|
+
*/
|
|
32
|
+
export function activateReadOnlyMode(source) {
|
|
33
|
+
if (isReadOnlyMode())
|
|
34
|
+
return;
|
|
35
|
+
process.env[READ_ONLY_ENV] = "1";
|
|
36
|
+
process.stderr.write(`[kit] read-only mode active (source: ${source}) — all writes will be refused.\n`);
|
|
37
|
+
void appendAuditEventDirect({
|
|
38
|
+
operation: "read-only-mode-activated",
|
|
39
|
+
environment: process.env.NODE_ENV ?? "unknown",
|
|
40
|
+
success: true,
|
|
41
|
+
metadata: { source },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Refuses a mutating operation. Returns a structured result that callers
|
|
46
|
+
* forward; also appends an audit-log entry. Never throws — callers handle
|
|
47
|
+
* the {ok: false} branch and surface the reason to the user.
|
|
48
|
+
*
|
|
49
|
+
* Pattern:
|
|
50
|
+
* if (isReadOnlyMode()) {
|
|
51
|
+
* const refusal = await refuseWrite("rotate-jwt", { vault: "supabase" });
|
|
52
|
+
* return { ok: false, detail: refusal.reason };
|
|
53
|
+
* }
|
|
54
|
+
*/
|
|
55
|
+
export async function refuseWrite(operation, metadata = {}) {
|
|
56
|
+
const reason = `read-only mode active — refusing "${operation}"`;
|
|
57
|
+
await appendAuditEventDirect({
|
|
58
|
+
operation: "read-only-mode-refusal",
|
|
59
|
+
environment: process.env.NODE_ENV ?? "unknown",
|
|
60
|
+
success: false,
|
|
61
|
+
metadata: { refused_operation: operation, ...metadata },
|
|
62
|
+
});
|
|
63
|
+
return { ok: false, reason };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Test-only: reset env var so tests can exercise both modes.
|
|
67
|
+
*/
|
|
68
|
+
export function _resetReadOnlyModeForTests() {
|
|
69
|
+
delete process.env[READ_ONLY_ENV];
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=read-only-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only-mode.js","sourceRoot":"","sources":["../src/read-only-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAiC;IACpE,IAAI,cAAc,EAAE;QAAE,OAAO;IAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCAAwC,MAAM,mCAAmC,CAClF,CAAC;IACF,KAAK,sBAAsB,CAAC;QAC1B,SAAS,EAAE,0BAA0B;QACrC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS;QAC9C,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,EAAE,MAAM,EAAE;KACrB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,WAAoC,EAAE;IAEtC,MAAM,MAAM,GAAG,qCAAqC,SAAS,GAAG,CAAC;IACjE,MAAM,sBAAsB,CAAC;QAC3B,SAAS,EAAE,wBAAwB;QACnC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS;QAC9C,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE;KACxD,CAAC,CAAC;IACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { AbstractServiceAdapter, type ServiceConfig, type ServiceEvent, type ServiceHealth } from "./service-adapter.js";
|
|
2
|
+
/**
|
|
3
|
+
* Redis adapter for caching and session management.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RedisAdapter extends AbstractServiceAdapter {
|
|
6
|
+
private cache;
|
|
7
|
+
private lastHealthCheck;
|
|
8
|
+
private healthCheckErrors;
|
|
9
|
+
private stats;
|
|
10
|
+
constructor(config?: ServiceConfig);
|
|
11
|
+
connect(): Promise<void>;
|
|
12
|
+
disconnect(): Promise<void>;
|
|
13
|
+
getHealth(): Promise<ServiceHealth>;
|
|
14
|
+
protected sendEvent(event: ServiceEvent): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Set a cache value.
|
|
17
|
+
*/
|
|
18
|
+
set(key: string, value: unknown, ttl?: number): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Get a cache value.
|
|
21
|
+
*/
|
|
22
|
+
get(key: string): Promise<unknown>;
|
|
23
|
+
/**
|
|
24
|
+
* Delete a cache key.
|
|
25
|
+
*/
|
|
26
|
+
delete(key: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if key exists.
|
|
29
|
+
*/
|
|
30
|
+
exists(key: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Clear all cache.
|
|
33
|
+
*/
|
|
34
|
+
clear(): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Get all cache keys.
|
|
37
|
+
*/
|
|
38
|
+
keys(): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Get cache size.
|
|
41
|
+
*/
|
|
42
|
+
size(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Get cache statistics.
|
|
45
|
+
*/
|
|
46
|
+
getCacheStats(): {
|
|
47
|
+
hits: number;
|
|
48
|
+
misses: number;
|
|
49
|
+
sets: number;
|
|
50
|
+
deletes: number;
|
|
51
|
+
hitRate: number;
|
|
52
|
+
size: number;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Flush all queued events.
|
|
56
|
+
*/
|
|
57
|
+
private flushQueue;
|
|
58
|
+
/**
|
|
59
|
+
* Get Redis configuration info.
|
|
60
|
+
*/
|
|
61
|
+
getInfo(): {
|
|
62
|
+
endpoint: string;
|
|
63
|
+
connected: boolean;
|
|
64
|
+
cacheSize: number;
|
|
65
|
+
keyCount: number;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a Redis adapter from environment variables.
|
|
70
|
+
*/
|
|
71
|
+
export declare function createRedisAdapter(enabled?: boolean): RedisAdapter;
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
// ─── Redis Cache Adapter ─────────────────────────────────────────────────
|
|
2
|
+
import { AbstractServiceAdapter, simulatedFailuresEnabled, } from "./service-adapter.js";
|
|
3
|
+
/**
|
|
4
|
+
* Redis adapter for caching and session management.
|
|
5
|
+
*/
|
|
6
|
+
export class RedisAdapter extends AbstractServiceAdapter {
|
|
7
|
+
cache = new Map();
|
|
8
|
+
lastHealthCheck = new Date().toISOString();
|
|
9
|
+
healthCheckErrors = 0;
|
|
10
|
+
stats = {
|
|
11
|
+
hits: 0,
|
|
12
|
+
misses: 0,
|
|
13
|
+
sets: 0,
|
|
14
|
+
deletes: 0,
|
|
15
|
+
};
|
|
16
|
+
constructor(config = { enabled: false }) {
|
|
17
|
+
super("redis", "1.0.0", config);
|
|
18
|
+
}
|
|
19
|
+
async connect() {
|
|
20
|
+
if (!this.config.enabled) {
|
|
21
|
+
this.connected = false;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Validate required config
|
|
25
|
+
if (!this.config.endpoint) {
|
|
26
|
+
throw new Error("Redis endpoint is required (host:port)");
|
|
27
|
+
}
|
|
28
|
+
// Basic endpoint format validation
|
|
29
|
+
const [host, port] = this.config.endpoint.split(":");
|
|
30
|
+
if (!host) {
|
|
31
|
+
throw new Error("Invalid Redis endpoint format");
|
|
32
|
+
}
|
|
33
|
+
if (port && isNaN(parseInt(port))) {
|
|
34
|
+
throw new Error("Invalid Redis port number");
|
|
35
|
+
}
|
|
36
|
+
// Simulate connection test
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
38
|
+
this.connected = true;
|
|
39
|
+
// Flush queued events
|
|
40
|
+
await this.flushQueue();
|
|
41
|
+
}
|
|
42
|
+
async disconnect() {
|
|
43
|
+
if (this.healthCheckInterval) {
|
|
44
|
+
clearInterval(this.healthCheckInterval);
|
|
45
|
+
this.healthCheckInterval = null;
|
|
46
|
+
}
|
|
47
|
+
this.cache.clear();
|
|
48
|
+
this.connected = false;
|
|
49
|
+
}
|
|
50
|
+
async getHealth() {
|
|
51
|
+
const responseTime = Math.random() * 30;
|
|
52
|
+
try {
|
|
53
|
+
if (!this.connected) {
|
|
54
|
+
this.healthCheckErrors++;
|
|
55
|
+
}
|
|
56
|
+
this.lastHealthCheck = new Date().toISOString();
|
|
57
|
+
const status = this.healthCheckErrors < 3
|
|
58
|
+
? this.connected
|
|
59
|
+
? "healthy"
|
|
60
|
+
: "degraded"
|
|
61
|
+
: "unhealthy";
|
|
62
|
+
return {
|
|
63
|
+
status,
|
|
64
|
+
lastCheck: this.lastHealthCheck,
|
|
65
|
+
responseTime: Math.round(responseTime),
|
|
66
|
+
errorCount: this.healthCheckErrors,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
this.healthCheckErrors++;
|
|
71
|
+
return {
|
|
72
|
+
status: "unhealthy",
|
|
73
|
+
lastCheck: new Date().toISOString(),
|
|
74
|
+
responseTime: -1,
|
|
75
|
+
errorCount: this.healthCheckErrors,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async sendEvent(event) {
|
|
80
|
+
if (!this.connected) {
|
|
81
|
+
throw new Error("Not connected to Redis");
|
|
82
|
+
}
|
|
83
|
+
// Validate event
|
|
84
|
+
if (!event.type || !event.data) {
|
|
85
|
+
throw new Error("Invalid event format");
|
|
86
|
+
}
|
|
87
|
+
// Simulate Redis operation
|
|
88
|
+
await new Promise((resolve) => setTimeout(resolve, Math.random() * 20));
|
|
89
|
+
// Simulate occasional failures (0.5% rate for Redis)
|
|
90
|
+
if (simulatedFailuresEnabled() && Math.random() < 0.005) {
|
|
91
|
+
throw new Error("Simulated Redis error");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Set a cache value.
|
|
96
|
+
*/
|
|
97
|
+
async set(key, value, ttl) {
|
|
98
|
+
const expireAt = ttl ? Date.now() + ttl * 1000 : undefined;
|
|
99
|
+
const event = {
|
|
100
|
+
type: "event",
|
|
101
|
+
data: {
|
|
102
|
+
operation: "set",
|
|
103
|
+
key,
|
|
104
|
+
value,
|
|
105
|
+
ttl,
|
|
106
|
+
},
|
|
107
|
+
timestamp: new Date().toISOString(),
|
|
108
|
+
tags: {
|
|
109
|
+
operation: "set",
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
const success = await this.send(event);
|
|
113
|
+
if (success) {
|
|
114
|
+
this.cache.set(key, { value, expireAt });
|
|
115
|
+
this.stats.sets++;
|
|
116
|
+
}
|
|
117
|
+
return success;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get a cache value.
|
|
121
|
+
*/
|
|
122
|
+
async get(key) {
|
|
123
|
+
const event = {
|
|
124
|
+
type: "event",
|
|
125
|
+
data: {
|
|
126
|
+
operation: "get",
|
|
127
|
+
key,
|
|
128
|
+
},
|
|
129
|
+
timestamp: new Date().toISOString(),
|
|
130
|
+
tags: {
|
|
131
|
+
operation: "get",
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
await this.send(event);
|
|
135
|
+
const entry = this.cache.get(key);
|
|
136
|
+
if (!entry) {
|
|
137
|
+
this.stats.misses++;
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
// Check expiration
|
|
141
|
+
if (entry.expireAt && entry.expireAt < Date.now()) {
|
|
142
|
+
this.cache.delete(key);
|
|
143
|
+
this.stats.misses++;
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
this.stats.hits++;
|
|
147
|
+
return entry.value;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Delete a cache key.
|
|
151
|
+
*/
|
|
152
|
+
async delete(key) {
|
|
153
|
+
const event = {
|
|
154
|
+
type: "event",
|
|
155
|
+
data: {
|
|
156
|
+
operation: "delete",
|
|
157
|
+
key,
|
|
158
|
+
},
|
|
159
|
+
timestamp: new Date().toISOString(),
|
|
160
|
+
tags: {
|
|
161
|
+
operation: "delete",
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
const success = await this.send(event);
|
|
165
|
+
if (success) {
|
|
166
|
+
const deleted = this.cache.delete(key);
|
|
167
|
+
if (deleted) {
|
|
168
|
+
this.stats.deletes++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return success;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Check if key exists.
|
|
175
|
+
*/
|
|
176
|
+
async exists(key) {
|
|
177
|
+
const entry = this.cache.get(key);
|
|
178
|
+
if (!entry) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
// Check expiration
|
|
182
|
+
if (entry.expireAt && entry.expireAt < Date.now()) {
|
|
183
|
+
this.cache.delete(key);
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Clear all cache.
|
|
190
|
+
*/
|
|
191
|
+
async clear() {
|
|
192
|
+
const event = {
|
|
193
|
+
type: "event",
|
|
194
|
+
data: {
|
|
195
|
+
operation: "clear",
|
|
196
|
+
},
|
|
197
|
+
timestamp: new Date().toISOString(),
|
|
198
|
+
tags: {
|
|
199
|
+
operation: "clear",
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
const success = await this.send(event);
|
|
203
|
+
if (success) {
|
|
204
|
+
this.cache.clear();
|
|
205
|
+
}
|
|
206
|
+
return success;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Get all cache keys.
|
|
210
|
+
*/
|
|
211
|
+
keys() {
|
|
212
|
+
const now = Date.now();
|
|
213
|
+
const validKeys = [];
|
|
214
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
215
|
+
// Skip expired keys
|
|
216
|
+
if (!entry.expireAt || entry.expireAt >= now) {
|
|
217
|
+
validKeys.push(key);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return validKeys;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get cache size.
|
|
224
|
+
*/
|
|
225
|
+
size() {
|
|
226
|
+
return this.cache.size;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get cache statistics.
|
|
230
|
+
*/
|
|
231
|
+
getCacheStats() {
|
|
232
|
+
const total = this.stats.hits + this.stats.misses;
|
|
233
|
+
const hitRate = total > 0 ? (this.stats.hits / total) * 100 : 0;
|
|
234
|
+
return {
|
|
235
|
+
...this.stats,
|
|
236
|
+
hitRate: Math.round(hitRate * 100) / 100,
|
|
237
|
+
size: this.cache.size,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Flush all queued events.
|
|
242
|
+
*/
|
|
243
|
+
async flushQueue() {
|
|
244
|
+
const queued = this.getQueuedEvents();
|
|
245
|
+
if (queued.length === 0)
|
|
246
|
+
return;
|
|
247
|
+
const { sent, failed } = await this.batch(queued);
|
|
248
|
+
if (sent > 0) {
|
|
249
|
+
this.clearQueue();
|
|
250
|
+
}
|
|
251
|
+
console.log(`Flushed Redis queue: ${sent} sent, ${failed} failed`);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get Redis configuration info.
|
|
255
|
+
*/
|
|
256
|
+
getInfo() {
|
|
257
|
+
return {
|
|
258
|
+
endpoint: this.config.endpoint || "",
|
|
259
|
+
connected: this.connected,
|
|
260
|
+
cacheSize: this.cache.size,
|
|
261
|
+
keyCount: this.keys().length,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Create a Redis adapter from environment variables.
|
|
267
|
+
*/
|
|
268
|
+
export function createRedisAdapter(enabled = true) {
|
|
269
|
+
const endpoint = process.env.REDIS_URL || process.env.REDIS_ENDPOINT;
|
|
270
|
+
if (enabled && !endpoint) {
|
|
271
|
+
console.warn("Redis is enabled but REDIS_URL/REDIS_ENDPOINT environment variable is not set");
|
|
272
|
+
}
|
|
273
|
+
return new RedisAdapter({
|
|
274
|
+
enabled: enabled && !!endpoint,
|
|
275
|
+
endpoint,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=redis-adapter.js.map
|