@indigoai-us/hq-cloud 6.15.76 → 6.15.78

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 (81) hide show
  1. package/dist/bin/sync-runner-worker.d.ts +3 -0
  2. package/dist/bin/sync-runner-worker.d.ts.map +1 -0
  3. package/dist/bin/sync-runner-worker.js +88 -0
  4. package/dist/bin/sync-runner-worker.js.map +1 -0
  5. package/dist/bin/sync-runner.d.ts +3 -1
  6. package/dist/bin/sync-runner.d.ts.map +1 -1
  7. package/dist/bin/sync-runner.js +31 -13
  8. package/dist/bin/sync-runner.js.map +1 -1
  9. package/dist/bin/sync-runner.test.js +117 -1
  10. package/dist/bin/sync-runner.test.js.map +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.test.d.ts +2 -0
  16. package/dist/index.test.d.ts.map +1 -0
  17. package/dist/index.test.js +16 -0
  18. package/dist/index.test.js.map +1 -0
  19. package/dist/operation-lock.d.ts +31 -28
  20. package/dist/operation-lock.d.ts.map +1 -1
  21. package/dist/operation-lock.js +206 -50
  22. package/dist/operation-lock.js.map +1 -1
  23. package/dist/operation-lock.test.js +105 -1
  24. package/dist/operation-lock.test.js.map +1 -1
  25. package/dist/sync/area-resolver.d.ts +66 -0
  26. package/dist/sync/area-resolver.d.ts.map +1 -0
  27. package/dist/sync/area-resolver.js +306 -0
  28. package/dist/sync/area-resolver.js.map +1 -0
  29. package/dist/sync/area-resolver.test.d.ts +2 -0
  30. package/dist/sync/area-resolver.test.d.ts.map +1 -0
  31. package/dist/sync/area-resolver.test.js +211 -0
  32. package/dist/sync/area-resolver.test.js.map +1 -0
  33. package/dist/sync/child-process-sync-worker.d.ts +53 -0
  34. package/dist/sync/child-process-sync-worker.d.ts.map +1 -0
  35. package/dist/sync/child-process-sync-worker.js +256 -0
  36. package/dist/sync/child-process-sync-worker.js.map +1 -0
  37. package/dist/sync/child-process-sync-worker.test.d.ts +2 -0
  38. package/dist/sync/child-process-sync-worker.test.d.ts.map +1 -0
  39. package/dist/sync/child-process-sync-worker.test.js +262 -0
  40. package/dist/sync/child-process-sync-worker.test.js.map +1 -0
  41. package/dist/sync/index.d.ts +8 -0
  42. package/dist/sync/index.d.ts.map +1 -1
  43. package/dist/sync/index.js +4 -0
  44. package/dist/sync/index.js.map +1 -1
  45. package/dist/sync/parallel-sync-coordinator.d.ts +77 -0
  46. package/dist/sync/parallel-sync-coordinator.d.ts.map +1 -0
  47. package/dist/sync/parallel-sync-coordinator.js +292 -0
  48. package/dist/sync/parallel-sync-coordinator.js.map +1 -0
  49. package/dist/sync/parallel-sync-coordinator.test.d.ts +2 -0
  50. package/dist/sync/parallel-sync-coordinator.test.d.ts.map +1 -0
  51. package/dist/sync/parallel-sync-coordinator.test.js +303 -0
  52. package/dist/sync/parallel-sync-coordinator.test.js.map +1 -0
  53. package/dist/sync/path-leases.d.ts +31 -0
  54. package/dist/sync/path-leases.d.ts.map +1 -0
  55. package/dist/sync/path-leases.js +74 -0
  56. package/dist/sync/path-leases.js.map +1 -0
  57. package/dist/sync/path-leases.test.d.ts +2 -0
  58. package/dist/sync/path-leases.test.d.ts.map +1 -0
  59. package/dist/sync/path-leases.test.js +51 -0
  60. package/dist/sync/path-leases.test.js.map +1 -0
  61. package/dist/sync/state-store.d.ts +13 -0
  62. package/dist/sync/state-store.d.ts.map +1 -1
  63. package/dist/sync/state-store.js +158 -51
  64. package/dist/sync/state-store.js.map +1 -1
  65. package/dist/sync/state-store.test.js +148 -2
  66. package/dist/sync/state-store.test.js.map +1 -1
  67. package/dist/sync/sync-work.d.ts +66 -0
  68. package/dist/sync/sync-work.d.ts.map +1 -0
  69. package/dist/sync/sync-work.js +11 -0
  70. package/dist/sync/sync-work.js.map +1 -0
  71. package/dist/sync/sync-worker-port.d.ts +59 -0
  72. package/dist/sync/sync-worker-port.d.ts.map +1 -0
  73. package/dist/sync/sync-worker-port.js +67 -0
  74. package/dist/sync/sync-worker-port.js.map +1 -0
  75. package/dist/watcher.d.ts +6 -0
  76. package/dist/watcher.d.ts.map +1 -1
  77. package/dist/watcher.js +94 -9
  78. package/dist/watcher.js.map +1 -1
  79. package/dist/watcher.test.js +90 -0
  80. package/dist/watcher.test.js.map +1 -1
  81. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -72,8 +72,8 @@ export { listSignals } from "./signals/list.js";
