palaryn 0.1.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 +716 -0
- package/dist/sdk/typescript/src/client.d.ts +71 -0
- package/dist/sdk/typescript/src/client.d.ts.map +1 -0
- package/dist/sdk/typescript/src/client.js +176 -0
- package/dist/sdk/typescript/src/client.js.map +1 -0
- package/dist/sdk/typescript/src/errors.d.ts +50 -0
- package/dist/sdk/typescript/src/errors.d.ts.map +1 -0
- package/dist/sdk/typescript/src/errors.js +103 -0
- package/dist/sdk/typescript/src/errors.js.map +1 -0
- package/dist/sdk/typescript/src/index.d.ts +4 -0
- package/dist/sdk/typescript/src/index.d.ts.map +1 -0
- package/dist/sdk/typescript/src/index.js +15 -0
- package/dist/sdk/typescript/src/index.js.map +1 -0
- package/dist/sdk/typescript/src/types.d.ts +101 -0
- package/dist/sdk/typescript/src/types.d.ts.map +1 -0
- package/dist/sdk/typescript/src/types.js +6 -0
- package/dist/sdk/typescript/src/types.js.map +1 -0
- package/dist/src/admin/index.d.ts +2 -0
- package/dist/src/admin/index.d.ts.map +1 -0
- package/dist/src/admin/index.js +6 -0
- package/dist/src/admin/index.js.map +1 -0
- package/dist/src/admin/routes.d.ts +5 -0
- package/dist/src/admin/routes.d.ts.map +1 -0
- package/dist/src/admin/routes.js +471 -0
- package/dist/src/admin/routes.js.map +1 -0
- package/dist/src/admin/templates.d.ts +51 -0
- package/dist/src/admin/templates.d.ts.map +1 -0
- package/dist/src/admin/templates.js +500 -0
- package/dist/src/admin/templates.js.map +1 -0
- package/dist/src/anomaly/detector.d.ts +141 -0
- package/dist/src/anomaly/detector.d.ts.map +1 -0
- package/dist/src/anomaly/detector.js +554 -0
- package/dist/src/anomaly/detector.js.map +1 -0
- package/dist/src/anomaly/index.d.ts +2 -0
- package/dist/src/anomaly/index.d.ts.map +1 -0
- package/dist/src/anomaly/index.js +7 -0
- package/dist/src/anomaly/index.js.map +1 -0
- package/dist/src/approval/manager.d.ts +147 -0
- package/dist/src/approval/manager.d.ts.map +1 -0
- package/dist/src/approval/manager.js +511 -0
- package/dist/src/approval/manager.js.map +1 -0
- package/dist/src/approval/webhook.d.ts +36 -0
- package/dist/src/approval/webhook.d.ts.map +1 -0
- package/dist/src/approval/webhook.js +135 -0
- package/dist/src/approval/webhook.js.map +1 -0
- package/dist/src/audit/logger.d.ts +70 -0
- package/dist/src/audit/logger.d.ts.map +1 -0
- package/dist/src/audit/logger.js +440 -0
- package/dist/src/audit/logger.js.map +1 -0
- package/dist/src/auth/index.d.ts +6 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +22 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/password.d.ts +3 -0
- package/dist/src/auth/password.d.ts.map +1 -0
- package/dist/src/auth/password.js +25 -0
- package/dist/src/auth/password.js.map +1 -0
- package/dist/src/auth/pkce.d.ts +13 -0
- package/dist/src/auth/pkce.d.ts.map +1 -0
- package/dist/src/auth/pkce.js +58 -0
- package/dist/src/auth/pkce.js.map +1 -0
- package/dist/src/auth/providers.d.ts +28 -0
- package/dist/src/auth/providers.d.ts.map +1 -0
- package/dist/src/auth/providers.js +198 -0
- package/dist/src/auth/providers.js.map +1 -0
- package/dist/src/auth/routes.d.ts +14 -0
- package/dist/src/auth/routes.d.ts.map +1 -0
- package/dist/src/auth/routes.js +431 -0
- package/dist/src/auth/routes.js.map +1 -0
- package/dist/src/auth/session.d.ts +24 -0
- package/dist/src/auth/session.d.ts.map +1 -0
- package/dist/src/auth/session.js +105 -0
- package/dist/src/auth/session.js.map +1 -0
- package/dist/src/billing/index.d.ts +7 -0
- package/dist/src/billing/index.d.ts.map +1 -0
- package/dist/src/billing/index.js +14 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/billing/plan-enforcer.d.ts +44 -0
- package/dist/src/billing/plan-enforcer.d.ts.map +1 -0
- package/dist/src/billing/plan-enforcer.js +110 -0
- package/dist/src/billing/plan-enforcer.js.map +1 -0
- package/dist/src/billing/routes.d.ts +15 -0
- package/dist/src/billing/routes.d.ts.map +1 -0
- package/dist/src/billing/routes.js +193 -0
- package/dist/src/billing/routes.js.map +1 -0
- package/dist/src/billing/stripe-client.d.ts +14 -0
- package/dist/src/billing/stripe-client.d.ts.map +1 -0
- package/dist/src/billing/stripe-client.js +51 -0
- package/dist/src/billing/stripe-client.js.map +1 -0
- package/dist/src/billing/webhook-handler.d.ts +19 -0
- package/dist/src/billing/webhook-handler.d.ts.map +1 -0
- package/dist/src/billing/webhook-handler.js +169 -0
- package/dist/src/billing/webhook-handler.js.map +1 -0
- package/dist/src/billing/webhook-routes.d.ts +5 -0
- package/dist/src/billing/webhook-routes.d.ts.map +1 -0
- package/dist/src/billing/webhook-routes.js +30 -0
- package/dist/src/billing/webhook-routes.js.map +1 -0
- package/dist/src/budget/manager.d.ts +95 -0
- package/dist/src/budget/manager.d.ts.map +1 -0
- package/dist/src/budget/manager.js +547 -0
- package/dist/src/budget/manager.js.map +1 -0
- package/dist/src/budget/usage-extractor.d.ts +38 -0
- package/dist/src/budget/usage-extractor.d.ts.map +1 -0
- package/dist/src/budget/usage-extractor.js +165 -0
- package/dist/src/budget/usage-extractor.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +115 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config/defaults.d.ts +3 -0
- package/dist/src/config/defaults.d.ts.map +1 -0
- package/dist/src/config/defaults.js +243 -0
- package/dist/src/config/defaults.js.map +1 -0
- package/dist/src/config/validate.d.ts +15 -0
- package/dist/src/config/validate.d.ts.map +1 -0
- package/dist/src/config/validate.js +105 -0
- package/dist/src/config/validate.js.map +1 -0
- package/dist/src/dlp/composite-scanner.d.ts +47 -0
- package/dist/src/dlp/composite-scanner.d.ts.map +1 -0
- package/dist/src/dlp/composite-scanner.js +186 -0
- package/dist/src/dlp/composite-scanner.js.map +1 -0
- package/dist/src/dlp/index.d.ts +10 -0
- package/dist/src/dlp/index.d.ts.map +1 -0
- package/dist/src/dlp/index.js +26 -0
- package/dist/src/dlp/index.js.map +1 -0
- package/dist/src/dlp/interfaces.d.ts +33 -0
- package/dist/src/dlp/interfaces.d.ts.map +1 -0
- package/dist/src/dlp/interfaces.js +3 -0
- package/dist/src/dlp/interfaces.js.map +1 -0
- package/dist/src/dlp/patterns.d.ts +9 -0
- package/dist/src/dlp/patterns.d.ts.map +1 -0
- package/dist/src/dlp/patterns.js +25 -0
- package/dist/src/dlp/patterns.js.map +1 -0
- package/dist/src/dlp/prompt-injection-backend.d.ts +68 -0
- package/dist/src/dlp/prompt-injection-backend.d.ts.map +1 -0
- package/dist/src/dlp/prompt-injection-backend.js +148 -0
- package/dist/src/dlp/prompt-injection-backend.js.map +1 -0
- package/dist/src/dlp/prompt-injection-patterns.d.ts +32 -0
- package/dist/src/dlp/prompt-injection-patterns.d.ts.map +1 -0
- package/dist/src/dlp/prompt-injection-patterns.js +290 -0
- package/dist/src/dlp/prompt-injection-patterns.js.map +1 -0
- package/dist/src/dlp/regex-backend.d.ts +32 -0
- package/dist/src/dlp/regex-backend.d.ts.map +1 -0
- package/dist/src/dlp/regex-backend.js +153 -0
- package/dist/src/dlp/regex-backend.js.map +1 -0
- package/dist/src/dlp/scanner.d.ts +122 -0
- package/dist/src/dlp/scanner.d.ts.map +1 -0
- package/dist/src/dlp/scanner.js +444 -0
- package/dist/src/dlp/scanner.js.map +1 -0
- package/dist/src/dlp/text-normalizer.d.ts +41 -0
- package/dist/src/dlp/text-normalizer.d.ts.map +1 -0
- package/dist/src/dlp/text-normalizer.js +203 -0
- package/dist/src/dlp/text-normalizer.js.map +1 -0
- package/dist/src/dlp/trufflehog-backend.d.ts +64 -0
- package/dist/src/dlp/trufflehog-backend.d.ts.map +1 -0
- package/dist/src/dlp/trufflehog-backend.js +151 -0
- package/dist/src/dlp/trufflehog-backend.js.map +1 -0
- package/dist/src/executor/http-executor.d.ts +25 -0
- package/dist/src/executor/http-executor.d.ts.map +1 -0
- package/dist/src/executor/http-executor.js +333 -0
- package/dist/src/executor/http-executor.js.map +1 -0
- package/dist/src/executor/index.d.ts +6 -0
- package/dist/src/executor/index.d.ts.map +1 -0
- package/dist/src/executor/index.js +12 -0
- package/dist/src/executor/index.js.map +1 -0
- package/dist/src/executor/interfaces.d.ts +11 -0
- package/dist/src/executor/interfaces.d.ts.map +1 -0
- package/dist/src/executor/interfaces.js +3 -0
- package/dist/src/executor/interfaces.js.map +1 -0
- package/dist/src/executor/noop-executor.d.ts +13 -0
- package/dist/src/executor/noop-executor.d.ts.map +1 -0
- package/dist/src/executor/noop-executor.js +21 -0
- package/dist/src/executor/noop-executor.js.map +1 -0
- package/dist/src/executor/registry.d.ts +30 -0
- package/dist/src/executor/registry.d.ts.map +1 -0
- package/dist/src/executor/registry.js +62 -0
- package/dist/src/executor/registry.js.map +1 -0
- package/dist/src/executor/slack-executor.d.ts +24 -0
- package/dist/src/executor/slack-executor.d.ts.map +1 -0
- package/dist/src/executor/slack-executor.js +147 -0
- package/dist/src/executor/slack-executor.js.map +1 -0
- package/dist/src/index.d.ts +25 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +74 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/auth-verifier.d.ts +23 -0
- package/dist/src/mcp/auth-verifier.d.ts.map +1 -0
- package/dist/src/mcp/auth-verifier.js +162 -0
- package/dist/src/mcp/auth-verifier.js.map +1 -0
- package/dist/src/mcp/bridge.d.ts +132 -0
- package/dist/src/mcp/bridge.d.ts.map +1 -0
- package/dist/src/mcp/bridge.js +734 -0
- package/dist/src/mcp/bridge.js.map +1 -0
- package/dist/src/mcp/http-transport.d.ts +32 -0
- package/dist/src/mcp/http-transport.d.ts.map +1 -0
- package/dist/src/mcp/http-transport.js +538 -0
- package/dist/src/mcp/http-transport.js.map +1 -0
- package/dist/src/mcp/index.d.ts +10 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +17 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/oauth-pages.d.ts +23 -0
- package/dist/src/mcp/oauth-pages.d.ts.map +1 -0
- package/dist/src/mcp/oauth-pages.js +121 -0
- package/dist/src/mcp/oauth-pages.js.map +1 -0
- package/dist/src/mcp/oauth-postgres-stores.d.ts +55 -0
- package/dist/src/mcp/oauth-postgres-stores.d.ts.map +1 -0
- package/dist/src/mcp/oauth-postgres-stores.js +226 -0
- package/dist/src/mcp/oauth-postgres-stores.js.map +1 -0
- package/dist/src/mcp/oauth-provider.d.ts +95 -0
- package/dist/src/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/src/mcp/oauth-provider.js +360 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -0
- package/dist/src/mcp/oauth-stores.d.ts +62 -0
- package/dist/src/mcp/oauth-stores.d.ts.map +1 -0
- package/dist/src/mcp/oauth-stores.js +154 -0
- package/dist/src/mcp/oauth-stores.js.map +1 -0
- package/dist/src/mcp/server.d.ts +18 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +51 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/metrics/collector.d.ts +106 -0
- package/dist/src/metrics/collector.d.ts.map +1 -0
- package/dist/src/metrics/collector.js +311 -0
- package/dist/src/metrics/collector.js.map +1 -0
- package/dist/src/metrics/index.d.ts +2 -0
- package/dist/src/metrics/index.d.ts.map +1 -0
- package/dist/src/metrics/index.js +6 -0
- package/dist/src/metrics/index.js.map +1 -0
- package/dist/src/middleware/auth.d.ts +77 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +720 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/middleware/session.d.ts +18 -0
- package/dist/src/middleware/session.d.ts.map +1 -0
- package/dist/src/middleware/session.js +67 -0
- package/dist/src/middleware/session.js.map +1 -0
- package/dist/src/middleware/validate.d.ts +3 -0
- package/dist/src/middleware/validate.d.ts.map +1 -0
- package/dist/src/middleware/validate.js +85 -0
- package/dist/src/middleware/validate.js.map +1 -0
- package/dist/src/policy/engine.d.ts +107 -0
- package/dist/src/policy/engine.d.ts.map +1 -0
- package/dist/src/policy/engine.js +646 -0
- package/dist/src/policy/engine.js.map +1 -0
- package/dist/src/policy/index.d.ts +3 -0
- package/dist/src/policy/index.d.ts.map +1 -0
- package/dist/src/policy/index.js +8 -0
- package/dist/src/policy/index.js.map +1 -0
- package/dist/src/policy/opa-engine.d.ts +176 -0
- package/dist/src/policy/opa-engine.d.ts.map +1 -0
- package/dist/src/policy/opa-engine.js +790 -0
- package/dist/src/policy/opa-engine.js.map +1 -0
- package/dist/src/proxy/forward-proxy.d.ts +30 -0
- package/dist/src/proxy/forward-proxy.d.ts.map +1 -0
- package/dist/src/proxy/forward-proxy.js +580 -0
- package/dist/src/proxy/forward-proxy.js.map +1 -0
- package/dist/src/proxy/index.d.ts +2 -0
- package/dist/src/proxy/index.d.ts.map +1 -0
- package/dist/src/proxy/index.js +8 -0
- package/dist/src/proxy/index.js.map +1 -0
- package/dist/src/ratelimit/limiter.d.ts +45 -0
- package/dist/src/ratelimit/limiter.d.ts.map +1 -0
- package/dist/src/ratelimit/limiter.js +158 -0
- package/dist/src/ratelimit/limiter.js.map +1 -0
- package/dist/src/replay/engine.d.ts +40 -0
- package/dist/src/replay/engine.d.ts.map +1 -0
- package/dist/src/replay/engine.js +106 -0
- package/dist/src/replay/engine.js.map +1 -0
- package/dist/src/replay/index.d.ts +2 -0
- package/dist/src/replay/index.d.ts.map +1 -0
- package/dist/src/replay/index.js +6 -0
- package/dist/src/replay/index.js.map +1 -0
- package/dist/src/saas/index.d.ts +2 -0
- package/dist/src/saas/index.d.ts.map +1 -0
- package/dist/src/saas/index.js +18 -0
- package/dist/src/saas/index.js.map +1 -0
- package/dist/src/saas/routes.d.ts +18 -0
- package/dist/src/saas/routes.d.ts.map +1 -0
- package/dist/src/saas/routes.js +1566 -0
- package/dist/src/saas/routes.js.map +1 -0
- package/dist/src/server/app.d.ts +44 -0
- package/dist/src/server/app.d.ts.map +1 -0
- package/dist/src/server/app.js +854 -0
- package/dist/src/server/app.js.map +1 -0
- package/dist/src/server/errors.d.ts +32 -0
- package/dist/src/server/errors.d.ts.map +1 -0
- package/dist/src/server/errors.js +39 -0
- package/dist/src/server/errors.js.map +1 -0
- package/dist/src/server/gateway.d.ts +165 -0
- package/dist/src/server/gateway.d.ts.map +1 -0
- package/dist/src/server/gateway.js +964 -0
- package/dist/src/server/gateway.js.map +1 -0
- package/dist/src/server/index.d.ts +2 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +295 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/logger.d.ts +33 -0
- package/dist/src/server/logger.d.ts.map +1 -0
- package/dist/src/server/logger.js +230 -0
- package/dist/src/server/logger.js.map +1 -0
- package/dist/src/server/stream-proxy.d.ts +32 -0
- package/dist/src/server/stream-proxy.d.ts.map +1 -0
- package/dist/src/server/stream-proxy.js +184 -0
- package/dist/src/server/stream-proxy.js.map +1 -0
- package/dist/src/storage/file-persistence.d.ts +48 -0
- package/dist/src/storage/file-persistence.d.ts.map +1 -0
- package/dist/src/storage/file-persistence.js +280 -0
- package/dist/src/storage/file-persistence.js.map +1 -0
- package/dist/src/storage/index.d.ts +5 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +21 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/interfaces.d.ts +237 -0
- package/dist/src/storage/interfaces.d.ts.map +1 -0
- package/dist/src/storage/interfaces.js +3 -0
- package/dist/src/storage/interfaces.js.map +1 -0
- package/dist/src/storage/memory.d.ts +162 -0
- package/dist/src/storage/memory.d.ts.map +1 -0
- package/dist/src/storage/memory.js +603 -0
- package/dist/src/storage/memory.js.map +1 -0
- package/dist/src/storage/postgres.d.ts +267 -0
- package/dist/src/storage/postgres.d.ts.map +1 -0
- package/dist/src/storage/postgres.js +1555 -0
- package/dist/src/storage/postgres.js.map +1 -0
- package/dist/src/storage/redis.d.ts +202 -0
- package/dist/src/storage/redis.d.ts.map +1 -0
- package/dist/src/storage/redis.js +629 -0
- package/dist/src/storage/redis.js.map +1 -0
- package/dist/src/tracing/index.d.ts +2 -0
- package/dist/src/tracing/index.d.ts.map +1 -0
- package/dist/src/tracing/index.js +6 -0
- package/dist/src/tracing/index.js.map +1 -0
- package/dist/src/tracing/provider.d.ts +43 -0
- package/dist/src/tracing/provider.d.ts.map +1 -0
- package/dist/src/tracing/provider.js +74 -0
- package/dist/src/tracing/provider.js.map +1 -0
- package/dist/src/trust/calculator.d.ts +54 -0
- package/dist/src/trust/calculator.d.ts.map +1 -0
- package/dist/src/trust/calculator.js +102 -0
- package/dist/src/trust/calculator.js.map +1 -0
- package/dist/src/trust/index.d.ts +2 -0
- package/dist/src/trust/index.d.ts.map +1 -0
- package/dist/src/trust/index.js +7 -0
- package/dist/src/trust/index.js.map +1 -0
- package/dist/src/types/budget.d.ts +30 -0
- package/dist/src/types/budget.d.ts.map +1 -0
- package/dist/src/types/budget.js +3 -0
- package/dist/src/types/budget.js.map +1 -0
- package/dist/src/types/config.d.ts +176 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +3 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/events.d.ts +24 -0
- package/dist/src/types/events.d.ts.map +1 -0
- package/dist/src/types/events.js +3 -0
- package/dist/src/types/events.js.map +1 -0
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +24 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/policy.d.ts +60 -0
- package/dist/src/types/policy.d.ts.map +1 -0
- package/dist/src/types/policy.js +3 -0
- package/dist/src/types/policy.js.map +1 -0
- package/dist/src/types/stripe-config.d.ts +12 -0
- package/dist/src/types/stripe-config.d.ts.map +1 -0
- package/dist/src/types/stripe-config.js +3 -0
- package/dist/src/types/stripe-config.js.map +1 -0
- package/dist/src/types/subscription.d.ts +24 -0
- package/dist/src/types/subscription.d.ts.map +1 -0
- package/dist/src/types/subscription.js +38 -0
- package/dist/src/types/subscription.js.map +1 -0
- package/dist/src/types/tool-call.d.ts +42 -0
- package/dist/src/types/tool-call.d.ts.map +1 -0
- package/dist/src/types/tool-call.js +3 -0
- package/dist/src/types/tool-call.js.map +1 -0
- package/dist/src/types/tool-result.d.ts +58 -0
- package/dist/src/types/tool-result.d.ts.map +1 -0
- package/dist/src/types/tool-result.js +3 -0
- package/dist/src/types/tool-result.js.map +1 -0
- package/dist/src/types/user.d.ts +101 -0
- package/dist/src/types/user.d.ts.map +1 -0
- package/dist/src/types/user.js +6 -0
- package/dist/src/types/user.js.map +1 -0
- package/dist/tests/integration/api.test.d.ts +2 -0
- package/dist/tests/integration/api.test.d.ts.map +1 -0
- package/dist/tests/integration/api.test.js +1199 -0
- package/dist/tests/integration/api.test.js.map +1 -0
- package/dist/tests/integration/proxy.test.d.ts +2 -0
- package/dist/tests/integration/proxy.test.d.ts.map +1 -0
- package/dist/tests/integration/proxy.test.js +251 -0
- package/dist/tests/integration/proxy.test.js.map +1 -0
- package/dist/tests/integration/storage.test.d.ts +16 -0
- package/dist/tests/integration/storage.test.d.ts.map +1 -0
- package/dist/tests/integration/storage.test.js +826 -0
- package/dist/tests/integration/storage.test.js.map +1 -0
- package/dist/tests/unit/admin.test.d.ts +2 -0
- package/dist/tests/unit/admin.test.d.ts.map +1 -0
- package/dist/tests/unit/admin.test.js +698 -0
- package/dist/tests/unit/admin.test.js.map +1 -0
- package/dist/tests/unit/anomaly-detector.test.d.ts +2 -0
- package/dist/tests/unit/anomaly-detector.test.d.ts.map +1 -0
- package/dist/tests/unit/anomaly-detector.test.js +903 -0
- package/dist/tests/unit/anomaly-detector.test.js.map +1 -0
- package/dist/tests/unit/approval-manager.test.d.ts +2 -0
- package/dist/tests/unit/approval-manager.test.d.ts.map +1 -0
- package/dist/tests/unit/approval-manager.test.js +528 -0
- package/dist/tests/unit/approval-manager.test.js.map +1 -0
- package/dist/tests/unit/approval-webhook.test.d.ts +2 -0
- package/dist/tests/unit/approval-webhook.test.d.ts.map +1 -0
- package/dist/tests/unit/approval-webhook.test.js +355 -0
- package/dist/tests/unit/approval-webhook.test.js.map +1 -0
- package/dist/tests/unit/audit-logger.test.d.ts +2 -0
- package/dist/tests/unit/audit-logger.test.d.ts.map +1 -0
- package/dist/tests/unit/audit-logger.test.js +635 -0
- package/dist/tests/unit/audit-logger.test.js.map +1 -0
- package/dist/tests/unit/auth-routes.test.d.ts +2 -0
- package/dist/tests/unit/auth-routes.test.d.ts.map +1 -0
- package/dist/tests/unit/auth-routes.test.js +281 -0
- package/dist/tests/unit/auth-routes.test.js.map +1 -0
- package/dist/tests/unit/auth.test.d.ts +2 -0
- package/dist/tests/unit/auth.test.d.ts.map +1 -0
- package/dist/tests/unit/auth.test.js +1382 -0
- package/dist/tests/unit/auth.test.js.map +1 -0
- package/dist/tests/unit/billing.test.d.ts +2 -0
- package/dist/tests/unit/billing.test.d.ts.map +1 -0
- package/dist/tests/unit/billing.test.js +579 -0
- package/dist/tests/unit/billing.test.js.map +1 -0
- package/dist/tests/unit/budget-manager.test.d.ts +2 -0
- package/dist/tests/unit/budget-manager.test.d.ts.map +1 -0
- package/dist/tests/unit/budget-manager.test.js +778 -0
- package/dist/tests/unit/budget-manager.test.js.map +1 -0
- package/dist/tests/unit/budget-race.test.d.ts +2 -0
- package/dist/tests/unit/budget-race.test.d.ts.map +1 -0
- package/dist/tests/unit/budget-race.test.js +58 -0
- package/dist/tests/unit/budget-race.test.js.map +1 -0
- package/dist/tests/unit/cli.test.d.ts +2 -0
- package/dist/tests/unit/cli.test.d.ts.map +1 -0
- package/dist/tests/unit/cli.test.js +93 -0
- package/dist/tests/unit/cli.test.js.map +1 -0
- package/dist/tests/unit/concurrency.test.d.ts +2 -0
- package/dist/tests/unit/concurrency.test.d.ts.map +1 -0
- package/dist/tests/unit/concurrency.test.js +1270 -0
- package/dist/tests/unit/concurrency.test.js.map +1 -0
- package/dist/tests/unit/config-validate.test.d.ts +2 -0
- package/dist/tests/unit/config-validate.test.d.ts.map +1 -0
- package/dist/tests/unit/config-validate.test.js +230 -0
- package/dist/tests/unit/config-validate.test.js.map +1 -0
- package/dist/tests/unit/defaults.test.d.ts +2 -0
- package/dist/tests/unit/defaults.test.d.ts.map +1 -0
- package/dist/tests/unit/defaults.test.js +364 -0
- package/dist/tests/unit/defaults.test.js.map +1 -0
- package/dist/tests/unit/dlp-backends.test.d.ts +2 -0
- package/dist/tests/unit/dlp-backends.test.d.ts.map +1 -0
- package/dist/tests/unit/dlp-backends.test.js +563 -0
- package/dist/tests/unit/dlp-backends.test.js.map +1 -0
- package/dist/tests/unit/dlp-scanner.test.d.ts +2 -0
- package/dist/tests/unit/dlp-scanner.test.d.ts.map +1 -0
- package/dist/tests/unit/dlp-scanner.test.js +739 -0
- package/dist/tests/unit/dlp-scanner.test.js.map +1 -0
- package/dist/tests/unit/error-responses.test.d.ts +2 -0
- package/dist/tests/unit/error-responses.test.d.ts.map +1 -0
- package/dist/tests/unit/error-responses.test.js +101 -0
- package/dist/tests/unit/error-responses.test.js.map +1 -0
- package/dist/tests/unit/executor-registry.test.d.ts +2 -0
- package/dist/tests/unit/executor-registry.test.d.ts.map +1 -0
- package/dist/tests/unit/executor-registry.test.js +390 -0
- package/dist/tests/unit/executor-registry.test.js.map +1 -0
- package/dist/tests/unit/forward-proxy.test.d.ts +2 -0
- package/dist/tests/unit/forward-proxy.test.d.ts.map +1 -0
- package/dist/tests/unit/forward-proxy.test.js +621 -0
- package/dist/tests/unit/forward-proxy.test.js.map +1 -0
- package/dist/tests/unit/gateway-features.test.d.ts +2 -0
- package/dist/tests/unit/gateway-features.test.d.ts.map +1 -0
- package/dist/tests/unit/gateway-features.test.js +753 -0
- package/dist/tests/unit/gateway-features.test.js.map +1 -0
- package/dist/tests/unit/http-executor.test.d.ts +2 -0
- package/dist/tests/unit/http-executor.test.d.ts.map +1 -0
- package/dist/tests/unit/http-executor.test.js +310 -0
- package/dist/tests/unit/http-executor.test.js.map +1 -0
- package/dist/tests/unit/mcp-bridge.test.d.ts +2 -0
- package/dist/tests/unit/mcp-bridge.test.d.ts.map +1 -0
- package/dist/tests/unit/mcp-bridge.test.js +1136 -0
- package/dist/tests/unit/mcp-bridge.test.js.map +1 -0
- package/dist/tests/unit/mcp-http-transport.test.d.ts +2 -0
- package/dist/tests/unit/mcp-http-transport.test.d.ts.map +1 -0
- package/dist/tests/unit/mcp-http-transport.test.js +899 -0
- package/dist/tests/unit/mcp-http-transport.test.js.map +1 -0
- package/dist/tests/unit/mcp-oauth.test.d.ts +2 -0
- package/dist/tests/unit/mcp-oauth.test.d.ts.map +1 -0
- package/dist/tests/unit/mcp-oauth.test.js +759 -0
- package/dist/tests/unit/mcp-oauth.test.js.map +1 -0
- package/dist/tests/unit/mcp-server.test.d.ts +15 -0
- package/dist/tests/unit/mcp-server.test.d.ts.map +1 -0
- package/dist/tests/unit/mcp-server.test.js +158 -0
- package/dist/tests/unit/mcp-server.test.js.map +1 -0
- package/dist/tests/unit/metrics.test.d.ts +2 -0
- package/dist/tests/unit/metrics.test.d.ts.map +1 -0
- package/dist/tests/unit/metrics.test.js +208 -0
- package/dist/tests/unit/metrics.test.js.map +1 -0
- package/dist/tests/unit/oauth.test.d.ts +2 -0
- package/dist/tests/unit/oauth.test.d.ts.map +1 -0
- package/dist/tests/unit/oauth.test.js +281 -0
- package/dist/tests/unit/oauth.test.js.map +1 -0
- package/dist/tests/unit/opa-circuit-breaker.test.d.ts +2 -0
- package/dist/tests/unit/opa-circuit-breaker.test.d.ts.map +1 -0
- package/dist/tests/unit/opa-circuit-breaker.test.js +297 -0
- package/dist/tests/unit/opa-circuit-breaker.test.js.map +1 -0
- package/dist/tests/unit/opa-engine.test.d.ts +2 -0
- package/dist/tests/unit/opa-engine.test.d.ts.map +1 -0
- package/dist/tests/unit/opa-engine.test.js +1813 -0
- package/dist/tests/unit/opa-engine.test.js.map +1 -0
- package/dist/tests/unit/pipeline-timing.test.d.ts +2 -0
- package/dist/tests/unit/pipeline-timing.test.d.ts.map +1 -0
- package/dist/tests/unit/pipeline-timing.test.js +528 -0
- package/dist/tests/unit/pipeline-timing.test.js.map +1 -0
- package/dist/tests/unit/policy-engine.test.d.ts +2 -0
- package/dist/tests/unit/policy-engine.test.d.ts.map +1 -0
- package/dist/tests/unit/policy-engine.test.js +1345 -0
- package/dist/tests/unit/policy-engine.test.js.map +1 -0
- package/dist/tests/unit/policy-store.test.d.ts +2 -0
- package/dist/tests/unit/policy-store.test.d.ts.map +1 -0
- package/dist/tests/unit/policy-store.test.js +60 -0
- package/dist/tests/unit/policy-store.test.js.map +1 -0
- package/dist/tests/unit/postgres-storage.test.d.ts +2 -0
- package/dist/tests/unit/postgres-storage.test.d.ts.map +1 -0
- package/dist/tests/unit/postgres-storage.test.js +614 -0
- package/dist/tests/unit/postgres-storage.test.js.map +1 -0
- package/dist/tests/unit/prompt-injection-backend.test.d.ts +2 -0
- package/dist/tests/unit/prompt-injection-backend.test.d.ts.map +1 -0
- package/dist/tests/unit/prompt-injection-backend.test.js +621 -0
- package/dist/tests/unit/prompt-injection-backend.test.js.map +1 -0
- package/dist/tests/unit/proxy-hardening.test.d.ts +2 -0
- package/dist/tests/unit/proxy-hardening.test.d.ts.map +1 -0
- package/dist/tests/unit/proxy-hardening.test.js +166 -0
- package/dist/tests/unit/proxy-hardening.test.js.map +1 -0
- package/dist/tests/unit/rate-limiter.test.d.ts +2 -0
- package/dist/tests/unit/rate-limiter.test.d.ts.map +1 -0
- package/dist/tests/unit/rate-limiter.test.js +443 -0
- package/dist/tests/unit/rate-limiter.test.js.map +1 -0
- package/dist/tests/unit/redis-storage.test.d.ts +2 -0
- package/dist/tests/unit/redis-storage.test.d.ts.map +1 -0
- package/dist/tests/unit/redis-storage.test.js +766 -0
- package/dist/tests/unit/redis-storage.test.js.map +1 -0
- package/dist/tests/unit/replay-engine.test.d.ts +2 -0
- package/dist/tests/unit/replay-engine.test.d.ts.map +1 -0
- package/dist/tests/unit/replay-engine.test.js +371 -0
- package/dist/tests/unit/replay-engine.test.js.map +1 -0
- package/dist/tests/unit/saas-routes.test.d.ts +2 -0
- package/dist/tests/unit/saas-routes.test.d.ts.map +1 -0
- package/dist/tests/unit/saas-routes.test.js +1399 -0
- package/dist/tests/unit/saas-routes.test.js.map +1 -0
- package/dist/tests/unit/session.test.d.ts +2 -0
- package/dist/tests/unit/session.test.d.ts.map +1 -0
- package/dist/tests/unit/session.test.js +532 -0
- package/dist/tests/unit/session.test.js.map +1 -0
- package/dist/tests/unit/slack-executor.test.d.ts +2 -0
- package/dist/tests/unit/slack-executor.test.d.ts.map +1 -0
- package/dist/tests/unit/slack-executor.test.js +209 -0
- package/dist/tests/unit/slack-executor.test.js.map +1 -0
- package/dist/tests/unit/storage-hardening.test.d.ts +2 -0
- package/dist/tests/unit/storage-hardening.test.d.ts.map +1 -0
- package/dist/tests/unit/storage-hardening.test.js +165 -0
- package/dist/tests/unit/storage-hardening.test.js.map +1 -0
- package/dist/tests/unit/storage.test.d.ts +2 -0
- package/dist/tests/unit/storage.test.d.ts.map +1 -0
- package/dist/tests/unit/storage.test.js +698 -0
- package/dist/tests/unit/storage.test.js.map +1 -0
- package/dist/tests/unit/text-normalizer.test.d.ts +2 -0
- package/dist/tests/unit/text-normalizer.test.d.ts.map +1 -0
- package/dist/tests/unit/text-normalizer.test.js +229 -0
- package/dist/tests/unit/text-normalizer.test.js.map +1 -0
- package/dist/tests/unit/tracing.test.d.ts +2 -0
- package/dist/tests/unit/tracing.test.d.ts.map +1 -0
- package/dist/tests/unit/tracing.test.js +611 -0
- package/dist/tests/unit/tracing.test.js.map +1 -0
- package/dist/tests/unit/trust-calculator.test.d.ts +2 -0
- package/dist/tests/unit/trust-calculator.test.d.ts.map +1 -0
- package/dist/tests/unit/trust-calculator.test.js +497 -0
- package/dist/tests/unit/trust-calculator.test.js.map +1 -0
- package/dist/tests/unit/ts-sdk.test.d.ts +2 -0
- package/dist/tests/unit/ts-sdk.test.d.ts.map +1 -0
- package/dist/tests/unit/ts-sdk.test.js +421 -0
- package/dist/tests/unit/ts-sdk.test.js.map +1 -0
- package/dist/tests/unit/usage-extractor-llm.test.d.ts +2 -0
- package/dist/tests/unit/usage-extractor-llm.test.d.ts.map +1 -0
- package/dist/tests/unit/usage-extractor-llm.test.js +139 -0
- package/dist/tests/unit/usage-extractor-llm.test.js.map +1 -0
- package/dist/tests/unit/usage-extractor.test.d.ts +2 -0
- package/dist/tests/unit/usage-extractor.test.d.ts.map +1 -0
- package/dist/tests/unit/usage-extractor.test.js +271 -0
- package/dist/tests/unit/usage-extractor.test.js.map +1 -0
- package/dist/tests/unit/user-stores.test.d.ts +2 -0
- package/dist/tests/unit/user-stores.test.d.ts.map +1 -0
- package/dist/tests/unit/user-stores.test.js +687 -0
- package/dist/tests/unit/user-stores.test.js.map +1 -0
- package/dist/tests/unit/validate.test.d.ts +2 -0
- package/dist/tests/unit/validate.test.d.ts.map +1 -0
- package/dist/tests/unit/validate.test.js +545 -0
- package/dist/tests/unit/validate.test.js.map +1 -0
- package/package.json +86 -0
- package/policy-packs/README.md +42 -0
- package/policy-packs/default.yaml +46 -0
- package/policy-packs/dev_fast.yaml +54 -0
- package/policy-packs/prod_strict.yaml +83 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DLPScanner = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const patterns_1 = require("./patterns");
|
|
6
|
+
/** Maximum recursion depth to guard against circular or deeply nested structures. */
|
|
7
|
+
const MAX_SCAN_DEPTH = 32;
|
|
8
|
+
/**
|
|
9
|
+
* DLPScanner detects secrets and PII in tool call arguments and outputs,
|
|
10
|
+
* and applies configurable redaction strategies (mask, hash, drop, tokenize).
|
|
11
|
+
*/
|
|
12
|
+
class DLPScanner {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Main scan function -- recursively scans an object for secrets and PII.
|
|
18
|
+
*
|
|
19
|
+
* @param data - The data to scan (object, array, string, or primitive).
|
|
20
|
+
* @param basePath - Dot-notation prefix for paths within the data structure.
|
|
21
|
+
* @returns A DLPReport describing all detections, suggested redactions, and overall severity.
|
|
22
|
+
*/
|
|
23
|
+
scan(data, basePath = '') {
|
|
24
|
+
// If DLP is disabled, return an empty report immediately
|
|
25
|
+
if (!this.config.enabled) {
|
|
26
|
+
return {
|
|
27
|
+
detected: [],
|
|
28
|
+
redactions: [],
|
|
29
|
+
severity: 'low',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const detected = [];
|
|
33
|
+
const redactions = [];
|
|
34
|
+
this.scanObject(data, basePath, detected, redactions, 0);
|
|
35
|
+
// Deduplicate detection names while preserving order
|
|
36
|
+
const uniqueDetected = [...new Set(detected)];
|
|
37
|
+
const severity = this.calculateSeverity(detected);
|
|
38
|
+
return {
|
|
39
|
+
detected: uniqueDetected,
|
|
40
|
+
redactions,
|
|
41
|
+
severity,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Scan a single string value for secrets and PII patterns.
|
|
46
|
+
*
|
|
47
|
+
* Every regex with the /g flag has its lastIndex reset before and after
|
|
48
|
+
* testing to avoid state leaking between calls.
|
|
49
|
+
*/
|
|
50
|
+
scanString(value, path) {
|
|
51
|
+
const detected = [];
|
|
52
|
+
const redactions = [];
|
|
53
|
+
if (this.config.secrets_detection) {
|
|
54
|
+
for (const pattern of patterns_1.SECRET_PATTERNS) {
|
|
55
|
+
// Reset before use to ensure a clean match
|
|
56
|
+
pattern.pattern.lastIndex = 0;
|
|
57
|
+
if (pattern.pattern.test(value)) {
|
|
58
|
+
// Extract the first match for masked preview
|
|
59
|
+
pattern.pattern.lastIndex = 0;
|
|
60
|
+
const match = pattern.pattern.exec(value);
|
|
61
|
+
detected.push(pattern.name);
|
|
62
|
+
redactions.push({
|
|
63
|
+
path,
|
|
64
|
+
method: this.config.default_redaction_method,
|
|
65
|
+
original_type: pattern.name,
|
|
66
|
+
masked_preview: match ? DLPScanner.maskValue(match[0]) : undefined,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Reset after use so the next invocation starts fresh
|
|
70
|
+
pattern.pattern.lastIndex = 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (this.config.pii_detection) {
|
|
74
|
+
for (const pattern of patterns_1.PII_PATTERNS) {
|
|
75
|
+
pattern.pattern.lastIndex = 0;
|
|
76
|
+
if (pattern.pattern.test(value)) {
|
|
77
|
+
pattern.pattern.lastIndex = 0;
|
|
78
|
+
const match = pattern.pattern.exec(value);
|
|
79
|
+
detected.push(pattern.name);
|
|
80
|
+
redactions.push({
|
|
81
|
+
path,
|
|
82
|
+
method: this.config.default_redaction_method,
|
|
83
|
+
original_type: pattern.name,
|
|
84
|
+
masked_preview: match ? DLPScanner.maskValue(match[0]) : undefined,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
pattern.pattern.lastIndex = 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { detected, redactions };
|
|
91
|
+
}
|
|
92
|
+
/** Mask a matched value, keeping first 3 and last 3 chars visible. */
|
|
93
|
+
static maskValue(value) {
|
|
94
|
+
if (value.length <= 8)
|
|
95
|
+
return value.slice(0, 2) + '***' + value.slice(-2);
|
|
96
|
+
return value.slice(0, 3) + '***' + value.slice(-3);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Recursively walk an unknown value, scanning every string leaf.
|
|
100
|
+
*
|
|
101
|
+
* A depth limit prevents stack overflow on circular or extremely deep structures.
|
|
102
|
+
*/
|
|
103
|
+
scanObject(obj, path, detected, redactions, depth) {
|
|
104
|
+
// Guard against circular references / deeply nested objects
|
|
105
|
+
if (depth > MAX_SCAN_DEPTH) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (obj === null || obj === undefined) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (typeof obj === 'string') {
|
|
112
|
+
const result = this.scanString(obj, path);
|
|
113
|
+
detected.push(...result.detected);
|
|
114
|
+
redactions.push(...result.redactions);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (Array.isArray(obj)) {
|
|
118
|
+
for (let index = 0; index < obj.length; index++) {
|
|
119
|
+
const childPath = path ? `${path}[${index}]` : `[${index}]`;
|
|
120
|
+
this.scanObject(obj[index], childPath, detected, redactions, depth + 1);
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (typeof obj === 'object') {
|
|
125
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
126
|
+
const childPath = path ? `${path}.${key}` : key;
|
|
127
|
+
this.scanObject(value, childPath, detected, redactions, depth + 1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Non-string primitives (number, boolean, bigint, symbol, function) are ignored.
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Apply a single redaction method to a string value.
|
|
134
|
+
*
|
|
135
|
+
* - `mask` -- Keep the first 4 characters, replace the rest with 'x' (capped at 20 x's).
|
|
136
|
+
* - `hash` -- SHA-256 hash prefix (16 hex chars) with a HASH: prefix.
|
|
137
|
+
* - `drop` -- Replace entirely with `[REDACTED]`.
|
|
138
|
+
* - `tokenize` -- Replace with a deterministic placeholder token derived from MD5.
|
|
139
|
+
*/
|
|
140
|
+
static redact(value, method) {
|
|
141
|
+
switch (method) {
|
|
142
|
+
case 'mask':
|
|
143
|
+
if (value.length <= 4)
|
|
144
|
+
return 'xxxx';
|
|
145
|
+
return value.slice(0, 4) + 'x'.repeat(Math.min(value.length - 4, 20));
|
|
146
|
+
case 'hash':
|
|
147
|
+
return 'HASH:' + (0, crypto_1.createHash)('sha256').update(value).digest('hex').slice(0, 16);
|
|
148
|
+
case 'drop':
|
|
149
|
+
return '[REDACTED]';
|
|
150
|
+
case 'tokenize':
|
|
151
|
+
return '{{REDACTED_' + (0, crypto_1.createHash)('sha256').update(value).digest('hex').slice(0, 16) + '}}';
|
|
152
|
+
default:
|
|
153
|
+
return '[REDACTED]';
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Apply a list of redactions to a data structure.
|
|
158
|
+
*
|
|
159
|
+
* Returns a deep clone of `data` with every path referenced in `redactions`
|
|
160
|
+
* replaced by the redacted version of the string found at that path.
|
|
161
|
+
*
|
|
162
|
+
* Paths use lodash-style dot/bracket notation:
|
|
163
|
+
* - `"args.headers.Authorization"` -> obj.args.headers.Authorization
|
|
164
|
+
* - `"items[0].value"` -> obj.items[0].value
|
|
165
|
+
*
|
|
166
|
+
* If a path cannot be resolved (e.g. the structure was mutated), the
|
|
167
|
+
* redaction is silently skipped.
|
|
168
|
+
*/
|
|
169
|
+
applyRedactions(data, redactions) {
|
|
170
|
+
if (redactions.length === 0) {
|
|
171
|
+
return data;
|
|
172
|
+
}
|
|
173
|
+
// Deep clone to avoid mutating the original data
|
|
174
|
+
const cloned = DLPScanner.deepClone(data);
|
|
175
|
+
for (const redaction of redactions) {
|
|
176
|
+
this.applyRedactionAtPath(cloned, redaction.path, redaction.method);
|
|
177
|
+
}
|
|
178
|
+
return cloned;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Navigate to `path` inside `root` and replace the leaf string value
|
|
182
|
+
* with its redacted form.
|
|
183
|
+
*/
|
|
184
|
+
applyRedactionAtPath(root, path, method) {
|
|
185
|
+
const segments = DLPScanner.parsePath(path);
|
|
186
|
+
if (segments.length === 0) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Walk to the parent of the target
|
|
190
|
+
let current = root;
|
|
191
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
192
|
+
current = DLPScanner.getChild(current, segments[i]);
|
|
193
|
+
if (current === null || current === undefined) {
|
|
194
|
+
return; // path not resolvable
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const lastSegment = segments[segments.length - 1];
|
|
198
|
+
const leafValue = DLPScanner.getChild(current, lastSegment);
|
|
199
|
+
if (typeof leafValue !== 'string') {
|
|
200
|
+
return; // nothing to redact
|
|
201
|
+
}
|
|
202
|
+
// Find all matching patterns in the leaf string and redact them
|
|
203
|
+
const redacted = this.redactMatchesInString(leafValue, method);
|
|
204
|
+
DLPScanner.setChild(current, lastSegment, redacted);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Redact all pattern matches within a string, replacing each match occurrence
|
|
208
|
+
* with the appropriate redacted form. Non-matching portions of the string are
|
|
209
|
+
* preserved. If no matches are found, the entire string is redacted as a
|
|
210
|
+
* fallback (e.g. when the string itself is the sensitive value).
|
|
211
|
+
*/
|
|
212
|
+
redactMatchesInString(value, method) {
|
|
213
|
+
// Collect all match ranges across all enabled pattern sets
|
|
214
|
+
const allPatterns = [];
|
|
215
|
+
if (this.config.secrets_detection) {
|
|
216
|
+
for (const p of patterns_1.SECRET_PATTERNS) {
|
|
217
|
+
allPatterns.push(p.pattern);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (this.config.pii_detection) {
|
|
221
|
+
for (const p of patterns_1.PII_PATTERNS) {
|
|
222
|
+
allPatterns.push(p.pattern);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const matches = [];
|
|
226
|
+
for (const regex of allPatterns) {
|
|
227
|
+
regex.lastIndex = 0;
|
|
228
|
+
let m;
|
|
229
|
+
while ((m = regex.exec(value)) !== null) {
|
|
230
|
+
matches.push({ start: m.index, end: m.index + m[0].length, text: m[0] });
|
|
231
|
+
// Prevent infinite loops on zero-length matches
|
|
232
|
+
if (m[0].length === 0) {
|
|
233
|
+
regex.lastIndex++;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
regex.lastIndex = 0;
|
|
237
|
+
}
|
|
238
|
+
if (matches.length === 0) {
|
|
239
|
+
// No specific matches found; redact the entire string as a fallback
|
|
240
|
+
return DLPScanner.redact(value, method);
|
|
241
|
+
}
|
|
242
|
+
// Sort matches by start position, then by length descending (prefer longer matches)
|
|
243
|
+
matches.sort((a, b) => a.start - b.start || b.end - a.end);
|
|
244
|
+
// Merge overlapping ranges and build the redacted string
|
|
245
|
+
let result = '';
|
|
246
|
+
let cursor = 0;
|
|
247
|
+
for (const match of matches) {
|
|
248
|
+
// Skip matches that overlap with already-processed ranges
|
|
249
|
+
if (match.start < cursor) {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
// Append the non-sensitive text before this match
|
|
253
|
+
result += value.slice(cursor, match.start);
|
|
254
|
+
// Append the redacted match
|
|
255
|
+
result += DLPScanner.redact(match.text, method);
|
|
256
|
+
cursor = match.end;
|
|
257
|
+
}
|
|
258
|
+
// Append any remaining text after the last match
|
|
259
|
+
result += value.slice(cursor);
|
|
260
|
+
return result;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Parse a lodash-style path string into an array of segments.
|
|
264
|
+
*
|
|
265
|
+
* Examples:
|
|
266
|
+
* `"args.headers.Authorization"` -> `["args", "headers", "Authorization"]`
|
|
267
|
+
* `"items[0].value"` -> `["items", "0", "value"]`
|
|
268
|
+
* `"[0]"` -> `["0"]`
|
|
269
|
+
*/
|
|
270
|
+
static parsePath(path) {
|
|
271
|
+
if (!path)
|
|
272
|
+
return [];
|
|
273
|
+
const segments = [];
|
|
274
|
+
let current = '';
|
|
275
|
+
for (let i = 0; i < path.length; i++) {
|
|
276
|
+
const char = path[i];
|
|
277
|
+
if (char === '.') {
|
|
278
|
+
if (current) {
|
|
279
|
+
segments.push(current);
|
|
280
|
+
current = '';
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else if (char === '[') {
|
|
284
|
+
if (current) {
|
|
285
|
+
segments.push(current);
|
|
286
|
+
current = '';
|
|
287
|
+
}
|
|
288
|
+
// Read until closing bracket
|
|
289
|
+
const closingIndex = path.indexOf(']', i + 1);
|
|
290
|
+
if (closingIndex === -1) {
|
|
291
|
+
// Malformed path -- treat rest as a single segment
|
|
292
|
+
current = path.slice(i);
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
segments.push(path.slice(i + 1, closingIndex));
|
|
296
|
+
i = closingIndex; // the loop will increment past ']'
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
current += char;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (current) {
|
|
303
|
+
segments.push(current);
|
|
304
|
+
}
|
|
305
|
+
return segments;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get a child value from an object or array given a single path segment.
|
|
309
|
+
*/
|
|
310
|
+
static getChild(obj, segment) {
|
|
311
|
+
if (obj === null || obj === undefined)
|
|
312
|
+
return undefined;
|
|
313
|
+
if (Array.isArray(obj)) {
|
|
314
|
+
const index = parseInt(segment, 10);
|
|
315
|
+
if (Number.isNaN(index))
|
|
316
|
+
return undefined;
|
|
317
|
+
return obj[index];
|
|
318
|
+
}
|
|
319
|
+
if (typeof obj === 'object') {
|
|
320
|
+
return obj[segment];
|
|
321
|
+
}
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Set a child value on an object or array given a single path segment.
|
|
326
|
+
*/
|
|
327
|
+
static setChild(obj, segment, value) {
|
|
328
|
+
if (obj === null || obj === undefined)
|
|
329
|
+
return;
|
|
330
|
+
if (Array.isArray(obj)) {
|
|
331
|
+
const index = parseInt(segment, 10);
|
|
332
|
+
if (!Number.isNaN(index) && index >= 0 && index < obj.length) {
|
|
333
|
+
obj[index] = value;
|
|
334
|
+
}
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
if (typeof obj === 'object') {
|
|
338
|
+
obj[segment] = value;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Deep clone a value using structured clone semantics.
|
|
343
|
+
*
|
|
344
|
+
* Falls back to JSON round-trip for environments where structuredClone is
|
|
345
|
+
* unavailable. Handles primitives, plain objects, arrays, and null/undefined.
|
|
346
|
+
*/
|
|
347
|
+
static deepClone(data) {
|
|
348
|
+
if (data === null || data === undefined)
|
|
349
|
+
return data;
|
|
350
|
+
if (typeof data !== 'object')
|
|
351
|
+
return data;
|
|
352
|
+
// structuredClone is available in Node.js >= 17
|
|
353
|
+
if (typeof structuredClone === 'function') {
|
|
354
|
+
try {
|
|
355
|
+
return structuredClone(data);
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
// Fall through to JSON-based clone if structuredClone fails
|
|
359
|
+
// (e.g. on functions or symbols in the data)
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
try {
|
|
363
|
+
return JSON.parse(JSON.stringify(data));
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// If JSON serialization fails (circular refs), do a manual shallow-ish clone
|
|
367
|
+
return data;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Determine the highest severity among all detected pattern names.
|
|
372
|
+
*
|
|
373
|
+
* Checks both SECRET_PATTERNS and PII_PATTERNS for each detection name
|
|
374
|
+
* and returns the highest severity found. Defaults to 'low' when no
|
|
375
|
+
* detections are present or none match a known pattern.
|
|
376
|
+
*/
|
|
377
|
+
calculateSeverity(detected) {
|
|
378
|
+
if (detected.length === 0)
|
|
379
|
+
return 'low';
|
|
380
|
+
const allPatterns = [...patterns_1.SECRET_PATTERNS, ...patterns_1.PII_PATTERNS];
|
|
381
|
+
// Build a lookup from pattern name to severity
|
|
382
|
+
const severityMap = new Map();
|
|
383
|
+
for (const p of allPatterns) {
|
|
384
|
+
severityMap.set(p.name, p.severity);
|
|
385
|
+
}
|
|
386
|
+
const severityRank = {
|
|
387
|
+
low: 0,
|
|
388
|
+
medium: 1,
|
|
389
|
+
high: 2,
|
|
390
|
+
};
|
|
391
|
+
let highest = 'low';
|
|
392
|
+
for (const name of detected) {
|
|
393
|
+
const sev = severityMap.get(name);
|
|
394
|
+
if (sev && severityRank[sev] > severityRank[highest]) {
|
|
395
|
+
highest = sev;
|
|
396
|
+
}
|
|
397
|
+
// Short-circuit: can't get higher than 'high'
|
|
398
|
+
if (highest === 'high')
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
return highest;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Calculate the Shannon entropy of a string.
|
|
405
|
+
*
|
|
406
|
+
* High-entropy strings (random-looking) are more likely to be secrets,
|
|
407
|
+
* API keys, or tokens even if they don't match a known pattern.
|
|
408
|
+
*
|
|
409
|
+
* @returns Entropy in bits per character (0 to ~log2(charset_size)).
|
|
410
|
+
*/
|
|
411
|
+
static calculateEntropy(str) {
|
|
412
|
+
if (str.length === 0)
|
|
413
|
+
return 0;
|
|
414
|
+
const freq = {};
|
|
415
|
+
for (const c of str) {
|
|
416
|
+
freq[c] = (freq[c] || 0) + 1;
|
|
417
|
+
}
|
|
418
|
+
let entropy = 0;
|
|
419
|
+
const len = str.length;
|
|
420
|
+
for (const count of Object.values(freq)) {
|
|
421
|
+
const p = count / len;
|
|
422
|
+
entropy -= p * Math.log2(p);
|
|
423
|
+
}
|
|
424
|
+
return entropy;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Check if a string looks like a high-entropy secret.
|
|
428
|
+
*
|
|
429
|
+
* Requires both a minimum length (to ignore short random-ish strings like
|
|
430
|
+
* UUIDs in non-secret contexts) and an entropy above the threshold.
|
|
431
|
+
*
|
|
432
|
+
* @param str - The string to check.
|
|
433
|
+
* @param threshold - Minimum entropy in bits per character. Default 4.5
|
|
434
|
+
* (base64-encoded random bytes typically have entropy ~5.2).
|
|
435
|
+
* @returns True if the string exceeds both the length and entropy thresholds.
|
|
436
|
+
*/
|
|
437
|
+
static isHighEntropy(str, threshold = 4.5) {
|
|
438
|
+
if (str.length < 16)
|
|
439
|
+
return false;
|
|
440
|
+
return DLPScanner.calculateEntropy(str) >= threshold;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
exports.DLPScanner = DLPScanner;
|
|
444
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/dlp/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text normalizer for bypass-resistant prompt injection detection.
|
|
3
|
+
*
|
|
4
|
+
* Applies a series of transformations to collapse evasion techniques
|
|
5
|
+
* (zero-width chars, HTML entities, homoglyphs, leetspeak, etc.)
|
|
6
|
+
* into canonical ASCII text before pattern matching.
|
|
7
|
+
*/
|
|
8
|
+
/** Regex matching zero-width and invisible Unicode characters. */
|
|
9
|
+
export declare const ZERO_WIDTH_REGEX: RegExp;
|
|
10
|
+
/** Map of Unicode homoglyphs to their ASCII equivalents. */
|
|
11
|
+
export declare const HOMOGLYPH_MAP: Record<string, string>;
|
|
12
|
+
/** Map of common leetspeak substitutions to their letter equivalents. */
|
|
13
|
+
export declare const LEETSPEAK_MAP: Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Normalize text for bypass-resistant pattern matching.
|
|
16
|
+
*
|
|
17
|
+
* Applies transformations in order:
|
|
18
|
+
* 1. Strip zero-width / invisible Unicode characters
|
|
19
|
+
* 2. Unicode NFKC normalization (collapses fullwidth, ligatures, etc.)
|
|
20
|
+
* 3. Decode HTML entities (named + numeric)
|
|
21
|
+
* 4. Decode URL percent-encoding
|
|
22
|
+
* 5. Collapse homoglyphs (Cyrillic/Greek lookalikes -> ASCII)
|
|
23
|
+
* 6. Collapse repeated whitespace to single space
|
|
24
|
+
*
|
|
25
|
+
* @param input - The raw text to normalize.
|
|
26
|
+
* @returns The normalized text suitable for pattern matching.
|
|
27
|
+
*/
|
|
28
|
+
export declare function normalizeText(input: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Apply leetspeak normalization on top of standard normalization.
|
|
31
|
+
*
|
|
32
|
+
* Returns the leet-decoded version of the text. Callers should match
|
|
33
|
+
* patterns against BOTH the standard-normalized and leet-normalized text
|
|
34
|
+
* to catch leet evasions without causing false positives on normal text
|
|
35
|
+
* containing digits.
|
|
36
|
+
*
|
|
37
|
+
* @param normalizedInput - Text already passed through normalizeText().
|
|
38
|
+
* @returns The leet-decoded text.
|
|
39
|
+
*/
|
|
40
|
+
export declare function normalizeLeetspeak(normalizedInput: string): string;
|
|
41
|
+
//# sourceMappingURL=text-normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-normalizer.d.ts","sourceRoot":"","sources":["../../../src/dlp/text-normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,QAAsF,CAAC;AAMpH,4DAA4D;AAC5D,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyDhD,CAAC;AAYF,yEAAyE;AACzE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUhD,CAAC;AAsEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyBnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAElE"}
|