@hatk/hatk 0.0.1-alpha.21 → 0.0.1-alpha.23

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 (84) hide show
  1. package/dist/backfill.d.ts.map +1 -1
  2. package/dist/backfill.js +4 -4
  3. package/dist/car.js +1 -1
  4. package/dist/cli.js +111 -54
  5. package/dist/config.d.ts +1 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +1 -0
  8. package/dist/database/adapter-factory.d.ts +6 -0
  9. package/dist/database/adapter-factory.d.ts.map +1 -0
  10. package/dist/database/adapter-factory.js +20 -0
  11. package/dist/database/adapters/duckdb-search.d.ts +12 -0
  12. package/dist/database/adapters/duckdb-search.d.ts.map +1 -0
  13. package/dist/database/adapters/duckdb-search.js +27 -0
  14. package/dist/database/adapters/duckdb.d.ts +25 -0
  15. package/dist/database/adapters/duckdb.d.ts.map +1 -0
  16. package/dist/database/adapters/duckdb.js +161 -0
  17. package/dist/database/adapters/sqlite-search.d.ts +18 -0
  18. package/dist/database/adapters/sqlite-search.d.ts.map +1 -0
  19. package/dist/database/adapters/sqlite-search.js +38 -0
  20. package/dist/database/adapters/sqlite.d.ts +18 -0
  21. package/dist/database/adapters/sqlite.d.ts.map +1 -0
  22. package/dist/database/adapters/sqlite.js +87 -0
  23. package/dist/database/db.d.ts +149 -0
  24. package/dist/database/db.d.ts.map +1 -0
  25. package/dist/database/db.js +1456 -0
  26. package/dist/database/dialect.d.ts +45 -0
  27. package/dist/database/dialect.d.ts.map +1 -0
  28. package/dist/database/dialect.js +72 -0
  29. package/dist/database/fts.d.ts +24 -0
  30. package/dist/database/fts.d.ts.map +1 -0
  31. package/dist/database/fts.js +777 -0
  32. package/dist/database/index.d.ts +7 -0
  33. package/dist/database/index.d.ts.map +1 -0
  34. package/dist/database/index.js +6 -0
  35. package/dist/database/ports.d.ts +44 -0
  36. package/dist/database/ports.d.ts.map +1 -0
  37. package/dist/database/ports.js +1 -0
  38. package/dist/database/schema.d.ts +60 -0
  39. package/dist/database/schema.d.ts.map +1 -0
  40. package/dist/database/schema.js +388 -0
  41. package/dist/feeds.js +1 -1
  42. package/dist/hooks.d.ts +15 -0
  43. package/dist/hooks.d.ts.map +1 -0
  44. package/dist/hooks.js +65 -0
  45. package/dist/hydrate.js +1 -1
  46. package/dist/indexer.d.ts +19 -0
  47. package/dist/indexer.d.ts.map +1 -1
  48. package/dist/indexer.js +34 -4
  49. package/dist/labels.d.ts +20 -0
  50. package/dist/labels.d.ts.map +1 -1
  51. package/dist/labels.js +50 -2
  52. package/dist/logger.d.ts +29 -0
  53. package/dist/logger.d.ts.map +1 -1
  54. package/dist/logger.js +29 -0
  55. package/dist/main.js +37 -32
  56. package/dist/mst.d.ts +15 -0
  57. package/dist/mst.d.ts.map +1 -1
  58. package/dist/mst.js +13 -0
  59. package/dist/oauth/db.d.ts.map +1 -1
  60. package/dist/oauth/db.js +41 -15
  61. package/dist/oauth/server.d.ts.map +1 -1
  62. package/dist/oauth/server.js +11 -6
  63. package/dist/opengraph.js +1 -1
  64. package/dist/schema.d.ts +8 -0
  65. package/dist/schema.d.ts.map +1 -1
  66. package/dist/schema.js +29 -0
  67. package/dist/seed.d.ts +19 -0
  68. package/dist/seed.d.ts.map +1 -1
  69. package/dist/seed.js +43 -4
  70. package/dist/server.d.ts.map +1 -1
  71. package/dist/server.js +12 -6
  72. package/dist/setup.d.ts +21 -1
  73. package/dist/setup.d.ts.map +1 -1
  74. package/dist/setup.js +37 -2
  75. package/dist/test.d.ts +1 -1
  76. package/dist/test.d.ts.map +1 -1
  77. package/dist/test.js +23 -9
  78. package/dist/views.js +1 -1
  79. package/dist/vite-plugin.d.ts.map +1 -1
  80. package/dist/vite-plugin.js +10 -0
  81. package/dist/xrpc.d.ts +23 -0
  82. package/dist/xrpc.d.ts.map +1 -1
  83. package/dist/xrpc.js +37 -2
  84. package/package.json +3 -1
