@auto-engineer/cli 0.8.4 → 0.8.5

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 (36) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/src/server/file-syncer/discovery/bareImports.d.ts +3 -0
  3. package/dist/src/server/file-syncer/discovery/bareImports.d.ts.map +1 -0
  4. package/dist/src/server/file-syncer/discovery/bareImports.js +36 -0
  5. package/dist/src/server/file-syncer/discovery/bareImports.js.map +1 -0
  6. package/dist/src/server/file-syncer/discovery/dts.d.ts +11 -0
  7. package/dist/src/server/file-syncer/discovery/dts.d.ts.map +1 -0
  8. package/dist/src/server/file-syncer/discovery/dts.js +108 -0
  9. package/dist/src/server/file-syncer/discovery/dts.js.map +1 -0
  10. package/dist/src/server/file-syncer/index.d.ts +17 -0
  11. package/dist/src/server/file-syncer/index.d.ts.map +1 -0
  12. package/dist/src/server/file-syncer/index.js +206 -0
  13. package/dist/src/server/file-syncer/index.js.map +1 -0
  14. package/dist/src/server/file-syncer/sync/computeDesiredSet.d.ts +7 -0
  15. package/dist/src/server/file-syncer/sync/computeDesiredSet.d.ts.map +1 -0
  16. package/dist/src/server/file-syncer/sync/computeDesiredSet.js +76 -0
  17. package/dist/src/server/file-syncer/sync/computeDesiredSet.js.map +1 -0
  18. package/dist/src/server/file-syncer/types/wire.d.ts +14 -0
  19. package/dist/src/server/file-syncer/types/wire.d.ts.map +1 -0
  20. package/dist/src/server/file-syncer/types/wire.js +2 -0
  21. package/dist/src/server/file-syncer/types/wire.js.map +1 -0
  22. package/dist/src/server/file-syncer/utils/hash.d.ts +5 -0
  23. package/dist/src/server/file-syncer/utils/hash.d.ts.map +1 -0
  24. package/dist/src/server/file-syncer/utils/hash.js +20 -0
  25. package/dist/src/server/file-syncer/utils/hash.js.map +1 -0
  26. package/dist/src/server/file-syncer/utils/path.d.ts +15 -0
  27. package/dist/src/server/file-syncer/utils/path.d.ts.map +1 -0
  28. package/dist/src/server/file-syncer/utils/path.js +100 -0
  29. package/dist/src/server/file-syncer/utils/path.js.map +1 -0
  30. package/dist/src/server/server.js +1 -1
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +3 -3
  33. package/dist/src/server/file-syncer.d.ts +0 -21
  34. package/dist/src/server/file-syncer.d.ts.map +0 -1
  35. package/dist/src/server/file-syncer.js +0 -101
  36. package/dist/src/server/file-syncer.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @auto-engineer/cli
2
2
 
3
+ ## 0.8.5
4
+
5
+ ### Patch Changes
6
+
7
+ - @auto-engineer/file-store@0.8.5
8
+ - @auto-engineer/message-bus@0.8.5
9
+
3
10
  ## 0.8.4
4
11
 
5
12
  ### Patch Changes
