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.
Files changed (57) hide show
  1. package/README.en.md +36 -10
  2. package/README.md +21 -12
  3. package/lib/approval-reviewer.js +56 -15
  4. package/lib/approval-reviewer.js.map +1 -1
  5. package/lib/auto-approval.js +251 -35
  6. package/lib/auto-approval.js.map +1 -1
  7. package/lib/copy-text.js +62 -0
  8. package/lib/copy-text.js.map +1 -0
  9. package/lib/dsh-compat.js +142 -1
  10. package/lib/dsh-compat.js.map +1 -1
  11. package/lib/footer.js +337 -0
  12. package/lib/footer.js.map +1 -0
  13. package/lib/i18n/en.js +62 -3
  14. package/lib/i18n/en.js.map +1 -1
  15. package/lib/i18n/zh.js +62 -3
  16. package/lib/i18n/zh.js.map +1 -1
  17. package/lib/index.js +7 -5
  18. package/lib/index.js.map +1 -1
  19. package/lib/json-args.js +30 -0
  20. package/lib/json-args.js.map +1 -0
  21. package/lib/paint.js +288 -0
  22. package/lib/paint.js.map +1 -0
  23. package/lib/picker.js +453 -66
  24. package/lib/picker.js.map +1 -1
  25. package/lib/plan.js +369 -0
  26. package/lib/plan.js.map +1 -0
  27. package/lib/quota.js +408 -0
  28. package/lib/quota.js.map +1 -0
  29. package/lib/session-index.js +80 -0
  30. package/lib/session-index.js.map +1 -0
  31. package/lib/session-list.js +210 -88
  32. package/lib/session-list.js.map +1 -1
  33. package/lib/term-text.js +953 -0
  34. package/lib/term-text.js.map +1 -0
  35. package/lib/tool-present.js +744 -0
  36. package/lib/tool-present.js.map +1 -0
  37. package/lib/transcript-types.js +6 -0
  38. package/lib/transcript-types.js.map +1 -0
  39. package/lib/tui.js +643 -3299
  40. package/lib/tui.js.map +1 -1
  41. package/lib/types/approval-reviewer.d.ts +8 -2
  42. package/lib/types/auto-approval.d.ts +28 -0
  43. package/lib/types/copy-text.d.ts +9 -0
  44. package/lib/types/dsh-compat.d.ts +78 -6
  45. package/lib/types/footer.d.ts +155 -0
  46. package/lib/types/json-args.d.ts +7 -0
  47. package/lib/types/paint.d.ts +80 -0
  48. package/lib/types/picker.d.ts +101 -7
  49. package/lib/types/plan.d.ts +80 -0
  50. package/lib/types/quota.d.ts +94 -0
  51. package/lib/types/session-index.d.ts +32 -0
  52. package/lib/types/session-list.d.ts +35 -2
  53. package/lib/types/term-text.d.ts +149 -0
  54. package/lib/types/tool-present.d.ts +165 -0
  55. package/lib/types/transcript-types.d.ts +152 -0
  56. package/lib/types/tui.d.ts +53 -723
  57. package/package.json +20 -18