72
72
  export { getSignal, SignalNotFoundError } from "./signals/get.js";
73
73
  export type { SignalSummary, SignalDocument, ListSignalsOptions, ListSignalsResult, GetSignalOptions, } from "./signals/types.js";
74
74
  export { _setSignalsS3Factory, _resetSignalsS3Factory, } from "./signals/internals.js";
75
- export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, } from "./sync/index.js";
76
- export type { PushEvent, PushEventInput, PushEventDecodeIssue, PushTransport, HttpPushTransportOptions, AuthTokenSource, FetchLike, EventDrivenPushFlagProvider, FlagProviderWarnFn, EnvTenantListFlagProviderOptions, } from "./sync/index.js";
75
+ export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, DefaultParallelSyncCoordinator, ChildProcessSyncWorkerAdapter, ChildProcessSyncWorkerError, InlineSyncWorkerAdapter, SYNC_WORKER_PROTOCOL_VERSION, assertSafeWorkerMessage, toWorkerExecuteMessage, } from "./sync/index.js";
76
+ export type { PushEvent, PushEventInput, PushEventDecodeIssue, PushTransport, HttpPushTransportOptions, AuthTokenSource, FetchLike, EventDrivenPushFlagProvider, FlagProviderWarnFn, EnvTenantListFlagProviderOptions, AreaId, ChildProcessSyncWorkerOptions, ChildWorkerIdentity, CanonicalPath, ChoreSyncWork, CoordinatorClock, CoordinatorSnapshot, InlineSyncWorkerHandler, ParallelSyncCoordinator, ParallelSyncCoordinatorOptions, PathIdentity, PathWorkOutcome, RealtimeSyncWork, ReconcileCursor, ScheduledPath, SyncWork, SyncWorkerAdapter, SyncWorkerClass, SyncWorkerTarget, WorkerChildMessage, WorkerExecuteMessage, WorkerParentMessage, WorkerProgressMessage, WorkerWorkSlice, WorkOutcome, WorkPathStatus, WorkSlice, } from "./sync/index.js";
77
77
  export { PushEventEmitter } from "./watcher.js";
78
78
  export type { PushEventEmitterOptions, TreeChangeBatch, TreeChangeListener, } from "./watcher.js";
79
79
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -95,7 +95,7 @@ export { getSignal, SignalNotFoundError } from "./signals/get.js";
95
95
  export { _setSignalsS3Factory, _resetSignalsS3Factory, } from "./signals/internals.js";
96
96
  // Event-driven sync — PushEvent wire contract + PushTransport shipping seam
97
97
  // (ported from hq-pro PR #112 per project event-driven-sync-menubar US-007).
98
- export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, } from "./sync/index.js";
98
+ export { CONTENT_HASH_PATTERN, ISO8601_DATETIME_PATTERN, PushEventSchema, PushEventDecodeError, encodePushEvent, decodePushEvent, NoopPushTransport, HttpPushTransport, EVENT_SYNC_LOCAL_DISABLE_ENV_VAR, isEventSyncLocallyDisabled, StaticFlagProvider, DefaultParallelSyncCoordinator, ChildProcessSyncWorkerAdapter, ChildProcessSyncWorkerError, InlineSyncWorkerAdapter, SYNC_WORKER_PROTOCOL_VERSION, assertSafeWorkerMessage, toWorkerExecuteMessage, } from "./sync/index.js";
99
99
  // US-008 — watcher PushEvent emitter (bridges TreeWatcher → PushTransport,
100
100
  // flag-gated, failure-safe).
101
101
  export { PushEventEmitter } from "./watcher.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { DefaultParallelSyncCoordinator } from "./index.js";
