@heyditto/cli 2.11.0 → 2.12.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 (47) hide show
  1. package/README.md +76 -0
  2. package/dist/agents/launch.d.ts +11 -0
  3. package/dist/agents/launch.js +207 -9
  4. package/dist/agents/launch.js.map +1 -1
  5. package/dist/cli.js +2 -0
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands.js +5 -1
  8. package/dist/commands.js.map +1 -1
  9. package/dist/remote/attachments.d.ts +22 -0
  10. package/dist/remote/attachments.js +0 -0
  11. package/dist/remote/attachments.js.map +1 -0
  12. package/dist/remote/catalog.d.ts +18 -0
  13. package/dist/remote/catalog.js +309 -0
  14. package/dist/remote/catalog.js.map +1 -0
  15. package/dist/remote/controller.d.ts +76 -0
  16. package/dist/remote/controller.js +352 -0
  17. package/dist/remote/controller.js.map +1 -0
  18. package/dist/remote/fork-command.d.ts +8 -0
  19. package/dist/remote/fork-command.js +50 -0
  20. package/dist/remote/fork-command.js.map +1 -0
  21. package/dist/remote/fork.d.ts +22 -0
  22. package/dist/remote/fork.js +113 -0
  23. package/dist/remote/fork.js.map +1 -0
  24. package/dist/remote/headless.d.ts +30 -0
  25. package/dist/remote/headless.js +75 -0
  26. package/dist/remote/headless.js.map +1 -0
  27. package/dist/remote/hook.d.ts +2 -0
  28. package/dist/remote/hook.js +69 -0
  29. package/dist/remote/hook.js.map +1 -0
  30. package/dist/remote/hooks.d.ts +30 -0
  31. package/dist/remote/hooks.js +95 -0
  32. package/dist/remote/hooks.js.map +1 -0
  33. package/dist/remote/host.d.ts +63 -0
  34. package/dist/remote/host.js +240 -0
  35. package/dist/remote/host.js.map +1 -0
  36. package/dist/remote/protocol.d.ts +163 -0
  37. package/dist/remote/protocol.js +11 -0
  38. package/dist/remote/protocol.js.map +1 -0
  39. package/dist/remote/pty.d.ts +57 -0
  40. package/dist/remote/pty.js +104 -0
  41. package/dist/remote/pty.js.map +1 -0
  42. package/dist/store.d.ts +2 -0
  43. package/dist/store.js.map +1 -1
  44. package/dist/teleport/commands.d.ts +6 -0
  45. package/dist/teleport/commands.js +11 -0
  46. package/dist/teleport/commands.js.map +1 -1
  47. package/package.json +6 -2
