@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.
Files changed (377) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -0
  3. package/README.zh.md +468 -0
  4. package/config/default.yaml +73 -0
  5. package/dist/cli/commands/config.d.ts +3 -0
  6. package/dist/cli/commands/config.d.ts.map +1 -0
  7. package/dist/cli/commands/config.js +31 -0
  8. package/dist/cli/commands/config.js.map +1 -0
  9. package/dist/cli/commands/env.d.ts +3 -0
  10. package/dist/cli/commands/env.d.ts.map +1 -0
  11. package/dist/cli/commands/env.js +83 -0
  12. package/dist/cli/commands/env.js.map +1 -0
  13. package/dist/cli/commands/health.d.ts +3 -0
  14. package/dist/cli/commands/health.d.ts.map +1 -0
  15. package/dist/cli/commands/health.js +45 -0
  16. package/dist/cli/commands/health.js.map +1 -0
  17. package/dist/cli/commands/openclaw.d.ts +3 -0
  18. package/dist/cli/commands/openclaw.d.ts.map +1 -0
  19. package/dist/cli/commands/openclaw.js +1062 -0
  20. package/dist/cli/commands/openclaw.js.map +1 -0
  21. package/dist/cli/commands/proxy.d.ts +8 -0
  22. package/dist/cli/commands/proxy.d.ts.map +1 -0
  23. package/dist/cli/commands/proxy.js +433 -0
  24. package/dist/cli/commands/proxy.js.map +1 -0
  25. package/dist/cli/commands/start.d.ts +3 -0
  26. package/dist/cli/commands/start.d.ts.map +1 -0
  27. package/dist/cli/commands/start.js +62 -0
  28. package/dist/cli/commands/start.js.map +1 -0
  29. package/dist/cli/commands/stats.d.ts +3 -0
  30. package/dist/cli/commands/stats.d.ts.map +1 -0
  31. package/dist/cli/commands/stats.js +32 -0
  32. package/dist/cli/commands/stats.js.map +1 -0
  33. package/dist/cli/commands/stop.d.ts +3 -0
  34. package/dist/cli/commands/stop.d.ts.map +1 -0
  35. package/dist/cli/commands/stop.js +28 -0
  36. package/dist/cli/commands/stop.js.map +1 -0
  37. package/dist/cli/commands/token.d.ts +3 -0
  38. package/dist/cli/commands/token.d.ts.map +1 -0
  39. package/dist/cli/commands/token.js +32 -0
  40. package/dist/cli/commands/token.js.map +1 -0
  41. package/dist/cli/commands/trust-ca.d.ts +3 -0
  42. package/dist/cli/commands/trust-ca.d.ts.map +1 -0
  43. package/dist/cli/commands/trust-ca.js +44 -0
  44. package/dist/cli/commands/trust-ca.js.map +1 -0
  45. package/dist/cli/commands/wrap.d.ts +3 -0
  46. package/dist/cli/commands/wrap.d.ts.map +1 -0
  47. package/dist/cli/commands/wrap.js +70 -0
  48. package/dist/cli/commands/wrap.js.map +1 -0
  49. package/dist/cli/daemon.d.ts +11 -0
  50. package/dist/cli/daemon.d.ts.map +1 -0
  51. package/dist/cli/daemon.js +82 -0
  52. package/dist/cli/daemon.js.map +1 -0
  53. package/dist/cli/index.d.ts +3 -0
  54. package/dist/cli/index.d.ts.map +1 -0
  55. package/dist/cli/index.js +35 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/config/index.d.ts +3 -0
  58. package/dist/config/index.d.ts.map +1 -0
  59. package/dist/config/index.js +60 -0
  60. package/dist/config/index.js.map +1 -0
  61. package/dist/config/manager.d.ts +12 -0
  62. package/dist/config/manager.d.ts.map +1 -0
  63. package/dist/config/manager.js +73 -0
  64. package/dist/config/manager.js.map +1 -0
  65. package/dist/config/paths.d.ts +10 -0
  66. package/dist/config/paths.d.ts.map +1 -0
  67. package/dist/config/paths.js +16 -0
  68. package/dist/config/paths.js.map +1 -0
  69. package/dist/config/schema.d.ts +85 -0
  70. package/dist/config/schema.d.ts.map +1 -0
  71. package/dist/config/schema.js +3 -0
  72. package/dist/config/schema.js.map +1 -0
  73. package/dist/dashboard/api-routes.d.ts +6 -0
  74. package/dist/dashboard/api-routes.d.ts.map +1 -0
  75. package/dist/dashboard/api-routes.js +671 -0
  76. package/dist/dashboard/api-routes.js.map +1 -0
  77. package/dist/dashboard/api.d.ts +4 -0
  78. package/dist/dashboard/api.d.ts.map +1 -0
  79. package/dist/dashboard/api.js +25 -0
  80. package/dist/dashboard/api.js.map +1 -0
  81. package/dist/dashboard/page.d.ts +3 -0
  82. package/dist/dashboard/page.d.ts.map +1 -0
  83. package/dist/dashboard/page.js +1622 -0
  84. package/dist/dashboard/page.js.map +1 -0
  85. package/dist/dlp/actions.d.ts +13 -0
  86. package/dist/dlp/actions.d.ts.map +1 -0
  87. package/dist/dlp/actions.js +3 -0
  88. package/dist/dlp/actions.js.map +1 -0
  89. package/dist/dlp/ai-validator.d.ts +28 -0
  90. package/dist/dlp/ai-validator.d.ts.map +1 -0
  91. package/dist/dlp/ai-validator.js +214 -0
  92. package/dist/dlp/ai-validator.js.map +1 -0
  93. package/dist/dlp/engine.d.ts +34 -0
  94. package/dist/dlp/engine.d.ts.map +1 -0
  95. package/dist/dlp/engine.js +342 -0
  96. package/dist/dlp/engine.js.map +1 -0
  97. package/dist/dlp/entropy.d.ts +22 -0
  98. package/dist/dlp/entropy.d.ts.map +1 -0
  99. package/dist/dlp/entropy.js +43 -0
  100. package/dist/dlp/entropy.js.map +1 -0
  101. package/dist/dlp/message-cache.d.ts +45 -0
  102. package/dist/dlp/message-cache.d.ts.map +1 -0
  103. package/dist/dlp/message-cache.js +251 -0
  104. package/dist/dlp/message-cache.js.map +1 -0
  105. package/dist/dlp/patterns/context-aware.d.ts +4 -0
  106. package/dist/dlp/patterns/context-aware.d.ts.map +1 -0
  107. package/dist/dlp/patterns/context-aware.js +45 -0
  108. package/dist/dlp/patterns/context-aware.js.map +1 -0
  109. package/dist/dlp/patterns/high-confidence.d.ts +4 -0
  110. package/dist/dlp/patterns/high-confidence.d.ts.map +1 -0
  111. package/dist/dlp/patterns/high-confidence.js +140 -0
  112. package/dist/dlp/patterns/high-confidence.js.map +1 -0
  113. package/dist/dlp/patterns/prompt-injection.d.ts +4 -0
  114. package/dist/dlp/patterns/prompt-injection.d.ts.map +1 -0
  115. package/dist/dlp/patterns/prompt-injection.js +244 -0
  116. package/dist/dlp/patterns/prompt-injection.js.map +1 -0
  117. package/dist/dlp/patterns/validated.d.ts +4 -0
  118. package/dist/dlp/patterns/validated.d.ts.map +1 -0
  119. package/dist/dlp/patterns/validated.js +21 -0
  120. package/dist/dlp/patterns/validated.js.map +1 -0
  121. package/dist/dlp/remote-sync.d.ts +47 -0
  122. package/dist/dlp/remote-sync.d.ts.map +1 -0
  123. package/dist/dlp/remote-sync.js +252 -0
  124. package/dist/dlp/remote-sync.js.map +1 -0
  125. package/dist/dlp/semantics.d.ts +27 -0
  126. package/dist/dlp/semantics.d.ts.map +1 -0
  127. package/dist/dlp/semantics.js +93 -0
  128. package/dist/dlp/semantics.js.map +1 -0
  129. package/dist/dlp/structure.d.ts +25 -0
  130. package/dist/dlp/structure.d.ts.map +1 -0
  131. package/dist/dlp/structure.js +86 -0
  132. package/dist/dlp/structure.js.map +1 -0
  133. package/dist/dlp/validators.d.ts +6 -0
  134. package/dist/dlp/validators.d.ts.map +1 -0
  135. package/dist/dlp/validators.js +46 -0
  136. package/dist/dlp/validators.js.map +1 -0
  137. package/dist/index.d.ts +2 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +200 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/license/verify.d.ts +18 -0
  142. package/dist/license/verify.d.ts.map +1 -0
  143. package/dist/license/verify.js +71 -0
  144. package/dist/license/verify.js.map +1 -0
  145. package/dist/metrics/collector.d.ts +11 -0
  146. package/dist/metrics/collector.d.ts.map +1 -0
  147. package/dist/metrics/collector.js +17 -0
  148. package/dist/metrics/collector.js.map +1 -0
  149. package/dist/metrics/dashboard.d.ts +6 -0
  150. package/dist/metrics/dashboard.d.ts.map +1 -0
  151. package/dist/metrics/dashboard.js +66 -0
  152. package/dist/metrics/dashboard.js.map +1 -0
  153. package/dist/metrics/pricing.d.ts +10 -0
  154. package/dist/metrics/pricing.d.ts.map +1 -0
  155. package/dist/metrics/pricing.js +62 -0
  156. package/dist/metrics/pricing.js.map +1 -0
  157. package/dist/optimizer/cache.d.ts +14 -0
  158. package/dist/optimizer/cache.d.ts.map +1 -0
  159. package/dist/optimizer/cache.js +58 -0
  160. package/dist/optimizer/cache.js.map +1 -0
  161. package/dist/optimizer/estimator.d.ts +6 -0
  162. package/dist/optimizer/estimator.d.ts.map +1 -0
  163. package/dist/optimizer/estimator.js +12 -0
  164. package/dist/optimizer/estimator.js.map +1 -0
  165. package/dist/optimizer/reorder.d.ts +9 -0
  166. package/dist/optimizer/reorder.d.ts.map +1 -0
  167. package/dist/optimizer/reorder.js +27 -0
  168. package/dist/optimizer/reorder.js.map +1 -0
  169. package/dist/optimizer/trimmer.d.ts +9 -0
  170. package/dist/optimizer/trimmer.d.ts.map +1 -0
  171. package/dist/optimizer/trimmer.js +47 -0
  172. package/dist/optimizer/trimmer.js.map +1 -0
  173. package/dist/plugin-api/index.d.ts +3 -0
  174. package/dist/plugin-api/index.d.ts.map +1 -0
  175. package/dist/plugin-api/index.js +6 -0
  176. package/dist/plugin-api/index.js.map +1 -0
  177. package/dist/plugin-api/types.d.ts +77 -0
  178. package/dist/plugin-api/types.d.ts.map +1 -0
  179. package/dist/plugin-api/types.js +6 -0
  180. package/dist/plugin-api/types.js.map +1 -0
  181. package/dist/plugins/adapter.d.ts +12 -0
  182. package/dist/plugins/adapter.d.ts.map +1 -0
  183. package/dist/plugins/adapter.js +116 -0
  184. package/dist/plugins/adapter.js.map +1 -0
  185. package/dist/plugins/builtin/audit-logger.d.ts +9 -0
  186. package/dist/plugins/builtin/audit-logger.d.ts.map +1 -0
  187. package/dist/plugins/builtin/audit-logger.js +53 -0
  188. package/dist/plugins/builtin/audit-logger.js.map +1 -0
  189. package/dist/plugins/builtin/dlp-scanner.d.ts +19 -0
  190. package/dist/plugins/builtin/dlp-scanner.d.ts.map +1 -0
  191. package/dist/plugins/builtin/dlp-scanner.js +284 -0
  192. package/dist/plugins/builtin/dlp-scanner.js.map +1 -0
  193. package/dist/plugins/builtin/metrics-collector.d.ts +4 -0
  194. package/dist/plugins/builtin/metrics-collector.d.ts.map +1 -0
  195. package/dist/plugins/builtin/metrics-collector.js +111 -0
  196. package/dist/plugins/builtin/metrics-collector.js.map +1 -0
  197. package/dist/plugins/builtin/token-optimizer.d.ts +10 -0
  198. package/dist/plugins/builtin/token-optimizer.d.ts.map +1 -0
  199. package/dist/plugins/builtin/token-optimizer.js +120 -0
  200. package/dist/plugins/builtin/token-optimizer.js.map +1 -0
  201. package/dist/plugins/builtin/tool-guard.d.ts +20 -0
  202. package/dist/plugins/builtin/tool-guard.d.ts.map +1 -0
  203. package/dist/plugins/builtin/tool-guard.js +259 -0
  204. package/dist/plugins/builtin/tool-guard.js.map +1 -0
  205. package/dist/plugins/context.d.ts +8 -0
  206. package/dist/plugins/context.d.ts.map +1 -0
  207. package/dist/plugins/context.js +33 -0
  208. package/dist/plugins/context.js.map +1 -0
  209. package/dist/plugins/event-bus.d.ts +9 -0
  210. package/dist/plugins/event-bus.d.ts.map +1 -0
  211. package/dist/plugins/event-bus.js +25 -0
  212. package/dist/plugins/event-bus.js.map +1 -0
  213. package/dist/plugins/index.d.ts +18 -0
  214. package/dist/plugins/index.d.ts.map +1 -0
  215. package/dist/plugins/index.js +148 -0
  216. package/dist/plugins/index.js.map +1 -0
  217. package/dist/plugins/loader.d.ts +14 -0
  218. package/dist/plugins/loader.d.ts.map +1 -0
  219. package/dist/plugins/loader.js +98 -0
  220. package/dist/plugins/loader.js.map +1 -0
  221. package/dist/plugins/types.d.ts +91 -0
  222. package/dist/plugins/types.d.ts.map +1 -0
  223. package/dist/plugins/types.js +3 -0
  224. package/dist/plugins/types.js.map +1 -0
  225. package/dist/proxy/certs.d.ts +10 -0
  226. package/dist/proxy/certs.d.ts.map +1 -0
  227. package/dist/proxy/certs.js +110 -0
  228. package/dist/proxy/certs.js.map +1 -0
  229. package/dist/proxy/connect.d.ts +11 -0
  230. package/dist/proxy/connect.d.ts.map +1 -0
  231. package/dist/proxy/connect.js +298 -0
  232. package/dist/proxy/connect.js.map +1 -0
  233. package/dist/proxy/forwarder.d.ts +14 -0
  234. package/dist/proxy/forwarder.d.ts.map +1 -0
  235. package/dist/proxy/forwarder.js +342 -0
  236. package/dist/proxy/forwarder.js.map +1 -0
  237. package/dist/proxy/passthrough.d.ts +4 -0
  238. package/dist/proxy/passthrough.d.ts.map +1 -0
  239. package/dist/proxy/passthrough.js +68 -0
  240. package/dist/proxy/passthrough.js.map +1 -0
  241. package/dist/proxy/providers/anthropic.d.ts +4 -0
  242. package/dist/proxy/providers/anthropic.d.ts.map +1 -0
  243. package/dist/proxy/providers/anthropic.js +46 -0
  244. package/dist/proxy/providers/anthropic.js.map +1 -0
  245. package/dist/proxy/providers/classify.d.ts +14 -0
  246. package/dist/proxy/providers/classify.d.ts.map +1 -0
  247. package/dist/proxy/providers/classify.js +37 -0
  248. package/dist/proxy/providers/classify.js.map +1 -0
  249. package/dist/proxy/providers/claude-web.d.ts +8 -0
  250. package/dist/proxy/providers/claude-web.d.ts.map +1 -0
  251. package/dist/proxy/providers/claude-web.js +50 -0
  252. package/dist/proxy/providers/claude-web.js.map +1 -0
  253. package/dist/proxy/providers/gemini.d.ts +4 -0
  254. package/dist/proxy/providers/gemini.d.ts.map +1 -0
  255. package/dist/proxy/providers/gemini.js +38 -0
  256. package/dist/proxy/providers/gemini.js.map +1 -0
  257. package/dist/proxy/providers/index.d.ts +27 -0
  258. package/dist/proxy/providers/index.d.ts.map +1 -0
  259. package/dist/proxy/providers/index.js +32 -0
  260. package/dist/proxy/providers/index.js.map +1 -0
  261. package/dist/proxy/providers/messaging.d.ts +2 -0
  262. package/dist/proxy/providers/messaging.d.ts.map +1 -0
  263. package/dist/proxy/providers/messaging.js +53 -0
  264. package/dist/proxy/providers/messaging.js.map +1 -0
  265. package/dist/proxy/providers/openai.d.ts +4 -0
  266. package/dist/proxy/providers/openai.d.ts.map +1 -0
  267. package/dist/proxy/providers/openai.js +38 -0
  268. package/dist/proxy/providers/openai.js.map +1 -0
  269. package/dist/proxy/providers/telegram.d.ts +8 -0
  270. package/dist/proxy/providers/telegram.d.ts.map +1 -0
  271. package/dist/proxy/providers/telegram.js +35 -0
  272. package/dist/proxy/providers/telegram.js.map +1 -0
  273. package/dist/proxy/router.d.ts +12 -0
  274. package/dist/proxy/router.d.ts.map +1 -0
  275. package/dist/proxy/router.js +26 -0
  276. package/dist/proxy/router.js.map +1 -0
  277. package/dist/proxy/safety.d.ts +13 -0
  278. package/dist/proxy/safety.d.ts.map +1 -0
  279. package/dist/proxy/safety.js +58 -0
  280. package/dist/proxy/safety.js.map +1 -0
  281. package/dist/proxy/server.d.ts +8 -0
  282. package/dist/proxy/server.d.ts.map +1 -0
  283. package/dist/proxy/server.js +126 -0
  284. package/dist/proxy/server.js.map +1 -0
  285. package/dist/proxy/streaming.d.ts +21 -0
  286. package/dist/proxy/streaming.d.ts.map +1 -0
  287. package/dist/proxy/streaming.js +70 -0
  288. package/dist/proxy/streaming.js.map +1 -0
  289. package/dist/storage/database.d.ts +6 -0
  290. package/dist/storage/database.d.ts.map +1 -0
  291. package/dist/storage/database.js +44 -0
  292. package/dist/storage/database.js.map +1 -0
  293. package/dist/storage/encryption.d.ts +11 -0
  294. package/dist/storage/encryption.d.ts.map +1 -0
  295. package/dist/storage/encryption.js +47 -0
  296. package/dist/storage/encryption.js.map +1 -0
  297. package/dist/storage/migrations.d.ts +3 -0
  298. package/dist/storage/migrations.d.ts.map +1 -0
  299. package/dist/storage/migrations.js +265 -0
  300. package/dist/storage/migrations.js.map +1 -0
  301. package/dist/storage/repositories/audit-log.d.ts +115 -0
  302. package/dist/storage/repositories/audit-log.d.ts.map +1 -0
  303. package/dist/storage/repositories/audit-log.js +586 -0
  304. package/dist/storage/repositories/audit-log.js.map +1 -0
  305. package/dist/storage/repositories/cache.d.ts +26 -0
  306. package/dist/storage/repositories/cache.d.ts.map +1 -0
  307. package/dist/storage/repositories/cache.js +44 -0
  308. package/dist/storage/repositories/cache.js.map +1 -0
  309. package/dist/storage/repositories/dlp-config-history.d.ts +17 -0
  310. package/dist/storage/repositories/dlp-config-history.d.ts.map +1 -0
  311. package/dist/storage/repositories/dlp-config-history.js +30 -0
  312. package/dist/storage/repositories/dlp-config-history.js.map +1 -0
  313. package/dist/storage/repositories/dlp-events.d.ts +35 -0
  314. package/dist/storage/repositories/dlp-events.d.ts.map +1 -0
  315. package/dist/storage/repositories/dlp-events.js +57 -0
  316. package/dist/storage/repositories/dlp-events.js.map +1 -0
  317. package/dist/storage/repositories/dlp-patterns.d.ts +70 -0
  318. package/dist/storage/repositories/dlp-patterns.d.ts.map +1 -0
  319. package/dist/storage/repositories/dlp-patterns.js +187 -0
  320. package/dist/storage/repositories/dlp-patterns.js.map +1 -0
  321. package/dist/storage/repositories/optimizer-events.d.ts +28 -0
  322. package/dist/storage/repositories/optimizer-events.d.ts.map +1 -0
  323. package/dist/storage/repositories/optimizer-events.js +49 -0
  324. package/dist/storage/repositories/optimizer-events.js.map +1 -0
  325. package/dist/storage/repositories/plugin-events.d.ts +34 -0
  326. package/dist/storage/repositories/plugin-events.d.ts.map +1 -0
  327. package/dist/storage/repositories/plugin-events.js +64 -0
  328. package/dist/storage/repositories/plugin-events.js.map +1 -0
  329. package/dist/storage/repositories/requests.d.ts +68 -0
  330. package/dist/storage/repositories/requests.d.ts.map +1 -0
  331. package/dist/storage/repositories/requests.js +113 -0
  332. package/dist/storage/repositories/requests.js.map +1 -0
  333. package/dist/storage/repositories/sessions.d.ts +23 -0
  334. package/dist/storage/repositories/sessions.d.ts.map +1 -0
  335. package/dist/storage/repositories/sessions.js +42 -0
  336. package/dist/storage/repositories/sessions.js.map +1 -0
  337. package/dist/storage/repositories/tool-calls.d.ts +49 -0
  338. package/dist/storage/repositories/tool-calls.d.ts.map +1 -0
  339. package/dist/storage/repositories/tool-calls.js +61 -0
  340. package/dist/storage/repositories/tool-calls.js.map +1 -0
  341. package/dist/storage/repositories/tool-guard-rules.d.ts +50 -0
  342. package/dist/storage/repositories/tool-guard-rules.d.ts.map +1 -0
  343. package/dist/storage/repositories/tool-guard-rules.js +120 -0
  344. package/dist/storage/repositories/tool-guard-rules.js.map +1 -0
  345. package/dist/tool-guard/alert.d.ts +30 -0
  346. package/dist/tool-guard/alert.d.ts.map +1 -0
  347. package/dist/tool-guard/alert.js +113 -0
  348. package/dist/tool-guard/alert.js.map +1 -0
  349. package/dist/tool-guard/extractor.d.ts +10 -0
  350. package/dist/tool-guard/extractor.d.ts.map +1 -0
  351. package/dist/tool-guard/extractor.js +309 -0
  352. package/dist/tool-guard/extractor.js.map +1 -0
  353. package/dist/tool-guard/rules.d.ts +18 -0
  354. package/dist/tool-guard/rules.d.ts.map +1 -0
  355. package/dist/tool-guard/rules.js +255 -0
  356. package/dist/tool-guard/rules.js.map +1 -0
  357. package/dist/tool-guard/streaming-guard.d.ts +57 -0
  358. package/dist/tool-guard/streaming-guard.d.ts.map +1 -0
  359. package/dist/tool-guard/streaming-guard.js +389 -0
  360. package/dist/tool-guard/streaming-guard.js.map +1 -0
  361. package/dist/utils/hash.d.ts +2 -0
  362. package/dist/utils/hash.d.ts.map +1 -0
  363. package/dist/utils/hash.js +8 -0
  364. package/dist/utils/hash.js.map +1 -0
  365. package/dist/utils/logger.d.ts +11 -0
  366. package/dist/utils/logger.d.ts.map +1 -0
  367. package/dist/utils/logger.js +54 -0
  368. package/dist/utils/logger.js.map +1 -0
  369. package/dist/utils/timeout.d.ts +5 -0
  370. package/dist/utils/timeout.d.ts.map +1 -0
  371. package/dist/utils/timeout.js +26 -0
  372. package/dist/utils/timeout.js.map +1 -0
  373. package/dist/version.d.ts +5 -0
  374. package/dist/version.d.ts.map +1 -0
  375. package/dist/version.js +23 -0
  376. package/dist/version.js.map +1 -0
  377. 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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerStopCommand(program: Command): void;
3
+ //# sourceMappingURL=stop.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerTokenCommand(program: Command): void;
3
+ //# sourceMappingURL=token.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerTrustCaCommand(program: Command): void;
3
+ //# sourceMappingURL=trust-ca.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerWrapCommand(program: Command): void;
3
+ //# sourceMappingURL=wrap.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import type { BastionConfig } from './schema.js';
2
+ export declare function loadConfig(overridePath?: string): BastionConfig;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,10 @@
1
+ export declare const paths: {
2
+ bastionDir: string;
3
+ configFile: string;
4
+ databaseFile: string;
5
+ encryptionKeyFile: string;
6
+ pidFile: string;
7
+ logFile: string;
8
+ signaturesDir: string;
9
+ };
10
+ //# sourceMappingURL=paths.d.ts.map
@@ -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