@indigoai-us/hq-cloud 6.15.42 → 6.15.44

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 (62) hide show
  1. package/dist/bin/sync-runner-company.d.ts +3 -0
  2. package/dist/bin/sync-runner-company.d.ts.map +1 -1
  3. package/dist/bin/sync-runner-company.js +50 -14
  4. package/dist/bin/sync-runner-company.js.map +1 -1
  5. package/dist/bin/sync-runner-company.test.js +135 -0
  6. package/dist/bin/sync-runner-company.test.js.map +1 -1
  7. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
  8. package/dist/bin/sync-runner-watch-loop.js +33 -1
  9. package/dist/bin/sync-runner-watch-loop.js.map +1 -1
  10. package/dist/bin/sync-runner.d.ts +5 -5
  11. package/dist/bin/sync-runner.d.ts.map +1 -1
  12. package/dist/bin/sync-runner.js +3 -0
  13. package/dist/bin/sync-runner.js.map +1 -1
  14. package/dist/bin/sync-runner.test.js +96 -2
  15. package/dist/bin/sync-runner.test.js.map +1 -1
  16. package/dist/cli/share.d.ts +5 -17
  17. package/dist/cli/share.d.ts.map +1 -1
  18. package/dist/cli/share.js +16 -77
  19. package/dist/cli/share.js.map +1 -1
  20. package/dist/cli/share.test.js +48 -99
  21. package/dist/cli/share.test.js.map +1 -1
  22. package/dist/cli/sync.d.ts +16 -18
  23. package/dist/cli/sync.d.ts.map +1 -1
  24. package/dist/cli/sync.js +16 -72
  25. package/dist/cli/sync.js.map +1 -1
  26. package/dist/cli/sync.test.js +40 -59
  27. package/dist/cli/sync.test.js.map +1 -1
  28. package/dist/cli/tombstones.d.ts +23 -8
  29. package/dist/cli/tombstones.d.ts.map +1 -1
  30. package/dist/cli/tombstones.js +63 -33
  31. package/dist/cli/tombstones.js.map +1 -1
  32. package/dist/cli/tombstones.test.d.ts +2 -0
  33. package/dist/cli/tombstones.test.d.ts.map +1 -0
  34. package/dist/cli/tombstones.test.js +27 -0
  35. package/dist/cli/tombstones.test.js.map +1 -0
  36. package/dist/cli/watch-event-push-conflict.test.js +7 -0
  37. package/dist/cli/watch-event-push-conflict.test.js.map +1 -1
  38. package/dist/local-path-codec.test.js +20 -0
  39. package/dist/local-path-codec.test.js.map +1 -1
  40. package/dist/s3.d.ts +1 -1
  41. package/dist/s3.d.ts.map +1 -1
  42. package/dist/s3.js +7 -23
  43. package/dist/s3.js.map +1 -1
  44. package/dist/s3.test.js +13 -20
  45. package/dist/s3.test.js.map +1 -1
  46. package/dist/sync-core.d.ts +16 -0
  47. package/dist/sync-core.d.ts.map +1 -1
  48. package/dist/sync-core.js +38 -0
  49. package/dist/sync-core.js.map +1 -1
  50. package/dist/sync-progress.d.ts +18 -1
  51. package/dist/sync-progress.d.ts.map +1 -1
  52. package/dist/sync-progress.js +113 -7
  53. package/dist/sync-progress.js.map +1 -1
  54. package/dist/sync-progress.test.js +32 -2
  55. package/dist/sync-progress.test.js.map +1 -1
  56. package/dist/watcher.d.ts +37 -8
  57. package/dist/watcher.d.ts.map +1 -1
  58. package/dist/watcher.js +137 -23
  59. package/dist/watcher.js.map +1 -1
  60. package/dist/watcher.test.js +116 -9
  61. package/dist/watcher.test.js.map +1 -1
  62. package/package.json +1 -1
@@ -10,6 +10,7 @@ import type { ConflictStrategy } from "./conflict.js";
10
10
  import type { SyncProgressEvent } from "./sync.js";
11
11
  import { type CompanyTombstone } from "./tombstones.js";
12
12
  import { type ScopePrefixInput } from "../prefix-coalesce.js";
