@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.
- package/dist/bin/sync-runner-company.d.ts +3 -0
- package/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +50 -14
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-company.test.js +135 -0
- package/dist/bin/sync-runner-company.test.js.map +1 -1
- package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-loop.js +33 -1
- package/dist/bin/sync-runner-watch-loop.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +5 -5
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +3 -0
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +96 -2
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/share.d.ts +5 -17
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +16 -77
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +48 -99
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts +16 -18
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +16 -72
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +40 -59
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/cli/tombstones.d.ts +23 -8
- package/dist/cli/tombstones.d.ts.map +1 -1
- package/dist/cli/tombstones.js +63 -33
- package/dist/cli/tombstones.js.map +1 -1
- package/dist/cli/tombstones.test.d.ts +2 -0
- package/dist/cli/tombstones.test.d.ts.map +1 -0
- package/dist/cli/tombstones.test.js +27 -0
- package/dist/cli/tombstones.test.js.map +1 -0
- package/dist/cli/watch-event-push-conflict.test.js +7 -0
- package/dist/cli/watch-event-push-conflict.test.js.map +1 -1
- package/dist/local-path-codec.test.js +20 -0
- package/dist/local-path-codec.test.js.map +1 -1
- package/dist/s3.d.ts +1 -1
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +7 -23
- package/dist/s3.js.map +1 -1
- package/dist/s3.test.js +13 -20
- package/dist/s3.test.js.map +1 -1
- package/dist/sync-core.d.ts +16 -0
- package/dist/sync-core.d.ts.map +1 -1
- package/dist/sync-core.js +38 -0
- package/dist/sync-core.js.map +1 -1
- package/dist/sync-progress.d.ts +18 -1
- package/dist/sync-progress.d.ts.map +1 -1
- package/dist/sync-progress.js +113 -7
- package/dist/sync-progress.js.map +1 -1
- package/dist/sync-progress.test.js +32 -2
- package/dist/sync-progress.test.js.map +1 -1
- package/dist/watcher.d.ts +37 -8
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +137 -23
- package/dist/watcher.js.map +1 -1
- package/dist/watcher.test.js +116 -9
- package/dist/watcher.test.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/share.d.ts
CHANGED
|
@@ -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.
|
package/dist/cli/share.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA8B7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;
|
|
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
|
-
//
|
|
959
|
-
//
|
|
960
|
-
//
|
|
961
|
-
//
|
|
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
|
|
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
|
|
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: "
|
|
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: "
|
|
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 —
|
|
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)
|
|
3046
|
-
// the
|
|
3047
|
-
//
|
|
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);
|