@flyingrobots/graft 0.9.0 → 0.10.1

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 (108) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +23 -15
  3. package/dist/adapters/colorful-cli-prose-projector.d.ts +13 -0
  4. package/dist/adapters/colorful-cli-prose-projector.d.ts.map +1 -0
  5. package/dist/adapters/colorful-cli-prose-projector.js +89 -0
  6. package/dist/adapters/colorful-cli-prose-projector.js.map +1 -0
  7. package/dist/adapters/fake-echo-kernel-transport.d.ts.map +1 -1
  8. package/dist/adapters/fake-echo-kernel-transport.js +7 -29
  9. package/dist/adapters/fake-echo-kernel-transport.js.map +1 -1
  10. package/dist/adapters/node-process-runner.d.ts.map +1 -1
  11. package/dist/adapters/node-process-runner.js +1 -0
  12. package/dist/adapters/node-process-runner.js.map +1 -1
  13. package/dist/api/index.d.ts +7 -2
  14. package/dist/api/index.d.ts.map +1 -1
  15. package/dist/api/index.js +14 -3
  16. package/dist/api/index.js.map +1 -1
  17. package/dist/cli/main.d.ts.map +1 -1
  18. package/dist/cli/main.js +10 -1
  19. package/dist/cli/main.js.map +1 -1
  20. package/dist/contracts/output-schema-fragments.d.ts +21 -0
  21. package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
  22. package/dist/contracts/output-schema-fragments.js +11 -0
  23. package/dist/contracts/output-schema-fragments.js.map +1 -1
  24. package/dist/contracts/output-schema-mcp.d.ts +7 -0
  25. package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
  26. package/dist/contracts/output-schemas.d.ts.map +1 -1
  27. package/dist/contracts/output-schemas.js +11 -0
  28. package/dist/contracts/output-schemas.js.map +1 -1
  29. package/dist/echo/codec-runtime.d.ts +2 -7
  30. package/dist/echo/codec-runtime.d.ts.map +1 -1
  31. package/dist/echo/codec-runtime.js +2 -7
  32. package/dist/echo/codec-runtime.js.map +1 -1
  33. package/dist/echo/structural-history-client.d.ts.map +1 -1
  34. package/dist/echo/structural-history-client.js +3 -3
  35. package/dist/echo/structural-history-client.js.map +1 -1
  36. package/dist/echo/structural-history-envelope-codec.d.ts +7 -0
  37. package/dist/echo/structural-history-envelope-codec.d.ts.map +1 -1
  38. package/dist/echo/structural-history-envelope-codec.js +7 -0
  39. package/dist/echo/structural-history-envelope-codec.js.map +1 -1
  40. package/dist/echo/structural-reading-generated-model.d.ts +18 -0
  41. package/dist/echo/structural-reading-generated-model.d.ts.map +1 -0
  42. package/dist/echo/structural-reading-generated-model.js +324 -0
  43. package/dist/echo/structural-reading-generated-model.js.map +1 -0
  44. package/dist/generated/graft-structural-history.codec.generated.d.ts +193 -39
  45. package/dist/generated/graft-structural-history.codec.generated.d.ts.map +1 -1
  46. package/dist/generated/graft-structural-history.codec.generated.js +416 -113
  47. package/dist/generated/graft-structural-history.codec.generated.js.map +1 -1
  48. package/dist/generated/graft-structural-history.d.ts +1 -1
  49. package/dist/generated/graft-structural-history.d.ts.map +1 -1
  50. package/dist/mcp/control-plane/types.d.ts +8 -0
  51. package/dist/mcp/control-plane/types.d.ts.map +1 -1
  52. package/dist/mcp/daemon-control-plane.d.ts +2 -1
  53. package/dist/mcp/daemon-control-plane.d.ts.map +1 -1
  54. package/dist/mcp/daemon-control-plane.js +49 -0
  55. package/dist/mcp/daemon-control-plane.js.map +1 -1
  56. package/dist/mcp/repo-workspace.d.ts +1 -1
  57. package/dist/mcp/repo-workspace.d.ts.map +1 -1
  58. package/dist/mcp/repo-workspace.js +5 -0
  59. package/dist/mcp/repo-workspace.js.map +1 -1
  60. package/dist/mcp/tools/changed-since.d.ts.map +1 -1
  61. package/dist/mcp/tools/changed-since.js +24 -10
  62. package/dist/mcp/tools/changed-since.js.map +1 -1
  63. package/dist/mcp/tools/file-outline.d.ts.map +1 -1
  64. package/dist/mcp/tools/file-outline.js +10 -5
  65. package/dist/mcp/tools/file-outline.js.map +1 -1
  66. package/dist/mcp/workspace-registry.d.ts +83 -0
  67. package/dist/mcp/workspace-registry.d.ts.map +1 -0
  68. package/dist/mcp/workspace-registry.js +542 -0
  69. package/dist/mcp/workspace-registry.js.map +1 -0
  70. package/dist/operations/colorful-prose-projection.d.ts +32 -0
  71. package/dist/operations/colorful-prose-projection.d.ts.map +1 -0
  72. package/dist/operations/colorful-prose-projection.js +351 -0
  73. package/dist/operations/colorful-prose-projection.js.map +1 -0
  74. package/dist/operations/file-outline.d.ts +10 -0
  75. package/dist/operations/file-outline.d.ts.map +1 -1
  76. package/dist/operations/file-outline.js +29 -3
  77. package/dist/operations/file-outline.js.map +1 -1
  78. package/dist/operations/repo-workspace.d.ts +4 -0
  79. package/dist/operations/repo-workspace.d.ts.map +1 -1
  80. package/dist/operations/repo-workspace.js +57 -21
  81. package/dist/operations/repo-workspace.js.map +1 -1
  82. package/dist/operations/safe-read.d.ts +2 -0
  83. package/dist/operations/safe-read.d.ts.map +1 -1
  84. package/dist/operations/safe-read.js +20 -0
  85. package/dist/operations/safe-read.js.map +1 -1
  86. package/dist/operations/structured-buffer-model.d.ts +19 -15
  87. package/dist/operations/structured-buffer-model.d.ts.map +1 -1
  88. package/dist/operations/structured-buffer-model.js +6 -4
  89. package/dist/operations/structured-buffer-model.js.map +1 -1
  90. package/dist/operations/structured-buffer-query.d.ts.map +1 -1
  91. package/dist/operations/structured-buffer-query.js +64 -1
  92. package/dist/operations/structured-buffer-query.js.map +1 -1
  93. package/dist/operations/structured-buffer.d.ts +3 -1
  94. package/dist/operations/structured-buffer.d.ts.map +1 -1
  95. package/dist/operations/structured-buffer.js.map +1 -1
  96. package/dist/parser/types.d.ts +1 -1
  97. package/dist/parser/types.d.ts.map +1 -1
  98. package/dist/parser/types.js.map +1 -1
  99. package/dist/ports/process-runner.d.ts +1 -0
  100. package/dist/ports/process-runner.d.ts.map +1 -1
  101. package/dist/ports/structural-history.d.ts +23 -0
  102. package/dist/ports/structural-history.d.ts.map +1 -0
  103. package/dist/ports/structural-history.js +22 -0
  104. package/dist/ports/structural-history.js.map +1 -0
  105. package/dist/warp/structural-reading-adapter.d.ts.map +1 -1
  106. package/dist/warp/structural-reading-adapter.js +5 -1
  107. package/dist/warp/structural-reading-adapter.js.map +1 -1
  108. package/package.json +5 -4
