@auto-engineer/cli 0.19.1 → 0.21.0
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.
- package/CHANGELOG.md +24 -4
- package/dist/src/__fixtures__/auto.config.d.ts +7 -0
- package/dist/src/__fixtures__/auto.config.d.ts.map +1 -0
- package/dist/src/__fixtures__/auto.config.js +7 -0
- package/dist/src/__fixtures__/auto.config.js.map +1 -0
- package/dist/src/dsl/index.d.ts +71 -0
- package/dist/src/dsl/index.d.ts.map +1 -0
- package/dist/src/dsl/index.js +504 -0
- package/dist/src/dsl/index.js.map +1 -0
- package/dist/src/dsl/types.d.ts +39 -0
- package/dist/src/dsl/types.d.ts.map +1 -0
- package/dist/src/dsl/types.js +2 -0
- package/dist/src/dsl/types.js.map +1 -0
- package/dist/src/dsl-exports.d.ts +5 -0
- package/dist/src/dsl-exports.d.ts.map +1 -0
- package/dist/src/dsl-exports.js +4 -0
- package/dist/src/dsl-exports.js.map +1 -0
- package/dist/src/index.js +16 -201
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugin-loader.d.ts +84 -0
- package/dist/src/plugin-loader.d.ts.map +1 -0
- package/dist/src/plugin-loader.js +788 -0
- package/dist/src/plugin-loader.js.map +1 -0
- package/dist/src/server/command-metadata-service.d.ts +27 -0
- package/dist/src/server/command-metadata-service.d.ts.map +1 -0
- package/dist/src/server/command-metadata-service.js +69 -0
- package/dist/src/server/command-metadata-service.js.map +1 -0
- package/dist/src/server/command-registry.d.ts +21 -0
- package/dist/src/server/command-registry.d.ts.map +1 -0
- package/dist/src/server/command-registry.js +58 -0
- package/dist/src/server/command-registry.js.map +1 -0
- package/dist/src/server/config-loader.d.ts +16 -0
- package/dist/src/server/config-loader.d.ts.map +1 -0
- package/dist/src/server/config-loader.js +106 -0
- package/dist/src/server/config-loader.js.map +1 -0
- package/dist/src/server/event-processor.d.ts +45 -0
- package/dist/src/server/event-processor.d.ts.map +1 -0
- package/dist/src/server/event-processor.js +287 -0
- package/dist/src/server/event-processor.js.map +1 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.d.ts +15 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.d.ts.map +1 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.js +72 -0
- package/dist/src/server/file-syncer/crypto/jwe-encryptor.js.map +1 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.d.ts +24 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.d.ts.map +1 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.js +71 -0
- package/dist/src/server/file-syncer/crypto/provider-resolver.js.map +1 -0
- package/dist/src/server/file-syncer/discovery/bareImports.d.ts +3 -0
- package/dist/src/server/file-syncer/discovery/bareImports.d.ts.map +1 -0
- package/dist/src/server/file-syncer/discovery/bareImports.js +36 -0
- package/dist/src/server/file-syncer/discovery/bareImports.js.map +1 -0
- package/dist/src/server/file-syncer/discovery/dts.d.ts +11 -0
- package/dist/src/server/file-syncer/discovery/dts.d.ts.map +1 -0
- package/dist/src/server/file-syncer/discovery/dts.js +108 -0
- package/dist/src/server/file-syncer/discovery/dts.js.map +1 -0
- package/dist/src/server/file-syncer/index.d.ts +22 -0
- package/dist/src/server/file-syncer/index.d.ts.map +1 -0
- package/dist/src/server/file-syncer/index.js +378 -0
- package/dist/src/server/file-syncer/index.js.map +1 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.d.ts +7 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.d.ts.map +1 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.js +103 -0
- package/dist/src/server/file-syncer/sync/resolveSyncFileSet.js.map +1 -0
- package/dist/src/server/file-syncer/types/wire.d.ts +14 -0
- package/dist/src/server/file-syncer/types/wire.d.ts.map +1 -0
- package/dist/src/server/file-syncer/types/wire.js +2 -0
- package/dist/src/server/file-syncer/types/wire.js.map +1 -0
- package/dist/src/server/file-syncer/utils/hash.d.ts +5 -0
- package/dist/src/server/file-syncer/utils/hash.d.ts.map +1 -0
- package/dist/src/server/file-syncer/utils/hash.js +20 -0
- package/dist/src/server/file-syncer/utils/hash.js.map +1 -0
- package/dist/src/server/file-syncer/utils/path.d.ts +15 -0
- package/dist/src/server/file-syncer/utils/path.d.ts.map +1 -0
- package/dist/src/server/file-syncer/utils/path.js +109 -0
- package/dist/src/server/file-syncer/utils/path.js.map +1 -0
- package/dist/src/server/http-routes.d.ts +30 -0
- package/dist/src/server/http-routes.d.ts.map +1 -0
- package/dist/src/server/http-routes.js +394 -0
- package/dist/src/server/http-routes.js.map +1 -0
- package/dist/src/server/sandbox-landing-page.html +367 -0
- package/dist/src/server/server.d.ts +106 -0
- package/dist/src/server/server.d.ts.map +1 -0
- package/dist/src/server/server.js +255 -0
- package/dist/src/server/server.js.map +1 -0
- package/dist/src/server/services/child-process-manager.d.ts +27 -0
- package/dist/src/server/services/child-process-manager.d.ts.map +1 -0
- package/dist/src/server/services/child-process-manager.js +126 -0
- package/dist/src/server/services/child-process-manager.js.map +1 -0
- package/dist/src/server/services/index.d.ts +3 -0
- package/dist/src/server/services/index.d.ts.map +1 -0
- package/dist/src/server/services/index.js +2 -0
- package/dist/src/server/services/index.js.map +1 -0
- package/dist/src/server/services/interface.d.ts +6 -0
- package/dist/src/server/services/interface.d.ts.map +1 -0
- package/dist/src/server/services/interface.js +2 -0
- package/dist/src/server/services/interface.js.map +1 -0
- package/dist/src/server/settled-tracker.d.ts +29 -0
- package/dist/src/server/settled-tracker.d.ts.map +1 -0
- package/dist/src/server/settled-tracker.js +203 -0
- package/dist/src/server/settled-tracker.js.map +1 -0
- package/dist/src/server/state-manager.d.ts +24 -0
- package/dist/src/server/state-manager.d.ts.map +1 -0
- package/dist/src/server/state-manager.js +56 -0
- package/dist/src/server/state-manager.js.map +1 -0
- package/dist/src/server/websocket-handler.d.ts +5 -0
- package/dist/src/server/websocket-handler.d.ts.map +1 -0
- package/dist/src/server/websocket-handler.js +40 -0
- package/dist/src/server/websocket-handler.js.map +1 -0
- package/dist/src/server.d.ts +20 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +204 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/utils/analytics.d.ts +21 -0
- package/dist/src/utils/analytics.d.ts.map +1 -0
- package/dist/src/utils/analytics.js +41 -0
- package/dist/src/utils/analytics.js.map +1 -0
- package/dist/src/utils/config.d.ts +11 -0
- package/dist/src/utils/config.d.ts.map +1 -0
- package/dist/src/utils/config.js +50 -0
- package/dist/src/utils/config.js.map +1 -0
- package/dist/src/utils/correlation-id.d.ts +3 -0
- package/dist/src/utils/correlation-id.d.ts.map +1 -0
- package/dist/src/utils/correlation-id.js +7 -0
- package/dist/src/utils/correlation-id.js.map +1 -0
- package/dist/src/utils/errors.d.ts +22 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +50 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/get-package-version.d.ts +7 -0
- package/dist/src/utils/get-package-version.d.ts.map +1 -0
- package/dist/src/utils/get-package-version.js +31 -0
- package/dist/src/utils/get-package-version.js.map +1 -0
- package/dist/src/utils/terminal.d.ts +13 -0
- package/dist/src/utils/terminal.d.ts.map +1 -0
- package/dist/src/utils/terminal.js +85 -0
- package/dist/src/utils/terminal.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -4
|
@@ -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":"AACA,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,KAAK,GAAG,WAAW,CAAC,+BAA+B,CAAC,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAkB,EAAE,CAAS;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAA4B,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAkB,EAAE,CAAS;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,UAAU,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,UAAU,GAAG,EAAE,CAAC;AACzB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,KAAe,EAAE,KAAK,GAAG,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,CAAC;YACjC,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;YAChF,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM;YAC1B,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;IACH,CAAC;IACD,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,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAkB,EAAE,MAAc,EAAE,GAAW;IACvF,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC,CAAC;IACjE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IACzC,CAAC;IAED,qBAAqB;IACrB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC;IAC1C,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAEvC,gCAAgC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,MAAM,kBAAkB,CAAC,CAAC;IACnD,IAAI,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAE/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,GAAkB,EAClB,OAAiB,EACjB,IAAc;IAEd,SAAS,SAAS,CAAC,CAAS;QAC1B,uBAAuB;QACvB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAAE,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,GAAG,KAAK,IAAI;gBAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;gBACtD,IAAI,GAAG,KAAK,IAAI;oBAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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 autoConfigDebounce;
|
|
11
|
+
private lastComputeTime;
|
|
12
|
+
private cachedDesiredSet;
|
|
13
|
+
private pendingInitialFiles;
|
|
14
|
+
private autoConfigHash;
|
|
15
|
+
private autoConfigContent;
|
|
16
|
+
private providerEnvHash;
|
|
17
|
+
constructor(io: SocketIOServer, watchDir?: string, _extensions?: string[]);
|
|
18
|
+
start(): void;
|
|
19
|
+
private findAutoConfigFile;
|
|
20
|
+
stop(): void;
|
|
21
|
+
}
|
|
22
|
+
//# 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;AAe1D,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,kBAAkB,CAA+B;IACzD,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,mBAAmB,CAAqC;IAChE,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,eAAe,CAAuB;gBAElC,EAAE,EAAE,cAAc,EAAE,QAAQ,SAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE;IAQtE,KAAK,IAAI,IAAI;YA8VC,kBAAkB;IAiBhC,IAAI,IAAI,IAAI;CAWb"}
|
|
@@ -0,0 +1,378 @@
|
|
|
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 { resolveSyncFileSet } from './sync/resolveSyncFileSet.js';
|
|
6
|
+
import { loadAutoConfig } from '../config-loader.js';
|
|
7
|
+
import { md5, readBase64, statSize } from './utils/hash.js';
|
|
8
|
+
import { toWirePath, fromWirePath, rebuildWirePathCache } from './utils/path.js';
|
|
9
|
+
import { createJWE } from './crypto/jwe-encryptor.js';
|
|
10
|
+
import { getActiveProvider, getProviderEnvHash } from './crypto/provider-resolver.js';
|
|
11
|
+
const debug = createDebug('auto:cli:file-syncer');
|
|
12
|
+
export class FileSyncer {
|
|
13
|
+
constructor(io, watchDir = '.', _extensions) {
|
|
14
|
+
this.debounce = null;
|
|
15
|
+
this.autoConfigDebounce = null;
|
|
16
|
+
this.lastComputeTime = 0;
|
|
17
|
+
this.cachedDesiredSet = null;
|
|
18
|
+
this.pendingInitialFiles = null;
|
|
19
|
+
this.autoConfigHash = null;
|
|
20
|
+
this.autoConfigContent = null;
|
|
21
|
+
this.providerEnvHash = null;
|
|
22
|
+
this.io = io;
|
|
23
|
+
this.watchDir = path.resolve(watchDir);
|
|
24
|
+
this.projectRoot = path.dirname(this.watchDir);
|
|
25
|
+
this.vfs = new NodeFileStore();
|
|
26
|
+
this.active = new Map();
|
|
27
|
+
}
|
|
28
|
+
start() {
|
|
29
|
+
const serializeConfig = async (cfg, fileId) => {
|
|
30
|
+
let configWithCreds = cfg;
|
|
31
|
+
try {
|
|
32
|
+
const active = getActiveProvider();
|
|
33
|
+
if (active !== null) {
|
|
34
|
+
const jwe = await createJWE({
|
|
35
|
+
provider: active.provider,
|
|
36
|
+
apiKey: active.apiKey,
|
|
37
|
+
model: active.model,
|
|
38
|
+
custom: active.provider === 'custom' ? active.custom : undefined,
|
|
39
|
+
roomId: fileId,
|
|
40
|
+
});
|
|
41
|
+
if (typeof cfg === 'object' && cfg !== null) {
|
|
42
|
+
configWithCreds = {
|
|
43
|
+
...cfg,
|
|
44
|
+
token: jwe,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
debug('Added token to config for provider: %s', active.provider);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
debug('No active provider found, skipping credential encryption');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
debug('Failed to encrypt credentials, continuing without: %O', error);
|
|
55
|
+
}
|
|
56
|
+
return JSON.stringify(configWithCreds, (key, value) => {
|
|
57
|
+
if (typeof value === 'function') {
|
|
58
|
+
const funcName = value.name;
|
|
59
|
+
return `[Function: ${funcName != null ? funcName : 'anonymous'}]`;
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}, 2);
|
|
63
|
+
};
|
|
64
|
+
const getVirtualConfigWirePath = () => {
|
|
65
|
+
const virtualPath = path.join(this.watchDir, 'auto.config.json');
|
|
66
|
+
return toWirePath(virtualPath, this.projectRoot);
|
|
67
|
+
};
|
|
68
|
+
const compute = async () => {
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
// Cache computeDesiredSet results for 1 second to prevent rapid repeated calls
|
|
71
|
+
if (this.cachedDesiredSet && now - this.lastComputeTime < 1000) {
|
|
72
|
+
return this.cachedDesiredSet;
|
|
73
|
+
}
|
|
74
|
+
const result = await resolveSyncFileSet({
|
|
75
|
+
vfs: this.vfs,
|
|
76
|
+
watchDir: this.watchDir,
|
|
77
|
+
projectRoot: this.projectRoot,
|
|
78
|
+
});
|
|
79
|
+
this.cachedDesiredSet = result;
|
|
80
|
+
this.lastComputeTime = now;
|
|
81
|
+
return result;
|
|
82
|
+
};
|
|
83
|
+
const initialFiles = async () => {
|
|
84
|
+
const desired = await compute();
|
|
85
|
+
const files = [];
|
|
86
|
+
for (const abs of desired) {
|
|
87
|
+
const content = await readBase64(this.vfs, abs);
|
|
88
|
+
if (content === null) {
|
|
89
|
+
console.warn(`[sync] Skipping file due to read failure: ${abs}`);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const wire = toWirePath(abs, this.projectRoot);
|
|
93
|
+
const size = await statSize(this.vfs, abs);
|
|
94
|
+
const hash = await md5(this.vfs, abs);
|
|
95
|
+
if (hash === null) {
|
|
96
|
+
console.warn(`[sync] Skipping file due to hash failure: ${abs}`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
this.active.set(abs, { hash, size });
|
|
100
|
+
files.push({ path: wire, content });
|
|
101
|
+
}
|
|
102
|
+
if (this.autoConfigContent !== null) {
|
|
103
|
+
const configWithFileId = this.autoConfigContent;
|
|
104
|
+
const serializedConfig = await serializeConfig(this.autoConfigContent, configWithFileId.fileId);
|
|
105
|
+
const virtualContent = Buffer.from(serializedConfig, 'utf8').toString('base64');
|
|
106
|
+
files.push({ path: getVirtualConfigWirePath(), content: virtualContent });
|
|
107
|
+
debug('Added virtual auto.config.json to initial sync');
|
|
108
|
+
}
|
|
109
|
+
files.sort((a, b) => a.path.localeCompare(b.path));
|
|
110
|
+
return { files, directory: path.resolve(this.watchDir) };
|
|
111
|
+
};
|
|
112
|
+
const computeChanges = async (desired) => {
|
|
113
|
+
const outgoing = [];
|
|
114
|
+
for (const abs of desired) {
|
|
115
|
+
const hash = await md5(this.vfs, abs);
|
|
116
|
+
if (hash === null) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const size = await statSize(this.vfs, abs);
|
|
120
|
+
const prev = this.active.get(abs);
|
|
121
|
+
if (!prev || prev.hash !== hash || prev.size !== size) {
|
|
122
|
+
const content = await readBase64(this.vfs, abs);
|
|
123
|
+
if (content === null) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
this.active.set(abs, { hash, size });
|
|
127
|
+
const wire = toWirePath(abs, this.projectRoot);
|
|
128
|
+
outgoing.push({ event: prev ? 'change' : 'add', path: wire, content });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return outgoing;
|
|
132
|
+
};
|
|
133
|
+
const computeDeletions = (desired) => {
|
|
134
|
+
const toDelete = [];
|
|
135
|
+
for (const abs of Array.from(this.active.keys())) {
|
|
136
|
+
if (!desired.has(abs)) {
|
|
137
|
+
this.active.delete(abs);
|
|
138
|
+
const wire = toWirePath(abs, this.projectRoot);
|
|
139
|
+
toDelete.push({ event: 'delete', path: wire });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return toDelete;
|
|
143
|
+
};
|
|
144
|
+
const handleEmptyTransition = (desired, toDelete) => {
|
|
145
|
+
if (this.active.size === 0 && desired.size === 0 && toDelete.length > 0) {
|
|
146
|
+
this.io.emit('initial-sync', { files: [], directory: path.resolve(this.watchDir) });
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
};
|
|
151
|
+
const handleRehydration = (activeSizeBefore, outgoing, desired) => {
|
|
152
|
+
const allAdds = outgoing.length > 0 && outgoing.every((x) => x.event === 'add');
|
|
153
|
+
const rehydrateFromEmpty = activeSizeBefore === 0 && allAdds && desired.size === outgoing.length;
|
|
154
|
+
if (rehydrateFromEmpty) {
|
|
155
|
+
const files = outgoing
|
|
156
|
+
.map((o) => ({ path: o.path, content: o.content }))
|
|
157
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
158
|
+
debug('REHYDRATE: Sending initial-sync with %d files', files.length);
|
|
159
|
+
this.io.emit('initial-sync', { files, directory: path.resolve(this.watchDir) });
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
};
|
|
164
|
+
const rebuildAndBroadcast = async () => {
|
|
165
|
+
const desired = await compute();
|
|
166
|
+
const activeSizeBefore = this.active.size;
|
|
167
|
+
const outgoing = await computeChanges(desired);
|
|
168
|
+
const toDelete = computeDeletions(desired);
|
|
169
|
+
for (const ch of toDelete) {
|
|
170
|
+
this.io.emit('file-change', ch);
|
|
171
|
+
}
|
|
172
|
+
if (handleEmptyTransition(desired, toDelete))
|
|
173
|
+
return;
|
|
174
|
+
if (handleRehydration(activeSizeBefore, outgoing, desired))
|
|
175
|
+
return;
|
|
176
|
+
// otherwise: normal incremental flow
|
|
177
|
+
for (const ch of outgoing) {
|
|
178
|
+
this.io.emit('file-change', ch);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const scheduleRebuild = () => {
|
|
182
|
+
if (this.debounce)
|
|
183
|
+
clearTimeout(this.debounce);
|
|
184
|
+
this.debounce = setTimeout(() => {
|
|
185
|
+
this.debounce = null;
|
|
186
|
+
rebuildAndBroadcast().catch((err) => console.error('[sync] rebuild error', err));
|
|
187
|
+
}, 100);
|
|
188
|
+
};
|
|
189
|
+
const checkAndSyncAutoConfig = async () => {
|
|
190
|
+
try {
|
|
191
|
+
const autoConfigPath = await this.findAutoConfigFile();
|
|
192
|
+
if (autoConfigPath === null) {
|
|
193
|
+
if (this.autoConfigContent !== null) {
|
|
194
|
+
debug('Auto config removed, emitting delete');
|
|
195
|
+
const virtualPath = path.join(this.watchDir, 'auto.config.json');
|
|
196
|
+
const virtualWirePath = toWirePath(virtualPath, this.projectRoot);
|
|
197
|
+
this.io.emit('file-change', { event: 'delete', path: virtualWirePath });
|
|
198
|
+
this.autoConfigContent = null;
|
|
199
|
+
this.autoConfigHash = null;
|
|
200
|
+
this.providerEnvHash = null;
|
|
201
|
+
}
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const currentHash = await md5(this.vfs, autoConfigPath);
|
|
205
|
+
const currentProviderEnvHash = getProviderEnvHash();
|
|
206
|
+
const configChanged = currentHash !== null && currentHash !== this.autoConfigHash;
|
|
207
|
+
const envChanged = currentProviderEnvHash !== this.providerEnvHash;
|
|
208
|
+
if (!configChanged && !envChanged) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (configChanged) {
|
|
212
|
+
debug('Auto config changed, executing and syncing');
|
|
213
|
+
}
|
|
214
|
+
if (envChanged) {
|
|
215
|
+
debug('Provider environment changed, regenerating token');
|
|
216
|
+
}
|
|
217
|
+
const config = await loadAutoConfig(autoConfigPath);
|
|
218
|
+
const wasPresent = this.autoConfigContent !== null;
|
|
219
|
+
this.autoConfigContent = config;
|
|
220
|
+
this.autoConfigHash = currentHash;
|
|
221
|
+
this.providerEnvHash = currentProviderEnvHash;
|
|
222
|
+
const configWithFileId = config;
|
|
223
|
+
const serializedConfig = await serializeConfig(config, configWithFileId.fileId);
|
|
224
|
+
const virtualContent = Buffer.from(serializedConfig, 'utf8').toString('base64');
|
|
225
|
+
const virtualWirePath = getVirtualConfigWirePath();
|
|
226
|
+
const eventType = wasPresent ? 'change' : 'add';
|
|
227
|
+
this.io.emit('file-change', {
|
|
228
|
+
event: eventType,
|
|
229
|
+
path: virtualWirePath,
|
|
230
|
+
content: virtualContent,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.error('[sync] auto-config error:', error);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
const scheduleAutoConfigSync = () => {
|
|
238
|
+
if (this.autoConfigDebounce)
|
|
239
|
+
clearTimeout(this.autoConfigDebounce);
|
|
240
|
+
this.autoConfigDebounce = setTimeout(() => {
|
|
241
|
+
this.autoConfigDebounce = null;
|
|
242
|
+
checkAndSyncAutoConfig().catch((err) => console.error('[sync] auto-config error', err));
|
|
243
|
+
}, 100);
|
|
244
|
+
};
|
|
245
|
+
const isAutoConfigFile = (filePath) => {
|
|
246
|
+
const fileName = path.basename(filePath);
|
|
247
|
+
return fileName === 'auto.config.ts' || fileName === 'auto.config.js';
|
|
248
|
+
};
|
|
249
|
+
this.watcher = chokidar.watch([this.watchDir], {
|
|
250
|
+
ignoreInitial: true,
|
|
251
|
+
persistent: true,
|
|
252
|
+
ignored: ['**/node_modules/**', '**/.git/**', '**/.DS_Store'],
|
|
253
|
+
awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },
|
|
254
|
+
});
|
|
255
|
+
this.watcher
|
|
256
|
+
.on('add', (filePath) => {
|
|
257
|
+
scheduleRebuild();
|
|
258
|
+
if (isAutoConfigFile(filePath)) {
|
|
259
|
+
debug('Auto config file added: %s', filePath);
|
|
260
|
+
scheduleAutoConfigSync();
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
.on('change', (filePath) => {
|
|
264
|
+
scheduleRebuild();
|
|
265
|
+
if (isAutoConfigFile(filePath)) {
|
|
266
|
+
debug('Auto config file changed: %s', filePath);
|
|
267
|
+
scheduleAutoConfigSync();
|
|
268
|
+
}
|
|
269
|
+
})
|
|
270
|
+
.on('unlink', (filePath) => {
|
|
271
|
+
scheduleRebuild();
|
|
272
|
+
if (isAutoConfigFile(filePath)) {
|
|
273
|
+
debug('Auto config file removed: %s', filePath);
|
|
274
|
+
scheduleAutoConfigSync();
|
|
275
|
+
}
|
|
276
|
+
})
|
|
277
|
+
.on('addDir', (_dirPath) => {
|
|
278
|
+
scheduleRebuild();
|
|
279
|
+
})
|
|
280
|
+
.on('unlinkDir', (_dirPath) => {
|
|
281
|
+
scheduleRebuild();
|
|
282
|
+
})
|
|
283
|
+
.on('error', (err) => console.error('[watcher]', err));
|
|
284
|
+
// Initial auto.config.ts sync
|
|
285
|
+
scheduleAutoConfigSync();
|
|
286
|
+
this.io.on('connection', async (socket) => {
|
|
287
|
+
debug('New WebSocket client connected, preparing initial sync');
|
|
288
|
+
try {
|
|
289
|
+
// Create once, reuse while in-flight, and auto-clear on settle
|
|
290
|
+
let wasFresh = false;
|
|
291
|
+
if (!this.pendingInitialFiles) {
|
|
292
|
+
this.pendingInitialFiles = initialFiles().finally(() => {
|
|
293
|
+
this.pendingInitialFiles = null;
|
|
294
|
+
});
|
|
295
|
+
wasFresh = true;
|
|
296
|
+
}
|
|
297
|
+
const init = await this.pendingInitialFiles;
|
|
298
|
+
if (wasFresh) {
|
|
299
|
+
// Rebuild wire path cache for external mappings to support reconnection
|
|
300
|
+
const files = Array.from(this.active.keys()).map((abs) => ({ abs, projectRoot: this.projectRoot }));
|
|
301
|
+
rebuildWirePathCache(files);
|
|
302
|
+
}
|
|
303
|
+
socket.emit('initial-sync', init);
|
|
304
|
+
debug(`Sent ${wasFresh ? 'fresh' : 'cached'} initial-sync to client`);
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
console.error('[sync] initial-sync failed:', e);
|
|
308
|
+
this.pendingInitialFiles = null; // Clear on error
|
|
309
|
+
}
|
|
310
|
+
socket.on('client-file-change', async (msg) => {
|
|
311
|
+
const abs = fromWirePath(msg.path, this.projectRoot);
|
|
312
|
+
// Block client edits to the virtual auto.config.json (one-way TS -> JSON)
|
|
313
|
+
const virtualAbs = path.join(this.watchDir, 'auto.config.json');
|
|
314
|
+
if (path.resolve(abs) === path.resolve(virtualAbs)) {
|
|
315
|
+
debug('[sync] ignoring client attempt to modify virtual auto.config.json (%s)', msg.event);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
const allowedRoot = path.resolve(this.watchDir) + path.sep;
|
|
319
|
+
const normalizedAbs = path.resolve(abs);
|
|
320
|
+
if (!normalizedAbs.startsWith(allowedRoot)) {
|
|
321
|
+
console.warn('[sync] blocked client write outside watchDir:', {
|
|
322
|
+
requested: msg.path,
|
|
323
|
+
resolved: normalizedAbs,
|
|
324
|
+
});
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
if (msg.event === 'delete') {
|
|
329
|
+
await this.vfs.remove(normalizedAbs);
|
|
330
|
+
this.active.delete(normalizedAbs);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
const contentStr = msg.content;
|
|
334
|
+
if (contentStr === undefined) {
|
|
335
|
+
console.warn('[sync] client write: no content provided');
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const content = Buffer.from(contentStr, 'base64');
|
|
339
|
+
await this.vfs.write(normalizedAbs, new Uint8Array(content));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch (e) {
|
|
343
|
+
console.error('[sync] client-file-change failed:', e);
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
scheduleRebuild();
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
async findAutoConfigFile() {
|
|
352
|
+
const candidates = [path.join(this.watchDir, 'auto.config.ts'), path.join(this.watchDir, 'auto.config.js')];
|
|
353
|
+
for (const candidate of candidates) {
|
|
354
|
+
try {
|
|
355
|
+
const exists = await this.vfs.exists(candidate);
|
|
356
|
+
if (exists) {
|
|
357
|
+
return candidate;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
// Ignore errors and try next candidate
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
stop() {
|
|
367
|
+
if (this.watcher) {
|
|
368
|
+
void this.watcher.close();
|
|
369
|
+
}
|
|
370
|
+
if (this.debounce) {
|
|
371
|
+
clearTimeout(this.debounce);
|
|
372
|
+
}
|
|
373
|
+
if (this.autoConfigDebounce) {
|
|
374
|
+
clearTimeout(this.autoConfigDebounce);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"resolveSyncFileSet.d.ts","sourceRoot":"","sources":["../../../../../src/server/file-syncer/sync/resolveSyncFileSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAoD1D,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,wBAgD3G"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { collectBareImportsFromFiles } from '../discovery/bareImports.js';
|
|
2
|
+
import { nmRootsForBases, probeEntryDtsForPackagesFromRoots } from '../discovery/dts.js';
|
|
3
|
+
import { dirOf, logArray, pkgNameFromPath, scorePathForDedupe, uniq } from '../utils/path.js';
|
|
4
|
+
import createDebug from 'debug';
|
|
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
|
+
const debug = createDebug('auto-engineer:file-syncer:resolve');
|
|
13
|
+
/**
|
|
14
|
+
* Stable fallback node_modules roots derived from projectRoot and common monorepo layouts.
|
|
15
|
+
* Ensures deterministic probing even when there are no/very few source files.
|
|
16
|
+
*/
|
|
17
|
+
function stableCandidateNmRoots(projectRoot) {
|
|
18
|
+
const roots = new Set();
|
|
19
|
+
let cur = projectRoot.replace(/\\/g, '/');
|
|
20
|
+
// Ancestors (cap to 8)
|
|
21
|
+
for (let i = 0; i < 8; i++) {
|
|
22
|
+
roots.add(`${cur}/node_modules`);
|
|
23
|
+
const parent = cur.replace(/\/+$/, '').split('/').slice(0, -1).join('/') || '/';
|
|
24
|
+
if (parent === cur)
|
|
25
|
+
break;
|
|
26
|
+
cur = parent;
|
|
27
|
+
}
|
|
28
|
+
roots.add(`${projectRoot}/server/node_modules`);
|
|
29
|
+
return [...roots].map((p) => p.replace(/\/+/g, '/'));
|
|
30
|
+
}
|
|
31
|
+
function isNarrativeModule(mod) {
|
|
32
|
+
if (typeof mod !== 'object' || mod === null) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (!('getNarratives' in mod)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const modWithMethod = mod;
|
|
39
|
+
return typeof modWithMethod['getNarratives'] === 'function';
|
|
40
|
+
}
|
|
41
|
+
export async function resolveSyncFileSet(opts) {
|
|
42
|
+
const { vfs, watchDir, projectRoot } = opts;
|
|
43
|
+
try {
|
|
44
|
+
let flows = null;
|
|
45
|
+
try {
|
|
46
|
+
const flowPackage = '@auto-engineer/narrative';
|
|
47
|
+
const flowModule = await import(flowPackage);
|
|
48
|
+
if (isNarrativeModule(flowModule)) {
|
|
49
|
+
flows = await flowModule.getNarratives({ vfs, root: watchDir });
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
debug('[sync] getNarratives not found in @auto-engineer/narrative');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
debug('[sync] @auto-engineer/narrative not available, using fallback mode', e);
|
|
57
|
+
}
|
|
58
|
+
const files = flows?.vfsFiles ?? [];
|
|
59
|
+
const baseDirs = uniq([projectRoot, ...files.map(dirOf)]);
|
|
60
|
+
const dynamicRoots = nmRootsForBases(baseDirs);
|
|
61
|
+
const fallbackRoots = stableCandidateNmRoots(projectRoot);
|
|
62
|
+
const nmRoots = uniq([...dynamicRoots, ...fallbackRoots]);
|
|
63
|
+
// Gather externals from narrative graph + bare imports in source files
|
|
64
|
+
const externalsFromFlows = flows?.externals ?? [];
|
|
65
|
+
const extraPkgs = await collectBareImportsFromFiles(files, vfs);
|
|
66
|
+
const externals = Array.from(new Set([...externalsFromFlows, ...extraPkgs]));
|
|
67
|
+
const dtsFromGraph = flows !== null ? flattenPaths(flows.typings) : [];
|
|
68
|
+
const dtsFromProbe = await probeEntryDtsForPackagesFromRoots(vfs, nmRoots, externals);
|
|
69
|
+
// Merge & prefer non-.pnpm & shorter paths for stability
|
|
70
|
+
const allDts = Array.from(new Set([...dtsFromGraph, ...dtsFromProbe]));
|
|
71
|
+
allDts.sort((a, b) => {
|
|
72
|
+
const pa = a.includes('/.pnpm/') ? 1 : 0;
|
|
73
|
+
const pb = b.includes('/.pnpm/') ? 1 : 0;
|
|
74
|
+
if (pa !== pb)
|
|
75
|
+
return pa - pb;
|
|
76
|
+
return a.length - b.length;
|
|
77
|
+
});
|
|
78
|
+
const dts = dedupeTypeDefinitionsByPackage(allDts);
|
|
79
|
+
logArray('files', files);
|
|
80
|
+
logArray('dts', dts);
|
|
81
|
+
logArray('externals', externals);
|
|
82
|
+
return new Set([...files, ...dts]);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
console.error('[sync] resolveSyncFileSet FAILED:', err);
|
|
86
|
+
return new Set();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function dedupeTypeDefinitionsByPackage(allDts) {
|
|
90
|
+
// Keep only ONE entry .d.ts per npm package (choose best-scoring path)
|
|
91
|
+
const bestByPkg = new Map();
|
|
92
|
+
for (const p of allDts) {
|
|
93
|
+
const pkg = pkgNameFromPath(p);
|
|
94
|
+
if (pkg === null)
|
|
95
|
+
continue;
|
|
96
|
+
const prev = bestByPkg.get(pkg);
|
|
97
|
+
if (prev === undefined || scorePathForDedupe(p) < scorePathForDedupe(prev)) {
|
|
98
|
+
bestByPkg.set(pkg, p);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return [...bestByPkg.values()];
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=resolveSyncFileSet.js.map
|