sentinel-agentos 0.1.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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +636 -0
  3. package/dist/api.d.ts +151 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +179 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/cli.d.ts +14 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +182 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/core.d.ts +139 -0
  12. package/dist/core.d.ts.map +1 -0
  13. package/dist/core.js +247 -0
  14. package/dist/core.js.map +1 -0
  15. package/dist/evaluator/exec-evaluator.d.ts +102 -0
  16. package/dist/evaluator/exec-evaluator.d.ts.map +1 -0
  17. package/dist/evaluator/exec-evaluator.js +266 -0
  18. package/dist/evaluator/exec-evaluator.js.map +1 -0
  19. package/dist/evaluator/feedback.d.ts +66 -0
  20. package/dist/evaluator/feedback.d.ts.map +1 -0
  21. package/dist/evaluator/feedback.js +195 -0
  22. package/dist/evaluator/feedback.js.map +1 -0
  23. package/dist/evaluator/profiler.d.ts +53 -0
  24. package/dist/evaluator/profiler.d.ts.map +1 -0
  25. package/dist/evaluator/profiler.js +108 -0
  26. package/dist/evaluator/profiler.js.map +1 -0
  27. package/dist/guard/audit-log.d.ts +75 -0
  28. package/dist/guard/audit-log.d.ts.map +1 -0
  29. package/dist/guard/audit-log.js +207 -0
  30. package/dist/guard/audit-log.js.map +1 -0
  31. package/dist/guard/risk-gate.d.ts +97 -0
  32. package/dist/guard/risk-gate.d.ts.map +1 -0
  33. package/dist/guard/risk-gate.js +160 -0
  34. package/dist/guard/risk-gate.js.map +1 -0
  35. package/dist/guard/sandbox.d.ts +112 -0
  36. package/dist/guard/sandbox.d.ts.map +1 -0
  37. package/dist/guard/sandbox.js +379 -0
  38. package/dist/guard/sandbox.js.map +1 -0
  39. package/dist/guard/schema-gate.d.ts +90 -0
  40. package/dist/guard/schema-gate.d.ts.map +1 -0
  41. package/dist/guard/schema-gate.js +452 -0
  42. package/dist/guard/schema-gate.js.map +1 -0
  43. package/dist/guard/snapshot-verify.d.ts +111 -0
  44. package/dist/guard/snapshot-verify.d.ts.map +1 -0
  45. package/dist/guard/snapshot-verify.js +578 -0
  46. package/dist/guard/snapshot-verify.js.map +1 -0
  47. package/dist/index.d.ts +28 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +59 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/memory/episodic.d.ts +76 -0
  52. package/dist/memory/episodic.d.ts.map +1 -0
  53. package/dist/memory/episodic.js +289 -0
  54. package/dist/memory/episodic.js.map +1 -0
  55. package/dist/memory/semantic.d.ts +69 -0
  56. package/dist/memory/semantic.d.ts.map +1 -0
  57. package/dist/memory/semantic.js +243 -0
  58. package/dist/memory/semantic.js.map +1 -0
  59. package/dist/memory/working.d.ts +53 -0
  60. package/dist/memory/working.d.ts.map +1 -0
  61. package/dist/memory/working.js +150 -0
  62. package/dist/memory/working.js.map +1 -0
  63. package/dist/middleware/openclaw.d.ts +45 -0
  64. package/dist/middleware/openclaw.d.ts.map +1 -0
  65. package/dist/middleware/openclaw.js +95 -0
  66. package/dist/middleware/openclaw.js.map +1 -0
  67. package/dist/middleware/wrapper.d.ts +54 -0
  68. package/dist/middleware/wrapper.d.ts.map +1 -0
  69. package/dist/middleware/wrapper.js +155 -0
  70. package/dist/middleware/wrapper.js.map +1 -0
  71. package/dist/server.d.ts +45 -0
  72. package/dist/server.d.ts.map +1 -0
  73. package/dist/server.js +229 -0
  74. package/dist/server.js.map +1 -0
  75. package/dist/types/index.d.ts +201 -0
  76. package/dist/types/index.d.ts.map +1 -0
  77. package/dist/types/index.js +4 -0
  78. package/dist/types/index.js.map +1 -0
  79. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-gate.js","sourceRoot":"","sources":["../../src/guard/risk-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Execution mode — from DESIGN.md §4.5