@@ -0,0 +1,38 @@
1
+ /**
2
+ * SQLite FTS5-based search port.
3
+ *
4
+ * Uses SQLite's built-in FTS5 virtual tables for full-text search with BM25 ranking.
5
+ * The shadow table name is reused as the FTS5 virtual table name.
6
+ */
7
+ export class SQLiteSearchPort {
8
+ port;
9
+ constructor(port) {
10
+ this.port = port;
11
+ }
12
+ async buildIndex(shadowTable, sourceQuery, searchColumns) {
13
+ // Drop existing FTS table and data table
14
+ await this.port.execute(`DROP TABLE IF EXISTS ${shadowTable}_fts`, []);
15
+ await this.port.execute(`DROP TABLE IF EXISTS ${shadowTable}`, []);
16
+ // Create the data table from the source query
17
+ await this.port.execute(`CREATE TABLE ${shadowTable} AS ${sourceQuery}`, []);
18
+ // Create the FTS5 virtual table over the search columns
19
+ const colList = searchColumns.join(', ');
20
+ await this.port.execute(`CREATE VIRTUAL TABLE ${shadowTable}_fts USING fts5(uri UNINDEXED, ${colList}, tokenize='porter unicode61 remove_diacritics 2')`, []);
21
+ // Populate FTS table from the data table
22
+ const selectCols = ['uri', ...searchColumns].map((c) => `COALESCE(CAST(${c} AS TEXT), '')`);
23
+ await this.port.execute(`INSERT INTO ${shadowTable}_fts (uri, ${colList}) SELECT ${selectCols.join(', ')} FROM ${shadowTable}`, []);
24
+ }
25
+ async search(shadowTable, query, _searchColumns, limit, offset) {
26
+ // Escape FTS5 special characters and build query
27
+ const escaped = query.replace(/['"*(){}[\]^~\\:]/g, ' ').trim();
28
+ if (!escaped)
29
+ return [];
30
+ // Use FTS5 MATCH with bm25() ranking (lower = better match, negate for DESC)
31
+ const sql = `SELECT uri, -bm25(${shadowTable}_fts) AS score
32
+ FROM ${shadowTable}_fts
33
+ WHERE ${shadowTable}_fts MATCH $1
34
+ ORDER BY score DESC
35
+ LIMIT $2 OFFSET $3`;
36
+ return this.port.query(sql, [escaped, limit, offset]);
37
+ }
38
+ }
@@ -0,0 +1,18 @@
1
+ import type { DatabasePort, BulkInserter, Dialect } from '../ports.ts';
2
+ export declare class SQLiteAdapter implements DatabasePort {
3
+ dialect: Dialect;
4
+ private db;
5
+ open(path: string): Promise<void>;
6
+ close(): void;
7
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<T[]>;
8
+ execute(sql: string, params?: unknown[]): Promise<void>;
9
+ executeMultiple(sql: string): Promise<void>;
10
+ beginTransaction(): Promise<void>;
11
+ commit(): Promise<void>;
12
+ rollback(): Promise<void>;
13
+ createBulkInserter(table: string, columns: string[], options?: {
14
+ onConflict?: 'ignore' | 'replace';
15
+ batchSize?: number;
16
+ }): Promise<BulkInserter>;
17
+ }
18
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAoBtE,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,EAAE,OAAO,CAAW;IAE3B,OAAO,CAAC,EAAE,CAAoB;IAExB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,KAAK,IAAI,IAAI;IAMP,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAMrF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,OAAO,CAAC,YAAY,CAAC;CAmCzB"}
@@ -0,0 +1,87 @@
1
+ import Database from 'better-sqlite3';
2
+ /**
3
+ * Translate DuckDB-style `$1, $2` placeholders to SQLite `?` placeholders.
4
+ * Handles repeated references to the same `$N` by duplicating the param value.
5
+ * Returns the translated SQL and expanded params array.
6
+ */
7
+ function translateParams(sql, params) {
8
+ if (params.length === 0)
9
+ return { sql, params };
10
+ const expandedParams = [];
11
+ const translated = sql.replace(/\$(\d+)/g, (_match, numStr) => {
12
+ const idx = parseInt(numStr) - 1; // $1 → index 0
13
+ expandedParams.push(params[idx]);
14
+ return '?';
15
+ });
16
+ return { sql: translated, params: expandedParams };
17
+ }
18
+ export class SQLiteAdapter {
19
+ dialect = 'sqlite';
20
+ db;
21
+ async open(path) {
22
+ this.db = new Database(path === ':memory:' ? ':memory:' : path);
23
+ this.db.pragma('journal_mode = WAL');
24
+ this.db.pragma('synchronous = NORMAL');
25
+ this.db.pragma('foreign_keys = ON');
26
+ }
27
+ close() {
28
+ try {
29
+ this.db?.close();
30
+ }
31
+ catch { }
32
+ }
33
+ async query(sql, params = []) {
34
+ const t = translateParams(sql, params);
35
+ const stmt = this.db.prepare(t.sql);
36
+ return stmt.all(...t.params);
37
+ }
38
+ async execute(sql, params = []) {
39
+ const t = translateParams(sql, params);
40
+ const stmt = this.db.prepare(t.sql);
41
+ stmt.run(...t.params);
42
+ }
43
+ async executeMultiple(sql) {
44
+ this.db.exec(sql);
45
+ }
46
+ async beginTransaction() {
47
+ this.db.exec('BEGIN');
48
+ }
49
+ async commit() {
50
+ this.db.exec('COMMIT');
51
+ }
52
+ async rollback() {
53
+ this.db.exec('ROLLBACK');
54
+ }
55
+ async createBulkInserter(table, columns, options) {
56
+ const placeholders = columns.map(() => '?').join(', ');
57
+ const conflict = options?.onConflict === 'ignore' ? ' OR IGNORE' : options?.onConflict === 'replace' ? ' OR REPLACE' : '';
58
+ const sql = `INSERT${conflict} INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`;
59
+ const stmt = this.db.prepare(sql);
60
+ const buffer = [];
61
+ const batchSize = options?.batchSize ?? 5000;
62
+ const flushBuffer = this.db.transaction(() => {
63
+ for (const row of buffer) {
64
+ stmt.run(...row);
65
+ }
66
+ });
67
+ const flush = () => {
68
+ if (buffer.length > 0) {
69
+ flushBuffer();
70
+ buffer.length = 0;
71
+ }
72
+ };
73
+ return {
74
+ append(values) {
75
+ buffer.push(values);
76
+ if (buffer.length >= batchSize)
77
+ flush();
78
+ },
79
+ async flush() {
80
+ flush();
81
+ },
82
+ async close() {
83
+ flush();
84
+ },
85
+ };
86
+ }
87
+ }
@@ -0,0 +1,149 @@
1
+ import { type TableSchema } from './schema.ts';
2
+ import type { Row } from '../lex-types.ts';
3
+ import type { DatabasePort } from './ports.ts';
4
+ import { type SqlDialect } from './dialect.ts';
5
+ export declare function getDatabasePort(): DatabasePort;
6
+ export declare function getSqlDialect(): SqlDialect;
7
+ export declare function closeDatabase(): void;
8
+ export declare function runBatch(operations: Array<{
9
+ sql: string;
10
+ params: any[];
11
+ }>): Promise<void>;
12
+ export declare function initDatabase(adapter: DatabasePort, dbPath: string, tableSchemas: TableSchema[], ddlStatements: string[]): Promise<void>;
13
+ interface MigrationChange {
14
+ table: string;
15
+ action: 'add' | 'drop' | 'retype';
16
+ column: string;
17
+ type?: string;
18
+ }
19
+ export declare function migrateSchema(tableSchemas: TableSchema[]): Promise<MigrationChange[]>;
20
+ export declare function getCursor(key: string): Promise<string | null>;
21
+ export declare function setCursor(key: string, value: string): Promise<void>;
22
+ export declare function getRepoStatus(did: string): Promise<string | null>;
23
+ export declare function setRepoStatus(did: string, status: string, rev?: string, opts?: {
24
+ retryCount?: number;
25
+ retryAfter?: number;
26
+ handle?: string | null;
27
+ }): Promise<void>;
28
+ export declare function getRepoRev(did: string): Promise<string | null>;
29
+ export declare function getRepoRetryInfo(did: string): Promise<{
30
+ retryCount: number;
31
+ retryAfter: number;
32
+ } | null>;
33
+ export declare function listRetryEligibleRepos(maxRetries: number): Promise<string[]>;
34
+ export declare function listPendingRepos(): Promise<string[]>;
35
+ export declare function listAllRepoStatuses(): Promise<Array<{
36
+ did: string;
37
+ status: string;
38
+ }>>;
39
+ export declare function listReposPaginated(opts?: {
40
+ limit?: number;
41
+ offset?: number;
42
+ status?: string;
43
+ q?: string;
44
+ }): Promise<{
45
+ repos: any[];
46
+ total: number;
47
+ }>;
48
+ export declare function getCollectionCounts(): Promise<Record<string, number>>;
49
+ export declare function getSchemaDump(): Promise<string>;
50
+ export declare function buildInsertOp(collection: string, uri: string, cid: string, authorDid: string, record: Record<string, any>): {
51
+ sql: string;
52
+ params: any[];
53
+ };
54
+ export declare function insertRecord(collection: string, uri: string, cid: string, authorDid: string, record: Record<string, any>): Promise<void>;
55
+ export declare function deleteRecord(collection: string, uri: string): Promise<void>;
56
+ export declare function insertLabels(labels: Array<{
57
+ src: string;
58
+ uri: string;
59
+ val: string;
60
+ neg?: boolean;
61
+ cts?: string;
62
+ exp?: string;
63
+ }>): Promise<void>;
64
+ export declare function queryLabelsForUris(uris: string[]): Promise<Map<string, Array<{
65
+ src: string;
66
+ uri: string;
67
+ val: string;
68
+ neg: boolean;
69
+ cts: string;
70
+ exp: string | null;
71
+ }>>>;
72
+ export interface BulkRecord {
73
+ collection: string;
74
+ uri: string;
75
+ cid: string;
76
+ did: string;
77
+ record: Record<string, any>;
78
+ }
79
+ export declare function bulkInsertRecords(records: BulkRecord[]): Promise<number>;
80
+ interface QueryOpts {
81
+ limit?: number;
82
+ cursor?: string;
83
+ filters?: Record<string, string>;
84
+ sort?: string;
85
+ order?: 'asc' | 'desc';
86
+ }
87
+ export declare function queryRecords(collection: string, opts?: QueryOpts): Promise<{
88
+ records: any[];
89
+ cursor?: string;
90
+ }>;
91
+ export declare function getRecordByUri(uri: string): Promise<any | null>;
92
+ export declare function getRecordsByUris(collection: string, uris: string[]): Promise<any[]>;
93
+ /**
94
+ * Multi-phase search across any collection's records.
95
+ *
96
+ * 1. **BM25** — Full-text search via DuckDB FTS. Multi-word queries use conjunctive
97
+ * mode (ALL terms required) to avoid spurious single-token matches.
98
+ * 2. **Exact substring** — ILIKE scan on all TEXT/JSON columns catches phrase matches
99
+ * that BM25 missed or ranked low (e.g. "bad bunny"). Results are prepended to BM25.
100
+ * 3. **Recent rows** — ILIKE scan of rows ingested since the last FTS rebuild, so newly
101
+ * written records are immediately searchable before the index catches up.
102
+ * 4. **Fuzzy** — Jaro-Winkler similarity fallback for typo tolerance when earlier phases
103
+ * return fewer than `limit` results.
104
+ *
105
+ * All phases derive searchable columns generically from the collection schema — no
106
+ * column names are hardcoded.
107
+ */
108
+ export declare function searchRecords(collection: string, query: string, opts?: {
109
+ limit?: number;
110
+ cursor?: string;
111
+ fuzzy?: boolean;
112
+ }): Promise<{
113
+ records: any[];
114
+ cursor?: string;
115
+ }>;
116
+ export declare function querySQL(sql: string, params?: any[]): Promise<any[]>;
117
+ export declare function runSQL(sql: string, params?: any[]): Promise<void>;
118
+ export declare function createBulkInserterSQL(table: string, columns: string[], options?: {
119
+ onConflict?: 'ignore' | 'replace';
120
+ batchSize?: number;
121
+ }): Promise<import('./ports.ts').BulkInserter>;
122
+ export declare function getSchema(collection: string): TableSchema | undefined;
123
+ export declare function countByField(collection: string, field: string, value: string): Promise<number>;
124
+ export declare function countByFieldBatch(collection: string, field: string, values: string[]): Promise<Map<string, number>>;
125
+ export declare function findByField(collection: string, field: string, value: string): Promise<any | null>;
126
+ export declare function findByFieldBatch(collection: string, field: string, values: string[]): Promise<Map<string, any[]>>;
127
+ export declare function lookupByFieldBatch(collection: string, field: string, values: string[]): Promise<Map<string, Row<unknown>>>;
128
+ export declare function findUriByFields(collection: string, conditions: {
129
+ field: string;
130
+ value: string;
131
+ }[]): Promise<string | null>;
132
+ export declare function normalizeValue(v: any): any;
133
+ export declare function getChildRows(childTableName: string, parentUris: string[]): Promise<Map<string, any[]>>;
134
+ export declare function reshapeRow(row: any, childData?: Map<string, Map<string, any[]>>, unionData?: Map<string, Map<string, Map<string, any[]>>>): Row<unknown> | null;
135
+ export declare function packCursor(sortVal: unknown, cid: string): string;
136
+ export declare function unpackCursor(cursor: string): {
137
+ primary: string;
138
+ cid: string;
139
+ } | null;
140
+ export declare function queryLabelsByDid(did: string): Promise<any[]>;
141
+ export declare function searchAccounts(query: string, limit?: number): Promise<any[]>;
142
+ export declare function getAccountRecordCount(did: string): Promise<number>;
143
+ export declare function getAllRecordUrisForDid(did: string): Promise<string[]>;
144
+ export declare function isTakendownDid(did: string): Promise<boolean>;
145
+ export declare function getPreferences(did: string): Promise<Record<string, any>>;
146
+ export declare function putPreference(did: string, key: string, value: any): Promise<void>;
147
+ export declare function filterTakendownDids(dids: string[]): Promise<Set<string>>;
148
+ export {};
149
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"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"}