@termlink/cli 0.1.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.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/auth/login.d.ts +55 -0
  4. package/dist/auth/login.d.ts.map +1 -0
  5. package/dist/auth/login.js +238 -0
  6. package/dist/auth/login.js.map +1 -0
  7. package/dist/auth/oauth-defaults.d.ts +9 -0
  8. package/dist/auth/oauth-defaults.d.ts.map +1 -0
  9. package/dist/auth/oauth-defaults.js +9 -0
  10. package/dist/auth/oauth-defaults.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +319 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/errors.d.ts +8 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +13 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.d.ts +20 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +19 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/providers/claude/history.d.ts +15 -0
  24. package/dist/providers/claude/history.d.ts.map +1 -0
  25. package/dist/providers/claude/history.js +71 -0
  26. package/dist/providers/claude/history.js.map +1 -0
  27. package/dist/providers/claude/input-queue.d.ts +8 -0
  28. package/dist/providers/claude/input-queue.d.ts.map +1 -0
  29. package/dist/providers/claude/input-queue.js +34 -0
  30. package/dist/providers/claude/input-queue.js.map +1 -0
  31. package/dist/providers/claude/mapper.d.ts +21 -0
  32. package/dist/providers/claude/mapper.d.ts.map +1 -0
  33. package/dist/providers/claude/mapper.js +136 -0
  34. package/dist/providers/claude/mapper.js.map +1 -0
  35. package/dist/providers/claude/provider.d.ts +46 -0
  36. package/dist/providers/claude/provider.d.ts.map +1 -0
  37. package/dist/providers/claude/provider.js +148 -0
  38. package/dist/providers/claude/provider.js.map +1 -0
  39. package/dist/providers/claude/session.d.ts +27 -0
  40. package/dist/providers/claude/session.d.ts.map +1 -0
  41. package/dist/providers/claude/session.js +353 -0
  42. package/dist/providers/claude/session.js.map +1 -0
  43. package/dist/providers/codex/app-server.d.ts +24 -0
  44. package/dist/providers/codex/app-server.d.ts.map +1 -0
  45. package/dist/providers/codex/app-server.js +79 -0
  46. package/dist/providers/codex/app-server.js.map +1 -0
  47. package/dist/providers/codex/command.d.ts +12 -0
  48. package/dist/providers/codex/command.d.ts.map +1 -0
  49. package/dist/providers/codex/command.js +60 -0
  50. package/dist/providers/codex/command.js.map +1 -0
  51. package/dist/providers/codex/history.d.ts +5 -0
  52. package/dist/providers/codex/history.d.ts.map +1 -0
  53. package/dist/providers/codex/history.js +33 -0
  54. package/dist/providers/codex/history.js.map +1 -0
  55. package/dist/providers/codex/mapper.d.ts +13 -0
  56. package/dist/providers/codex/mapper.d.ts.map +1 -0
  57. package/dist/providers/codex/mapper.js +83 -0
  58. package/dist/providers/codex/mapper.js.map +1 -0
  59. package/dist/providers/codex/protocol.d.ts +223 -0
  60. package/dist/providers/codex/protocol.d.ts.map +1 -0
  61. package/dist/providers/codex/protocol.js +11 -0
  62. package/dist/providers/codex/protocol.js.map +1 -0
  63. package/dist/providers/codex/provider.d.ts +28 -0
  64. package/dist/providers/codex/provider.d.ts.map +1 -0
  65. package/dist/providers/codex/provider.js +116 -0
  66. package/dist/providers/codex/provider.js.map +1 -0
  67. package/dist/providers/codex/rpc.d.ts +23 -0
  68. package/dist/providers/codex/rpc.d.ts.map +1 -0
  69. package/dist/providers/codex/rpc.js +104 -0
  70. package/dist/providers/codex/rpc.js.map +1 -0
  71. package/dist/providers/codex/session.d.ts +16 -0
  72. package/dist/providers/codex/session.d.ts.map +1 -0
  73. package/dist/providers/codex/session.js +262 -0
  74. package/dist/providers/codex/session.js.map +1 -0
  75. package/dist/providers/display.d.ts +9 -0
  76. package/dist/providers/display.d.ts.map +1 -0
  77. package/dist/providers/display.js +21 -0
  78. package/dist/providers/display.js.map +1 -0
  79. package/dist/providers/terminal.d.ts +24 -0
  80. package/dist/providers/terminal.d.ts.map +1 -0
  81. package/dist/providers/terminal.js +33 -0
  82. package/dist/providers/terminal.js.map +1 -0
  83. package/dist/providers/types.d.ts +72 -0
  84. package/dist/providers/types.d.ts.map +1 -0
  85. package/dist/providers/types.js +2 -0
  86. package/dist/providers/types.js.map +1 -0
  87. package/dist/relay/api.d.ts +13 -0
  88. package/dist/relay/api.d.ts.map +1 -0
  89. package/dist/relay/api.js +75 -0
  90. package/dist/relay/api.js.map +1 -0
  91. package/dist/relay/device.d.ts +26 -0
  92. package/dist/relay/device.d.ts.map +1 -0
  93. package/dist/relay/device.js +83 -0
  94. package/dist/relay/device.js.map +1 -0
  95. package/dist/relay/relay-host.d.ts +41 -0
  96. package/dist/relay/relay-host.d.ts.map +1 -0
  97. package/dist/relay/relay-host.js +238 -0
  98. package/dist/relay/relay-host.js.map +1 -0
  99. package/dist/server/coalesce.d.ts +15 -0
  100. package/dist/server/coalesce.d.ts.map +1 -0
  101. package/dist/server/coalesce.js +50 -0
  102. package/dist/server/coalesce.js.map +1 -0
  103. package/dist/server/connection.d.ts +30 -0
  104. package/dist/server/connection.d.ts.map +1 -0
  105. package/dist/server/connection.js +182 -0
  106. package/dist/server/connection.js.map +1 -0
  107. package/dist/server/local-server.d.ts +27 -0
  108. package/dist/server/local-server.d.ts.map +1 -0
  109. package/dist/server/local-server.js +108 -0
  110. package/dist/server/local-server.js.map +1 -0
  111. package/dist/session/event-log.d.ts +17 -0
  112. package/dist/session/event-log.d.ts.map +1 -0
  113. package/dist/session/event-log.js +21 -0
  114. package/dist/session/event-log.js.map +1 -0
  115. package/dist/session/manager.d.ts +62 -0
  116. package/dist/session/manager.d.ts.map +1 -0
  117. package/dist/session/manager.js +282 -0
  118. package/dist/session/manager.js.map +1 -0
  119. package/dist/session/session.d.ts +43 -0
  120. package/dist/session/session.d.ts.map +1 -0
  121. package/dist/session/session.js +310 -0
  122. package/dist/session/session.js.map +1 -0
  123. package/dist/session/store.d.ts +22 -0
  124. package/dist/session/store.d.ts.map +1 -0
  125. package/dist/session/store.js +44 -0
  126. package/dist/session/store.js.map +1 -0
  127. package/dist/session/terminal-session.d.ts +52 -0
  128. package/dist/session/terminal-session.d.ts.map +1 -0
  129. package/dist/session/terminal-session.js +210 -0
  130. package/dist/session/terminal-session.js.map +1 -0
  131. package/dist/util/id.d.ts +2 -0
  132. package/dist/util/id.d.ts.map +1 -0
  133. package/dist/util/id.js +5 -0
  134. package/dist/util/id.js.map +1 -0
  135. package/dist/util/lock.d.ts +12 -0
  136. package/dist/util/lock.d.ts.map +1 -0
  137. package/dist/util/lock.js +52 -0
  138. package/dist/util/lock.js.map +1 -0
  139. package/dist/util/which.d.ts +3 -0
  140. package/dist/util/which.d.ts.map +1 -0
  141. package/dist/util/which.js +12 -0
  142. package/dist/util/which.js.map +1 -0
  143. package/dist/version.d.ts +2 -0
  144. package/dist/version.d.ts.map +1 -0
  145. package/dist/version.js +5 -0
  146. package/dist/version.js.map +1 -0
  147. package/package.json +56 -0
