dsh-ssh-tui 0.5.3 → 0.5.5
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 -10
- package/README.md +21 -12
- package/lib/approval-reviewer.js +56 -15
- package/lib/approval-reviewer.js.map +1 -1
- package/lib/auto-approval.js +251 -35
- package/lib/auto-approval.js.map +1 -1
- package/lib/copy-text.js +62 -0
- package/lib/copy-text.js.map +1 -0
- package/lib/dsh-compat.js +142 -1
- package/lib/dsh-compat.js.map +1 -1
- package/lib/footer.js +337 -0
- package/lib/footer.js.map +1 -0
- package/lib/i18n/en.js +62 -3
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/zh.js +62 -3
- package/lib/i18n/zh.js.map +1 -1
- package/lib/index.js +7 -5
- package/lib/index.js.map +1 -1
- package/lib/json-args.js +30 -0
- package/lib/json-args.js.map +1 -0
- package/lib/paint.js +288 -0
- package/lib/paint.js.map +1 -0
- package/lib/picker.js +453 -66
- 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-index.js +80 -0
- package/lib/session-index.js.map +1 -0
- package/lib/session-list.js +210 -88
- package/lib/session-list.js.map +1 -1
- package/lib/term-text.js +953 -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 +643 -3299
- package/lib/tui.js.map +1 -1
- package/lib/types/approval-reviewer.d.ts +8 -2
- package/lib/types/auto-approval.d.ts +28 -0
- package/lib/types/copy-text.d.ts +9 -0
- package/lib/types/dsh-compat.d.ts +78 -6
- package/lib/types/footer.d.ts +155 -0
- package/lib/types/json-args.d.ts +7 -0
- package/lib/types/paint.d.ts +80 -0
- package/lib/types/picker.d.ts +101 -7
- package/lib/types/plan.d.ts +80 -0
- package/lib/types/quota.d.ts +94 -0
- package/lib/types/session-index.d.ts +32 -0
- package/lib/types/session-list.d.ts +35 -2
- package/lib/types/term-text.d.ts +149 -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 +53 -723
- package/package.json +20 -18
package/lib/auto-approval.js
CHANGED
|
@@ -9,16 +9,20 @@
|
|
|
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
14
|
* Whole-command danger patterns, checked before anything else. A match
|
|
14
15
|
* auto-rejects. This is a UX heuristic, not a security boundary: obfuscated
|
|
15
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.
|
|
16
20
|
*/
|
|
17
21
|
export const DANGER_PATTERNS = [
|
|
18
22
|
/(?:curl|wget|fetch)\b[^|;&]*\|\s*(?:sudo\s+)?(?:ba|z|da|k|fi)?sh\b/,
|
|
19
23
|
/\beval\b[^|;&]*(?:\$\(|`)/,
|
|
20
|
-
/\brm\s+
|
|
21
|
-
/\brm\s+
|
|
24
|
+
/\brm\b(?:\s+[^\s;|&]+)*\s+-\w*[rf]/i,
|
|
25
|
+
/\brm\b(?:\s+[^\s;|&]+)*\s+--(?:recursive|force|dir)\b/i,
|
|
22
26
|
/\brm\s+(?:--\s+)?\/(?:\s|$)/,
|
|
23
27
|
/\bsudo\b/,
|
|
24
28
|
/\b(?:chmod|chown)\s+(?:-\w+\s+)*-R\b/,
|
|
@@ -27,20 +31,17 @@ export const DANGER_PATTERNS = [
|
|
|
27
31
|
/\b(?:shutdown|reboot|halt|poweroff)\b|\binit\s+[06]\b/,
|
|
28
32
|
/:\(\)\s*\{.*\};\s*:/,
|
|
29
33
|
/\bgit\s+push\b[^|;&]*(?:--force|\s-f\b|\s\+\S)/,
|
|
30
|
-
/\b(?:npm|pnpm|yarn)\s+publish\b/,
|
|
31
34
|
/\bfind\b[^|;&]*\s(?:-exec\b|-delete\b)/,
|
|
32
35
|
/>>?\s*\/dev\/(?:sd|nvme|hd)/,
|
|
33
36
|
/\bcrontab\s+-r\b/,
|
|
34
|
-
/\b(?:python3?|node|nodejs|perl|ruby|php|lua)\s+-c\b/,
|
|
35
|
-
/\b(?:python3?|node|nodejs|perl|ruby)\s+-e\b/,
|
|
36
|
-
/\bbash\s+-c\b|\bsh\s+-c\b/,
|
|
37
37
|
];
|
|
38
38
|
/**
|
|
39
39
|
* Segment-level allow patterns: low-risk, high-frequency reads, builds, and
|
|
40
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.
|
|
41
42
|
*/
|
|
42
43
|
export const ALLOW_SEGMENT_PATTERNS = [
|
|
43
|
-
/^(?: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/,
|
|
44
45
|
/^(?:grep|rg|fd|ag)\b/,
|
|
45
46
|
/^(?:git)\s+(?:status|log|diff|show|branch|remote|tag|rev-parse|blame|ls-files|describe|shortlog|worktree\s+list)\b/,
|
|
46
47
|
/^(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:test|build|lint|typecheck|check|ci)\b/,
|
|
@@ -57,62 +58,277 @@ export const ALLOW_SEGMENT_PATTERNS = [
|
|
|
57
58
|
/^(?:cp|mv|install)\b/,
|
|
58
59
|
/^(?:rm)\s+(?!-\w*[rf]|--(?:recursive|force|dir)\b)/,
|
|
59
60
|
];
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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);
|
|
66
144
|
}
|
|
67
145
|
/** True when the segment redirects into an absolute filesystem path. */
|
|
68
146
|
function redirectsToRoot(segment) {
|
|
69
147
|
return /(?:^|\s)>>?\s*(?:\/(?!tmp\/|var\/tmp\/|home\/)|~)/u.test(segment);
|
|
70
148
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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);
|
|
76
176
|
}
|
|
177
|
+
const classified = (decision, risk, reasonKey) => ({ decision, risk, reasonKey });
|
|
77
178
|
/**
|
|
78
179
|
* Classify one shell command line. Danger anywhere auto-rejects; otherwise
|
|
79
180
|
* the command auto-approves only when every segment is a recognized low-risk
|
|
80
181
|
* pattern — unknown shapes ask (and detach to a rejection when unattended).
|
|
81
182
|
*/
|
|
82
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) {
|
|
83
188
|
const trimmed = command.trim();
|
|
84
189
|
if (trimmed === '')
|
|
85
|
-
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');
|
|
86
195
|
for (const pattern of DANGER_PATTERNS) {
|
|
87
196
|
if (pattern.test(trimmed))
|
|
88
|
-
return 'deny';
|
|
197
|
+
return classified('deny', 'high', 'dangerPattern');
|
|
89
198
|
}
|
|
90
199
|
const parts = segments(trimmed);
|
|
91
200
|
if (parts.length === 0)
|
|
92
|
-
return 'ask';
|
|
201
|
+
return classified('ask', 'medium', 'empty');
|
|
93
202
|
for (const segment of parts) {
|
|
94
203
|
if (redirectsToRoot(segment))
|
|
95
|
-
return 'deny';
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
+
}
|
|
100
212
|
}
|
|
101
|
-
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
|
+
};
|
|
102
272
|
}
|
|
103
|
-
/** Tools whose output is read-only network information. */
|
|
104
|
-
const SAFE_NETWORK_TOOLS = new Set(['web_fetch', 'web_search']);
|
|
105
273
|
/**
|
|
106
274
|
* Classify one approval request. `command` is the decoded shell command when
|
|
107
275
|
* the pending call is a shell tool. 'deny' auto-rejects (the model reads the
|
|
108
276
|
* rejection and adapts); 'ask' falls through to the interactive prompt.
|
|
109
277
|
*/
|
|
110
278
|
export function classifyApproval(toolName, command) {
|
|
111
|
-
|
|
112
|
-
|
|
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
|
+
}
|
|
113
329
|
if (command === undefined || command.trim() === '')
|
|
114
|
-
return 'ask';
|
|
115
|
-
return
|
|
330
|
+
return classified('ask', 'medium', 'unrecognized');
|
|
331
|
+
return classifyCommandDetailed(command);
|
|
116
332
|
}
|
|
117
333
|
/**
|
|
118
334
|
* Decode the shell command of a streamed tool call from its raw JSON args.
|
|
@@ -129,7 +345,6 @@ export function commandFromArgs(toolName, args) {
|
|
|
129
345
|
return undefined;
|
|
130
346
|
}
|
|
131
347
|
}
|
|
132
|
-
const SHELL_TOOL_NAMES = new Set(['bash', 'pwsh']);
|
|
133
348
|
function firstNonEmpty(...values) {
|
|
134
349
|
for (const value of values) {
|
|
135
350
|
if (value !== undefined && value.trim() !== '')
|
|
@@ -172,7 +387,8 @@ export function commandForApprovalRequest(input) {
|
|
|
172
387
|
const fromRow = input.row === undefined
|
|
173
388
|
? undefined
|
|
174
389
|
: firstNonEmpty(commandFromArgs(input.row.name, input.row.args), SHELL_TOOL_NAMES.has(input.row.name) ? input.row.command : undefined);
|
|
175
|
-
|
|
390
|
+
const fromReason = commandFromApprovalReason(input.reason);
|
|
391
|
+
return firstNonEmpty(fromRow, SHELL_TOOL_NAMES.has(input.toolName) ? fromReason : undefined);
|
|
176
392
|
}
|
|
177
393
|
/** Parse the /approval argument into a mode. */
|
|
178
394
|
export function parseAutoApprovalMode(raw) {
|
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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"}
|
package/lib/copy-text.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain-text extraction for /copy. Kept off tui.ts so tests do not load SshTui.
|
|
3
|
+
*/
|
|
4
|
+
function clipCopy(text, maxChars = 80_000) {
|
|
5
|
+
const trimmed = text.replace(/\s+$/u, '');
|
|
6
|
+
if (trimmed.length <= maxChars)
|
|
7
|
+
return trimmed;
|
|
8
|
+
return `${trimmed.slice(0, maxChars)}\n…`;
|
|
9
|
+
}
|
|
10
|
+
export function copyTextFromRow(row) {
|
|
11
|
+
if (row === undefined)
|
|
12
|
+
return '';
|
|
13
|
+
switch (row.kind) {
|
|
14
|
+
case 'assistant':
|
|
15
|
+
case 'user':
|
|
16
|
+
case 'reasoning':
|
|
17
|
+
case 'system':
|
|
18
|
+
case 'error':
|
|
19
|
+
case 'brand':
|
|
20
|
+
return clipCopy(row.text);
|
|
21
|
+
case 'tool': {
|
|
22
|
+
const parts = [
|
|
23
|
+
row.command ?? '',
|
|
24
|
+
row.summary,
|
|
25
|
+
row.output,
|
|
26
|
+
].filter(part => part.trim() !== '');
|
|
27
|
+
return clipCopy(parts.join('\n'));
|
|
28
|
+
}
|
|
29
|
+
case 'plan':
|
|
30
|
+
return clipCopy([
|
|
31
|
+
row.planMarkdown ?? '',
|
|
32
|
+
...row.todos.map(item => `- [${item.status}] ${item.content}`),
|
|
33
|
+
].filter(part => part.trim() !== '').join('\n'));
|
|
34
|
+
case 'question':
|
|
35
|
+
return clipCopy([row.header, row.detail, row.summary].filter(part => part !== undefined && part.trim() !== '').join('\n'));
|
|
36
|
+
case 'goal':
|
|
37
|
+
return clipCopy([row.objective, row.blockedReason ?? ''].filter(part => part.trim() !== '').join('\n'));
|
|
38
|
+
case 'prompt':
|
|
39
|
+
return clipCopy(row.text);
|
|
40
|
+
case 'subagent':
|
|
41
|
+
return clipCopy(row.logs.map(entry => entry.text).filter(text => text.trim() !== '').join('\n'));
|
|
42
|
+
case 'compaction':
|
|
43
|
+
return clipCopy([row.summary, row.error].filter(part => part !== undefined && part.trim() !== '').join('\n'));
|
|
44
|
+
case 'streaming-reasoning':
|
|
45
|
+
return '';
|
|
46
|
+
default:
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function copyTextFromTranscript(rows, focused) {
|
|
51
|
+
const focusedText = copyTextFromRow(focused ?? undefined);
|
|
52
|
+
if (focusedText.trim() !== '')
|
|
53
|
+
return { text: focusedText, source: 'focused' };
|
|
54
|
+
for (let i = rows.length - 1; i >= 0; i -= 1) {
|
|
55
|
+
const row = rows[i];
|
|
56
|
+
if (row?.kind === 'assistant' && row.text.trim() !== '') {
|
|
57
|
+
return { text: clipCopy(row.text), source: 'assistant' };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { text: '', source: 'empty' };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=copy-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-text.js","sourceRoot":"","sources":["../src/copy-text.ts"],"names":[],"mappings":"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"}
|
package/lib/dsh-compat.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as dshSettings from '@deepseek-ai/dsh-settings';
|
|
2
2
|
/**
|
|
3
|
-
* 0.1.1-rc.2 wraps namespaces via `settingsNamespace()`; 0.1.2 brands them at
|
|
3
|
+
* 0.1.1-rc.2 wraps namespaces via `settingsNamespace()`; 0.1.2+ brands them at
|
|
4
4
|
* the type level and takes the plain string at runtime. A cast covers both.
|
|
5
5
|
*/
|
|
6
6
|
export function settingsNamespace(value) {
|
|
@@ -42,4 +42,145 @@ export function sessionEvents(session) {
|
|
|
42
42
|
return host.snapshotEvents();
|
|
43
43
|
return host.events ?? [];
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Walk the durable log without copying it. Prefer `eventAt` so resume does
|
|
47
|
+
* not materialize a second array of every chunk.
|
|
48
|
+
*/
|
|
49
|
+
export function forEachSessionEvent(session, visit) {
|
|
50
|
+
const host = session;
|
|
51
|
+
if (typeof host.eventAt === 'function' && typeof host.seq === 'number') {
|
|
52
|
+
const length = host.seq;
|
|
53
|
+
for (let seq = 0; seq < length; seq += 1) {
|
|
54
|
+
const event = host.eventAt(seq);
|
|
55
|
+
if (event !== undefined)
|
|
56
|
+
visit(event);
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const event of sessionEvents(host))
|
|
61
|
+
visit(event);
|
|
62
|
+
}
|
|
63
|
+
function asHeader(value) {
|
|
64
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
65
|
+
return undefined;
|
|
66
|
+
const record = value;
|
|
67
|
+
if (typeof record.id === 'string' && typeof record.createdAt === 'number') {
|
|
68
|
+
return record;
|
|
69
|
+
}
|
|
70
|
+
if (record.header !== undefined)
|
|
71
|
+
return asHeader(record.header);
|
|
72
|
+
if (record.meta !== undefined)
|
|
73
|
+
return asHeader(record.meta);
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 0.1.2 `list()` returns headers; 0.1.5 returns `{ header, revision, … }`
|
|
78
|
+
* snapshots. Normalize to headers so the picker does not care which host
|
|
79
|
+
* it is talking to.
|
|
80
|
+
*/
|
|
81
|
+
export async function listPersistenceHeaders(persistence) {
|
|
82
|
+
const host = persistence;
|
|
83
|
+
if (typeof host.list !== 'function')
|
|
84
|
+
return [];
|
|
85
|
+
const listed = await host.list();
|
|
86
|
+
if (!Array.isArray(listed))
|
|
87
|
+
return [];
|
|
88
|
+
const headers = [];
|
|
89
|
+
for (const item of listed) {
|
|
90
|
+
const header = asHeader(item);
|
|
91
|
+
if (header !== undefined)
|
|
92
|
+
headers.push(header);
|
|
93
|
+
}
|
|
94
|
+
return headers;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 0.1.2 `inspect(id)` returns `{ meta, events }`. 0.1.5 dropped inspect in
|
|
98
|
+
* favour of `open(id, 'read')` + `handle.read()`. Close the handle so a
|
|
99
|
+
* listing pass does not pin write ownership.
|
|
100
|
+
*/
|
|
101
|
+
export async function inspectPersistenceSession(persistence, id) {
|
|
102
|
+
const host = persistence;
|
|
103
|
+
if (typeof host.inspect === 'function') {
|
|
104
|
+
const inspection = await host.inspect(id);
|
|
105
|
+
const events = inspection?.events ?? [];
|
|
106
|
+
return { events, meta: asHeader(inspection), header: asHeader(inspection) };
|
|
107
|
+
}
|
|
108
|
+
if (typeof host.open !== 'function') {
|
|
109
|
+
throw new Error('dsh-session-persistence: neither inspect nor open is available');
|
|
110
|
+
}
|
|
111
|
+
const handle = await host.open(id, 'read');
|
|
112
|
+
try {
|
|
113
|
+
const slice = typeof handle.read === 'function' ? await handle.read() : { events: [] };
|
|
114
|
+
return {
|
|
115
|
+
events: slice.events ?? [],
|
|
116
|
+
header: handle.header,
|
|
117
|
+
meta: handle.header,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
if (typeof handle.close === 'function') {
|
|
122
|
+
try {
|
|
123
|
+
await handle.close();
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Listing must not fail because a read handle's teardown raced.
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** 0.1.2 owns `locate(header)`; 0.1.5 hid it on the JSONL backend. */
|
|
132
|
+
export function persistenceLocate(persistence, meta) {
|
|
133
|
+
const locate = persistence.locate;
|
|
134
|
+
if (typeof locate !== 'function')
|
|
135
|
+
return undefined;
|
|
136
|
+
return locate(meta);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 0.1.2 command input advertised `images`; 0.1.5 renamed the flag to
|
|
140
|
+
* `attachments`. Either true means the slash command accepts composer files.
|
|
141
|
+
*/
|
|
142
|
+
export function commandAcceptsAttachments(input) {
|
|
143
|
+
if (input === null || typeof input !== 'object')
|
|
144
|
+
return false;
|
|
145
|
+
const record = input;
|
|
146
|
+
return record.images === true || record.attachments === true;
|
|
147
|
+
}
|
|
148
|
+
/** Durable `assistant/chunk` payload, or a live stream frame's inner chunk. */
|
|
149
|
+
export function streamChunkOf(eventOrFrame) {
|
|
150
|
+
if (eventOrFrame === null || typeof eventOrFrame !== 'object')
|
|
151
|
+
return undefined;
|
|
152
|
+
const record = eventOrFrame;
|
|
153
|
+
const chunk = record.data?.chunk ?? (record.type === 'chunk' ? record.chunk : undefined);
|
|
154
|
+
if (chunk === undefined || typeof chunk.type !== 'string')
|
|
155
|
+
return undefined;
|
|
156
|
+
const turn = record.data?.turn ?? record.turn;
|
|
157
|
+
const step = record.data?.step ?? record.step;
|
|
158
|
+
const time = record.time;
|
|
159
|
+
return {
|
|
160
|
+
chunk,
|
|
161
|
+
turn: typeof turn === 'number' ? turn : 0,
|
|
162
|
+
step: typeof step === 'number' ? step : 0,
|
|
163
|
+
time: typeof time === 'number' ? time : 0,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** Durable event type as a plain string so 0.1.5 hosts can omit `assistant/chunk`. */
|
|
167
|
+
export function sessionEventType(event) {
|
|
168
|
+
if (event === null || typeof event !== 'object')
|
|
169
|
+
return '';
|
|
170
|
+
const type = event.type;
|
|
171
|
+
return typeof type === 'string' ? type : '';
|
|
172
|
+
}
|
|
173
|
+
/** True when this event is a live-or-durable assistant token that replay should skip. */
|
|
174
|
+
export function isAssistantStreamEvent(event) {
|
|
175
|
+
const type = sessionEventType(event);
|
|
176
|
+
return type === 'assistant/chunk' || type === 'assistant/attempt';
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Subscribe to a host event that may not exist on the compile-time Events
|
|
180
|
+
* map. 0.1.5 emits `agent/assistant-stream`; 0.1.2 never does. Cordis
|
|
181
|
+
* still accepts the string; the listener is simply never called on 0.1.2.
|
|
182
|
+
*/
|
|
183
|
+
export function listenHostEvent(ctx, event, handler) {
|
|
184
|
+
return ctx.on(event, handler);
|
|
185
|
+
}
|
|
45
186
|
//# sourceMappingURL=dsh-compat.js.map
|
package/lib/dsh-compat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsh-compat.js","sourceRoot":"","sources":["../src/dsh-compat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dsh-compat.js","sourceRoot":"","sources":["../src/dsh-compat.ts"],"names":[],"mappings":"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"}
|