@sumicom/quicksave 0.8.0 → 0.8.2

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 (41) hide show
  1. package/README.md +4 -0
  2. package/dist/ai/cardBuilder.d.ts +2 -0
  3. package/dist/ai/cardBuilder.d.ts.map +1 -1
  4. package/dist/ai/cardBuilder.js +62 -0
  5. package/dist/ai/cardBuilder.js.map +1 -1
  6. package/dist/ai/claudeCliProvider.d.ts +25 -1
  7. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  8. package/dist/ai/claudeCliProvider.js +77 -53
  9. package/dist/ai/claudeCliProvider.js.map +1 -1
  10. package/dist/ai/codexLogin.d.ts +57 -0
  11. package/dist/ai/codexLogin.d.ts.map +1 -0
  12. package/dist/ai/codexLogin.js +240 -0
  13. package/dist/ai/codexLogin.js.map +1 -0
  14. package/dist/ai/codexSdkProvider.d.ts.map +1 -1
  15. package/dist/ai/codexSdkProvider.js +66 -5
  16. package/dist/ai/codexSdkProvider.js.map +1 -1
  17. package/dist/ai/provider.d.ts +5 -0
  18. package/dist/ai/provider.d.ts.map +1 -1
  19. package/dist/ai/sessionManager.d.ts +6 -0
  20. package/dist/ai/sessionManager.d.ts.map +1 -1
  21. package/dist/ai/sessionManager.js +90 -4
  22. package/dist/ai/sessionManager.js.map +1 -1
  23. package/dist/files/fileBrowser.d.ts +25 -0
  24. package/dist/files/fileBrowser.d.ts.map +1 -0
  25. package/dist/files/fileBrowser.js +186 -0
  26. package/dist/files/fileBrowser.js.map +1 -0
  27. package/dist/handlers/messageHandler.d.ts +88 -8
  28. package/dist/handlers/messageHandler.d.ts.map +1 -1
  29. package/dist/handlers/messageHandler.js +411 -52
  30. package/dist/handlers/messageHandler.js.map +1 -1
  31. package/dist/index.js +2 -2
  32. package/dist/service/ipcClient.js +1 -1
  33. package/dist/service/run.d.ts.map +1 -1
  34. package/dist/service/run.js +57 -4
  35. package/dist/service/run.js.map +1 -1
  36. package/dist/service/types.js +1 -1
  37. package/dist/terminal/terminalManager.d.ts +48 -0
  38. package/dist/terminal/terminalManager.d.ts.map +1 -0
  39. package/dist/terminal/terminalManager.js +244 -0
  40. package/dist/terminal/terminalManager.js.map +1 -0
  41. package/package.json +4 -3
