@indigoai-us/hq-cloud 6.15.75 → 6.15.77

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 (73) hide show
  1. package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
  2. package/dist/bin/sync-runner-watch-loop.js +12 -2
  3. package/dist/bin/sync-runner-watch-loop.js.map +1 -1
  4. package/dist/bin/sync-runner.d.ts +4 -0
  5. package/dist/bin/sync-runner.d.ts.map +1 -1
  6. package/dist/bin/sync-runner.js.map +1 -1
  7. package/dist/bin/sync-runner.test.js +95 -4
  8. package/dist/bin/sync-runner.test.js.map +1 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.test.d.ts +2 -0
  14. package/dist/index.test.d.ts.map +1 -0
  15. package/dist/index.test.js +16 -0
  16. package/dist/index.test.js.map +1 -0
  17. package/dist/operation-lock.d.ts +31 -28
  18. package/dist/operation-lock.d.ts.map +1 -1
  19. package/dist/operation-lock.js +206 -50
  20. package/dist/operation-lock.js.map +1 -1
  21. package/dist/operation-lock.test.js +105 -1
  22. package/dist/operation-lock.test.js.map +1 -1
  23. package/dist/sync/area-resolver.d.ts +66 -0
  24. package/dist/sync/area-resolver.d.ts.map +1 -0
  25. package/dist/sync/area-resolver.js +306 -0
  26. package/dist/sync/area-resolver.js.map +1 -0
  27. package/dist/sync/area-resolver.test.d.ts +2 -0
  28. package/dist/sync/area-resolver.test.d.ts.map +1 -0
  29. package/dist/sync/area-resolver.test.js +211 -0
  30. package/dist/sync/area-resolver.test.js.map +1 -0
  31. package/dist/sync/event-sync.d.ts +5 -1
  32. package/dist/sync/event-sync.d.ts.map +1 -1
  33. package/dist/sync/event-sync.js +3 -0
  34. package/dist/sync/event-sync.js.map +1 -1
  35. package/dist/sync/event-sync.test.js +45 -0
  36. package/dist/sync/event-sync.test.js.map +1 -1
  37. package/dist/sync/index.d.ts +4 -0
  38. package/dist/sync/index.d.ts.map +1 -1
  39. package/dist/sync/index.js +2 -0
  40. package/dist/sync/index.js.map +1 -1
  41. package/dist/sync/parallel-sync-coordinator.d.ts +77 -0
  42. package/dist/sync/parallel-sync-coordinator.d.ts.map +1 -0
  43. package/dist/sync/parallel-sync-coordinator.js +287 -0
  44. package/dist/sync/parallel-sync-coordinator.js.map +1 -0
  45. package/dist/sync/parallel-sync-coordinator.test.d.ts +2 -0
  46. package/dist/sync/parallel-sync-coordinator.test.d.ts.map +1 -0
  47. package/dist/sync/parallel-sync-coordinator.test.js +281 -0
  48. package/dist/sync/parallel-sync-coordinator.test.js.map +1 -0
  49. package/dist/sync/path-leases.d.ts +31 -0
  50. package/dist/sync/path-leases.d.ts.map +1 -0
  51. package/dist/sync/path-leases.js +74 -0
  52. package/dist/sync/path-leases.js.map +1 -0
  53. package/dist/sync/path-leases.test.d.ts +2 -0
  54. package/dist/sync/path-leases.test.d.ts.map +1 -0
  55. package/dist/sync/path-leases.test.js +51 -0
  56. package/dist/sync/path-leases.test.js.map +1 -0
  57. package/dist/sync/state-store.d.ts +7 -0
  58. package/dist/sync/state-store.d.ts.map +1 -1
  59. package/dist/sync/state-store.js +104 -43
  60. package/dist/sync/state-store.js.map +1 -1
  61. package/dist/sync/state-store.test.js +62 -1
  62. package/dist/sync/state-store.test.js.map +1 -1
  63. package/dist/sync/sync-work.d.ts +64 -0
  64. package/dist/sync/sync-work.d.ts.map +1 -0
  65. package/dist/sync/sync-work.js +11 -0
  66. package/dist/sync/sync-work.js.map +1 -0
  67. package/dist/watcher.d.ts +65 -0
  68. package/dist/watcher.d.ts.map +1 -1
  69. package/dist/watcher.js +280 -24
  70. package/dist/watcher.js.map +1 -1
  71. package/dist/watcher.test.js +401 -3
  72. package/dist/watcher.test.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1,306 @@
