airlock-bot 0.0.1 → 0.2.1
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 +336 -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/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 +103 -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 +108 -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 +69 -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 +76 -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 +54 -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/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 +51 -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,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,51 @@
|
|
|
1
|
+
# OpenClaw Provider Setup
|
|
2
|
+
|
|
3
|
+
The `openclaw` HITL provider delivers approval requests to your OpenClaw session
|
|
4
|
+
(Telegram, Discord, etc.) and listens for replies.
|
|
5
|
+
|
|
6
|
+
## Configuration
|
|
7
|
+
|
|
8
|
+
```yaml
|
|
9
|
+
hitl:
|
|
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
|
+
```sh
|
|
20
|
+
export OPENCLAW_TOKEN=your-openclaw-bearer-token
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## How It Works
|
|
24
|
+
|
|
25
|
+
1. When Airlock needs approval, it sends a `chat.send` RPC over WebSocket to OpenClaw.
|
|
26
|
+
2. OpenClaw delivers the message to your configured channel (Telegram, Discord, etc.).
|
|
27
|
+
3. You reply with: `hitl approve A1B2C3` or `hitl deny A1B2C3`
|
|
28
|
+
4. Airlock's WebSocket listener picks up the reply and resolves the pending request.
|
|
29
|
+
|
|
30
|
+
## Session Key Format
|
|
31
|
+
|
|
32
|
+
- Default session: `"main"`
|
|
33
|
+
- Telegram channel: `"agent:main:telegram:channel:<chat_id>"`
|
|
34
|
+
- Discord channel: `"agent:main:discord:channel:<channel_id>"`
|
|
35
|
+
|
|
36
|
+
## Wire OpenClaw in `openclaw.json`
|
|
37
|
+
|
|
38
|
+
Ensure the agent that will receive HITL messages has access to the session.
|
|
39
|
+
In your openclaw config, the relevant agent should have the session key configured.
|
|
40
|
+
|
|
41
|
+
## Systemd Integration
|
|
42
|
+
|
|
43
|
+
If running both services on the same host, configure Airlock to start after OpenClaw:
|
|
44
|
+
|
|
45
|
+
```ini
|
|
46
|
+
# airlock.service
|
|
47
|
+
[Unit]
|
|
48
|
+
After=openclaw-gateway.service
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
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.1",
|
|
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
|
}
|