@abitat_reece/host-daemon 0.1.4 → 0.1.6

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.
@@ -0,0 +1,71 @@
1
+ export type LocalControlTransport = "local" | "tailscale" | "quick-tunnel" | "manual";
2
+ export interface LocalPairingPayload {
3
+ version: 1;
4
+ product: "abitat";
5
+ endpoint: string;
6
+ macId: string;
7
+ pairingSecret: string;
8
+ manualCode: string;
9
+ expiresAt: string;
10
+ transport: LocalControlTransport;
11
+ capabilities: string[];
12
+ }
13
+ export interface LocalPairedDevice {
14
+ id: string;
15
+ name: string;
16
+ platform: "ios" | string;
17
+ tokenHash: string;
18
+ pairedAt: string;
19
+ lastSeenAt: string;
20
+ revokedAt?: string | null;
21
+ }
22
+ interface CreateLocalControlStoreOptions {
23
+ idGenerator?: (prefix: string) => string;
24
+ now?: () => Date;
25
+ randomSecret?: () => string;
26
+ statePath?: string;
27
+ }
28
+ interface CreatePairingInput {
29
+ endpoint: string;
30
+ transport: LocalControlTransport;
31
+ ttlMs?: number;
32
+ }
33
+ interface ConsumePairingInput {
34
+ deviceName: string;
35
+ pairingSecret?: string;
36
+ manualCode?: string;
37
+ code?: string;
38
+ platform: "ios" | string;
39
+ }
40
+ export declare function defaultLocalControlStatePath(): string;
41
+ export declare function defaultLocalAttachmentDirectory(): string;
42
+ export declare function hashLocalControlToken(token: string): string;
43
+ export declare function createLocalControlStore(options?: CreateLocalControlStoreOptions): {
44
+ statePath: string;
45
+ getMacIdentity(): Promise<{
46
+ macId: string;
47
+ macName: string;
48
+ }>;
49
+ getHostToken(): Promise<string>;
50
+ createPairing(input: CreatePairingInput): Promise<LocalPairingPayload>;
51
+ consumePairing(input: ConsumePairingInput): Promise<{
52
+ machineId: string;
53
+ workspaceId: string;
54
+ hostMachineId: string;
55
+ clientToken: string;
56
+ endpoint: string;
57
+ macId: string;
58
+ }>;
59
+ requireDeviceByToken(token: string): Promise<{
60
+ lastSeenAt: string;
61
+ id: string;
62
+ name: string;
63
+ platform: "ios" | string;
64
+ tokenHash: string;
65
+ pairedAt: string;
66
+ revokedAt?: string | null;
67
+ }>;
68
+ };
69
+ export type LocalControlStore = ReturnType<typeof createLocalControlStore>;
70
+ export {};
71
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/local-control/state.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEtF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,QAAQ,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAuBD,UAAU,8BAA8B;IACtC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,mBAAmB;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC;CAC1B;AAWD,wBAAgB,4BAA4B,WAE3C;AAED,wBAAgB,+BAA+B,WAE9C;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,UAElD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,8BAAmC;;;;;;;yBA4DrD,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;0BAwChD,mBAAmB;;;;;;;;gCA0Db,MAAM;;YAtOtC,MAAM;cACJ,MAAM;kBACF,KAAK,GAAG,MAAM;mBACb,MAAM;kBACP,MAAM;oBAEJ,MAAM,GAAG,IAAI;;EAqP1B;AAoDD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,208 @@
1
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { homedir, hostname } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ const DEFAULT_PAIRING_TTL_MS = 5 * 60 * 1000;
6
+ const LOCAL_WORKSPACE_ID = "local";
7
+ const PAIRING_CAPABILITIES = [
8
+ "codex_chat",
9
+ "codex_projects",
10
+ "attachments",
11
+ "screen_control"
12
+ ];
13
+ export function defaultLocalControlStatePath() {
14
+ return join(homedir(), "Library", "Application Support", "Abitat", "local-control-state.json");
15
+ }
16
+ export function defaultLocalAttachmentDirectory() {
17
+ return join(homedir(), "Library", "Application Support", "Abitat", "attachments");
18
+ }
19
+ export function hashLocalControlToken(token) {
20
+ return createHash("sha256").update(token).digest("hex");
21
+ }
22
+ export function createLocalControlStore(options = {}) {
23
+ const statePath = options.statePath ??
24
+ process.env.ABITAT_LOCAL_CONTROL_STATE_PATH ??
25
+ defaultLocalControlStatePath();
26
+ const now = options.now ?? (() => new Date());
27
+ const randomSecret = options.randomSecret ?? (() => randomBytes(32).toString("base64url"));
28
+ const idGenerator = options.idGenerator ?? ((prefix) => `${prefix}_${randomBytes(8).toString("hex")}`);
29
+ let hostToken = null;
30
+ async function loadState() {
31
+ const existing = await readStateFile(statePath);
32
+ if (existing) {
33
+ return existing;
34
+ }
35
+ hostToken = randomSecret();
36
+ const created = {
37
+ version: 1,
38
+ macId: idGenerator("mac"),
39
+ macName: hostname() || "Abitat Mac",
40
+ hostTokenHash: hashLocalControlToken(hostToken),
41
+ pairedDevices: [],
42
+ activePairings: []
43
+ };
44
+ await saveState(created);
45
+ return created;
46
+ }
47
+ async function saveState(state) {
48
+ await mkdir(dirname(statePath), { recursive: true });
49
+ await writeFile(statePath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
50
+ }
51
+ return {
52
+ statePath,
53
+ async getMacIdentity() {
54
+ const state = await loadState();
55
+ return {
56
+ macId: state.macId,
57
+ macName: state.macName
58
+ };
59
+ },
60
+ async getHostToken() {
61
+ const state = await loadState();
62
+ if (hostToken && tokenMatchesHash(hostToken, state.hostTokenHash)) {
63
+ return hostToken;
64
+ }
65
+ hostToken = randomSecret();
66
+ await saveState({
67
+ ...state,
68
+ hostTokenHash: hashLocalControlToken(hostToken)
69
+ });
70
+ return hostToken;
71
+ },
72
+ async createPairing(input) {
73
+ const state = await loadState();
74
+ const createdAt = now();
75
+ const pairingSecret = randomSecret();
76
+ const manualCode = manualCodeFromSeed(randomSecret());
77
+ const pairing = {
78
+ id: idGenerator("pairing"),
79
+ endpoint: input.endpoint,
80
+ secretHash: hashLocalControlToken(pairingSecret),
81
+ manualCodeHash: hashLocalControlToken(normalizeManualCode(manualCode)),
82
+ manualCode,
83
+ expiresAt: new Date(createdAt.getTime() + (input.ttlMs ?? DEFAULT_PAIRING_TTL_MS)).toISOString(),
84
+ consumedAt: null,
85
+ createdAt: createdAt.toISOString(),
86
+ transport: input.transport
87
+ };
88
+ await saveState({
89
+ ...state,
90
+ activePairings: [
91
+ ...state.activePairings.filter((candidate) => !isExpired(candidate, createdAt)),
92
+ pairing
93
+ ]
94
+ });
95
+ return {
96
+ version: 1,
97
+ product: "abitat",
98
+ endpoint: input.endpoint,
99
+ macId: state.macId,
100
+ pairingSecret,
101
+ manualCode,
102
+ expiresAt: pairing.expiresAt,
103
+ transport: input.transport,
104
+ capabilities: [...PAIRING_CAPABILITIES]
105
+ };
106
+ },
107
+ async consumePairing(input) {
108
+ const state = await loadState();
109
+ const pairedAt = now();
110
+ const manualCode = input.manualCode ?? input.code;
111
+ const pairing = state.activePairings.find((candidate) => {
112
+ if (input.pairingSecret && tokenMatchesHash(input.pairingSecret, candidate.secretHash)) {
113
+ return true;
114
+ }
115
+ return Boolean(manualCode && tokenMatchesHash(normalizeManualCode(manualCode), candidate.manualCodeHash));
116
+ });
117
+ if (!pairing) {
118
+ throw new Error("Invalid pairing code");
119
+ }
120
+ if (pairing.consumedAt) {
121
+ throw new Error("Pairing code has already been used");
122
+ }
123
+ if (isExpired(pairing, pairedAt)) {
124
+ throw new Error("Pairing code has expired");
125
+ }
126
+ const clientToken = randomSecret();
127
+ const device = {
128
+ id: idGenerator("phone"),
129
+ name: input.deviceName,
130
+ platform: input.platform,
131
+ tokenHash: hashLocalControlToken(clientToken),
132
+ pairedAt: pairedAt.toISOString(),
133
+ lastSeenAt: pairedAt.toISOString(),
134
+ revokedAt: null
135
+ };
136
+ const nextPairings = state.activePairings.map((candidate) => candidate.id === pairing.id
137
+ ? { ...candidate, consumedAt: pairedAt.toISOString() }
138
+ : candidate);
139
+ await saveState({
140
+ ...state,
141
+ activePairings: nextPairings,
142
+ pairedDevices: [...state.pairedDevices, device]
143
+ });
144
+ return {
145
+ machineId: device.id,
146
+ workspaceId: LOCAL_WORKSPACE_ID,
147
+ hostMachineId: state.macId,
148
+ clientToken,
149
+ endpoint: pairing.endpoint,
150
+ macId: state.macId
151
+ };
152
+ },
153
+ async requireDeviceByToken(token) {
154
+ const state = await loadState();
155
+ const device = state.pairedDevices.find((candidate) => !candidate.revokedAt && tokenMatchesHash(token, candidate.tokenHash));
156
+ if (!device) {
157
+ throw new Error("Invalid mobile token");
158
+ }
159
+ const seenAt = now().toISOString();
160
+ await saveState({
161
+ ...state,
162
+ pairedDevices: state.pairedDevices.map((candidate) => candidate.id === device.id ? { ...candidate, lastSeenAt: seenAt } : candidate)
163
+ });
164
+ return { ...device, lastSeenAt: seenAt };
165
+ }
166
+ };
167
+ }
168
+ async function readStateFile(path) {
169
+ try {
170
+ const parsed = JSON.parse(await readFile(path, "utf8"));
171
+ if (parsed.version !== 1 || typeof parsed.macId !== "string") {
172
+ return null;
173
+ }
174
+ return {
175
+ version: 1,
176
+ macId: parsed.macId,
177
+ macName: typeof parsed.macName === "string" ? parsed.macName : hostname() || "Abitat Mac",
178
+ hostTokenHash: typeof parsed.hostTokenHash === "string" ? parsed.hostTokenHash : "",
179
+ pairedDevices: Array.isArray(parsed.pairedDevices) ? parsed.pairedDevices : [],
180
+ activePairings: Array.isArray(parsed.activePairings) ? parsed.activePairings : []
181
+ };
182
+ }
183
+ catch (error) {
184
+ if (isNotFoundError(error)) {
185
+ return null;
186
+ }
187
+ throw error;
188
+ }
189
+ }
190
+ function manualCodeFromSeed(seed) {
191
+ const digest = hashLocalControlToken(seed).slice(0, 8).toUpperCase();
192
+ return `ABITAT-${digest.slice(0, 4)}-${digest.slice(4, 8)}`;
193
+ }
194
+ function normalizeManualCode(code) {
195
+ return code.trim().toUpperCase();
196
+ }
197
+ function isExpired(pairing, now) {
198
+ return Date.parse(pairing.expiresAt) <= now.getTime();
199
+ }
200
+ function tokenMatchesHash(token, expectedHash) {
201
+ const actual = Buffer.from(hashLocalControlToken(token), "hex");
202
+ const expected = Buffer.from(expectedHash, "hex");
203
+ return actual.length === expected.length && timingSafeEqual(actual, expected);
204
+ }
205
+ function isNotFoundError(error) {
206
+ return Boolean(error && typeof error === "object" && error.code === "ENOENT");
207
+ }
208
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/local-control/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Readable } from "node:stream";
2
+ import type { LocalControlTransport } from "./state.js";
3
+ type ExecFile = (file: string, args: string[]) => Promise<{
4
+ stdout: string;
5
+ stderr: string;
6
+ }>;
7
+ interface QuickTunnelProcess {
8
+ kill(signal?: NodeJS.Signals | number): boolean;
9
+ killed: boolean;
10
+ off(event: string, listener: (...args: any[]) => void): QuickTunnelProcess;
11
+ once(event: string, listener: (...args: any[]) => void): QuickTunnelProcess;
12
+ stderr: Readable;
13
+ stdout: Readable;
14
+ }
15
+ type SpawnProcess = (file: string, args: string[]) => QuickTunnelProcess;
16
+ export interface LocalControlTransportResolution {
17
+ bindHost: string;
18
+ endpoint: string;
19
+ transport: LocalControlTransport;
20
+ warning?: string;
21
+ }
22
+ export interface QuickTunnel {
23
+ close(): Promise<void>;
24
+ endpoint: string;
25
+ }
26
+ interface ResolveLocalControlTransportInput {
27
+ endpoint?: string;
28
+ execFile?: ExecFile;
29
+ port: number;
30
+ requestedTransport: "auto" | LocalControlTransport;
31
+ }
32
+ export declare function resolveLocalControlTransport(input: ResolveLocalControlTransportInput): Promise<LocalControlTransportResolution>;
33
+ export declare function startQuickTunnel(input: {
34
+ localUrl: string;
35
+ spawnProcess?: SpawnProcess;
36
+ timeoutMs?: number;
37
+ }): Promise<QuickTunnel>;
38
+ export {};
39
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/local-control/transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,KAAK,QAAQ,GAAG,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,UAAU,kBAAkB;IAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,kBAAkB,CAAC;IAC3E,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,kBAAkB,CAAC;IAC5E,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,kBAAkB,CAAC;AAEzE,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,qBAAqB,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,iCAAiC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,GAAG,qBAAqB,CAAC;CACpD;AAID,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,+BAA+B,CAAC,CAmD1C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmEvB"}
@@ -0,0 +1,149 @@
1
+ import { execFile as execFileCallback, spawn } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFile = promisify(execFileCallback);
4
+ export async function resolveLocalControlTransport(input) {
5
+ if (input.endpoint) {
6
+ return {
7
+ bindHost: "0.0.0.0",
8
+ endpoint: trimTrailingSlash(input.endpoint),
9
+ transport: input.requestedTransport === "auto" ? "manual" : input.requestedTransport
10
+ };
11
+ }
12
+ if (input.requestedTransport === "tailscale" || input.requestedTransport === "auto") {
13
+ const tailscale = await resolveTailscaleEndpoint(input.port, input.execFile ?? execFile).catch((error) => ({
14
+ warning: `Tailscale endpoint unavailable: ${errorMessage(error)}`
15
+ }));
16
+ if ("endpoint" in tailscale) {
17
+ return tailscale;
18
+ }
19
+ if (input.requestedTransport === "tailscale") {
20
+ return {
21
+ bindHost: "127.0.0.1",
22
+ endpoint: `http://127.0.0.1:${input.port}`,
23
+ transport: "local",
24
+ warning: tailscale.warning
25
+ };
26
+ }
27
+ return {
28
+ bindHost: "127.0.0.1",
29
+ endpoint: `http://127.0.0.1:${input.port}`,
30
+ transport: "local",
31
+ warning: tailscale.warning
32
+ };
33
+ }
34
+ if (input.requestedTransport === "quick-tunnel") {
35
+ return {
36
+ bindHost: "127.0.0.1",
37
+ endpoint: `http://127.0.0.1:${input.port}`,
38
+ transport: "quick-tunnel",
39
+ warning: "Quick Tunnel endpoint will be resolved after the local server starts."
40
+ };
41
+ }
42
+ return {
43
+ bindHost: "127.0.0.1",
44
+ endpoint: `http://127.0.0.1:${input.port}`,
45
+ transport: "local"
46
+ };
47
+ }
48
+ export function startQuickTunnel(input) {
49
+ const spawnProcess = input.spawnProcess ??
50
+ ((file, args) => spawn(file, args, { stdio: ["ignore", "pipe", "pipe"] }));
51
+ const child = spawnProcess("cloudflared", ["tunnel", "--url", input.localUrl]);
52
+ const timeoutMs = input.timeoutMs ?? 30_000;
53
+ return new Promise((resolve, reject) => {
54
+ let settled = false;
55
+ let output = "";
56
+ const timer = setTimeout(() => {
57
+ fail(new Error("Timed out waiting for Cloudflare Quick Tunnel URL from cloudflared. Check the cloudflared output and try again."));
58
+ }, timeoutMs);
59
+ timer.unref?.();
60
+ const onData = (chunk) => {
61
+ output += chunk.toString();
62
+ const endpoint = parseQuickTunnelEndpoint(output);
63
+ if (!endpoint) {
64
+ return;
65
+ }
66
+ cleanup();
67
+ settled = true;
68
+ resolve({
69
+ endpoint,
70
+ close: () => closeQuickTunnelProcess(child)
71
+ });
72
+ };
73
+ const onError = (error) => {
74
+ fail(quickTunnelStartError(error));
75
+ };
76
+ const onExit = (code, signal) => {
77
+ fail(new Error(`cloudflared exited before creating a Quick Tunnel URL (code=${code ?? "null"}, signal=${signal ?? "null"}). Install cloudflared on the Mac with: brew install cloudflared`));
78
+ };
79
+ const cleanup = () => {
80
+ clearTimeout(timer);
81
+ child.stdout.off("data", onData);
82
+ child.stderr.off("data", onData);
83
+ child.off("error", onError);
84
+ child.off("exit", onExit);
85
+ };
86
+ const fail = (error) => {
87
+ if (settled) {
88
+ return;
89
+ }
90
+ cleanup();
91
+ settled = true;
92
+ reject(error);
93
+ };
94
+ child.stdout.on("data", onData);
95
+ child.stderr.on("data", onData);
96
+ child.once("error", onError);
97
+ child.once("exit", onExit);
98
+ });
99
+ }
100
+ async function resolveTailscaleEndpoint(port, run) {
101
+ const { stdout } = await run("tailscale", ["status", "--json"]);
102
+ const status = JSON.parse(stdout);
103
+ const ips = Array.isArray(status.Self?.TailscaleIPs) ? status.Self?.TailscaleIPs : [];
104
+ const ipv4 = ips.find((ip) => typeof ip === "string" && /^\d+\./u.test(ip));
105
+ if (!ipv4) {
106
+ throw new Error("no Tailscale IPv4 address found");
107
+ }
108
+ return {
109
+ bindHost: "0.0.0.0",
110
+ endpoint: `http://${ipv4}:${port}`,
111
+ transport: "tailscale"
112
+ };
113
+ }
114
+ function trimTrailingSlash(value) {
115
+ return value.replace(/\/+$/u, "");
116
+ }
117
+ function errorMessage(error) {
118
+ return error instanceof Error ? error.message : String(error);
119
+ }
120
+ function parseQuickTunnelEndpoint(output) {
121
+ return output.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/iu)?.[0] ?? null;
122
+ }
123
+ function quickTunnelStartError(error) {
124
+ const message = errorMessage(error);
125
+ const code = error && typeof error === "object" && "code" in error ? String(error.code) : undefined;
126
+ if (code === "ENOENT" || message.includes("ENOENT")) {
127
+ return new Error("Install cloudflared on the Mac with: brew install cloudflared. The iPhone does not need Cloudflare or Tailscale.");
128
+ }
129
+ return new Error(`Unable to start Cloudflare Quick Tunnel: ${message}`);
130
+ }
131
+ function closeQuickTunnelProcess(child) {
132
+ return new Promise((resolve) => {
133
+ if (child.killed) {
134
+ resolve();
135
+ return;
136
+ }
137
+ const timer = setTimeout(() => {
138
+ child.kill("SIGKILL");
139
+ resolve();
140
+ }, 1000);
141
+ timer.unref?.();
142
+ child.once("exit", () => {
143
+ clearTimeout(timer);
144
+ resolve();
145
+ });
146
+ child.kill("SIGTERM");
147
+ });
148
+ }
149
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/local-control/transport.ts"],"names":[],"mappings":"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"}
@@ -153,5 +153,13 @@ export declare class HostApiClient {
153
153
  private patch;
154
154
  private post;
155
155
  }
