runpane 2.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # runpane
2
+
3
+ Thin npm installer and remote setup CLI for Pane.
4
+
5
+ The package does not include the Pane desktop runtime. It downloads the correct
6
+ Pane release artifact only when you run `runpane install` or `runpane update`.
7
+
8
+ ## Usage
9
+
10
+ One-shot install:
11
+
12
+ ```bash
13
+ npx --yes runpane@latest install client
14
+ npx --yes runpane@latest install daemon --label "My Server"
15
+ pnpm dlx runpane@latest install daemon --label "My Server"
16
+ ```
17
+
18
+ Persistent install:
19
+
20
+ ```bash
21
+ npm i -g runpane
22
+ runpane install daemon --label "My Server"
23
+
24
+ pnpm add -g runpane
25
+ runpane install daemon --label "My Server"
26
+ ```
27
+
28
+ Compatible runners:
29
+
30
+ ```bash
31
+ yarn dlx runpane@latest install daemon --label "My Server"
32
+ bunx runpane@latest install daemon --label "My Server"
33
+ ```
34
+
35
+ ## Commands
36
+
37
+ ```bash
38
+ runpane install
39
+ runpane install client
40
+ runpane install daemon
41
+ runpane update
42
+ runpane version
43
+ runpane doctor
44
+ runpane --help
45
+ ```
46
+
47
+ `runpane install daemon` installs Pane and then invokes the installed executable
48
+ with `--remote-setup`, preserving the `pane-remote://...` connection-code output.
49
+
50
+ ## Attribution
51
+
52
+ npm package downloads use `source=npm` when requesting release artifacts from
53
+ `runpane.com/api/download`. If that route is unavailable, the CLI falls back to
54
+ matching GitHub release assets and prints a warning.
55
+
56
+ ## Publishing
57
+
58
+ This package should be published through npm Trusted Publishing from GitHub
59
+ Actions. Token-based `NPM_TOKEN` publishing is a fallback for first package
60
+ reservation or manual publication only.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { type ParsedArgs } from './commands';
3
+ export declare function main(argv: string[]): Promise<number>;
4
+ export declare function installOrUpdate(parsed: ParsedArgs): Promise<number>;
5
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAgBzE,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB1D;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA0CzE"}
package/dist/cli.js ADDED
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.main = main;
5
+ exports.installOrUpdate = installOrUpdate;
6
+ const commands_1 = require("./commands");
7
+ const download_1 = require("./download");
8
+ const doctor_1 = require("./doctor");
9
+ const installers_1 = require("./installers");
10
+ const platform_1 = require("./platform");
11
+ const releases_1 = require("./releases");
12
+ const version_1 = require("./version");
13
+ const SOURCE = 'npm';
14
+ async function main(argv) {
15
+ const parsed = (0, commands_1.parseRunpaneArgs)(argv);
16
+ if (parsed.command === 'help') {
17
+ console.log((0, commands_1.helpText)(parsed.helpTopic));
18
+ return 0;
19
+ }
20
+ if (parsed.command === 'version') {
21
+ return (0, version_1.printVersion)(parsed.panePath);
22
+ }
23
+ if (parsed.command === 'doctor') {
24
+ return (0, doctor_1.runDoctor)(parsed, SOURCE);
25
+ }
26
+ if (parsed.command === 'install' || parsed.command === 'update') {
27
+ return installOrUpdate(parsed);
28
+ }
29
+ console.log((0, commands_1.helpText)());
30
+ return 0;
31
+ }
32
+ async function installOrUpdate(parsed) {
33
+ const target = parsed.command === 'update' ? 'client' : parsed.target;
34
+ if (!parsed.dryRun && (0, installers_1.shouldReuseExistingPane)(parsed, target)) {
35
+ const existing = (0, installers_1.resolveExistingPanePath)(parsed.panePath);
36
+ if (existing) {
37
+ return (0, installers_1.spawnPane)(existing, ['--remote-setup', ...parsed.remoteSetupArgs]);
38
+ }
39
+ }
40
+ const platform = (0, platform_1.detectPlatform)();
41
+ const resolved = await (0, releases_1.resolveRelease)({
42
+ version: parsed.paneVersion,
43
+ channel: parsed.channel,
44
+ source: SOURCE,
45
+ platform,
46
+ format: parsed.format,
47
+ target
48
+ });
49
+ if (parsed.dryRun) {
50
+ printDryRun(parsed, resolved.artifact.name, resolved.preferredDownloadUrl, resolved.fallbackDownloadUrl);
51
+ return 0;
52
+ }
53
+ const artifact = await (0, download_1.downloadArtifact)(resolved, parsed.downloadDir, parsed.verbose);
54
+ const installed = await (0, installers_1.installPaneArtifact)(artifact, {
55
+ parsed,
56
+ platform,
57
+ format: resolved.format,
58
+ target
59
+ });
60
+ if (target === 'daemon') {
61
+ return (0, installers_1.spawnPane)(installed.executablePath, ['--remote-setup', ...parsed.remoteSetupArgs]);
62
+ }
63
+ if (installed.installKind === 'installed') {
64
+ (0, installers_1.launchPaneClient)(installed.executablePath);
65
+ }
66
+ console.log(`Pane ${installed.installKind === 'existing' ? 'found' : 'installed'}: ${installed.executablePath}`);
67
+ return 0;
68
+ }
69
+ function printDryRun(parsed, artifactName, preferredDownloadUrl, fallbackDownloadUrl) {
70
+ const target = parsed.command === 'update' ? 'client' : parsed.target;
71
+ console.log('runpane dry run');
72
+ console.log(`Command: ${parsed.command}`);
73
+ console.log(`Target: ${target}`);
74
+ console.log(`Pane release: ${parsed.paneVersion}`);
75
+ console.log(`Channel: ${parsed.channel}`);
76
+ console.log(`Format: ${parsed.format}`);
77
+ console.log(`Artifact: ${artifactName}`);
78
+ console.log(`Preferred download: ${preferredDownloadUrl}`);
79
+ console.log(`GitHub fallback: ${fallbackDownloadUrl}`);
80
+ if (parsed.panePath) {
81
+ console.log(`Existing Pane path: ${parsed.panePath}`);
82
+ }
83
+ if (target === 'daemon') {
84
+ console.log(`Pane command: <pane executable> --remote-setup ${parsed.remoteSetupArgs.join(' ')}`.trim());
85
+ }
86
+ }
87
+ if (require.main === module) {
88
+ main(process.argv.slice(2)).then((code) => {
89
+ process.exitCode = code;
90
+ }).catch((error) => {
91
+ console.error(error instanceof Error ? error.message : String(error));
92
+ process.exitCode = 1;
93
+ });
94
+ }
95
+ //# 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,20 @@
1
+ export type RunpaneCommand = 'help' | 'install' | 'update' | 'version' | 'doctor';
2
+ export type InstallTarget = 'client' | 'daemon';
3
+ export type ArtifactFormat = 'auto' | 'appimage' | 'deb' | 'dmg' | 'zip' | 'exe';
4
+ export interface ParsedArgs {
5
+ command: RunpaneCommand;
6
+ helpTopic?: string;
7
+ target: InstallTarget;
8
+ paneVersion: string;
9
+ channel: 'stable' | 'nightly';
10
+ format: ArtifactFormat;
11
+ downloadDir?: string;
12
+ panePath?: string;
13
+ dryRun: boolean;
14
+ yes: boolean;
15
+ verbose: boolean;
16
+ remoteSetupArgs: string[];
17
+ }
18
+ export declare function parseRunpaneArgs(argv: string[]): ParsedArgs;
19
+ export declare function helpText(topic?: string): string;
20
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAClF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjF,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAqCD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA4C3D;AAuGD,wBAAgB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAiF/C"}
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRunpaneArgs = parseRunpaneArgs;
4
+ exports.helpText = helpText;
5
+ const COMMANDS = new Set(['help', 'install', 'update', 'version', 'doctor']);
6
+ const TARGETS = new Set(['client', 'daemon']);
7
+ const FORMATS = new Set(['auto', 'appimage', 'deb', 'dmg', 'zip', 'exe']);
8
+ const CHANNELS = new Set(['stable', 'nightly']);
9
+ const REMOTE_VALUE_FLAGS = new Set([
10
+ '--label',
11
+ '--prefer-tunnel',
12
+ '--channel',
13
+ '--base-url',
14
+ '--pane-dir',
15
+ '--listen-port',
16
+ '--port',
17
+ '--repo-ref'
18
+ ]);
19
+ const REMOTE_BOOLEAN_FLAGS = new Set([
20
+ '--auto-listen-port',
21
+ '--interactive-tailscale-setup',
22
+ '--no-install-service',
23
+ '--no-tailscale-serve',
24
+ '--print-only'
25
+ ]);
26
+ const DEFAULTS = {
27
+ target: 'client',
28
+ paneVersion: 'latest',
29
+ channel: 'stable',
30
+ format: 'auto',
31
+ dryRun: false,
32
+ yes: false,
33
+ verbose: false,
34
+ remoteSetupArgs: []
35
+ };
36
+ function parseRunpaneArgs(argv) {
37
+ const args = [...argv];
38
+ const first = args.shift();
39
+ if (!first || first === '-h' || first === '--help') {
40
+ return { command: 'help', ...DEFAULTS };
41
+ }
42
+ if (first === '-v' || first === '--version') {
43
+ return { command: 'version', ...DEFAULTS };
44
+ }
45
+ if (!COMMANDS.has(first)) {
46
+ throw new Error(`Unknown command: ${first}\n\n${helpText()}`);
47
+ }
48
+ if (first === 'help') {
49
+ return {
50
+ command: 'help',
51
+ helpTopic: args[0],
52
+ ...DEFAULTS
53
+ };
54
+ }
55
+ const parsed = {
56
+ command: first,
57
+ ...DEFAULTS,
58
+ remoteSetupArgs: []
59
+ };
60
+ if (parsed.command === 'install' && args[0] && !args[0].startsWith('-')) {
61
+ const target = args.shift();
62
+ if (!target || !TARGETS.has(target)) {
63
+ throw new Error(`Unknown install target: ${target ?? ''}. Expected "client" or "daemon".`);
64
+ }
65
+ parsed.target = target;
66
+ }
67
+ if (parsed.command === 'update') {
68
+ parsed.target = 'client';
69
+ }
70
+ parseFlags(args, parsed);
71
+ return parsed;
72
+ }
73
+ function parseFlags(args, parsed) {
74
+ for (let index = 0; index < args.length; index++) {
75
+ const arg = args[index];
76
+ if (arg === '-h' || arg === '--help') {
77
+ const topic = parsed.command;
78
+ parsed.command = 'help';
79
+ parsed.helpTopic = topic;
80
+ continue;
81
+ }
82
+ if (arg === '--dry-run') {
83
+ parsed.dryRun = true;
84
+ continue;
85
+ }
86
+ if (arg === '--yes' || arg === '-y') {
87
+ parsed.yes = true;
88
+ continue;
89
+ }
90
+ if (arg === '--verbose') {
91
+ parsed.verbose = true;
92
+ continue;
93
+ }
94
+ if (arg === '--version') {
95
+ parsed.paneVersion = readValue(args, ++index, arg);
96
+ continue;
97
+ }
98
+ if (arg === '--download-dir') {
99
+ parsed.downloadDir = readValue(args, ++index, arg);
100
+ continue;
101
+ }
102
+ if (arg === '--pane-path') {
103
+ parsed.panePath = readValue(args, ++index, arg);
104
+ continue;
105
+ }
106
+ if (arg === '--format') {
107
+ const value = readValue(args, ++index, arg);
108
+ if (!FORMATS.has(value)) {
109
+ throw new Error(`Invalid --format "${value}". Expected one of: ${[...FORMATS].join(', ')}`);
110
+ }
111
+ parsed.format = value;
112
+ continue;
113
+ }
114
+ if (REMOTE_VALUE_FLAGS.has(arg)) {
115
+ const value = readValue(args, ++index, arg);
116
+ if (arg === '--channel') {
117
+ if (!CHANNELS.has(value)) {
118
+ throw new Error(`Invalid --channel "${value}". Expected stable or nightly.`);
119
+ }
120
+ parsed.channel = value;
121
+ }
122
+ appendRemoteArg(parsed, arg, value);
123
+ continue;
124
+ }
125
+ if (REMOTE_BOOLEAN_FLAGS.has(arg)) {
126
+ appendRemoteArg(parsed, arg);
127
+ continue;
128
+ }
129
+ if (parsed.command === 'install' && parsed.target === 'daemon') {
130
+ index = appendUnknownRemoteArg(args, index, parsed, arg);
131
+ continue;
132
+ }
133
+ throw new Error(`Unknown option for ${parsed.command}: ${arg}`);
134
+ }
135
+ }
136
+ function appendRemoteArg(parsed, flag, value) {
137
+ if (parsed.command === 'install' && parsed.target === 'daemon') {
138
+ parsed.remoteSetupArgs.push(flag);
139
+ if (value !== undefined) {
140
+ parsed.remoteSetupArgs.push(value);
141
+ }
142
+ return;
143
+ }
144
+ if (REMOTE_VALUE_FLAGS.has(flag) || REMOTE_BOOLEAN_FLAGS.has(flag)) {
145
+ throw new Error(`${flag} is only valid with "runpane install daemon".`);
146
+ }
147
+ }
148
+ function appendUnknownRemoteArg(args, index, parsed, arg) {
149
+ parsed.remoteSetupArgs.push(arg);
150
+ const next = args[index + 1];
151
+ if (arg.startsWith('-') && next && !next.startsWith('-')) {
152
+ parsed.remoteSetupArgs.push(next);
153
+ return index + 1;
154
+ }
155
+ return index;
156
+ }
157
+ function readValue(args, index, flag) {
158
+ const value = args[index];
159
+ if (!value || value.startsWith('-')) {
160
+ throw new Error(`${flag} requires a value.`);
161
+ }
162
+ return value;
163
+ }
164
+ function helpText(topic) {
165
+ if (topic === 'install') {
166
+ return [
167
+ 'Usage:',
168
+ ' runpane install [client|daemon] [options]',
169
+ '',
170
+ 'Examples:',
171
+ ' npx --yes runpane@latest install client',
172
+ ' npx --yes runpane@latest install daemon --label "My Server"',
173
+ ' pnpm dlx runpane@latest install daemon --prefer-tunnel ssh --label "VM"',
174
+ '',
175
+ 'Wrapper options:',
176
+ ' --version <latest|vX.Y.Z> Pane release to install',
177
+ ' --format <auto|appimage|deb|dmg|zip|exe>',
178
+ ' --download-dir <path>',
179
+ ' --pane-path <path> Use an existing Pane executable',
180
+ ' --dry-run Print the plan without downloading',
181
+ ' --yes Skip interactive prompts where possible',
182
+ ' --verbose',
183
+ '',
184
+ 'Daemon passthrough options:',
185
+ ' --label <name>',
186
+ ' --prefer-tunnel <tailscale|ssh|manual|auto>',
187
+ ' --channel <stable|nightly>',
188
+ ' --base-url <url>',
189
+ ' --pane-dir <path>',
190
+ ' --listen-port <port> / --port <port>',
191
+ ' --auto-listen-port',
192
+ ' --interactive-tailscale-setup',
193
+ ' --no-install-service',
194
+ ' --no-tailscale-serve',
195
+ ' --print-only',
196
+ ' --repo-ref <ref>'
197
+ ].join('\n');
198
+ }
199
+ if (topic === 'update') {
200
+ return [
201
+ 'Usage:',
202
+ ' runpane update [options]',
203
+ '',
204
+ 'Updates Pane using the same artifact selection as "runpane install client".',
205
+ '',
206
+ 'Options:',
207
+ ' --version <latest|vX.Y.Z>',
208
+ ' --format <auto|appimage|deb|dmg|zip|exe>',
209
+ ' --download-dir <path>',
210
+ ' --pane-path <path>',
211
+ ' --dry-run',
212
+ ' --yes',
213
+ ' --verbose'
214
+ ].join('\n');
215
+ }
216
+ if (topic === 'version') {
217
+ return 'Usage:\n runpane version\n runpane --version';
218
+ }
219
+ if (topic === 'doctor') {
220
+ return 'Usage:\n runpane doctor [--pane-path <path>] [--format <format>] [--verbose]';
221
+ }
222
+ return [
223
+ 'Usage:',
224
+ ' runpane install [client|daemon] [options]',
225
+ ' runpane update [options]',
226
+ ' runpane version',
227
+ ' runpane doctor',
228
+ ' runpane help [command]',
229
+ '',
230
+ 'Package manager examples:',
231
+ ' npx --yes runpane@latest install daemon --label "My Server"',
232
+ ' pnpm dlx runpane@latest install daemon --label "My Server"',
233
+ ' npm i -g runpane && runpane install daemon --label "My Server"',
234
+ '',
235
+ 'Python package equivalents:',
236
+ ' pipx run runpane install daemon --label "My Server"',
237
+ ' uvx runpane@latest install daemon --label "My Server"',
238
+ '',
239
+ 'Run "runpane help install" for install options.'
240
+ ].join('\n');
241
+ }
242
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedArgs } from './commands';
2
+ export declare function runDoctor(parsed: ParsedArgs, source?: 'npm' | 'pip'): Promise<number>;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAE,KAAK,GAAG,KAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkClG"}
package/dist/doctor.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runDoctor = runDoctor;
4
+ const installers_1 = require("./installers");
5
+ const platform_1 = require("./platform");
6
+ const releases_1 = require("./releases");
7
+ const version_1 = require("./version");
8
+ async function runDoctor(parsed, source = 'npm') {
9
+ let ok = true;
10
+ try {
11
+ const platform = (0, platform_1.detectPlatform)();
12
+ console.log(`Platform: ${platform.os}/${platform.arch}`);
13
+ const release = await (0, releases_1.resolveRelease)({
14
+ version: parsed.paneVersion,
15
+ channel: parsed.channel,
16
+ source,
17
+ platform,
18
+ format: parsed.format,
19
+ target: 'client'
20
+ });
21
+ console.log(`Latest release: ${release.release.tag_name}`);
22
+ console.log(`Selected artifact: ${release.artifact.name}`);
23
+ console.log(`Website URL: ${release.preferredDownloadUrl}`);
24
+ console.log(`GitHub fallback: ${release.fallbackDownloadUrl}`);
25
+ }
26
+ catch (error) {
27
+ ok = false;
28
+ console.error(`Release check: failed - ${error instanceof Error ? error.message : String(error)}`);
29
+ }
30
+ const installedPath = (0, installers_1.resolveExistingPanePath)(parsed.panePath);
31
+ if (installedPath) {
32
+ console.log(`Installed Pane: ${installedPath}`);
33
+ console.log(`Installed version: ${(0, version_1.getPaneVersion)(installedPath) ?? 'unknown'}`);
34
+ }
35
+ else {
36
+ console.log('Installed Pane: not found');
37
+ }
38
+ console.log('Remote setup: run "runpane install daemon --label <name>" to configure a headless host.');
39
+ return ok ? 0 : 1;
40
+ }
41
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":";;AAMA,8BAkCC;AAvCD,6CAAuD;AACvD,yCAA4C;AAC5C,yCAA4C;AAC5C,uCAA2C;AAEpC,KAAK,UAAU,SAAS,CAAC,MAAkB,EAAE,SAAwB,KAAK;IAC/E,IAAI,EAAE,GAAG,IAAI,CAAC;IAEd,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAA,yBAAc,GAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAc,EAAC;YACnC,OAAO,EAAE,MAAM,CAAC,WAAW;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM;YACN,QAAQ;YACR,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,GAAG,KAAK,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,aAAa,GAAG,IAAA,oCAAuB,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAA,wBAAc,EAAC,aAAa,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yFAAyF,CAAC,CAAC;IACvG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type ResolvedRelease } from './releases';
2
+ export interface DownloadedArtifact {
3
+ path: string;
4
+ fileName: string;
5
+ usedFallback: boolean;
6
+ }
7
+ export declare function downloadArtifact(resolved: ResolvedRelease, downloadDir?: string, verbose?: boolean): Promise<DownloadedArtifact>;
8
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,eAAe,EACzB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,UAAQ,GACd,OAAO,CAAC,kBAAkB,CAAC,CAkB7B"}
@@ -0,0 +1,84 @@
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.downloadArtifact = downloadArtifact;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const stream_1 = require("stream");
12
+ const promises_1 = require("stream/promises");
13
+ const releases_1 = require("./releases");
14
+ async function downloadArtifact(resolved, downloadDir, verbose = false) {
15
+ const targetDir = downloadDir ?? path_1.default.join(os_1.default.tmpdir(), `runpane-${Date.now()}`);
16
+ fs_1.default.mkdirSync(targetDir, { recursive: true });
17
+ const fileName = (0, releases_1.artifactFileName)(resolved.artifact.name);
18
+ const targetPath = path_1.default.join(targetDir, fileName);
19
+ let usedFallback = false;
20
+ try {
21
+ await downloadToFile(resolved.preferredDownloadUrl, targetPath, verbose);
22
+ }
23
+ catch (error) {
24
+ usedFallback = true;
25
+ console.warn(`runpane: website download route failed; falling back to GitHub release asset. ${formatError(error)}`);
26
+ await downloadToFile(resolved.fallbackDownloadUrl, targetPath, verbose);
27
+ }
28
+ await verifyChecksumIfAvailable(resolved, targetPath, fileName);
29
+ return { path: targetPath, fileName, usedFallback };
30
+ }
31
+ async function downloadToFile(url, targetPath, verbose) {
32
+ if (verbose) {
33
+ console.log(`Downloading ${url}`);
34
+ }
35
+ const response = await fetch(url, {
36
+ redirect: 'follow',
37
+ headers: { 'user-agent': 'runpane-installer' }
38
+ });
39
+ if (!response.ok || !response.body) {
40
+ throw new Error(`${response.status} ${response.statusText}`);
41
+ }
42
+ await (0, promises_1.pipeline)(stream_1.Readable.fromWeb(response.body), fs_1.default.createWriteStream(targetPath));
43
+ }
44
+ async function verifyChecksumIfAvailable(resolved, artifactPath, fileName) {
45
+ try {
46
+ const response = await fetch(resolved.checksumUrl, {
47
+ headers: { 'user-agent': 'runpane-installer' }
48
+ });
49
+ if (!response.ok) {
50
+ return;
51
+ }
52
+ const checksums = await response.text();
53
+ const expected = parseChecksum(checksums, fileName);
54
+ if (!expected) {
55
+ return;
56
+ }
57
+ const hash = crypto_1.default.createHash('sha256').update(fs_1.default.readFileSync(artifactPath)).digest('hex');
58
+ if (hash.toLowerCase() !== expected.toLowerCase()) {
59
+ throw new Error(`Checksum mismatch for ${fileName}. Expected ${expected}, got ${hash}.`);
60
+ }
61
+ }
62
+ catch (error) {
63
+ if (error instanceof Error && error.message.startsWith('Checksum mismatch')) {
64
+ throw error;
65
+ }
66
+ console.warn(`runpane: could not verify checksum for ${fileName}. ${formatError(error)}`);
67
+ }
68
+ }
69
+ function parseChecksum(checksums, fileName) {
70
+ for (const line of checksums.split(/\r?\n/)) {
71
+ const trimmed = line.trim();
72
+ if (!trimmed.endsWith(fileName))
73
+ continue;
74
+ const [hash] = trimmed.split(/\s+/);
75
+ if (/^[a-f0-9]{64}$/i.test(hash)) {
76
+ return hash;
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+ function formatError(error) {
82
+ return error instanceof Error ? error.message : String(error);
83
+ }
84
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":";;;;;AAeA,4CAsBC;AArCD,oDAA4B;AAC5B,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AACxB,mCAAkC;AAClC,8CAA2C;AAE3C,yCAAoE;AAQ7D,KAAK,UAAU,gBAAgB,CACpC,QAAyB,EACzB,WAAoB,EACpB,OAAO,GAAG,KAAK;IAEf,MAAM,SAAS,GAAG,WAAW,IAAI,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjF,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAA,2BAAgB,EAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAElD,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,QAAQ,CAAC,oBAAoB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,GAAG,IAAI,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,iFAAiF,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpH,MAAM,cAAc,CAAC,QAAQ,CAAC,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,yBAAyB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,UAAkB,EAAE,OAAgB;IAC7E,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,IAAA,mBAAQ,EACZ,iBAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAiD,CAAC,EAC5E,YAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,QAAyB,EAAE,YAAoB,EAAE,QAAgB;IACxG,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE;YACjD,OAAO,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,cAAc,QAAQ,SAAS,IAAI,GAAG,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC5E,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,0CAA0C,QAAQ,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,QAAgB;IACxD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ArtifactFormat, InstallTarget, ParsedArgs } from './commands';
2
+ import type { DownloadedArtifact } from './download';
3
+ import { type PanePlatform } from './platform';
4
+ export interface InstalledPane {
5
+ executablePath: string;
6
+ installKind: 'existing' | 'installed' | 'launched-installer';
7
+ }
8
+ export declare function resolveExistingPanePath(panePath?: string): string | undefined;
9
+ export declare function shouldReuseExistingPane(parsed: Pick<ParsedArgs, 'command'>, target: InstallTarget): boolean;
10
+ export declare function installPaneArtifact(artifact: DownloadedArtifact, options: {
11
+ parsed: ParsedArgs;
12
+ platform: PanePlatform;
13
+ format: Exclude<ArtifactFormat, 'auto'>;
14
+ target: InstallTarget;
15
+ }): Promise<InstalledPane>;
16
+ export declare function spawnPane(executablePath: string, args: string[]): Promise<number>;
17
+ export declare function launchPaneClient(executablePath: string): void;
18
+ //# sourceMappingURL=installers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installers.d.ts","sourceRoot":"","sources":["../src/installers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,UAAU,GAAG,WAAW,GAAG,oBAAoB,CAAC;CAC9D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB7E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAE3G;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE;IACP,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,EAAE,aAAa,CAAC;CACvB,GACA,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED,wBAAgB,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAYjF;AAED,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAM7D"}
@@ -0,0 +1,122 @@
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.resolveExistingPanePath = resolveExistingPanePath;
7
+ exports.shouldReuseExistingPane = shouldReuseExistingPane;
8
+ exports.installPaneArtifact = installPaneArtifact;
9
+ exports.spawnPane = spawnPane;
10
+ exports.launchPaneClient = launchPaneClient;
11
+ const child_process_1 = __importDefault(require("child_process"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const os_1 = __importDefault(require("os"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const platform_1 = require("./platform");
16
+ function resolveExistingPanePath(panePath) {
17
+ if (panePath) {
18
+ return fs_1.default.existsSync(panePath) ? panePath : undefined;
19
+ }
20
+ const candidates = [
21
+ process.platform === 'darwin' ? '/Applications/Pane.app/Contents/MacOS/Pane' : undefined,
22
+ process.platform === 'darwin' ? path_1.default.join(os_1.default.homedir(), 'Applications', 'Pane.app', 'Contents', 'MacOS', 'Pane') : undefined,
23
+ process.platform === 'linux' ? path_1.default.join(os_1.default.homedir(), '.local', 'bin', 'pane') : undefined,
24
+ process.platform === 'linux' ? '/usr/bin/pane' : undefined,
25
+ process.platform === 'linux' ? '/opt/Pane/pane' : undefined,
26
+ process.platform === 'win32' && process.env.LOCALAPPDATA ? path_1.default.join(process.env.LOCALAPPDATA, 'Programs', 'Pane', 'Pane.exe') : undefined,
27
+ process.platform === 'win32' && process.env.LOCALAPPDATA ? path_1.default.join(process.env.LOCALAPPDATA, 'Pane', 'Pane.exe') : undefined,
28
+ process.platform === 'win32' && process.env.ProgramFiles ? path_1.default.join(process.env.ProgramFiles, 'Pane', 'Pane.exe') : undefined
29
+ ].filter((candidate) => Boolean(candidate));
30
+ return candidates.find((candidate) => fs_1.default.existsSync(candidate));
31
+ }
32
+ function shouldReuseExistingPane(parsed, target) {
33
+ return parsed.command === 'install' && target === 'daemon';
34
+ }
35
+ async function installPaneArtifact(artifact, options) {
36
+ const existing = resolveExistingPanePath(options.parsed.panePath);
37
+ if (existing && shouldReuseExistingPane(options.parsed, options.target)) {
38
+ return { executablePath: existing, installKind: 'existing' };
39
+ }
40
+ if (options.platform.os === 'darwin') {
41
+ return installMac(artifact, options);
42
+ }
43
+ if (options.platform.os === 'linux') {
44
+ return installLinux(artifact, options);
45
+ }
46
+ return installWindows(artifact, options);
47
+ }
48
+ function spawnPane(executablePath, args) {
49
+ return new Promise((resolve) => {
50
+ const child = child_process_1.default.spawn(executablePath, args, {
51
+ stdio: 'inherit',
52
+ shell: false
53
+ });
54
+ child.on('close', (code) => resolve(code ?? 1));
55
+ child.on('error', (error) => {
56
+ console.error(`Failed to launch Pane: ${error.message}`);
57
+ resolve(1);
58
+ });
59
+ });
60
+ }
61
+ function launchPaneClient(executablePath) {
62
+ const child = child_process_1.default.spawn(executablePath, [], {
63
+ detached: true,
64
+ stdio: 'ignore'
65
+ });
66
+ child.unref();
67
+ }
68
+ function installMac(artifact, { format, target }) {
69
+ if (format === 'dmg') {
70
+ child_process_1.default.spawnSync('open', [artifact.path], { stdio: 'inherit' });
71
+ return { executablePath: '/Applications/Pane.app/Contents/MacOS/Pane', installKind: 'launched-installer' };
72
+ }
73
+ const appsRoot = path_1.default.join(os_1.default.homedir(), 'Applications');
74
+ const appPath = path_1.default.join(appsRoot, 'Pane.app');
75
+ fs_1.default.mkdirSync(appsRoot, { recursive: true });
76
+ child_process_1.default.execFileSync('ditto', ['-x', '-k', artifact.path, appsRoot], { stdio: 'inherit' });
77
+ const executablePath = path_1.default.join(appPath, 'Contents', 'MacOS', 'Pane');
78
+ if (!fs_1.default.existsSync(executablePath)) {
79
+ throw new Error(`Pane executable was not found after extracting ${artifact.fileName}. Expected ${executablePath}`);
80
+ }
81
+ if (target === 'client') {
82
+ child_process_1.default.spawnSync('open', [appPath], { stdio: 'inherit' });
83
+ }
84
+ return { executablePath, installKind: 'installed' };
85
+ }
86
+ function installLinux(artifact, { format }) {
87
+ if (format === 'deb') {
88
+ const installer = commandExists('apt') ? 'apt' : 'dpkg';
89
+ const args = installer === 'apt' ? ['install', '-y', artifact.path] : ['-i', artifact.path];
90
+ child_process_1.default.spawnSync('sudo', [installer, ...args], { stdio: 'inherit' });
91
+ const executablePath = resolveExistingPanePath();
92
+ if (!executablePath) {
93
+ throw new Error('Pane installed from .deb, but the pane executable could not be found.');
94
+ }
95
+ return { executablePath, installKind: 'installed' };
96
+ }
97
+ const binRoot = (0, platform_1.defaultInstallRoot)();
98
+ const executablePath = path_1.default.join(binRoot, 'pane');
99
+ fs_1.default.mkdirSync(binRoot, { recursive: true });
100
+ fs_1.default.copyFileSync(artifact.path, executablePath);
101
+ fs_1.default.chmodSync(executablePath, 0o755);
102
+ return { executablePath, installKind: 'installed' };
103
+ }
104
+ function installWindows(artifact, { target }) {
105
+ const args = target === 'daemon' ? ['/S'] : [];
106
+ const result = child_process_1.default.spawnSync(artifact.path, args, { stdio: 'inherit' });
107
+ if (result.error) {
108
+ throw result.error;
109
+ }
110
+ const executablePath = resolveExistingPanePath();
111
+ if (!executablePath) {
112
+ throw new Error('Pane installer completed, but Pane.exe could not be found. Open the installer manually and rerun with --pane-path.');
113
+ }
114
+ return { executablePath, installKind: target === 'daemon' ? 'installed' : 'launched-installer' };
115
+ }
116
+ function commandExists(command) {
117
+ const check = process.platform === 'win32' ? 'where' : 'command';
118
+ const args = process.platform === 'win32' ? [command] : ['-v', command];
119
+ const result = child_process_1.default.spawnSync(check, args, { stdio: 'ignore', shell: process.platform !== 'win32' });
120
+ return result.status === 0;
121
+ }
122
+ //# sourceMappingURL=installers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installers.js","sourceRoot":"","sources":["../src/installers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ArtifactFormat } from './commands';
2
+ export interface PanePlatform {
3
+ os: 'darwin' | 'linux' | 'win32';
4
+ arch: 'x64' | 'arm64';
5
+ }
6
+ export declare function detectPlatform(): PanePlatform;
7
+ export declare function defaultFormat(platform: PanePlatform, target: 'client' | 'daemon'): Exclude<ArtifactFormat, 'auto'>;
8
+ export declare function platformParam(platform: PanePlatform): 'mac' | 'linux' | 'windows';
9
+ export declare function archAliases(platform: PanePlatform): string[];
10
+ export declare function defaultInstallRoot(): string;
11
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACjC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;CACvB;AAED,wBAAgB,cAAc,IAAI,YAAY,CAY7C;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAQlH;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAIjF;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAQ5D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C"}
@@ -0,0 +1,59 @@
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.detectPlatform = detectPlatform;
7
+ exports.defaultFormat = defaultFormat;
8
+ exports.platformParam = platformParam;
9
+ exports.archAliases = archAliases;
10
+ exports.defaultInstallRoot = defaultInstallRoot;
11
+ const os_1 = __importDefault(require("os"));
12
+ function detectPlatform() {
13
+ const platform = process.platform;
14
+ const arch = process.arch;
15
+ if (platform !== 'darwin' && platform !== 'linux' && platform !== 'win32') {
16
+ throw new Error(`Unsupported OS: ${platform}`);
17
+ }
18
+ if (arch !== 'x64' && arch !== 'arm64') {
19
+ throw new Error(`Unsupported CPU architecture: ${arch}`);
20
+ }
21
+ return { os: platform, arch };
22
+ }
23
+ function defaultFormat(platform, target) {
24
+ if (platform.os === 'darwin') {
25
+ return target === 'daemon' ? 'zip' : 'dmg';
26
+ }
27
+ if (platform.os === 'win32') {
28
+ return 'exe';
29
+ }
30
+ return 'appimage';
31
+ }
32
+ function platformParam(platform) {
33
+ if (platform.os === 'darwin')
34
+ return 'mac';
35
+ if (platform.os === 'win32')
36
+ return 'windows';
37
+ return 'linux';
38
+ }
39
+ function archAliases(platform) {
40
+ if (platform.arch === 'arm64') {
41
+ return ['arm64', 'aarch64'];
42
+ }
43
+ if (platform.os === 'linux') {
44
+ return ['x64', 'x86_64', 'amd64'];
45
+ }
46
+ return ['x64', 'x86_64'];
47
+ }
48
+ function defaultInstallRoot() {
49
+ if (process.platform === 'win32') {
50
+ return process.env.LOCALAPPDATA
51
+ ? `${process.env.LOCALAPPDATA}\\Pane`
52
+ : `${os_1.default.homedir()}\\AppData\\Local\\Pane`;
53
+ }
54
+ if (process.platform === 'darwin') {
55
+ return `${os_1.default.homedir()}/Applications`;
56
+ }
57
+ return `${os_1.default.homedir()}/.local/bin`;
58
+ }
59
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":";;;;;AAQA,wCAYC;AAED,sCAQC;AAED,sCAIC;AAED,kCAQC;AAED,gDAYC;AA5DD,4CAAoB;AAQpB,SAAgB,cAAc;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,SAAgB,aAAa,CAAC,QAAsB,EAAE,MAA2B;IAC/E,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC;IACD,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAgB,aAAa,CAAC,QAAsB;IAClD,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,WAAW,CAAC,QAAsB;IAChD,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,QAAQ,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,kBAAkB;IAChC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY;YAC7B,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ;YACrC,CAAC,CAAC,GAAG,YAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,GAAG,YAAE,CAAC,OAAO,EAAE,eAAe,CAAC;IACxC,CAAC;IAED,OAAO,GAAG,YAAE,CAAC,OAAO,EAAE,aAAa,CAAC;AACtC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { ArtifactFormat } from './commands';
2
+ import { type PanePlatform } from './platform';
3
+ export interface GitHubReleaseAsset {
4
+ name: string;
5
+ browser_download_url: string;
6
+ }
7
+ export interface GitHubRelease {
8
+ tag_name: string;
9
+ name: string;
10
+ body: string;
11
+ html_url: string;
12
+ published_at: string;
13
+ prerelease: boolean;
14
+ draft: boolean;
15
+ assets?: GitHubReleaseAsset[];
16
+ }
17
+ export interface ResolvedRelease {
18
+ release: GitHubRelease;
19
+ artifact: GitHubReleaseAsset;
20
+ format: Exclude<ArtifactFormat, 'auto'>;
21
+ preferredDownloadUrl: string;
22
+ fallbackDownloadUrl: string;
23
+ checksumUrl: string;
24
+ }
25
+ export interface ResolveReleaseOptions {
26
+ version: string;
27
+ channel: 'stable' | 'nightly';
28
+ source: 'npm' | 'pip';
29
+ platform: PanePlatform;
30
+ format: ArtifactFormat;
31
+ target: 'client' | 'daemon';
32
+ }
33
+ export declare function resolveRelease(options: ResolveReleaseOptions): Promise<ResolvedRelease>;
34
+ export declare function fetchRelease(version: string): Promise<GitHubRelease>;
35
+ export declare function findArtifact(release: GitHubRelease, platform: PanePlatform, format: Exclude<ArtifactFormat, 'auto'>): GitHubReleaseAsset;
36
+ export declare function artifactFileName(urlOrName: string): string;
37
+ //# sourceMappingURL=releases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"releases.d.ts","sourceRoot":"","sources":["../src/releases.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAA6C,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK1F,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACxC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAc7F;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAkB1E;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,GACtC,kBAAkB,CAcpB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,89 @@
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.resolveRelease = resolveRelease;
7
+ exports.fetchRelease = fetchRelease;
8
+ exports.findArtifact = findArtifact;
9
+ exports.artifactFileName = artifactFileName;
10
+ const path_1 = __importDefault(require("path"));
11
+ const platform_1 = require("./platform");
12
+ const GITHUB_API_BASE = 'https://api.github.com/repos/dcouple/Pane/releases';
13
+ const DOWNLOAD_API_BASE = 'https://runpane.com/api/download';
14
+ async function resolveRelease(options) {
15
+ const release = await fetchRelease(options.version);
16
+ const format = options.format === 'auto' ? (0, platform_1.defaultFormat)(options.platform, options.target) : options.format;
17
+ const artifact = findArtifact(release, options.platform, format);
18
+ const preferredDownloadUrl = buildPreferredDownloadUrl(options, format, release);
19
+ return {
20
+ release,
21
+ artifact,
22
+ format,
23
+ preferredDownloadUrl,
24
+ fallbackDownloadUrl: artifact.browser_download_url,
25
+ checksumUrl: `https://github.com/dcouple/Pane/releases/download/${release.tag_name}/SHA256SUMS.txt`
26
+ };
27
+ }
28
+ async function fetchRelease(version) {
29
+ const normalized = version === 'latest' ? 'latest' : version.startsWith('v') ? `tags/${version}` : `tags/v${version}`;
30
+ const response = await fetch(`${GITHUB_API_BASE}/${normalized}`, {
31
+ headers: {
32
+ accept: 'application/vnd.github+json',
33
+ 'user-agent': 'runpane-installer'
34
+ }
35
+ });
36
+ if (!response.ok) {
37
+ throw new Error(`Failed to fetch Pane release ${version}: ${response.status} ${response.statusText}`);
38
+ }
39
+ const release = await response.json();
40
+ if (release.draft || release.prerelease) {
41
+ throw new Error(`Release ${release.tag_name} is not a stable public release.`);
42
+ }
43
+ return release;
44
+ }
45
+ function findArtifact(release, platform, format) {
46
+ const assets = release.assets ?? [];
47
+ const aliases = (0, platform_1.archAliases)(platform);
48
+ const candidates = assets.filter((asset) => matchesFormat(asset.name, format) && matchesPlatform(asset.name, platform));
49
+ const exact = candidates.find((asset) => aliases.some((alias) => lowerName(asset).includes(alias.toLowerCase())));
50
+ const universal = candidates.find((asset) => lowerName(asset).includes('universal'));
51
+ const selected = exact ?? universal ?? candidates[0];
52
+ if (!selected) {
53
+ const assetNames = assets.map((asset) => asset.name).join(', ') || 'no assets';
54
+ throw new Error(`No Pane ${format} asset found for ${platform.os}/${platform.arch} in ${release.tag_name}. Assets: ${assetNames}`);
55
+ }
56
+ return selected;
57
+ }
58
+ function artifactFileName(urlOrName) {
59
+ return path_1.default.basename(urlOrName.split('?')[0]);
60
+ }
61
+ function buildPreferredDownloadUrl(options, format, release) {
62
+ const params = new URLSearchParams({
63
+ platform: (0, platform_1.platformParam)(options.platform),
64
+ arch: options.platform.arch,
65
+ format,
66
+ version: release.tag_name,
67
+ channel: options.channel,
68
+ source: options.source
69
+ });
70
+ return `${DOWNLOAD_API_BASE}?${params.toString()}`;
71
+ }
72
+ function matchesFormat(name, format) {
73
+ const lower = name.toLowerCase();
74
+ if (format === 'appimage')
75
+ return lower.endsWith('.appimage');
76
+ return lower.endsWith(`.${format}`);
77
+ }
78
+ function matchesPlatform(name, platform) {
79
+ const lower = name.toLowerCase();
80
+ if (platform.os === 'darwin')
81
+ return lower.includes('macos') || lower.includes('darwin') || lower.includes('mac');
82
+ if (platform.os === 'win32')
83
+ return lower.includes('windows') || /(?:^|[._-])win(?:32|64)?(?:[._-]|$)/.test(lower);
84
+ return lower.includes('linux');
85
+ }
86
+ function lowerName(asset) {
87
+ return asset.name.toLowerCase();
88
+ }
89
+ //# sourceMappingURL=releases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"releases.js","sourceRoot":"","sources":["../src/releases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function getWrapperVersion(): string;
2
+ export declare function printVersion(panePath?: string): Promise<number>;
3
+ export declare function getPaneVersion(executablePath: string): string | undefined;
4
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAMA,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAED,wBAAsB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBrE;AAED,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWzE"}
@@ -0,0 +1,59 @@
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.getWrapperVersion = getWrapperVersion;
7
+ exports.printVersion = printVersion;
8
+ exports.getPaneVersion = getPaneVersion;
9
+ const child_process_1 = __importDefault(require("child_process"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const releases_1 = require("./releases");
13
+ const installers_1 = require("./installers");
14
+ function getWrapperVersion() {
15
+ const packagePath = path_1.default.resolve(__dirname, '..', 'package.json');
16
+ try {
17
+ const pkg = JSON.parse(fs_1.default.readFileSync(packagePath, 'utf8'));
18
+ return pkg.version ?? 'unknown';
19
+ }
20
+ catch {
21
+ return 'unknown';
22
+ }
23
+ }
24
+ async function printVersion(panePath) {
25
+ const wrapperVersion = getWrapperVersion();
26
+ const installedPath = (0, installers_1.resolveExistingPanePath)(panePath);
27
+ const installedVersion = installedPath ? getPaneVersion(installedPath) : undefined;
28
+ let latest = 'unavailable';
29
+ try {
30
+ latest = normalizeVersion((await (0, releases_1.fetchRelease)('latest')).tag_name);
31
+ }
32
+ catch {
33
+ // Keep version output useful when offline.
34
+ }
35
+ console.log(`runpane ${wrapperVersion}`);
36
+ console.log(`Pane installed: ${installedVersion ?? 'not found'}`);
37
+ console.log(`Pane latest: ${latest}`);
38
+ if (installedPath) {
39
+ console.log(`Pane path: ${installedPath}`);
40
+ }
41
+ return 0;
42
+ }
43
+ function getPaneVersion(executablePath) {
44
+ try {
45
+ const result = child_process_1.default.spawnSync(executablePath, ['--version'], {
46
+ encoding: 'utf8',
47
+ stdio: ['ignore', 'pipe', 'pipe']
48
+ });
49
+ const output = `${result.stdout ?? ''}${result.stderr ?? ''}`.trim();
50
+ return output || undefined;
51
+ }
52
+ catch {
53
+ return undefined;
54
+ }
55
+ }
56
+ function normalizeVersion(version) {
57
+ return version.replace(/^v/, '');
58
+ }
59
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;;;AAMA,8CAQC;AAED,oCAmBC;AAED,wCAWC;AAhDD,kEAAyC;AACzC,4CAAoB;AACpB,gDAAwB;AACxB,yCAA0C;AAC1C,6CAAuD;AAEvD,SAAgB,iBAAiB;IAC/B,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAyB,CAAC;QACrF,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,QAAiB;IAClD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,aAAa,GAAG,IAAA,oCAAuB,EAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,MAAM,GAAG,aAAa,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,GAAG,gBAAgB,CAAC,CAAC,MAAM,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,cAAc,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;IACtC,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,cAAc,CAAC,cAAsB;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,uBAAY,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,EAAE;YACnE,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACrE,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "runpane",
3
+ "version": "2.2.9",
4
+ "description": "Thin npm installer and remote setup CLI for Pane",
5
+ "license": "AGPL-3.0",
6
+ "homepage": "https://runpane.com",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/dcouple/Pane.git",
10
+ "directory": "packages/runpane"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/dcouple/Pane/issues"
14
+ },
15
+ "bin": {
16
+ "runpane": "dist/cli.js"
17
+ },
18
+ "main": "dist/cli.js",
19
+ "types": "dist/cli.d.ts",
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc && node scripts/mark-executable.js",
26
+ "lint": "eslint src --ext .ts",
27
+ "typecheck": "tsc --noEmit",
28
+ "prepack": "pnpm run build"
29
+ },
30
+ "engines": {
31
+ "node": ">=18.17.0"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "devDependencies": {
37
+ "@eslint/js": "^9.17.0",
38
+ "@types/node": "^22.10.2",
39
+ "@typescript-eslint/eslint-plugin": "^8.19.0",
40
+ "@typescript-eslint/parser": "^8.19.0",
41
+ "eslint": "^9.17.0",
42
+ "typescript": "^5.7.2",
43
+ "typescript-eslint": "^8.19.0"
44
+ }
45
+ }