13
+ import { type TransferSemaphore } from "../sync-core.js";
13
14
  /**
14
15
  * Local-only ephemeral artifacts: conflict-side files written whenever a
15
16
  * 3-way merge preserves the displaced side for inspection. Depending on the
@@ -131,23 +132,6 @@ export declare function isEphemeralPath(p: string): boolean;
131
132
  * (skip-excluded-policy), symmetric with the ephemeral-mirror filter above.
132
133
  */
133
134
  export declare function isMalformedVaultKey(key: string): boolean;
134
- /**
135
- * A remote key that begins with `companies/<slug>/` is legitimate ONLY in a
136
- * PERSONAL vault, where it is handled by the dedicated `personalMode` branch
137
- * in `computePullPlan` (companies/* content a peer machine pushed into the
138
- * personal bucket). A COMPANY-scoped vault is already anchored at its company
139
- * root, so its keys are bucket-relative — a `companies/...` key there is a
140
- * doubly-scoped corrupt object. The vault-service refuses to presign such a
141
- * key on GET/HEAD with `INVALID_KEY_COMPANIES_SCOPED`, so the puller can
142
- * never materialize it and the whole company sync wedges at `errored` (runner
143
- * exit 2) on every run. Verified live 2026-06-16: frogbear's
144
- * `companies/frogbear/drafts/reports/frogbear-signals-report-2026-06-15.html`
145
- * was uploaded with a doubled key and broke every sync thereafter. The pull
146
- * and tombstone walkers refuse these keys (skip-excluded-policy), symmetric
147
- * with the malformed-(backslash)-key filter above; the bogus objects
148
- * themselves are cleaned server-side.
149
- */
150
- export declare function isForbiddenCompanyVaultKey(key: string, personalMode: boolean): boolean;
151
135
  /**
152
136
  * Test-only export. Kept under a `_testing` namespace so the module's public
153
137
  * surface stays focused on `share()` / `ShareOptions` / `ShareResult` while
@@ -287,6 +271,10 @@ export interface ShareOptions {
287
271
  * This is the seam `hq-sync-runner` uses to stream ndjson for push events.
288
272
  */
289
273
  onEvent?: (event: SyncProgressEvent) => void;
