airlock-bot 0.0.1 → 0.2.2

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 (342) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/airlock.service +27 -0
  4. package/dist/allowlist/engine.d.ts +9 -0
  5. package/dist/allowlist/engine.d.ts.map +1 -0
  6. package/dist/allowlist/engine.js +24 -0
  7. package/dist/allowlist/engine.js.map +1 -0
  8. package/dist/allowlist/pattern.d.ts +13 -0
  9. package/dist/allowlist/pattern.d.ts.map +1 -0
  10. package/dist/allowlist/pattern.js +33 -0
  11. package/dist/allowlist/pattern.js.map +1 -0
  12. package/dist/audit/api.d.ts +7 -0
  13. package/dist/audit/api.d.ts.map +1 -0
  14. package/dist/audit/api.js +31 -0
  15. package/dist/audit/api.js.map +1 -0
  16. package/dist/audit/db.d.ts +44 -0
  17. package/dist/audit/db.d.ts.map +1 -0
  18. package/dist/audit/db.js +121 -0
  19. package/dist/audit/db.js.map +1 -0
  20. package/dist/audit/logger.d.ts +25 -0
  21. package/dist/audit/logger.d.ts.map +1 -0
  22. package/dist/audit/logger.js +58 -0
  23. package/dist/audit/logger.js.map +1 -0
  24. package/dist/audit/redactor.d.ts +5 -0
  25. package/dist/audit/redactor.d.ts.map +1 -0
  26. package/dist/audit/redactor.js +27 -0
  27. package/dist/audit/redactor.js.map +1 -0
  28. package/dist/backend/cli/adapter.d.ts +23 -0
  29. package/dist/backend/cli/adapter.d.ts.map +1 -0
  30. package/dist/backend/cli/adapter.js +176 -0
  31. package/dist/backend/cli/adapter.js.map +1 -0
  32. package/dist/backend/cli/builder.d.ts +3 -0
  33. package/dist/backend/cli/builder.d.ts.map +1 -0
  34. package/dist/backend/cli/builder.js +52 -0
  35. package/dist/backend/cli/builder.js.map +1 -0
  36. package/dist/backend/cli/escaper.d.ts +2 -0
  37. package/dist/backend/cli/escaper.d.ts.map +1 -0
  38. package/dist/backend/cli/escaper.js +8 -0
  39. package/dist/backend/cli/escaper.js.map +1 -0
  40. package/dist/backend/exec-adapter.d.ts +13 -0
  41. package/dist/backend/exec-adapter.d.ts.map +1 -0
  42. package/dist/backend/exec-adapter.js +39 -0
  43. package/dist/backend/exec-adapter.js.map +1 -0
  44. package/dist/backend/factory.d.ts +9 -0
  45. package/dist/backend/factory.d.ts.map +1 -0
  46. package/dist/backend/factory.js +35 -0
  47. package/dist/backend/factory.js.map +1 -0
  48. package/dist/backend/http-adapter.d.ts +15 -0
  49. package/dist/backend/http-adapter.d.ts.map +1 -0
  50. package/dist/backend/http-adapter.js +39 -0
  51. package/dist/backend/http-adapter.js.map +1 -0
  52. package/dist/backend/mcp-adapter.d.ts +14 -0
  53. package/dist/backend/mcp-adapter.d.ts.map +1 -0
  54. package/dist/backend/mcp-adapter.js +38 -0
  55. package/dist/backend/mcp-adapter.js.map +1 -0
  56. package/dist/backend/openapi/adapter.d.ts +17 -0
  57. package/dist/backend/openapi/adapter.d.ts.map +1 -0
  58. package/dist/backend/openapi/adapter.js +144 -0
  59. package/dist/backend/openapi/adapter.js.map +1 -0
  60. package/dist/backend/openapi/parser.d.ts +21 -0
  61. package/dist/backend/openapi/parser.d.ts.map +1 -0
  62. package/dist/backend/openapi/parser.js +145 -0
  63. package/dist/backend/openapi/parser.js.map +1 -0
  64. package/dist/backend/types.d.ts +9 -0
  65. package/dist/backend/types.d.ts.map +1 -0
  66. package/dist/backend/types.js +2 -0
  67. package/dist/backend/types.js.map +1 -0
  68. package/dist/config/loader.d.ts +12 -0
  69. package/dist/config/loader.d.ts.map +1 -0
  70. package/dist/config/loader.js +178 -0
  71. package/dist/config/loader.js.map +1 -0
  72. package/dist/config/profiles.d.ts +12 -0
  73. package/dist/config/profiles.d.ts.map +1 -0
  74. package/dist/config/profiles.js +34 -0
  75. package/dist/config/profiles.js.map +1 -0
  76. package/dist/config/schema.d.ts +2034 -0
  77. package/dist/config/schema.d.ts.map +1 -0
  78. package/dist/config/schema.js +257 -0
  79. package/dist/config/schema.js.map +1 -0
  80. package/dist/config/watcher.d.ts +11 -0
  81. package/dist/config/watcher.d.ts.map +1 -0
  82. package/dist/config/watcher.js +39 -0
  83. package/dist/config/watcher.js.map +1 -0
  84. package/dist/configure-agent/cli.d.ts +2 -0
  85. package/dist/configure-agent/cli.d.ts.map +1 -0
  86. package/dist/configure-agent/cli.js +390 -0
  87. package/dist/configure-agent/cli.js.map +1 -0
  88. package/dist/discover/cli.d.ts +2 -0
  89. package/dist/discover/cli.d.ts.map +1 -0
  90. package/dist/discover/cli.js +97 -0
  91. package/dist/discover/cli.js.map +1 -0
  92. package/dist/discover/index.d.ts +19 -0
  93. package/dist/discover/index.d.ts.map +1 -0
  94. package/dist/discover/index.js +70 -0
  95. package/dist/discover/index.js.map +1 -0
  96. package/dist/discover/openapi.d.ts +9 -0
  97. package/dist/discover/openapi.d.ts.map +1 -0
  98. package/dist/discover/openapi.js +47 -0
  99. package/dist/discover/openapi.js.map +1 -0
  100. package/dist/discover/strategies/fig.d.ts +29 -0
  101. package/dist/discover/strategies/fig.d.ts.map +1 -0
  102. package/dist/discover/strategies/fig.js +82 -0
  103. package/dist/discover/strategies/fig.js.map +1 -0
  104. package/dist/discover/strategies/help-parser.d.ts +21 -0
  105. package/dist/discover/strategies/help-parser.d.ts.map +1 -0
  106. package/dist/discover/strategies/help-parser.js +121 -0
  107. package/dist/discover/strategies/help-parser.js.map +1 -0
  108. package/dist/discover/writer.d.ts +5 -0
  109. package/dist/discover/writer.d.ts.map +1 -0
  110. package/dist/discover/writer.js +14 -0
  111. package/dist/discover/writer.js.map +1 -0
  112. package/dist/gateway.d.ts +20 -0
  113. package/dist/gateway.d.ts.map +1 -0
  114. package/dist/gateway.js +125 -0
  115. package/dist/gateway.js.map +1 -0
  116. package/dist/hitl/api.d.ts +7 -0
  117. package/dist/hitl/api.d.ts.map +1 -0
  118. package/dist/hitl/api.js +35 -0
  119. package/dist/hitl/api.js.map +1 -0
  120. package/dist/hitl/batcher.d.ts +11 -0
  121. package/dist/hitl/batcher.d.ts.map +1 -0
  122. package/dist/hitl/batcher.js +37 -0
  123. package/dist/hitl/batcher.js.map +1 -0
  124. package/dist/hitl/engine.d.ts +36 -0
  125. package/dist/hitl/engine.d.ts.map +1 -0
  126. package/dist/hitl/engine.js +150 -0
  127. package/dist/hitl/engine.js.map +1 -0
  128. package/dist/hitl/formatter.d.ts +4 -0
  129. package/dist/hitl/formatter.d.ts.map +1 -0
  130. package/dist/hitl/formatter.js +31 -0
  131. package/dist/hitl/formatter.js.map +1 -0
  132. package/dist/hitl/parser.d.ts +7 -0
  133. package/dist/hitl/parser.d.ts.map +1 -0
  134. package/dist/hitl/parser.js +17 -0
  135. package/dist/hitl/parser.js.map +1 -0
  136. package/dist/hitl/provider-factory.d.ts +4 -0
  137. package/dist/hitl/provider-factory.d.ts.map +1 -0
  138. package/dist/hitl/provider-factory.js +42 -0
  139. package/dist/hitl/provider-factory.js.map +1 -0
  140. package/dist/hitl/providers/composite.d.ts +9 -0
  141. package/dist/hitl/providers/composite.d.ts.map +1 -0
  142. package/dist/hitl/providers/composite.js +23 -0
  143. package/dist/hitl/providers/composite.js.map +1 -0
  144. package/dist/hitl/providers/dashboard.d.ts +17 -0
  145. package/dist/hitl/providers/dashboard.d.ts.map +1 -0
  146. package/dist/hitl/providers/dashboard.js +210 -0
  147. package/dist/hitl/providers/dashboard.js.map +1 -0
  148. package/dist/hitl/providers/macos.d.ts +10 -0
  149. package/dist/hitl/providers/macos.d.ts.map +1 -0
  150. package/dist/hitl/providers/macos.js +65 -0
  151. package/dist/hitl/providers/macos.js.map +1 -0
  152. package/dist/hitl/providers/openclaw.d.ts +21 -0
  153. package/dist/hitl/providers/openclaw.d.ts.map +1 -0
  154. package/dist/hitl/providers/openclaw.js +106 -0
  155. package/dist/hitl/providers/openclaw.js.map +1 -0
  156. package/dist/hitl/providers/slack.d.ts +12 -0
  157. package/dist/hitl/providers/slack.d.ts.map +1 -0
  158. package/dist/hitl/providers/slack.js +24 -0
  159. package/dist/hitl/providers/slack.js.map +1 -0
  160. package/dist/hitl/providers/stdio.d.ts +12 -0
  161. package/dist/hitl/providers/stdio.d.ts.map +1 -0
  162. package/dist/hitl/providers/stdio.js +41 -0
  163. package/dist/hitl/providers/stdio.js.map +1 -0
  164. package/dist/hitl/providers/telegram.d.ts +22 -0
  165. package/dist/hitl/providers/telegram.d.ts.map +1 -0
  166. package/dist/hitl/providers/telegram.js +87 -0
  167. package/dist/hitl/providers/telegram.js.map +1 -0
  168. package/dist/hitl/providers/tui.d.ts +16 -0
  169. package/dist/hitl/providers/tui.d.ts.map +1 -0
  170. package/dist/hitl/providers/tui.js +169 -0
  171. package/dist/hitl/providers/tui.js.map +1 -0
  172. package/dist/hitl/providers/types.d.ts +18 -0
  173. package/dist/hitl/providers/types.d.ts.map +1 -0
  174. package/dist/hitl/providers/types.js +2 -0
  175. package/dist/hitl/providers/types.js.map +1 -0
  176. package/dist/hitl/providers/webhook.d.ts +13 -0
  177. package/dist/hitl/providers/webhook.d.ts.map +1 -0
  178. package/dist/hitl/providers/webhook.js +27 -0
  179. package/dist/hitl/providers/webhook.js.map +1 -0
  180. package/dist/index.d.ts +3 -0
  181. package/dist/index.d.ts.map +1 -0
  182. package/dist/index.js +115 -0
  183. package/dist/index.js.map +1 -0
  184. package/dist/middleware/chain-builder.d.ts +16 -0
  185. package/dist/middleware/chain-builder.d.ts.map +1 -0
  186. package/dist/middleware/chain-builder.js +139 -0
  187. package/dist/middleware/chain-builder.js.map +1 -0
  188. package/dist/middleware/compose.d.ts +3 -0
  189. package/dist/middleware/compose.d.ts.map +1 -0
  190. package/dist/middleware/compose.js +15 -0
  191. package/dist/middleware/compose.js.map +1 -0
  192. package/dist/middleware/core/allowlist.d.ts +3 -0
  193. package/dist/middleware/core/allowlist.d.ts.map +1 -0
  194. package/dist/middleware/core/allowlist.js +23 -0
  195. package/dist/middleware/core/allowlist.js.map +1 -0
  196. package/dist/middleware/core/exec-policy.d.ts +3 -0
  197. package/dist/middleware/core/exec-policy.d.ts.map +1 -0
  198. package/dist/middleware/core/exec-policy.js +30 -0
  199. package/dist/middleware/core/exec-policy.js.map +1 -0
  200. package/dist/middleware/core/execute.d.ts +3 -0
  201. package/dist/middleware/core/execute.d.ts.map +1 -0
  202. package/dist/middleware/core/execute.js +35 -0
  203. package/dist/middleware/core/execute.js.map +1 -0
  204. package/dist/middleware/core/hitl-gate.d.ts +3 -0
  205. package/dist/middleware/core/hitl-gate.d.ts.map +1 -0
  206. package/dist/middleware/core/hitl-gate.js +38 -0
  207. package/dist/middleware/core/hitl-gate.js.map +1 -0
  208. package/dist/middleware/core/rate-limiter.d.ts +10 -0
  209. package/dist/middleware/core/rate-limiter.d.ts.map +1 -0
  210. package/dist/middleware/core/rate-limiter.js +32 -0
  211. package/dist/middleware/core/rate-limiter.js.map +1 -0
  212. package/dist/middleware/core/schema-validator.d.ts +3 -0
  213. package/dist/middleware/core/schema-validator.d.ts.map +1 -0
  214. package/dist/middleware/core/schema-validator.js +31 -0
  215. package/dist/middleware/core/schema-validator.js.map +1 -0
  216. package/dist/middleware/detectors/injection-detector.d.ts +12 -0
  217. package/dist/middleware/detectors/injection-detector.d.ts.map +1 -0
  218. package/dist/middleware/detectors/injection-detector.js +129 -0
  219. package/dist/middleware/detectors/injection-detector.js.map +1 -0
  220. package/dist/middleware/detectors/sensitivity-classifier.d.ts +12 -0
  221. package/dist/middleware/detectors/sensitivity-classifier.d.ts.map +1 -0
  222. package/dist/middleware/detectors/sensitivity-classifier.js +125 -0
  223. package/dist/middleware/detectors/sensitivity-classifier.js.map +1 -0
  224. package/dist/middleware/post/canary-token-injector.d.ts +10 -0
  225. package/dist/middleware/post/canary-token-injector.d.ts.map +1 -0
  226. package/dist/middleware/post/canary-token-injector.js +53 -0
  227. package/dist/middleware/post/canary-token-injector.js.map +1 -0
  228. package/dist/middleware/post/output-injection-detector.d.ts +7 -0
  229. package/dist/middleware/post/output-injection-detector.d.ts.map +1 -0
  230. package/dist/middleware/post/output-injection-detector.js +46 -0
  231. package/dist/middleware/post/output-injection-detector.js.map +1 -0
  232. package/dist/middleware/post/output-size-limiter.d.ts +7 -0
  233. package/dist/middleware/post/output-size-limiter.d.ts.map +1 -0
  234. package/dist/middleware/post/output-size-limiter.js +47 -0
  235. package/dist/middleware/post/output-size-limiter.js.map +1 -0
  236. package/dist/middleware/post/output-summarizer.d.ts +15 -0
  237. package/dist/middleware/post/output-summarizer.d.ts.map +1 -0
  238. package/dist/middleware/post/output-summarizer.js +38 -0
  239. package/dist/middleware/post/output-summarizer.js.map +1 -0
  240. package/dist/middleware/post/strip-query-params.d.ts +3 -0
  241. package/dist/middleware/post/strip-query-params.d.ts.map +1 -0
  242. package/dist/middleware/post/strip-query-params.js +22 -0
  243. package/dist/middleware/post/strip-query-params.js.map +1 -0
  244. package/dist/middleware/post/untrusted-envelope.d.ts +3 -0
  245. package/dist/middleware/post/untrusted-envelope.d.ts.map +1 -0
  246. package/dist/middleware/post/untrusted-envelope.js +10 -0
  247. package/dist/middleware/post/untrusted-envelope.js.map +1 -0
  248. package/dist/middleware/types.d.ts +32 -0
  249. package/dist/middleware/types.d.ts.map +1 -0
  250. package/dist/middleware/types.js +2 -0
  251. package/dist/middleware/types.js.map +1 -0
  252. package/dist/pool/http-client.d.ts +26 -0
  253. package/dist/pool/http-client.d.ts.map +1 -0
  254. package/dist/pool/http-client.js +109 -0
  255. package/dist/pool/http-client.js.map +1 -0
  256. package/dist/pool/oauth-provider.d.ts +34 -0
  257. package/dist/pool/oauth-provider.d.ts.map +1 -0
  258. package/dist/pool/oauth-provider.js +135 -0
  259. package/dist/pool/oauth-provider.js.map +1 -0
  260. package/dist/pool/pool.d.ts +30 -0
  261. package/dist/pool/pool.d.ts.map +1 -0
  262. package/dist/pool/pool.js +119 -0
  263. package/dist/pool/pool.js.map +1 -0
  264. package/dist/pool/required-mcps.d.ts +7 -0
  265. package/dist/pool/required-mcps.d.ts.map +1 -0
  266. package/dist/pool/required-mcps.js +18 -0
  267. package/dist/pool/required-mcps.js.map +1 -0
  268. package/dist/pool/sse-client.d.ts +22 -0
  269. package/dist/pool/sse-client.d.ts.map +1 -0
  270. package/dist/pool/sse-client.js +70 -0
  271. package/dist/pool/sse-client.js.map +1 -0
  272. package/dist/pool/stdio-client.d.ts +24 -0
  273. package/dist/pool/stdio-client.d.ts.map +1 -0
  274. package/dist/pool/stdio-client.js +77 -0
  275. package/dist/pool/stdio-client.js.map +1 -0
  276. package/dist/registry/registry.d.ts +19 -0
  277. package/dist/registry/registry.d.ts.map +1 -0
  278. package/dist/registry/registry.js +85 -0
  279. package/dist/registry/registry.js.map +1 -0
  280. package/dist/registry/sanitizer.d.ts +2 -0
  281. package/dist/registry/sanitizer.d.ts.map +1 -0
  282. package/dist/registry/sanitizer.js +31 -0
  283. package/dist/registry/sanitizer.js.map +1 -0
  284. package/dist/security/blocked-hosts.d.ts +6 -0
  285. package/dist/security/blocked-hosts.d.ts.map +1 -0
  286. package/dist/security/blocked-hosts.js +26 -0
  287. package/dist/security/blocked-hosts.js.map +1 -0
  288. package/dist/security/domain-allowlist.d.ts +7 -0
  289. package/dist/security/domain-allowlist.d.ts.map +1 -0
  290. package/dist/security/domain-allowlist.js +19 -0
  291. package/dist/security/domain-allowlist.js.map +1 -0
  292. package/dist/stdio-mode.d.ts +3 -0
  293. package/dist/stdio-mode.d.ts.map +1 -0
  294. package/dist/stdio-mode.js +130 -0
  295. package/dist/stdio-mode.js.map +1 -0
  296. package/dist/tools/exec.d.ts +20 -0
  297. package/dist/tools/exec.d.ts.map +1 -0
  298. package/dist/tools/exec.js +105 -0
  299. package/dist/tools/exec.js.map +1 -0
  300. package/dist/tools/http.d.ts +13 -0
  301. package/dist/tools/http.d.ts.map +1 -0
  302. package/dist/tools/http.js +99 -0
  303. package/dist/tools/http.js.map +1 -0
  304. package/dist/transport/agent-server.d.ts +26 -0
  305. package/dist/transport/agent-server.d.ts.map +1 -0
  306. package/dist/transport/agent-server.js +55 -0
  307. package/dist/transport/agent-server.js.map +1 -0
  308. package/dist/transport/mcp-normalizer.d.ts +9 -0
  309. package/dist/transport/mcp-normalizer.d.ts.map +1 -0
  310. package/dist/transport/mcp-normalizer.js +12 -0
  311. package/dist/transport/mcp-normalizer.js.map +1 -0
  312. package/dist/transport/sse-server.d.ts +7 -0
  313. package/dist/transport/sse-server.d.ts.map +1 -0
  314. package/dist/transport/sse-server.js +94 -0
  315. package/dist/transport/sse-server.js.map +1 -0
  316. package/dist/transport/stdio-server.d.ts +3 -0
  317. package/dist/transport/stdio-server.d.ts.map +1 -0
  318. package/dist/transport/stdio-server.js +12 -0
  319. package/dist/transport/stdio-server.js.map +1 -0
  320. package/dist/types.d.ts +15 -0
  321. package/dist/types.d.ts.map +1 -0
  322. package/dist/types.js +2 -0
  323. package/dist/types.js.map +1 -0
  324. package/dist/util/id.d.ts +5 -0
  325. package/dist/util/id.d.ts.map +1 -0
  326. package/dist/util/id.js +16 -0
  327. package/dist/util/id.js.map +1 -0
  328. package/dist/util/logger.d.ts +4 -0
  329. package/dist/util/logger.d.ts.map +1 -0
  330. package/dist/util/logger.js +24 -0
  331. package/dist/util/logger.js.map +1 -0
  332. package/dist/version.d.ts +2 -0
  333. package/dist/version.d.ts.map +1 -0
  334. package/dist/version.js +4 -0
  335. package/dist/version.js.map +1 -0
  336. package/examples/claude-code-setup.md +77 -0
  337. package/examples/gateway.yaml +118 -0
  338. package/examples/local-dev.yaml +41 -0
  339. package/examples/openclaw-setup.md +52 -0
  340. package/examples/profiles.yaml +103 -0
  341. package/package.json +80 -3
  342. package/schema.json +943 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-server.js","sourceRoot":"","sources":["../../src/transport/sse-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentServerDeps } from './agent-server.js';
