@geohar/un-bien 0.7.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/LICENSE +21 -0
- package/README.md +726 -0
- package/dist/actions/handlers.d.ts +77 -0
- package/dist/actions/handlers.js +26 -0
- package/dist/actions/handlers.js.map +1 -0
- package/dist/actions/registry.d.ts +39 -0
- package/dist/actions/registry.js +62 -0
- package/dist/actions/registry.js.map +1 -0
- package/dist/bin/supervisord.d.ts +2 -0
- package/dist/bin/supervisord.js +86 -0
- package/dist/bin/supervisord.js.map +1 -0
- package/dist/config.d.ts +84 -0
- package/dist/config.js +115 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/client.d.ts +20 -0
- package/dist/daemon/client.js +131 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/control_protocol.d.ts +176 -0
- package/dist/daemon/control_protocol.js +63 -0
- package/dist/daemon/control_protocol.js.map +1 -0
- package/dist/daemon/cron_log.d.ts +45 -0
- package/dist/daemon/cron_log.js +71 -0
- package/dist/daemon/cron_log.js.map +1 -0
- package/dist/daemon/cron_registry.d.ts +80 -0
- package/dist/daemon/cron_registry.js +198 -0
- package/dist/daemon/cron_registry.js.map +1 -0
- package/dist/daemon/id.d.ts +24 -0
- package/dist/daemon/id.js +36 -0
- package/dist/daemon/id.js.map +1 -0
- package/dist/daemon/install.d.ts +170 -0
- package/dist/daemon/install.js +603 -0
- package/dist/daemon/install.js.map +1 -0
- package/dist/daemon/registry.d.ts +63 -0
- package/dist/daemon/registry.js +153 -0
- package/dist/daemon/registry.js.map +1 -0
- package/dist/daemon/rpc_child.d.ts +194 -0
- package/dist/daemon/rpc_child.js +419 -0
- package/dist/daemon/rpc_child.js.map +1 -0
- package/dist/daemon/supervisor.d.ts +93 -0
- package/dist/daemon/supervisor.js +666 -0
- package/dist/daemon/supervisor.js.map +1 -0
- package/dist/extension_ui_bridge.d.ts +26 -0
- package/dist/extension_ui_bridge.js +341 -0
- package/dist/extension_ui_bridge.js.map +1 -0
- package/dist/index.d.ts +197 -0
- package/dist/index.js +5750 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/mesh_result.d.ts +10 -0
- package/dist/mcp/mesh_result.js +42 -0
- package/dist/mcp/mesh_result.js.map +1 -0
- package/dist/mcp/mesh_server.d.ts +16 -0
- package/dist/mcp/mesh_server.js +373 -0
- package/dist/mcp/mesh_server.js.map +1 -0
- package/dist/mesh/canonical.d.ts +30 -0
- package/dist/mesh/canonical.js +63 -0
- package/dist/mesh/canonical.js.map +1 -0
- package/dist/mesh/client.d.ts +18 -0
- package/dist/mesh/client.js +127 -0
- package/dist/mesh/client.js.map +1 -0
- package/dist/mesh/encoding.d.ts +38 -0
- package/dist/mesh/encoding.js +217 -0
- package/dist/mesh/encoding.js.map +1 -0
- package/dist/mesh/self_revoke.d.ts +73 -0
- package/dist/mesh/self_revoke.js +407 -0
- package/dist/mesh/self_revoke.js.map +1 -0
- package/dist/mesh/siblings.d.ts +49 -0
- package/dist/mesh/siblings.js +159 -0
- package/dist/mesh/siblings.js.map +1 -0
- package/dist/mesh/types.d.ts +34 -0
- package/dist/mesh/types.js +11 -0
- package/dist/mesh/types.js.map +1 -0
- package/dist/mesh/verify.d.ts +17 -0
- package/dist/mesh/verify.js +86 -0
- package/dist/mesh/verify.js.map +1 -0
- package/dist/pairing/crypto.d.ts +8 -0
- package/dist/pairing/crypto.js +22 -0
- package/dist/pairing/crypto.js.map +1 -0
- package/dist/pairing/qr.d.ts +59 -0
- package/dist/pairing/qr.js +127 -0
- package/dist/pairing/qr.js.map +1 -0
- package/dist/pairing/storage.d.ts +120 -0
- package/dist/pairing/storage.js +614 -0
- package/dist/pairing/storage.js.map +1 -0
- package/dist/panel_bridge.d.ts +15 -0
- package/dist/panel_bridge.js +409 -0
- package/dist/panel_bridge.js.map +1 -0
- package/dist/paths.d.ts +39 -0
- package/dist/paths.js +51 -0
- package/dist/paths.js.map +1 -0
- package/dist/protocol/codec.d.ts +7 -0
- package/dist/protocol/codec.js +48 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/types.d.ts +404 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/rooms.d.ts +42 -0
- package/dist/rooms.js +78 -0
- package/dist/rooms.js.map +1 -0
- package/dist/session/bridge.d.ts +37 -0
- package/dist/session/bridge.js +134 -0
- package/dist/session/bridge.js.map +1 -0
- package/dist/session/broker.d.ts +189 -0
- package/dist/session/broker.js +527 -0
- package/dist/session/broker.js.map +1 -0
- package/dist/session/broker_remote.d.ts +74 -0
- package/dist/session/broker_remote.js +581 -0
- package/dist/session/broker_remote.js.map +1 -0
- package/dist/session/cwd_lock.d.ts +33 -0
- package/dist/session/cwd_lock.js +127 -0
- package/dist/session/cwd_lock.js.map +1 -0
- package/dist/session/debug_log.d.ts +3 -0
- package/dist/session/debug_log.js +32 -0
- package/dist/session/debug_log.js.map +1 -0
- package/dist/session/envelope.d.ts +33 -0
- package/dist/session/envelope.js +117 -0
- package/dist/session/envelope.js.map +1 -0
- package/dist/session/global_config.d.ts +33 -0
- package/dist/session/global_config.js +73 -0
- package/dist/session/global_config.js.map +1 -0
- package/dist/session/ipc.d.ts +27 -0
- package/dist/session/ipc.js +22 -0
- package/dist/session/ipc.js.map +1 -0
- package/dist/session/leader_election.d.ts +32 -0
- package/dist/session/leader_election.js +108 -0
- package/dist/session/leader_election.js.map +1 -0
- package/dist/session/local_config.d.ts +67 -0
- package/dist/session/local_config.js +193 -0
- package/dist/session/local_config.js.map +1 -0
- package/dist/session/mesh_node.d.ts +116 -0
- package/dist/session/mesh_node.js +596 -0
- package/dist/session/mesh_node.js.map +1 -0
- package/dist/session/peer.d.ts +139 -0
- package/dist/session/peer.js +474 -0
- package/dist/session/peer.js.map +1 -0
- package/dist/session/peer_inventory.d.ts +13 -0
- package/dist/session/peer_inventory.js +48 -0
- package/dist/session/peer_inventory.js.map +1 -0
- package/dist/session/peer_limits.d.ts +9 -0
- package/dist/session/peer_limits.js +24 -0
- package/dist/session/peer_limits.js.map +1 -0
- package/dist/session/rpc_envelope.d.ts +108 -0
- package/dist/session/rpc_envelope.js +221 -0
- package/dist/session/rpc_envelope.js.map +1 -0
- package/dist/session/rpc_inbound.d.ts +55 -0
- package/dist/session/rpc_inbound.js +136 -0
- package/dist/session/rpc_inbound.js.map +1 -0
- package/dist/session/setup_wizard.d.ts +39 -0
- package/dist/session/setup_wizard.js +63 -0
- package/dist/session/setup_wizard.js.map +1 -0
- package/dist/session/tools.d.ts +24 -0
- package/dist/session/tools.js +272 -0
- package/dist/session/tools.js.map +1 -0
- package/dist/session/wizard.d.ts +13 -0
- package/dist/session/wizard.js +20 -0
- package/dist/session/wizard.js.map +1 -0
- package/dist/transport/peer_channel.d.ts +52 -0
- package/dist/transport/peer_channel.js +145 -0
- package/dist/transport/peer_channel.js.map +1 -0
- package/dist/transport/pi_forward_client.d.ts +29 -0
- package/dist/transport/pi_forward_client.js +68 -0
- package/dist/transport/pi_forward_client.js.map +1 -0
- package/dist/transport/relay_client.d.ts +96 -0
- package/dist/transport/relay_client.js +210 -0
- package/dist/transport/relay_client.js.map +1 -0
- package/dist/ui/footer.d.ts +32 -0
- package/dist/ui/footer.js +34 -0
- package/dist/ui/footer.js.map +1 -0
- package/docs/daemon.md +289 -0
- package/package.json +92 -0
- package/service-templates/launchd.plist.template +35 -0
- package/service-templates/systemd.service.template +19 -0
- package/service-templates/task-launcher.vbs.template +10 -0
- package/service-templates/task-scheduler.xml.template +38 -0
- package/skills/agent-network/SKILL.md +310 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, symlinkSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { delimiter } from "node:path";
|
|
4
|
+
import { homedir, platform, tmpdir, userInfo } from "node:os";
|
|
5
|
+
import { dirname, join, resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { unbienStateHome } from "../paths.js";
|
|
8
|
+
export function detectPlatform() {
|
|
9
|
+
switch (platform()) {
|
|
10
|
+
case "darwin":
|
|
11
|
+
return "macos";
|
|
12
|
+
case "linux":
|
|
13
|
+
return "linux";
|
|
14
|
+
case "win32":
|
|
15
|
+
return "windows";
|
|
16
|
+
default:
|
|
17
|
+
return "unsupported";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// ── Path resolution ────────────────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Absolute path to the supervisor's compiled entry. We resolve from
|
|
23
|
+
* `import.meta.url` (this file's location) since wherever the daemon
|
|
24
|
+
* module lives, `bin/supervisord.js` is a sibling of `daemon/` under
|
|
25
|
+
* `dist/`.
|
|
26
|
+
*
|
|
27
|
+
* After build: `dist/daemon/install.js` → `dist/bin/supervisord.js`.
|
|
28
|
+
* In dev (`tsx`): same path resolution still lands inside `src/`, which
|
|
29
|
+
* isn't directly runnable by `node` — dev install isn't expected.
|
|
30
|
+
*/
|
|
31
|
+
export function findSupervisorScript() {
|
|
32
|
+
const here = fileURLToPath(import.meta.url); // dist/daemon/install.js
|
|
33
|
+
const daemonDir = dirname(here); // dist/daemon
|
|
34
|
+
const distRoot = dirname(daemonDir); // dist
|
|
35
|
+
return resolve(distRoot, "bin/supervisord.js");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Absolute path to the extension's CLI entry (`dist/index.js`). This is
|
|
39
|
+
* the file we symlink to `~/.local/bin/unbien` so the user can run
|
|
40
|
+
* `un-bien <subcommand>` from any shell after installing the extension
|
|
41
|
+
* through Pi (`pi install npm:un-bien`).
|
|
42
|
+
*
|
|
43
|
+
* Same resolution strategy as `findSupervisorScript`: from
|
|
44
|
+
* `dist/daemon/install.js` → `dist/index.js`.
|
|
45
|
+
*/
|
|
46
|
+
export function findRemotePiScript() {
|
|
47
|
+
const here = fileURLToPath(import.meta.url); // dist/daemon/install.js
|
|
48
|
+
const daemonDir = dirname(here); // dist/daemon
|
|
49
|
+
const distRoot = dirname(daemonDir); // dist
|
|
50
|
+
return resolve(distRoot, "index.js");
|
|
51
|
+
}
|
|
52
|
+
export function findNodeBinary() {
|
|
53
|
+
// `process.execPath` is always absolute and points at the current Node
|
|
54
|
+
// binary. Embedding it in the service unit means the user gets the
|
|
55
|
+
// exact same Node version they invoked `unbien install` with — no
|
|
56
|
+
// PATH ambiguity at boot time.
|
|
57
|
+
return process.execPath;
|
|
58
|
+
}
|
|
59
|
+
export function findTemplate(name) {
|
|
60
|
+
// Templates ship next to the compiled `dist/` (via `files` in package.json).
|
|
61
|
+
// From `dist/daemon/install.js` go up two levels and into
|
|
62
|
+
// `service-templates/`. In the published npm tarball the layout is the
|
|
63
|
+
// same — `service-templates/` is sibling to `dist/`.
|
|
64
|
+
const here = fileURLToPath(import.meta.url); // dist/daemon/install.js
|
|
65
|
+
const pkgRoot = resolve(dirname(dirname(dirname(here)))); // package root
|
|
66
|
+
const file = name === "systemd"
|
|
67
|
+
? "systemd.service.template"
|
|
68
|
+
: name === "launchd"
|
|
69
|
+
? "launchd.plist.template"
|
|
70
|
+
: name === "vbs-launcher"
|
|
71
|
+
? "task-launcher.vbs.template"
|
|
72
|
+
: "task-scheduler.xml.template";
|
|
73
|
+
return resolve(pkgRoot, "service-templates", file);
|
|
74
|
+
}
|
|
75
|
+
// ── Service paths ──────────────────────────────────────────────────────────
|
|
76
|
+
export function systemdUnitPath() {
|
|
77
|
+
return join(homedir(), ".config", "systemd", "user", "unbien-supervisord.service");
|
|
78
|
+
}
|
|
79
|
+
export function launchdPlistPath() {
|
|
80
|
+
return join(homedir(), "Library", "LaunchAgents", "dev.unbien.supervisord.plist");
|
|
81
|
+
}
|
|
82
|
+
export const LAUNCHD_LABEL = "dev.unbien.supervisord";
|
|
83
|
+
/** systemd --user unit name (with `.service`) for the supervisor. */
|
|
84
|
+
export const SYSTEMD_UNIT = "unbien-supervisord.service";
|
|
85
|
+
/** Windows Task Scheduler task name (plan/40). */
|
|
86
|
+
export const WINDOWS_TASK_NAME = "RemotePiSupervisor";
|
|
87
|
+
/** Path of the rendered Task Scheduler XML (input to `schtasks /Create /XML`). */
|
|
88
|
+
export function taskXmlPath() {
|
|
89
|
+
return join(unbienStateHome(), "RemotePiSupervisor.xml");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Path of the rendered VBScript launcher the Task Scheduler action invokes
|
|
93
|
+
* via `wscript.exe` (plan/40, Windows). Launching node through this hidden
|
|
94
|
+
* wrapper is what keeps the supervisor from flashing a console window.
|
|
95
|
+
*/
|
|
96
|
+
export function vbsLauncherPath() {
|
|
97
|
+
return join(unbienStateHome(), "RemotePiSupervisorLauncher.vbs");
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Combined stdout/stderr log for the Windows supervisor. The Task Scheduler
|
|
101
|
+
* launches it hidden via wscript, so without this redirect its output (and the
|
|
102
|
+
* forwarded daemon-child stderr) would vanish — mirrors launchd/systemd, which
|
|
103
|
+
* already log to `~/.pi/un-bien/supervisord.log`.
|
|
104
|
+
*/
|
|
105
|
+
export function supervisordLogPath() {
|
|
106
|
+
return join(unbienStateHome(), "supervisord.log");
|
|
107
|
+
}
|
|
108
|
+
export function defaultRenderVars() {
|
|
109
|
+
return {
|
|
110
|
+
node: findNodeBinary(),
|
|
111
|
+
supervisor: findSupervisorScript(),
|
|
112
|
+
home: homedir(),
|
|
113
|
+
user: userInfo().username,
|
|
114
|
+
path: process.env["PATH"] ?? "/usr/local/bin:/usr/bin:/bin",
|
|
115
|
+
vbs: vbsLauncherPath(),
|
|
116
|
+
logPath: supervisordLogPath(),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Replace `{NODE}` / `{SUPERVISOR}` / `{USER}` / `{HOME}` / `{PATH}` / `{VBS}` / `{LOG}`. */
|
|
120
|
+
export function renderTemplate(template, vars) {
|
|
121
|
+
return template
|
|
122
|
+
.replace(/\{NODE\}/g, vars.node)
|
|
123
|
+
.replace(/\{SUPERVISOR\}/g, vars.supervisor)
|
|
124
|
+
.replace(/\{USER\}/g, vars.user)
|
|
125
|
+
.replace(/\{HOME\}/g, vars.home)
|
|
126
|
+
.replace(/\{PATH\}/g, vars.path)
|
|
127
|
+
.replace(/\{VBS\}/g, vars.vbs)
|
|
128
|
+
.replace(/\{LOG\}/g, vars.logPath);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Writes the unit/plist, runs the platform's activation command. Throws
|
|
132
|
+
* on unsupported OS or when the supervisor script isn't found.
|
|
133
|
+
*
|
|
134
|
+
* Idempotent: re-running re-writes the unit (paths could have changed)
|
|
135
|
+
* and re-activates via the platform tool's idempotent flag.
|
|
136
|
+
*/
|
|
137
|
+
export function installService(vars = defaultRenderVars()) {
|
|
138
|
+
const plat = detectPlatform();
|
|
139
|
+
const log = [];
|
|
140
|
+
if (plat === "unsupported") {
|
|
141
|
+
throw new Error(`unsupported platform: ${platform()}. Only macOS, Linux, and Windows.`);
|
|
142
|
+
}
|
|
143
|
+
// Sanity: supervisor script must exist on disk.
|
|
144
|
+
if (!existsSync(vars.supervisor)) {
|
|
145
|
+
throw new Error(`supervisor script not found at ${vars.supervisor}. ` +
|
|
146
|
+
"Run `pnpm build` (dev) or `npm install -g un-bien` (prod) first.");
|
|
147
|
+
}
|
|
148
|
+
const templateName = plat === "macos"
|
|
149
|
+
? "launchd"
|
|
150
|
+
: plat === "linux"
|
|
151
|
+
? "systemd"
|
|
152
|
+
: "taskscheduler";
|
|
153
|
+
const templatePath = findTemplate(templateName);
|
|
154
|
+
if (!existsSync(templatePath)) {
|
|
155
|
+
throw new Error(`service template missing: ${templatePath}`);
|
|
156
|
+
}
|
|
157
|
+
const tpl = readFileSync(templatePath, "utf8");
|
|
158
|
+
const rendered = renderTemplate(tpl, vars);
|
|
159
|
+
const unitPath = plat === "macos"
|
|
160
|
+
? launchdPlistPath()
|
|
161
|
+
: plat === "linux"
|
|
162
|
+
? systemdUnitPath()
|
|
163
|
+
: taskXmlPath();
|
|
164
|
+
mkdirSync(dirname(unitPath), { recursive: true });
|
|
165
|
+
if (plat === "windows") {
|
|
166
|
+
// `schtasks /Create /XML` requires UTF-16LE + BOM. A UTF-8 file fails with
|
|
167
|
+
// "(1,40)::ERROR: unable to switch the encoding" — the bytes must match the
|
|
168
|
+
// template's `encoding="UTF-16"` declaration. (plan/40 risk #5.)
|
|
169
|
+
const bom = Buffer.from([0xff, 0xfe]); // UTF-16LE byte-order mark
|
|
170
|
+
writeFileSync(unitPath, Buffer.concat([bom, Buffer.from(rendered, "utf16le")]));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
writeFileSync(unitPath, rendered); // launchd/systemd → UTF-8
|
|
174
|
+
}
|
|
175
|
+
log.push(`wrote ${unitPath}`);
|
|
176
|
+
if (plat === "macos") {
|
|
177
|
+
// Unload first in case a stale entry exists from a prior install —
|
|
178
|
+
// `launchctl bootstrap` errors out otherwise. `bootout` is the modern
|
|
179
|
+
// API; `unload` is the legacy fallback. Either may fail silently.
|
|
180
|
+
const uid = userInfo().uid;
|
|
181
|
+
_tryExec("launchctl", ["bootout", `gui/${uid}`, unitPath], log);
|
|
182
|
+
_tryExec("launchctl", ["unload", unitPath], log);
|
|
183
|
+
_exec("launchctl", ["bootstrap", `gui/${uid}`, unitPath], log);
|
|
184
|
+
log.push(`activated via launchctl bootstrap gui/${uid}`);
|
|
185
|
+
}
|
|
186
|
+
else if (plat === "linux") {
|
|
187
|
+
_exec("systemctl", ["--user", "daemon-reload"], log);
|
|
188
|
+
_exec("systemctl", ["--user", "enable", "--now", "unbien-supervisord.service"], log);
|
|
189
|
+
log.push("activated via systemctl --user enable --now");
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// windows — Task Scheduler (plan/40). The action runs `wscript.exe
|
|
193
|
+
// <launcher.vbs>` (not node directly) so the supervisor starts hidden,
|
|
194
|
+
// with no console window. Render + write that launcher first.
|
|
195
|
+
const vbsTpl = findTemplate("vbs-launcher");
|
|
196
|
+
if (!existsSync(vbsTpl))
|
|
197
|
+
throw new Error(`vbs launcher template missing: ${vbsTpl}`);
|
|
198
|
+
const vbsPath = vars.vbs;
|
|
199
|
+
writeFileSync(vbsPath, renderTemplate(readFileSync(vbsTpl, "utf8"), vars));
|
|
200
|
+
log.push(`wrote ${vbsPath}`);
|
|
201
|
+
// Only `schtasks /Create` modifies the root task store → that single op
|
|
202
|
+
// needs admin (elevate it via UAC). `/End` (stop a prior instance) and
|
|
203
|
+
// `/Run` (start it) act on a task we already own and work un-elevated — the
|
|
204
|
+
// very ops `unbien restart-supervisor` runs without elevation. Keeping
|
|
205
|
+
// them un-elevated narrows the admin surface to the one operation that
|
|
206
|
+
// truly requires it.
|
|
207
|
+
_tryExec("schtasks", ["/End", "/TN", WINDOWS_TASK_NAME], log);
|
|
208
|
+
_execElevatedWindows([`schtasks /Create /XML "${unitPath}" /TN ${WINDOWS_TASK_NAME} /F`], log);
|
|
209
|
+
_exec("schtasks", ["/Run", "/TN", WINDOWS_TASK_NAME], log);
|
|
210
|
+
log.push(`activated via schtasks /Create (elevated) + /Run (${WINDOWS_TASK_NAME})`);
|
|
211
|
+
}
|
|
212
|
+
return { platform: plat, unitPath, log };
|
|
213
|
+
}
|
|
214
|
+
export function uninstallService() {
|
|
215
|
+
const plat = detectPlatform();
|
|
216
|
+
const log = [];
|
|
217
|
+
if (plat === "unsupported") {
|
|
218
|
+
throw new Error(`unsupported platform: ${platform()}. Only macOS, Linux, and Windows.`);
|
|
219
|
+
}
|
|
220
|
+
const unitPath = plat === "macos"
|
|
221
|
+
? launchdPlistPath()
|
|
222
|
+
: plat === "linux"
|
|
223
|
+
? systemdUnitPath()
|
|
224
|
+
: taskXmlPath();
|
|
225
|
+
if (plat === "macos") {
|
|
226
|
+
const uid = userInfo().uid;
|
|
227
|
+
_tryExec("launchctl", ["bootout", `gui/${uid}`, unitPath], log);
|
|
228
|
+
_tryExec("launchctl", ["unload", unitPath], log);
|
|
229
|
+
log.push("deactivated via launchctl bootout");
|
|
230
|
+
}
|
|
231
|
+
else if (plat === "linux") {
|
|
232
|
+
_tryExec("systemctl", ["--user", "disable", "--now", "unbien-supervisord.service"], log);
|
|
233
|
+
log.push("deactivated via systemctl --user disable --now");
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
// windows — Task Scheduler (plan/40): stop + delete the task. Only
|
|
237
|
+
// `/Delete` modifies the root task store → that's the op that needs admin.
|
|
238
|
+
// `/End` stops the running task and works un-elevated (own task), like
|
|
239
|
+
// restart-supervisor. `exit /b 0` keeps uninstall best-effort: a missing
|
|
240
|
+
// task (already removed) is success, not an error.
|
|
241
|
+
_tryExec("schtasks", ["/End", "/TN", WINDOWS_TASK_NAME], log);
|
|
242
|
+
_execElevatedWindows([`schtasks /Delete /TN ${WINDOWS_TASK_NAME} /F`, `exit /b 0`], log);
|
|
243
|
+
log.push(`deactivated via elevated schtasks /Delete (${WINDOWS_TASK_NAME})`);
|
|
244
|
+
}
|
|
245
|
+
let removed = false;
|
|
246
|
+
if (existsSync(unitPath)) {
|
|
247
|
+
try {
|
|
248
|
+
unlinkSync(unitPath);
|
|
249
|
+
removed = true;
|
|
250
|
+
log.push(`removed ${unitPath}`);
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
log.push(`failed to remove ${unitPath}: ${String(e)}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Windows: also drop the hidden VBScript launcher we wrote alongside the XML.
|
|
257
|
+
if (plat === "windows") {
|
|
258
|
+
const vbsPath = vbsLauncherPath();
|
|
259
|
+
if (existsSync(vbsPath)) {
|
|
260
|
+
try {
|
|
261
|
+
unlinkSync(vbsPath);
|
|
262
|
+
log.push(`removed ${vbsPath}`);
|
|
263
|
+
}
|
|
264
|
+
catch (e) {
|
|
265
|
+
log.push(`failed to remove ${vbsPath}: ${String(e)}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (plat === "linux") {
|
|
270
|
+
_tryExec("systemctl", ["--user", "daemon-reload"], log);
|
|
271
|
+
}
|
|
272
|
+
// Hint about the label for users that want to verify manually.
|
|
273
|
+
if (plat === "macos")
|
|
274
|
+
log.push(`(label: ${LAUNCHD_LABEL})`);
|
|
275
|
+
return { platform: plat, unitPath, removed, log };
|
|
276
|
+
}
|
|
277
|
+
// ── Internals ──────────────────────────────────────────────────────────────
|
|
278
|
+
function _exec(cmd, args, log) {
|
|
279
|
+
try {
|
|
280
|
+
const out = execFileSync(cmd, args, {
|
|
281
|
+
encoding: "utf8",
|
|
282
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
283
|
+
});
|
|
284
|
+
if (out.trim())
|
|
285
|
+
log.push(`$ ${cmd} ${args.join(" ")}\n${out.trim()}`);
|
|
286
|
+
else
|
|
287
|
+
log.push(`$ ${cmd} ${args.join(" ")}`);
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
const err = e;
|
|
291
|
+
const stderr = typeof err.stderr === "string"
|
|
292
|
+
? err.stderr
|
|
293
|
+
: (err.stderr?.toString() ?? "");
|
|
294
|
+
throw new Error(`\`${cmd} ${args.join(" ")}\` exited ${err.status ?? "?"}\n${stderr.trim() || err.message}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/** Like _exec but swallows errors — used for cleanup steps where failure
|
|
298
|
+
* is expected (e.g., "unload" before "load" when nothing was loaded). */
|
|
299
|
+
function _tryExec(cmd, args, log) {
|
|
300
|
+
try {
|
|
301
|
+
_exec(cmd, args, log);
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
/* expected, suppress */
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// ── Windows elevation (plan/40) ────────────────────────────────────────────
|
|
308
|
+
//
|
|
309
|
+
// `schtasks /Create` and `/Delete` register/remove the task in the root folder,
|
|
310
|
+
// which requires administrator rights. We can't elevate the current Node
|
|
311
|
+
// process, so we render the schtasks sequence into a temp `.cmd`, run it
|
|
312
|
+
// through an elevated `cmd.exe` via PowerShell `Start-Process -Verb RunAs`
|
|
313
|
+
// (one UAC prompt), and read the output back from a log file the script
|
|
314
|
+
// redirects into.
|
|
315
|
+
/**
|
|
316
|
+
* Build the batch script run elevated. Each command line redirects its output
|
|
317
|
+
* to `logFile` so the (separate, elevated) process's output can be read back by
|
|
318
|
+
* the parent. Control-flow lines (`if`/`exit`/`rem`/`@`) run bare — redirecting
|
|
319
|
+
* them would swallow the exit code. Pure + exported for tests.
|
|
320
|
+
*/
|
|
321
|
+
export function buildElevatedCmd(lines, logFile) {
|
|
322
|
+
const redirect = ` >> "${logFile}" 2>&1`;
|
|
323
|
+
const body = lines.map((ln) => /^\s*(if|exit|rem|@)/i.test(ln) ? ln : ln + redirect);
|
|
324
|
+
return ["@echo off", ...body].join("\r\n") + "\r\n";
|
|
325
|
+
}
|
|
326
|
+
function _readIfExists(p) {
|
|
327
|
+
try {
|
|
328
|
+
return readFileSync(p, "utf8");
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return "";
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Run a schtasks command sequence elevated (UAC). Throws a clear error when the
|
|
336
|
+
* prompt is declined or the task operation fails (`Start-Process -Verb RunAs`
|
|
337
|
+
* throws → PowerShell exits non-zero → `execFileSync` throws). Captured schtasks
|
|
338
|
+
* output is appended to `log` either way.
|
|
339
|
+
*/
|
|
340
|
+
function _execElevatedWindows(lines, log) {
|
|
341
|
+
const base = join(tmpdir(), `un-bien-elevate-${process.pid}`);
|
|
342
|
+
const cmdPath = `${base}.cmd`;
|
|
343
|
+
const logFile = `${base}.log`;
|
|
344
|
+
writeFileSync(cmdPath, buildElevatedCmd(lines, logFile));
|
|
345
|
+
try {
|
|
346
|
+
unlinkSync(logFile);
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
/* none yet */
|
|
350
|
+
}
|
|
351
|
+
let thrown = null;
|
|
352
|
+
try {
|
|
353
|
+
execFileSync("powershell", [
|
|
354
|
+
"-NoProfile",
|
|
355
|
+
"-NonInteractive",
|
|
356
|
+
"-Command",
|
|
357
|
+
`$p = Start-Process -FilePath cmd.exe -ArgumentList '/c','"${cmdPath}"' ` +
|
|
358
|
+
"-Verb RunAs -Wait -PassThru -WindowStyle Hidden; exit $p.ExitCode",
|
|
359
|
+
], { stdio: ["ignore", "pipe", "pipe"] });
|
|
360
|
+
}
|
|
361
|
+
catch (e) {
|
|
362
|
+
thrown = e;
|
|
363
|
+
}
|
|
364
|
+
const out = _readIfExists(logFile).trim();
|
|
365
|
+
if (out)
|
|
366
|
+
log.push(out);
|
|
367
|
+
try {
|
|
368
|
+
unlinkSync(cmdPath);
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
/* best-effort */
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
unlinkSync(logFile);
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
/* best-effort */
|
|
378
|
+
}
|
|
379
|
+
if (thrown) {
|
|
380
|
+
throw new Error("administrator privileges required — the UAC prompt was declined or the " +
|
|
381
|
+
"schtasks operation failed. Run the command again and accept the Windows " +
|
|
382
|
+
`elevation prompt.${out ? `\n${out}` : ""}`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
export function userLocalBinDir(home = homedir()) {
|
|
386
|
+
return join(home, ".local", "bin");
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Check whether `dir` is on `process.env.PATH`. Tolerates trailing
|
|
390
|
+
* slashes and relative entries (which we treat as not matching — `~/.local/bin`
|
|
391
|
+
* is always absolute on our end).
|
|
392
|
+
*/
|
|
393
|
+
export function isOnPath(dir, envPath = process.env["PATH"] ?? "") {
|
|
394
|
+
const target = dir.replace(/\/+$/, "");
|
|
395
|
+
return envPath
|
|
396
|
+
.split(delimiter)
|
|
397
|
+
.some((entry) => entry.replace(/\/+$/, "") === target);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Create (or refresh) the `un-bien` + `pi-supervisord` symlinks in
|
|
401
|
+
* `~/.local/bin/`. Idempotent — replaces stale links pointing at old
|
|
402
|
+
* extension paths (Pi can reinstall the extension to a different hash dir
|
|
403
|
+
* on upgrades, so this MUST overwrite).
|
|
404
|
+
*
|
|
405
|
+
* Returns `onPath: false` when `~/.local/bin` isn't in the user's `$PATH`.
|
|
406
|
+
* The caller is responsible for surfacing the shell-rc instruction —
|
|
407
|
+
* we don't edit the user's shell config files automatically.
|
|
408
|
+
*/
|
|
409
|
+
export function linkCliBinaries(home = homedir(), paths = {}, opts = {}) {
|
|
410
|
+
const binDir = userLocalBinDir(home);
|
|
411
|
+
// Windows (plan/40): no POSIX symlinks. Installing via Pi (`pi install
|
|
412
|
+
// npm:un-bien`) never reaches PATH, so write real `.cmd` shims into
|
|
413
|
+
// `~/.local/bin` and add that dir to the user's PATH (HKCU — no admin).
|
|
414
|
+
if (platform() === "win32") {
|
|
415
|
+
return _linkCliBinariesWindows(home, binDir, paths, opts);
|
|
416
|
+
}
|
|
417
|
+
const log = [];
|
|
418
|
+
mkdirSync(binDir, { recursive: true });
|
|
419
|
+
log.push(`ensured ${binDir}`);
|
|
420
|
+
const remotePi = paths.remotePi ?? findRemotePiScript();
|
|
421
|
+
const supervisord = paths.supervisord ?? findSupervisorScript();
|
|
422
|
+
if (!existsSync(remotePi)) {
|
|
423
|
+
throw new Error(`unbien script not found at ${remotePi}. ` +
|
|
424
|
+
"Run `pnpm build` (dev) or reinstall the extension.");
|
|
425
|
+
}
|
|
426
|
+
if (!existsSync(supervisord)) {
|
|
427
|
+
throw new Error(`supervisor script not found at ${supervisord}. ` +
|
|
428
|
+
"Run `pnpm build` (dev) or reinstall the extension.");
|
|
429
|
+
}
|
|
430
|
+
// tsc strips the executable bit on its outputs; the shebang at the top
|
|
431
|
+
// of dist/index.js means the file IS a valid interpreter target once
|
|
432
|
+
// chmod +x is applied. Same for supervisord.js (no shebang — we rely
|
|
433
|
+
// on `node` resolving via the symlink at exec time).
|
|
434
|
+
try {
|
|
435
|
+
chmodSync(remotePi, 0o755);
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
/* best-effort */
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
chmodSync(supervisord, 0o755);
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
/* best-effort */
|
|
445
|
+
}
|
|
446
|
+
const links = [
|
|
447
|
+
{ name: "unbien", path: join(binDir, "unbien"), target: remotePi },
|
|
448
|
+
{
|
|
449
|
+
name: "pi-supervisord",
|
|
450
|
+
path: join(binDir, "pi-supervisord"),
|
|
451
|
+
target: supervisord,
|
|
452
|
+
},
|
|
453
|
+
];
|
|
454
|
+
for (const link of links) {
|
|
455
|
+
_replaceSymlink(link.path, link.target, log);
|
|
456
|
+
}
|
|
457
|
+
const onPath = isOnPath(binDir);
|
|
458
|
+
if (!onPath) {
|
|
459
|
+
log.push(`WARNING: ${binDir} is not on $PATH. ` +
|
|
460
|
+
`Add this line to your shell rc (~/.zshrc, ~/.bashrc, etc.): ` +
|
|
461
|
+
`export PATH="$HOME/.local/bin:$PATH"`);
|
|
462
|
+
}
|
|
463
|
+
return { binDir, links, onPath, log };
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Windows variant of `linkCliBinaries`: writes `un-bien.cmd` +
|
|
467
|
+
* `pi-supervisord.cmd` shims into `~/.local/bin` and ensures that dir is on the
|
|
468
|
+
* user's PATH (User scope — no admin). `opts.node` overrides the node binary
|
|
469
|
+
* (tests); `opts.mutatePath === false` skips the real PATH mutation (tests).
|
|
470
|
+
*/
|
|
471
|
+
function _linkCliBinariesWindows(home, binDir, paths, opts) {
|
|
472
|
+
void home;
|
|
473
|
+
const log = [];
|
|
474
|
+
mkdirSync(binDir, { recursive: true });
|
|
475
|
+
log.push(`ensured ${binDir}`);
|
|
476
|
+
const node = opts.node ?? findNodeBinary();
|
|
477
|
+
const remotePi = paths.remotePi ?? findRemotePiScript();
|
|
478
|
+
const supervisord = paths.supervisord ?? findSupervisorScript();
|
|
479
|
+
if (!existsSync(remotePi)) {
|
|
480
|
+
throw new Error(`unbien script not found at ${remotePi}. ` +
|
|
481
|
+
"Run `pnpm build` (dev) or reinstall the extension.");
|
|
482
|
+
}
|
|
483
|
+
if (!existsSync(supervisord)) {
|
|
484
|
+
throw new Error(`supervisor script not found at ${supervisord}. ` +
|
|
485
|
+
"Run `pnpm build` (dev) or reinstall the extension.");
|
|
486
|
+
}
|
|
487
|
+
const links = [
|
|
488
|
+
{
|
|
489
|
+
name: "un-bien.cmd",
|
|
490
|
+
path: join(binDir, "un-bien.cmd"),
|
|
491
|
+
target: remotePi,
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
name: "pi-supervisord.cmd",
|
|
495
|
+
path: join(binDir, "pi-supervisord.cmd"),
|
|
496
|
+
target: supervisord,
|
|
497
|
+
},
|
|
498
|
+
];
|
|
499
|
+
for (const link of links) {
|
|
500
|
+
writeFileSync(link.path, buildCmdShim(node, link.target));
|
|
501
|
+
log.push(`wrote ${link.path}`);
|
|
502
|
+
}
|
|
503
|
+
const onPath = isOnPath(binDir);
|
|
504
|
+
if (!onPath && opts.mutatePath !== false) {
|
|
505
|
+
try {
|
|
506
|
+
_addUserPath(binDir);
|
|
507
|
+
log.push(`added ${binDir} to your user PATH — open a NEW terminal for \`un-bien\` to resolve.`);
|
|
508
|
+
}
|
|
509
|
+
catch (e) {
|
|
510
|
+
log.push(`WARNING: ${binDir} is not on PATH and auto-add failed (${String(e)}). ` +
|
|
511
|
+
`Add it manually: setx PATH "%PATH%;${binDir}"`);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return { binDir, links, onPath, log };
|
|
515
|
+
}
|
|
516
|
+
/** A Windows `.cmd` shim that forwards all args to `node "<target>"`. Pure. */
|
|
517
|
+
export function buildCmdShim(node, target) {
|
|
518
|
+
return `@echo off\r\n"${node}" "${target}" %*\r\n`;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Append `dir` to the User-scope PATH via PowerShell (HKCU\Environment — no
|
|
522
|
+
* admin). Idempotent: skips when `dir` is already an exact PATH segment. Single-
|
|
523
|
+
* quoted PS literal (backslashes are literal in PS single quotes) with embedded
|
|
524
|
+
* `'` doubled.
|
|
525
|
+
*/
|
|
526
|
+
function _addUserPath(dir) {
|
|
527
|
+
const lit = `'${dir.replace(/'/g, "''")}'`;
|
|
528
|
+
execFileSync("powershell", [
|
|
529
|
+
"-NoProfile",
|
|
530
|
+
"-NonInteractive",
|
|
531
|
+
"-Command",
|
|
532
|
+
`$d = ${lit}; ` +
|
|
533
|
+
"$p = [Environment]::GetEnvironmentVariable('Path','User'); " +
|
|
534
|
+
"if (-not $p) { $p = '' }; " +
|
|
535
|
+
"$parts = $p.Split(';') | Where-Object { $_ -ne '' }; " +
|
|
536
|
+
"if ($parts -notcontains $d) { " +
|
|
537
|
+
"[Environment]::SetEnvironmentVariable('Path', (($parts + $d) -join ';'), 'User') }",
|
|
538
|
+
], { stdio: ["ignore", "pipe", "pipe"] });
|
|
539
|
+
}
|
|
540
|
+
export function unlinkCliBinaries(home = homedir()) {
|
|
541
|
+
const binDir = userLocalBinDir(home);
|
|
542
|
+
const log = [];
|
|
543
|
+
// Windows shims are `.cmd` files (linkCliBinaries writes those); POSIX uses
|
|
544
|
+
// extensionless symlinks. Match what was actually created on this platform.
|
|
545
|
+
const names = platform() === "win32"
|
|
546
|
+
? ["un-bien.cmd", "pi-supervisord.cmd"]
|
|
547
|
+
: ["unbien", "pi-supervisord"];
|
|
548
|
+
const removed = [];
|
|
549
|
+
for (const name of names) {
|
|
550
|
+
const path = join(binDir, name);
|
|
551
|
+
let existed = false;
|
|
552
|
+
try {
|
|
553
|
+
// lstatSync (not stat) so a symlink targeting a deleted file still
|
|
554
|
+
// resolves — we want to remove the LINK itself, not chase it.
|
|
555
|
+
lstatSync(path);
|
|
556
|
+
existed = true;
|
|
557
|
+
}
|
|
558
|
+
catch {
|
|
559
|
+
/* not present */
|
|
560
|
+
}
|
|
561
|
+
if (existed) {
|
|
562
|
+
try {
|
|
563
|
+
unlinkSync(path);
|
|
564
|
+
log.push(`removed ${path}`);
|
|
565
|
+
}
|
|
566
|
+
catch (e) {
|
|
567
|
+
log.push(`failed to remove ${path}: ${String(e)}`);
|
|
568
|
+
existed = false;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
removed.push({ name, path, existed });
|
|
572
|
+
}
|
|
573
|
+
return { binDir, removed, log };
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Atomic-ish symlink replace. Idiomatic recipe — `symlinkSync` errors
|
|
577
|
+
* with `EEXIST` if the path is already a symlink/file, so we remove
|
|
578
|
+
* first. Race window between unlink and symlink is irrelevant for a
|
|
579
|
+
* single-user install command (no concurrent writers).
|
|
580
|
+
*/
|
|
581
|
+
function _replaceSymlink(linkPath, target, log) {
|
|
582
|
+
let existing = null;
|
|
583
|
+
try {
|
|
584
|
+
existing = readlinkSync(linkPath);
|
|
585
|
+
}
|
|
586
|
+
catch {
|
|
587
|
+
/* not a symlink, or doesn't exist */
|
|
588
|
+
}
|
|
589
|
+
if (existing === target) {
|
|
590
|
+
log.push(`symlink ${linkPath} → ${target} (unchanged)`);
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
// Either it doesn't exist, or it points elsewhere. Remove + recreate.
|
|
594
|
+
try {
|
|
595
|
+
unlinkSync(linkPath);
|
|
596
|
+
}
|
|
597
|
+
catch {
|
|
598
|
+
/* fine if absent */
|
|
599
|
+
}
|
|
600
|
+
symlinkSync(target, linkPath);
|
|
601
|
+
log.push(`symlink ${linkPath} → ${target}`);
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/daemon/install.ts"],"names":[],"mappings":"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"}
|