sentinel-agentos 0.3.7 → 0.3.9

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 (97) hide show
  1. package/package.json +1 -1
  2. package/LICENSE +0 -21
  3. package/README.md +0 -1797
  4. package/dist/adapters/evaluation-bridge.d.ts +0 -78
  5. package/dist/adapters/evaluation-bridge.d.ts.map +0 -1
  6. package/dist/adapters/evaluation-bridge.js +0 -273
  7. package/dist/adapters/evaluation-bridge.js.map +0 -1
  8. package/dist/adapters/memory-bridge.d.ts +0 -110
  9. package/dist/adapters/memory-bridge.d.ts.map +0 -1
  10. package/dist/adapters/memory-bridge.js +0 -316
  11. package/dist/adapters/memory-bridge.js.map +0 -1
  12. package/dist/adapters/migrate.d.ts +0 -2
  13. package/dist/adapters/migrate.d.ts.map +0 -1
  14. package/dist/adapters/migrate.js +0 -63
  15. package/dist/adapters/migrate.js.map +0 -1
  16. package/dist/api.d.ts +0 -151
  17. package/dist/api.d.ts.map +0 -1
  18. package/dist/api.js +0 -179
  19. package/dist/api.js.map +0 -1
  20. package/dist/cli.d.ts +0 -16
  21. package/dist/cli.d.ts.map +0 -1
  22. package/dist/cli.js +0 -350
  23. package/dist/cli.js.map +0 -1
  24. package/dist/core.d.ts +0 -156
  25. package/dist/core.d.ts.map +0 -1
  26. package/dist/core.js +0 -400
  27. package/dist/core.js.map +0 -1
  28. package/dist/dashboard.html +0 -175
  29. package/dist/evaluator/exec-evaluator.d.ts +0 -102
  30. package/dist/evaluator/exec-evaluator.d.ts.map +0 -1
  31. package/dist/evaluator/exec-evaluator.js +0 -266
  32. package/dist/evaluator/exec-evaluator.js.map +0 -1
  33. package/dist/evaluator/feedback.d.ts +0 -96
  34. package/dist/evaluator/feedback.d.ts.map +0 -1
  35. package/dist/evaluator/feedback.js +0 -419
  36. package/dist/evaluator/feedback.js.map +0 -1
  37. package/dist/evaluator/profiler.d.ts +0 -55
  38. package/dist/evaluator/profiler.d.ts.map +0 -1
  39. package/dist/evaluator/profiler.js +0 -130
  40. package/dist/evaluator/profiler.js.map +0 -1
  41. package/dist/guard/audit-log.d.ts +0 -47
  42. package/dist/guard/audit-log.d.ts.map +0 -1
  43. package/dist/guard/audit-log.js +0 -199
  44. package/dist/guard/audit-log.js.map +0 -1
  45. package/dist/guard/container-sandbox.d.ts +0 -25
  46. package/dist/guard/container-sandbox.d.ts.map +0 -1
  47. package/dist/guard/container-sandbox.js +0 -145
  48. package/dist/guard/container-sandbox.js.map +0 -1
  49. package/dist/guard/risk-gate.d.ts +0 -101
  50. package/dist/guard/risk-gate.d.ts.map +0 -1
  51. package/dist/guard/risk-gate.js +0 -200
  52. package/dist/guard/risk-gate.js.map +0 -1
  53. package/dist/guard/sandbox.d.ts +0 -112
  54. package/dist/guard/sandbox.d.ts.map +0 -1
  55. package/dist/guard/sandbox.js +0 -379
  56. package/dist/guard/sandbox.js.map +0 -1
  57. package/dist/guard/schema-gate.d.ts +0 -90
  58. package/dist/guard/schema-gate.d.ts.map +0 -1
  59. package/dist/guard/schema-gate.js +0 -452
  60. package/dist/guard/schema-gate.js.map +0 -1
  61. package/dist/guard/snapshot-verify.d.ts +0 -111
  62. package/dist/guard/snapshot-verify.d.ts.map +0 -1
  63. package/dist/guard/snapshot-verify.js +0 -571
  64. package/dist/guard/snapshot-verify.js.map +0 -1
  65. package/dist/index.d.ts +0 -28
  66. package/dist/index.d.ts.map +0 -1
  67. package/dist/index.js +0 -59
  68. package/dist/index.js.map +0 -1
  69. package/dist/memory/episodic.d.ts +0 -76
  70. package/dist/memory/episodic.d.ts.map +0 -1
  71. package/dist/memory/episodic.js +0 -289
  72. package/dist/memory/episodic.js.map +0 -1
  73. package/dist/memory/semantic.d.ts +0 -68
  74. package/dist/memory/semantic.d.ts.map +0 -1
  75. package/dist/memory/semantic.js +0 -299
  76. package/dist/memory/semantic.js.map +0 -1
  77. package/dist/memory/working.d.ts +0 -53
  78. package/dist/memory/working.d.ts.map +0 -1
  79. package/dist/memory/working.js +0 -166
  80. package/dist/memory/working.js.map +0 -1
  81. package/dist/middleware/openclaw.d.ts +0 -45
  82. package/dist/middleware/openclaw.d.ts.map +0 -1
  83. package/dist/middleware/openclaw.js +0 -95
  84. package/dist/middleware/openclaw.js.map +0 -1
  85. package/dist/middleware/wrapper.d.ts +0 -54
  86. package/dist/middleware/wrapper.d.ts.map +0 -1
  87. package/dist/middleware/wrapper.js +0 -155
  88. package/dist/middleware/wrapper.js.map +0 -1
  89. package/dist/server.d.ts +0 -45
  90. package/dist/server.d.ts.map +0 -1
  91. package/dist/server.js +0 -256
  92. package/dist/server.js.map +0 -1
  93. package/dist/types/index.d.ts +0 -228
  94. package/dist/types/index.d.ts.map +0 -1
  95. package/dist/types/index.js +0 -23
  96. package/dist/types/index.js.map +0 -1
  97. package/scripts/sentinel-light.js +0 -234
