@indigoai-us/hq-cloud 6.18.12 → 6.18.13

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 (38) hide show
  1. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
  2. package/dist/bin/sync-runner-watch-loop.js +6 -0
  3. package/dist/bin/sync-runner-watch-loop.js.map +1 -1
  4. package/dist/bin/sync-runner-watch-loop.test.js +2 -0
  5. package/dist/bin/sync-runner-watch-loop.test.js.map +1 -1
  6. package/dist/bin/sync-runner.d.ts +18 -2
  7. package/dist/bin/sync-runner.d.ts.map +1 -1
  8. package/dist/bin/sync-runner.js +102 -13
  9. package/dist/bin/sync-runner.js.map +1 -1
  10. package/dist/bin/sync-runner.test.js +108 -1
  11. package/dist/bin/sync-runner.test.js.map +1 -1
  12. package/dist/cli/share.d.ts +2 -0
  13. package/dist/cli/share.d.ts.map +1 -1
  14. package/dist/cli/share.js +19 -0
  15. package/dist/cli/share.js.map +1 -1
  16. package/dist/cli/sync.d.ts +2 -0
  17. package/dist/cli/sync.d.ts.map +1 -1
  18. package/dist/cli/sync.js +39 -2
  19. package/dist/cli/sync.js.map +1 -1
  20. package/dist/lib/exit-codes.d.ts +9 -2
  21. package/dist/lib/exit-codes.d.ts.map +1 -1
  22. package/dist/lib/exit-codes.js +9 -2
  23. package/dist/lib/exit-codes.js.map +1 -1
  24. package/dist/operation-lock.d.ts +43 -10
  25. package/dist/operation-lock.d.ts.map +1 -1
  26. package/dist/operation-lock.js +112 -48
  27. package/dist/operation-lock.js.map +1 -1
  28. package/dist/operation-lock.test.js +205 -116
  29. package/dist/operation-lock.test.js.map +1 -1
  30. package/dist/watch-owner-lease.d.ts +44 -0
  31. package/dist/watch-owner-lease.d.ts.map +1 -0
  32. package/dist/watch-owner-lease.js +368 -0
  33. package/dist/watch-owner-lease.js.map +1 -0
  34. package/dist/watch-owner-lease.test.d.ts +2 -0
  35. package/dist/watch-owner-lease.test.d.ts.map +1 -0
  36. package/dist/watch-owner-lease.test.js +335 -0
  37. package/dist/watch-owner-lease.test.js.map +1 -0
  38. package/package.json +2 -1
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Per-HQ-root ownership for the long-lived `hq-sync-runner --watch` process.
3
+ *
4
+ * The operation lock has a separate scope so a watch owner does not block
5
+ * one-shot sync/rescue work. Its lock record is the authority; the adjacent
6
+ * status JSON is an atomic, read-only projection for the daemon and desktop.
7
+ */
8
+ import { spawnSync } from "node:child_process";
9
+ import { randomUUID } from "node:crypto";
10
+ import * as fs from "node:fs";
11
+ import * as path from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { acquireOperationLock, lockPathFor, OperationLockedError, } from "./operation-lock.js";
14
+ export const WATCH_OWNER_LOCK_SCOPE = "watch-owner";
15
+ export const WATCH_OWNER_HEARTBEAT_INTERVAL_MS = 15_000;
16
+ const OWNER_LABEL = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
17
+ // PowerShell/CIM startup can exceed 3s on a cold Windows runner. This runs
18
+ // only when a lock is contended and stays bounded while allowing identity checks
19
+ // to finish before treating a recycled PID as an active sync runner.
20
+ const WINDOWS_PROCESS_INSPECTION_TIMEOUT_MS = 15_000;
21
+ const RUNNER_COMMAND = new RegExp(String.raw `(?:^|[\s/\\])(?:sync-runner\.js|hq-sync-runner(?:\.(?:cmd|exe))?)(?:[\s"']|$)`, "i");
22
+ /** Deterministic JSON status path for a canonical HQ root on this machine. */
23
+ export function watchOwnerStatusPathFor(hqRoot) {
24
+ const lockPath = lockPathFor(hqRoot, WATCH_OWNER_LOCK_SCOPE);
25
+ return lockPath.replace(/\.lock$/, ".json");
26
+ }
27
+ /** Read current status without acquiring or changing the owner lock. */
28
+ export function readWatchOwnerStatus(hqRoot) {
29
+ const statusPath = watchOwnerStatusPathFor(hqRoot);
30
+ try {
31
+ return JSON.parse(fs.readFileSync(statusPath, "utf8"));
32
+ }
33
+ catch (error) {
34
+ if (error?.code === "ENOENT")
35
+ return null;
36
+ throw error;
37
+ }
38
+ }
39
+ function packageVersion() {
40
+ const packagePath = fileURLToPath(new URL("../package.json", import.meta.url));
41
+ const parsed = JSON.parse(fs.readFileSync(packagePath, "utf8"));
42
+ if (typeof parsed.version !== "string" || parsed.version.length === 0) {
43
+ throw new Error(`hq-cloud package version is missing in ${packagePath}`);
44
+ }
45
+ return parsed.version;
46
+ }
47
+ function processCommandLine(pid) {
48
+ if (process.platform === "linux") {
49
+ try {
50
+ return fs.readFileSync(`/proc/${pid}/cmdline`).toString("utf8").replaceAll("\0", " ").trim();
51
+ }
52
+ catch (error) {
53
+ const code = error?.code;
54
+ if (code === "ENOENT" || code === "ESRCH")
55
+ return "";
56
+ process.stderr.write(`[sync] could not inspect process ${pid} for watch-owner liveness; conservatively treating it as active: ${error instanceof Error ? error.message : String(error)}\n`);
57
+ return null;
58
+ }
59
+ }
60
+ if (process.platform === "win32") {
61
+ const result = spawnSync("powershell.exe", [
62
+ "-NoProfile",
63
+ "-NonInteractive",
64
+ "-Command",
65
+ `$process = Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}"; if ($process) { if ($process.CommandLine) { [Console]::WriteLine($process.CommandLine) } else { [Console]::WriteLine('__PROCESS_EXISTS_NO_COMMAND_LINE__') } }`,
66
+ ], { encoding: "utf8", windowsHide: true, timeout: WINDOWS_PROCESS_INSPECTION_TIMEOUT_MS, maxBuffer: 64 * 1024 });
67
+ if (result.error) {
68
+ process.stderr.write(`[sync] could not inspect process ${pid} for watch-owner liveness; conservatively treating it as active: ${result.error.message}\n`);
69
+ return null;
70
+ }
71
+ if (result.status === 0) {
72
+ const commandLine = result.stdout.trim();
73
+ if (commandLine === "__PROCESS_EXISTS_NO_COMMAND_LINE__") {
74
+ process.stderr.write("[sync] process " + pid + " exists but its command line is unavailable; conservatively treating it as an active watch runner\n");
75
+ return null;
76
+ }
77
+ return commandLine;
78
+ }
79
+ process.stderr.write(`[sync] process inspection exited ${String(result.status)} for watch-owner pid ${pid}; conservatively treating it as active\n`);
80
+ return null;
81
+ }
82
+ const result = spawnSync("ps", ["-eww", "-o", "pid=,args="], {
83
+ encoding: "utf8",
84
+ timeout: 3_000,
85
+ maxBuffer: 16 * 1024 * 1024,
86
+ });
87
+ if (result.error) {
88
+ process.stderr.write(`[sync] could not inspect process ${pid} for watch-owner liveness; conservatively treating it as active: ${result.error.message}\n`);
89
+ return null;
90
+ }
91
+ if (result.status === 0) {
92
+ const pidPrefix = new RegExp(`^\\s*${pid}\\s+`);
93
+ const line = result.stdout.split(/\r?\n/).find((entry) => pidPrefix.test(entry));
94
+ if (!line)
95
+ return "";
96
+ const commandLine = line.replace(pidPrefix, "").trim();
97
+ return commandLine || null;
98
+ }
99
+ process.stderr.write(`[sync] process inspection exited ${String(result.status)} for watch-owner pid ${pid}; conservatively treating it as active\n`);
100
+ return null;
101
+ }
102
+ /**
103
+ * A live PID is not enough: a recycled PID may belong to an unrelated process.
104
+ * If process identity cannot be inspected, conservatively keep the lease busy.
105
+ */
106
+ const heldWatchOwnerLocks = new Set();
107
+ function isLiveSyncRunner(pid, lockPath) {
108
+ if (!Number.isInteger(pid) || pid <= 0)
109
+ return false;
110
+ if (pid === process.pid)
111
+ return heldWatchOwnerLocks.has(lockPath);
112
+ try {
113
+ process.kill(pid, 0);
114
+ }
115
+ catch (error) {
116
+ if (error?.code === "ESRCH")
117
+ return false;
118
+ // EPERM means the process exists; identity inspection decides if possible.
119
+ }
120
+ const commandLine = processCommandLine(pid);
121
+ return commandLine === null || RUNNER_COMMAND.test(commandLine);
122
+ }
123
+ function sameOperationLock(left, right) {
124
+ return left.pid === right.pid &&
125
+ left.command === right.command &&
126
+ left.startedAt === right.startedAt &&
127
+ left.hqRoot === right.hqRoot &&
128
+ left.mode === right.mode &&
129
+ left.owner === right.owner &&
130
+ left.version === right.version;
131
+ }
132
+ function describeFailure(error) {
133
+ return error instanceof Error ? error.message : String(error);
134
+ }
135
+ function writeJsonAtomicSync(filePath, value) {
136
+ const dir = path.dirname(filePath);
137
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
138
+ const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
139
+ let fd;
140
+ try {
141
+ fd = fs.openSync(tempPath, "wx", 0o600);
142
+ fs.writeFileSync(fd, `${JSON.stringify(value, null, 2)}\n`);
143
+ fs.fsyncSync(fd);
144
+ fs.closeSync(fd);
145
+ fd = undefined;
146
+ fs.renameSync(tempPath, filePath);
147
+ }
148
+ catch (error) {
149
+ if (fd !== undefined) {
150
+ try {
151
+ fs.closeSync(fd);
152
+ }
153
+ catch (closeError) {
154
+ process.stderr.write(`[sync] could not close temporary watch-owner status file: ${closeError instanceof Error ? closeError.message : String(closeError)}\n`);
155
+ }
156
+ }
157
+ try {
158
+ fs.rmSync(tempPath, { force: true });
159
+ }
160
+ catch (cleanupError) {
161
+ process.stderr.write(`[sync] could not remove temporary watch-owner status file: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`);
162
+ }
163
+ throw error;
164
+ }
165
+ }
166
+ async function writeJsonAtomic(filePath, value) {
167
+ const dir = path.dirname(filePath);
168
+ await fs.promises.mkdir(dir, { recursive: true, mode: 0o700 });
169
+ const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
170
+ let handle;
171
+ try {
172
+ handle = await fs.promises.open(tempPath, "wx", 0o600);
173
+ await handle.writeFile(`${JSON.stringify(value, null, 2)}\n`);
174
+ await handle.sync();
175
+ await handle.close();
176
+ handle = undefined;
177
+ await fs.promises.rename(tempPath, filePath);
178
+ }
179
+ catch (error) {
180
+ if (handle) {
181
+ try {
182
+ await handle.close();
183
+ }
184
+ catch (closeError) {
185
+ process.stderr.write(`[sync] could not close temporary watch-owner status file: ${closeError instanceof Error ? closeError.message : String(closeError)}\n`);
186
+ }
187
+ }
188
+ try {
189
+ await fs.promises.rm(tempPath, { force: true });
190
+ }
191
+ catch (cleanupError) {
192
+ process.stderr.write(`[sync] could not remove temporary watch-owner status file: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`);
193
+ }
194
+ throw error;
195
+ }
196
+ }
197
+ function removeStatusIfOwned(statusPath, identity) {
198
+ let status;
199
+ try {
200
+ status = JSON.parse(fs.readFileSync(statusPath, "utf8"));
201
+ }
202
+ catch (error) {
203
+ const code = error?.code;
204
+ // The HQ state directory can disappear or be replaced while a runner
205
+ // shuts down. In either case there is no readable status file to remove.
206
+ if (code === "ENOENT" || code === "ENOTDIR")
207
+ return;
208
+ throw error;
209
+ }
210
+ if (sameStatusIdentity(status, identity))
211
+ fs.rmSync(statusPath, { force: true });
212
+ }
213
+ function sameStatusIdentity(left, right) {
214
+ return left.owner === right.owner && left.pid === right.pid &&
215
+ left.version === right.version && left.startedAt === right.startedAt;
216
+ }
217
+ const activeStatusFiles = new Map();
218
+ let exitHookInstalled = false;
219
+ /** Exit-only fallback; graceful runner shutdown releases the lease after draining. */
220
+ function cleanupStatusFilesOnExit() {
221
+ for (const active of activeStatusFiles.values()) {
222
+ clearInterval(active.timer);
223
+ try {
224
+ const status = JSON.parse(fs.readFileSync(active.statusPath, "utf8"));
225
+ if (sameStatusIdentity(status, active.identity))
226
+ fs.rmSync(active.statusPath, { force: true });
227
+ }
228
+ catch (error) {
229
+ if (error?.code !== "ENOENT") {
230
+ process.stderr.write(`[sync] could not clear watch-owner status on exit: ${error instanceof Error ? error.message : String(error)}\n`);
231
+ }
232
+ }
233
+ }
234
+ activeStatusFiles.clear();
235
+ }
236
+ function installExitHookOnce() {
237
+ if (exitHookInstalled)
238
+ return;
239
+ exitHookInstalled = true;
240
+ process.on("exit", cleanupStatusFilesOnExit);
241
+ }
242
+ /** Acquire the required exclusive watch-owner lock before any sync activity. */
243
+ export function acquireWatchOwnerLease(hqRoot, owner = "unknown", options = {}) {
244
+ if (!OWNER_LABEL.test(owner)) {
245
+ throw new Error("--owner must be 1–64 letters, numbers, dots, underscores, or hyphens");
246
+ }
247
+ const version = options.version ?? packageVersion();
248
+ const heartbeatIntervalMs = options.heartbeatIntervalMs ?? WATCH_OWNER_HEARTBEAT_INTERVAL_MS;
249
+ if (!Number.isInteger(heartbeatIntervalMs) || heartbeatIntervalMs < 1) {
250
+ throw new Error("watch-owner heartbeat interval must be a positive integer");
251
+ }
252
+ const watchLockPath = lockPathFor(hqRoot, WATCH_OWNER_LOCK_SCOPE);
253
+ let operationLock;
254
+ try {
255
+ operationLock = acquireOperationLock(hqRoot, "sync-runner", {
256
+ scope: WATCH_OWNER_LOCK_SCOPE,
257
+ mode: "exclusive",
258
+ wait: false,
259
+ required: true,
260
+ owner,
261
+ version,
262
+ installSignalHandlers: false,
263
+ isHolderLive: (info) => isLiveSyncRunner(info.pid, watchLockPath),
264
+ });
265
+ }
266
+ catch (error) {
267
+ if (error instanceof OperationLockedError) {
268
+ return {
269
+ status: "busy",
270
+ owner: error.holder.owner ?? "unknown",
271
+ pid: error.holder.pid,
272
+ };
273
+ }
274
+ throw error;
275
+ }
276
+ heldWatchOwnerLocks.add(operationLock.path);
277
+ const statusPath = watchOwnerStatusPathFor(hqRoot);
278
+ const startedAt = new Date().toISOString();
279
+ let status = {
280
+ owner,
281
+ pid: process.pid,
282
+ version,
283
+ startedAt,
284
+ heartbeatAt: startedAt,
285
+ };
286
+ const identity = {
287
+ owner: status.owner,
288
+ pid: status.pid,
289
+ version: status.version,
290
+ startedAt: status.startedAt,
291
+ };
292
+ try {
293
+ writeJsonAtomicSync(statusPath, status);
294
+ }
295
+ catch (error) {
296
+ heldWatchOwnerLocks.delete(operationLock.path);
297
+ operationLock.release();
298
+ throw error;
299
+ }
300
+ let released = false;
301
+ let heartbeatEnabled = true;
302
+ let heartbeatTask = Promise.resolve();
303
+ let resolveLost;
304
+ const lost = new Promise((resolve) => {
305
+ resolveLost = resolve;
306
+ });
307
+ const timer = setInterval(() => {
308
+ if (released || !heartbeatEnabled)
309
+ return;
310
+ heartbeatTask = heartbeatTask
311
+ .then(async () => {
312
+ let current;
313
+ try {
314
+ current = JSON.parse(await fs.promises.readFile(statusPath, "utf8"));
315
+ }
316
+ catch (error) {
317
+ throw new Error(`watch-owner status file is missing or unreadable: ${describeFailure(error)}`);
318
+ }
319
+ if (!sameStatusIdentity(current, identity)) {
320
+ throw new Error("watch-owner status was replaced by another lease");
321
+ }
322
+ let currentLock;
323
+ try {
324
+ currentLock = JSON.parse(await fs.promises.readFile(operationLock.path, "utf8"));
325
+ }
326
+ catch (error) {
327
+ throw new Error(`watch-owner lock file is missing or unreadable: ${describeFailure(error)}`);
328
+ }
329
+ if (!sameOperationLock(currentLock, operationLock.info)) {
330
+ throw new Error("watch-owner lock was replaced by another lease");
331
+ }
332
+ status = { ...status, heartbeatAt: new Date().toISOString() };
333
+ await writeJsonAtomic(statusPath, status);
334
+ })
335
+ .catch((error) => {
336
+ heartbeatEnabled = false;
337
+ clearInterval(timer);
338
+ resolveLost(error instanceof Error ? error : new Error(String(error)));
339
+ });
340
+ }, heartbeatIntervalMs);
341
+ timer.unref();
342
+ const activeKey = `${statusPath}:${process.pid}:${startedAt}`;
343
+ activeStatusFiles.set(activeKey, { statusPath, identity, timer });
344
+ installExitHookOnce();
345
+ return {
346
+ status: "acquired",
347
+ lease: {
348
+ statusPath,
349
+ lost,
350
+ async release() {
351
+ if (released)
352
+ return;
353
+ released = true;
354
+ clearInterval(timer);
355
+ try {
356
+ await heartbeatTask;
357
+ removeStatusIfOwned(statusPath, identity);
358
+ }
359
+ finally {
360
+ activeStatusFiles.delete(activeKey);
361
+ heldWatchOwnerLocks.delete(operationLock.path);
362
+ operationLock.release();
363
+ }
364
+ },
365
+ },
366
+ };
367
+ }
368
+ //# sourceMappingURL=watch-owner-lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-owner-lease.js","sourceRoot":"","sources":["../src/watch-owner-lease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=watch-owner-lease.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-owner-lease.test.d.ts","sourceRoot":"","sources":["../src/watch-owner-lease.test.ts"],"names":[],"mappings":""}