@lobu/connector-sdk 7.1.0 → 8.0.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.
Files changed (59) hide show
  1. package/dist/connector-runtime.d.ts +10 -2
  2. package/dist/connector-runtime.d.ts.map +1 -1
  3. package/dist/connector-runtime.js +21 -1
  4. package/dist/connector-runtime.js.map +1 -1
  5. package/dist/connector-types.d.ts +0 -6
  6. package/dist/connector-types.d.ts.map +1 -1
  7. package/dist/connector-types.js +0 -7
  8. package/dist/connector-types.js.map +1 -1
  9. package/dist/file-source.d.ts +112 -0
  10. package/dist/file-source.d.ts.map +1 -0
  11. package/dist/file-source.js +40 -0
  12. package/dist/file-source.js.map +1 -0
  13. package/dist/index.d.ts +12 -9
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +7 -5
  16. package/dist/index.js.map +1 -1
  17. package/dist/sources/cache.d.ts +82 -0
  18. package/dist/sources/cache.d.ts.map +1 -0
  19. package/dist/sources/cache.js +169 -0
  20. package/dist/sources/cache.js.map +1 -0
  21. package/dist/sources/git-file-source.d.ts +33 -0
  22. package/dist/sources/git-file-source.d.ts.map +1 -0
  23. package/dist/sources/git-file-source.js +207 -0
  24. package/dist/sources/git-file-source.js.map +1 -0
  25. package/dist/sources/git-http.d.ts +48 -0
  26. package/dist/sources/git-http.d.ts.map +1 -0
  27. package/dist/sources/git-http.js +179 -0
  28. package/dist/sources/git-http.js.map +1 -0
  29. package/dist/sources/git-snapshot.d.ts +14 -0
  30. package/dist/sources/git-snapshot.d.ts.map +1 -0
  31. package/dist/sources/git-snapshot.js +96 -0
  32. package/dist/sources/git-snapshot.js.map +1 -0
  33. package/dist/sources/glob.d.ts +31 -0
  34. package/dist/sources/glob.d.ts.map +1 -0
  35. package/dist/sources/glob.js +129 -0
  36. package/dist/sources/glob.js.map +1 -0
  37. package/dist/sources/local-file-source.d.ts +29 -0
  38. package/dist/sources/local-file-source.d.ts.map +1 -0
  39. package/dist/sources/local-file-source.js +343 -0
  40. package/dist/sources/local-file-source.js.map +1 -0
  41. package/dist/sources/resolver.d.ts +6 -0
  42. package/dist/sources/resolver.d.ts.map +1 -0
  43. package/dist/sources/resolver.js +47 -0
  44. package/dist/sources/resolver.js.map +1 -0
  45. package/dist/sources/snapshot.d.ts +19 -0
  46. package/dist/sources/snapshot.d.ts.map +1 -0
  47. package/dist/sources/snapshot.js +91 -0
  48. package/dist/sources/snapshot.js.map +1 -0
  49. package/dist/sources/tarball-file-source.d.ts +28 -0
  50. package/dist/sources/tarball-file-source.d.ts.map +1 -0
  51. package/dist/sources/tarball-file-source.js +273 -0
  52. package/dist/sources/tarball-file-source.js.map +1 -0
  53. package/dist/types.d.ts +3 -65
  54. package/dist/types.d.ts.map +1 -1
  55. package/package.json +6 -3
  56. package/dist/event-taxonomy.d.ts +0 -3
  57. package/dist/event-taxonomy.d.ts.map +0 -1
  58. package/dist/event-taxonomy.js +0 -30
  59. package/dist/event-taxonomy.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-http.js","sourceRoot":"","sources":["../../src/sources/git-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type nodeFsType from 'node:fs';
