@algosuite/vo-mcp 0.2.0-beta.74 → 0.2.0-beta.76
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 +1 -0
- package/dist/agent-auth-probe-cli.mjs +112 -25
- package/dist/autostart-cli.js +35 -13
- package/dist/autostart-cli.js.map +1 -1
- package/dist/cli.js +134 -28
- package/dist/cli.js.map +3 -3
- package/dist/index.js +121 -16
- package/dist/index.js.map +3 -3
- package/dist/install-cli.js +35 -13
- package/dist/install-cli.js.map +1 -1
- package/dist/runner-cli.js +2097 -643
- package/dist/runner-cli.js.map +3 -3
- package/dist/runner-supervisor.js +14 -0
- package/dist/runner-supervisor.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,6 +41,7 @@ Restart the MCP clients and runner after updating, then use
|
|
|
41
41
|
| `vo_verify_answer` | Stub | Semantic-equivalence comparison of expected vs observed. |
|
|
42
42
|
| `vo_consensus_judgment` | Stub + logging skeleton | Submit a prompt to multiple models, return synthesized verdict. **Logs every call** (V1 launch gate #7). |
|
|
43
43
|
| `vo_architecture_review` | Stub | Senior-architect review of a diff against project defaults. |
|
|
44
|
+
| `vo_action_catalog_lookup` | Implemented (local, monorepo-only) | Read-only lookup over the HQ agent-executor `ACTION_CATALOG` (product -> callable action list). Returns `catalog_available: false` outside a Nexus monorepo checkout. |
|
|
44
45
|
|
|
45
46
|
All tools follow the same response envelope:
|
|
46
47
|
|
|
@@ -126,17 +126,18 @@ function buildWindowsClaudeLaunch({
|
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
128
|
function spawnClaudeSync(args = [], options = {}) {
|
|
129
|
+
const { bin = "claude", ...spawnOptions } = options;
|
|
129
130
|
if (process.platform !== "win32") {
|
|
130
|
-
return spawnSync(
|
|
131
|
+
return spawnSync(bin, args, { windowsHide: true, ...spawnOptions });
|
|
131
132
|
}
|
|
132
133
|
try {
|
|
133
134
|
const launch = buildWindowsClaudeLaunch({
|
|
134
|
-
bin
|
|
135
|
+
bin,
|
|
135
136
|
args,
|
|
136
|
-
env:
|
|
137
|
+
env: spawnOptions.env || process.env
|
|
137
138
|
});
|
|
138
139
|
return spawnSync(launch.bin, launch.args, {
|
|
139
|
-
...
|
|
140
|
+
...spawnOptions,
|
|
140
141
|
...launch.spawnOptions
|
|
141
142
|
});
|
|
142
143
|
} catch (error) {
|
|
@@ -556,7 +557,7 @@ function applyCliVersionFloor({ versionOutput, env = process.env, log = console.
|
|
|
556
557
|
import { spawnSync as spawnSync6 } from "node:child_process";
|
|
557
558
|
import { accessSync, constants, realpathSync as realpathSync2, statSync } from "node:fs";
|
|
558
559
|
import path3 from "node:path";
|
|
559
|
-
var VALIDATED_CLAUDE_SKILL_VERSIONS = Object.freeze(["2.1.263"]);
|
|
560
|
+
var VALIDATED_CLAUDE_SKILL_VERSIONS = Object.freeze(["2.1.263", "2.1.268"]);
|
|
560
561
|
var REQUIRED_CLAUDE_SKILL_HELP = Object.freeze([
|
|
561
562
|
"--allowedTools",
|
|
562
563
|
"--disable-slash-commands",
|
|
@@ -613,6 +614,25 @@ function probeText(probe) {
|
|
|
613
614
|
return `${String(probe?.stdout ?? "")}
|
|
614
615
|
${String(probe?.stderr ?? "")}`.trim();
|
|
615
616
|
}
|
|
617
|
+
function describeProbeFailure(probe, { step, timeoutMs, resolvedBin }) {
|
|
618
|
+
const where = `probing "${resolvedBin}" (claude ${step})`;
|
|
619
|
+
const error = probe?.error;
|
|
620
|
+
if (error) {
|
|
621
|
+
const code = String(error.code || "").toUpperCase();
|
|
622
|
+
if (code === "ETIMEDOUT" || String(probe?.signal || "").toUpperCase() === "SIGTERM") {
|
|
623
|
+
return `timed out after ${timeoutMs}ms ${where}`;
|
|
624
|
+
}
|
|
625
|
+
if (code === "ENOENT") {
|
|
626
|
+
return `binary not found while ${where}`;
|
|
627
|
+
}
|
|
628
|
+
return `spawn error while ${where}: ${String(error.message || error)}`;
|
|
629
|
+
}
|
|
630
|
+
if (probe && probe.status !== 0) {
|
|
631
|
+
const stderr = String(probe.stderr ?? "").trim().slice(0, 200);
|
|
632
|
+
return `exited with status ${probe.status} while ${where}${stderr ? `: ${stderr}` : ""}`;
|
|
633
|
+
}
|
|
634
|
+
return `capability probe failed while ${where}`;
|
|
635
|
+
}
|
|
616
636
|
function resolveClaudeBinaryIdentity(bin = "claude", env = process.env) {
|
|
617
637
|
let resolvedBin = String(bin);
|
|
618
638
|
try {
|
|
@@ -660,7 +680,11 @@ function probeClaudeSkillCapability({
|
|
|
660
680
|
compatible: false,
|
|
661
681
|
version: null,
|
|
662
682
|
resolvedBin: identity.resolvedBin,
|
|
663
|
-
reason:
|
|
683
|
+
reason: `claude version capability probe failed: ${describeProbeFailure(versionProbe, {
|
|
684
|
+
step: "--version",
|
|
685
|
+
timeoutMs,
|
|
686
|
+
resolvedBin: identity.resolvedBin
|
|
687
|
+
})}`
|
|
664
688
|
};
|
|
665
689
|
}
|
|
666
690
|
const effectiveVersionOutput = versionProbe ? probeText(versionProbe) : versionOutput;
|
|
@@ -674,7 +698,11 @@ function probeClaudeSkillCapability({
|
|
|
674
698
|
compatible: false,
|
|
675
699
|
version: suppliedVersion,
|
|
676
700
|
resolvedBin: identity.resolvedBin,
|
|
677
|
-
reason:
|
|
701
|
+
reason: `claude help capability probe failed: ${describeProbeFailure(helpProbe, {
|
|
702
|
+
step: "--help",
|
|
703
|
+
timeoutMs,
|
|
704
|
+
resolvedBin: identity.resolvedBin
|
|
705
|
+
})}`
|
|
678
706
|
};
|
|
679
707
|
}
|
|
680
708
|
const assessed = assessClaudeSkillCapability({
|
|
@@ -713,6 +741,7 @@ function resolveClaudeAuthTier({
|
|
|
713
741
|
});
|
|
714
742
|
}
|
|
715
743
|
async function checkClaudeAuth({
|
|
744
|
+
bin = "claude",
|
|
716
745
|
spawnVersion = spawnClaudeSync,
|
|
717
746
|
probeLogin = probeClaudeLoginState,
|
|
718
747
|
getStoredKey = getAnthropicKey,
|
|
@@ -725,7 +754,8 @@ async function checkClaudeAuth({
|
|
|
725
754
|
let probe = spawnVersion(["--version"], {
|
|
726
755
|
timeout: FIRST_VERSION_TIMEOUT_MS,
|
|
727
756
|
encoding: "utf8",
|
|
728
|
-
env
|
|
757
|
+
env,
|
|
758
|
+
bin
|
|
729
759
|
});
|
|
730
760
|
let retriedAfterTimeout = false;
|
|
731
761
|
if (isTimeout(probe)) {
|
|
@@ -733,7 +763,8 @@ async function checkClaudeAuth({
|
|
|
733
763
|
probe = spawnVersion(["--version"], {
|
|
734
764
|
timeout: RETRY_VERSION_TIMEOUT_MS,
|
|
735
765
|
encoding: "utf8",
|
|
736
|
-
env
|
|
766
|
+
env,
|
|
767
|
+
bin
|
|
737
768
|
});
|
|
738
769
|
}
|
|
739
770
|
if (probe.error) {
|
|
@@ -741,7 +772,7 @@ async function checkClaudeAuth({
|
|
|
741
772
|
return {
|
|
742
773
|
installed: false,
|
|
743
774
|
authenticated: false,
|
|
744
|
-
message:
|
|
775
|
+
message: `claude CLI not found on PATH (looked for "${bin}") \u2014 it is a SEPARATE install from the Claude Desktop app and the Claude Code IDE extension. Install: npm install -g @anthropic-ai/claude-code, then sign in: claude auth login.`
|
|
745
776
|
};
|
|
746
777
|
}
|
|
747
778
|
return {
|
|
@@ -775,11 +806,7 @@ async function checkClaudeAuth({
|
|
|
775
806
|
}
|
|
776
807
|
const authTier = resolveClaudeAuthTier({ env, loggedIn, getStoredKey });
|
|
777
808
|
const remainingMs = AUTH_PROBE_BUDGET_MS - (now() - startedAt);
|
|
778
|
-
const skillCapability = loggedIn === true && remainingMs >= MIN_SKILL_PROBE_MS ? probeSkillCapability({
|
|
779
|
-
versionOutput: probe.stdout,
|
|
780
|
-
env,
|
|
781
|
-
timeoutMs: Math.min(2e3, remainingMs)
|
|
782
|
-
}) : { compatible: false };
|
|
809
|
+
const skillCapability = loggedIn === true && remainingMs >= MIN_SKILL_PROBE_MS ? probeSkillCapability({ bin, env, freshIdentity: true }) : { compatible: false };
|
|
783
810
|
return {
|
|
784
811
|
installed: true,
|
|
785
812
|
authenticated: true,
|
|
@@ -851,8 +878,13 @@ var ClaudeRunner = class {
|
|
|
851
878
|
describeAuth(env = process.env) {
|
|
852
879
|
return describeAnthropicAuthSource(env);
|
|
853
880
|
}
|
|
854
|
-
|
|
855
|
-
|
|
881
|
+
// `bin` lets the caller probe the EXACT binary dispatch will spawn (an
|
|
882
|
+
// operator VO_CODE_RUNNER_BIN / VO_CODE_RUNNER_CLAUDE_BIN override), so the
|
|
883
|
+
// heartbeat's skill_capable advertisement can never diverge from dispatch's
|
|
884
|
+
// own resolved binary (see agent-auth-probe-cli.mjs, which threads
|
|
885
|
+
// resolveRunner()'s runnerBin through here).
|
|
886
|
+
async checkAuth({ bin = this.binary } = {}) {
|
|
887
|
+
return checkClaudeAuth({ bin });
|
|
856
888
|
}
|
|
857
889
|
checkSkillCapability({ bin = this.binary, env = process.env } = {}) {
|
|
858
890
|
return probeClaudeSkillCapability({ bin, env, freshIdentity: true });
|
|
@@ -863,7 +895,7 @@ var claudeRunner = new ClaudeRunner();
|
|
|
863
895
|
// ../../scripts/virtual-office/code-runner/codex-runner.mjs
|
|
864
896
|
import { spawnSync as spawnSync7 } from "node:child_process";
|
|
865
897
|
import { existsSync as existsSync3 } from "node:fs";
|
|
866
|
-
import { win32 } from "node:path";
|
|
898
|
+
import { win32 as win322 } from "node:path";
|
|
867
899
|
|
|
868
900
|
// ../../scripts/virtual-office/code-runner/agent-key-store.mjs
|
|
869
901
|
import { createRequire as createRequire2 } from "node:module";
|
|
@@ -1008,6 +1040,46 @@ function classifyCodexStderr(stderr = "") {
|
|
|
1008
1040
|
return codexFailure("codex_runtime_launch_logon_session", { win32_error: 1312 });
|
|
1009
1041
|
}
|
|
1010
1042
|
|
|
1043
|
+
// ../../scripts/virtual-office/code-runner/codex-shell-env.mjs
|
|
1044
|
+
import { lstatSync, realpathSync as realpathSync3 } from "node:fs";
|
|
1045
|
+
import { win32 } from "node:path";
|
|
1046
|
+
var isStoreAliasPath = (path4) => /[\\/]Microsoft[\\/]WindowsApps(?:[\\/]|$)/i.test(path4);
|
|
1047
|
+
var isLocalAbsolute = (path4) => /^[a-z]:[\\/]/i.test(path4);
|
|
1048
|
+
function isNativePowerShell(path4, { lstat = lstatSync, realpath = realpathSync3 } = {}) {
|
|
1049
|
+
if (!isLocalAbsolute(path4) || isStoreAliasPath(path4)) return false;
|
|
1050
|
+
try {
|
|
1051
|
+
const stat = lstat(path4);
|
|
1052
|
+
return stat.isFile() && !stat.isSymbolicLink() && stat.size > 0 && !isStoreAliasPath(realpath(path4));
|
|
1053
|
+
} catch {
|
|
1054
|
+
return false;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
function codexShellEnv(env, { platform = process.platform, isNative = isNativePowerShell } = {}) {
|
|
1058
|
+
if (platform !== "win32") return env;
|
|
1059
|
+
const pathKeys = Object.keys(env).filter((key) => key.toLowerCase() === "path").sort();
|
|
1060
|
+
const pathKey = pathKeys[0] || "PATH";
|
|
1061
|
+
const pathValue2 = String(env[pathKey] || "");
|
|
1062
|
+
const directories = pathValue2.split(";").map((part) => part.trim().replace(/^"(.*)"$/, "$1")).filter(Boolean);
|
|
1063
|
+
const candidates = directories.filter(isLocalAbsolute).map((dir) => win32.join(dir, "pwsh.exe"));
|
|
1064
|
+
if (env.ProgramFiles) candidates.push(win32.join(env.ProgramFiles, "PowerShell", "7", "pwsh.exe"));
|
|
1065
|
+
if (env.USERPROFILE) candidates.push(win32.join(
|
|
1066
|
+
env.USERPROFILE,
|
|
1067
|
+
".cache",
|
|
1068
|
+
"codex-runtimes",
|
|
1069
|
+
"codex-primary-runtime",
|
|
1070
|
+
"dependencies",
|
|
1071
|
+
"native",
|
|
1072
|
+
"powershell",
|
|
1073
|
+
"pwsh.exe"
|
|
1074
|
+
));
|
|
1075
|
+
const shell = candidates.find((candidate) => isNative(candidate));
|
|
1076
|
+
if (!shell) throw new Error("Codex requires a native PowerShell 7 pwsh.exe on Windows; install PowerShell 7 or add its native directory to the runner PATH. WindowsApps execution aliases are unsupported.");
|
|
1077
|
+
const out = { ...env };
|
|
1078
|
+
for (const key of pathKeys) delete out[key];
|
|
1079
|
+
out[pathKey] = [win32.dirname(shell), ...directories.filter((dir) => dir.toLowerCase() !== win32.dirname(shell).toLowerCase())].join(";");
|
|
1080
|
+
return out;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1011
1083
|
// ../../scripts/virtual-office/code-runner/codex-runner.mjs
|
|
1012
1084
|
var CODEX_PREFER_LOGIN_ENV = "VO_RUNNER_CODEX_PREFER_LOGIN";
|
|
1013
1085
|
var LEGACY_PREFER_LOGIN_ENV = "VO_RUNNER_PREFER_LOGIN";
|
|
@@ -1025,7 +1097,7 @@ function resolveCodexBinary({
|
|
|
1025
1097
|
const localAppData = String(env.LOCALAPPDATA || "").trim();
|
|
1026
1098
|
const candidates = [];
|
|
1027
1099
|
if (appData) {
|
|
1028
|
-
candidates.push(
|
|
1100
|
+
candidates.push(win322.join(
|
|
1029
1101
|
appData,
|
|
1030
1102
|
"npm",
|
|
1031
1103
|
"node_modules",
|
|
@@ -1041,18 +1113,28 @@ function resolveCodexBinary({
|
|
|
1041
1113
|
));
|
|
1042
1114
|
}
|
|
1043
1115
|
if (userProfile) {
|
|
1044
|
-
candidates.push(
|
|
1045
|
-
candidates.push(
|
|
1116
|
+
candidates.push(win322.join(userProfile, ".local", "bin", "codex.exe"));
|
|
1117
|
+
candidates.push(win322.join(userProfile, ".codex", "bin", "codex.exe"));
|
|
1046
1118
|
}
|
|
1047
1119
|
if (localAppData) {
|
|
1048
|
-
candidates.push(
|
|
1120
|
+
candidates.push(win322.join(localAppData, "Microsoft", "WindowsApps", "codex.exe"));
|
|
1049
1121
|
}
|
|
1050
1122
|
const absolute = candidates.find((candidate) => exists(candidate));
|
|
1051
1123
|
if (absolute) return absolute;
|
|
1052
1124
|
return "codex";
|
|
1053
1125
|
}
|
|
1054
1126
|
function buildCodexArgs({ model, effort } = {}) {
|
|
1055
|
-
const args = [
|
|
1127
|
+
const args = [
|
|
1128
|
+
"exec",
|
|
1129
|
+
"--json",
|
|
1130
|
+
"-c",
|
|
1131
|
+
'approval_policy="never"',
|
|
1132
|
+
"--sandbox",
|
|
1133
|
+
"workspace-write",
|
|
1134
|
+
"--skip-git-repo-check",
|
|
1135
|
+
"-c",
|
|
1136
|
+
"sandbox_workspace_write.writable_roots=[]"
|
|
1137
|
+
];
|
|
1056
1138
|
if (model) {
|
|
1057
1139
|
args.push("--model", String(model));
|
|
1058
1140
|
}
|
|
@@ -1113,10 +1195,11 @@ function parseCodexEvent(line) {
|
|
|
1113
1195
|
return null;
|
|
1114
1196
|
}
|
|
1115
1197
|
var CodexRunner = class {
|
|
1116
|
-
constructor({ spawn: spawn2 = spawnSync7, resolveBinary = resolveCodexBinary, env = process.env } = {}) {
|
|
1198
|
+
constructor({ spawn: spawn2 = spawnSync7, resolveBinary = resolveCodexBinary, env = process.env, shellEnv = codexShellEnv } = {}) {
|
|
1117
1199
|
this.spawn = spawn2;
|
|
1118
1200
|
this.resolveBinary = resolveBinary;
|
|
1119
1201
|
this.env = env;
|
|
1202
|
+
this.shellEnv = shellEnv;
|
|
1120
1203
|
}
|
|
1121
1204
|
get binary() {
|
|
1122
1205
|
return this.resolveBinary();
|
|
@@ -1160,6 +1243,9 @@ var CodexRunner = class {
|
|
|
1160
1243
|
}
|
|
1161
1244
|
return withAgentKey("openai", env);
|
|
1162
1245
|
}
|
|
1246
|
+
prepareSpawn({ bin, args, spawnOptions, env }) {
|
|
1247
|
+
return { bin, args, spawnOptions: { ...spawnOptions, env: this.shellEnv(env) } };
|
|
1248
|
+
}
|
|
1163
1249
|
costBasis(env = process.env) {
|
|
1164
1250
|
return String(env.OPENAI_API_KEY || env.CODEX_API_KEY || "").trim() ? "vendor_billed" : "subscription_api_equivalent";
|
|
1165
1251
|
}
|
|
@@ -1926,7 +2012,8 @@ function resolveRunner(env = process.env, { warn = () => {
|
|
|
1926
2012
|
// ../../scripts/virtual-office/code-runner/agent-auth-probe-cli.mjs
|
|
1927
2013
|
var agent = String(process.argv[2] || "");
|
|
1928
2014
|
try {
|
|
1929
|
-
const
|
|
2015
|
+
const { runner, runnerBin } = resolveRunner({ ...process.env, VO_CODE_RUNNER_AGENT: agent });
|
|
2016
|
+
const result = await runner.checkAuth({ bin: runnerBin });
|
|
1930
2017
|
process.stdout.write(`${JSON.stringify(result)}
|
|
1931
2018
|
`);
|
|
1932
2019
|
} catch (error) {
|
package/dist/autostart-cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
|
|
3
3
|
|
|
4
4
|
// src/autostart.ts
|
|
5
|
-
import { homedir, platform } from "node:os";
|
|
5
|
+
import { homedir, platform, userInfo } from "node:os";
|
|
6
6
|
import { isAbsolute, join } from "node:path";
|
|
7
7
|
import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync, copyFileSync } from "node:fs";
|
|
8
8
|
var WINDOWS_RESTART_BACKOFF_MS = 1e4;
|
|
@@ -21,6 +21,15 @@ function resolveLinuxConfigHome(home, env) {
|
|
|
21
21
|
const configured = env["XDG_CONFIG_HOME"]?.trim();
|
|
22
22
|
return configured && isAbsolute(configured) ? configured : join(home, ".config");
|
|
23
23
|
}
|
|
24
|
+
function resolveLinuxLingerUser(env) {
|
|
25
|
+
const fromEnv = env["USER"]?.trim() || env["LOGNAME"]?.trim();
|
|
26
|
+
if (fromEnv) return fromEnv;
|
|
27
|
+
try {
|
|
28
|
+
return userInfo().username;
|
|
29
|
+
} catch {
|
|
30
|
+
return "$USER";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
24
33
|
function launcherIsCurrent(path, desiredContent, label, log) {
|
|
25
34
|
if (!existsSync(path)) return false;
|
|
26
35
|
if (readFileSync(path, "utf8") === desiredContent) return true;
|
|
@@ -204,27 +213,40 @@ StandardError=append:${errFile}
|
|
|
204
213
|
[Install]
|
|
205
214
|
WantedBy=default.target
|
|
206
215
|
`;
|
|
207
|
-
|
|
216
|
+
const alreadyCurrent = launcherIsCurrent(unitPath, unit, "unit", log);
|
|
217
|
+
if (alreadyCurrent) {
|
|
208
218
|
log(`\u2713 Auto-start is already configured (systemd user unit)`);
|
|
209
219
|
log(` Path: ${unitPath}`);
|
|
210
|
-
|
|
220
|
+
} else {
|
|
221
|
+
writeFileSync(unitPath, unit, "utf8");
|
|
222
|
+
log(`\u2713 Installed systemd user unit`);
|
|
223
|
+
log(` Path: ${unitPath}`);
|
|
211
224
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
log(` Path: ${unitPath}`);
|
|
225
|
+
const lingerUser = resolveLinuxLingerUser(env);
|
|
226
|
+
const lingerCommand = `loginctl enable-linger ${lingerUser}`;
|
|
215
227
|
if (process.env["VITEST"]) {
|
|
216
228
|
log(` (test mode: skipping systemctl enable)`);
|
|
229
|
+
log(` Headless/server hosts also need: ${lingerCommand}`);
|
|
217
230
|
return;
|
|
218
231
|
}
|
|
232
|
+
const { execSync, execFileSync } = await import("node:child_process");
|
|
233
|
+
if (!alreadyCurrent) {
|
|
234
|
+
try {
|
|
235
|
+
execSync("systemctl --user daemon-reload", { stdio: "ignore" });
|
|
236
|
+
execSync("systemctl --user enable --now vo-runner.service", { stdio: "ignore" });
|
|
237
|
+
log(`\u2713 Enabled + started vo-runner.service (starts at login)`);
|
|
238
|
+
log(` Logs: ${logFile}`);
|
|
239
|
+
} catch {
|
|
240
|
+
log(`\u26A0 Could not enable via systemctl (enable it manually):`);
|
|
241
|
+
log(` systemctl --user daemon-reload && systemctl --user enable --now vo-runner.service`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
219
244
|
try {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
execSync("systemctl --user enable --now vo-runner.service", { stdio: "ignore" });
|
|
223
|
-
log(`\u2713 Enabled + started vo-runner.service (starts at login)`);
|
|
224
|
-
log(` Logs: ${logFile}`);
|
|
245
|
+
execFileSync("loginctl", ["enable-linger", lingerUser], { stdio: "ignore" });
|
|
246
|
+
log(`\u2713 Enabled linger for ${lingerUser} (unit keeps running without an active login session)`);
|
|
225
247
|
} catch {
|
|
226
|
-
log(`\u26A0 Could not enable
|
|
227
|
-
log(`
|
|
248
|
+
log(`\u26A0 Could not enable linger automatically \u2014 required on headless/server hosts. Run manually:`);
|
|
249
|
+
log(` ${lingerCommand}`);
|
|
228
250
|
}
|
|
229
251
|
}
|
|
230
252
|
async function uninstallLinuxAutostart(log, env) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/autostart.ts", "../src/autostart-cli.ts"],
|
|
4
|
-
"mappings": ";;;;AA4BA,SAAS,SAAS,gBAAgB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|