@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 +92 -0
- package/dist/ffi.d.ts.map +1 -0
- package/dist/ffi.js +248 -0
- package/dist/ffi.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/session.d.ts +83 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +435 -0
- package/dist/session.js.map +1 -0
- package/dist/tracker.d.ts +34 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +64 -0
- package/dist/tracker.js.map +1 -0
- package/dist/types.d.ts +107 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +26 -0
- package/dist/types.js.map +1 -0
- package/native/.gitkeep +0 -0
- package/native/libfuncode-darwin-arm64.dylib +0 -0
- package/native/libfuncode-darwin-x64.dylib +0 -0
- package/native/libfuncode-linux-arm64.so +0 -0
- package/native/libfuncode-linux-x64.so +0 -0
- package/package.json +64 -0
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
|
package/dist/ffi.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ffi.js","sourceRoot":"","sources":["../src/ffi.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|