@byfungsi/fun 0.2.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/ffi.d.ts ADDED
@@ -0,0 +1,92 @@
1
+ /**
2
+ * FFI bindings for the Funcode native library
3
+ */
4
+ import { FFIType } from "bun:ffi";
5
+ interface PatchStatsRaw {
6
+ additions: number;
7
+ deletions: number;
8
+ hunks: number;
9
+ isEmpty: boolean;
10
+ }
11
+ export declare const ffi: {
12
+ readonly lib: import("bun:ffi").Library<{
13
+ readonly fun_free: {
14
+ readonly args: readonly [FFIType.ptr, FFIType.uint64_t];
15
+ readonly returns: FFIType.void;
16
+ };
17
+ readonly fun_result_free: {
18
+ readonly args: readonly [FFIType.ptr];
19
+ readonly returns: FFIType.void;
20
+ };
21
+ readonly fun_version: {
22
+ readonly args: readonly [];
23
+ readonly returns: FFIType.cstring;
24
+ };
25
+ readonly fun_hash: {
26
+ readonly args: readonly [FFIType.ptr, FFIType.uint64_t, FFIType.ptr];
27
+ readonly returns: FFIType.void;
28
+ };
29
+ readonly fun_hash_to_hex: {
30
+ readonly args: readonly [FFIType.ptr, FFIType.ptr];
31
+ readonly returns: FFIType.void;
32
+ };
33
+ readonly fun_patch_generate: {
34
+ readonly args: readonly [FFIType.ptr, FFIType.uint64_t, FFIType.ptr, FFIType.uint64_t, FFIType.cstring];
35
+ readonly returns: FFIType.ptr;
36
+ };
37
+ readonly fun_patch_stats: {
38
+ readonly args: readonly [FFIType.ptr, FFIType.uint64_t, FFIType.ptr, FFIType.uint64_t];
39
+ readonly returns: FFIType.ptr;
40
+ };
41
+ readonly fun_patch_apply: {
42
+ readonly args: readonly [FFIType.ptr, FFIType.uint64_t, FFIType.ptr, FFIType.uint64_t];
43
+ readonly returns: FFIType.ptr;
44
+ };
45
+ readonly fun_session_create: {
46
+ readonly args: readonly [FFIType.cstring];
47
+ readonly returns: FFIType.ptr;
48
+ };
49
+ readonly fun_session_load: {
50
+ readonly args: readonly [FFIType.cstring];
51
+ readonly returns: FFIType.ptr;
52
+ };
53
+ readonly fun_session_load_or_create: {
54
+ readonly args: readonly [FFIType.cstring];
55
+ readonly returns: FFIType.ptr;
56
+ };
57
+ readonly fun_session_close: {
58
+ readonly args: readonly [FFIType.cstring];
59
+ readonly returns: FFIType.ptr;
60
+ };
61
+ readonly fun_lock_acquire: {
62
+ readonly args: readonly [FFIType.cstring, FFIType.cstring, FFIType.cstring];
63
+ readonly returns: FFIType.ptr;
64
+ };
65
+ readonly fun_lock_release: {
66
+ readonly args: readonly [FFIType.cstring, FFIType.cstring, FFIType.cstring];
67
+ readonly returns: FFIType.bool;
68
+ };
69
+ }>;
70
+ /** Get library version */
71
+ version(): string;
72
+ /** Compute Blake3 hash */
73
+ hash(data: Uint8Array): Uint8Array;
74
+ /** Convert hash to hex string */
75
+ hashToHex(hash: Uint8Array): string;
76
+ /** Generate a unified diff */
77
+ patchGenerate(before: string, after: string, filePath?: string): {
78
+ success: boolean;
79
+ diff?: string;
80
+ errorCode?: number;
81
+ };
82
+ /** Get patch statistics */
83
+ patchStats(before: string, after: string): PatchStatsRaw;
84
+ /** Apply a patch to content */
85
+ patchApply(content: string, diff: string): {
86
+ success: boolean;
87
+ result?: string;
88
+ errorCode?: number;
89
+ };
90
+ };
91
+ export {};
92
+ //# sourceMappingURL=ffi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffi.d.ts","sourceRoot":"","sources":["../src/ffi.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAU,OAAO,EAA4C,MAAM,SAAS,CAAC;AAwMpF,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAaD,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKd,0BAA0B;eACf,MAAM;IAoBjB,0BAA0B;eACf,UAAU,GAAG,UAAU;IAMlC,iCAAiC;oBACjB,UAAU,GAAG,MAAM;IAMnC,8BAA8B;0BAEpB,MAAM,SACP,MAAM,aACF,MAAM,GAChB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAiC1D,2BAA2B;uBACR,MAAM,SAAS,MAAM,GAAG,aAAa;IAcxD,+BAA+B;wBAEpB,MAAM,QACT,MAAM,GACX;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAqB7D,CAAC"}
package/dist/ffi.js ADDED
@@ -0,0 +1,248 @@
1
+ /**
2
+ * FFI bindings for the Funcode native library
3
+ */
4
+ import { dlopen, FFIType, suffix, ptr, toArrayBuffer } from "bun:ffi";
5
+ import { join, dirname } from "path";
6
+ import { fileURLToPath } from "url";
7
+ import { existsSync } from "fs";
8
+ // Find the native library
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ /**
11
+ * Get the platform-specific library name
12
+ * Format: libfuncode-{platform}-{arch}.{ext}
13
+ * Examples:
14
+ * - libfuncode-darwin-arm64.dylib
15
+ * - libfuncode-linux-x64.so
16
+ * - funcode-win32-x64.dll
17
+ */
18
+ function getLibraryName() {
19
+ const platform = process.platform; // 'darwin', 'linux', 'win32'
20
+ const arch = process.arch; // 'arm64', 'x64'
21
+ const ext = suffix; // 'dylib', 'so', or 'dll'
22
+ const prefix = platform === 'win32' ? '' : 'lib';
23
+ return `${prefix}funcode-${platform}-${arch}.${ext}`;
24
+ }
25
+ /**
26
+ * Get the generic library name (for local development)
27
+ * Format: libfuncode.{ext}
28
+ */
29
+ function getGenericLibraryName() {
30
+ const platform = process.platform;
31
+ const prefix = platform === 'win32' ? '' : 'lib';
32
+ return `${prefix}funcode.${suffix}`;
33
+ }
34
+ // Try multiple paths for the native library
35
+ function findLibrary() {
36
+ const platformLibName = getLibraryName();
37
+ const genericLibName = getGenericLibraryName();
38
+ // Base directories to search
39
+ const baseDirs = [
40
+ join(__dirname, "..", "native"), // From src/ → native/
41
+ join(__dirname, "native"), // From dist/ → native/
42
+ join(__dirname, "..", "..", "native"), // From dist/esm/ → native/
43
+ ];
44
+ // Try platform-specific name first, then generic name
45
+ const libNames = [platformLibName, genericLibName];
46
+ const searchedPaths = [];
47
+ for (const baseDir of baseDirs) {
48
+ for (const libName of libNames) {
49
+ const p = join(baseDir, libName);
50
+ searchedPaths.push(p);
51
+ if (existsSync(p)) {
52
+ return p;
53
+ }
54
+ }
55
+ }
56
+ // Provide a helpful error message
57
+ const platform = process.platform;
58
+ const arch = process.arch;
59
+ throw new Error(`Could not find Funcode native library for ${platform}-${arch}.\n` +
60
+ `Looked for: ${platformLibName} or ${genericLibName}\n` +
61
+ `Searched paths:\n${searchedPaths.map(p => ` - ${p}`).join("\n")}\n\n` +
62
+ `To build the native library:\n` +
63
+ ` cd <project-root> && zig build -Doptimize=ReleaseFast\n` +
64
+ ` cp zig-out/lib/${genericLibName} ts/@byfungsi/fun/native/${platformLibName}`);
65
+ }
66
+ const libPath = findLibrary();
67
+ // Define FFI symbols
68
+ const symbols = {
69
+ // Memory management
70
+ fun_free: {
71
+ args: [FFIType.ptr, FFIType.u64],
72
+ returns: FFIType.void,
73
+ },
74
+ fun_result_free: {
75
+ args: [FFIType.ptr],
76
+ returns: FFIType.void,
77
+ },
78
+ // Version
79
+ fun_version: {
80
+ args: [],
81
+ returns: FFIType.cstring,
82
+ },
83
+ // Hashing
84
+ fun_hash: {
85
+ args: [FFIType.ptr, FFIType.u64, FFIType.ptr],
86
+ returns: FFIType.void,
87
+ },
88
+ fun_hash_to_hex: {
89
+ args: [FFIType.ptr, FFIType.ptr],
90
+ returns: FFIType.void,
91
+ },
92
+ // Patch generation
93
+ fun_patch_generate: {
94
+ args: [FFIType.ptr, FFIType.u64, FFIType.ptr, FFIType.u64, FFIType.cstring],
95
+ returns: FFIType.ptr, // CResult struct
96
+ },
97
+ fun_patch_stats: {
98
+ args: [FFIType.ptr, FFIType.u64, FFIType.ptr, FFIType.u64],
99
+ returns: FFIType.ptr, // PatchStats struct pointer
100
+ },
101
+ fun_patch_apply: {
102
+ args: [FFIType.ptr, FFIType.u64, FFIType.ptr, FFIType.u64],
103
+ returns: FFIType.ptr, // CResult struct pointer
104
+ },
105
+ // Session management
106
+ fun_session_create: {
107
+ args: [FFIType.cstring],
108
+ returns: FFIType.ptr,
109
+ },
110
+ fun_session_load: {
111
+ args: [FFIType.cstring],
112
+ returns: FFIType.ptr,
113
+ },
114
+ fun_session_load_or_create: {
115
+ args: [FFIType.cstring],
116
+ returns: FFIType.ptr,
117
+ },
118
+ fun_session_close: {
119
+ args: [FFIType.cstring],
120
+ returns: FFIType.ptr,
121
+ },
122
+ // Lock management
123
+ fun_lock_acquire: {
124
+ args: [FFIType.cstring, FFIType.cstring, FFIType.cstring],
125
+ returns: FFIType.ptr,
126
+ },
127
+ fun_lock_release: {
128
+ args: [FFIType.cstring, FFIType.cstring, FFIType.cstring],
129
+ returns: FFIType.bool,
130
+ },
131
+ };
132
+ // Load the library
133
+ let lib = null;
134
+ function getLib() {
135
+ if (!lib) {
136
+ try {
137
+ lib = dlopen(libPath, symbols);
138
+ }
139
+ catch (error) {
140
+ throw new Error(`Failed to load Funcode native library from ${libPath}: ${error}`);
141
+ }
142
+ }
143
+ return lib;
144
+ }
145
+ function parseCResult(resultPtr) {
146
+ const view = new DataView(toArrayBuffer(resultPtr, 0, 24));
147
+ const success = view.getUint8(0) !== 0;
148
+ const errorCode = view.getInt32(4, true);
149
+ const dataPtr = Number(view.getBigUint64(8, true));
150
+ const dataLen = Number(view.getBigUint64(16, true));
151
+ let data = null;
152
+ if (dataPtr !== 0 && dataLen > 0) {
153
+ data = toArrayBuffer(dataPtr, 0, dataLen);
154
+ }
155
+ return { success, errorCode, data };
156
+ }
157
+ function parsePatchStats(statsPtr) {
158
+ const view = new DataView(toArrayBuffer(statsPtr, 0, 16));
159
+ return {
160
+ additions: view.getUint32(0, true),
161
+ deletions: view.getUint32(4, true),
162
+ hunks: view.getUint32(8, true),
163
+ isEmpty: view.getUint8(12) !== 0,
164
+ };
165
+ }
166
+ // Export FFI functions
167
+ export const ffi = {
168
+ get lib() {
169
+ return getLib();
170
+ },
171
+ /** Get library version */
172
+ version() {
173
+ const cstr = getLib().symbols.fun_version();
174
+ // fun_version returns a pointer to a null-terminated string
175
+ if (typeof cstr === "number" || typeof cstr === "bigint") {
176
+ // Read the string from the pointer
177
+ const cstrNum = Number(cstr);
178
+ if (cstrNum === 0)
179
+ return "0.0.0";
180
+ // Read bytes until null terminator
181
+ const view = new DataView(toArrayBuffer(cstrNum, 0, 16));
182
+ let result = "";
183
+ for (let i = 0; i < 16; i++) {
184
+ const byte = view.getUint8(i);
185
+ if (byte === 0)
186
+ break;
187
+ result += String.fromCharCode(byte);
188
+ }
189
+ return result;
190
+ }
191
+ return String(cstr);
192
+ },
193
+ /** Compute Blake3 hash */
194
+ hash(data) {
195
+ const hashBuf = new Uint8Array(32);
196
+ getLib().symbols.fun_hash(ptr(data), data.length, ptr(hashBuf));
197
+ return hashBuf;
198
+ },
199
+ /** Convert hash to hex string */
200
+ hashToHex(hash) {
201
+ const hexBuf = new Uint8Array(64);
202
+ getLib().symbols.fun_hash_to_hex(ptr(hash), ptr(hexBuf));
203
+ return new TextDecoder().decode(hexBuf);
204
+ },
205
+ /** Generate a unified diff */
206
+ patchGenerate(before, after, filePath) {
207
+ const beforeBuf = new TextEncoder().encode(before);
208
+ const afterBuf = new TextEncoder().encode(after);
209
+ // For optional file path, we need to pass a proper null pointer (0) or an encoded buffer
210
+ let filePathArg = null;
211
+ let filePathBuf = null;
212
+ if (filePath) {
213
+ // Encode with null terminator
214
+ filePathBuf = new TextEncoder().encode(filePath + "\0");
215
+ filePathArg = ptr(filePathBuf);
216
+ }
217
+ const resultPtr = getLib().symbols.fun_patch_generate(ptr(beforeBuf), beforeBuf.length, ptr(afterBuf), afterBuf.length, filePathArg);
218
+ const result = parseCResult(resultPtr);
219
+ if (result.success && result.data) {
220
+ const diff = new TextDecoder().decode(result.data);
221
+ // Free the result
222
+ getLib().symbols.fun_result_free(resultPtr);
223
+ return { success: true, diff };
224
+ }
225
+ return { success: false, errorCode: result.errorCode };
226
+ },
227
+ /** Get patch statistics */
228
+ patchStats(before, after) {
229
+ const beforeBuf = new TextEncoder().encode(before);
230
+ const afterBuf = new TextEncoder().encode(after);
231
+ const statsPtr = getLib().symbols.fun_patch_stats(ptr(beforeBuf), beforeBuf.length, ptr(afterBuf), afterBuf.length);
232
+ return parsePatchStats(statsPtr);
233
+ },
234
+ /** Apply a patch to content */
235
+ patchApply(content, diff) {
236
+ const contentBuf = new TextEncoder().encode(content);
237
+ const diffBuf = new TextEncoder().encode(diff);
238
+ const resultPtr = getLib().symbols.fun_patch_apply(ptr(contentBuf), contentBuf.length, ptr(diffBuf), diffBuf.length);
239
+ const result = parseCResult(resultPtr);
240
+ if (result.success && result.data) {
241
+ const patched = new TextDecoder().decode(result.data);
242
+ getLib().symbols.fun_result_free(resultPtr);
243
+ return { success: true, result: patched };
244
+ }
245
+ return { success: false, errorCode: result.errorCode };
246
+ },
247
+ };
248
+ //# sourceMappingURL=ffi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffi.js","sourceRoot":"","sources":["../src/ffi.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAgB,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,0BAA0B;AAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D;;;;;;;GAOG;AACH,SAAS,cAAc;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAE,6BAA6B;IACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAU,iBAAiB;IAErD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,0BAA0B;IAC9C,MAAM,MAAM,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAEjD,OAAO,GAAG,MAAM,WAAW,QAAQ,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,OAAO,GAAG,MAAM,WAAW,MAAM,EAAE,CAAC;AACtC,CAAC;AAED,4CAA4C;AAC5C,SAAS,WAAW;IAClB,MAAM,eAAe,GAAG,cAAc,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,qBAAqB,EAAE,CAAC;IAE/C,6BAA6B;IAC7B,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAO,sBAAsB;QAC5D,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAa,uBAAuB;QAC7D,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,2BAA2B;KACnE,CAAC;IAEF,sDAAsD;IACtD,MAAM,QAAQ,GAAG,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAEnD,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,IAAI,KAAK,CACb,6CAA6C,QAAQ,IAAI,IAAI,KAAK;QAClE,eAAe,eAAe,OAAO,cAAc,IAAI;QACvD,oBAAoB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;QACvE,gCAAgC;QAChC,2DAA2D;QAC3D,oBAAoB,cAAc,4BAA4B,eAAe,EAAE,CAChF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAE9B,qBAAqB;AACrB,MAAM,OAAO,GAAG;IACd,oBAAoB;IACpB,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,IAAI;KACtB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC,IAAI;KACtB;IAED,UAAU;IACV,WAAW,EAAE;QACX,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB;IAED,UAAU;IACV,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;QAC7C,OAAO,EAAE,OAAO,CAAC,IAAI;KACtB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,IAAI;KACtB;IAED,mBAAmB;IACnB,kBAAkB,EAAE;QAClB,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;QAC3E,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,iBAAiB;KACxC;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;QAC1D,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,4BAA4B;KACnD;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;QAC1D,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,yBAAyB;KAChD;IAED,qBAAqB;IACrB,kBAAkB,EAAE;QAClB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,GAAG;KACrB;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,GAAG;KACrB;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,GAAG;KACrB;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,GAAG;KACrB;IAED,kBAAkB;IAClB,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QACzD,OAAO,EAAE,OAAO,CAAC,GAAG;KACrB;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QACzD,OAAO,EAAE,OAAO,CAAC,IAAI;KACtB;CACO,CAAC;AAEX,mBAAmB;AACnB,IAAI,GAAG,GAAqD,IAAI,CAAC;AAEjE,SAAS,MAAM;IACb,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,8CAA8C,OAAO,KAAK,KAAK,EAAE,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAeD,SAAS,YAAY,CAAC,SAAkB;IACtC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAEpD,IAAI,IAAI,GAAuB,IAAI,CAAC;IACpC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,GAAG,aAAa,CAAC,OAA6B,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAgBD,SAAS,eAAe,CAAC,QAAiB;IACxC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;QAClC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;QAClC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;QAC9B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,GAAG;QACL,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,OAAO;QACL,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,4DAA4D;QAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzD,mCAAmC;YACnC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,OAAO,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC;YAClC,mCAAmC;YACnC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,OAA6B,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,IAAI,KAAK,CAAC;oBAAE,MAAM;gBACtB,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,IAAgB;QACnB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,iCAAiC;IACjC,SAAS,CAAC,IAAgB;QACxB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,8BAA8B;IAC9B,aAAa,CACX,MAAc,EACd,KAAa,EACb,QAAiB;QAEjB,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,yFAAyF;QACzF,IAAI,WAAW,GAAkC,IAAI,CAAC;QACtD,IAAI,WAAW,GAAsB,IAAI,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,8BAA8B;YAC9B,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;YACxD,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CACnD,GAAG,CAAC,SAAS,CAAC,EACd,SAAS,CAAC,MAAM,EAChB,GAAG,CAAC,QAAQ,CAAC,EACb,QAAQ,CAAC,MAAM,EACf,WAAW,CACZ,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,SAAoB,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnD,kBAAkB;YAClB,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IACzD,CAAC;IAED,2BAA2B;IAC3B,UAAU,CAAC,MAAc,EAAE,KAAa;QACtC,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAC/C,GAAG,CAAC,SAAS,CAAC,EACd,SAAS,CAAC,MAAM,EAChB,GAAG,CAAC,QAAQ,CAAC,EACb,QAAQ,CAAC,MAAM,CAChB,CAAC;QAEF,OAAO,eAAe,CAAC,QAAmB,CAAC,CAAC;IAC9C,CAAC;IAED,+BAA+B;IAC/B,UAAU,CACR,OAAe,EACf,IAAY;QAEZ,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAChD,GAAG,CAAC,UAAU,CAAC,EACf,UAAU,CAAC,MAAM,EACjB,GAAG,CAAC,OAAO,CAAC,EACZ,OAAO,CAAC,MAAM,CACf,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,SAAoB,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IACzD,CAAC;CACF,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @byfungsi/fun - AI-friendly version control
3
+ *
4
+ * Track AI file changes, enable undo/redo, and coordinate multiple agents.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { loadOrCreateSession, FileTracker } from "@byfungsi/fun";
9
+ *
10
+ * // Load or create a session for the current project
11
+ * const session = await loadOrCreateSession("/path/to/project");
12
+ * const tracker = new FileTracker(session, "my-agent");
13
+ *
14
+ * // Track a file change
15
+ * const beforeContent = await readFile("src/main.ts", "utf-8");
16
+ * // ... AI makes changes ...
17
+ * const afterContent = await readFile("src/main.ts", "utf-8");
18
+ *
19
+ * await tracker.track("src/main.ts", beforeContent, afterContent, "Updated imports");
20
+ *
21
+ * // Revert if needed
22
+ * await tracker.revert("src/main.ts");
23
+ * ```
24
+ */
25
+ export { Session, createSession, loadSession, loadOrCreateSession, } from "./session";
26
+ export { FileTracker } from "./tracker";
27
+ export type { SessionId, ContentHash, VersionNum, SessionMetadata, FileState, Version, PatchStats, TrackChangeOptions, PreCheckResult, FileLock, LockResult, Resolution, StatusInfo, } from "./types";
28
+ export { ErrorCode, FunError } from "./types";
29
+ export { ffi } from "./ffi";
30
+ /**
31
+ * Generate a unified diff between two strings
32
+ */
33
+ export declare function generateDiff(before: string, after: string, filePath?: string): string | null;
34
+ /**
35
+ * Get diff statistics
36
+ */
37
+ export declare function getDiffStats(before: string, after: string): {
38
+ additions: number;
39
+ deletions: number;
40
+ isEmpty: boolean;
41
+ };
42
+ /**
43
+ * Compute Blake3 hash of content
44
+ */
45
+ export declare function hash(content: string): string;
46
+ /**
47
+ * Get library version
48
+ */
49
+ export declare function version(): string;
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EACL,OAAO,EACP,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,SAAS,EACT,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG9C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAK5B;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAGf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAO5D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC"}
package/dist/index.js ADDED
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @byfungsi/fun - AI-friendly version control
3
+ *
4
+ * Track AI file changes, enable undo/redo, and coordinate multiple agents.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { loadOrCreateSession, FileTracker } from "@byfungsi/fun";
9
+ *
10
+ * // Load or create a session for the current project
11
+ * const session = await loadOrCreateSession("/path/to/project");
12
+ * const tracker = new FileTracker(session, "my-agent");
13
+ *
14
+ * // Track a file change
15
+ * const beforeContent = await readFile("src/main.ts", "utf-8");
16
+ * // ... AI makes changes ...
17
+ * const afterContent = await readFile("src/main.ts", "utf-8");
18
+ *
19
+ * await tracker.track("src/main.ts", beforeContent, afterContent, "Updated imports");
20
+ *
21
+ * // Revert if needed
22
+ * await tracker.revert("src/main.ts");
23
+ * ```
24
+ */
25
+ // Core exports
26
+ export { Session, createSession, loadSession, loadOrCreateSession, } from "./session";
27
+ export { FileTracker } from "./tracker";
28
+ export { ErrorCode, FunError } from "./types";
29
+ // Low-level FFI access (for advanced use)
30
+ export { ffi } from "./ffi";
31
+ // Utility functions
32
+ import { ffi } from "./ffi";
33
+ /**
34
+ * Generate a unified diff between two strings
35
+ */
36
+ export function generateDiff(before, after, filePath) {
37
+ const result = ffi.patchGenerate(before, after, filePath);
38
+ return result.success ? result.diff : null;
39
+ }
40
+ /**
41
+ * Get diff statistics
42
+ */
43
+ export function getDiffStats(before, after) {
44
+ const stats = ffi.patchStats(before, after);
45
+ return {
46
+ additions: stats.additions,
47
+ deletions: stats.deletions,
48
+ isEmpty: stats.isEmpty,
49
+ };
50
+ }
51
+ /**
52
+ * Compute Blake3 hash of content
53
+ */
54
+ export function hash(content) {
55
+ const data = new TextEncoder().encode(content);
56
+ const hashBytes = ffi.hash(data);
57
+ return ffi.hashToHex(hashBytes);
58
+ }
59
+ /**
60
+ * Get library version
61
+ */
62
+ export function version() {
63
+ return ffi.version();
64
+ }
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,eAAe;AACf,OAAO,EACL,OAAO,EACP,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAmBxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9C,0CAA0C;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,KAAa,EACb,QAAiB;IAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,KAAa;IAEb,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Session class for managing AI file tracking
3
+ */
4
+ import type { SessionId, SessionMetadata, Version, TrackChangeOptions, PreCheckResult, StatusInfo, VersionNum } from "./types";
5
+ /**
6
+ * A Funcode session for tracking AI file changes
7
+ */
8
+ export declare class Session {
9
+ readonly id: SessionId;
10
+ readonly projectPath: string;
11
+ private sessionPath;
12
+ private currentVersion;
13
+ private fileStates;
14
+ private initialized;
15
+ private constructor();
16
+ /**
17
+ * Create a new session for a project
18
+ */
19
+ static create(projectPath: string): Promise<Session>;
20
+ /**
21
+ * Load an existing session by ID
22
+ */
23
+ static load(id: SessionId): Promise<Session>;
24
+ /**
25
+ * Load or create a session for a project path
26
+ */
27
+ static loadOrCreate(projectPath: string): Promise<Session>;
28
+ /**
29
+ * Track a file change
30
+ */
31
+ trackChange(opts: TrackChangeOptions): Promise<Version>;
32
+ /**
33
+ * Revert a file to a specific version (or original if version is 0/undefined)
34
+ */
35
+ revertFile(filePath: string, toVersion?: VersionNum): Promise<void>;
36
+ /**
37
+ * Revert all files to original state
38
+ */
39
+ revertAll(): Promise<void>;
40
+ /**
41
+ * Get content at a specific version by applying patches
42
+ */
43
+ getContentAtVersion(filePath: string, targetVersion: VersionNum): Promise<string>;
44
+ /**
45
+ * Get session metadata
46
+ */
47
+ getMetadata(): Promise<SessionMetadata>;
48
+ /**
49
+ * Get status of all tracked files
50
+ */
51
+ getStatus(): Promise<StatusInfo>;
52
+ /**
53
+ * Get version history
54
+ */
55
+ getHistory(limit?: number): Promise<Version[]>;
56
+ /**
57
+ * Pre-check for conflicts before editing
58
+ */
59
+ preCheck(filePath: string, _agentId: string): Promise<PreCheckResult>;
60
+ /**
61
+ * Close the session
62
+ */
63
+ close(): Promise<void>;
64
+ /**
65
+ * Delete the session and all its data
66
+ */
67
+ delete(): Promise<void>;
68
+ private ensureInitialized;
69
+ private computeHash;
70
+ private storeOriginal;
71
+ private getOriginal;
72
+ private storePatch;
73
+ private getPatch;
74
+ private storeVersionMeta;
75
+ private loadVersionMeta;
76
+ private saveMetadata;
77
+ private saveFileStates;
78
+ private loadFileStates;
79
+ }
80
+ export declare const createSession: typeof Session.create;
81
+ export declare const loadSession: typeof Session.load;
82
+ export declare const loadOrCreateSession: typeof Session.loadOrCreate;
83
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAEf,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,UAAU,EACX,MAAM,SAAS,CAAC;AA2BjB;;GAEG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAMP;;OAEG;WACU,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB1D;;OAEG;WACU,IAAI,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBlD;;OAEG;WACU,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BhE;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsF7D;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDzE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC;;OAEG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,UAAU,GACxB,OAAO,CAAC,MAAM,CAAC;IAsClB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAU7C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAQtC;;OAEG;IACG,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAoBpD;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC;IAuC1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,WAAW;YAML,aAAa;YAOb,WAAW;YAUX,UAAU;YAMV,QAAQ;YAMR,gBAAgB;YAShB,eAAe;YAOf,YAAY;YAYZ,cAAc;YAad,cAAc;CAmB7B;AAGD,eAAO,MAAM,aAAa,uBAA+B,CAAC;AAC1D,eAAO,MAAM,WAAW,qBAA6B,CAAC;AACtD,eAAO,MAAM,mBAAmB,6BAAqC,CAAC"}