@indigoai-us/hq-cloud 6.15.76 → 6.15.78

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 (81) hide show
  1. package/dist/bin/sync-runner-worker.d.ts +3 -0
  2. package/dist/bin/sync-runner-worker.d.ts.map +1 -0
  3. package/dist/bin/sync-runner-worker.js +88 -0
  4. package/dist/bin/sync-runner-worker.js.map +1 -0
  5. package/dist/bin/sync-runner.d.ts +3 -1
  6. package/dist/bin/sync-runner.d.ts.map +1 -1
  7. package/dist/bin/sync-runner.js +31 -13
  8. package/dist/bin/sync-runner.js.map +1 -1
  9. package/dist/bin/sync-runner.test.js +117 -1
  10. package/dist/bin/sync-runner.test.js.map +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.test.d.ts +2 -0
  16. package/dist/index.test.d.ts.map +1 -0
  17. package/dist/index.test.js +16 -0
  18. package/dist/index.test.js.map +1 -0
  19. package/dist/operation-lock.d.ts +31 -28
  20. package/dist/operation-lock.d.ts.map +1 -1
  21. package/dist/operation-lock.js +206 -50
  22. package/dist/operation-lock.js.map +1 -1
  23. package/dist/operation-lock.test.js +105 -1
  24. package/dist/operation-lock.test.js.map +1 -1
  25. package/dist/sync/area-resolver.d.ts +66 -0
  26. package/dist/sync/area-resolver.d.ts.map +1 -0
  27. package/dist/sync/area-resolver.js +306 -0
  28. package/dist/sync/area-resolver.js.map +1 -0
  29. package/dist/sync/area-resolver.test.d.ts +2 -0
  30. package/dist/sync/area-resolver.test.d.ts.map +1 -0
  31. package/dist/sync/area-resolver.test.js +211 -0
  32. package/dist/sync/area-resolver.test.js.map +1 -0
  33. package/dist/sync/child-process-sync-worker.d.ts +53 -0
  34. package/dist/sync/child-process-sync-worker.d.ts.map +1 -0
  35. package/dist/sync/child-process-sync-worker.js +256 -0
  36. package/dist/sync/child-process-sync-worker.js.map +1 -0
  37. package/dist/sync/child-process-sync-worker.test.d.ts +2 -0
  38. package/dist/sync/child-process-sync-worker.test.d.ts.map +1 -0
  39. package/dist/sync/child-process-sync-worker.test.js +262 -0
  40. package/dist/sync/child-process-sync-worker.test.js.map +1 -0
  41. package/dist/sync/index.d.ts +8 -0
  42. package/dist/sync/index.d.ts.map +1 -1
  43. package/dist/sync/index.js +4 -0
  44. package/dist/sync/index.js.map +1 -1
  45. package/dist/sync/parallel-sync-coordinator.d.ts +77 -0
  46. package/dist/sync/parallel-sync-coordinator.d.ts.map +1 -0
  47. package/dist/sync/parallel-sync-coordinator.js +292 -0
  48. package/dist/sync/parallel-sync-coordinator.js.map +1 -0
  49. package/dist/sync/parallel-sync-coordinator.test.d.ts +2 -0
  50. package/dist/sync/parallel-sync-coordinator.test.d.ts.map +1 -0
  51. package/dist/sync/parallel-sync-coordinator.test.js +303 -0
  52. package/dist/sync/parallel-sync-coordinator.test.js.map +1 -0
  53. package/dist/sync/path-leases.d.ts +31 -0
  54. package/dist/sync/path-leases.d.ts.map +1 -0
  55. package/dist/sync/path-leases.js +74 -0
  56. package/dist/sync/path-leases.js.map +1 -0
  57. package/dist/sync/path-leases.test.d.ts +2 -0
  58. package/dist/sync/path-leases.test.d.ts.map +1 -0
  59. package/dist/sync/path-leases.test.js +51 -0
  60. package/dist/sync/path-leases.test.js.map +1 -0
  61. package/dist/sync/state-store.d.ts +13 -0
  62. package/dist/sync/state-store.d.ts.map +1 -1
  63. package/dist/sync/state-store.js +158 -51
  64. package/dist/sync/state-store.js.map +1 -1
  65. package/dist/sync/state-store.test.js +148 -2
  66. package/dist/sync/state-store.test.js.map +1 -1
  67. package/dist/sync/sync-work.d.ts +66 -0
  68. package/dist/sync/sync-work.d.ts.map +1 -0
  69. package/dist/sync/sync-work.js +11 -0
  70. package/dist/sync/sync-work.js.map +1 -0
  71. package/dist/sync/sync-worker-port.d.ts +59 -0
  72. package/dist/sync/sync-worker-port.d.ts.map +1 -0
  73. package/dist/sync/sync-worker-port.js +67 -0
  74. package/dist/sync/sync-worker-port.js.map +1 -0
  75. package/dist/watcher.d.ts +6 -0
  76. package/dist/watcher.d.ts.map +1 -1
  77. package/dist/watcher.js +94 -9
  78. package/dist/watcher.js.map +1 -1
  79. package/dist/watcher.test.js +90 -0
  80. package/dist/watcher.test.js.map +1 -1
  81. 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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"}
