dsh-ssh-tui 0.5.2 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +36 -6
- package/README.md +24 -13
- package/lib/approval-reviewer.js +102 -17
- package/lib/approval-reviewer.js.map +1 -1
- package/lib/auto-approval.js +312 -29
- package/lib/auto-approval.js.map +1 -1
- package/lib/footer.js +337 -0
- package/lib/footer.js.map +1 -0
- package/lib/i18n/en.js +83 -8
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/index.js +1 -0
- package/lib/i18n/index.js.map +1 -1
- package/lib/i18n/zh.js +83 -8
- package/lib/i18n/zh.js.map +1 -1
- package/lib/json-args.js +30 -0
- package/lib/json-args.js.map +1 -0
- package/lib/paint.js +262 -0
- package/lib/paint.js.map +1 -0
- package/lib/picker.js +407 -56
- package/lib/picker.js.map +1 -1
- package/lib/plan.js +369 -0
- package/lib/plan.js.map +1 -0
- package/lib/quota.js +408 -0
- package/lib/quota.js.map +1 -0
- package/lib/session-list.js +18 -21
- package/lib/session-list.js.map +1 -1
- package/lib/term-text.js +827 -0
- package/lib/term-text.js.map +1 -0
- package/lib/tool-present.js +744 -0
- package/lib/tool-present.js.map +1 -0
- package/lib/transcript-types.js +6 -0
- package/lib/transcript-types.js.map +1 -0
- package/lib/tui.js +747 -3077
- package/lib/tui.js.map +1 -1
- package/lib/types/approval-reviewer.d.ts +18 -4
- package/lib/types/auto-approval.d.ts +53 -2
- package/lib/types/footer.d.ts +155 -0
- package/lib/types/i18n/index.d.ts +2 -0
- package/lib/types/json-args.d.ts +7 -0
- package/lib/types/paint.d.ts +78 -0
- package/lib/types/picker.d.ts +99 -7
- package/lib/types/plan.d.ts +80 -0
- package/lib/types/quota.d.ts +94 -0
- package/lib/types/session-list.d.ts +13 -0
- package/lib/types/term-text.d.ts +130 -0
- package/lib/types/tool-present.d.ts +165 -0
- package/lib/types/transcript-types.d.ts +152 -0
- package/lib/types/tui.d.ts +39 -665
- package/package.json +1 -1
package/lib/auto-approval.js
CHANGED
|
@@ -9,21 +9,28 @@
|
|
|
9
9
|
* a rejection when nobody is watching. Real damage containment still comes
|
|
10
10
|
* from the sandbox preset and git.
|
|
11
11
|
*/
|
|
12
|
+
import { parseJsonArgs } from './json-args.js';
|
|
12
13
|
/**
|
|
13
|
-
* Whole-command danger patterns, checked before anything else. A match
|
|
14
|
-
*
|
|
14
|
+
* Whole-command danger patterns, checked before anything else. A match
|
|
15
|
+
* auto-rejects. This is a UX heuristic, not a security boundary: obfuscated
|
|
16
|
+
* or interpreter-wrapped damage still has to be contained by the sandbox.
|
|
17
|
+
*
|
|
18
|
+
* Interpreter `-c`/`-e` is NOT here: the table cannot see the payload, so
|
|
19
|
+
* those shapes ask (AI review) instead of a blanket deny.
|
|
15
20
|
*/
|
|
16
21
|
export const DANGER_PATTERNS = [
|
|
17
|
-
/(?:curl|wget)\b[^|;&]*\|\s*(?:sudo\s+)?(?:ba|z|da|k)?sh\b/,
|
|
18
|
-
/\
|
|
19
|
-
/\brm\s+[
|
|
22
|
+
/(?:curl|wget|fetch)\b[^|;&]*\|\s*(?:sudo\s+)?(?:ba|z|da|k|fi)?sh\b/,
|
|
23
|
+
/\beval\b[^|;&]*(?:\$\(|`)/,
|
|
24
|
+
/\brm\b(?:\s+[^\s;|&]+)*\s+-\w*[rf]/i,
|
|
25
|
+
/\brm\b(?:\s+[^\s;|&]+)*\s+--(?:recursive|force|dir)\b/i,
|
|
26
|
+
/\brm\s+(?:--\s+)?\/(?:\s|$)/,
|
|
20
27
|
/\bsudo\b/,
|
|
28
|
+
/\b(?:chmod|chown)\s+(?:-\w+\s+)*-R\b/,
|
|
21
29
|
/\bmkfs\.\w/,
|
|
22
30
|
/\bdd\b[^|;&]*of=\/dev\//,
|
|
23
|
-
/\b(?:shutdown|reboot)\b|\binit\s+[06]\b/,
|
|
24
|
-
/:\(\)\s*\{.*\};\s*:/,
|
|
31
|
+
/\b(?:shutdown|reboot|halt|poweroff)\b|\binit\s+[06]\b/,
|
|
32
|
+
/:\(\)\s*\{.*\};\s*:/,
|
|
25
33
|
/\bgit\s+push\b[^|;&]*(?:--force|\s-f\b|\s\+\S)/,
|
|
26
|
-
/\b(?:npm|pnpm|yarn)\s+publish\b/,
|
|
27
34
|
/\bfind\b[^|;&]*\s(?:-exec\b|-delete\b)/,
|
|
28
35
|
/>>?\s*\/dev\/(?:sd|nvme|hd)/,
|
|
29
36
|
/\bcrontab\s+-r\b/,
|
|
@@ -31,9 +38,10 @@ export const DANGER_PATTERNS = [
|
|
|
31
38
|
/**
|
|
32
39
|
* Segment-level allow patterns: low-risk, high-frequency reads, builds, and
|
|
33
40
|
* tests. A command auto-approves only when EVERY segment matches one of these.
|
|
41
|
+
* `env`/`printenv` stay off this list — process env often holds keys.
|
|
34
42
|
*/
|
|
35
43
|
export const ALLOW_SEGMENT_PATTERNS = [
|
|
36
|
-
/^(?:ls|cat|head|tail|wc|file|stat|du|df|which|whoami|pwd|date|
|
|
44
|
+
/^(?:ls|cat|head|tail|wc|file|stat|du|df|which|whoami|pwd|date|sleep|clear|true|false)\b/,
|
|
37
45
|
/^(?:grep|rg|fd|ag)\b/,
|
|
38
46
|
/^(?:git)\s+(?:status|log|diff|show|branch|remote|tag|rev-parse|blame|ls-files|describe|shortlog|worktree\s+list)\b/,
|
|
39
47
|
/^(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:test|build|lint|typecheck|check|ci)\b/,
|
|
@@ -47,55 +55,280 @@ export const ALLOW_SEGMENT_PATTERNS = [
|
|
|
47
55
|
/^(?:echo)\b/,
|
|
48
56
|
/^(?:mkdir|touch)\b/,
|
|
49
57
|
/^(?:tee)\b/,
|
|
58
|
+
/^(?:cp|mv|install)\b/,
|
|
59
|
+
/^(?:rm)\s+(?!-\w*[rf]|--(?:recursive|force|dir)\b)/,
|
|
50
60
|
];
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
const READ_SEGMENT = /^(?:ls|cat|head|tail|wc|file|stat|du|df|which|whoami|pwd|date|sleep|clear|true|false|grep|rg|fd|ag)\b/u;
|
|
62
|
+
const MUTATING_SEGMENT = /^(?:cp|mv|install|rm|mkdir|touch|tee|ln|chmod|chown)\b/u;
|
|
63
|
+
const SHELL_TOOL_NAMES = new Set(['bash', 'pwsh']);
|
|
64
|
+
const SAFE_NETWORK_TOOLS = new Set(['web_fetch', 'web_search']);
|
|
65
|
+
const WORKSPACE_FILE_TOOLS = new Set(['read', 'edit', 'write', 'str_replace_editor']);
|
|
66
|
+
const WORKSPACE_WRITE_ESCALATION = 'workspace-write';
|
|
67
|
+
const DANGER_ESCALATION = 'danger-full-access';
|
|
68
|
+
/**
|
|
69
|
+
* Split a shell command into segments at &&, ||, ; and | boundaries,
|
|
70
|
+
* skipping those operators when they sit inside quotes or a here-doc
|
|
71
|
+
* terminator. Nested quoting is best-effort — the sandbox still owns
|
|
72
|
+
* real damage containment.
|
|
73
|
+
*/
|
|
74
|
+
export function segments(command) {
|
|
75
|
+
const out = [];
|
|
76
|
+
let current = '';
|
|
77
|
+
let quote = null;
|
|
78
|
+
let escaped = false;
|
|
79
|
+
let hereDoc = null;
|
|
80
|
+
const chars = Array.from(command);
|
|
81
|
+
for (let i = 0; i < chars.length; i += 1) {
|
|
82
|
+
const ch = chars[i] ?? '';
|
|
83
|
+
if (hereDoc !== null) {
|
|
84
|
+
current += ch;
|
|
85
|
+
if (ch === '\n') {
|
|
86
|
+
const lineStart = current.lastIndexOf('\n', current.length - 2) + 1;
|
|
87
|
+
const line = current.slice(lineStart, -1).trim();
|
|
88
|
+
if (line === hereDoc)
|
|
89
|
+
hereDoc = null;
|
|
90
|
+
}
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (quote === null && escaped === false && ch === '\\') {
|
|
94
|
+
escaped = true;
|
|
95
|
+
current += ch;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (escaped) {
|
|
99
|
+
escaped = false;
|
|
100
|
+
current += ch;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (quote !== null) {
|
|
104
|
+
current += ch;
|
|
105
|
+
if (ch === quote)
|
|
106
|
+
quote = null;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (ch === "'" || ch === '"' || ch === '`') {
|
|
110
|
+
quote = ch;
|
|
111
|
+
current += ch;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (ch === '<' && chars[i + 1] === '<') {
|
|
115
|
+
const rest = chars.slice(i).join('');
|
|
116
|
+
const match = /^(<<[-]?[ \t]*)(?:\\)?(['"]?)(\w+)\2/u.exec(rest);
|
|
117
|
+
if (match !== null && match[3] !== undefined) {
|
|
118
|
+
hereDoc = match[3];
|
|
119
|
+
current += match[0];
|
|
120
|
+
i += match[0].length - 1;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if ((ch === '&' && chars[i + 1] === '&') || (ch === '|' && chars[i + 1] === '|')) {
|
|
125
|
+
pushSegment(out, current);
|
|
126
|
+
current = '';
|
|
127
|
+
i += 1;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (ch === ';' || ch === '|') {
|
|
131
|
+
pushSegment(out, current);
|
|
132
|
+
current = '';
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
current += ch;
|
|
136
|
+
}
|
|
137
|
+
pushSegment(out, current);
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
function pushSegment(out, raw) {
|
|
141
|
+
const trimmed = raw.trim();
|
|
142
|
+
if (trimmed !== '')
|
|
143
|
+
out.push(trimmed);
|
|
57
144
|
}
|
|
58
145
|
/** True when the segment redirects into an absolute filesystem path. */
|
|
59
146
|
function redirectsToRoot(segment) {
|
|
60
147
|
return /(?:^|\s)>>?\s*(?:\/(?!tmp\/|var\/tmp\/|home\/)|~)/u.test(segment);
|
|
61
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* System-sensitive paths. Matching is token-prefix-aware so `src/etc/config.ts`
|
|
151
|
+
* and `/root/project/lib/foo` do not count as `/etc` or `/lib`. `/root` itself
|
|
152
|
+
* (the root home) is sensitive; a workspace under `/root/…` is not.
|
|
153
|
+
*/
|
|
154
|
+
const SYSTEM_DIR = /^\/(?:etc|boot|usr|bin|sbin|lib|proc|sys|dev)(?:\/|$)/u;
|
|
155
|
+
const ROOT_HOME_SENSITIVE = /^\/root(?:\/(?:\.ssh|\.gnupg|\.npmrc|\.env|\.config)(?:\/|$)|$)/u;
|
|
156
|
+
const CREDENTIAL_LEAF = /(?:^|\/)(?:\.ssh|\.gnupg|\.npmrc|\.env|id_(?:rsa|ed25519)|\.config\/dsh-publish)(?:\/|$)/u;
|
|
157
|
+
export function touchesSensitivePath(text) {
|
|
158
|
+
return text.split(/\s+/u).some(tokenLooksSensitive);
|
|
159
|
+
}
|
|
160
|
+
function tokenLooksSensitive(token) {
|
|
161
|
+
const trimmed = token.replace(/^['"]|['"]$/gu, '');
|
|
162
|
+
if (trimmed === '')
|
|
163
|
+
return false;
|
|
164
|
+
if (trimmed.startsWith('~/') && CREDENTIAL_LEAF.test(trimmed.slice(1)))
|
|
165
|
+
return true;
|
|
166
|
+
if (SYSTEM_DIR.test(trimmed) || ROOT_HOME_SENSITIVE.test(trimmed))
|
|
167
|
+
return true;
|
|
168
|
+
if (/^\/var\/log(?:\/|$)/u.test(trimmed))
|
|
169
|
+
return true;
|
|
170
|
+
if (CREDENTIAL_LEAF.test(trimmed))
|
|
171
|
+
return true;
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
function segmentTouchesSensitivePath(segment) {
|
|
175
|
+
return segment.split(/\s+/u).some(tokenLooksSensitive);
|
|
176
|
+
}
|
|
177
|
+
const classified = (decision, risk, reasonKey) => ({ decision, risk, reasonKey });
|
|
62
178
|
/**
|
|
63
179
|
* Classify one shell command line. Danger anywhere auto-rejects; otherwise
|
|
64
180
|
* the command auto-approves only when every segment is a recognized low-risk
|
|
65
181
|
* pattern — unknown shapes ask (and detach to a rejection when unattended).
|
|
66
182
|
*/
|
|
67
183
|
export function classifyCommand(command) {
|
|
184
|
+
return classifyCommandDetailed(command).decision;
|
|
185
|
+
}
|
|
186
|
+
const INTERPRETER_WRAPPER = /^(?:python3?|node|nodejs|perl|ruby|php|lua|bash|sh|zsh)\s+-[ce]\b/u;
|
|
187
|
+
export function classifyCommandDetailed(command) {
|
|
68
188
|
const trimmed = command.trim();
|
|
69
189
|
if (trimmed === '')
|
|
70
|
-
return 'ask';
|
|
190
|
+
return classified('ask', 'medium', 'empty');
|
|
191
|
+
// Interpreter -c/-e payloads are opaque to the table. Ask (AI review)
|
|
192
|
+
// instead of denying because a quoted `rm -rf` happens to match DANGER_PATTERNS.
|
|
193
|
+
if (INTERPRETER_WRAPPER.test(trimmed))
|
|
194
|
+
return classified('ask', 'medium', 'unrecognized');
|
|
71
195
|
for (const pattern of DANGER_PATTERNS) {
|
|
72
196
|
if (pattern.test(trimmed))
|
|
73
|
-
return 'deny';
|
|
197
|
+
return classified('deny', 'high', 'dangerPattern');
|
|
74
198
|
}
|
|
75
199
|
const parts = segments(trimmed);
|
|
76
200
|
if (parts.length === 0)
|
|
77
|
-
return 'ask';
|
|
201
|
+
return classified('ask', 'medium', 'empty');
|
|
78
202
|
for (const segment of parts) {
|
|
79
203
|
if (redirectsToRoot(segment))
|
|
80
|
-
return 'deny';
|
|
81
|
-
|
|
82
|
-
|
|
204
|
+
return classified('deny', 'high', 'redirectRoot');
|
|
205
|
+
const sensitive = segmentTouchesSensitivePath(segment);
|
|
206
|
+
if (sensitive && (MUTATING_SEGMENT.test(segment) || READ_SEGMENT.test(segment))) {
|
|
207
|
+
return classified('deny', 'high', 'sensitivePath');
|
|
208
|
+
}
|
|
209
|
+
if (!ALLOW_SEGMENT_PATTERNS.some(pattern => pattern.test(segment))) {
|
|
210
|
+
return classified('ask', 'medium', 'unrecognized');
|
|
211
|
+
}
|
|
83
212
|
}
|
|
84
|
-
return 'allow';
|
|
213
|
+
return classified('allow', 'low', 'allowlist');
|
|
214
|
+
}
|
|
215
|
+
function looksLikePrivateUrl(url) {
|
|
216
|
+
const raw = url.trim();
|
|
217
|
+
if (raw === '')
|
|
218
|
+
return false;
|
|
219
|
+
if (/^(?:file|ftp):/iu.test(raw))
|
|
220
|
+
return true;
|
|
221
|
+
try {
|
|
222
|
+
const parsed = new URL(raw.includes('://') ? raw : `https://${raw}`);
|
|
223
|
+
const host = parsed.hostname.toLowerCase();
|
|
224
|
+
if (host === 'localhost' || host === '::1' || host.endsWith('.local'))
|
|
225
|
+
return true;
|
|
226
|
+
if (/^127\./u.test(host) || /^10\./u.test(host) || /^192\.168\./u.test(host) || /^172\.(1[6-9]|2\d|3[0-1])\./u.test(host)) {
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return /(?:localhost|127\.\d|192\.168\.|10\.\d)/u.test(raw);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function pathFromToolArgs(args) {
|
|
236
|
+
if (args === null)
|
|
237
|
+
return '';
|
|
238
|
+
for (const key of ['file_path', 'path', 'file']) {
|
|
239
|
+
const value = args[key];
|
|
240
|
+
if (typeof value === 'string' && value.trim() !== '')
|
|
241
|
+
return value;
|
|
242
|
+
}
|
|
243
|
+
return '';
|
|
244
|
+
}
|
|
245
|
+
function isWorkspacePath(filePath, workspaceCwd) {
|
|
246
|
+
const trimmed = filePath.trim();
|
|
247
|
+
if (trimmed === '')
|
|
248
|
+
return false;
|
|
249
|
+
if (trimmed.startsWith('~/') || trimmed === '~')
|
|
250
|
+
return false;
|
|
251
|
+
if (workspaceCwd !== undefined && workspaceCwd.trim() !== '') {
|
|
252
|
+
const cwd = workspaceCwd.replace(/\/+$/u, '');
|
|
253
|
+
if (trimmed === cwd || trimmed.startsWith(`${cwd}/`))
|
|
254
|
+
return true;
|
|
255
|
+
// Relative paths are workspace-relative for harness file tools.
|
|
256
|
+
if (!trimmed.startsWith('/'))
|
|
257
|
+
return true;
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
return !trimmed.startsWith('/');
|
|
261
|
+
}
|
|
262
|
+
function parseEscalation(reason, args) {
|
|
263
|
+
const fromArgs = typeof args?.sandbox_permissions === 'string' ? args.sandbox_permissions.trim() : '';
|
|
264
|
+
const justification = typeof args?.justification === 'string' ? args.justification.trim() : '';
|
|
265
|
+
if (fromArgs !== '')
|
|
266
|
+
return { requested: fromArgs, justification };
|
|
267
|
+
const match = reason?.match(/escalate sandbox to ([^\s:]+)/iu);
|
|
268
|
+
return {
|
|
269
|
+
requested: match?.[1],
|
|
270
|
+
justification: justification !== '' ? justification : (reason ?? '').trim(),
|
|
271
|
+
};
|
|
85
272
|
}
|
|
86
|
-
/** Tools whose output is read-only network information. */
|
|
87
|
-
const SAFE_NETWORK_TOOLS = new Set(['web_fetch', 'web_search']);
|
|
88
273
|
/**
|
|
89
274
|
* Classify one approval request. `command` is the decoded shell command when
|
|
90
275
|
* the pending call is a shell tool. 'deny' auto-rejects (the model reads the
|
|
91
276
|
* rejection and adapts); 'ask' falls through to the interactive prompt.
|
|
92
277
|
*/
|
|
93
278
|
export function classifyApproval(toolName, command) {
|
|
94
|
-
|
|
95
|
-
|
|
279
|
+
return classifyApprovalDetailed({ toolName, command }).decision;
|
|
280
|
+
}
|
|
281
|
+
export function classifyApprovalDetailed(input) {
|
|
282
|
+
const toolName = input.toolName;
|
|
283
|
+
const parsed = input.args !== undefined ? parseJsonArgs(input.args) : null;
|
|
284
|
+
const command = (input.command ?? (typeof parsed?.command === 'string' ? parsed.command : undefined));
|
|
285
|
+
const reason = input.reason;
|
|
286
|
+
const workspaceCwd = input.workspaceCwd;
|
|
287
|
+
if (SAFE_NETWORK_TOOLS.has(toolName)) {
|
|
288
|
+
const url = typeof parsed?.url === 'string' ? parsed.url
|
|
289
|
+
: typeof parsed?.query === 'string' ? parsed.query
|
|
290
|
+
: typeof parsed?.q === 'string' ? parsed.q
|
|
291
|
+
: command ?? '';
|
|
292
|
+
if (looksLikePrivateUrl(url) || /^file:/iu.test(url)) {
|
|
293
|
+
return classified('deny', 'high', 'privateUrl');
|
|
294
|
+
}
|
|
295
|
+
if (url.trim() === '')
|
|
296
|
+
return classified('allow', 'low', 'networkRead');
|
|
297
|
+
if (toolName === 'web_search')
|
|
298
|
+
return classified('allow', 'low', 'networkRead');
|
|
299
|
+
// Fetch of a public URL still asks — the page body is untrusted.
|
|
300
|
+
return classified('ask', 'medium', 'networkFetch');
|
|
301
|
+
}
|
|
302
|
+
if (WORKSPACE_FILE_TOOLS.has(toolName)) {
|
|
303
|
+
const filePath = pathFromToolArgs(parsed);
|
|
304
|
+
if (filePath !== '' && segmentTouchesSensitivePath(filePath)) {
|
|
305
|
+
return classified('deny', 'high', 'sensitivePath');
|
|
306
|
+
}
|
|
307
|
+
if (filePath !== '' && isWorkspacePath(filePath, workspaceCwd)) {
|
|
308
|
+
return classified('allow', 'low', 'workspaceFile');
|
|
309
|
+
}
|
|
310
|
+
return classified('ask', 'medium', 'unrecognized');
|
|
311
|
+
}
|
|
312
|
+
const escalation = parseEscalation(reason, parsed);
|
|
313
|
+
if (escalation.requested === WORKSPACE_WRITE_ESCALATION && escalation.justification !== '') {
|
|
314
|
+
return classified('allow', 'low', 'sandboxWiden');
|
|
315
|
+
}
|
|
316
|
+
if (escalation.requested === DANGER_ESCALATION) {
|
|
317
|
+
// Still classify the underlying command; danger-full-access is not a
|
|
318
|
+
// free pass, but a user-authorized home-directory probe should not be
|
|
319
|
+
// denied solely because it asked to widen.
|
|
320
|
+
if (command !== undefined && command.trim() !== '') {
|
|
321
|
+
const inner = classifyCommandDetailed(command);
|
|
322
|
+
if (inner.decision === 'allow')
|
|
323
|
+
return inner;
|
|
324
|
+
if (inner.decision === 'deny')
|
|
325
|
+
return inner;
|
|
326
|
+
}
|
|
327
|
+
return classified('ask', 'medium', 'sandboxDanger');
|
|
328
|
+
}
|
|
96
329
|
if (command === undefined || command.trim() === '')
|
|
97
|
-
return 'ask';
|
|
98
|
-
return
|
|
330
|
+
return classified('ask', 'medium', 'unrecognized');
|
|
331
|
+
return classifyCommandDetailed(command);
|
|
99
332
|
}
|
|
100
333
|
/**
|
|
101
334
|
* Decode the shell command of a streamed tool call from its raw JSON args.
|
|
@@ -112,13 +345,63 @@ export function commandFromArgs(toolName, args) {
|
|
|
112
345
|
return undefined;
|
|
113
346
|
}
|
|
114
347
|
}
|
|
348
|
+
function firstNonEmpty(...values) {
|
|
349
|
+
for (const value of values) {
|
|
350
|
+
if (value !== undefined && value.trim() !== '')
|
|
351
|
+
return value;
|
|
352
|
+
}
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Pull a shell command out of an approval-request `reason` when the
|
|
357
|
+
* classifier never saw the tool-call JSON (sandbox escalation, missing
|
|
358
|
+
* callId, or a card whose args were not recorded).
|
|
359
|
+
*/
|
|
360
|
+
export function commandFromApprovalReason(reason) {
|
|
361
|
+
if (reason === undefined)
|
|
362
|
+
return undefined;
|
|
363
|
+
const patterns = [
|
|
364
|
+
/(?:command|cmd|shell)\s*[:=]\s*((?:cp|mv|rm|mkdir|touch|cat|ls|install|tee|git|npm|pnpm|yarn|python3?|node)\b[^\n]+)/iu,
|
|
365
|
+
/(?:escalat\w+|提权|升权)[^\n]*:\s*((?:cp|mv|rm|mkdir|touch|cat|ls|install|tee)\b[^\n]+)/iu,
|
|
366
|
+
/(?:run|running|执行)\s*[`'"]([^`'"]+)[`'"]/iu,
|
|
367
|
+
/\$\s+([^\n]+)/u,
|
|
368
|
+
/(?:^|[\s:])((?:cp|mv|rm|mkdir|touch|cat|ls|install|tee)\b[^\n]+)/iu,
|
|
369
|
+
];
|
|
370
|
+
for (const pattern of patterns) {
|
|
371
|
+
const match = reason.match(pattern);
|
|
372
|
+
const command = match?.[1]?.trim().replace(/^[`'"]|[`'"]$/gu, '');
|
|
373
|
+
if (command !== undefined && command !== '' && /\s/u.test(command))
|
|
374
|
+
return command;
|
|
375
|
+
}
|
|
376
|
+
const trimmed = reason.trim();
|
|
377
|
+
if (/^(?:cp|mv|rm|mkdir|touch|cat|ls|chmod|chown|install|tee)\b/u.test(trimmed))
|
|
378
|
+
return trimmed;
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Resolve the command the classifier should see for one approval request.
|
|
383
|
+
* Prefer the streamed bash/pwsh card, then a command already decoded on the
|
|
384
|
+
* card, then the request's reason text.
|
|
385
|
+
*/
|
|
386
|
+
export function commandForApprovalRequest(input) {
|
|
387
|
+
const fromRow = input.row === undefined
|
|
388
|
+
? undefined
|
|
389
|
+
: firstNonEmpty(commandFromArgs(input.row.name, input.row.args), SHELL_TOOL_NAMES.has(input.row.name) ? input.row.command : undefined);
|
|
390
|
+
const fromReason = commandFromApprovalReason(input.reason);
|
|
391
|
+
return firstNonEmpty(fromRow, SHELL_TOOL_NAMES.has(input.toolName) ? fromReason : undefined);
|
|
392
|
+
}
|
|
115
393
|
/** Parse the /approval argument into a mode. */
|
|
116
394
|
export function parseAutoApprovalMode(raw) {
|
|
117
395
|
const id = raw.trim().toLowerCase();
|
|
118
|
-
if (id === 'auto')
|
|
396
|
+
if (id === 'auto' || id === 'on')
|
|
119
397
|
return 'auto';
|
|
120
398
|
if (id === 'off' || id === 'ask' || id === 'manual')
|
|
121
399
|
return 'off';
|
|
122
400
|
return undefined;
|
|
123
401
|
}
|
|
402
|
+
/** True when `/approval <arg>` should print the current mode and counters. */
|
|
403
|
+
export function isApprovalStatusArg(raw) {
|
|
404
|
+
const id = raw.trim().toLowerCase();
|
|
405
|
+
return id === 'status' || id === 'stat' || id === 'info' || id === 'show';
|
|
406
|
+
}
|
|
124
407
|
//# sourceMappingURL=auto-approval.js.map
|
package/lib/auto-approval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-approval.js","sourceRoot":"","sources":["../src/auto-approval.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auto-approval.js","sourceRoot":"","sources":["../src/auto-approval.ts"],"names":[],"mappings":"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"}
|