@aion0/bastion 0.1.7
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 +183 -0
- package/README.zh.md +468 -0
- package/config/default.yaml +73 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +31 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/env.d.ts +3 -0
- package/dist/cli/commands/env.d.ts.map +1 -0
- package/dist/cli/commands/env.js +83 -0
- package/dist/cli/commands/env.js.map +1 -0
- package/dist/cli/commands/health.d.ts +3 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +45 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/openclaw.d.ts +3 -0
- package/dist/cli/commands/openclaw.d.ts.map +1 -0
- package/dist/cli/commands/openclaw.js +1062 -0
- package/dist/cli/commands/openclaw.js.map +1 -0
- package/dist/cli/commands/proxy.d.ts +8 -0
- package/dist/cli/commands/proxy.d.ts.map +1 -0
- package/dist/cli/commands/proxy.js +433 -0
- package/dist/cli/commands/proxy.js.map +1 -0
- package/dist/cli/commands/start.d.ts +3 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +62 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +3 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +32 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +28 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/token.d.ts +3 -0
- package/dist/cli/commands/token.d.ts.map +1 -0
- package/dist/cli/commands/token.js +32 -0
- package/dist/cli/commands/token.js.map +1 -0
- package/dist/cli/commands/trust-ca.d.ts +3 -0
- package/dist/cli/commands/trust-ca.d.ts.map +1 -0
- package/dist/cli/commands/trust-ca.js +44 -0
- package/dist/cli/commands/trust-ca.js.map +1 -0
- package/dist/cli/commands/wrap.d.ts +3 -0
- package/dist/cli/commands/wrap.d.ts.map +1 -0
- package/dist/cli/commands/wrap.js +70 -0
- package/dist/cli/commands/wrap.js.map +1 -0
- package/dist/cli/daemon.d.ts +11 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +82 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +60 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +12 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +73 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/paths.d.ts +10 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +16 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +85 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +3 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/dashboard/api-routes.d.ts +6 -0
- package/dist/dashboard/api-routes.d.ts.map +1 -0
- package/dist/dashboard/api-routes.js +671 -0
- package/dist/dashboard/api-routes.js.map +1 -0
- package/dist/dashboard/api.d.ts +4 -0
- package/dist/dashboard/api.d.ts.map +1 -0
- package/dist/dashboard/api.js +25 -0
- package/dist/dashboard/api.js.map +1 -0
- package/dist/dashboard/page.d.ts +3 -0
- package/dist/dashboard/page.d.ts.map +1 -0
- package/dist/dashboard/page.js +1622 -0
- package/dist/dashboard/page.js.map +1 -0
- package/dist/dlp/actions.d.ts +13 -0
- package/dist/dlp/actions.d.ts.map +1 -0
- package/dist/dlp/actions.js +3 -0
- package/dist/dlp/actions.js.map +1 -0
- package/dist/dlp/ai-validator.d.ts +28 -0
- package/dist/dlp/ai-validator.d.ts.map +1 -0
- package/dist/dlp/ai-validator.js +214 -0
- package/dist/dlp/ai-validator.js.map +1 -0
- package/dist/dlp/engine.d.ts +34 -0
- package/dist/dlp/engine.d.ts.map +1 -0
- package/dist/dlp/engine.js +342 -0
- package/dist/dlp/engine.js.map +1 -0
- package/dist/dlp/entropy.d.ts +22 -0
- package/dist/dlp/entropy.d.ts.map +1 -0
- package/dist/dlp/entropy.js +43 -0
- package/dist/dlp/entropy.js.map +1 -0
- package/dist/dlp/message-cache.d.ts +45 -0
- package/dist/dlp/message-cache.d.ts.map +1 -0
- package/dist/dlp/message-cache.js +251 -0
- package/dist/dlp/message-cache.js.map +1 -0
- package/dist/dlp/patterns/context-aware.d.ts +4 -0
- package/dist/dlp/patterns/context-aware.d.ts.map +1 -0
- package/dist/dlp/patterns/context-aware.js +45 -0
- package/dist/dlp/patterns/context-aware.js.map +1 -0
- package/dist/dlp/patterns/high-confidence.d.ts +4 -0
- package/dist/dlp/patterns/high-confidence.d.ts.map +1 -0
- package/dist/dlp/patterns/high-confidence.js +140 -0
- package/dist/dlp/patterns/high-confidence.js.map +1 -0
- package/dist/dlp/patterns/prompt-injection.d.ts +4 -0
- package/dist/dlp/patterns/prompt-injection.d.ts.map +1 -0
- package/dist/dlp/patterns/prompt-injection.js +244 -0
- package/dist/dlp/patterns/prompt-injection.js.map +1 -0
- package/dist/dlp/patterns/validated.d.ts +4 -0
- package/dist/dlp/patterns/validated.d.ts.map +1 -0
- package/dist/dlp/patterns/validated.js +21 -0
- package/dist/dlp/patterns/validated.js.map +1 -0
- package/dist/dlp/remote-sync.d.ts +47 -0
- package/dist/dlp/remote-sync.d.ts.map +1 -0
- package/dist/dlp/remote-sync.js +252 -0
- package/dist/dlp/remote-sync.js.map +1 -0
- package/dist/dlp/semantics.d.ts +27 -0
- package/dist/dlp/semantics.d.ts.map +1 -0
- package/dist/dlp/semantics.js +93 -0
- package/dist/dlp/semantics.js.map +1 -0
- package/dist/dlp/structure.d.ts +25 -0
- package/dist/dlp/structure.d.ts.map +1 -0
- package/dist/dlp/structure.js +86 -0
- package/dist/dlp/structure.js.map +1 -0
- package/dist/dlp/validators.d.ts +6 -0
- package/dist/dlp/validators.d.ts.map +1 -0
- package/dist/dlp/validators.js +46 -0
- package/dist/dlp/validators.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/license/verify.d.ts +18 -0
- package/dist/license/verify.d.ts.map +1 -0
- package/dist/license/verify.js +71 -0
- package/dist/license/verify.js.map +1 -0
- package/dist/metrics/collector.d.ts +11 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +17 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/metrics/dashboard.d.ts +6 -0
- package/dist/metrics/dashboard.d.ts.map +1 -0
- package/dist/metrics/dashboard.js +66 -0
- package/dist/metrics/dashboard.js.map +1 -0
- package/dist/metrics/pricing.d.ts +10 -0
- package/dist/metrics/pricing.d.ts.map +1 -0
- package/dist/metrics/pricing.js +62 -0
- package/dist/metrics/pricing.js.map +1 -0
- package/dist/optimizer/cache.d.ts +14 -0
- package/dist/optimizer/cache.d.ts.map +1 -0
- package/dist/optimizer/cache.js +58 -0
- package/dist/optimizer/cache.js.map +1 -0
- package/dist/optimizer/estimator.d.ts +6 -0
- package/dist/optimizer/estimator.d.ts.map +1 -0
- package/dist/optimizer/estimator.js +12 -0
- package/dist/optimizer/estimator.js.map +1 -0
- package/dist/optimizer/reorder.d.ts +9 -0
- package/dist/optimizer/reorder.d.ts.map +1 -0
- package/dist/optimizer/reorder.js +27 -0
- package/dist/optimizer/reorder.js.map +1 -0
- package/dist/optimizer/trimmer.d.ts +9 -0
- package/dist/optimizer/trimmer.d.ts.map +1 -0
- package/dist/optimizer/trimmer.js +47 -0
- package/dist/optimizer/trimmer.js.map +1 -0
- package/dist/plugin-api/index.d.ts +3 -0
- package/dist/plugin-api/index.d.ts.map +1 -0
- package/dist/plugin-api/index.js +6 -0
- package/dist/plugin-api/index.js.map +1 -0
- package/dist/plugin-api/types.d.ts +77 -0
- package/dist/plugin-api/types.d.ts.map +1 -0
- package/dist/plugin-api/types.js +6 -0
- package/dist/plugin-api/types.js.map +1 -0
- package/dist/plugins/adapter.d.ts +12 -0
- package/dist/plugins/adapter.d.ts.map +1 -0
- package/dist/plugins/adapter.js +116 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/builtin/audit-logger.d.ts +9 -0
- package/dist/plugins/builtin/audit-logger.d.ts.map +1 -0
- package/dist/plugins/builtin/audit-logger.js +53 -0
- package/dist/plugins/builtin/audit-logger.js.map +1 -0
- package/dist/plugins/builtin/dlp-scanner.d.ts +19 -0
- package/dist/plugins/builtin/dlp-scanner.d.ts.map +1 -0
- package/dist/plugins/builtin/dlp-scanner.js +284 -0
- package/dist/plugins/builtin/dlp-scanner.js.map +1 -0
- package/dist/plugins/builtin/metrics-collector.d.ts +4 -0
- package/dist/plugins/builtin/metrics-collector.d.ts.map +1 -0
- package/dist/plugins/builtin/metrics-collector.js +111 -0
- package/dist/plugins/builtin/metrics-collector.js.map +1 -0
- package/dist/plugins/builtin/token-optimizer.d.ts +10 -0
- package/dist/plugins/builtin/token-optimizer.d.ts.map +1 -0
- package/dist/plugins/builtin/token-optimizer.js +120 -0
- package/dist/plugins/builtin/token-optimizer.js.map +1 -0
- package/dist/plugins/builtin/tool-guard.d.ts +20 -0
- package/dist/plugins/builtin/tool-guard.d.ts.map +1 -0
- package/dist/plugins/builtin/tool-guard.js +259 -0
- package/dist/plugins/builtin/tool-guard.js.map +1 -0
- package/dist/plugins/context.d.ts +8 -0
- package/dist/plugins/context.d.ts.map +1 -0
- package/dist/plugins/context.js +33 -0
- package/dist/plugins/context.js.map +1 -0
- package/dist/plugins/event-bus.d.ts +9 -0
- package/dist/plugins/event-bus.d.ts.map +1 -0
- package/dist/plugins/event-bus.js +25 -0
- package/dist/plugins/event-bus.js.map +1 -0
- package/dist/plugins/index.d.ts +18 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +148 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +14 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +98 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +91 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +3 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/proxy/certs.d.ts +10 -0
- package/dist/proxy/certs.d.ts.map +1 -0
- package/dist/proxy/certs.js +110 -0
- package/dist/proxy/certs.js.map +1 -0
- package/dist/proxy/connect.d.ts +11 -0
- package/dist/proxy/connect.d.ts.map +1 -0
- package/dist/proxy/connect.js +298 -0
- package/dist/proxy/connect.js.map +1 -0
- package/dist/proxy/forwarder.d.ts +14 -0
- package/dist/proxy/forwarder.d.ts.map +1 -0
- package/dist/proxy/forwarder.js +342 -0
- package/dist/proxy/forwarder.js.map +1 -0
- package/dist/proxy/passthrough.d.ts +4 -0
- package/dist/proxy/passthrough.d.ts.map +1 -0
- package/dist/proxy/passthrough.js +68 -0
- package/dist/proxy/passthrough.js.map +1 -0
- package/dist/proxy/providers/anthropic.d.ts +4 -0
- package/dist/proxy/providers/anthropic.d.ts.map +1 -0
- package/dist/proxy/providers/anthropic.js +46 -0
- package/dist/proxy/providers/anthropic.js.map +1 -0
- package/dist/proxy/providers/classify.d.ts +14 -0
- package/dist/proxy/providers/classify.d.ts.map +1 -0
- package/dist/proxy/providers/classify.js +37 -0
- package/dist/proxy/providers/classify.js.map +1 -0
- package/dist/proxy/providers/claude-web.d.ts +8 -0
- package/dist/proxy/providers/claude-web.d.ts.map +1 -0
- package/dist/proxy/providers/claude-web.js +50 -0
- package/dist/proxy/providers/claude-web.js.map +1 -0
- package/dist/proxy/providers/gemini.d.ts +4 -0
- package/dist/proxy/providers/gemini.d.ts.map +1 -0
- package/dist/proxy/providers/gemini.js +38 -0
- package/dist/proxy/providers/gemini.js.map +1 -0
- package/dist/proxy/providers/index.d.ts +27 -0
- package/dist/proxy/providers/index.d.ts.map +1 -0
- package/dist/proxy/providers/index.js +32 -0
- package/dist/proxy/providers/index.js.map +1 -0
- package/dist/proxy/providers/messaging.d.ts +2 -0
- package/dist/proxy/providers/messaging.d.ts.map +1 -0
- package/dist/proxy/providers/messaging.js +53 -0
- package/dist/proxy/providers/messaging.js.map +1 -0
- package/dist/proxy/providers/openai.d.ts +4 -0
- package/dist/proxy/providers/openai.d.ts.map +1 -0
- package/dist/proxy/providers/openai.js +38 -0
- package/dist/proxy/providers/openai.js.map +1 -0
- package/dist/proxy/providers/telegram.d.ts +8 -0
- package/dist/proxy/providers/telegram.d.ts.map +1 -0
- package/dist/proxy/providers/telegram.js +35 -0
- package/dist/proxy/providers/telegram.js.map +1 -0
- package/dist/proxy/router.d.ts +12 -0
- package/dist/proxy/router.d.ts.map +1 -0
- package/dist/proxy/router.js +26 -0
- package/dist/proxy/router.js.map +1 -0
- package/dist/proxy/safety.d.ts +13 -0
- package/dist/proxy/safety.d.ts.map +1 -0
- package/dist/proxy/safety.js +58 -0
- package/dist/proxy/safety.js.map +1 -0
- package/dist/proxy/server.d.ts +8 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +126 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/proxy/streaming.d.ts +21 -0
- package/dist/proxy/streaming.d.ts.map +1 -0
- package/dist/proxy/streaming.js +70 -0
- package/dist/proxy/streaming.js.map +1 -0
- package/dist/storage/database.d.ts +6 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +44 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/encryption.d.ts +11 -0
- package/dist/storage/encryption.d.ts.map +1 -0
- package/dist/storage/encryption.js +47 -0
- package/dist/storage/encryption.js.map +1 -0
- package/dist/storage/migrations.d.ts +3 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +265 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/repositories/audit-log.d.ts +115 -0
- package/dist/storage/repositories/audit-log.d.ts.map +1 -0
- package/dist/storage/repositories/audit-log.js +586 -0
- package/dist/storage/repositories/audit-log.js.map +1 -0
- package/dist/storage/repositories/cache.d.ts +26 -0
- package/dist/storage/repositories/cache.d.ts.map +1 -0
- package/dist/storage/repositories/cache.js +44 -0
- package/dist/storage/repositories/cache.js.map +1 -0
- package/dist/storage/repositories/dlp-config-history.d.ts +17 -0
- package/dist/storage/repositories/dlp-config-history.d.ts.map +1 -0
- package/dist/storage/repositories/dlp-config-history.js +30 -0
- package/dist/storage/repositories/dlp-config-history.js.map +1 -0
- package/dist/storage/repositories/dlp-events.d.ts +35 -0
- package/dist/storage/repositories/dlp-events.d.ts.map +1 -0
- package/dist/storage/repositories/dlp-events.js +57 -0
- package/dist/storage/repositories/dlp-events.js.map +1 -0
- package/dist/storage/repositories/dlp-patterns.d.ts +70 -0
- package/dist/storage/repositories/dlp-patterns.d.ts.map +1 -0
- package/dist/storage/repositories/dlp-patterns.js +187 -0
- package/dist/storage/repositories/dlp-patterns.js.map +1 -0
- package/dist/storage/repositories/optimizer-events.d.ts +28 -0
- package/dist/storage/repositories/optimizer-events.d.ts.map +1 -0
- package/dist/storage/repositories/optimizer-events.js +49 -0
- package/dist/storage/repositories/optimizer-events.js.map +1 -0
- package/dist/storage/repositories/plugin-events.d.ts +34 -0
- package/dist/storage/repositories/plugin-events.d.ts.map +1 -0
- package/dist/storage/repositories/plugin-events.js +64 -0
- package/dist/storage/repositories/plugin-events.js.map +1 -0
- package/dist/storage/repositories/requests.d.ts +68 -0
- package/dist/storage/repositories/requests.d.ts.map +1 -0
- package/dist/storage/repositories/requests.js +113 -0
- package/dist/storage/repositories/requests.js.map +1 -0
- package/dist/storage/repositories/sessions.d.ts +23 -0
- package/dist/storage/repositories/sessions.d.ts.map +1 -0
- package/dist/storage/repositories/sessions.js +42 -0
- package/dist/storage/repositories/sessions.js.map +1 -0
- package/dist/storage/repositories/tool-calls.d.ts +49 -0
- package/dist/storage/repositories/tool-calls.d.ts.map +1 -0
- package/dist/storage/repositories/tool-calls.js +61 -0
- package/dist/storage/repositories/tool-calls.js.map +1 -0
- package/dist/storage/repositories/tool-guard-rules.d.ts +50 -0
- package/dist/storage/repositories/tool-guard-rules.d.ts.map +1 -0
- package/dist/storage/repositories/tool-guard-rules.js +120 -0
- package/dist/storage/repositories/tool-guard-rules.js.map +1 -0
- package/dist/tool-guard/alert.d.ts +30 -0
- package/dist/tool-guard/alert.d.ts.map +1 -0
- package/dist/tool-guard/alert.js +113 -0
- package/dist/tool-guard/alert.js.map +1 -0
- package/dist/tool-guard/extractor.d.ts +10 -0
- package/dist/tool-guard/extractor.d.ts.map +1 -0
- package/dist/tool-guard/extractor.js +309 -0
- package/dist/tool-guard/extractor.js.map +1 -0
- package/dist/tool-guard/rules.d.ts +18 -0
- package/dist/tool-guard/rules.d.ts.map +1 -0
- package/dist/tool-guard/rules.js +255 -0
- package/dist/tool-guard/rules.js.map +1 -0
- package/dist/tool-guard/streaming-guard.d.ts +57 -0
- package/dist/tool-guard/streaming-guard.d.ts.map +1 -0
- package/dist/tool-guard/streaming-guard.js +389 -0
- package/dist/tool-guard/streaming-guard.js.map +1 -0
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +8 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +54 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/timeout.d.ts +5 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +26 -0
- package/dist/utils/timeout.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 3: Field-name Semantics
|
|
4
|
+
*
|
|
5
|
+
* Uses JSON field names to identify potentially sensitive data.
|
|
6
|
+
* When a value appears under a field like "api_key" or "password",
|
|
7
|
+
* it provides strong signal that the value is a secret — even if
|
|
8
|
+
* no specific regex pattern matches.
|
|
9
|
+
*
|
|
10
|
+
* Built-in patterns are immutable defaults.
|
|
11
|
+
* Additional patterns / non-sensitive names can be added at runtime
|
|
12
|
+
* via updateSemanticConfig() (driven by the Settings UI).
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.updateSemanticConfig = updateSemanticConfig;
|
|
16
|
+
exports.getBuiltinSensitivePatterns = getBuiltinSensitivePatterns;
|
|
17
|
+
exports.getBuiltinNonSensitiveNames = getBuiltinNonSensitiveNames;
|
|
18
|
+
exports.isSensitiveFieldName = isSensitiveFieldName;
|
|
19
|
+
// ── Built-in defaults (immutable) ──
|
|
20
|
+
/** Patterns that indicate a field likely holds a secret */
|
|
21
|
+
const BUILTIN_SENSITIVE = [
|
|
22
|
+
/passw(?:or)?d/i,
|
|
23
|
+
/(?:^|[_-]|\b)secret/i,
|
|
24
|
+
/(?:^|[_-]|\b)token(?:$|[_-]|\b)/i,
|
|
25
|
+
/api[_-]?key/i,
|
|
26
|
+
/(?:^|[_-]|\b)auth(?:$|[_-])/i,
|
|
27
|
+
/credential/i,
|
|
28
|
+
/private[_-]?key/i,
|
|
29
|
+
/access[_-]?key/i,
|
|
30
|
+
/secret[_-]?key/i,
|
|
31
|
+
/(?:^|[_-]|\b)cipher(?:$|[_-]|\b)/i,
|
|
32
|
+
/(?:^|[_-]|\b)salt(?:$|[_-]|\b)/i,
|
|
33
|
+
/connection[_-]?string/i,
|
|
34
|
+
/(?:^|[_-]|\b)dsn(?:$|[_-]|\b)/i,
|
|
35
|
+
/(?:^|[_-]|\b)signing/i,
|
|
36
|
+
/(?:^|[_-]|\b)bearer(?:$|[_-]|\b)/i,
|
|
37
|
+
/(?:^|[_-]|\b)authorization(?:$|[_-]|\b)/i,
|
|
38
|
+
];
|
|
39
|
+
/** Known non-sensitive field names (fast reject to avoid false positives) */
|
|
40
|
+
const BUILTIN_NON_SENSITIVE = new Set([
|
|
41
|
+
'role', 'model', 'content', 'type', 'name', 'id', 'version',
|
|
42
|
+
'method', 'path', 'url', 'status', 'message', 'description',
|
|
43
|
+
'format', 'language', 'encoding', 'timestamp', 'created',
|
|
44
|
+
'max_tokens', 'temperature', 'top_p', 'stream', 'stop',
|
|
45
|
+
'n', 'presence_penalty', 'frequency_penalty', 'text',
|
|
46
|
+
'index', 'object', 'finish_reason', 'logprobs', 'usage',
|
|
47
|
+
'prompt_tokens', 'completion_tokens', 'total_tokens',
|
|
48
|
+
'system_fingerprint', 'created_at', 'updated_at', 'choices',
|
|
49
|
+
'response_format', 'seed', 'tool_choice', 'function_call',
|
|
50
|
+
'safety_ratings', 'candidates',
|
|
51
|
+
]);
|
|
52
|
+
// ── User-configurable extras (mutable at runtime) ──
|
|
53
|
+
let extraSensitive = [];
|
|
54
|
+
let extraNonSensitive = new Set();
|
|
55
|
+
/** Update user-configurable semantic rules. Called when config changes. */
|
|
56
|
+
function updateSemanticConfig(config) {
|
|
57
|
+
extraSensitive = (config.sensitivePatterns ?? [])
|
|
58
|
+
.filter(p => p.length > 0)
|
|
59
|
+
.map(p => {
|
|
60
|
+
try {
|
|
61
|
+
return new RegExp(p, 'i');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
.filter((r) => r !== null);
|
|
68
|
+
extraNonSensitive = new Set((config.nonSensitiveNames ?? []).map(n => n.toLowerCase()));
|
|
69
|
+
}
|
|
70
|
+
/** Read-only access to built-in sensitive patterns (for UI display) */
|
|
71
|
+
function getBuiltinSensitivePatterns() {
|
|
72
|
+
return BUILTIN_SENSITIVE.map(r => r.source);
|
|
73
|
+
}
|
|
74
|
+
/** Read-only access to built-in non-sensitive names (for UI display) */
|
|
75
|
+
function getBuiltinNonSensitiveNames() {
|
|
76
|
+
return [...BUILTIN_NON_SENSITIVE];
|
|
77
|
+
}
|
|
78
|
+
/** Check if a field name suggests it holds sensitive data */
|
|
79
|
+
function isSensitiveFieldName(name) {
|
|
80
|
+
const lower = name.toLowerCase();
|
|
81
|
+
// Non-sensitive fast reject (built-in + user extras)
|
|
82
|
+
if (BUILTIN_NON_SENSITIVE.has(lower))
|
|
83
|
+
return false;
|
|
84
|
+
if (extraNonSensitive.has(lower))
|
|
85
|
+
return false;
|
|
86
|
+
// Sensitive check (built-in + user extras)
|
|
87
|
+
if (BUILTIN_SENSITIVE.some(re => re.test(name)))
|
|
88
|
+
return true;
|
|
89
|
+
if (extraSensitive.some(re => re.test(name)))
|
|
90
|
+
return true;
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=semantics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantics.js","sourceRoot":"","sources":["../../src/dlp/semantics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 0: Structure-aware Parsing
|
|
3
|
+
*
|
|
4
|
+
* Extracts key-value fields from JSON request/response bodies.
|
|
5
|
+
* Provides structural context for downstream layers:
|
|
6
|
+
* - Field names help identify sensitive data by semantic meaning
|
|
7
|
+
* - Extracted values can be individually analyzed for entropy
|
|
8
|
+
*
|
|
9
|
+
* Also extracts inline assignments (KEY=value) from text content,
|
|
10
|
+
* catching secrets embedded in message strings.
|
|
11
|
+
*/
|
|
12
|
+
export interface StructuredField {
|
|
13
|
+
/** Immediate field name (e.g., "api_key") */
|
|
14
|
+
key: string;
|
|
15
|
+
/** Full JSON path (e.g., "credentials.api_key") */
|
|
16
|
+
path: string;
|
|
17
|
+
/** The string value */
|
|
18
|
+
value: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract string fields from a JSON text body.
|
|
22
|
+
* Returns empty array if text is not valid JSON or exceeds size limit.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractStructuredFields(text: string): StructuredField[];
|
|
25
|
+
//# sourceMappingURL=structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/dlp/structure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAKD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAcvE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 0: Structure-aware Parsing
|
|
4
|
+
*
|
|
5
|
+
* Extracts key-value fields from JSON request/response bodies.
|
|
6
|
+
* Provides structural context for downstream layers:
|
|
7
|
+
* - Field names help identify sensitive data by semantic meaning
|
|
8
|
+
* - Extracted values can be individually analyzed for entropy
|
|
9
|
+
*
|
|
10
|
+
* Also extracts inline assignments (KEY=value) from text content,
|
|
11
|
+
* catching secrets embedded in message strings.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.extractStructuredFields = extractStructuredFields;
|
|
15
|
+
/** Maximum text size for structural analysis (skip for very large bodies) */
|
|
16
|
+
const MAX_TEXT_LENGTH = 512 * 1024;
|
|
17
|
+
/**
|
|
18
|
+
* Extract string fields from a JSON text body.
|
|
19
|
+
* Returns empty array if text is not valid JSON or exceeds size limit.
|
|
20
|
+
*/
|
|
21
|
+
function extractStructuredFields(text) {
|
|
22
|
+
if (text.length > MAX_TEXT_LENGTH)
|
|
23
|
+
return [];
|
|
24
|
+
const fields = [];
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(text);
|
|
27
|
+
walkJson(parsed, '', fields);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Not JSON — extract assignment patterns as fallback
|
|
31
|
+
extractAssignments(text, fields);
|
|
32
|
+
}
|
|
33
|
+
return fields;
|
|
34
|
+
}
|
|
35
|
+
/** Recursively walk JSON and collect string values with their paths */
|
|
36
|
+
function walkJson(obj, path, out) {
|
|
37
|
+
if (obj === null || obj === undefined)
|
|
38
|
+
return;
|
|
39
|
+
if (typeof obj === 'string') {
|
|
40
|
+
const key = extractKey(path);
|
|
41
|
+
if (obj.length >= 6) {
|
|
42
|
+
out.push({ key, path, value: obj });
|
|
43
|
+
}
|
|
44
|
+
// Try parsing string values that look like embedded JSON
|
|
45
|
+
if (obj.length > 10 && (obj[0] === '{' || obj[0] === '[')) {
|
|
46
|
+
try {
|
|
47
|
+
const nested = JSON.parse(obj);
|
|
48
|
+
walkJson(nested, path, out);
|
|
49
|
+
return; // Embedded JSON handled; skip assignment extraction
|
|
50
|
+
}
|
|
51
|
+
catch { /* not valid JSON, fall through */ }
|
|
52
|
+
}
|
|
53
|
+
// Also scan long string content for inline assignments
|
|
54
|
+
if (obj.length > 20) {
|
|
55
|
+
extractAssignments(obj, out);
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (Array.isArray(obj)) {
|
|
60
|
+
for (let i = 0; i < obj.length; i++) {
|
|
61
|
+
walkJson(obj[i], `${path}[${i}]`, out);
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (typeof obj === 'object') {
|
|
66
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
67
|
+
walkJson(v, path ? `${path}.${k}` : k, out);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Extract the immediate key name from a JSON path */
|
|
72
|
+
function extractKey(path) {
|
|
73
|
+
const parts = path.split('.');
|
|
74
|
+
const last = parts[parts.length - 1];
|
|
75
|
+
return last.replace(/\[\d+\]$/, '');
|
|
76
|
+
}
|
|
77
|
+
/** Extract KEY=VALUE and KEY: VALUE assignment patterns from text */
|
|
78
|
+
const ASSIGN_RE = /\b([A-Za-z_][A-Za-z0-9_]*)\s*[=:]\s*['"]?([^\s'"=;,}{)]{8,})/g;
|
|
79
|
+
function extractAssignments(text, out) {
|
|
80
|
+
const re = new RegExp(ASSIGN_RE.source, ASSIGN_RE.flags);
|
|
81
|
+
let m;
|
|
82
|
+
while ((m = re.exec(text)) !== null) {
|
|
83
|
+
out.push({ key: m[1], path: m[1], value: m[2] });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/dlp/structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Luhn algorithm for credit card validation */
|
|
2
|
+
export declare function luhnCheck(number: string): boolean;
|
|
3
|
+
/** SSN format validation — checks structure beyond regex */
|
|
4
|
+
export declare function ssnCheck(ssn: string): boolean;
|
|
5
|
+
export declare const validators: Record<string, (value: string) => boolean>;
|
|
6
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/dlp/validators.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAkBjD;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAc7C;AAED,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAGjE,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validators = void 0;
|
|
4
|
+
exports.luhnCheck = luhnCheck;
|
|
5
|
+
exports.ssnCheck = ssnCheck;
|
|
6
|
+
/** Luhn algorithm for credit card validation */
|
|
7
|
+
function luhnCheck(number) {
|
|
8
|
+
const digits = number.replace(/\D/g, '');
|
|
9
|
+
if (digits.length < 13 || digits.length > 19)
|
|
10
|
+
return false;
|
|
11
|
+
let sum = 0;
|
|
12
|
+
let alternate = false;
|
|
13
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
14
|
+
let n = parseInt(digits[i], 10);
|
|
15
|
+
if (alternate) {
|
|
16
|
+
n *= 2;
|
|
17
|
+
if (n > 9)
|
|
18
|
+
n -= 9;
|
|
19
|
+
}
|
|
20
|
+
sum += n;
|
|
21
|
+
alternate = !alternate;
|
|
22
|
+
}
|
|
23
|
+
return sum % 10 === 0;
|
|
24
|
+
}
|
|
25
|
+
/** SSN format validation — checks structure beyond regex */
|
|
26
|
+
function ssnCheck(ssn) {
|
|
27
|
+
const clean = ssn.replace(/\D/g, '');
|
|
28
|
+
if (clean.length !== 9)
|
|
29
|
+
return false;
|
|
30
|
+
const area = parseInt(clean.substring(0, 3), 10);
|
|
31
|
+
const group = parseInt(clean.substring(3, 5), 10);
|
|
32
|
+
const serial = parseInt(clean.substring(5, 9), 10);
|
|
33
|
+
// Invalid ranges
|
|
34
|
+
if (area === 0 || area === 666 || area >= 900)
|
|
35
|
+
return false;
|
|
36
|
+
if (group === 0)
|
|
37
|
+
return false;
|
|
38
|
+
if (serial === 0)
|
|
39
|
+
return false;
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
exports.validators = {
|
|
43
|
+
luhn: luhnCheck,
|
|
44
|
+
ssn: ssnCheck,
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/dlp/validators.ts"],"names":[],"mappings":";;;AACA,8BAkBC;AAGD,4BAcC;AApCD,gDAAgD;AAChD,SAAgB,SAAS,CAAC,MAAc;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAE3D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,SAAS,EAAE,CAAC;YACd,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,IAAI,CAAC,CAAC;QACT,SAAS,GAAG,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,4DAA4D;AAC5D,SAAgB,QAAQ,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnD,iBAAiB;IACjB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/B,OAAO,IAAI,CAAC;AACd,CAAC;AAEY,QAAA,UAAU,GAA+C;IACpE,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,QAAQ;CACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkCA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAgKlD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.startGateway = startGateway;
|
|
7
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
8
|
+
const index_js_1 = require("./config/index.js");
|
|
9
|
+
const manager_js_1 = require("./config/manager.js");
|
|
10
|
+
const logger_js_1 = require("./utils/logger.js");
|
|
11
|
+
const logger_js_2 = require("./utils/logger.js");
|
|
12
|
+
const database_js_1 = require("./storage/database.js");
|
|
13
|
+
const index_js_2 = require("./plugins/index.js");
|
|
14
|
+
const metrics_collector_js_1 = require("./plugins/builtin/metrics-collector.js");
|
|
15
|
+
const dlp_scanner_js_1 = require("./plugins/builtin/dlp-scanner.js");
|
|
16
|
+
const token_optimizer_js_1 = require("./plugins/builtin/token-optimizer.js");
|
|
17
|
+
const audit_logger_js_1 = require("./plugins/builtin/audit-logger.js");
|
|
18
|
+
const tool_guard_js_1 = require("./plugins/builtin/tool-guard.js");
|
|
19
|
+
const anthropic_js_1 = require("./proxy/providers/anthropic.js");
|
|
20
|
+
const openai_js_1 = require("./proxy/providers/openai.js");
|
|
21
|
+
const gemini_js_1 = require("./proxy/providers/gemini.js");
|
|
22
|
+
const claude_web_js_1 = require("./proxy/providers/claude-web.js");
|
|
23
|
+
const messaging_js_1 = require("./proxy/providers/messaging.js");
|
|
24
|
+
const server_js_1 = require("./proxy/server.js");
|
|
25
|
+
const daemon_js_1 = require("./cli/daemon.js");
|
|
26
|
+
const certs_js_1 = require("./proxy/certs.js");
|
|
27
|
+
const semantics_js_1 = require("./dlp/semantics.js");
|
|
28
|
+
const requests_js_1 = require("./storage/repositories/requests.js");
|
|
29
|
+
const dlp_events_js_1 = require("./storage/repositories/dlp-events.js");
|
|
30
|
+
const optimizer_events_js_1 = require("./storage/repositories/optimizer-events.js");
|
|
31
|
+
const sessions_js_1 = require("./storage/repositories/sessions.js");
|
|
32
|
+
const audit_log_js_1 = require("./storage/repositories/audit-log.js");
|
|
33
|
+
const tool_calls_js_1 = require("./storage/repositories/tool-calls.js");
|
|
34
|
+
const plugin_events_js_1 = require("./storage/repositories/plugin-events.js");
|
|
35
|
+
const event_bus_js_1 = require("./plugins/event-bus.js");
|
|
36
|
+
const loader_js_1 = require("./plugins/loader.js");
|
|
37
|
+
const version_js_1 = require("./version.js");
|
|
38
|
+
const log = (0, logger_js_2.createLogger)('main');
|
|
39
|
+
async function startGateway() {
|
|
40
|
+
// Load configuration
|
|
41
|
+
const config = (0, index_js_1.loadConfig)();
|
|
42
|
+
(0, logger_js_1.setLogLevel)(config.logging.level);
|
|
43
|
+
const version = (0, version_js_1.getVersion)();
|
|
44
|
+
log.info('Starting Bastion AI Gateway', { version });
|
|
45
|
+
// Initialize config manager for runtime updates
|
|
46
|
+
const configManager = new manager_js_1.ConfigManager(config);
|
|
47
|
+
// Auto-generate auth token if auth enabled but no token configured
|
|
48
|
+
if (config.server.auth?.enabled !== false && !config.server.auth?.token) {
|
|
49
|
+
const token = node_crypto_1.default.randomBytes(32).toString('hex');
|
|
50
|
+
configManager.update({ server: { auth: { token } } });
|
|
51
|
+
console.log(`\n Dashboard token generated: ${token}`);
|
|
52
|
+
console.log(' Set server.auth.token in config.yaml to use a custom token\n');
|
|
53
|
+
}
|
|
54
|
+
// Apply initial semantic config + listen for changes
|
|
55
|
+
if (config.plugins.dlp.semantics) {
|
|
56
|
+
(0, semantics_js_1.updateSemanticConfig)(config.plugins.dlp.semantics);
|
|
57
|
+
}
|
|
58
|
+
configManager.onChange((c) => {
|
|
59
|
+
if (c.plugins.dlp.semantics)
|
|
60
|
+
(0, semantics_js_1.updateSemanticConfig)(c.plugins.dlp.semantics);
|
|
61
|
+
});
|
|
62
|
+
// Initialize database
|
|
63
|
+
const db = (0, database_js_1.getDatabase)();
|
|
64
|
+
// Register providers
|
|
65
|
+
(0, anthropic_js_1.registerAnthropicProvider)();
|
|
66
|
+
(0, openai_js_1.registerOpenAIProvider)();
|
|
67
|
+
(0, gemini_js_1.registerGeminiProvider)();
|
|
68
|
+
(0, claude_web_js_1.registerClaudeWebProvider)();
|
|
69
|
+
(0, messaging_js_1.registerMessagingProviders)();
|
|
70
|
+
// Initialize plugin manager — register all plugins, disable those not enabled
|
|
71
|
+
const pluginManager = new index_js_2.PluginManager(config.timeouts.plugin, config.server.failMode ?? 'open');
|
|
72
|
+
pluginManager.register((0, metrics_collector_js_1.createMetricsCollectorPlugin)(db));
|
|
73
|
+
if (!config.plugins.metrics.enabled)
|
|
74
|
+
pluginManager.disable('metrics-collector');
|
|
75
|
+
pluginManager.register((0, dlp_scanner_js_1.createDlpScannerPlugin)(db, {
|
|
76
|
+
action: config.plugins.dlp.action,
|
|
77
|
+
patterns: config.plugins.dlp.patterns,
|
|
78
|
+
remotePatterns: config.plugins.dlp.remotePatterns,
|
|
79
|
+
aiValidation: config.plugins.dlp.aiValidation,
|
|
80
|
+
getAction: () => configManager.get().plugins.dlp.action,
|
|
81
|
+
}));
|
|
82
|
+
if (!config.plugins.dlp.enabled)
|
|
83
|
+
pluginManager.disable('dlp-scanner');
|
|
84
|
+
pluginManager.register((0, token_optimizer_js_1.createTokenOptimizerPlugin)(db, {
|
|
85
|
+
cache: config.plugins.optimizer.cache,
|
|
86
|
+
cacheTtlSeconds: config.plugins.optimizer.cacheTtlSeconds ?? 300,
|
|
87
|
+
trimWhitespace: config.plugins.optimizer.trimWhitespace,
|
|
88
|
+
reorderForCache: config.plugins.optimizer.reorderForCache,
|
|
89
|
+
}));
|
|
90
|
+
if (!config.plugins.optimizer.enabled)
|
|
91
|
+
pluginManager.disable('token-optimizer');
|
|
92
|
+
pluginManager.register((0, audit_logger_js_1.createAuditLoggerPlugin)(db, {
|
|
93
|
+
rawData: config.plugins.audit?.rawData ?? true,
|
|
94
|
+
rawMaxBytes: config.plugins.audit?.rawMaxBytes ?? 524288,
|
|
95
|
+
summaryMaxBytes: config.plugins.audit?.summaryMaxBytes ?? 1024,
|
|
96
|
+
}));
|
|
97
|
+
if (!config.plugins.audit?.enabled)
|
|
98
|
+
pluginManager.disable('audit-logger');
|
|
99
|
+
pluginManager.register((0, tool_guard_js_1.createToolGuardPlugin)(db, {
|
|
100
|
+
enabled: config.plugins.toolGuard?.enabled ?? true,
|
|
101
|
+
action: config.plugins.toolGuard?.action ?? 'audit',
|
|
102
|
+
recordAll: config.plugins.toolGuard?.recordAll ?? true,
|
|
103
|
+
blockMinSeverity: config.plugins.toolGuard?.blockMinSeverity ?? 'critical',
|
|
104
|
+
alertMinSeverity: config.plugins.toolGuard?.alertMinSeverity ?? 'high',
|
|
105
|
+
alertDesktop: config.plugins.toolGuard?.alertDesktop ?? true,
|
|
106
|
+
alertWebhookUrl: config.plugins.toolGuard?.alertWebhookUrl ?? '',
|
|
107
|
+
getLiveConfig: () => {
|
|
108
|
+
const tg = configManager.get().plugins.toolGuard;
|
|
109
|
+
const live = {
|
|
110
|
+
action: tg?.action ?? 'audit',
|
|
111
|
+
recordAll: tg?.recordAll ?? true,
|
|
112
|
+
blockMinSeverity: tg?.blockMinSeverity ?? 'critical',
|
|
113
|
+
alertMinSeverity: tg?.alertMinSeverity ?? 'high',
|
|
114
|
+
};
|
|
115
|
+
return live;
|
|
116
|
+
},
|
|
117
|
+
}));
|
|
118
|
+
if (!config.plugins.toolGuard?.enabled)
|
|
119
|
+
pluginManager.disable('tool-guard');
|
|
120
|
+
// Load external plugins
|
|
121
|
+
const eventBus = new event_bus_js_1.PluginEventBus();
|
|
122
|
+
const externalConfigs = config.plugins.external ?? [];
|
|
123
|
+
let destroyCallbacks = [];
|
|
124
|
+
let getPluginState = () => undefined;
|
|
125
|
+
if (externalConfigs.length > 0) {
|
|
126
|
+
const result = await (0, loader_js_1.loadExternalPlugins)(externalConfigs, db, eventBus);
|
|
127
|
+
destroyCallbacks = result.destroyCallbacks;
|
|
128
|
+
getPluginState = result.getPluginState;
|
|
129
|
+
for (const plugin of result.plugins) {
|
|
130
|
+
pluginManager.register(plugin);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
log.info('No external plugins configured');
|
|
135
|
+
}
|
|
136
|
+
// Sync failMode changes at runtime
|
|
137
|
+
configManager.onChange((c) => {
|
|
138
|
+
pluginManager.setFailMode(c.server.failMode ?? 'open');
|
|
139
|
+
});
|
|
140
|
+
// Create and start server
|
|
141
|
+
const server = (0, server_js_1.createProxyServer)(config, pluginManager, () => {
|
|
142
|
+
for (const cb of destroyCallbacks)
|
|
143
|
+
cb().catch(() => { });
|
|
144
|
+
(0, database_js_1.closeDatabase)();
|
|
145
|
+
}, db, configManager, getPluginState);
|
|
146
|
+
await (0, server_js_1.startServer)(server, config);
|
|
147
|
+
// Write PID file
|
|
148
|
+
(0, daemon_js_1.writePidFile)(process.pid);
|
|
149
|
+
// Centralized data retention purge
|
|
150
|
+
const requestsRepo = new requests_js_1.RequestsRepository(db);
|
|
151
|
+
const dlpEventsRepo = new dlp_events_js_1.DlpEventsRepository(db);
|
|
152
|
+
const optimizerEventsRepo = new optimizer_events_js_1.OptimizerEventsRepository(db);
|
|
153
|
+
const sessionsRepo = new sessions_js_1.SessionsRepository(db);
|
|
154
|
+
const auditLogRepo = new audit_log_js_1.AuditLogRepository(db);
|
|
155
|
+
const toolCallsRepo = new tool_calls_js_1.ToolCallsRepository(db);
|
|
156
|
+
const pluginEventsRepo = new plugin_events_js_1.PluginEventsRepository(db);
|
|
157
|
+
function runPurge() {
|
|
158
|
+
const r = configManager.get().retention;
|
|
159
|
+
try {
|
|
160
|
+
let total = 0;
|
|
161
|
+
total += requestsRepo.purgeOlderThan(r.requestsHours);
|
|
162
|
+
total += dlpEventsRepo.purgeOlderThan(r.dlpEventsHours);
|
|
163
|
+
total += optimizerEventsRepo.purgeOlderThan(r.optimizerEventsHours);
|
|
164
|
+
total += sessionsRepo.purgeOlderThan(r.sessionsHours);
|
|
165
|
+
total += auditLogRepo.purgeOlderThan(r.auditLogHours);
|
|
166
|
+
total += toolCallsRepo.purgeOlderThan(r.toolCallsHours);
|
|
167
|
+
total += pluginEventsRepo.purgeOlderThan(r.pluginEventsHours ?? 720);
|
|
168
|
+
if (total > 0)
|
|
169
|
+
log.info('Data retention purge completed', { purged: total });
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
log.warn('Data retention purge failed', { error: err.message });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Run immediately on startup, then every hour
|
|
176
|
+
runPurge();
|
|
177
|
+
const purgeInterval = setInterval(runPurge, 60 * 60 * 1000);
|
|
178
|
+
purgeInterval.unref();
|
|
179
|
+
const baseUrl = `http://${config.server.host}:${config.server.port}`;
|
|
180
|
+
log.info('Gateway ready', {
|
|
181
|
+
host: config.server.host,
|
|
182
|
+
port: config.server.port,
|
|
183
|
+
plugins: pluginManager.getPlugins().map((p) => p.name),
|
|
184
|
+
dashboard: `${baseUrl}/dashboard`,
|
|
185
|
+
httpsProxy: baseUrl,
|
|
186
|
+
caCert: (0, certs_js_1.getCACertPath)(),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
// Auto-start if run directly (daemon mode)
|
|
190
|
+
if (process.env.BASTION_DAEMON === '1' || process.argv[1]?.endsWith('index.ts') || process.argv[1]?.endsWith('index.js')) {
|
|
191
|
+
// Only auto-start when this file is the entry point (not imported from CLI)
|
|
192
|
+
const isCLI = process.argv.some((a) => a.includes('cli'));
|
|
193
|
+
if (!isCLI) {
|
|
194
|
+
startGateway().catch((err) => {
|
|
195
|
+
log.error('Failed to start gateway', { error: err.message });
|
|
196
|
+
process.exit(1);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface LicensePayload {
|
|
2
|
+
plan: string;
|
|
3
|
+
expiresAt: string;
|
|
4
|
+
features: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface LicenseResult {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
payload?: LicensePayload;
|
|
9
|
+
reason?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Verify a signed license token.
|
|
13
|
+
*
|
|
14
|
+
* Returns { valid: true, payload } on success,
|
|
15
|
+
* or { valid: false, reason } on failure.
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifyLicenseToken(token: unknown): LicenseResult;
|
|
18
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/license/verify.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAmDhE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.verifyLicenseToken = verifyLicenseToken;
|
|
7
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
8
|
+
/**
|
|
9
|
+
* Bastion Pro license verification.
|
|
10
|
+
*
|
|
11
|
+
* License token format: base64(JSON payload) + '.' + base64(Ed25519 signature)
|
|
12
|
+
*
|
|
13
|
+
* The Pro plugin sets a signed token; we verify it here with the embedded
|
|
14
|
+
* public key so a forged plugin cannot simply claim `valid: true`.
|
|
15
|
+
*/
|
|
16
|
+
// Ed25519 public key (PEM) — only Bastion can sign with the corresponding private key.
|
|
17
|
+
// Replace this with the real production key before shipping.
|
|
18
|
+
const LICENSE_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
|
|
19
|
+
MCowBQYDK2VwAyEAPlr2YjKxlMzVGOZ2WFmYOFCT3JHaFz8rECPFwbzVSXg=
|
|
20
|
+
-----END PUBLIC KEY-----`;
|
|
21
|
+
/**
|
|
22
|
+
* Verify a signed license token.
|
|
23
|
+
*
|
|
24
|
+
* Returns { valid: true, payload } on success,
|
|
25
|
+
* or { valid: false, reason } on failure.
|
|
26
|
+
*/
|
|
27
|
+
function verifyLicenseToken(token) {
|
|
28
|
+
if (typeof token !== 'string' || !token.includes('.')) {
|
|
29
|
+
return { valid: false, reason: 'malformed token' };
|
|
30
|
+
}
|
|
31
|
+
const dotIndex = token.lastIndexOf('.');
|
|
32
|
+
const payloadB64 = token.slice(0, dotIndex);
|
|
33
|
+
const signatureB64 = token.slice(dotIndex + 1);
|
|
34
|
+
// Verify signature
|
|
35
|
+
let signatureValid;
|
|
36
|
+
try {
|
|
37
|
+
const key = node_crypto_1.default.createPublicKey(LICENSE_PUBLIC_KEY);
|
|
38
|
+
signatureValid = node_crypto_1.default.verify(null, // Ed25519 does not use a separate hash algorithm
|
|
39
|
+
Buffer.from(payloadB64, 'base64'), key, Buffer.from(signatureB64, 'base64'));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return { valid: false, reason: 'signature verification error' };
|
|
43
|
+
}
|
|
44
|
+
if (!signatureValid) {
|
|
45
|
+
return { valid: false, reason: 'invalid signature' };
|
|
46
|
+
}
|
|
47
|
+
// Decode payload
|
|
48
|
+
let payload;
|
|
49
|
+
try {
|
|
50
|
+
payload = JSON.parse(Buffer.from(payloadB64, 'base64').toString('utf-8'));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return { valid: false, reason: 'invalid payload' };
|
|
54
|
+
}
|
|
55
|
+
// Check expiry
|
|
56
|
+
if (typeof payload.expiresAt === 'string') {
|
|
57
|
+
const exp = new Date(payload.expiresAt);
|
|
58
|
+
if (exp.getTime() < Date.now()) {
|
|
59
|
+
return { valid: false, reason: 'license expired' };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
valid: true,
|
|
64
|
+
payload: {
|
|
65
|
+
plan: payload.plan ?? 'pro',
|
|
66
|
+
expiresAt: payload.expiresAt ?? '',
|
|
67
|
+
features: payload.features ?? [],
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/license/verify.ts"],"names":[],"mappings":";;;;;AAmCA,gDAmDC;AAtFD,8DAAiC;AAEjC;;;;;;;GAOG;AAEH,uFAAuF;AACvF,6DAA6D;AAC7D,MAAM,kBAAkB,GAAG;;yBAEF,CAAC;AAc1B;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE/C,mBAAmB;IACnB,IAAI,cAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,qBAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;QACvD,cAAc,GAAG,qBAAM,CAAC,MAAM,CAC5B,IAAI,EAAE,iDAAiD;QACvD,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EACjC,GAAG,EACH,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CACpC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACvD,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAgC,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACrD,CAAC;IAED,eAAe;IACf,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE;YACP,IAAI,EAAG,OAAO,CAAC,IAAe,IAAI,KAAK;YACvC,SAAS,EAAG,OAAO,CAAC,SAAoB,IAAI,EAAE;YAC9C,QAAQ,EAAG,OAAO,CAAC,QAAqB,IAAI,EAAE;SAC/C;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ResponseCompleteContext } from '../plugins/types.js';
|
|
2
|
+
export interface UsageMetrics {
|
|
3
|
+
inputTokens: number;
|
|
4
|
+
outputTokens: number;
|
|
5
|
+
cacheCreationTokens: number;
|
|
6
|
+
cacheReadTokens: number;
|
|
7
|
+
costUsd: number;
|
|
8
|
+
latencyMs: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function extractMetrics(context: ResponseCompleteContext): UsageMetrics;
|
|
11
|
+
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/metrics/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGnE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,YAAY,CAmB7E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractMetrics = extractMetrics;
|
|
4
|
+
const pricing_js_1 = require("./pricing.js");
|
|
5
|
+
function extractMetrics(context) {
|
|
6
|
+
const { usage, latencyMs, request } = context;
|
|
7
|
+
const costUsd = (0, pricing_js_1.calculateCost)(request.model, usage.inputTokens, usage.outputTokens, usage.cacheCreationTokens, usage.cacheReadTokens);
|
|
8
|
+
return {
|
|
9
|
+
inputTokens: usage.inputTokens,
|
|
10
|
+
outputTokens: usage.outputTokens,
|
|
11
|
+
cacheCreationTokens: usage.cacheCreationTokens,
|
|
12
|
+
cacheReadTokens: usage.cacheReadTokens,
|
|
13
|
+
costUsd,
|
|
14
|
+
latencyMs,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=collector.js.map
|