@@ -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+(?:-\w+\s+)*-\w*[rf]/i,
21
- /\brm\s+(?:-\w+\s+)*--(?:recursive|force|dir)\b/i,
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|env|printenv|sleep|clear|true|false)\b/,
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
- /** Split a shell command into segments at &&, ||, ; and | boundaries. */
61
- function segments(command) {
62
- return command
63
- .split(/(?:\|\||&&|;|\|)/u)
64
- .map(segment => segment.trim())
65
- .filter(segment => segment !== '');
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
- const MUTATING_SEGMENT = /^(?:cp|mv|install|rm|mkdir|touch|tee)\b/u;
72
- /** System-sensitive paths the reviewer also rejects; mutating allowlist must not skip them. */
73
- const SENSITIVE_PATH = /(?:^|[\s"'=])(?:~\/(?:\.ssh|\.gnupg)(?:\/|$)|\/(?:etc|boot|usr|bin|sbin|lib|root|proc|sys|dev)(?:\/|$|\s)|\/var\/log(?:\/|$|\s)|(?:^|\/)\.env(?:\b|$)|(?:^|\/)id_(?:rsa|ed25519)(?:\b|$))/u;
74
- function touchesSensitivePath(segment) {
75
- return SENSITIVE_PATH.test(segment);
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
- if (MUTATING_SEGMENT.test(segment) && touchesSensitivePath(segment))
97
- return 'deny';
98
- if (!ALLOW_SEGMENT_PATTERNS.some(pattern => pattern.test(segment)))
99
- return 'ask';
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
- if (SAFE_NETWORK_TOOLS.has(toolName))
112
- return 'allow';
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 classifyCommand(command);
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
- return firstNonEmpty(fromRow, SHELL_TOOL_NAMES.has(input.toolName) ? commandFromApprovalReason(input.reason) : undefined, commandFromApprovalReason(input.reason));
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"auto-approval.js","sourceRoot":"","sources":["../src/auto-approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC,oEAAoE;IACpE,2BAA2B;IAC3B,8BAA8B;IAC9B,iDAAiD;IACjD,6BAA6B;IAC7B,UAAU;IACV,sCAAsC;IACtC,YAAY;IACZ,yBAAyB;IACzB,uDAAuD;IACvD,qBAAqB;IACrB,gDAAgD;IAChD,iCAAiC;IACjC,wCAAwC;IACxC,6BAA6B;IAC7B,kBAAkB;IAClB,qDAAqD;IACrD,6CAA6C;IAC7C,2BAA2B;CAC5B,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAa;IAC9C,sGAAsG;IACtG,sBAAsB;IACtB,oHAAoH;IACpH,8EAA8E;IAC9E,wEAAwE;IACxE,8DAA8D;IAC9D,+BAA+B;IAC/B,mDAAmD;IACnD,mDAAmD;IACnD,sBAAsB;IACtB,wFAAwF;IACxF,aAAa;IACb,oBAAoB;IACpB,YAAY;IACZ,sBAAsB;IACtB,oDAAoD;CACrD,CAAA;AAED,yEAAyE;AACzE,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,OAAO;SACX,KAAK,CAAC,mBAAmB,CAAC;SAC1B,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAA;AACtC,CAAC;AAED,wEAAwE;AACxE,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,oDAAoD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC3E,CAAC;AAED,MAAM,gBAAgB,GAAG,0CAA0C,CAAA;AAEnE,+FAA+F;AAC/F,MAAM,cAAc,GAAG,4LAA4L,CAAA;AAEnN,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC9B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAChC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,MAAM,CAAA;IAC1C,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACpC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,IAAI,eAAe,CAAC,OAAO,CAAC;YAAE,OAAO,MAAM,CAAA;QAC3C,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC;YAAE,OAAO,MAAM,CAAA;QAClF,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IAClF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,2DAA2D;AAC3D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAA;AAE/D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAA2B;IAC5E,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAA;IACpD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAChE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAY;IAC5D,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,SAAS,CAAA;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAA;QACxD,OAAO,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAElD,SAAS,aAAa,CAAC,GAAG,MAAiC;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAA;IAC9D,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAA0B;IAClE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC1C,MAAM,QAAQ,GAAG;QACf,wHAAwH;QACxH,uFAAuF;QACvF,4CAA4C;QAC5C,gBAAgB;QAChB,oEAAoE;KACrE,CAAA;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;QACjE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAA;IACpF,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAC7B,IAAI,6DAA6D,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IAC/F,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAIzC;IACC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS;QACrC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,aAAa,CACb,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAC/C,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CACrE,CAAA;IACH,OAAO,aAAa,CAClB,OAAO,EACP,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAC1F,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,CACxC,CAAA;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACnC,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,MAAM,CAAA;IAC/C,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACjE,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACnC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,MAAM,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"auto-approval.js","sourceRoot":"","sources":["../src/auto-approval.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-compat.js","sourceRoot":"","sources":["../src/dsh-compat.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,WAAW,MAAM,2BAA2B,CAAA;AAGxD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAA0B,CAAA;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAY,EACZ,EAAqB,EACrB,MAAY,EACZ,KAAQ,EACR,KAA8B;IAE9B,MAAM,MAAM,GAAI,WAQd,CAAC,sBAAsB,CAAA;IACzB,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAG,GAEZ,CAAA;IACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAA;IACjG,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,QAA4E,CAAA;QAC3F,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAE5C,CAAA;QACD,IAAI,OAAO,QAAQ,EAAE,cAAc,KAAK,UAAU,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACzE,CAAC;QACD,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,IAAI,GAAG,OAGZ,CAAA;IACD,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,cAAc,EAAE,CAAA;IAC3E,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,CAAA;AAC1B,CAAC"}
1
+ {"version":3,"file":"dsh-compat.js","sourceRoot":"","sources":["../src/dsh-compat.ts"],"names":[],"mappings":"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"}