@@ -0,0 +1,240 @@
1
+ import os from "node:os";
2
+ import { packageVersion } from "../config.js";
3
+ import { readStoredAuth, updateStoredAuth } from "../store.js";
4
+ import { HOST_WS_PATH, isServerFrame, } from "./protocol.js";
5
+ const SEEN_TURNS_MAX = 1000;
6
+ function wsUrl(baseUrl) {
7
+ const u = new URL(baseUrl);
8
+ u.protocol = u.protocol === "https:" ? "wss:" : "ws:";
9
+ u.pathname = `${u.pathname.replace(/\/+$/, "")}${HOST_WS_PATH}`;
10
+ u.search = "";
11
+ return u.toString();
12
+ }
13
+ export class HostClient {
14
+ options;
15
+ hostId;
16
+ socket;
17
+ connected = false;
18
+ closing = false;
19
+ attempt = 0;
20
+ heartbeat;
21
+ missedPongs = 0;
22
+ sessions = new Map();
23
+ catalogs = new Map();
24
+ seenTurns = [];
25
+ seenSet = new Set();
26
+ welcomeWaiters = [];
27
+ constructor(options) {
28
+ this.options = options;
29
+ }
30
+ get isConnected() {
31
+ return this.connected;
32
+ }
33
+ /** Starts connecting; resolves after the first `welcome` or after `timeoutMs` (still retrying in the background). */
34
+ async start(timeoutMs = 4000) {
35
+ this.hostId = (await readStoredAuth())?.hostId;
36
+ void this.connectLoop();
37
+ return new Promise((resolve) => {
38
+ const timer = setTimeout(() => resolve(false), timeoutMs);
39
+ this.welcomeWaiters.push(() => {
40
+ clearTimeout(timer);
41
+ resolve(true);
42
+ });
43
+ });
44
+ }
45
+ async connectLoop() {
46
+ while (!this.closing) {
47
+ try {
48
+ await this.connectOnce();
49
+ }
50
+ catch (err) {
51
+ this.options.log?.(`remote control: ${err instanceof Error ? err.message : String(err)}`);
52
+ }
53
+ if (this.closing)
54
+ return;
55
+ const base = this.options.reconnectBaseMs ?? 1000;
56
+ const max = this.options.reconnectMaxMs ?? 30_000;
57
+ const delay = Math.min(max, base * 2 ** Math.min(this.attempt, 6)) * (0.75 + Math.random() * 0.5);
58
+ this.attempt += 1;
59
+ await new Promise((r) => setTimeout(r, delay));
60
+ }
61
+ }
62
+ connectOnce() {
63
+ return new Promise((resolve, reject) => {
64
+ const socket = new WebSocket(wsUrl(this.options.baseUrl), {
65
+ // Node's WebSocket (undici) accepts request headers; browsers do not, but this is the CLI.
66
+ headers: { Authorization: `Bearer ${this.options.apiKey}` },
67
+ });
68
+ this.socket = socket;
69
+ // Resolves only once the socket closes after a successful welcome, so the
70
+ // loop never opens a second connection next to a live one.
71
+ let welcomed = false;
72
+ let settled = false;
73
+ const fail = (message) => {
74
+ if (settled)
75
+ return;
76
+ settled = true;
77
+ reject(new Error(message));
78
+ };
79
+ socket.addEventListener("open", () => {
80
+ this.send({
81
+ type: "hello",
82
+ kind: "cli",
83
+ name: this.options.name ?? os.hostname(),
84
+ platform: `${process.platform}-${process.arch}`,
85
+ version: packageVersion,
86
+ capabilities: this.options.capabilities,
87
+ ...(this.hostId ? { hostId: this.hostId } : {}),
88
+ });
89
+ });
90
+ socket.addEventListener("message", (event) => {
91
+ let parsed;
92
+ try {
93
+ parsed = JSON.parse(typeof event.data === "string" ? event.data : String(event.data));
94
+ }
95
+ catch {
96
+ return;
97
+ }
98
+ if (!isServerFrame(parsed))
99
+ return;
100
+ if (parsed.type === "welcome") {
101
+ welcomed = true;
102
+ this.onWelcome(parsed);
103
+ return;
104
+ }
105
+ this.dispatch(parsed);
106
+ });
107
+ socket.addEventListener("error", () => fail("connection failed"));
108
+ socket.addEventListener("close", (event) => {
109
+ this.stopHeartbeat();
110
+ const wasConnected = this.connected;
111
+ this.connected = false;
112
+ if (wasConnected && !this.closing)
113
+ this.options.log?.(`remote control: disconnected (${event.code}); reconnecting`);
114
+ if (welcomed) {
115
+ if (!settled) {
116
+ settled = true;
117
+ resolve();
118
+ }
119
+ return;
120
+ }
121
+ fail(`closed (${event.code}${event.reason ? ` ${event.reason}` : ""})`);
122
+ });
123
+ });
124
+ }
125
+ onWelcome(frame) {
126
+ this.connected = true;
127
+ this.attempt = 0;
128
+ this.missedPongs = 0;
129
+ if (frame.hostId && frame.hostId !== this.hostId) {
130
+ this.hostId = frame.hostId;
131
+ void updateStoredAuth({ hostId: frame.hostId }).catch(() => undefined);
132
+ }
133
+ this.startHeartbeat(frame.heartbeatSeconds || this.options.heartbeatSeconds || 30);
134
+ for (const session of this.sessions.values()) {
135
+ this.send(session);
136
+ const catalog = this.catalogs.get(session.sessionId);
137
+ if (catalog)
138
+ this.send(catalog);
139
+ }
140
+ const waiters = this.welcomeWaiters;
141
+ this.welcomeWaiters = [];
142
+ for (const w of waiters)
143
+ w();
144
+ }
145
+ dispatch(frame) {
146
+ switch (frame.type) {
147
+ case "ping":
148
+ this.send({ type: "pong", t: frame.t });
149
+ return;
150
+ case "pong":
151
+ this.missedPongs = 0;
152
+ return;
153
+ case "turn.deliver":
154
+ if (this.seenSet.has(frame.turnId)) {
155
+ this.send({ type: "turn.ack", turnId: frame.turnId });
156
+ return;
157
+ }
158
+ this.remember(frame.turnId);
159
+ this.options.handlers.onTurn(frame);
160
+ return;
161
+ case "turn.interrupt":
162
+ this.options.handlers.onInterrupt(frame.turnId);
163
+ return;
164
+ case "checkpoint.request":
165
+ this.options.handlers.onCheckpoint(frame);
166
+ return;
167
+ case "prompt.answer":
168
+ this.options.handlers.onPromptAnswer?.(frame);
169
+ return;
170
+ default:
171
+ return;
172
+ }
173
+ }
174
+ remember(turnId) {
175
+ this.seenSet.add(turnId);
176
+ this.seenTurns.push(turnId);
177
+ if (this.seenTurns.length > SEEN_TURNS_MAX) {
178
+ const old = this.seenTurns.shift();
179
+ if (old)
180
+ this.seenSet.delete(old);
181
+ }
182
+ }
183
+ startHeartbeat(seconds) {
184
+ this.stopHeartbeat();
185
+ this.heartbeat = setInterval(() => {
186
+ if (this.missedPongs >= 3) {
187
+ this.options.log?.("remote control: heartbeat lost; reconnecting");
188
+ this.socket?.close(4000, "heartbeat lost");
189
+ return;
190
+ }
191
+ this.missedPongs += 1;
192
+ this.send({ type: "ping", t: Date.now() });
193
+ }, Math.max(1, seconds) * 1000);
194
+ this.heartbeat.unref?.();
195
+ }
196
+ stopHeartbeat() {
197
+ if (this.heartbeat)
198
+ clearInterval(this.heartbeat);
199
+ this.heartbeat = undefined;
200
+ }
201
+ send(frame) {
202
+ const socket = this.socket;
203
+ if (!socket || socket.readyState !== WebSocket.OPEN)
204
+ return false;
205
+ socket.send(JSON.stringify(frame));
206
+ return true;
207
+ }
208
+ announce(session) {
209
+ const frame = { type: "session.announce", ...session };
210
+ this.sessions.set(session.sessionId, frame);
211
+ this.send(frame);
212
+ }
213
+ /** Announces a session's command catalog; re-sent with the session after a reconnect. */
214
+ commands(frame) {
215
+ const full = { type: "session.commands", ...frame };
216
+ this.catalogs.set(frame.sessionId, full);
217
+ this.send(full);
218
+ }
219
+ status(sessionId, status) {
220
+ const known = this.sessions.get(sessionId);
221
+ if (known)
222
+ known.status = status;
223
+ this.send({ type: "session.status", sessionId, status });
224
+ }
225
+ closed(sessionId) {
226
+ this.sessions.delete(sessionId);
227
+ this.catalogs.delete(sessionId);
228
+ this.send({ type: "session.closed", sessionId });
229
+ }
230
+ /** Announces every session closed and stops reconnecting. */
231
+ close() {
232
+ this.closing = true;
233
+ this.stopHeartbeat();
234
+ for (const id of [...this.sessions.keys()])
235
+ this.closed(id);
236
+ this.socket?.close(1000, "host exiting");
237
+ this.socket = undefined;
238
+ }
239
+ }
240
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/remote/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Host bridge protocol v1 — the JSON frames a Remote Control host (this CLI,
3
+ * or ditto-desktop) exchanges with the backend over one WebSocket. Field
4
+ * names are the contract shared with the backend; keep them stable.
5
+ */
6
+ export declare const HOST_WS_PATH = "/api/v5/hosts/ws";
7
+ export declare const PROTOCOL_VERSION = "1.1";
8
+ export type HostKind = "cli" | "desktop";
9
+ export type SessionMode = "tui" | "headless";
10
+ export type SessionStatus = "idle" | "running";
11
+ export type HarnessName = "claude-code" | "codex";
12
+ export interface HostCapabilities {
13
+ harnesses: HarnessName[];
14
+ attachments: true;
15
+ headless: boolean;
16
+ teleport: boolean;
17
+ }
18
+ export interface HelloFrame {
19
+ type: "hello";
20
+ kind: HostKind;
21
+ name: string;
22
+ platform: string;
23
+ version: string;
24
+ capabilities: HostCapabilities;
25
+ /** Identity from an earlier `welcome`, so the same machine keeps its host id. */
26
+ hostId?: string;
27
+ }
28
+ export interface WelcomeFrame {
29
+ type: "welcome";
30
+ hostId: string;
31
+ heartbeatSeconds: number;
32
+ serverTime: string;
33
+ }
34
+ export interface SessionAnnounceFrame {
35
+ type: "session.announce";
36
+ sessionId: string;
37
+ harness: HarnessName;
38
+ cwd: string;
39
+ mode: SessionMode;
40
+ status: SessionStatus;
41
+ }
42
+ export interface SessionStatusFrame {
43
+ type: "session.status";
44
+ sessionId: string;
45
+ status: SessionStatus;
46
+ }
47
+ export interface SessionClosedFrame {
48
+ type: "session.closed";
49
+ sessionId: string;
50
+ }
51
+ export interface Attachment {
52
+ id: string;
53
+ name: string;
54
+ mime: string;
55
+ size: number;
56
+ sha256: string;
57
+ /** Presigned GET url, valid for about 15 minutes. */
58
+ url: string;
59
+ }
60
+ export type TurnKind = "prompt" | "command" | "answer";
61
+ export interface TurnDeliverFrame {
62
+ type: "turn.deliver";
63
+ turnId: string;
64
+ sessionId: string;
65
+ /** Default "prompt". */
66
+ kind?: TurnKind;
67
+ text: string;
68
+ attachments?: Attachment[];
69
+ /** kind "command": a harness slash command / skill from the session's catalog. */
70
+ command?: {
71
+ name: string;
72
+ args?: string;
73
+ };
74
+ /** kind "answer": the user's reply to a `prompt.request`. */
75
+ answer?: {
76
+ promptId: string;
77
+ value: string;
78
+ };
79
+ }
80
+ export type CommandSource = "builtin" | "custom" | "skill" | "plugin";
81
+ /** One entry of a session's command catalog (`session.commands`). */
82
+ export interface CommandEntry {
83
+ /** As typed after the slash (Claude `review`, `frontend-design:frontend-design`; Codex `prompts:deploy`), or `$skill` for Codex skills. */
84
+ name: string;
85
+ description: string;
86
+ source: CommandSource;
87
+ argsHint?: string;
88
+ /** Whether the command works in a headless session (`claude -p "/name args"` / `codex exec`). */
89
+ headless: boolean;
90
+ }
91
+ export interface SessionCommandsFrame {
92
+ type: "session.commands";
93
+ sessionId: string;
94
+ harness: HarnessName;
95
+ commands: CommandEntry[];
96
+ }
97
+ export type PromptKind = "permission" | "question" | "choice";
98
+ export interface PromptRequestFrame {
99
+ type: "prompt.request";
100
+ promptId: string;
101
+ sessionId: string;
102
+ kind: PromptKind;
103
+ text: string;
104
+ options?: Array<{
105
+ id: string;
106
+ label: string;
107
+ }>;
108
+ default?: string;
109
+ }
110
+ export interface PromptAnswerFrame {
111
+ type: "prompt.answer";
112
+ promptId: string;
113
+ value: string;
114
+ }
115
+ export interface TurnInterruptFrame {
116
+ type: "turn.interrupt";
117
+ turnId: string;
118
+ }
119
+ export interface CheckpointRequestFrame {
120
+ type: "checkpoint.request";
121
+ sessionId: string;
122
+ reason?: string;
123
+ }
124
+ export interface TurnAckFrame {
125
+ type: "turn.ack";
126
+ turnId: string;
127
+ }
128
+ export interface TurnStartedFrame {
129
+ type: "turn.started";
130
+ turnId: string;
131
+ }
132
+ export interface TurnFinishedFrame {
133
+ type: "turn.finished";
134
+ turnId: string;
135
+ exitCode?: number | null;
136
+ interrupted?: boolean;
137
+ error?: string;
138
+ /** The command cannot run in this session's mode (e.g. a TUI-only builtin in headless mode). */
139
+ unsupported?: string;
140
+ }
141
+ export interface CheckpointDoneFrame {
142
+ type: "checkpoint.done";
143
+ sessionId: string;
144
+ generation: number;
145
+ }
146
+ export interface CheckpointFailedFrame {
147
+ type: "checkpoint.failed";
148
+ sessionId: string;
149
+ error: string;
150
+ }
151
+ export interface PingFrame {
152
+ type: "ping";
153
+ t?: number;
154
+ }
155
+ export interface PongFrame {
156
+ type: "pong";
157
+ t?: number;
158
+ }
159
+ /** Frames the host sends. */
160
+ export type HostFrame = HelloFrame | SessionAnnounceFrame | SessionStatusFrame | SessionClosedFrame | SessionCommandsFrame | PromptRequestFrame | TurnAckFrame | TurnStartedFrame | TurnFinishedFrame | CheckpointDoneFrame | CheckpointFailedFrame | PingFrame | PongFrame;
161
+ /** Frames the backend sends. */
162
+ export type ServerFrame = WelcomeFrame | TurnDeliverFrame | TurnInterruptFrame | CheckpointRequestFrame | PromptAnswerFrame | PingFrame | PongFrame;
163
+ export declare function isServerFrame(value: unknown): value is ServerFrame;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Host bridge protocol v1 — the JSON frames a Remote Control host (this CLI,
3
+ * or ditto-desktop) exchanges with the backend over one WebSocket. Field
4
+ * names are the contract shared with the backend; keep them stable.
5
+ */
6
+ export const HOST_WS_PATH = "/api/v5/hosts/ws";
7
+ export const PROTOCOL_VERSION = "1.1";
8
+ export function isServerFrame(value) {
9
+ return typeof value === "object" && value !== null && typeof value.type === "string";
10
+ }
11
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/remote/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AA6LtC,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC/G,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { Harness } from "../agents/types.js";
2
+ /**
3
+ * Runs a harness inside a pseudo-terminal this process owns, mirrored to the
4
+ * real terminal, so Remote Control can type into the harness's own input box
5
+ * exactly as the user would. `@lydell/node-pty` is an optional dependency
6
+ * (node-pty repackaged as script-free prebuilt binaries per platform): when
7
+ * it is missing the launcher falls back to a plain spawn and says why remote
8
+ * control is off.
9
+ */
10
+ interface PtyModule {
11
+ spawn(file: string, args: string[], options: {
12
+ name: string;
13
+ cols: number;
14
+ rows: number;
15
+ cwd: string;
16
+ env: NodeJS.ProcessEnv;
17
+ }): PtyProcess;
18
+ }
19
+ interface PtyProcess {
20
+ onData(cb: (data: string) => void): void;
21
+ onExit(cb: (e: {
22
+ exitCode: number;
23
+ signal?: number;
24
+ }) => void): void;
25
+ write(data: string): void;
26
+ resize(cols: number, rows: number): void;
27
+ kill(signal?: string): void;
28
+ pid: number;
29
+ }
30
+ /** Loads the PTY module, or explains what is missing. */
31
+ export declare function loadPty(): {
32
+ pty?: PtyModule;
33
+ reason?: string;
34
+ };
35
+ export interface PtySession {
36
+ pid: number;
37
+ /** Writes raw bytes to the harness's input. */
38
+ write(data: string): void;
39
+ /** Pastes a prompt (bracketed, so newlines survive) and submits it. */
40
+ inject(prompt: string): Promise<void>;
41
+ /** Sends the harness its interrupt key. */
42
+ interrupt(harness: Harness): void;
43
+ /** Milliseconds since the harness last wrote to the screen. */
44
+ quietFor(): number;
45
+ /** Resolves with the exit code once the harness exits. */
46
+ exit: Promise<number | null>;
47
+ kill(): void;
48
+ }
49
+ export interface PtyOptions {
50
+ cwd: string;
51
+ env: NodeJS.ProcessEnv;
52
+ /** Mirror to the real terminal (raw mode, resize). Tests can turn it off. */
53
+ attachTerminal?: boolean;
54
+ onOutput?: (data: string) => void;
55
+ }
56
+ export declare function spawnInPty(command: string, args: string[], options: PtyOptions): Promise<PtySession>;
57
+ export {};
@@ -0,0 +1,104 @@
1
+ import { chmod } from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ const requireModule = createRequire(import.meta.url);
5
+ const PTY_PACKAGE = "@lydell/node-pty";
6
+ /** The per-platform package that carries the prebuilt binary. */
7
+ const PTY_PLATFORM_PACKAGE = `${PTY_PACKAGE}-${process.platform}-${process.arch}`;
8
+ /** Loads the PTY module, or explains what is missing. */
9
+ export function loadPty() {
10
+ try {
11
+ return { pty: requireModule(PTY_PACKAGE) };
12
+ }
13
+ catch (err) {
14
+ const message = err instanceof Error ? err.message : String(err);
15
+ return {
16
+ reason: `${PTY_PACKAGE} is not installed or has no prebuilt binary for ${process.platform}-${process.arch} (${message.split("\n")[0]}); reinstall with \`npm i -g @heyditto/cli\` without \`--omit=optional\``,
17
+ };
18
+ }
19
+ }
20
+ /**
21
+ * npm sometimes extracts the prebuilt `spawn-helper` without its execute bit,
22
+ * which surfaces as "posix_spawnp failed". The prebuilt package has no
23
+ * install script that could restore it, so we do: the bit is safe to set (it
24
+ * is the PTY package's own binary) and fixes the spawn on retry.
25
+ */
26
+ async function repairSpawnHelper() {
27
+ try {
28
+ const entry = requireModule.resolve(PTY_PLATFORM_PACKAGE); // <pkg>/lib/index.js
29
+ const helper = path.join(path.dirname(entry), "..", "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper");
30
+ await chmod(helper, 0o755);
31
+ return true;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ function sleep(ms) {
38
+ return new Promise((r) => setTimeout(r, ms));
39
+ }
40
+ export async function spawnInPty(command, args, options) {
41
+ const loaded = loadPty();
42
+ if (!loaded.pty)
43
+ throw new Error(loaded.reason);
44
+ const pty = loaded.pty;
45
+ const cols = process.stdout.columns || 120;
46
+ const rows = process.stdout.rows || 40;
47
+ const spawnOnce = () => pty.spawn(command, args, { name: process.env.TERM || "xterm-256color", cols, rows, cwd: options.cwd, env: options.env });
48
+ let child;
49
+ try {
50
+ child = spawnOnce();
51
+ }
52
+ catch (err) {
53
+ if (!(await repairSpawnHelper()))
54
+ throw err;
55
+ child = spawnOnce();
56
+ }
57
+ let lastOutput = Date.now();
58
+ child.onData((data) => {
59
+ lastOutput = Date.now();
60
+ if (options.attachTerminal !== false)
61
+ process.stdout.write(data);
62
+ options.onOutput?.(data);
63
+ });
64
+ const cleanups = [];
65
+ if (options.attachTerminal !== false) {
66
+ const stdin = process.stdin;
67
+ const wasRaw = stdin.isTTY ? stdin.isRaw : false;
68
+ if (stdin.isTTY)
69
+ stdin.setRawMode(true);
70
+ stdin.resume();
71
+ const onInput = (data) => child.write(typeof data === "string" ? data : data.toString("utf8"));
72
+ stdin.on("data", onInput);
73
+ const onResize = () => child.resize(process.stdout.columns || cols, process.stdout.rows || rows);
74
+ process.stdout.on("resize", onResize);
75
+ cleanups.push(() => {
76
+ stdin.off("data", onInput);
77
+ process.stdout.off("resize", onResize);
78
+ if (stdin.isTTY)
79
+ stdin.setRawMode(Boolean(wasRaw));
80
+ stdin.pause();
81
+ });
82
+ }
83
+ const exit = new Promise((resolve) => {
84
+ child.onExit(({ exitCode, signal }) => {
85
+ for (const c of cleanups)
86
+ c();
87
+ resolve(signal ? 128 + signal : exitCode);
88
+ });
89
+ });
90
+ return {
91
+ pid: child.pid,
92
+ write: (data) => child.write(data),
93
+ inject: async (prompt) => {
94
+ child.write(`\u001b[200~${prompt}\u001b[201~`);
95
+ await sleep(120);
96
+ child.write("\r");
97
+ },
98
+ interrupt: (harness) => child.write(harness === "claude" ? "\u001b" : "\u0003"),
99
+ quietFor: () => Date.now() - lastOutput,
100
+ exit,
101
+ kill: () => child.kill(),
102
+ };
103
+ }
104
+ //# sourceMappingURL=pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/remote/pty.ts"],"names":[],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -23,6 +23,8 @@ export interface StoredAuth {
23
23
  name?: string;
24
24
  createdAt?: string;
25
25
  };
26
+ /** Remote Control identity the backend assigned this machine (from the host bridge `welcome`). */
27
+ hostId?: string;
26
28
  }
