@c0sc0s/orbit 0.5.0
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 +38 -0
- package/assets/README.md +9 -0
- package/assets/app-icon.png +0 -0
- package/assets/icon.icns +0 -0
- package/assets/logo.png +0 -0
- package/dist/cdp/client.d.ts +33 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +159 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/expressions.d.ts +8 -0
- package/dist/cdp/expressions.d.ts.map +1 -0
- package/dist/cdp/expressions.js +27 -0
- package/dist/cdp/expressions.js.map +1 -0
- package/dist/cdp/target-registry.d.ts +33 -0
- package/dist/cdp/target-registry.d.ts.map +1 -0
- package/dist/cdp/target-registry.js +139 -0
- package/dist/cdp/target-registry.js.map +1 -0
- package/dist/cli/arguments.d.ts +13 -0
- package/dist/cli/arguments.d.ts.map +1 -0
- package/dist/cli/arguments.js +29 -0
- package/dist/cli/arguments.js.map +1 -0
- package/dist/cli/platform.d.ts +2 -0
- package/dist/cli/platform.d.ts.map +1 -0
- package/dist/cli/platform.js +68 -0
- package/dist/cli/platform.js.map +1 -0
- package/dist/cli/run.d.ts +2 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +148 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/manifest.d.ts +12 -0
- package/dist/config/manifest.d.ts.map +1 -0
- package/dist/config/manifest.js +71 -0
- package/dist/config/manifest.js.map +1 -0
- package/dist/host/daemon.d.ts +54 -0
- package/dist/host/daemon.d.ts.map +1 -0
- package/dist/host/daemon.js +185 -0
- package/dist/host/daemon.js.map +1 -0
- package/dist/host/plugin-host.d.ts +50 -0
- package/dist/host/plugin-host.d.ts.map +1 -0
- package/dist/host/plugin-host.js +230 -0
- package/dist/host/plugin-host.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/installation/entry.d.ts +2 -0
- package/dist/installation/entry.d.ts.map +1 -0
- package/dist/installation/entry.js +14 -0
- package/dist/installation/entry.js.map +1 -0
- package/dist/installation/files.d.ts +5 -0
- package/dist/installation/files.d.ts.map +1 -0
- package/dist/installation/files.js +101 -0
- package/dist/installation/files.js.map +1 -0
- package/dist/installation/legacy.d.ts +19 -0
- package/dist/installation/legacy.d.ts.map +1 -0
- package/dist/installation/legacy.js +52 -0
- package/dist/installation/legacy.js.map +1 -0
- package/dist/installation/lock.d.ts +2 -0
- package/dist/installation/lock.d.ts.map +1 -0
- package/dist/installation/lock.js +18 -0
- package/dist/installation/lock.js.map +1 -0
- package/dist/installation/manager.d.ts +180 -0
- package/dist/installation/manager.d.ts.map +1 -0
- package/dist/installation/manager.js +469 -0
- package/dist/installation/manager.js.map +1 -0
- package/dist/lifecycle/resource-scope.d.ts +11 -0
- package/dist/lifecycle/resource-scope.d.ts.map +1 -0
- package/dist/lifecycle/resource-scope.js +40 -0
- package/dist/lifecycle/resource-scope.js.map +1 -0
- package/dist/platform/codex-process.d.ts +33 -0
- package/dist/platform/codex-process.d.ts.map +1 -0
- package/dist/platform/codex-process.js +122 -0
- package/dist/platform/codex-process.js.map +1 -0
- package/dist/platform/launcher.d.ts +12 -0
- package/dist/platform/launcher.d.ts.map +1 -0
- package/dist/platform/launcher.js +46 -0
- package/dist/platform/launcher.js.map +1 -0
- package/dist/plugins/codex-extension.d.ts +12 -0
- package/dist/plugins/codex-extension.d.ts.map +1 -0
- package/dist/plugins/codex-extension.js +100 -0
- package/dist/plugins/codex-extension.js.map +1 -0
- package/dist/plugins/manifest.d.ts +20 -0
- package/dist/plugins/manifest.d.ts.map +1 -0
- package/dist/plugins/manifest.js +51 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/registry.d.ts +3 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +26 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/protocol/ipc.d.ts +38 -0
- package/dist/protocol/ipc.d.ts.map +1 -0
- package/dist/protocol/ipc.js +5 -0
- package/dist/protocol/ipc.js.map +1 -0
- package/dist/protocol/types.d.ts +55 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/renderer/loader.d.ts +32 -0
- package/dist/renderer/loader.d.ts.map +1 -0
- package/dist/renderer/loader.js +130 -0
- package/dist/renderer/loader.js.map +1 -0
- package/dist/renderer/transport.d.ts +28 -0
- package/dist/renderer/transport.d.ts.map +1 -0
- package/dist/renderer/transport.js +89 -0
- package/dist/renderer/transport.js.map +1 -0
- package/dist/sdk/contracts.d.ts +50 -0
- package/dist/sdk/contracts.d.ts.map +1 -0
- package/dist/sdk/contracts.js +2 -0
- package/dist/sdk/contracts.js.map +1 -0
- package/dist/service/module.d.ts +24 -0
- package/dist/service/module.d.ts.map +1 -0
- package/dist/service/module.js +97 -0
- package/dist/service/module.js.map +1 -0
- package/dist/service/process.d.ts +32 -0
- package/dist/service/process.d.ts.map +1 -0
- package/dist/service/process.js +95 -0
- package/dist/service/process.js.map +1 -0
- package/dist/service/worker.d.ts +2 -0
- package/dist/service/worker.d.ts.map +1 -0
- package/dist/service/worker.js +116 -0
- package/dist/service/worker.js.map +1 -0
- package/examples/hello.js +10 -0
- package/examples/loader.json +4 -0
- package/examples/service-loader.json +4 -0
- package/examples/service.js +10 -0
- package/examples/service.mjs +3 -0
- package/package.json +40 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createInstallationManager, resolvePluginId } from "../installation/manager.js";
|
|
2
|
+
export async function runPlatformCli(argv) {
|
|
3
|
+
if (argv.includes("--config"))
|
|
4
|
+
return false;
|
|
5
|
+
const [command = "--help", subcommand, argument, ...rest] = argv;
|
|
6
|
+
if (["--help", "-h"].includes(command)) {
|
|
7
|
+
console.log("Orbit platform\n install | start | status | doctor | update | rollback\n plugin add <built-directory> | install <package> | list\n plugin enable <id> | disable <id> | uninstall <id> [--purge] | update <id>\nAdvanced Loader: start|apply|watch|status|remove|stop --config <local.json>");
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
if (!["install", "start", "status", "doctor", "update", "rollback", "migrate", "plugin"].includes(command))
|
|
11
|
+
return false;
|
|
12
|
+
const manager = createInstallationManager();
|
|
13
|
+
let result;
|
|
14
|
+
if (command === "migrate") {
|
|
15
|
+
if (!subcommand || argument || rest.length)
|
|
16
|
+
throw new Error("Usage: orbit migrate <legacy-directory>");
|
|
17
|
+
result = await manager.migrateLegacy(subcommand);
|
|
18
|
+
}
|
|
19
|
+
else if (command !== "plugin") {
|
|
20
|
+
if (argv.length > 1)
|
|
21
|
+
throw new Error("Unexpected platform command arguments; use ORBIT_HOME to select an installation");
|
|
22
|
+
if (command === "install")
|
|
23
|
+
result = await manager.install();
|
|
24
|
+
else if (command === "start")
|
|
25
|
+
result = await manager.start();
|
|
26
|
+
else if (command === "update")
|
|
27
|
+
result = await manager.updatePackage();
|
|
28
|
+
else if (command === "rollback")
|
|
29
|
+
result = await manager.rollback();
|
|
30
|
+
else
|
|
31
|
+
result = command === "doctor" ? await manager.doctor() : await manager.status();
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
if (!subcommand ||
|
|
35
|
+
!["add", "install", "list", "enable", "disable", "uninstall", "update"].includes(subcommand))
|
|
36
|
+
throw new Error("Unknown plugin command");
|
|
37
|
+
if (subcommand === "list") {
|
|
38
|
+
if (argument || rest.length)
|
|
39
|
+
throw new Error("Unexpected plugin list arguments");
|
|
40
|
+
result = (await manager.status()).plugins ?? [];
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
if (!argument ||
|
|
44
|
+
argument.startsWith("--") ||
|
|
45
|
+
(rest.length && !(subcommand === "uninstall" && rest.length === 1 && rest[0] === "--purge")))
|
|
46
|
+
throw new Error("Invalid plugin arguments");
|
|
47
|
+
if (subcommand === "add")
|
|
48
|
+
result = await manager.addPlugin(argument);
|
|
49
|
+
else if (subcommand === "install")
|
|
50
|
+
result = await manager.installPackage(argument);
|
|
51
|
+
else if (subcommand === "enable" || subcommand === "disable")
|
|
52
|
+
result = await manager.setEnabled(argument, subcommand === "enable");
|
|
53
|
+
else if (subcommand === "uninstall")
|
|
54
|
+
result = await manager.uninstallPlugin(argument, rest.includes("--purge"));
|
|
55
|
+
else {
|
|
56
|
+
const config = await manager.read();
|
|
57
|
+
const id = resolvePluginId(config, argument);
|
|
58
|
+
const plugin = config.orbit.packages[id];
|
|
59
|
+
if (!plugin)
|
|
60
|
+
throw new Error(`Unknown plugin ${argument}`);
|
|
61
|
+
result = await manager.installPackage(`${plugin.packageName}@latest`, id);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.log(JSON.stringify(result, null, 2));
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/cli/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAYA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,iBA0G1C"}
|
package/dist/cli/run.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { realpath } from "node:fs/promises";
|
|
2
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
3
|
+
import { CodexProcess, findCodexApp } from "../platform/codex-process.js";
|
|
4
|
+
import { PluginTargetRegistry } from "../cdp/target-registry.js";
|
|
5
|
+
import { PluginHost } from "../host/plugin-host.js";
|
|
6
|
+
import { readManifest, readPlugins, setPluginEnabled } from "../config/manifest.js";
|
|
7
|
+
import { acquireOwner, claimOwner, daemonPaths, daemonStatus, releaseOwner, startDaemon, stopDaemon, readHostStatus, writeHostStatus } from "../host/daemon.js";
|
|
8
|
+
import { parseArguments } from "./arguments.js";
|
|
9
|
+
export async function runCli(argv) {
|
|
10
|
+
const { command, options } = parseArguments(argv);
|
|
11
|
+
if (command === "--help") {
|
|
12
|
+
console.log("Usage: orbit <start|apply|watch|status|remove|stop> --config <local.json> [--port <9341>] [--attach]\nstart runs the Loader in the background; --attach prevents app launch. watch attaches in the foreground. apply injects renderer-only bundles once. stop/remove unload configured modules. status never imports modules.");
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
let registry;
|
|
16
|
+
try {
|
|
17
|
+
const manifest = ["status", "stop"].includes(command)
|
|
18
|
+
? { path: await realpath(options["--config"]), root: "", plugins: [] }
|
|
19
|
+
: await readManifest(options["--config"]);
|
|
20
|
+
const port = Number(options["--port"] ?? 9341);
|
|
21
|
+
const app = new CodexProcess({ port });
|
|
22
|
+
const paths = daemonPaths(manifest.path, port);
|
|
23
|
+
registry = new PluginTargetRegistry({ port, ownsEndpoint: () => app.ownsCdpEndpoint(), owner: paths.owner });
|
|
24
|
+
if (command === "start") {
|
|
25
|
+
if (!findCodexApp())
|
|
26
|
+
throw new Error("Install the official Codex desktop app first");
|
|
27
|
+
if (!(await app.cdpIsReady(() => registry.discover()))) {
|
|
28
|
+
if (await app.ownsCdpEndpoint() || await app.hasCdpLaunchArguments())
|
|
29
|
+
await app.waitForCdp(() => registry.discover());
|
|
30
|
+
else {
|
|
31
|
+
if (options["--attach"])
|
|
32
|
+
throw new Error("An already debug-enabled Codex is required");
|
|
33
|
+
if (await app.portIsListening())
|
|
34
|
+
throw new Error("The CDP port is already occupied");
|
|
35
|
+
await app.launchWithCdp(() => registry.discover());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const result = await startDaemon({ configPath: manifest.path, port, paths });
|
|
39
|
+
console.log(JSON.stringify(result));
|
|
40
|
+
if (result.results?.some((item) => item.error))
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
}
|
|
43
|
+
else if (command === "status") {
|
|
44
|
+
const windows = [];
|
|
45
|
+
if (await app.ownsCdpEndpoint()) {
|
|
46
|
+
for (const target of await registry.discover())
|
|
47
|
+
windows.push({ targetId: target.id, plugins: await registry.evaluate(target, "window.__codexPluginLoader?.status() ?? []") });
|
|
48
|
+
}
|
|
49
|
+
console.log(JSON.stringify({ daemon: await daemonStatus(paths), modules: await readHostStatus(paths), windows }));
|
|
50
|
+
}
|
|
51
|
+
else if (command === "remove" || command === "stop") {
|
|
52
|
+
const selectedId = options["--plugin"];
|
|
53
|
+
if (selectedId) {
|
|
54
|
+
await setPluginEnabled(manifest.path, selectedId, false);
|
|
55
|
+
if ((await daemonStatus(paths)).running) {
|
|
56
|
+
const deadline = Date.now() + 15_000;
|
|
57
|
+
while (true) {
|
|
58
|
+
const modules = await readHostStatus(paths);
|
|
59
|
+
const state = modules?.find((module) => module.id === selectedId);
|
|
60
|
+
if (modules && !state)
|
|
61
|
+
break;
|
|
62
|
+
if (state?.state === "cleanup-failed")
|
|
63
|
+
throw new Error("Module cleanup failed; other modules remain active");
|
|
64
|
+
if (!(await daemonStatus(paths)).running)
|
|
65
|
+
break;
|
|
66
|
+
if (Date.now() >= deadline)
|
|
67
|
+
throw new Error("Module removal did not complete; configuration is disabled");
|
|
68
|
+
await delay(100);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (await app.ownsCdpEndpoint())
|
|
72
|
+
await registry.removePlugins([selectedId]);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
await stopDaemon(paths);
|
|
76
|
+
if (await app.ownsCdpEndpoint())
|
|
77
|
+
await registry.removePlugins(manifest.plugins.map(({ id }) => id));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (command === "apply") {
|
|
81
|
+
const { results } = await registry.ensurePlugins(await readPlugins(manifest.path, paths.owner));
|
|
82
|
+
console.log(JSON.stringify(results));
|
|
83
|
+
if (results.some((result) => result.error))
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const token = options["--token"] ?? await acquireOwner(paths);
|
|
88
|
+
await claimOwner(paths, token);
|
|
89
|
+
const stop = new AbortController();
|
|
90
|
+
const onStop = () => stop.abort();
|
|
91
|
+
process.once("SIGINT", onStop);
|
|
92
|
+
process.once("SIGTERM", onStop);
|
|
93
|
+
const host = new PluginHost({ registry, manifest });
|
|
94
|
+
let previous = "";
|
|
95
|
+
let publishedModules = "";
|
|
96
|
+
const publish = async () => {
|
|
97
|
+
const modules = host.status();
|
|
98
|
+
const signature = JSON.stringify(modules);
|
|
99
|
+
if (signature === publishedModules)
|
|
100
|
+
return;
|
|
101
|
+
await writeHostStatus(paths, token, modules);
|
|
102
|
+
publishedModules = signature;
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
await host.start();
|
|
106
|
+
const initial = await host.sync();
|
|
107
|
+
await publish();
|
|
108
|
+
await claimOwner(paths, token, "running");
|
|
109
|
+
process.send?.({ type: "ready", result: initial });
|
|
110
|
+
while (!stop.signal.aborted) {
|
|
111
|
+
let results;
|
|
112
|
+
try {
|
|
113
|
+
results = await host.sync();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
if (!(await app.isRunning()))
|
|
117
|
+
break;
|
|
118
|
+
results = [{ pluginId: null, stage: "discovery", error: "Waiting for an owned Codex renderer" }];
|
|
119
|
+
}
|
|
120
|
+
await publish();
|
|
121
|
+
const state = JSON.stringify(results.map(({ targetId, pluginId, stage, error }) => ({ targetId, pluginId, stage, error })));
|
|
122
|
+
if (state !== previous) {
|
|
123
|
+
console.log(state);
|
|
124
|
+
previous = state;
|
|
125
|
+
}
|
|
126
|
+
await delay(1000, undefined, { signal: stop.signal }).catch(() => { });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
const failures = await host.close();
|
|
131
|
+
if (failures.length && await app.ownsCdpEndpoint())
|
|
132
|
+
console.error(JSON.stringify({ cleanup: failures }));
|
|
133
|
+
await releaseOwner(paths, token);
|
|
134
|
+
process.removeListener("SIGINT", onStop);
|
|
135
|
+
process.removeListener("SIGTERM", onStop);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
console.error(error instanceof Error ? error.message : "Orbit command failed");
|
|
141
|
+
process.exitCode = 1;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
registry?.close();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runCli } from "./cli/run.js";
|
|
3
|
+
import { runPlatformCli } from "./cli/platform.js";
|
|
4
|
+
process.umask(0o077);
|
|
5
|
+
Promise.resolve().then(async () => {
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
if (!(await runPlatformCli(args)))
|
|
8
|
+
await runCli(args);
|
|
9
|
+
}).catch((error) => {
|
|
10
|
+
console.error(error instanceof Error ? error.message : "Orbit command failed");
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAAE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LoaderManifest } from "../protocol/types.js";
|
|
2
|
+
/** Reads identities without touching executable entries, so status/removal survives a missing bundle. */
|
|
3
|
+
export declare function readManifest(configPath: string): Promise<LoaderManifest>;
|
|
4
|
+
export declare function resolvePluginEntry(root: string, entry: string): Promise<string>;
|
|
5
|
+
export declare function readPlugins(configPath: string, owner?: string | null): Promise<{
|
|
6
|
+
id: string;
|
|
7
|
+
version: string;
|
|
8
|
+
expression: string;
|
|
9
|
+
}[]>;
|
|
10
|
+
/** Changes only the selected module, serializing writers and preserving other configuration. */
|
|
11
|
+
export declare function setPluginEnabled(configPath: string, id: string, enabled: boolean): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/config/manifest.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,yGAAyG;AACzG,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiB9E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,mBAKnE;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,IAAW;;;;KAOhF;AAED,gGAAgG;AAChG,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,iBAetF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFile, realpath, open, rename, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { buildPluginExpression } from "../cdp/expressions.js";
|
|
4
|
+
/** Reads identities without touching executable entries, so status/removal survives a missing bundle. */
|
|
5
|
+
export async function readManifest(configPath) {
|
|
6
|
+
const path = await realpath(configPath);
|
|
7
|
+
const manifest = JSON.parse(await readFile(path, "utf8"));
|
|
8
|
+
if (manifest?.apiVersion !== 1 || !Array.isArray(manifest.plugins))
|
|
9
|
+
throw new Error("Expected loader config apiVersion 1 and plugins array");
|
|
10
|
+
const ids = new Set();
|
|
11
|
+
for (const plugin of manifest.plugins) {
|
|
12
|
+
if (!plugin || typeof plugin.id !== "string" || !/^[a-z][a-z0-9.-]{0,63}$/.test(plugin.id) || ids.has(plugin.id))
|
|
13
|
+
throw new Error("Invalid or duplicate plugin ID");
|
|
14
|
+
const entry = plugin.entry;
|
|
15
|
+
if (typeof entry !== "string" || !entry || isAbsolute(entry) || plugin.host !== undefined)
|
|
16
|
+
throw new Error("Specify a local renderer entry");
|
|
17
|
+
if ((typeof plugin.version !== "string" || !plugin.version))
|
|
18
|
+
throw new Error("Renderer version is required");
|
|
19
|
+
if (plugin.service !== undefined && (typeof plugin.service !== "string" || !plugin.service || isAbsolute(plugin.service)))
|
|
20
|
+
throw new Error("Invalid local service entry");
|
|
21
|
+
if (plugin.config !== undefined && (!plugin.config || typeof plugin.config !== "object" || Array.isArray(plugin.config)))
|
|
22
|
+
throw new Error("config must be an object");
|
|
23
|
+
if (plugin.apiVersion !== undefined && plugin.apiVersion !== 1)
|
|
24
|
+
throw new Error("Unsupported plugin apiVersion");
|
|
25
|
+
if (plugin.enabled !== undefined && typeof plugin.enabled !== "boolean")
|
|
26
|
+
throw new Error("enabled must be a boolean");
|
|
27
|
+
ids.add(plugin.id);
|
|
28
|
+
}
|
|
29
|
+
return { path, root: dirname(path), plugins: manifest.plugins };
|
|
30
|
+
}
|
|
31
|
+
export async function resolvePluginEntry(root, entry) {
|
|
32
|
+
const path = await realpath(resolve(root, entry));
|
|
33
|
+
const local = relative(root, path);
|
|
34
|
+
if (local === ".." || local.startsWith("../") || isAbsolute(local))
|
|
35
|
+
throw new Error("Plugin entry must stay inside the config directory");
|
|
36
|
+
return path;
|
|
37
|
+
}
|
|
38
|
+
export async function readPlugins(configPath, owner = null) {
|
|
39
|
+
const manifest = await readManifest(configPath);
|
|
40
|
+
return Promise.all(manifest.plugins.filter((plugin) => plugin.enabled !== false).map(async (plugin) => {
|
|
41
|
+
if (plugin.service)
|
|
42
|
+
throw new Error("Service modules require start/watch; apply only supports renderer bundles");
|
|
43
|
+
const source = await readFile(await resolvePluginEntry(manifest.root, plugin.entry), "utf8");
|
|
44
|
+
return { id: plugin.id, version: plugin.version, expression: buildPluginExpression({ ...plugin, source, owner }) };
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
/** Changes only the selected module, serializing writers and preserving other configuration. */
|
|
48
|
+
export async function setPluginEnabled(configPath, id, enabled) {
|
|
49
|
+
const path = await realpath(configPath);
|
|
50
|
+
const lockPath = `${path}.lock`;
|
|
51
|
+
const lock = await open(lockPath, "wx", 0o600);
|
|
52
|
+
const next = `${path}.next-${process.pid}`;
|
|
53
|
+
try {
|
|
54
|
+
await readManifest(path);
|
|
55
|
+
const config = JSON.parse(await readFile(path, "utf8"));
|
|
56
|
+
if (config.orbit)
|
|
57
|
+
throw new Error("Use Orbit plugin commands to change managed platform configuration");
|
|
58
|
+
const plugin = config.plugins.find((entry) => entry.id === id);
|
|
59
|
+
if (!plugin)
|
|
60
|
+
throw new Error(`Unknown module ${id}`);
|
|
61
|
+
plugin.enabled = enabled;
|
|
62
|
+
await writeFile(next, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
|
|
63
|
+
await rename(next, path);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
await lock.close();
|
|
67
|
+
await rm(lockPath, { force: true });
|
|
68
|
+
await rm(next, { force: true });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/config/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { PluginResult } from "../protocol/types.js";
|
|
2
|
+
export type DaemonPaths = ReturnType<typeof daemonPaths>;
|
|
3
|
+
interface OwnerRecord {
|
|
4
|
+
pid: number;
|
|
5
|
+
token: string;
|
|
6
|
+
phase: string;
|
|
7
|
+
scriptPath: string;
|
|
8
|
+
command: string;
|
|
9
|
+
}
|
|
10
|
+
interface HostStatus {
|
|
11
|
+
id: string;
|
|
12
|
+
state: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function daemonPaths(configPath: string, port: number): {
|
|
15
|
+
owner: string;
|
|
16
|
+
root: string;
|
|
17
|
+
lease: string;
|
|
18
|
+
log: string;
|
|
19
|
+
status: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function readOwner(paths: DaemonPaths): Promise<OwnerRecord | null>;
|
|
22
|
+
export declare function daemonStatus(paths: DaemonPaths, expectedCli?: string): Promise<{
|
|
23
|
+
running: boolean;
|
|
24
|
+
pid: null;
|
|
25
|
+
conflict?: undefined;
|
|
26
|
+
phase?: undefined;
|
|
27
|
+
} | {
|
|
28
|
+
running: boolean;
|
|
29
|
+
pid: number | null;
|
|
30
|
+
conflict: boolean;
|
|
31
|
+
phase: string;
|
|
32
|
+
}>;
|
|
33
|
+
/** Exclusive ownership refuses live conflicts and reports stale leases without racing their replacement. */
|
|
34
|
+
export declare function acquireOwner(paths: DaemonPaths): Promise<`${string}-${string}-${string}-${string}-${string}`>;
|
|
35
|
+
export declare function claimOwner(paths: DaemonPaths, token: string, phase?: string): Promise<void>;
|
|
36
|
+
export declare function releaseOwner(paths: DaemonPaths, token: string): Promise<void>;
|
|
37
|
+
export declare function startDaemon({ configPath, port, paths }: {
|
|
38
|
+
configPath: string;
|
|
39
|
+
port: number;
|
|
40
|
+
paths: DaemonPaths;
|
|
41
|
+
}): Promise<{
|
|
42
|
+
status: string;
|
|
43
|
+
pid: number | null;
|
|
44
|
+
results?: undefined;
|
|
45
|
+
} | {
|
|
46
|
+
status: string;
|
|
47
|
+
pid: number | undefined;
|
|
48
|
+
results: PluginResult[];
|
|
49
|
+
}>;
|
|
50
|
+
export declare function stopDaemon(paths: DaemonPaths): Promise<void>;
|
|
51
|
+
export declare function writeHostStatus(paths: DaemonPaths, token: string, modules: HostStatus[]): Promise<void>;
|
|
52
|
+
export declare function readHostStatus(paths: DaemonPaths): Promise<HostStatus[] | null>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/host/daemon.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AACzD,UAAU,WAAW;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACxG,UAAU,UAAU;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAIlD,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;EAI3D;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAU/E;AAOD,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,SAAU;;;;;;;;;;GAS3E;AAED,4GAA4G;AAC5G,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,gEAgBpD;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAa,iBAKrF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAEnE;AAED,wBAAsB,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE;;;;;;;;GA2CtH;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,iBAWlD;AAGD,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,iBAK7F;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAOrF"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { execFile, fork } from "node:child_process";
|
|
2
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
3
|
+
import { lstat, mkdir, open, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
8
|
+
const run = promisify(execFile);
|
|
9
|
+
const cliPath = fileURLToPath(new URL("../cli.js", import.meta.url));
|
|
10
|
+
export function daemonPaths(configPath, port) {
|
|
11
|
+
const owner = createHash("sha256").update(`${resolve(configPath)}:${port}`).digest("hex").slice(0, 24);
|
|
12
|
+
const root = join(dirname(configPath), `.loader-${owner}`);
|
|
13
|
+
return { owner, root, lease: join(root, "owner.json"), log: join(root, "loader.log"), status: join(root, "status.json") };
|
|
14
|
+
}
|
|
15
|
+
export async function readOwner(paths) {
|
|
16
|
+
try {
|
|
17
|
+
if ((await lstat(paths.lease)).isSymbolicLink())
|
|
18
|
+
throw new Error("Loader ownership file must not be a symlink");
|
|
19
|
+
const record = JSON.parse(await readFile(paths.lease, "utf8"));
|
|
20
|
+
if (!Number.isSafeInteger(record?.pid) || record.pid <= 0 || typeof record.token !== "string")
|
|
21
|
+
throw new Error("Invalid Loader ownership record");
|
|
22
|
+
return record;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
26
|
+
return null;
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function isAlive(pid) {
|
|
31
|
+
try {
|
|
32
|
+
process.kill(pid, 0);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error instanceof Error && "code" in error && error.code === "ESRCH")
|
|
37
|
+
return false;
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function daemonStatus(paths, expectedCli = cliPath) {
|
|
42
|
+
const record = await readOwner(paths);
|
|
43
|
+
if (!record || !isAlive(record.pid))
|
|
44
|
+
return { running: false, pid: null };
|
|
45
|
+
let stdout;
|
|
46
|
+
try {
|
|
47
|
+
({ stdout } = await run("/bin/ps", ["-p", String(record.pid), "-o", "command="]));
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (!isAlive(record.pid))
|
|
51
|
+
return { running: false, pid: null };
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
const owned = record.scriptPath === expectedCli && typeof record.command === "string"
|
|
55
|
+
&& record.command.startsWith(`${expectedCli} `) && stdout.trim().endsWith(record.command);
|
|
56
|
+
return { running: owned, pid: owned ? record.pid : null, conflict: !owned, phase: record.phase };
|
|
57
|
+
}
|
|
58
|
+
/** Exclusive ownership refuses live conflicts and reports stale leases without racing their replacement. */
|
|
59
|
+
export async function acquireOwner(paths) {
|
|
60
|
+
await mkdir(paths.root, { recursive: true, mode: 0o700 });
|
|
61
|
+
if ((await lstat(paths.root)).isSymbolicLink())
|
|
62
|
+
throw new Error("Loader state directory must not be a symlink");
|
|
63
|
+
const token = randomUUID();
|
|
64
|
+
let handle;
|
|
65
|
+
try {
|
|
66
|
+
handle = await open(paths.lease, "wx", 0o600);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (!(error instanceof Error && "code" in error && error.code === "EEXIST"))
|
|
70
|
+
throw error;
|
|
71
|
+
const previous = await readOwner(paths);
|
|
72
|
+
if (!previous || isAlive(previous.pid))
|
|
73
|
+
throw new Error("A Loader for this configuration is already running or starting");
|
|
74
|
+
throw new Error(`Stale Loader ownership file: ${paths.lease}. After confirming that process ${previous.pid} has exited, remove only that file and retry.`);
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
await handle.writeFile(JSON.stringify({ pid: process.pid, token, phase: "starting", scriptPath: cliPath, command: process.argv.slice(1).join(" ") }));
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
await handle.close();
|
|
81
|
+
}
|
|
82
|
+
return token;
|
|
83
|
+
}
|
|
84
|
+
export async function claimOwner(paths, token, phase = "starting") {
|
|
85
|
+
if ((await readOwner(paths))?.token !== token)
|
|
86
|
+
throw new Error("Loader startup ownership changed");
|
|
87
|
+
const next = `${paths.lease}.${token}`;
|
|
88
|
+
await writeFile(next, JSON.stringify({ pid: process.pid, token, phase, scriptPath: cliPath, command: process.argv.slice(1).join(" ") }), { mode: 0o600 });
|
|
89
|
+
await rename(next, paths.lease);
|
|
90
|
+
}
|
|
91
|
+
export async function releaseOwner(paths, token) {
|
|
92
|
+
if ((await readOwner(paths))?.token === token)
|
|
93
|
+
await rm(paths.lease, { force: true });
|
|
94
|
+
}
|
|
95
|
+
export async function startDaemon({ configPath, port, paths }) {
|
|
96
|
+
const status = await daemonStatus(paths);
|
|
97
|
+
if (status.running && status.phase === "running")
|
|
98
|
+
return { status: "already-running", pid: status.pid };
|
|
99
|
+
const token = await acquireOwner(paths);
|
|
100
|
+
let log;
|
|
101
|
+
let child;
|
|
102
|
+
try {
|
|
103
|
+
log = await open(paths.log, "a", 0o600);
|
|
104
|
+
child = fork(cliPath, ["watch", "--config", configPath, "--port", String(port), "--token", token], {
|
|
105
|
+
detached: true, stdio: ["ignore", log.fd, log.fd, "ipc"],
|
|
106
|
+
});
|
|
107
|
+
const launched = child;
|
|
108
|
+
const result = await new Promise((resolveReady, reject) => {
|
|
109
|
+
const timer = setTimeout(() => done(new Error("Loader startup timed out; see loader.log")), 30_000);
|
|
110
|
+
const done = (error, value = []) => {
|
|
111
|
+
clearTimeout(timer);
|
|
112
|
+
launched.removeListener("error", onError);
|
|
113
|
+
launched.removeListener("exit", onExit);
|
|
114
|
+
launched.removeListener("message", onMessage);
|
|
115
|
+
if (error)
|
|
116
|
+
reject(error);
|
|
117
|
+
else
|
|
118
|
+
resolveReady(value);
|
|
119
|
+
};
|
|
120
|
+
const onError = () => done(new Error("Loader process could not start"));
|
|
121
|
+
const onExit = () => done(new Error("Loader exited before readiness; see loader.log"));
|
|
122
|
+
const onMessage = (value) => { const message = value; if (message?.type === "ready")
|
|
123
|
+
done(null, message.result); };
|
|
124
|
+
launched.once("error", onError);
|
|
125
|
+
launched.once("exit", onExit);
|
|
126
|
+
launched.on("message", onMessage);
|
|
127
|
+
});
|
|
128
|
+
child.disconnect();
|
|
129
|
+
child.unref();
|
|
130
|
+
return { status: "running", pid: child.pid, results: result };
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (child?.pid) {
|
|
134
|
+
child.kill("SIGTERM");
|
|
135
|
+
// Keep ownership until the child exits, so a retry cannot overlap its cleanup.
|
|
136
|
+
if (child.exitCode === null && child.signalCode === null)
|
|
137
|
+
await new Promise((resolveExit) => {
|
|
138
|
+
const timer = setTimeout(() => child?.kill("SIGKILL"), 5000);
|
|
139
|
+
child?.once("exit", () => { clearTimeout(timer); resolveExit(); });
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
await releaseOwner(paths, token);
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
await log?.close();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function stopDaemon(paths) {
|
|
150
|
+
const status = await daemonStatus(paths);
|
|
151
|
+
if (status.conflict)
|
|
152
|
+
throw new Error("Loader ownership conflicts with another live process; it was not stopped");
|
|
153
|
+
if (!status.running || !status.pid)
|
|
154
|
+
return;
|
|
155
|
+
process.kill(status.pid, "SIGTERM");
|
|
156
|
+
const deadline = Date.now() + 20_000;
|
|
157
|
+
while (Date.now() < deadline) {
|
|
158
|
+
if (!(await daemonStatus(paths)).running)
|
|
159
|
+
return;
|
|
160
|
+
await delay(50);
|
|
161
|
+
}
|
|
162
|
+
throw new Error("Loader did not stop; no files were replaced");
|
|
163
|
+
}
|
|
164
|
+
export async function writeHostStatus(paths, token, modules) {
|
|
165
|
+
if ((await readOwner(paths))?.token !== token)
|
|
166
|
+
throw new Error("Loader status ownership changed");
|
|
167
|
+
const next = `${paths.status}.${token}`;
|
|
168
|
+
await writeFile(next, JSON.stringify({ token, modules }), { mode: 0o600 });
|
|
169
|
+
await rename(next, paths.status);
|
|
170
|
+
}
|
|
171
|
+
export async function readHostStatus(paths) {
|
|
172
|
+
const owner = await readOwner(paths);
|
|
173
|
+
if (!owner)
|
|
174
|
+
return null;
|
|
175
|
+
try {
|
|
176
|
+
const status = JSON.parse(await readFile(paths.status, "utf8"));
|
|
177
|
+
return status.token === owner.token ? status.modules : null;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
181
|
+
return null;
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/host/daemon.ts"],"names":[],"mappings":"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"}
|