@@ -0,0 +1,3 @@
1
+ import { NodeFileStore } from '@auto-engineer/file-store';
2
+ export declare function collectBareImportsFromFiles(files: string[], vfs: NodeFileStore): Promise<string[]>;
3
+ //# sourceMappingURL=bareImports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bareImports.d.ts","sourceRoot":"","sources":["../../../../../src/server/file-syncer/discovery/bareImports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAiB1D,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBxG"}
@@ -0,0 +1,36 @@
1
+ const BARE_IMPORT_RE = /\bfrom\s+['"]([^'"]+)['"]|require\(\s*['"]([^'"]+)['"]\s*\)|\bimport\(\s*['"]([^'"]+)['"]\s*\)/g;
2
+ function isBare(spec) {
3
+ return !!spec && !spec.startsWith('.') && !spec.startsWith('/') && !spec.startsWith('node:');
4
+ }
5
+ function basePackageOf(spec) {
6
+ if (spec.startsWith('@')) {
7
+ const parts = spec.split('/');
8
+ return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : spec;
9
+ }
10
+ const i = spec.indexOf('/');
11
+ return i === -1 ? spec : spec.slice(0, i);
12
+ }
13
+ export async function collectBareImportsFromFiles(files, vfs) {
14
+ const pkgs = new Set();
15
+ for (const abs of files) {
16
+ if (!/\.(m?ts|m?js|tsx|jsx)$/i.test(abs))
17
+ continue;
18
+ try {
19
+ const buf = await vfs.read(abs);
20
+ if (!buf)
21
+ continue;
22
+ const src = new TextDecoder().decode(buf);
23
+ for (const m of src.matchAll(BARE_IMPORT_RE)) {
24
+ const raw = (m[1] ?? m[2] ?? m[3] ?? '').trim();
25
+ if (!isBare(raw))
26
+ continue;
27
+ pkgs.add(basePackageOf(raw));
28
+ }
29
+ }
30
+ catch {
31
+ // ignore per-file errors
32
+ }
33
+ }
34
+ return [...pkgs];
35
+ }
36
+ //# sourceMappingURL=bareImports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bareImports.js","sourceRoot":"","sources":["../../../../../src/server/file-syncer/discovery/bareImports.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAClB,iGAAiG,CAAC;AAEpG,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/F,CAAC;AACD,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,KAAe,EAAE,GAAkB;IACnF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QACnD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7C,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { NodeFileStore } from '@auto-engineer/file-store';
2
+ export declare function readJsonIfExists(vfs: NodeFileStore, p: string): Promise<Record<string, unknown> | null>;
3
+ export declare function exists(vfs: NodeFileStore, p: string): Promise<boolean>;
4
+ export declare function typesAlias(pkg: string): string;
5
+ /** From a list of “base directories”, add each ancestor’s node_modules*/
6
+ export declare function nmRootsForBases(bases: string[], maxUp?: number): string[];
7
+ /** Probe a single package for its entry .d.ts inside a given nm root. */
8
+ export declare function probeEntryDtsInRoot(vfs: NodeFileStore, nmRoot: string, pkg: string): Promise<string | null>;
9
+ /** For each external pkg, choose at most ONE entry d.ts by scanning across provided nm roots. */
10
+ export declare function probeEntryDtsForPackagesFromRoots(vfs: NodeFileStore, nmRoots: string[], pkgs: string[]): Promise<string[]>;
11
+ //# sourceMappingURL=dts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dts.d.ts","sourceRoot":"","sources":["../../../../../src/server/file-syncer/discovery/dts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM1D,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAQ7G;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5E;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAYpE;AAED,yEAAyE;AACzE,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBjH;AAED,iGAAiG;AACjG,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAuCnB"}
@@ -0,0 +1,108 @@
1
+ import createDebug from 'debug';
2
+ import { posix } from '../utils/path.js';
3
+ const debug = createDebug('auto-engineer:file-syncer:dts');
4
+ export async function readJsonIfExists(vfs, p) {
5
+ try {
6
+ const buf = await vfs.read(p);
7
+ if (!buf)
8
+ return null;
9
+ return JSON.parse(new TextDecoder().decode(buf));
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ export async function exists(vfs, p) {
16
+ try {
17
+ const buf = await vfs.read(p);
18
+ return !!buf;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ export function typesAlias(pkg) {
25
+ if (pkg.startsWith('@')) {
26
+ const [scope, name] = pkg.split('/');
27
+ return `@types/${scope.slice(1)}__${name}`;
28
+ }
29
+ return `@types/${pkg}`;
30
+ }
31
+ /** From a list of “base directories”, add each ancestor’s node_modules*/
32
+ export function nmRootsForBases(bases, maxUp = 8) {
33
+ const roots = new Set();
34
+ for (const base of bases) {
35
+ let cur = base.replace(/\\/g, '/');
36
+ for (let i = 0; i < maxUp; i++) {
37
+ roots.add(`${cur}/node_modules`);
38
+ const parent = cur.replace(/\/+$/, '').split('/').slice(0, -1).join('/') || '/';
39
+ if (parent === cur)
40
+ break;
41
+ cur = parent;
42
+ }
43
+ }
44
+ return [...roots].map((p) => p.replace(/\/+/g, '/'));
45
+ }
46
+ /** Probe a single package for its entry .d.ts inside a given nm root. */
47
+ export async function probeEntryDtsInRoot(vfs, nmRoot, pkg) {
48
+ const pkgDir = `${nmRoot}/${pkg}`.replace(/\/+/g, '/');
49
+ // package.json types/typings
50
+ const pj = await readJsonIfExists(vfs, `${pkgDir}/package.json`);
51
+ if (pj && (typeof pj.types === 'string' || typeof pj.typings === 'string')) {
52
+ const rel = String(pj.types ?? pj.typings);
53
+ const abs = posix(`${pkgDir}/${rel}`.replace(/\/+/g, '/'));
54
+ if (await exists(vfs, abs))
55
+ return abs;
56
+ }
57
+ // index.d.ts at root
58
+ const idx = posix(`${pkgDir}/index.d.ts`);
59
+ if (await exists(vfs, idx))
60
+ return idx;
61
+ // dist/index.d.ts (very common)
62
+ const distIdx = posix(`${pkgDir}/dist/index.d.ts`);
63
+ if (await exists(vfs, distIdx))
64
+ return distIdx;
65
+ return null;
66
+ }
67
+ /** For each external pkg, choose at most ONE entry d.ts by scanning across provided nm roots. */
68
+ export async function probeEntryDtsForPackagesFromRoots(vfs, nmRoots, pkgs) {
69
+ function scorePath(p) {
70
+ // lower score = better
71
+ let s = 0;
72
+ const pathPosix = p.replace(/\\/g, '/');
73
+ if (pathPosix.includes('/server/node_modules/'))
74
+ s -= 10;
75
+ if (!pathPosix.includes('/.pnpm/'))
76
+ s -= 3;
77
+ if (pathPosix.includes('/node_modules/'))
78
+ s -= 1;
79
+ s += pathPosix.length / 1000;
80
+ return s;
81
+ }
82
+ const out = new Set();
83
+ for (const pkg of pkgs) {
84
+ const candidates = [];
85
+ for (const nm of nmRoots) {
86
+ const hit = await probeEntryDtsInRoot(vfs, nm, pkg);
87
+ if (hit !== null)
88
+ candidates.push(hit);
89
+ }
90
+ if (candidates.length === 0) {
91
+ const alias = typesAlias(pkg);
92
+ for (const nm of nmRoots) {
93
+ const hit = await probeEntryDtsInRoot(vfs, nm, alias);
94
+ if (hit !== null)
95
+ candidates.push(hit);
96
+ }
97
+ }
98
+ if (candidates.length) {
99
+ candidates.sort((a, b) => scorePath(a) - scorePath(b));
100
+ out.add(candidates[0]);
101
+ }
102
+ else {
103
+ debug('dts-probe: ⚠ no entry .d.ts found for %s', pkg);
104
+ }
105
+ }
106
+ return [...out];
107
+ }
108
+ //# sourceMappingURL=dts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dts.js","sourceRoot":"","sources":["../../../../../src/server/file-syncer/discovery/dts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Server as SocketIOServer } from 'socket.io';
2
+ export declare class FileSyncer {
3
+ private io;
4
+ private watchDir;
5
+ private projectRoot;
6
+ private vfs;
7
+ private active;
8
+ private watcher?;
9
+ private debounce;
10
+ private lastComputeTime;
11
+ private cachedDesiredSet;
12
+ private pendingInitialFiles;
13
+ constructor(io: SocketIOServer, watchDir?: string, _extensions?: string[]);
14
+ start(): void;
15
+ stop(): void;
16
+ }
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/file-syncer/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AAY1D,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,mBAAmB,CAAqC;gBAEpD,EAAE,EAAE,cAAc,EAAE,QAAQ,SAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE;IAQtE,KAAK,IAAI,IAAI;IA6Lb,IAAI,IAAI,IAAI;CAQb"}
@@ -0,0 +1,206 @@
1
+ import chokidar from 'chokidar';
2
+ import path from 'path';
3
+ import createDebug from 'debug';
4
+ import { NodeFileStore } from '@auto-engineer/file-store';
5
+ import { computeDesiredSet } from './sync/computeDesiredSet.js';
6
+ import { md5, readBase64, statSize } from './utils/hash.js';
7
+ import { toWirePath, fromWirePath, rebuildWirePathCache } from './utils/path.js';
8
+ const debug = createDebug('cli:file-syncer');
9
+ export class FileSyncer {
10
+ constructor(io, watchDir = '.', _extensions) {
11
+ this.debounce = null;
12
+ this.lastComputeTime = 0;
13
+ this.cachedDesiredSet = null;
14
+ this.pendingInitialFiles = null;
15
+ this.io = io;
16
+ this.watchDir = path.resolve(watchDir);
17
+ this.projectRoot = path.dirname(this.watchDir);
18
+ this.vfs = new NodeFileStore();
19
+ this.active = new Map();
20
+ }
21
+ start() {
22
+ const compute = async () => {
23
+ const now = Date.now();
24
+ // Cache computeDesiredSet results for 1 second to prevent rapid repeated calls
25
+ if (this.cachedDesiredSet && now - this.lastComputeTime < 1000) {
26
+ return this.cachedDesiredSet;
27
+ }
28
+ const result = await computeDesiredSet({ vfs: this.vfs, watchDir: this.watchDir, projectRoot: this.projectRoot });
29
+ this.cachedDesiredSet = result;
30
+ this.lastComputeTime = now;
31
+ return result;
32
+ };
33
+ const initialFiles = async () => {
34
+ const desired = await compute();
35
+ const files = [];
36
+ for (const abs of desired) {
37
+ const content = await readBase64(this.vfs, abs);
38
+ if (content === null) {
39
+ console.warn(`[sync] Skipping file due to read failure: ${abs}`);
40
+ continue;
41
+ }
42
+ const wire = toWirePath(abs, this.projectRoot);
43
+ const size = await statSize(this.vfs, abs);
44
+ const hash = await md5(this.vfs, abs);
45
+ if (hash === null) {
46
+ console.warn(`[sync] Skipping file due to hash failure: ${abs}`);
47
+ continue;
48
+ }
49
+ this.active.set(abs, { hash, size });
50
+ files.push({ path: wire, content });
51
+ }
52
+ files.sort((a, b) => a.path.localeCompare(b.path));
53
+ return { files, directory: path.resolve(this.watchDir) };
54
+ };
55
+ const computeChanges = async (desired) => {
56
+ const outgoing = [];
57
+ for (const abs of desired) {
58
+ const hash = await md5(this.vfs, abs);
59
+ if (hash === null) {
60
+ continue;
61
+ }
62
+ const size = await statSize(this.vfs, abs);
63
+ const prev = this.active.get(abs);
64
+ if (!prev || prev.hash !== hash || prev.size !== size) {
65
+ const content = await readBase64(this.vfs, abs);
66
+ if (content === null) {
67
+ continue;
68
+ }
69
+ this.active.set(abs, { hash, size });
70
+ const wire = toWirePath(abs, this.projectRoot);
71
+ outgoing.push({ event: prev ? 'change' : 'add', path: wire, content });
72
+ }
73
+ }
74
+ return outgoing;
75
+ };
76
+ const computeDeletions = (desired) => {
77
+ const toDelete = [];
78
+ for (const abs of Array.from(this.active.keys())) {
79
+ if (!desired.has(abs)) {
80
+ this.active.delete(abs);
81
+ const wire = toWirePath(abs, this.projectRoot);
82
+ toDelete.push({ event: 'delete', path: wire });
83
+ }
84
+ }
85
+ return toDelete;
86
+ };
87
+ const handleEmptyTransition = (desired, toDelete) => {
88
+ if (this.active.size === 0 && desired.size === 0 && toDelete.length > 0) {
89
+ this.io.emit('initial-sync', { files: [], directory: path.resolve(this.watchDir) });
90
+ return true;
91
+ }
92
+ return false;
93
+ };
94
+ const handleRehydration = (activeSizeBefore, outgoing, desired) => {
95
+ const allAdds = outgoing.length > 0 && outgoing.every((x) => x.event === 'add');
96
+ const rehydrateFromEmpty = activeSizeBefore === 0 && allAdds && desired.size === outgoing.length;
97
+ if (rehydrateFromEmpty) {
98
+ const files = outgoing
99
+ .map((o) => ({ path: o.path, content: o.content }))
100
+ .sort((a, b) => a.path.localeCompare(b.path));
101
+ debug('REHYDRATE: Sending initial-sync with %d files', files.length);
102
+ this.io.emit('initial-sync', { files, directory: path.resolve(this.watchDir) });
103
+ return true;
104
+ }
105
+ return false;
106
+ };
107
+ const rebuildAndBroadcast = async () => {
108
+ const desired = await compute();
109
+ const activeSizeBefore = this.active.size;
110
+ const outgoing = await computeChanges(desired);
111
+ const toDelete = computeDeletions(desired);
112
+ for (const ch of toDelete) {
113
+ this.io.emit('file-change', ch);
114
+ }
115
+ if (handleEmptyTransition(desired, toDelete))
116
+ return;
117
+ if (handleRehydration(activeSizeBefore, outgoing, desired))
118
+ return;
119
+ // otherwise: normal incremental flow
120
+ for (const ch of outgoing) {
121
+ this.io.emit('file-change', ch);
122
+ }
123
+ };
124
+ const scheduleRebuild = () => {
125
+ if (this.debounce)
126
+ clearTimeout(this.debounce);
127
+ this.debounce = setTimeout(() => {
128
+ this.debounce = null;
129
+ rebuildAndBroadcast().catch((err) => console.error('[sync] rebuild error', err));
130
+ }, 100);
131
+ };
132
+ this.watcher = chokidar.watch([this.watchDir], { ignoreInitial: true, persistent: true });
133
+ this.watcher
134
+ .on('add', (_filePath) => {
135
+ scheduleRebuild();
136
+ })
137
+ .on('change', (_filePath) => {
138
+ scheduleRebuild();
139
+ })
140
+ .on('unlink', (_filePath) => {
141
+ scheduleRebuild();
142
+ })
143
+ .on('addDir', (_dirPath) => {
144
+ scheduleRebuild();
145
+ })
146
+ .on('unlinkDir', (_dirPath) => {
147
+ scheduleRebuild();
148
+ })
149
+ .on('error', (err) => console.error('[watcher]', err));
150
+ this.io.on('connection', async (socket) => {
151
+ try {
152
+ // Deduplicate concurrent initialFiles calls by reusing pending promise
153
+ if (this.pendingInitialFiles) {
154
+ const init = await this.pendingInitialFiles;
155
+ socket.emit('initial-sync', init);
156
+ return;
157
+ }
158
+ this.pendingInitialFiles = initialFiles();
159
+ const init = await this.pendingInitialFiles;
160
+ this.pendingInitialFiles = null; // Clear after completion
161
+ // Rebuild wire path cache for external mappings to support reconnection
162
+ const files = Array.from(this.active.keys()).map((abs) => ({ abs, projectRoot: this.projectRoot }));
163
+ rebuildWirePathCache(files);
164
+ socket.emit('initial-sync', init);
165
+ }
166
+ catch (e) {
167
+ console.error('[sync] initial-sync failed:', e);
168
+ this.pendingInitialFiles = null; // Clear on error
169
+ }
170
+ socket.on('client-file-change', async (msg) => {
171
+ // Use fromWirePath to handle virtual paths correctly
172
+ const abs = fromWirePath(msg.path, this.projectRoot);
173
+ try {
174
+ if (msg.event === 'delete') {
175
+ await this.vfs.remove(abs);
176
+ this.active.delete(abs);
177
+ }
178
+ else {
179
+ const contentStr = msg.content;
180
+ if (contentStr === undefined) {
181
+ console.warn('[sync] client write: no content provided');
182
+ return;
183
+ }
184
+ const content = Buffer.from(contentStr, 'base64');
185
+ await this.vfs.write(abs, new Uint8Array(content));
186
+ }
187
+ }
188
+ catch (e) {
189
+ console.error('[sync] client-file-change failed:', e);
190
+ }
191
+ finally {
192
+ scheduleRebuild();
193
+ }
194
+ });
195
+ });
196
+ }
197
+ stop() {
198
+ if (this.watcher) {
199
+ void this.watcher.close();
200
+ }
201
+ if (this.debounce) {
202
+ clearTimeout(this.debounce);
203
+ }
204
+ }
205
+ }
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/file-syncer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { NodeFileStore } from '@auto-engineer/file-store';
2
+ export declare function computeDesiredSet(opts: {
3
+ vfs: NodeFileStore;
4
+ watchDir: string;
5
+ projectRoot: string;
6
+ }): Promise<Set<string>>;
7
+ //# sourceMappingURL=computeDesiredSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeDesiredSet.d.ts","sourceRoot":"","sources":["../../../../../src/server/file-syncer/sync/computeDesiredSet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA8B1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,wBAgD1G"}
@@ -0,0 +1,76 @@
1
+ import { getFlows } from '@auto-engineer/flow';
2
+ import { collectBareImportsFromFiles } from '../discovery/bareImports.js';
3
+ import { nmRootsForBases, probeEntryDtsForPackagesFromRoots } from '../discovery/dts.js';
4
+ import { dirOf, logArray, pkgNameFromPath, scorePathForDedupe, uniq } from '../utils/path.js';
5
+ function flattenPaths(x) {
6
+ if (!x)
7
+ return [];
8
+ if (Array.isArray(x))
9
+ return x;
10
+ return Object.values(x).flat();
11
+ }
12
+ /**
13
+ * Stable fallback node_modules roots derived from projectRoot and common monorepo layouts.
14
+ * Ensures deterministic probing even when there are no/very few source files.
15
+ */
16
+ function stableCandidateNmRoots(projectRoot) {
17
+ const roots = new Set();
18
+ let cur = projectRoot.replace(/\\/g, '/');
19
+ // Ancestors (cap to 8)
20
+ for (let i = 0; i < 8; i++) {
21
+ roots.add(`${cur}/node_modules`);
22
+ const parent = cur.replace(/\/+$/, '').split('/').slice(0, -1).join('/') || '/';
23
+ if (parent === cur)
24
+ break;
25
+ cur = parent;
26
+ }
27
+ roots.add(`${projectRoot}/server/node_modules`);
28
+ return [...roots].map((p) => p.replace(/\/+/g, '/'));
29
+ }
30
+ export async function computeDesiredSet(opts) {
31
+ const { vfs, watchDir, projectRoot } = opts;
32
+ try {
33
+ const res = await getFlows({ vfs, root: watchDir });
34
+ const files = flattenPaths(res.vfsFiles);
35
+ const baseDirs = uniq([projectRoot, ...files.map(dirOf)]);
36
+ const dynamicRoots = nmRootsForBases(baseDirs);
37
+ const fallbackRoots = stableCandidateNmRoots(projectRoot);
38
+ const nmRoots = uniq([...dynamicRoots, ...fallbackRoots]);
39
+ // --- External packages: from flow graph + harvested bare imports in synced files ---
40
+ const externalsFromFlows = res.externals ?? [];
41
+ const extraPkgs = await collectBareImportsFromFiles(files, vfs);
42
+ const externals = Array.from(new Set([...externalsFromFlows, ...extraPkgs]));
43
+ const dtsFromGraph = flattenPaths(res.typings);
44
+ const dtsFromProbe = await probeEntryDtsForPackagesFromRoots(vfs, nmRoots, externals);
45
+ // Merge & prefer non-.pnpm & shorter paths for stability
46
+ const allDts = Array.from(new Set([...dtsFromGraph, ...dtsFromProbe]));
47
+ allDts.sort((a, b) => {
48
+ const pa = a.includes('/.pnpm/') ? 1 : 0;
49
+ const pb = b.includes('/.pnpm/') ? 1 : 0;
50
+ if (pa !== pb)
51
+ return pa - pb;
52
+ return a.length - b.length;
53
+ });
54
+ // Keep only ONE entry .d.ts per npm package (choose best-scoring path)
55
+ const bestByPkg = new Map();
56
+ for (const p of allDts) {
57
+ const pkg = pkgNameFromPath(p);
58
+ if (pkg === null)
59
+ continue;
60
+ const prev = bestByPkg.get(pkg);
61
+ if (prev === undefined || scorePathForDedupe(p) < scorePathForDedupe(prev)) {
62
+ bestByPkg.set(pkg, p);
63
+ }
64
+ }
65
+ const dts = [...bestByPkg.values()];
66
+ logArray('files', files);
67
+ logArray('dts', dts);
68
+ logArray('externals', externals);
69
+ return new Set([...files, ...dts]);
70
+ }
71
+ catch (err) {
72
+ console.error('[sync] getFlows FAILED:', err);
73
+ return new Set();
74
+ }
75
+ }
76
+ //# sourceMappingURL=computeDesiredSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeDesiredSet.js","sourceRoot":"","sources":["../../../../../src/server/file-syncer/sync/computeDesiredSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE3F,SAAS,YAAY,CAAC,CAAkD;IACtE,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAAC,WAAmB;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE1C,uBAAuB;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QAChF,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,sBAAsB,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAmE;IACzG,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC;QAE1D,sFAAsF;QACtF,MAAM,kBAAkB,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAE7E,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,iCAAiC,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEtF,yDAAyD;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,uEAAuE;QACvE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,GAAG,KAAK,IAAI;gBAAE,SAAS;YAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3E,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAEpC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACrB,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjC,OAAO,IAAI,GAAG,CAAS,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,IAAI,GAAG,EAAU,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type FileEvent = 'add' | 'change' | 'delete';
2
+ export type WireChange = {
3
+ event: FileEvent;
4
+ path: string;
5
+ content?: string;
6
+ };
7
+ export type WireInitial = {
8
+ files: Array<{
9
+ path: string;
10
+ content: string;
11
+ }>;
12
+ directory: string;
13
+ };
14
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../../../src/server/file-syncer/types/wire.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../../../src/server/file-syncer/types/wire.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { NodeFileStore } from '@auto-engineer/file-store';
2
+ export declare function readBase64(vfs: NodeFileStore, abs: string): Promise<string | null>;
3
+ export declare function md5(vfs: NodeFileStore, abs: string): Promise<string | null>;
4
+ export declare function statSize(vfs: NodeFileStore, abs: string): Promise<number>;
5
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../../src/server/file-syncer/utils/hash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,wBAAsB,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxF;AAED,wBAAsB,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIjF;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/E"}
@@ -0,0 +1,20 @@
1
+ import crypto from 'node:crypto';
2
+ export async function readBase64(vfs, abs) {
3
+ const buf = await vfs.read(abs);
4
+ if (!buf) {
5
+ console.warn(`[sync] readBase64: missing file in VFS: ${abs}`);
6
+ return null;
7
+ }
8
+ return Buffer.from(buf).toString('base64');
9
+ }
10
+ export async function md5(vfs, abs) {
11
+ const buf = await vfs.read(abs);
12
+ if (!buf)
13
+ return null;
14
+ return crypto.createHash('md5').update(buf).digest('hex');
15
+ }
16
+ export async function statSize(vfs, abs) {
17
+ const buf = await vfs.read(abs);
18
+ return buf ? buf.byteLength : 0;
19
+ }
20
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../../../src/server/file-syncer/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAkB,EAAE,GAAW;IAC9D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,2CAA2C,GAAG,EAAE,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAkB,EAAE,GAAW;IACvD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAkB,EAAE,GAAW;IAC5D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare const posix: (p: string) => string;
2
+ export declare function toWirePath(abs: string, projectRoot: string): string;
3
+ export declare function sample<T>(arr: T[], n?: number): T[];
4
+ export declare function logArray(label: string, arr: string[], _n?: number): void;
5
+ export declare function uniq<T>(arr: T[]): T[];
6
+ export declare function rebuildWirePathCache(files: Array<{
7
+ abs: string;
8
+ projectRoot: string;
9
+ }>): void;
10
+ export declare function fromWirePath(wirePath: string, projectRoot: string): string;
11
+ export declare function cacheWireMapping(wirePath: string, absPath: string): void;
12
+ export declare function dirOf(p: string): string;
13
+ export declare function pkgNameFromPath(p: string): string | null;
14
+ export declare function scorePathForDedupe(p: string): number;
15
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../../src/server/file-syncer/utils/path.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,WAAgC,CAAC;AAEhE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAoC1D;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,SAAI,OAExC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,SAAI,QAE5D;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAErC;AAOD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAM7F;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAgB1E;AAGD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIxE;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGvC;AAGD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAGD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD"}