@provos/ironcurtain 0.3.0 → 0.4.0
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 +0 -1
- package/README.md +20 -1
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.d.ts +1 -0
- package/dist/config/config-command.js +138 -34
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/constitution-user-base.md +2 -0
- package/dist/config/first-start.js +31 -3
- package/dist/config/first-start.js.map +1 -1
- package/dist/config/generated/compiled-policy.json +158 -64
- package/dist/config/generated/test-scenarios.json +144 -293
- package/dist/config/generated/tool-annotations.json +17 -3
- package/dist/config/index.js +49 -17
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.js +9 -4
- package/dist/config/paths.js.map +1 -1
- package/dist/config/user-config.d.ts +47 -0
- package/dist/config/user-config.js +97 -4
- package/dist/config/user-config.js.map +1 -1
- package/dist/docker/adapters/claude-code.js +14 -3
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +2 -0
- package/dist/docker/audit-log-tailer.d.ts +4 -3
- package/dist/docker/audit-log-tailer.js +9 -7
- package/dist/docker/audit-log-tailer.js.map +1 -1
- package/dist/docker/docker-agent-session.d.ts +11 -0
- package/dist/docker/docker-agent-session.js +103 -22
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-manager.js +82 -15
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/managed-proxy.d.ts +7 -3
- package/dist/docker/managed-proxy.js +98 -8
- package/dist/docker/managed-proxy.js.map +1 -1
- package/dist/docker/mitm-proxy.d.ts +7 -4
- package/dist/docker/mitm-proxy.js +152 -62
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/orientation.d.ts +1 -1
- package/dist/docker/orientation.js +5 -2
- package/dist/docker/orientation.js.map +1 -1
- package/dist/docker/platform.d.ts +20 -0
- package/dist/docker/platform.js +24 -0
- package/dist/docker/platform.js.map +1 -0
- package/dist/docker/provider-config.d.ts +38 -2
- package/dist/docker/provider-config.js +61 -0
- package/dist/docker/provider-config.js.map +1 -1
- package/dist/docker/types.d.ts +48 -6
- package/dist/pipeline/compile.js +2 -2
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.js +5 -2
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/handwritten-scenarios.js +9 -10
- package/dist/pipeline/handwritten-scenarios.js.map +1 -1
- package/dist/pipeline/policy-verifier.d.ts +1 -1
- package/dist/pipeline/policy-verifier.js +7 -4
- package/dist/pipeline/policy-verifier.js.map +1 -1
- package/dist/pipeline/types.d.ts +7 -1
- package/dist/servers/fetch-server.d.ts +4 -3
- package/dist/servers/fetch-server.js +72 -10
- package/dist/servers/fetch-server.js.map +1 -1
- package/dist/servers/search-providers.d.ts +29 -0
- package/dist/servers/search-providers.js +156 -0
- package/dist/servers/search-providers.js.map +1 -0
- package/dist/session/index.js +16 -6
- package/dist/session/index.js.map +1 -1
- package/dist/signal/bot-command.d.ts +13 -0
- package/dist/signal/bot-command.js +54 -0
- package/dist/signal/bot-command.js.map +1 -0
- package/dist/signal/format.d.ts +31 -0
- package/dist/signal/format.js +101 -0
- package/dist/signal/format.js.map +1 -0
- package/dist/signal/index.d.ts +16 -0
- package/dist/signal/index.js +13 -0
- package/dist/signal/index.js.map +1 -0
- package/dist/signal/markdown-to-signal.d.ts +29 -0
- package/dist/signal/markdown-to-signal.js +154 -0
- package/dist/signal/markdown-to-signal.js.map +1 -0
- package/dist/signal/setup-signal.d.ts +48 -0
- package/dist/signal/setup-signal.js +443 -0
- package/dist/signal/setup-signal.js.map +1 -0
- package/dist/signal/signal-bot-daemon.d.ts +142 -0
- package/dist/signal/signal-bot-daemon.js +504 -0
- package/dist/signal/signal-bot-daemon.js.map +1 -0
- package/dist/signal/signal-config.d.ts +64 -0
- package/dist/signal/signal-config.js +53 -0
- package/dist/signal/signal-config.js.map +1 -0
- package/dist/signal/signal-container.d.ts +37 -0
- package/dist/signal/signal-container.js +112 -0
- package/dist/signal/signal-container.js.map +1 -0
- package/dist/signal/signal-transport.d.ts +34 -0
- package/dist/signal/signal-transport.js +70 -0
- package/dist/signal/signal-transport.js.map +1 -0
- package/dist/trusted-process/mcp-proxy-server.js +34 -3
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/path-utils.d.ts +5 -1
- package/dist/trusted-process/path-utils.js +47 -4
- package/dist/trusted-process/path-utils.js.map +1 -1
- package/dist/trusted-process/tcp-server-transport.d.ts +43 -0
- package/dist/trusted-process/tcp-server-transport.js +119 -0
- package/dist/trusted-process/tcp-server-transport.js.map +1 -0
- package/dist/types/argument-roles.js +20 -5
- package/dist/types/argument-roles.js.map +1 -1
- package/docker/Dockerfile.base.arm64 +23 -0
- package/package.json +6 -3
- package/src/config/constitution-user-base.md +2 -0
- package/src/config/generated/compiled-policy.json +158 -64
- package/src/config/generated/test-scenarios.json +144 -293
- package/src/config/generated/tool-annotations.json +17 -3
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TCP server transport for the MCP SDK.
|
|
3
|
+
*
|
|
4
|
+
* Listens on a configurable TCP host and port and bridges each
|
|
5
|
+
* connection to the MCP SDK's Transport interface. Uses the same
|
|
6
|
+
* newline-delimited JSON framing as StdioServerTransport.
|
|
7
|
+
*
|
|
8
|
+
* This is the TCP equivalent of UdsServerTransport, used on macOS
|
|
9
|
+
* where Docker Desktop's VirtioFS does not support Unix domain
|
|
10
|
+
* sockets in bind mounts. The caller controls the bind address:
|
|
11
|
+
* 127.0.0.1 for loopback-only or 0.0.0.0 for all interfaces.
|
|
12
|
+
*
|
|
13
|
+
* Only one concurrent client is expected (the agent in the container).
|
|
14
|
+
* If a new connection arrives while one is active, the old connection
|
|
15
|
+
* is closed.
|
|
16
|
+
*/
|
|
17
|
+
import { createServer } from 'node:net';
|
|
18
|
+
import { ReadBuffer, serializeMessage } from '@modelcontextprotocol/sdk/shared/stdio.js';
|
|
19
|
+
export class TcpServerTransport {
|
|
20
|
+
host;
|
|
21
|
+
requestedPort;
|
|
22
|
+
server = null;
|
|
23
|
+
activeSocket = null;
|
|
24
|
+
readBuffer = new ReadBuffer();
|
|
25
|
+
_port = null;
|
|
26
|
+
onclose;
|
|
27
|
+
onerror;
|
|
28
|
+
onmessage;
|
|
29
|
+
constructor(host, port) {
|
|
30
|
+
this.host = host;
|
|
31
|
+
this.requestedPort = port;
|
|
32
|
+
}
|
|
33
|
+
/** The actual port the server is listening on. Only valid after start(). */
|
|
34
|
+
get port() {
|
|
35
|
+
if (this._port === null) {
|
|
36
|
+
throw new Error('TcpServerTransport has not been started');
|
|
37
|
+
}
|
|
38
|
+
return this._port;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Starts listening on the TCP port.
|
|
42
|
+
* Resolves once the server is bound and ready for connections.
|
|
43
|
+
* Idempotent: subsequent calls are no-ops (the MCP SDK's
|
|
44
|
+
* server.connect() calls start() internally).
|
|
45
|
+
*/
|
|
46
|
+
async start() {
|
|
47
|
+
if (this.server)
|
|
48
|
+
return;
|
|
49
|
+
const server = createServer((socket) => this.handleConnection(socket));
|
|
50
|
+
this.server = server;
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
server.on('error', (err) => {
|
|
53
|
+
reject(err);
|
|
54
|
+
});
|
|
55
|
+
server.listen(this.requestedPort, this.host, () => {
|
|
56
|
+
const addr = server.address();
|
|
57
|
+
if (addr && typeof addr === 'object') {
|
|
58
|
+
this._port = addr.port;
|
|
59
|
+
}
|
|
60
|
+
resolve();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- options included for Transport interface compliance
|
|
65
|
+
async send(message, options) {
|
|
66
|
+
const socket = this.activeSocket;
|
|
67
|
+
if (!socket || socket.destroyed) {
|
|
68
|
+
throw new Error('No active TCP connection to send message to');
|
|
69
|
+
}
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
const data = serializeMessage(message);
|
|
72
|
+
socket.write(data, (err) => {
|
|
73
|
+
if (err)
|
|
74
|
+
reject(err);
|
|
75
|
+
else
|
|
76
|
+
resolve();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async close() {
|
|
81
|
+
this.activeSocket?.destroy();
|
|
82
|
+
this.activeSocket = null;
|
|
83
|
+
const server = this.server;
|
|
84
|
+
if (server) {
|
|
85
|
+
this.server = null;
|
|
86
|
+
await new Promise((resolve) => {
|
|
87
|
+
server.close(() => resolve());
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
this.onclose?.();
|
|
91
|
+
}
|
|
92
|
+
handleConnection(socket) {
|
|
93
|
+
// Close any existing connection -- only one client expected
|
|
94
|
+
if (this.activeSocket && !this.activeSocket.destroyed) {
|
|
95
|
+
this.activeSocket.destroy();
|
|
96
|
+
}
|
|
97
|
+
this.activeSocket = socket;
|
|
98
|
+
this.readBuffer = new ReadBuffer();
|
|
99
|
+
socket.on('data', (chunk) => {
|
|
100
|
+
this.readBuffer.append(chunk);
|
|
101
|
+
this.processReadBuffer();
|
|
102
|
+
});
|
|
103
|
+
socket.on('error', (err) => {
|
|
104
|
+
this.onerror?.(err);
|
|
105
|
+
});
|
|
106
|
+
socket.on('close', () => {
|
|
107
|
+
if (this.activeSocket === socket) {
|
|
108
|
+
this.activeSocket = null;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
processReadBuffer() {
|
|
113
|
+
let message;
|
|
114
|
+
while ((message = this.readBuffer.readMessage()) !== null) {
|
|
115
|
+
this.onmessage?.(message);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=tcp-server-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp-server-transport.js","sourceRoot":"","sources":["../../src/trusted-process/tcp-server-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,11 +44,26 @@ export function resolveRealPath(filePath) {
|
|
|
44
44
|
return realpathSync(absolute);
|
|
45
45
|
}
|
|
46
46
|
catch {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
// Walk up to find the deepest existing ancestor, resolve it, then reattach the tail.
|
|
48
|
+
// This handles cases like /tmp/nonexistent/file.txt on macOS where /tmp → /private/tmp
|
|
49
|
+
// but the intermediate directory doesn't exist yet.
|
|
50
|
+
let current = absolute;
|
|
51
|
+
const tail = [];
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- loop exits via return
|
|
53
|
+
while (true) {
|
|
54
|
+
const parent = dirname(current);
|
|
55
|
+
tail.unshift(basename(current));
|
|
56
|
+
if (parent === current) {
|
|
57
|
+
// Reached filesystem root without finding an existing path
|
|
58
|
+
return absolute;
|
|
59
|
+
}
|
|
60
|
+
current = parent;
|
|
61
|
+
try {
|
|
62
|
+
return join(realpathSync(current), ...tail);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Continue walking up
|
|
66
|
+
}
|
|
52
67
|
}
|
|
53
68
|
}
|
|
54
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argument-roles.js","sourceRoot":"","sources":["../../src/types/argument-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AA2CnF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACvC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"argument-roles.js","sourceRoot":"","sources":["../../src/types/argument-roles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
FROM node:22-bookworm
|
|
2
|
+
|
|
3
|
+
# Replicate the 'codespace' user (uid 1000) from the devcontainers/universal
|
|
4
|
+
# image so Dockerfile.claude-code works unchanged on both platforms.
|
|
5
|
+
# node:22-bookworm already has node:node at uid/gid 1000 — rename it.
|
|
6
|
+
RUN usermod -l codespace -d /home/codespace -m node && \
|
|
7
|
+
groupmod -n codespace node
|
|
8
|
+
|
|
9
|
+
USER root
|
|
10
|
+
RUN apt-get update && \
|
|
11
|
+
apt-get install -y --no-install-recommends git socat ca-certificates && \
|
|
12
|
+
rm -rf /var/lib/apt/lists/*
|
|
13
|
+
|
|
14
|
+
# IronCurtain CA (for MITM proxy trust)
|
|
15
|
+
# This file is copied into a temporary build context by ensureImage().
|
|
16
|
+
COPY ironcurtain-ca-cert.pem /usr/local/share/ca-certificates/ironcurtain-ca.crt
|
|
17
|
+
RUN update-ca-certificates
|
|
18
|
+
|
|
19
|
+
RUN mkdir -p /workspace /etc/ironcurtain /run/ironcurtain && \
|
|
20
|
+
chown codespace:codespace /workspace /etc/ironcurtain /run/ironcurtain
|
|
21
|
+
|
|
22
|
+
WORKDIR /workspace
|
|
23
|
+
USER codespace
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@provos/ironcurtain",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Secure agent runtime with trusted process mediation",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"model-context-protocol"
|
|
27
27
|
],
|
|
28
28
|
"engines": {
|
|
29
|
-
"node": ">=
|
|
29
|
+
"node": ">=22.0.0 <26"
|
|
30
30
|
},
|
|
31
31
|
"bin": {
|
|
32
32
|
"ironcurtain": "dist/cli.js"
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"annotate-tools": "tsx src/cli.ts annotate-tools",
|
|
51
51
|
"compile-policy": "tsx src/cli.ts compile-policy",
|
|
52
52
|
"customize-policy": "tsx src/cli.ts customize-policy",
|
|
53
|
+
"bot": "tsx src/cli.ts bot",
|
|
53
54
|
"config": "tsx src/cli.ts config",
|
|
54
55
|
"setup": "tsx src/cli.ts setup",
|
|
55
56
|
"prepublishOnly": "npm run build",
|
|
@@ -94,12 +95,14 @@
|
|
|
94
95
|
"@types/node-forge": "^1.3.14",
|
|
95
96
|
"@types/shell-quote": "^1.7.5",
|
|
96
97
|
"@types/turndown": "^5.0.6",
|
|
98
|
+
"@types/ws": "^8.18.1",
|
|
97
99
|
"eslint": "^10.0.1",
|
|
98
100
|
"eslint-config-prettier": "^10.1.8",
|
|
99
101
|
"prettier": "^3.8.1",
|
|
100
102
|
"tsx": "^4.19.0",
|
|
101
103
|
"typescript": "^5.7.0",
|
|
102
104
|
"typescript-eslint": "^8.56.0",
|
|
103
|
-
"vitest": "^4.0.18"
|
|
105
|
+
"vitest": "^4.0.18",
|
|
106
|
+
"ws": "^8.19.0"
|
|
104
107
|
}
|
|
105
108
|
}
|
|
@@ -7,3 +7,5 @@
|
|
|
7
7
|
- The agent is allowed to perform all local read and write git operations within the sandbox
|
|
8
8
|
- The agent must ask for human approval for all other git operations
|
|
9
9
|
- The agent may fetch web content from popular news sites.
|
|
10
|
+
- The agent may perform web searches to find information
|
|
11
|
+
- The agent may fetch web content from popular development sites.
|
|
@@ -1,76 +1,143 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-02-
|
|
3
|
-
"constitutionHash": "
|
|
4
|
-
"inputHash": "
|
|
2
|
+
"generatedAt": "2026-02-25T03:02:42.079Z",
|
|
3
|
+
"constitutionHash": "7e403dc318faee9df1b20a2fb4ae2d1a8007ca9c775a9616cc4037e5a702ae82",
|
|
4
|
+
"inputHash": "7d80f5f4ac73f845e1668fdefc297fbf3a9f2bd4bc465240193f805c7f511047",
|
|
5
5
|
"rules": [
|
|
6
6
|
{
|
|
7
|
-
"name": "allow-downloads-read
|
|
8
|
-
"description": "Allow reading
|
|
7
|
+
"name": "allow-downloads-read",
|
|
8
|
+
"description": "Allow reading files in the Downloads folder.",
|
|
9
|
+
"principle": "The agent is allowed to read, write and delete content in the Downloads folder.",
|
|
10
|
+
"if": {
|
|
11
|
+
"paths": {
|
|
12
|
+
"roles": [
|
|
13
|
+
"read-path"
|
|
14
|
+
],
|
|
15
|
+
"within": "/mnt/c/Users/provo/Downloads"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"then": "allow",
|
|
19
|
+
"reason": "Policy explicitly permits reading in the Downloads folder."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "allow-downloads-write",
|
|
23
|
+
"description": "Allow writing files in the Downloads folder.",
|
|
24
|
+
"principle": "The agent is allowed to read, write and delete content in the Downloads folder.",
|
|
25
|
+
"if": {
|
|
26
|
+
"paths": {
|
|
27
|
+
"roles": [
|
|
28
|
+
"write-path"
|
|
29
|
+
],
|
|
30
|
+
"within": "/mnt/c/Users/provo/Downloads"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"then": "allow",
|
|
34
|
+
"reason": "Policy explicitly permits writing in the Downloads folder."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "allow-downloads-delete",
|
|
38
|
+
"description": "Allow deleting files in the Downloads folder.",
|
|
9
39
|
"principle": "The agent is allowed to read, write and delete content in the Downloads folder.",
|
|
10
40
|
"if": {
|
|
11
41
|
"paths": {
|
|
12
42
|
"roles": [
|
|
13
|
-
"read-path",
|
|
14
|
-
"write-path",
|
|
15
43
|
"delete-path"
|
|
16
44
|
],
|
|
17
|
-
"within": "
|
|
45
|
+
"within": "/mnt/c/Users/provo/Downloads"
|
|
18
46
|
}
|
|
19
47
|
},
|
|
20
48
|
"then": "allow",
|
|
21
|
-
"reason": "
|
|
49
|
+
"reason": "Policy explicitly permits deletion in the Downloads folder."
|
|
22
50
|
},
|
|
23
51
|
{
|
|
24
52
|
"name": "allow-documents-read",
|
|
25
|
-
"description": "Allow reading documents in the
|
|
53
|
+
"description": "Allow reading documents in the user's Documents folder.",
|
|
26
54
|
"principle": "The agent is allowed to read documents in the Users document folder.",
|
|
27
55
|
"if": {
|
|
28
56
|
"paths": {
|
|
29
57
|
"roles": [
|
|
30
58
|
"read-path"
|
|
31
59
|
],
|
|
32
|
-
"within": "
|
|
60
|
+
"within": "/home/provos/Documents"
|
|
33
61
|
}
|
|
34
62
|
},
|
|
35
63
|
"then": "allow",
|
|
36
|
-
"reason": "
|
|
64
|
+
"reason": "Policy explicitly permits reading in the user Documents folder."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "escalate-documents-write",
|
|
68
|
+
"description": "Escalate write operations to the user's Documents folder for human approval.",
|
|
69
|
+
"principle": "Human oversight: Operations outside the sandbox require explicit human approval.",
|
|
70
|
+
"if": {
|
|
71
|
+
"paths": {
|
|
72
|
+
"roles": [
|
|
73
|
+
"write-path"
|
|
74
|
+
],
|
|
75
|
+
"within": "/home/provos/Documents"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"then": "escalate",
|
|
79
|
+
"reason": "Writes to the Documents folder are not explicitly permitted and require human approval."
|
|
37
80
|
},
|
|
38
81
|
{
|
|
39
|
-
"name": "allow-git-
|
|
40
|
-
"description": "Allow read-only git operations
|
|
41
|
-
"principle": "The agent
|
|
82
|
+
"name": "allow-git-local-read-ops",
|
|
83
|
+
"description": "Allow local read-only git operations (status, log, diff, etc.).",
|
|
84
|
+
"principle": "The agent is allowed to perform all local read and write git operations within the sandbox.",
|
|
42
85
|
"if": {
|
|
86
|
+
"server": [
|
|
87
|
+
"git"
|
|
88
|
+
],
|
|
43
89
|
"tool": [
|
|
44
90
|
"git_status",
|
|
45
|
-
"git_diff",
|
|
46
91
|
"git_log",
|
|
92
|
+
"git_diff",
|
|
47
93
|
"git_show",
|
|
48
94
|
"git_blame",
|
|
49
95
|
"git_reflog",
|
|
50
|
-
"git_changelog_analyze"
|
|
96
|
+
"git_changelog_analyze",
|
|
97
|
+
"git_wrapup_instructions",
|
|
98
|
+
"git_clear_working_dir"
|
|
51
99
|
]
|
|
52
100
|
},
|
|
53
101
|
"then": "allow",
|
|
54
|
-
"reason": "
|
|
102
|
+
"reason": "Read-only git operations are permitted as local operations."
|
|
55
103
|
},
|
|
56
104
|
{
|
|
57
|
-
"name": "allow-git-
|
|
58
|
-
"description": "Allow git
|
|
59
|
-
"principle": "The agent
|
|
105
|
+
"name": "allow-git-local-write-ops",
|
|
106
|
+
"description": "Allow local git write operations (add, commit, branch, checkout, merge, rebase, stash, tag, init, worktree, set_working_dir, cherry_pick, reset, clean).",
|
|
107
|
+
"principle": "The agent is allowed to perform all local read and write git operations within the sandbox.",
|
|
60
108
|
"if": {
|
|
109
|
+
"server": [
|
|
110
|
+
"git"
|
|
111
|
+
],
|
|
61
112
|
"tool": [
|
|
62
113
|
"git_add",
|
|
63
|
-
"git_commit"
|
|
114
|
+
"git_commit",
|
|
115
|
+
"git_branch",
|
|
116
|
+
"git_checkout",
|
|
117
|
+
"git_merge",
|
|
118
|
+
"git_rebase",
|
|
119
|
+
"git_stash",
|
|
120
|
+
"git_tag",
|
|
121
|
+
"git_init",
|
|
122
|
+
"git_worktree",
|
|
123
|
+
"git_set_working_dir",
|
|
124
|
+
"git_cherry_pick",
|
|
125
|
+
"git_reset",
|
|
126
|
+
"git_clean",
|
|
127
|
+
"git_remote"
|
|
64
128
|
]
|
|
65
129
|
},
|
|
66
130
|
"then": "allow",
|
|
67
|
-
"reason": "
|
|
131
|
+
"reason": "Local git write operations are explicitly permitted by policy."
|
|
68
132
|
},
|
|
69
133
|
{
|
|
70
|
-
"name": "escalate-git-remote-
|
|
71
|
-
"description": "
|
|
72
|
-
"principle": "The agent must
|
|
134
|
+
"name": "escalate-git-remote-ops",
|
|
135
|
+
"description": "Escalate git remote operations (push, pull, fetch, clone) for human approval.",
|
|
136
|
+
"principle": "The agent must ask for human approval for all other git operations.",
|
|
73
137
|
"if": {
|
|
138
|
+
"server": [
|
|
139
|
+
"git"
|
|
140
|
+
],
|
|
74
141
|
"tool": [
|
|
75
142
|
"git_push",
|
|
76
143
|
"git_pull",
|
|
@@ -79,87 +146,107 @@
|
|
|
79
146
|
]
|
|
80
147
|
},
|
|
81
148
|
"then": "escalate",
|
|
82
|
-
"reason": "
|
|
149
|
+
"reason": "Remote git operations require explicit human approval per policy."
|
|
83
150
|
},
|
|
84
151
|
{
|
|
85
|
-
"name": "
|
|
86
|
-
"description": "
|
|
87
|
-
"principle": "The agent
|
|
152
|
+
"name": "allow-web-search",
|
|
153
|
+
"description": "Allow web searches.",
|
|
154
|
+
"principle": "The agent may perform web searches to find information.",
|
|
88
155
|
"if": {
|
|
89
156
|
"tool": [
|
|
90
|
-
"
|
|
91
|
-
"git_rebase",
|
|
92
|
-
"git_merge",
|
|
93
|
-
"git_cherry_pick"
|
|
157
|
+
"web_search"
|
|
94
158
|
]
|
|
95
159
|
},
|
|
96
|
-
"then": "
|
|
97
|
-
"reason": "
|
|
160
|
+
"then": "allow",
|
|
161
|
+
"reason": "Policy explicitly permits web searches."
|
|
98
162
|
},
|
|
99
163
|
{
|
|
100
|
-
"name": "
|
|
101
|
-
"description": "
|
|
102
|
-
"principle": "The agent
|
|
164
|
+
"name": "allow-fetch-news-sites",
|
|
165
|
+
"description": "Allow fetching content from popular news sites.",
|
|
166
|
+
"principle": "The agent may fetch web content from popular news sites.",
|
|
103
167
|
"if": {
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
]
|
|
168
|
+
"tool": [
|
|
169
|
+
"http_fetch"
|
|
170
|
+
],
|
|
171
|
+
"domains": {
|
|
172
|
+
"roles": [
|
|
173
|
+
"fetch-url"
|
|
174
|
+
],
|
|
175
|
+
"allowed": [
|
|
176
|
+
"@popular-news-sites"
|
|
177
|
+
]
|
|
178
|
+
}
|
|
107
179
|
},
|
|
108
|
-
"then": "
|
|
109
|
-
"reason": "
|
|
180
|
+
"then": "allow",
|
|
181
|
+
"reason": "Policy explicitly permits fetching from popular news sites."
|
|
110
182
|
},
|
|
111
183
|
{
|
|
112
|
-
"name": "allow-fetch-
|
|
113
|
-
"description": "Allow fetching
|
|
114
|
-
"principle": "The agent may fetch web content from popular
|
|
184
|
+
"name": "allow-fetch-development-sites",
|
|
185
|
+
"description": "Allow fetching content from popular development sites.",
|
|
186
|
+
"principle": "The agent may fetch web content from popular development sites.",
|
|
115
187
|
"if": {
|
|
188
|
+
"tool": [
|
|
189
|
+
"http_fetch"
|
|
190
|
+
],
|
|
116
191
|
"domains": {
|
|
117
192
|
"roles": [
|
|
118
193
|
"fetch-url"
|
|
119
194
|
],
|
|
120
195
|
"allowed": [
|
|
121
|
-
"@popular-
|
|
196
|
+
"@popular-development-sites"
|
|
122
197
|
]
|
|
123
198
|
}
|
|
124
199
|
},
|
|
125
200
|
"then": "allow",
|
|
126
|
-
"reason": "
|
|
201
|
+
"reason": "Policy explicitly permits fetching from popular development sites."
|
|
127
202
|
},
|
|
128
203
|
{
|
|
129
|
-
"name": "escalate-
|
|
130
|
-
"description": "Escalate
|
|
131
|
-
"principle": "Human oversight:
|
|
204
|
+
"name": "escalate-other-fetch",
|
|
205
|
+
"description": "Escalate HTTP fetch requests to domains not explicitly permitted.",
|
|
206
|
+
"principle": "Human oversight: Operations outside the sandbox require explicit human approval.",
|
|
207
|
+
"if": {
|
|
208
|
+
"tool": [
|
|
209
|
+
"http_fetch"
|
|
210
|
+
]
|
|
211
|
+
},
|
|
212
|
+
"then": "escalate",
|
|
213
|
+
"reason": "Fetching from domains not explicitly allowed requires human approval."
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"name": "escalate-move-with-delete-outside-permitted",
|
|
217
|
+
"description": "Escalate move operations where the source is outside permitted areas.",
|
|
218
|
+
"principle": "No destruction: Delete operations outside the sandbox are never permitted, unless an explicit exception is granted by the user guidance.",
|
|
132
219
|
"if": {
|
|
133
220
|
"roles": [
|
|
134
|
-
"
|
|
221
|
+
"delete-path"
|
|
135
222
|
]
|
|
136
223
|
},
|
|
137
224
|
"then": "escalate",
|
|
138
|
-
"reason": "
|
|
225
|
+
"reason": "Move/delete operations with sources outside sandbox or explicitly permitted directories require human approval."
|
|
139
226
|
},
|
|
140
227
|
{
|
|
141
228
|
"name": "escalate-write-outside-permitted",
|
|
142
|
-
"description": "Escalate write operations
|
|
143
|
-
"principle": "Human oversight:
|
|
229
|
+
"description": "Escalate write operations to areas not explicitly permitted.",
|
|
230
|
+
"principle": "Human oversight: Operations outside the sandbox require explicit human approval.",
|
|
144
231
|
"if": {
|
|
145
232
|
"roles": [
|
|
146
233
|
"write-path"
|
|
147
234
|
]
|
|
148
235
|
},
|
|
149
236
|
"then": "escalate",
|
|
150
|
-
"reason": "
|
|
237
|
+
"reason": "Writes to areas not explicitly permitted require human approval."
|
|
151
238
|
},
|
|
152
239
|
{
|
|
153
|
-
"name": "escalate-
|
|
154
|
-
"description": "Escalate
|
|
155
|
-
"principle": "Human oversight:
|
|
240
|
+
"name": "escalate-write-history-outside-sandbox",
|
|
241
|
+
"description": "Escalate git history-modifying operations outside the sandbox.",
|
|
242
|
+
"principle": "Human oversight: Operations outside the sandbox require explicit human approval.",
|
|
156
243
|
"if": {
|
|
157
|
-
"
|
|
158
|
-
"
|
|
244
|
+
"roles": [
|
|
245
|
+
"write-history"
|
|
159
246
|
]
|
|
160
247
|
},
|
|
161
248
|
"then": "escalate",
|
|
162
|
-
"reason": "Git operations
|
|
249
|
+
"reason": "Git operations that modify history outside the sandbox require human approval."
|
|
163
250
|
}
|
|
164
251
|
],
|
|
165
252
|
"listDefinitions": [
|
|
@@ -167,7 +254,14 @@
|
|
|
167
254
|
"name": "popular-news-sites",
|
|
168
255
|
"type": "domains",
|
|
169
256
|
"principle": "The agent may fetch web content from popular news sites.",
|
|
170
|
-
"generationPrompt": "List the domains of approximately
|
|
257
|
+
"generationPrompt": "List the domains of approximately 30 popular and well-known news websites from around the world, including major national and international outlets such as newspapers, broadcasters, and digital news publications.",
|
|
258
|
+
"requiresMcp": false
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"name": "popular-development-sites",
|
|
262
|
+
"type": "domains",
|
|
263
|
+
"principle": "The agent may fetch web content from popular development sites.",
|
|
264
|
+
"generationPrompt": "List the domains of approximately 30 popular software development websites and resources, including code hosting platforms, developer documentation sites, package registries, programming Q&A sites, and developer blogs.",
|
|
171
265
|
"requiresMcp": false
|
|
172
266
|
}
|
|
173
267
|
]
|