dsh-ssh-tui 0.4.1 → 0.5.1

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 (50) hide show
  1. package/README.en.md +64 -39
  2. package/README.md +46 -22
  3. package/cordis.patch.yml +4 -75
  4. package/docs/screenshots/compare.png +0 -0
  5. package/docs/screenshots/headless.png +0 -0
  6. package/docs/screenshots/slow-link.gif +0 -0
  7. package/docs/screenshots/workspace.png +0 -0
  8. package/lib/approval-reviewer.js +62 -0
  9. package/lib/approval-reviewer.js.map +1 -0
  10. package/lib/auto-approval.js +124 -0
  11. package/lib/auto-approval.js.map +1 -0
  12. package/lib/display-sock.js +583 -0
  13. package/lib/display-sock.js.map +1 -0
  14. package/lib/dsh-compat.js +45 -0
  15. package/lib/dsh-compat.js.map +1 -0
  16. package/lib/i18n/en.js +108 -14
  17. package/lib/i18n/en.js.map +1 -1
  18. package/lib/i18n/index.js +2 -1
  19. package/lib/i18n/index.js.map +1 -1
  20. package/lib/i18n/zh.js +108 -14
  21. package/lib/i18n/zh.js.map +1 -1
  22. package/lib/index.js +110 -6
  23. package/lib/index.js.map +1 -1
  24. package/lib/picker.js +14 -1
  25. package/lib/picker.js.map +1 -1
  26. package/lib/provider-catalog.js +169 -0
  27. package/lib/provider-catalog.js.map +1 -0
  28. package/lib/route-memory.js +1 -1
  29. package/lib/route-memory.js.map +1 -1
  30. package/lib/session-list.js +116 -11
  31. package/lib/session-list.js.map +1 -1
  32. package/lib/session-lock.js +182 -6
  33. package/lib/session-lock.js.map +1 -1
  34. package/lib/startup.js +2 -0
  35. package/lib/startup.js.map +1 -1
  36. package/lib/subagent-model.js +1 -1
  37. package/lib/subagent-model.js.map +1 -1
  38. package/lib/tui.js +1759 -361
  39. package/lib/tui.js.map +1 -1
  40. package/lib/types/approval-reviewer.d.ts +20 -0
  41. package/lib/types/auto-approval.d.ts +42 -0
  42. package/lib/types/display-sock.d.ts +74 -0
  43. package/lib/types/dsh-compat.d.ts +30 -0
  44. package/lib/types/i18n/index.d.ts +2 -0
  45. package/lib/types/picker.d.ts +4 -0
  46. package/lib/types/provider-catalog.d.ts +35 -0
  47. package/lib/types/session-list.d.ts +8 -1
  48. package/lib/types/session-lock.d.ts +51 -0
  49. package/lib/types/tui.d.ts +208 -24
  50. package/package.json +56 -30
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-approval.js","sourceRoot":"","sources":["../src/auto-approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,583 @@
1
+ /**
2
+ * Length-prefixed unix-socket frames between a leftover Host and a new
3
+ * Display relay. Binary on purpose: paint bytes are raw ANSI, not JSON.
4
+ *
5
+ * Frame: u32be length | u8 type | payload
6
+ * 1 stdin — relay → host (key bytes)
7
+ * 2 stdout — host → relay (paint bytes)
8
+ * 3 resize — relay → host (u16be cols | u16be rows)
9
+ * 4 hello — either side, payload ignored
10
+ * 5 goodbye — host → relay, then close (user /exit)
11
+ * 6 rtt — relay → host (u32be milliseconds; 0xffffffff = unknown)
12
+ */
13
+ import { spawn } from 'node:child_process';
14
+ import { createConnection, createServer } from 'node:net';
15
+ import { access, mkdir, readFile, unlink } from 'node:fs/promises';
16
+ import { closeSync, constants as fsConstants, mkdirSync, openSync } from 'node:fs';
17
+ import { homedir } from 'node:os';
18
+ import { dirname, join } from 'node:path';
19
+ export const FRAME_STDIN = 1;
20
+ export const FRAME_STDOUT = 2;
21
+ export const FRAME_RESIZE = 3;
22
+ export const FRAME_HELLO = 4;
23
+ export const FRAME_GOODBYE = 5;
24
+ export const FRAME_RTT = 6;
25
+ const MAX_FRAME = 1024 * 1024;
26
+ const DSR_PROBE_TIMEOUT_MS = 800;
27
+ function parseCursorPositionReply(text) {
28
+ return /^\x1b\[\d+;\d+R$/u.test(text);
29
+ }
30
+ /** CSI 6n round-trip on this TTY. Must run before stdin is forwarded to the Host. */
31
+ async function probeLocalRttMs(stdin = process.stdin, stdout = process.stdout, timeoutMs = DSR_PROBE_TIMEOUT_MS) {
32
+ if (!stdin.isTTY || !stdout.isTTY)
33
+ return undefined;
34
+ return await new Promise(resolve => {
35
+ let buffer = '';
36
+ let settled = false;
37
+ const started = Date.now();
38
+ const finish = (value) => {
39
+ if (settled)
40
+ return;
41
+ settled = true;
42
+ clearTimeout(timer);
43
+ stdin.removeListener('data', onData);
44
+ resolve(value);
45
+ };
46
+ const onData = (chunk) => {
47
+ buffer += chunk.toString('utf8');
48
+ if (parseCursorPositionReply(buffer)) {
49
+ finish(Math.max(0, Date.now() - started));
50
+ return;
51
+ }
52
+ if (buffer.length > 32 && !buffer.includes('\x1b['))
53
+ finish(undefined);
54
+ };
55
+ const timer = setTimeout(() => finish(undefined), timeoutMs);
56
+ stdin.on('data', onData);
57
+ try {
58
+ stdout.write('\x1b[6n');
59
+ }
60
+ catch {
61
+ finish(undefined);
62
+ }
63
+ });
64
+ }
65
+ /**
66
+ * Drop launcher SIGTERM/SIGINT/SIGHUP so closing SSH cannot dispose the tree
67
+ * before hangup handling. Leaving the session with setsid() is best-effort:
68
+ * a TTY session leader gets EPERM and stays in the SSH process group.
69
+ */
70
+ export function detachFromSshSession() {
71
+ try {
72
+ const setsid = process.setsid;
73
+ setsid?.();
74
+ }
75
+ catch {
76
+ // EPERM when already the session leader (typical under SSH).
77
+ }
78
+ const ignore = () => { };
79
+ for (const name of ['SIGHUP', 'SIGTERM', 'SIGINT']) {
80
+ process.removeAllListeners(name);
81
+ process.on(name, ignore);
82
+ }
83
+ }
84
+ export const TUI_HOST_ENV = 'DSH_TUI_HOST';
85
+ export function isTuiHostProcess(env = process.env) {
86
+ return env[TUI_HOST_ENV] === '1' || env[TUI_HOST_ENV] === 'true';
87
+ }
88
+ export function sessionSockPath(sessionId, dshHome = process.env.DSH_HOME ?? join(homedir(), '.dsh')) {
89
+ const safe = sessionId.replaceAll(/[^A-Za-z0-9._-]/g, '_');
90
+ return join(dshHome, 'tui-socks', `${safe}.sock`);
91
+ }
92
+ export function encodeFrame(type, payload = Buffer.alloc(0)) {
93
+ if (type < 1 || type > 255)
94
+ throw new Error(`dsh-ssh-tui: invalid frame type ${type}`);
95
+ if (payload.length > MAX_FRAME)
96
+ throw new Error('dsh-ssh-tui: frame too large');
97
+ const header = Buffer.alloc(5);
98
+ header.writeUInt32BE(1 + payload.length, 0);
99
+ header.writeUInt8(type, 4);
100
+ return Buffer.concat([header, payload]);
101
+ }
102
+ export function encodeResize(columns, rows) {
103
+ const payload = Buffer.alloc(4);
104
+ payload.writeUInt16BE(Math.max(0, Math.min(0xffff, columns)), 0);
105
+ payload.writeUInt16BE(Math.max(0, Math.min(0xffff, rows)), 2);
106
+ return encodeFrame(FRAME_RESIZE, payload);
107
+ }
108
+ export function decodeResize(payload) {
109
+ if (payload.length < 4)
110
+ return undefined;
111
+ return { columns: payload.readUInt16BE(0), rows: payload.readUInt16BE(2) };
112
+ }
113
+ export function encodeRtt(rttMs) {
114
+ const payload = Buffer.alloc(4);
115
+ payload.writeUInt32BE(rttMs === undefined || !Number.isFinite(rttMs) || rttMs < 0 ? 0xffffffff : Math.min(0xfffffffe, Math.round(rttMs)), 0);
116
+ return encodeFrame(FRAME_RTT, payload);
117
+ }
118
+ export function decodeRtt(payload) {
119
+ if (payload.length < 4)
120
+ return undefined;
121
+ const value = payload.readUInt32BE(0);
122
+ return value === 0xffffffff ? undefined : value;
123
+ }
124
+ /** Incremental decoder for one socket. */
125
+ export class FrameReader {
126
+ buffer = Buffer.alloc(0);
127
+ push(chunk) {
128
+ this.buffer = Buffer.concat([this.buffer, chunk]);
129
+ const frames = [];
130
+ while (this.buffer.length >= 5) {
131
+ const length = this.buffer.readUInt32BE(0);
132
+ if (length < 1 || length > MAX_FRAME + 1) {
133
+ throw new Error(`dsh-ssh-tui: invalid frame length ${length}`);
134
+ }
135
+ if (this.buffer.length < 4 + length)
136
+ break;
137
+ const type = this.buffer.readUInt8(4);
138
+ const payload = this.buffer.subarray(5, 4 + length);
139
+ this.buffer = this.buffer.subarray(4 + length);
140
+ frames.push({ type, payload });
141
+ }
142
+ return frames;
143
+ }
144
+ }
145
+ /**
146
+ * Host-side listener. At most one Display is attached; a new hello kicks the
147
+ * previous relay so two SSH windows cannot both drive the session.
148
+ */
149
+ export class DisplayHost {
150
+ path;
151
+ handlers;
152
+ server;
153
+ socket;
154
+ reader = new FrameReader();
155
+ attached = false;
156
+ constructor(path, handlers) {
157
+ this.path = path;
158
+ this.handlers = handlers;
159
+ }
160
+ async listen() {
161
+ await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
162
+ try {
163
+ await unlink(this.path);
164
+ }
165
+ catch {
166
+ // missing is fine
167
+ }
168
+ await new Promise((resolve, reject) => {
169
+ const server = createServer(socket => this.accept(socket));
170
+ server.once('error', reject);
171
+ server.listen(this.path, () => {
172
+ server.removeListener('error', reject);
173
+ this.server = server;
174
+ resolve();
175
+ });
176
+ });
177
+ }
178
+ accept(socket) {
179
+ const reader = new FrameReader();
180
+ let claimed = false;
181
+ const dropProbe = () => {
182
+ if (claimed)
183
+ return;
184
+ socket.destroy();
185
+ };
186
+ const claim = () => {
187
+ if (claimed)
188
+ return;
189
+ claimed = true;
190
+ if (this.socket !== undefined && this.socket !== socket) {
191
+ try {
192
+ this.socket.destroy();
193
+ }
194
+ catch {
195
+ // ignore
196
+ }
197
+ this.socket = undefined;
198
+ this.attached = false;
199
+ this.handlers.onDetach();
200
+ }
201
+ this.reader = reader;
202
+ this.socket = socket;
203
+ this.attached = true;
204
+ this.handlers.onAttach();
205
+ try {
206
+ socket.write(encodeFrame(FRAME_HELLO));
207
+ }
208
+ catch {
209
+ drop();
210
+ }
211
+ };
212
+ const drop = () => {
213
+ if (!claimed)
214
+ return;
215
+ if (this.socket !== socket)
216
+ return;
217
+ this.socket = undefined;
218
+ this.attached = false;
219
+ this.handlers.onDetach();
220
+ };
221
+ socket.on('data', chunk => {
222
+ let frames;
223
+ try {
224
+ frames = reader.push(chunk);
225
+ }
226
+ catch {
227
+ socket.destroy();
228
+ return;
229
+ }
230
+ for (const frame of frames) {
231
+ if (frame.type === FRAME_HELLO)
232
+ claim();
233
+ else if (!claimed)
234
+ continue;
235
+ else if (frame.type === FRAME_STDIN)
236
+ this.handlers.onStdin(frame.payload);
237
+ else if (frame.type === FRAME_RESIZE) {
238
+ const size = decodeResize(frame.payload);
239
+ if (size !== undefined)
240
+ this.handlers.onResize(size.columns, size.rows);
241
+ }
242
+ else if (frame.type === FRAME_RTT) {
243
+ this.handlers.onRtt?.(decodeRtt(frame.payload));
244
+ }
245
+ }
246
+ });
247
+ socket.on('close', () => {
248
+ if (claimed)
249
+ drop();
250
+ });
251
+ socket.on('error', () => {
252
+ if (claimed)
253
+ drop();
254
+ else
255
+ dropProbe();
256
+ });
257
+ // A connect() with no HELLO is a liveness probe; do not steal the display.
258
+ setTimeout(dropProbe, 400);
259
+ }
260
+ sendStdout(bytes) {
261
+ const socket = this.socket;
262
+ if (socket === undefined || this.attached !== true)
263
+ return false;
264
+ const payload = typeof bytes === 'string' ? Buffer.from(bytes, 'utf8') : bytes;
265
+ try {
266
+ socket.write(encodeFrame(FRAME_STDOUT, payload));
267
+ return true;
268
+ }
269
+ catch {
270
+ return false;
271
+ }
272
+ }
273
+ sendGoodbye() {
274
+ const socket = this.socket;
275
+ if (socket === undefined)
276
+ return;
277
+ try {
278
+ socket.write(encodeFrame(FRAME_GOODBYE));
279
+ }
280
+ catch {
281
+ // ignore
282
+ }
283
+ }
284
+ async close() {
285
+ this.sendGoodbye();
286
+ const socket = this.socket;
287
+ this.socket = undefined;
288
+ this.attached = false;
289
+ socket?.destroy();
290
+ const server = this.server;
291
+ this.server = undefined;
292
+ await new Promise(resolve => {
293
+ if (server === undefined) {
294
+ resolve();
295
+ return;
296
+ }
297
+ server.close(() => resolve());
298
+ });
299
+ try {
300
+ await unlink(this.path);
301
+ }
302
+ catch {
303
+ // ignore
304
+ }
305
+ }
306
+ }
307
+ function isPidAlive(pid) {
308
+ if (!Number.isInteger(pid) || pid <= 0)
309
+ return false;
310
+ try {
311
+ process.kill(pid, 0);
312
+ return true;
313
+ }
314
+ catch (error) {
315
+ return error.code === 'EPERM';
316
+ }
317
+ }
318
+ export async function waitForDisplaySock(path, timeoutMs = 15_000, pid, errFile) {
319
+ const deadline = Date.now() + timeoutMs;
320
+ while (Date.now() < deadline) {
321
+ try {
322
+ await access(path, fsConstants.F_OK);
323
+ if (errFile !== undefined) {
324
+ try {
325
+ await unlink(errFile);
326
+ }
327
+ catch { /* ignore */ }
328
+ }
329
+ return;
330
+ }
331
+ catch {
332
+ if (pid !== undefined && !isPidAlive(pid)) {
333
+ let detail = '';
334
+ if (errFile !== undefined) {
335
+ try {
336
+ detail = (await readFile(errFile, 'utf8')).trim();
337
+ await unlink(errFile);
338
+ }
339
+ catch {
340
+ detail = '';
341
+ }
342
+ }
343
+ const suffix = detail !== '' ? `:\n${detail}` : '';
344
+ throw new Error(`dsh-ssh-tui: host process pid ${pid} exited before display socket appeared${suffix}`);
345
+ }
346
+ await new Promise(resolve => setTimeout(resolve, 50));
347
+ }
348
+ }
349
+ let detail = '';
350
+ if (errFile !== undefined) {
351
+ try {
352
+ detail = (await readFile(errFile, 'utf8')).trim();
353
+ await unlink(errFile);
354
+ }
355
+ catch {
356
+ detail = '';
357
+ }
358
+ }
359
+ const suffix = detail !== '' ? `:\n${detail}` : '';
360
+ throw new Error(`dsh-ssh-tui: host display socket did not appear: ${path}${suffix}`);
361
+ }
362
+ export function hostArgvForSession(sessionId, argv = process.argv.slice(1), execArgv = process.execArgv) {
363
+ const args = [...execArgv, ...argv];
364
+ const filtered = [];
365
+ for (let index = 0; index < args.length; index += 1) {
366
+ const arg = args[index] ?? '';
367
+ if (arg === 'resume' || arg === '--resume') {
368
+ const next = args[index + 1];
369
+ if (next !== undefined && !next.startsWith('-'))
370
+ index += 1;
371
+ continue;
372
+ }
373
+ if (arg.startsWith('--resume='))
374
+ continue;
375
+ if (arg === '--new')
376
+ continue;
377
+ filtered.push(arg);
378
+ }
379
+ filtered.push(`--resume=${sessionId}`);
380
+ return filtered;
381
+ }
382
+ /** Spawn a detached Host copy of this `dsh` invocation and return its sock path. */
383
+ export function spawnDetachedHost(sessionId) {
384
+ const sock = sessionSockPath(sessionId);
385
+ const errFile = `${sock}.err`;
386
+ let errFd;
387
+ try {
388
+ mkdirSync(dirname(sock), { recursive: true, mode: 0o700 });
389
+ errFd = openSync(errFile, 'w');
390
+ }
391
+ catch {
392
+ errFd = undefined;
393
+ }
394
+ const child = spawn(process.execPath, hostArgvForSession(sessionId), {
395
+ env: { ...process.env, [TUI_HOST_ENV]: '1' },
396
+ detached: true,
397
+ stdio: ['ignore', 'ignore', errFd ?? 'ignore'],
398
+ });
399
+ if (errFd !== undefined) {
400
+ try {
401
+ closeSync(errFd);
402
+ }
403
+ catch { /* ignore */ }
404
+ }
405
+ if (child.pid === undefined)
406
+ throw new Error('dsh-ssh-tui: failed to spawn host process');
407
+ child.unref();
408
+ return { pid: child.pid, sock, ...errFd !== undefined ? { errFile } : {} };
409
+ }
410
+ export async function probeDisplaySock(path, timeoutMs = 400) {
411
+ return await new Promise(resolve => {
412
+ const socket = createConnection(path);
413
+ let settled = false;
414
+ const finish = (ok) => {
415
+ if (settled)
416
+ return;
417
+ settled = true;
418
+ socket.destroy();
419
+ resolve(ok);
420
+ };
421
+ const timer = setTimeout(() => finish(false), timeoutMs);
422
+ socket.once('connect', () => {
423
+ clearTimeout(timer);
424
+ finish(true);
425
+ });
426
+ socket.once('error', () => {
427
+ clearTimeout(timer);
428
+ finish(false);
429
+ });
430
+ });
431
+ }
432
+ /**
433
+ * Turn this process into a Display relay until the Host hangs up or the
434
+ * local TTY dies. Restores the terminal before resolving.
435
+ */
436
+ export async function runDisplayRelay(path) {
437
+ const useAltScreen = process.env.DSH_TUI_NO_ALT_SCREEN !== '1'
438
+ && process.env.DSH_TUI_NO_ALT_SCREEN !== 'true';
439
+ return await new Promise((resolve, reject) => {
440
+ const socket = createConnection(path);
441
+ const reader = new FrameReader();
442
+ let settled = false;
443
+ const finish = (reason) => {
444
+ if (settled)
445
+ return;
446
+ settled = true;
447
+ cleanup();
448
+ resolve({ reason });
449
+ };
450
+ const cleanup = () => {
451
+ process.stdin.removeListener('data', onStdin);
452
+ process.stdout.removeListener('resize', onResize);
453
+ process.stdin.removeListener('end', onLocalHangup);
454
+ process.stdin.removeListener('close', onLocalHangup);
455
+ process.removeListener('SIGHUP', onLocalHangup);
456
+ process.removeListener('SIGTERM', onLocalHangup);
457
+ try {
458
+ process.stdin.setRawMode(false);
459
+ }
460
+ catch {
461
+ // ignore
462
+ }
463
+ if (resizeTimer !== undefined) {
464
+ clearTimeout(resizeTimer);
465
+ resizeTimer = undefined;
466
+ }
467
+ process.stdout.off('resize', onResize);
468
+ if (process.platform !== 'win32') {
469
+ process.off('SIGWINCH', onResize);
470
+ }
471
+ try {
472
+ process.stdin.pause();
473
+ }
474
+ catch {
475
+ // ignore
476
+ }
477
+ try {
478
+ process.stdout.write('\x1b]0;\x07');
479
+ process.stdout.write('\x1b[0m\x1b[2J\x1b[3J\x1b[H');
480
+ process.stdout.write(`\x1b[?1000l\x1b[?1006l\x1b[?2004l\x1b[?25h${useAltScreen ? '\x1b[?1049l' : ''}`);
481
+ }
482
+ catch {
483
+ // TTY may already be gone
484
+ }
485
+ socket.destroy();
486
+ };
487
+ const onStdin = (chunk) => {
488
+ try {
489
+ socket.write(encodeFrame(FRAME_STDIN, chunk));
490
+ }
491
+ catch {
492
+ finish('host-closed');
493
+ }
494
+ };
495
+ let resizeTimer;
496
+ const sendResize = () => {
497
+ try {
498
+ socket.write(encodeResize(process.stdout.columns || 80, process.stdout.rows || 24));
499
+ }
500
+ catch {
501
+ finish('host-closed');
502
+ }
503
+ };
504
+ const onResize = () => {
505
+ if (resizeTimer !== undefined)
506
+ clearTimeout(resizeTimer);
507
+ resizeTimer = setTimeout(() => {
508
+ resizeTimer = undefined;
509
+ sendResize();
510
+ }, 20);
511
+ };
512
+ const onLocalHangup = () => {
513
+ finish('signal');
514
+ };
515
+ socket.once('error', error => {
516
+ if (!settled)
517
+ reject(error);
518
+ });
519
+ socket.on('connect', () => {
520
+ void (async () => {
521
+ try {
522
+ process.stdin.setRawMode(true);
523
+ process.stdin.resume();
524
+ const columns = process.stdout.columns || 80;
525
+ const rows = process.stdout.rows || 24;
526
+ socket.write(Buffer.concat([
527
+ encodeFrame(FRAME_HELLO),
528
+ encodeResize(columns, rows),
529
+ ]));
530
+ const rtt = await probeLocalRttMs();
531
+ if (settled)
532
+ return;
533
+ try {
534
+ socket.write(encodeRtt(rtt));
535
+ }
536
+ catch {
537
+ finish('host-closed');
538
+ return;
539
+ }
540
+ process.stdin.on('data', onStdin);
541
+ process.stdin.on('end', onLocalHangup);
542
+ process.stdin.on('close', onLocalHangup);
543
+ process.stdout.on('resize', onResize);
544
+ if (process.platform !== 'win32') {
545
+ process.on('SIGWINCH', onResize);
546
+ }
547
+ process.on('SIGHUP', onLocalHangup);
548
+ process.on('SIGTERM', onLocalHangup);
549
+ }
550
+ catch (error) {
551
+ reject(error);
552
+ }
553
+ })();
554
+ });
555
+ socket.on('data', chunk => {
556
+ let frames;
557
+ try {
558
+ frames = reader.push(chunk);
559
+ }
560
+ catch (error) {
561
+ reject(error);
562
+ return;
563
+ }
564
+ for (const frame of frames) {
565
+ if (frame.type === FRAME_STDOUT) {
566
+ try {
567
+ process.stdout.write(frame.payload);
568
+ }
569
+ catch {
570
+ finish('signal');
571
+ return;
572
+ }
573
+ }
574
+ else if (frame.type === FRAME_GOODBYE) {
575
+ finish('goodbye');
576
+ return;
577
+ }
578
+ }
579
+ });
580
+ socket.on('close', () => finish('host-closed'));
581
+ });
582
+ }
583
+ //# sourceMappingURL=display-sock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-sock.js","sourceRoot":"","sources":["../src/display-sock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import * as dshSettings from '@deepseek-ai/dsh-settings';
2
+ /**
3
+ * 0.1.1-rc.2 wraps namespaces via `settingsNamespace()`; 0.1.2 brands them at
4
+ * the type level and takes the plain string at runtime. A cast covers both.
5
+ */
6
+ export function settingsNamespace(value) {
7
+ return value;
8
+ }
9
+ /**
10
+ * Register a settings section: 0.1.2-rc.1 moved the free function onto the
11
+ * `settings` service as `installSection`, callable only once that service is
12
+ * injected (plugins apply before it, so `ctx.inject` must defer — same
13
+ * pattern the harness's own packages use); 0.1.1-rc.2 keeps the free
14
+ * function, which defers internally and is safe at apply time.
15
+ */
16
+ export function installSettingsSection(ctx, ns, schema, entry, hooks) {
17
+ const legacy = dshSettings.installSettingsSection;
18
+ if (typeof legacy === 'function') {
19
+ legacy(ctx, ns, schema, entry, hooks);
20
+ return;
21
+ }
22
+ const host = ctx;
23
+ if (typeof host.inject !== 'function') {
24
+ throw new Error('dsh-settings: no legacy installSettingsSection and ctx.inject is unavailable');
25
+ }
26
+ host.inject(['settings'], (injected) => {
27
+ const holder = injected;
28
+ const provider = (holder.settings ?? injected);
29
+ if (typeof provider?.installSection !== 'function') {
30
+ throw new Error('dsh-settings: settings service has no installSection');
31
+ }
32
+ provider.installSection(ctx, ns, schema, entry, hooks);
33
+ });
34
+ }
35
+ /**
36
+ * Read the full durable event log: 0.1.2-rc.1 replaced the `Session.events`
37
+ * property with on-demand readers; 0.1.1-rc.2 still exposes the property.
38
+ */
39
+ export function sessionEvents(session) {
40
+ const host = session;
41
+ if (typeof host.snapshotEvents === 'function')
42
+ return host.snapshotEvents();
43
+ return host.events ?? [];
44
+ }
45
+ //# sourceMappingURL=dsh-compat.js.map
@@ -0,0 +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"}