@judaharagao/opencode-ssh 1.0.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/config/defaults.d.ts +11 -0
  4. package/dist/config/defaults.d.ts.map +1 -0
  5. package/dist/config/defaults.js +23 -0
  6. package/dist/config/defaults.js.map +1 -0
  7. package/dist/config/schema.d.ts +51 -0
  8. package/dist/config/schema.d.ts.map +1 -0
  9. package/dist/config/schema.js +41 -0
  10. package/dist/config/schema.js.map +1 -0
  11. package/dist/display/formatter.d.ts +41 -0
  12. package/dist/display/formatter.d.ts.map +1 -0
  13. package/dist/display/formatter.js +179 -0
  14. package/dist/display/formatter.js.map +1 -0
  15. package/dist/display/stream.d.ts +38 -0
  16. package/dist/display/stream.d.ts.map +1 -0
  17. package/dist/display/stream.js +102 -0
  18. package/dist/display/stream.js.map +1 -0
  19. package/dist/hooks.d.ts +13 -0
  20. package/dist/hooks.d.ts.map +1 -0
  21. package/dist/hooks.js +151 -0
  22. package/dist/hooks.js.map +1 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +19 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/security/allowlist.d.ts +23 -0
  28. package/dist/security/allowlist.d.ts.map +1 -0
  29. package/dist/security/allowlist.js +105 -0
  30. package/dist/security/allowlist.js.map +1 -0
  31. package/dist/security/blocklist.d.ts +35 -0
  32. package/dist/security/blocklist.d.ts.map +1 -0
  33. package/dist/security/blocklist.js +351 -0
  34. package/dist/security/blocklist.js.map +1 -0
  35. package/dist/security/policy.d.ts +40 -0
  36. package/dist/security/policy.d.ts.map +1 -0
  37. package/dist/security/policy.js +133 -0
  38. package/dist/security/policy.js.map +1 -0
  39. package/dist/security/validator.d.ts +32 -0
  40. package/dist/security/validator.d.ts.map +1 -0
  41. package/dist/security/validator.js +152 -0
  42. package/dist/security/validator.js.map +1 -0
  43. package/dist/ssh/audit.d.ts +47 -0
  44. package/dist/ssh/audit.d.ts.map +1 -0
  45. package/dist/ssh/audit.js +126 -0
  46. package/dist/ssh/audit.js.map +1 -0
  47. package/dist/ssh/connection.d.ts +73 -0
  48. package/dist/ssh/connection.d.ts.map +1 -0
  49. package/dist/ssh/connection.js +210 -0
  50. package/dist/ssh/connection.js.map +1 -0
  51. package/dist/ssh/executor.d.ts +49 -0
  52. package/dist/ssh/executor.d.ts.map +1 -0
  53. package/dist/ssh/executor.js +275 -0
  54. package/dist/ssh/executor.js.map +1 -0
  55. package/dist/ssh/manager.d.ts +43 -0
  56. package/dist/ssh/manager.d.ts.map +1 -0
  57. package/dist/ssh/manager.js +98 -0
  58. package/dist/ssh/manager.js.map +1 -0
  59. package/dist/ssh/sanitizer.d.ts +41 -0
  60. package/dist/ssh/sanitizer.d.ts.map +1 -0
  61. package/dist/ssh/sanitizer.js +108 -0
  62. package/dist/ssh/sanitizer.js.map +1 -0
  63. package/dist/tools.d.ts +7 -0
  64. package/dist/tools.d.ts.map +1 -0
  65. package/dist/tools.js +584 -0
  66. package/dist/tools.js.map +1 -0
  67. package/package.json +64 -0
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Command Blocklist for SSH plugin.
3
+ *
4
+ * Commands are categorized into two levels:
5
+ * - DESTRUCTIVE: 100% blocked, no exceptions, no override possible
6
+ * - RISKY: Blocked by default, requires user approval via permission prompt every time
7
+ */
8
+ // ─── DESTRUCTIVE COMMANDS ───────────────────────────────────────────
9
+ // These are ALWAYS blocked. No permission prompt, no override.
10
+ const DESTRUCTIVE_COMMANDS = [
11
+ {
12
+ id: "DESTR-001",
13
+ pattern: /\brm\s+(-[a-zA-Z]*f[a-zA-Z]*\s+)?\/\s*$/i,
14
+ reason: "Recursive deletion of root filesystem",
15
+ level: "destructive",
16
+ },
17
+ {
18
+ id: "DESTR-002",
19
+ pattern: /\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|-[a-zA-Z]*f[a-zA-Z]*r)\s+\/\s*\*?\s*$/i,
20
+ reason: "Recursive force deletion from root",
21
+ level: "destructive",
22
+ },
23
+ {
24
+ id: "DESTR-003",
25
+ pattern: /\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|-[a-zA-Z]*f[a-zA-Z]*r)\s+~\s*$/i,
26
+ reason: "Recursive force deletion of home directory",
27
+ level: "destructive",
28
+ },
29
+ {
30
+ id: "DESTR-004",
31
+ pattern: /\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|-[a-zA-Z]*f[a-zA-Z]*r)\s+\.\*?\s*$/i,
32
+ reason: "Recursive force deletion of current directory contents",
33
+ level: "destructive",
34
+ },
35
+ {
36
+ id: "DESTR-005",
37
+ pattern: /\bmkfs\b/,
38
+ reason: "Filesystem formatting command",
39
+ level: "destructive",
40
+ },
41
+ {
42
+ id: "DESTR-006",
43
+ pattern: /\bdd\s+if=\/dev\/(zero|random|urandom)/i,
44
+ reason: "Direct disk write operation (zeroing/randomizing)",
45
+ level: "destructive",
46
+ },
47
+ {
48
+ id: "DESTR-007",
49
+ pattern: /\bdd\s+.*of=\/dev\/[a-z]/i,
50
+ reason: "Direct write to block device",
51
+ level: "destructive",
52
+ },
53
+ {
54
+ id: "DESTR-008",
55
+ pattern: /:\(\)\{.*\|.*\&\}\s*;?:/,
56
+ reason: "Fork bomb detected",
57
+ level: "destructive",
58
+ },
59
+ {
60
+ id: "DESTR-009",
61
+ pattern: /\bchmod\s+(-[a-zA-Z]*R[a-zA-Z]*)?\s+777\s+\//i,
62
+ reason: "Recursive chmod 777 on root",
63
+ level: "destructive",
64
+ },
65
+ {
66
+ id: "DESTR-010",
67
+ pattern: /\bchmod\s+(-[a-zA-Z]*R[a-zA-Z]*)?\s+000\s+\//i,
68
+ reason: "Recursive chmod 000 on root (removes all permissions)",
69
+ level: "destructive",
70
+ },
71
+ {
72
+ id: "DESTR-011",
73
+ pattern: /\bchown\s+(-[a-zA-Z]*R[a-zA-Z]*)?\s+.*\s+\//i,
74
+ reason: "Recursive chown on root filesystem",
75
+ level: "destructive",
76
+ },
77
+ {
78
+ id: "DESTR-012",
79
+ pattern: /\b(wget|curl)\s+.*\|\s*(sh|bash|zsh|dash|ksh)/i,
80
+ reason: "Piping remote content directly to shell (remote code execution)",
81
+ level: "destructive",
82
+ },
83
+ {
84
+ id: "DESTR-013",
85
+ pattern: /\b>\s*\/dev\/sda/i,
86
+ reason: "Direct write to system disk device",
87
+ level: "destructive",
88
+ },
89
+ {
90
+ id: "DESTR-014",
91
+ pattern: /\bmv\s+.*\s+\/\s*$/i,
92
+ reason: "Moving content to root filesystem",
93
+ level: "destructive",
94
+ },
95
+ {
96
+ id: "DESTR-015",
97
+ pattern: /\bshutdown\b/i,
98
+ reason: "System shutdown command",
99
+ level: "destructive",
100
+ },
101
+ {
102
+ id: "DESTR-016",
103
+ pattern: /\breboot\b/i,
104
+ reason: "System reboot command",
105
+ level: "destructive",
106
+ },
107
+ {
108
+ id: "DESTR-017",
109
+ pattern: /\binit\s+[06]\b/i,
110
+ reason: "System halt/init 0 or init 6",
111
+ level: "destructive",
112
+ },
113
+ {
114
+ id: "DESTR-018",
115
+ pattern: /\bkill\s+-9\s+1\b/i,
116
+ reason: "Killing PID 1 (init/systemd) - will crash the system",
117
+ level: "destructive",
118
+ },
119
+ {
120
+ id: "DESTR-019",
121
+ pattern: /\bkillall\b/i,
122
+ reason: "Kill all processes command",
123
+ level: "destructive",
124
+ },
125
+ {
126
+ id: "DESTR-020",
127
+ pattern: /\biptables\s+-F\b/i,
128
+ reason: "Flushing all firewall rules",
129
+ level: "destructive",
130
+ },
131
+ {
132
+ id: "DESTR-021",
133
+ pattern: /\bufw\s+disable\b/i,
134
+ reason: "Disabling the firewall",
135
+ level: "destructive",
136
+ },
137
+ {
138
+ id: "DESTR-022",
139
+ pattern: /\b(>|>>)\s*\/dev\/(sda|sdb|hda|vda|nvme)/i,
140
+ reason: "Writing directly to block device",
141
+ level: "destructive",
142
+ },
143
+ {
144
+ id: "DESTR-023",
145
+ pattern: /\bformat\s+[a-zA-Z]:\\/i,
146
+ reason: "Windows format command",
147
+ level: "destructive",
148
+ },
149
+ {
150
+ id: "DESTR-024",
151
+ pattern: /\bdel\s+\/[sfq]\s+[\\\/]/i,
152
+ reason: "Windows recursive delete command",
153
+ level: "destructive",
154
+ },
155
+ ];
156
+ // ─── RISKY COMMANDS ────────────────────────────────────────────────
157
+ // These require user approval EVERY TIME via permission prompt.
158
+ const RISKY_COMMANDS = [
159
+ {
160
+ id: "RISK-001",
161
+ pattern: /\bDROP\s+TABLE\b/i,
162
+ reason: "Destructive SQL: dropping a table",
163
+ level: "risky",
164
+ },
165
+ {
166
+ id: "RISK-002",
167
+ pattern: /\bDROP\s+DATABASE\b/i,
168
+ reason: "Destructive SQL: dropping an entire database",
169
+ level: "risky",
170
+ },
171
+ {
172
+ id: "RISK-003",
173
+ pattern: /\bDELETE\s+FROM\b/i,
174
+ reason: "Destructive SQL: deleting rows from a table",
175
+ level: "risky",
176
+ },
177
+ {
178
+ id: "RISK-004",
179
+ pattern: /\bTRUNCATE\b/i,
180
+ reason: "Destructive SQL: truncating a table",
181
+ level: "risky",
182
+ },
183
+ {
184
+ id: "RISK-005",
185
+ pattern: /\bALTER\s+TABLE\s+\S+\s+DROP\b/i,
186
+ reason: "Schema change: dropping a column",
187
+ level: "risky",
188
+ },
189
+ {
190
+ id: "RISK-006",
191
+ pattern: /\bsudo\s+su\b/i,
192
+ reason: "Switching to root user",
193
+ level: "risky",
194
+ },
195
+ {
196
+ id: "RISK-007",
197
+ pattern: /\bsudo\s+-i\b/i,
198
+ reason: "Interactive root shell",
199
+ level: "risky",
200
+ },
201
+ {
202
+ id: "RISK-008",
203
+ pattern: /\bsystemctl\s+stop\b/i,
204
+ reason: "Stopping a system service",
205
+ level: "risky",
206
+ },
207
+ {
208
+ id: "RISK-009",
209
+ pattern: /\bsystemctl\s+disable\b/i,
210
+ reason: "Disabling a system service",
211
+ level: "risky",
212
+ },
213
+ {
214
+ id: "RISK-010",
215
+ pattern: /\bkill\s+-9\b/i,
216
+ reason: "Force killing a process (SIGKILL)",
217
+ level: "risky",
218
+ },
219
+ {
220
+ id: "RISK-011",
221
+ pattern: /\bkill\s+-15\b/i,
222
+ reason: "Sending SIGTERM to a process",
223
+ level: "risky",
224
+ },
225
+ {
226
+ id: "RISK-012",
227
+ pattern: /\bservice\s+\S+\s+stop\b/i,
228
+ reason: "Stopping a service via service command",
229
+ level: "risky",
230
+ },
231
+ {
232
+ id: "RISK-013",
233
+ pattern: /\bnpm\s+uninstall\s+-g\b/i,
234
+ reason: "Global npm package uninstallation",
235
+ level: "risky",
236
+ },
237
+ {
238
+ id: "RISK-014",
239
+ pattern: /\byarn\s+global\s+remove\b/i,
240
+ reason: "Global yarn package removal",
241
+ level: "risky",
242
+ },
243
+ {
244
+ id: "RISK-015",
245
+ pattern: /\bapt\s+(remove|purge)\b/i,
246
+ reason: "Package removal via apt",
247
+ level: "risky",
248
+ },
249
+ {
250
+ id: "RISK-016",
251
+ pattern: /\byum\s+remove\b/i,
252
+ reason: "Package removal via yum",
253
+ level: "risky",
254
+ },
255
+ {
256
+ id: "RISK-017",
257
+ pattern: /\bdnf\s+remove\b/i,
258
+ reason: "Package removal via dnf",
259
+ level: "risky",
260
+ },
261
+ {
262
+ id: "RISK-018",
263
+ pattern: /\bsnap\s+remove\b/i,
264
+ reason: "Snap package removal",
265
+ level: "risky",
266
+ },
267
+ {
268
+ id: "RISK-019",
269
+ pattern: /\bcron(tab)?\s+(-r|-l)\b/i,
270
+ reason: "Cron job manipulation (remove or list for editing)",
271
+ level: "risky",
272
+ },
273
+ {
274
+ id: "RISK-020",
275
+ pattern: /\buserdel\b/i,
276
+ reason: "User account deletion",
277
+ level: "risky",
278
+ },
279
+ {
280
+ id: "RISK-021",
281
+ pattern: /\bgroupdel\b/i,
282
+ reason: "Group deletion",
283
+ level: "risky",
284
+ },
285
+ {
286
+ id: "RISK-022",
287
+ pattern: /\bpasswd\s+\w+/i,
288
+ reason: "Changing another user's password",
289
+ level: "risky",
290
+ },
291
+ {
292
+ id: "RISK-023",
293
+ pattern: /\biptables\s+-[AD]\b/i,
294
+ reason: "Modifying firewall rules",
295
+ level: "risky",
296
+ },
297
+ {
298
+ id: "RISK-024",
299
+ pattern: /\bnc\s+.*-l\b/i,
300
+ reason: "Listening on a network port (netcat)",
301
+ level: "risky",
302
+ },
303
+ {
304
+ id: "RISK-025",
305
+ pattern: /\bss\s+-lntp\b/i,
306
+ reason: "Listing all listening network ports",
307
+ level: "risky",
308
+ },
309
+ {
310
+ id: "RISK-026",
311
+ pattern: /\bchmod\s+(-[a-zA-Z]*R[a-zA-Z]*)?\s+777\b/i,
312
+ reason: "Granting full permissions (777) recursively",
313
+ level: "risky",
314
+ },
315
+ {
316
+ id: "RISK-027",
317
+ pattern: /\bchmod\s+(-[a-zA-Z]*R[a-zA-Z]*)?\s+000\b/i,
318
+ reason: "Removing all permissions recursively",
319
+ level: "risky",
320
+ },
321
+ ];
322
+ /**
323
+ * Get all built-in blocklist entries.
324
+ */
325
+ export function getBuiltinBlocklist() {
326
+ return [...DESTRUCTIVE_COMMANDS, ...RISKY_COMMANDS];
327
+ }
328
+ /**
329
+ * Get only destructive commands.
330
+ */
331
+ export function getDestructiveCommands() {
332
+ return [...DESTRUCTIVE_COMMANDS];
333
+ }
334
+ /**
335
+ * Get only risky commands.
336
+ */
337
+ export function getRiskyCommands() {
338
+ return [...RISKY_COMMANDS];
339
+ }
340
+ /**
341
+ * Create custom blocklist entries from user-provided regex patterns.
342
+ */
343
+ export function createCustomEntries(patterns, level = "risky") {
344
+ return patterns.map((p, i) => ({
345
+ id: `CUSTOM-${level.toUpperCase()}-${String(i + 1).padStart(3, "0")}`,
346
+ pattern: new RegExp(p, "i"),
347
+ reason: `Custom ${level} pattern`,
348
+ level,
349
+ }));
350
+ }
351
+ //# sourceMappingURL=blocklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocklist.js","sourceRoot":"","sources":["../../src/security/blocklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { SecurityMode } from "../config/schema.js";
2
+ export interface SecurityPolicy {
3
+ mode: SecurityMode;
4
+ extraBlocklist: string[];
5
+ customAllowlist: string[];
6
+ updatedAt: string;
7
+ }
8
+ /**
9
+ * Load the security policy from disk.
10
+ */
11
+ export declare function loadPolicy(projectDir: string): SecurityPolicy | null;
12
+ /**
13
+ * Save the security policy to disk.
14
+ */
15
+ export declare function savePolicy(projectDir: string, policy: SecurityPolicy): void;
16
+ /**
17
+ * Get or create a default policy.
18
+ */
19
+ export declare function getPolicy(projectDir: string, mode?: SecurityMode): SecurityPolicy;
20
+ /**
21
+ * Add a pattern to the blocklist.
22
+ */
23
+ export declare function addBlocklistPattern(projectDir: string, pattern: string): SecurityPolicy;
24
+ /**
25
+ * Remove a pattern from the blocklist.
26
+ */
27
+ export declare function removeBlocklistPattern(projectDir: string, pattern: string): SecurityPolicy;
28
+ /**
29
+ * Add a pattern to the allowlist.
30
+ */
31
+ export declare function addAllowlistPattern(projectDir: string, pattern: string): SecurityPolicy;
32
+ /**
33
+ * Remove a pattern from the allowlist.
34
+ */
35
+ export declare function removeAllowlistPattern(projectDir: string, pattern: string): SecurityPolicy;
36
+ /**
37
+ * Format the current policy for display.
38
+ */
39
+ export declare function formatPolicy(policy: SecurityPolicy): string;
40
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/security/policy.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAA;IAClB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;CAClB;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAYpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAQ3E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,YAAqB,GAAG,cAAc,CAazF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAUvF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAM1F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAUvF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAM1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuC3D"}
@@ -0,0 +1,133 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { getSshDataDir } from "../config/defaults.js";
4
+ const POLICY_FILE = "policy.json";
5
+ /**
6
+ * Load the security policy from disk.
7
+ */
8
+ export function loadPolicy(projectDir) {
9
+ const dataDir = getSshDataDir(projectDir);
10
+ const filePath = join(dataDir, POLICY_FILE);
11
+ if (!existsSync(filePath))
12
+ return null;
13
+ try {
14
+ const content = readFileSync(filePath, "utf-8");
15
+ return JSON.parse(content);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ /**
22
+ * Save the security policy to disk.
23
+ */
24
+ export function savePolicy(projectDir, policy) {
25
+ const dataDir = getSshDataDir(projectDir);
26
+ if (!existsSync(dataDir)) {
27
+ mkdirSync(dataDir, { recursive: true });
28
+ }
29
+ const filePath = join(dataDir, POLICY_FILE);
30
+ writeFileSync(filePath, JSON.stringify(policy, null, 2), "utf-8");
31
+ }
32
+ /**
33
+ * Get or create a default policy.
34
+ */
35
+ export function getPolicy(projectDir, mode = "full") {
36
+ const existing = loadPolicy(projectDir);
37
+ if (existing)
38
+ return existing;
39
+ const defaultPolicy = {
40
+ mode,
41
+ extraBlocklist: [],
42
+ customAllowlist: [],
43
+ updatedAt: new Date().toISOString(),
44
+ };
45
+ savePolicy(projectDir, defaultPolicy);
46
+ return defaultPolicy;
47
+ }
48
+ /**
49
+ * Add a pattern to the blocklist.
50
+ */
51
+ export function addBlocklistPattern(projectDir, pattern) {
52
+ const policy = getPolicy(projectDir);
53
+ if (policy.extraBlocklist.includes(pattern)) {
54
+ return policy;
55
+ }
56
+ policy.extraBlocklist.push(pattern);
57
+ policy.updatedAt = new Date().toISOString();
58
+ savePolicy(projectDir, policy);
59
+ return policy;
60
+ }
61
+ /**
62
+ * Remove a pattern from the blocklist.
63
+ */
64
+ export function removeBlocklistPattern(projectDir, pattern) {
65
+ const policy = getPolicy(projectDir);
66
+ policy.extraBlocklist = policy.extraBlocklist.filter((p) => p !== pattern);
67
+ policy.updatedAt = new Date().toISOString();
68
+ savePolicy(projectDir, policy);
69
+ return policy;
70
+ }
71
+ /**
72
+ * Add a pattern to the allowlist.
73
+ */
74
+ export function addAllowlistPattern(projectDir, pattern) {
75
+ const policy = getPolicy(projectDir);
76
+ if (policy.customAllowlist.includes(pattern)) {
77
+ return policy;
78
+ }
79
+ policy.customAllowlist.push(pattern);
80
+ policy.updatedAt = new Date().toISOString();
81
+ savePolicy(projectDir, policy);
82
+ return policy;
83
+ }
84
+ /**
85
+ * Remove a pattern from the allowlist.
86
+ */
87
+ export function removeAllowlistPattern(projectDir, pattern) {
88
+ const policy = getPolicy(projectDir);
89
+ policy.customAllowlist = policy.customAllowlist.filter((p) => p !== pattern);
90
+ policy.updatedAt = new Date().toISOString();
91
+ savePolicy(projectDir, policy);
92
+ return policy;
93
+ }
94
+ /**
95
+ * Format the current policy for display.
96
+ */
97
+ export function formatPolicy(policy) {
98
+ const lines = [
99
+ "## SSH Security Policy",
100
+ "",
101
+ `**Mode:** ${policy.mode}`,
102
+ `**Last updated:** ${policy.updatedAt}`,
103
+ "",
104
+ ];
105
+ if (policy.extraBlocklist.length > 0) {
106
+ lines.push("### Extra Blocklist Patterns");
107
+ for (const p of policy.extraBlocklist) {
108
+ lines.push(`- \`${p}\``);
109
+ }
110
+ lines.push("");
111
+ }
112
+ if (policy.customAllowlist.length > 0) {
113
+ lines.push("### Custom Allowlist Patterns");
114
+ for (const p of policy.customAllowlist) {
115
+ lines.push(`- \`${p}\``);
116
+ }
117
+ lines.push("");
118
+ }
119
+ lines.push("### Mode Description");
120
+ switch (policy.mode) {
121
+ case "full":
122
+ lines.push("All commands allowed except those in the blocklist.");
123
+ break;
124
+ case "restricted":
125
+ lines.push("Only commands in the allowlist + read-only commands are allowed.");
126
+ break;
127
+ case "read_only":
128
+ lines.push("Only read-only commands are allowed (ls, cat, grep, etc.).");
129
+ break;
130
+ }
131
+ return lines.join("\n");
132
+ }
133
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/security/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type CommandLevel } from "./blocklist.js";
2
+ import type { SecurityMode } from "../config/schema.js";
3
+ export type ValidationResult = {
4
+ /** Whether the command is safe to execute */
5
+ safe: boolean;
6
+ /** Danger level of the command */
7
+ level: CommandLevel | "not_in_allowlist";
8
+ /** Human-readable reason */
9
+ reason?: string;
10
+ /** The matched rule ID from blocklist */
11
+ matched_rule?: string;
12
+ /** Suggestions for safer alternatives */
13
+ suggestions?: string[];
14
+ };
15
+ /**
16
+ * Validate a command against the security policy.
17
+ *
18
+ * Validation order:
19
+ * 1. Check against destructive blocklist → ALWAYS BLOCKED (no exceptions)
20
+ * 2. Check against risky blocklist → requires permission prompt
21
+ * 3. In restricted/read_only mode, check against allowlist
22
+ */
23
+ export declare function validateCommand(command: string, mode: SecurityMode, extraBlocklist?: string[]): ValidationResult;
24
+ /**
25
+ * Check if a command is purely read-only (no side effects).
26
+ */
27
+ export declare function isReadOnlyCommand(command: string): boolean;
28
+ /**
29
+ * Format validation result for display.
30
+ */
31
+ export declare function formatValidationResult(result: ValidationResult): string;
32
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/security/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,YAAY,EAAuB,MAAM,gBAAgB,CAAA;AAEjH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,6CAA6C;IAC7C,IAAI,EAAE,OAAO,CAAA;IACb,kCAAkC;IAClC,KAAK,EAAE,YAAY,GAAG,kBAAkB,CAAA;IACxC,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,EAClB,cAAc,GAAE,MAAM,EAAO,GAC5B,gBAAgB,CA0DlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAuD1D;AAeD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAmBvE"}