274
+ /** See SyncOptions.transferSemaphore: shared across concurrent fanout legs. */
275
+ transferSemaphore?: TransferSemaphore;
276
+ /** See SyncOptions.progressRecorder: fanout writes one aggregate snapshot. */
277
+ progressRecorder?: (event: SyncProgressEvent) => void;
290
278
  /**
291
279
  * Watch-runner liveness callback for long synchronous file walks and hash
292
280
  * planning. The caller owns throttling; one-shot CLI callers omit it.
@@ -1 +1 @@
1
- {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"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"}
package/dist/cli/share.js CHANGED
@@ -202,25 +202,6 @@ export function isEphemeralPath(p) {
202
202
  export function isMalformedVaultKey(key) {
203
203
  return key.includes("\\");
204
204
  }
205
- /**
206
- * A remote key that begins with `companies/<slug>/` is legitimate ONLY in a
207
- * PERSONAL vault, where it is handled by the dedicated `personalMode` branch
208
- * in `computePullPlan` (companies/* content a peer machine pushed into the
209
- * personal bucket). A COMPANY-scoped vault is already anchored at its company
210
- * root, so its keys are bucket-relative — a `companies/...` key there is a
211
- * doubly-scoped corrupt object. The vault-service refuses to presign such a
212
- * key on GET/HEAD with `INVALID_KEY_COMPANIES_SCOPED`, so the puller can
213
- * never materialize it and the whole company sync wedges at `errored` (runner
214
- * exit 2) on every run. Verified live 2026-06-16: frogbear's
215
- * `companies/frogbear/drafts/reports/frogbear-signals-report-2026-06-15.html`
216
- * was uploaded with a doubled key and broke every sync thereafter. The pull
217
- * and tombstone walkers refuse these keys (skip-excluded-policy), symmetric
218
- * with the malformed-(backslash)-key filter above; the bogus objects
219
- * themselves are cleaned server-side.
220
- */
221
- export function isForbiddenCompanyVaultKey(key, personalMode) {
222
- return !personalMode && key.startsWith("companies/");
223
- }
224
205
  /**
225
206
  * Test-only export. Kept under a `_testing` namespace so the module's public
226
207
  * surface stays focused on `share()` / `ShareOptions` / `ShareResult` while
@@ -780,7 +761,7 @@ async function createPushRunContext(options) {
780
761
  // Mirror push progress into the shared cross-process snapshot (see sync.ts).
781
762
  // Record the friendly company slug, or null for the personal vault so the
782
763
  // menubar shows "Personal" — never the raw prs_/cmp_ UID.
783
- const recordProgress = createSyncProgressRecorder({
764
+ const recordProgress = options.progressRecorder ?? createSyncProgressRecorder({
784
765
  company: ctx.uid.startsWith("prs_") || options.personalMode === true
785
766
  ? null
786
767
  : ctx.slug,
@@ -955,18 +936,10 @@ async function buildSharePlans(run) {
955
936
  });
956
937
  return false;
957
938
  });
958
- // Scope-invalid key filter (incident 2026-07-11). In company mode the sync
959
- // root IS the company folder, so a local entry whose vault key starts with
960
- // `companies/` can only come from a stale doubled local tree
961
- // (companies/{slug}/companies/{slug}/…). Uploading it poisons the bucket
962
- // with keys the server validator rejects (INVALID_KEY_COMPANIES_SCOPED) —
963
- // the direct-S3 STS transport bypasses server validation. Refuse them here
964
- // with a per-key warning; uploadFile/uploadSymlink's validateVaultUploadKey
965
- // is the belt-and-suspenders backstop. The pull leg's journal-tombstone
966
- // path then CLEANS the doubled tree (local delete + journal drop) instead
967
- // of this leg ever re-uploading it. Personal vaults legitimately carry
968
- // `companies/{slug}/…` keys, so this only applies in company mode.
969
- const invalidScopedKeys = [];
939
+ // `companies/` is an ordinary directory name below a company vault root.
940
+ // The walker derives every key from that root, so it cannot select another
941
+ // company. Keep the generic control-character admission check for both
942
+ // vault kinds; uploadFile/uploadSymlink enforce the remaining grammar.
970
943
  const filesToShare = run.options.personalMode === true
971
944
  ? controlCharFiltered.filter((entry) => {
972
945
  // `core/<type>` symlinks are generated projections of canonical
@@ -988,20 +961,7 @@ async function buildSharePlans(run) {
988
961
  }
989
962
  return false;
990
963
  })
991
- : controlCharFiltered.filter((entry) => {
992
- if (!entry.relativePath.startsWith("companies/"))
993
- return true;
994
- invalidScopedKeys.push(entry.relativePath);
995
- return false;
996
- });
997
- if (invalidScopedKeys.length > 0) {
998
- run.emit({
999
- type: "skip-invalid-scoped-key-summary",
1000
- count: invalidScopedKeys.length,
1001
- samplePaths: invalidScopedKeys.slice(0, 10),
1002
- errorCode: "INVALID_KEY_COMPANIES_SCOPED",
1003
- });
1004
- }
964
+ : controlCharFiltered;
1005
965
  const pushPlan = computePushPlan(filesToShare, run.journal, run.skipUnchanged === true, run.options.onHeartbeat);
1006
966
  const deleteScopeRoots = run.propagateDeletes === true
1007
967
  ? resolveDeleteScopeRoots(run.paths, run.hqRoot, run.syncRoot, run.options.deleteScopeRoots)
@@ -1512,7 +1472,10 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
1512
1472
  break;
1513
1473
  queue.shift();
1514
1474
  inFlightBytes += nextBytes;
1515
- const p = processUploadItem(item)
1475
+ const upload = () => processUploadItem(item);
1476
+ const p = (run.options.transferSemaphore
1477
+ ? run.options.transferSemaphore.withPermit(upload)
1478
+ : upload())
1516
1479
  .catch((err) => {
1517
1480
  hadUploadFailure = true;
1518
1481
  // The journal is no longer persistable, so continuing would upload
@@ -1771,7 +1734,7 @@ async function executeDeletes(run, deletePlan, decommissionPlan, counters, files
1771
1734
  run.emit({
1772
1735
  type: "error",
1773
1736
  path: relativePath,
1774
- message: "scope-invalid tombstone skipped: local doubled-tree copy diverged from journal",
1737
+ message: "tombstone skipped: local copy diverged from journal",
1775
1738
  });
1776
1739
  continue;
1777
1740
  }
@@ -1793,7 +1756,7 @@ async function executeDeletes(run, deletePlan, decommissionPlan, counters, files
1793
1756
  run.emit({
1794
1757
  type: "error",
1795
1758
  path: relativePath,
1796
- message: "scope-invalid tombstone skipped: local doubled-tree copy diverged from journal",
1759
+ message: "tombstone skipped: local copy diverged from journal",
1797
1760
  });
1798
1761
  continue;
1799
1762
  }
@@ -2222,16 +2185,7 @@ function defaultConsoleLogger(event) {
2222
2185
  ` To proceed anyway: re-run with HQ_SYNC_DELETE_BULK_OVERRIDE=1 (or propagateDeletePolicy:"all").`);
2223
2186
  }
2224
2187
  else if (event.type === "skip-invalid-scoped-key") {
2225
- console.warn(` ! ${event.path} skipped — 'companies/'-prefixed key is invalid in a company-scoped vault (stale doubled local tree? remove the inner companies/<slug> copy)`);
2226
- }
2227
- else if (event.type === "skip-invalid-scoped-key-summary") {
2228
- console.warn(` ! ${event.count} path${event.count === 1 ? "" : "s"} skipped — 'companies/'-prefixed keys are invalid in a company-scoped vault (stale doubled local tree? remove the inner companies/<slug> copy)`);
2229
- for (const p of event.samplePaths) {
2230
- console.warn(` · ${p}`);
2231
- }
2232
- if (event.count > event.samplePaths.length) {
2233
- console.warn(` ... and ${event.count - event.samplePaths.length} more`);
2234
- }
2188
+ console.warn(` ! ${event.path} skipped — invalid vault key (${event.errorCode ?? "INVALID_KEY_CONTROL_CHARS"})`);
2235
2189
  }
2236
2190
  else if (event.type === "skip-symlink-privilege") {
2237
2191
  console.warn(` ! ${event.path} skipped — could not create the symbolic link on this Windows host (missing privilege). ${event.remedy}`);
@@ -3042,10 +2996,9 @@ const DELETE_PLAN_HEAD_CONCURRENCY = 16;
3042
2996
  * Empty `scopeRoots` ⇒ empty plan (caller didn't opt in).
3043
2997
  */
