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,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bumblebee — managed supply-chain exposure scanner.
|
|
3
|
+
*
|
|
4
|
+
* Downloads, verifies, and caches a pinned release of perplexityai/bumblebee
|
|
5
|
+
* (a read-only inventory scanner that flags installed packages matching known
|
|
6
|
+
* supply-chain compromise catalogs), then runs it against the machine/project.
|
|
7
|
+
*
|
|
8
|
+
* No Go toolchain is required: we fetch the prebuilt static binary from GitHub
|
|
9
|
+
* releases, verify it against a checksum embedded in this file, and cache it
|
|
10
|
+
* under ~/.kit/tools/bumblebee/<version>/. The release tarball also bundles
|
|
11
|
+
* the official threat_intel/ exposure catalogs, which --exposure-catalog reads.
|
|
12
|
+
*/
|
|
13
|
+
/** Raised when a downloaded artifact fails SHA-256 verification (possible tampering). */
|
|
14
|
+
export declare class IntegrityError extends Error {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
|
17
|
+
/** Why a scanner install could not be produced. `integrity` is a security event. */
|
|
18
|
+
export type EnsureFailureKind = "unsupported" | "config" | "network" | "integrity";
|
|
19
|
+
export interface EnsureResult {
|
|
20
|
+
install?: ScannerInstall;
|
|
21
|
+
reason?: string;
|
|
22
|
+
kind?: EnsureFailureKind;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pinned bumblebee release. Bump deliberately, and update TARBALL_CHECKSUMS to
|
|
26
|
+
* match the release's checksums.txt — the two MUST move together.
|
|
27
|
+
*/
|
|
28
|
+
export declare const BUMBLEBEE_VERSION = "0.1.1";
|
|
29
|
+
/**
|
|
30
|
+
* SHA-256 of each release tarball, copied from the pinned release's
|
|
31
|
+
* checksums.txt. Embedding the digests here (rather than trusting a fetched
|
|
32
|
+
* checksums.txt) means tampering with a download alone cannot pass
|
|
33
|
+
* verification — an attacker would also have to compromise the published
|
|
34
|
+
* kit package itself.
|
|
35
|
+
*/
|
|
36
|
+
export declare const TARBALL_CHECKSUMS: Record<string, string>;
|
|
37
|
+
export interface PlatformTarget {
|
|
38
|
+
os: "linux" | "darwin";
|
|
39
|
+
arch: "amd64" | "arm64";
|
|
40
|
+
assetName: string;
|
|
41
|
+
checksum: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Map Node's process.platform/arch to a bumblebee release asset.
|
|
45
|
+
* Returns null on unsupported platforms (bumblebee ships linux/darwin only).
|
|
46
|
+
*/
|
|
47
|
+
export declare function resolveTarget(platform?: NodeJS.Platform, arch?: string, version?: string): PlatformTarget | null;
|
|
48
|
+
export declare function sha256(data: Buffer | Uint8Array): string;
|
|
49
|
+
/**
|
|
50
|
+
* Clears the cached bumblebee binary so the next scan re-downloads + re-
|
|
51
|
+
* verifies. Use when a legitimate rebuild has invalidated the pinned
|
|
52
|
+
* checksum, or to recover from a transient corruption. Caller is expected
|
|
53
|
+
* to confirm intent — this is destructive in the sense that any modified
|
|
54
|
+
* local build is lost.
|
|
55
|
+
*/
|
|
56
|
+
export declare function clearBumblebeeCache(): Promise<{
|
|
57
|
+
removed: boolean;
|
|
58
|
+
path: string;
|
|
59
|
+
}>;
|
|
60
|
+
export interface ScannerInstall {
|
|
61
|
+
/** Path to the bumblebee executable. */
|
|
62
|
+
binPath: string;
|
|
63
|
+
/** Directory of *.json exposure catalogs (threat_intel). */
|
|
64
|
+
catalogDir: string;
|
|
65
|
+
}
|
|
66
|
+
export interface EnsureOptions {
|
|
67
|
+
/** Allow downloading the binary if it is not already cached. Default true. */
|
|
68
|
+
allowDownload?: boolean;
|
|
69
|
+
/** Network timeout for the download, ms. Default 120_000. */
|
|
70
|
+
timeoutMs?: number;
|
|
71
|
+
/** Stream to write a one-time "downloading" notice to. Default process.stderr. */
|
|
72
|
+
notice?: (message: string) => void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a usable bumblebee install: an explicit override, a cached copy, or
|
|
76
|
+
* a freshly downloaded-and-verified release. Returns the install on success,
|
|
77
|
+
* or a human-readable `reason` when unavailable (never throws).
|
|
78
|
+
*/
|
|
79
|
+
export declare function ensureBumblebee(opts?: EnsureOptions): Promise<EnsureResult>;
|
|
80
|
+
export interface BumblebeeFinding {
|
|
81
|
+
severity: string;
|
|
82
|
+
catalogId: string;
|
|
83
|
+
catalogName: string;
|
|
84
|
+
ecosystem: string;
|
|
85
|
+
packageName: string;
|
|
86
|
+
version: string;
|
|
87
|
+
sourceFile: string;
|
|
88
|
+
evidence: string;
|
|
89
|
+
}
|
|
90
|
+
export interface ScanOutcome {
|
|
91
|
+
/** scan_summary.status, e.g. "complete". "unknown" if no summary was seen. */
|
|
92
|
+
status: string;
|
|
93
|
+
timedOut: boolean;
|
|
94
|
+
summarySeen: boolean;
|
|
95
|
+
findings: BumblebeeFinding[];
|
|
96
|
+
/** Total packages inspected (emitted + suppressed). */
|
|
97
|
+
packagesScanned: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Parse bumblebee NDJSON stdout into findings + summary.
|
|
101
|
+
* Blank or unparseable lines are ignored. Diagnostics (on stderr) are not seen
|
|
102
|
+
* here. bumblebee exits 0 even when findings are present, so callers must judge
|
|
103
|
+
* exposure from the parsed findings, never from the process exit code.
|
|
104
|
+
*/
|
|
105
|
+
export declare function parseScanOutput(stdout: string): ScanOutcome;
|
|
106
|
+
/**
|
|
107
|
+
* Highest-severity label among findings (preferring the original casing),
|
|
108
|
+
* or null when there are none.
|
|
109
|
+
*/
|
|
110
|
+
export declare function maxSeverity(findings: BumblebeeFinding[]): string | null;
|
|
111
|
+
export interface CatalogStaleness {
|
|
112
|
+
stale: boolean;
|
|
113
|
+
ageDays: number;
|
|
114
|
+
}
|
|
115
|
+
/** Default age (days) after which the bundled catalogs are considered stale. */
|
|
116
|
+
export declare const CATALOG_STALE_AFTER_DAYS = 60;
|
|
117
|
+
/** Pure staleness check: how old the newest catalog is, and whether it crosses the threshold. */
|
|
118
|
+
export declare function isCatalogStale(newestMtimeMs: number, nowMs: number, thresholdDays?: number): CatalogStaleness;
|
|
119
|
+
/**
|
|
120
|
+
* Newest modification time (ms) among the *.json catalogs in `dir`, or null if
|
|
121
|
+
* none are found / the directory is unreadable. tar -xzf preserves the release
|
|
122
|
+
* file mtimes, so this reflects when the catalogs were authored upstream.
|
|
123
|
+
*/
|
|
124
|
+
export declare function newestCatalogMtime(dir: string): Promise<number | null>;
|
|
125
|
+
export interface ScanRequest {
|
|
126
|
+
install: ScannerInstall;
|
|
127
|
+
/** bumblebee profile: baseline | project | deep. */
|
|
128
|
+
profile: string;
|
|
129
|
+
/** Explicit roots to scan (required for deep; optional otherwise). */
|
|
130
|
+
roots: string[];
|
|
131
|
+
/** Process timeout, ms. Default 120_000. */
|
|
132
|
+
timeoutMs?: number;
|
|
133
|
+
/** bumblebee --max-duration value (wall-clock cap). Default "90s". */
|
|
134
|
+
maxDuration?: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Run a bumblebee scan in findings-only mode against the bundled catalogs.
|
|
138
|
+
* Returns the parsed outcome, or an `error` string on operational failure.
|
|
139
|
+
*/
|
|
140
|
+
export declare function runScan(req: ScanRequest): Promise<{
|
|
141
|
+
outcome?: ScanOutcome;
|
|
142
|
+
error?: string;
|
|
143
|
+
}>;
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bumblebee — managed supply-chain exposure scanner.
|
|
3
|
+
*
|
|
4
|
+
* Downloads, verifies, and caches a pinned release of perplexityai/bumblebee
|
|
5
|
+
* (a read-only inventory scanner that flags installed packages matching known
|
|
6
|
+
* supply-chain compromise catalogs), then runs it against the machine/project.
|
|
7
|
+
*
|
|
8
|
+
* No Go toolchain is required: we fetch the prebuilt static binary from GitHub
|
|
9
|
+
* releases, verify it against a checksum embedded in this file, and cache it
|
|
10
|
+
* under ~/.kit/tools/bumblebee/<version>/. The release tarball also bundles
|
|
11
|
+
* the official threat_intel/ exposure catalogs, which --exposure-catalog reads.
|
|
12
|
+
*/
|
|
13
|
+
import { execFile } from "node:child_process";
|
|
14
|
+
import { promisify } from "node:util";
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { writeFile, mkdir, mkdtemp, rm, chmod, access, rename, readdir, stat, } from "node:fs/promises";
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
const exec = promisify(execFile);
|
|
20
|
+
/** Raised when a downloaded artifact fails SHA-256 verification (possible tampering). */
|
|
21
|
+
export class IntegrityError extends Error {
|
|
22
|
+
constructor(message) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = "IntegrityError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Pinned bumblebee release. Bump deliberately, and update TARBALL_CHECKSUMS to
|
|
29
|
+
* match the release's checksums.txt — the two MUST move together.
|
|
30
|
+
*/
|
|
31
|
+
export const BUMBLEBEE_VERSION = "0.1.1";
|
|
32
|
+
const RELEASE_BASE_URL = "https://github.com/perplexityai/bumblebee/releases/download";
|
|
33
|
+
/**
|
|
34
|
+
* SHA-256 of each release tarball, copied from the pinned release's
|
|
35
|
+
* checksums.txt. Embedding the digests here (rather than trusting a fetched
|
|
36
|
+
* checksums.txt) means tampering with a download alone cannot pass
|
|
37
|
+
* verification — an attacker would also have to compromise the published
|
|
38
|
+
* kit package itself.
|
|
39
|
+
*/
|
|
40
|
+
export const TARBALL_CHECKSUMS = {
|
|
41
|
+
"bumblebee_0.1.1_darwin_amd64.tar.gz": "dd3b2573a974a2786f58215483420fa11cf62b39ff4032693f1440575940dc25",
|
|
42
|
+
"bumblebee_0.1.1_darwin_arm64.tar.gz": "dc0a620e54e85f998c2280b0323763c342973a25eda475d8036d16b01820a2bf",
|
|
43
|
+
"bumblebee_0.1.1_linux_amd64.tar.gz": "0ef1c56c85a67c10f7211883c0eb5fb902de705cc30bbca0bc6f4d60941547da",
|
|
44
|
+
"bumblebee_0.1.1_linux_arm64.tar.gz": "41aad0296bb6c88e746b237ed32eaa3b9b93c48770a51cd66f736f8a4d07a7d1",
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Map Node's process.platform/arch to a bumblebee release asset.
|
|
48
|
+
* Returns null on unsupported platforms (bumblebee ships linux/darwin only).
|
|
49
|
+
*/
|
|
50
|
+
export function resolveTarget(platform = process.platform, arch = process.arch, version = BUMBLEBEE_VERSION) {
|
|
51
|
+
const os = platform === "linux" ? "linux" : platform === "darwin" ? "darwin" : null;
|
|
52
|
+
const a = arch === "x64" ? "amd64" : arch === "arm64" ? "arm64" : null;
|
|
53
|
+
if (!os || !a)
|
|
54
|
+
return null;
|
|
55
|
+
const assetName = `bumblebee_${version}_${os}_${a}.tar.gz`;
|
|
56
|
+
const checksum = TARBALL_CHECKSUMS[assetName];
|
|
57
|
+
if (!checksum)
|
|
58
|
+
return null;
|
|
59
|
+
return { os, arch: a, assetName, checksum };
|
|
60
|
+
}
|
|
61
|
+
export function sha256(data) {
|
|
62
|
+
return createHash("sha256").update(data).digest("hex");
|
|
63
|
+
}
|
|
64
|
+
/** F3 — stream-hash a file on disk. Used to re-verify cached scanner binary. */
|
|
65
|
+
async function sha256File(filePath) {
|
|
66
|
+
const { createReadStream } = await import("node:fs");
|
|
67
|
+
const hash = createHash("sha256");
|
|
68
|
+
return new Promise((resolveHash, reject) => {
|
|
69
|
+
const stream = createReadStream(filePath);
|
|
70
|
+
stream.on("data", (chunk) => hash.update(chunk));
|
|
71
|
+
stream.on("end", () => resolveHash(hash.digest("hex")));
|
|
72
|
+
stream.on("error", reject);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function pathExists(p) {
|
|
76
|
+
try {
|
|
77
|
+
await access(p);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function cacheParent() {
|
|
85
|
+
return join(homedir(), ".kit", "tools", "bumblebee");
|
|
86
|
+
}
|
|
87
|
+
function cacheRoot(version = BUMBLEBEE_VERSION) {
|
|
88
|
+
return join(cacheParent(), version);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Clears the cached bumblebee binary so the next scan re-downloads + re-
|
|
92
|
+
* verifies. Use when a legitimate rebuild has invalidated the pinned
|
|
93
|
+
* checksum, or to recover from a transient corruption. Caller is expected
|
|
94
|
+
* to confirm intent — this is destructive in the sense that any modified
|
|
95
|
+
* local build is lost.
|
|
96
|
+
*/
|
|
97
|
+
export async function clearBumblebeeCache() {
|
|
98
|
+
const path = cacheParent();
|
|
99
|
+
try {
|
|
100
|
+
await access(path);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return { removed: false, path };
|
|
104
|
+
}
|
|
105
|
+
await rm(path, { recursive: true, force: true });
|
|
106
|
+
return { removed: true, path };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve a usable bumblebee install: an explicit override, a cached copy, or
|
|
110
|
+
* a freshly downloaded-and-verified release. Returns the install on success,
|
|
111
|
+
* or a human-readable `reason` when unavailable (never throws).
|
|
112
|
+
*/
|
|
113
|
+
export async function ensureBumblebee(opts = {}) {
|
|
114
|
+
// Explicit override for users who manage their own binary/catalog.
|
|
115
|
+
const envBin = process.env.KIT_BUMBLEBEE_BIN;
|
|
116
|
+
if (envBin) {
|
|
117
|
+
if (!(await pathExists(envBin))) {
|
|
118
|
+
return {
|
|
119
|
+
kind: "config",
|
|
120
|
+
reason: `KIT_BUMBLEBEE_BIN points to a missing file: ${envBin}`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const catalogDir = process.env.KIT_BUMBLEBEE_CATALOG || join(cacheRoot(), "threat_intel");
|
|
124
|
+
return { install: { binPath: envBin, catalogDir } };
|
|
125
|
+
}
|
|
126
|
+
const target = resolveTarget();
|
|
127
|
+
if (!target) {
|
|
128
|
+
return {
|
|
129
|
+
kind: "unsupported",
|
|
130
|
+
reason: `unsupported platform (${process.platform}/${process.arch}); bumblebee ships linux/darwin on amd64/arm64`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const root = cacheRoot();
|
|
134
|
+
const binPath = join(root, "bumblebee");
|
|
135
|
+
const catalogDir = join(root, "threat_intel");
|
|
136
|
+
if ((await pathExists(binPath)) && (await pathExists(catalogDir))) {
|
|
137
|
+
// F3 — re-verify the cached binary's SHA-256 against the pinned checksum
|
|
138
|
+
// before reuse. Catches tampering or accidental corruption since download.
|
|
139
|
+
try {
|
|
140
|
+
const actual = await sha256File(binPath);
|
|
141
|
+
if (actual !== target.checksum) {
|
|
142
|
+
return {
|
|
143
|
+
kind: "integrity",
|
|
144
|
+
reason: `cached binary checksum mismatch (expected ${target.checksum}, got ${actual}); clear ~/.kit/tools/bumblebee and retry`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
return {
|
|
150
|
+
kind: "integrity",
|
|
151
|
+
reason: `cannot read cached binary for verification: ${err instanceof Error ? err.message : String(err)}`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return { install: { binPath, catalogDir } };
|
|
155
|
+
}
|
|
156
|
+
if (opts.allowDownload === false) {
|
|
157
|
+
return {
|
|
158
|
+
kind: "network",
|
|
159
|
+
reason: "scanner not cached and downloads are disabled (KIT_NO_DOWNLOAD)",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const notice = opts.notice ?? ((m) => process.stderr.write(m + "\n"));
|
|
164
|
+
notice(`kit: downloading supply-chain scanner bumblebee v${BUMBLEBEE_VERSION} (one-time)…`);
|
|
165
|
+
await downloadAndInstall(target, root, opts.timeoutMs ?? 120_000);
|
|
166
|
+
return { install: { binPath, catalogDir } };
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
// A checksum mismatch is a potential tampering event — surface it distinctly
|
|
170
|
+
// (callers escalate to a hard failure) rather than as a routine "unavailable".
|
|
171
|
+
const isIntegrity = err instanceof IntegrityError;
|
|
172
|
+
return {
|
|
173
|
+
kind: isIntegrity ? "integrity" : "network",
|
|
174
|
+
reason: `${isIntegrity ? "integrity check failed" : "download failed"}: ${err instanceof Error ? err.message : String(err)}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async function downloadAndInstall(target, root, timeoutMs) {
|
|
179
|
+
const url = `${RELEASE_BASE_URL}/v${BUMBLEBEE_VERSION}/${target.assetName}`;
|
|
180
|
+
const controller = new AbortController();
|
|
181
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
182
|
+
let buf;
|
|
183
|
+
try {
|
|
184
|
+
const res = await fetch(url, { signal: controller.signal, redirect: "follow" });
|
|
185
|
+
if (!res.ok) {
|
|
186
|
+
throw new Error(`HTTP ${res.status} fetching ${url}`);
|
|
187
|
+
}
|
|
188
|
+
// Even though the checksum below is authoritative for integrity, refuse a
|
|
189
|
+
// redirect that downgraded us off HTTPS before trusting the body.
|
|
190
|
+
if (!res.url.startsWith("https:")) {
|
|
191
|
+
throw new Error(`refusing non-https download URL after redirects: ${res.url}`);
|
|
192
|
+
}
|
|
193
|
+
buf = Buffer.from(await res.arrayBuffer());
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
clearTimeout(timer);
|
|
197
|
+
}
|
|
198
|
+
const digest = sha256(buf);
|
|
199
|
+
if (digest !== target.checksum) {
|
|
200
|
+
throw new IntegrityError(`checksum mismatch for ${target.assetName}: expected ${target.checksum}, got ${digest}`);
|
|
201
|
+
}
|
|
202
|
+
// Stage inside the cache parent (same filesystem) so the final rename is
|
|
203
|
+
// atomic, then swap it into place. mkdtemp gives a random suffix to avoid a
|
|
204
|
+
// symlink race on a predictable staging path.
|
|
205
|
+
await mkdir(cacheParent(), { recursive: true });
|
|
206
|
+
const staging = await mkdtemp(join(cacheParent(), ".tmp-"));
|
|
207
|
+
try {
|
|
208
|
+
const tarPath = join(staging, target.assetName);
|
|
209
|
+
await writeFile(tarPath, buf);
|
|
210
|
+
// bumblebee tarballs extract flat: ./bumblebee, ./threat_intel/, LICENSE, README.md
|
|
211
|
+
await exec("tar", ["-xzf", tarPath, "-C", staging], { timeout: 60_000 });
|
|
212
|
+
const stagedBin = join(staging, "bumblebee");
|
|
213
|
+
const stagedCatalog = join(staging, "threat_intel");
|
|
214
|
+
if (!(await pathExists(stagedBin))) {
|
|
215
|
+
throw new Error("extracted archive is missing the bumblebee binary");
|
|
216
|
+
}
|
|
217
|
+
if (!(await pathExists(stagedCatalog))) {
|
|
218
|
+
throw new Error("extracted archive is missing threat_intel catalogs");
|
|
219
|
+
}
|
|
220
|
+
await chmod(stagedBin, 0o755);
|
|
221
|
+
await rm(tarPath, { force: true });
|
|
222
|
+
await rm(root, { recursive: true, force: true });
|
|
223
|
+
await rename(staging, root);
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
await rm(staging, { recursive: true, force: true }).catch(() => { });
|
|
227
|
+
throw err;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function str(rec, key) {
|
|
231
|
+
const v = rec[key];
|
|
232
|
+
return typeof v === "string" ? v : "";
|
|
233
|
+
}
|
|
234
|
+
function num(v) {
|
|
235
|
+
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Parse bumblebee NDJSON stdout into findings + summary.
|
|
239
|
+
* Blank or unparseable lines are ignored. Diagnostics (on stderr) are not seen
|
|
240
|
+
* here. bumblebee exits 0 even when findings are present, so callers must judge
|
|
241
|
+
* exposure from the parsed findings, never from the process exit code.
|
|
242
|
+
*/
|
|
243
|
+
export function parseScanOutput(stdout) {
|
|
244
|
+
const outcome = {
|
|
245
|
+
status: "unknown",
|
|
246
|
+
timedOut: false,
|
|
247
|
+
summarySeen: false,
|
|
248
|
+
findings: [],
|
|
249
|
+
packagesScanned: 0,
|
|
250
|
+
};
|
|
251
|
+
for (const line of stdout.split("\n")) {
|
|
252
|
+
const trimmed = line.trim();
|
|
253
|
+
if (!trimmed)
|
|
254
|
+
continue;
|
|
255
|
+
let rec;
|
|
256
|
+
try {
|
|
257
|
+
rec = JSON.parse(trimmed);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (rec.record_type === "finding") {
|
|
263
|
+
outcome.findings.push({
|
|
264
|
+
severity: str(rec, "severity") || "unknown",
|
|
265
|
+
catalogId: str(rec, "catalog_id"),
|
|
266
|
+
catalogName: str(rec, "catalog_name"),
|
|
267
|
+
ecosystem: str(rec, "ecosystem"),
|
|
268
|
+
packageName: str(rec, "package_name") || str(rec, "normalized_name"),
|
|
269
|
+
version: str(rec, "version"),
|
|
270
|
+
sourceFile: str(rec, "source_file"),
|
|
271
|
+
evidence: str(rec, "evidence"),
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
else if (rec.record_type === "scan_summary") {
|
|
275
|
+
outcome.summarySeen = true;
|
|
276
|
+
outcome.status = str(rec, "status") || "unknown";
|
|
277
|
+
outcome.timedOut = rec.timed_out === true;
|
|
278
|
+
const emitted = num(rec.package_records_emitted);
|
|
279
|
+
const suppressed = num(rec.package_records_suppressed);
|
|
280
|
+
const counts = rec.counts;
|
|
281
|
+
outcome.packagesScanned =
|
|
282
|
+
emitted + suppressed || num(counts?.package);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return outcome;
|
|
286
|
+
}
|
|
287
|
+
const SEVERITY_RANK = {
|
|
288
|
+
critical: 4,
|
|
289
|
+
high: 3,
|
|
290
|
+
medium: 2,
|
|
291
|
+
low: 1,
|
|
292
|
+
};
|
|
293
|
+
/**
|
|
294
|
+
* Highest-severity label among findings (preferring the original casing),
|
|
295
|
+
* or null when there are none.
|
|
296
|
+
*/
|
|
297
|
+
export function maxSeverity(findings) {
|
|
298
|
+
let best = null;
|
|
299
|
+
let bestRank = -1;
|
|
300
|
+
for (const f of findings) {
|
|
301
|
+
const rank = SEVERITY_RANK[f.severity.toLowerCase()] ?? 0;
|
|
302
|
+
if (rank > bestRank) {
|
|
303
|
+
bestRank = rank;
|
|
304
|
+
best = f.severity;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return best;
|
|
308
|
+
}
|
|
309
|
+
/** Default age (days) after which the bundled catalogs are considered stale. */
|
|
310
|
+
export const CATALOG_STALE_AFTER_DAYS = 60;
|
|
311
|
+
/** Pure staleness check: how old the newest catalog is, and whether it crosses the threshold. */
|
|
312
|
+
export function isCatalogStale(newestMtimeMs, nowMs, thresholdDays = CATALOG_STALE_AFTER_DAYS) {
|
|
313
|
+
const ageDays = Math.max(0, Math.floor((nowMs - newestMtimeMs) / 86_400_000));
|
|
314
|
+
return { stale: ageDays > thresholdDays, ageDays };
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Newest modification time (ms) among the *.json catalogs in `dir`, or null if
|
|
318
|
+
* none are found / the directory is unreadable. tar -xzf preserves the release
|
|
319
|
+
* file mtimes, so this reflects when the catalogs were authored upstream.
|
|
320
|
+
*/
|
|
321
|
+
export async function newestCatalogMtime(dir) {
|
|
322
|
+
let entries;
|
|
323
|
+
try {
|
|
324
|
+
entries = await readdir(dir);
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
let newest = null;
|
|
330
|
+
for (const name of entries) {
|
|
331
|
+
if (!name.endsWith(".json"))
|
|
332
|
+
continue;
|
|
333
|
+
try {
|
|
334
|
+
const s = await stat(join(dir, name));
|
|
335
|
+
if (newest === null || s.mtimeMs > newest)
|
|
336
|
+
newest = s.mtimeMs;
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// skip unreadable entries
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return newest;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Run a bumblebee scan in findings-only mode against the bundled catalogs.
|
|
346
|
+
* Returns the parsed outcome, or an `error` string on operational failure.
|
|
347
|
+
*/
|
|
348
|
+
export async function runScan(req) {
|
|
349
|
+
const args = [
|
|
350
|
+
"scan",
|
|
351
|
+
"-profile",
|
|
352
|
+
req.profile,
|
|
353
|
+
"-exposure-catalog",
|
|
354
|
+
req.install.catalogDir,
|
|
355
|
+
"-findings-only",
|
|
356
|
+
"-output",
|
|
357
|
+
"stdout",
|
|
358
|
+
"-max-duration",
|
|
359
|
+
req.maxDuration ?? "90s",
|
|
360
|
+
];
|
|
361
|
+
for (const root of req.roots) {
|
|
362
|
+
args.push("-root", root);
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
const { stdout } = await exec(req.install.binPath, args, {
|
|
366
|
+
timeout: req.timeoutMs ?? 120_000,
|
|
367
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
368
|
+
});
|
|
369
|
+
return { outcome: parseScanOutput(stdout) };
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
// bumblebee may exit non-zero on operational error; if it still produced a
|
|
373
|
+
// summary, the parsed output is authoritative.
|
|
374
|
+
if (err && typeof err === "object" && "stdout" in err) {
|
|
375
|
+
const outcome = parseScanOutput(String(err.stdout ?? ""));
|
|
376
|
+
if (outcome.summarySeen)
|
|
377
|
+
return { outcome };
|
|
378
|
+
}
|
|
379
|
+
return {
|
|
380
|
+
error: err instanceof Error ? err.message : String(err),
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
//# sourceMappingURL=bumblebee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bumblebee.js","sourceRoot":"","sources":["../src/bumblebee.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export interface CacheEntry<T = unknown> {
|
|
2
|
+
key: string;
|
|
3
|
+
value: T;
|
|
4
|
+
ttl?: number;
|
|
5
|
+
createdAt: string;
|
|
6
|
+
expiresAt?: string;
|
|
7
|
+
hits: number;
|
|
8
|
+
}
|
|
9
|
+
export interface CacheStats {
|
|
10
|
+
totalSize: number;
|
|
11
|
+
totalEntries: number;
|
|
12
|
+
hitRate: number;
|
|
13
|
+
evictions: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CacheConfig {
|
|
16
|
+
maxSize: number;
|
|
17
|
+
defaultTtl: number;
|
|
18
|
+
strategy: "lru" | "lfu" | "fifo";
|
|
19
|
+
}
|
|
20
|
+
export declare class CacheManager {
|
|
21
|
+
private cache;
|
|
22
|
+
private hits;
|
|
23
|
+
private misses;
|
|
24
|
+
private evictions;
|
|
25
|
+
private config;
|
|
26
|
+
constructor(config?: CacheConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Set cache entry.
|
|
29
|
+
*/
|
|
30
|
+
set<T>(key: string, value: T, ttl?: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get cache entry.
|
|
33
|
+
*/
|
|
34
|
+
get<T>(key: string): T | null;
|
|
35
|
+
/**
|
|
36
|
+
* Check if key exists.
|
|
37
|
+
*/
|
|
38
|
+
has(key: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Delete cache entry.
|
|
41
|
+
*/
|
|
42
|
+
delete(key: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Clear all cache entries.
|
|
45
|
+
*/
|
|
46
|
+
clear(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Invalidate entries by pattern.
|
|
49
|
+
*/
|
|
50
|
+
invalidatePattern(pattern: string): number;
|
|
51
|
+
/**
|
|
52
|
+
* Invalidate entries by prefix.
|
|
53
|
+
*/
|
|
54
|
+
invalidatePrefix(prefix: string): number;
|
|
55
|
+
/**
|
|
56
|
+
* Clear expired entries.
|
|
57
|
+
*/
|
|
58
|
+
cleanExpired(): number;
|
|
59
|
+
private evictEntry;
|
|
60
|
+
private findLRUKey;
|
|
61
|
+
private findLFUKey;
|
|
62
|
+
private findFIFOKey;
|
|
63
|
+
/**
|
|
64
|
+
* Get cache statistics.
|
|
65
|
+
*/
|
|
66
|
+
getStats(): CacheStats;
|
|
67
|
+
/**
|
|
68
|
+
* Get hit count.
|
|
69
|
+
*/
|
|
70
|
+
getHits(): number;
|
|
71
|
+
/**
|
|
72
|
+
* Get miss count.
|
|
73
|
+
*/
|
|
74
|
+
getMisses(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Get hit rate percentage.
|
|
77
|
+
*/
|
|
78
|
+
getHitRate(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Get all cache keys.
|
|
81
|
+
*/
|
|
82
|
+
getKeys(): string[];
|
|
83
|
+
/**
|
|
84
|
+
* Get cache entry details.
|
|
85
|
+
*/
|
|
86
|
+
getEntry<T>(key: string): CacheEntry<T> | null;
|
|
87
|
+
/**
|
|
88
|
+
* Get all entries.
|
|
89
|
+
*/
|
|
90
|
+
getAllEntries(): CacheEntry[];
|
|
91
|
+
/**
|
|
92
|
+
* Get size in bytes (rough estimate).
|
|
93
|
+
*/
|
|
94
|
+
getApproximateSize(): number;
|
|
95
|
+
getCacheMap(): Map<string, CacheEntry>;
|
|
96
|
+
getConfig(): CacheConfig;
|
|
97
|
+
}
|