3
+ describe("package entry point", () => {
4
+ it("exports the parallel sync coordinator and semantic work contract", () => {
5
+ const work = {
6
+ class: "realtime",
7
+ source: "watcher",
8
+ direction: "push",
9
+ paths: ["notes/today"],
10
+ causality: "entry-point-test",
11
+ };
12
+ expect(DefaultParallelSyncCoordinator).toBeTypeOf("function");
13
+ expect(work.class).toBe("realtime");
14
+ });
15
+ });
16
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,8BAA8B,EAAiB,MAAM,YAAY,CAAC;AAE3E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,IAAI,GAAa;YACrB,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,MAAM;YACjB,KAAK,EAAE,CAAC,aAAa,CAAC;YACtB,SAAS,EAAE,kBAAkB;SAC9B,CAAC;QAEF,MAAM,CAAC,8BAA8B,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,12 +1,13 @@
1
1
  /**
2
- * Per-HQ-root mutual exclusion for the long-running operations
3
- * (`sync`, `rescue`, `reindex`).
2
+ * Per-HQ-root operation gate for long-running operations (`sync`, `rescue`,
3
+ * `reindex`).
4
4
  *
5
5
  * Contract:
6
- * - `sync` and `rescue` share ONE per-root lock (the "operation" scope, keyed
7
- * only by the root, not the command), so at most one of them runs at a time
8
- * and e.g. a rescue refuses while a sync holds it. Different HQ roots are
9
- * fully independent they hash to different lock files.
6
+ * - Normal `sync` processes publish distinct shared worker memberships. This
7
+ * lets workers mutate independent paths concurrently. `rescue` (and a
8
+ * format-changing migration) take the same per-root gate exclusively: its
9
+ * queued writer intent stops later shared admissions, then it waits for the
10
+ * already-admitted worker PIDs to leave. Different HQ roots are independent.
10
11
  * - `reindex` uses a SEPARATE per-root scope ("reindex"), so it is guarded
11
12
  * against other reindexes but is NOT blocked by a held sync/rescue lock.
12
13
  * This is deliberate: a watch-mode `hq-sync-runner` holds the "operation"
@@ -22,7 +23,8 @@
22
23
  *
23
24
  * ## Where the lock lives — and why
24
25
  *
25
- * `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`, where
26
+ * `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`, plus short-lived
27
+ * admission, writer-intent, and per-PID membership siblings, where
26
28
  * `stateDir = $HQ_STATE_DIR || ~/.hq`. This is deliberately NOT inside the HQ
27
29
  * root:
28
30
  * - It must never round-trip to the cloud. A lock is machine-local, per-run
@@ -38,12 +40,11 @@
38
40
  *
39
41
  * ## Atomicity, liveness, takeover
40
42
  *
41
- * - Acquisition writes the full owner payload to a same-directory temp file,
42
- * fsyncs it, then publishes that complete file into the final lock name
43
- * with create-if-absent semantics. Exactly one racer can publish; the loser
44
- * sees EEXIST and re-evaluates.
45
- * - The lock records the holder's `{ pid, command, startedAt, hqRoot }`. On
46
- * EEXIST we test the recorded PID with `process.kill(pid, 0)`:
43
+ * - Every gate record is fully written to a same-directory temp file, fsynced,
44
+ * and published with create-if-absent semantics. The short admission record
45
+ * serializes only membership transitions, never a sync pass or network I/O.
46
+ * - Gate records carry `{ pid, command, startedAt, hqRoot, mode }`. On an
47
+ * existing record we test its PID with `process.kill(pid, 0)`:
47
48
  * * ESRCH → the holder is gone (crashed / killed -9 / stale file) →
48
49
  * reclaim the lock IMMEDIATELY (a dead holder never makes us
49
50
  * wait).
@@ -97,8 +98,8 @@
97
98
  * - Normal exit: the `with*` wrappers release in a `finally`.
98
99
  * - Signals (SIGINT/SIGTERM): a one-time handler releases every held lock,
99
100
  * then re-raises the default disposition so exit status is unchanged.
100
- * - Hard crash (SIGKILL / power loss): nothing runs, but the stale-PID
101
- * takeover above reclaims the lock on the next attempt.
101
+ * - Hard crash (SIGKILL / power loss): nothing runs, but a later gate
102
+ * contender reclaims dead exclusive owners and dead shared memberships.
102
103
  * - `process.on("exit")`: a final best-effort synchronous unlink.
103
104
  *
104
105
  * ## Escape hatch
@@ -121,7 +122,16 @@ export interface LockInfo {
121
122
  startedAt: string;
122
123
  /** Canonical HQ root the lock guards (diagnostic only). */
