@indigoai-us/hq-cloud 6.15.96 → 6.15.97

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 (47) hide show
  1. package/dist/bin/sync-runner-watch-loop.d.ts +7 -2
  2. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
  3. package/dist/bin/sync-runner-watch-loop.js +104 -34
  4. package/dist/bin/sync-runner-watch-loop.js.map +1 -1
  5. package/dist/bin/sync-runner.d.ts.map +1 -1
  6. package/dist/bin/sync-runner.js +3 -4
  7. package/dist/bin/sync-runner.js.map +1 -1
  8. package/dist/bin/sync-runner.test.js +9 -0
  9. package/dist/bin/sync-runner.test.js.map +1 -1
  10. package/dist/cli/share.d.ts.map +1 -1
  11. package/dist/cli/share.js +30 -7
  12. package/dist/cli/share.js.map +1 -1
  13. package/dist/cli/share.test.js +47 -1
  14. package/dist/cli/share.test.js.map +1 -1
  15. package/dist/cli/sync.d.ts +4 -1
  16. package/dist/cli/sync.d.ts.map +1 -1
  17. package/dist/cli/sync.js.map +1 -1
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/outposts/self-deploy.d.ts.map +1 -1
  23. package/dist/outposts/self-deploy.js +7 -5
  24. package/dist/outposts/self-deploy.js.map +1 -1
  25. package/dist/outposts/self-deploy.test.js +3 -2
  26. package/dist/outposts/self-deploy.test.js.map +1 -1
  27. package/dist/sync/area-ledger-auto-migration.d.ts +55 -0
  28. package/dist/sync/area-ledger-auto-migration.d.ts.map +1 -0
  29. package/dist/sync/area-ledger-auto-migration.js +167 -0
  30. package/dist/sync/area-ledger-auto-migration.js.map +1 -0
  31. package/dist/sync/area-ledger-auto-migration.test.d.ts +2 -0
  32. package/dist/sync/area-ledger-auto-migration.test.d.ts.map +1 -0
  33. package/dist/sync/area-ledger-auto-migration.test.js +229 -0
  34. package/dist/sync/area-ledger-auto-migration.test.js.map +1 -0
  35. package/dist/sync/feature-flags.d.ts +68 -15
  36. package/dist/sync/feature-flags.d.ts.map +1 -1
  37. package/dist/sync/feature-flags.js +98 -21
  38. package/dist/sync/feature-flags.js.map +1 -1
  39. package/dist/sync/feature-flags.test.js +77 -3
  40. package/dist/sync/feature-flags.test.js.map +1 -1
  41. package/dist/sync/index.d.ts +2 -2
  42. package/dist/sync/index.d.ts.map +1 -1
  43. package/dist/sync/index.js +1 -1
  44. package/dist/sync/index.js.map +1 -1
  45. package/dist/sync/sync-work.d.ts +1 -1
  46. package/dist/sync/sync-work.d.ts.map +1 -1
  47. package/package.json +1 -1
@@ -1,9 +1,14 @@
1
1
  import { type TreeChange, type TreeChangeBatch } from "../watcher.js";
2
2
  import { readJournal } from "../journal.js";
3
+ import { type FeatureSwitch } from "../sync/feature-flags.js";
3
4
  import type { TelemetryClaims } from "../telemetry-events.js";
4
5
  import type { Direction, RunnerLoopDeps, RunnerPassOutcome } from "./sync-runner.js";
