@junctionpanel/cli 0.1.16
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/LICENSE +671 -0
- package/bin/junction +2 -0
- package/bin/junction-daemon +5 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +211 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent/archive.d.ts +17 -0
- package/dist/commands/agent/archive.d.ts.map +1 -0
- package/dist/commands/agent/archive.js +92 -0
- package/dist/commands/agent/archive.js.map +1 -0
- package/dist/commands/agent/attach.d.ts +10 -0
- package/dist/commands/agent/attach.d.ts.map +1 -0
- package/dist/commands/agent/attach.js +153 -0
- package/dist/commands/agent/attach.js.map +1 -0
- package/dist/commands/agent/index.d.ts +3 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +125 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/agent/inspect.d.ts +14 -0
- package/dist/commands/agent/inspect.d.ts.map +1 -0
- package/dist/commands/agent/inspect.js +198 -0
- package/dist/commands/agent/inspect.js.map +1 -0
- package/dist/commands/agent/logs.d.ts +15 -0
- package/dist/commands/agent/logs.d.ts.map +1 -0
- package/dist/commands/agent/logs.js +163 -0
- package/dist/commands/agent/logs.js.map +1 -0
- package/dist/commands/agent/ls.d.ts +37 -0
- package/dist/commands/agent/ls.d.ts.map +1 -0
- package/dist/commands/agent/ls.js +185 -0
- package/dist/commands/agent/ls.js.map +1 -0
- package/dist/commands/agent/mode.d.ts +18 -0
- package/dist/commands/agent/mode.d.ts.map +1 -0
- package/dist/commands/agent/mode.js +100 -0
- package/dist/commands/agent/mode.js.map +1 -0
- package/dist/commands/agent/run.d.ts +40 -0
- package/dist/commands/agent/run.d.ts.map +1 -0
- package/dist/commands/agent/run.js +354 -0
- package/dist/commands/agent/run.js.map +1 -0
- package/dist/commands/agent/send.d.ts +16 -0
- package/dist/commands/agent/send.d.ts.map +1 -0
- package/dist/commands/agent/send.js +172 -0
- package/dist/commands/agent/send.js.map +1 -0
- package/dist/commands/agent/stop.d.ts +16 -0
- package/dist/commands/agent/stop.d.ts.map +1 -0
- package/dist/commands/agent/stop.js +105 -0
- package/dist/commands/agent/stop.js.map +1 -0
- package/dist/commands/agent/update.d.ts +18 -0
- package/dist/commands/agent/update.d.ts.map +1 -0
- package/dist/commands/agent/update.js +139 -0
- package/dist/commands/agent/update.js.map +1 -0
- package/dist/commands/agent/wait.d.ts +16 -0
- package/dist/commands/agent/wait.d.ts.map +1 -0
- package/dist/commands/agent/wait.js +194 -0
- package/dist/commands/agent/wait.js.map +1 -0
- package/dist/commands/daemon/index.d.ts +4 -0
- package/dist/commands/daemon/index.d.ts.map +1 -0
- package/dist/commands/daemon/index.js +50 -0
- package/dist/commands/daemon/index.js.map +1 -0
- package/dist/commands/daemon/local-daemon.d.ts +60 -0
- package/dist/commands/daemon/local-daemon.d.ts.map +1 -0
- package/dist/commands/daemon/local-daemon.js +501 -0
- package/dist/commands/daemon/local-daemon.js.map +1 -0
- package/dist/commands/daemon/package-context.d.ts +7 -0
- package/dist/commands/daemon/package-context.d.ts.map +1 -0
- package/dist/commands/daemon/package-context.js +41 -0
- package/dist/commands/daemon/package-context.js.map +1 -0
- package/dist/commands/daemon/pair.d.ts +3 -0
- package/dist/commands/daemon/pair.d.ts.map +1 -0
- package/dist/commands/daemon/pair.js +11 -0
- package/dist/commands/daemon/pair.js.map +1 -0
- package/dist/commands/daemon/restart.d.ts +12 -0
- package/dist/commands/daemon/restart.d.ts.map +1 -0
- package/dist/commands/daemon/restart.js +102 -0
- package/dist/commands/daemon/restart.js.map +1 -0
- package/dist/commands/daemon/runtime-toolchain.d.ts +24 -0
- package/dist/commands/daemon/runtime-toolchain.d.ts.map +1 -0
- package/dist/commands/daemon/runtime-toolchain.js +93 -0
- package/dist/commands/daemon/runtime-toolchain.js.map +1 -0
- package/dist/commands/daemon/start.d.ts +6 -0
- package/dist/commands/daemon/start.d.ts.map +1 -0
- package/dist/commands/daemon/start.js +48 -0
- package/dist/commands/daemon/start.js.map +1 -0
- package/dist/commands/daemon/status.d.ts +11 -0
- package/dist/commands/daemon/status.d.ts.map +1 -0
- package/dist/commands/daemon/status.js +389 -0
- package/dist/commands/daemon/status.js.map +1 -0
- package/dist/commands/daemon/stop.d.ts +12 -0
- package/dist/commands/daemon/stop.d.ts.map +1 -0
- package/dist/commands/daemon/stop.js +69 -0
- package/dist/commands/daemon/stop.js.map +1 -0
- package/dist/commands/daemon/update.d.ts +11 -0
- package/dist/commands/daemon/update.d.ts.map +1 -0
- package/dist/commands/daemon/update.js +88 -0
- package/dist/commands/daemon/update.js.map +1 -0
- package/dist/commands/onboard.d.ts +9 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +299 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/permit/allow.d.ts +20 -0
- package/dist/commands/permit/allow.d.ts.map +1 -0
- package/dist/commands/permit/allow.js +134 -0
- package/dist/commands/permit/allow.js.map +1 -0
- package/dist/commands/permit/deny.d.ts +12 -0
- package/dist/commands/permit/deny.d.ts.map +1 -0
- package/dist/commands/permit/deny.js +106 -0
- package/dist/commands/permit/deny.js.map +1 -0
- package/dist/commands/permit/index.d.ts +3 -0
- package/dist/commands/permit/index.d.ts.map +1 -0
- package/dist/commands/permit/index.js +37 -0
- package/dist/commands/permit/index.js.map +1 -0
- package/dist/commands/permit/ls.d.ts +18 -0
- package/dist/commands/permit/ls.d.ts.map +1 -0
- package/dist/commands/permit/ls.js +66 -0
- package/dist/commands/permit/ls.js.map +1 -0
- package/dist/commands/provider/index.d.ts +3 -0
- package/dist/commands/provider/index.d.ts.map +1 -0
- package/dist/commands/provider/index.js +23 -0
- package/dist/commands/provider/index.js.map +1 -0
- package/dist/commands/provider/ls.d.ts +17 -0
- package/dist/commands/provider/ls.d.ts.map +1 -0
- package/dist/commands/provider/ls.js +51 -0
- package/dist/commands/provider/ls.js.map +1 -0
- package/dist/commands/provider/models.d.ts +20 -0
- package/dist/commands/provider/models.d.ts.map +1 -0
- package/dist/commands/provider/models.js +53 -0
- package/dist/commands/provider/models.js.map +1 -0
- package/dist/commands/worktree/archive.d.ts +16 -0
- package/dist/commands/worktree/archive.d.ts.map +1 -0
- package/dist/commands/worktree/archive.js +98 -0
- package/dist/commands/worktree/archive.js.map +1 -0
- package/dist/commands/worktree/index.d.ts +3 -0
- package/dist/commands/worktree/index.d.ts.map +1 -0
- package/dist/commands/worktree/index.js +22 -0
- package/dist/commands/worktree/index.js.map +1 -0
- package/dist/commands/worktree/ls.d.ts +19 -0
- package/dist/commands/worktree/ls.d.ts.map +1 -0
- package/dist/commands/worktree/ls.js +97 -0
- package/dist/commands/worktree/ls.js.map +1 -0
- package/dist/daemon-only-cli.d.ts +4 -0
- package/dist/daemon-only-cli.d.ts.map +1 -0
- package/dist/daemon-only-cli.js +5 -0
- package/dist/daemon-only-cli.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/output/index.d.ts +45 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +47 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/json.d.ts +11 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +37 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/quiet.d.ts +9 -0
- package/dist/output/quiet.d.ts.map +1 -0
- package/dist/output/quiet.js +22 -0
- package/dist/output/quiet.js.map +1 -0
- package/dist/output/render.d.ts +15 -0
- package/dist/output/render.d.ts.map +1 -0
- package/dist/output/render.js +80 -0
- package/dist/output/render.js.map +1 -0
- package/dist/output/table.d.ts +13 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +135 -0
- package/dist/output/table.js.map +1 -0
- package/dist/output/types.d.ts +71 -0
- package/dist/output/types.d.ts.map +1 -0
- package/dist/output/types.js +8 -0
- package/dist/output/types.js.map +1 -0
- package/dist/output/with-output.d.ts +37 -0
- package/dist/output/with-output.d.ts.map +1 -0
- package/dist/output/with-output.js +87 -0
- package/dist/output/with-output.js.map +1 -0
- package/dist/output/yaml.d.ts +11 -0
- package/dist/output/yaml.d.ts.map +1 -0
- package/dist/output/yaml.js +38 -0
- package/dist/output/yaml.js.map +1 -0
- package/dist/utils/client-id.d.ts +2 -0
- package/dist/utils/client-id.d.ts.map +1 -0
- package/dist/utils/client-id.js +37 -0
- package/dist/utils/client-id.js.map +1 -0
- package/dist/utils/client.d.ts +35 -0
- package/dist/utils/client.d.ts.map +1 -0
- package/dist/utils/client.js +113 -0
- package/dist/utils/client.js.map +1 -0
- package/dist/utils/errors.d.ts +5 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +10 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/timeline.d.ts +8 -0
- package/dist/utils/timeline.d.ts.map +1 -0
- package/dist/utils/timeline.js +9 -0
- package/dist/utils/timeline.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { closeSync, existsSync, openSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { loadConfig, resolveJunctionHome } from '@junctionpanel/server';
|
|
6
|
+
import { tryConnectToDaemon } from '../../utils/client.js';
|
|
7
|
+
const DETACHED_STARTUP_GRACE_MS = 1200;
|
|
8
|
+
const PID_POLL_INTERVAL_MS = 100;
|
|
9
|
+
const KILL_TIMEOUT_MS = 3000;
|
|
10
|
+
const DAEMON_LOG_FILENAME = 'daemon.log';
|
|
11
|
+
const DAEMON_PID_FILENAME = 'junction.pid';
|
|
12
|
+
const DAEMON_PIDS_DIR = 'pids';
|
|
13
|
+
export const DEFAULT_STOP_TIMEOUT_MS = 15000;
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
const startupReady = () => ({ exitedEarly: false });
|
|
16
|
+
const startupExited = (details) => ({
|
|
17
|
+
exitedEarly: true,
|
|
18
|
+
...details,
|
|
19
|
+
});
|
|
20
|
+
function envWithHome(home) {
|
|
21
|
+
if (!home) {
|
|
22
|
+
return process.env;
|
|
23
|
+
}
|
|
24
|
+
return { ...process.env, JUNCTION_HOME: home };
|
|
25
|
+
}
|
|
26
|
+
function buildRunnerArgs(options) {
|
|
27
|
+
const args = [];
|
|
28
|
+
if (options.relay === false) {
|
|
29
|
+
args.push('--no-relay');
|
|
30
|
+
}
|
|
31
|
+
if (options.mcp === false) {
|
|
32
|
+
args.push('--no-mcp');
|
|
33
|
+
}
|
|
34
|
+
return args;
|
|
35
|
+
}
|
|
36
|
+
function buildChildEnv(options) {
|
|
37
|
+
const childEnv = { ...process.env };
|
|
38
|
+
if (options.home) {
|
|
39
|
+
childEnv.JUNCTION_HOME = options.home;
|
|
40
|
+
}
|
|
41
|
+
if (options.listen) {
|
|
42
|
+
childEnv.JUNCTION_LISTEN = options.listen;
|
|
43
|
+
}
|
|
44
|
+
else if (options.port) {
|
|
45
|
+
childEnv.JUNCTION_LISTEN = `127.0.0.1:${options.port}`;
|
|
46
|
+
}
|
|
47
|
+
if (options.allowedHosts) {
|
|
48
|
+
childEnv.JUNCTION_ALLOWED_HOSTS = options.allowedHosts;
|
|
49
|
+
}
|
|
50
|
+
return childEnv;
|
|
51
|
+
}
|
|
52
|
+
function resolveDaemonRunnerEntry() {
|
|
53
|
+
const serverExportPath = require.resolve('@junctionpanel/server');
|
|
54
|
+
let currentDir = path.dirname(serverExportPath);
|
|
55
|
+
while (true) {
|
|
56
|
+
const packageJsonPath = path.join(currentDir, 'package.json');
|
|
57
|
+
if (existsSync(packageJsonPath)) {
|
|
58
|
+
try {
|
|
59
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
60
|
+
if (packageJson.name === '@junctionpanel/server') {
|
|
61
|
+
const distRunner = path.join(currentDir, 'dist', 'scripts', 'daemon-runner.js');
|
|
62
|
+
if (existsSync(distRunner)) {
|
|
63
|
+
return distRunner;
|
|
64
|
+
}
|
|
65
|
+
return path.join(currentDir, 'scripts', 'daemon-runner.ts');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Continue searching up if package.json exists but is invalid.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const parentDir = path.dirname(currentDir);
|
|
73
|
+
if (parentDir === currentDir) {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
currentDir = parentDir;
|
|
77
|
+
}
|
|
78
|
+
throw new Error('Unable to resolve @junctionpanel/server package root for daemon runner');
|
|
79
|
+
}
|
|
80
|
+
function readPidFile(pidPath) {
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(readFileSync(pidPath, 'utf-8'));
|
|
83
|
+
const pidValue = parsed.pid;
|
|
84
|
+
if (typeof pidValue !== 'number' || !Number.isInteger(pidValue) || pidValue <= 0) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
pid: pidValue,
|
|
89
|
+
startedAt: typeof parsed.startedAt === 'string' ? parsed.startedAt : undefined,
|
|
90
|
+
hostname: typeof parsed.hostname === 'string' ? parsed.hostname : undefined,
|
|
91
|
+
uid: typeof parsed.uid === 'number' ? parsed.uid : undefined,
|
|
92
|
+
sockPath: typeof parsed.sockPath === 'string' ? parsed.sockPath : undefined,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function tailFile(filePath, lines = 30) {
|
|
100
|
+
try {
|
|
101
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
102
|
+
return content.split('\n').filter(Boolean).slice(-lines).join('\n');
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function sleep(ms) {
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
setTimeout(resolve, ms);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function readNodeErrnoCode(error) {
|
|
114
|
+
if (typeof error !== 'object' || error === null || !('code' in error)) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
return typeof error.code === 'string' ? error.code : undefined;
|
|
118
|
+
}
|
|
119
|
+
function isProcessRunning(pid) {
|
|
120
|
+
try {
|
|
121
|
+
process.kill(pid, 0);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const code = readNodeErrnoCode(err);
|
|
126
|
+
if (code === 'EPERM') {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function signalProcess(pid, signal) {
|
|
133
|
+
try {
|
|
134
|
+
process.kill(pid, signal);
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
const code = readNodeErrnoCode(err);
|
|
139
|
+
if (code === 'ESRCH') {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function signalProcessSafely(pid, signal) {
|
|
146
|
+
if (!Number.isInteger(pid) || pid <= 1 || pid === process.pid) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
return signalProcess(pid, signal);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
const code = readNodeErrnoCode(err);
|
|
154
|
+
if (code === 'EPERM') {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function signalProcessGroupSafely(pid, signal) {
|
|
161
|
+
if (!Number.isInteger(pid) || pid <= 1 || pid === process.pid) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
if (process.platform === 'win32') {
|
|
165
|
+
return signalProcessSafely(pid, signal);
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
process.kill(-pid, signal);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
const code = readNodeErrnoCode(err);
|
|
173
|
+
if (code === 'ESRCH') {
|
|
174
|
+
return signalProcessSafely(pid, signal);
|
|
175
|
+
}
|
|
176
|
+
if (code === 'EPERM') {
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
throw err;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function waitForPidExit(pid, timeoutMs) {
|
|
183
|
+
const deadline = Date.now() + timeoutMs;
|
|
184
|
+
while (Date.now() < deadline) {
|
|
185
|
+
if (!isProcessRunning(pid)) {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
await sleep(PID_POLL_INTERVAL_MS);
|
|
189
|
+
}
|
|
190
|
+
return !isProcessRunning(pid);
|
|
191
|
+
}
|
|
192
|
+
function getErrorMessage(error) {
|
|
193
|
+
return error instanceof Error ? error.message : String(error);
|
|
194
|
+
}
|
|
195
|
+
export function resolveLocalJunctionHome(home) {
|
|
196
|
+
return resolveJunctionHome(envWithHome(home));
|
|
197
|
+
}
|
|
198
|
+
export function resolveTcpHostFromListen(listen) {
|
|
199
|
+
const normalized = listen.trim();
|
|
200
|
+
if (!normalized) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
if (normalized.startsWith('/') || normalized.startsWith('unix://')) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
if (/^\d+$/.test(normalized)) {
|
|
207
|
+
return `127.0.0.1:${normalized}`;
|
|
208
|
+
}
|
|
209
|
+
if (normalized.includes(':')) {
|
|
210
|
+
return normalized;
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
function scanPidFiles(home) {
|
|
215
|
+
const logPath = path.join(home, DAEMON_LOG_FILENAME);
|
|
216
|
+
const states = [];
|
|
217
|
+
const seenPids = new Set();
|
|
218
|
+
// Scan pids/ directory
|
|
219
|
+
const pidsDir = path.join(home, DAEMON_PIDS_DIR);
|
|
220
|
+
if (existsSync(pidsDir)) {
|
|
221
|
+
try {
|
|
222
|
+
const entries = readdirSync(pidsDir);
|
|
223
|
+
for (const entry of entries) {
|
|
224
|
+
if (!entry.endsWith('.pid'))
|
|
225
|
+
continue;
|
|
226
|
+
const pidPath = path.join(pidsDir, entry);
|
|
227
|
+
const pidInfo = readPidFile(pidPath);
|
|
228
|
+
if (!pidInfo)
|
|
229
|
+
continue;
|
|
230
|
+
const running = isProcessRunning(pidInfo.pid);
|
|
231
|
+
seenPids.add(pidInfo.pid);
|
|
232
|
+
states.push({
|
|
233
|
+
home,
|
|
234
|
+
listen: pidInfo.sockPath ?? 'unknown',
|
|
235
|
+
logPath,
|
|
236
|
+
pidPath,
|
|
237
|
+
pidInfo,
|
|
238
|
+
running,
|
|
239
|
+
stalePidFile: !running,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// pids dir read failed
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Check legacy junction.pid
|
|
248
|
+
const legacyPath = path.join(home, DAEMON_PID_FILENAME);
|
|
249
|
+
if (existsSync(legacyPath)) {
|
|
250
|
+
const pidInfo = readPidFile(legacyPath);
|
|
251
|
+
if (pidInfo && !seenPids.has(pidInfo.pid)) {
|
|
252
|
+
const running = isProcessRunning(pidInfo.pid);
|
|
253
|
+
states.push({
|
|
254
|
+
home,
|
|
255
|
+
listen: pidInfo.sockPath ?? 'unknown',
|
|
256
|
+
logPath,
|
|
257
|
+
pidPath: legacyPath,
|
|
258
|
+
pidInfo,
|
|
259
|
+
running,
|
|
260
|
+
stalePidFile: !running,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return states;
|
|
265
|
+
}
|
|
266
|
+
export function resolveAllLocalDaemonStates(options = {}) {
|
|
267
|
+
const home = resolveLocalJunctionHome(options.home);
|
|
268
|
+
return scanPidFiles(home);
|
|
269
|
+
}
|
|
270
|
+
export function resolveLocalDaemonState(options = {}) {
|
|
271
|
+
const env = {
|
|
272
|
+
...envWithHome(options.home),
|
|
273
|
+
// Status should reflect local persisted config + pid file, not inherited daemon env overrides.
|
|
274
|
+
JUNCTION_LISTEN: undefined,
|
|
275
|
+
JUNCTION_ALLOWED_HOSTS: undefined,
|
|
276
|
+
};
|
|
277
|
+
const home = resolveJunctionHome(env);
|
|
278
|
+
const config = loadConfig(home, { env });
|
|
279
|
+
const logPath = path.join(home, DAEMON_LOG_FILENAME);
|
|
280
|
+
// If targeting a specific listen address
|
|
281
|
+
const targetListen = options.listen ?? (options.port ? `127.0.0.1:${options.port}` : undefined);
|
|
282
|
+
if (targetListen) {
|
|
283
|
+
const allStates = scanPidFiles(home);
|
|
284
|
+
const match = allStates.find((s) => s.listen === targetListen);
|
|
285
|
+
if (match)
|
|
286
|
+
return match;
|
|
287
|
+
// No match found — return a "not running" state for the target
|
|
288
|
+
return {
|
|
289
|
+
home,
|
|
290
|
+
listen: targetListen,
|
|
291
|
+
logPath,
|
|
292
|
+
pidPath: path.join(home, DAEMON_PIDS_DIR, 'none'),
|
|
293
|
+
pidInfo: null,
|
|
294
|
+
running: false,
|
|
295
|
+
stalePidFile: false,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// Default: scan all PID files, prefer the one matching config's default listen
|
|
299
|
+
const allStates = scanPidFiles(home);
|
|
300
|
+
// Try to find daemon matching config's default listen address
|
|
301
|
+
const configMatch = allStates.find((s) => s.listen === config.listen && s.running);
|
|
302
|
+
if (configMatch)
|
|
303
|
+
return configMatch;
|
|
304
|
+
// Fall back to any running daemon
|
|
305
|
+
const anyRunning = allStates.find((s) => s.running);
|
|
306
|
+
if (anyRunning)
|
|
307
|
+
return anyRunning;
|
|
308
|
+
// Fall back to any stale daemon
|
|
309
|
+
const anyStale = allStates.find((s) => s.stalePidFile);
|
|
310
|
+
if (anyStale)
|
|
311
|
+
return anyStale;
|
|
312
|
+
// No daemons found at all
|
|
313
|
+
return {
|
|
314
|
+
home,
|
|
315
|
+
listen: config.listen,
|
|
316
|
+
logPath,
|
|
317
|
+
pidPath: path.join(home, DAEMON_PIDS_DIR, 'none'),
|
|
318
|
+
pidInfo: null,
|
|
319
|
+
running: false,
|
|
320
|
+
stalePidFile: false,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
export function tailDaemonLog(home, lines = 30) {
|
|
324
|
+
const logPath = path.join(resolveLocalJunctionHome(home), DAEMON_LOG_FILENAME);
|
|
325
|
+
return tailFile(logPath, lines);
|
|
326
|
+
}
|
|
327
|
+
export async function startLocalDaemonDetached(options) {
|
|
328
|
+
if (options.listen && options.port) {
|
|
329
|
+
throw new Error('Cannot use --listen and --port together');
|
|
330
|
+
}
|
|
331
|
+
const childEnv = buildChildEnv(options);
|
|
332
|
+
const junctionHome = resolveJunctionHome(childEnv);
|
|
333
|
+
const logPath = path.join(junctionHome, DAEMON_LOG_FILENAME);
|
|
334
|
+
const daemonRunnerEntry = resolveDaemonRunnerEntry();
|
|
335
|
+
const logFd = openSync(logPath, 'a');
|
|
336
|
+
try {
|
|
337
|
+
const child = spawn(process.execPath, [...process.execArgv, daemonRunnerEntry, ...buildRunnerArgs(options)], {
|
|
338
|
+
detached: true,
|
|
339
|
+
env: childEnv,
|
|
340
|
+
stdio: ['ignore', logFd, logFd],
|
|
341
|
+
});
|
|
342
|
+
child.unref();
|
|
343
|
+
const startup = await new Promise((resolve) => {
|
|
344
|
+
let settled = false;
|
|
345
|
+
const finish = (value) => {
|
|
346
|
+
if (settled)
|
|
347
|
+
return;
|
|
348
|
+
settled = true;
|
|
349
|
+
resolve(value);
|
|
350
|
+
};
|
|
351
|
+
const timer = setTimeout(() => finish(startupReady()), DETACHED_STARTUP_GRACE_MS);
|
|
352
|
+
child.once('error', (error) => {
|
|
353
|
+
clearTimeout(timer);
|
|
354
|
+
finish(startupExited({ code: null, signal: null, error }));
|
|
355
|
+
});
|
|
356
|
+
child.once('exit', (code, signal) => {
|
|
357
|
+
clearTimeout(timer);
|
|
358
|
+
finish(startupExited({ code, signal }));
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
if (startup.exitedEarly) {
|
|
362
|
+
const reason = startup.error
|
|
363
|
+
? startup.error.message
|
|
364
|
+
: `exit code ${startup.code ?? 'unknown'}${startup.signal ? ` (${startup.signal})` : ''}`;
|
|
365
|
+
const recentLogs = tailFile(logPath);
|
|
366
|
+
throw new Error([
|
|
367
|
+
`Daemon failed to start in background (${reason}).`,
|
|
368
|
+
recentLogs ? `Recent daemon logs:\n${recentLogs}` : null,
|
|
369
|
+
]
|
|
370
|
+
.filter(Boolean)
|
|
371
|
+
.join('\n\n'));
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
pid: child.pid ?? null,
|
|
375
|
+
logPath,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
finally {
|
|
379
|
+
closeSync(logFd);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
export function startLocalDaemonForeground(options) {
|
|
383
|
+
if (options.listen && options.port) {
|
|
384
|
+
throw new Error('Cannot use --listen and --port together');
|
|
385
|
+
}
|
|
386
|
+
const childEnv = buildChildEnv(options);
|
|
387
|
+
const daemonRunnerEntry = resolveDaemonRunnerEntry();
|
|
388
|
+
const result = spawnSync(process.execPath, [...process.execArgv, daemonRunnerEntry, ...buildRunnerArgs(options)], {
|
|
389
|
+
env: childEnv,
|
|
390
|
+
stdio: 'inherit',
|
|
391
|
+
});
|
|
392
|
+
if (result.error) {
|
|
393
|
+
throw result.error;
|
|
394
|
+
}
|
|
395
|
+
return result.status ?? 1;
|
|
396
|
+
}
|
|
397
|
+
async function requestLifecycleShutdown(state, timeoutMs) {
|
|
398
|
+
const host = resolveTcpHostFromListen(state.listen);
|
|
399
|
+
if (!host) {
|
|
400
|
+
return {
|
|
401
|
+
requested: false,
|
|
402
|
+
reason: 'daemon listen target is not TCP, falling back to owner PID signal',
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
const client = await tryConnectToDaemon({ host, timeout: Math.min(timeoutMs, 5000) });
|
|
406
|
+
if (!client) {
|
|
407
|
+
return {
|
|
408
|
+
requested: false,
|
|
409
|
+
reason: `daemon websocket at ${host} is not reachable, falling back to owner PID signal`,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
try {
|
|
413
|
+
await client.shutdownServer();
|
|
414
|
+
return { requested: true };
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
return {
|
|
418
|
+
requested: false,
|
|
419
|
+
reason: `daemon lifecycle shutdown request failed (${getErrorMessage(error)}), falling back to owner PID signal`,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
finally {
|
|
423
|
+
await client.close().catch(() => undefined);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
async function stopSingleDaemon(state, options) {
|
|
427
|
+
if (!state.pidInfo || !state.running) {
|
|
428
|
+
const staleSuffix = state.stalePidFile && state.pidInfo
|
|
429
|
+
? ` (stale PID file for ${state.pidInfo.pid})`
|
|
430
|
+
: '';
|
|
431
|
+
return {
|
|
432
|
+
action: 'not_running',
|
|
433
|
+
home: state.home,
|
|
434
|
+
pid: state.pidInfo?.pid ?? null,
|
|
435
|
+
forced: false,
|
|
436
|
+
message: `Daemon is not running${staleSuffix}`,
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
const pid = state.pidInfo.pid;
|
|
440
|
+
const shutdownAttempt = await requestLifecycleShutdown(state, options.timeoutMs);
|
|
441
|
+
const lifecycleRequested = shutdownAttempt.requested;
|
|
442
|
+
const fallbackMessage = shutdownAttempt.requested ? null : shutdownAttempt.reason;
|
|
443
|
+
let forced = false;
|
|
444
|
+
if (!lifecycleRequested) {
|
|
445
|
+
const signaled = signalProcessSafely(pid, 'SIGTERM');
|
|
446
|
+
if (!signaled) {
|
|
447
|
+
return {
|
|
448
|
+
action: 'not_running',
|
|
449
|
+
home: state.home,
|
|
450
|
+
pid,
|
|
451
|
+
forced: false,
|
|
452
|
+
message: 'Daemon process was already stopped',
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
let stopped = await waitForPidExit(pid, options.timeoutMs);
|
|
457
|
+
if (!stopped && options.force) {
|
|
458
|
+
forced = true;
|
|
459
|
+
signalProcessGroupSafely(pid, 'SIGKILL');
|
|
460
|
+
stopped = await waitForPidExit(pid, KILL_TIMEOUT_MS);
|
|
461
|
+
}
|
|
462
|
+
if (!stopped) {
|
|
463
|
+
throw new Error(`Timed out waiting for daemon PID ${pid} to stop after ${Math.ceil(options.timeoutMs / 1000)}s`);
|
|
464
|
+
}
|
|
465
|
+
return {
|
|
466
|
+
action: 'stopped',
|
|
467
|
+
home: state.home,
|
|
468
|
+
pid,
|
|
469
|
+
forced,
|
|
470
|
+
message: forced
|
|
471
|
+
? 'Daemon owner process was force-stopped'
|
|
472
|
+
: lifecycleRequested
|
|
473
|
+
? 'Daemon stopped gracefully'
|
|
474
|
+
: fallbackMessage ?? 'Daemon stopped via owner PID signal',
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
export async function stopLocalDaemon(options = {}) {
|
|
478
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_STOP_TIMEOUT_MS;
|
|
479
|
+
if (options.all) {
|
|
480
|
+
const allStates = resolveAllLocalDaemonStates({ home: options.home });
|
|
481
|
+
const running = allStates.filter((s) => s.running);
|
|
482
|
+
if (running.length === 0) {
|
|
483
|
+
return {
|
|
484
|
+
action: 'not_running',
|
|
485
|
+
home: resolveLocalJunctionHome(options.home),
|
|
486
|
+
pid: null,
|
|
487
|
+
forced: false,
|
|
488
|
+
message: 'No running daemons found',
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
const results = await Promise.all(running.map((state) => stopSingleDaemon(state, { timeoutMs, force: options.force })));
|
|
492
|
+
return results.length === 1 ? results[0] : results;
|
|
493
|
+
}
|
|
494
|
+
const state = resolveLocalDaemonState({
|
|
495
|
+
home: options.home,
|
|
496
|
+
listen: options.listen,
|
|
497
|
+
port: options.port,
|
|
498
|
+
});
|
|
499
|
+
return stopSingleDaemon(state, { timeoutMs, force: options.force });
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=local-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-daemon.js","sourceRoot":"","sources":["../../../src/commands/daemon/local-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface DaemonPackageContext {
|
|
2
|
+
packageName: string;
|
|
3
|
+
packageVersion: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function resolveLocalPackageContext(): DaemonPackageContext;
|
|
6
|
+
export declare function resolveDaemonPackageContext(overrides?: Partial<DaemonPackageContext>): DaemonPackageContext;
|
|
7
|
+
//# sourceMappingURL=package-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-context.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/package-context.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;CACvB;AA2BD,wBAAgB,0BAA0B,IAAI,oBAAoB,CAajE;AAED,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC5C,oBAAoB,CAMtB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
const DEFAULT_PACKAGE_NAME = '@junctionpanel/cli';
|
|
3
|
+
const DEFAULT_PACKAGE_VERSION = 'unknown';
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
function normalizePackageName(raw) {
|
|
6
|
+
if (typeof raw !== 'string') {
|
|
7
|
+
return DEFAULT_PACKAGE_NAME;
|
|
8
|
+
}
|
|
9
|
+
const trimmed = raw.trim();
|
|
10
|
+
return trimmed.length > 0 ? trimmed : DEFAULT_PACKAGE_NAME;
|
|
11
|
+
}
|
|
12
|
+
function normalizePackageVersion(raw) {
|
|
13
|
+
if (typeof raw !== 'string') {
|
|
14
|
+
return DEFAULT_PACKAGE_VERSION;
|
|
15
|
+
}
|
|
16
|
+
const trimmed = raw.trim();
|
|
17
|
+
return trimmed.length > 0 ? trimmed : DEFAULT_PACKAGE_VERSION;
|
|
18
|
+
}
|
|
19
|
+
export function resolveLocalPackageContext() {
|
|
20
|
+
try {
|
|
21
|
+
const packageJson = require('../../../package.json');
|
|
22
|
+
return {
|
|
23
|
+
packageName: normalizePackageName(packageJson.name),
|
|
24
|
+
packageVersion: normalizePackageVersion(packageJson.version),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return {
|
|
29
|
+
packageName: DEFAULT_PACKAGE_NAME,
|
|
30
|
+
packageVersion: DEFAULT_PACKAGE_VERSION,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function resolveDaemonPackageContext(overrides = {}) {
|
|
35
|
+
const local = resolveLocalPackageContext();
|
|
36
|
+
return {
|
|
37
|
+
packageName: normalizePackageName(overrides.packageName ?? local.packageName),
|
|
38
|
+
packageVersion: normalizePackageVersion(overrides.packageVersion ?? local.packageVersion),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=package-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-context.js","sourceRoot":"","sources":["../../../src/commands/daemon/package-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAY3C,MAAM,oBAAoB,GAAG,oBAAoB,CAAA;AACjD,MAAM,uBAAuB,GAAG,SAAS,CAAA;AACzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C,SAAS,oBAAoB,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAA;AAC5D,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,uBAAuB,CAAA;IAChC,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAgB,CAAA;QACnE,OAAO;YACL,WAAW,EAAE,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC;YACnD,cAAc,EAAE,uBAAuB,CAAC,WAAW,CAAC,OAAO,CAAC;SAC7D,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,WAAW,EAAE,oBAAoB;YACjC,cAAc,EAAE,uBAAuB;SACxC,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,YAA2C,EAAE;IAE7C,MAAM,KAAK,GAAG,0BAA0B,EAAE,CAAA;IAC1C,OAAO;QACL,WAAW,EAAE,oBAAoB,CAAC,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;QAC7E,cAAc,EAAE,uBAAuB,CAAC,SAAS,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC;KAC1F,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,wBAAgB,WAAW,IAAI,OAAO,CAOrC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export function pairCommand() {
|
|
4
|
+
return new Command('pair')
|
|
5
|
+
.description('Print the daemon pairing link (coming soon)')
|
|
6
|
+
.action(async () => {
|
|
7
|
+
console.error(chalk.yellow('Pairing is not yet available in Junction. Coming soon.'));
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=pair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../../src/commands/daemon/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC,CAAA;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandOptions, SingleResult } from '../../output/index.js';
|
|
3
|
+
interface RestartResult {
|
|
4
|
+
action: 'restarted';
|
|
5
|
+
home: string;
|
|
6
|
+
pid: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export type RestartCommandResult = SingleResult<RestartResult>;
|
|
10
|
+
export declare function runRestartCommand(options: CommandOptions, _command: Command): Promise<RestartCommandResult>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=restart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/restart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQxC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAA8B,MAAM,uBAAuB,CAAA;AAErG,UAAU,aAAa;IACrB,MAAM,EAAE,WAAW,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAgBD,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAA;AAyC9D,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,oBAAoB,CAAC,CAqD/B"}
|