123
124
  hqRoot: string;
125
+ /** Gate role. Omitted payloads are legacy exclusive mutex holders. */
126
+ mode?: OperationLockMode;
124
127
  }
128
+ /**
129
+ * Normal sync processes hold shared membership. Repair and migration callers
130
+ * hold exclusive ownership. The explicit option is primarily for callers whose
131
+ * command is not named `sync`; the historical API continues to classify the
132
+ * `sync` command as shared and every other command as exclusive.
133
+ */
134
+ export type OperationLockMode = "shared" | "exclusive";
125
135
  /** Thrown by `acquireOperationLock` when a LIVE holder owns the lock. */
126
136
  export declare class OperationLockedError extends Error {
127
137
  readonly holder: LockInfo;
@@ -195,6 +205,8 @@ export interface AcquireOptions {
195
205
  * against other reindexes without being blocked by a held sync/rescue lock.
196
206
  */
197
207
  scope?: string;
208
+ /** Override the command-derived gate role for this acquisition. */
209
+ mode?: OperationLockMode;
198
210
  }
199
211
  /**
200
212
  * Default lock scope. `sync` and `rescue` share this one so they stay mutually
@@ -222,20 +234,11 @@ export declare function lockPathFor(hqRoot: string, scope?: string): string;
222
234
  * `fs.openSync` (see operation-lock.test.ts, HQ-CLI-2).
223
235
  */
224
236
  export declare function rethrowLockCreateError(err: unknown, lockDir: string): never;
225
- /**
226
- * Acquire the per-root operation lock for `command` (synchronous). Returns a
227
- * {@link LockHandle} on success. Against a LIVE holder it WAITS by default
228
- * (polling, blocking the thread) and acquires the moment the holder releases;
229
- * pass `timeoutSec`/`wait` (or set `HQ_OP_LOCK_TIMEOUT`) to bound or disable the
230
- * wait — on expiry it throws {@link OperationLockedError}. A stale lock (dead
231
- * holder) is reclaimed immediately, never waited on.
232
- */
237
+ /** Acquire the operation gate synchronously. Watch-loop probes always pass a
238
+ * zero timeout; all wait-capable parent paths use the async counterpart below. */
233
239
  export declare function acquireOperationLock(hqRoot: string, command: string, opts?: AcquireOptions): LockHandle;
234
- /**
235
- * Async counterpart to {@link acquireOperationLock}. Identical semantics, but
236
- * the wait yields the event loop (via `setTimeout`) instead of blocking the
237
- * thread — required for the async `sync` runner.
238
- */
240
+ /** Async gate acquisition. This is the only wait-capable path used by the
241
+ * parent watch loop, so maintenance waits never block watcher heartbeats. */
239
242
  export declare function acquireOperationLockAsync(hqRoot: string, command: string, opts?: AcquireOptions): Promise<LockHandle>;
240
243
  /** Run `fn` while holding the per-root lock for `command` (async). */
241
244
  export declare function withOperationLock<T>(hqRoot: string, command: string, fn: () => Promise<T>, opts?: AcquireOptions): Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"operation-lock.d.ts","sourceRoot":"","sources":["../src/operation-lock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operation-lock.d.ts","sourceRoot":"","sources":["../src/operation-lock.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  /**
2
- * Per-HQ-root mutual exclusion for the long-running operations
3
- * (`sync`, `rescue`, `reindex`).
2
+ * Per-HQ-root operation gate for long-running operations (`sync`, `rescue`,
3
+ * `reindex`).
4
4
  *
5
5
  * Contract:
6
- * - `sync` and `rescue` share ONE per-root lock (the "operation" scope, keyed
7
- * only by the root, not the command), so at most one of them runs at a time
8
- * and e.g. a rescue refuses while a sync holds it. Different HQ roots are
9
- * fully independent they hash to different lock files.
6
+ * - Normal `sync` processes publish distinct shared worker memberships. This
7
+ * lets workers mutate independent paths concurrently. `rescue` (and a
8
+ * format-changing migration) take the same per-root gate exclusively: its
9
+ * queued writer intent stops later shared admissions, then it waits for the
10
+ * already-admitted worker PIDs to leave. Different HQ roots are independent.
10
11
  * - `reindex` uses a SEPARATE per-root scope ("reindex"), so it is guarded
11
12
  * against other reindexes but is NOT blocked by a held sync/rescue lock.
12
13
  * This is deliberate: a watch-mode `hq-sync-runner` holds the "operation"
@@ -22,7 +23,8 @@
22
23
  *
23
24
  * ## Where the lock lives — and why
24
25
  *
25
- * `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`, where
26
+ * `<stateDir>/locks/operation-<hash(canonicalRoot)>.lock`, plus short-lived
27
+ * admission, writer-intent, and per-PID membership siblings, where
26
28
  * `stateDir = $HQ_STATE_DIR || ~/.hq`. This is deliberately NOT inside the HQ
27
29
  * root:
28
30
  * - It must never round-trip to the cloud. A lock is machine-local, per-run
@@ -38,12 +40,11 @@
38
40
  *
39
41
  * ## Atomicity, liveness, takeover
40
42
  *
41
- * - Acquisition writes the full owner payload to a same-directory temp file,
42
- * fsyncs it, then publishes that complete file into the final lock name
43
- * with create-if-absent semantics. Exactly one racer can publish; the loser
44
- * sees EEXIST and re-evaluates.
45
- * - The lock records the holder's `{ pid, command, startedAt, hqRoot }`. On
46
- * EEXIST we test the recorded PID with `process.kill(pid, 0)`:
43
+ * - Every gate record is fully written to a same-directory temp file, fsynced,
44
+ * and published with create-if-absent semantics. The short admission record
45
+ * serializes only membership transitions, never a sync pass or network I/O.
46
+ * - Gate records carry `{ pid, command, startedAt, hqRoot, mode }`. On an
47
+ * existing record we test its PID with `process.kill(pid, 0)`:
47
48
  * * ESRCH → the holder is gone (crashed / killed -9 / stale file) →
48
49
  * reclaim the lock IMMEDIATELY (a dead holder never makes us
49
50
  * wait).
@@ -97,8 +98,8 @@
97
98
  * - Normal exit: the `with*` wrappers release in a `finally`.
98
99
  * - Signals (SIGINT/SIGTERM): a one-time handler releases every held lock,
99
100
  * then re-raises the default disposition so exit status is unchanged.
100
- * - Hard crash (SIGKILL / power loss): nothing runs, but the stale-PID
101
- * takeover above reclaims the lock on the next attempt.
101
+ * - Hard crash (SIGKILL / power loss): nothing runs, but a later gate
102
+ * contender reclaims dead exclusive owners and dead shared memberships.
102
103
  * - `process.on("exit")`: a final best-effort synchronous unlink.
103
104
  *
104
105
  * ## Escape hatch
@@ -127,9 +128,9 @@ export class OperationLockedError extends Error {
127
128
  `running for this HQ root — "${holder.command}" (pid ${holder.pid}, ` +
128
129
  `started ${holder.startedAt}). Wait for it to finish, or stop that ` +
129
130
  `process, then retry.`);
131
+ this.name = "OperationLockedError";
130
132
  this.holder = holder;
131
133
  this.attempted = attempted;
132
- this.name = "OperationLockedError";
133
134
  }
134
135
  }
135
136
  /**
@@ -155,9 +156,9 @@ export class OperationLockUnwritableError extends Error {
155
156
  `it writable (e.g. "sudo chown -R $(whoami) ~/.hq"), or point HQ at a ` +
156
157
  `writable state directory with HQ_STATE_DIR=<dir>. To bypass the lock for ` +
157
158
  `a single run (drops concurrency protection), set HQ_DISABLE_OP_LOCK=1.`);
159
+ this.name = "OperationLockUnwritableError";
158
160
  this.lockDir = lockDir;
159
161
  this.cause = cause;
160
- this.name = "OperationLockUnwritableError";
161
162
  }
162
163
  }
163
164
  /** Default poll interval while waiting on a live holder. */
@@ -278,6 +279,12 @@ function readLockInfo(p) {
278
279
  function waiterPrefixFor(p) {
279
280
  return `${path.basename(p)}.wait-`;
280
281
  }
282
+ function sharedMemberPrefixFor(p) {
283
+ return `${path.basename(p)}.shared-`;
284
+ }
285
+ function admissionPathFor(p) {
286
+ return `${p}.admission`;
287
+ }
281
288
  /** Publish this process's wait intent before it starts racing for the mutex. */
282
289
  function registerWaiter(p, payload) {
283
290
  const waiterPath = `${p}.wait-${process.pid}-${crypto.randomBytes(6).toString("hex")}`;
@@ -371,12 +378,12 @@ function installHooksOnce() {
371
378
  hooksInstalled = true;
372
379
  process.on("exit", () => {
373
380
  for (const h of heldLocks)
374
- unlinkIfOwned(h.path);
381
+ h.release();
375
382
  });
376
383
  for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"]) {
377
384
  process.on(sig, () => {
378
385
  for (const h of heldLocks)
379
- unlinkIfOwned(h.path);
386
+ h.release();
380
387
  // Re-raise with the default disposition so the exit status is the normal
381
388
  // signal status (and a second Ctrl-C still works). Removing our listener
382
389
  // first avoids recursing back into this handler.
@@ -386,10 +393,14 @@ function installHooksOnce() {
386
393
  }
387
394
  }
388
395
  function makeHandle(p, info) {
396
+ let released = false;
389
397
  const handle = {
390
398
  path: p,
391
399
  info,
392
400
  release() {
401
+ if (released)
402
+ return;
403
+ released = true;
393
404
  heldLocks.delete(handle);
394
405
  unlinkIfOwned(p);
395
406
  },
@@ -433,7 +444,7 @@ export function rethrowLockCreateError(err, lockDir) {
433
444
  throw err;
434
445
  }
435
446
  /** Build the lock payload + ensure the locks dir exists. */
436
- function prepareLock(hqRoot, command, scope = DEFAULT_LOCK_SCOPE) {
447
+ function prepareLock(hqRoot, command, scope = DEFAULT_LOCK_SCOPE, mode) {
437
448
  const p = lockPathFor(hqRoot, scope);
438
449
  const dir = path.dirname(p);
439
450
  try {
@@ -449,6 +460,7 @@ function prepareLock(hqRoot, command, scope = DEFAULT_LOCK_SCOPE) {
449
460
  command,
450
461
  startedAt: new Date().toISOString(),
451
462
  hqRoot: canonicalRoot(hqRoot),
463
+ mode,
452
464
  };
453
465
  return { p, info, payload: JSON.stringify(info, null, 2) };
454
466
  }
@@ -552,33 +564,184 @@ function tryAcquireOnce(p, info, payload) {
552
564
  function remainingMs(deadline) {
553
565
  return deadline === null ? Infinity : deadline - Date.now();
554
566
  }
555
- /**
556
- * Acquire the per-root operation lock for `command` (synchronous). Returns a
557
- * {@link LockHandle} on success. Against a LIVE holder it WAITS by default
558
- * (polling, blocking the thread) and acquires the moment the holder releases;
559
- * pass `timeoutSec`/`wait` (or set `HQ_OP_LOCK_TIMEOUT`) to bound or disable the
560
- * wait — on expiry it throws {@link OperationLockedError}. A stale lock (dead
561
- * holder) is reclaimed immediately, never waited on.
562
- */
567
+ function operationMode(command, opts) {
568
+ return opts.mode ?? (command === "sync" ? "shared" : "exclusive");
569
+ }
570
+ /** Legacy payloads had no mode and were mutex holders, so keep them exclusive. */
571
+ function isSharedMarker(info) {
572
+ return info?.mode === "shared";
573
+ }
574
+ function existingExclusiveBlocker(p) {
575
+ const marker = readLockInfo(p);
576
+ if (marker && !isSharedMarker(marker)) {
577
+ if (pidAlive(marker.pid))
578
+ return marker;
579
+ try {
580
+ fs.unlinkSync(p);
581
+ }
582
+ catch {
583
+ /* a contender replaced or reclaimed it; the next pass re-evaluates */
584
+ }
585
+ }
586
+ if (!marker && fs.existsSync(p))
587
+ return initializingLockInfo(p);
588
+ return findLiveWaiter(p);
589
+ }
590
+ /** Read the worker leases, deleting only leases whose owning PID is dead. */
591
+ function liveSharedMembers(p) {
592
+ const dir = path.dirname(p);
593
+ const prefix = sharedMemberPrefixFor(p);
594
+ let entries;
595
+ try {
596
+ entries = fs.readdirSync(dir).filter((entry) => entry.startsWith(prefix));
597
+ }
598
+ catch (err) {
599
+ if (err?.code === "ENOENT")
600
+ return [];
601
+ throw err;
602
+ }
603
+ const members = [];
604
+ for (const entry of entries) {
605
+ const memberPath = path.join(dir, entry);
606
+ const member = readLockInfo(memberPath);
607
+ const encodedPid = Number(entry.slice(prefix.length).split("-", 1)[0]);
608
+ const pid = member?.pid ?? encodedPid;
609
+ if (pidAlive(pid)) {
610
+ members.push(member ?? initializingLockInfo(memberPath));
611
+ continue;
612
+ }
613
+ try {
614
+ fs.unlinkSync(memberPath);
615
+ }
616
+ catch {
617
+ /* another process already cleaned this dead membership */
618
+ }
619
+ }
620
+ return members;
621
+ }
622
+ function makeSharedHandle(p, memberPath, info) {
623
+ let released = false;
624
+ const handle = {
625
+ // Keep the historical path observable for callers and diagnostics. The
626
+ // distinct member file, rather than this marker, owns one worker lease.
627
+ path: p,
628
+ info,
629
+ release() {
630
+ if (released)
631
+ return;
632
+ released = true;
633
+ heldLocks.delete(handle);
634
+ unlinkIfOwned(memberPath);
635
+ // Marker cleanup is cosmetic and happens behind the short admission
636
+ // turnstile. A failed opportunistic cleanup is safe: the next admission
637
+ // or exclusive attempt observes zero live members and removes it.
638
+ const admission = admissionPathFor(p);
639
+ const acquired = tryAcquireOnce(admission, info, JSON.stringify(info));
640
+ if (!("handle" in acquired))
641
+ return;
642
+ try {
643
+ if (liveSharedMembers(p).length === 0 && isSharedMarker(readLockInfo(p))) {
644
+ fs.unlinkSync(p);
645
+ }
646
+ }
647
+ catch (err) {
648
+ if (err?.code !== "ENOENT")
649
+ throw err;
650
+ }
651
+ finally {
652
+ acquired.handle.release();
653
+ }
654
+ },
655
+ };
656
+ heldLocks.add(handle);
657
+ installHooksOnce();
658
+ return handle;
659
+ }
660
+ function tryAcquireShared(p, info, payload) {
661
+ const initialBlocker = existingExclusiveBlocker(p);
662
+ if (initialBlocker)
663
+ return { busy: initialBlocker };
664
+ const admission = tryAcquireOnce(admissionPathFor(p), info, payload);
665
+ if (!("handle" in admission))
666
+ return admission;
667
+ try {
668
+ // A maintenance waiter may have appeared while we were waiting for the
669
+ // turnstile. Re-check under it; this is the writer-preference boundary.
670
+ const blocker = existingExclusiveBlocker(p);
671
+ if (blocker)
672
+ return { busy: blocker };
673
+ const memberPath = `${p}.shared-${process.pid}-${crypto.randomBytes(6).toString("hex")}`;
674
+ if (!publishLockPayload(memberPath, payload)) {
675
+ throw new Error(`Could not publish HQ shared operation membership at ${memberPath}`);
676
+ }
677
+ if (!fs.existsSync(p) && !publishLockPayload(p, payload)) {
678
+ // The only possible contender under admission is a legacy/corrupt writer.
679
+ unlinkIfOwned(memberPath);
680
+ return { busy: existingExclusiveBlocker(p) ?? initializingLockInfo(p) };
681
+ }
682
+ return { handle: makeSharedHandle(p, memberPath, info) };
683
+ }
684
+ finally {
685
+ admission.handle.release();
686
+ }
687
+ }
688
+ function tryAcquireExclusive(p, info, payload) {
689
+ const admission = tryAcquireOnce(admissionPathFor(p), info, payload);
690
+ if (!("handle" in admission))
691
+ return admission;
692
+ try {
693
+ let marker = readLockInfo(p);
694
+ if (marker && !isSharedMarker(marker)) {
695
+ if (pidAlive(marker.pid))
696
+ return { busy: marker };
697
+ try {
698
+ fs.unlinkSync(p);
699
+ }
700
+ catch {
701
+ /* a contender replaced or reclaimed it; retry through the busy path */
702
+ }
703
+ marker = readLockInfo(p);
704
+ if (marker && !isSharedMarker(marker))
705
+ return { busy: marker };
706
+ }
707
+ if (!marker && fs.existsSync(p))
708
+ return { busy: initializingLockInfo(p) };
709
+ if (marker && liveSharedMembers(p).length > 0)
710
+ return { busy: marker };
711
+ if (marker)
712
+ fs.unlinkSync(p); // zero members, still protected by admission
713
+ if (!publishLockPayload(p, payload)) {
714
+ return { busy: readLockInfo(p) ?? initializingLockInfo(p) };
715
+ }
716
+ return { handle: makeHandle(p, info) };
717
+ }
718
+ finally {
719
+ admission.handle.release();
720
+ }
721
+ }
722
+ function tryAcquireGate(mode, p, info, payload) {
723
+ return mode === "shared"
724
+ ? tryAcquireShared(p, info, payload)
725
+ : tryAcquireExclusive(p, info, payload);
726
+ }
727
+ /** Acquire the operation gate synchronously. Watch-loop probes always pass a
728
+ * zero timeout; all wait-capable parent paths use the async counterpart below. */
563
729
  export function acquireOperationLock(hqRoot, command, opts = {}) {
564
730
  if (process.env.HQ_DISABLE_OP_LOCK === "1")
565
731
  return disabledHandle(hqRoot, command);
566
- const { p, info, payload } = prepareLock(hqRoot, command, opts.scope);
732
+ const mode = operationMode(command, opts);
733
+ const { p, info, payload } = prepareLock(hqRoot, command, opts.scope, mode);
567
734
  const cfg = resolveWaitConfig(opts);
568
735
  const deadline = cfg.timeoutMs === null ? null : Date.now() + cfg.timeoutMs;
569
736
  let announced = false;
570
- const waiterPath = cfg.timeoutMs !== 0 && opts.deferToWaiters !== true
571
- ? registerWaiter(p, payload)
572
- : null;
737
+ // Exclusive callers announce intent before the turnstile. New shared workers
738
+ // then wait behind the maintenance request instead of repeatedly overtaking it.
739
+ const waiterPath = mode === "exclusive" && cfg.timeoutMs !== 0 ? registerWaiter(p, payload) : null;
573
740
  try {
574
741
  for (;;) {
575
- const priorWaiter = opts.deferToWaiters ? findLiveWaiter(p) : null;
576
- const res = priorWaiter
577
- ? { busy: priorWaiter }
578
- : tryAcquireOnce(p, info, payload);
742
+ const res = tryAcquireGate(mode, p, info, payload);
579
743
  if ("handle" in res)
580
744
  return res.handle;
581
- // A live holder or prior waiter blocked us. Decide: refuse now, or wait.
582
745
  if (remainingMs(deadline) <= 0)
583
746
  throw new OperationLockedError(res.busy, command);
584
747
  if (!announced) {
@@ -592,27 +755,20 @@ export function acquireOperationLock(hqRoot, command, opts = {}) {
592
755
  removeWaiter(waiterPath);
593
756
  }
594
757
  }
595
- /**
596
- * Async counterpart to {@link acquireOperationLock}. Identical semantics, but
597
- * the wait yields the event loop (via `setTimeout`) instead of blocking the
598
- * thread — required for the async `sync` runner.
599
- */
758
+ /** Async gate acquisition. This is the only wait-capable path used by the
759
+ * parent watch loop, so maintenance waits never block watcher heartbeats. */
600
760
  export async function acquireOperationLockAsync(hqRoot, command, opts = {}) {
601
761
  if (process.env.HQ_DISABLE_OP_LOCK === "1")
602
762
  return disabledHandle(hqRoot, command);
603
- const { p, info, payload } = prepareLock(hqRoot, command, opts.scope);
763
+ const mode = operationMode(command, opts);
764
+ const { p, info, payload } = prepareLock(hqRoot, command, opts.scope, mode);
604
765
  const cfg = resolveWaitConfig(opts);
605
766
  const deadline = cfg.timeoutMs === null ? null : Date.now() + cfg.timeoutMs;
606
767
  let announced = false;
607
- const waiterPath = cfg.timeoutMs !== 0 && opts.deferToWaiters !== true
608
- ? registerWaiter(p, payload)
609
- : null;
768
+ const waiterPath = mode === "exclusive" && cfg.timeoutMs !== 0 ? registerWaiter(p, payload) : null;
610
769
  try {
611
770
  for (;;) {
612
- const priorWaiter = opts.deferToWaiters ? findLiveWaiter(p) : null;
613
- const res = priorWaiter
614
- ? { busy: priorWaiter }
615
- : tryAcquireOnce(p, info, payload);
771
+ const res = tryAcquireGate(mode, p, info, payload);
616
772
  if ("handle" in res)
617
773
  return res.handle;
618
774
  if (remainingMs(deadline) <= 0)