@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,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PluginManager = void 0;
|
|
4
|
+
const timeout_js_1 = require("../utils/timeout.js");
|
|
5
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
6
|
+
const log = (0, logger_js_1.createLogger)('plugins');
|
|
7
|
+
class PluginManager {
|
|
8
|
+
plugins = [];
|
|
9
|
+
disabledPlugins = new Set();
|
|
10
|
+
timeoutMs;
|
|
11
|
+
failMode;
|
|
12
|
+
constructor(timeoutMs = 50, failMode = 'open') {
|
|
13
|
+
this.timeoutMs = timeoutMs;
|
|
14
|
+
this.failMode = failMode;
|
|
15
|
+
}
|
|
16
|
+
setFailMode(mode) {
|
|
17
|
+
this.failMode = mode;
|
|
18
|
+
log.info('Fail mode updated', { failMode: mode });
|
|
19
|
+
}
|
|
20
|
+
register(plugin) {
|
|
21
|
+
this.plugins.push(plugin);
|
|
22
|
+
this.plugins.sort((a, b) => a.priority - b.priority);
|
|
23
|
+
log.info('Plugin registered', { name: plugin.name, priority: plugin.priority });
|
|
24
|
+
}
|
|
25
|
+
getPlugins() {
|
|
26
|
+
return [...this.plugins];
|
|
27
|
+
}
|
|
28
|
+
disable(name) {
|
|
29
|
+
const plugin = this.plugins.find((p) => p.name === name);
|
|
30
|
+
if (!plugin)
|
|
31
|
+
return false;
|
|
32
|
+
this.disabledPlugins.add(name);
|
|
33
|
+
log.info('Plugin disabled', { name });
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
enable(name) {
|
|
37
|
+
const existed = this.disabledPlugins.delete(name);
|
|
38
|
+
if (existed) {
|
|
39
|
+
log.info('Plugin enabled', { name });
|
|
40
|
+
}
|
|
41
|
+
return existed;
|
|
42
|
+
}
|
|
43
|
+
isDisabled(name) {
|
|
44
|
+
return this.disabledPlugins.has(name);
|
|
45
|
+
}
|
|
46
|
+
async runOnRequest(context) {
|
|
47
|
+
const result = {};
|
|
48
|
+
for (const plugin of this.plugins) {
|
|
49
|
+
if (!plugin.onRequest || this.disabledPlugins.has(plugin.name))
|
|
50
|
+
continue;
|
|
51
|
+
try {
|
|
52
|
+
const pluginResult = await (0, timeout_js_1.withTimeout)(plugin.onRequest(context), this.timeoutMs);
|
|
53
|
+
if (pluginResult) {
|
|
54
|
+
// Short-circuit takes priority
|
|
55
|
+
if (pluginResult.shortCircuit) {
|
|
56
|
+
log.info('Plugin short-circuited request', { plugin: plugin.name });
|
|
57
|
+
return pluginResult;
|
|
58
|
+
}
|
|
59
|
+
// Block takes second priority
|
|
60
|
+
if (pluginResult.blocked) {
|
|
61
|
+
log.info('Plugin blocked request', { plugin: plugin.name, reason: pluginResult.blocked.reason });
|
|
62
|
+
return pluginResult;
|
|
63
|
+
}
|
|
64
|
+
// Accumulate body modifications
|
|
65
|
+
if (pluginResult.modifiedBody) {
|
|
66
|
+
result.modifiedBody = pluginResult.modifiedBody;
|
|
67
|
+
// Update context body for next plugin
|
|
68
|
+
context.body = pluginResult.modifiedBody;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const reason = err instanceof timeout_js_1.TimeoutError
|
|
74
|
+
? 'timeout'
|
|
75
|
+
: err.message;
|
|
76
|
+
if (this.failMode === 'closed') {
|
|
77
|
+
log.error('Plugin failed in fail-closed mode, rejecting request', { plugin: plugin.name, reason });
|
|
78
|
+
return { pluginError: { pluginName: plugin.name, reason } };
|
|
79
|
+
}
|
|
80
|
+
if (err instanceof timeout_js_1.TimeoutError) {
|
|
81
|
+
log.warn('Plugin timed out, skipping', { plugin: plugin.name });
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
log.warn('Plugin error, skipping', { plugin: plugin.name, error: reason });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
async runOnResponse(context) {
|
|
91
|
+
const result = {};
|
|
92
|
+
for (const plugin of this.plugins) {
|
|
93
|
+
if (!plugin.onResponse || this.disabledPlugins.has(plugin.name))
|
|
94
|
+
continue;
|
|
95
|
+
try {
|
|
96
|
+
const pluginResult = await (0, timeout_js_1.withTimeout)(plugin.onResponse(context), this.timeoutMs * 100);
|
|
97
|
+
if (pluginResult) {
|
|
98
|
+
if (pluginResult.blocked) {
|
|
99
|
+
log.info('Plugin blocked response', { plugin: plugin.name, reason: pluginResult.blocked.reason });
|
|
100
|
+
return pluginResult;
|
|
101
|
+
}
|
|
102
|
+
if (pluginResult.modifiedBody) {
|
|
103
|
+
result.modifiedBody = pluginResult.modifiedBody;
|
|
104
|
+
context.body = pluginResult.modifiedBody;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
const reason = err instanceof timeout_js_1.TimeoutError
|
|
110
|
+
? 'timeout'
|
|
111
|
+
: err.message;
|
|
112
|
+
if (this.failMode === 'closed') {
|
|
113
|
+
log.error('Plugin onResponse failed in fail-closed mode, rejecting', { plugin: plugin.name, reason });
|
|
114
|
+
return { pluginError: { pluginName: plugin.name, reason } };
|
|
115
|
+
}
|
|
116
|
+
if (err instanceof timeout_js_1.TimeoutError) {
|
|
117
|
+
log.warn('Plugin onResponse timed out, skipping', { plugin: plugin.name });
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
log.warn('Plugin onResponse error, skipping', { plugin: plugin.name, error: reason });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
async runOnResponseComplete(context) {
|
|
127
|
+
for (const plugin of this.plugins) {
|
|
128
|
+
if (!plugin.onResponseComplete || this.disabledPlugins.has(plugin.name))
|
|
129
|
+
continue;
|
|
130
|
+
try {
|
|
131
|
+
await (0, timeout_js_1.withTimeout)(plugin.onResponseComplete(context), this.timeoutMs * 10);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
if (err instanceof timeout_js_1.TimeoutError) {
|
|
135
|
+
log.warn('Plugin onResponseComplete timed out, skipping', { plugin: plugin.name });
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
log.warn('Plugin onResponseComplete error, skipping', {
|
|
139
|
+
plugin: plugin.name,
|
|
140
|
+
error: err.message,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.PluginManager = PluginManager;
|
|
148
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":";;;AACA,oDAAgE;AAChE,kDAAkD;AAElD,MAAM,GAAG,GAAG,IAAA,wBAAY,EAAC,SAAS,CAAC,CAAC;AAEpC,MAAa,aAAa;IAChB,OAAO,GAAa,EAAE,CAAC;IACvB,eAAe,GAAgB,IAAI,GAAG,EAAE,CAAC;IACzC,SAAS,CAAS;IAClB,QAAQ,CAAoB;IAEpC,YAAY,YAAoB,EAAE,EAAE,WAA8B,MAAM;QACtE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,IAAuB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAuB;QACxC,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEzE,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,IAAA,wBAAW,EACpC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EACzB,IAAI,CAAC,SAAS,CACf,CAAC;gBAEF,IAAI,YAAY,EAAE,CAAC;oBACjB,+BAA+B;oBAC/B,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;wBAC9B,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;wBACpE,OAAO,YAAY,CAAC;oBACtB,CAAC;oBACD,8BAA8B;oBAC9B,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;wBACzB,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;wBACjG,OAAO,YAAY,CAAC;oBACtB,CAAC;oBACD,gCAAgC;oBAChC,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;wBAC9B,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;wBAChD,sCAAsC;wBACtC,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,GAAG,YAAY,yBAAY;oBACxC,CAAC,CAAC,SAAS;oBACX,CAAC,CAAE,GAAa,CAAC,OAAO,CAAC;gBAE3B,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC/B,GAAG,CAAC,KAAK,CAAC,sDAAsD,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACnG,OAAO,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;gBAC9D,CAAC;gBAED,IAAI,GAAG,YAAY,yBAAY,EAAE,CAAC;oBAChC,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAiC;QACnD,MAAM,MAAM,GAAyB,EAAE,CAAC;QAExC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE1E,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,IAAA,wBAAW,EACpC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAC1B,IAAI,CAAC,SAAS,GAAG,GAAG,CACrB,CAAC;gBAEF,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;wBACzB,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;wBAClG,OAAO,YAAY,CAAC;oBACtB,CAAC;oBACD,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;wBAC9B,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;wBAChD,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,GAAG,YAAY,yBAAY;oBACxC,CAAC,CAAC,SAAS;oBACX,CAAC,CAAE,GAAa,CAAC,OAAO,CAAC;gBAE3B,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC/B,GAAG,CAAC,KAAK,CAAC,yDAAyD,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACtG,OAAO,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;gBAC9D,CAAC;gBAED,IAAI,GAAG,YAAY,yBAAY,EAAE,CAAC;oBAChC,GAAG,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAgC;QAC1D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,SAAS;YAElF,IAAI,CAAC;gBACH,MAAM,IAAA,wBAAW,EACf,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAClC,IAAI,CAAC,SAAS,GAAG,EAAE,CACpB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,yBAAY,EAAE,CAAC;oBAChC,GAAG,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrF,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,CAAC,2CAA2C,EAAE;wBACpD,MAAM,EAAE,MAAM,CAAC,IAAI;wBACnB,KAAK,EAAG,GAAa,CAAC,OAAO;qBAC9B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAjKD,sCAiKC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { Plugin } from './types.js';
|
|
3
|
+
import type { PluginEventBus } from './event-bus.js';
|
|
4
|
+
export interface ExternalPluginConfig {
|
|
5
|
+
package: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
config?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare function loadExternalPlugins(externalConfigs: ExternalPluginConfig[], db: Database.Database, eventBus: PluginEventBus): Promise<{
|
|
10
|
+
plugins: Plugin[];
|
|
11
|
+
destroyCallbacks: Array<() => Promise<void>>;
|
|
12
|
+
getPluginState: (pluginName: string, key: string) => unknown | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQrD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,oBAAoB,EAAE,EACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAAC,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC,CAwGxJ"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadExternalPlugins = loadExternalPlugins;
|
|
4
|
+
const index_js_1 = require("../plugin-api/index.js");
|
|
5
|
+
const plugin_events_js_1 = require("../storage/repositories/plugin-events.js");
|
|
6
|
+
const context_js_1 = require("./context.js");
|
|
7
|
+
const adapter_js_1 = require("./adapter.js");
|
|
8
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
9
|
+
const log = (0, logger_js_1.createLogger)('plugin-loader');
|
|
10
|
+
async function loadExternalPlugins(externalConfigs, db, eventBus) {
|
|
11
|
+
const plugins = [];
|
|
12
|
+
const destroyCallbacks = [];
|
|
13
|
+
const contextMap = new Map();
|
|
14
|
+
const repo = new plugin_events_js_1.PluginEventsRepository(db);
|
|
15
|
+
let priorityCounter = 50;
|
|
16
|
+
for (const cfg of externalConfigs) {
|
|
17
|
+
if (cfg.enabled === false) {
|
|
18
|
+
log.info('External plugin disabled, skipping', { package: cfg.package });
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
// Dynamic import
|
|
22
|
+
let mod;
|
|
23
|
+
try {
|
|
24
|
+
mod = await import(cfg.package);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
log.warn('Failed to import external plugin package', {
|
|
28
|
+
package: cfg.package,
|
|
29
|
+
error: err.message,
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Find register() export (ESM default or CJS)
|
|
34
|
+
const registerFn = (mod.register ?? mod.default?.register);
|
|
35
|
+
if (typeof registerFn !== 'function') {
|
|
36
|
+
log.warn('External plugin package has no register() export', { package: cfg.package });
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Call register()
|
|
40
|
+
let manifest;
|
|
41
|
+
try {
|
|
42
|
+
manifest = registerFn();
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
log.warn('External plugin register() threw', {
|
|
46
|
+
package: cfg.package,
|
|
47
|
+
error: err.message,
|
|
48
|
+
});
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Process each plugin from the manifest
|
|
52
|
+
for (const externalPlugin of manifest.plugins) {
|
|
53
|
+
// Validate apiVersion
|
|
54
|
+
if (externalPlugin.apiVersion !== index_js_1.PLUGIN_API_VERSION) {
|
|
55
|
+
log.warn('External plugin apiVersion mismatch, skipping', {
|
|
56
|
+
plugin: externalPlugin.name,
|
|
57
|
+
expected: index_js_1.PLUGIN_API_VERSION,
|
|
58
|
+
got: externalPlugin.apiVersion,
|
|
59
|
+
});
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Create context and call onInit
|
|
63
|
+
const context = (0, context_js_1.createPluginContext)(externalPlugin.name, cfg.config ?? {}, repo, eventBus);
|
|
64
|
+
contextMap.set(externalPlugin.name, context);
|
|
65
|
+
try {
|
|
66
|
+
if (externalPlugin.onInit) {
|
|
67
|
+
await externalPlugin.onInit(context);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
log.warn('External plugin onInit failed, skipping', {
|
|
72
|
+
plugin: externalPlugin.name,
|
|
73
|
+
error: err.message,
|
|
74
|
+
});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Adapt to internal Plugin interface
|
|
78
|
+
const adapted = (0, adapter_js_1.adaptPlugin)(externalPlugin, priorityCounter, repo, cfg.package);
|
|
79
|
+
priorityCounter += 1;
|
|
80
|
+
plugins.push(adapted);
|
|
81
|
+
// Collect destroy callbacks
|
|
82
|
+
if (externalPlugin.onDestroy) {
|
|
83
|
+
destroyCallbacks.push(externalPlugin.onDestroy.bind(externalPlugin));
|
|
84
|
+
}
|
|
85
|
+
log.info('External plugin loaded', {
|
|
86
|
+
plugin: externalPlugin.name,
|
|
87
|
+
version: externalPlugin.version,
|
|
88
|
+
priority: adapted.priority,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function getPluginState(pluginName, key) {
|
|
93
|
+
const ctx = contextMap.get(pluginName);
|
|
94
|
+
return ctx ? ctx._getState(key) : undefined;
|
|
95
|
+
}
|
|
96
|
+
return { plugins, destroyCallbacks, getPluginState };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export interface RequestContext {
|
|
2
|
+
id: string;
|
|
3
|
+
provider: string;
|
|
4
|
+
model: string;
|
|
5
|
+
method: string;
|
|
6
|
+
path: string;
|
|
7
|
+
headers: Record<string, string>;
|
|
8
|
+
body: string;
|
|
9
|
+
parsedBody: Record<string, unknown>;
|
|
10
|
+
isStreaming: boolean;
|
|
11
|
+
startTime: number;
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
sessionSource?: string;
|
|
14
|
+
apiKeyHash?: string;
|
|
15
|
+
/** Set by DLP scanner during onRequest/onResponse for downstream plugins */
|
|
16
|
+
dlpHit?: boolean;
|
|
17
|
+
dlpAction?: string;
|
|
18
|
+
dlpFindings?: number;
|
|
19
|
+
/** Set by tool-guard plugin during onResponseComplete */
|
|
20
|
+
toolGuardHit?: boolean;
|
|
21
|
+
toolGuardFindings?: number;
|
|
22
|
+
/** Internal: set by tool-guard onResponse to skip duplicate recording in onResponseComplete */
|
|
23
|
+
_toolGuardRecorded?: boolean;
|
|
24
|
+
/** Internal: set by tool-guard onRequest to enable streaming interception in forwarder.
|
|
25
|
+
* Value is the blockMinSeverity threshold. */
|
|
26
|
+
_toolGuardStreamBlock?: string;
|
|
27
|
+
/** Internal: DB-loaded rules for streaming guard (set by tool-guard onRequest) */
|
|
28
|
+
_toolGuardRules?: import('../tool-guard/rules.js').ToolGuardRule[];
|
|
29
|
+
}
|
|
30
|
+
export interface ResponseCompleteContext {
|
|
31
|
+
request: RequestContext;
|
|
32
|
+
statusCode: number;
|
|
33
|
+
body: string;
|
|
34
|
+
parsedBody: Record<string, unknown> | null;
|
|
35
|
+
usage: {
|
|
36
|
+
inputTokens: number;
|
|
37
|
+
outputTokens: number;
|
|
38
|
+
cacheCreationTokens: number;
|
|
39
|
+
cacheReadTokens: number;
|
|
40
|
+
};
|
|
41
|
+
latencyMs: number;
|
|
42
|
+
isStreaming: boolean;
|
|
43
|
+
/** Pre-parsed SSE events from streaming responses (avoids re-parsing body) */
|
|
44
|
+
sseEvents?: Record<string, unknown>[];
|
|
45
|
+
}
|
|
46
|
+
export interface ShortCircuitResponse {
|
|
47
|
+
statusCode: number;
|
|
48
|
+
headers: Record<string, string>;
|
|
49
|
+
body: string;
|
|
50
|
+
}
|
|
51
|
+
export interface PluginRequestResult {
|
|
52
|
+
shortCircuit?: ShortCircuitResponse;
|
|
53
|
+
blocked?: {
|
|
54
|
+
reason: string;
|
|
55
|
+
};
|
|
56
|
+
pluginError?: {
|
|
57
|
+
pluginName: string;
|
|
58
|
+
reason: string;
|
|
59
|
+
};
|
|
60
|
+
modifiedBody?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ResponseInterceptContext {
|
|
63
|
+
request: RequestContext;
|
|
64
|
+
statusCode: number;
|
|
65
|
+
headers: Record<string, string>;
|
|
66
|
+
body: string;
|
|
67
|
+
parsedBody: Record<string, unknown> | null;
|
|
68
|
+
isStreaming: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface PluginResponseResult {
|
|
71
|
+
blocked?: {
|
|
72
|
+
reason: string;
|
|
73
|
+
};
|
|
74
|
+
pluginError?: {
|
|
75
|
+
pluginName: string;
|
|
76
|
+
reason: string;
|
|
77
|
+
};
|
|
78
|
+
modifiedBody?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface Plugin {
|
|
81
|
+
name: string;
|
|
82
|
+
priority: number;
|
|
83
|
+
version?: string;
|
|
84
|
+
apiVersion?: number;
|
|
85
|
+
source?: 'builtin' | 'external';
|
|
86
|
+
packageName?: string;
|
|
87
|
+
onRequest?(context: RequestContext): Promise<PluginRequestResult | void>;
|
|
88
|
+
onResponse?(context: ResponseInterceptContext): Promise<PluginResponseResult | void>;
|
|
89
|
+
onResponseComplete?(context: ResponseCompleteContext): Promise<void>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certs.d.ts","sourceRoot":"","sources":["../../src/proxy/certs.ts"],"names":[],"mappings":"AAeA,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,QAAQ,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqDxD;AAKD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAkD3E"}
|
|
@@ -0,0 +1,110 @@
|
|
|
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.getCACertPath = getCACertPath;
|
|
7
|
+
exports.ensureCA = ensureCA;
|
|
8
|
+
exports.getHostCert = getHostCert;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const node_os_1 = require("node:os");
|
|
13
|
+
const node_forge_1 = __importDefault(require("node-forge"));
|
|
14
|
+
const paths_js_1 = require("../config/paths.js");
|
|
15
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
16
|
+
const log = (0, logger_js_1.createLogger)('certs');
|
|
17
|
+
const CA_KEY_PATH = (0, node_path_1.join)(paths_js_1.paths.bastionDir, 'ca.key');
|
|
18
|
+
const CA_CERT_PATH = (0, node_path_1.join)(paths_js_1.paths.bastionDir, 'ca.crt');
|
|
19
|
+
const CERTS_DIR = (0, node_path_1.join)(paths_js_1.paths.bastionDir, 'certs');
|
|
20
|
+
const IS_WIN = (0, node_os_1.platform)() === 'win32';
|
|
21
|
+
function getCACertPath() {
|
|
22
|
+
return CA_CERT_PATH;
|
|
23
|
+
}
|
|
24
|
+
function ensureCA() {
|
|
25
|
+
(0, node_fs_1.mkdirSync)(paths_js_1.paths.bastionDir, { recursive: true });
|
|
26
|
+
if ((0, node_fs_1.existsSync)(CA_KEY_PATH) && (0, node_fs_1.existsSync)(CA_CERT_PATH)) {
|
|
27
|
+
return {
|
|
28
|
+
key: (0, node_fs_1.readFileSync)(CA_KEY_PATH, 'utf-8'),
|
|
29
|
+
cert: (0, node_fs_1.readFileSync)(CA_CERT_PATH, 'utf-8'),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
log.info('Generating local CA certificate');
|
|
33
|
+
// Use Node's native crypto for fast RSA key generation
|
|
34
|
+
const { privateKey: keyPem, publicKey: pubPem } = (0, node_crypto_1.generateKeyPairSync)('rsa', {
|
|
35
|
+
modulusLength: 2048,
|
|
36
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
37
|
+
privateKeyEncoding: { type: 'pkcs1', format: 'pem' },
|
|
38
|
+
});
|
|
39
|
+
// Use node-forge to create the X.509 CA certificate
|
|
40
|
+
const privateKey = node_forge_1.default.pki.privateKeyFromPem(keyPem);
|
|
41
|
+
const publicKey = node_forge_1.default.pki.publicKeyFromPem(pubPem);
|
|
42
|
+
const cert = node_forge_1.default.pki.createCertificate();
|
|
43
|
+
cert.publicKey = publicKey;
|
|
44
|
+
cert.serialNumber = (0, node_crypto_1.randomBytes)(16).toString('hex');
|
|
45
|
+
cert.validity.notBefore = new Date();
|
|
46
|
+
cert.validity.notAfter = new Date();
|
|
47
|
+
cert.validity.notAfter.setDate(cert.validity.notAfter.getDate() + 825);
|
|
48
|
+
const attrs = [
|
|
49
|
+
{ name: 'commonName', value: 'Bastion Local CA' },
|
|
50
|
+
{ name: 'organizationName', value: 'Bastion AI Gateway' },
|
|
51
|
+
];
|
|
52
|
+
cert.setSubject(attrs);
|
|
53
|
+
cert.setIssuer(attrs);
|
|
54
|
+
cert.setExtensions([
|
|
55
|
+
{ name: 'basicConstraints', cA: true },
|
|
56
|
+
{ name: 'keyUsage', keyCertSign: true, digitalSignature: true, cRLSign: true },
|
|
57
|
+
]);
|
|
58
|
+
cert.sign(privateKey, node_forge_1.default.md.sha256.create());
|
|
59
|
+
const certPem = node_forge_1.default.pki.certificateToPem(cert);
|
|
60
|
+
(0, node_fs_1.writeFileSync)(CA_KEY_PATH, keyPem);
|
|
61
|
+
if (!IS_WIN)
|
|
62
|
+
(0, node_fs_1.chmodSync)(CA_KEY_PATH, 0o600);
|
|
63
|
+
(0, node_fs_1.writeFileSync)(CA_CERT_PATH, certPem);
|
|
64
|
+
log.info('CA certificate created', { path: CA_CERT_PATH });
|
|
65
|
+
return { key: keyPem, cert: certPem };
|
|
66
|
+
}
|
|
67
|
+
// In-memory cache for generated host certs
|
|
68
|
+
const certCache = new Map();
|
|
69
|
+
function getHostCert(hostname) {
|
|
70
|
+
const cached = certCache.get(hostname);
|
|
71
|
+
if (cached)
|
|
72
|
+
return cached;
|
|
73
|
+
(0, node_fs_1.mkdirSync)(CERTS_DIR, { recursive: true });
|
|
74
|
+
// Generate host key pair (native crypto — fast)
|
|
75
|
+
const { privateKey: hostKeyPem, publicKey: hostPubPem } = (0, node_crypto_1.generateKeyPairSync)('rsa', {
|
|
76
|
+
modulusLength: 2048,
|
|
77
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
78
|
+
privateKeyEncoding: { type: 'pkcs1', format: 'pem' },
|
|
79
|
+
});
|
|
80
|
+
// Load CA key + cert
|
|
81
|
+
const caKey = node_forge_1.default.pki.privateKeyFromPem((0, node_fs_1.readFileSync)(CA_KEY_PATH, 'utf-8'));
|
|
82
|
+
const caCert = node_forge_1.default.pki.certificateFromPem((0, node_fs_1.readFileSync)(CA_CERT_PATH, 'utf-8'));
|
|
83
|
+
// Create host certificate signed by CA
|
|
84
|
+
const hostKey = node_forge_1.default.pki.publicKeyFromPem(hostPubPem);
|
|
85
|
+
const cert = node_forge_1.default.pki.createCertificate();
|
|
86
|
+
cert.publicKey = hostKey;
|
|
87
|
+
cert.serialNumber = (0, node_crypto_1.randomBytes)(16).toString('hex');
|
|
88
|
+
cert.validity.notBefore = new Date();
|
|
89
|
+
cert.validity.notAfter = new Date();
|
|
90
|
+
cert.validity.notAfter.setDate(cert.validity.notAfter.getDate() + 825);
|
|
91
|
+
cert.setSubject([{ name: 'commonName', value: hostname }]);
|
|
92
|
+
cert.setIssuer(caCert.subject.attributes);
|
|
93
|
+
cert.setExtensions([
|
|
94
|
+
{ name: 'subjectAltName', altNames: [{ type: 2, value: hostname }] },
|
|
95
|
+
]);
|
|
96
|
+
cert.sign(caKey, node_forge_1.default.md.sha256.create());
|
|
97
|
+
const result = {
|
|
98
|
+
key: hostKeyPem,
|
|
99
|
+
cert: node_forge_1.default.pki.certificateToPem(cert),
|
|
100
|
+
};
|
|
101
|
+
// Optionally cache to disk (for debugging), always cache in memory
|
|
102
|
+
const keyPath = (0, node_path_1.join)(CERTS_DIR, `${hostname}.key`);
|
|
103
|
+
const certPath = (0, node_path_1.join)(CERTS_DIR, `${hostname}.crt`);
|
|
104
|
+
(0, node_fs_1.writeFileSync)(keyPath, result.key);
|
|
105
|
+
(0, node_fs_1.writeFileSync)(certPath, result.cert);
|
|
106
|
+
certCache.set(hostname, result);
|
|
107
|
+
log.debug('Generated host certificate', { hostname });
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=certs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/proxy/certs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as net from 'node:net';
|
|
2
|
+
import type { PluginManager } from '../plugins/index.js';
|
|
3
|
+
import type { BastionConfig } from '../config/schema.js';
|
|
4
|
+
export declare function getSessionForSocket(socket: net.Socket): string | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Attach CONNECT handler to an existing HTTP server.
|
|
7
|
+
* - API hosts: MITM decrypt → plugin pipeline → forward to real upstream
|
|
8
|
+
* - All other hosts: plain TCP tunnel (no inspection)
|
|
9
|
+
*/
|
|
10
|
+
export declare function setupConnectHandler(server: net.Server, config: BastionConfig, pluginManager: PluginManager): void;
|
|
11
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/proxy/connect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgCzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AA4BD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,aAAa,GAC3B,IAAI,CAmCN"}
|