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.
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/airlock.service +27 -0
- package/dist/allowlist/engine.d.ts +9 -0
- package/dist/allowlist/engine.d.ts.map +1 -0
- package/dist/allowlist/engine.js +24 -0
- package/dist/allowlist/engine.js.map +1 -0
- package/dist/allowlist/pattern.d.ts +13 -0
- package/dist/allowlist/pattern.d.ts.map +1 -0
- package/dist/allowlist/pattern.js +33 -0
- package/dist/allowlist/pattern.js.map +1 -0
- package/dist/audit/api.d.ts +7 -0
- package/dist/audit/api.d.ts.map +1 -0
- package/dist/audit/api.js +31 -0
- package/dist/audit/api.js.map +1 -0
- package/dist/audit/db.d.ts +44 -0
- package/dist/audit/db.d.ts.map +1 -0
- package/dist/audit/db.js +121 -0
- package/dist/audit/db.js.map +1 -0
- package/dist/audit/logger.d.ts +25 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +58 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/redactor.d.ts +5 -0
- package/dist/audit/redactor.d.ts.map +1 -0
- package/dist/audit/redactor.js +27 -0
- package/dist/audit/redactor.js.map +1 -0
- package/dist/backend/cli/adapter.d.ts +23 -0
- package/dist/backend/cli/adapter.d.ts.map +1 -0
- package/dist/backend/cli/adapter.js +176 -0
- package/dist/backend/cli/adapter.js.map +1 -0
- package/dist/backend/cli/builder.d.ts +3 -0
- package/dist/backend/cli/builder.d.ts.map +1 -0
- package/dist/backend/cli/builder.js +52 -0
- package/dist/backend/cli/builder.js.map +1 -0
- package/dist/backend/cli/escaper.d.ts +2 -0
- package/dist/backend/cli/escaper.d.ts.map +1 -0
- package/dist/backend/cli/escaper.js +8 -0
- package/dist/backend/cli/escaper.js.map +1 -0
- package/dist/backend/exec-adapter.d.ts +13 -0
- package/dist/backend/exec-adapter.d.ts.map +1 -0
- package/dist/backend/exec-adapter.js +39 -0
- package/dist/backend/exec-adapter.js.map +1 -0
- package/dist/backend/factory.d.ts +9 -0
- package/dist/backend/factory.d.ts.map +1 -0
- package/dist/backend/factory.js +35 -0
- package/dist/backend/factory.js.map +1 -0
- package/dist/backend/http-adapter.d.ts +15 -0
- package/dist/backend/http-adapter.d.ts.map +1 -0
- package/dist/backend/http-adapter.js +39 -0
- package/dist/backend/http-adapter.js.map +1 -0
- package/dist/backend/mcp-adapter.d.ts +14 -0
- package/dist/backend/mcp-adapter.d.ts.map +1 -0
- package/dist/backend/mcp-adapter.js +38 -0
- package/dist/backend/mcp-adapter.js.map +1 -0
- package/dist/backend/openapi/adapter.d.ts +17 -0
- package/dist/backend/openapi/adapter.d.ts.map +1 -0
- package/dist/backend/openapi/adapter.js +144 -0
- package/dist/backend/openapi/adapter.js.map +1 -0
- package/dist/backend/openapi/parser.d.ts +21 -0
- package/dist/backend/openapi/parser.d.ts.map +1 -0
- package/dist/backend/openapi/parser.js +145 -0
- package/dist/backend/openapi/parser.js.map +1 -0
- package/dist/backend/types.d.ts +9 -0
- package/dist/backend/types.d.ts.map +1 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +178 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/profiles.d.ts +12 -0
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/profiles.js +34 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/config/schema.d.ts +2034 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +257 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/watcher.d.ts +11 -0
- package/dist/config/watcher.d.ts.map +1 -0
- package/dist/config/watcher.js +39 -0
- package/dist/config/watcher.js.map +1 -0
- package/dist/configure-agent/cli.d.ts +2 -0
- package/dist/configure-agent/cli.d.ts.map +1 -0
- package/dist/configure-agent/cli.js +390 -0
- package/dist/configure-agent/cli.js.map +1 -0
- package/dist/discover/cli.d.ts +2 -0
- package/dist/discover/cli.d.ts.map +1 -0
- package/dist/discover/cli.js +97 -0
- package/dist/discover/cli.js.map +1 -0
- package/dist/discover/index.d.ts +19 -0
- package/dist/discover/index.d.ts.map +1 -0
- package/dist/discover/index.js +70 -0
- package/dist/discover/index.js.map +1 -0
- package/dist/discover/openapi.d.ts +9 -0
- package/dist/discover/openapi.d.ts.map +1 -0
- package/dist/discover/openapi.js +47 -0
- package/dist/discover/openapi.js.map +1 -0
- package/dist/discover/strategies/fig.d.ts +29 -0
- package/dist/discover/strategies/fig.d.ts.map +1 -0
- package/dist/discover/strategies/fig.js +82 -0
- package/dist/discover/strategies/fig.js.map +1 -0
- package/dist/discover/strategies/help-parser.d.ts +21 -0
- package/dist/discover/strategies/help-parser.d.ts.map +1 -0
- package/dist/discover/strategies/help-parser.js +121 -0
- package/dist/discover/strategies/help-parser.js.map +1 -0
- package/dist/discover/writer.d.ts +5 -0
- package/dist/discover/writer.d.ts.map +1 -0
- package/dist/discover/writer.js +14 -0
- package/dist/discover/writer.js.map +1 -0
- package/dist/gateway.d.ts +20 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +125 -0
- package/dist/gateway.js.map +1 -0
- package/dist/hitl/api.d.ts +7 -0
- package/dist/hitl/api.d.ts.map +1 -0
- package/dist/hitl/api.js +35 -0
- package/dist/hitl/api.js.map +1 -0
- package/dist/hitl/batcher.d.ts +11 -0
- package/dist/hitl/batcher.d.ts.map +1 -0
- package/dist/hitl/batcher.js +37 -0
- package/dist/hitl/batcher.js.map +1 -0
- package/dist/hitl/engine.d.ts +36 -0
- package/dist/hitl/engine.d.ts.map +1 -0
- package/dist/hitl/engine.js +150 -0
- package/dist/hitl/engine.js.map +1 -0
- package/dist/hitl/formatter.d.ts +4 -0
- package/dist/hitl/formatter.d.ts.map +1 -0
- package/dist/hitl/formatter.js +31 -0
- package/dist/hitl/formatter.js.map +1 -0
- package/dist/hitl/parser.d.ts +7 -0
- package/dist/hitl/parser.d.ts.map +1 -0
- package/dist/hitl/parser.js +17 -0
- package/dist/hitl/parser.js.map +1 -0
- package/dist/hitl/provider-factory.d.ts +4 -0
- package/dist/hitl/provider-factory.d.ts.map +1 -0
- package/dist/hitl/provider-factory.js +42 -0
- package/dist/hitl/provider-factory.js.map +1 -0
- package/dist/hitl/providers/composite.d.ts +9 -0
- package/dist/hitl/providers/composite.d.ts.map +1 -0
- package/dist/hitl/providers/composite.js +23 -0
- package/dist/hitl/providers/composite.js.map +1 -0
- package/dist/hitl/providers/dashboard.d.ts +17 -0
- package/dist/hitl/providers/dashboard.d.ts.map +1 -0
- package/dist/hitl/providers/dashboard.js +210 -0
- package/dist/hitl/providers/dashboard.js.map +1 -0
- package/dist/hitl/providers/macos.d.ts +10 -0
- package/dist/hitl/providers/macos.d.ts.map +1 -0
- package/dist/hitl/providers/macos.js +65 -0
- package/dist/hitl/providers/macos.js.map +1 -0
- package/dist/hitl/providers/openclaw.d.ts +21 -0
- package/dist/hitl/providers/openclaw.d.ts.map +1 -0
- package/dist/hitl/providers/openclaw.js +106 -0
- package/dist/hitl/providers/openclaw.js.map +1 -0
- package/dist/hitl/providers/slack.d.ts +12 -0
- package/dist/hitl/providers/slack.d.ts.map +1 -0
- package/dist/hitl/providers/slack.js +24 -0
- package/dist/hitl/providers/slack.js.map +1 -0
- package/dist/hitl/providers/stdio.d.ts +12 -0
- package/dist/hitl/providers/stdio.d.ts.map +1 -0
- package/dist/hitl/providers/stdio.js +41 -0
- package/dist/hitl/providers/stdio.js.map +1 -0
- package/dist/hitl/providers/telegram.d.ts +22 -0
- package/dist/hitl/providers/telegram.d.ts.map +1 -0
- package/dist/hitl/providers/telegram.js +87 -0
- package/dist/hitl/providers/telegram.js.map +1 -0
- package/dist/hitl/providers/tui.d.ts +16 -0
- package/dist/hitl/providers/tui.d.ts.map +1 -0
- package/dist/hitl/providers/tui.js +169 -0
- package/dist/hitl/providers/tui.js.map +1 -0
- package/dist/hitl/providers/types.d.ts +18 -0
- package/dist/hitl/providers/types.d.ts.map +1 -0
- package/dist/hitl/providers/types.js +2 -0
- package/dist/hitl/providers/types.js.map +1 -0
- package/dist/hitl/providers/webhook.d.ts +13 -0
- package/dist/hitl/providers/webhook.d.ts.map +1 -0
- package/dist/hitl/providers/webhook.js +27 -0
- package/dist/hitl/providers/webhook.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/chain-builder.d.ts +16 -0
- package/dist/middleware/chain-builder.d.ts.map +1 -0
- package/dist/middleware/chain-builder.js +139 -0
- package/dist/middleware/chain-builder.js.map +1 -0
- package/dist/middleware/compose.d.ts +3 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.js +15 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/core/allowlist.d.ts +3 -0
- package/dist/middleware/core/allowlist.d.ts.map +1 -0
- package/dist/middleware/core/allowlist.js +23 -0
- package/dist/middleware/core/allowlist.js.map +1 -0
- package/dist/middleware/core/exec-policy.d.ts +3 -0
- package/dist/middleware/core/exec-policy.d.ts.map +1 -0
- package/dist/middleware/core/exec-policy.js +30 -0
- package/dist/middleware/core/exec-policy.js.map +1 -0
- package/dist/middleware/core/execute.d.ts +3 -0
- package/dist/middleware/core/execute.d.ts.map +1 -0
- package/dist/middleware/core/execute.js +35 -0
- package/dist/middleware/core/execute.js.map +1 -0
- package/dist/middleware/core/hitl-gate.d.ts +3 -0
- package/dist/middleware/core/hitl-gate.d.ts.map +1 -0
- package/dist/middleware/core/hitl-gate.js +38 -0
- package/dist/middleware/core/hitl-gate.js.map +1 -0
- package/dist/middleware/core/rate-limiter.d.ts +10 -0
- package/dist/middleware/core/rate-limiter.d.ts.map +1 -0
- package/dist/middleware/core/rate-limiter.js +32 -0
- package/dist/middleware/core/rate-limiter.js.map +1 -0
- package/dist/middleware/core/schema-validator.d.ts +3 -0
- package/dist/middleware/core/schema-validator.d.ts.map +1 -0
- package/dist/middleware/core/schema-validator.js +31 -0
- package/dist/middleware/core/schema-validator.js.map +1 -0
- package/dist/middleware/detectors/injection-detector.d.ts +12 -0
- package/dist/middleware/detectors/injection-detector.d.ts.map +1 -0
- package/dist/middleware/detectors/injection-detector.js +129 -0
- package/dist/middleware/detectors/injection-detector.js.map +1 -0
- package/dist/middleware/detectors/sensitivity-classifier.d.ts +12 -0
- package/dist/middleware/detectors/sensitivity-classifier.d.ts.map +1 -0
- package/dist/middleware/detectors/sensitivity-classifier.js +125 -0
- package/dist/middleware/detectors/sensitivity-classifier.js.map +1 -0
- package/dist/middleware/post/canary-token-injector.d.ts +10 -0
- package/dist/middleware/post/canary-token-injector.d.ts.map +1 -0
- package/dist/middleware/post/canary-token-injector.js +53 -0
- package/dist/middleware/post/canary-token-injector.js.map +1 -0
- package/dist/middleware/post/output-injection-detector.d.ts +7 -0
- package/dist/middleware/post/output-injection-detector.d.ts.map +1 -0
- package/dist/middleware/post/output-injection-detector.js +46 -0
- package/dist/middleware/post/output-injection-detector.js.map +1 -0
- package/dist/middleware/post/output-size-limiter.d.ts +7 -0
- package/dist/middleware/post/output-size-limiter.d.ts.map +1 -0
- package/dist/middleware/post/output-size-limiter.js +47 -0
- package/dist/middleware/post/output-size-limiter.js.map +1 -0
- package/dist/middleware/post/output-summarizer.d.ts +15 -0
- package/dist/middleware/post/output-summarizer.d.ts.map +1 -0
- package/dist/middleware/post/output-summarizer.js +38 -0
- package/dist/middleware/post/output-summarizer.js.map +1 -0
- package/dist/middleware/post/strip-query-params.d.ts +3 -0
- package/dist/middleware/post/strip-query-params.d.ts.map +1 -0
- package/dist/middleware/post/strip-query-params.js +22 -0
- package/dist/middleware/post/strip-query-params.js.map +1 -0
- package/dist/middleware/post/untrusted-envelope.d.ts +3 -0
- package/dist/middleware/post/untrusted-envelope.d.ts.map +1 -0
- package/dist/middleware/post/untrusted-envelope.js +10 -0
- package/dist/middleware/post/untrusted-envelope.js.map +1 -0
- package/dist/middleware/types.d.ts +32 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +2 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/pool/http-client.d.ts +26 -0
- package/dist/pool/http-client.d.ts.map +1 -0
- package/dist/pool/http-client.js +109 -0
- package/dist/pool/http-client.js.map +1 -0
- package/dist/pool/oauth-provider.d.ts +34 -0
- package/dist/pool/oauth-provider.d.ts.map +1 -0
- package/dist/pool/oauth-provider.js +135 -0
- package/dist/pool/oauth-provider.js.map +1 -0
- package/dist/pool/pool.d.ts +30 -0
- package/dist/pool/pool.d.ts.map +1 -0
- package/dist/pool/pool.js +119 -0
- package/dist/pool/pool.js.map +1 -0
- package/dist/pool/required-mcps.d.ts +7 -0
- package/dist/pool/required-mcps.d.ts.map +1 -0
- package/dist/pool/required-mcps.js +18 -0
- package/dist/pool/required-mcps.js.map +1 -0
- package/dist/pool/sse-client.d.ts +22 -0
- package/dist/pool/sse-client.d.ts.map +1 -0
- package/dist/pool/sse-client.js +70 -0
- package/dist/pool/sse-client.js.map +1 -0
- package/dist/pool/stdio-client.d.ts +24 -0
- package/dist/pool/stdio-client.d.ts.map +1 -0
- package/dist/pool/stdio-client.js +77 -0
- package/dist/pool/stdio-client.js.map +1 -0
- package/dist/registry/registry.d.ts +19 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +85 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/sanitizer.d.ts +2 -0
- package/dist/registry/sanitizer.d.ts.map +1 -0
- package/dist/registry/sanitizer.js +31 -0
- package/dist/registry/sanitizer.js.map +1 -0
- package/dist/security/blocked-hosts.d.ts +6 -0
- package/dist/security/blocked-hosts.d.ts.map +1 -0
- package/dist/security/blocked-hosts.js +26 -0
- package/dist/security/blocked-hosts.js.map +1 -0
- package/dist/security/domain-allowlist.d.ts +7 -0
- package/dist/security/domain-allowlist.d.ts.map +1 -0
- package/dist/security/domain-allowlist.js +19 -0
- package/dist/security/domain-allowlist.js.map +1 -0
- package/dist/stdio-mode.d.ts +3 -0
- package/dist/stdio-mode.d.ts.map +1 -0
- package/dist/stdio-mode.js +130 -0
- package/dist/stdio-mode.js.map +1 -0
- package/dist/tools/exec.d.ts +20 -0
- package/dist/tools/exec.d.ts.map +1 -0
- package/dist/tools/exec.js +105 -0
- package/dist/tools/exec.js.map +1 -0
- package/dist/tools/http.d.ts +13 -0
- package/dist/tools/http.d.ts.map +1 -0
- package/dist/tools/http.js +99 -0
- package/dist/tools/http.js.map +1 -0
- package/dist/transport/agent-server.d.ts +26 -0
- package/dist/transport/agent-server.d.ts.map +1 -0
- package/dist/transport/agent-server.js +55 -0
- package/dist/transport/agent-server.js.map +1 -0
- package/dist/transport/mcp-normalizer.d.ts +9 -0
- package/dist/transport/mcp-normalizer.d.ts.map +1 -0
- package/dist/transport/mcp-normalizer.js +12 -0
- package/dist/transport/mcp-normalizer.js.map +1 -0
- package/dist/transport/sse-server.d.ts +7 -0
- package/dist/transport/sse-server.d.ts.map +1 -0
- package/dist/transport/sse-server.js +94 -0
- package/dist/transport/sse-server.js.map +1 -0
- package/dist/transport/stdio-server.d.ts +3 -0
- package/dist/transport/stdio-server.d.ts.map +1 -0
- package/dist/transport/stdio-server.js +12 -0
- package/dist/transport/stdio-server.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util/id.d.ts +5 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +16 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/logger.d.ts +4 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +24 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/examples/claude-code-setup.md +77 -0
- package/examples/gateway.yaml +118 -0
- package/examples/local-dev.yaml +41 -0
- package/examples/openclaw-setup.md +52 -0
- package/examples/profiles.yaml +103 -0
- package/package.json +80 -3
- 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 @@
|
|
|
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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/util/id.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,QAAc,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -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.
|
|
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
|
}
|