156
+ export declare class HostApiError extends Error {
157
+ readonly method: string;
158
+ readonly path: string;
159
+ readonly status: number;
160
+ readonly body: string;
161
+ constructor(method: string, path: string, status: number, body: string);
162
+ }
163
+ export declare function isTransientHostApiError(error: unknown): error is HostApiError;
156
164
  export {};
157
165
  //# sourceMappingURL=api-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/transport/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAEnB,oBAAoB,EACpB,kBAAkB,EAElB,QAAQ,EACR,mBAAmB,EACnB,qBAAqB,EAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,UAAU,2BAA2B;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,mBAAmB,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,UAAU,0BAA0B;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBADV,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,YAAA;IAGrC,IAAI,CAAC,KAAK,EAAE,kBAAkB;;;;;IAI9B,SAAS,CAAC,KAAK,EAAE,oBAAoB;YACZ,IAAI;oBAAc,MAAM;;IAGjD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;YAEvB,IAAI;;IAG7B,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB;YACzC,IAAI;;IAG7B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAcpE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;YACvB,IAAI;;IAG7B,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB;YAC1C,IAAI;;IAG7B,eAAe,CACb,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;YAE7C,IAAI;;IAG7B,yBAAyB,CAAC,SAAS,EAAE,MAAM;kBAEb,2BAA2B,EAAE;;IAG3D,0BAA0B,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QAAE,MAAM,EAAE,mBAAmB,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;iBAEhC,2BAA2B;;IAM1D,wBAAwB,CAAC,SAAS,EAAE,MAAM;iBACb,0BAA0B,EAAE;;IAKzD,uBAAuB,CACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE;gBAE3D,0BAA0B;;YAMzC,GAAG;YAeH,KAAK;YAiBL,IAAI;CAgBnB"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/transport/api-client.ts"],"names":[],"mappings":"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"}