27
29
  export declare function readStoredAuth(): Promise<StoredAuth | undefined>;
28
30
  export declare function readStoredKey(): Promise<string | undefined>;
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -73,4 +73,10 @@ export declare function cmdStorageTest(ref: string, options: OutputOptions): Pro
73
73
  export declare function cmdStorageRemove(ref: string): Promise<void>;
74
74
  export declare function cmdStorageMirror(ref: string, targetsArg: string): Promise<void>;
75
75
  export declare function registerTeleportCommands(program: Command, addExamples: (c: Command, ex: string) => Command): void;
76
+ /**
77
+ * Remote Control checkpoint: push the session's root as a new generation and
78
+ * return its number. Same code path as `heyditto teleport push`, without the
79
+ * printing.
80
+ */
81
+ export declare function checkpointPush(root: string, harness: string | undefined, sessionId: string | undefined): Promise<number>;
76
82
  export {};
@@ -489,4 +489,15 @@ export function registerTeleportCommands(program, addExamples) {
489
489
  function collect(value, previous) {
490
490
  return [...previous, value];
491
491
  }
492
+ /**
493
+ * Remote Control checkpoint: push the session's root as a new generation and
494
+ * return its number. Same code path as `heyditto teleport push`, without the
495
+ * printing.
496
+ */
497
+ export async function checkpointPush(root, harness, sessionId) {
498
+ const summary = await runPush(root, { harness, session: sessionId });
499
+ if (!summary)
500
+ throw new Error("checkpoint produced no generation");
501
+ return summary.generation;
502
+ }
492
503
  //# sourceMappingURL=commands.js.map