@crowdedkingdoms/crowdy-dsh 0.2.0-dev.1 → 0.2.1-dev.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 (109) hide show
  1. package/THIRD_PARTY_NOTICES.md +226 -0
  2. package/dist/dsh-web/BUILD.json +9 -9
  3. package/dist/dsh-web/crowdy.html +1 -1
  4. package/dist/dsh-web/index.html +1 -1
  5. package/dist/dsh-web/preview/crowdy-boot-Cklh1qNl.js +5 -0
  6. package/dist/dsh-web/preview/vfs-image.tar.gz +0 -0
  7. package/lib/attachments/crowdy-attachment-store.js +200 -0
  8. package/lib/attachments/crowdy-attachment-store.js.map +1 -0
  9. package/lib/bridge/client.js +161 -0
  10. package/lib/bridge/client.js.map +1 -0
  11. package/lib/bridge/index.js +155 -0
  12. package/lib/bridge/index.js.map +1 -0
  13. package/lib/bridge/protocol.js +30 -0
  14. package/lib/bridge/protocol.js.map +1 -0
  15. package/lib/crowdy/client.js +247 -0
  16. package/lib/crowdy/client.js.map +1 -0
  17. package/lib/crowdy/config.js +95 -0
  18. package/lib/crowdy/config.js.map +1 -0
  19. package/lib/crowdy/github-layout.js +97 -0
  20. package/lib/crowdy/github-layout.js.map +1 -0
  21. package/lib/crowdy/paths.js +145 -0
  22. package/lib/crowdy/paths.js.map +1 -0
  23. package/lib/crowdy/project-store.js +223 -0
  24. package/lib/crowdy/project-store.js.map +1 -0
  25. package/lib/fs/crowdy-file-system.js +621 -0
  26. package/lib/fs/crowdy-file-system.js.map +1 -0
  27. package/lib/fs/scratch-store.js +61 -0
  28. package/lib/fs/scratch-store.js.map +1 -0
  29. package/lib/index.js +15 -0
  30. package/lib/index.js.map +1 -0
  31. package/lib/persist/index.js +199 -0
  32. package/lib/persist/index.js.map +1 -0
  33. package/lib/scripts/probe.js +59 -0
  34. package/lib/scripts/probe.js.map +1 -0
  35. package/lib/sdk-index/catalog.js +237 -0
  36. package/lib/sdk-index/catalog.js.map +1 -0
  37. package/lib/sdk-index/index.js +10 -0
  38. package/lib/sdk-index/index.js.map +1 -0
  39. package/lib/sdk-index/parse-sdk.js +131 -0
  40. package/lib/sdk-index/parse-sdk.js.map +1 -0
  41. package/lib/sdk-index/plugin.js +90 -0
  42. package/lib/sdk-index/plugin.js.map +1 -0
  43. package/lib/sdk-index/snapshot.js +215 -0
  44. package/lib/sdk-index/snapshot.js.map +1 -0
  45. package/lib/search/glob-match.js +114 -0
  46. package/lib/search/glob-match.js.map +1 -0
  47. package/lib/search/search-tools.js +414 -0
  48. package/lib/search/search-tools.js.map +1 -0
  49. package/lib/tools/index.js +344 -0
  50. package/lib/tools/index.js.map +1 -0
  51. package/lib/types/attachments/crowdy-attachment-store.d.ts +45 -0
  52. package/lib/types/attachments/crowdy-attachment-store.d.ts.map +1 -0
  53. package/lib/types/attachments/crowdy-attachment-store.test.d.ts.map +1 -0
  54. package/lib/types/bridge/client.d.ts +57 -0
  55. package/lib/types/bridge/client.d.ts.map +1 -0
  56. package/lib/types/bridge/client.test.d.ts.map +1 -0
  57. package/lib/types/bridge/index.d.ts +66 -0
  58. package/lib/types/bridge/index.d.ts.map +1 -0
  59. package/lib/types/bridge/protocol.d.ts +242 -0
  60. package/lib/types/bridge/protocol.d.ts.map +1 -0
  61. package/lib/types/crowdy/client.d.ts +126 -0
  62. package/lib/types/crowdy/client.d.ts.map +1 -0
  63. package/lib/types/crowdy/client.test.d.ts.map +1 -0
  64. package/lib/types/crowdy/config.d.ts +60 -0
  65. package/lib/types/crowdy/config.d.ts.map +1 -0
  66. package/lib/types/crowdy/github-layout.d.ts +36 -0
  67. package/lib/types/crowdy/github-layout.d.ts.map +1 -0
  68. package/lib/types/crowdy/paths.d.ts +89 -0
  69. package/lib/types/crowdy/paths.d.ts.map +1 -0
  70. package/lib/types/crowdy/project-store.d.ts +84 -0
  71. package/lib/types/crowdy/project-store.d.ts.map +1 -0
  72. package/lib/types/crowdy/project-store.test.d.ts.map +1 -0
  73. package/lib/types/fs/crowdy-file-system.d.ts +173 -0
  74. package/lib/types/fs/crowdy-file-system.d.ts.map +1 -0
  75. package/lib/types/fs/crowdy-file-system.test.d.ts.map +1 -0
  76. package/lib/types/fs/scratch-store.d.ts +31 -0
  77. package/lib/types/fs/scratch-store.d.ts.map +1 -0
  78. package/lib/types/index.d.ts +19 -0
  79. package/lib/types/index.d.ts.map +1 -0
  80. package/lib/types/persist/index.d.ts +85 -0
  81. package/lib/types/persist/index.d.ts.map +1 -0
  82. package/lib/types/scripts/probe.d.ts +9 -0
  83. package/lib/types/scripts/probe.d.ts.map +1 -0
  84. package/lib/types/sdk-index/catalog.d.ts +39 -0
  85. package/lib/types/sdk-index/catalog.d.ts.map +1 -0
  86. package/lib/types/sdk-index/catalog.test.d.ts.map +1 -0
  87. package/lib/types/sdk-index/index.d.ts +13 -0
  88. package/lib/types/sdk-index/index.d.ts.map +1 -0
  89. package/lib/types/sdk-index/parse-sdk.d.ts +25 -0
  90. package/lib/types/sdk-index/parse-sdk.d.ts.map +1 -0
  91. package/lib/types/sdk-index/plugin.d.ts +26 -0
  92. package/lib/types/sdk-index/plugin.d.ts.map +1 -0
  93. package/lib/types/sdk-index/snapshot.d.ts +11 -0
  94. package/lib/types/sdk-index/snapshot.d.ts.map +1 -0
  95. package/lib/types/search/glob-match.d.ts +31 -0
  96. package/lib/types/search/glob-match.d.ts.map +1 -0
  97. package/lib/types/search/glob-match.test.d.ts.map +1 -0
  98. package/lib/types/search/search-tools.d.ts +81 -0
  99. package/lib/types/search/search-tools.d.ts.map +1 -0
  100. package/lib/types/search/search-tools.test.d.ts.map +1 -0
  101. package/lib/types/tools/index.d.ts +27 -0
  102. package/lib/types/tools/index.d.ts.map +1 -0
  103. package/lib/types/vendor/crowdyjs-sdk.d.ts +17 -0
  104. package/lib/types/vendor/crowdyjs-sdk.d.ts.map +1 -0
  105. package/lib/vendor/crowdyjs-sdk.js +18746 -0
  106. package/lib/vendor/crowdyjs-sdk.js.map +1 -0
  107. package/lib/vendor/crowdyjs-sdk.version.json +5 -0
  108. package/package.json +151 -38
  109. package/dist/dsh-web/preview/crowdy-boot-D0e56jZN.js +0 -2
