@jmfederico/pi-web 1.202607.0 → 1.202607.2
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 +12 -9
- package/dist/cli.js +305 -322
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/{CodeViewer-tXF3UTsY.js → CodeViewer-B4M13447.js} +1 -1
- package/dist/client/assets/{TerminalPanel-D_ihiWAt.js → TerminalPanel-Bmvj-Ecn.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-BziirXBJ.js → UnifiedDiffViewer-C0hygwRo.js} +1 -1
- package/dist/client/assets/index-TvPsRyS1.js +3545 -0
- package/dist/client/index.html +6 -6
- package/dist/client/manifest.webmanifest +4 -4
- package/dist/config.js +157 -2
- package/dist/config.js.map +1 -1
- package/dist/nativeServices/serviceDoctor.js +480 -0
- package/dist/nativeServices/serviceDoctor.js.map +1 -0
- package/dist/nativeServices/serviceInstall.js +35 -0
- package/dist/nativeServices/serviceInstall.js.map +1 -0
- package/dist/nativeServices/servicePlan.js +358 -0
- package/dist/nativeServices/servicePlan.js.map +1 -0
- package/dist/nativeServices/serviceProbe.js +447 -0
- package/dist/nativeServices/serviceProbe.js.map +1 -0
- package/dist/nativeServices/serviceRendering.js +122 -0
- package/dist/nativeServices/serviceRendering.js.map +1 -0
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +12 -0
- package/dist/plugin-api.d.ts +2 -0
- package/dist/server/activeAgentProfileProvider.js +25 -0
- package/dist/server/activeAgentProfileProvider.js.map +1 -0
- package/dist/server/app.js +57 -16
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +43 -9
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
- package/dist/server/git/gitService.js +176 -5
- package/dist/server/git/gitService.js.map +1 -1
- package/dist/server/machines/machinePluginProxyRoutes.js +7 -4
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +16 -4
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineRoutes.js +1 -1
- package/dist/server/machines/machineRoutes.js.map +1 -1
- package/dist/server/machines/machineService.js +2 -2
- package/dist/server/machines/machineService.js.map +1 -1
- package/dist/server/piPackageRoutes.js +7 -3
- package/dist/server/piPackageRoutes.js.map +1 -1
- package/dist/server/piPackageService.js +34 -2
- package/dist/server/piPackageService.js.map +1 -1
- package/dist/server/piWebPluginService.js +48 -12
- package/dist/server/piWebPluginService.js.map +1 -1
- package/dist/server/piWebReleaseLookupCache.js +37 -0
- package/dist/server/piWebReleaseLookupCache.js.map +1 -0
- package/dist/server/piWebStatus.js +38 -39
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/piWebStatusCache.js +19 -6
- package/dist/server/piWebStatusCache.js.map +1 -1
- package/dist/server/realtime/sessionEventHub.js +37 -7
- package/dist/server/realtime/sessionEventHub.js.map +1 -1
- package/dist/server/sessiond/sessionDaemonStartup.js +49 -0
- package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -0
- package/dist/server/sessiond.js +128 -62
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/authProviderOptions.js +30 -32
- package/dist/server/sessions/authProviderOptions.js.map +1 -1
- package/dist/server/sessions/authRoutes.js +14 -4
- package/dist/server/sessions/authRoutes.js.map +1 -1
- package/dist/server/sessions/authService.js +140 -29
- package/dist/server/sessions/authService.js.map +1 -1
- package/dist/server/sessions/globalProviderPolicy.js +98 -0
- package/dist/server/sessions/globalProviderPolicy.js.map +1 -0
- package/dist/server/sessions/modelCatalogRefresher.js +184 -0
- package/dist/server/sessions/modelCatalogRefresher.js.map +1 -0
- package/dist/server/sessions/oauthLoginFlowService.js +176 -53
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
- package/dist/server/sessions/piSessionManagerGateway.js +22 -21
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +936 -111
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/plainTextTheme.js +112 -0
- package/dist/server/sessions/plainTextTheme.js.map +1 -0
- package/dist/server/sessions/sessionArchiveMigration.js +590 -0
- package/dist/server/sessions/sessionArchiveMigration.js.map +1 -0
- package/dist/server/sessions/sessionArchiveStore.js +7 -4
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -1
- package/dist/server/sessions/sessionCommandService.js +68 -9
- package/dist/server/sessions/sessionCommandService.js.map +1 -1
- package/dist/server/sessions/sessionNotificationStore.js +484 -0
- package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +202 -2
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/sessionService.js +2 -0
- package/dist/server/sessions/sessionService.js.map +1 -0
- package/dist/server/sessions/sessionTreeProjection.js +250 -0
- package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
- package/dist/server/sessions/sessionUnreadStore.js +520 -0
- package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +2 -2
- package/dist/server/sessions/spawnSessionTool.js.map +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js +69 -31
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/terminals/terminalService.js +10 -4
- package/dist/server/terminals/terminalService.js.map +1 -1
- package/dist/sessiond/activeAgentProfile.js +31 -0
- package/dist/sessiond/activeAgentProfile.js.map +1 -0
- package/dist/sessiond/sessionDaemonClient.js +38 -0
- package/dist/sessiond/sessionDaemonClient.js.map +1 -1
- package/dist/shared/activeAgentProfile.js +76 -0
- package/dist/shared/activeAgentProfile.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +256 -4
- package/dist/shared/apiTypes.js +12 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +11 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +12 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/piWebStatusParsing.js +6 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -1
- package/docs/config.md +85 -12
- package/docs/plugins.md +29 -11
- package/install.sh +1 -1
- package/package.json +9 -8
- package/dist/client/assets/index-Brfk1lwl.js +0 -2950
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { posix as posixPath } from "node:path";
|
|
2
|
+
import { createDevelopmentNativeServicePlan, nativeServicePrerequisiteNeedsPathAdvice, resolveProductionNativeServicePlan, validateNativeServicePlan, } from "./servicePlan.js";
|
|
3
|
+
export function inferInstalledNativeServiceMode(serviceIds) {
|
|
4
|
+
if (serviceIds.size === 0)
|
|
5
|
+
return "none";
|
|
6
|
+
const hasProductionWeb = serviceIds.has("web");
|
|
7
|
+
const hasDevelopmentUi = serviceIds.has("uiDev");
|
|
8
|
+
if (hasProductionWeb && !hasDevelopmentUi)
|
|
9
|
+
return "production";
|
|
10
|
+
if (hasDevelopmentUi && !hasProductionWeb)
|
|
11
|
+
return "development";
|
|
12
|
+
return "ambiguous";
|
|
13
|
+
}
|
|
14
|
+
export function inspectInstalledProductionServiceContext(backend, definitions) {
|
|
15
|
+
const parsed = parseConsistentDefinitions(backend, definitions);
|
|
16
|
+
if (!parsed.ok)
|
|
17
|
+
return parsed;
|
|
18
|
+
const withWorkingDirectory = parsed.value.find((definition) => definition.workingDirectory !== null);
|
|
19
|
+
if (withWorkingDirectory !== undefined) {
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
message: `Installed production service ${withWorkingDirectory.id} unexpectedly has working directory ${withWorkingDirectory.workingDirectory ?? ""}.`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
ok: true,
|
|
27
|
+
value: {
|
|
28
|
+
shell: parsed.value[0]?.shell ?? impossibleMissingDefinition(),
|
|
29
|
+
environment: parsed.value[0]?.environment ?? impossibleMissingDefinition(),
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function inspectInstalledDevelopmentServiceInput(backend, definitions) {
|
|
34
|
+
const parsed = parseConsistentDefinitions(backend, definitions);
|
|
35
|
+
if (!parsed.ok)
|
|
36
|
+
return parsed;
|
|
37
|
+
const first = parsed.value[0] ?? impossibleMissingDefinition();
|
|
38
|
+
if (first.workingDirectory === null) {
|
|
39
|
+
return { ok: false, message: "Installed development services do not declare a working directory." };
|
|
40
|
+
}
|
|
41
|
+
const input = {
|
|
42
|
+
backend,
|
|
43
|
+
shell: first.shell,
|
|
44
|
+
environment: first.environment,
|
|
45
|
+
workingDirectory: first.workingDirectory,
|
|
46
|
+
packageJsonPath: posixPath.join(first.workingDirectory, "package.json"),
|
|
47
|
+
};
|
|
48
|
+
const expectedPlan = createDevelopmentNativeServicePlan(input);
|
|
49
|
+
for (const definition of parsed.value) {
|
|
50
|
+
const expected = expectedPlan.services.find((service) => service.id === definition.id);
|
|
51
|
+
if (expected?.shellCommand !== definition.shellCommand) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
message: `Installed ${definition.id} service command does not match the canonical development plan.`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { ok: true, value: input };
|
|
59
|
+
}
|
|
60
|
+
export async function runNativeServiceDoctor(target, dependencies) {
|
|
61
|
+
if (target.kind === "inspection-failure")
|
|
62
|
+
return target;
|
|
63
|
+
const scope = target.kind === "installed-development"
|
|
64
|
+
? { kind: target.kind, reason: null, shell: target.input.shell }
|
|
65
|
+
: { kind: target.kind, reason: target.reason, shell: target.input.shell };
|
|
66
|
+
let plan;
|
|
67
|
+
if (target.kind === "installed-development") {
|
|
68
|
+
plan = createDevelopmentNativeServicePlan(target.input);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const resolution = await resolveProductionNativeServicePlan(target.input, dependencies);
|
|
72
|
+
if (!resolution.ok) {
|
|
73
|
+
return { kind: "plan-resolution-failure", scope, failures: resolution.failures };
|
|
74
|
+
}
|
|
75
|
+
plan = resolution.plan;
|
|
76
|
+
}
|
|
77
|
+
const validation = await validateNativeServicePlan(plan, dependencies.probe);
|
|
78
|
+
return { kind: "plan-validation", scope, plan, validation };
|
|
79
|
+
}
|
|
80
|
+
export function formatNativeServiceDoctorResult(result) {
|
|
81
|
+
if (result.kind === "inspection-failure") {
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
failureKind: "inspection",
|
|
85
|
+
lines: [
|
|
86
|
+
`✗ Installed native-service plan could not be inspected: ${result.message}`,
|
|
87
|
+
" Run `pi-web install` or `pi-web install --dev` to replace mixed, partial, or outdated service definitions.",
|
|
88
|
+
],
|
|
89
|
+
plan: null,
|
|
90
|
+
adviceShell: null,
|
|
91
|
+
pathAdviceRecommended: false,
|
|
92
|
+
failedPrerequisites: [],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const lines = [scopeHeading(result.scope)];
|
|
96
|
+
if (result.kind === "plan-resolution-failure") {
|
|
97
|
+
let infrastructure = false;
|
|
98
|
+
for (const failure of result.failures) {
|
|
99
|
+
if (failure.kind === "probe-infrastructure") {
|
|
100
|
+
infrastructure = true;
|
|
101
|
+
lines.push(`✗ Native service probe infrastructure failure (${failure.reason}): ${failure.message}`);
|
|
102
|
+
}
|
|
103
|
+
else if (failure.kind === "entrypoint-inspection-failure") {
|
|
104
|
+
infrastructure = true;
|
|
105
|
+
lines.push(`✗ Could not inspect bundled ${failure.serviceId} entrypoint ${failure.entrypointPath}: ${failure.message}`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
lines.push(`✗ ${failure.namedCommand} is unavailable to the native service manager, and bundled entrypoint ${failure.bundledEntrypointPath} is missing.`);
|
|
109
|
+
if (failure.namedCommandFailure !== null)
|
|
110
|
+
lines.push(` ${failure.namedCommandFailure}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (infrastructure)
|
|
114
|
+
lines.push(" This infrastructure failure is not proof of a PATH mismatch.");
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
failureKind: infrastructure ? "infrastructure" : "requirements",
|
|
118
|
+
lines,
|
|
119
|
+
plan: null,
|
|
120
|
+
adviceShell: result.scope.shell,
|
|
121
|
+
pathAdviceRecommended: !infrastructure
|
|
122
|
+
&& result.failures.some((failure) => failure.kind === "executable-unavailable"),
|
|
123
|
+
failedPrerequisites: [],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const configuredOverrides = result.plan.services.filter((service) => service.strategy.kind === "configured-override");
|
|
127
|
+
for (const service of configuredOverrides) {
|
|
128
|
+
lines.push(`! ${service.description} uses a configured command override; doctor does not execute arbitrary configured commands.`);
|
|
129
|
+
}
|
|
130
|
+
if (result.validation.ok) {
|
|
131
|
+
lines.push("✓ All verifiable native-service plan requirements are satisfied in the service-manager context.");
|
|
132
|
+
return {
|
|
133
|
+
ok: true,
|
|
134
|
+
failureKind: "none",
|
|
135
|
+
lines,
|
|
136
|
+
plan: result.plan,
|
|
137
|
+
adviceShell: result.plan.shell,
|
|
138
|
+
pathAdviceRecommended: false,
|
|
139
|
+
failedPrerequisites: [],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const failedPrerequisites = [];
|
|
143
|
+
let infrastructure = false;
|
|
144
|
+
for (const failure of result.validation.failures) {
|
|
145
|
+
if (failure.kind === "probe-infrastructure") {
|
|
146
|
+
infrastructure = true;
|
|
147
|
+
lines.push(`✗ Native service probe infrastructure failure (${failure.reason}): ${failure.message}`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
failedPrerequisites.push(failure.prerequisite);
|
|
151
|
+
lines.push(`✗ Native service requirement failed: ${failure.prerequisite.description}`);
|
|
152
|
+
if (failure.detail !== null && failure.detail !== failure.prerequisite.description)
|
|
153
|
+
lines.push(` ${failure.detail}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (infrastructure)
|
|
157
|
+
lines.push(" This infrastructure failure is not proof of a PATH mismatch.");
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
failureKind: infrastructure ? "infrastructure" : "requirements",
|
|
161
|
+
lines,
|
|
162
|
+
plan: result.plan,
|
|
163
|
+
adviceShell: result.plan.shell,
|
|
164
|
+
pathAdviceRecommended: !infrastructure
|
|
165
|
+
&& failedPrerequisites.some(nativeServicePrerequisiteNeedsPathAdvice),
|
|
166
|
+
failedPrerequisites,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function scopeHeading(scope) {
|
|
170
|
+
if (scope.kind === "installed-development")
|
|
171
|
+
return "Installed development native-service plan:";
|
|
172
|
+
return `Prospective production native-service plan (${scope.reason ?? "installed strategy is unknown"}):`;
|
|
173
|
+
}
|
|
174
|
+
function parseConsistentDefinitions(backend, definitions) {
|
|
175
|
+
if (definitions.length === 0)
|
|
176
|
+
return { ok: false, message: "No installed service definitions were provided." };
|
|
177
|
+
const parsed = [];
|
|
178
|
+
for (const definition of definitions) {
|
|
179
|
+
const result = backend.kind === "systemd"
|
|
180
|
+
? parseSystemdDefinition(definition)
|
|
181
|
+
: parseLaunchdDefinition(definition);
|
|
182
|
+
if (!result.ok)
|
|
183
|
+
return result;
|
|
184
|
+
parsed.push(result.value);
|
|
185
|
+
}
|
|
186
|
+
const first = parsed[0] ?? impossibleMissingDefinition();
|
|
187
|
+
for (const definition of parsed.slice(1)) {
|
|
188
|
+
if (definition.shell.executable !== first.shell.executable) {
|
|
189
|
+
return { ok: false, message: "Installed service definitions use different login shells." };
|
|
190
|
+
}
|
|
191
|
+
if (!recordsEqual(definition.environment, first.environment)) {
|
|
192
|
+
return { ok: false, message: "Installed service definitions use different environments." };
|
|
193
|
+
}
|
|
194
|
+
if (definition.workingDirectory !== first.workingDirectory) {
|
|
195
|
+
return { ok: false, message: "Installed service definitions use different working directories." };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return { ok: true, value: parsed };
|
|
199
|
+
}
|
|
200
|
+
function systemdServiceDirectives(contents) {
|
|
201
|
+
const allowed = new Set(["Type", "WorkingDirectory", "Environment", "ExecStart", "Restart", "RestartSec"]);
|
|
202
|
+
const directives = [];
|
|
203
|
+
let inServiceSection = false;
|
|
204
|
+
let foundServiceSection = false;
|
|
205
|
+
for (const line of contents.split(/\r?\n/u)) {
|
|
206
|
+
const trimmed = line.trim();
|
|
207
|
+
if (/^\[[^\]]+\]$/u.test(trimmed)) {
|
|
208
|
+
inServiceSection = trimmed === "[Service]";
|
|
209
|
+
foundServiceSection ||= inServiceSection;
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (!inServiceSection || trimmed === "" || trimmed.startsWith("#") || trimmed.startsWith(";"))
|
|
213
|
+
continue;
|
|
214
|
+
const match = /^\s*([A-Za-z][A-Za-z0-9]*)=(.*)$/u.exec(line);
|
|
215
|
+
const name = match?.[1];
|
|
216
|
+
const value = match?.[2];
|
|
217
|
+
if (name === undefined || value === undefined || !allowed.has(name))
|
|
218
|
+
return undefined;
|
|
219
|
+
directives.push({ name, value });
|
|
220
|
+
}
|
|
221
|
+
return foundServiceSection ? directives : undefined;
|
|
222
|
+
}
|
|
223
|
+
function parseSystemdDefinition(definition) {
|
|
224
|
+
const directives = systemdServiceDirectives(definition.contents);
|
|
225
|
+
if (directives === undefined) {
|
|
226
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has unrecognized service directives.` };
|
|
227
|
+
}
|
|
228
|
+
const execStarts = directives.filter((directive) => directive.name === "ExecStart");
|
|
229
|
+
const execStart = execStarts.length === 1
|
|
230
|
+
? /^(?:\/usr\/bin\/env )?(.+?) -lc (.+)$/u.exec(execStarts[0]?.value ?? "")
|
|
231
|
+
: null;
|
|
232
|
+
if (execStart?.[1] === undefined || execStart[2] === undefined) {
|
|
233
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit must have exactly one recognized ExecStart.` };
|
|
234
|
+
}
|
|
235
|
+
const shellExecutable = parseSystemdExecArgument(execStart[1]);
|
|
236
|
+
if (shellExecutable === undefined) {
|
|
237
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has an unrecognized login shell argument.` };
|
|
238
|
+
}
|
|
239
|
+
const shell = installedShell(shellExecutable);
|
|
240
|
+
if (!shell.ok)
|
|
241
|
+
return shell;
|
|
242
|
+
const shellCommand = parseSystemdShellCommand(shell.value.name, execStart[2]);
|
|
243
|
+
if (shellCommand === undefined) {
|
|
244
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has an unrecognized shell command.` };
|
|
245
|
+
}
|
|
246
|
+
const environment = {};
|
|
247
|
+
for (const directive of directives.filter((item) => item.name === "Environment")) {
|
|
248
|
+
const rawValue = directive.value;
|
|
249
|
+
if (!/^"(?:\\.|[^"])*"$/u.test(rawValue)) {
|
|
250
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has an unrecognized environment entry.` };
|
|
251
|
+
}
|
|
252
|
+
const assignment = parseSystemdDirectiveValue(rawValue);
|
|
253
|
+
const separator = assignment?.indexOf("=") ?? -1;
|
|
254
|
+
const key = assignment?.slice(0, separator) ?? "";
|
|
255
|
+
if (separator <= 0 || Object.hasOwn(environment, key)) {
|
|
256
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has a malformed environment entry.` };
|
|
257
|
+
}
|
|
258
|
+
environment[key] = assignment?.slice(separator + 1) ?? "";
|
|
259
|
+
}
|
|
260
|
+
const workingDirectories = directives.filter((directive) => directive.name === "WorkingDirectory");
|
|
261
|
+
if (workingDirectories.length > 1) {
|
|
262
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has duplicate working directories.` };
|
|
263
|
+
}
|
|
264
|
+
const rawWorkingDirectory = workingDirectories[0]?.value;
|
|
265
|
+
if (rawWorkingDirectory?.startsWith('"') === true || rawWorkingDirectory?.startsWith("'") === true) {
|
|
266
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has an invalid quoted working directory.` };
|
|
267
|
+
}
|
|
268
|
+
const workingDirectory = rawWorkingDirectory === undefined
|
|
269
|
+
? null
|
|
270
|
+
: parseSystemdDirectiveValue(rawWorkingDirectory);
|
|
271
|
+
if (workingDirectories.length === 1 && workingDirectory === undefined) {
|
|
272
|
+
return { ok: false, message: `Installed ${definition.id} systemd unit has a malformed working directory.` };
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
ok: true,
|
|
276
|
+
value: { id: definition.id, shell: shell.value, environment, workingDirectory: workingDirectory ?? null, shellCommand },
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function parseLaunchdDefinition(definition) {
|
|
280
|
+
const argumentsMatches = [...definition.contents.matchAll(/<key>ProgramArguments<\/key>\s*<array>([\s\S]*?)<\/array>/gu)];
|
|
281
|
+
const arguments_ = argumentsMatches.length === 1
|
|
282
|
+
? parseXmlStringSequence(argumentsMatches[0]?.[1] ?? "")
|
|
283
|
+
: undefined;
|
|
284
|
+
if (arguments_?.length !== 4 || arguments_[0] !== "/usr/bin/env" || arguments_[2] !== "-lc") {
|
|
285
|
+
return { ok: false, message: `Installed ${definition.id} LaunchAgent has unrecognized ProgramArguments.` };
|
|
286
|
+
}
|
|
287
|
+
const shell = installedShell(arguments_[1] ?? "");
|
|
288
|
+
if (!shell.ok)
|
|
289
|
+
return shell;
|
|
290
|
+
const environmentMatches = [...definition.contents.matchAll(/<key>EnvironmentVariables<\/key>\s*<dict>([\s\S]*?)<\/dict>/gu)];
|
|
291
|
+
const environmentKeyCount = [...definition.contents.matchAll(/<key>EnvironmentVariables<\/key>/gu)].length;
|
|
292
|
+
if (environmentMatches.length > 1 || environmentKeyCount !== environmentMatches.length) {
|
|
293
|
+
return { ok: false, message: `Installed ${definition.id} LaunchAgent has a malformed environment dictionary.` };
|
|
294
|
+
}
|
|
295
|
+
const environment = environmentMatches.length === 0
|
|
296
|
+
? {}
|
|
297
|
+
: parseXmlStringDictionary(environmentMatches[0]?.[1] ?? "");
|
|
298
|
+
if (environment === undefined) {
|
|
299
|
+
return { ok: false, message: `Installed ${definition.id} LaunchAgent has a malformed environment dictionary.` };
|
|
300
|
+
}
|
|
301
|
+
const contentsWithoutEnvironment = environmentMatches[0]?.[0] === undefined
|
|
302
|
+
? definition.contents
|
|
303
|
+
: definition.contents.replace(environmentMatches[0][0], "");
|
|
304
|
+
const workingDirectoryMatches = [...contentsWithoutEnvironment.matchAll(/<key>WorkingDirectory<\/key>\s*<string>([\s\S]*?)<\/string>/gu)];
|
|
305
|
+
const workingDirectoryKeyCount = [...contentsWithoutEnvironment.matchAll(/<key>WorkingDirectory<\/key>/gu)].length;
|
|
306
|
+
if (workingDirectoryMatches.length > 1 || workingDirectoryKeyCount !== workingDirectoryMatches.length) {
|
|
307
|
+
return { ok: false, message: `Installed ${definition.id} LaunchAgent has a malformed working directory.` };
|
|
308
|
+
}
|
|
309
|
+
const workingDirectory = workingDirectoryMatches[0]?.[1] === undefined
|
|
310
|
+
? null
|
|
311
|
+
: xmlUnescapeStrict(workingDirectoryMatches[0][1]);
|
|
312
|
+
if (workingDirectoryMatches.length === 1 && workingDirectory === undefined) {
|
|
313
|
+
return { ok: false, message: `Installed ${definition.id} LaunchAgent has a malformed working directory.` };
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
ok: true,
|
|
317
|
+
value: {
|
|
318
|
+
id: definition.id,
|
|
319
|
+
shell: shell.value,
|
|
320
|
+
environment,
|
|
321
|
+
workingDirectory: workingDirectory ?? null,
|
|
322
|
+
shellCommand: arguments_[3] ?? "",
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
function installedShell(executable) {
|
|
327
|
+
const name = posixPath.basename(executable).replace(/^-/, "");
|
|
328
|
+
if (name !== "bash" && name !== "zsh" && name !== "fish") {
|
|
329
|
+
return { ok: false, message: `Installed service definition uses unsupported login shell ${executable}.` };
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
ok: true,
|
|
333
|
+
value: { name, executable, source: "detected", detectedExecutable: executable },
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function parseSystemdExecArgument(value) {
|
|
337
|
+
const decoded = parseSystemdEscapedValue(value);
|
|
338
|
+
return decoded === undefined ? undefined : decodeSystemdSubstitutions(decoded, true);
|
|
339
|
+
}
|
|
340
|
+
function parseSystemdDirectiveValue(value) {
|
|
341
|
+
const decoded = parseSystemdEscapedValue(value);
|
|
342
|
+
return decoded === undefined ? undefined : decodeSystemdSubstitutions(decoded, false);
|
|
343
|
+
}
|
|
344
|
+
function parseSystemdEscapedValue(value) {
|
|
345
|
+
const quoted = value.startsWith('"') || value.endsWith('"');
|
|
346
|
+
if (quoted && (!value.startsWith('"') || !value.endsWith('"')))
|
|
347
|
+
return undefined;
|
|
348
|
+
return systemdUnescape(quoted ? value.slice(1, -1) : value);
|
|
349
|
+
}
|
|
350
|
+
function systemdUnescape(value) {
|
|
351
|
+
let result = "";
|
|
352
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
353
|
+
const character = value[index];
|
|
354
|
+
if (character !== "\\") {
|
|
355
|
+
result += character ?? "";
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
const escape = value[index + 1];
|
|
359
|
+
if (escape === undefined)
|
|
360
|
+
return undefined;
|
|
361
|
+
const simpleEscapes = {
|
|
362
|
+
"\\": "\\",
|
|
363
|
+
'"': '"',
|
|
364
|
+
"'": "'",
|
|
365
|
+
a: "\u0007",
|
|
366
|
+
b: "\b",
|
|
367
|
+
e: "\u001b",
|
|
368
|
+
f: "\f",
|
|
369
|
+
n: "\n",
|
|
370
|
+
r: "\r",
|
|
371
|
+
s: " ",
|
|
372
|
+
t: "\t",
|
|
373
|
+
v: "\v",
|
|
374
|
+
};
|
|
375
|
+
const simple = simpleEscapes[escape];
|
|
376
|
+
if (simple !== undefined) {
|
|
377
|
+
result += simple;
|
|
378
|
+
index += 1;
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
const length = escape === "x" ? 2 : escape === "u" ? 4 : escape === "U" ? 8 : 0;
|
|
382
|
+
if (length === 0)
|
|
383
|
+
return undefined;
|
|
384
|
+
const encoded = value.slice(index + 2, index + 2 + length);
|
|
385
|
+
if (encoded.length !== length || !new RegExp(`^[0-9a-fA-F]{${String(length)}}$`, "u").test(encoded))
|
|
386
|
+
return undefined;
|
|
387
|
+
const codePoint = Number.parseInt(encoded, 16);
|
|
388
|
+
if (codePoint === 0 || codePoint > 0x10ffff)
|
|
389
|
+
return undefined;
|
|
390
|
+
result += String.fromCodePoint(codePoint);
|
|
391
|
+
index += length + 1;
|
|
392
|
+
}
|
|
393
|
+
return result;
|
|
394
|
+
}
|
|
395
|
+
function decodeSystemdSubstitutions(value, decodeDollars) {
|
|
396
|
+
let result = "";
|
|
397
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
398
|
+
const character = value[index];
|
|
399
|
+
if (character !== "%" && !(decodeDollars && character === "$")) {
|
|
400
|
+
result += character ?? "";
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
if (value[index + 1] !== character)
|
|
404
|
+
return undefined;
|
|
405
|
+
result += character;
|
|
406
|
+
index += 1;
|
|
407
|
+
}
|
|
408
|
+
return result;
|
|
409
|
+
}
|
|
410
|
+
function parseSystemdShellCommand(shell, value) {
|
|
411
|
+
if (value.startsWith('"') || value.endsWith('"'))
|
|
412
|
+
return parseSystemdExecArgument(value);
|
|
413
|
+
if (!value.startsWith("'") || !value.endsWith("'"))
|
|
414
|
+
return undefined;
|
|
415
|
+
const inner = value.slice(1, -1);
|
|
416
|
+
const unquoted = shell === "fish" ? fishSingleQuoteUnescape(inner) : inner.replaceAll("'\\''", "'");
|
|
417
|
+
return decodeSystemdSubstitutions(unquoted, true);
|
|
418
|
+
}
|
|
419
|
+
function fishSingleQuoteUnescape(value) {
|
|
420
|
+
let result = "";
|
|
421
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
422
|
+
const character = value[index];
|
|
423
|
+
if (character === "\\" && index + 1 < value.length) {
|
|
424
|
+
result += value[index + 1] ?? "";
|
|
425
|
+
index += 1;
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
result += character ?? "";
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return result;
|
|
432
|
+
}
|
|
433
|
+
function parseXmlStringSequence(contents) {
|
|
434
|
+
const values = [];
|
|
435
|
+
let cursor = 0;
|
|
436
|
+
for (const match of contents.matchAll(/<string>([\s\S]*?)<\/string>/gu)) {
|
|
437
|
+
if (contents.slice(cursor, match.index).trim() !== "")
|
|
438
|
+
return undefined;
|
|
439
|
+
const value = xmlUnescapeStrict(match[1] ?? "");
|
|
440
|
+
if (value === undefined)
|
|
441
|
+
return undefined;
|
|
442
|
+
values.push(value);
|
|
443
|
+
cursor = match.index + match[0].length;
|
|
444
|
+
}
|
|
445
|
+
return contents.slice(cursor).trim() === "" ? values : undefined;
|
|
446
|
+
}
|
|
447
|
+
function parseXmlStringDictionary(contents) {
|
|
448
|
+
const values = {};
|
|
449
|
+
let cursor = 0;
|
|
450
|
+
for (const match of contents.matchAll(/<key>([\s\S]*?)<\/key>\s*<string>([\s\S]*?)<\/string>/gu)) {
|
|
451
|
+
if (contents.slice(cursor, match.index).trim() !== "")
|
|
452
|
+
return undefined;
|
|
453
|
+
const key = xmlUnescapeStrict(match[1] ?? "");
|
|
454
|
+
const value = xmlUnescapeStrict(match[2] ?? "");
|
|
455
|
+
if (key === undefined || value === undefined || Object.hasOwn(values, key))
|
|
456
|
+
return undefined;
|
|
457
|
+
values[key] = value;
|
|
458
|
+
cursor = match.index + match[0].length;
|
|
459
|
+
}
|
|
460
|
+
return contents.slice(cursor).trim() === "" ? values : undefined;
|
|
461
|
+
}
|
|
462
|
+
function xmlUnescapeStrict(value) {
|
|
463
|
+
if (/[<>]/u.test(value) || /&(?!(?:apos|quot|gt|lt|amp);)/u.test(value))
|
|
464
|
+
return undefined;
|
|
465
|
+
return value
|
|
466
|
+
.replaceAll("'", "'")
|
|
467
|
+
.replaceAll(""", '"')
|
|
468
|
+
.replaceAll(">", ">")
|
|
469
|
+
.replaceAll("<", "<")
|
|
470
|
+
.replaceAll("&", "&");
|
|
471
|
+
}
|
|
472
|
+
function recordsEqual(left, right) {
|
|
473
|
+
const leftEntries = Object.entries(left);
|
|
474
|
+
return leftEntries.length === Object.keys(right).length
|
|
475
|
+
&& leftEntries.every(([key, value]) => right[key] === value);
|
|
476
|
+
}
|
|
477
|
+
function impossibleMissingDefinition() {
|
|
478
|
+
throw new Error("Expected at least one installed native service definition");
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=serviceDoctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceDoctor.js","sourceRoot":"","sources":["../../src/nativeServices/serviceDoctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createDevelopmentNativeServicePlan, nativeServicePrerequisiteNeedsPathAdvice, resolveProductionNativeServicePlan, validateNativeServicePlan, } from "./servicePlan.js";
|
|
2
|
+
export function nativeServiceInstallFailureNeedsPathAdvice(failure) {
|
|
3
|
+
if (failure.kind === "plan-resolution") {
|
|
4
|
+
return failure.failures.every((item) => item.kind === "executable-unavailable")
|
|
5
|
+
&& failure.failures.length > 0;
|
|
6
|
+
}
|
|
7
|
+
return failure.failures.some((item) => item.kind === "prerequisite-unsatisfied"
|
|
8
|
+
&& nativeServicePrerequisiteNeedsPathAdvice(item.prerequisite));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Keeps preflight effects ahead of durable install effects. The authoritative
|
|
12
|
+
* probes may create bounded temporary artifacts, but they must clean those up
|
|
13
|
+
* before this function writes config or replaces existing services.
|
|
14
|
+
*/
|
|
15
|
+
export async function installNativeServiceCandidate(candidate, dependencies) {
|
|
16
|
+
let plan;
|
|
17
|
+
if (candidate.mode === "production") {
|
|
18
|
+
const resolution = await resolveProductionNativeServicePlan(candidate.input, dependencies);
|
|
19
|
+
if (!resolution.ok) {
|
|
20
|
+
return { ok: false, failure: { kind: "plan-resolution", failures: resolution.failures } };
|
|
21
|
+
}
|
|
22
|
+
plan = resolution.plan;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
plan = createDevelopmentNativeServicePlan(candidate.input);
|
|
26
|
+
}
|
|
27
|
+
const validation = await validateNativeServicePlan(plan, dependencies.probe);
|
|
28
|
+
if (!validation.ok) {
|
|
29
|
+
return { ok: false, failure: { kind: "plan-validation", failures: validation.failures } };
|
|
30
|
+
}
|
|
31
|
+
await dependencies.writeInitialConfig();
|
|
32
|
+
await dependencies.replaceServices(plan);
|
|
33
|
+
return { ok: true, plan };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=serviceInstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceInstall.js","sourceRoot":"","sources":["../../src/nativeServices/serviceInstall.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,wCAAwC,EACxC,kCAAkC,EAClC,yBAAyB,GAQ1B,MAAM,kBAAkB,CAAC;AAoB1B,MAAM,UAAU,0CAA0C,CAAC,OAAoC;IAC7F,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,wBAAwB,CAAC;eAC1E,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACpC,IAAI,CAAC,IAAI,KAAK,0BAA0B;WACrC,wCAAwC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,SAAwC,EACxC,YAA8C;IAE9C,IAAI,IAAuB,CAAC;IAC5B,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,MAAM,kCAAkC,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC3F,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC5F,CAAC;QACD,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,kCAAkC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7E,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC5F,CAAC;IAED,MAAM,YAAY,CAAC,kBAAkB,EAAE,CAAC;IACxC,MAAM,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
|