@@ -1,47 +0,0 @@
1
- import { AuditEntry, VerifyStatus, Snapshot, VerifyCheck } from '../types';
2
- import { RiskGate } from './risk-gate';
3
- import { SchemaGate } from './schema-gate';
4
- export declare class AuditLog {
5
- private logPath;
6
- private schemaGate;
7
- private riskGate;
8
- private snapshotGate;
9
- private entries;
10
- private sessionIndex;
11
- constructor(workspaceRoot: string, schemaGate: SchemaGate, riskGate: RiskGate);
12
- record(options: {
13
- sessionId: string;
14
- agentId: string;
15
- startedAt: number;
16
- completedAt: number;
17
- toolName: string;
18
- toolParameters: Record<string, unknown>;
19
- toolResult: unknown;
20
- snapshot: Snapshot | null;
21
- verifyStatus: VerifyStatus;
22
- verifyChecks: VerifyCheck[];
23
- }): AuditEntry;
24
- query(filter?: {
25
- sessionId?: string;
26
- toolName?: string;
27
- verifyStatus?: VerifyStatus;
28
- minScore?: number;
29
- maxScore?: number;
30
- limit?: number;
31
- }): AuditEntry[];
32
- stats(): {
33
- totalOperations: number;
34
- byTool: Record<string, number>;
35
- averageRiskScore: number;
36
- verifyFailures: number;
37
- sessionsTracked: number;
38
- highRiskOps: number;
39
- };
40
- private sanitizeParams;
41
- private truncateResult;
42
- private append;
43
- private loadFromDisk;
44
- /** Get raw entries count (for debugging) */
45
- get size(): number;
46
- }
47
- //# sourceMappingURL=audit-log.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../src/guard/audit-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAS3C,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAe;IAEnC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,YAAY,CAAwC;gBAG1D,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ;IASpB,MAAM,CAAC,OAAO,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,UAAU,EAAE,OAAO,CAAC;QACpB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;QAC1B,YAAY,EAAE,YAAY,CAAC;QAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;KAC7B,GAAG,UAAU;IA2Bd,KAAK,CAAC,MAAM,GAAE;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,UAAU,EAAE;IA8BrB,KAAK,IAAI;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;KACrB;IA6BD,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,YAAY;IAiBpB,4CAA4C;IAC5C,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -1,199 +0,0 @@
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.AuditLog = void 0;
37
- const snapshot_verify_1 = require("./snapshot-verify");
38
- const crypto = __importStar(require("crypto"));
39
- const fs = __importStar(require("fs"));
40
- const path = __importStar(require("path"));
41
- function generateAuditId() {
42
- return `audit_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
43
- }
44
- class AuditLog {
45
- logPath;
46
- schemaGate;
47
- riskGate;
48
- snapshotGate;
49
- // In-memory entries + session index for fast lookups
50
- entries = [];
51
- sessionIndex = new Map();
52
- constructor(workspaceRoot, schemaGate, riskGate) {
53
- this.logPath = path.join(workspaceRoot, '.agentos', 'audit.jsonl');
54
- this.schemaGate = schemaGate;
55
- this.riskGate = riskGate;
56
- this.snapshotGate = new snapshot_verify_1.SnapshotGate(workspaceRoot);
57
- this.loadFromDisk();
58
- }
59
- record(options) {
60
- const entry = {
61
- id: generateAuditId(),
62
- sessionId: options.sessionId,
63
- agentId: options.agentId,
64
- startedAt: options.startedAt,
65
- completedAt: options.completedAt,
66
- durationMs: options.completedAt - options.startedAt,
67
- toolName: options.toolName,
68
- toolParameters: this.sanitizeParams(options.toolParameters),
69
- toolResult: this.truncateResult(options.toolResult),
70
- schemaGate: this.schemaGate.check(options.toolName, options.toolParameters),
71
- riskGate: this.riskGate.evaluate(options.toolName, options.toolParameters),
72
- snapshot: options.snapshot,
73
- verifyGate: {
74
- status: options.verifyStatus,
75
- checks: options.verifyChecks,
76
- },
77
- diff: options.snapshot
78
- ? this.snapshotGate.computeDiff(options.snapshot)
79
- : null,
80
- };
81
- this.append(entry);
82
- return entry;
83
- }
84
- query(filter = {}) {
85
- // Use session index for session-only queries (O(1) lookup)
86
- let results;
87
- if (filter.sessionId && !filter.toolName && !filter.verifyStatus &&
88
- filter.minScore === undefined && filter.maxScore === undefined) {
89
- results = this.sessionIndex.get(filter.sessionId) ?? [];
90
- }
91
- else {
92
- // Fall back to full scan with filters
93
- results = this.entries;
94
- if (filter.sessionId) {
95
- results = results.filter((e) => e.sessionId === filter.sessionId);
96
- }
97
- if (filter.toolName) {
98
- results = results.filter((e) => e.toolName === filter.toolName);
99
- }
100
- if (filter.verifyStatus) {
101
- results = results.filter((e) => e.verifyGate.status === filter.verifyStatus);
102
- }
103
- if (filter.minScore !== undefined) {
104
- results = results.filter((e) => e.riskGate.score >= filter.minScore);
105
- }
106
- if (filter.maxScore !== undefined) {
107
- results = results.filter((e) => e.riskGate.score <= filter.maxScore);
108
- }
109
- }
110
- const limit = filter.limit ?? 100;
111
- return results.slice(-limit);
112
- }
113
- stats() {
114
- const entries = this.entries;
115
- const byTool = {};
116
- let totalScore = 0;
117
- let verifyFailures = 0;
118
- let highRiskOps = 0;
119
- const sessions = new Set();
120
- for (const entry of entries) {
121
- byTool[entry.toolName] = (byTool[entry.toolName] || 0) + 1;
122
- totalScore += entry.riskGate?.score ?? 0;
123
- if (entry.verifyGate?.status === 'FAIL')
124
- verifyFailures++;
125
- if ((entry.riskGate?.score ?? 0) > 3.0)
126
- highRiskOps++;
127
- sessions.add(entry.sessionId);
128
- }
129
- return {
130
- totalOperations: entries.length,
131
- byTool,
132
- averageRiskScore: entries.length > 0
133
- ? Math.round((totalScore / entries.length) * 100) / 100
134
- : 0,
135
- verifyFailures,
136
- sessionsTracked: sessions.size,
137
- highRiskOps,
138
- };
139
- }
140
- sanitizeParams(params) {
141
- const sensitive = ['token', 'password', 'secret', 'key', 'api_key', 'auth'];
142
- const sanitized = {};
143
- for (const [key, value] of Object.entries(params)) {
144
- if (sensitive.some((s) => key.toLowerCase().includes(s))) {
145
- sanitized[key] = '***REDACTED***';
146
- }
147
- else {
148
- sanitized[key] = value;
149
- }
150
- }
151
- return sanitized;
152
- }
153
- truncateResult(result, maxChars = 5000) {
154
- const str = typeof result === 'string'
155
- ? result
156
- : JSON.stringify(result);
157
- if (str.length > maxChars) {
158
- return str.slice(0, maxChars) + `... [truncated ${str.length - maxChars} chars]`;
159
- }
160
- return result;
161
- }
162
- append(entry) {
163
- // Update in-memory index
164
- this.entries.push(entry);
165
- const sessionEntries = this.sessionIndex.get(entry.sessionId) ?? [];
166
- sessionEntries.push(entry);
167
- this.sessionIndex.set(entry.sessionId, sessionEntries);
168
- const dir = path.dirname(this.logPath);
169
- if (!fs.existsSync(dir)) {
170
- fs.mkdirSync(dir, { recursive: true });
171
- }
172
- const line = JSON.stringify(entry) + '\n';
173
- fs.appendFileSync(this.logPath, line, 'utf-8');
174
- }
175
- loadFromDisk() {
176
- try {
177
- if (!fs.existsSync(this.logPath))
178
- return;
179
- const content = fs.readFileSync(this.logPath, 'utf-8');
180
- const lines = content.split('\n').filter((l) => l.trim());
181
- const entries = lines.map((l) => JSON.parse(l));
182
- for (const e of entries) {
183
- this.entries.push(e);
184
- const se = this.sessionIndex.get(e.sessionId) ?? [];
185
- se.push(e);
186
- this.sessionIndex.set(e.sessionId, se);
187
- }
188
- }
189
- catch {
190
- // Keep empty state
191
- }
192
- }
193
- /** Get raw entries count (for debugging) */
194
- get size() {
195
- return this.entries.length;
196
- }
197
- }
198
- exports.AuditLog = AuditLog;
199
- //# sourceMappingURL=audit-log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../../src/guard/audit-log.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import type { SandboxResult } from './sandbox';
2
- export interface ContainerConfig {
3
- image?: string;
4
- workspaceVolume?: 'ro' | 'rw';
5
- network?: 'none' | 'host' | 'bridge';
6
- memoryLimit?: string;
7
- cpuLimit?: number;
8
- timeoutSec?: number;
9
- autoRemove?: boolean;
10
- env?: Record<string, string>;
11
- }
12
- export declare function executeInContainer(command: string, cwd: string, config?: Partial<ContainerConfig>): SandboxResult;
13
- export declare class ContainerSandbox {
14
- private cfg;
15
- constructor(opts?: Partial<ContainerConfig> & {
16
- workspaceRoot?: string;
17
- });
18
- validate(_toolName: string, params: Record<string, unknown>): {
19
- success: boolean;
20
- sandboxRejectReason?: string;
21
- };
22
- execute(_toolName: string, params: Record<string, unknown>): SandboxResult;
23
- private isSensitive;
24
- }
25
- //# sourceMappingURL=container-sandbox.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"container-sandbox.d.ts","sourceRoot":"","sources":["../../src/guard/container-sandbox.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAY/C,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAOD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,aAAa,CA6Cf;AAGD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAwD;gBAEvD,IAAI,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;IAIxE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE;IAchH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAI1E,OAAO,CAAC,WAAW;CAIpB"}
@@ -1,145 +0,0 @@
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.ContainerSandbox = void 0;
37
- exports.executeInContainer = executeInContainer;
38
- /**
39
- * DockerContainerSandbox �?V2.0 container-level isolation.
40
- */
41
- const path = __importStar(require("path"));
42
- const child_process_1 = require("child_process");
43
- function dockerAvailable() {
44
- try {
45
- (0, child_process_1.execSync)('docker info', { stdio: 'ignore', timeout: 5000 });
46
- return true;
47
- }
48
- catch {
49
- return false;
50
- }
51
- }
52
- function imageExists(image) {
53
- try {
54
- (0, child_process_1.execSync)(`docker image inspect ${image}`, { stdio: 'ignore' });
55
- return true;
56
- }
57
- catch {
58
- return false;
59
- }
60
- }
61
- function pullImage(image) {
62
- (0, child_process_1.execSync)(`docker pull ${image}`, { stdio: 'inherit', timeout: 60000 });
63
- }
64
- const DEFAULTS = {
65
- image: 'node:24-alpine', workspaceVolume: 'ro', network: 'none',
66
- memoryLimit: '512m', cpuLimit: 0.5, timeoutSec: 30, autoRemove: true, env: {},
67
- };
68
- function executeInContainer(command, cwd, config) {
69
- const cfg = { ...DEFAULTS, ...config };
70
- if (!dockerAvailable()) {
71
- return { success: false, exitCode: 127, stdout: '', stderr: 'Docker not available', truncated: false, durationMs: 0 };
72
- }
73
- const image = cfg.image;
74
- if (!imageExists(image)) {
75
- try {
76
- pullImage(image);
77
- }
78
- catch (e) {
79
- return { success: false, exitCode: 127, stdout: '',
80
- stderr: `Failed to pull image "${image}"`, truncated: false, durationMs: 0 };
81
- }
82
- }
83
- const containerName = `sentinel-sb-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
84
- const workspaceAbs = path.resolve(cwd);
85
- const args = [
86
- 'run', '--rm', '--name', containerName,
87
- '--memory', cfg.memoryLimit, '--cpus', String(cfg.cpuLimit),
88
- ...(cfg.network === 'none' ? ['--network', 'none'] : cfg.network === 'host' ? ['--network', 'host'] : []),
89
- '-v', `${workspaceAbs}:/workspace:${cfg.workspaceVolume}`,
90
- '-w', '/workspace',
91
- image, 'sh', '-c', command,
92
- ];
93
- const startTime = Date.now();
94
- try {
95
- const r = (0, child_process_1.spawnSync)('docker', args, {
96
- encoding: 'utf-8', timeout: cfg.timeoutSec * 1000,
97
- maxBuffer: 10 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'],
98
- });
99
- const durationMs = Date.now() - startTime;
100
- if (r.status === null) {
101
- return { success: false, exitCode: -1, stdout: '', stderr: r.stderr || 'timeout', truncated: false, durationMs };
102
- }
103
- return {
104
- success: r.status === 0, exitCode: r.status ?? 1,
105
- stdout: r.stdout || '', stderr: r.stderr || '', truncated: false, durationMs,
106
- };
107
- }
108
- catch (e) {
109
- try {
110
- (0, child_process_1.execSync)(`docker rm -f ${containerName}`, { stdio: 'ignore' });
111
- }
112
- catch { }
113
- return { success: false, exitCode: -1, stdout: '',
114
- stderr: e instanceof Error ? e.message : String(e), truncated: false, durationMs: Date.now() - startTime };
115
- }
116
- }
117
- // ContainerSandbox class
118
- class ContainerSandbox {
119
- cfg;
120
- constructor(opts) {
121
- this.cfg = { ...DEFAULTS, workspaceRoot: opts?.workspaceRoot || process.cwd(), ...opts };
122
- }
123
- validate(_toolName, params) {
124
- if (['write', 'write_file', 'delete', 'edit', 'rm'].includes(_toolName)) {
125
- const p = String(params.path || params.file || '');
126
- const absPath = path.resolve(this.cfg.workspaceRoot, p);
127
- if (!absPath.startsWith(path.resolve(this.cfg.workspaceRoot))) {
128
- return { success: false, sandboxRejectReason: `Path outside workspace: ${p}` };
129
- }
130
- if (['write', 'edit'].includes(_toolName) && this.isSensitive(p)) {
131
- return { success: false, sandboxRejectReason: `Sensitive file in container: ${p}` };
132
- }
133
- }
134
- return { success: true };
135
- }
136
- execute(_toolName, params) {
137
- return executeInContainer(String(params.command || ''), this.cfg.workspaceRoot, this.cfg);
138
- }
139
- isSensitive(fp) {
140
- const p = fp.replace(/\\/g, '/');
141
- return ['.env', 'package.json'].some(s => p === s || p.endsWith('/' + s));
142
- }
143
- }
144
- exports.ContainerSandbox = ContainerSandbox;
145
- //# sourceMappingURL=container-sandbox.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"container-sandbox.js","sourceRoot":"","sources":["../../src/guard/container-sandbox.ts"],"names":[],"mappings":"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"}
@@ -1,101 +0,0 @@
1
- import { RiskScore } from '../types';
2
- /**
3
- * Impact level — how broadly the operation affects the system.
4
- */
5
- export type ImpactLevel = 'local' | 'workspace' | 'project' | 'system';
6
- /**
7
- * Sensitivity level — how sensitive the data involved is.
8
- */
9
- export type SensitivityLevel = 'none' | 'low' | 'medium' | 'high' | 'critical';
10
- /**
11
- * Tool-level risk profile — users define this per tool.
12
- */
13
- export interface ToolRiskProfile {
14
- /** Tool name to match */
15
- tool: string;
16
- /** Impact level of this tool */
17
- impact: ImpactLevel;
18
- /** How reversible the operation is (0 = irreversible, 1 = fully reversible) */
19
- reversibility: number;
20
- /** Sensitivity of data this tool accesses */
21
- sensitivity: SensitivityLevel;
22
- /** Tool category for default error rate */
23
- category?: 'read' | 'write' | 'delete' | 'network' | 'compute';
24
- /** Optional override for initial error rate (skips category default) */
25
- initialErrorRate?: number;
26
- }
27
- /**
28
- * Tool call statistics for dynamic error-rate tracking.
29
- */
30
- interface ToolStats {
31
- totalCalls: number;
32
- failures: number;
33
- errorRate: number;
34
- lastUpdated: number;
35
- }
36
- /**
37
- * Threshold configuration for risk-based actions.
38
- */
39
- export interface RiskThresholds {
40
- /** Score ≤ autoApprove → execute immediately */
41
- autoApprove: number;
42
- /** Score ≤ notify → execute but notify user */
43
- notify: number;
44
- /** Score ≤ confirm → pause and ask for user confirmation */
45
- confirm: number;
46
- /** Score > deny → block entirely */
47
- deny: number;
48
- }
49
- /**
50
- * Default thresholds — conservative but workable.
51
- */
52
- export declare const DEFAULT_RISK_THRESHOLDS: RiskThresholds;
53
- /**
54
- * Risk Gate — deterministic, pure-math risk scoring.
55
- *
56
- * Formula: RiskScore = Impact × (1 - Reversibility) × Sensitivity × (1 + ErrorRate)
57
- *
58
- * Zero LLM dependency. The formula, thresholds, and mappings are all
59
- * explicit and auditable.
60
- */
61
- export declare class RiskGate {
62
- private profiles;
63
- private stats;
64
- private thresholds;
65
- constructor(thresholds?: RiskThresholds);
66
- /** Register a risk profile for a tool */
67
- registerProfile(profile: ToolRiskProfile): void;
68
- /** Register multiple profiles at once */
69
- registerProfiles(profiles: ToolRiskProfile[]): void;
70
- /** Get all registered profiles */
71
- getProfiles(): ToolRiskProfile[];
72
- /** Check if a tool has a registered profile */
73
- hasProfile(tool: string): boolean;
74
- /**
75
- * Compute the risk score for a tool call.
76
- *
77
- * If no profile is registered, returns a default moderate-risk score
78
- * (auto-approve with notification).
79
- */
80
- evaluate(tool: string, _params?: Record<string, unknown>): RiskScore;
81
- /**
82
- * Evaluate risk for an unregistered tool by scanning params for danger patterns.
83
- */
84
- private evaluateUntracked;
85
- /** Record the outcome of a tool call to update stats */
86
- recordOutcome(tool: string, success: boolean): void;
87
- /** Get tool statistics */
88
- getStats(tool: string): ToolStats | undefined;
89
- /** Get all tool statistics */
90
- getAllStats(): Map<string, ToolStats>;
91
- /** Update thresholds at runtime */
92
- setThresholds(thresholds: Partial<RiskThresholds>): void;
93
- /** Get current thresholds */
94
- getThresholds(): RiskThresholds;
95
- /**
96
- * Map a numeric risk score to the appropriate action.
97
- */
98
- private scoreToAction;
99
- }
100
- export {};
101
- //# sourceMappingURL=risk-gate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"risk-gate.d.ts","sourceRoot":"","sources":["../../src/guard/risk-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AASvE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAsC/E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,WAAW,EAAE,gBAAgB,CAAC;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/D,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,UAAU,SAAS;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAKrC,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,UAAU,CAAiB;gBAEvB,UAAU,GAAE,cAAwC;IAIhE,yCAAyC;IACzC,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAgB/C,yCAAyC;IACzC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,IAAI;IAInD,kCAAkC;IAClC,WAAW,IAAI,eAAe,EAAE;IAIhC,+CAA+C;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IA+BpE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB,wDAAwD;IACxD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAWnD,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI7C,8BAA8B;IAC9B,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAIrC,mCAAmC;IACnC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAIxD,6BAA6B;IAC7B,aAAa,IAAI,cAAc;IAI/B;;OAEG;IACH,OAAO,CAAC,aAAa;CAMtB"}