@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.
- package/README.md +4 -0
- package/dist/ai/cardBuilder.d.ts +2 -0
- package/dist/ai/cardBuilder.d.ts.map +1 -1
- package/dist/ai/cardBuilder.js +62 -0
- package/dist/ai/cardBuilder.js.map +1 -1
- package/dist/ai/claudeCliProvider.d.ts +25 -1
- package/dist/ai/claudeCliProvider.d.ts.map +1 -1
- package/dist/ai/claudeCliProvider.js +77 -53
- package/dist/ai/claudeCliProvider.js.map +1 -1
- package/dist/ai/codexLogin.d.ts +57 -0
- package/dist/ai/codexLogin.d.ts.map +1 -0
- package/dist/ai/codexLogin.js +240 -0
- package/dist/ai/codexLogin.js.map +1 -0
- package/dist/ai/codexSdkProvider.d.ts.map +1 -1
- package/dist/ai/codexSdkProvider.js +66 -5
- package/dist/ai/codexSdkProvider.js.map +1 -1
- package/dist/ai/provider.d.ts +5 -0
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/sessionManager.d.ts +6 -0
- package/dist/ai/sessionManager.d.ts.map +1 -1
- package/dist/ai/sessionManager.js +90 -4
- package/dist/ai/sessionManager.js.map +1 -1
- package/dist/files/fileBrowser.d.ts +25 -0
- package/dist/files/fileBrowser.d.ts.map +1 -0
- package/dist/files/fileBrowser.js +186 -0
- package/dist/files/fileBrowser.js.map +1 -0
- package/dist/handlers/messageHandler.d.ts +88 -8
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +411 -52
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +57 -4
- package/dist/service/run.js.map +1 -1
- package/dist/service/types.js +1 -1
- package/dist/terminal/terminalManager.d.ts +48 -0
- package/dist/terminal/terminalManager.d.ts.map +1 -0
- package/dist/terminal/terminalManager.js +244 -0
- package/dist/terminal/terminalManager.js.map +1 -0
- 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.
|
|
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.
|
|
45
|
-
"@sumicom/quicksave-shared": "0.8.
|
|
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",
|