airlock-bot 0.2.36 → 0.2.38
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/README.md +34 -7
- package/dist/activity/stream.d.ts +29 -0
- package/dist/activity/stream.d.ts.map +1 -0
- package/dist/activity/stream.js +36 -0
- package/dist/activity/stream.js.map +1 -0
- package/dist/airlock/context.d.ts +12 -0
- package/dist/airlock/context.d.ts.map +1 -0
- package/dist/airlock/context.js +32 -0
- package/dist/airlock/context.js.map +1 -0
- package/dist/airlock/tools.d.ts +7 -0
- package/dist/airlock/tools.d.ts.map +1 -0
- package/dist/airlock/tools.js +13 -0
- package/dist/airlock/tools.js.map +1 -0
- package/dist/allowlist/engine.d.ts +12 -0
- package/dist/allowlist/engine.d.ts.map +1 -1
- package/dist/allowlist/engine.js +40 -15
- package/dist/allowlist/engine.js.map +1 -1
- package/dist/audit/api.d.ts +2 -0
- package/dist/audit/api.d.ts.map +1 -1
- package/dist/audit/api.js.map +1 -1
- package/dist/audit/db.d.ts +16 -0
- package/dist/audit/db.d.ts.map +1 -1
- package/dist/audit/db.js +73 -0
- package/dist/audit/db.js.map +1 -1
- package/dist/audit/logger.d.ts +8 -1
- package/dist/audit/logger.d.ts.map +1 -1
- package/dist/audit/logger.js +21 -0
- package/dist/audit/logger.js.map +1 -1
- package/dist/backend/airlock-adapter.d.ts +22 -0
- package/dist/backend/airlock-adapter.d.ts.map +1 -0
- package/dist/backend/airlock-adapter.js +136 -0
- package/dist/backend/airlock-adapter.js.map +1 -0
- package/dist/backend/factory.d.ts +5 -1
- package/dist/backend/factory.d.ts.map +1 -1
- package/dist/backend/factory.js +5 -5
- package/dist/backend/factory.js.map +1 -1
- package/dist/backend/mcp-adapter.d.ts.map +1 -1
- package/dist/backend/mcp-adapter.js +28 -4
- package/dist/backend/mcp-adapter.js.map +1 -1
- package/dist/backend/openapi/adapter.d.ts.map +1 -1
- package/dist/backend/openapi/adapter.js +33 -13
- package/dist/backend/openapi/adapter.js.map +1 -1
- package/dist/config/loader.d.ts +12 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +799 -23
- package/dist/config/loader.js.map +1 -1
- package/dist/config/profiles.d.ts +46 -8
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js +367 -23
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/schema.d.ts +3542 -174
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +292 -63
- package/dist/config/schema.js.map +1 -1
- package/dist/configure-web/cli.d.ts +13 -0
- package/dist/configure-web/cli.d.ts.map +1 -1
- package/dist/configure-web/cli.js +570 -80
- package/dist/configure-web/cli.js.map +1 -1
- package/dist/gateway.d.ts +16 -1
- package/dist/gateway.d.ts.map +1 -1
- package/dist/gateway.js +263 -57
- package/dist/gateway.js.map +1 -1
- package/dist/hitl/api.d.ts +2 -0
- package/dist/hitl/api.d.ts.map +1 -1
- package/dist/hitl/api.js +8 -0
- package/dist/hitl/api.js.map +1 -1
- package/dist/hitl/approval-dashboard.d.ts +5 -9
- package/dist/hitl/approval-dashboard.d.ts.map +1 -1
- package/dist/hitl/approval-dashboard.js +8 -55
- package/dist/hitl/approval-dashboard.js.map +1 -1
- package/dist/hitl/approval-stream.d.ts +34 -0
- package/dist/hitl/approval-stream.d.ts.map +1 -0
- package/dist/hitl/approval-stream.js +111 -0
- package/dist/hitl/approval-stream.js.map +1 -0
- package/dist/hitl/engine.d.ts +16 -7
- package/dist/hitl/engine.d.ts.map +1 -1
- package/dist/hitl/engine.js +109 -35
- package/dist/hitl/engine.js.map +1 -1
- package/dist/hitl/formatter.d.ts.map +1 -1
- package/dist/hitl/formatter.js +2 -0
- package/dist/hitl/formatter.js.map +1 -1
- package/dist/hitl/provider-factory.d.ts +8 -2
- package/dist/hitl/provider-factory.d.ts.map +1 -1
- package/dist/hitl/provider-factory.js +23 -2
- package/dist/hitl/provider-factory.js.map +1 -1
- package/dist/hitl/providers/composite.d.ts +9 -0
- package/dist/hitl/providers/composite.d.ts.map +1 -1
- package/dist/hitl/providers/composite.js +14 -0
- package/dist/hitl/providers/composite.js.map +1 -1
- package/dist/hitl/providers/dashboard.d.ts +12 -2
- package/dist/hitl/providers/dashboard.d.ts.map +1 -1
- package/dist/hitl/providers/dashboard.js +11 -5
- package/dist/hitl/providers/dashboard.js.map +1 -1
- package/dist/hitl/providers/ios.d.ts +23 -0
- package/dist/hitl/providers/ios.d.ts.map +1 -0
- package/dist/hitl/providers/ios.js +183 -0
- package/dist/hitl/providers/ios.js.map +1 -0
- package/dist/hitl/providers/macos.d.ts.map +1 -1
- package/dist/hitl/providers/macos.js +8 -4
- package/dist/hitl/providers/macos.js.map +1 -1
- package/dist/hitl/providers/openclaw.js +2 -2
- package/dist/hitl/providers/openclaw.js.map +1 -1
- package/dist/hitl/providers/stdio.js +2 -2
- package/dist/hitl/providers/stdio.js.map +1 -1
- package/dist/hitl/providers/telegram.js +2 -2
- package/dist/hitl/providers/telegram.js.map +1 -1
- package/dist/hitl/providers/tui.d.ts.map +1 -1
- package/dist/hitl/providers/tui.js +8 -2
- package/dist/hitl/providers/tui.js.map +1 -1
- package/dist/hitl/providers/types.d.ts +14 -0
- package/dist/hitl/providers/types.d.ts.map +1 -1
- package/dist/hook/api.d.ts +2 -0
- package/dist/hook/api.d.ts.map +1 -1
- package/dist/hook/api.js.map +1 -1
- package/dist/hook/normalizer.js +2 -2
- package/dist/hook/normalizer.js.map +1 -1
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/introspect/cli.d.ts +31 -0
- package/dist/introspect/cli.d.ts.map +1 -0
- package/dist/introspect/cli.js +756 -0
- package/dist/introspect/cli.js.map +1 -0
- package/dist/middleware/chain-builder.d.ts +1 -1
- package/dist/middleware/chain-builder.d.ts.map +1 -1
- package/dist/middleware/chain-builder.js +8 -4
- package/dist/middleware/chain-builder.js.map +1 -1
- package/dist/middleware/core/allowlist.d.ts.map +1 -1
- package/dist/middleware/core/allowlist.js +14 -0
- package/dist/middleware/core/allowlist.js.map +1 -1
- package/dist/middleware/core/arg-policy.d.ts +13 -0
- package/dist/middleware/core/arg-policy.d.ts.map +1 -0
- package/dist/middleware/core/arg-policy.js +201 -0
- package/dist/middleware/core/arg-policy.js.map +1 -0
- package/dist/middleware/core/exec-policy.d.ts.map +1 -1
- package/dist/middleware/core/exec-policy.js +16 -1
- package/dist/middleware/core/exec-policy.js.map +1 -1
- package/dist/middleware/core/execute.d.ts.map +1 -1
- package/dist/middleware/core/execute.js +6 -2
- package/dist/middleware/core/execute.js.map +1 -1
- package/dist/middleware/core/hitl-gate.d.ts.map +1 -1
- package/dist/middleware/core/hitl-gate.js +15 -4
- package/dist/middleware/core/hitl-gate.js.map +1 -1
- package/dist/middleware/core/schema-validator.d.ts.map +1 -1
- package/dist/middleware/core/schema-validator.js +7 -3
- package/dist/middleware/core/schema-validator.js.map +1 -1
- package/dist/middleware/post/canary-token-injector.d.ts +4 -1
- package/dist/middleware/post/canary-token-injector.d.ts.map +1 -1
- package/dist/middleware/post/canary-token-injector.js +5 -1
- package/dist/middleware/post/canary-token-injector.js.map +1 -1
- package/dist/middleware/post/untrusted-envelope.d.ts.map +1 -1
- package/dist/middleware/post/untrusted-envelope.js +7 -1
- package/dist/middleware/post/untrusted-envelope.js.map +1 -1
- package/dist/mobile/api.d.ts +20 -0
- package/dist/mobile/api.d.ts.map +1 -0
- package/dist/mobile/api.js +255 -0
- package/dist/mobile/api.js.map +1 -0
- package/dist/mobile/apns.d.ts +68 -0
- package/dist/mobile/apns.d.ts.map +1 -0
- package/dist/mobile/apns.js +321 -0
- package/dist/mobile/apns.js.map +1 -0
- package/dist/pool/http-client.d.ts +3 -1
- package/dist/pool/http-client.d.ts.map +1 -1
- package/dist/pool/http-client.js +5 -2
- package/dist/pool/http-client.js.map +1 -1
- package/dist/pool/oauth-provider.d.ts +2 -0
- package/dist/pool/oauth-provider.d.ts.map +1 -1
- package/dist/pool/oauth-provider.js +23 -4
- package/dist/pool/oauth-provider.js.map +1 -1
- package/dist/pool/pool.d.ts +2 -1
- package/dist/pool/pool.d.ts.map +1 -1
- package/dist/pool/pool.js +2 -2
- package/dist/pool/pool.js.map +1 -1
- package/dist/pool/sse-client.d.ts +3 -1
- package/dist/pool/sse-client.d.ts.map +1 -1
- package/dist/pool/sse-client.js +5 -2
- package/dist/pool/sse-client.js.map +1 -1
- package/dist/pool/stdio-client.d.ts +3 -1
- package/dist/pool/stdio-client.d.ts.map +1 -1
- package/dist/pool/stdio-client.js +5 -2
- package/dist/pool/stdio-client.js.map +1 -1
- package/dist/registry/airlock-policy.d.ts +3 -0
- package/dist/registry/airlock-policy.d.ts.map +1 -0
- package/dist/registry/airlock-policy.js +50 -0
- package/dist/registry/airlock-policy.js.map +1 -0
- package/dist/registry/registry.d.ts +2 -0
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +19 -13
- package/dist/registry/registry.js.map +1 -1
- package/dist/security/blocked-hosts.d.ts +2 -0
- package/dist/security/blocked-hosts.d.ts.map +1 -1
- package/dist/security/blocked-hosts.js +61 -7
- package/dist/security/blocked-hosts.js.map +1 -1
- package/dist/security/request.d.ts +2 -0
- package/dist/security/request.d.ts.map +1 -1
- package/dist/security/request.js +6 -2
- package/dist/security/request.js.map +1 -1
- package/dist/security/secrets.d.ts +12 -0
- package/dist/security/secrets.d.ts.map +1 -0
- package/dist/security/secrets.js +138 -0
- package/dist/security/secrets.js.map +1 -0
- package/dist/setup-openclaw/cli.js +1 -1
- package/dist/stdio-mode.d.ts.map +1 -1
- package/dist/stdio-mode.js +125 -24
- package/dist/stdio-mode.js.map +1 -1
- package/dist/tools/api.d.ts +4 -1
- package/dist/tools/api.d.ts.map +1 -1
- package/dist/tools/api.js +58 -7
- package/dist/tools/api.js.map +1 -1
- package/dist/tools/exec.d.ts +2 -1
- package/dist/tools/exec.d.ts.map +1 -1
- package/dist/tools/exec.js +4 -3
- package/dist/tools/exec.js.map +1 -1
- package/dist/tools/http.d.ts.map +1 -1
- package/dist/tools/http.js +4 -7
- package/dist/tools/http.js.map +1 -1
- package/dist/transport/agent-server.d.ts +4 -0
- package/dist/transport/agent-server.d.ts.map +1 -1
- package/dist/transport/agent-server.js +23 -11
- package/dist/transport/agent-server.js.map +1 -1
- package/dist/transport/http-server.d.ts +2 -0
- package/dist/transport/http-server.d.ts.map +1 -1
- package/dist/transport/http-server.js +10 -6
- package/dist/transport/http-server.js.map +1 -1
- package/dist/transport/sse-server.d.ts +2 -0
- package/dist/transport/sse-server.d.ts.map +1 -1
- package/dist/transport/sse-server.js +10 -6
- package/dist/transport/sse-server.js.map +1 -1
- package/dist/transport/stdio-server.d.ts.map +1 -1
- package/dist/transport/stdio-server.js +4 -0
- package/dist/transport/stdio-server.js.map +1 -1
- package/dist/util/id.d.ts +1 -1
- package/dist/util/id.d.ts.map +1 -1
- package/dist/util/id.js +3 -3
- package/dist/util/id.js.map +1 -1
- package/examples/claude-code-setup.md +0 -2
- package/examples/docker-compose.yaml +4 -3
- package/examples/docker-gateway.yaml +8 -3
- package/examples/gateway.yaml +8 -5
- package/examples/profiles.yaml +4 -4
- package/extensions/openclaw/index.ts +9 -6
- package/extensions/openclaw/openclaw.plugin.json +5 -5
- package/package.json +3 -1
- package/schema.json +658 -8
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
type McpRequestMeta = Record<string, unknown>;
|
|
2
3
|
export declare class SseMcpClient {
|
|
3
4
|
private id;
|
|
4
5
|
private url;
|
|
@@ -13,7 +14,7 @@ export declare class SseMcpClient {
|
|
|
13
14
|
onReady(cb: () => void): void;
|
|
14
15
|
connect(): Promise<void>;
|
|
15
16
|
listTools(): Promise<Tool[]>;
|
|
16
|
-
callTool(name: string, args: Record<string, unknown
|
|
17
|
+
callTool(name: string, args: Record<string, unknown>, requestMeta?: McpRequestMeta): Promise<unknown>;
|
|
17
18
|
getServerInfo(): {
|
|
18
19
|
name: string;
|
|
19
20
|
version: string;
|
|
@@ -22,4 +23,5 @@ export declare class SseMcpClient {
|
|
|
22
23
|
private notifyReady;
|
|
23
24
|
stop(): Promise<void>;
|
|
24
25
|
}
|
|
26
|
+
export {};
|
|
25
27
|
//# sourceMappingURL=sse-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-client.d.ts","sourceRoot":"","sources":["../../src/pool/sse-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"sse-client.d.ts","sourceRoot":"","sources":["../../src/pool/sse-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAM/D,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAI9C,qBAAa,YAAY;IASrB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO,CAAC;IAVlB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAyB;gBAGrC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA;IAG1C,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCxB,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAM5B,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,CAAC,EAAE,cAAc,GAC3B,OAAO,CAAC,OAAO,CAAC;IAQnB,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAI9D,OAAO,IAAI,OAAO;IAIlB,OAAO,CAAC,WAAW;IAMb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAI5B"}
|
package/dist/pool/sse-client.js
CHANGED
|
@@ -56,10 +56,13 @@ export class SseMcpClient {
|
|
|
56
56
|
const result = await this.client.listTools();
|
|
57
57
|
return result.tools;
|
|
58
58
|
}
|
|
59
|
-
async callTool(name, args) {
|
|
59
|
+
async callTool(name, args, requestMeta) {
|
|
60
60
|
if (!this.client || !this.ready)
|
|
61
61
|
throw new Error(`MCP ${this.id} not connected`);
|
|
62
|
-
|
|
62
|
+
const request = requestMeta
|
|
63
|
+
? { name, arguments: args, _meta: requestMeta }
|
|
64
|
+
: { name, arguments: args };
|
|
65
|
+
return this.client.callTool(request);
|
|
63
66
|
}
|
|
64
67
|
getServerInfo() {
|
|
65
68
|
return this.client?.getServerVersion();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../../src/pool/sse-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../../src/pool/sse-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
type McpRequestMeta = Record<string, unknown>;
|
|
2
3
|
export declare class StdioMcpClient {
|
|
3
4
|
private id;
|
|
4
5
|
private command;
|
|
@@ -15,7 +16,7 @@ export declare class StdioMcpClient {
|
|
|
15
16
|
onReady(cb: () => void): void;
|
|
16
17
|
connect(): Promise<void>;
|
|
17
18
|
listTools(): Promise<Tool[]>;
|
|
18
|
-
callTool(name: string, args: Record<string, unknown
|
|
19
|
+
callTool(name: string, args: Record<string, unknown>, requestMeta?: McpRequestMeta): Promise<unknown>;
|
|
19
20
|
getServerInfo(): {
|
|
20
21
|
name: string;
|
|
21
22
|
version: string;
|
|
@@ -28,4 +29,5 @@ export declare class StdioMcpClient {
|
|
|
28
29
|
/** Send SIGKILL to the child process if it's still alive. */
|
|
29
30
|
kill(): void;
|
|
30
31
|
}
|
|
32
|
+
export {};
|
|
31
33
|
//# sourceMappingURL=stdio-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio-client.d.ts","sourceRoot":"","sources":["../../src/pool/stdio-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"stdio-client.d.ts","sourceRoot":"","sources":["../../src/pool/stdio-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAM/D,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAc9C,qBAAa,cAAc;IASvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,GAAG,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC;IAZjB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAuB;IACzC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAyB;gBAGrC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA,EAC5B,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,YAAA;IAGhD,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CxB,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAM5B,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,CAAC,EAAE,cAAc,GAC3B,OAAO,CAAC,OAAO,CAAC;IAQnB,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAI9D,OAAO,IAAI,OAAO;IAIlB,OAAO,CAAC,WAAW;IAMnB,0DAA0D;IAC1D,gBAAgB,IAAI,IAAI;IAIlB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,6DAA6D;IAC7D,IAAI,IAAI,IAAI;CAUb"}
|
|
@@ -77,10 +77,13 @@ export class StdioMcpClient {
|
|
|
77
77
|
const result = await this.client.listTools();
|
|
78
78
|
return result.tools;
|
|
79
79
|
}
|
|
80
|
-
async callTool(name, args) {
|
|
80
|
+
async callTool(name, args, requestMeta) {
|
|
81
81
|
if (!this.client || !this.ready)
|
|
82
82
|
throw new Error(`MCP ${this.id} not connected`);
|
|
83
|
-
|
|
83
|
+
const request = requestMeta
|
|
84
|
+
? { name, arguments: args, _meta: requestMeta }
|
|
85
|
+
: { name, arguments: args };
|
|
86
|
+
return this.client.callTool(request);
|
|
84
87
|
}
|
|
85
88
|
getServerInfo() {
|
|
86
89
|
return this.client?.getServerVersion();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio-client.js","sourceRoot":"","sources":["../../src/pool/stdio-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,GAAG,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"stdio-client.js","sourceRoot":"","sources":["../../src/pool/stdio-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"airlock-policy.d.ts","sourceRoot":"","sources":["../../src/registry/airlock-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAM/D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAMrD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { AIRLOCK_CONTEXT_KEY } from '../airlock/context.js';
|
|
2
|
+
const ASK_POLICY_TEXT = 'This tool is proxied by Airlock, a human-in-the-loop gateway for MCP tools. Policy: ask. Calling it will notify the user and pause until approved or denied. Include _airlock.reason explaining why you are requesting this action now. If the action is risky, briefly name the relevant risk.';
|
|
3
|
+
export function addAskPolicyGuidance(tool) {
|
|
4
|
+
return {
|
|
5
|
+
...tool,
|
|
6
|
+
description: [tool.description, ASK_POLICY_TEXT].filter(Boolean).join('\n\n'),
|
|
7
|
+
inputSchema: addAirlockReasonSchema(tool.inputSchema),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function addAirlockReasonSchema(inputSchema) {
|
|
11
|
+
if (!inputSchema || typeof inputSchema !== 'object' || Array.isArray(inputSchema)) {
|
|
12
|
+
return inputSchema;
|
|
13
|
+
}
|
|
14
|
+
const schema = inputSchema;
|
|
15
|
+
const properties = schema.properties && typeof schema.properties === 'object' && !Array.isArray(schema.properties)
|
|
16
|
+
? schema.properties
|
|
17
|
+
: {};
|
|
18
|
+
const required = Array.isArray(schema.required)
|
|
19
|
+
? schema.required.filter((value) => typeof value === 'string')
|
|
20
|
+
: [];
|
|
21
|
+
return {
|
|
22
|
+
...schema,
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
...properties,
|
|
26
|
+
[AIRLOCK_CONTEXT_KEY]: {
|
|
27
|
+
type: 'object',
|
|
28
|
+
description: 'Airlock approval context shown to the user. Stripped before tool execution.',
|
|
29
|
+
properties: {
|
|
30
|
+
reason: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Why you are requesting this action now. Be concise and factual; include risk if relevant.',
|
|
33
|
+
maxLength: 500,
|
|
34
|
+
},
|
|
35
|
+
note: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Optional additional factual context for the user.',
|
|
38
|
+
maxLength: 500,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
required: ['reason'],
|
|
42
|
+
additionalProperties: false,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
required: required.includes(AIRLOCK_CONTEXT_KEY)
|
|
46
|
+
? required
|
|
47
|
+
: [...required, AIRLOCK_CONTEXT_KEY],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=airlock-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"airlock-policy.js","sourceRoot":"","sources":["../../src/registry/airlock-policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,eAAe,GACnB,iSAAiS,CAAC;AAEpS,MAAM,UAAU,oBAAoB,CAAC,IAAU;IAC7C,OAAO;QACL,GAAG,IAAI;QACP,WAAW,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7E,WAAW,EAAE,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAgC;IAC9D,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAClF,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,WAAsC,CAAC;IACtD,MAAM,UAAU,GACd,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7F,CAAC,CAAE,MAAM,CAAC,UAAsC;QAChD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC/E,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,GAAG,UAAU;YACb,CAAC,mBAAmB,CAAC,EAAE;gBACrB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6EAA6E;gBAC1F,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,2FAA2F;wBAC7F,SAAS,EAAE,GAAG;qBACf;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,mDAAmD;wBAChE,SAAS,EAAE,GAAG;qBACf;iBACF;gBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;gBACpB,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC9C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,mBAAmB,CAAC;KAChB,CAAC;AAC3B,CAAC"}
|
|
@@ -14,6 +14,8 @@ export declare class ToolRegistry {
|
|
|
14
14
|
getFiltered(agentId: string): Tool[];
|
|
15
15
|
call(namespacedName: string, args: Record<string, unknown>, agentId: string, meta?: Record<string, unknown>): Promise<unknown>;
|
|
16
16
|
getAllTools(): Tool[];
|
|
17
|
+
resolveToolName(namespacedName: string, agentId: string): string;
|
|
17
18
|
stopAll(): Promise<void>;
|
|
19
|
+
private applyAgentView;
|
|
18
20
|
}
|
|
19
21
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvD,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,WAAW,CAAc;gBAGvB,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;IAG7C,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI;IAIvD,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IAIvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE;IA8B9B,IAAI,CACR,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC;IAqBnB,WAAW,IAAI,IAAI,EAAE;IAIrB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAK1D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,cAAc;CAQvB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { sanitizeToolDescription } from './sanitizer.js';
|
|
2
|
+
import { addAskPolicyGuidance } from './airlock-policy.js';
|
|
2
3
|
import { childLogger } from '../util/logger.js';
|
|
3
4
|
const log = childLogger('registry');
|
|
4
5
|
export class ToolRegistry {
|
|
@@ -41,10 +42,7 @@ export class ToolRegistry {
|
|
|
41
42
|
const overrides = agent?.tool_overrides ?? {};
|
|
42
43
|
const filtered = this.cachedTools
|
|
43
44
|
.filter((t) => this.allowlist.evaluate(agentId, t.name) !== 'deny')
|
|
44
|
-
.map((t) => (
|
|
45
|
-
...t,
|
|
46
|
-
description: sanitizeToolDescription(t.name, t.description, overrides[t.name]?.description),
|
|
47
|
-
}));
|
|
45
|
+
.map((t) => this.applyAgentView(agentId, t, overrides[t.name]?.description));
|
|
48
46
|
// Add alias tools from tool_overrides that have alias_of
|
|
49
47
|
for (const [aliasName, override] of Object.entries(overrides)) {
|
|
50
48
|
if (!override.alias_of)
|
|
@@ -59,20 +57,14 @@ export class ToolRegistry {
|
|
|
59
57
|
if (this.allowlist.evaluate(agentId, aliasName) === 'deny')
|
|
60
58
|
continue;
|
|
61
59
|
filtered.push({
|
|
62
|
-
...baseTool,
|
|
63
|
-
name: aliasName,
|
|
64
|
-
description: sanitizeToolDescription(aliasName, baseTool.description, override.description),
|
|
60
|
+
...this.applyAgentView(agentId, { ...baseTool, name: aliasName }, override.description),
|
|
65
61
|
});
|
|
66
62
|
}
|
|
67
63
|
return filtered;
|
|
68
64
|
}
|
|
69
65
|
async call(namespacedName, args, agentId, meta) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const agent = this.agents[agentId];
|
|
73
|
-
const override = agent?.tool_overrides?.[namespacedName];
|
|
74
|
-
if (override?.alias_of) {
|
|
75
|
-
resolvedName = override.alias_of;
|
|
66
|
+
const resolvedName = this.resolveToolName(namespacedName, agentId);
|
|
67
|
+
if (resolvedName !== namespacedName) {
|
|
76
68
|
log.info({ alias: namespacedName, resolved: resolvedName }, 'Resolved tool alias');
|
|
77
69
|
}
|
|
78
70
|
// Find the adapter that owns this tool by matching its prefix
|
|
@@ -91,9 +83,21 @@ export class ToolRegistry {
|
|
|
91
83
|
getAllTools() {
|
|
92
84
|
return this.cachedTools;
|
|
93
85
|
}
|
|
86
|
+
resolveToolName(namespacedName, agentId) {
|
|
87
|
+
const agent = this.agents[agentId];
|
|
88
|
+
return agent?.tool_overrides?.[namespacedName]?.alias_of ?? namespacedName;
|
|
89
|
+
}
|
|
94
90
|
async stopAll() {
|
|
95
91
|
await Promise.allSettled(this.adapters.map((a) => a.stop()));
|
|
96
92
|
}
|
|
93
|
+
applyAgentView(agentId, tool, overrideDescription) {
|
|
94
|
+
const decision = this.allowlist.evaluate(agentId, tool.name);
|
|
95
|
+
const sanitized = {
|
|
96
|
+
...tool,
|
|
97
|
+
description: sanitizeToolDescription(tool.name, tool.description, overrideDescription),
|
|
98
|
+
};
|
|
99
|
+
return decision === 'ask' ? addAskPolicyGuidance(sanitized) : sanitized;
|
|
100
|
+
}
|
|
97
101
|
}
|
|
98
102
|
/** Map adapter ID conventions to the tool name prefix they own. */
|
|
99
103
|
function getAdapterPrefix(adapter) {
|
|
@@ -104,6 +108,8 @@ function getAdapterPrefix(adapter) {
|
|
|
104
108
|
return 'exec/';
|
|
105
109
|
if (id === 'builtin:http')
|
|
106
110
|
return 'http/';
|
|
111
|
+
if (id === 'builtin:airlock')
|
|
112
|
+
return 'airlock/';
|
|
107
113
|
if (id.startsWith('cli:'))
|
|
108
114
|
return id.slice(4) + '/';
|
|
109
115
|
if (id.startsWith('api:'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;AAEpC,MAAM,OAAO,YAAY;IAIb;IACA;IACA;IALF,WAAW,GAAW,EAAE,CAAC;IAEjC,YACU,QAA0B,EAC1B,SAA0B,EAC1B,MAAmC;QAFnC,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,cAAS,GAAT,SAAS,CAAiB;QAC1B,WAAM,GAAN,MAAM,CAA6B;IAC1C,CAAC;IAEJ,YAAY,CAAC,MAAmC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,WAAW,CAAC,QAA0B;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAW,EAAE,CAAC;QAEzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC/C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;oBAChC,KAAK,CAAC,IAAI,CAAC;wBACT,GAAG,IAAI;wBACP,WAAW,EAAE,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;qBAClE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,mCAAmC,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC/D,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,KAAK,EAAE,cAAc,IAAI,EAAE,CAAC;QAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;aAClE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,4 +3,6 @@
|
|
|
3
3
|
* Supports: exact match, *.prefix (subdomains), 10.* / 192.168.* / 172.16.* CIDR-like patterns.
|
|
4
4
|
*/
|
|
5
5
|
export declare function isBlockedHost(hostname: string, blockedList: string[], allowedLocal: string[]): boolean;
|
|
6
|
+
export declare function assertHostNotBlocked(hostname: string, blockedList: string[], allowedLocal: string[]): Promise<string>;
|
|
7
|
+
export declare function normalizeHostname(hostname: string): string;
|
|
6
8
|
//# sourceMappingURL=blocked-hosts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocked-hosts.d.ts","sourceRoot":"","sources":["../../src/security/blocked-hosts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blocked-hosts.d.ts","sourceRoot":"","sources":["../../src/security/blocked-hosts.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAOT;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU1D"}
|
|
@@ -1,26 +1,80 @@
|
|
|
1
|
+
import { lookup } from 'dns/promises';
|
|
2
|
+
import { isIP } from 'net';
|
|
1
3
|
/**
|
|
2
4
|
* Check if a hostname is blocked.
|
|
3
5
|
* Supports: exact match, *.prefix (subdomains), 10.* / 192.168.* / 172.16.* CIDR-like patterns.
|
|
4
6
|
*/
|
|
5
7
|
export function isBlockedHost(hostname, blockedList, allowedLocal) {
|
|
8
|
+
const normalizedHostname = normalizeHostname(hostname);
|
|
6
9
|
// If explicitly allowed, override block
|
|
7
|
-
if (allowedLocal.some((p) => hostPatternMatches(p,
|
|
10
|
+
if (allowedLocal.some((p) => hostPatternMatches(p, normalizedHostname)))
|
|
8
11
|
return false;
|
|
9
|
-
return blockedList.some((p) => hostPatternMatches(p,
|
|
12
|
+
return blockedList.some((p) => hostPatternMatches(p, normalizedHostname));
|
|
13
|
+
}
|
|
14
|
+
export async function assertHostNotBlocked(hostname, blockedList, allowedLocal) {
|
|
15
|
+
const normalizedHostname = normalizeHostname(hostname);
|
|
16
|
+
if (isBlockedHost(normalizedHostname, blockedList, allowedLocal)) {
|
|
17
|
+
throw new Error(`Blocked host: ${normalizedHostname}`);
|
|
18
|
+
}
|
|
19
|
+
if (isIP(normalizedHostname) !== 0 || allowedLocal.some((p) => hostPatternMatches(p, normalizedHostname))) {
|
|
20
|
+
return normalizedHostname;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const addresses = await lookup(normalizedHostname, { all: true, verbatim: true });
|
|
24
|
+
for (const { address } of addresses) {
|
|
25
|
+
const normalizedAddress = normalizeHostname(address);
|
|
26
|
+
if (isBlockedHost(normalizedAddress, blockedList, allowedLocal)) {
|
|
27
|
+
throw new Error(`Blocked host: ${normalizedHostname} resolved to ${normalizedAddress}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (err instanceof Error && err.message.startsWith('Blocked host:'))
|
|
33
|
+
throw err;
|
|
34
|
+
throw new Error(`Could not verify host: ${normalizedHostname}`, { cause: err });
|
|
35
|
+
}
|
|
36
|
+
return normalizedHostname;
|
|
37
|
+
}
|
|
38
|
+
export function normalizeHostname(hostname) {
|
|
39
|
+
let normalized = hostname.trim().toLowerCase();
|
|
40
|
+
if (normalized.startsWith('[') && normalized.endsWith(']')) {
|
|
41
|
+
normalized = normalized.slice(1, -1);
|
|
42
|
+
}
|
|
43
|
+
if (normalized.endsWith('.')) {
|
|
44
|
+
normalized = normalized.slice(0, -1);
|
|
45
|
+
}
|
|
46
|
+
return normalizeIpv4MappedIpv6(normalized);
|
|
10
47
|
}
|
|
11
48
|
function hostPatternMatches(pattern, hostname) {
|
|
12
|
-
|
|
49
|
+
const normalizedPattern = normalizeHostname(pattern);
|
|
50
|
+
if (normalizedPattern === hostname)
|
|
13
51
|
return true;
|
|
14
52
|
// *.local style — matches subdomains only, not the apex
|
|
15
|
-
if (
|
|
16
|
-
const suffix =
|
|
53
|
+
if (normalizedPattern.startsWith('*.')) {
|
|
54
|
+
const suffix = normalizedPattern.slice(2);
|
|
17
55
|
return hostname.endsWith('.' + suffix);
|
|
18
56
|
}
|
|
19
57
|
// CIDR-like: 192.168.* , 10.* , 172.16.*
|
|
20
|
-
if (
|
|
21
|
-
const prefix =
|
|
58
|
+
if (normalizedPattern.endsWith('*')) {
|
|
59
|
+
const prefix = normalizedPattern.slice(0, -1);
|
|
22
60
|
return hostname.startsWith(prefix);
|
|
23
61
|
}
|
|
24
62
|
return false;
|
|
25
63
|
}
|
|
64
|
+
function normalizeIpv4MappedIpv6(hostname) {
|
|
65
|
+
if (!hostname.startsWith('::ffff:'))
|
|
66
|
+
return hostname;
|
|
67
|
+
const suffix = hostname.slice('::ffff:'.length);
|
|
68
|
+
if (/^\d{1,3}(?:\.\d{1,3}){3}$/.test(suffix))
|
|
69
|
+
return suffix;
|
|
70
|
+
const parts = suffix.split(':');
|
|
71
|
+
if (parts.length !== 2)
|
|
72
|
+
return hostname;
|
|
73
|
+
const high = Number.parseInt(parts[0], 16);
|
|
74
|
+
const low = Number.parseInt(parts[1], 16);
|
|
75
|
+
if (!Number.isInteger(high) || !Number.isInteger(low) || high < 0 || high > 0xffff || low < 0 || low > 0xffff) {
|
|
76
|
+
return hostname;
|
|
77
|
+
}
|
|
78
|
+
return `${(high >> 8) & 0xff}.${high & 0xff}.${(low >> 8) & 0xff}.${low & 0xff}`;
|
|
79
|
+
}
|
|
26
80
|
//# sourceMappingURL=blocked-hosts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocked-hosts.js","sourceRoot":"","sources":["../../src/security/blocked-hosts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,WAAqB,EACrB,YAAsB;IAEtB,wCAAwC;IACxC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"blocked-hosts.js","sourceRoot":"","sources":["../../src/security/blocked-hosts.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ export interface RequestSecurityOptions {
|
|
|
3
3
|
secret?: string;
|
|
4
4
|
authRequired?: boolean;
|
|
5
5
|
allowedOrigins?: string[];
|
|
6
|
+
getRequestSecurity?: () => RequestSecurityOptions;
|
|
6
7
|
}
|
|
8
|
+
export declare function currentRequestSecurity(opts: RequestSecurityOptions): RequestSecurityOptions;
|
|
7
9
|
export declare function isOriginAllowed(origin: string | undefined, allowedOrigins?: string[]): boolean;
|
|
8
10
|
export declare function checkOrigin(request: FastifyRequest, reply: FastifyReply, allowedOrigins?: string[]): boolean;
|
|
9
11
|
export declare function checkBearerAuth(request: FastifyRequest, reply: FastifyReply, opts: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/security/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/security/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,sBAAsB,CAAC;CACnD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,CAE3F;AAiBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,GAAE,MAAM,EAAO,GAAG,OAAO,CAIlG;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,cAAc,GAAE,MAAM,EAAO,GAC5B,OAAO,CAMT;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,OAAO,CAaT;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAIT"}
|
package/dist/security/request.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { timingSafeEqual } from 'crypto';
|
|
2
|
+
export function currentRequestSecurity(opts) {
|
|
3
|
+
return opts.getRequestSecurity?.() ?? opts;
|
|
4
|
+
}
|
|
2
5
|
function constantTimeEqual(a, b) {
|
|
3
6
|
const bufA = Buffer.from(a);
|
|
4
7
|
const bufB = Buffer.from(b);
|
|
@@ -40,8 +43,9 @@ export function checkBearerAuth(request, reply, opts) {
|
|
|
40
43
|
return true;
|
|
41
44
|
}
|
|
42
45
|
export function checkRequestSecurity(request, reply, opts) {
|
|
43
|
-
|
|
46
|
+
const current = currentRequestSecurity(opts);
|
|
47
|
+
if (!checkOrigin(request, reply, current.allowedOrigins))
|
|
44
48
|
return false;
|
|
45
|
-
return checkBearerAuth(request, reply,
|
|
49
|
+
return checkBearerAuth(request, reply, current);
|
|
46
50
|
}
|
|
47
51
|
//# sourceMappingURL=request.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/security/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/security/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface SecretFinding {
|
|
2
|
+
file: string;
|
|
3
|
+
line: number;
|
|
4
|
+
column: number;
|
|
5
|
+
ruleId: string;
|
|
6
|
+
description: string;
|
|
7
|
+
redactedLine: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function scanSecrets(file: string, text: string): SecretFinding[];
|
|
10
|
+
export declare function redactSecret(secret: string): string;
|
|
11
|
+
export declare function formatSecretFindings(findings: SecretFinding[]): string;
|
|
12
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/security/secrets.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AA+DD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CA0CvE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAiBtE"}
|