@lore-co/cli 0.1.14 → 0.1.15
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 +2 -2
- package/dist/api.d.ts +8 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +52 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -1
- package/dist/devin-client.d.ts +1 -1
- package/dist/generated-assets.d.ts +4 -4
- package/dist/generated-assets.js +4 -4
- package/dist/handoff.d.ts +4 -0
- package/dist/handoff.d.ts.map +1 -0
- package/dist/handoff.js +227 -0
- package/dist/handoff.js.map +1 -0
- package/dist/live.d.ts +28 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +597 -0
- package/dist/live.js.map +1 -0
- package/dist/machine.d.ts +19 -0
- package/dist/machine.d.ts.map +1 -0
- package/dist/machine.js +102 -0
- package/dist/machine.js.map +1 -0
- package/dist/pty.d.ts +22 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +148 -0
- package/dist/pty.js.map +1 -0
- package/dist/runtime.d.ts +15 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +45 -7
- package/dist/runtime.js.map +1 -1
- package/dist/self-host.d.ts +1 -1
- package/dist/self-host.js +2 -2
- package/dist/update.js +3 -3
- package/package.json +7 -3
package/dist/live.js
ADDED
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { chmod, mkdir, readFile, readdir, rm, stat, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { createConnection, createServer } from "node:net";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { dirname, resolve } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { WebSocket } from "ws";
|
|
9
|
+
import { ListRuntimesResponseSchema, LiveRuntimeSchema, } from "@lore-co/core";
|
|
10
|
+
import { loreApiRequest } from "./api.js";
|
|
11
|
+
import { ensureMachineRegistered, readMachineIdentity } from "./machine.js";
|
|
12
|
+
import { openPty } from "./pty.js";
|
|
13
|
+
import { IS_STANDALONE_BINARY } from "./version.js";
|
|
14
|
+
const ATTACH_HELP = `lore attach
|
|
15
|
+
Reconnect to a live Lore-managed session: the same process, not a restart.
|
|
16
|
+
|
|
17
|
+
Usage:
|
|
18
|
+
lore attach [options]
|
|
19
|
+
|
|
20
|
+
Options:
|
|
21
|
+
--from <machine> Attach to a live session hosted on another machine
|
|
22
|
+
--runtime <id> Pick a specific live session when several are running
|
|
23
|
+
--list List live sessions without attaching
|
|
24
|
+
--help Show this command's help
|
|
25
|
+
|
|
26
|
+
While attached:
|
|
27
|
+
Ctrl-] Detach and leave the session running
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
lore attach # local live sessions on this machine
|
|
31
|
+
lore attach --from macbook # live session running on "macbook"
|
|
32
|
+
lore machines # see which machines have live sessions
|
|
33
|
+
|
|
34
|
+
Start a live session with:
|
|
35
|
+
lore resume --live
|
|
36
|
+
lore continue --on codex --live
|
|
37
|
+
`;
|
|
38
|
+
const REPLAY_BUFFER_LIMIT = 256 * 1024;
|
|
39
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
40
|
+
const SOCKET_WAIT_MS = 5_000;
|
|
41
|
+
const DETACH_BYTE = 0x1d; // Ctrl-]
|
|
42
|
+
function encodeFrame(frame) {
|
|
43
|
+
return `${JSON.stringify(frame)}\n`;
|
|
44
|
+
}
|
|
45
|
+
function frameParser(onFrame) {
|
|
46
|
+
let pending = "";
|
|
47
|
+
return (chunk) => {
|
|
48
|
+
pending += chunk.toString("utf8");
|
|
49
|
+
let newline = pending.indexOf("\n");
|
|
50
|
+
while (newline !== -1) {
|
|
51
|
+
const line = pending.slice(0, newline);
|
|
52
|
+
pending = pending.slice(newline + 1);
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(line);
|
|
55
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
56
|
+
onFrame(parsed);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Ignore malformed frames.
|
|
61
|
+
}
|
|
62
|
+
newline = pending.indexOf("\n");
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function runtimeDirectory(paths) {
|
|
67
|
+
return resolve(paths.loreDirectory, "runtime");
|
|
68
|
+
}
|
|
69
|
+
function specPath(paths, id) {
|
|
70
|
+
return resolve(runtimeDirectory(paths), `${id}.json`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Unix socket paths are limited to ~104 bytes on macOS (108 on Linux) and
|
|
74
|
+
* the kernel silently truncates longer ones at bind time. Keep the filename
|
|
75
|
+
* short, and when the lore home itself is deep enough to blow the budget,
|
|
76
|
+
* fall back to the per-user temp dir.
|
|
77
|
+
*/
|
|
78
|
+
function socketPath(paths, id) {
|
|
79
|
+
const short = id.slice(0, 8);
|
|
80
|
+
const preferred = resolve(runtimeDirectory(paths), `${short}.sock`);
|
|
81
|
+
if (Buffer.byteLength(preferred, "utf8") <= 100) {
|
|
82
|
+
return preferred;
|
|
83
|
+
}
|
|
84
|
+
return resolve(tmpdir(), `lore-${short}.sock`);
|
|
85
|
+
}
|
|
86
|
+
async function readSpec(paths, id) {
|
|
87
|
+
try {
|
|
88
|
+
const raw = await readFile(specPath(paths, id), "utf8");
|
|
89
|
+
return JSON.parse(raw);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function writeSpec(paths, spec) {
|
|
96
|
+
const directory = runtimeDirectory(paths);
|
|
97
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
98
|
+
await writeFile(specPath(paths, spec.id), `${JSON.stringify(spec, null, 2)}\n`, { mode: 0o600 });
|
|
99
|
+
}
|
|
100
|
+
function processAlive(pid) {
|
|
101
|
+
if (pid === undefined) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
process.kill(pid, 0);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function listLocalSpecs(paths) {
|
|
113
|
+
let entries;
|
|
114
|
+
try {
|
|
115
|
+
entries = await readdir(runtimeDirectory(paths));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
const specs = [];
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
if (!entry.endsWith(".json")) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const spec = await readSpec(paths, entry.slice(0, -5));
|
|
126
|
+
if (spec === null) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (processAlive(spec.pid)) {
|
|
130
|
+
specs.push(spec);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Clean up leftovers from a crashed daemon.
|
|
134
|
+
await rm(specPath(paths, spec.id), { force: true });
|
|
135
|
+
await rm(socketPath(paths, spec.id), { force: true });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return specs.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
139
|
+
}
|
|
140
|
+
function cliEntryPath() {
|
|
141
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), "cli.js");
|
|
142
|
+
}
|
|
143
|
+
function selfSpawn(commandArgs) {
|
|
144
|
+
if (IS_STANDALONE_BINARY) {
|
|
145
|
+
return { command: process.execPath, args: commandArgs };
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
command: process.execPath,
|
|
149
|
+
args: [process.env.LORE_CLI_ENTRY ?? cliEntryPath(), ...commandArgs],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function wsUrl(apiUrl, runtimeId, role) {
|
|
153
|
+
const base = apiUrl.replace(/\/+$/u, "").replace(/^http/u, "ws");
|
|
154
|
+
return `${base}/v1/runtimes/stream?runtime=${encodeURIComponent(runtimeId)}&role=${role}`;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Starts a detached daemon that owns the process. The daemon — not this
|
|
158
|
+
* command — is the process's parent, so closing this terminal never kills
|
|
159
|
+
* the live session. Optionally attaches immediately.
|
|
160
|
+
*/
|
|
161
|
+
export async function hostLiveRuntime(options) {
|
|
162
|
+
const id = randomUUID();
|
|
163
|
+
const spec = {
|
|
164
|
+
id,
|
|
165
|
+
command: options.command,
|
|
166
|
+
args: options.args,
|
|
167
|
+
cwd: process.cwd(),
|
|
168
|
+
env: options.env ?? {},
|
|
169
|
+
agent: options.agent,
|
|
170
|
+
...(options.repo === undefined ? {} : { repo: options.repo }),
|
|
171
|
+
...(options.project === undefined ? {} : { project: options.project }),
|
|
172
|
+
externalSessionId: `lore-live-${id}`,
|
|
173
|
+
createdAt: new Date().toISOString(),
|
|
174
|
+
};
|
|
175
|
+
await writeSpec(options.paths, spec);
|
|
176
|
+
const { command, args } = selfSpawn(["live-host", "--id", id]);
|
|
177
|
+
const child = spawn(command, args, {
|
|
178
|
+
detached: true,
|
|
179
|
+
stdio: "ignore",
|
|
180
|
+
env: process.env,
|
|
181
|
+
});
|
|
182
|
+
child.unref();
|
|
183
|
+
const sock = socketPath(options.paths, id);
|
|
184
|
+
const deadline = Date.now() + SOCKET_WAIT_MS;
|
|
185
|
+
let ready = false;
|
|
186
|
+
while (Date.now() < deadline) {
|
|
187
|
+
try {
|
|
188
|
+
// Sockets cannot be opened with readFile; stat proves existence.
|
|
189
|
+
await stat(sock);
|
|
190
|
+
ready = true;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
await new Promise((resolvePromise) => setTimeout(resolvePromise, 100));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (!ready) {
|
|
198
|
+
await rm(specPath(options.paths, id), { force: true });
|
|
199
|
+
throw new Error("The live session daemon did not start in time.");
|
|
200
|
+
}
|
|
201
|
+
process.stdout.write(`Live session started (${options.agent}). Detach with Ctrl-]; reattach with lore attach.\n`);
|
|
202
|
+
if (options.attach) {
|
|
203
|
+
await attachLocal(options.paths, id);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/** Internal command: the detached daemon hosting the PTY. */
|
|
207
|
+
export async function runLiveHostCommand(args, config, paths) {
|
|
208
|
+
const idIndex = args.indexOf("--id");
|
|
209
|
+
const id = idIndex === -1 ? undefined : args[idIndex + 1];
|
|
210
|
+
if (id === undefined) {
|
|
211
|
+
throw new Error("live-host requires --id");
|
|
212
|
+
}
|
|
213
|
+
const spec = await readSpec(paths, id);
|
|
214
|
+
if (spec === null) {
|
|
215
|
+
throw new Error(`Unknown live session: ${id}`);
|
|
216
|
+
}
|
|
217
|
+
const pty = await openPty(spec.command, spec.args, {
|
|
218
|
+
cwd: spec.cwd,
|
|
219
|
+
env: { ...process.env, ...spec.env },
|
|
220
|
+
});
|
|
221
|
+
spec.pid = process.pid;
|
|
222
|
+
const clients = new Set();
|
|
223
|
+
let replay = Buffer.alloc(0);
|
|
224
|
+
let hostSocket = null;
|
|
225
|
+
let heartbeat = null;
|
|
226
|
+
let exited = false;
|
|
227
|
+
const broadcast = (frame) => {
|
|
228
|
+
const encoded = encodeFrame(frame);
|
|
229
|
+
for (const client of clients) {
|
|
230
|
+
client.write(encoded);
|
|
231
|
+
}
|
|
232
|
+
if (hostSocket !== null && hostSocket.readyState === WebSocket.OPEN) {
|
|
233
|
+
hostSocket.send(JSON.stringify(frame));
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
pty.onData((chunk) => {
|
|
237
|
+
replay = Buffer.concat([replay, chunk]);
|
|
238
|
+
if (replay.length > REPLAY_BUFFER_LIMIT) {
|
|
239
|
+
replay = replay.subarray(replay.length - REPLAY_BUFFER_LIMIT);
|
|
240
|
+
}
|
|
241
|
+
broadcast({ t: "o", d: chunk.toString("base64") });
|
|
242
|
+
});
|
|
243
|
+
const cleanup = async (code) => {
|
|
244
|
+
if (exited) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
exited = true;
|
|
248
|
+
if (heartbeat !== null) {
|
|
249
|
+
clearInterval(heartbeat);
|
|
250
|
+
}
|
|
251
|
+
broadcast({ t: "exit", code });
|
|
252
|
+
for (const client of clients) {
|
|
253
|
+
client.end();
|
|
254
|
+
}
|
|
255
|
+
hostSocket?.close();
|
|
256
|
+
if (config !== null && spec.runtimeId !== undefined) {
|
|
257
|
+
try {
|
|
258
|
+
await loreApiRequest(config, "POST", `/v1/runtimes/${spec.runtimeId}/heartbeat`, LiveRuntimeSchema, { status: "exited" });
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// The hub may be unreachable; local cleanup still applies.
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
await rm(specPath(paths, id), { force: true });
|
|
265
|
+
await rm(socketPath(paths, id), { force: true });
|
|
266
|
+
process.exit(code ?? 0);
|
|
267
|
+
};
|
|
268
|
+
pty.onExit((code) => {
|
|
269
|
+
void cleanup(code);
|
|
270
|
+
});
|
|
271
|
+
process.on("SIGTERM", () => {
|
|
272
|
+
pty.kill("SIGTERM");
|
|
273
|
+
});
|
|
274
|
+
const handleClientFrame = (frame) => {
|
|
275
|
+
if (frame.t === "i" && typeof frame.d === "string") {
|
|
276
|
+
pty.write(Buffer.from(frame.d, "base64"));
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (frame.t === "resize" &&
|
|
280
|
+
typeof frame.cols === "number" &&
|
|
281
|
+
typeof frame.rows === "number") {
|
|
282
|
+
pty.resize(frame.cols, frame.rows);
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
const server = createServer((client) => {
|
|
286
|
+
clients.add(client);
|
|
287
|
+
client.write(encodeFrame({ t: "replay", d: replay.toString("base64") }));
|
|
288
|
+
client.on("data", frameParser(handleClientFrame));
|
|
289
|
+
client.on("close", () => {
|
|
290
|
+
clients.delete(client);
|
|
291
|
+
});
|
|
292
|
+
client.on("error", () => {
|
|
293
|
+
clients.delete(client);
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
const sock = socketPath(paths, id);
|
|
297
|
+
await rm(sock, { force: true });
|
|
298
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
299
|
+
server.once("error", rejectPromise);
|
|
300
|
+
server.listen(sock, resolvePromise);
|
|
301
|
+
});
|
|
302
|
+
await chmod(sock, 0o600);
|
|
303
|
+
await writeSpec(paths, spec);
|
|
304
|
+
// Hub link is best-effort: the live session works locally even when the
|
|
305
|
+
// hub is unreachable or does not support runtimes yet.
|
|
306
|
+
if (config !== null) {
|
|
307
|
+
try {
|
|
308
|
+
const machine = await ensureMachineRegistered(config, paths);
|
|
309
|
+
const runtime = await loreApiRequest(config, "POST", "/v1/runtimes", LiveRuntimeSchema, {
|
|
310
|
+
machineId: machine.id,
|
|
311
|
+
connector: "lore-cli",
|
|
312
|
+
externalSessionId: spec.externalSessionId,
|
|
313
|
+
agent: spec.agent,
|
|
314
|
+
command: [spec.command, ...spec.args].join(" ").slice(0, 500),
|
|
315
|
+
...(spec.repo === undefined ? {} : { repo: spec.repo }),
|
|
316
|
+
...(spec.project === undefined ? {} : { project: spec.project }),
|
|
317
|
+
});
|
|
318
|
+
spec.runtimeId = runtime.id;
|
|
319
|
+
await writeSpec(paths, spec);
|
|
320
|
+
heartbeat = setInterval(() => {
|
|
321
|
+
void loreApiRequest(config, "POST", `/v1/runtimes/${runtime.id}/heartbeat`, LiveRuntimeSchema, { status: "running" }).catch(() => undefined);
|
|
322
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
323
|
+
connectHostRelay(config, runtime.id);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Local-only live session.
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function connectHostRelay(activeConfig, runtimeId) {
|
|
330
|
+
const socket = new WebSocket(wsUrl(activeConfig.apiUrl, runtimeId, "host"), {
|
|
331
|
+
headers: { authorization: `Bearer ${activeConfig.token}` },
|
|
332
|
+
});
|
|
333
|
+
socket.on("message", (raw) => {
|
|
334
|
+
try {
|
|
335
|
+
const frame = JSON.parse(String(raw));
|
|
336
|
+
if (frame.t === "joined" && typeof frame.client === "string") {
|
|
337
|
+
socket.send(JSON.stringify({
|
|
338
|
+
t: "replay",
|
|
339
|
+
to: frame.client,
|
|
340
|
+
d: replay.toString("base64"),
|
|
341
|
+
}));
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
handleClientFrame(frame);
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// Ignore malformed frames.
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
socket.on("close", () => {
|
|
351
|
+
if (!exited) {
|
|
352
|
+
setTimeout(() => {
|
|
353
|
+
connectHostRelay(activeConfig, runtimeId);
|
|
354
|
+
}, 5_000).unref();
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
socket.on("error", () => {
|
|
358
|
+
// close handler schedules the reconnect.
|
|
359
|
+
});
|
|
360
|
+
hostSocket = socket;
|
|
361
|
+
}
|
|
362
|
+
// Keep the daemon alive until the PTY exits.
|
|
363
|
+
await new Promise(() => undefined);
|
|
364
|
+
}
|
|
365
|
+
function runTerminalLoop(transport, onEnd) {
|
|
366
|
+
const stdin = process.stdin;
|
|
367
|
+
const isTty = stdin.isTTY === true;
|
|
368
|
+
if (isTty) {
|
|
369
|
+
stdin.setRawMode(true);
|
|
370
|
+
}
|
|
371
|
+
stdin.resume();
|
|
372
|
+
const sendResize = () => {
|
|
373
|
+
transport.send({
|
|
374
|
+
t: "resize",
|
|
375
|
+
cols: process.stdout.columns ?? 80,
|
|
376
|
+
rows: process.stdout.rows ?? 24,
|
|
377
|
+
});
|
|
378
|
+
};
|
|
379
|
+
const onStdin = (chunk) => {
|
|
380
|
+
if (isTty && chunk.includes(DETACH_BYTE)) {
|
|
381
|
+
end("Detached. The session keeps running; reattach with lore attach.");
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
transport.send({ t: "i", d: chunk.toString("base64") });
|
|
385
|
+
};
|
|
386
|
+
stdin.on("data", onStdin);
|
|
387
|
+
process.on("SIGWINCH", sendResize);
|
|
388
|
+
sendResize();
|
|
389
|
+
let ended = false;
|
|
390
|
+
const end = (message) => {
|
|
391
|
+
if (ended) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
ended = true;
|
|
395
|
+
stdin.off("data", onStdin);
|
|
396
|
+
process.off("SIGWINCH", sendResize);
|
|
397
|
+
if (isTty) {
|
|
398
|
+
stdin.setRawMode(false);
|
|
399
|
+
}
|
|
400
|
+
stdin.pause();
|
|
401
|
+
transport.close();
|
|
402
|
+
process.stdout.write(`\r\n[lore] ${message}\r\n`);
|
|
403
|
+
onEnd(message);
|
|
404
|
+
};
|
|
405
|
+
return {
|
|
406
|
+
handleFrame(frame) {
|
|
407
|
+
if ((frame.t === "o" || frame.t === "replay") &&
|
|
408
|
+
typeof frame.d === "string") {
|
|
409
|
+
process.stdout.write(Buffer.from(frame.d, "base64"));
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (frame.t === "exit") {
|
|
413
|
+
end(`Session exited (code ${frame.code ?? 0}).`);
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
if (frame.t === "host-gone") {
|
|
417
|
+
end("The hosting machine disconnected.");
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
async function attachLocal(paths, id) {
|
|
423
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
424
|
+
const socket = createConnection(socketPath(paths, id));
|
|
425
|
+
socket.once("error", () => {
|
|
426
|
+
rejectPromise(new Error("Could not reach the live session. It may have exited; run lore attach --list."));
|
|
427
|
+
});
|
|
428
|
+
socket.once("connect", () => {
|
|
429
|
+
const loop = runTerminalLoop({
|
|
430
|
+
send(frame) {
|
|
431
|
+
socket.write(encodeFrame(frame));
|
|
432
|
+
},
|
|
433
|
+
close() {
|
|
434
|
+
socket.end();
|
|
435
|
+
},
|
|
436
|
+
}, () => {
|
|
437
|
+
resolvePromise();
|
|
438
|
+
});
|
|
439
|
+
socket.on("data", frameParser(loop.handleFrame));
|
|
440
|
+
socket.on("close", () => {
|
|
441
|
+
resolvePromise();
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
async function attachRemote(config, runtime) {
|
|
447
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
448
|
+
const socket = new WebSocket(wsUrl(config.apiUrl, runtime.id, "client"), {
|
|
449
|
+
headers: { authorization: `Bearer ${config.token}` },
|
|
450
|
+
});
|
|
451
|
+
socket.on("error", () => {
|
|
452
|
+
rejectPromise(new Error("Could not reach the live session relay. Check connectivity and server version."));
|
|
453
|
+
});
|
|
454
|
+
socket.on("open", () => {
|
|
455
|
+
const loop = runTerminalLoop({
|
|
456
|
+
send(frame) {
|
|
457
|
+
if (socket.readyState === WebSocket.OPEN) {
|
|
458
|
+
socket.send(JSON.stringify(frame));
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
close() {
|
|
462
|
+
socket.close();
|
|
463
|
+
},
|
|
464
|
+
}, () => {
|
|
465
|
+
resolvePromise();
|
|
466
|
+
});
|
|
467
|
+
socket.on("message", (raw) => {
|
|
468
|
+
try {
|
|
469
|
+
loop.handleFrame(JSON.parse(String(raw)));
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
// Ignore malformed frames.
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
socket.on("close", () => {
|
|
476
|
+
resolvePromise();
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
function describeRuntime(runtime) {
|
|
482
|
+
const where = runtime.repo ?? runtime.project ?? "no repo";
|
|
483
|
+
return `${runtime.id.slice(0, 8)} · ${runtime.agent} · ${where} · started ${runtime.startedAt.slice(0, 16).replace("T", " ")} · ${runtime.machineName}`;
|
|
484
|
+
}
|
|
485
|
+
export async function runAttachCommand(args, config, paths) {
|
|
486
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
487
|
+
process.stdout.write(ATTACH_HELP);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
let from;
|
|
491
|
+
let runtimeId;
|
|
492
|
+
let list = false;
|
|
493
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
494
|
+
const argument = args[index];
|
|
495
|
+
if (argument === "--from" || argument === "--runtime") {
|
|
496
|
+
const value = args[index + 1];
|
|
497
|
+
if (value === undefined) {
|
|
498
|
+
throw new Error(`Missing value for ${argument}`);
|
|
499
|
+
}
|
|
500
|
+
index += 1;
|
|
501
|
+
if (argument === "--from") {
|
|
502
|
+
from = value.toLowerCase();
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
runtimeId = value;
|
|
506
|
+
}
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
if (argument === "--list") {
|
|
510
|
+
list = true;
|
|
511
|
+
continue;
|
|
512
|
+
}
|
|
513
|
+
throw new Error(`Unknown attach option: ${String(argument)}`);
|
|
514
|
+
}
|
|
515
|
+
if (from !== undefined) {
|
|
516
|
+
if (config === null) {
|
|
517
|
+
throw new Error("Lore is not connected. Run: lore connect --token <workspace-token>");
|
|
518
|
+
}
|
|
519
|
+
const local = await readMachineIdentity(paths);
|
|
520
|
+
if (local?.name === from) {
|
|
521
|
+
// Attaching to "this" machine goes through the local socket path below.
|
|
522
|
+
from = undefined;
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
const response = await loreApiRequest(config, "GET", `/v1/runtimes?machine=${encodeURIComponent(from)}&status=running`, ListRuntimesResponseSchema);
|
|
526
|
+
const runtimes = response.runtimes.filter((runtime) => runtimeId === undefined || runtime.id === runtimeId);
|
|
527
|
+
if (runtimes.length === 0) {
|
|
528
|
+
throw new Error(`No running live sessions on "${from}". See lore machines.`);
|
|
529
|
+
}
|
|
530
|
+
if (list || (runtimes.length > 1 && runtimeId === undefined)) {
|
|
531
|
+
for (const runtime of runtimes) {
|
|
532
|
+
process.stdout.write(`${describeRuntime(runtime)}\n`);
|
|
533
|
+
}
|
|
534
|
+
if (!list) {
|
|
535
|
+
process.stdout.write("\nSeveral live sessions are running. Pick one with --runtime <id>.\n");
|
|
536
|
+
}
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
const runtime = runtimes[0];
|
|
540
|
+
if (runtime === undefined) {
|
|
541
|
+
throw new Error("No live session found.");
|
|
542
|
+
}
|
|
543
|
+
process.stdout.write(`Attaching to ${runtime.agent} on ${runtime.machineName} (Ctrl-] to detach)\n`);
|
|
544
|
+
await attachRemote(config, runtime);
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
const specs = (await listLocalSpecs(paths)).filter((spec) => runtimeId === undefined || spec.id.startsWith(runtimeId));
|
|
549
|
+
if (specs.length === 0) {
|
|
550
|
+
throw new Error("No live sessions on this machine. Start one with lore resume --live, or attach to another machine with lore attach --from <machine>.");
|
|
551
|
+
}
|
|
552
|
+
if (list || (specs.length > 1 && runtimeId === undefined)) {
|
|
553
|
+
for (const spec of specs) {
|
|
554
|
+
const where = spec.repo ?? spec.project ?? "no repo";
|
|
555
|
+
process.stdout.write(`${spec.id.slice(0, 8)} · ${spec.agent} · ${where} · started ${spec.createdAt.slice(0, 16).replace("T", " ")}\n`);
|
|
556
|
+
}
|
|
557
|
+
if (!list) {
|
|
558
|
+
process.stdout.write("\nSeveral live sessions are running. Pick one with --runtime <id>.\n");
|
|
559
|
+
}
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
const spec = specs[0];
|
|
563
|
+
if (spec === undefined) {
|
|
564
|
+
throw new Error("No live session found.");
|
|
565
|
+
}
|
|
566
|
+
process.stdout.write(`Attaching to ${spec.agent} (Ctrl-] to detach; the session survives detach)\n`);
|
|
567
|
+
await attachLocal(paths, spec.id);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Hidden helper for starting an arbitrary command as a live session; used by
|
|
571
|
+
* integration tests and power users. Normal flows go through
|
|
572
|
+
* `lore resume --live` / `lore continue --on <agent> --live`.
|
|
573
|
+
*/
|
|
574
|
+
export async function runLiveRunCommand(args, config, paths) {
|
|
575
|
+
const separator = args.indexOf("--");
|
|
576
|
+
if (separator === -1 || separator === args.length - 1) {
|
|
577
|
+
throw new Error("Usage: lore live-run [--no-attach] -- <command> [args…]");
|
|
578
|
+
}
|
|
579
|
+
const flags = args.slice(0, separator);
|
|
580
|
+
const commandArgs = [...args.slice(separator + 1)];
|
|
581
|
+
const command = commandArgs.shift();
|
|
582
|
+
if (command === undefined) {
|
|
583
|
+
throw new Error("live-run requires a command after --");
|
|
584
|
+
}
|
|
585
|
+
if (config === null) {
|
|
586
|
+
throw new Error("Lore is not connected. Run: lore connect --token <workspace-token>");
|
|
587
|
+
}
|
|
588
|
+
await hostLiveRuntime({
|
|
589
|
+
config,
|
|
590
|
+
paths,
|
|
591
|
+
command,
|
|
592
|
+
args: commandArgs,
|
|
593
|
+
agent: command,
|
|
594
|
+
attach: !flags.includes("--no-attach"),
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
//# sourceMappingURL=live.js.map
|
package/dist/live.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ConnectorConfig, LorePaths } from "./cli.js";
|
|
2
|
+
export interface MachineIdentity {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function machineIdentityPath(paths: LorePaths): string;
|
|
7
|
+
/**
|
|
8
|
+
* Derives a stable, human-meaningful default machine name from the hostname
|
|
9
|
+
* ("Dantes-MacBook-Pro.local" → "dantes-macbook-pro").
|
|
10
|
+
*/
|
|
11
|
+
export declare function defaultMachineName(): string;
|
|
12
|
+
export declare function readMachineIdentity(paths: LorePaths): Promise<MachineIdentity | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Registers this machine with the workspace (idempotent upsert by name) and
|
|
15
|
+
* records the identity locally so hooks can attribute sessions to it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ensureMachineRegistered(config: ConnectorConfig, paths: LorePaths, name?: string): Promise<MachineIdentity>;
|
|
18
|
+
export declare function runMachinesCommand(args: readonly string[], config: ConnectorConfig | null, paths: LorePaths): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../src/machine.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAc3D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmBjC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CA2B1B;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAqCf"}
|