1
+ /**
2
+ * Versioned, pure routing for the personal-vault's independently durable
3
+ * areas. This module deliberately does not open state stores or schedule work:
4
+ * callers persist a serialized layout and later reconstruct this resolver from
5
+ * that exact layout instead of re-inferring an older layout with newer code.
6
+ */
7
+ import * as fs from "fs";
8
+ import * as path from "path";
9
+ import { computeAgencySyncPaths, computeContinuityPointerPaths, computePersonalCompanySubdirs, computePersonalVaultPaths, computeSessionLogsSyncPaths, PERSONAL_VAULT_EXCLUDED_TOP_LEVEL, PERSONAL_VAULT_MANIFEST_KEY, } from "../personal-vault.js";
10
+ export const AREA_LAYOUT_FORMAT = 1;
11
+ export const AREA_ROUTER_VERSION = 1;
12
+ export const META_AREA_ID = "@meta";
13
+ /**
14
+ * Collapse a local spelling into the wire path namespace used by vault keys.
15
+ * The resulting value remains case-sensitive: S3 keys distinguish `Core` from
16
+ * `core`, and folding here would turn an excluded alias into a routed path.
17
+ */
18
+ export function canonicalizeVaultPath(value) {
19
+ if (value.length === 0 || value.includes("\0") || hasUnpairedSurrogate(value)) {
20
+ return null;
21
+ }
22
+ const slashPath = value.replaceAll("\\", "/");
23
+ if (slashPath.startsWith("/") ||
24
+ slashPath.endsWith("/") ||
25
+ slashPath.split("/").some((segment) => segment === "" || segment === "." || segment === "..") ||
26
+ slashPath.normalize("NFC") !== slashPath) {
27
+ return null;
28
+ }
29
+ return slashPath;
30
+ }
31
+ /** Build the initial v1 mapping from an explicit, already-authorized scope. */
32
+ export function createPersonalVaultAreaLayout(scope) {
33
+ const routes = [];
34
+ const addPrefix = (areaId, rawPath) => {
35
+ const canonical = requireCanonicalPath(rawPath, "area prefix");
36
+ routes.push({ areaId, path: canonical, kind: "prefix" });
37
+ };
38
+ const addPath = (areaId, rawPath) => {
39
+ const canonical = requireCanonicalPath(rawPath, "area path");
40
+ routes.push({ areaId, path: canonical, kind: "exact" });
41
+ };
42
+ for (const root of scope.ordinaryRoots) {
43
+ assertSingleSegment(root, "ordinary root");
44
+ addPrefix(`root:${encodeAreaSegment(root)}`, root);
45
+ }
46
+ for (const rootFile of scope.rootFiles)
47
+ assertSingleSegment(rootFile, "root file");
48
+ if (scope.includeManifest)
49
+ addPath("root:companies", PERSONAL_VAULT_MANIFEST_KEY);
50
+ for (const slug of scope.localCompanySlugs) {
51
+ assertSingleSegment(slug, "local company slug");
52
+ addPrefix(`local-company:${encodeAreaSegment(slug)}`, `companies/${slug}`);
53
+ }
54
+ for (const continuityPath of scope.continuityPaths) {
55
+ addPath("workspace:continuity", continuityPath);
56
+ }
57
+ if (scope.includeAgency)
58
+ addPrefix("workspace:agency", "workspace/agency");
59
+ const agencyCompanies = new Set(scope.agencyCompanies);
60
+ for (const { company } of scope.agencyTeams)
61
+ agencyCompanies.add(company);
62
+ for (const company of agencyCompanies) {
63
+ assertSingleSegment(company, "agency company");
64
+ addPrefix(`workspace:agency:${encodeAreaSegment(company)}`, `workspace/agency/${company}`);
65
+ }
66
+ for (const { company, team } of scope.agencyTeams) {
67
+ assertSingleSegment(company, "agency company");
68
+ assertSingleSegment(team, "agency team");
69
+ addPrefix(`workspace:agency:${encodeAreaSegment(company)}:${encodeAreaSegment(team)}`, `workspace/agency/${company}/${team}`);
70
+ }
71
+ if (scope.includeSessionLogs) {
72
+ addPrefix("workspace:session-logs", "workspace/.session-logs");
73
+ }
74
+ return layoutFromRoutes(routes, true);
75
+ }
76
+ /**
77
+ * Resolve exactly the personal-vault scope constructors used today. This is a
78
+ * convenience for layout creation only; the resolver itself remains pure.
79
+ */
80
+ export function inspectPersonalVaultAreaScope(hqRoot, options = {}) {
81
+ const ordinaryRoots = [];
82
+ const rootFiles = [];
83
+ let includeManifest = false;
84
+ for (const absolutePath of computePersonalVaultPaths(hqRoot, options)) {
85
+ const relative = relativeVaultPath(hqRoot, absolutePath);
86
+ if (relative === null)
87
+ continue;
88
+ if (relative === PERSONAL_VAULT_MANIFEST_KEY) {
89
+ includeManifest = true;
90
+ continue;
91
+ }
92
+ if (!relative.includes("/")) {
93
+ try {
94
+ if (fs.lstatSync(absolutePath).isDirectory())
95
+ ordinaryRoots.push(relative);
96
+ else
97
+ rootFiles.push(relative);
98
+ }
99
+ catch {
100
+ // Scope constructors are fail-soft; an entry that disappeared cannot
101
+ // become an area merely because layout inspection raced its deletion.
102
+ }
103
+ }
104
+ }
105
+ const localCompanySlugs = computePersonalCompanySubdirs(hqRoot, options.teamSyncedSlugs).flatMap((absolutePath) => {
106
+ const relative = relativeVaultPath(hqRoot, absolutePath);
107
+ const parts = relative?.split("/") ?? [];
108
+ return parts.length === 2 && parts[0] === "companies" ? [parts[1]] : [];
109
+ });
110
+ const continuityPaths = computeContinuityPointerPaths(hqRoot).flatMap((absolutePath) => {
111
+ const relative = relativeVaultPath(hqRoot, absolutePath);
112
+ return relative === null ? [] : [relative];
113
+ });
114
+ return {
115
+ ordinaryRoots,
116
+ rootFiles,
117
+ includeManifest,
118
+ localCompanySlugs,
119
+ continuityPaths,
120
+ ...inspectAgencyScope(hqRoot),
121
+ includeSessionLogs: computeSessionLogsSyncPaths(hqRoot).length > 0,
122
+ };
123
+ }
124
+ /** Longest-prefix resolver reconstructed only from a versioned layout. */
125
+ export class AreaResolver {
126
+ layout;
127
+ routes;
128
+ constructor(layout) {
129
+ this.layout = normalizeLayout(layout);
130
+ this.routes = routesForLayout(this.layout);
131
+ }
132
+ static forPersonalVault(scope) {
133
+ return new AreaResolver(createPersonalVaultAreaLayout(scope));
134
+ }
135
+ static fromJson(serialized) {
136
+ let parsed;
137
+ try {
138
+ parsed = JSON.parse(serialized);
139
+ }
140
+ catch (error) {
141
+ throw new Error(`invalid area layout JSON: ${error.message}`);
142
+ }
143
+ return new AreaResolver(parsed);
144
+ }
145
+ /** Return the uniquely owning area, or undefined when the path is out of scope. */
146
+ resolve(rawPath) {
147
+ const canonical = canonicalizeVaultPath(rawPath);
148
+ if (canonical === null)
149
+ return undefined;
150
+ let winner;
151
+ for (const route of this.routes) {
152
+ const matches = route.kind === "exact"
153
+ ? route.path === canonical
154
+ : route.path === canonical || canonical.startsWith(`${route.path}/`);
155
+ if (matches &&
156
+ (winner === undefined || route.path.length > winner.path.length)) {
157
+ winner = route;
158
+ }
159
+ }
160
+ if (winner !== undefined)
161
+ return winner.areaId;
162
+ if (!canonical.includes("/") && !PERSONAL_VAULT_EXCLUDED_TOP_LEVEL.includes(canonical)) {
163
+ return this.layout.areas.find((area) => area.rootFiles)?.id;
164
+ }
165
+ return undefined;
166
+ }
167
+ /** Stable, newline-terminated `layout.json` serialization. */
168
+ toJson() {
169
+ return `${JSON.stringify(this.layout, null, 2)}\n`;
170
+ }
171
+ }
172
+ function layoutFromRoutes(routes, rootFiles) {
173
+ const byArea = new Map();
174
+ for (const route of routes) {
175
+ const entry = byArea.get(route.areaId) ?? { prefixes: new Set(), paths: new Set(), rootFiles: false };
176
+ if (route.kind === "prefix")
177
+ entry.prefixes.add(route.path);
178
+ else
179
+ entry.paths.add(route.path);
180
+ byArea.set(route.areaId, entry);
181
+ }
182
+ if (rootFiles) {
183
+ byArea.set("root:@files", byArea.get("root:@files") ?? {
184
+ prefixes: new Set(), paths: new Set(), rootFiles: true,
185
+ });
186
+ }
187
+ return normalizeLayout({
188
+ format: AREA_LAYOUT_FORMAT,
189
+ routerVersion: AREA_ROUTER_VERSION,
190
+ areas: [...byArea.entries()].map(([id, entry]) => ({
191
+ id,
192
+ prefixes: [...entry.prefixes],
193
+ paths: [...entry.paths],
194
+ ...(entry.rootFiles ? { rootFiles: true } : {}),
195
+ })),
196
+ });
197
+ }
198
+ function normalizeLayout(layout) {
199
+ if (layout?.format !== AREA_LAYOUT_FORMAT || layout.routerVersion !== AREA_ROUTER_VERSION || !Array.isArray(layout.areas)) {
200
+ throw new Error("unsupported area layout version");
201
+ }
202
+ const seenIds = new Set();
203
+ const seenRoutes = new Map();
204
+ const areas = layout.areas.map((area) => {
205
+ if (!area || typeof area.id !== "string" || area.id.length === 0 || seenIds.has(area.id)) {
206
+ throw new Error("area layout contains an invalid or duplicate area id");
207
+ }
208
+ seenIds.add(area.id);
209
+ const normalizeRoutes = (paths, kind) => {
210
+ if (!Array.isArray(paths))
211
+ throw new Error("area layout contains invalid routes");
212
+ return [...new Set(paths.map((route) => requireCanonicalPath(route, `area ${kind}`)))].sort(compareText);
213
+ };
214
+ const prefixes = normalizeRoutes(area.prefixes, "prefix");
215
+ const paths = normalizeRoutes(area.paths, "exact");
216
+ if (area.rootFiles !== undefined && area.rootFiles !== true) {
217
+ throw new Error("area layout contains an invalid rootFiles flag");
218
+ }
219
+ const rootFiles = area.rootFiles === true;
220
+ if (rootFiles && area.id !== "root:@files") {
221
+ throw new Error("only root:@files may own root files");
222
+ }
223
+ for (const [_kind, routes] of [["prefix", prefixes], ["exact", paths]]) {
224
+ for (const route of routes) {
225
+ const prior = seenRoutes.get(route);
226
+ if (prior !== undefined && prior !== area.id) {
227
+ throw new Error(`area layout assigns ${route} to both ${prior} and ${area.id}`);
228
+ }
229
+ seenRoutes.set(route, area.id);
230
+ }
231
+ }
232
+ return { id: area.id, prefixes, paths, ...(rootFiles ? { rootFiles: true } : {}) };
233
+ }).sort((left, right) => compareText(left.id, right.id));
234
+ return { format: AREA_LAYOUT_FORMAT, routerVersion: AREA_ROUTER_VERSION, areas };
235
+ }
236
+ function routesForLayout(layout) {
237
+ return layout.areas.flatMap((area) => [
238
+ ...area.prefixes.map((path) => ({ areaId: area.id, path, kind: "prefix" })),
239
+ ...area.paths.map((path) => ({ areaId: area.id, path, kind: "exact" })),
240
+ ]);
241
+ }
242
+ function inspectAgencyScope(hqRoot) {
243
+ if (computeAgencySyncPaths(hqRoot).length === 0) {
244
+ return { agencyCompanies: [], agencyTeams: [], includeAgency: false };
245
+ }
246
+ const root = path.join(hqRoot, "workspace", "agency");
247
+ try {
248
+ const agencyCompanies = [];
249
+ const agencyTeams = [];
250
+ for (const company of fs.readdirSync(root, { withFileTypes: true })) {
251
+ if (!company.isDirectory())
252
+ continue;
253
+ agencyCompanies.push(company.name);
254
+ try {
255
+ agencyTeams.push(...fs.readdirSync(path.join(root, company.name), { withFileTypes: true })
256
+ .filter((team) => team.isDirectory())
257
+ .map((team) => ({ company: company.name, team: team.name })));
258
+ }
259
+ catch {
260
+ // The company fallback still owns files if its team discovery races.
261
+ }
262
+ }
263
+ return { agencyCompanies, agencyTeams, includeAgency: true };
264
+ }
265
+ catch {
266
+ // computeAgencySyncPaths already proved the carve-out exists, so retain the
267
+ // root fallback if a directory read races its removal or permissions change.
268
+ return { agencyCompanies: [], agencyTeams: [], includeAgency: true };
269
+ }
270
+ }
271
+ function relativeVaultPath(hqRoot, absolutePath) {
272
+ const relative = path.relative(hqRoot, absolutePath).split(path.sep).join("/");
273
+ return canonicalizeVaultPath(relative);
274
+ }
275
+ function requireCanonicalPath(value, label) {
276
+ const canonical = canonicalizeVaultPath(value);
277
+ if (canonical === null)
278
+ throw new Error(`${label} is not a canonical vault path: ${value}`);
279
+ return canonical;
280
+ }
281
+ function assertSingleSegment(value, label) {
282
+ const canonical = requireCanonicalPath(value, label);
283
+ if (canonical.includes("/"))
284
+ throw new Error(`${label} must be one path segment: ${value}`);
285
+ }
286
+ function encodeAreaSegment(value) {
287
+ return [...value].map((character) => /^[A-Za-z0-9._-]$/.test(character) ? character : encodeURIComponent(character)).join("");
288
+ }
289
+ function hasUnpairedSurrogate(value) {
290
+ for (let index = 0; index < value.length; index++) {
291
+ const code = value.charCodeAt(index);
292
+ if (code >= 0xd800 && code <= 0xdbff) {
293
+ if (index + 1 >= value.length || value.charCodeAt(index + 1) < 0xdc00 || value.charCodeAt(index + 1) > 0xdfff)
294
+ return true;
295
+ index++;
296
+ }
297
+ else if (code >= 0xdc00 && code <= 0xdfff) {
298
+ return true;
299
+ }
300
+ }
301
+ return false;
302
+ }
303
+ function compareText(left, right) {
304
+ return left < right ? -1 : left > right ? 1 : 0;
305
+ }
306
+ //# sourceMappingURL=area-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-resolver.js","sourceRoot":"","sources":["../../src/sync/area-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=area-resolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-resolver.test.d.ts","sourceRoot":"","sources":["../../src/sync/area-resolver.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,211 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as os from "os";
4
+ import * as path from "path";
5
+ import { computeAgencySyncPaths, computeContinuityPointerPaths, computePersonalCompanySubdirs, computePersonalVaultPaths, computeSessionLogsSyncPaths, } from "../personal-vault.js";
6
+ import { AreaResolver, canonicalizeVaultPath, createPersonalVaultAreaLayout, inspectPersonalVaultAreaScope, } from "./area-resolver.js";
7
+ describe("AreaResolver", () => {
8
+ let hqRoot;
9
+ beforeEach(() => {
10
+ hqRoot = fs.mkdtempSync(path.join(os.tmpdir(), "hq-area-resolver-"));
11
+ write("README.md");
12
+ write("core/policies/rule.md");
13
+ write(".claude/settings.json");
14
+ write("companies/manifest.yaml");
15
+ write("companies/local/company.yaml");
16
+ write("companies/local/projects/plan.md");
17
+ write("workspace/threads/T-active.json", "{}");
18
+ write("workspace/threads/handoff.json", JSON.stringify({ thread_path: "workspace/threads/T-active.json" }));
19
+ write("workspace/agency/agency-state.json");
20
+ write("workspace/agency/acme/company-state.json");
21
+ write("workspace/agency/acme/growth/inbox.jsonl");
22
+ write("workspace/.session-logs/codex/session.jsonl");
23
+ write("workspace/locks/local-only.lock");
24
+ });
25
+ afterEach(() => {
26
+ fs.rmSync(hqRoot, { recursive: true, force: true });
27
+ });
28
+ function write(relativePath, content = "x") {
29
+ const target = path.join(hqRoot, relativePath);
30
+ fs.mkdirSync(path.dirname(target), { recursive: true });
31
+ fs.writeFileSync(target, content);
32
+ }
33
+ function resolver() {
34
+ return new AreaResolver(createPersonalVaultAreaLayout(inspectPersonalVaultAreaScope(hqRoot)));
35
+ }
36
+ it.each([
37
+ ["computePersonalVaultPaths", () => computePersonalVaultPaths(hqRoot), "README.md", "root:@files"],
38
+ ["top-level roots", () => computePersonalVaultPaths(hqRoot), "core/policies/rule.md", "root:core"],
39
+ ["computePersonalCompanySubdirs", () => computePersonalCompanySubdirs(hqRoot), "companies/local/projects/plan.md", "local-company:local"],
40
+ ["computeContinuityPointerPaths", () => computeContinuityPointerPaths(hqRoot), "workspace/threads/T-active.json", "workspace:continuity"],
41
+ ["computeAgencySyncPaths root fallback", () => computeAgencySyncPaths(hqRoot), "workspace/agency/agency-state.json", "workspace:agency"],
42
+ ["computeAgencySyncPaths company fallback", () => computeAgencySyncPaths(hqRoot), "workspace/agency/acme/company-state.json", "workspace:agency:acme"],
43
+ ["computeAgencySyncPaths", () => computeAgencySyncPaths(hqRoot), "workspace/agency/acme/growth/inbox.jsonl", "workspace:agency:acme:growth"],
44
+ ["computeSessionLogsSyncPaths", () => computeSessionLogsSyncPaths(hqRoot), "workspace/.session-logs/codex/session.jsonl", "workspace:session-logs"],
45
+ ])("maps the scope made by %s", (_constructor, buildScope, includedPath, expectedArea) => {
46
+ expect(buildScope()).not.toEqual([]);
47
+ expect(resolver().resolve(includedPath)).toBe(expectedArea);
48
+ });
49
+ it("uses longest prefix matching and excludes paths outside the actual scope", () => {
50
+ const areaResolver = resolver();
51
+ expect(areaResolver.resolve("companies/manifest.yaml")).toBe("root:companies");
52
+ expect(areaResolver.resolve("companies/local/company.yaml")).toBe("local-company:local");
53
+ expect(areaResolver.resolve("workspace/threads/handoff.json")).toBe("workspace:continuity");
54
+ expect(areaResolver.resolve("workspace/threads/old-thread.json")).toBeUndefined();
55
+ expect(areaResolver.resolve("workspace/agency/acme/other/inbox.jsonl")).toBe("workspace:agency:acme");
56
+ expect(areaResolver.resolve("workspace/locks/local-only.lock")).toBeUndefined();
57
+ expect(areaResolver.resolve("repos/private/hq-cloud/package.json")).toBeUndefined();
58
+ });
59
+ it("gives every generated in-scope path exactly one stable area", () => {
60
+ const areaResolver = resolver();
61
+ const paths = Array.from({ length: 100 }, (_, index) => [
62
+ `core/generated/${index}.md`,
63
+ `companies/local/generated/${index}.md`,
64
+ `workspace/agency/acme/growth/generated/${index}.json`,
65
+ `workspace/.session-logs/generated/${index}.jsonl`,
66
+ `workspace/threads/T-active.json`,
67
+ `root-${index}.md`,
68
+ ]).flat();
69
+ for (const includedPath of paths) {
70
+ const first = areaResolver.resolve(includedPath);
71
+ const separatorAlias = areaResolver.resolve(includedPath.replaceAll("/", "\\"));
72
+ expect(first, includedPath).toBeDefined();
73
+ expect(separatorAlias, includedPath).toBe(first);
74
+ }
75
+ });
76
+ it("assigns exactly one stable area to every generated agency-subtree path", () => {
77
+ const areaResolver = resolver();
78
+ const paths = Array.from({ length: 100 }, (_, index) => [
79
+ `workspace/agency/root-${index}.json`,
80
+ `workspace/agency/acme/company-${index}.json`,
81
+ `workspace/agency/acme/growth/team-${index}.json`,
82
+ ]).flat();
83
+ for (const includedPath of paths) {
84
+ const resolved = areaResolver.resolve(includedPath);
85
+ expect(resolved, includedPath).toBeDefined();
86
+ expect(areaResolver.resolve(includedPath.replaceAll("/", "\\")), includedPath).toBe(resolved);
87
+ }
88
+ });
89
+ it("rejects traversal, non-canonical Unicode, malformed Unicode, and case aliases", () => {
90
+ const areaResolver = resolver();
91
+ expect(canonicalizeVaultPath("core\\policies\\rule.md")).toBe("core/policies/rule.md");
92
+ expect(areaResolver.resolve("core/../personal/secret.md")).toBeUndefined();
93
+ expect(areaResolver.resolve("./core/policies/rule.md")).toBeUndefined();
94
+ expect(areaResolver.resolve("/core/policies/rule.md")).toBeUndefined();
95
+ expect(areaResolver.resolve("core//policies/rule.md")).toBeUndefined();
96
+ expect(areaResolver.resolve("Core/policies/rule.md")).toBeUndefined();
97
+ expect(areaResolver.resolve("core/cafe\u0301.md")).toBeUndefined();
98
+ expect(areaResolver.resolve(`core/${String.fromCharCode(0xd800)}.md`)).toBeUndefined();
99
+ });
100
+ it("serializes a stable v1 layout compatible with the golden layout.json", () => {
101
+ const layout = new AreaResolver(createPersonalVaultAreaLayout({
102
+ ordinaryRoots: ["core", ".claude"],
103
+ rootFiles: ["README.md"],
104
+ includeManifest: true,
105
+ localCompanySlugs: ["local"],
106
+ continuityPaths: ["workspace/threads/T-active.json", "workspace/threads/handoff.json"],
107
+ agencyCompanies: ["acme"],
108
+ agencyTeams: [{ company: "acme", team: "growth" }],
109
+ includeAgency: true,
110
+ includeSessionLogs: true,
111
+ }));
112
+ const golden = `{
113
+ "format": 1,
114
+ "routerVersion": 1,
115
+ "areas": [
116
+ {
117
+ "id": "local-company:local",
118
+ "prefixes": [
119
+ "companies/local"
120
+ ],
121
+ "paths": []
122
+ },
123
+ {
124
+ "id": "root:.claude",
125
+ "prefixes": [
126
+ ".claude"
127
+ ],
128
+ "paths": []
129
+ },
130
+ {
131
+ "id": "root:@files",
132
+ "prefixes": [],
133
+ "paths": [],
134
+ "rootFiles": true
135
+ },
136
+ {
137
+ "id": "root:companies",
138
+ "prefixes": [],
139
+ "paths": [
140
+ "companies/manifest.yaml"
141
+ ]
142
+ },
143
+ {
144
+ "id": "root:core",
145
+ "prefixes": [
146
+ "core"
147
+ ],
148
+ "paths": []
149
+ },
150
+ {
151
+ "id": "workspace:agency",
152
+ "prefixes": [
153
+ "workspace/agency"
154
+ ],
155
+ "paths": []
156
+ },
157
+ {
158
+ "id": "workspace:agency:acme",
159
+ "prefixes": [
160
+ "workspace/agency/acme"
161
+ ],
162
+ "paths": []
163
+ },
164
+ {
165
+ "id": "workspace:agency:acme:growth",
166
+ "prefixes": [
167
+ "workspace/agency/acme/growth"
168
+ ],
169
+ "paths": []
170
+ },
171
+ {
172
+ "id": "workspace:continuity",
173
+ "prefixes": [],
174
+ "paths": [
175
+ "workspace/threads/T-active.json",
176
+ "workspace/threads/handoff.json"
177
+ ]
178
+ },
179
+ {
180
+ "id": "workspace:session-logs",
181
+ "prefixes": [
182
+ "workspace/.session-logs"
183
+ ],
184
+ "paths": []
185
+ }
186
+ ]
187
+ }
188
+ `;
189
+ expect(layout.toJson()).toBe(golden);
190
+ expect(AreaResolver.fromJson(golden).toJson()).toBe(golden);
191
+ });
192
+ it("rejects an ambiguous persisted mapping", () => {
193
+ const scope = {
194
+ ordinaryRoots: ["core"],
195
+ rootFiles: [],
196
+ includeManifest: false,
197
+ localCompanySlugs: [],
198
+ continuityPaths: [],
199
+ agencyCompanies: [],
200
+ agencyTeams: [],
201
+ includeAgency: false,
202
+ includeSessionLogs: false,
203
+ };
204
+ const layout = createPersonalVaultAreaLayout(scope);
205
+ expect(() => new AreaResolver({
206
+ ...layout,
207
+ areas: [...layout.areas, { id: "duplicate", prefixes: ["core"], paths: [] }],
208
+ })).toThrow("assigns core to both");
209
+ });
210
+ });
211
+ //# sourceMappingURL=area-resolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-resolver.test.js","sourceRoot":"","sources":["../../src/sync/area-resolver.test.ts"],"names":[],"mappings":"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"}
@@ -32,7 +32,7 @@
32
32
  import { SQSClient } from "@aws-sdk/client-sqs";