package/dist/cli.js ADDED
@@ -0,0 +1,319 @@
1
+ #!/usr/bin/env node
2
+ import { randomBytes } from "node:crypto";
3
+ import { rm } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { parseArgs } from "node:util";
7
+ import { AutoApprove, PROTOCOL_VERSION } from "@termlink/protocol";
8
+ import { listDevices, loginAndEnroll, revokeDevices } from "./auth/login.js";
9
+ import { CLAUDE_PERMISSION_MODES, ClaudeProvider } from "./providers/claude/provider.js";
10
+ import { CodexProvider } from "./providers/codex/provider.js";
11
+ import { ShellProvider } from "./providers/terminal.js";
12
+ import { RelayHttpError } from "./relay/api.js";
13
+ import { DeviceError, defaultCredentialPath, loadDevice, renewIfDue } from "./relay/device.js";
14
+ import { DEFAULT_SERVER, RelayHost, defaultRelaySession } from "./relay/relay-host.js";
15
+ import { startLocalServer } from "./server/local-server.js";
16
+ import { SessionManager } from "./session/manager.js";
17
+ import { SessionStore, defaultStatePath } from "./session/store.js";
18
+ import { newId } from "./util/id.js";
19
+ import { LockHeldError, acquirePidLock } from "./util/lock.js";
20
+ import { VERSION } from "./version.js";
21
+ const APPROVAL_POLICIES = ["untrusted", "on-request", "never"];
22
+ const SANDBOX_MODES = ["read-only", "workspace-write", "danger-full-access"];
23
+ const DEFAULT_PROVIDERS = "terminal,claude,codex";
24
+ const USAGE = `Usage: termlink <command> [options]
25
+
26
+ Commands:
27
+ start run the host in this folder (default)
28
+ login sign this machine in to TermLink with Google
29
+ logout sign this machine out
30
+ whoami show the signed-in account
31
+ devices list the machines signed in to this account
32
+ devices revoke <id> sign one machine out (or --all for every machine)
33
+ help show this text
34
+
35
+ Options for start:
36
+ --port <n> local WebSocket port (default 7420)
37
+ --host <addr> bind address (default 127.0.0.1)
38
+ --token <token> local client token (default: $TERMLINK_LOCAL_TOKEN or a random one)
39
+ --relay-session <name> relay session name (default: ${defaultRelaySession()})
40
+ --allow-root <dir> folder sessions may open in; repeatable
41
+ (default: the current folder)
42
+ --state <file> where agent sessions are remembered across restarts (default ${defaultStatePath()})
43
+ --no-restore start without bringing back remembered agent sessions
44
+ --auto-approve <mode> ${AutoApprove.options.join(" | ")}: approvals new agent sessions answer by themselves (default off)
45
+ --providers <list> comma-separated providers to enable (default ${DEFAULT_PROVIDERS})
46
+ --shell <path> shell for terminal sessions (default: the user's shell)
47
+ --scrollback <lines> lines kept for a terminal reconnect (default 5000)
48
+ --claude-permission-mode <mode> ${CLAUDE_PERMISSION_MODES.join(" | ")} (default: Claude Code settings)
49
+ --claude-model <model> model for new Claude sessions (default: Claude Code settings)
50
+ --codex-approval <mode> ${APPROVAL_POLICIES.join(" | ")} (default: ~/.codex/config.toml)
51
+ --codex-sandbox <mode> ${SANDBOX_MODES.join(" | ")} (default: ~/.codex/config.toml)
52
+
53
+ Options for every command:
54
+ --server <url> master relay (default: $TERMLINK_SERVER or ${DEFAULT_SERVER})
55
+ -h, --help show this text
56
+ -v, --version show the version`;
57
+ function oneOf(value, allowed, flag) {
58
+ if (value === undefined)
59
+ return undefined;
60
+ if (!allowed.includes(value))
61
+ throw new Error(`${flag} must be one of: ${allowed.join(", ")}`);
62
+ return value;
63
+ }
64
+ function integer(value, flag, min, max) {
65
+ if (value === undefined)
66
+ return undefined;
67
+ const n = Number(value);
68
+ if (!Number.isInteger(n) || n < min || n > max)
69
+ throw new Error(`${flag} must be a whole number from ${min} to ${max}`);
70
+ return n;
71
+ }
72
+ async function main() {
73
+ const { positionals, values } = parseArgs({
74
+ allowPositionals: true,
75
+ options: {
76
+ port: { type: "string", default: "7420" },
77
+ host: { type: "string", default: "127.0.0.1" },
78
+ token: { type: "string" },
79
+ server: { type: "string" },
80
+ "relay-session": { type: "string" },
81
+ "allow-root": { type: "string", multiple: true },
82
+ state: { type: "string" },
83
+ "no-restore": { type: "boolean", default: false },
84
+ "auto-approve": { type: "string" },
85
+ providers: { type: "string", default: DEFAULT_PROVIDERS },
86
+ shell: { type: "string" },
87
+ scrollback: { type: "string" },
88
+ "claude-permission-mode": { type: "string" },
89
+ "claude-model": { type: "string" },
90
+ "codex-approval": { type: "string" },
91
+ "codex-sandbox": { type: "string" },
92
+ all: { type: "boolean", default: false },
93
+ help: { type: "boolean", short: "h" },
94
+ version: { type: "boolean", short: "v" },
95
+ },
96
+ });
97
+ if (values.version) {
98
+ console.log(`termlink ${VERSION}`);
99
+ return;
100
+ }
101
+ const command = positionals[0] ?? "start";
102
+ if (values.help || command === "help") {
103
+ console.log(USAGE);
104
+ return;
105
+ }
106
+ const server = values.server ?? process.env.TERMLINK_SERVER ?? DEFAULT_SERVER;
107
+ const credentialPath = defaultCredentialPath();
108
+ switch (command) {
109
+ case "start":
110
+ return start(values, server, credentialPath);
111
+ case "login":
112
+ return login(server, credentialPath);
113
+ case "logout":
114
+ return logout(server, credentialPath);
115
+ case "whoami":
116
+ return whoami(server, credentialPath);
117
+ case "devices":
118
+ return devices(positionals.slice(1), values.all, server, credentialPath);
119
+ default:
120
+ console.error(`unknown command "${command}"\n`);
121
+ console.log(USAGE);
122
+ process.exitCode = 1;
123
+ }
124
+ }
125
+ async function start(values, server, credentialPath) {
126
+ const port = Number(values.port);
127
+ if (!Number.isInteger(port) || port < 0 || port > 65535)
128
+ throw new Error(`invalid port: ${values.port}`);
129
+ const token = values.token ?? process.env.TERMLINK_LOCAL_TOKEN ?? randomBytes(18).toString("base64url");
130
+ const autoApprove = oneOf(values["auto-approve"], AutoApprove.options, "--auto-approve");
131
+ const permissionMode = oneOf(values["claude-permission-mode"], CLAUDE_PERMISSION_MODES, "--claude-permission-mode");
132
+ const approvalPolicy = oneOf(values["codex-approval"], APPROVAL_POLICIES, "--codex-approval");
133
+ const sandbox = oneOf(values["codex-sandbox"], SANDBOX_MODES, "--codex-sandbox");
134
+ const scrollback = integer(values.scrollback, "--scrollback", 0, 100_000);
135
+ // Remote clients pick the folder, so joining the relay narrows it to where the host was started.
136
+ const allowRoots = values["allow-root"] ?? [];
137
+ const roots = allowRoots.length > 0 ? allowRoots : [process.cwd()];
138
+ const providers = [];
139
+ for (const name of values.providers.split(",").map((s) => s.trim()).filter(Boolean)) {
140
+ if (name === "terminal")
141
+ providers.push(new ShellProvider({ shell: values.shell, scrollback }));
142
+ else if (name === "codex")
143
+ providers.push(new CodexProvider({ approvalPolicy, sandbox }));
144
+ else if (name === "claude")
145
+ providers.push(new ClaudeProvider({ permissionMode, model: values["claude-model"] }));
146
+ else
147
+ throw new Error(`unknown provider: ${name}`);
148
+ }
149
+ const manager = new SessionManager({
150
+ providers,
151
+ store: new SessionStore(values.state ?? defaultStatePath()),
152
+ allowedRoots: roots,
153
+ ...(autoApprove ? { autoApprove } : {}),
154
+ });
155
+ const hostId = newId("h");
156
+ const hostInfo = async () => ({
157
+ hostId,
158
+ name: os.hostname(),
159
+ version: VERSION,
160
+ protocol: PROTOCOL_VERSION,
161
+ os: `${process.platform}-${process.arch}`,
162
+ providers: await manager.providerStatuses(),
163
+ ...(manager.roots ? { roots: manager.roots } : {}),
164
+ });
165
+ const restored = values["no-restore"] ? 0 : await manager.restore();
166
+ const local = await startLocalServer({ manager, hostInfo, host: values.host, port, token });
167
+ if (values.host !== "127.0.0.1" && values.host !== "localhost" && values.host !== "::1") {
168
+ console.warn(`warning: the local server has no TLS and is listening on ${values.host}`);
169
+ }
170
+ console.log(`termlink ${VERSION} listening on ${local.url}?token=${token}`);
171
+ for (const status of await manager.providerStatuses()) {
172
+ const state = status.available ? "ready" : "unavailable";
173
+ console.log(` ${status.id}: ${state}${status.detail ? ` (${status.detail})` : ""}`);
174
+ }
175
+ if (manager.roots)
176
+ console.log(` sessions may open in: ${manager.roots.join(", ")}`);
177
+ if (autoApprove && autoApprove !== "off")
178
+ console.log(` new agent sessions auto-approve: ${autoApprove}`);
179
+ if (restored > 0)
180
+ console.log(` restored ${restored} session${restored === 1 ? "" : "s"}`);
181
+ let relay = null;
182
+ let releaseLock = null;
183
+ let stopping = false;
184
+ const stop = async () => {
185
+ if (stopping)
186
+ return;
187
+ stopping = true;
188
+ await relay?.close();
189
+ await releaseLock?.();
190
+ await manager.shutdown("host shutting down");
191
+ await local.close();
192
+ };
193
+ process.once("SIGINT", () => void stop());
194
+ process.once("SIGTERM", () => void stop());
195
+ const session = values["relay-session"] ?? defaultRelaySession();
196
+ try {
197
+ // The relay closes the older of two hosts on one session without saying why, so both
198
+ // reconnect and keep kicking each other off. One host per session name on a machine.
199
+ const lockName = `relay-${session.replace(/[^A-Za-z0-9._-]/g, "_")}.lock`;
200
+ releaseLock = await acquirePidLock(path.join(os.homedir(), ".termlink", lockName));
201
+ relay = await RelayHost.start({
202
+ manager,
203
+ hostInfo,
204
+ server,
205
+ session,
206
+ name: os.hostname(),
207
+ cwd: manager.roots?.[0] ?? process.cwd(),
208
+ credentialPath,
209
+ log: (line) => console.log(`${new Date().toLocaleTimeString("en-GB")} ${line}`),
210
+ onStopped: () => void stop(),
211
+ });
212
+ }
213
+ catch (err) {
214
+ if (err instanceof LockHeldError) {
215
+ console.error(`another termlink host (pid ${err.pid}) is already on relay session ${session}; ` +
216
+ "stop it, or start this one with --relay-session <name>");
217
+ }
218
+ else {
219
+ console.error(err instanceof DeviceError ? err.message : `could not join the relay: ${err instanceof Error ? err.message : err}`);
220
+ }
221
+ await stop();
222
+ process.exitCode = 1;
223
+ }
224
+ }
225
+ /** The stored credential when it is still good for this server; null when signed out. */
226
+ async function currentDevice(server, credentialPath) {
227
+ try {
228
+ return await loadDevice(credentialPath, server);
229
+ }
230
+ catch (err) {
231
+ if (err instanceof DeviceError)
232
+ return null;
233
+ throw err;
234
+ }
235
+ }
236
+ function describe(credential) {
237
+ const who = credential.email ?? credential.name ?? credential.sub;
238
+ return credential.name && credential.email ? `${credential.name} <${credential.email}>` : who;
239
+ }
240
+ async function login(server, credentialPath) {
241
+ const current = await currentDevice(server, credentialPath);
242
+ if (current) {
243
+ console.log(`Already logged in: ${describe(current)}`);
244
+ console.log("This machine is enrolled, so signing in again is not needed.");
245
+ console.log("To log in with a different account, run `termlink logout` first.");
246
+ return;
247
+ }
248
+ const credential = await loginAndEnroll(server, credentialPath);
249
+ console.log(`Login complete: ${describe(credential)}`);
250
+ console.log("This machine is now enrolled; it will not ask Google again.");
251
+ console.log("Run `termlink devices` to see or sign out the machines on this account.");
252
+ }
253
+ // Revoke on the server first: if the local file went first and the network call then
254
+ // failed, the person would be told they were logged out while a working credential was
255
+ // still enrolled, with no id left to revoke it with.
256
+ async function logout(server, credentialPath) {
257
+ const current = await currentDevice(server, credentialPath);
258
+ if (current) {
259
+ try {
260
+ await revokeDevices(server, current.token, { id: current.id });
261
+ }
262
+ catch (err) {
263
+ if (!(err instanceof RelayHttpError && (err.status === 401 || err.status === 403))) {
264
+ throw new Error(`could not sign this machine out on the server (${err instanceof Error ? err.message : err}); nothing was removed locally, so you can retry`);
265
+ }
266
+ // Already revoked there: only the local file is left.
267
+ }
268
+ }
269
+ await rm(credentialPath, { force: true });
270
+ console.log(current ? `Logged out: ${describe(current)}` : "Not logged in.");
271
+ }
272
+ async function whoami(server, credentialPath) {
273
+ const current = await currentDevice(server, credentialPath);
274
+ if (!current) {
275
+ console.log("Not logged in. Run `termlink login`.");
276
+ process.exitCode = 1;
277
+ return;
278
+ }
279
+ const fresh = await renewIfDue(credentialPath, server, current, fetch).catch(() => current);
280
+ console.log(describe(fresh));
281
+ console.log(` device: ${fresh.id}`);
282
+ console.log(` server: ${fresh.master}`);
283
+ console.log(` expires: ${fresh.expires_at}`);
284
+ }
285
+ async function devices(args, all, server, credentialPath) {
286
+ const current = await currentDevice(server, credentialPath);
287
+ if (!current) {
288
+ console.log("Not logged in. Run `termlink login`.");
289
+ process.exitCode = 1;
290
+ return;
291
+ }
292
+ if (args[0] === "revoke") {
293
+ const id = args[1];
294
+ if (!id && !all)
295
+ throw new Error("usage: termlink devices revoke <id> | --all");
296
+ const count = await revokeDevices(server, current.token, all ? { all: true } : { id: id ?? "" });
297
+ console.log(`Revoked ${count} device${count === 1 ? "" : "s"}.`);
298
+ if (all || id === current.id) {
299
+ await rm(credentialPath, { force: true });
300
+ console.log("This machine is signed out too. Run `termlink login` to sign in again.");
301
+ }
302
+ return;
303
+ }
304
+ const list = await listDevices(server, current.token);
305
+ if (list.length === 0) {
306
+ console.log("No devices.");
307
+ return;
308
+ }
309
+ for (const device of list) {
310
+ const marker = device.id === current.id ? " (this machine)" : "";
311
+ console.log(`${device.id} ${device.label}${marker}`);
312
+ console.log(` added ${device.createdAt}, last seen ${device.lastSeen}`);
313
+ }
314
+ }
315
+ main().catch((err) => {
316
+ console.error(err instanceof Error ? err.message : err);
317
+ process.exitCode = 1;
318
+ });
319
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ErrorCode } from "@termlink/protocol";
2
+ /** An error that is reported to the client with its code instead of as "internal". */
3
+ export declare class HostError extends Error {
4
+ readonly code: ErrorCode;
5
+ constructor(code: ErrorCode, message: string);
6
+ }
7
+ export declare function errorMessage(err: unknown): string;
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,sFAAsF;AACtF,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAEzB,YAAY,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAI3C;CACF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEjD"}
package/dist/errors.js ADDED
@@ -0,0 +1,13 @@
1
+ /** An error that is reported to the client with its code instead of as "internal". */
2
+ export class HostError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.name = "HostError";
7
+ this.code = code;
8
+ }
9
+ }
10
+ export function errorMessage(err) {
11
+ return err instanceof Error ? err.message : String(err);
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAY;IAEzB,YAAY,IAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,20 @@
1
+ export { HostError, errorMessage } from "./errors.js";
2
+ export { VERSION } from "./version.js";
3
+ export { EventLog } from "./session/event-log.js";
4
+ export { AgentSession, type Attachment, type Listener } from "./session/session.js";
5
+ export { TerminalSession, type FlowControlOptions, type TerminalAttachment, type TerminalListener, } from "./session/terminal-session.js";
6
+ export { SessionManager, type CreateSessionOptions, type HostSession, type SessionManagerOptions, } from "./session/manager.js";
7
+ export { SessionStore, defaultStatePath, type SessionRecord } from "./session/store.js";
8
+ export { claudeHistory, type TranscriptMessage } from "./providers/claude/history.js";
9
+ export type * from "./providers/types.js";
10
+ export { ShellProvider, type ShellProviderOptions } from "./providers/terminal.js";
11
+ export { CodexProvider, type CodexProviderOptions } from "./providers/codex/provider.js";
12
+ export { resolveCodexCommand, type CodexCommand } from "./providers/codex/command.js";
13
+ export { ClaudeProvider, CLAUDE_PERMISSION_MODES, bundledClaudeExecutable, type ClaudePermissionMode, type ClaudeProviderOptions, } from "./providers/claude/provider.js";
14
+ export { ClientConnection, type ConnectionTransport } from "./server/connection.js";
15
+ export { startLocalServer, toBytes, type LocalServer, type LocalServerOptions } from "./server/local-server.js";
16
+ export { DeltaCoalescer } from "./server/coalesce.js";
17
+ export { DEFAULT_SERVER, RelayHost, defaultRelaySession, type RelayHostOptions } from "./relay/relay-host.js";
18
+ export { DeviceError, defaultCredentialPath, loadDevice, renewIfDue, type DeviceCredential } from "./relay/device.js";
19
+ export { displayCommand } from "./providers/display.js";
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EACL,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACtF,mBAAmB,sBAAsB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9G,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ export { HostError, errorMessage } from "./errors.js";
2
+ export { VERSION } from "./version.js";
3
+ export { EventLog } from "./session/event-log.js";
4
+ export { AgentSession } from "./session/session.js";
5
+ export { TerminalSession, } from "./session/terminal-session.js";
6
+ export { SessionManager, } from "./session/manager.js";
7
+ export { SessionStore, defaultStatePath } from "./session/store.js";
8
+ export { claudeHistory } from "./providers/claude/history.js";
9
+ export { ShellProvider } from "./providers/terminal.js";
10
+ export { CodexProvider } from "./providers/codex/provider.js";
11
+ export { resolveCodexCommand } from "./providers/codex/command.js";
12
+ export { ClaudeProvider, CLAUDE_PERMISSION_MODES, bundledClaudeExecutable, } from "./providers/claude/provider.js";
13
+ export { ClientConnection } from "./server/connection.js";
14
+ export { startLocalServer, toBytes } from "./server/local-server.js";
15
+ export { DeltaCoalescer } from "./server/coalesce.js";
16
+ export { DEFAULT_SERVER, RelayHost, defaultRelaySession } from "./relay/relay-host.js";
17
+ export { DeviceError, defaultCredentialPath, loadDevice, renewIfDue } from "./relay/device.js";
18
+ export { displayCommand } from "./providers/display.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAkC,MAAM,sBAAsB,CAAC;AACpF,OAAO,EACL,eAAe,GAIhB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,cAAc,GAIf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAsB,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,aAAa,EAA0B,MAAM,+BAA+B,CAAC;AAEtF,OAAO,EAAE,aAAa,EAA6B,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,aAAa,EAA6B,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAqB,MAAM,8BAA8B,CAAC;AACtF,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,uBAAuB,GAGxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAA4B,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAA6C,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,mBAAmB,EAAyB,MAAM,uBAAuB,CAAC;AAC9G,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU,EAAyB,MAAM,mBAAmB,CAAC;AACtH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { HistoryTurn } from "../types.js";
2
+ /** The fields of the SDK's SessionMessage this reads. */
3
+ export interface TranscriptMessage {
4
+ type: "user" | "assistant" | "system";
5
+ uuid: string;
6
+ message: unknown;
7
+ parent_tool_use_id: string | null;
8
+ }
9
+ /**
10
+ * Rebuilds turns from a Claude Code transcript. A user text message opens a turn;
11
+ * tool_use blocks pair with their tool_result. Edits are diffed from the edit itself,
12
+ * since the files have changed since.
13
+ */
14
+ export declare function claudeHistory(messages: readonly TranscriptMessage[], cwd: string, maxTurns?: number): HistoryTurn[];
15
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAID;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,WAAW,EAAE,CA4D/G"}
@@ -0,0 +1,71 @@
1
+ import { completeToolItem, mapToolUse } from "./mapper.js";
2
+ /**
3
+ * Rebuilds turns from a Claude Code transcript. A user text message opens a turn;
4
+ * tool_use blocks pair with their tool_result. Edits are diffed from the edit itself,
5
+ * since the files have changed since.
6
+ */
7
+ export function claudeHistory(messages, cwd, maxTurns = 30) {
8
+ const turns = [];
9
+ const open = new Map();
10
+ let current = null;
11
+ const finish = () => {
12
+ if (!current)
13
+ return;
14
+ for (const item of open.values())
15
+ current.items.push({ ...item, status: "interrupted" });
16
+ open.clear();
17
+ };
18
+ for (const entry of messages) {
19
+ if (entry.parent_tool_use_id)
20
+ continue; // Sub-agent internals.
21
+ const message = (entry.message ?? {});
22
+ const blocks = Array.isArray(message.content) ? message.content : [];
23
+ if (entry.type === "user") {
24
+ const results = blocks.filter((b) => b.type === "tool_result");
25
+ if (results.length > 0) {
26
+ for (const result of results) {
27
+ const item = open.get(result.tool_use_id);
28
+ if (!item || !current)
29
+ continue;
30
+ open.delete(result.tool_use_id);
31
+ current.items.push(completeToolItem(item, result, undefined, false));
32
+ }
33
+ continue;
34
+ }
35
+ const text = typeof message.content === "string"
36
+ ? message.content
37
+ : blocks
38
+ .filter((b) => b.type === "text")
39
+ .map((b) => b.text ?? "")
40
+ .join("\n");
41
+ // Skip empty and harness-injected messages (slash command wrappers, caveats).
42
+ if (!text.trim() || text.trimStart().startsWith("<"))
43
+ continue;
44
+ finish();
45
+ current = {
46
+ turnId: `hist_${entry.uuid}`,
47
+ status: "completed",
48
+ items: [{ id: entry.uuid, kind: "message", role: "user", text, status: "completed" }],
49
+ };
50
+ turns.push(current);
51
+ continue;
52
+ }
53
+ if (entry.type !== "assistant" || !current)
54
+ continue;
55
+ blocks.forEach((block, index) => {
56
+ const id = `${entry.uuid}:${index}`;
57
+ if (block.type === "text" && block.text) {
58
+ current?.items.push({ id, kind: "message", role: "assistant", text: block.text, status: "completed" });
59
+ }
60
+ else if (block.type === "thinking" && block.thinking) {
61
+ current?.items.push({ id, kind: "reasoning", text: block.thinking, status: "completed" });
62
+ }
63
+ else if (block.type === "tool_use" && block.id && block.name) {
64
+ open.set(block.id, mapToolUse(block.id, block.name, block.input ?? {}, cwd, { readFiles: false }));
65
+ }
66
+ });
67
+ }
68
+ finish();
69
+ return turns.slice(-maxTurns);
70
+ }
71
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/providers/claude/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Push-driven async iterable: the SDK reads user messages from it for the life of the session. */
2
+ export declare class InputQueue<T> implements AsyncIterable<T> {
3
+ #private;
4
+ push(item: T): void;
5
+ end(): void;
6
+ [Symbol.asyncIterator](): AsyncGenerator<T, void>;
7
+ }
8
+ //# sourceMappingURL=input-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-queue.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/input-queue.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;;IAKpD,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAIlB;IAED,GAAG,IAAI,IAAI,CAGV;IAEM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAUvD;CAOF"}
@@ -0,0 +1,34 @@
1
+ /** Push-driven async iterable: the SDK reads user messages from it for the life of the session. */
2
+ export class InputQueue {
3
+ #items = [];
4
+ #wake = null;
5
+ #ended = false;
6
+ push(item) {
7
+ if (this.#ended)
8
+ return;
9
+ this.#items.push(item);
10
+ this.#notify();
11
+ }
12
+ end() {
13
+ this.#ended = true;
14
+ this.#notify();
15
+ }
16
+ async *[Symbol.asyncIterator]() {
17
+ for (;;) {
18
+ const item = this.#items.shift();
19
+ if (item !== undefined) {
20
+ yield item;
21
+ continue;
22
+ }
23
+ if (this.#ended)
24
+ return;
25
+ await new Promise((resolve) => (this.#wake = resolve));
26
+ }
27
+ }
28
+ #notify() {
29
+ const wake = this.#wake;
30
+ this.#wake = null;
31
+ wake?.();
32
+ }
33
+ }
34
+ //# sourceMappingURL=input-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-queue.js","sourceRoot":"","sources":["../../../src/providers/claude/input-queue.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,MAAM,OAAO,UAAU;IACZ,MAAM,GAAQ,EAAE,CAAC;IAC1B,KAAK,GAAwB,IAAI,CAAC;IAClC,MAAM,GAAG,KAAK,CAAC;IAEf,IAAI,CAAC,IAAO;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,GAAG;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC;gBACX,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,EAAE,EAAE,CAAC;IACX,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { FileChange, Item } from "@termlink/protocol";
2
+ export declare function displayPath(file: string, cwd: string): string;
3
+ export declare function unifiedDiff(name: string, before: string, after: string): string;
4
+ /**
5
+ * The file changes a Claude file tool is about to make. Claude reports edits as
6
+ * old/new strings, so the host reads the file as it is now (before the tool runs)
7
+ * and computes a real unified diff. Returns null for tools that do not edit files.
8
+ */
9
+ export declare function fileChangesFor(tool: string, input: Record<string, unknown>, cwd: string, readFiles?: boolean): FileChange[] | null;
10
+ /** Maps a tool_use block to the item shown while the tool runs. */
11
+ export declare function mapToolUse(id: string, name: string, input: Record<string, unknown>, cwd: string, options?: {
12
+ readFiles?: boolean;
13
+ }): Item;
14
+ export interface ToolResult {
15
+ content?: unknown;
16
+ is_error?: boolean;
17
+ }
18
+ export declare function toolResultText(content: unknown): string;
19
+ /** Final state of a tool item once its tool_result arrives. */
20
+ export declare function completeToolItem(item: Item, result: ToolResult, structured: unknown, declined: boolean): Item;
21
+ //# sourceMappingURL=mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/mapper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAc,MAAM,oBAAoB,CAAC;AAMvE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/E;AAuBD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,SAAS,UAAO,GACf,UAAU,EAAE,GAAG,IAAI,CAoCrB;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,IAAI,CAmBN;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CASvD;AAWD,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAc7G"}