@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.
Files changed (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +726 -0
  3. package/dist/actions/handlers.d.ts +77 -0
  4. package/dist/actions/handlers.js +26 -0
  5. package/dist/actions/handlers.js.map +1 -0
  6. package/dist/actions/registry.d.ts +39 -0
  7. package/dist/actions/registry.js +62 -0
  8. package/dist/actions/registry.js.map +1 -0
  9. package/dist/bin/supervisord.d.ts +2 -0
  10. package/dist/bin/supervisord.js +86 -0
  11. package/dist/bin/supervisord.js.map +1 -0
  12. package/dist/config.d.ts +84 -0
  13. package/dist/config.js +115 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/daemon/client.d.ts +20 -0
  16. package/dist/daemon/client.js +131 -0
  17. package/dist/daemon/client.js.map +1 -0
  18. package/dist/daemon/control_protocol.d.ts +176 -0
  19. package/dist/daemon/control_protocol.js +63 -0
  20. package/dist/daemon/control_protocol.js.map +1 -0
  21. package/dist/daemon/cron_log.d.ts +45 -0
  22. package/dist/daemon/cron_log.js +71 -0
  23. package/dist/daemon/cron_log.js.map +1 -0
  24. package/dist/daemon/cron_registry.d.ts +80 -0
  25. package/dist/daemon/cron_registry.js +198 -0
  26. package/dist/daemon/cron_registry.js.map +1 -0
  27. package/dist/daemon/id.d.ts +24 -0
  28. package/dist/daemon/id.js +36 -0
  29. package/dist/daemon/id.js.map +1 -0
  30. package/dist/daemon/install.d.ts +170 -0
  31. package/dist/daemon/install.js +603 -0
  32. package/dist/daemon/install.js.map +1 -0
  33. package/dist/daemon/registry.d.ts +63 -0
  34. package/dist/daemon/registry.js +153 -0
  35. package/dist/daemon/registry.js.map +1 -0
  36. package/dist/daemon/rpc_child.d.ts +194 -0
  37. package/dist/daemon/rpc_child.js +419 -0
  38. package/dist/daemon/rpc_child.js.map +1 -0
  39. package/dist/daemon/supervisor.d.ts +93 -0
  40. package/dist/daemon/supervisor.js +666 -0
  41. package/dist/daemon/supervisor.js.map +1 -0
  42. package/dist/extension_ui_bridge.d.ts +26 -0
  43. package/dist/extension_ui_bridge.js +341 -0
  44. package/dist/extension_ui_bridge.js.map +1 -0
  45. package/dist/index.d.ts +197 -0
  46. package/dist/index.js +5750 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/mcp/mesh_result.d.ts +10 -0
  49. package/dist/mcp/mesh_result.js +42 -0
  50. package/dist/mcp/mesh_result.js.map +1 -0
  51. package/dist/mcp/mesh_server.d.ts +16 -0
  52. package/dist/mcp/mesh_server.js +373 -0
  53. package/dist/mcp/mesh_server.js.map +1 -0
  54. package/dist/mesh/canonical.d.ts +30 -0
  55. package/dist/mesh/canonical.js +63 -0
  56. package/dist/mesh/canonical.js.map +1 -0
  57. package/dist/mesh/client.d.ts +18 -0
  58. package/dist/mesh/client.js +127 -0
  59. package/dist/mesh/client.js.map +1 -0
  60. package/dist/mesh/encoding.d.ts +38 -0
  61. package/dist/mesh/encoding.js +217 -0
  62. package/dist/mesh/encoding.js.map +1 -0
  63. package/dist/mesh/self_revoke.d.ts +73 -0
  64. package/dist/mesh/self_revoke.js +407 -0
  65. package/dist/mesh/self_revoke.js.map +1 -0
  66. package/dist/mesh/siblings.d.ts +49 -0
  67. package/dist/mesh/siblings.js +159 -0
  68. package/dist/mesh/siblings.js.map +1 -0
  69. package/dist/mesh/types.d.ts +34 -0
  70. package/dist/mesh/types.js +11 -0
  71. package/dist/mesh/types.js.map +1 -0
  72. package/dist/mesh/verify.d.ts +17 -0
  73. package/dist/mesh/verify.js +86 -0
  74. package/dist/mesh/verify.js.map +1 -0
  75. package/dist/pairing/crypto.d.ts +8 -0
  76. package/dist/pairing/crypto.js +22 -0
  77. package/dist/pairing/crypto.js.map +1 -0
  78. package/dist/pairing/qr.d.ts +59 -0
  79. package/dist/pairing/qr.js +127 -0
  80. package/dist/pairing/qr.js.map +1 -0
  81. package/dist/pairing/storage.d.ts +120 -0
  82. package/dist/pairing/storage.js +614 -0
  83. package/dist/pairing/storage.js.map +1 -0
  84. package/dist/panel_bridge.d.ts +15 -0
  85. package/dist/panel_bridge.js +409 -0
  86. package/dist/panel_bridge.js.map +1 -0
  87. package/dist/paths.d.ts +39 -0
  88. package/dist/paths.js +51 -0
  89. package/dist/paths.js.map +1 -0
  90. package/dist/protocol/codec.d.ts +7 -0
  91. package/dist/protocol/codec.js +48 -0
  92. package/dist/protocol/codec.js.map +1 -0
  93. package/dist/protocol/types.d.ts +404 -0
  94. package/dist/protocol/types.js +2 -0
  95. package/dist/protocol/types.js.map +1 -0
  96. package/dist/rooms.d.ts +42 -0
  97. package/dist/rooms.js +78 -0
  98. package/dist/rooms.js.map +1 -0
  99. package/dist/session/bridge.d.ts +37 -0
  100. package/dist/session/bridge.js +134 -0
  101. package/dist/session/bridge.js.map +1 -0
  102. package/dist/session/broker.d.ts +189 -0
  103. package/dist/session/broker.js +527 -0
  104. package/dist/session/broker.js.map +1 -0
  105. package/dist/session/broker_remote.d.ts +74 -0
  106. package/dist/session/broker_remote.js +581 -0
  107. package/dist/session/broker_remote.js.map +1 -0
  108. package/dist/session/cwd_lock.d.ts +33 -0
  109. package/dist/session/cwd_lock.js +127 -0
  110. package/dist/session/cwd_lock.js.map +1 -0
  111. package/dist/session/debug_log.d.ts +3 -0
  112. package/dist/session/debug_log.js +32 -0
  113. package/dist/session/debug_log.js.map +1 -0
  114. package/dist/session/envelope.d.ts +33 -0
  115. package/dist/session/envelope.js +117 -0
  116. package/dist/session/envelope.js.map +1 -0
  117. package/dist/session/global_config.d.ts +33 -0
  118. package/dist/session/global_config.js +73 -0
  119. package/dist/session/global_config.js.map +1 -0
  120. package/dist/session/ipc.d.ts +27 -0
  121. package/dist/session/ipc.js +22 -0
  122. package/dist/session/ipc.js.map +1 -0
  123. package/dist/session/leader_election.d.ts +32 -0
  124. package/dist/session/leader_election.js +108 -0
  125. package/dist/session/leader_election.js.map +1 -0
  126. package/dist/session/local_config.d.ts +67 -0
  127. package/dist/session/local_config.js +193 -0
  128. package/dist/session/local_config.js.map +1 -0
  129. package/dist/session/mesh_node.d.ts +116 -0
  130. package/dist/session/mesh_node.js +596 -0
  131. package/dist/session/mesh_node.js.map +1 -0
  132. package/dist/session/peer.d.ts +139 -0
  133. package/dist/session/peer.js +474 -0
  134. package/dist/session/peer.js.map +1 -0
  135. package/dist/session/peer_inventory.d.ts +13 -0
  136. package/dist/session/peer_inventory.js +48 -0
  137. package/dist/session/peer_inventory.js.map +1 -0
  138. package/dist/session/peer_limits.d.ts +9 -0
  139. package/dist/session/peer_limits.js +24 -0
  140. package/dist/session/peer_limits.js.map +1 -0
  141. package/dist/session/rpc_envelope.d.ts +108 -0
  142. package/dist/session/rpc_envelope.js +221 -0
  143. package/dist/session/rpc_envelope.js.map +1 -0
  144. package/dist/session/rpc_inbound.d.ts +55 -0
  145. package/dist/session/rpc_inbound.js +136 -0
  146. package/dist/session/rpc_inbound.js.map +1 -0
  147. package/dist/session/setup_wizard.d.ts +39 -0
  148. package/dist/session/setup_wizard.js +63 -0
  149. package/dist/session/setup_wizard.js.map +1 -0
  150. package/dist/session/tools.d.ts +24 -0
  151. package/dist/session/tools.js +272 -0
  152. package/dist/session/tools.js.map +1 -0
  153. package/dist/session/wizard.d.ts +13 -0
  154. package/dist/session/wizard.js +20 -0
  155. package/dist/session/wizard.js.map +1 -0
  156. package/dist/transport/peer_channel.d.ts +52 -0
  157. package/dist/transport/peer_channel.js +145 -0
  158. package/dist/transport/peer_channel.js.map +1 -0
  159. package/dist/transport/pi_forward_client.d.ts +29 -0
  160. package/dist/transport/pi_forward_client.js +68 -0
  161. package/dist/transport/pi_forward_client.js.map +1 -0
  162. package/dist/transport/relay_client.d.ts +96 -0
  163. package/dist/transport/relay_client.js +210 -0
  164. package/dist/transport/relay_client.js.map +1 -0
  165. package/dist/ui/footer.d.ts +32 -0
  166. package/dist/ui/footer.js +34 -0
  167. package/dist/ui/footer.js.map +1 -0
  168. package/docs/daemon.md +289 -0
  169. package/package.json +92 -0
  170. package/service-templates/launchd.plist.template +35 -0
  171. package/service-templates/systemd.service.template +19 -0
  172. package/service-templates/task-launcher.vbs.template +10 -0
  173. package/service-templates/task-scheduler.xml.template +38 -0
  174. 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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"}