2
+ export declare function runStdioServer(deps: AgentServerDeps): Promise<void>;
3
+ //# sourceMappingURL=stdio-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-server.d.ts","sourceRoot":"","sources":["../../src/transport/stdio-server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE"}
@@ -0,0 +1,12 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { createAgentServer, connectAgentServer } from './agent-server.js';
3
+ import { childLogger } from '../util/logger.js';
4
+ const log = childLogger('stdio-server');
5
+ export async function runStdioServer(deps) {
6
+ log.info({ agentId: deps.agentId }, 'Starting stdio server');
7
+ const transport = new StdioServerTransport();
8
+ const server = createAgentServer(deps);
9
+ await connectAgentServer(server, transport);
10
+ log.info({ agentId: deps.agentId }, 'Stdio server connected');
11
+ }
12
+ //# sourceMappingURL=stdio-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-server.js","sourceRoot":"","sources":["../../src/transport/stdio-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,GAAG,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB;IACxD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface ToolCall {
2
+ tool: string;
3
+ args: Record<string, unknown>;
4
+ agentId: string;
5
+ }
6
+ export interface ToolResult {
7
+ success: boolean;
8
+ data?: unknown;
9
+ error?: string;
10
+ metadata?: {
11
+ duration_ms?: number;
12
+ truncated?: boolean;
13
+ };
14
+ }
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1D"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ /** Generate an 8-char uppercase alphanumeric HITL approval code (no modular bias) */
2
+ export declare function generateApprovalCode(): string;
3
+ /** Generate a unique request ID (UUID-like) */
4
+ export declare function generateId(): string;
5
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/util/id.ts"],"names":[],"mappings":"AAKA,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
@@ -0,0 +1,16 @@
1
+ import { randomBytes, randomInt } from 'crypto';
2
+ const APPROVAL_CODE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
3
+ const APPROVAL_CODE_LENGTH = 8; // 36^8 ≈ 2.8 trillion
4
+ /** Generate an 8-char uppercase alphanumeric HITL approval code (no modular bias) */
5
+ export function generateApprovalCode() {
6
+ let code = '';
7
+ for (let i = 0; i < APPROVAL_CODE_LENGTH; i++) {
8
+ code += APPROVAL_CODE_CHARS[randomInt(APPROVAL_CODE_CHARS.length)];
9
+ }
10
+ return code;
11
+ }
12
+ /** Generate a unique request ID (UUID-like) */
13
+ export function generateId() {
14
+ return randomBytes(16).toString('hex');
15
+ }
16
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/util/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEhD,MAAM,mBAAmB,GAAG,sCAAsC,CAAC;AACnE,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,sBAAsB;AAEtD,qFAAqF;AACrF,MAAM,UAAU,oBAAoB;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,IAAI,mBAAmB,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import pino from 'pino';
2
+ export declare const logger: pino.Logger<never, boolean>;
3
+ export declare function childLogger(component: string): pino.Logger<never, boolean>;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/util/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAkBxB,eAAO,MAAM,MAAM,6BAEuE,CAAC;AAE3F,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,+BAE5C"}
@@ -0,0 +1,24 @@
1
+ import pino from 'pino';
2
+ function createTransport() {
3
+ if (process.env.NODE_ENV === 'production')
4
+ return undefined;
5
+ try {
6
+ // pino-pretty is optional — only used in development
7
+ require.resolve('pino-pretty');
8
+ return { target: 'pino-pretty', options: { colorize: true, destination: 2 } };
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ const transport = createTransport();
15
+ // Always log to stderr (fd 2) so stdout stays clean for MCP stdio transport.
16
+ // When using pino-pretty, destination is set in the transport options.
17
+ // When not using a transport, we pass pino.destination(2) as the stream.
18
+ export const logger = transport
19
+ ? pino({ name: 'airlock', level: process.env.LOG_LEVEL ?? 'info', transport })
20
+ : pino({ name: 'airlock', level: process.env.LOG_LEVEL ?? 'info' }, pino.destination(2));
21
+ export function childLogger(component) {
22
+ return logger.child({ component });
23
+ }
24
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/util/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,CAAC;QACH,qDAAqD;QACrD,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;AAEpC,6EAA6E;AAC7E,uEAAuE;AACvE,yEAAyE;AACzE,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS;IAC7B,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;IAC9E,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3F,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,QAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { readFileSync } from 'fs';
2
+ const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
3
+ export const VERSION = pkg.version;
4
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAEvF,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC"}
@@ -0,0 +1,77 @@
1
+ # Claude Code Setup (stdio mode)
2
+
3
+ Airlock can act as an MCP server for Claude Code using stdio transport.
4
+
5
+ ## Add to Claude Code MCP config
6
+
7
+ In `~/.claude/mcp.json` (or `.claude/mcp.json` in your project):
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "airlock": {
13
+ "command": "airlock",
14
+ "args": ["--agent", "claude-code", "--config", "/etc/airlock/gateway.yaml"]
15
+ }
16
+ }
17
+ }
18
+ ```
19
+
20
+ Or using `npx` if not globally installed:
21
+
22
+ ```json
23
+ {
24
+ "mcpServers": {
25
+ "airlock": {
26
+ "command": "npx",
27
+ "args": [
28
+ "-y",
29
+ "airlock-bot",
30
+ "--agent",
31
+ "claude-code",
32
+ "--config",
33
+ "/etc/airlock/gateway.yaml"
34
+ ]
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## What This Does
41
+
42
+ - Claude Code connects to Airlock over stdio
43
+ - Airlock presents only the tools allowed for the `claude-code` agent
44
+ - All tool calls are logged to the audit database
45
+ - Tools requiring HITL will block until approved (or timeout)
46
+
47
+ ## Example Agent Config
48
+
49
+ ```yaml
50
+ agents:
51
+ claude-code:
52
+ allow:
53
+ - 'filesystem/*'
54
+ - 'github/list*'
55
+ - 'github/get*'
56
+ - 'http/get'
57
+ exec:
58
+ allow:
59
+ - 'git status'
60
+ - 'git diff*'
61
+ - 'npm test'
62
+ deny:
63
+ - '*'
64
+ ```
65
+
66
+ ## Testing
67
+
68
+ ```sh
69
+ # Verify the agent works
70
+ airlock --agent claude-code --config examples/gateway.yaml
71
+ ```
72
+
73
+ Then use MCP Inspector or connect from Claude Code to verify:
74
+
75
+ - `list_tools` returns only allowed tools
76
+ - Denied tools are absent from the manifest
77
+ - Audit log is populated after calls
@@ -0,0 +1,118 @@
1
+ # yaml-language-server: $schema=../schema.json
2
+ # Airlock Gateway Configuration
3
+ # Environment variables are substituted using ${VAR_NAME} syntax.
4
+
5
+ server:
6
+ port: 4111
7
+ host: 127.0.0.1
8
+ # api_secret: ${AIRLOCK_API_SECRET}
9
+
10
+ # Tool providers — MCP servers and builtins
11
+ providers:
12
+ filesystem:
13
+ type: stdio
14
+ command: npx
15
+ args: ['-y', '@modelcontextprotocol/server-filesystem', '/home/user/projects']
16
+
17
+ github:
18
+ type: stdio
19
+ command: npx
20
+ args: ['-y', '@modelcontextprotocol/server-github']
21
+ env:
22
+ GITHUB_PERSONAL_ACCESS_TOKEN: ${GITHUB_TOKEN}
23
+
24
+ # Example SSE-based MCP
25
+ # myserver:
26
+ # type: sse
27
+ # url: http://localhost:8000/sse
28
+ # headers:
29
+ # Authorization: Bearer ${MY_SERVER_TOKEN}
30
+
31
+ exec: builtin
32
+ http: builtin
33
+
34
+ # Agents
35
+ agents:
36
+ # Helena: full-access developer agent with approval on destructive ops
37
+ helena:
38
+ allow:
39
+ - 'filesystem/*'
40
+ - 'github/*'
41
+ - 'http/*'
42
+ - 'exec/run'
43
+ ask:
44
+ - 'github/create_pr'
45
+ - 'github/merge_pull_request'
46
+ - 'github/delete_branch'
47
+ exec:
48
+ allow:
49
+ - 'git status'
50
+ - 'git diff*'
51
+ - 'git log*'
52
+ - 'npm test*'
53
+ - 'npm run*'
54
+ ask:
55
+ - 'git push*'
56
+ - 'git merge*'
57
+ deny:
58
+ - 'sudo*'
59
+ - 'rm -rf*'
60
+ http:
61
+ domain_allowlist:
62
+ - 'api.github.com'
63
+ - '*.sentry.io'
64
+
65
+ # Claude Code: read-only, no approval needed
66
+ claude-code:
67
+ allow:
68
+ - 'filesystem/*'
69
+ - 'github/list*'
70
+ - 'github/get*'
71
+ - 'http/get'
72
+ exec:
73
+ allow:
74
+ - 'git status'
75
+ - 'git diff*'
76
+ - 'npm test'
77
+ deny:
78
+ - '*' # deny everything not explicitly allowed
79
+
80
+ # Approval configuration
81
+ approvals:
82
+ # provider:
83
+ # type: telegram
84
+ # bot_token: ${TELEGRAM_BOT_TOKEN}
85
+ # chat_id: ${TELEGRAM_CHAT_ID}
86
+ #
87
+ # provider:
88
+ # type: openclaw
89
+ # gateway_url: ws://localhost:18789
90
+ # token: ${OPENCLAW_TOKEN}
91
+ # session_key: "agent:main:telegram:channel:123456789"
92
+ provider:
93
+ type: stdio # prints to stderr for dev/testing
94
+ timeout_ms: 300000 # 5 minutes
95
+ batch_window_ms: 10000 # collect requests for 10s before notifying
96
+
97
+ # Security defaults
98
+ security:
99
+ blocked_hosts:
100
+ - localhost
101
+ - 127.0.0.1
102
+ - '::1'
103
+ - '*.local'
104
+ - '10.*'
105
+ - '192.168.*'
106
+ - '172.16.*'
107
+ allowed_local: [] # override to allow specific local hosts
108
+
109
+ # Audit logging
110
+ audit:
111
+ db_path: ./airlock-audit.db
112
+ retention_days: 90
113
+ redact_fields:
114
+ - password
115
+ - token
116
+ - secret
117
+ - key
118
+ - authorization
@@ -0,0 +1,41 @@
1
+ # yaml-language-server: $schema=../schema.json
2
+ # Local development config with dashboard approval.
3
+ # Uses the echo MCP server — no tokens or external services needed.
4
+ #
5
+ # Run: npx tsx src/index.ts --agent dev --config examples/local-dev.yaml
6
+ # Then open http://localhost:4112 to see the approval dashboard.
7
+ #
8
+ # Tools "echo/echo" and "echo/add" are available.
9
+ # "echo/add" requires approval — call it to see the dashboard in action.
10
+
11
+ providers:
12
+ echo:
13
+ type: stdio
14
+ command: npx
15
+ args: ['tsx', 'test/echo-server.ts']
16
+
17
+ agents:
18
+ dev:
19
+ allow:
20
+ - 'echo/*'
21
+ ask:
22
+ - 'echo/add'
23
+
24
+ approvals:
25
+ provider:
26
+ type: dashboard
27
+ port: 4112
28
+ timeout_ms: 300000
29
+ batch_window_ms: 2000
30
+
31
+ security:
32
+ blocked_hosts:
33
+ - localhost
34
+ - 127.0.0.1
35
+ - '::1'
36
+ allowed_local: []
37
+
38
+ audit:
39
+ db_path: ':memory:'
40
+ retention_days: 1
41
+ redact_fields: []
@@ -0,0 +1,52 @@
1
+ # OpenClaw Provider Setup
2
+
3
+ The `openclaw` approval provider delivers approval requests to your OpenClaw session
4
+ (Telegram, Discord, etc.) and listens for replies.
5
+
6
+ ## Configuration
7
+
8
+ ```yaml
9
+ approvals:
10
+ provider:
11
+ type: openclaw
12
+ gateway_url: ws://localhost:18789
13
+ token: ${OPENCLAW_TOKEN}
14
+ session_key: 'agent:main:telegram:channel:YOUR_CHAT_ID'
15
+ # or just "main" for the default session
16
+ ```
17
+
18
+ Set `OPENCLAW_TOKEN` in your environment:
19
+
20
+ ```sh
21
+ export OPENCLAW_TOKEN=your-openclaw-bearer-token
22
+ ```
23
+
24
+ ## How It Works
25
+
26
+ 1. When Airlock needs approval, it sends a `chat.send` RPC over WebSocket to OpenClaw.
27
+ 2. OpenClaw delivers the message to your configured channel (Telegram, Discord, etc.).
28
+ 3. You reply with: `approve A1B2C3` or `deny A1B2C3`
29
+ 4. Airlock's WebSocket listener picks up the reply and resolves the pending request.
30
+
31
+ ## Session Key Format
32
+
33
+ - Default session: `"main"`
34
+ - Telegram channel: `"agent:main:telegram:channel:<chat_id>"`
35
+ - Discord channel: `"agent:main:discord:channel:<channel_id>"`
36
+
37
+ ## Wire OpenClaw in `openclaw.json`
38
+
39
+ Ensure the agent that will receive HITL messages has access to the session.
40
+ In your openclaw config, the relevant agent should have the session key configured.
41
+
42
+ ## Systemd Integration
43
+
44
+ If running both services on the same host, configure Airlock to start after OpenClaw:
45
+
46
+ ```ini
47
+ # airlock.service
48
+ [Unit]
49
+ After=openclaw-gateway.service
50
+ ```
51
+
52
+ See `../airlock.service` for the full unit file.
@@ -0,0 +1,103 @@
1
+ # yaml-language-server: $schema=../schema.json
2
+ # Composable profiles — define reusable permission sets, then mix them into agents.
3
+ #
4
+ # Profiles are union-merged: an agent that extends [readonly, github-write]
5
+ # gets all allow/ask patterns from both profiles, plus its own.
6
+ # Precedence still applies: deny > ask > allow > default-deny.
7
+ #
8
+ # Run: npx tsx src/index.ts --agent helena --config examples/profiles.yaml
9
+
10
+ providers:
11
+ filesystem:
12
+ type: stdio
13
+ command: npx
14
+ args: ['-y', '@modelcontextprotocol/server-filesystem', '/home/user/projects']
15
+
16
+ github:
17
+ type: stdio
18
+ command: npx
19
+ args: ['-y', '@modelcontextprotocol/server-github']
20
+ env:
21
+ GITHUB_PERSONAL_ACCESS_TOKEN: ${GITHUB_TOKEN}
22
+
23
+ exec: builtin
24
+ http: builtin
25
+
26
+ # Reusable permission sets
27
+ profiles:
28
+ readonly:
29
+ allow:
30
+ - 'filesystem/read*'
31
+ - 'filesystem/list*'
32
+ - 'github/list*'
33
+ - 'github/get*'
34
+ - 'http/get'
35
+ ask: []
36
+
37
+ github-write:
38
+ allow:
39
+ - 'github/create_issue'
40
+ - 'github/create_pr'
41
+ ask:
42
+ - 'github/delete_branch'
43
+ - 'github/merge_pull_request'
44
+
45
+ full-fs:
46
+ allow:
47
+ - 'filesystem/*'
48
+ ask: []
49
+
50
+ # Agents compose profiles with their own overrides
51
+ agents:
52
+ # Read-only reviewer — gets readonly profile, nothing else
53
+ reviewer:
54
+ extends: [readonly]
55
+
56
+ # Developer — reads everything, writes to GitHub with approval on destructive ops
57
+ helena:
58
+ extends: [readonly, github-write, full-fs]
59
+ allow:
60
+ - 'exec/run'
61
+ exec:
62
+ allow:
63
+ - 'git status'
64
+ - 'git diff*'
65
+ - 'git log*'
66
+ - 'npm test*'
67
+ ask:
68
+ - 'git push*'
69
+ deny:
70
+ - 'sudo*'
71
+ - 'rm -rf*'
72
+ http:
73
+ domain_allowlist:
74
+ - 'api.github.com'
75
+
76
+ # Claude Code — readonly plus filesystem, no approval needed
77
+ claude-code:
78
+ extends: [readonly, full-fs]
79
+ exec:
80
+ allow:
81
+ - 'git status'
82
+ - 'git diff*'
83
+ - 'npm test'
84
+ deny:
85
+ - '*'
86
+
87
+ approvals:
88
+ provider:
89
+ type: stdio
90
+ timeout_ms: 300000
91
+ batch_window_ms: 10000
92
+
93
+ security:
94
+ blocked_hosts:
95
+ - localhost
96
+ - 127.0.0.1
97
+ - '::1'
98
+ allowed_local: []
99
+
100
+ audit:
101
+ db_path: ':memory:'
102
+ retention_days: 1
103
+ redact_fields: []
package/package.json CHANGED
@@ -1,6 +1,83 @@
1
1
  {
2
2
  "name": "airlock-bot",
3
- "version": "0.0.1",
4
- "description": "Permissions-aware MCP gateway with human-in-the-loop approval for AI agents.",
5
- "license": "MIT"
3
+ "version": "0.2.2",
4
+ "description": "Permissions-aware MCP gateway with human-in-the-loop approval for AI agents",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "airlock": "./dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "files": [
13
+ "dist",
14
+ "examples",
15
+ "schema.json",
16
+ "airlock.service"
17
+ ],
18
+ "engines": {
19
+ "node": ">=18"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/airlock-dev/airlock.git"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/airlock-dev/airlock/issues"
27
+ },
28
+ "homepage": "https://airlock.bot",
29
+ "keywords": [
30
+ "mcp",
31
+ "model-context-protocol",
32
+ "gateway",
33
+ "ai-agent",
34
+ "human-in-the-loop",
35
+ "security",
36
+ "prompt-injection",
37
+ "allowlist"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsc",
41
+ "dev": "tsx src/index.ts",
42
+ "configure-agent": "tsx scripts/configure-agent.ts",
43
+ "test": "vitest",
44
+ "typecheck": "tsc --noEmit",
45
+ "lint": "eslint src",
46
+ "lint:fix": "eslint src --fix",
47
+ "format": "prettier --write .",
48
+ "format:check": "prettier --check .",
49
+ "schema": "tsx scripts/generate-schema.ts",
50
+ "prepublishOnly": "npm run schema && npm run build"
51
+ },
52
+ "dependencies": {
53
+ "@apidevtools/swagger-parser": "^12.1.0",
54
+ "@modelcontextprotocol/sdk": "^1.27.1",
55
+ "ai": "^6.0.116",
56
+ "ajv": "^8.18.0",
57
+ "better-sqlite3": "^11.0.0",
58
+ "chokidar": "^3.6.0",
59
+ "fastify": "^5.0.0",
60
+ "pino": "^9.0.0",
61
+ "ws": "^8.19.0",
62
+ "yaml": "^2.4.0",
63
+ "zod": "^3.22.0"
64
+ },
65
+ "devDependencies": {
66
+ "@eslint/js": "^10.0.1",
67
+ "@types/better-sqlite3": "^7.6.0",
68
+ "@types/node": "^22.0.0",
69
+ "@types/ws": "^8.18.1",
70
+ "@vitest/coverage-v8": "^3.2.4",
71
+ "eslint": "^10.0.3",
72
+ "eslint-config-prettier": "^10.1.8",
73
+ "lefthook": "^2.1.4",
74
+ "openapi-types": "^12.1.3",
75
+ "pino-pretty": "^13.0.0",
76
+ "prettier": "^3.8.1",
77
+ "tsx": "^4.7.0",
78
+ "typescript": "^5.4.0",
79
+ "typescript-eslint": "^8.57.0",
80
+ "vitest": "^3.0.0",
81
+ "zod-to-json-schema": "^3.25.1"
82
+ }
6
83
  }