@indigoai-us/hq-cloud 5.21.0 → 5.23.0
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/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/journal.d.ts +76 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +148 -1
- package/dist/journal.js.map +1 -1
- package/dist/journal.test.js +251 -5
- package/dist/journal.test.js.map +1 -1
- package/dist/prefix-coalesce.d.ts +38 -0
- package/dist/prefix-coalesce.d.ts.map +1 -0
- package/dist/prefix-coalesce.js +69 -0
- package/dist/prefix-coalesce.js.map +1 -0
- package/dist/prefix-coalesce.test.d.ts +2 -0
- package/dist/prefix-coalesce.test.d.ts.map +1 -0
- package/dist/prefix-coalesce.test.js +77 -0
- package/dist/prefix-coalesce.test.js.map +1 -0
- package/dist/public-surface.test.d.ts +15 -0
- package/dist/public-surface.test.d.ts.map +1 -0
- package/dist/public-surface.test.js +105 -0
- package/dist/public-surface.test.js.map +1 -0
- package/dist/remote-pull.d.ts +145 -1
- package/dist/remote-pull.d.ts.map +1 -1
- package/dist/remote-pull.js +258 -1
- package/dist/remote-pull.js.map +1 -1
- package/dist/remote-pull.test.js +470 -2
- package/dist/remote-pull.test.js.map +1 -1
- package/dist/schemas/source-channels.d.ts +14 -0
- package/dist/schemas/source-channels.d.ts.map +1 -1
- package/dist/schemas/source-channels.js +16 -0
- package/dist/schemas/source-channels.js.map +1 -1
- package/dist/scope-shrink.d.ts +109 -0
- package/dist/scope-shrink.d.ts.map +1 -0
- package/dist/scope-shrink.js +196 -0
- package/dist/scope-shrink.js.map +1 -0
- package/dist/scope-shrink.test.d.ts +13 -0
- package/dist/scope-shrink.test.d.ts.map +1 -0
- package/dist/scope-shrink.test.js +342 -0
- package/dist/scope-shrink.test.js.map +1 -0
- package/dist/sources/get.d.ts.map +1 -1
- package/dist/sources/get.js +6 -3
- package/dist/sources/get.js.map +1 -1
- package/dist/sources/get.test.js +7 -7
- package/dist/sources/get.test.js.map +1 -1
- package/dist/sources/list.d.ts.map +1 -1
- package/dist/sources/list.js +4 -2
- package/dist/sources/list.js.map +1 -1
- package/dist/sources/list.test.js +6 -6
- package/dist/sources/list.test.js.map +1 -1
- package/dist/types.d.ts +48 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/vault-client.d.ts +178 -0
- package/dist/vault-client.d.ts.map +1 -1
- package/dist/vault-client.js +73 -0
- package/dist/vault-client.js.map +1 -1
- package/dist/vault-client.test.js +226 -0
- package/dist/vault-client.test.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +68 -0
- package/src/journal.test.ts +284 -5
- package/src/journal.ts +167 -2
- package/src/prefix-coalesce.test.ts +95 -0
- package/src/prefix-coalesce.ts +72 -0
- package/src/public-surface.test.ts +112 -0
- package/src/remote-pull.test.ts +540 -3
- package/src/remote-pull.ts +419 -2
- package/src/schemas/source-channels.ts +17 -0
- package/src/scope-shrink.test.ts +402 -0
- package/src/scope-shrink.ts +264 -0
- package/src/sources/get.test.ts +7 -7
- package/src/sources/get.ts +6 -3
- package/src/sources/list.test.ts +6 -6
- package/src/sources/list.ts +4 -2
- package/src/types.ts +49 -1
- package/src/vault-client.test.ts +335 -0
- package/src/vault-client.ts +223 -0
package/dist/index.d.ts
CHANGED
|
@@ -7,17 +7,23 @@
|
|
|
7
7
|
export { resolveEntityContext, refreshEntityContext, clearContextCache, isExpiringSoon, } from "./context.js";
|
|
8
8
|
export { uploadFile, downloadFile, listRemoteFiles, deleteRemoteFile, headRemoteFile, } from "./s3.js";
|
|
9
9
|
export type { RemoteFile, UploadAuthor } from "./s3.js";
|
|
10
|
-
export { readJournal, writeJournal, hashFile, updateEntry, getEntry, removeEntry, getJournalPath, } from "./journal.js";
|
|
10
|
+
export { readJournal, writeJournal, hashFile, updateEntry, getEntry, removeEntry, getJournalPath, migrateToV2, generatePullId, appendPullRecord, lastPullRecord, tombstoneEntry, isTombstone, gcTombstones, TOMBSTONE_TTL_MS, JOURNAL_VERSION_CURRENT, } from "./journal.js";
|
|
11
|
+
export { coalescePrefixes, isCoveredByAny, } from "./prefix-coalesce.js";
|
|
12
|
+
export { buildScopeShrinkPlan, applyScopeShrink, ScopeShrinkBlockedError, } from "./scope-shrink.js";
|
|
13
|
+
export type { OrphanClassification, ScopeShrinkPlan, BuildScopeShrinkPlanInput, ApplyScopeShrinkInput, ApplyScopeShrinkResult, } from "./scope-shrink.js";
|
|
14
|
+
export { resolveCompanyScope, batchPrefixesForVend, listRemoteForScope, pullCompany, decideRemotePulls, VEND_PATH_CAP, POST_FILTER_THRESHOLD, VEND_FANOUT_CONCURRENCY, } from "./remote-pull.js";
|
|
15
|
+
export type { CompanyScope, ResolveCompanyScopeInput, ListRemoteForScopeInput, PullCompanyInput, PullCompanyResult, RemotePullDecision, DecideRemotePullsInput, SkippedKey, } from "./remote-pull.js";
|
|
11
16
|
export { createIgnoreFilter, isWithinSizeLimit, } from "./ignore.js";
|
|
12
17
|
export { browserLogin, refreshTokens, loadCachedTokens, saveCachedTokens, clearCachedTokens, isExpiring, getValidAccessToken, CognitoAuthError, } from "./cognito-auth.js";
|
|
13
18
|
export type { CognitoAuthConfig, CognitoTokens } from "./cognito-auth.js";
|
|
14
19
|
export { PERSONAL_VAULT_EXCLUDED_TOP_LEVEL, computePersonalVaultPaths, } from "./personal-vault.js";
|
|
15
20
|
export { VaultClient, pickCanonicalPersonEntity } from "./vault-client.js";
|
|
16
21
|
export { VaultClientError, VaultAuthError, VaultPermissionDeniedError, VaultNotFoundError, VaultConflictError, } from "./vault-client.js";
|
|
17
|
-
export type { MembershipRole, MembershipStatus, Membership, CreateInviteInput, CreateInviteResult, AcceptInviteResult, UpdateRoleInput, EntityInfo, CreateEntityInput, CreateEntityResult, PendingInviteByEmail, TelemetryOptInResponse, UsageBatch, UsageIngestResult, } from "./vault-client.js";
|
|
22
|
+
export type { MembershipRole, MembershipStatus, Membership, CreateInviteInput, CreateInviteResult, AcceptInviteResult, UpdateRoleInput, EntityInfo, CreateEntityInput, CreateEntityResult, PendingInviteByEmail, TelemetryOptInResponse, UsageBatch, UsageIngestResult, SyncMode, MembershipSyncConfig, SetMembershipSyncConfigInput, ExplicitGrant, } from "./vault-client.js";
|
|
18
23
|
export { collectAndSendTelemetry, sanitizeRow } from "./telemetry.js";
|
|
19
24
|
export type { CollectTelemetryOptions, CollectTelemetryResult, TelemetryClientSurface, } from "./telemetry.js";
|
|
20
25
|
export type { TaskAction, TaskScope, VendChildInput, VendChildResult, StsChildCredentials, } from "./vault-client.js";
|
|
26
|
+
export type { VendPurpose, VaultOperation, VendInput, VendResult, VendCredentials, } from "./vault-client.js";
|
|
21
27
|
export { share, sync } from "./cli/index.js";
|
|
22
28
|
export type { ShareOptions, ShareResult, SyncOptions, SyncResult, SyncProgressEvent } from "./cli/index.js";
|
|
23
29
|
export { resolveConflict, showDiff } from "./cli/index.js";
|
|
@@ -28,9 +34,9 @@ export { accept, parseToken } from "./cli/index.js";
|
|
|
28
34
|
export type { AcceptOptions, AcceptResult } from "./cli/index.js";
|
|
29
35
|
export { promote } from "./cli/index.js";
|
|
30
36
|
export type { PromoteOptions, PromoteResult } from "./cli/index.js";
|
|
31
|
-
export type { EntityContext, VaultCredentials, VaultServiceConfig, ClientInfo, SyncConfig, Credentials, JournalEntry, SyncJournal, SyncStatus, PushResult, PullResult, DaemonState, } from "./types.js";
|
|
37
|
+
export type { EntityContext, VaultCredentials, VaultServiceConfig, ClientInfo, SyncConfig, Credentials, JournalEntry, SyncJournal, PullRecord, SyncStatus, PushResult, PullResult, DaemonState, } from "./types.js";
|
|
32
38
|
export { buildClientHeaders, clientInfoFromPackage, detectHqCoreVersion, HEADER_CLIENT_NAME, HEADER_CLIENT_VERSION, HEADER_HQ_CORE_VERSION, } from "./client-info.js";
|
|
33
|
-
export { SOURCE_CHANNELS, isSourceChannel, assertSourceChannel, InvalidSourceChannelError, } from "./schemas/source-channels.js";
|
|
39
|
+
export { SOURCE_CHANNELS, isSourceChannel, assertSourceChannel, InvalidSourceChannelError, sourcePathSegment, } from "./schemas/source-channels.js";
|
|
34
40
|
export type { SourceChannel } from "./schemas/source-channels.js";
|
|
35
41
|
export { SIGNAL_TYPES, isSignalType, assertSignalType, InvalidSignalTypeError, } from "./schemas/signal-types.js";
|
|
36
42
|
export type { SignalType } from "./schemas/signal-types.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,15 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { resolveEntityContext, refreshEntityContext, clearContextCache, isExpiringSoon, } from "./context.js";
|
|
8
8
|
export { uploadFile, downloadFile, listRemoteFiles, deleteRemoteFile, headRemoteFile, } from "./s3.js";
|
|
9
|
-
export { readJournal, writeJournal, hashFile, updateEntry, getEntry, removeEntry, getJournalPath,
|
|
9
|
+
export { readJournal, writeJournal, hashFile, updateEntry, getEntry, removeEntry, getJournalPath,
|
|
10
|
+
// Journal v2 (US-005)
|
|
11
|
+
migrateToV2, generatePullId, appendPullRecord, lastPullRecord, tombstoneEntry, isTombstone, gcTombstones, TOMBSTONE_TTL_MS, JOURNAL_VERSION_CURRENT, } from "./journal.js";
|
|
12
|
+
// Prefix coalescing helper (US-005)
|
|
13
|
+
export { coalescePrefixes, isCoveredByAny, } from "./prefix-coalesce.js";
|
|
14
|
+
// Scope-shrink detection + application (US-005)
|
|
15
|
+
export { buildScopeShrinkPlan, applyScopeShrink, ScopeShrinkBlockedError, } from "./scope-shrink.js";
|
|
16
|
+
// Engine-layer ACL-aware pull orchestration (US-005)
|
|
17
|
+
export { resolveCompanyScope, batchPrefixesForVend, listRemoteForScope, pullCompany, decideRemotePulls, VEND_PATH_CAP, POST_FILTER_THRESHOLD, VEND_FANOUT_CONCURRENCY, } from "./remote-pull.js";
|
|
10
18
|
export { createIgnoreFilter, isWithinSizeLimit, } from "./ignore.js";
|
|
11
19
|
// Cognito browser-OAuth (VLT-9)
|
|
12
20
|
export { browserLogin, refreshTokens, loadCachedTokens, saveCachedTokens, clearCachedTokens, isExpiring, getValidAccessToken, CognitoAuthError, } from "./cognito-auth.js";
|
|
@@ -30,7 +38,7 @@ export { promote } from "./cli/index.js";
|
|
|
30
38
|
// these once at startup and pass it in via VaultServiceConfig.clientInfo.
|
|
31
39
|
export { buildClientHeaders, clientInfoFromPackage, detectHqCoreVersion, HEADER_CLIENT_NAME, HEADER_CLIENT_VERSION, HEADER_HQ_CORE_VERSION, } from "./client-info.js";
|
|
32
40
|
// Source-channel + signal-type schemas (SoT)
|
|
33
|
-
export { SOURCE_CHANNELS, isSourceChannel, assertSourceChannel, InvalidSourceChannelError, } from "./schemas/source-channels.js";
|
|
41
|
+
export { SOURCE_CHANNELS, isSourceChannel, assertSourceChannel, InvalidSourceChannelError, sourcePathSegment, } from "./schemas/source-channels.js";
|
|
34
42
|
export { SIGNAL_TYPES, isSignalType, assertSignalType, InvalidSignalTypeError, } from "./schemas/signal-types.js";
|
|
35
43
|
// Entity resolver (sources/signals slug → EntityContext)
|
|
36
44
|
export { resolveEntity, listAvailableEntities, EntityNotFoundError, EntityPermissionError, EntityResolutionError, } from "./entity-resolver.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/journal.d.ts
CHANGED
|
@@ -12,14 +12,47 @@
|
|
|
12
12
|
* Path: `{stateDir}/sync-journal.{slug}.json`, where `stateDir` resolves to
|
|
13
13
|
* `HQ_STATE_DIR` (if set) or `~/.hq`.
|
|
14
14
|
*/
|
|
15
|
-
import type { SyncJournal, JournalEntry } from "./types.js";
|
|
15
|
+
import type { SyncJournal, JournalEntry, PullRecord } from "./types.js";
|
|
16
|
+
/** Tombstone retention. 30 days in milliseconds — roughly two release cycles. */
|
|
17
|
+
export declare const TOMBSTONE_TTL_MS: number;
|
|
18
|
+
/** Current journal schema version written by all v2-aware writers. */
|
|
19
|
+
export declare const JOURNAL_VERSION_CURRENT: "2";
|
|
16
20
|
/**
|
|
17
21
|
* Where per-company journals are stored. Honors `HQ_STATE_DIR` for tests and
|
|
18
22
|
* non-standard installs; otherwise falls back to `~/.hq`.
|
|
19
23
|
*/
|
|
20
24
|
export declare function getStateDir(): string;
|
|
21
25
|
export declare function getJournalPath(slug: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Read a per-company journal from disk.
|
|
28
|
+
*
|
|
29
|
+
* Back-compat (US-005, v1 → v2): a v1 file on disk is returned as-is with
|
|
30
|
+
* `version: "1"` and no `pulls` field. The in-place migration to v2 happens
|
|
31
|
+
* the first time `writeJournal` runs — `migrateToV2` ensures any journal
|
|
32
|
+
* passed to the writer carries `version: "2"`, `pulls: []`, and the rest of
|
|
33
|
+
* the v2 shape. This keeps `readJournal` deterministic + cheap and confines
|
|
34
|
+
* the side effect (schema bump on disk) to writes.
|
|
35
|
+
*
|
|
36
|
+
* When the file doesn't exist, we return a fresh v2 journal directly — new
|
|
37
|
+
* installs never pass through v1 on disk.
|
|
38
|
+
*/
|
|
22
39
|
export declare function readJournal(slug: string): SyncJournal;
|
|
40
|
+
/**
|
|
41
|
+
* Coerce any-version journal into a v2 shape. Idempotent for v2 inputs.
|
|
42
|
+
* Mutates the input and returns it for chainable use. Call this immediately
|
|
43
|
+
* after `readJournal` if your code-path needs the v2 fields.
|
|
44
|
+
*
|
|
45
|
+
* v1 → v2 contract: every existing `files[]` entry is preserved as-is; no
|
|
46
|
+
* tombstone fields are inserted (legacy entries are NOT scope-shrink
|
|
47
|
+
* tombstones). `pulls` becomes `[]` (empty history → treat last scope as
|
|
48
|
+
* "all" in the scope-shrink algorithm).
|
|
49
|
+
*/
|
|
50
|
+
export declare function migrateToV2(journal: SyncJournal): SyncJournal;
|
|
51
|
+
/**
|
|
52
|
+
* Write a journal to disk, migrating to the current schema version in-place.
|
|
53
|
+
* `migrateToV2` mutates the passed-in object — callers that hold a reference
|
|
54
|
+
* after the write will see the v2 shape.
|
|
55
|
+
*/
|
|
23
56
|
export declare function writeJournal(slug: string, journal: SyncJournal): void;
|
|
24
57
|
export declare function hashFile(filePath: string): string;
|
|
25
58
|
/**
|
|
@@ -57,4 +90,46 @@ export declare function updateEntry(journal: SyncJournal, relativePath: string,
|
|
|
57
90
|
export declare function normalizeEtag(etag: string): string;
|
|
58
91
|
export declare function getEntry(journal: SyncJournal, relativePath: string): JournalEntry | undefined;
|
|
59
92
|
export declare function removeEntry(journal: SyncJournal, relativePath: string): void;
|
|
93
|
+
/**
|
|
94
|
+
* Generate a ULID-shaped 26-char identifier without adding a runtime dep.
|
|
95
|
+
* Format: 10-char base32 of the current millisecond timestamp + 16-char
|
|
96
|
+
* base32 of random bytes. Lexically sortable, time-prefixed — same property
|
|
97
|
+
* that makes ULIDs useful for `pulls[]` ordering.
|
|
98
|
+
*
|
|
99
|
+
* We don't need full ULID spec compliance (monotonic counter, randomness
|
|
100
|
+
* spec) — just sortable + collision-resistant enough that two pulls
|
|
101
|
+
* issued in the same millisecond by different processes don't clash.
|
|
102
|
+
* 80 bits of randomness is plenty.
|
|
103
|
+
*/
|
|
104
|
+
export declare function generatePullId(now?: number): string;
|
|
105
|
+
/**
|
|
106
|
+
* Find the most-recent `PullRecord` for a company in the journal. Returns
|
|
107
|
+
* `undefined` when no record exists — scope-shrink callers treat that as
|
|
108
|
+
* "no prior scope; nothing to shrink".
|
|
109
|
+
*
|
|
110
|
+
* Order by `completedAt` descending — `pullId` is lexically sortable but
|
|
111
|
+
* `completedAt` is what semantically represents "most recent successful
|
|
112
|
+
* pull state at last close".
|
|
113
|
+
*/
|
|
114
|
+
export declare function lastPullRecord(journal: SyncJournal, companyUid: string): PullRecord | undefined;
|
|
115
|
+
/** Append a `PullRecord` (mutates `journal.pulls`). */
|
|
116
|
+
export declare function appendPullRecord(journal: SyncJournal, record: PullRecord): void;
|
|
117
|
+
/**
|
|
118
|
+
* Write a journal tombstone entry for `relativePath`. Used by the scope-
|
|
119
|
+
* shrink algorithm (US-005) and by `hq sync narrow --apply` (US-007).
|
|
120
|
+
*
|
|
121
|
+
* Tombstones intentionally keep the old `hash` / `size` / `syncedAt` /
|
|
122
|
+
* `direction` so a recovery flow could see what was there before pruning.
|
|
123
|
+
* They are GC'd after `TOMBSTONE_TTL_MS` via `gcTombstones`.
|
|
124
|
+
*/
|
|
125
|
+
export declare function tombstoneEntry(journal: SyncJournal, relativePath: string, reason: "scope_shrink" | "narrow_apply" | "manual", now?: string): void;
|
|
126
|
+
/** True if the entry is a tombstone (set by `tombstoneEntry`). */
|
|
127
|
+
export declare function isTombstone(entry: JournalEntry | undefined): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Garbage-collect tombstones older than `TOMBSTONE_TTL_MS` from
|
|
130
|
+
* `journal.files`. Returns the number removed. Cheap — single pass over
|
|
131
|
+
* the files map, no I/O. Safe to call at the start AND end of every
|
|
132
|
+
* `pullAll` per-company leg; both runs are idempotent.
|
|
133
|
+
*/
|
|
134
|
+
export declare function gcTombstones(journal: SyncJournal, now?: number): number;
|
|
60
135
|
//# sourceMappingURL=journal.d.ts.map
|
package/dist/journal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExE,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,QAA2B,CAAC;AAEzD,sEAAsE;AACtE,eAAO,MAAM,uBAAuB,EAAG,GAAY,CAAC;AAKpD;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAmBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAOrD;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAKrE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,GAAG,MAAM,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAYN;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,GACnB,YAAY,GAAG,SAAS,CAE1B;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,GACnB,IAAI,CAEN;AAOD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM,CAwB/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GACjB,UAAU,GAAG,SAAS,CAQxB;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,GACjB,IAAI,CAGN;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,GAAG,cAAc,GAAG,QAAQ,EAClD,GAAG,GAAE,MAAiC,GACrC,IAAI,CAKN;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,EACpB,GAAG,GAAE,MAAmB,GACvB,MAAM,CAYR"}
|
package/dist/journal.js
CHANGED
|
@@ -16,6 +16,10 @@ import * as fs from "fs";
|
|
|
16
16
|
import * as os from "os";
|
|
17
17
|
import * as path from "path";
|
|
18
18
|
import * as crypto from "crypto";
|
|
19
|
+
/** Tombstone retention. 30 days in milliseconds — roughly two release cycles. */
|
|
20
|
+
export const TOMBSTONE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
21
|
+
/** Current journal schema version written by all v2-aware writers. */
|
|
22
|
+
export const JOURNAL_VERSION_CURRENT = "2";
|
|
19
23
|
const JOURNAL_FILE_PREFIX = "sync-journal.";
|
|
20
24
|
const JOURNAL_FILE_SUFFIX = ".json";
|
|
21
25
|
/**
|
|
@@ -44,15 +48,53 @@ function sanitizeSlug(slug) {
|
|
|
44
48
|
export function getJournalPath(slug) {
|
|
45
49
|
return path.join(getStateDir(), `${JOURNAL_FILE_PREFIX}${sanitizeSlug(slug)}${JOURNAL_FILE_SUFFIX}`);
|
|
46
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Read a per-company journal from disk.
|
|
53
|
+
*
|
|
54
|
+
* Back-compat (US-005, v1 → v2): a v1 file on disk is returned as-is with
|
|
55
|
+
* `version: "1"` and no `pulls` field. The in-place migration to v2 happens
|
|
56
|
+
* the first time `writeJournal` runs — `migrateToV2` ensures any journal
|
|
57
|
+
* passed to the writer carries `version: "2"`, `pulls: []`, and the rest of
|
|
58
|
+
* the v2 shape. This keeps `readJournal` deterministic + cheap and confines
|
|
59
|
+
* the side effect (schema bump on disk) to writes.
|
|
60
|
+
*
|
|
61
|
+
* When the file doesn't exist, we return a fresh v2 journal directly — new
|
|
62
|
+
* installs never pass through v1 on disk.
|
|
63
|
+
*/
|
|
47
64
|
export function readJournal(slug) {
|
|
48
65
|
const journalPath = getJournalPath(slug);
|
|
49
66
|
if (fs.existsSync(journalPath)) {
|
|
50
67
|
const content = fs.readFileSync(journalPath, "utf-8");
|
|
51
68
|
return JSON.parse(content);
|
|
52
69
|
}
|
|
53
|
-
return { version:
|
|
70
|
+
return { version: JOURNAL_VERSION_CURRENT, lastSync: "", files: {}, pulls: [] };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Coerce any-version journal into a v2 shape. Idempotent for v2 inputs.
|
|
74
|
+
* Mutates the input and returns it for chainable use. Call this immediately
|
|
75
|
+
* after `readJournal` if your code-path needs the v2 fields.
|
|
76
|
+
*
|
|
77
|
+
* v1 → v2 contract: every existing `files[]` entry is preserved as-is; no
|
|
78
|
+
* tombstone fields are inserted (legacy entries are NOT scope-shrink
|
|
79
|
+
* tombstones). `pulls` becomes `[]` (empty history → treat last scope as
|
|
80
|
+
* "all" in the scope-shrink algorithm).
|
|
81
|
+
*/
|
|
82
|
+
export function migrateToV2(journal) {
|
|
83
|
+
if (journal.version === "2" && Array.isArray(journal.pulls)) {
|
|
84
|
+
return journal;
|
|
85
|
+
}
|
|
86
|
+
journal.version = JOURNAL_VERSION_CURRENT;
|
|
87
|
+
if (!Array.isArray(journal.pulls))
|
|
88
|
+
journal.pulls = [];
|
|
89
|
+
return journal;
|
|
54
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Write a journal to disk, migrating to the current schema version in-place.
|
|
93
|
+
* `migrateToV2` mutates the passed-in object — callers that hold a reference
|
|
94
|
+
* after the write will see the v2 shape.
|
|
95
|
+
*/
|
|
55
96
|
export function writeJournal(slug, journal) {
|
|
97
|
+
migrateToV2(journal);
|
|
56
98
|
const journalPath = getJournalPath(slug);
|
|
57
99
|
fs.mkdirSync(path.dirname(journalPath), { recursive: true });
|
|
58
100
|
fs.writeFileSync(journalPath, JSON.stringify(journal, null, 2));
|
|
@@ -121,4 +163,109 @@ export function getEntry(journal, relativePath) {
|
|
|
121
163
|
export function removeEntry(journal, relativePath) {
|
|
122
164
|
delete journal.files[relativePath];
|
|
123
165
|
}
|
|
166
|
+
// ─── Journal v2 (US-005): pulls, tombstones, GC ─────────────────────────────
|
|
167
|
+
/** Crockford base32 alphabet (ULID-compatible). */
|
|
168
|
+
const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
169
|
+
/**
|
|
170
|
+
* Generate a ULID-shaped 26-char identifier without adding a runtime dep.
|
|
171
|
+
* Format: 10-char base32 of the current millisecond timestamp + 16-char
|
|
172
|
+
* base32 of random bytes. Lexically sortable, time-prefixed — same property
|
|
173
|
+
* that makes ULIDs useful for `pulls[]` ordering.
|
|
174
|
+
*
|
|
175
|
+
* We don't need full ULID spec compliance (monotonic counter, randomness
|
|
176
|
+
* spec) — just sortable + collision-resistant enough that two pulls
|
|
177
|
+
* issued in the same millisecond by different processes don't clash.
|
|
178
|
+
* 80 bits of randomness is plenty.
|
|
179
|
+
*/
|
|
180
|
+
export function generatePullId(now = Date.now()) {
|
|
181
|
+
let time = now;
|
|
182
|
+
const timeChars = [];
|
|
183
|
+
for (let i = 0; i < 10; i++) {
|
|
184
|
+
timeChars.unshift(CROCKFORD[time % 32]);
|
|
185
|
+
time = Math.floor(time / 32);
|
|
186
|
+
}
|
|
187
|
+
const randBytes = crypto.randomBytes(10); // 80 bits
|
|
188
|
+
const randChars = [];
|
|
189
|
+
// Encode 10 random bytes (80 bits) into 16 base32 chars.
|
|
190
|
+
let buf = 0;
|
|
191
|
+
let bits = 0;
|
|
192
|
+
for (let i = 0; i < randBytes.length; i++) {
|
|
193
|
+
buf = (buf << 8) | randBytes[i];
|
|
194
|
+
bits += 8;
|
|
195
|
+
while (bits >= 5) {
|
|
196
|
+
bits -= 5;
|
|
197
|
+
randChars.push(CROCKFORD[(buf >> bits) & 0x1f]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (bits > 0) {
|
|
201
|
+
randChars.push(CROCKFORD[(buf << (5 - bits)) & 0x1f]);
|
|
202
|
+
}
|
|
203
|
+
return timeChars.join("") + randChars.slice(0, 16).join("");
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Find the most-recent `PullRecord` for a company in the journal. Returns
|
|
207
|
+
* `undefined` when no record exists — scope-shrink callers treat that as
|
|
208
|
+
* "no prior scope; nothing to shrink".
|
|
209
|
+
*
|
|
210
|
+
* Order by `completedAt` descending — `pullId` is lexically sortable but
|
|
211
|
+
* `completedAt` is what semantically represents "most recent successful
|
|
212
|
+
* pull state at last close".
|
|
213
|
+
*/
|
|
214
|
+
export function lastPullRecord(journal, companyUid) {
|
|
215
|
+
if (!journal.pulls || journal.pulls.length === 0)
|
|
216
|
+
return undefined;
|
|
217
|
+
let best;
|
|
218
|
+
for (const p of journal.pulls) {
|
|
219
|
+
if (p.companyUid !== companyUid)
|
|
220
|
+
continue;
|
|
221
|
+
if (!best || p.completedAt > best.completedAt)
|
|
222
|
+
best = p;
|
|
223
|
+
}
|
|
224
|
+
return best;
|
|
225
|
+
}
|
|
226
|
+
/** Append a `PullRecord` (mutates `journal.pulls`). */
|
|
227
|
+
export function appendPullRecord(journal, record) {
|
|
228
|
+
migrateToV2(journal);
|
|
229
|
+
journal.pulls.push(record);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Write a journal tombstone entry for `relativePath`. Used by the scope-
|
|
233
|
+
* shrink algorithm (US-005) and by `hq sync narrow --apply` (US-007).
|
|
234
|
+
*
|
|
235
|
+
* Tombstones intentionally keep the old `hash` / `size` / `syncedAt` /
|
|
236
|
+
* `direction` so a recovery flow could see what was there before pruning.
|
|
237
|
+
* They are GC'd after `TOMBSTONE_TTL_MS` via `gcTombstones`.
|
|
238
|
+
*/
|
|
239
|
+
export function tombstoneEntry(journal, relativePath, reason, now = new Date().toISOString()) {
|
|
240
|
+
const entry = journal.files[relativePath];
|
|
241
|
+
if (!entry)
|
|
242
|
+
return;
|
|
243
|
+
entry.removedAt = now;
|
|
244
|
+
entry.removedReason = reason;
|
|
245
|
+
}
|
|
246
|
+
/** True if the entry is a tombstone (set by `tombstoneEntry`). */
|
|
247
|
+
export function isTombstone(entry) {
|
|
248
|
+
return !!entry && typeof entry.removedAt === "string";
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Garbage-collect tombstones older than `TOMBSTONE_TTL_MS` from
|
|
252
|
+
* `journal.files`. Returns the number removed. Cheap — single pass over
|
|
253
|
+
* the files map, no I/O. Safe to call at the start AND end of every
|
|
254
|
+
* `pullAll` per-company leg; both runs are idempotent.
|
|
255
|
+
*/
|
|
256
|
+
export function gcTombstones(journal, now = Date.now()) {
|
|
257
|
+
let removed = 0;
|
|
258
|
+
for (const [path, entry] of Object.entries(journal.files)) {
|
|
259
|
+
if (!entry.removedAt)
|
|
260
|
+
continue;
|
|
261
|
+
const removedTime = Date.parse(entry.removedAt);
|
|
262
|
+
if (Number.isNaN(removedTime))
|
|
263
|
+
continue;
|
|
264
|
+
if (now - removedTime > TOMBSTONE_TTL_MS) {
|
|
265
|
+
delete journal.files[path];
|
|
266
|
+
removed++;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return removed;
|
|
270
|
+
}
|
|
124
271
|
//# sourceMappingURL=journal.js.map
|
package/dist/journal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAC5C,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,oCAAoC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CACd,WAAW,EAAE,EACb,GAAG,mBAAmB,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,mBAAmB,EAAE,CACpE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"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"}
|