@@ -0,0 +1,621 @@
1
+ /**
2
+ * A DeepSeek Harness `ctx.fs` backend whose execution world is a Crowdy Studio
3
+ * project instead of a disk.
4
+ *
5
+ * The harness expects a filesystem; Crowdy Studio offers a small versioned bag
6
+ * of files behind a GraphQL API (or, for a GitHub-bound project, the bound
7
+ * repository). This class bridges the two:
8
+ *
9
+ * - identity — a target key is the virtual absolute path, which is stable
10
+ * because Crowdy paths never alias (no symlinks, no hardlinks).
11
+ * - freshness — `FsVersion` is a content hash, so a version changes exactly
12
+ * when the bytes change.
13
+ * - atomicity — every mutation is one store commit guarded by the revision it
14
+ * read, and a lost race surfaces as `FS_STALE_VERSION` rather
15
+ * than a silent overwrite.
16
+ *
17
+ * Beside the two project trees the mount carries in-memory scratch directories
18
+ * (`captures/`, `context/`) the Studio page fills over the bridge; see
19
+ * {@link ScratchStore}.
20
+ *
21
+ * @module @crowdedkingdoms/crowdy-dsh/fs
22
+ */
23
+ import z from '@deepseek-ai/schemastery';
24
+ import { FileSystem, FsError, FsTargetKey, FsVersion } from '@deepseek-ai/dsh-fs';
25
+ import { CrowdyApiError, CrowdyStudioClient } from '../crowdy/client.js';
26
+ import { loadCrowdyConfig, describeMissing } from '../crowdy/config.js';
27
+ import { DEFAULT_ROOT, classify, directChildren, isAcceptableProjectPath, normalizeAbsolute, resolveAgainst, scratchDirectories, targetDirectories, toVirtualPath, } from '../crowdy/paths.js';
28
+ import { selectProjectStore } from '../crowdy/project-store.js';
29
+ import { ScratchStore } from './scratch-store.js';
30
+ /** Directories have no meaningful content version; guards only apply to files. */
31
+ const DIRECTORY_VERSION = FsVersion('crowdy-directory');
32
+ /** Normalize line endings so `before`/`after` always share one diff basis. */
33
+ function toLf(text) {
34
+ return text.replace(/\r\n/g, '\n');
35
+ }
36
+ /**
37
+ * Content-addressed freshness token. FNV-1a over UTF-16 code units: no
38
+ * `node:crypto` (absent in the browser worker), synchronous, and collisions
39
+ * only ever cost one spurious re-read of a small Rust file.
40
+ */
41
+ export function versionOf(content) {
42
+ const text = toLf(content);
43
+ let h1 = 0x811c9dc5;
44
+ let h2 = 0x01000193;
45
+ for (let index = 0; index < text.length; index += 1) {
46
+ const code = text.charCodeAt(index);
47
+ h1 ^= code & 0xff;
48
+ h1 = Math.imul(h1, 0x01000193) >>> 0;
49
+ h1 ^= code >>> 8;
50
+ h1 = Math.imul(h1, 0x01000193) >>> 0;
51
+ h2 ^= code;
52
+ h2 = Math.imul(h2, 0x27d4eb2f) >>> 0;
53
+ }
54
+ return FsVersion(`fnv:${h1.toString(16).padStart(8, '0')}${h2.toString(16).padStart(8, '0')}:${text.length}`);
55
+ }
56
+ /**
57
+ * The model route resolves its bearer through `apiKeyEnv: CROWDY_APP_TOKEN`.
58
+ * The credentials provider reads the process environment on every request and
59
+ * the browser worker never sees a `.env` file (the launcher that reads those is
60
+ * absent there), so the token is published to `process.env` directly. In the
61
+ * cockpit the variable is already set by the operator and this is a no-op.
62
+ */
63
+ export const APP_TOKEN_ENV = 'CROWDY_APP_TOKEN';
64
+ /** How long the first project load waits for the page to hand over the token. */
65
+ const CREDENTIAL_WAIT_MS = 5_000;
66
+ function publishTokenToEnvironment(token) {
67
+ if (!token)
68
+ return;
69
+ if (typeof process === 'undefined' || !process.env)
70
+ return;
71
+ process.env[APP_TOKEN_ENV] = token;
72
+ }
73
+ function byteLength(text) {
74
+ return new TextEncoder().encode(text).byteLength;
75
+ }
76
+ function countOccurrences(haystack, needle) {
77
+ if (!needle)
78
+ return 0;
79
+ let count = 0;
80
+ let index = haystack.indexOf(needle);
81
+ while (index !== -1) {
82
+ count += 1;
83
+ index = haystack.indexOf(needle, index + needle.length);
84
+ }
85
+ return count;
86
+ }
87
+ export class CrowdyFileSystem extends FileSystem {
88
+ static Config = z.object({
89
+ graphqlUrl: z.string(),
90
+ appId: z.string(),
91
+ projectId: z.string(),
92
+ root: z.string(),
93
+ appToken: z.string(),
94
+ email: z.string(),
95
+ password: z.string(),
96
+ bridgeChannel: z.string(),
97
+ bridgeNonce: z.string(),
98
+ githubFirst: z.boolean(),
99
+ studioOrigin: z.string(),
100
+ snapshotTtlMs: z.number().default(750),
101
+ storeTtlMs: z.number().default(60_000),
102
+ });
103
+ /** Effective boot configuration (file + environment + row config). */
104
+ boot;
105
+ /** API client; replaceable in tests, mirroring the local backend's `internals` hook. */
106
+ client;
107
+ /** In-memory scratch files the page and tools share. */
108
+ scratch = new ScratchStore();
109
+ root;
110
+ snapshotTtl;
111
+ storeTtl;
112
+ /** Cached project snapshot; reads may reuse it briefly, mutations never do. */
113
+ snapshot;
114
+ inflight;
115
+ store;
116
+ storeInflight;
117
+ /** Per-path tail promise serializing each read-guard-write critical section. */
118
+ locks = new Map();
119
+ /** Listeners told when the project files changed through this backend. */
120
+ changeListeners = new Set();
121
+ warnings = [];
122
+ warningListeners = new Set();
123
+ /** Resolved (and replaced) each time a bearer arrives over the bridge. */
124
+ tokenWaiters = [];
125
+ constructor(ctx, config = {}) {
126
+ super(ctx);
127
+ const { snapshotTtlMs, storeTtlMs, ...overrides } = config;
128
+ this.snapshotTtl = snapshotTtlMs ?? 750;
129
+ this.storeTtl = storeTtlMs ?? 60_000;
130
+ this.boot = loadCrowdyConfig(overrides);
131
+ this.root = normalizeAbsolute(this.boot.root ?? DEFAULT_ROOT);
132
+ publishTokenToEnvironment(this.boot.appToken);
133
+ this.client = new CrowdyStudioClient({
134
+ endpoint: this.boot.graphqlUrl,
135
+ appId: this.boot.appId,
136
+ appToken: this.boot.appToken,
137
+ email: this.boot.email,
138
+ password: this.boot.password,
139
+ });
140
+ }
141
+ // ── bridge hooks ───────────────────────────────────────────────────────────
142
+ /** Virtual root the project is mounted at. */
143
+ get mountRoot() {
144
+ return this.root;
145
+ }
146
+ /** Human-readable description of where files currently come from. */
147
+ get storeReason() {
148
+ return this.store?.reason;
149
+ }
150
+ /** Point the backend at another project (the page switched projects). */
151
+ setProject(projectId) {
152
+ if (projectId === this.boot.projectId)
153
+ return;
154
+ this.boot = { ...this.boot, projectId };
155
+ this.snapshot = undefined;
156
+ this.store = undefined;
157
+ }
158
+ /** Replace the bearer after the page refreshed the app token. */
159
+ setToken(token) {
160
+ this.boot = { ...this.boot, appToken: token };
161
+ this.client.setToken(token);
162
+ publishTokenToEnvironment(token);
163
+ if (token) {
164
+ const waiters = this.tokenWaiters;
165
+ this.tokenWaiters = [];
166
+ for (const wake of waiters)
167
+ wake();
168
+ }
169
+ }
170
+ /** Whether a bearer (or cockpit credentials) is available right now. */
171
+ get hasCredentials() {
172
+ return Boolean(this.boot.appToken || (this.boot.email && this.boot.password));
173
+ }
174
+ /**
175
+ * In the browser the token follows the boot over the bridge rather than
176
+ * riding in `crowdy.json`, so the first project load may run a beat ahead of
177
+ * it. Wait briefly for it instead of failing the model's first tool call.
178
+ */
179
+ waitForCredentials(timeoutMs) {
180
+ if (this.hasCredentials)
181
+ return Promise.resolve(true);
182
+ // Without a page bridge nobody will ever deliver a token; fail now.
183
+ if (!this.boot.bridgeChannel)
184
+ return Promise.resolve(false);
185
+ return new Promise((resolve) => {
186
+ const timer = setTimeout(() => {
187
+ this.tokenWaiters = this.tokenWaiters.filter((wake) => wake !== wake_);
188
+ resolve(this.hasCredentials);
189
+ }, timeoutMs);
190
+ const wake_ = () => {
191
+ clearTimeout(timer);
192
+ resolve(true);
193
+ };
194
+ this.tokenWaiters.push(wake_);
195
+ });
196
+ }
197
+ /** Subscribe to warnings (store fallbacks, failed mirrors) as they happen. */
198
+ onWarning(listener) {
199
+ this.warningListeners.add(listener);
200
+ return () => {
201
+ this.warningListeners.delete(listener);
202
+ };
203
+ }
204
+ warn(message) {
205
+ if (this.warningListeners.size === 0) {
206
+ this.warnings.push(message);
207
+ return;
208
+ }
209
+ for (const listener of this.warningListeners)
210
+ listener(message);
211
+ }
212
+ /** Subscribe to writes made through this backend. */
213
+ onChange(listener) {
214
+ this.changeListeners.add(listener);
215
+ return () => {
216
+ this.changeListeners.delete(listener);
217
+ };
218
+ }
219
+ /** Drop any cached snapshot so the next read refetches (the page saved). */
220
+ invalidate() {
221
+ this.snapshot = undefined;
222
+ }
223
+ /** Warnings accumulated since the last drain (mirror failures, fallbacks). */
224
+ drainWarnings() {
225
+ return this.warnings.splice(0, this.warnings.length);
226
+ }
227
+ // ── identity ───────────────────────────────────────────────────────────────
228
+ async resolve(path, opts) {
229
+ this.assertLive(opts?.signal);
230
+ // Absent files must still resolve: a create needs a target before it exists.
231
+ const absolute = resolveAgainst(this.baseFor(opts?.cwd), path);
232
+ return { targetKey: FsTargetKey(`crowdy:${absolute}`), displayPath: absolute };
233
+ }
234
+ /**
235
+ * Pick the base for relative paths. A session's cwd comes from the host
236
+ * workspace and may point anywhere; resolving against a directory outside
237
+ * the mount would make every relative path a miss, so a foreign cwd falls
238
+ * back to the project root.
239
+ */
240
+ baseFor(cwd) {
241
+ if (!cwd)
242
+ return this.root;
243
+ const candidate = normalizeAbsolute(cwd);
244
+ return classify(candidate, this.root) ? candidate : this.root;
245
+ }
246
+ processPath(target) {
247
+ return this.absolute(target);
248
+ }
249
+ fileUrl(target) {
250
+ const encoded = this.absolute(target)
251
+ .split('/')
252
+ .map((segment) => encodeURIComponent(segment))
253
+ .join('/');
254
+ return `file://${encoded}`;
255
+ }
256
+ contains(parent, child) {
257
+ const base = this.absolute(parent);
258
+ const candidate = this.absolute(child);
259
+ return candidate === base || candidate.startsWith(base === '/' ? '/' : `${base}/`);
260
+ }
261
+ // ── metadata ───────────────────────────────────────────────────────────────
262
+ async stat(target, signal) {
263
+ this.assertLive(signal);
264
+ const absolute = this.absolute(target);
265
+ const spot = classify(absolute, this.root);
266
+ if (!spot)
267
+ return undefined;
268
+ if (spot.kind === 'root' || spot.kind === 'target' || spot.kind === 'scratch-dir') {
269
+ return { version: DIRECTORY_VERSION, type: 'directory' };
270
+ }
271
+ if (spot.kind === 'scratch-file') {
272
+ const file = this.scratch.get(spot.dir, spot.name);
273
+ return file ? { version: FsVersion(file.version), type: 'file', size: file.bytes.byteLength } : undefined;
274
+ }
275
+ const project = await this.project();
276
+ const file = this.find(project, spot.location.target, spot.location.path);
277
+ if (file) {
278
+ return { version: versionOf(file.content), type: 'file', size: byteLength(file.content) };
279
+ }
280
+ // Directories are implied by the paths of the files beneath them.
281
+ const prefix = `${spot.location.path}/`;
282
+ const isImpliedDirectory = project.files.some((entry) => entry.target === spot.location.target && entry.path.startsWith(prefix));
283
+ return isImpliedDirectory ? { version: DIRECTORY_VERSION, type: 'directory' } : undefined;
284
+ }
285
+ async lstat(path, opts, signal) {
286
+ // Crowdy projects have no symlinks, so lstat and stat agree by construction.
287
+ const target = await this.resolve(path, { cwd: opts?.cwd, signal });
288
+ const info = await this.stat(target, signal);
289
+ return info === undefined ? undefined : { ...info };
290
+ }
291
+ // ── reads ──────────────────────────────────────────────────────────────────
292
+ async readText(target, signal) {
293
+ this.assertLive(signal);
294
+ const absolute = this.absolute(target);
295
+ const spot = classify(absolute, this.root);
296
+ if (spot?.kind === 'scratch-file') {
297
+ const file = this.scratch.get(spot.dir, spot.name);
298
+ if (!file)
299
+ throw new FsError(`${absolute} does not exist.`, 'FS_NOT_FOUND');
300
+ if (file.text === undefined) {
301
+ throw new FsError(`${absolute} is binary; use read_image for screenshots.`, 'FS_NOT_TEXT');
302
+ }
303
+ return file.text;
304
+ }
305
+ const { file } = await this.requireFile(target);
306
+ return file.content;
307
+ }
308
+ async streamText(target, signal) {
309
+ // Crowdy caps a file at 64 KiB, so the whole text is always one chunk.
310
+ const content = await this.readText(target, signal);
311
+ return {
312
+ async *[Symbol.asyncIterator]() {
313
+ yield content;
314
+ },
315
+ };
316
+ }
317
+ async readBytes(target, signal, maxBytes) {
318
+ this.assertLive(signal);
319
+ const bytes = await this.bytesOf(target);
320
+ if (bytes.byteLength > maxBytes) {
321
+ throw new FsError(`${this.absolute(target)} is ${bytes.byteLength} bytes, above the ${maxBytes}-byte cap.`, 'FS_TOO_LARGE');
322
+ }
323
+ return bytes;
324
+ }
325
+ async readByteRange(target, range, signal) {
326
+ this.assertLive(signal);
327
+ const bytes = await this.bytesOf(target);
328
+ if (range.offset >= bytes.byteLength)
329
+ return new Uint8Array(0);
330
+ return bytes.slice(range.offset, range.offset + range.length);
331
+ }
332
+ async bytesOf(target) {
333
+ const absolute = this.absolute(target);
334
+ const spot = classify(absolute, this.root);
335
+ if (spot?.kind === 'scratch-file') {
336
+ const file = this.scratch.get(spot.dir, spot.name);
337
+ if (!file)
338
+ throw new FsError(`${absolute} does not exist.`, 'FS_NOT_FOUND');
339
+ return file.bytes;
340
+ }
341
+ const { file } = await this.requireFile(target);
342
+ return new TextEncoder().encode(file.content);
343
+ }
344
+ async listDir(target, signal) {
345
+ this.assertLive(signal);
346
+ const absolute = this.absolute(target);
347
+ const spot = classify(absolute, this.root);
348
+ if (!spot) {
349
+ throw new FsError(`${absolute} is outside the Crowdy project mount.`, 'FS_NOT_FOUND');
350
+ }
351
+ if (spot.kind === 'root') {
352
+ return Promise.all([...targetDirectories(this.root), ...scratchDirectories(this.root)].map(async (path) => ({
353
+ name: path.slice(path.lastIndexOf('/') + 1),
354
+ type: 'directory',
355
+ target: await this.resolve(path),
356
+ version: DIRECTORY_VERSION,
357
+ })));
358
+ }
359
+ if (spot.kind === 'scratch-dir') {
360
+ return Promise.all(this.scratch.list(spot.dir).map(async ({ name, file }) => ({
361
+ name,
362
+ type: 'file',
363
+ target: await this.resolve(`${absolute}/${name}`),
364
+ version: FsVersion(file.version),
365
+ size: file.bytes.byteLength,
366
+ })));
367
+ }
368
+ if (spot.kind === 'scratch-file') {
369
+ throw new FsError(`${absolute} is not a directory.`, 'FS_NOT_DIRECTORY');
370
+ }
371
+ const project = await this.project();
372
+ const scope = spot.kind === 'target' ? '' : spot.location.path;
373
+ const scopedTarget = spot.kind === 'target' ? spot.target : spot.location.target;
374
+ const paths = project.files
375
+ .filter((entry) => entry.target === scopedTarget)
376
+ .map((entry) => entry.path);
377
+ if (spot.kind === 'file' && !paths.some((path) => path.startsWith(`${scope}/`))) {
378
+ throw new FsError(`${absolute} is not a directory.`, 'FS_NOT_DIRECTORY');
379
+ }
380
+ return Promise.all(directChildren(paths, scope).map(async (child) => {
381
+ const childPath = scope ? `${scope}/${child.name}` : child.name;
382
+ const entry = child.isDirectory ? undefined : this.find(project, scopedTarget, childPath);
383
+ return {
384
+ name: child.name,
385
+ type: child.isDirectory ? 'directory' : 'file',
386
+ target: await this.resolve(toVirtualPath(scopedTarget, childPath, this.root)),
387
+ version: entry ? versionOf(entry.content) : DIRECTORY_VERSION,
388
+ ...(entry ? { size: byteLength(entry.content) } : {}),
389
+ };
390
+ }));
391
+ }
392
+ // ── mutations ──────────────────────────────────────────────────────────────
393
+ async writeText(target, content, expected, signal) {
394
+ const location = this.requireWritableLocation(target);
395
+ return this.withLock(target.targetKey, async () => {
396
+ this.assertLive(signal);
397
+ const project = await this.project({ fresh: true });
398
+ const existing = this.find(project, location.target, location.path);
399
+ if (expected?.kind === 'createIfAbsent' && existing) {
400
+ throw new FsError(`${target.displayPath} already exists; a guarded create cannot replace it.`, 'FS_NOT_OBSERVED');
401
+ }
402
+ if (expected?.kind === 'replaceIfVersion') {
403
+ if (!existing) {
404
+ throw new FsError(`${target.displayPath} no longer exists, so the guarded replace is stale.`, 'FS_STALE_VERSION');
405
+ }
406
+ if (versionOf(existing.content) !== expected.version) {
407
+ throw new FsError(`${target.displayPath} changed since it was read; re-read it before writing.`, 'FS_STALE_VERSION');
408
+ }
409
+ }
410
+ await this.commit(project, { upserts: [{ ...location, content }] }, target.displayPath);
411
+ return {
412
+ operation: existing ? 'update' : 'create',
413
+ version: versionOf(content),
414
+ before: existing ? toLf(existing.content) : null,
415
+ after: toLf(content),
416
+ };
417
+ });
418
+ }
419
+ async editText(target, edit, expected, signal) {
420
+ const location = this.requireWritableLocation(target);
421
+ return this.withLock(target.targetKey, async () => {
422
+ this.assertLive(signal);
423
+ const project = await this.project({ fresh: true });
424
+ const existing = this.find(project, location.target, location.path);
425
+ if (!existing) {
426
+ throw new FsError(`${target.displayPath} does not exist.`, 'FS_NOT_FOUND');
427
+ }
428
+ const before = toLf(existing.content);
429
+ if (expected && versionOf(existing.content) !== expected.version) {
430
+ throw new FsError(`${target.displayPath} changed since it was read; re-read it before editing.`, 'FS_STALE_VERSION');
431
+ }
432
+ const oldString = toLf(edit.oldString);
433
+ const matches = countOccurrences(before, oldString);
434
+ if (matches === 0) {
435
+ throw new FsError(`The literal text to replace was not found in ${target.displayPath}.`, 'FS_EDIT_NOT_FOUND');
436
+ }
437
+ if (matches > 1 && !edit.replaceAll) {
438
+ throw new FsError(`The literal text matches ${matches} times in ${target.displayPath}; pass replaceAll or use a longer, unique match.`, 'FS_AMBIGUOUS_EDIT');
439
+ }
440
+ const newString = toLf(edit.newString);
441
+ const after = edit.replaceAll
442
+ ? before.split(oldString).join(newString)
443
+ : before.replace(oldString, newString);
444
+ await this.commit(project, { upserts: [{ ...location, content: after }] }, target.displayPath);
445
+ return { version: versionOf(after), before, after };
446
+ });
447
+ }
448
+ // ── internals ──────────────────────────────────────────────────────────────
449
+ /**
450
+ * Apply a batch under the snapshot's revision, translating a lost optimistic
451
+ * race into the harness's stale-version vocabulary so the tool layer can tell
452
+ * the model to re-read rather than reporting an opaque server error.
453
+ */
454
+ async commit(project, batch, displayPath) {
455
+ const store = await this.currentStore();
456
+ try {
457
+ const updated = await store.commit(project, batch);
458
+ this.snapshot = { project: updated, at: Date.now() };
459
+ }
460
+ catch (error) {
461
+ this.snapshot = undefined;
462
+ if (error instanceof CrowdyApiError && error.isRevisionConflict) {
463
+ throw new FsError(`${displayPath} was modified concurrently (in Crowdy Studio or on GitHub); re-read it and retry.`, 'FS_STALE_VERSION', { cause: error });
464
+ }
465
+ if (error instanceof CrowdyApiError && error.isAuthFailure) {
466
+ throw new FsError(`Crowdy Studio rejected the write to ${displayPath}: the session is no longer valid. Reopen Crowdy Studio to sign in again.`, 'FS_PERMISSION_DENIED', { cause: error });
467
+ }
468
+ throw new FsError(`Crowdy Studio rejected the write to ${displayPath}: ${error.message}`, 'FS_IO_ERROR', { cause: error });
469
+ }
470
+ for (const change of [...(batch.upserts ?? []), ...(batch.deletes ?? [])]) {
471
+ for (const listener of this.changeListeners)
472
+ listener({ target: change.target, path: change.path });
473
+ }
474
+ }
475
+ /**
476
+ * One coherent view of every project file for the search tools: the virtual
477
+ * mount root plus each file's virtual absolute path and content. Reuses the
478
+ * same snapshot as reads, so glob/grep and read describe the same tree.
479
+ */
480
+ async searchSnapshot() {
481
+ const project = await this.project();
482
+ const files = project.files.map((entry) => ({
483
+ virtualPath: toVirtualPath(entry.target, entry.path, this.root),
484
+ content: entry.content,
485
+ }));
486
+ for (const dir of ['context']) {
487
+ for (const { name, file } of this.scratch.list(dir)) {
488
+ if (file.text !== undefined) {
489
+ files.push({ virtualPath: `${this.root}/${dir}/${name}`, content: file.text });
490
+ }
491
+ }
492
+ }
493
+ return { root: this.root, files };
494
+ }
495
+ /** The current project snapshot, for tools that want the whole tree. */
496
+ async currentProject() {
497
+ return this.project();
498
+ }
499
+ /** Fetch the project, collapsing bursts and deduping concurrent fetches. */
500
+ async project(opts = {}) {
501
+ if (!opts.fresh && this.snapshot && Date.now() - this.snapshot.at < this.snapshotTtl) {
502
+ return this.snapshot.project;
503
+ }
504
+ if (!this.inflight) {
505
+ const projectId = this.boot.projectId;
506
+ this.inflight = this.waitForCredentials(CREDENTIAL_WAIT_MS)
507
+ .then(() => {
508
+ const missing = describeMissing(this.boot);
509
+ if (missing)
510
+ throw new FsError(missing, 'FS_IO_ERROR');
511
+ return this.currentStore();
512
+ })
513
+ .then((store) => store.load())
514
+ .then((project) => {
515
+ this.snapshot = { project, at: Date.now() };
516
+ return project;
517
+ })
518
+ .catch((error) => {
519
+ if (error instanceof FsError)
520
+ throw error;
521
+ if (error instanceof CrowdyApiError && error.isAuthFailure) {
522
+ throw new FsError(`Could not load Crowdy Studio project ${projectId}: the session is no longer valid. Reopen Crowdy Studio to sign in again.`, 'FS_PERMISSION_DENIED', { cause: error });
523
+ }
524
+ throw new FsError(`Could not load Crowdy Studio project ${projectId}: ${error.message}`, 'FS_IO_ERROR', { cause: error });
525
+ })
526
+ .finally(() => {
527
+ this.inflight = undefined;
528
+ });
529
+ }
530
+ return this.inflight;
531
+ }
532
+ /** Decide (and periodically re-decide) whether GitHub or Studio holds the files. */
533
+ async currentStore() {
534
+ if (this.store && Date.now() - this.store.at < this.storeTtl)
535
+ return this.store.store;
536
+ if (!this.storeInflight) {
537
+ this.storeInflight = selectProjectStore(this.client, this.boot.projectId, {
538
+ githubFirst: this.boot.githubFirst ?? true,
539
+ warn: (message) => {
540
+ this.warn(message);
541
+ },
542
+ })
543
+ .then((selection) => {
544
+ const changed = this.store?.store.kind !== selection.store.kind;
545
+ this.store = { ...selection, at: Date.now() };
546
+ if (changed)
547
+ this.snapshot = undefined;
548
+ return selection.store;
549
+ })
550
+ .finally(() => {
551
+ this.storeInflight = undefined;
552
+ });
553
+ }
554
+ return this.storeInflight;
555
+ }
556
+ find(project, target, path) {
557
+ return project.files.find((entry) => entry.target === target && entry.path === path);
558
+ }
559
+ async requireFile(target) {
560
+ const absolute = this.absolute(target);
561
+ const spot = classify(absolute, this.root);
562
+ if (!spot) {
563
+ throw new FsError(`${absolute} is outside the Crowdy project mount.`, 'FS_NOT_FOUND');
564
+ }
565
+ if (spot.kind !== 'file') {
566
+ throw new FsError(`${absolute} is a directory, not a regular file.`, 'FS_NOT_REGULAR_FILE');
567
+ }
568
+ const project = await this.project();
569
+ const file = this.find(project, spot.location.target, spot.location.path);
570
+ if (!file) {
571
+ throw new FsError(`${absolute} does not exist in the Crowdy project.`, 'FS_NOT_FOUND');
572
+ }
573
+ return { file, location: spot.location };
574
+ }
575
+ /**
576
+ * Reject a write that Crowdy Studio would refuse anyway, so the model gets a
577
+ * precise reason instead of a generic server validation failure.
578
+ */
579
+ requireWritableLocation(target) {
580
+ const absolute = this.absolute(target);
581
+ const spot = classify(absolute, this.root);
582
+ if (!spot) {
583
+ throw new FsError(`${absolute} is outside the Crowdy project mount at ${this.root}.`, 'FS_SANDBOX_DENIED');
584
+ }
585
+ if (spot.kind === 'scratch-dir' || spot.kind === 'scratch-file') {
586
+ throw new FsError(`${absolute} is read-only: captures/ and context/ are filled by Crowdy Studio, not by edits.`, 'FS_PERMISSION_DENIED');
587
+ }
588
+ if (spot.kind !== 'file') {
589
+ throw new FsError(`${absolute} is a directory and cannot be written.`, 'FS_NOT_REGULAR_FILE');
590
+ }
591
+ if (!isAcceptableProjectPath(spot.location.path)) {
592
+ throw new FsError(`Crowdy Studio only stores Cargo.toml or .rs files under src/; ${spot.location.path} is not allowed.`, 'FS_PERMISSION_DENIED');
593
+ }
594
+ return spot.location;
595
+ }
596
+ absolute(target) {
597
+ const key = String(target.targetKey);
598
+ return key.startsWith('crowdy:') ? key.slice('crowdy:'.length) : key;
599
+ }
600
+ assertLive(signal) {
601
+ if (signal?.aborted)
602
+ throw new FsError('The filesystem operation was aborted.', 'FS_ABORTED');
603
+ }
604
+ /** Serialize mutations per path so a read-guard-write window cannot interleave. */
605
+ async withLock(key, op) {
606
+ const previous = this.locks.get(key) ?? Promise.resolve();
607
+ const run = previous.then(op, op);
608
+ // The tail must not reject, or the next waiter would inherit this failure.
609
+ const tail = run.catch(() => undefined);
610
+ this.locks.set(key, tail);
611
+ try {
612
+ return await run;
613
+ }
614
+ finally {
615
+ if (this.locks.get(key) === tail)
616
+ this.locks.delete(key);
617
+ }
618
+ }
619
+ }
620
+ export default CrowdyFileSystem;
621
+ //# sourceMappingURL=crowdy-file-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crowdy-file-system.js","sourceRoot":"","sources":["../../src/fs/crowdy-file-system.ts"],"names":[],"mappings":"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"}