@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,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerStatsCommand = registerStatsCommand;
|
|
4
|
+
const database_js_1 = require("../../storage/database.js");
|
|
5
|
+
const requests_js_1 = require("../../storage/repositories/requests.js");
|
|
6
|
+
const cache_js_1 = require("../../storage/repositories/cache.js");
|
|
7
|
+
const dashboard_js_1 = require("../../metrics/dashboard.js");
|
|
8
|
+
function registerStatsCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command('stats')
|
|
11
|
+
.description('Show usage statistics')
|
|
12
|
+
.option('--hours <hours>', 'Show stats for last N hours')
|
|
13
|
+
.action((options) => {
|
|
14
|
+
try {
|
|
15
|
+
const db = (0, database_js_1.getDatabase)();
|
|
16
|
+
const requestsRepo = new requests_js_1.RequestsRepository(db);
|
|
17
|
+
const cacheRepo = new cache_js_1.CacheRepository(db);
|
|
18
|
+
const sinceHours = options.hours ? parseInt(options.hours, 10) : undefined;
|
|
19
|
+
const stats = requestsRepo.getStats({ sinceHours });
|
|
20
|
+
const cacheStats = cacheRepo.getStats();
|
|
21
|
+
console.log((0, dashboard_js_1.renderDashboard)(stats, cacheStats));
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error('Failed to load stats:', err.message);
|
|
25
|
+
console.error('Is Bastion initialized? Try running: bastion start');
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
(0, database_js_1.closeDatabase)();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":";;AAMA,oDAuBC;AA5BD,2DAAuE;AACvE,wEAA4E;AAC5E,kEAAsE;AACtE,6DAA6D;AAE7D,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,CAAC;SACxD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAA,yBAAW,GAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,gCAAkB,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,0BAAe,CAAC,EAAE,CAAC,CAAC;YAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3E,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YAExC,OAAO,CAAC,GAAG,CAAC,IAAA,8BAAe,EAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YAC/D,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAA,2BAAa,GAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB1D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerStopCommand = registerStopCommand;
|
|
4
|
+
const daemon_js_1 = require("../daemon.js");
|
|
5
|
+
const proxy_js_1 = require("./proxy.js");
|
|
6
|
+
function registerStopCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command('stop')
|
|
9
|
+
.description('Stop the Bastion AI Gateway')
|
|
10
|
+
.action(() => {
|
|
11
|
+
const status = (0, daemon_js_1.getDaemonStatus)();
|
|
12
|
+
if (!status.running) {
|
|
13
|
+
console.log('Bastion is not running');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const stopped = (0, daemon_js_1.stopDaemon)();
|
|
17
|
+
if (stopped) {
|
|
18
|
+
// Clean up macOS system proxy if it points to Bastion
|
|
19
|
+
// (prevents all traffic from breaking after gateway stops)
|
|
20
|
+
(0, proxy_js_1.clearSystemProxyIfBastion)();
|
|
21
|
+
console.log(`Bastion stopped (was PID: ${status.pid})`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log('Failed to stop Bastion');
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":";;AAIA,kDAsBC;AAzBD,4CAA2D;AAC3D,yCAAuD;AAEvD,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,IAAA,2BAAe,GAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,sBAAU,GAAE,CAAC;QAC7B,IAAI,OAAO,EAAE,CAAC;YACZ,sDAAsD;YACtD,2DAA2D;YAC3D,IAAA,oCAAyB,GAAE,CAAC;YAE5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB3D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerTokenCommand = registerTokenCommand;
|
|
4
|
+
const index_js_1 = require("../../config/index.js");
|
|
5
|
+
function mask(token) {
|
|
6
|
+
if (token.length <= 8)
|
|
7
|
+
return '****';
|
|
8
|
+
return token.slice(0, 4) + '...' + token.slice(-4);
|
|
9
|
+
}
|
|
10
|
+
function registerTokenCommand(program) {
|
|
11
|
+
program
|
|
12
|
+
.command('token')
|
|
13
|
+
.description('Show the dashboard auth token')
|
|
14
|
+
.option('--reveal', 'Show the full token (default: masked)')
|
|
15
|
+
.action((opts) => {
|
|
16
|
+
const config = (0, index_js_1.loadConfig)();
|
|
17
|
+
const token = config.server.auth?.token;
|
|
18
|
+
if (!token) {
|
|
19
|
+
console.log('No token configured. A random token is generated on each start.');
|
|
20
|
+
console.log('Check the startup log output for the generated token.');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (opts.reveal) {
|
|
24
|
+
console.log(token);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.log(mask(token));
|
|
28
|
+
console.log(' (use --reveal to show full token)');
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/cli/commands/token.ts"],"names":[],"mappings":";;AAQA,oDAsBC;AA7BD,oDAAmD;AAEnD,SAAS,IAAI,CAAC,KAAa;IACzB,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,UAAU,EAAE,uCAAuC,CAAC;SAC3D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,IAAA,qBAAU,GAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;QAExC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-ca.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/trust-ca.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC7D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerTrustCaCommand = registerTrustCaCommand;
|
|
4
|
+
const node_os_1 = require("node:os");
|
|
5
|
+
const certs_js_1 = require("../../proxy/certs.js");
|
|
6
|
+
function registerTrustCaCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command('trust-ca')
|
|
9
|
+
.description('Generate and display the Bastion CA certificate for trust configuration')
|
|
10
|
+
.action(() => {
|
|
11
|
+
// This will generate the CA if it doesn't exist
|
|
12
|
+
(0, certs_js_1.ensureCA)();
|
|
13
|
+
const certPath = (0, certs_js_1.getCACertPath)();
|
|
14
|
+
const plat = (0, node_os_1.platform)();
|
|
15
|
+
console.log('Bastion CA certificate generated.');
|
|
16
|
+
console.log('');
|
|
17
|
+
console.log(` Certificate: ${certPath}`);
|
|
18
|
+
console.log('');
|
|
19
|
+
console.log('For Node.js tools (Claude Code, etc.):');
|
|
20
|
+
console.log(` export NODE_EXTRA_CA_CERTS="${certPath}"`);
|
|
21
|
+
console.log('');
|
|
22
|
+
console.log('Or use "bastion wrap" which sets this automatically:');
|
|
23
|
+
console.log(' bastion wrap claude');
|
|
24
|
+
console.log('');
|
|
25
|
+
if (plat === 'darwin') {
|
|
26
|
+
console.log('To add to macOS system trust (optional):');
|
|
27
|
+
console.log(` sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${certPath}"`);
|
|
28
|
+
}
|
|
29
|
+
else if (plat === 'linux') {
|
|
30
|
+
console.log('To add to Linux system trust (optional):');
|
|
31
|
+
console.log(` sudo cp "${certPath}" /usr/local/share/ca-certificates/bastion-ca.crt`);
|
|
32
|
+
console.log(' sudo update-ca-certificates');
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log('For Python (requests/httpx):');
|
|
35
|
+
console.log(` export SSL_CERT_FILE="${certPath}"`);
|
|
36
|
+
console.log(` export REQUESTS_CA_BUNDLE="${certPath}"`);
|
|
37
|
+
}
|
|
38
|
+
else if (plat === 'win32') {
|
|
39
|
+
console.log('To add to Windows certificate store (optional):');
|
|
40
|
+
console.log(` certutil -addstore -user Root "${certPath}"`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=trust-ca.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-ca.js","sourceRoot":"","sources":["../../../src/cli/commands/trust-ca.ts"],"names":[],"mappings":";;AAIA,wDAqCC;AAxCD,qCAAmC;AACnC,mDAA+D;AAE/D,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,GAAG,EAAE;QACX,gDAAgD;QAChD,IAAA,mBAAQ,GAAE,CAAC;QACX,MAAM,QAAQ,GAAG,IAAA,wBAAa,GAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAA,kBAAQ,GAAE,CAAC;QAExB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,iCAAiC,QAAQ,GAAG,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,2FAA2F,QAAQ,GAAG,CAAC,CAAC;QACtH,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,mDAAmD,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,GAAG,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,GAAG,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,oCAAoC,QAAQ,GAAG,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE1D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerWrapCommand = registerWrapCommand;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const index_js_1 = require("../../config/index.js");
|
|
7
|
+
const certs_js_1 = require("../../proxy/certs.js");
|
|
8
|
+
const daemon_js_1 = require("../daemon.js");
|
|
9
|
+
function registerWrapCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('wrap')
|
|
12
|
+
.description('Run a command with AI traffic routed through Bastion')
|
|
13
|
+
.option('--base-url', 'Use BASE_URL mode instead of HTTPS_PROXY (breaks OAuth)')
|
|
14
|
+
.option('--label <label>', 'Human-readable session label')
|
|
15
|
+
.argument('<command...>', 'Command to run (e.g. "claude", "python app.py")')
|
|
16
|
+
.passThroughOptions()
|
|
17
|
+
.allowUnknownOption()
|
|
18
|
+
.action((args, options) => {
|
|
19
|
+
// Check if Bastion is running
|
|
20
|
+
const status = (0, daemon_js_1.getDaemonStatus)();
|
|
21
|
+
if (!status.running) {
|
|
22
|
+
console.error('Bastion is not running. Start it first: bastion start');
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const config = (0, index_js_1.loadConfig)();
|
|
27
|
+
const sessionId = (0, node_crypto_1.randomUUID)();
|
|
28
|
+
const [cmd, ...cmdArgs] = args;
|
|
29
|
+
const label = options.label ?? cmd;
|
|
30
|
+
console.log(`Bastion session: ${sessionId} (${label})`);
|
|
31
|
+
const baseUrl = `http://${config.server.host}:${config.server.port}`;
|
|
32
|
+
const caCertPath = (0, certs_js_1.getCACertPath)();
|
|
33
|
+
// Build environment
|
|
34
|
+
const env = { ...process.env };
|
|
35
|
+
if (options.baseUrl) {
|
|
36
|
+
// Legacy BASE_URL mode
|
|
37
|
+
env.ANTHROPIC_BASE_URL = baseUrl;
|
|
38
|
+
env.OPENAI_BASE_URL = baseUrl;
|
|
39
|
+
env.GOOGLE_AI_BASE_URL = baseUrl;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// HTTPS_PROXY mode (default, OAuth-compatible)
|
|
43
|
+
// Only proxy HTTPS — do NOT set HTTP_PROXY to avoid interfering with OAuth callbacks
|
|
44
|
+
env.HTTPS_PROXY = `http://${sessionId}@${config.server.host}:${config.server.port}`;
|
|
45
|
+
// Exclude proxy itself, auth/UI domains from proxying
|
|
46
|
+
env.NO_PROXY = [
|
|
47
|
+
config.server.host,
|
|
48
|
+
'localhost',
|
|
49
|
+
'console.anthropic.com',
|
|
50
|
+
'platform.claude.com',
|
|
51
|
+
'auth.anthropic.com',
|
|
52
|
+
].join(',');
|
|
53
|
+
env.NODE_EXTRA_CA_CERTS = caCertPath;
|
|
54
|
+
}
|
|
55
|
+
const child = (0, node_child_process_1.spawn)(cmd, cmdArgs, {
|
|
56
|
+
stdio: 'inherit',
|
|
57
|
+
env,
|
|
58
|
+
// Windows needs shell:true to find .cmd/.bat/.ps1 commands (e.g. "claude", "node")
|
|
59
|
+
...(process.platform === 'win32' ? { shell: true } : {}),
|
|
60
|
+
});
|
|
61
|
+
child.on('close', (code) => {
|
|
62
|
+
process.exitCode = code ?? 0;
|
|
63
|
+
});
|
|
64
|
+
child.on('error', (err) => {
|
|
65
|
+
console.error(`Failed to start: ${err.message}`);
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../../src/cli/commands/wrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function writePidFile(pid: number): void;
|
|
2
|
+
export declare function readPidFile(): number | null;
|
|
3
|
+
export declare function removePidFile(): void;
|
|
4
|
+
export declare function isProcessRunning(pid: number): boolean;
|
|
5
|
+
export declare function getDaemonStatus(): {
|
|
6
|
+
running: boolean;
|
|
7
|
+
pid: number | null;
|
|
8
|
+
};
|
|
9
|
+
export declare function spawnDaemon(): number;
|
|
10
|
+
export declare function stopDaemon(): boolean;
|
|
11
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAK3C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAO1E;AAED,wBAAgB,WAAW,IAAI,MAAM,CAsBpC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAYpC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writePidFile = writePidFile;
|
|
4
|
+
exports.readPidFile = readPidFile;
|
|
5
|
+
exports.removePidFile = removePidFile;
|
|
6
|
+
exports.isProcessRunning = isProcessRunning;
|
|
7
|
+
exports.getDaemonStatus = getDaemonStatus;
|
|
8
|
+
exports.spawnDaemon = spawnDaemon;
|
|
9
|
+
exports.stopDaemon = stopDaemon;
|
|
10
|
+
const node_child_process_1 = require("node:child_process");
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
const paths_js_1 = require("../config/paths.js");
|
|
14
|
+
function writePidFile(pid) {
|
|
15
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(paths_js_1.paths.pidFile), { recursive: true });
|
|
16
|
+
(0, node_fs_1.writeFileSync)(paths_js_1.paths.pidFile, pid.toString(), 'utf-8');
|
|
17
|
+
}
|
|
18
|
+
function readPidFile() {
|
|
19
|
+
if (!(0, node_fs_1.existsSync)(paths_js_1.paths.pidFile))
|
|
20
|
+
return null;
|
|
21
|
+
const content = (0, node_fs_1.readFileSync)(paths_js_1.paths.pidFile, 'utf-8').trim();
|
|
22
|
+
const pid = parseInt(content, 10);
|
|
23
|
+
return isNaN(pid) ? null : pid;
|
|
24
|
+
}
|
|
25
|
+
function removePidFile() {
|
|
26
|
+
if ((0, node_fs_1.existsSync)(paths_js_1.paths.pidFile)) {
|
|
27
|
+
(0, node_fs_1.unlinkSync)(paths_js_1.paths.pidFile);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function isProcessRunning(pid) {
|
|
31
|
+
try {
|
|
32
|
+
process.kill(pid, 0);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function getDaemonStatus() {
|
|
40
|
+
const pid = readPidFile();
|
|
41
|
+
if (pid === null)
|
|
42
|
+
return { running: false, pid: null };
|
|
43
|
+
if (isProcessRunning(pid))
|
|
44
|
+
return { running: true, pid };
|
|
45
|
+
// Stale PID file
|
|
46
|
+
removePidFile();
|
|
47
|
+
return { running: false, pid: null };
|
|
48
|
+
}
|
|
49
|
+
function spawnDaemon() {
|
|
50
|
+
const entryPoint = (0, node_path_1.resolve)((0, node_path_1.join)(__dirname, '..', 'index.js'));
|
|
51
|
+
// Use tsx for development, node for production
|
|
52
|
+
const isTs = entryPoint.endsWith('.ts');
|
|
53
|
+
const command = isTs ? 'npx' : 'node';
|
|
54
|
+
const args = isTs ? ['tsx', entryPoint] : [entryPoint];
|
|
55
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(paths_js_1.paths.logFile), { recursive: true });
|
|
56
|
+
const child = (0, node_child_process_1.spawn)(command, args, {
|
|
57
|
+
detached: true,
|
|
58
|
+
stdio: 'ignore',
|
|
59
|
+
env: { ...process.env, BASTION_DAEMON: '1' },
|
|
60
|
+
// Prevent a console window from popping up on Windows
|
|
61
|
+
...(process.platform === 'win32' ? { windowsHide: true } : {}),
|
|
62
|
+
});
|
|
63
|
+
child.unref();
|
|
64
|
+
const pid = child.pid;
|
|
65
|
+
writePidFile(pid);
|
|
66
|
+
return pid;
|
|
67
|
+
}
|
|
68
|
+
function stopDaemon() {
|
|
69
|
+
const { running, pid } = getDaemonStatus();
|
|
70
|
+
if (!running || pid === null)
|
|
71
|
+
return false;
|
|
72
|
+
try {
|
|
73
|
+
process.kill(pid, 'SIGTERM');
|
|
74
|
+
removePidFile();
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
removePidFile();
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const start_js_1 = require("./commands/start.js");
|
|
6
|
+
const stop_js_1 = require("./commands/stop.js");
|
|
7
|
+
const stats_js_1 = require("./commands/stats.js");
|
|
8
|
+
const health_js_1 = require("./commands/health.js");
|
|
9
|
+
const config_js_1 = require("./commands/config.js");
|
|
10
|
+
const env_js_1 = require("./commands/env.js");
|
|
11
|
+
const wrap_js_1 = require("./commands/wrap.js");
|
|
12
|
+
const trust_ca_js_1 = require("./commands/trust-ca.js");
|
|
13
|
+
const proxy_js_1 = require("./commands/proxy.js");
|
|
14
|
+
const openclaw_js_1 = require("./commands/openclaw.js");
|
|
15
|
+
const token_js_1 = require("./commands/token.js");
|
|
16
|
+
const version_js_1 = require("../version.js");
|
|
17
|
+
const program = new commander_1.Command();
|
|
18
|
+
program
|
|
19
|
+
.name('bastion')
|
|
20
|
+
.description('Bastion AI Gateway — Local-first proxy for LLM providers')
|
|
21
|
+
.version((0, version_js_1.getVersion)())
|
|
22
|
+
.enablePositionalOptions();
|
|
23
|
+
(0, start_js_1.registerStartCommand)(program);
|
|
24
|
+
(0, stop_js_1.registerStopCommand)(program);
|
|
25
|
+
(0, stats_js_1.registerStatsCommand)(program);
|
|
26
|
+
(0, health_js_1.registerHealthCommand)(program);
|
|
27
|
+
(0, config_js_1.registerConfigCommand)(program);
|
|
28
|
+
(0, env_js_1.registerEnvCommand)(program);
|
|
29
|
+
(0, wrap_js_1.registerWrapCommand)(program);
|
|
30
|
+
(0, trust_ca_js_1.registerTrustCaCommand)(program);
|
|
31
|
+
(0, proxy_js_1.registerProxyCommand)(program);
|
|
32
|
+
(0, openclaw_js_1.registerOpenclawCommand)(program);
|
|
33
|
+
(0, token_js_1.registerTokenCommand)(program);
|
|
34
|
+
program.parse();
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,kDAA2D;AAC3D,gDAAyD;AACzD,kDAA2D;AAC3D,oDAA6D;AAC7D,oDAA6D;AAC7D,8CAAuD;AACvD,gDAAyD;AACzD,wDAAgE;AAChE,kDAA2D;AAC3D,wDAAiE;AACjE,kDAA2D;AAC3D,8CAA2C;AAE3C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,IAAA,uBAAU,GAAE,CAAC;KACrB,uBAAuB,EAAE,CAAC;AAE7B,IAAA,+BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,6BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,+BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,iCAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,iCAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,2BAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,6BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,oCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,+BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,qCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,+BAAoB,EAAC,OAAO,CAAC,CAAC;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwBjD,wBAAgB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAiC/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
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.loadConfig = loadConfig;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
10
|
+
const paths_js_1 = require("./paths.js");
|
|
11
|
+
const DEFAULT_CONFIG_PATH = (0, node_path_1.resolve)((0, node_path_1.join)(__dirname, '..', '..', 'config', 'default.yaml'));
|
|
12
|
+
function deepMerge(target, source) {
|
|
13
|
+
const result = { ...target };
|
|
14
|
+
for (const key of Object.keys(source)) {
|
|
15
|
+
if (source[key] !== null &&
|
|
16
|
+
typeof source[key] === 'object' &&
|
|
17
|
+
!Array.isArray(source[key]) &&
|
|
18
|
+
typeof target[key] === 'object' &&
|
|
19
|
+
target[key] !== null &&
|
|
20
|
+
!Array.isArray(target[key])) {
|
|
21
|
+
result[key] = deepMerge(target[key], source[key]);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
result[key] = source[key];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
function loadConfig(overridePath) {
|
|
30
|
+
// Load default config
|
|
31
|
+
const defaultRaw = (0, node_fs_1.readFileSync)(DEFAULT_CONFIG_PATH, 'utf-8');
|
|
32
|
+
let config = js_yaml_1.default.load(defaultRaw);
|
|
33
|
+
// Merge user config if it exists
|
|
34
|
+
const userConfigPath = overridePath ?? paths_js_1.paths.configFile;
|
|
35
|
+
if ((0, node_fs_1.existsSync)(userConfigPath)) {
|
|
36
|
+
const userRaw = (0, node_fs_1.readFileSync)(userConfigPath, 'utf-8');
|
|
37
|
+
const userConfig = js_yaml_1.default.load(userRaw);
|
|
38
|
+
if (userConfig) {
|
|
39
|
+
config = deepMerge(config, userConfig);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Apply environment variable overrides
|
|
43
|
+
if (process.env.BASTION_PORT) {
|
|
44
|
+
config.server.port = parseInt(process.env.BASTION_PORT, 10);
|
|
45
|
+
}
|
|
46
|
+
if (process.env.BASTION_HOST) {
|
|
47
|
+
config.server.host = process.env.BASTION_HOST;
|
|
48
|
+
}
|
|
49
|
+
if (process.env.BASTION_LOG_LEVEL) {
|
|
50
|
+
config.logging.level = process.env.BASTION_LOG_LEVEL;
|
|
51
|
+
}
|
|
52
|
+
if (process.env.BASTION_AUTH_TOKEN) {
|
|
53
|
+
const serverObj = config.server;
|
|
54
|
+
const serverAuth = serverObj.auth ?? {};
|
|
55
|
+
serverAuth.token = process.env.BASTION_AUTH_TOKEN;
|
|
56
|
+
serverObj.auth = serverAuth;
|
|
57
|
+
}
|
|
58
|
+
return config;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BastionConfig } from './schema.js';
|
|
2
|
+
type ConfigChangeListener = (config: BastionConfig) => void;
|
|
3
|
+
export declare class ConfigManager {
|
|
4
|
+
private config;
|
|
5
|
+
private listeners;
|
|
6
|
+
constructor(initialConfig: BastionConfig);
|
|
7
|
+
get(): BastionConfig;
|
|
8
|
+
update(partial: Record<string, unknown>): BastionConfig;
|
|
9
|
+
onChange(callback: ConfigChangeListener): void;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMjD,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;AAqB5D,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAA8B;gBAEnC,aAAa,EAAE,aAAa;IAIxC,GAAG,IAAI,aAAa;IAIpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAmCvD,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;CAG/C"}
|
|
@@ -0,0 +1,73 @@
|
|
|
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.ConfigManager = void 0;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
10
|
+
const paths_js_1 = require("./paths.js");
|
|
11
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
12
|
+
const log = (0, logger_js_1.createLogger)('config-manager');
|
|
13
|
+
function deepMerge(target, source) {
|
|
14
|
+
const result = { ...target };
|
|
15
|
+
for (const key of Object.keys(source)) {
|
|
16
|
+
if (source[key] !== null &&
|
|
17
|
+
typeof source[key] === 'object' &&
|
|
18
|
+
!Array.isArray(source[key]) &&
|
|
19
|
+
typeof target[key] === 'object' &&
|
|
20
|
+
target[key] !== null &&
|
|
21
|
+
!Array.isArray(target[key])) {
|
|
22
|
+
result[key] = deepMerge(target[key], source[key]);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
result[key] = source[key];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
class ConfigManager {
|
|
31
|
+
config;
|
|
32
|
+
listeners = [];
|
|
33
|
+
constructor(initialConfig) {
|
|
34
|
+
this.config = initialConfig;
|
|
35
|
+
}
|
|
36
|
+
get() {
|
|
37
|
+
return this.config;
|
|
38
|
+
}
|
|
39
|
+
update(partial) {
|
|
40
|
+
log.info('Config update received', { partial: JSON.stringify(partial) });
|
|
41
|
+
this.config = deepMerge(this.config, partial);
|
|
42
|
+
// Log the effective toolGuard config after merge
|
|
43
|
+
const tg = this.config.plugins;
|
|
44
|
+
const toolGuard = tg?.toolGuard;
|
|
45
|
+
if (toolGuard) {
|
|
46
|
+
log.info('Effective toolGuard config', { action: toolGuard.action, blockMinSeverity: toolGuard.blockMinSeverity });
|
|
47
|
+
}
|
|
48
|
+
// Persist to user config file
|
|
49
|
+
try {
|
|
50
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(paths_js_1.paths.configFile), { recursive: true });
|
|
51
|
+
(0, node_fs_1.writeFileSync)(paths_js_1.paths.configFile, js_yaml_1.default.dump(this.config), 'utf-8');
|
|
52
|
+
log.info('Config persisted', { path: paths_js_1.paths.configFile });
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
log.warn('Failed to persist config', { error: err.message });
|
|
56
|
+
}
|
|
57
|
+
// Notify listeners
|
|
58
|
+
for (const listener of this.listeners) {
|
|
59
|
+
try {
|
|
60
|
+
listener(this.config);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
log.warn('Config change listener error', { error: err.message });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return this.config;
|
|
67
|
+
}
|
|
68
|
+
onChange(callback) {
|
|
69
|
+
this.listeners.push(callback);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.ConfigManager = ConfigManager;
|
|
73
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK;;;;;;;;CAQjB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.paths = void 0;
|
|
4
|
+
const node_path_1 = require("node:path");
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const BASTION_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.bastion');
|
|
7
|
+
exports.paths = {
|
|
8
|
+
bastionDir: BASTION_DIR,
|
|
9
|
+
configFile: (0, node_path_1.join)(BASTION_DIR, 'config.yaml'),
|
|
10
|
+
databaseFile: (0, node_path_1.join)(BASTION_DIR, 'bastion.db'),
|
|
11
|
+
encryptionKeyFile: (0, node_path_1.join)(BASTION_DIR, '.key'),
|
|
12
|
+
pidFile: (0, node_path_1.join)(BASTION_DIR, 'bastion.pid'),
|
|
13
|
+
logFile: (0, node_path_1.join)(BASTION_DIR, 'bastion.log'),
|
|
14
|
+
signaturesDir: (0, node_path_1.join)(BASTION_DIR, 'signatures'),
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=paths.js.map
|