runpane 2.4.162 → 2.4.164
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agentContext.d.ts +1 -1
- package/dist/agentContext.d.ts.map +1 -1
- package/dist/agentContext.js +8 -4
- package/dist/agentContext.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +51 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +10 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +40 -0
- package/dist/commands.js.map +1 -1
- package/dist/daemonClient.d.ts +8 -0
- package/dist/daemonClient.d.ts.map +1 -1
- package/dist/daemonClient.js +41 -0
- package/dist/daemonClient.js.map +1 -1
- package/dist/docs-index.json +1 -1
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +5 -1
- package/dist/doctor.js.map +1 -1
- package/dist/generated/contract.d.ts +241 -5
- package/dist/generated/contract.d.ts.map +1 -1
- package/dist/generated/contract.js +449 -6
- package/dist/generated/contract.js.map +1 -1
- package/dist/localControl.d.ts +1 -0
- package/dist/localControl.d.ts.map +1 -1
- package/dist/localControl.js +1 -0
- package/dist/localControl.js.map +1 -1
- package/dist/workspace.d.ts +48 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +410 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ParsedArgs } from './commands';
|
|
2
|
+
import { type RemoteDaemonTarget } from './daemonClient';
|
|
3
|
+
type MachineOs = 'macOS' | 'Windows' | 'Linux';
|
|
4
|
+
export interface TailnetMachine {
|
|
5
|
+
name: string;
|
|
6
|
+
dnsName: string;
|
|
7
|
+
os: MachineOs;
|
|
8
|
+
online: boolean;
|
|
9
|
+
ips: string[];
|
|
10
|
+
self: boolean;
|
|
11
|
+
}
|
|
12
|
+
export type Tailnet = {
|
|
13
|
+
ok: true;
|
|
14
|
+
self: TailnetMachine;
|
|
15
|
+
machines: TailnetMachine[];
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
reason: string;
|
|
19
|
+
fix: string;
|
|
20
|
+
};
|
|
21
|
+
/** This machine and the owner's other Mac, Windows, and Linux machines, from `tailscale status --json`. */
|
|
22
|
+
export declare function readTailnet(): Promise<Tailnet>;
|
|
23
|
+
/** Finds a machine by Tailscale name, MagicDNS name, Tailscale IP, or unique name prefix. */
|
|
24
|
+
export declare function resolveMachine(query: string, machines: readonly TailnetMachine[]): TailnetMachine;
|
|
25
|
+
export declare function workspaceTarget(machine: TailnetMachine): RemoteDaemonTarget;
|
|
26
|
+
export declare function runWorkspaceList(parsed: ParsedArgs): Promise<number>;
|
|
27
|
+
export declare function runWorkspaceSetEnabled(parsed: ParsedArgs, enabled: boolean): Promise<number>;
|
|
28
|
+
export declare function runWorkspaceRead(parsed: ParsedArgs): Promise<number>;
|
|
29
|
+
export declare function runWorkspaceWrite(parsed: ParsedArgs): Promise<number>;
|
|
30
|
+
export declare function runWorkspaceExec(parsed: ParsedArgs): Promise<number>;
|
|
31
|
+
export interface WorkspaceSummary {
|
|
32
|
+
state: 'on' | 'off';
|
|
33
|
+
machine: string | null;
|
|
34
|
+
reason?: string;
|
|
35
|
+
fix?: string;
|
|
36
|
+
otherMachines: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
os: MachineOs;
|
|
39
|
+
online: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
lines: string[];
|
|
42
|
+
}
|
|
43
|
+
/** The short workspaces block that help, doctor, and agent-context print. */
|
|
44
|
+
export declare function readWorkspaceSummary(paneDir?: string): Promise<WorkspaceSummary>;
|
|
45
|
+
/** For a path or Session ID that is not on this machine: the likely machine and the exact command to use. */
|
|
46
|
+
export declare function workspaceHintFor(error: NodeJS.ErrnoException, parsed: ParsedArgs): Promise<string | null>;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAA2D,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASlH,KAAK,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,OAAO,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;CAAE,GAC9D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAqD/C,2GAA2G;AAC3G,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAwBpD;AAuCD,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,cAAc,CAWjG;AA6BD,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,CAE3E;AAuCD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB1E;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlG;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAY1E;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B1E;AAgCD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACvE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,6EAA6E;AAC7E,wBAAsB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkBtF;AAkBD,6GAA6G;AAC7G,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0B/G"}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readTailnet = readTailnet;
|
|
7
|
+
exports.resolveMachine = resolveMachine;
|
|
8
|
+
exports.workspaceTarget = workspaceTarget;
|
|
9
|
+
exports.runWorkspaceList = runWorkspaceList;
|
|
10
|
+
exports.runWorkspaceSetEnabled = runWorkspaceSetEnabled;
|
|
11
|
+
exports.runWorkspaceRead = runWorkspaceRead;
|
|
12
|
+
exports.runWorkspaceWrite = runWorkspaceWrite;
|
|
13
|
+
exports.runWorkspaceExec = runWorkspaceExec;
|
|
14
|
+
exports.readWorkspaceSummary = readWorkspaceSummary;
|
|
15
|
+
exports.workspaceHintFor = workspaceHintFor;
|
|
16
|
+
const node_child_process_1 = require("node:child_process");
|
|
17
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
18
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
19
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
20
|
+
const boundaryDecoder_1 = require("./boundaryDecoder");
|
|
21
|
+
const daemonClient_1 = require("./daemonClient");
|
|
22
|
+
/** Tailnet port where each joined machine's Pane serves workspaces. */
|
|
23
|
+
const WORKSPACE_HTTPS_PORT = 8443;
|
|
24
|
+
const TAILSCALE_TIMEOUT_MS = 3_000;
|
|
25
|
+
const PROBE_TIMEOUT_MS = 4_000;
|
|
26
|
+
const LOCAL_STATUS_TIMEOUT_MS = 1_500;
|
|
27
|
+
const REACH_LINE = 'Reach them: runpane workspace <machine> read|write|exec|<command>';
|
|
28
|
+
const peerSchema = boundaryDecoder_1.boundary.object({
|
|
29
|
+
DNSName: boundaryDecoder_1.boundary.string,
|
|
30
|
+
OS: boundaryDecoder_1.boundary.string,
|
|
31
|
+
UserID: boundaryDecoder_1.boundary.number,
|
|
32
|
+
Online: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.boolean),
|
|
33
|
+
TailscaleIPs: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.array(boundaryDecoder_1.boundary.string))),
|
|
34
|
+
Tags: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.array(boundaryDecoder_1.boundary.string))),
|
|
35
|
+
});
|
|
36
|
+
const statusSchema = boundaryDecoder_1.boundary.object({
|
|
37
|
+
BackendState: boundaryDecoder_1.boundary.string,
|
|
38
|
+
Self: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.nullable(peerSchema)),
|
|
39
|
+
Peer: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.jsonObject)),
|
|
40
|
+
});
|
|
41
|
+
const machineInfoSchema = boundaryDecoder_1.boundary.object({
|
|
42
|
+
hostname: boundaryDecoder_1.boundary.string,
|
|
43
|
+
os: boundaryDecoder_1.boundary.enumeration('macOS', 'Windows', 'Linux'),
|
|
44
|
+
isWsl: boundaryDecoder_1.boundary.boolean,
|
|
45
|
+
shell: boundaryDecoder_1.boundary.string,
|
|
46
|
+
homeDir: boundaryDecoder_1.boundary.string,
|
|
47
|
+
wslDistros: boundaryDecoder_1.boundary.array(boundaryDecoder_1.boundary.string),
|
|
48
|
+
});
|
|
49
|
+
const readResultSchema = boundaryDecoder_1.boundary.object({
|
|
50
|
+
path: boundaryDecoder_1.boundary.string,
|
|
51
|
+
encoding: boundaryDecoder_1.boundary.enumeration('utf8', 'base64'),
|
|
52
|
+
content: boundaryDecoder_1.boundary.string,
|
|
53
|
+
bytes: boundaryDecoder_1.boundary.number,
|
|
54
|
+
});
|
|
55
|
+
const writeResultSchema = boundaryDecoder_1.boundary.object({ path: boundaryDecoder_1.boundary.string, bytes: boundaryDecoder_1.boundary.number });
|
|
56
|
+
const execResultSchema = boundaryDecoder_1.boundary.object({
|
|
57
|
+
os: boundaryDecoder_1.boundary.enumeration('macOS', 'Windows', 'Linux'),
|
|
58
|
+
shell: boundaryDecoder_1.boundary.string,
|
|
59
|
+
cwd: boundaryDecoder_1.boundary.string,
|
|
60
|
+
exitCode: boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.number),
|
|
61
|
+
signal: boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.string),
|
|
62
|
+
timedOut: boundaryDecoder_1.boundary.boolean,
|
|
63
|
+
stdout: boundaryDecoder_1.boundary.string,
|
|
64
|
+
stderr: boundaryDecoder_1.boundary.string,
|
|
65
|
+
});
|
|
66
|
+
const localStatusSchema = boundaryDecoder_1.boundary.object({
|
|
67
|
+
enabled: boundaryDecoder_1.boundary.boolean,
|
|
68
|
+
state: boundaryDecoder_1.boundary.enumeration('on', 'off'),
|
|
69
|
+
reason: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.string),
|
|
70
|
+
fix: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.string),
|
|
71
|
+
machineName: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.string),
|
|
72
|
+
url: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.string),
|
|
73
|
+
});
|
|
74
|
+
// ---------------------------------------------------------------- tailnet
|
|
75
|
+
/** This machine and the owner's other Mac, Windows, and Linux machines, from `tailscale status --json`. */
|
|
76
|
+
async function readTailnet() {
|
|
77
|
+
const output = await runTailscale(['status', '--json']);
|
|
78
|
+
if (output === null) {
|
|
79
|
+
return { ok: false, reason: 'Tailscale is not installed', fix: 'Install Tailscale from https://tailscale.com/download and sign in.' };
|
|
80
|
+
}
|
|
81
|
+
let status;
|
|
82
|
+
try {
|
|
83
|
+
status = (0, boundaryDecoder_1.decodeBoundary)(JSON.parse(output), statusSchema);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return { ok: false, reason: 'Tailscale status could not be read', fix: 'Update Tailscale.' };
|
|
87
|
+
}
|
|
88
|
+
if (status.BackendState !== 'Running' || !status.Self) {
|
|
89
|
+
return { ok: false, reason: 'Tailscale is signed out', fix: 'Open Tailscale and sign in.' };
|
|
90
|
+
}
|
|
91
|
+
const self = toMachine(status.Self, true);
|
|
92
|
+
const ownerId = status.Self.UserID;
|
|
93
|
+
const machines = Object.values(status.Peer ?? {})
|
|
94
|
+
.map(decodePeer)
|
|
95
|
+
.filter((peer) => Boolean(peer && peer.UserID === ownerId && !peer.Tags?.length))
|
|
96
|
+
.map((peer) => toMachine(peer, false))
|
|
97
|
+
.filter((machine) => machine !== null)
|
|
98
|
+
.sort((left, right) => Number(right.online) - Number(left.online) || left.name.localeCompare(right.name));
|
|
99
|
+
if (!self)
|
|
100
|
+
return { ok: false, reason: `Tailscale reports an unsupported OS (${status.Self.OS})`, fix: 'Run Pane on macOS, Windows, or Linux.' };
|
|
101
|
+
return { ok: true, self, machines };
|
|
102
|
+
}
|
|
103
|
+
const TAILSCALE_OS_NAMES = new Map([['macos', 'macOS'], ['windows', 'Windows'], ['linux', 'Linux']]);
|
|
104
|
+
function decodePeer(value) {
|
|
105
|
+
try {
|
|
106
|
+
return (0, boundaryDecoder_1.decodeBoundary)(value, peerSchema);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function toMachine(peer, self) {
|
|
113
|
+
const osName = TAILSCALE_OS_NAMES.get(peer.OS.toLowerCase());
|
|
114
|
+
if (!osName)
|
|
115
|
+
return null;
|
|
116
|
+
const dnsName = peer.DNSName.replace(/\.$/, '');
|
|
117
|
+
return { name: dnsName.split('.')[0], dnsName, os: osName, online: self || peer.Online === true, ips: peer.TailscaleIPs ?? [], self };
|
|
118
|
+
}
|
|
119
|
+
function runTailscale(args) {
|
|
120
|
+
const candidates = [{ command: 'tailscale' }];
|
|
121
|
+
if (process.platform === 'darwin') {
|
|
122
|
+
for (const app of ['/Applications/Tailscale.app', node_path_1.default.join(node_os_1.default.homedir(), 'Applications', 'Tailscale.app')]) {
|
|
123
|
+
candidates.push({ command: node_path_1.default.join(app, 'Contents', 'MacOS', 'Tailscale'), env: { ...process.env, TAILSCALE_BE_CLI: '1' } });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (process.platform === 'win32') {
|
|
127
|
+
for (const directory of [process.env.ProgramFiles, process.env['ProgramFiles(x86)'], process.env.LOCALAPPDATA]) {
|
|
128
|
+
if (directory)
|
|
129
|
+
candidates.push({ command: node_path_1.default.join(directory, 'Tailscale', 'tailscale.exe') });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return candidates.reduce(async (found, candidate) => (await found) ?? new Promise((resolve) => {
|
|
133
|
+
(0, node_child_process_1.execFile)(candidate.command, args, { encoding: 'utf8', timeout: TAILSCALE_TIMEOUT_MS, env: candidate.env ?? process.env, windowsHide: true }, (error, stdout) => resolve(error && !stdout ? null : stdout));
|
|
134
|
+
}), Promise.resolve(null));
|
|
135
|
+
}
|
|
136
|
+
// ---------------------------------------------------------------- machine selection
|
|
137
|
+
/** Finds a machine by Tailscale name, MagicDNS name, Tailscale IP, or unique name prefix. */
|
|
138
|
+
function resolveMachine(query, machines) {
|
|
139
|
+
const wanted = query.trim().toLowerCase().replace(/\.$/, '');
|
|
140
|
+
const exact = machines.find((machine) => machine.name === wanted || machine.dnsName.toLowerCase() === wanted || machine.ips.includes(wanted));
|
|
141
|
+
if (exact)
|
|
142
|
+
return exact;
|
|
143
|
+
const prefixed = machines.filter((machine) => machine.name.startsWith(wanted));
|
|
144
|
+
if (prefixed.length === 1)
|
|
145
|
+
return prefixed[0];
|
|
146
|
+
if (prefixed.length > 1) {
|
|
147
|
+
throw new Error(`"${query}" matches several machines: ${prefixed.map((machine) => machine.name).join(', ')}. Use the full name.`);
|
|
148
|
+
}
|
|
149
|
+
throw new Error(`No machine of yours on Tailscale is called "${query}". Your machines: ${describeMachines(machines) || 'none'}.`);
|
|
150
|
+
}
|
|
151
|
+
/** The machines whose OS fits a path that has the shape of another OS's paths; empty for local-shaped paths. */
|
|
152
|
+
function machinesForPath(value, machines, platform = process.platform) {
|
|
153
|
+
const systems = foreignPathSystems(value, platform);
|
|
154
|
+
return machines.filter((machine) => !machine.self && systems.includes(machine.os));
|
|
155
|
+
}
|
|
156
|
+
/** The systems a path belongs to when its shape cannot exist on this platform; empty otherwise. */
|
|
157
|
+
function foreignPathSystems(value, platform) {
|
|
158
|
+
const local = platform === 'darwin' ? 'macOS' : platform === 'win32' ? 'Windows' : 'Linux';
|
|
159
|
+
const p = value.trim();
|
|
160
|
+
let systems;
|
|
161
|
+
if (/^[A-Za-z]:([\\/]|$)/.test(p) || /^(\\\\|\/\/)wsl(\.localhost|\$)[\\/]/i.test(p))
|
|
162
|
+
systems = ['Windows'];
|
|
163
|
+
else if (/^\/mnt\/[a-z](\/|$)/.test(p) || p.startsWith('/home/'))
|
|
164
|
+
systems = ['Windows', 'Linux'];
|
|
165
|
+
else if (p.startsWith('/Users/'))
|
|
166
|
+
systems = ['macOS'];
|
|
167
|
+
else
|
|
168
|
+
return [];
|
|
169
|
+
return systems.includes(local) ? [] : systems;
|
|
170
|
+
}
|
|
171
|
+
function describeMachines(machines) {
|
|
172
|
+
return machines.filter((machine) => !machine.self)
|
|
173
|
+
.map((machine) => `${machine.name} (${machine.os}, ${machine.online ? 'online' : 'offline'})`).join(', ');
|
|
174
|
+
}
|
|
175
|
+
function workspaceTarget(machine) {
|
|
176
|
+
return { machine: machine.name, baseUrl: `https://${machine.dnsName}:${WORKSPACE_HTTPS_PORT}` };
|
|
177
|
+
}
|
|
178
|
+
async function probeMachine(machine) {
|
|
179
|
+
if (!machine.online)
|
|
180
|
+
return { error: 'offline' };
|
|
181
|
+
try {
|
|
182
|
+
return { info: await (0, daemonClient_1.invokeRemoteDaemon)(workspaceTarget(machine), 'runpane:machine:info', [], machineInfoSchema, PROBE_TIMEOUT_MS) };
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (error instanceof daemonClient_1.PaneDaemonClientError && (error.code === 'ERR_WORKSPACE_UNREACHABLE' || error.code === 'ERR_WORKSPACE_TIMEOUT')) {
|
|
186
|
+
return { error: 'Pane is not answering there; it needs a Pane with workspaces running and signed in to Tailscale' };
|
|
187
|
+
}
|
|
188
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async function requireTailnet() {
|
|
192
|
+
const tailnet = await readTailnet();
|
|
193
|
+
if (!tailnet.ok)
|
|
194
|
+
throw new Error(`runpane workspace needs Tailscale: ${tailnet.reason}. ${tailnet.fix}`);
|
|
195
|
+
return tailnet;
|
|
196
|
+
}
|
|
197
|
+
/** Picks the machine for a path that is not on this machine, or explains which names to choose from. */
|
|
198
|
+
async function routePath(value, verb) {
|
|
199
|
+
const tailnet = await requireTailnet();
|
|
200
|
+
const candidates = machinesForPath(value, tailnet.machines).filter((machine) => machine.online);
|
|
201
|
+
const probes = await Promise.all(candidates.map(async (machine) => ({ machine, probe: await probeMachine(machine) })));
|
|
202
|
+
const joined = probes.filter(({ probe }) => probe.info).map(({ machine }) => machine);
|
|
203
|
+
if (joined.length === 1)
|
|
204
|
+
return joined[0];
|
|
205
|
+
const names = (joined.length ? joined : candidates).map((machine) => machine.name);
|
|
206
|
+
if (names.length > 1) {
|
|
207
|
+
throw new Error(`"${value}" could be on ${names.join(', ')}. Name one: runpane workspace <machine> ${verb} ${quoteArg(value)}`);
|
|
208
|
+
}
|
|
209
|
+
if (probes.length === 1) {
|
|
210
|
+
throw new Error(`"${value}" is not on this machine. It fits ${probes[0].machine.name}, but ${probes[0].probe.error}.`);
|
|
211
|
+
}
|
|
212
|
+
throw new Error(`"${value}" is not on this machine, and none of your online machines fits it. Machines: ${describeMachines(tailnet.machines) || 'none'}.`);
|
|
213
|
+
}
|
|
214
|
+
// ---------------------------------------------------------------- commands
|
|
215
|
+
async function runWorkspaceList(parsed) {
|
|
216
|
+
const tailnet = await requireTailnet();
|
|
217
|
+
const local = await readLocalStatus(parsed.paneDir);
|
|
218
|
+
const rows = await Promise.all(tailnet.machines.map(async (machine) => ({ machine, probe: await probeMachine(machine) })));
|
|
219
|
+
if (parsed.json) {
|
|
220
|
+
console.log(JSON.stringify({
|
|
221
|
+
ok: true,
|
|
222
|
+
self: { ...tailnet.self, workspace: local },
|
|
223
|
+
machines: rows.map(({ machine, probe }) => ({ ...machine, joined: Boolean(probe.info), info: probe.info, error: probe.error })),
|
|
224
|
+
}, null, 2));
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
console.log(`${tailnet.self.name} (this machine, ${tailnet.self.os}): ${local ? describeLocalStatus(local) : 'off (Pane is not running)'}`);
|
|
228
|
+
for (const { machine, probe } of rows) {
|
|
229
|
+
const state = probe.info ? `joined, shell ${probe.info.shell}` : `not reachable: ${probe.error}`;
|
|
230
|
+
console.log(`${machine.name} (${machine.os}, ${machine.online ? 'online' : 'offline'}): ${machine.online ? state : 'offline'}`);
|
|
231
|
+
}
|
|
232
|
+
console.log(REACH_LINE);
|
|
233
|
+
return 0;
|
|
234
|
+
}
|
|
235
|
+
async function runWorkspaceSetEnabled(parsed, enabled) {
|
|
236
|
+
const result = await (0, daemonClient_1.invokeDaemon)('runpane:workspaces:set-enabled', [{ enabled }], localStatusSchema, { paneDir: parsed.paneDir });
|
|
237
|
+
if (parsed.json)
|
|
238
|
+
console.log(JSON.stringify({ ok: true, ...result }, null, 2));
|
|
239
|
+
else
|
|
240
|
+
console.log(`Workspaces: ${describeLocalStatus(result)}`);
|
|
241
|
+
return 0;
|
|
242
|
+
}
|
|
243
|
+
async function runWorkspaceRead(parsed) {
|
|
244
|
+
const target = requirePath(parsed, 'read');
|
|
245
|
+
const machine = await pickMachine(parsed, target, 'read', node_fs_1.default.existsSync(target));
|
|
246
|
+
const result = machine
|
|
247
|
+
? await (0, daemonClient_1.invokeRemoteDaemon)(workspaceTarget(machine), 'runpane:machine:read', [{ path: target }], readResultSchema)
|
|
248
|
+
: readLocalFile(target);
|
|
249
|
+
if (parsed.json) {
|
|
250
|
+
console.log(JSON.stringify({ ok: true, machine: machine?.name ?? null, ...result }, null, 2));
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
process.stdout.write(Buffer.from(result.content, result.encoding));
|
|
254
|
+
}
|
|
255
|
+
return 0;
|
|
256
|
+
}
|
|
257
|
+
async function runWorkspaceWrite(parsed) {
|
|
258
|
+
const target = requirePath(parsed, 'write');
|
|
259
|
+
const machine = await pickMachine(parsed, target, 'write', node_fs_1.default.existsSync(node_path_1.default.dirname(target)));
|
|
260
|
+
const content = node_fs_1.default.readFileSync(0);
|
|
261
|
+
const encoding = isUtf8(content) ? 'utf8' : 'base64';
|
|
262
|
+
const request = { path: target, content: content.toString(encoding), encoding };
|
|
263
|
+
const result = machine
|
|
264
|
+
? await (0, daemonClient_1.invokeRemoteDaemon)(workspaceTarget(machine), 'runpane:machine:write', [request], writeResultSchema)
|
|
265
|
+
: (node_fs_1.default.writeFileSync(target, content), { path: target, bytes: content.length });
|
|
266
|
+
if (parsed.json)
|
|
267
|
+
console.log(JSON.stringify({ ok: true, machine: machine?.name ?? null, ...result }, null, 2));
|
|
268
|
+
else
|
|
269
|
+
console.log(`Wrote ${result.bytes} bytes to ${machine?.name ?? 'this machine'}:${result.path}`);
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
async function runWorkspaceExec(parsed) {
|
|
273
|
+
const command = parsed.execCommand?.join(' ').trim();
|
|
274
|
+
if (!command)
|
|
275
|
+
throw new Error('runpane workspace exec needs a command: runpane workspace <machine> exec -- <command>');
|
|
276
|
+
let machine;
|
|
277
|
+
if (parsed.workspaceMachine) {
|
|
278
|
+
const tailnet = await requireTailnet();
|
|
279
|
+
machine = resolveMachine(parsed.workspaceMachine, [tailnet.self, ...tailnet.machines]);
|
|
280
|
+
}
|
|
281
|
+
else if (parsed.cwd && foreignPathSystems(parsed.cwd, process.platform).length > 0) {
|
|
282
|
+
machine = await routePath(parsed.cwd, `exec --cwd ${quoteArg(parsed.cwd)} --`);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
throw new Error('runpane workspace exec needs a machine: runpane workspace <machine> exec -- <command>. List machines with: runpane workspace list');
|
|
286
|
+
}
|
|
287
|
+
const result = await (0, daemonClient_1.invokeRemoteDaemon)(workspaceTarget(machine), 'runpane:machine:exec', [{ command, cwd: parsed.cwd, timeoutMs: parsed.timeoutMs }], execResultSchema, (parsed.timeoutMs ?? 120_000) + 30_000);
|
|
288
|
+
if (parsed.json) {
|
|
289
|
+
console.log(JSON.stringify({ ok: result.exitCode === 0, machine: machine.name, ...result }, null, 2));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
process.stdout.write(result.stdout);
|
|
293
|
+
process.stderr.write(result.stderr);
|
|
294
|
+
const ending = result.timedOut ? 'timed out' : result.signal ? `signal ${result.signal}` : `exit ${result.exitCode}`;
|
|
295
|
+
process.stderr.write(`[${machine.name}: ${result.os}, ${result.shell}, ${ending}]\n`);
|
|
296
|
+
}
|
|
297
|
+
return result.exitCode ?? 1;
|
|
298
|
+
}
|
|
299
|
+
function requirePath(parsed, verb) {
|
|
300
|
+
if (!parsed.workspacePath)
|
|
301
|
+
throw new Error(`runpane workspace ${verb} needs a path: runpane workspace [<machine>] ${verb} <path>`);
|
|
302
|
+
return parsed.workspacePath;
|
|
303
|
+
}
|
|
304
|
+
/** null means this machine. */
|
|
305
|
+
async function pickMachine(parsed, target, verb, existsHere) {
|
|
306
|
+
if (parsed.workspaceMachine) {
|
|
307
|
+
const tailnet = await requireTailnet();
|
|
308
|
+
return resolveMachine(parsed.workspaceMachine, [tailnet.self, ...tailnet.machines]);
|
|
309
|
+
}
|
|
310
|
+
// A path shaped like another OS's (C:\... on a Mac) never means this machine, even when
|
|
311
|
+
// a same-named relative file could exist here.
|
|
312
|
+
const foreign = foreignPathSystems(target, process.platform).length > 0;
|
|
313
|
+
if (existsHere && !foreign)
|
|
314
|
+
return null;
|
|
315
|
+
if (!foreign) {
|
|
316
|
+
throw new Error(`No such file on this machine: ${target}. To read another machine's file, name it: runpane workspace <machine> ${verb} ${quoteArg(target)}`);
|
|
317
|
+
}
|
|
318
|
+
return routePath(target, verb);
|
|
319
|
+
}
|
|
320
|
+
function readLocalFile(target) {
|
|
321
|
+
const buffer = node_fs_1.default.readFileSync(target);
|
|
322
|
+
return isUtf8(buffer)
|
|
323
|
+
? { path: target, encoding: 'utf8', content: buffer.toString('utf8'), bytes: buffer.length }
|
|
324
|
+
: { path: target, encoding: 'base64', content: buffer.toString('base64'), bytes: buffer.length };
|
|
325
|
+
}
|
|
326
|
+
/** The short workspaces block that help, doctor, and agent-context print. */
|
|
327
|
+
async function readWorkspaceSummary(paneDir) {
|
|
328
|
+
const [tailnet, local] = await Promise.all([readTailnet(), readLocalStatus(paneDir)]);
|
|
329
|
+
if (!tailnet.ok) {
|
|
330
|
+
return {
|
|
331
|
+
state: 'off', machine: null, reason: tailnet.reason, fix: tailnet.fix, otherMachines: [],
|
|
332
|
+
lines: [`Workspaces: off (${tailnet.reason}). Fix: ${tailnet.fix}`],
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
const otherMachines = tailnet.machines.map(({ name, os: machineOs, online }) => ({ name, os: machineOs, online }));
|
|
336
|
+
const state = local?.state ?? 'off';
|
|
337
|
+
const reason = local ? local.reason : 'Pane is not running';
|
|
338
|
+
const fix = local ? local.fix : 'Open Pane.';
|
|
339
|
+
const lines = [
|
|
340
|
+
state === 'on' ? `Workspaces: on (${tailnet.self.name})` : `Workspaces: off on ${tailnet.self.name} (${reason}). Fix: ${fix}`,
|
|
341
|
+
`Other machines: ${describeMachines(tailnet.machines) || 'none'}`,
|
|
342
|
+
];
|
|
343
|
+
if (otherMachines.length)
|
|
344
|
+
lines.push(REACH_LINE);
|
|
345
|
+
return { state, machine: tailnet.self.name, reason: state === 'on' ? undefined : reason, fix: state === 'on' ? undefined : fix, otherMachines, lines };
|
|
346
|
+
}
|
|
347
|
+
/** null when Pane does not answer here. */
|
|
348
|
+
async function readLocalStatus(paneDir) {
|
|
349
|
+
try {
|
|
350
|
+
return await (0, daemonClient_1.invokeDaemon)('runpane:workspaces:status', [], localStatusSchema, { paneDir, timeoutMs: LOCAL_STATUS_TIMEOUT_MS });
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
return error instanceof Error && error.message.includes('No Pane daemon command registered')
|
|
354
|
+
? { enabled: false, state: 'off', reason: 'this Pane is older than workspaces', fix: 'Update Pane, then restart it.', machineName: undefined, url: undefined }
|
|
355
|
+
: null;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function describeLocalStatus(status) {
|
|
359
|
+
if (status.state === 'on')
|
|
360
|
+
return `on (${status.machineName ?? 'this machine'})`;
|
|
361
|
+
return `off (${status.reason ?? 'unknown'})${status.fix ? `. Fix: ${status.fix}` : ''}`;
|
|
362
|
+
}
|
|
363
|
+
/** For a path or Session ID that is not on this machine: the likely machine and the exact command to use. */
|
|
364
|
+
async function workspaceHintFor(error, parsed) {
|
|
365
|
+
if (error.code === 'ENOENT' && error.path) {
|
|
366
|
+
const tailnet = await readTailnet();
|
|
367
|
+
if (!tailnet.ok)
|
|
368
|
+
return null;
|
|
369
|
+
const candidates = machinesForPath(error.path, tailnet.machines);
|
|
370
|
+
if (!candidates.length)
|
|
371
|
+
return null;
|
|
372
|
+
return `That path is not on this machine. It looks like it is on ${describeMachines(candidates)}. Read it with: runpane workspace ${candidates[0].name} read ${quoteArg(error.path)}`;
|
|
373
|
+
}
|
|
374
|
+
const sessionId = parsed.sessionId;
|
|
375
|
+
if (sessionId && /not found|no session|unknown session/i.test(error.message)) {
|
|
376
|
+
const tailnet = await readTailnet();
|
|
377
|
+
if (!tailnet.ok)
|
|
378
|
+
return null;
|
|
379
|
+
const found = await Promise.all(tailnet.machines.filter((machine) => machine.online).map(async (machine) => {
|
|
380
|
+
try {
|
|
381
|
+
await (0, daemonClient_1.invokeRemoteDaemon)(workspaceTarget(machine), 'runpane:sessions:get', [{ sessionId }], boundaryDecoder_1.boundary.json, PROBE_TIMEOUT_MS);
|
|
382
|
+
return machine;
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
}));
|
|
388
|
+
const machine = found.find((candidate) => candidate !== null);
|
|
389
|
+
if (machine) {
|
|
390
|
+
return `Session ${sessionId} is on ${machine.name}. Use: runpane workspace ${machine.name} ${parsed.command} --session ${quoteArg(sessionId)}`;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
// ---------------------------------------------------------------- helpers
|
|
396
|
+
function isUtf8(buffer) {
|
|
397
|
+
if (buffer.includes(0))
|
|
398
|
+
return false;
|
|
399
|
+
try {
|
|
400
|
+
new TextDecoder('utf-8', { fatal: true }).decode(buffer);
|
|
401
|
+
return true;
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
function quoteArg(value) {
|
|
408
|
+
return /^[\w./:@-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|