@@ -0,0 +1,83 @@
1
+ export type WorkspaceRegistryKind = "git" | "directory";
2
+ export type IncarnationStatus = "confirmed" | "suspect" | "replaced" | "unknown";
3
+ export interface WorkspaceIdentityInput {
4
+ readonly installationId: string;
5
+ readonly platformNamespace: string;
6
+ readonly volumeNamespace: string;
7
+ readonly workspaceKind: WorkspaceRegistryKind;
8
+ readonly canonicalIdentityComponents: readonly string[];
9
+ }
10
+ export interface WorkspaceRegistryPaths {
11
+ readonly graftDir: string;
12
+ readonly workspaceDir: string;
13
+ readonly metadataPath: string;
14
+ readonly incarnationsDir: string;
15
+ readonly incarnationDir: string;
16
+ readonly incarnationMetadataPath: string;
17
+ readonly incarnationCacheDir: string;
18
+ }
19
+ export interface WorkspaceRegistryRetention {
20
+ readonly cachePolicy: "derived-content";
21
+ readonly workspaceBudgetBytes: number;
22
+ readonly ttlDays: number;
23
+ }
24
+ export interface WorkspaceRegistryStorage {
25
+ readonly registry: "graft-managed";
26
+ readonly cache: "graft-managed";
27
+ }
28
+ export interface WorkspaceMetadataRecord {
29
+ readonly schemaVersion: 1;
30
+ readonly workspaceId: string;
31
+ readonly displayName: string;
32
+ readonly canonicalRoot: string;
33
+ readonly gitCommonDir: string;
34
+ readonly sanitizedRemotes: readonly string[];
35
+ readonly incarnationId: string;
36
+ readonly historyBindingIds: readonly string[];
37
+ readonly storage: WorkspaceRegistryStorage;
38
+ readonly createdAt: string;
39
+ readonly lastObservedAt: string;
40
+ readonly retention: WorkspaceRegistryRetention;
41
+ }
42
+ export interface IncarnationMetadataRecord {
43
+ readonly schemaVersion: 1;
44
+ readonly workspaceId: string;
45
+ readonly incarnationId: string;
46
+ readonly incarnationStatus: IncarnationStatus;
47
+ readonly createdAt: string;
48
+ readonly lastObservedAt: string;
49
+ readonly evidence: {
50
+ readonly kind: "git";
51
+ readonly canonicalRoot: string;
52
+ readonly gitCommonDir: string;
53
+ readonly repositoryFingerprint?: string | undefined;
54
+ };
55
+ }
56
+ export interface ObserveGitWorkspaceInput {
57
+ readonly graftDir: string;
58
+ readonly canonicalRoot: string;
59
+ readonly gitCommonDir: string;
60
+ readonly remotes?: readonly string[] | undefined;
61
+ readonly installationId?: string | undefined;
62
+ readonly platformNamespace?: string | undefined;
63
+ readonly volumeNamespace?: string | undefined;
64
+ readonly now?: (() => string) | undefined;
65
+ readonly randomBytes?: ((size: number) => Buffer) | undefined;
66
+ readonly repositoryFingerprint?: string | undefined;
67
+ }
68
+ export interface ObservedWorkspaceRecord {
69
+ readonly workspaceId: string;
70
+ readonly incarnationId: string;
71
+ readonly metadata: WorkspaceMetadataRecord;
72
+ readonly paths: WorkspaceRegistryPaths;
73
+ }
74
+ export declare function deriveWorkspaceId(input: WorkspaceIdentityInput): string;
75
+ export declare function registryPaths(graftDir: string, workspaceId: string, incarnationId: string): WorkspaceRegistryPaths;
76
+ export declare function sanitizeRemoteUrl(remote: string): string;
77
+ export declare function loadOrCreateInstallationId(input: {
78
+ readonly graftDir: string;
79
+ readonly now?: (() => string) | undefined;
80
+ readonly randomBytes?: ((size: number) => Buffer) | undefined;
81
+ }): Promise<string>;
82
+ export declare function observeGitWorkspace(input: ObserveGitWorkspaceInput): Promise<ObservedWorkspaceRecord>;
83
+ //# sourceMappingURL=workspace-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-registry.d.ts","sourceRoot":"","sources":["../../src/mcp/workspace-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,542 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as fsp from "node:fs/promises";
3
+ import * as path from "node:path";
4
+ import { encodeCanonicalCbor } from "../echo/canonical-cbor.js";
5
+ const WORKSPACE_ID_SCHEMA_VERSION = 1;
6
+ const INSTALLATION_FILE = "installation.json";
7
+ const WORKSPACES_DIR = "workspaces";
8
+ const METADATA_FILE = "metadata.json";
9
+ const BASE32_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
10
+ const ID_DIGEST_BYTES = 16;
11
+ const PRIVATE_DIR_MODE = 0o700;
12
+ const PRIVATE_FILE_MODE = 0o600;
13
+ const INSTALLATION_LOCK_DIR = "installation.lock";
14
+ const WORKSPACE_OBSERVATION_LOCK_DIR = "observation.lock";
15
+ const INSTALLATION_LOCK_STALE_MS = 5 * 60 * 1000;
16
+ function sha256(bytes) {
17
+ return crypto.createHash("sha256").update(bytes).digest();
18
+ }
19
+ function base32Lower(bytes) {
20
+ let bits = 0;
21
+ let value = 0;
22
+ let output = "";
23
+ for (const byte of bytes) {
24
+ value = (value << 8) | byte;
25
+ bits += 8;
26
+ while (bits >= 5) {
27
+ output += BASE32_ALPHABET[(value >>> (bits - 5)) & 31] ?? "";
28
+ bits -= 5;
29
+ }
30
+ }
31
+ if (bits > 0) {
32
+ output += BASE32_ALPHABET[(value << (5 - bits)) & 31] ?? "";
33
+ }
34
+ return output;
35
+ }
36
+ function typedDigestId(prefix, value) {
37
+ return `${prefix}${base32Lower(sha256(encodeCanonicalCbor(value)).subarray(0, ID_DIGEST_BYTES))}`;
38
+ }
39
+ function randomTypedId(prefix, randomBytes) {
40
+ return `${prefix}${base32Lower(randomBytes(ID_DIGEST_BYTES))}`;
41
+ }
42
+ function defaultPlatformNamespace() {
43
+ return `${process.platform}:${process.arch}`;
44
+ }
45
+ function defaultVolumeNamespace(root) {
46
+ return path.parse(root).root;
47
+ }
48
+ function defaultRetention() {
49
+ return {
50
+ cachePolicy: "derived-content",
51
+ workspaceBudgetBytes: 100 * 1024 * 1024,
52
+ ttlDays: 30,
53
+ };
54
+ }
55
+ function nowIso(now) {
56
+ return now?.() ?? new Date().toISOString();
57
+ }
58
+ function hasErrorCode(error, code) {
59
+ return error instanceof Error && "code" in error && error.code === code;
60
+ }
61
+ function isRecord(value) {
62
+ return typeof value === "object" && value !== null && !Array.isArray(value);
63
+ }
64
+ function isStringArray(value) {
65
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
66
+ }
67
+ function isTypedId(value, prefix) {
68
+ return typeof value === "string" && new RegExp(`^${prefix}[a-z2-7]{26}$`, "u").test(value);
69
+ }
70
+ function isInstallationId(value) {
71
+ return typeof value === "string" && /^[a-f0-9]{32}$/u.test(value);
72
+ }
73
+ function isRetention(value) {
74
+ return isRecord(value)
75
+ && value["cachePolicy"] === "derived-content"
76
+ && typeof value["workspaceBudgetBytes"] === "number"
77
+ && Number.isFinite(value["workspaceBudgetBytes"])
78
+ && typeof value["ttlDays"] === "number"
79
+ && Number.isFinite(value["ttlDays"]);
80
+ }
81
+ function isStorage(value) {
82
+ return isRecord(value)
83
+ && value["registry"] === "graft-managed"
84
+ && value["cache"] === "graft-managed";
85
+ }
86
+ function isInstallationRecord(value) {
87
+ return isRecord(value)
88
+ && value["schemaVersion"] === 1
89
+ && isInstallationId(value["installationId"])
90
+ && typeof value["createdAt"] === "string";
91
+ }
92
+ function isWorkspaceMetadataRecord(value) {
93
+ return isRecord(value)
94
+ && value["schemaVersion"] === 1
95
+ && typeof value["workspaceId"] === "string"
96
+ && isTypedId(value["workspaceId"], "ws_")
97
+ && typeof value["displayName"] === "string"
98
+ && typeof value["canonicalRoot"] === "string"
99
+ && typeof value["gitCommonDir"] === "string"
100
+ && isStringArray(value["sanitizedRemotes"])
101
+ && isTypedId(value["incarnationId"], "wi_")
102
+ && isStringArray(value["historyBindingIds"])
103
+ && isStorage(value["storage"])
104
+ && typeof value["createdAt"] === "string"
105
+ && typeof value["lastObservedAt"] === "string"
106
+ && isRetention(value["retention"]);
107
+ }
108
+ function isIncarnationStatus(value) {
109
+ return value === "confirmed" || value === "suspect" || value === "replaced" || value === "unknown";
110
+ }
111
+ function isIncarnationMetadataRecord(value) {
112
+ if (!isRecord(value) || !isRecord(value["evidence"])) {
113
+ return false;
114
+ }
115
+ const evidence = value["evidence"];
116
+ return value["schemaVersion"] === 1
117
+ && isTypedId(value["workspaceId"], "ws_")
118
+ && isTypedId(value["incarnationId"], "wi_")
119
+ && isIncarnationStatus(value["incarnationStatus"])
120
+ && typeof value["createdAt"] === "string"
121
+ && typeof value["lastObservedAt"] === "string"
122
+ && evidence["kind"] === "git"
123
+ && typeof evidence["canonicalRoot"] === "string"
124
+ && typeof evidence["gitCommonDir"] === "string"
125
+ && (evidence["repositoryFingerprint"] === undefined || typeof evidence["repositoryFingerprint"] === "string");
126
+ }
127
+ function assertInsideGraftDir(graftDir, targetPath) {
128
+ const root = path.resolve(graftDir);
129
+ const target = path.resolve(targetPath);
130
+ const relative = path.relative(root, target);
131
+ if (relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative))) {
132
+ return;
133
+ }
134
+ throw new Error(`Refusing to use storage path outside Graft home: ${targetPath}`);
135
+ }
136
+ async function assertPrivateDirectory(dir) {
137
+ const initial = await fsp.lstat(dir);
138
+ if (initial.isSymbolicLink()) {
139
+ throw new Error(`Refusing to use symlinked Graft storage directory: ${dir}`);
140
+ }
141
+ if (!initial.isDirectory()) {
142
+ throw new Error(`Refusing to use non-directory Graft storage path: ${dir}`);
143
+ }
144
+ await fsp.chmod(dir, PRIVATE_DIR_MODE);
145
+ const current = await fsp.lstat(dir);
146
+ if (current.isSymbolicLink() || !current.isDirectory()) {
147
+ throw new Error(`Refusing to use unsafe Graft storage directory: ${dir}`);
148
+ }
149
+ if (process.platform !== "win32" && (current.mode & 0o077) !== 0) {
150
+ throw new Error(`Refusing to use non-private Graft storage directory: ${dir}`);
151
+ }
152
+ }
153
+ async function ensurePrivateDirectory(dir) {
154
+ await fsp.mkdir(dir, { recursive: true, mode: PRIVATE_DIR_MODE });
155
+ await assertPrivateDirectory(dir);
156
+ }
157
+ async function ensureManagedDirectory(graftDir, targetDir) {
158
+ const root = path.resolve(graftDir);
159
+ const target = path.resolve(targetDir);
160
+ assertInsideGraftDir(root, target);
161
+ await ensurePrivateDirectory(root);
162
+ const relative = path.relative(root, target);
163
+ if (relative === "") {
164
+ return;
165
+ }
166
+ let current = root;
167
+ for (const part of relative.split(path.sep)) {
168
+ if (part.length === 0 || part === "." || part === "..") {
169
+ throw new Error(`Refusing to create unsafe Graft storage path: ${targetDir}`);
170
+ }
171
+ current = path.join(current, part);
172
+ try {
173
+ await fsp.mkdir(current, { mode: PRIVATE_DIR_MODE });
174
+ }
175
+ catch (error) {
176
+ if (!hasErrorCode(error, "EEXIST")) {
177
+ throw error;
178
+ }
179
+ }
180
+ await assertPrivateDirectory(current);
181
+ }
182
+ }
183
+ async function quarantineRegistryFile(graftDir, filePath, reason) {
184
+ assertInsideGraftDir(graftDir, filePath);
185
+ const quarantinePath = path.join(path.dirname(filePath), `${path.basename(filePath)}.quarantine.${String(Date.now())}.${crypto.randomUUID()}`);
186
+ try {
187
+ await fsp.rename(filePath, quarantinePath);
188
+ }
189
+ catch (error) {
190
+ if (!hasErrorCode(error, "ENOENT")) {
191
+ throw error;
192
+ }
193
+ }
194
+ throw new Error(`${reason}; quarantined ${filePath}`);
195
+ }
196
+ async function quarantineManagedDirectory(graftDir, directoryPath) {
197
+ assertInsideGraftDir(graftDir, directoryPath);
198
+ try {
199
+ const stat = await fsp.lstat(directoryPath);
200
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
201
+ await quarantineRegistryFile(graftDir, directoryPath, "Unsupported managed directory: unsafe file type");
202
+ }
203
+ }
204
+ catch (error) {
205
+ if (hasErrorCode(error, "ENOENT")) {
206
+ return null;
207
+ }
208
+ throw error;
209
+ }
210
+ const quarantinePath = path.join(path.dirname(directoryPath), `${path.basename(directoryPath)}.quarantine.${String(Date.now())}.${crypto.randomUUID()}`);
211
+ await fsp.rename(directoryPath, quarantinePath);
212
+ return quarantinePath;
213
+ }
214
+ async function readRegistryJson(graftDir, filePath, guard, label) {
215
+ try {
216
+ const stat = await fsp.lstat(filePath);
217
+ if (stat.isSymbolicLink() || !stat.isFile()) {
218
+ await quarantineRegistryFile(graftDir, filePath, `Unsupported ${label}: unsafe file type`);
219
+ }
220
+ const raw = await fsp.readFile(filePath, "utf8");
221
+ let parsed;
222
+ try {
223
+ parsed = JSON.parse(raw);
224
+ }
225
+ catch {
226
+ await quarantineRegistryFile(graftDir, filePath, `Unsupported ${label}: invalid JSON`);
227
+ }
228
+ if (!guard(parsed)) {
229
+ await quarantineRegistryFile(graftDir, filePath, `Unsupported ${label}: schema mismatch`);
230
+ }
231
+ return parsed;
232
+ }
233
+ catch (error) {
234
+ if (hasErrorCode(error, "ENOENT")) {
235
+ return null;
236
+ }
237
+ throw error;
238
+ }
239
+ }
240
+ async function writeJsonAtomic(graftDir, filePath, value) {
241
+ await ensureManagedDirectory(graftDir, path.dirname(filePath));
242
+ const tmp = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${String(process.pid)}.${crypto.randomUUID()}.tmp`);
243
+ await fsp.writeFile(tmp, `${JSON.stringify(value, null, 2)}\n`, {
244
+ encoding: "utf8",
245
+ mode: PRIVATE_FILE_MODE,
246
+ });
247
+ await fsp.chmod(tmp, PRIVATE_FILE_MODE);
248
+ await fsp.rename(tmp, filePath);
249
+ }
250
+ async function delay(ms) {
251
+ await new Promise((resolve) => setTimeout(resolve, ms));
252
+ }
253
+ async function withInstallationLock(graftDir, work) {
254
+ const lockDir = path.join(path.resolve(graftDir), INSTALLATION_LOCK_DIR);
255
+ return withManagedLock(graftDir, lockDir, "Graft installation lock", work);
256
+ }
257
+ async function withWorkspaceObservationLock(graftDir, workspaceDir, work) {
258
+ return withManagedLock(graftDir, path.join(workspaceDir, WORKSPACE_OBSERVATION_LOCK_DIR), "Graft workspace observation lock", work);
259
+ }
260
+ async function withManagedLock(graftDir, lockDir, label, work) {
261
+ await ensureManagedDirectory(graftDir, path.dirname(lockDir));
262
+ for (let attempt = 0; attempt < 100; attempt += 1) {
263
+ try {
264
+ await fsp.mkdir(lockDir, { mode: PRIVATE_DIR_MODE });
265
+ }
266
+ catch (error) {
267
+ if (hasErrorCode(error, "EEXIST")) {
268
+ if (await removeStaleInstallationLock(lockDir)) {
269
+ continue;
270
+ }
271
+ await delay(10);
272
+ continue;
273
+ }
274
+ throw error;
275
+ }
276
+ await assertPrivateDirectory(lockDir);
277
+ try {
278
+ return await work();
279
+ }
280
+ finally {
281
+ await fsp.rm(lockDir, { recursive: true, force: true });
282
+ }
283
+ }
284
+ throw new Error(`Timed out waiting for ${label}: ${lockDir}`);
285
+ }
286
+ async function removeStaleInstallationLock(lockDir) {
287
+ let stat;
288
+ try {
289
+ stat = await fsp.lstat(lockDir);
290
+ }
291
+ catch (error) {
292
+ if (hasErrorCode(error, "ENOENT")) {
293
+ return true;
294
+ }
295
+ throw error;
296
+ }
297
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
298
+ throw new Error(`Refusing to use unsafe Graft installation lock: ${lockDir}`);
299
+ }
300
+ if (Date.now() - stat.mtimeMs < INSTALLATION_LOCK_STALE_MS) {
301
+ return false;
302
+ }
303
+ await fsp.rm(lockDir, { recursive: true, force: true });
304
+ return true;
305
+ }
306
+ function fingerprintMatches(existing, currentFingerprint) {
307
+ const existingFingerprint = existing?.evidence.repositoryFingerprint;
308
+ return existingFingerprint !== undefined
309
+ && currentFingerprint !== null
310
+ && existingFingerprint === currentFingerprint;
311
+ }
312
+ function hasStrongReplacementEvidence(existing, currentFingerprint) {
313
+ const existingFingerprint = existing?.evidence.repositoryFingerprint;
314
+ return existingFingerprint !== undefined
315
+ && currentFingerprint !== null
316
+ && existingFingerprint !== currentFingerprint;
317
+ }
318
+ function isNodeError(error) {
319
+ return error instanceof Error && "code" in error;
320
+ }
321
+ async function directoryContainsDurableEntry(directory) {
322
+ try {
323
+ const entries = await fsp.readdir(directory, { withFileTypes: true });
324
+ for (const entry of entries) {
325
+ const entryPath = path.join(directory, entry.name);
326
+ if (!entry.isDirectory()) {
327
+ return true;
328
+ }
329
+ if (await directoryContainsDurableEntry(entryPath)) {
330
+ return true;
331
+ }
332
+ }
333
+ return false;
334
+ }
335
+ catch (error) {
336
+ if (isNodeError(error) && error.code === "ENOENT") {
337
+ return false;
338
+ }
339
+ return true;
340
+ }
341
+ }
342
+ function canReuseIncarnation(existingWorkspace, existingIncarnation, currentFingerprint, hasDurableAttachments) {
343
+ if (existingWorkspace === null || existingIncarnation === null) {
344
+ return false;
345
+ }
346
+ const identityMatches = existingWorkspace.incarnationId === existingIncarnation.incarnationId
347
+ && existingWorkspace.workspaceId === existingIncarnation.workspaceId
348
+ && existingWorkspace.canonicalRoot === existingIncarnation.evidence.canonicalRoot
349
+ && existingWorkspace.gitCommonDir === existingIncarnation.evidence.gitCommonDir;
350
+ if (!identityMatches) {
351
+ return false;
352
+ }
353
+ if (fingerprintMatches(existingIncarnation, currentFingerprint)) {
354
+ return true;
355
+ }
356
+ return existingIncarnation.evidence.repositoryFingerprint === undefined
357
+ && currentFingerprint === null
358
+ && !hasDurableAttachments;
359
+ }
360
+ function observedIncarnationStatus(hadExistingWorkspace, existingIncarnation, currentFingerprint, reuseExistingIncarnation) {
361
+ if (reuseExistingIncarnation) {
362
+ return existingIncarnation?.incarnationStatus ?? "confirmed";
363
+ }
364
+ if (hasStrongReplacementEvidence(existingIncarnation, currentFingerprint)) {
365
+ return "replaced";
366
+ }
367
+ if (hadExistingWorkspace) {
368
+ return "suspect";
369
+ }
370
+ return currentFingerprint === null ? "unknown" : "confirmed";
371
+ }
372
+ export function deriveWorkspaceId(input) {
373
+ return typedDigestId("ws_", [
374
+ "graft-workspace",
375
+ WORKSPACE_ID_SCHEMA_VERSION,
376
+ input.installationId,
377
+ input.platformNamespace,
378
+ input.volumeNamespace,
379
+ input.workspaceKind,
380
+ [...input.canonicalIdentityComponents],
381
+ ]);
382
+ }
383
+ export function registryPaths(graftDir, workspaceId, incarnationId) {
384
+ const resolvedGraftDir = path.resolve(graftDir);
385
+ const workspaceDir = path.join(resolvedGraftDir, WORKSPACES_DIR, workspaceId);
386
+ const incarnationsDir = path.join(workspaceDir, "incarnations");
387
+ const incarnationDir = path.join(incarnationsDir, incarnationId);
388
+ return {
389
+ graftDir: resolvedGraftDir,
390
+ workspaceDir,
391
+ metadataPath: path.join(workspaceDir, METADATA_FILE),
392
+ incarnationsDir,
393
+ incarnationDir,
394
+ incarnationMetadataPath: path.join(incarnationDir, METADATA_FILE),
395
+ incarnationCacheDir: path.join(incarnationDir, "cache"),
396
+ };
397
+ }
398
+ export function sanitizeRemoteUrl(remote) {
399
+ const trimmed = remote.trim();
400
+ if (trimmed.length === 0) {
401
+ return trimmed;
402
+ }
403
+ try {
404
+ const parsed = new URL(trimmed);
405
+ parsed.username = "";
406
+ parsed.password = "";
407
+ parsed.search = "";
408
+ parsed.hash = "";
409
+ return parsed.toString();
410
+ }
411
+ catch {
412
+ const withoutQuery = trimmed.replace(/[?#].*$/u, "");
413
+ return withoutQuery
414
+ .replace(/^([a-z][a-z0-9+.-]*:\/\/)[^/@\s]+@(.+)$/iu, "$1$2")
415
+ .replace(/^[^/@\s]+@([^:\s]+:)/u, "$1");
416
+ }
417
+ }
418
+ export async function loadOrCreateInstallationId(input) {
419
+ const graftDir = path.resolve(input.graftDir);
420
+ await ensurePrivateDirectory(graftDir);
421
+ const installationPath = path.join(graftDir, INSTALLATION_FILE);
422
+ const existing = await readRegistryJson(graftDir, installationPath, isInstallationRecord, "installation record");
423
+ if (existing !== null) {
424
+ return existing.installationId;
425
+ }
426
+ return withInstallationLock(graftDir, async () => {
427
+ const lockedExisting = await readRegistryJson(graftDir, installationPath, isInstallationRecord, "installation record");
428
+ if (lockedExisting !== null) {
429
+ return lockedExisting.installationId;
430
+ }
431
+ const randomBytes = input.randomBytes ?? crypto.randomBytes;
432
+ const record = {
433
+ schemaVersion: 1,
434
+ installationId: randomBytes(ID_DIGEST_BYTES).toString("hex"),
435
+ createdAt: nowIso(input.now),
436
+ };
437
+ await writeJsonAtomic(graftDir, installationPath, record);
438
+ return record.installationId;
439
+ });
440
+ }
441
+ export async function observeGitWorkspace(input) {
442
+ const graftDir = path.resolve(input.graftDir);
443
+ const canonicalRoot = path.resolve(input.canonicalRoot);
444
+ const gitCommonDir = path.resolve(input.gitCommonDir);
445
+ const installationId = input.installationId ?? await loadOrCreateInstallationId({
446
+ graftDir,
447
+ now: input.now,
448
+ randomBytes: input.randomBytes,
449
+ });
450
+ const workspaceId = deriveWorkspaceId({
451
+ installationId,
452
+ platformNamespace: input.platformNamespace ?? defaultPlatformNamespace(),
453
+ volumeNamespace: input.volumeNamespace ?? defaultVolumeNamespace(canonicalRoot),
454
+ workspaceKind: "git",
455
+ canonicalIdentityComponents: [
456
+ canonicalRoot,
457
+ gitCommonDir,
458
+ ],
459
+ });
460
+ const placeholderIncarnationId = "wi_placeholder";
461
+ const workspaceOnlyPaths = registryPaths(graftDir, workspaceId, placeholderIncarnationId);
462
+ await ensureManagedDirectory(graftDir, workspaceOnlyPaths.workspaceDir);
463
+ return withWorkspaceObservationLock(graftDir, workspaceOnlyPaths.workspaceDir, async () => {
464
+ const existing = await readRegistryJson(graftDir, workspaceOnlyPaths.metadataPath, isWorkspaceMetadataRecord, "workspace metadata");
465
+ if (existing !== null && existing.workspaceId !== workspaceId) {
466
+ await quarantineRegistryFile(graftDir, workspaceOnlyPaths.metadataPath, "Unsupported workspace metadata: identity mismatch");
467
+ }
468
+ const timestamp = nowIso(input.now);
469
+ const existingIncarnationPaths = existing === null
470
+ ? null
471
+ : registryPaths(graftDir, workspaceId, existing.incarnationId);
472
+ if (existingIncarnationPaths !== null) {
473
+ await ensureManagedDirectory(graftDir, existingIncarnationPaths.incarnationDir);
474
+ }
475
+ const existingIncarnation = existingIncarnationPaths === null
476
+ ? null
477
+ : await readRegistryJson(graftDir, existingIncarnationPaths.incarnationMetadataPath, isIncarnationMetadataRecord, "incarnation metadata");
478
+ if (existing !== null
479
+ && existingIncarnation !== null
480
+ && (existingIncarnation.workspaceId !== workspaceId || existingIncarnation.incarnationId !== existing.incarnationId)) {
481
+ await quarantineRegistryFile(graftDir, existingIncarnationPaths?.incarnationMetadataPath ?? workspaceOnlyPaths.metadataPath, "Unsupported incarnation metadata: identity mismatch");
482
+ }
483
+ const repositoryFingerprint = input.repositoryFingerprint ?? null;
484
+ const existingHasDurableAttachments = existing !== null && (existing.historyBindingIds.length > 0 ||
485
+ (existingIncarnationPaths !== null &&
486
+ await directoryContainsDurableEntry(existingIncarnationPaths.incarnationCacheDir)));
487
+ const reuseExistingIncarnation = canReuseIncarnation(existing, existingIncarnation, repositoryFingerprint, existingHasDurableAttachments);
488
+ if (!reuseExistingIncarnation &&
489
+ existingIncarnationPaths !== null &&
490
+ hasStrongReplacementEvidence(existingIncarnation, repositoryFingerprint)) {
491
+ await quarantineManagedDirectory(graftDir, existingIncarnationPaths.incarnationDir);
492
+ }
493
+ const incarnationId = reuseExistingIncarnation && existing !== null
494
+ ? existing.incarnationId
495
+ : randomTypedId("wi_", input.randomBytes ?? crypto.randomBytes);
496
+ const paths = registryPaths(graftDir, workspaceId, incarnationId);
497
+ await ensureManagedDirectory(graftDir, paths.workspaceDir);
498
+ await ensureManagedDirectory(graftDir, paths.incarnationDir);
499
+ await ensureManagedDirectory(graftDir, path.join(paths.incarnationCacheDir, "outlines"));
500
+ await ensureManagedDirectory(graftDir, path.join(paths.incarnationCacheDir, "documents"));
501
+ await ensureManagedDirectory(graftDir, path.join(paths.incarnationCacheDir, "maps"));
502
+ const metadata = {
503
+ schemaVersion: 1,
504
+ workspaceId,
505
+ displayName: path.basename(canonicalRoot),
506
+ canonicalRoot,
507
+ gitCommonDir,
508
+ sanitizedRemotes: [...new Set((input.remotes ?? []).map(sanitizeRemoteUrl).filter((remote) => remote.length > 0))],
509
+ incarnationId,
510
+ historyBindingIds: reuseExistingIncarnation && existing !== null ? existing.historyBindingIds : [],
511
+ storage: {
512
+ registry: "graft-managed",
513
+ cache: "graft-managed",
514
+ },
515
+ createdAt: existing?.createdAt ?? timestamp,
516
+ lastObservedAt: timestamp,
517
+ retention: existing?.retention ?? defaultRetention(),
518
+ };
519
+ const existingIncarnationCreatedAt = reuseExistingIncarnation
520
+ ? existingIncarnation?.createdAt
521
+ : undefined;
522
+ const incarnationStatus = observedIncarnationStatus(existing !== null, existingIncarnation, repositoryFingerprint, reuseExistingIncarnation);
523
+ const incarnation = {
524
+ schemaVersion: 1,
525
+ workspaceId,
526
+ incarnationId,
527
+ incarnationStatus,
528
+ createdAt: existingIncarnationCreatedAt ?? timestamp,
529
+ lastObservedAt: timestamp,
530
+ evidence: {
531
+ kind: "git",
532
+ canonicalRoot,
533
+ gitCommonDir,
534
+ ...(repositoryFingerprint === null ? {} : { repositoryFingerprint }),
535
+ },
536
+ };
537
+ await writeJsonAtomic(graftDir, paths.metadataPath, metadata);
538
+ await writeJsonAtomic(graftDir, paths.incarnationMetadataPath, incarnation);
539
+ return { workspaceId, incarnationId, metadata, paths };
540
+ });
541
+ }
542
+ //# sourceMappingURL=workspace-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-registry.js","sourceRoot":"","sources":["../../src/mcp/workspace-registry.ts"],"names":[],"mappings":"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"}