33
33
  import { HttpPushTransport, type AuthTokenSource } from "./push-transport.js";
34
34
  import { type PushReceiver, type RealtimeWakeSource, type SqsClientLike, type SyncBatchEngineFn, type SyncEngineFn } from "./push-receiver.js";
35
- import type { TreeChangeBatch } from "../watcher.js";
35
+ import { type Clock, type TreeChangeBatch } from "../watcher.js";
36
36
  import { type CloudTelemetryClient, type TelemetryClaims } from "../telemetry-events.js";
37
37
  import { type SyncMetricCredentials } from "./metrics.js";
38
38
  /**
@@ -148,6 +148,10 @@ export interface StartEventSyncOptions {
148
148
  telemetryClient?: CloudTelemetryClient | null;
149
149
  telemetryClaims?: TelemetryClaims | null;
150
150
  now?: () => number;
151
+ /** Clock seam for deferred publish cleanup tests. */
152
+ clock?: Clock;
153
+ /** Override the per-path trailing-publish interval. */
154
+ publishMinIntervalMs?: number;
151
155
  /** Existing runner state directory for restart-durable publish suppression. */
152
156
  publishedContentHashStateDir?: string;
153
157
  /** Journal-derived hash baseline used only to seed a missing durable store. */
@@ -1 +1 @@
1
- {"version":3,"file":"event-sync.d.ts","sourceRoot":"","sources":["../../src/sync/event-sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-sync.d.ts","sourceRoot":"","sources":["../../src/sync/event-sync.ts"],"names":[],"mappings":"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"}
@@ -440,6 +440,8 @@ export async function startEventSync(opts) {
440
440
  onPublishOutcome: (outcome) => log(`event-sync: publish outcome ${JSON.stringify(outcome)}`),
441
441
  telemetryClient: opts.telemetryClient,
442
442
  telemetryClaims: opts.telemetryClaims,
443
+ clock: opts.clock,
444
+ publishMinIntervalMs: opts.publishMinIntervalMs,
443
445
  lastPublishedContentHashStateDir: opts.publishedContentHashStateDir,
444
446
  initialPublishedContentHashes: opts.initialPublishedContentHashes,
445
447
  });
@@ -491,6 +493,7 @@ export async function startEventSync(opts) {
491
493
  ownDeviceId: deviceId,
492
494
  dispose: async () => {
493
495
  await receiver.dispose().catch(() => undefined);
496
+ emitter.dispose();
494
497
  await transport.dispose().catch(() => undefined);
495
498
  },
496
499
  };