@@ -60,7 +60,7 @@ export class HostApiClient {
60
60
  }
61
61
  });
62
62
  if (!response.ok) {
63
- throw new Error(`${response.status} ${await response.text()}`);
63
+ throw await createHostApiError("GET", path, response);
64
64
  }
65
65
  return (await response.json());
66
66
  }
@@ -74,7 +74,7 @@ export class HostApiClient {
74
74
  body: JSON.stringify(body)
75
75
  });
76
76
  if (!response.ok) {
77
- throw new Error(`${response.status} ${await response.text()}`);
77
+ throw await createHostApiError("PATCH", path, response);
78
78
  }
79
79
  return (await response.json());
80
80
  }
@@ -88,9 +88,36 @@ export class HostApiClient {
88
88
  body: JSON.stringify(body)
89
89
  });
90
90
  if (!response.ok) {
91
- throw new Error(`${response.status} ${await response.text()}`);
91
+ throw await createHostApiError("POST", path, response);
92
92
  }
93
93
  return (await response.json());
94
94
  }
95
95
  }
96
+ export class HostApiError extends Error {
97
+ method;
98
+ path;
99
+ status;
100
+ body;
101
+ constructor(method, path, status, body) {
102
+ super(`${method} ${path} failed: ${status} ${body}`);
103
+ this.method = method;
104
+ this.path = path;
105
+ this.status = status;
106
+ this.body = body;
107
+ this.name = "HostApiError";
108
+ }
109
+ }
110
+ export function isTransientHostApiError(error) {
111
+ if (!(error instanceof HostApiError)) {
112
+ return false;
113
+ }
114
+ if ([500, 502, 503, 504].includes(error.status)) {
115
+ return true;
116
+ }
117
+ const body = error.body.toLowerCase();
118
+ return body.includes("query read timeout") || body.includes("timed out");
119
+ }
120
+ async function createHostApiError(method, path, response) {
121
+ return new HostApiError(method, path, response.status, await response.text());
122
+ }
96
123
  //# sourceMappingURL=api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/transport/api-client.ts"],"names":[],"mappings":"AAiCA,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,MAAc,EACd,SAAkB;QADlB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAS;IAClC,CAAC;IAEJ,IAAI,CAAC,KAAyB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAsB,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,SAAS,CAAC,KAA2B;QACnC,OAAO,IAAI,CAAC,IAAI,CAAmC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IACpF,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,KAAiB;QAC9C,MAAM,KAAK,GAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAe,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,mBAAmB,CAAC,SAAiB,EAAE,QAA2B;QAChE,OAAO,IAAI,CAAC,IAAI,CAAe,2BAA2B,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,qBAAyC;QAClE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC;YACpD,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,qBAAqB;gBACrB,CAAC,CAAC,CAAC,qBAAqB,CAAC;gBACzB,CAAC,CAAC,EAAE,CAAC;QAET,OAAO,IAAI,CAAC,IAAI,CAAwB,uBAAuB,EAAE;YAC/D,SAAS;YACT,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,KAA0B;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAe,oBAAoB,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC;IAED,cAAc,CAAC,cAAsB,EAAE,KAA4B;QACjE,OAAO,IAAI,CAAC,IAAI,CAAe,sBAAsB,cAAc,SAAS,EAAE,KAAK,CAAC,CAAC;IACvF,CAAC;IAED,eAAe,CACb,cAAsB,EACtB,KAAoE;QAEpE,OAAO,IAAI,CAAC,IAAI,CAAe,sBAAsB,cAAc,YAAY,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;IAED,yBAAyB,CAAC,SAAiB;QACzC,MAAM,IAAI,GAAG,+CAA+C,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,GAAG,CAA8C,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,0BAA0B,CACxB,SAAiB,EACjB,KAA6D;QAE7D,OAAO,IAAI,CAAC,KAAK,CACf,qCAAqC,SAAS,EAAE,EAChD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,wBAAwB,CAAC,SAAiB;QACxC,OAAO,IAAI,CAAC,GAAG,CACb,qCAAqC,SAAS,UAAU,CACzD,CAAC;IACJ,CAAC;IAED,uBAAuB,CACrB,SAAiB,EACjB,KAAsF;QAEtF,OAAO,IAAI,CAAC,IAAI,CACd,qCAAqC,SAAS,UAAU,EACxD,KAAK,CACN,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,GAAG,CAAY,IAAY;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;YACvD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzE;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,KAAK,CAAY,IAAY,EAAE,IAAa;QACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;YACvD,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,IAAI,CAAY,IAAY,EAAE,IAAa;QACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;IAC9C,CAAC;CACF"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/transport/api-client.ts"],"names":[],"mappings":"AAiCA,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,MAAc,EACd,SAAkB;QADlB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAS;IAClC,CAAC;IAEJ,IAAI,CAAC,KAAyB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAsB,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,SAAS,CAAC,KAA2B;QACnC,OAAO,IAAI,CAAC,IAAI,CAAmC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IACpF,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,KAAiB;QAC9C,MAAM,KAAK,GAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAe,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,mBAAmB,CAAC,SAAiB,EAAE,QAA2B;QAChE,OAAO,IAAI,CAAC,IAAI,CAAe,2BAA2B,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,qBAAyC;QAClE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC;YACpD,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,qBAAqB;gBACrB,CAAC,CAAC,CAAC,qBAAqB,CAAC;gBACzB,CAAC,CAAC,EAAE,CAAC;QAET,OAAO,IAAI,CAAC,IAAI,CAAwB,uBAAuB,EAAE;YAC/D,SAAS;YACT,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,KAA0B;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAe,oBAAoB,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC;IAED,cAAc,CAAC,cAAsB,EAAE,KAA4B;QACjE,OAAO,IAAI,CAAC,IAAI,CAAe,sBAAsB,cAAc,SAAS,EAAE,KAAK,CAAC,CAAC;IACvF,CAAC;IAED,eAAe,CACb,cAAsB,EACtB,KAAoE;QAEpE,OAAO,IAAI,CAAC,IAAI,CAAe,sBAAsB,cAAc,YAAY,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;IAED,yBAAyB,CAAC,SAAiB;QACzC,MAAM,IAAI,GAAG,+CAA+C,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,GAAG,CAA8C,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,0BAA0B,CACxB,SAAiB,EACjB,KAA6D;QAE7D,OAAO,IAAI,CAAC,KAAK,CACf,qCAAqC,SAAS,EAAE,EAChD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,wBAAwB,CAAC,SAAiB;QACxC,OAAO,IAAI,CAAC,GAAG,CACb,qCAAqC,SAAS,UAAU,CACzD,CAAC;IACJ,CAAC;IAED,uBAAuB,CACrB,SAAiB,EACjB,KAAsF;QAEtF,OAAO,IAAI,CAAC,IAAI,CACd,qCAAqC,SAAS,UAAU,EACxD,KAAK,CACN,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,GAAG,CAAY,IAAY;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;YACvD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzE;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,KAAK,CAAY,IAAY,EAAE,IAAa;QACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;YACvD,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,IAAI,CAAY,IAAY,EAAE,IAAa;QACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IAE1B;IACA;IACA;IACA;IAJX,YACW,MAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAY;QAErB,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,YAAY,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAL5C,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAGrB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAAc,EAAE,IAAY,EAAE,QAAkB;IAChF,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@abitat_reece/host-daemon",
3
3
  "private": false,
4
- "version": "0.1.4",
4
+ "version": "0.1.6",
5
5
  "type": "module",
6
6
  "description": "Mac host daemon for Abitat Workspace remote Codex control",
7
7
  "bin": {
@@ -21,10 +21,12 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "node-pty": "^1.1.0",
24
+ "qrcode-terminal": "0.12.0",
24
25
  "ws": "^8.20.0",
25
26
  "@abitat_reece/shared": "0.1.0"
26
27
  },
27
28
  "devDependencies": {
29
+ "@types/qrcode-terminal": "0.12.2",
28
30
  "@types/ws": "^8.18.1",
29
31
  "tsx": "4.21.0"
30
32
  },