@@ -0,0 +1,53 @@
1
+ import { type WorkerProgressMessage } from "./sync-worker-port.js";
2
+ import type { SyncWorkerAdapter, WorkOutcome, WorkSlice } from "./sync-work.js";
3
+ export type SyncWorkerClass = "realtime" | "chore";
4
+ export type ChildProcessSyncWorkerOptions = {
5
+ readonly workerClass: SyncWorkerClass;
6
+ /** Defaults to the packaged worker binary adjacent to the compiled sync modules. */
7
+ readonly workerScript?: string;
8
+ readonly env?: NodeJS.ProcessEnv;
9
+ readonly maxRestarts?: number;
10
+ readonly restartBackoffMs?: number;
11
+ readonly readyTimeoutMs?: number;
12
+ readonly shutdownGraceMs?: number;
13
+ readonly onProgress?: (progress: WorkerProgressMessage) => void;
14
+ };
15
+ export type ChildWorkerIdentity = {
16
+ readonly pid: number;
17
+ readonly moduleStateId: string;
18
+ };
19
+ export declare class ChildProcessSyncWorkerError extends Error {
20
+ constructor(message: string);
21
+ }
22
+ /**
23
+ * A long-lived worker port. Its child is an execution resource only: the
24
+ * coordinator remains the owner of path leases and determines retry policy.
25
+ */
26
+ export declare class ChildProcessSyncWorkerAdapter implements SyncWorkerAdapter {
27
+ private readonly options;
28
+ private child?;
29
+ private identity?;
30
+ private starting?;
31
+ private rejectStart?;
32
+ private stopping;
33
+ private restartCount;
34
+ private restarting?;
35
+ private exhausted?;
36
+ private readonly pending;
37
+ private readonly maxRestarts;
38
+ private readonly restartBackoffMs;
39
+ private readonly readyTimeoutMs;
40
+ private readonly shutdownGraceMs;
41
+ constructor(options: ChildProcessSyncWorkerOptions);
42
+ start(): Promise<ChildWorkerIdentity>;
43
+ execute(slice: WorkSlice): Promise<WorkOutcome>;
44
+ inspect(): ChildWorkerIdentity | undefined;
45
+ shutdown(): Promise<void>;
46
+ private handleChildMessage;
47
+ private handleExit;
48
+ private scheduleRestart;
49
+ private rejectPending;
50
+ private cancelledBeforeDispatch;
51
+ private send;
52
+ }
53
+ //# sourceMappingURL=child-process-sync-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-process-sync-worker.d.ts","sourceRoot":"","sources":["../../src/sync/child-process-sync-worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,qBAAqB,EAE3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,oFAAoF;IACpF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3F,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAQD;;;GAGG;AACH,qBAAa,6BAA8B,YAAW,iBAAiB;IAezD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAdpC,OAAO,CAAC,KAAK,CAAC,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,CAA+B;IAChD,OAAO,CAAC,WAAW,CAAC,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAC,CAA+B;IAClD,OAAO,CAAC,SAAS,CAAC,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAEZ,OAAO,EAAE,6BAA6B;IAO7D,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAuErC,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBrD,OAAO,IAAI,mBAAmB,GAAG,SAAS;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,uBAAuB;YAWjB,IAAI;CAQnB"}