@@ -0,0 +1,48 @@
1
+ /**
2
+ * TerminalManager — owns a pool of PTY-backed shells the PWA can drive remotely.
3
+ *
4
+ * One manager instance per daemon. It spawns `node-pty` children, holds a
5
+ * bounded scrollback buffer for each one, and emits events for the bus
6
+ * layer to publish.
7
+ *
8
+ * State that matters for resume:
9
+ * - Scrollback buffer (raw output, including ANSI escapes) — so a PWA
10
+ * reconnecting can render the current screen without the shell having
11
+ * to redraw.
12
+ * - `seq`: monotonic byte counter, used so the PWA can reconcile a late
13
+ * snapshot against updates it already received.
14
+ */
15
+ import { EventEmitter } from 'events';
16
+ import type { TerminalSummary, TerminalOutputSnapshot } from '@sumicom/quicksave-shared';
17
+ interface CreateOptions {
18
+ cwd: string;
19
+ shell?: string;
20
+ args?: string[];
21
+ cols?: number;
22
+ rows?: number;
23
+ title?: string;
24
+ }
25
+ export declare class TerminalManager extends EventEmitter {
26
+ private readonly terminals;
27
+ /**
28
+ * Snapshot of every terminal summary — used by the `/terminals` bus
29
+ * subscription on initial connect.
30
+ */
31
+ listSummaries(): TerminalSummary[];
32
+ /**
33
+ * Snapshot for a single terminal's output stream — used by the
34
+ * `/terminals/:terminalId/output` subscription.
35
+ */
36
+ outputSnapshot(terminalId: string): TerminalOutputSnapshot | null;
37
+ create(opts: CreateOptions): Promise<TerminalSummary>;
38
+ write(terminalId: string, data: string): void;
39
+ resize(terminalId: string, cols: number, rows: number): TerminalSummary;
40
+ rename(terminalId: string, title: string): TerminalSummary;
41
+ close(terminalId: string, force?: boolean): void;
42
+ /** Kill every live terminal — invoked during daemon shutdown. */
43
+ shutdown(): void;
44
+ }
45
+ export declare function getTerminalManager(): TerminalManager;
46
+ export declare function _resetTerminalManagerForTest(): void;
47
+ export {};
48
+ //# sourceMappingURL=terminalManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalManager.d.ts","sourceRoot":"","sources":["../../src/terminal/terminalManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EAGvB,MAAM,2BAA2B,CAAC;AAqEnC,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD;;;OAGG;IACH,aAAa,IAAI,eAAe,EAAE;IAIlC;;;OAGG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI;IAc3D,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IA0F3D,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ7C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe;IAcvE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe;IAW1D,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,IAAI;IAgB9C,iEAAiE;IACjE,QAAQ,IAAI,IAAI;CASjB;AAID,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AAGD,wBAAgB,4BAA4B,IAAI,IAAI,CAGnD"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * TerminalManager — owns a pool of PTY-backed shells the PWA can drive remotely.
3
+ *
4
+ * One manager instance per daemon. It spawns `node-pty` children, holds a
5
+ * bounded scrollback buffer for each one, and emits events for the bus
6
+ * layer to publish.
7
+ *
8
+ * State that matters for resume:
9
+ * - Scrollback buffer (raw output, including ANSI escapes) — so a PWA
10
+ * reconnecting can render the current screen without the shell having
11
+ * to redraw.
12
+ * - `seq`: monotonic byte counter, used so the PWA can reconcile a late
13
+ * snapshot against updates it already received.
14
+ */
15
+ import { EventEmitter } from 'events';
16
+ import { homedir, platform } from 'os';
17
+ import { basename } from 'path';
18
+ import { randomBytes } from 'crypto';
19
+ let ptyModulePromise = null;
20
+ async function loadPty() {
21
+ if (!ptyModulePromise) {
22
+ ptyModulePromise = import('node-pty');
23
+ }
24
+ return ptyModulePromise;
25
+ }
26
+ /** Upper bound on retained scrollback per terminal. 256KiB is plenty for a
27
+ * recent session without bloating the snapshot frame. */
28
+ const SCROLLBACK_LIMIT = 256 * 1024;
29
+ function generateTerminalId() {
30
+ return `term_${randomBytes(6).toString('hex')}`;
31
+ }
32
+ function defaultShell() {
33
+ const env = process.env.SHELL;
34
+ if (env && env.length > 0)
35
+ return env;
36
+ return platform() === 'win32' ? 'powershell.exe' : '/bin/bash';
37
+ }
38
+ function defaultShellArgs(shell) {
39
+ const base = basename(shell);
40
+ // Run as a login shell so .profile / .zprofile / rc files load the user's
41
+ // PATH — without this, interactive tools like nvm or asdf won't be found.
42
+ if (base === 'bash' || base === 'zsh' || base === 'sh')
43
+ return ['-l'];
44
+ return [];
45
+ }
46
+ function toSummary(entry) {
47
+ return {
48
+ terminalId: entry.terminalId,
49
+ title: entry.title,
50
+ cwd: entry.cwd,
51
+ shell: entry.shell,
52
+ cols: entry.cols,
53
+ rows: entry.rows,
54
+ createdAt: entry.createdAt,
55
+ lastActivityAt: entry.lastActivityAt,
56
+ exited: entry.exited,
57
+ exitCode: entry.exitCode,
58
+ };
59
+ }
60
+ export class TerminalManager extends EventEmitter {
61
+ terminals = new Map();
62
+ /**
63
+ * Snapshot of every terminal summary — used by the `/terminals` bus
64
+ * subscription on initial connect.
65
+ */
66
+ listSummaries() {
67
+ return [...this.terminals.values()].map(toSummary);
68
+ }
69
+ /**
70
+ * Snapshot for a single terminal's output stream — used by the
71
+ * `/terminals/:terminalId/output` subscription.
72
+ */
73
+ outputSnapshot(terminalId) {
74
+ const entry = this.terminals.get(terminalId);
75
+ if (!entry)
76
+ return null;
77
+ return {
78
+ terminalId,
79
+ buffer: entry.buffer,
80
+ seq: entry.seq,
81
+ cols: entry.cols,
82
+ rows: entry.rows,
83
+ exited: entry.exited,
84
+ exitCode: entry.exitCode,
85
+ };
86
+ }
87
+ async create(opts) {
88
+ const pty = await loadPty();
89
+ const shell = opts.shell && opts.shell.length > 0 ? opts.shell : defaultShell();
90
+ const args = opts.args ?? defaultShellArgs(shell);
91
+ const cols = Math.max(20, Math.floor(opts.cols ?? 80));
92
+ const rows = Math.max(5, Math.floor(opts.rows ?? 24));
93
+ const cwd = opts.cwd && opts.cwd.length > 0 ? opts.cwd : homedir();
94
+ const title = opts.title?.trim() || basename(shell);
95
+ const terminalId = generateTerminalId();
96
+ const env = {
97
+ ...process.env,
98
+ TERM: 'xterm-256color',
99
+ COLORTERM: 'truecolor',
100
+ // Signal to user shells that this is quicksave, so they can skip
101
+ // heavy interactive features if they want.
102
+ QUICKSAVE_TERMINAL: '1',
103
+ };
104
+ const child = pty.spawn(shell, args, {
105
+ name: 'xterm-256color',
106
+ cols,
107
+ rows,
108
+ cwd,
109
+ env: env,
110
+ });
111
+ const now = Date.now();
112
+ const entry = {
113
+ terminalId,
114
+ title,
115
+ cwd,
116
+ shell,
117
+ cols,
118
+ rows,
119
+ createdAt: now,
120
+ lastActivityAt: now,
121
+ pty: child,
122
+ buffer: '',
123
+ seq: 0,
124
+ exited: false,
125
+ exitCode: null,
126
+ };
127
+ this.terminals.set(terminalId, entry);
128
+ child.onData((data) => {
129
+ entry.seq += data.length;
130
+ entry.lastActivityAt = Date.now();
131
+ entry.buffer += data;
132
+ if (entry.buffer.length > SCROLLBACK_LIMIT) {
133
+ entry.buffer = entry.buffer.slice(entry.buffer.length - SCROLLBACK_LIMIT);
134
+ }
135
+ const chunk = {
136
+ terminalId,
137
+ seq: entry.seq,
138
+ chunk: data,
139
+ };
140
+ this.emit('output', chunk);
141
+ // Activity bump — title/lastActivityAt shows up on the list.
142
+ this.emit('terminal-updated', toSummary(entry));
143
+ });
144
+ child.onExit(({ exitCode, signal }) => {
145
+ entry.exited = true;
146
+ entry.exitCode = typeof exitCode === 'number' ? exitCode : null;
147
+ const tail = `\r\n\x1b[2m[process exited${typeof exitCode === 'number' ? ` code=${exitCode}` : ''}${signal ? ` signal=${signal}` : ''}]\x1b[0m\r\n`;
148
+ entry.seq += tail.length;
149
+ entry.lastActivityAt = Date.now();
150
+ entry.buffer += tail;
151
+ if (entry.buffer.length > SCROLLBACK_LIMIT) {
152
+ entry.buffer = entry.buffer.slice(entry.buffer.length - SCROLLBACK_LIMIT);
153
+ }
154
+ const chunk = {
155
+ terminalId,
156
+ seq: entry.seq,
157
+ chunk: tail,
158
+ exited: true,
159
+ exitCode: entry.exitCode,
160
+ };
161
+ this.emit('output', chunk);
162
+ this.emit('terminal-updated', toSummary(entry));
163
+ });
164
+ const summary = toSummary(entry);
165
+ this.emit('terminals-updated', { kind: 'upsert', terminal: summary });
166
+ return summary;
167
+ }
168
+ write(terminalId, data) {
169
+ const entry = this.terminals.get(terminalId);
170
+ if (!entry)
171
+ throw new Error(`Unknown terminal: ${terminalId}`);
172
+ if (entry.exited)
173
+ throw new Error(`Terminal has exited: ${terminalId}`);
174
+ entry.pty.write(data);
175
+ entry.lastActivityAt = Date.now();
176
+ }
177
+ resize(terminalId, cols, rows) {
178
+ const entry = this.terminals.get(terminalId);
179
+ if (!entry)
180
+ throw new Error(`Unknown terminal: ${terminalId}`);
181
+ const newCols = Math.max(20, Math.floor(cols));
182
+ const newRows = Math.max(5, Math.floor(rows));
183
+ if (!entry.exited)
184
+ entry.pty.resize(newCols, newRows);
185
+ entry.cols = newCols;
186
+ entry.rows = newRows;
187
+ const summary = toSummary(entry);
188
+ this.emit('terminal-updated', summary);
189
+ this.emit('terminals-updated', { kind: 'upsert', terminal: summary });
190
+ return summary;
191
+ }
192
+ rename(terminalId, title) {
193
+ const entry = this.terminals.get(terminalId);
194
+ if (!entry)
195
+ throw new Error(`Unknown terminal: ${terminalId}`);
196
+ const cleaned = title.trim().slice(0, 80);
197
+ entry.title = cleaned || basename(entry.shell);
198
+ const summary = toSummary(entry);
199
+ this.emit('terminal-updated', summary);
200
+ this.emit('terminals-updated', { kind: 'upsert', terminal: summary });
201
+ return summary;
202
+ }
203
+ close(terminalId, force = false) {
204
+ const entry = this.terminals.get(terminalId);
205
+ if (!entry)
206
+ throw new Error(`Unknown terminal: ${terminalId}`);
207
+ try {
208
+ if (!entry.exited) {
209
+ // Send SIGHUP first (graceful); fall back to SIGKILL if caller asked.
210
+ entry.pty.kill(force ? 'SIGKILL' : 'SIGHUP');
211
+ }
212
+ }
213
+ catch (err) {
214
+ // Swallow — the onExit handler will fire regardless once the process is dead.
215
+ console.warn(`[terminal] kill ${terminalId} failed:`, err);
216
+ }
217
+ this.terminals.delete(terminalId);
218
+ this.emit('terminals-updated', { kind: 'remove', terminalId });
219
+ }
220
+ /** Kill every live terminal — invoked during daemon shutdown. */
221
+ shutdown() {
222
+ for (const id of [...this.terminals.keys()]) {
223
+ try {
224
+ this.close(id, true);
225
+ }
226
+ catch {
227
+ /* best effort */
228
+ }
229
+ }
230
+ }
231
+ }
232
+ let globalManager = null;
233
+ export function getTerminalManager() {
234
+ if (!globalManager)
235
+ globalManager = new TerminalManager();
236
+ return globalManager;
237
+ }
238
+ // Test seam — reset between tests that exercise the singleton directly.
239
+ export function _resetTerminalManagerForTest() {
240
+ if (globalManager)
241
+ globalManager.shutdown();
242
+ globalManager = null;
243
+ }
244
+ //# sourceMappingURL=terminalManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalManager.js","sourceRoot":"","sources":["../../src/terminal/terminalManager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sumicom/quicksave",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "Quicksave agent - remote git control CLI",
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,13 +36,14 @@
36
36
  "@openai/codex-sdk": "^0.120.0",
37
37
  "better-sqlite3": "^12.9.0",
38
38
  "commander": "^12.0.0",
39
+ "node-pty": "^1.1.0",
39
40
  "qrcode-terminal": "^0.12.0",
40
41
  "simple-git": "^3.22.0",
41
42
  "tweetnacl": "^1.0.3",
42
43
  "ws": "^8.16.0",
43
44
  "zod": "^4.3.6",
44
- "@sumicom/quicksave-message-bus": "0.8.0",
45
- "@sumicom/quicksave-shared": "0.8.0"
45
+ "@sumicom/quicksave-message-bus": "0.8.2",
46
+ "@sumicom/quicksave-shared": "0.8.2"
46
47
  },
47
48
  "devDependencies": {
48
49
  "@types/better-sqlite3": "^7.6.13",