2
+ import type { Snapshot } from '../file-source.js';
3
+ export interface GitSnapshotOptions {
4
+ exclude?: (relativePath: string) => boolean;
5
+ }
6
+ export declare class GitSnapshot implements Snapshot {
7
+ #private;
8
+ readonly ref: string;
9
+ constructor(dir: string, ref: string, fs: typeof nodeFsType, options?: GitSnapshotOptions);
10
+ walkFiles(glob: string): AsyncIterable<string>;
11
+ readFile(relativePath: string): Promise<Buffer>;
12
+ readText(relativePath: string): Promise<string>;
13
+ }
14
+ //# sourceMappingURL=git-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-snapshot.d.ts","sourceRoot":"","sources":["../../src/sources/git-snapshot.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,UAAU,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CAC7C;AAED,qBAAa,WAAY,YAAW,QAAQ;;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAMnB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,OAAO,UAAU,EACrB,OAAO,GAAE,kBAAuB;IAQ3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IAsB/C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW/C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuBtD"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * GitSnapshot — Snapshot backed by an immutable git commit OID.
3
+ *
4
+ * Unlike `DirectorySnapshot`, this snapshot reads file contents via
5
+ * `git.readBlob({oid, filepath})` against the captured commit, NOT from
6
+ * the on-disk working tree. That gives us true immutability: a later
7
+ * `fetch()` may move HEAD or rewrite the working tree, but blob OIDs for
8
+ * the captured commit stay reachable in the shallow clone's object DB.
9
+ *
10
+ * Caveats:
11
+ * - `walkFiles` walks the captured commit's tree (`git.walk` with a single
12
+ * `TREE({ref})`). Result: files-as-they-existed-at-the-commit, not
13
+ * files-as-they-are-on-disk-right-now.
14
+ * - `readFile` / `readText` extract blob bytes from the object DB.
15
+ * - Path-security primitives mirror `DirectorySnapshot` lexically (absolute
16
+ * paths rejected, `..` escapes rejected, exclude predicate enforced).
17
+ * - No realpath/symlink defense — git's object model has no symlinks-as-
18
+ * filesystem-pointers. A blob with mode 120000 IS the link contents, not
19
+ * a follow-able pointer.
20
+ */
21
+ import * as git from 'isomorphic-git';
22
+ import { isAbsolute, join, normalize, relative, sep } from 'node:path';
23
+ import { matchesGlob } from './glob.js';
24
+ export class GitSnapshot {
25
+ ref;
26
+ #dir;
27
+ #fs;
28
+ #exclude;
29
+ constructor(dir, ref, fs, options = {}) {
30
+ this.#dir = dir;
31
+ this.ref = ref;
32
+ this.#fs = fs;
33
+ this.#exclude = options.exclude ?? (() => false);
34
+ }
35
+ async *walkFiles(glob) {
36
+ const collected = [];
37
+ await git.walk({
38
+ fs: this.#fs,
39
+ dir: this.#dir,
40
+ trees: [git.TREE({ ref: this.ref })],
41
+ map: async (filepath, entries) => {
42
+ if (filepath === '.')
43
+ return undefined;
44
+ if (!entries)
45
+ return undefined;
46
+ const [entry] = entries;
47
+ if (!entry)
48
+ return undefined;
49
+ const type = await entry.type();
50
+ if (type !== 'blob')
51
+ return undefined;
52
+ const posix = filepath.split(sep).join('/');
53
+ if (this.#exclude(posix))
54
+ return undefined;
55
+ if (matchesGlob(posix, glob))
56
+ collected.push(posix);
57
+ return undefined;
58
+ },
59
+ });
60
+ for (const p of collected)
61
+ yield p;
62
+ }
63
+ async readFile(relativePath) {
64
+ const posix = this.#validateRel(relativePath);
65
+ const { blob } = await git.readBlob({
66
+ fs: this.#fs,
67
+ dir: this.#dir,
68
+ oid: this.ref,
69
+ filepath: posix,
70
+ });
71
+ return Buffer.from(blob);
72
+ }
73
+ async readText(relativePath) {
74
+ const buf = await this.readFile(relativePath);
75
+ return buf.toString('utf8');
76
+ }
77
+ #validateRel(relativePath) {
78
+ if (isAbsolute(relativePath)) {
79
+ throw new Error(`Snapshot.readFile: absolute paths are not allowed (${relativePath})`);
80
+ }
81
+ // Use a virtual root so `normalize`/`relative` behave consistently across
82
+ // platforms without touching the real fs.
83
+ const virtualRoot = '/__snap__';
84
+ const joined = normalize(join(virtualRoot, relativePath));
85
+ const rel = relative(virtualRoot, joined);
86
+ if (rel.startsWith('..') || isAbsolute(rel) || rel.split(sep).includes('..')) {
87
+ throw new Error(`Snapshot.readFile: path escapes snapshot root (${relativePath})`);
88
+ }
89
+ const posix = sep === '/' ? rel : rel.split(sep).join('/');
90
+ if (this.#exclude(posix)) {
91
+ throw new Error(`Snapshot.readFile: path is excluded from the snapshot (${relativePath})`);
92
+ }
93
+ return posix;
94
+ }
95
+ }
96
+ //# sourceMappingURL=git-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-snapshot.js","sourceRoot":"","sources":["../../src/sources/git-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Minimal glob matcher + recursive directory walk.
3
+ *
4
+ * Supports the subset of glob syntax connectors actually need:
5
+ * - `*` matches any run of characters except `/`
6
+ * - `**` matches any run of characters including `/`
7
+ * - `?` matches exactly one character except `/`
8
+ * - Literal `.` `/` `_` `-` segments
9
+ *
10
+ * No brace-expansion, no `!` negation, no `[ ]` character classes. If a
11
+ * connector needs more, it can iterate `walkFiles("**\/*")` and filter in
12
+ * its own code — keeping the SDK surface small.
13
+ */
14
+ /**
15
+ * Recursive walk yielding POSIX-style relative paths (forward-slash).
16
+ * Skips dot-directories of the cache itself (`.lobu-cache`) but otherwise
17
+ * includes hidden files — git's `.git/` is excluded by callers that need
18
+ * to (git source uses a separate snapshot dir without `.git`).
19
+ */
20
+ export declare function walkDirectoryRelative(root: string): AsyncIterable<string>;
21
+ /**
22
+ * Compile a glob to a RegExp. Anchored on both ends.
23
+ *
24
+ * Implementation note: we walk the glob char-by-char rather than splitting on
25
+ * `*` so we can distinguish `*` from `**` without ambiguity, and so literal
26
+ * regex metacharacters get escaped exactly once.
27
+ */
28
+ export declare function globToRegExp(glob: string): RegExp;
29
+ /** Test a POSIX-style relative path against `glob`. */
30
+ export declare function matchesGlob(relativePath: string, glob: string): boolean;
31
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/sources/glob.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH;;;;;GAKG;AACH,wBAAuB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAwBhF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkDjD;AAYD,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKvE"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Minimal glob matcher + recursive directory walk.
3
+ *
4
+ * Supports the subset of glob syntax connectors actually need:
5
+ * - `*` matches any run of characters except `/`
6
+ * - `**` matches any run of characters including `/`
7
+ * - `?` matches exactly one character except `/`
8
+ * - Literal `.` `/` `_` `-` segments
9
+ *
10
+ * No brace-expansion, no `!` negation, no `[ ]` character classes. If a
11
+ * connector needs more, it can iterate `walkFiles("**\/*")` and filter in
12
+ * its own code — keeping the SDK surface small.
13
+ */
14
+ import { readdir } from 'node:fs/promises';
15
+ import { join, posix, sep } from 'node:path';
16
+ /**
17
+ * Recursive walk yielding POSIX-style relative paths (forward-slash).
18
+ * Skips dot-directories of the cache itself (`.lobu-cache`) but otherwise
19
+ * includes hidden files — git's `.git/` is excluded by callers that need
20
+ * to (git source uses a separate snapshot dir without `.git`).
21
+ */
22
+ export async function* walkDirectoryRelative(root) {
23
+ async function* walk(dir, prefix) {
24
+ let entries;
25
+ try {
26
+ entries = await readdir(dir, { withFileTypes: true });
27
+ }
28
+ catch (err) {
29
+ if (err.code === 'ENOENT')
30
+ return;
31
+ throw err;
32
+ }
33
+ // Stable order — deterministic walk for tests + manifests.
34
+ entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
35
+ for (const entry of entries) {
36
+ const childPosix = prefix ? `${prefix}/${entry.name}` : entry.name;
37
+ const childAbs = join(dir, entry.name);
38
+ if (entry.isDirectory()) {
39
+ yield* walk(childAbs, childPosix);
40
+ }
41
+ else if (entry.isFile()) {
42
+ yield childPosix;
43
+ }
44
+ // Symlinks/sockets/etc. are skipped on purpose — connectors don't
45
+ // need them and they're a common attack vector through extracted tarballs.
46
+ }
47
+ }
48
+ yield* walk(root, '');
49
+ }
50
+ /**
51
+ * Compile a glob to a RegExp. Anchored on both ends.
52
+ *
53
+ * Implementation note: we walk the glob char-by-char rather than splitting on
54
+ * `*` so we can distinguish `*` from `**` without ambiguity, and so literal
55
+ * regex metacharacters get escaped exactly once.
56
+ */
57
+ export function globToRegExp(glob) {
58
+ let re = '^';
59
+ for (let i = 0; i < glob.length; i++) {
60
+ const c = glob[i];
61
+ if (c === '*') {
62
+ if (glob[i + 1] === '*') {
63
+ // `**` — match any run (including `/`). When followed by `/`, the
64
+ // whole `**/` consumes zero or more directory segments so e.g.
65
+ // `**/*.md` matches `foo.md` AND `a/b/foo.md`. Same on the trailing
66
+ // boundary so `foo/**` matches `foo` itself.
67
+ if (glob[i + 2] === '/') {
68
+ re += '(?:.*/)?';
69
+ i += 2; // skip `**` and the slash
70
+ }
71
+ else if (i === 0 && glob[i + 2] === undefined) {
72
+ // bare `**` — match anything (including empty).
73
+ re += '.*';
74
+ i++;
75
+ }
76
+ else {
77
+ re += '.*';
78
+ i++;
79
+ }
80
+ }
81
+ else {
82
+ // `*` — match any run not containing `/`.
83
+ re += '[^/]*';
84
+ }
85
+ }
86
+ else if (c === '?') {
87
+ re += '[^/]';
88
+ }
89
+ else if (c === '/') {
90
+ re += '/';
91
+ }
92
+ else if (c === '.' ||
93
+ c === '(' ||
94
+ c === ')' ||
95
+ c === '+' ||
96
+ c === '|' ||
97
+ c === '^' ||
98
+ c === '$' ||
99
+ c === '{' ||
100
+ c === '}' ||
101
+ c === '[' ||
102
+ c === ']' ||
103
+ c === '\\') {
104
+ re += `\\${c}`;
105
+ }
106
+ else {
107
+ re += c;
108
+ }
109
+ }
110
+ re += '$';
111
+ return new RegExp(re);
112
+ }
113
+ const _globCache = new Map();
114
+ function compileCached(glob) {
115
+ let r = _globCache.get(glob);
116
+ if (!r) {
117
+ r = globToRegExp(glob);
118
+ _globCache.set(glob, r);
119
+ }
120
+ return r;
121
+ }
122
+ /** Test a POSIX-style relative path against `glob`. */
123
+ export function matchesGlob(relativePath, glob) {
124
+ // Normalize windows separators if any leaked in. Callers should pass
125
+ // POSIX already (walkDirectoryRelative emits POSIX) but defensively:
126
+ const norm = sep === posix.sep ? relativePath : relativePath.split(sep).join(posix.sep);
127
+ return compileCached(glob).test(norm);
128
+ }
129
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/sources/glob.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,qBAAqB,CAAC,IAAY;IACvD,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAW,EAAE,MAAc;QAC9C,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO;YAC7D,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,2DAA2D;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,MAAM,UAAU,CAAC;YACnB,CAAC;YACD,kEAAkE;YAClE,2EAA2E;QAC7E,CAAC;IACH,CAAC;IACD,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,kEAAkE;gBAClE,+DAA+D;gBAC/D,oEAAoE;gBACpE,6CAA6C;gBAC7C,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,EAAE,IAAI,UAAU,CAAC;oBACjB,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B;gBACpC,CAAC;qBAAM,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBAChD,gDAAgD;oBAChD,EAAE,IAAI,IAAI,CAAC;oBACX,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,EAAE,IAAI,IAAI,CAAC;oBACX,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,0CAA0C;gBAC1C,EAAE,IAAI,OAAO,CAAC;YAChB,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,EAAE,IAAI,MAAM,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,EAAE,IAAI,GAAG,CAAC;QACZ,CAAC;aAAM,IACL,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,GAAG;YACT,CAAC,KAAK,IAAI,EACV,CAAC;YACD,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,EAAE,IAAI,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IACD,EAAE,IAAI,GAAG,CAAC;IACV,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC7C,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACvB,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,IAAY;IAC5D,qEAAqE;IACrE,qEAAqE;IACrE,MAAM,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxF,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * LocalFileSource — adapter over a local directory.
3
+ *
4
+ * URI shape: `file:///absolute/path/`
5
+ *
6
+ * - `fetch()` stream-copies the source tree into a per-ref cache dir
7
+ * (`${WORKSPACE_DIR}/.lobu-cache/sources/<uri-hash>/refs/<ref>/`),
8
+ * sealing each file's sha256 during the copy so the manifest's hashes
9
+ * record exactly the bytes that landed in the cache. The Snapshot
10
+ * reads from that per-ref dir — never the live source — so
11
+ * `snapshot.ref` matches `sha256(snapshot.readFile(path))` for the
12
+ * bytes captured at fetch time, even under concurrent writes against
13
+ * the source. See `Snapshot` in `file-source.ts` for the honest
14
+ * same-UID mutability contract.
15
+ * - `ref` is the canonical manifest hash (sha256 of sorted `(path, sha256)`
16
+ * pairs).
17
+ * - `diffSinceRef(prevRef)`: re-walks the live directory, builds a fresh
18
+ * manifest, and diffs it against the stored per-ref manifest that
19
+ * matches `prevRef`. If no stored manifest matches (cache was cleared
20
+ * between runs), the diff treats every current file as `added`.
21
+ */
22
+ import type { FileDelta, FileSystemSource, Snapshot } from '../file-source.js';
23
+ export declare class LocalFileSource implements FileSystemSource {
24
+ #private;
25
+ constructor(uri: string);
26
+ fetch(): Promise<Snapshot>;
27
+ diffSinceRef(prevRef: string): Promise<FileDelta>;
28
+ }
29
+ //# sourceMappingURL=local-file-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-file-source.d.ts","sourceRoot":"","sources":["../../src/sources/local-file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAgBH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAmB/E,qBAAa,eAAgB,YAAW,gBAAgB;;gBAkB1C,GAAG,EAAE,MAAM;IASvB,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;IAwF1B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAoBlD"}