5
- /** Area storage is an explicit canary and only applies after durable cutover. */
6
- export declare function shouldUseAreaStorage(areaStorageEnabled: boolean, stateDir: string, journalSlug: string): boolean;
6
+ /**
7
+ * Area storage is AUTO by default and only applies after durable cutover.
8
+ * Pass the env switch (`auto`/`on`/`off`) or a boolean force-on/force-off.
9
+ * `HQ_SYNC_AREA_STORAGE=off` is the kill switch.
10
+ */
11
+ export declare function shouldUseAreaStorage(areaStorage: boolean | FeatureSwitch, stateDir: string, journalSlug: string): boolean;
7
12
  /**
8
13
  * Targeted-pass batch limit: an event batch touching more distinct paths than
9
14
  * this falls back to one full reconcile pass. The limit catches genuine
@@ -1 +1 @@
1
- {"version":3,"file":"sync-runner-watch-loop.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner-watch-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-runner-watch-loop.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner-watch-loop.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { performance } from "node:perf_hooks";
5
5
  import { inventoryManagedSnapshots } from "../backup-prune.js";
6
6
  import { VaultClient } from "../index.js";
7
7
  import { pickCanonicalPersonEntity } from "../vault-client.js";
8
- import { acquireOperationLock, withOperationLock, OperationLockedError, OPERATION_LOCKED_EXIT, } from "../operation-lock.js";
8
+ import { acquireOperationLock, withOperationLock, withOperationLockSync, OperationLockedError, OPERATION_LOCKED_EXIT, } from "../operation-lock.js";
9
9
  import { describeError } from "../lib/describe-error.js";
10
10
  import { TRANSIENT_NETWORK_EXIT } from "../lib/net-errors.js";
11
11
  import { PARTIAL_SYNC_EXIT } from "../lib/exit-codes.js";
@@ -15,8 +15,10 @@ import { TreeWatcher, resolveEventDebounceConfig, systemClock, } from "../watche
15
15
  import { clearLocalDeleteIntent, getStateDir, markLocalDeleteIntent, PERSONAL_VAULT_JOURNAL_SLUG, openJournalStoreSession, openJournalStoreSessionAsync, listJournalSlugs, listJournals, maintainAreaJournalSlice, readJournal, writeJournal, } from "../journal.js";
16
16
  import { NoopPushReceiver, } from "../sync/push-receiver.js";
17
17
  import { resolveEventSync, startEventSync as defaultStartEventSync, } from "../sync/event-sync.js";
18
- import { resolveParallelSyncRollout } from "../sync/feature-flags.js";
18
+ import { resolveAreaStorageEnabled, resolveEffectiveParallelSyncRollout, resolveParallelSyncRollout, } from "../sync/feature-flags.js";
19
19
  import { resolveAreaLayoutAuthority } from "../sync/area-ledger-migration.js";
20
+ import { AREA_AUTO_MIGRATION_SOURCE, createAreaAutoMigrationScheduler, openPersonalVaultAreaMigration, readPersonalVaultLayoutPhase, } from "../sync/area-ledger-auto-migration.js";
21
+ import { emitCloudTelemetry } from "../telemetry-events.js";
20
22
  import { DefaultParallelSyncCoordinator } from "../sync/parallel-sync-coordinator.js";
21
23
  import { RealtimeTelemetrySpan, writeRealtimeTelemetryToStderr } from "../sync/realtime-telemetry.js";
22
24
  import { InlineSyncWorkerAdapter, } from "../sync/sync-work.js";
@@ -24,9 +26,17 @@ import { buildRoutePullArgv, buildScopedPushArgv, buildScopedDrainPullArgv, buil
24
26
  import { resolveSkipCompanies } from "./sync-runner-planning.js";
25
27
  const FULL_RECONCILE_EVERY_TICKS = 10;
26
28
  const MAX_FULL_RECONCILE_REASONS = 7;
27
- /** Area storage is an explicit canary and only applies after durable cutover. */
28
- export function shouldUseAreaStorage(areaStorageEnabled, stateDir, journalSlug) {
29
- return areaStorageEnabled && resolveAreaLayoutAuthority(stateDir, journalSlug) === "areas";
29
+ /**
30
+ * Area storage is AUTO by default and only applies after durable cutover.
31
+ * Pass the env switch (`auto`/`on`/`off`) or a boolean force-on/force-off.
32
+ * `HQ_SYNC_AREA_STORAGE=off` is the kill switch.
33
+ */
34
+ export function shouldUseAreaStorage(areaStorage, stateDir, journalSlug) {
35
+ const authority = resolveAreaLayoutAuthority(stateDir, journalSlug);
36
+ const enabled = typeof areaStorage === "boolean"
37
+ ? areaStorage
38
+ : resolveAreaStorageEnabled(areaStorage, authority);
39
+ return enabled && authority === "areas";
30
40
  }
31
41
  function emitFullReconcileDecision({ mode, reasons, triggers, pollTick, configuredIntervalMs, elapsedSinceLastCompletedFullReconcileMs, batchPathCount, }) {
32
42
  process.stderr.write(JSON.stringify({
@@ -799,15 +809,14 @@ export async function runWatchLoop(argv, parsed, deps, runtime) {
799
809
  };
800
810
  const runGuarded = (passArgvForRun, prepare, lane = "slow") => runGuardedTask(() => runPassWithLock(passArgvForRun, prepare, lane), lane);
801
811
  /*
802
- * The bridge is intentionally opt-in. The legacy guarded pass arrays stay
803
- * exactly as they are until an outpost enables HQ_SYNC_PARALLEL_COORDINATOR.
804
- * Once enabled, the coordinator owns admission and path fencing; the small
805
- * inline adapters are only the compatibility execution seam while the
806
- * runner's real slice executors are being moved into child workers.
812
+ * Area storage and the parallel coordinator default to AUTO. AUTO turns
813
+ * them on after durable personal-vault cutover; explicit off is the kill
814
+ * switch; explicit on keeps the previous force-enable meaning. The env
815
+ * parse stays pure; the phase-dependent decision uses the personal journal.
807
816
  */
808
817
  const parallelRollout = resolveParallelSyncRollout();
809
- const areaStorageEnabled = parallelRollout.areaStorageEnabled;
810
- const parallelCoordinatorEnabled = parallelRollout.parallelExecutionEnabled;
818
+ const refreshCoordinatorEnabled = () => resolveEffectiveParallelSyncRollout(resolveAreaLayoutAuthority(getStateDir(), PERSONAL_VAULT_JOURNAL_SLUG)).parallelExecutionEnabled;
819
+ let parallelCoordinatorEnabled = refreshCoordinatorEnabled();
811
820
  const coordinatorExecutions = new WeakMap();
812
821
  const coordinatorWorker = async (slice) => {
813
822
  const execution = coordinatorExecutions.get(slice.work);
@@ -842,25 +851,24 @@ export async function runWatchLoop(argv, parsed, deps, runtime) {
842
851
  })),
843
852
  };
844
853
  };
845
- const coordinator = parallelCoordinatorEnabled
846
- ? new DefaultParallelSyncCoordinator({
847
- realtimeWorker: new InlineSyncWorkerAdapter(coordinatorWorker),
848
- choreWorker: new InlineSyncWorkerAdapter(coordinatorWorker),
849
- identifyPath: (canonicalPath) => {
850
- const route = routeChangeToTarget(canonicalPath);
851
- if (!route)
852
- throw new Error(`coordinator cannot route ${canonicalPath}`);
853
- return route.kind === "company"
854
- ? { targetUid: `company:${route.slug}`, areaId: `company:${route.slug}` }
855
- : { targetUid: "personal", areaId: "personal" };
856
- },
857
- // Compatibility chores still use whole-vault/whole-route executors,
858
- // which cannot yet name sound bounded mutation paths. Their execution
859
- // therefore remains behind the runner's guarded operation queue until
860
- // those executors can provide concrete scopes.
861
- planChorePaths: () => [],
862
- })
863
- : null;
854
+ const createCoordinator = () => new DefaultParallelSyncCoordinator({
855
+ realtimeWorker: new InlineSyncWorkerAdapter(coordinatorWorker),
856
+ choreWorker: new InlineSyncWorkerAdapter(coordinatorWorker),
857
+ identifyPath: (canonicalPath) => {
858
+ const route = routeChangeToTarget(canonicalPath);
859
+ if (!route)
860
+ throw new Error(`coordinator cannot route ${canonicalPath}`);
861
+ return route.kind === "company"
862
+ ? { targetUid: `company:${route.slug}`, areaId: `company:${route.slug}` }
863
+ : { targetUid: "personal", areaId: "personal" };
864
+ },
865
+ // Compatibility chores still use whole-vault/whole-route executors,
866
+ // which cannot yet name sound bounded mutation paths. Their execution
867
+ // therefore remains behind the runner's guarded operation queue until
868
+ // those executors can provide concrete scopes.
869
+ planChorePaths: () => [],
870
+ });
871
+ let coordinator = parallelCoordinatorEnabled ? createCoordinator() : null;
864
872
  const runCoordinatorWork = async (work, task, options = {}) => {
865
873
  const telemetry = work.class === "realtime" && parallelCoordinatorEnabled
866
874
  ? new RealtimeTelemetrySpan(work.source, work.direction, work.paths.length, writeRealtimeTelemetryToStderr)
@@ -937,6 +945,67 @@ export async function runWatchLoop(argv, parsed, deps, runtime) {
937
945
  onSettled({ result: 1, accepted: false, coordinatorRefusedPaths: [] });
938
946
  });
939
947
  };
948
+ const personalJournalInScope = (companiesMode || personalMode) && !watchRouteSelection.skipPersonal;
949
+ const areaAutoMigration = personalJournalInScope
950
+ ? createAreaAutoMigrationScheduler({
951
+ now: () => Date.now(),
952
+ hasActiveRealtimeSession: () => eventSync !== null && eventSyncLive,
953
+ areaStorageSwitch: () => parallelRollout.areaStorage,
954
+ readPhase: () => readPersonalVaultLayoutPhase(getStateDir(), PERSONAL_VAULT_JOURNAL_SLUG),
955
+ hasLegacyJournal: () => {
956
+ const slugs = listJournalSlugs();
957
+ return slugs.includes(PERSONAL_VAULT_JOURNAL_SLUG) || slugs.includes("personal");
958
+ },
959
+ createMigration: () => {
960
+ const opened = openPersonalVaultAreaMigration(hqRoot, getStateDir(), PERSONAL_VAULT_JOURNAL_SLUG);
961
+ return {
962
+ copyAndCatchUp: () => opened.migration.copyAndCatchUp(),
963
+ verifyParity: (legacy) => opened.migration.verifyParity(legacy),
964
+ cutOver: () => opened.migration.cutOver(),
965
+ readLegacyJournal: opened.readLegacyJournal,
966
+ };
967
+ },
968
+ withExclusiveLock: (fn) => withOperationLockSync(hqRoot, "area-ledger-migration", fn, {
969
+ mode: "exclusive",
970
+ timeoutSec: 5,
971
+ onWaitStart: () => undefined,
972
+ }),
973
+ enqueueChore: (run) => {
974
+ enqueueChore("migration", async () => {
975
+ run();
976
+ return 0;
977
+ }, (execution) => {
978
+ if (!execution.accepted || passExitCode(execution.result) !== 0) {
979
+ process.stderr.write("hq-sync-runner: area-ledger auto-migration chore failed; will retry\n");
980
+ }
981
+ }, { wholeMutation: false });
982
+ },
983
+ log: (message) => process.stderr.write(`hq-sync-runner: ${message}\n`),
984
+ emitTelemetry: (eventName) => {
985
+ const getAccessToken = deps.getAccessToken ?? runtime.defaultGetAccessToken;
986
+ const getClaims = deps.getIdTokenClaims ?? runtime.defaultGetIdTokenClaims;
987
+ const client = new VaultClient({
988
+ apiUrl: runtime.apiUrl,
989
+ authToken: getAccessToken,
990
+ region: runtime.region,
991
+ });
992
+ void emitCloudTelemetry(client, {
993
+ eventName,
994
+ source: AREA_AUTO_MIGRATION_SOURCE,
995
+ properties: { trigger: "realtime_auto" },
996
+ }, {
997
+ claims: getClaims(),
998
+ log: (message) => process.stderr.write(`hq-sync-runner: ${message}\n`),
999
+ });
1000
+ },
1001
+ onCutOver: () => {
1002
+ parallelCoordinatorEnabled = refreshCoordinatorEnabled();
1003
+ if (parallelCoordinatorEnabled && coordinator === null) {
1004
+ coordinator = createCoordinator();
1005
+ }
1006
+ },
1007
+ })
1008
+ : { onTick() { } };
940
1009
  let watcher = null;
941
1010
  let eventPushSurfacesActivated = false;
942
1011
  let watcherUnavailableWarned = false;
@@ -2316,6 +2385,7 @@ export async function runWatchLoop(argv, parsed, deps, runtime) {
2316
2385
  if (coordinatorAuthRequired)
2317
2386
  return 0;
2318
2387
  pollTick++;
2388
+ areaAutoMigration.onTick();
2319
2389
  const pending = takePendingWatcherChange();
2320
2390
  // The quarantine is scoped to the delete episode it refused, and only
2321
2391
  // the roots already refused when this batch was taken belong to it.
@@ -2550,7 +2620,7 @@ export async function runWatchLoop(argv, parsed, deps, runtime) {
2550
2620
  }, { wholeMutation: true });
2551
2621
  const epoch = new Date().toISOString().slice(0, 10);
2552
2622
  for (const slug of listJournalSlugs()) {
2553
- if (!shouldUseAreaStorage(areaStorageEnabled, getStateDir(), slug))
2623
+ if (!shouldUseAreaStorage(parallelRollout.areaStorage, getStateDir(), slug))
2554
2624
  continue;
2555
2625
  enqueueChore("rotation", () => runGuardedTask(async () => {
2556
2626
  const maintenance = maintainAreaJournalSlice(slug, epoch);
@@ -2571,10 +2641,10 @@ export async function runWatchLoop(argv, parsed, deps, runtime) {
2571
2641
  catch (error) {
2572
2642
  process.stderr.write(`hq-sync-runner: backup retention dry-run failed — ${error instanceof Error ? error.message : String(error)}\n`);
2573
2643
  }
2574
- if (areaStorageEnabled) {
2644
+ {
2575
2645
  const epoch = new Date().toISOString().slice(0, 10);
2576
2646
  for (const slug of listJournalSlugs()) {
2577
- if (!shouldUseAreaStorage(true, getStateDir(), slug))
2647
+ if (!shouldUseAreaStorage(parallelRollout.areaStorage, getStateDir(), slug))
2578
2648
  continue;
2579
2649
  await runGuardedTask(async () => {
2580
2650
  const maintenance = maintainAreaJournalSlice(slug, epoch);