@agent-native/core 0.1.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/dist/adapters/firestore/config.d.ts +20 -0
- package/dist/adapters/firestore/config.d.ts.map +1 -0
- package/dist/adapters/firestore/config.js +50 -0
- package/dist/adapters/firestore/config.js.map +1 -0
- package/dist/adapters/firestore/index.d.ts +4 -0
- package/dist/adapters/firestore/index.d.ts.map +1 -0
- package/dist/adapters/firestore/index.js +4 -0
- package/dist/adapters/firestore/index.js.map +1 -0
- package/dist/adapters/firestore/merge.d.ts +21 -0
- package/dist/adapters/firestore/merge.d.ts.map +1 -0
- package/dist/adapters/firestore/merge.js +132 -0
- package/dist/adapters/firestore/merge.js.map +1 -0
- package/dist/adapters/firestore/sync.d.ts +91 -0
- package/dist/adapters/firestore/sync.d.ts.map +1 -0
- package/dist/adapters/firestore/sync.js +340 -0
- package/dist/adapters/firestore/sync.js.map +1 -0
- package/dist/cli/create.d.ts +5 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +87 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +27 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/fusion-chat.d.ts +27 -0
- package/dist/client/fusion-chat.d.ts.map +1 -0
- package/dist/client/fusion-chat.js +19 -0
- package/dist/client/fusion-chat.js.map +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/use-file-watcher.d.ts +23 -0
- package/dist/client/use-file-watcher.d.ts.map +1 -0
- package/dist/client/use-file-watcher.js +40 -0
- package/dist/client/use-file-watcher.js.map +1 -0
- package/dist/client/use-fusion-chat.d.ts +14 -0
- package/dist/client/use-fusion-chat.d.ts.map +1 -0
- package/dist/client/use-fusion-chat.js +29 -0
- package/dist/client/use-fusion-chat.js.map +1 -0
- package/dist/client/utils.d.ts +4 -0
- package/dist/client/utils.d.ts.map +1 -0
- package/dist/client/utils.js +7 -0
- package/dist/client/utils.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/index.d.ts +3 -0
- package/dist/scripts/index.d.ts.map +1 -0
- package/dist/scripts/index.js +3 -0
- package/dist/scripts/index.js.map +1 -0
- package/dist/scripts/runner.d.ts +16 -0
- package/dist/scripts/runner.d.ts.map +1 -0
- package/dist/scripts/runner.js +42 -0
- package/dist/scripts/runner.js.map +1 -0
- package/dist/scripts/utils.d.ts +30 -0
- package/dist/scripts/utils.d.ts.map +1 -0
- package/dist/scripts/utils.js +88 -0
- package/dist/scripts/utils.js.map +1 -0
- package/dist/server/create-server.d.ts +21 -0
- package/dist/server/create-server.d.ts.map +1 -0
- package/dist/server/create-server.js +27 -0
- package/dist/server/create-server.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/production.d.ts +18 -0
- package/dist/server/production.d.ts.map +1 -0
- package/dist/server/production.js +37 -0
- package/dist/server/production.js.map +1 -0
- package/dist/server/sse.d.ts +30 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +44 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/shared/fusion-chat.d.ts +39 -0
- package/dist/shared/fusion-chat.d.ts.map +1 -0
- package/dist/shared/fusion-chat.js +52 -0
- package/dist/shared/fusion-chat.js.map +1 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +2 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/tailwind.preset.d.ts +13 -0
- package/dist/tailwind.preset.d.ts.map +1 -0
- package/dist/tailwind.preset.js +92 -0
- package/dist/tailwind.preset.js.map +1 -0
- package/dist/vite/client.d.ts +24 -0
- package/dist/vite/client.d.ts.map +1 -0
- package/dist/vite/client.js +52 -0
- package/dist/vite/client.js.map +1 -0
- package/dist/vite/express-plugin.d.ts +11 -0
- package/dist/vite/express-plugin.d.ts.map +1 -0
- package/dist/vite/express-plugin.js +22 -0
- package/dist/vite/express-plugin.js.map +1 -0
- package/dist/vite/index.d.ts +4 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +4 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/server.d.ts +21 -0
- package/dist/vite/server.d.ts.map +1 -0
- package/dist/vite/server.js +68 -0
- package/dist/vite/server.js.map +1 -0
- package/package.json +82 -0
- package/src/templates/default/.env.example +5 -0
- package/src/templates/default/.prettierrc +5 -0
- package/src/templates/default/AGENTS.md +65 -0
- package/src/templates/default/_gitignore +29 -0
- package/src/templates/default/client/App.tsx +54 -0
- package/src/templates/default/client/global.css +72 -0
- package/src/templates/default/client/lib/utils.ts +1 -0
- package/src/templates/default/client/vite-env.d.ts +1 -0
- package/src/templates/default/components.json +20 -0
- package/src/templates/default/index.html +14 -0
- package/src/templates/default/package.json +46 -0
- package/src/templates/default/postcss.config.js +6 -0
- package/src/templates/default/scripts/hello.ts +20 -0
- package/src/templates/default/scripts/run.ts +9 -0
- package/src/templates/default/server/index.ts +18 -0
- package/src/templates/default/server/node-build.ts +4 -0
- package/src/templates/default/shared/api.ts +6 -0
- package/src/templates/default/tailwind.config.ts +7 -0
- package/src/templates/default/tsconfig.json +3 -0
- package/src/templates/default/vite.config.server.ts +3 -0
- package/src/templates/default/vite.config.ts +3 -0
- package/tsconfig.base.json +41 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface SyncConfig {
|
|
2
|
+
syncFilePatterns: string[];
|
|
3
|
+
privateSyncFilePatterns: string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Load sync configuration from a JSON file.
|
|
7
|
+
* Returns empty patterns if the file doesn't exist or is malformed.
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadSyncConfig(configPath?: string): SyncConfig;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a file path matches the configured sync patterns.
|
|
12
|
+
* A file matches if it matches at least one positive pattern and no negation patterns.
|
|
13
|
+
*/
|
|
14
|
+
export declare function shouldSyncFile(filePath: string, patterns: string[]): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Generate a deterministic Firestore doc ID from a file path.
|
|
17
|
+
* Prefixed with the app ID, path separators replaced with `__`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getDocId(appId: string, filePath: string): string;
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/adapters/firestore/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,uBAAuB,EAAE,MAAM,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAiB9D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAiB5E;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { minimatch } from "minimatch";
|
|
4
|
+
/**
|
|
5
|
+
* Load sync configuration from a JSON file.
|
|
6
|
+
* Returns empty patterns if the file doesn't exist or is malformed.
|
|
7
|
+
*/
|
|
8
|
+
export function loadSyncConfig(configPath) {
|
|
9
|
+
const resolved = configPath ?? path.resolve(process.cwd(), "content/sync-config.json");
|
|
10
|
+
try {
|
|
11
|
+
const raw = fs.readFileSync(resolved, "utf-8");
|
|
12
|
+
const parsed = JSON.parse(raw);
|
|
13
|
+
return {
|
|
14
|
+
syncFilePatterns: Array.isArray(parsed.syncFilePatterns)
|
|
15
|
+
? parsed.syncFilePatterns
|
|
16
|
+
: [],
|
|
17
|
+
privateSyncFilePatterns: Array.isArray(parsed.privateSyncFilePatterns)
|
|
18
|
+
? parsed.privateSyncFilePatterns
|
|
19
|
+
: [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return { syncFilePatterns: [], privateSyncFilePatterns: [] };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if a file path matches the configured sync patterns.
|
|
28
|
+
* A file matches if it matches at least one positive pattern and no negation patterns.
|
|
29
|
+
*/
|
|
30
|
+
export function shouldSyncFile(filePath, patterns) {
|
|
31
|
+
if (patterns.length === 0)
|
|
32
|
+
return false;
|
|
33
|
+
const negations = patterns.filter((p) => p.startsWith("!"));
|
|
34
|
+
const positives = patterns.filter((p) => !p.startsWith("!"));
|
|
35
|
+
const matchesPositive = positives.some((p) => minimatch(filePath, p, { dot: true }));
|
|
36
|
+
if (!matchesPositive)
|
|
37
|
+
return false;
|
|
38
|
+
const matchesNegation = negations.some((p) => minimatch(filePath, p.slice(1), { dot: true }));
|
|
39
|
+
if (matchesNegation)
|
|
40
|
+
return false;
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Generate a deterministic Firestore doc ID from a file path.
|
|
45
|
+
* Prefixed with the app ID, path separators replaced with `__`.
|
|
46
|
+
*/
|
|
47
|
+
export function getDocId(appId, filePath) {
|
|
48
|
+
return `${appId}__${filePath.replace(/\//g, "__")}`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/adapters/firestore/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAAmB;IAChD,MAAM,QAAQ,GACZ,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO;YACL,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACtD,CAAC,CAAC,MAAM,CAAC,gBAAgB;gBACzB,CAAC,CAAC,EAAE;YACN,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC;gBACpE,CAAC,CAAC,MAAM,CAAC,uBAAuB;gBAChC,CAAC,CAAC,EAAE;SACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,uBAAuB,EAAE,EAAE,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,QAAkB;IACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3C,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CACtC,CAAC;IACF,IAAI,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3C,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;IACF,IAAI,eAAe;QAAE,OAAO,KAAK,CAAC;IAElC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,QAAgB;IACtD,OAAO,GAAG,KAAK,KAAK,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/firestore/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,cAAc,EACd,cAAc,EACd,QAAQ,EACR,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/firestore/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwC,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,cAAc,EACd,cAAc,EACd,QAAQ,GAET,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple three-way line-level merge.
|
|
3
|
+
*
|
|
4
|
+
* Given a base version, a local version, and a remote version,
|
|
5
|
+
* attempts to merge non-overlapping changes automatically.
|
|
6
|
+
*/
|
|
7
|
+
export interface MergeResult {
|
|
8
|
+
merged: string | null;
|
|
9
|
+
success: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Three-way merge using line-level diff.
|
|
13
|
+
*
|
|
14
|
+
* Algorithm:
|
|
15
|
+
* 1. Split base, local, remote into lines
|
|
16
|
+
* 2. Compute change hunks for each side relative to base
|
|
17
|
+
* 3. If hunks don't overlap, apply both sets of changes
|
|
18
|
+
* 4. If hunks overlap, return failure (conflict)
|
|
19
|
+
*/
|
|
20
|
+
export declare function threeWayMerge(base: string, local: string, remote: string): MergeResult;
|
|
21
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/adapters/firestore/merge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,WAAW,CAiCb"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple three-way line-level merge.
|
|
3
|
+
*
|
|
4
|
+
* Given a base version, a local version, and a remote version,
|
|
5
|
+
* attempts to merge non-overlapping changes automatically.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Three-way merge using line-level diff.
|
|
9
|
+
*
|
|
10
|
+
* Algorithm:
|
|
11
|
+
* 1. Split base, local, remote into lines
|
|
12
|
+
* 2. Compute change hunks for each side relative to base
|
|
13
|
+
* 3. If hunks don't overlap, apply both sets of changes
|
|
14
|
+
* 4. If hunks overlap, return failure (conflict)
|
|
15
|
+
*/
|
|
16
|
+
export function threeWayMerge(base, local, remote) {
|
|
17
|
+
// Quick wins
|
|
18
|
+
if (local === remote)
|
|
19
|
+
return { merged: local, success: true };
|
|
20
|
+
if (local === base)
|
|
21
|
+
return { merged: remote, success: true };
|
|
22
|
+
if (remote === base)
|
|
23
|
+
return { merged: local, success: true };
|
|
24
|
+
const baseLines = base.split("\n");
|
|
25
|
+
const localLines = local.split("\n");
|
|
26
|
+
const remoteLines = remote.split("\n");
|
|
27
|
+
const localHunks = computeHunks(baseLines, localLines);
|
|
28
|
+
const remoteHunks = computeHunks(baseLines, remoteLines);
|
|
29
|
+
if (hunksOverlap(localHunks, remoteHunks)) {
|
|
30
|
+
return { merged: null, success: false };
|
|
31
|
+
}
|
|
32
|
+
// Apply both sets of changes to base (sorted descending so indices stay valid)
|
|
33
|
+
const allHunks = [
|
|
34
|
+
...localHunks.map((h) => ({ ...h, source: "local" })),
|
|
35
|
+
...remoteHunks.map((h) => ({ ...h, source: "remote" })),
|
|
36
|
+
].sort((a, b) => b.baseStart - a.baseStart);
|
|
37
|
+
const result = [...baseLines];
|
|
38
|
+
for (const hunk of allHunks) {
|
|
39
|
+
const replacement = hunk.source === "local"
|
|
40
|
+
? localLines.slice(hunk.newStart, hunk.newStart + hunk.newLength)
|
|
41
|
+
: remoteLines.slice(hunk.newStart, hunk.newStart + hunk.newLength);
|
|
42
|
+
result.splice(hunk.baseStart, hunk.baseLength, ...replacement);
|
|
43
|
+
}
|
|
44
|
+
return { merged: result.join("\n"), success: true };
|
|
45
|
+
}
|
|
46
|
+
function computeHunks(base, modified) {
|
|
47
|
+
const lcs = longestCommonSubsequence(base, modified);
|
|
48
|
+
const hunks = [];
|
|
49
|
+
let bi = 0;
|
|
50
|
+
let mi = 0;
|
|
51
|
+
let li = 0;
|
|
52
|
+
while (bi < base.length || mi < modified.length) {
|
|
53
|
+
if (li < lcs.length &&
|
|
54
|
+
bi < base.length &&
|
|
55
|
+
mi < modified.length &&
|
|
56
|
+
base[bi] === lcs[li] &&
|
|
57
|
+
modified[mi] === lcs[li]) {
|
|
58
|
+
bi++;
|
|
59
|
+
mi++;
|
|
60
|
+
li++;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const baseStart = bi;
|
|
64
|
+
const modStart = mi;
|
|
65
|
+
while (bi < base.length &&
|
|
66
|
+
(li >= lcs.length || base[bi] !== lcs[li])) {
|
|
67
|
+
bi++;
|
|
68
|
+
}
|
|
69
|
+
while (mi < modified.length &&
|
|
70
|
+
(li >= lcs.length || modified[mi] !== lcs[li])) {
|
|
71
|
+
mi++;
|
|
72
|
+
}
|
|
73
|
+
if (bi !== baseStart || mi !== modStart) {
|
|
74
|
+
hunks.push({
|
|
75
|
+
baseStart,
|
|
76
|
+
baseLength: bi - baseStart,
|
|
77
|
+
newStart: modStart,
|
|
78
|
+
newLength: mi - modStart,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return hunks;
|
|
84
|
+
}
|
|
85
|
+
function hunksOverlap(a, b) {
|
|
86
|
+
for (const ha of a) {
|
|
87
|
+
for (const hb of b) {
|
|
88
|
+
const aEnd = ha.baseStart + ha.baseLength;
|
|
89
|
+
const bEnd = hb.baseStart + hb.baseLength;
|
|
90
|
+
if (ha.baseStart < bEnd && hb.baseStart < aEnd) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
function longestCommonSubsequence(a, b) {
|
|
98
|
+
const m = a.length;
|
|
99
|
+
const n = b.length;
|
|
100
|
+
// For very large files, bail out to avoid memory issues
|
|
101
|
+
if (m * n > 10_000_000)
|
|
102
|
+
return [];
|
|
103
|
+
const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
|
|
104
|
+
for (let i = 1; i <= m; i++) {
|
|
105
|
+
for (let j = 1; j <= n; j++) {
|
|
106
|
+
if (a[i - 1] === b[j - 1]) {
|
|
107
|
+
dp[i][j] = dp[i - 1][j - 1] + 1;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const result = [];
|
|
115
|
+
let i = m;
|
|
116
|
+
let j = n;
|
|
117
|
+
while (i > 0 && j > 0) {
|
|
118
|
+
if (a[i - 1] === b[j - 1]) {
|
|
119
|
+
result.unshift(a[i - 1]);
|
|
120
|
+
i--;
|
|
121
|
+
j--;
|
|
122
|
+
}
|
|
123
|
+
else if (dp[i - 1][j] > dp[i][j - 1]) {
|
|
124
|
+
i--;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
j--;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/adapters/firestore/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
export interface FileSyncOptions {
|
|
3
|
+
/** Unique app identifier (e.g. "content-workspace") */
|
|
4
|
+
appId: string;
|
|
5
|
+
/** Default owner ID for shared sync channel */
|
|
6
|
+
ownerId: string;
|
|
7
|
+
/** Root directory for synced content */
|
|
8
|
+
contentRoot: string;
|
|
9
|
+
/** Firestore collection reference for app files */
|
|
10
|
+
getFileCollection: () => FirestoreCollection;
|
|
11
|
+
/** Path to sync-config.json. Default: <contentRoot>/sync-config.json */
|
|
12
|
+
syncConfigPath?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Minimal Firestore collection interface (avoids hard firebase-admin dependency) */
|
|
15
|
+
export interface FirestoreCollection {
|
|
16
|
+
doc(id: string): FirestoreDocRef;
|
|
17
|
+
where(field: string, op: string, value: any): FirestoreQuery;
|
|
18
|
+
}
|
|
19
|
+
export interface FirestoreDocRef {
|
|
20
|
+
get(): Promise<FirestoreDocSnapshot>;
|
|
21
|
+
set(data: any, options?: {
|
|
22
|
+
merge?: boolean;
|
|
23
|
+
}): Promise<any>;
|
|
24
|
+
delete(): Promise<any>;
|
|
25
|
+
collection(name: string): FirestoreCollection;
|
|
26
|
+
}
|
|
27
|
+
export interface FirestoreQuery {
|
|
28
|
+
where(field: string, op: string, value: any): FirestoreQuery;
|
|
29
|
+
get(): Promise<FirestoreQuerySnapshot>;
|
|
30
|
+
onSnapshot(onNext: (snapshot: FirestoreQuerySnapshot) => void, onError: (error: any) => void): () => void;
|
|
31
|
+
}
|
|
32
|
+
export interface FirestoreDocSnapshot {
|
|
33
|
+
exists: boolean;
|
|
34
|
+
id: string;
|
|
35
|
+
data(): any;
|
|
36
|
+
}
|
|
37
|
+
export interface FirestoreQuerySnapshot {
|
|
38
|
+
docs: FirestoreDocSnapshot[];
|
|
39
|
+
size: number;
|
|
40
|
+
docChanges(): Array<{
|
|
41
|
+
type: "added" | "modified" | "removed";
|
|
42
|
+
doc: FirestoreDocSnapshot;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
export type SyncEvent = {
|
|
46
|
+
type: "conflict-resolved";
|
|
47
|
+
path: string;
|
|
48
|
+
strategy: "auto-merge" | "local-wins" | "remote-wins";
|
|
49
|
+
} | {
|
|
50
|
+
type: "conflict-needs-llm";
|
|
51
|
+
path: string;
|
|
52
|
+
localSnippet: string;
|
|
53
|
+
remoteSnippet: string;
|
|
54
|
+
} | {
|
|
55
|
+
type: "conflict-saved";
|
|
56
|
+
path: string;
|
|
57
|
+
conflictFile: string;
|
|
58
|
+
};
|
|
59
|
+
export declare class FileSync {
|
|
60
|
+
private options;
|
|
61
|
+
private recentlyPulled;
|
|
62
|
+
private recentlyPushed;
|
|
63
|
+
private lastSyncedContent;
|
|
64
|
+
private sharedSyncInitialized;
|
|
65
|
+
private privateSyncInitialized;
|
|
66
|
+
private purgeTimer;
|
|
67
|
+
readonly syncEvents: EventEmitter<[never]>;
|
|
68
|
+
constructor(options: FileSyncOptions);
|
|
69
|
+
/**
|
|
70
|
+
* Initialize the shared sync channel.
|
|
71
|
+
* Runs startup sync, starts Firestore listener, and starts file watcher.
|
|
72
|
+
*/
|
|
73
|
+
initFileSync(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Initialize the private sync channel using a per-user UID.
|
|
76
|
+
*/
|
|
77
|
+
initPrivateSync(userUid: string): Promise<void>;
|
|
78
|
+
private emitSyncEvent;
|
|
79
|
+
private markRecent;
|
|
80
|
+
private wasRecent;
|
|
81
|
+
private startPurgeTimer;
|
|
82
|
+
private readLocalFile;
|
|
83
|
+
private writeSyncedFile;
|
|
84
|
+
private docId;
|
|
85
|
+
private collection;
|
|
86
|
+
private resolveConflict;
|
|
87
|
+
private initStartupSync;
|
|
88
|
+
private startFirestoreListener;
|
|
89
|
+
private startFileWatcher;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/adapters/firestore/sync.ts"],"names":[],"mappings":"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"}
|