@indigoai-us/hq-cloud 6.15.41 → 6.15.43
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.map +1 -1
- package/dist/bin/sync-runner-company.js +48 -3
- 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 +22 -6
- package/dist/bin/sync-runner-watch-loop.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +2 -0
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +93 -16
- 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 -62
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +57 -89
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts +16 -5
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +16 -63
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +28 -54
- package/dist/cli/sync.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 +26 -5
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +93 -13
- package/dist/watcher.js.map +1 -1
- package/dist/watcher.test.js +45 -1
- 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,17 +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.
|
|
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.
|
|
969
943
|
const filesToShare = run.options.personalMode === true
|
|
970
944
|
? controlCharFiltered.filter((entry) => {
|
|
971
945
|
// `core/<type>` symlinks are generated projections of canonical
|
|
@@ -987,15 +961,7 @@ async function buildSharePlans(run) {
|
|
|
987
961
|
}
|
|
988
962
|
return false;
|
|
989
963
|
})
|
|
990
|
-
: controlCharFiltered
|
|
991
|
-
if (!entry.relativePath.startsWith("companies/"))
|
|
992
|
-
return true;
|
|
993
|
-
run.emit({
|
|
994
|
-
type: "skip-invalid-scoped-key",
|
|
995
|
-
path: entry.relativePath,
|
|
996
|
-
});
|
|
997
|
-
return false;
|
|
998
|
-
});
|
|
964
|
+
: controlCharFiltered;
|
|
999
965
|
const pushPlan = computePushPlan(filesToShare, run.journal, run.skipUnchanged === true, run.options.onHeartbeat);
|
|
1000
966
|
const deleteScopeRoots = run.propagateDeletes === true
|
|
1001
967
|
? resolveDeleteScopeRoots(run.paths, run.hqRoot, run.syncRoot, run.options.deleteScopeRoots)
|
|
@@ -1506,7 +1472,10 @@ async function executeUploads(run, pushPlan, counters, conflictPaths) {
|
|
|
1506
1472
|
break;
|
|
1507
1473
|
queue.shift();
|
|
1508
1474
|
inFlightBytes += nextBytes;
|
|
1509
|
-
const
|
|
1475
|
+
const upload = () => processUploadItem(item);
|
|
1476
|
+
const p = (run.options.transferSemaphore
|
|
1477
|
+
? run.options.transferSemaphore.withPermit(upload)
|
|
1478
|
+
: upload())
|
|
1510
1479
|
.catch((err) => {
|
|
1511
1480
|
hadUploadFailure = true;
|
|
1512
1481
|
// The journal is no longer persistable, so continuing would upload
|
|
@@ -1765,7 +1734,7 @@ async function executeDeletes(run, deletePlan, decommissionPlan, counters, files
|
|
|
1765
1734
|
run.emit({
|
|
1766
1735
|
type: "error",
|
|
1767
1736
|
path: relativePath,
|
|
1768
|
-
message: "
|
|
1737
|
+
message: "tombstone skipped: local copy diverged from journal",
|
|
1769
1738
|
});
|
|
1770
1739
|
continue;
|
|
1771
1740
|
}
|
|
@@ -1787,7 +1756,7 @@ async function executeDeletes(run, deletePlan, decommissionPlan, counters, files
|
|
|
1787
1756
|
run.emit({
|
|
1788
1757
|
type: "error",
|
|
1789
1758
|
path: relativePath,
|
|
1790
|
-
message: "
|
|
1759
|
+
message: "tombstone skipped: local copy diverged from journal",
|
|
1791
1760
|
});
|
|
1792
1761
|
continue;
|
|
1793
1762
|
}
|
|
@@ -2216,7 +2185,7 @@ function defaultConsoleLogger(event) {
|
|
|
2216
2185
|
` To proceed anyway: re-run with HQ_SYNC_DELETE_BULK_OVERRIDE=1 (or propagateDeletePolicy:"all").`);
|
|
2217
2186
|
}
|
|
2218
2187
|
else if (event.type === "skip-invalid-scoped-key") {
|
|
2219
|
-
console.warn(` ! ${event.path} skipped —
|
|
2188
|
+
console.warn(` ! ${event.path} skipped — invalid vault key (${event.errorCode ?? "INVALID_KEY_CONTROL_CHARS"})`);
|
|
2220
2189
|
}
|
|
2221
2190
|
else if (event.type === "skip-symlink-privilege") {
|
|
2222
2191
|
console.warn(` ! ${event.path} skipped — could not create the symbolic link on this Windows host (missing privilege). ${event.remedy}`);
|
|
@@ -3027,10 +2996,9 @@ const DELETE_PLAN_HEAD_CONCURRENCY = 16;
|
|
|
3027
2996
|
* Empty `scopeRoots` ⇒ empty plan (caller didn't opt in).
|
|
3028
2997
|
*/
|
|
3029
2998
|
async function computeDeletePlan(journal, syncRoot, scopeRoots, shouldSync, policy, ctx,
|
|
3030
|
-
// True for a COMPANY-scoped push (personalMode !== true)
|
|
3031
|
-
// the
|
|
3032
|
-
//
|
|
3033
|
-
// 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.
|
|
3034
3002
|
companyScoped = true) {
|
|
3035
3003
|
const plan = { toDelete: [], toTombstone: [], refusedStale: [] };
|
|
3036
3004
|
if (scopeRoots.length === 0)
|
|
@@ -3110,20 +3078,6 @@ companyScoped = true) {
|
|
|
3110
3078
|
continue;
|
|
3111
3079
|
inScopeJournalEntries++;
|
|
3112
3080
|
const localPath = localPathForVaultKey(syncRoot, relativeKey);
|
|
3113
|
-
// Scope-invalid journal keys (incident 2026-07-11): in a COMPANY-scoped
|
|
3114
|
-
// context, a journal entry at a literal `companies/…` key records a
|
|
3115
|
-
// doubled-tree poisoning upload. HEAD/DeleteObject on such a key via the
|
|
3116
|
-
// presign transport is rejected by the server validator
|
|
3117
|
-
// (INVALID_KEY_COMPANIES_SCOPED) and would error the push, so route it
|
|
3118
|
-
// straight to `toTombstone` (journal drop + local doubled-tree cleanup, no
|
|
3119
|
-
// remote call). Personal-vault pushes (personalMode) carry legitimate
|
|
3120
|
-
// `companies/{slug}/…` keys and are unaffected (companyScoped=false).
|
|
3121
|
-
// Checked before the presentLocally gate: the poison file lives at the
|
|
3122
|
-
// doubled path and must drain even while still on disk.
|
|
3123
|
-
if (companyScoped && relativeKey.startsWith("companies/")) {
|
|
3124
|
-
plan.toTombstone.push(relativeKey);
|
|
3125
|
-
continue;
|
|
3126
|
-
}
|
|
3127
3081
|
let presentLocally = true;
|
|
3128
3082
|
try {
|
|
3129
3083
|
fs.lstatSync(localPath);
|