@kdonev/termscape 0.1.8 → 0.2.0
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 +32 -1
- package/dist/agents/profiles.d.ts +10 -0
- package/dist/agents/profiles.d.ts.map +1 -1
- package/dist/agents/profiles.js +12 -0
- package/dist/agents/profiles.js.map +1 -1
- package/dist/agents/router.d.ts +3 -1
- package/dist/agents/router.d.ts.map +1 -1
- package/dist/agents/router.js +11 -3
- package/dist/agents/router.js.map +1 -1
- package/dist/agents/wiring.d.ts.map +1 -1
- package/dist/agents/wiring.js +16 -1
- package/dist/agents/wiring.js.map +1 -1
- package/dist/cli-args.d.ts +10 -0
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +2 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +15 -258
- package/dist/cli.js.map +1 -1
- package/dist/debug.d.ts.map +1 -1
- package/dist/debug.js +7 -0
- package/dist/debug.js.map +1 -1
- package/dist/hub.d.ts +40 -1
- package/dist/hub.d.ts.map +1 -1
- package/dist/hub.js +163 -10
- package/dist/hub.js.map +1 -1
- package/dist/hub.tgz +0 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +343 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +5 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/protocol/domain.d.ts +35 -0
- package/dist/protocol/domain.d.ts.map +1 -1
- package/dist/protocol/domain.js +31 -2
- package/dist/protocol/domain.js.map +1 -1
- package/dist/protocol/index.d.ts +1 -0
- package/dist/protocol/index.d.ts.map +1 -1
- package/dist/protocol/index.js +1 -0
- package/dist/protocol/index.js.map +1 -1
- package/dist/protocol/peer.d.ts +12 -0
- package/dist/protocol/peer.d.ts.map +1 -1
- package/dist/protocol/peer.js +30 -1
- package/dist/protocol/peer.js.map +1 -1
- package/dist/protocol/version.d.ts +12 -0
- package/dist/protocol/version.d.ts.map +1 -0
- package/dist/protocol/version.js +37 -0
- package/dist/protocol/version.js.map +1 -0
- package/dist/protocol/ws.d.ts +67 -1
- package/dist/protocol/ws.d.ts.map +1 -1
- package/dist/protocol/ws.js +11 -1
- package/dist/protocol/ws.js.map +1 -1
- package/dist/remote/enroll.d.ts.map +1 -1
- package/dist/remote/enroll.js +22 -1
- package/dist/remote/enroll.js.map +1 -1
- package/dist/remote/join.d.ts.map +1 -1
- package/dist/remote/join.js +10 -1
- package/dist/remote/join.js.map +1 -1
- package/dist/remote/peer-serve.d.ts.map +1 -1
- package/dist/remote/peer-serve.js +14 -0
- package/dist/remote/peer-serve.js.map +1 -1
- package/dist/remote/peer.d.ts +7 -0
- package/dist/remote/peer.d.ts.map +1 -1
- package/dist/remote/peer.js +25 -1
- package/dist/remote/peer.js.map +1 -1
- package/dist/remote/registry.d.ts +24 -2
- package/dist/remote/registry.d.ts.map +1 -1
- package/dist/remote/registry.js +76 -5
- package/dist/remote/registry.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -3
- package/dist/server.js.map +1 -1
- package/dist/session/manager.d.ts +5 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +7 -2
- package/dist/session/manager.js.map +1 -1
- package/dist/session/pty.d.ts +17 -2
- package/dist/session/pty.d.ts.map +1 -1
- package/dist/session/pty.js +69 -9
- package/dist/session/pty.js.map +1 -1
- package/dist/supervisor.d.ts +44 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +125 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/update/host.d.ts +19 -0
- package/dist/update/host.d.ts.map +1 -0
- package/dist/update/host.js +56 -0
- package/dist/update/host.js.map +1 -0
- package/dist/update/install.d.ts +38 -0
- package/dist/update/install.d.ts.map +1 -0
- package/dist/update/install.js +81 -0
- package/dist/update/install.js.map +1 -0
- package/dist/update/post-install.d.ts +2 -0
- package/dist/update/post-install.d.ts.map +1 -0
- package/dist/update/post-install.js +39 -0
- package/dist/update/post-install.js.map +1 -0
- package/dist/update/restart.d.ts +31 -0
- package/dist/update/restart.d.ts.map +1 -0
- package/dist/update/restart.js +65 -0
- package/dist/update/restart.js.map +1 -0
- package/dist/update/resume.d.ts +5 -0
- package/dist/update/resume.d.ts.map +1 -0
- package/dist/update/resume.js +47 -0
- package/dist/update/resume.js.map +1 -0
- package/dist/update/updater.d.ts +57 -0
- package/dist/update/updater.d.ts.map +1 -0
- package/dist/update/updater.js +190 -0
- package/dist/update/updater.js.map +1 -0
- package/package.json +1 -1
- package/web/assets/{index-i7fXLKF0.js → index-BoqmaIyh.js} +9 -9
- package/web/assets/index-Czi_vAR-.css +1 -0
- package/web/index.html +2 -2
- package/web/assets/index-gfbbNQK4.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/update/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAW,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQhD,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,MAAM,EAAE,CAAC;IAC5B,mEAAmE;IACnE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACrC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACxE;AAED;;;;;;;GAOG;AACH,qBAAa,OAAQ,SAAQ,YAAY;IAM3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,KAAK,CAA+B;gBAEf,IAAI,EAAE,cAAc;IAMjD,IAAI,IAAI,UAAU;IAUlB,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;IAKN,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAoCd,OAAO;IAgBrB,OAAO,CAAC,OAAO;CAGhB;AAED,0CAA0C;AAC1C,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAUnD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB1E"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { delimiter, dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { isNewer } from '../protocol/index.js';
|
|
6
|
+
import { debug } from '../debug.js';
|
|
7
|
+
import { PACKAGE_NAME, runNpm } from './install.js';
|
|
8
|
+
/** The first look waits for the hub to settle; the rest are far apart. */
|
|
9
|
+
const FIRST_CHECK_MS = 10_000;
|
|
10
|
+
const CHECK_EVERY_MS = 6 * 60 * 60_000;
|
|
11
|
+
const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
|
|
12
|
+
/**
|
|
13
|
+
* Whether a newer termscape is out, and installing it on request.
|
|
14
|
+
*
|
|
15
|
+
* Checking is automatic and silent: a machine with no network, or a registry
|
|
16
|
+
* having a bad minute, costs nothing but a button that does not appear. What
|
|
17
|
+
* is never automatic is the restart. That takes every agent on this machine
|
|
18
|
+
* down with it, so it waits for someone to press the button.
|
|
19
|
+
*/
|
|
20
|
+
export class Updater extends EventEmitter {
|
|
21
|
+
opts;
|
|
22
|
+
latest = null;
|
|
23
|
+
state;
|
|
24
|
+
error;
|
|
25
|
+
timer = null;
|
|
26
|
+
constructor(opts) {
|
|
27
|
+
super();
|
|
28
|
+
this.opts = opts;
|
|
29
|
+
this.error = opts.initialError ?? null;
|
|
30
|
+
this.state = this.error ? 'failed' : 'idle';
|
|
31
|
+
}
|
|
32
|
+
info() {
|
|
33
|
+
return {
|
|
34
|
+
latest: this.latest,
|
|
35
|
+
kind: this.opts.kind,
|
|
36
|
+
canRestart: this.opts.canRestart,
|
|
37
|
+
state: this.state,
|
|
38
|
+
error: this.error,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
start() {
|
|
42
|
+
if (this.timer)
|
|
43
|
+
return;
|
|
44
|
+
const tick = () => {
|
|
45
|
+
void this.check();
|
|
46
|
+
this.timer = setTimeout(tick, CHECK_EVERY_MS);
|
|
47
|
+
this.timer.unref();
|
|
48
|
+
};
|
|
49
|
+
this.timer = setTimeout(tick, FIRST_CHECK_MS);
|
|
50
|
+
this.timer.unref();
|
|
51
|
+
}
|
|
52
|
+
stop() {
|
|
53
|
+
if (this.timer)
|
|
54
|
+
clearTimeout(this.timer);
|
|
55
|
+
this.timer = null;
|
|
56
|
+
}
|
|
57
|
+
async check() {
|
|
58
|
+
try {
|
|
59
|
+
const latest = await (this.opts.fetchLatest ?? fetchLatest)();
|
|
60
|
+
if (latest === this.latest)
|
|
61
|
+
return;
|
|
62
|
+
this.latest = latest;
|
|
63
|
+
debug('update', `latest ${latest}, running ${this.opts.currentVersion}`);
|
|
64
|
+
this.changed();
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
debug('update', `check failed: ${err.message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fetch the new release while this hub keeps running, then hand over.
|
|
72
|
+
* Throws - into the ack of whoever pressed the button - for anything that
|
|
73
|
+
* stops short of the restart.
|
|
74
|
+
*/
|
|
75
|
+
async apply() {
|
|
76
|
+
const { kind, canRestart, currentVersion } = this.opts;
|
|
77
|
+
const target = this.latest;
|
|
78
|
+
if (target === null || !isNewer(target, currentVersion)) {
|
|
79
|
+
throw new Error('already up to date');
|
|
80
|
+
}
|
|
81
|
+
if (kind !== 'npx' && kind !== 'global') {
|
|
82
|
+
throw new Error('this hub was not installed from npm; update it the way it was installed');
|
|
83
|
+
}
|
|
84
|
+
if (!canRestart) {
|
|
85
|
+
throw new Error('this hub cannot restart itself; stop it and start termscape again once to enable updates');
|
|
86
|
+
}
|
|
87
|
+
if (this.state === 'downloading' || this.state === 'restarting') {
|
|
88
|
+
throw new Error('an update is already under way');
|
|
89
|
+
}
|
|
90
|
+
this.state = 'downloading';
|
|
91
|
+
this.error = null;
|
|
92
|
+
this.changed();
|
|
93
|
+
let plan;
|
|
94
|
+
try {
|
|
95
|
+
plan = await (this.opts.prepare ?? ((k, v) => this.prepare(k, v)))(kind, target);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
this.state = 'failed';
|
|
99
|
+
this.error = err.message;
|
|
100
|
+
this.changed();
|
|
101
|
+
throw err;
|
|
102
|
+
}
|
|
103
|
+
this.state = 'restarting';
|
|
104
|
+
this.changed();
|
|
105
|
+
// A moment for the ack and the broadcast to leave before the sockets go.
|
|
106
|
+
setTimeout(() => this.opts.restart(plan), 300);
|
|
107
|
+
}
|
|
108
|
+
async prepare(kind, version) {
|
|
109
|
+
const args = this.opts.restartArgs();
|
|
110
|
+
if (kind === 'npx') {
|
|
111
|
+
const cli = await fetchIntoNpxCache(version);
|
|
112
|
+
return { command: process.execPath, args: [cli, ...args] };
|
|
113
|
+
}
|
|
114
|
+
// A global install replaces files this hub holds open, which Windows
|
|
115
|
+
// refuses, so the install runs between this hub and the next one - from
|
|
116
|
+
// a script beside this file, started by the supervisor.
|
|
117
|
+
const script = join(dirname(fileURLToPath(import.meta.url)), 'post-install.js');
|
|
118
|
+
return {
|
|
119
|
+
command: process.execPath,
|
|
120
|
+
args: [script, version, this.opts.cliPath, ...args],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
changed() {
|
|
124
|
+
this.emit('change', this.info());
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** The newest release on the registry. */
|
|
128
|
+
export async function fetchLatest() {
|
|
129
|
+
const registry = (process.env.TERMSCAPE_UPDATE_REGISTRY ?? DEFAULT_REGISTRY).replace(/\/$/, '');
|
|
130
|
+
const res = await fetch(`${registry}/${PACKAGE_NAME}/latest`, {
|
|
131
|
+
headers: { accept: 'application/json' },
|
|
132
|
+
signal: AbortSignal.timeout(15_000),
|
|
133
|
+
});
|
|
134
|
+
if (!res.ok)
|
|
135
|
+
throw new Error(`registry answered ${res.status}`);
|
|
136
|
+
const body = (await res.json());
|
|
137
|
+
if (typeof body.version !== 'string')
|
|
138
|
+
throw new Error('registry sent no version');
|
|
139
|
+
return body.version;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Where a package fetched by `npm exec` lives, read off the PATH npm built
|
|
143
|
+
* for the command it ran: npm puts the package's own .bin on it, inside the
|
|
144
|
+
* npx cache. Null when no entry there holds this version.
|
|
145
|
+
*/
|
|
146
|
+
export function findNpxCli(pathVar, version) {
|
|
147
|
+
for (const entry of pathVar.split(delimiter)) {
|
|
148
|
+
if (!/[\\/]_npx[\\/]/.test(entry) || !/[\\/]\.bin[\\/]?$/.test(entry))
|
|
149
|
+
continue;
|
|
150
|
+
const pkgDir = join(entry, '..', ...PACKAGE_NAME.split('/'));
|
|
151
|
+
const cli = join(pkgDir, 'dist', 'cli.js');
|
|
152
|
+
if (!existsSync(cli))
|
|
153
|
+
continue;
|
|
154
|
+
try {
|
|
155
|
+
const manifest = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf8'));
|
|
156
|
+
if (manifest.version === version)
|
|
157
|
+
return cli;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Not this one; keep looking.
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Put a release into npx's cache and return the path of its cli.js.
|
|
167
|
+
*
|
|
168
|
+
* `npm exec` is what `npx` is, so this lands exactly where a fresh
|
|
169
|
+
* `npx @kdonev/termscape@<v>` would have. The new hub is then started with
|
|
170
|
+
* plain `node`, not through npm, which would otherwise sit between the
|
|
171
|
+
* supervisor and the hub for the rest of the session.
|
|
172
|
+
*/
|
|
173
|
+
async function fetchIntoNpxCache(version) {
|
|
174
|
+
const out = await runNpm([
|
|
175
|
+
'exec',
|
|
176
|
+
'--yes',
|
|
177
|
+
`--package=${PACKAGE_NAME}@${version}`,
|
|
178
|
+
'--',
|
|
179
|
+
'node',
|
|
180
|
+
'-p',
|
|
181
|
+
'process.env.PATH',
|
|
182
|
+
]);
|
|
183
|
+
const lines = out.trim().split(/\r?\n/);
|
|
184
|
+
const cli = findNpxCli(lines[lines.length - 1] ?? '', version);
|
|
185
|
+
if (!cli) {
|
|
186
|
+
throw new Error(`npm fetched ${PACKAGE_NAME}@${version} but it is not in the npx cache`);
|
|
187
|
+
}
|
|
188
|
+
return cli;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/update/updater.ts"],"names":[],"mappings":"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"}
|