3044
2998
  async function computeDeletePlan(journal, syncRoot, scopeRoots, shouldSync, policy, ctx,
3045
- // True for a COMPANY-scoped push (personalMode !== true): the sync root is
3046
- // the company folder and journal keys are bucket-relative, so a literal
3047
- // `companies/…` key is scope-invalid (see the poisoned-key branch below).
3048
- // Personal-vault pushes legitimately journal `companies/{slug}/…` keys.
2999
+ // True for a COMPANY-scoped push (personalMode !== true). This distinguishes
3000
+ // the canonical knowledge-marker layout from the personal-vault layout; it
3001
+ // does not reinterpret ordinary vault-relative path segments.
3049
3002
  companyScoped = true) {
3050
3003
  const plan = { toDelete: [], toTombstone: [], refusedStale: [] };
3051
3004
  if (scopeRoots.length === 0)
@@ -3125,20 +3078,6 @@ companyScoped = true) {
3125
3078
  continue;
3126
3079
  inScopeJournalEntries++;
3127
3080
  const localPath = localPathForVaultKey(syncRoot, relativeKey);
3128
- // Scope-invalid journal keys (incident 2026-07-11): in a COMPANY-scoped
3129
- // context, a journal entry at a literal `companies/…` key records a
3130
- // doubled-tree poisoning upload. HEAD/DeleteObject on such a key via the
3131
- // presign transport is rejected by the server validator
3132
- // (INVALID_KEY_COMPANIES_SCOPED) and would error the push, so route it
3133
- // straight to `toTombstone` (journal drop + local doubled-tree cleanup, no
3134
- // remote call). Personal-vault pushes (personalMode) carry legitimate
3135
- // `companies/{slug}/…` keys and are unaffected (companyScoped=false).
3136
- // Checked before the presentLocally gate: the poison file lives at the
3137
- // doubled path and must drain even while still on disk.
3138
- if (companyScoped && relativeKey.startsWith("companies/")) {
3139
- plan.toTombstone.push(relativeKey);
3140
- continue;
3141
- }
3142
3081
  let presentLocally = true;
3143
3082
  try {
3144
3083
  fs.lstatSync(localPath);