3
+ */
4
+ export type ExecutionMode = 'direct' | 'sandbox' | 'dry-run';
5
+ /**
6
+ * Network access policy for sandbox mode.
7
+ */
8
+ export type NetworkPolicy = 'none' | 'localhost' | 'whitelist';
9
+ /**
10
+ * Execution context configuration — full DESIGN.md §4.5 interface.
11
+ */
12
+ export interface ExecutionContext {
13
+ /** Execution mode */
14
+ mode: ExecutionMode;
15
+ /** Timeout in milliseconds */
16
+ timeoutMs: number;
17
+ /** Network policy (sandbox mode only) */
18
+ networkAccess?: NetworkPolicy;
19
+ /** Allowed network hosts (sandbox + whitelist mode only) */
20
+ networkWhitelist?: string[];
21
+ /** Writable paths (sandbox mode) */
22
+ writablePaths?: string[];
23
+ /** Read-only paths (sandbox mode) */
24
+ readonlyPaths?: string[];
25
+ /** Workspace root */
26
+ workspaceRoot: string;
27
+ /** Max output size before truncation */
28
+ maxOutputSize?: number;
29
+ /** Allowed tools in sandbox mode */
30
+ allowedTools?: string[];
31
+ /** Forbidden tools in any mode */
32
+ forbiddenTools?: string[];
33
+ }
34
+ /**
35
+ * Sandbox execution result.
36
+ */
37
+ export interface SandboxResult {
38
+ /** Execution outcome */
39
+ success: boolean;
40
+ /** Exit code (0 = success) */
41
+ exitCode: number;
42
+ /** stdout */
43
+ stdout: string;
44
+ /** stderr */
45
+ stderr: string;
46
+ /** Truncated flag */
47
+ truncated: boolean;
48
+ /** Error message if sandbox rejected */
49
+ sandboxRejectReason?: string;
50
+ /** Dry-run: what would have happened */
51
+ dryRunSummary?: string;
52
+ /** Execution time in ms */
53
+ durationMs: number;
54
+ }
55
+ /**
56
+ * Sandbox Violation types.
57
+ */
58
+ export declare enum SandboxViolation {
59
+ NETWORK_FORBIDDEN = "NETWORK_FORBIDDEN",
60
+ PATH_NOT_WRITABLE = "PATH_NOT_WRITABLE",
61
+ PATH_READONLY = "PATH_READONLY",
62
+ TOOL_FORBIDDEN = "TOOL_FORBIDDEN",
63
+ TOOL_NOT_ALLOWED = "TOOL_NOT_ALLOWED",
64
+ COMMAND_FORBIDDEN = "COMMAND_FORBIDDEN"
65
+ }
66
+ /**
67
+ * Sandbox Executor — controlled execution environment.
68
+ *
69
+ * Implements three execution modes from DESIGN.md §4.5:
70
+ * - direct: Execute in shared environment (default, no sandboxing)
71
+ * - sandbox: Restricted execution with network + filesystem policies
72
+ * - dry-run: Preview only, no actual execution
73
+ */
74
+ export declare class SandboxExecutor {
75
+ private config;
76
+ /** Forbidden shell commands (dangerous patterns) */
77
+ private static FORBIDDEN_COMMANDS;
78
+ constructor(config: ExecutionContext);
79
+ /**
80
+ * Validate and possibly reject a tool call before execution.
81
+ *
82
+ * @returns {SandboxResult} with sandboxRejectReason if rejected
83
+ */
84
+ validate(toolName: string, params: Record<string, unknown>): SandboxResult | null;
85
+ /**
86
+ * Execute a shell command in the configured mode.
87
+ */
88
+ execute(toolName: string, params: Record<string, unknown>): Promise<SandboxResult>;
89
+ /**
90
+ * Dry-run: return a summary of what would happen.
91
+ */
92
+ private dryRun;
93
+ /**
94
+ * Execute shell commands with sandbox policies.
95
+ */
96
+ private executeShell;
97
+ /**
98
+ * Build environment with sandbox network restrictions.
99
+ */
100
+ private buildSandboxEnv;
101
+ /**
102
+ * Validate a filesystem path against sandbox policies.
103
+ */
104
+ private validatePath;
105
+ /**
106
+ * Validate a shell command against forbidden patterns.
107
+ */
108
+ private validateCommand;
109
+ private isShellTool;
110
+ private isWriteTool;
111
+ }
112
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/guard/sandbox.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,gBAAgB;IAC1B,iBAAiB,sBAAsB;IACvC,iBAAiB,sBAAsB;IACvC,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;CACxC;AAED;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAmB;IAEjC,oDAAoD;IACpD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAU/B;gBAEU,MAAM,EAAE,gBAAgB;IAOpC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,GAAG,IAAI;IA6DjF;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA6BxF;;OAEG;IACH,OAAO,CAAC,MAAM;IAiCd;;OAEG;YACW,YAAY;IAyD1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB;;OAEG;IACH,OAAO,CAAC,YAAY;IA0DpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;CAQpB"}
@@ -0,0 +1,379 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SandboxExecutor = exports.SandboxViolation = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Sandbox Violation types.
41
+ */
42
+ var SandboxViolation;
43
+ (function (SandboxViolation) {
44
+ SandboxViolation["NETWORK_FORBIDDEN"] = "NETWORK_FORBIDDEN";
45
+ SandboxViolation["PATH_NOT_WRITABLE"] = "PATH_NOT_WRITABLE";
46
+ SandboxViolation["PATH_READONLY"] = "PATH_READONLY";
47
+ SandboxViolation["TOOL_FORBIDDEN"] = "TOOL_FORBIDDEN";
48
+ SandboxViolation["TOOL_NOT_ALLOWED"] = "TOOL_NOT_ALLOWED";
49
+ SandboxViolation["COMMAND_FORBIDDEN"] = "COMMAND_FORBIDDEN";
50
+ })(SandboxViolation || (exports.SandboxViolation = SandboxViolation = {}));
51
+ /**
52
+ * Sandbox Executor — controlled execution environment.
53
+ *
54
+ * Implements three execution modes from DESIGN.md §4.5:
55
+ * - direct: Execute in shared environment (default, no sandboxing)
56
+ * - sandbox: Restricted execution with network + filesystem policies
57
+ * - dry-run: Preview only, no actual execution
58
+ */
59
+ class SandboxExecutor {
60
+ config;
61
+ /** Forbidden shell commands (dangerous patterns) */
62
+ static FORBIDDEN_COMMANDS = [
63
+ /rm\s+-rf\s+\//,
64
+ /sudo\s/,
65
+ /chmod\s+777/,
66
+ />\s*\/dev\//,
67
+ /mkfs\./,
68
+ /dd\s+if=/,
69
+ /:()\s*\{\s*:/, // fork bomb
70
+ /curl.*\|\s*bash/,
71
+ /wget.*\|\s*sh/,
72
+ ];
73
+ constructor(config) {
74
+ this.config = {
75
+ maxOutputSize: 1024 * 1024, // 1MB default
76
+ ...config,
77
+ };
78
+ }
79
+ /**
80
+ * Validate and possibly reject a tool call before execution.
81
+ *
82
+ * @returns {SandboxResult} with sandboxRejectReason if rejected
83
+ */
84
+ validate(toolName, params) {
85
+ // Check forbidden tools
86
+ if (this.config.forbiddenTools) {
87
+ if (this.config.forbiddenTools.includes(toolName)) {
88
+ return {
89
+ success: false,
90
+ exitCode: 126,
91
+ stdout: '',
92
+ stderr: '',
93
+ truncated: false,
94
+ durationMs: 0,
95
+ sandboxRejectReason: `Tool "${toolName}" is forbidden by sandbox policy`,
96
+ };
97
+ }
98
+ }
99
+ // Check allowed tools (sandbox mode)
100
+ if (this.config.mode === 'sandbox' && this.config.allowedTools) {
101
+ if (!this.config.allowedTools.includes(toolName)) {
102
+ return {
103
+ success: false,
104
+ exitCode: 126,
105
+ stdout: '',
106
+ stderr: '',
107
+ truncated: false,
108
+ durationMs: 0,
109
+ sandboxRejectReason: `Tool "${toolName}" is not in the sandbox allowed-tools list`,
110
+ };
111
+ }
112
+ }
113
+ // Check filesystem writes
114
+ if (this.config.mode === 'sandbox') {
115
+ const pathParam = params['path'] || params['file'] || params['filePath'];
116
+ if (typeof pathParam === 'string') {
117
+ const fsCheck = this.validatePath(pathParam, this.isWriteTool(toolName));
118
+ if (fsCheck)
119
+ return fsCheck;
120
+ }
121
+ // Check multiple paths
122
+ const paths = params['paths'] || params['files'] || params['targets'];
123
+ if (Array.isArray(paths)) {
124
+ for (const p of paths) {
125
+ if (typeof p === 'string') {
126
+ const fsCheck = this.validatePath(p, this.isWriteTool(toolName));
127
+ if (fsCheck)
128
+ return fsCheck;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ // Check shell commands for dangerous patterns
134
+ if (toolName === 'exec' || toolName === 'shell' || toolName === 'command') {
135
+ const command = String(params['command'] || params['cmd'] || '');
136
+ const cmdCheck = this.validateCommand(command);
137
+ if (cmdCheck)
138
+ return cmdCheck;
139
+ }
140
+ return null; // All clear
141
+ }
142
+ /**
143
+ * Execute a shell command in the configured mode.
144
+ */
145
+ async execute(toolName, params) {
146
+ const startTime = Date.now();
147
+ // 1. Pre-flight validation
148
+ const rejection = this.validate(toolName, params);
149
+ if (rejection)
150
+ return rejection;
151
+ // 2. Dry-run mode
152
+ if (this.config.mode === 'dry-run') {
153
+ return this.dryRun(toolName, params);
154
+ }
155
+ // 3. Build command for exec-based tools
156
+ if (this.isShellTool(toolName)) {
157
+ return this.executeShell(params);
158
+ }
159
+ // 4. For non-shell tools: delegate (no sandbox exec here — that's the agent runtime's job)
160
+ // Sandbox mode only applies to shell commands at this level
161
+ return {
162
+ success: true,
163
+ exitCode: 0,
164
+ stdout: '',
165
+ stderr: '',
166
+ truncated: false,
167
+ durationMs: Date.now() - startTime,
168
+ };
169
+ }
170
+ /**
171
+ * Dry-run: return a summary of what would happen.
172
+ */
173
+ dryRun(toolName, params) {
174
+ const summaryParts = [];
175
+ if (this.isShellTool(toolName)) {
176
+ const command = String(params['command'] || '');
177
+ summaryParts.push(`Would execute: ${command}`);
178
+ }
179
+ else {
180
+ summaryParts.push(`Would call: ${toolName}(${JSON.stringify(params)})`);
181
+ }
182
+ // Check files that would be affected
183
+ const pathParam = params['path'] || params['file'] || params['filePath'];
184
+ if (typeof pathParam === 'string') {
185
+ const fullPath = path.resolve(this.config.workspaceRoot, pathParam);
186
+ if (fs.existsSync(fullPath)) {
187
+ const stat = fs.statSync(fullPath);
188
+ summaryParts.push(`File exists: ${pathParam} (${stat.size} bytes)`);
189
+ }
190
+ else {
191
+ summaryParts.push(`File would be created: ${pathParam}`);
192
+ }
193
+ }
194
+ return {
195
+ success: true,
196
+ exitCode: 0,
197
+ stdout: '',
198
+ stderr: '',
199
+ truncated: false,
200
+ durationMs: 0,
201
+ dryRunSummary: summaryParts.join('\n'),
202
+ };
203
+ }
204
+ /**
205
+ * Execute shell commands with sandbox policies.
206
+ */
207
+ async executeShell(params) {
208
+ const startTime = Date.now();
209
+ const command = String(params['command'] || '');
210
+ const cwd = String(params['cwd'] || this.config.workspaceRoot);
211
+ try {
212
+ const { execSync } = require('child_process');
213
+ // Apply network restrictions
214
+ const env = this.buildSandboxEnv();
215
+ let output;
216
+ try {
217
+ output = execSync(command, {
218
+ cwd,
219
+ encoding: 'utf-8',
220
+ env,
221
+ timeout: this.config.timeoutMs,
222
+ maxBuffer: this.config.maxOutputSize,
223
+ stdio: ['pipe', 'pipe', 'pipe'],
224
+ });
225
+ }
226
+ catch (execErr) {
227
+ return {
228
+ success: false,
229
+ exitCode: execErr.status ?? 1,
230
+ stdout: execErr.stdout?.slice(0, this.config.maxOutputSize) ?? '',
231
+ stderr: execErr.stderr?.slice(0, this.config.maxOutputSize) ?? '',
232
+ truncated: (execErr.stdout?.length ?? 0) > (this.config.maxOutputSize ?? 1024 * 1024),
233
+ durationMs: Date.now() - startTime,
234
+ };
235
+ }
236
+ const truncated = output.length > (this.config.maxOutputSize ?? 1024 * 1024);
237
+ const finalOutput = truncated
238
+ ? output.slice(0, this.config.maxOutputSize ?? 1024 * 1024)
239
+ : output;
240
+ return {
241
+ success: true,
242
+ exitCode: 0,
243
+ stdout: finalOutput,
244
+ stderr: '',
245
+ truncated,
246
+ durationMs: Date.now() - startTime,
247
+ };
248
+ }
249
+ catch (err) {
250
+ return {
251
+ success: false,
252
+ exitCode: 1,
253
+ stdout: '',
254
+ stderr: err.message ?? 'Unknown execution error',
255
+ truncated: false,
256
+ durationMs: Date.now() - startTime,
257
+ };
258
+ }
259
+ }
260
+ /**
261
+ * Build environment with sandbox network restrictions.
262
+ */
263
+ buildSandboxEnv() {
264
+ if (this.config.mode !== 'sandbox' || this.config.networkAccess === undefined) {
265
+ return undefined; // Use default env
266
+ }
267
+ const env = { ...process.env };
268
+ switch (this.config.networkAccess) {
269
+ case 'none':
270
+ env['http_proxy'] = 'http://0.0.0.0:0'; // Blackhole
271
+ env['https_proxy'] = 'http://0.0.0.0:0';
272
+ env['HTTP_PROXY'] = 'http://0.0.0.0:0';
273
+ env['HTTPS_PROXY'] = 'http://0.0.0.0:0';
274
+ env['NO_PROXY'] = '';
275
+ break;
276
+ case 'localhost':
277
+ env['http_proxy'] = 'http://0.0.0.0:0';
278
+ env['https_proxy'] = 'http://0.0.0.0:0';
279
+ env['HTTP_PROXY'] = 'http://0.0.0.0:0';
280
+ env['HTTPS_PROXY'] = 'http://0.0.0.0:0';
281
+ env['NO_PROXY'] = 'localhost,127.0.0.1,::1';
282
+ break;
283
+ case 'whitelist':
284
+ if (this.config.networkWhitelist) {
285
+ env['http_proxy'] = 'http://0.0.0.0:0';
286
+ env['https_proxy'] = 'http://0.0.0.0:0';
287
+ env['HTTP_PROXY'] = 'http://0.0.0.0:0';
288
+ env['HTTPS_PROXY'] = 'http://0.0.0.0:0';
289
+ env['NO_PROXY'] = this.config.networkWhitelist.join(',') + ',localhost,127.0.0.1';
290
+ }
291
+ break;
292
+ }
293
+ return env;
294
+ }
295
+ /**
296
+ * Validate a filesystem path against sandbox policies.
297
+ */
298
+ validatePath(filePath, isWrite) {
299
+ const resolvedPath = path.resolve(this.config.workspaceRoot, filePath);
300
+ const normalizedRoot = path.resolve(this.config.workspaceRoot);
301
+ // Check if path is within workspace
302
+ if (!resolvedPath.startsWith(normalizedRoot + path.sep) && resolvedPath !== normalizedRoot) {
303
+ return {
304
+ success: false,
305
+ exitCode: 126,
306
+ stdout: '',
307
+ stderr: '',
308
+ truncated: false,
309
+ durationMs: 0,
310
+ sandboxRejectReason: `Path "${filePath}" is outside workspace boundaries`,
311
+ };
312
+ }
313
+ if (isWrite) {
314
+ // Check writable paths
315
+ if (this.config.writablePaths && this.config.writablePaths.length > 0) {
316
+ const isWritable = this.config.writablePaths.some((wp) => resolvedPath.startsWith(path.resolve(this.config.workspaceRoot, wp)));
317
+ if (!isWritable) {
318
+ return {
319
+ success: false,
320
+ exitCode: 126,
321
+ stdout: '',
322
+ stderr: '',
323
+ truncated: false,
324
+ durationMs: 0,
325
+ sandboxRejectReason: `Path "${filePath}" is not in the sandbox writable paths list`,
326
+ };
327
+ }
328
+ }
329
+ // Check readonly paths
330
+ if (this.config.readonlyPaths) {
331
+ const isReadonly = this.config.readonlyPaths.some((rp) => resolvedPath.startsWith(path.resolve(this.config.workspaceRoot, rp)));
332
+ if (isReadonly) {
333
+ return {
334
+ success: false,
335
+ exitCode: 126,
336
+ stdout: '',
337
+ stderr: '',
338
+ truncated: false,
339
+ durationMs: 0,
340
+ sandboxRejectReason: `Path "${filePath}" is read-only in sandbox mode`,
341
+ };
342
+ }
343
+ }
344
+ }
345
+ return null;
346
+ }
347
+ /**
348
+ * Validate a shell command against forbidden patterns.
349
+ */
350
+ validateCommand(command) {
351
+ for (const pattern of SandboxExecutor.FORBIDDEN_COMMANDS) {
352
+ if (pattern.test(command)) {
353
+ return {
354
+ success: false,
355
+ exitCode: 126,
356
+ stdout: '',
357
+ stderr: '',
358
+ truncated: false,
359
+ durationMs: 0,
360
+ sandboxRejectReason: `Command matches forbidden pattern: "${pattern.source}"`,
361
+ };
362
+ }
363
+ }
364
+ return null;
365
+ }
366
+ isShellTool(toolName) {
367
+ return ['exec', 'shell', 'command', 'bash', 'sh', 'cmd'].includes(toolName);
368
+ }
369
+ isWriteTool(toolName) {
370
+ const writeTools = [
371
+ 'write_file', 'write', 'edit', 'edit_file', 'create_file',
372
+ 'mkdir', 'rm', 'unlink', 'delete_file', 'delete', 'mv', 'cp',
373
+ 'exec', 'shell', 'git_commit', 'git_push',
374
+ ];
375
+ return writeTools.some((t) => toolName.includes(t));
376
+ }
377
+ }
378
+ exports.SandboxExecutor = SandboxExecutor;
379
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/guard/sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { SchemaCheck } from '../types';
2
+ import type { GuardConfig } from '../types';
3
+ /**
4
+ * Extended schema rule — supports all x- extensions from DESIGN.md §4.2.
5
+ */
6
+ export interface SchemaRule {
7
+ /** Tool name to match */
8
+ tool: string;
9
+ /** Required parameter names */
10
+ required?: string[];
11
+ /** Parameter type constraints */
12
+ types?: Record<string, 'string' | 'number' | 'boolean' | 'object' | 'array'>;
13
+ /** Allowed values for specific parameters */
14
+ allowedValues?: Record<string, unknown[]>;
15
+ /** Min/max numeric constraints */
16
+ min?: Record<string, number>;
17
+ max?: Record<string, number>;
18
+ /** Regex patterns for string validation */
19
+ patterns?: Record<string, string>;
20
+ /** Custom validation functions */
21
+ custom?: Record<string, (value: unknown) => string | null>;
22
+ /** x- extensions: path scope constraint */
23
+ pathScope?: Record<string, 'workspace' | 'temp' | 'global'>;
24
+ /** x- extensions: allowed path glob patterns */
25
+ pathAllow?: Record<string, string[]>;
26
+ /** x- extensions: denied path glob patterns */
27
+ pathDeny?: Record<string, string[]>;
28
+ /** x- extensions: max parameter size in bytes */
29
+ maxSize?: Record<string, number>;
30
+ /** x- extensions: parameters marked as secret (redacted in logs) */
31
+ secrets?: string[];
32
+ /** x- extensions: parameter dependency — if X is set, Y is required */
33
+ dependsOn?: Record<string, {
34
+ required: string[];
35
+ }>;
36
+ /** x- extensions: mutually exclusive parameter groups */
37
+ mutuallyExclusive?: string[][];
38
+ /** Workspace root for path validation */
39
+ workspaceRoot?: string;
40
+ }
41
+ /**
42
+ * Schema Gate — deterministic parameter validation with JSON Schema x- extensions.
43
+ *
44
+ * Implements every validation rule from DESIGN.md §4.2:
45
+ * - required fields ✓
46
+ * - type checking ✓
47
+ * - allowed values ✓
48
+ * - numeric range ✓
49
+ * - regex patterns ✓
50
+ * - path scope constraint (x-path-scope) ✓
51
+ * - path allow/deny globs (x-path-allow/x-path-deny) ✓
52
+ * - max parameter size (x-max-size) ✓
53
+ * - secret parameter marking (x-secret) ✓
54
+ * - parameter dependencies (x-depends-on) ✓
55
+ * - mutually exclusive params (x-mutually-exclusive) ✓
56
+ * - custom validators ✓
57
+ *
58
+ * Zero LLM dependency. Pure deterministic logic.
59
+ */
60
+ export declare class SchemaGate {
61
+ private rules;
62
+ constructor(config?: GuardConfig);
63
+ /** Register a schema rule for a tool */
64
+ registerRule(rule: SchemaRule): void;
65
+ /** Register multiple rules at once */
66
+ registerRules(rules: SchemaRule[]): void;
67
+ /** Get all registered rules */
68
+ getRules(): SchemaRule[];
69
+ /** Check if a tool has a registered rule */
70
+ hasRule(tool: string): boolean;
71
+ /**
72
+ * Full validation: runs all applicable checks.
73
+ * Returns { pass: boolean, errors: SchemaError[] }.
74
+ */
75
+ check(toolName: string, params: Record<string, unknown>): SchemaCheck;
76
+ /**
77
+ * Check if a parameter is marked as secret (x-secret).
78
+ */
79
+ isSecret(toolName: string, field: string): boolean;
80
+ /**
81
+ * Get all secret field names for a tool.
82
+ */
83
+ getSecrets(toolName: string): string[];
84
+ /**
85
+ * Simple glob matching for path allow/deny patterns.
86
+ * Supports *, **, ? wildcards.
87
+ */
88
+ private matchGlob;
89
+ }
90
+ //# sourceMappingURL=schema-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-gate.d.ts","sourceRoot":"","sources":["../../src/guard/schema-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAe,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;IAC7E,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IAC5D,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnD,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAC/B,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAsC;gBAEvC,MAAM,CAAC,EAAE,WAAW;IAsBhC,wCAAwC;IACxC,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIpC,sCAAsC;IACtC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI;IAIxC,+BAA+B;IAC/B,QAAQ,IAAI,UAAU,EAAE;IAIxB,4CAA4C;IAC5C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;;OAGG;IACH,KAAK,CACH,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,WAAW;IA+Td;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAKlD;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAItC;;;OAGG;IACH,OAAO,CAAC,SAAS;CA2BlB"}