@rlabs-inc/fsdb 1.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.
- package/README.md +358 -0
- package/dist/core/collection.d.ts +66 -0
- package/dist/core/collection.d.ts.map +1 -0
- package/dist/core/columns.d.ts +47 -0
- package/dist/core/columns.d.ts.map +1 -0
- package/dist/core/constants.d.ts +22 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/database.d.ts +55 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/registry.d.ts +52 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/types.d.ts +107 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2682 -0
- package/dist/index.mjs +2656 -0
- package/dist/persistence/markdown.d.ts +57 -0
- package/dist/persistence/markdown.d.ts.map +1 -0
- package/dist/persistence/watcher.d.ts +38 -0
- package/dist/persistence/watcher.d.ts.map +1 -0
- package/dist/query/filters.d.ts +65 -0
- package/dist/query/filters.d.ts.map +1 -0
- package/dist/query/reactive.d.ts +58 -0
- package/dist/query/reactive.d.ts.map +1 -0
- package/dist/vector/search.d.ts +59 -0
- package/dist/vector/search.d.ts.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown Persistence
|
|
3
|
+
*
|
|
4
|
+
* Parse and generate markdown files with YAML frontmatter.
|
|
5
|
+
* Uses Bun file APIs for fast I/O.
|
|
6
|
+
*/
|
|
7
|
+
import type { SchemaDefinition, RecordWithMeta } from '../core/types';
|
|
8
|
+
/** Convert an ID to a safe filename */
|
|
9
|
+
export declare function idToFilename(id: string): string;
|
|
10
|
+
/** Extract ID from a filename */
|
|
11
|
+
export declare function filenameToId(filename: string): string;
|
|
12
|
+
interface ParsedMarkdown {
|
|
13
|
+
frontmatter: Record<string, unknown>;
|
|
14
|
+
content: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse a markdown file with YAML frontmatter
|
|
18
|
+
*
|
|
19
|
+
* Format:
|
|
20
|
+
* ---
|
|
21
|
+
* key: value
|
|
22
|
+
* ---
|
|
23
|
+
* Content here
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseMarkdown(text: string): ParsedMarkdown;
|
|
26
|
+
/**
|
|
27
|
+
* Generate markdown with YAML frontmatter
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateMarkdown<S extends SchemaDefinition>(record: RecordWithMeta<S>, schema: S, contentColumn?: keyof S): string;
|
|
30
|
+
/**
|
|
31
|
+
* Load a record from a markdown file
|
|
32
|
+
*/
|
|
33
|
+
export declare function loadFromMarkdown<S extends SchemaDefinition>(filepath: string, schema: S, contentColumn?: keyof S): Promise<{
|
|
34
|
+
id: string;
|
|
35
|
+
record: Partial<RecordWithMeta<S>>;
|
|
36
|
+
} | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Save a record to a markdown file
|
|
39
|
+
*/
|
|
40
|
+
export declare function saveToMarkdown<S extends SchemaDefinition>(filepath: string, record: RecordWithMeta<S>, schema: S, contentColumn?: keyof S): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Load all records from a directory
|
|
43
|
+
*/
|
|
44
|
+
export declare function loadFromDirectory<S extends SchemaDefinition>(dirpath: string, schema: S, contentColumn?: keyof S): Promise<{
|
|
45
|
+
id: string;
|
|
46
|
+
record: Partial<RecordWithMeta<S>>;
|
|
47
|
+
}[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Delete a markdown file
|
|
50
|
+
*/
|
|
51
|
+
export declare function deleteMarkdownFile(filepath: string): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Ensure a directory exists
|
|
54
|
+
*/
|
|
55
|
+
export declare function ensureDirectory(dirpath: string): Promise<void>;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/persistence/markdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAkB,cAAc,EAAE,MAAM,eAAe,CAAA;AAOrF,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,iCAAiC;AACjC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAMD,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAqC1D;AAkFD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EACzD,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,CAAC,EACT,aAAa,CAAC,EAAE,MAAM,CAAC,GACtB,MAAM,CA4BR;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EAC/D,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,EACT,aAAa,CAAC,EAAE,MAAM,CAAC,GACtB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CA8CpE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,gBAAgB,EAC7D,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,CAAC,EACT,aAAa,CAAC,EAAE,MAAM,CAAC,GACtB,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,gBAAgB,EAChE,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,CAAC,EACT,aAAa,CAAC,EAAE,MAAM,CAAC,GACtB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,EAAE,CAAC,CAmB/D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ3E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher
|
|
3
|
+
*
|
|
4
|
+
* Watch a directory for markdown file changes.
|
|
5
|
+
* Uses Node's fs.watch with debouncing.
|
|
6
|
+
*/
|
|
7
|
+
import type { SchemaDefinition, FileChangeEvent } from '../core/types';
|
|
8
|
+
export interface FileWatcher<S extends SchemaDefinition> {
|
|
9
|
+
/** Start watching */
|
|
10
|
+
start(): void;
|
|
11
|
+
/** Stop watching */
|
|
12
|
+
stop(): void;
|
|
13
|
+
/** Is currently watching */
|
|
14
|
+
readonly isWatching: boolean;
|
|
15
|
+
/** Register a callback for file changes */
|
|
16
|
+
onChange(callback: (event: FileChangeEvent<S>) => void | Promise<void>): () => void;
|
|
17
|
+
/** Mark a file as being saved (prevents reload loop) */
|
|
18
|
+
markSaving(id: string): void;
|
|
19
|
+
/** Clear saving mark */
|
|
20
|
+
clearSaving(id: string): void;
|
|
21
|
+
}
|
|
22
|
+
export interface WatcherOptions<S extends SchemaDefinition> {
|
|
23
|
+
/** Directory to watch */
|
|
24
|
+
dirpath: string;
|
|
25
|
+
/** Schema for parsing files */
|
|
26
|
+
schema: S;
|
|
27
|
+
/** Content column */
|
|
28
|
+
contentColumn?: keyof S;
|
|
29
|
+
/** Debounce time in ms */
|
|
30
|
+
debounceMs?: number;
|
|
31
|
+
/** Callback to check if embedding is stale */
|
|
32
|
+
isStaleCallback?: (id: string, content: string) => boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a file watcher
|
|
36
|
+
*/
|
|
37
|
+
export declare function createFileWatcher<S extends SchemaDefinition>(options: WatcherOptions<S>): FileWatcher<S>;
|
|
38
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/persistence/watcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAkB,eAAe,EAAE,MAAM,eAAe,CAAA;AAItF,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,gBAAgB;IACrD,qBAAqB;IACrB,KAAK,IAAI,IAAI,CAAA;IAEb,oBAAoB;IACpB,IAAI,IAAI,IAAI,CAAA;IAEZ,4BAA4B;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAE5B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAA;IAEnF,wDAAwD;IACxD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IAE5B,wBAAwB;IACxB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,gBAAgB;IACxD,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAA;IAEf,+BAA+B;IAC/B,MAAM,EAAE,CAAC,CAAA;IAET,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,CAAA;IAEvB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;CAC3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,gBAAgB,EAC1D,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,WAAW,CAAC,CAAC,CAAC,CAoKhB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter Helpers
|
|
3
|
+
*
|
|
4
|
+
* Composable filter functions for querying collections.
|
|
5
|
+
* All filters return FilterFn<S> that can be combined with and/or/not.
|
|
6
|
+
*/
|
|
7
|
+
import type { SchemaDefinition, SchemaToRecord, FilterFn, RecordWithMeta, SortOption, PaginatedResult } from '../core/types';
|
|
8
|
+
/** Equal to */
|
|
9
|
+
export declare function eq<S extends SchemaDefinition, K extends keyof S>(column: K, value: SchemaToRecord<S>[K]): FilterFn<S>;
|
|
10
|
+
/** Not equal to */
|
|
11
|
+
export declare function neq<S extends SchemaDefinition, K extends keyof S>(column: K, value: SchemaToRecord<S>[K]): FilterFn<S>;
|
|
12
|
+
/** Greater than */
|
|
13
|
+
export declare function gt<S extends SchemaDefinition, K extends keyof S>(column: K, value: number): FilterFn<S>;
|
|
14
|
+
/** Greater than or equal */
|
|
15
|
+
export declare function gte<S extends SchemaDefinition, K extends keyof S>(column: K, value: number): FilterFn<S>;
|
|
16
|
+
/** Less than */
|
|
17
|
+
export declare function lt<S extends SchemaDefinition, K extends keyof S>(column: K, value: number): FilterFn<S>;
|
|
18
|
+
/** Less than or equal */
|
|
19
|
+
export declare function lte<S extends SchemaDefinition, K extends keyof S>(column: K, value: number): FilterFn<S>;
|
|
20
|
+
/** Between (inclusive) */
|
|
21
|
+
export declare function between<S extends SchemaDefinition, K extends keyof S>(column: K, min: number, max: number): FilterFn<S>;
|
|
22
|
+
/** Value is one of the provided values */
|
|
23
|
+
export declare function oneOf<S extends SchemaDefinition, K extends keyof S>(column: K, values: SchemaToRecord<S>[K][]): FilterFn<S>;
|
|
24
|
+
/** Full-text search across all text columns or specific columns */
|
|
25
|
+
export declare function fullText<S extends SchemaDefinition>(query: string, options?: {
|
|
26
|
+
columns?: (keyof S)[];
|
|
27
|
+
caseSensitive?: boolean;
|
|
28
|
+
}): FilterFn<S>;
|
|
29
|
+
/** Regex pattern matching */
|
|
30
|
+
export declare function matches<S extends SchemaDefinition, K extends keyof S>(column: K, pattern: RegExp | string): FilterFn<S>;
|
|
31
|
+
/** Starts with prefix */
|
|
32
|
+
export declare function startsWith<S extends SchemaDefinition, K extends keyof S>(column: K, prefix: string, caseSensitive?: boolean): FilterFn<S>;
|
|
33
|
+
/** Ends with suffix */
|
|
34
|
+
export declare function endsWith<S extends SchemaDefinition, K extends keyof S>(column: K, suffix: string, caseSensitive?: boolean): FilterFn<S>;
|
|
35
|
+
/** Array contains a value */
|
|
36
|
+
export declare function contains<S extends SchemaDefinition, K extends keyof S>(column: K, value: unknown): FilterFn<S>;
|
|
37
|
+
/** Array contains any of the values */
|
|
38
|
+
export declare function containsAny<S extends SchemaDefinition, K extends keyof S>(column: K, values: unknown[]): FilterFn<S>;
|
|
39
|
+
/** Array contains all of the values */
|
|
40
|
+
export declare function containsAll<S extends SchemaDefinition, K extends keyof S>(column: K, values: unknown[]): FilterFn<S>;
|
|
41
|
+
/** Array is empty */
|
|
42
|
+
export declare function isEmpty<S extends SchemaDefinition, K extends keyof S>(column: K): FilterFn<S>;
|
|
43
|
+
/** Array is not empty */
|
|
44
|
+
export declare function isNotEmpty<S extends SchemaDefinition, K extends keyof S>(column: K): FilterFn<S>;
|
|
45
|
+
/** Value exists (not null/undefined) */
|
|
46
|
+
export declare function exists<S extends SchemaDefinition, K extends keyof S>(column: K): FilterFn<S>;
|
|
47
|
+
/** Value is null or undefined */
|
|
48
|
+
export declare function isNull<S extends SchemaDefinition, K extends keyof S>(column: K): FilterFn<S>;
|
|
49
|
+
/** Timestamp is after a date */
|
|
50
|
+
export declare function after<S extends SchemaDefinition, K extends keyof S>(column: K, date: Date | number): FilterFn<S>;
|
|
51
|
+
/** Timestamp is before a date */
|
|
52
|
+
export declare function before<S extends SchemaDefinition, K extends keyof S>(column: K, date: Date | number): FilterFn<S>;
|
|
53
|
+
/** Timestamp is within last N milliseconds */
|
|
54
|
+
export declare function withinLast<S extends SchemaDefinition, K extends keyof S>(column: K, milliseconds: number): FilterFn<S>;
|
|
55
|
+
/** Combine filters with AND */
|
|
56
|
+
export declare function and<S extends SchemaDefinition>(...filters: FilterFn<S>[]): FilterFn<S>;
|
|
57
|
+
/** Combine filters with OR */
|
|
58
|
+
export declare function or<S extends SchemaDefinition>(...filters: FilterFn<S>[]): FilterFn<S>;
|
|
59
|
+
/** Negate a filter */
|
|
60
|
+
export declare function not<S extends SchemaDefinition>(filter: FilterFn<S>): FilterFn<S>;
|
|
61
|
+
/** Sort records by one or more columns */
|
|
62
|
+
export declare function sortBy<S extends SchemaDefinition>(records: RecordWithMeta<S>[], ...sorts: (keyof S | SortOption<S>)[]): RecordWithMeta<S>[];
|
|
63
|
+
/** Paginate records */
|
|
64
|
+
export declare function paginate<S extends SchemaDefinition>(records: RecordWithMeta<S>[], page?: number, pageSize?: number): PaginatedResult<S>;
|
|
65
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/query/filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactive Queries
|
|
3
|
+
*
|
|
4
|
+
* Queries that automatically re-evaluate when underlying data changes.
|
|
5
|
+
* Built on derived() from @rlabs-inc/signals.
|
|
6
|
+
*/
|
|
7
|
+
import { type DerivedSignal } from '@rlabs-inc/signals';
|
|
8
|
+
import type { Collection } from '../core/collection';
|
|
9
|
+
import type { SchemaDefinition, SchemaToRecord, RecordWithMeta, FilterFn, QueryResult, SortOption } from '../core/types';
|
|
10
|
+
/**
|
|
11
|
+
* Create a reactive query that auto-updates when data changes
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const activeUsers = query(users, (r) => r.active === true)
|
|
15
|
+
* effect(() => {
|
|
16
|
+
* console.log('Active users:', activeUsers.value.count)
|
|
17
|
+
* })
|
|
18
|
+
*/
|
|
19
|
+
export declare function query<S extends SchemaDefinition>(collection: Collection<S>, filter: FilterFn<S>): DerivedSignal<QueryResult<S>>;
|
|
20
|
+
/**
|
|
21
|
+
* Create a reactive sorted query
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* const topUsers = querySorted(users, (r) => r.score > 100, 'score', true)
|
|
25
|
+
*/
|
|
26
|
+
export declare function querySorted<S extends SchemaDefinition>(collection: Collection<S>, filter: FilterFn<S>, sortBy: keyof S | SortOption<S>[], descending?: boolean): DerivedSignal<QueryResult<S>>;
|
|
27
|
+
/**
|
|
28
|
+
* Create a reactive query that returns only the first match
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* const admin = queryFirst(users, (r) => r.role === 'admin')
|
|
32
|
+
*/
|
|
33
|
+
export declare function queryFirst<S extends SchemaDefinition>(collection: Collection<S>, filter: FilterFn<S>): DerivedSignal<RecordWithMeta<S> | undefined>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a reactive count query
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* const activeCount = queryCount(users, (r) => r.active)
|
|
39
|
+
*/
|
|
40
|
+
export declare function queryCount<S extends SchemaDefinition>(collection: Collection<S>, filter: FilterFn<S>): DerivedSignal<number>;
|
|
41
|
+
/**
|
|
42
|
+
* Create a reactive aggregation query
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* const totalScore = queryAggregate(users, (records) =>
|
|
46
|
+
* records.reduce((sum, r) => sum + r.score, 0)
|
|
47
|
+
* )
|
|
48
|
+
*/
|
|
49
|
+
export declare function queryAggregate<S extends SchemaDefinition, T>(collection: Collection<S>, aggregator: (records: SchemaToRecord<S>[]) => T, filter?: FilterFn<S>): DerivedSignal<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Create a reactive query that groups records by a field
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* const byRole = queryGroupBy(users, 'role')
|
|
55
|
+
* // { admin: [...], user: [...], guest: [...] }
|
|
56
|
+
*/
|
|
57
|
+
export declare function queryGroupBy<S extends SchemaDefinition, K extends keyof S>(collection: Collection<S>, field: K, filter?: FilterFn<S>): DerivedSignal<Map<SchemaToRecord<S>[K], RecordWithMeta<S>[]>>;
|
|
58
|
+
//# sourceMappingURL=reactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../../src/query/reactive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAW,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,QAAQ,EACR,WAAW,EACX,UAAU,EACX,MAAM,eAAe,CAAA;AAMtB;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,gBAAgB,EAC9C,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAClB,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAgB/B;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,gBAAgB,EACpD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EACnB,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EACjC,UAAU,UAAQ,GACjB,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA8B/B;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,gBAAgB,EACnD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAClB,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAU9C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,gBAAgB,EACnD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAClB,aAAa,CAAC,MAAM,CAAC,CASvB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,EAC1D,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAC/C,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,GACnB,aAAa,CAAC,CAAC,CAAC,CAalB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,SAAS,MAAM,CAAC,EACxE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,CAAC,EACR,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,GACnB,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAsB/D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector Search
|
|
3
|
+
*
|
|
4
|
+
* Cosine similarity search with optimized Float32Array operations.
|
|
5
|
+
* Includes stale embedding detection via content hashing.
|
|
6
|
+
*/
|
|
7
|
+
import type { Collection } from '../core/collection';
|
|
8
|
+
import type { SchemaDefinition, VectorSearchOptions, VectorSearchResult } from '../core/types';
|
|
9
|
+
/**
|
|
10
|
+
* Convert a number array to Float32Array
|
|
11
|
+
*/
|
|
12
|
+
export declare function toFloat32Array(arr: number[] | Float32Array): Float32Array;
|
|
13
|
+
/**
|
|
14
|
+
* Normalize a vector to unit length (in-place)
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeVector(vec: Float32Array): Float32Array;
|
|
17
|
+
/**
|
|
18
|
+
* Calculate cosine similarity between two vectors
|
|
19
|
+
*
|
|
20
|
+
* Returns a value between -1 and 1 (1 = identical direction)
|
|
21
|
+
*/
|
|
22
|
+
export declare function cosineSimilarity(a: Float32Array | number[], b: Float32Array | number[]): number;
|
|
23
|
+
/**
|
|
24
|
+
* Batch cosine similarity with pre-computed norms
|
|
25
|
+
*
|
|
26
|
+
* More efficient when searching against many vectors
|
|
27
|
+
*/
|
|
28
|
+
export declare function batchCosineSimilarity(query: Float32Array, vectors: Float32Array[], indices: number[], topK: number): {
|
|
29
|
+
index: number;
|
|
30
|
+
similarity: number;
|
|
31
|
+
}[];
|
|
32
|
+
export interface EmbeddingManager {
|
|
33
|
+
/** Store an embedding with its source content hash */
|
|
34
|
+
setEmbedding(id: string, column: string, content: string): void;
|
|
35
|
+
/** Check if an embedding is stale (content changed) */
|
|
36
|
+
isStale(id: string, column: string, currentContent: string): boolean;
|
|
37
|
+
/** Get the stored hash for an embedding */
|
|
38
|
+
getHash(id: string, column: string): bigint | undefined;
|
|
39
|
+
/** Clear hash for a record */
|
|
40
|
+
clearHash(id: string, column: string): void;
|
|
41
|
+
/** Clear all hashes */
|
|
42
|
+
reset(): void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create an embedding manager for stale detection
|
|
46
|
+
*
|
|
47
|
+
* Uses Bun.hash() for ultra-fast content fingerprinting
|
|
48
|
+
*/
|
|
49
|
+
export declare function createEmbeddingManager(): EmbeddingManager;
|
|
50
|
+
/**
|
|
51
|
+
* Perform vector similarity search on a collection
|
|
52
|
+
*
|
|
53
|
+
* Optimized for performance:
|
|
54
|
+
* - Minimal record reconstruction
|
|
55
|
+
* - Filter uses raw column data, not full records
|
|
56
|
+
* - Only top-K results get full record reconstruction
|
|
57
|
+
*/
|
|
58
|
+
export declare function vectorSearch<S extends SchemaDefinition>(collection: Collection<S>, vectorColumn: keyof S, queryVector: Float32Array | number[], options?: VectorSearchOptions<S>): VectorSearchResult<S>[];
|
|
59
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/vector/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EACV,gBAAgB,EAEhB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,eAAe,CAAA;AAMtB;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,YAAY,CAGzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY,CAY/D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,EAC1B,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,GACzB,MAAM,CAsBR;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,CAmCzC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAE/D,uDAAuD;IACvD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAA;IAEpE,2CAA2C;IAC3C,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAEvD,8BAA8B;IAC9B,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAE3C,uBAAuB;IACvB,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CA4CzD;AAMD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,gBAAgB,EACrD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,YAAY,EAAE,MAAM,CAAC,EACrB,WAAW,EAAE,YAAY,GAAG,MAAM,EAAE,EACpC,OAAO,GAAE,mBAAmB,CAAC,CAAC,CAAM,GACnC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CA4CzB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rlabs-inc/fsdb",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Fractal State Database - A reactive in memory database with markdown files persistence made with parallel arrays and fine-grained reactivity.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "bun build src/index.ts --outfile dist/index.mjs --target node --format esm && bun build src/index.ts --outfile dist/index.js --target node --format cjs && bun run build:types",
|
|
22
|
+
"build:types": "tsc --emitDeclarationOnly --declaration --outDir dist",
|
|
23
|
+
"test": "bun test",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"prepublishOnly": "bun run build"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"database",
|
|
29
|
+
"reactive",
|
|
30
|
+
"signals",
|
|
31
|
+
"fractal",
|
|
32
|
+
"father-state",
|
|
33
|
+
"parallel-arrays",
|
|
34
|
+
"columnar",
|
|
35
|
+
"fine-grained",
|
|
36
|
+
"markdown",
|
|
37
|
+
"embeddings",
|
|
38
|
+
"vector-search"
|
|
39
|
+
],
|
|
40
|
+
"author": "RLabs Inc.",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/rlabs-inc/fsdb"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@rlabs-inc/signals": "^1.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/bun": "latest",
|
|
51
|
+
"typescript": "^5"
|
|
52
|
+
}
|
|
53
|
+
}
|