@vpxa/aikit 0.1.174 → 0.1.175

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 (38) hide show
  1. package/package.json +3 -3
  2. package/packages/blocks-core/dist/index.d.ts +2 -1
  3. package/packages/blocks-core/dist/index.js +1 -1
  4. package/packages/cli/dist/index.js +16 -16
  5. package/packages/cli/dist/{init-BVU1RVy5.js → init-BDZpaO7q.js} +1 -1
  6. package/packages/cli/dist/{scaffold-BB6OrTuA.js → scaffold-BdUnq1xy.js} +1 -1
  7. package/packages/core/dist/index.d.ts +29 -1
  8. package/packages/dashboard/dist/assets/{index-ehoWAjDs.js → index-4HQiq-qo.js} +2 -2
  9. package/packages/dashboard/dist/index.html +1 -1
  10. package/packages/present/dist/index.html +45 -45
  11. package/packages/server/dist/auth-BfqgawfR.js +1 -0
  12. package/packages/server/dist/config-DAnAxrUW.js +1 -0
  13. package/packages/server/dist/{curated-manager-BkSgtNC2.js → curated-manager-BnP6VqvL.js} +4 -4
  14. package/packages/server/dist/index.js +1 -1
  15. package/packages/server/dist/proxy.d.ts +32 -0
  16. package/packages/server/dist/proxy.js +4 -0
  17. package/packages/server/dist/server-B0gtRiNa.js +2909 -0
  18. package/packages/server/dist/supersession-DJQGXMWm.js +2 -0
  19. package/packages/settings-ui/dist/assets/{index-DSTxXokO.js → index-DLcLvASh.js} +2 -2
  20. package/packages/store/dist/index.d.ts +135 -1
  21. package/packages/store/dist/index.js +447 -12
  22. package/packages/tools/dist/index.d.ts +72 -30
  23. package/packages/tools/dist/index.js +72 -73
  24. package/{scaffold/general → packages}/viewers/README.md +1 -1
  25. package/scaffold/dist/definitions/prompts.mjs +1 -1
  26. package/scaffold/dist/definitions/protocols.mjs +2 -0
  27. package/scaffold/dist/definitions/skills/aikit.mjs +1 -1
  28. package/scaffold/dist/definitions/skills/c4-architecture.mjs +1 -1
  29. package/scaffold/dist/definitions/skills/docs.mjs +1 -1
  30. package/scaffold/dist/definitions/tools.mjs +1 -1
  31. package/packages/server/dist/config-Dsu2Kd3U.js +0 -1
  32. package/packages/server/dist/server-CqEB0MaC.js +0 -2901
  33. /package/packages/cli/dist/{templates-D-eA4QVK.js → templates-Do9eni2d.js} +0 -0
  34. /package/packages/server/dist/{dashboard-static-BfIe0Si1.js → dashboard-static-CnXafYTs.js} +0 -0
  35. /package/packages/server/dist/{routes-gbC5Wmr9.js → routes-CR3fI-HJ.js} +0 -0
  36. /package/packages/server/dist/{settings-static-BosGZSPf.js → settings-static-BkVLqWOr.js} +0 -0
  37. /package/packages/server/dist/{version-check-Bj07vc5x.js → version-check-BgHzxxCW.js} +0 -0
  38. /package/packages/store/dist/{lance-store-BIP1LEiS.js → lance-store-BRKcJXVO.js} +0 -0
@@ -1,4 +1,85 @@
1
- import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as n,readFileSync as r,renameSync as i,unlinkSync as a,writeFileSync as o}from"node:fs";import{dirname as s,join as c}from"node:path";import{AIKIT_PATHS as l,EMBEDDING_DEFAULTS as u,SEARCH_DEFAULTS as d,STORE_DEFAULTS as f,createLogger as p,serializeError as m,sourceTypeContentTypes as h}from"../../core/dist/index.js";var g=e(import.meta.url);const _=p(`sqlite-adapter`),v=e(import.meta.url);var y=class{type=`better-sqlite3`;vectorCapable=!1;db=null;stmtCache=new Map;dbPath=``;DatabaseCtor=null;recovering=!1;async open(e){let t;try{t=v(`better-sqlite3`)}catch(e){throw Error(`better-sqlite3 native binding unavailable: ${e instanceof Error?e.message:String(e)}`)}this.db=new t(e),this.dbPath=e,this.DatabaseCtor=t,this.db.pragma(`journal_mode = WAL`),this.db.pragma(`foreign_keys = ON`),this.db.pragma(`synchronous = NORMAL`),this.runIntegrityCheck(e,t)||(this.db?.pragma(`journal_mode = WAL`),this.db?.pragma(`foreign_keys = ON`),this.db?.pragma(`synchronous = NORMAL`));try{v(`sqlite-vec`).load(this.db),this.vectorCapable=!0,_.info(`sqlite-vec extension loaded`)}catch(e){this.vectorCapable=!1,_.warn(`sqlite-vec extension failed to load; vector search disabled`,m(e))}}exec(e){try{this.getDb().exec(e)}catch(t){if(this.isCorruptionError(t)){this.recover(),this.getDb().exec(e);return}throw t}}pragma(e){this.getDb().pragma(e)}queryAll(e,t=[]){try{let n=this.prepareCached(e);return t.length>0?n.all(...t):n.all()}catch(n){if(this.isCorruptionError(n))return this.recover(),this.queryAll(e,t);throw n}}run(e,t=[]){try{let n=this.prepareCached(e);t.length>0?n.run(...t):n.run()}catch(n){if(this.isCorruptionError(n)){this.recover(),this.run(e,t);return}throw n}}flush(){}close(){this.db&&=(this.stmtCache.clear(),this.db.close(),null)}runIntegrityCheck(e,t){try{let t=this.db?.pragma(`integrity_check`);if(t.length===1&&t[0]?.integrity_check===`ok`)return!0;let n=t.map(e=>e.integrity_check).slice(0,5).join(`; `);_.warn(`Database integrity check failed — recreating`,{dbPath:e,issues:n})}catch(t){_.warn(`Integrity check query failed — recreating database`,{dbPath:e,error:m(t)})}try{this.db?.close()}catch{}this.db=null,this.stmtCache.clear();try{a(e)}catch{}try{a(`${e}-wal`)}catch{}try{a(`${e}-shm`)}catch{}return this.db=new t(e),_.info(`Database recreated successfully — full reindex required`,{dbPath:e}),!1}isCorruptionError(e){if(this.recovering)return!1;let t=e instanceof Error?e.message:String(e);return/database disk image is malformed|file is not a database|database or disk is full/.test(t)}recover(){if(this.recovering)throw Error(`BetterSqlite3Adapter: recovery already in progress`);this.recovering=!0;try{_.warn(`Runtime corruption detected — recovering database`,{dbPath:this.dbPath});try{this.db?.close()}catch{}this.db=null,this.stmtCache.clear();try{a(this.dbPath)}catch{}try{a(`${this.dbPath}-wal`)}catch{}try{a(`${this.dbPath}-shm`)}catch{}if(!this.DatabaseCtor)throw Error(`DatabaseCtor is not initialized`);this.db=this.DatabaseCtor(this.dbPath),this.db.pragma(`journal_mode = WAL`),this.db.pragma(`foreign_keys = ON`),this.db.pragma(`synchronous = NORMAL`);try{v(`sqlite-vec`).load(this.db),this.vectorCapable=!0}catch{this.vectorCapable=!1}_.info(`Database recovered — full reindex required`,{dbPath:this.dbPath})}finally{this.recovering=!1}}getDb(){if(!this.db)throw Error(`BetterSqlite3Adapter: database not opened`);return this.db}prepareCached(e){let t=this.stmtCache.get(e);if(t)return t;let n=this.getDb().prepare(e);return this.stmtCache.set(e,n),n}};function b(e){return v.resolve(`sql.js/dist/${e}`)}var x=class{type=`sql.js`;vectorCapable=!1;db=null;dbPath=``;dirty=!1;inTransaction=!1;async open(e){this.dbPath=e;let n=(await import(`sql.js`)).default,i=await n({locateFile:e=>b(e)});if(t(e)){let t=r(e);this.db=new i.Database(t)}else this.db=new i.Database}exec(e){let t=e.trimStart().toUpperCase();this.getDb().run(e),t.startsWith(`BEGIN`)?this.inTransaction=!0:(t.startsWith(`COMMIT`)||t.startsWith(`ROLLBACK`))&&(this.inTransaction=!1),this.dirty=!0}pragma(e){this.getDb().exec(`PRAGMA ${e}`)}queryAll(e,t=[]){let n=this.getDb().prepare(e);try{t.length>0&&n.bind(t);let e=[];for(;n.step();)e.push(n.getAsObject());return e}finally{n.free()}}run(e,t=[]){let n=this.getDb(),r=e.trimStart().toUpperCase(),i=!this.inTransaction&&(r.startsWith(`INSERT`)||r.startsWith(`UPDATE`));i&&n.run(`SAVEPOINT fk_check`);try{if(t.length>0){let r=n.prepare(e);try{r.bind(t),r.step()}finally{r.free()}}else n.run(e);if(i){if(n.exec(`PRAGMA foreign_key_check`).length>0)throw n.run(`ROLLBACK TO fk_check`),n.run(`RELEASE fk_check`),Error(`FOREIGN KEY constraint failed`);n.run(`RELEASE fk_check`)}}catch(e){if(i)try{n.run(`ROLLBACK TO fk_check`),n.run(`RELEASE fk_check`)}catch{}throw e}this.dirty=!0}flush(){if(!this.dirty||!this.db)return;let e=this.db.export(),r=`${this.dbPath}.tmp`,a=s(this.dbPath);a&&!t(a)&&n(a,{recursive:!0}),o(r,Buffer.from(e)),i(r,this.dbPath),this.dirty=!1}close(){if(this.db){let e=this.db,t;try{this.flush()}catch(e){t=e;try{a(`${this.dbPath}.tmp`)}catch{}}try{e.close()}finally{this.db=null}if(t)throw t}}getDb(){if(!this.db)throw Error(`SqlJsAdapter: database not opened`);return this.db}};function S(){try{let e=c(v.resolve(`better-sqlite3/package.json`).replace(/[\\/]package\.json$/,``),`build`,`Release`,`better_sqlite3.node`);return t(e)?e:null}catch{return null}}async function C(){if(!S())return`missing`;try{let{execSync:e}=await import(`node:child_process`);return e(`"${process.execPath}" -e "require('better-sqlite3')"`,{stdio:`pipe`,timeout:15e3}),`ok`}catch(e){let t=e instanceof Error&&`stderr`in e?String(e.stderr):``;return/NODE_MODULE_VERSION/.test(t)?`abi-mismatch`:/Could not locate the bindings file|no native build was found/.test(t)?`missing`:`error`}}async function w(e=!1){try{let{execSync:n}=await import(`node:child_process`),r=v.resolve(`better-sqlite3/package.json`).replace(/[\\/]package\.json$/,``),i=r.replace(/[\\/]node_modules[\\/]better-sqlite3$/,``);if(e){let e=c(r,`build`,`Release`,`better_sqlite3.node`);if(t(e))try{a(e),_.info(`Deleted stale native binding before rebuild`,{path:e})}catch(t){_.warn(`Cannot delete stale native binding — file may be locked by another process`,{path:e,error:t instanceof Error?t.message:String(t)})}}return _.info(`Attempting native module rebuild for better-sqlite3`,{cwd:i}),n(`npm rebuild better-sqlite3`,{cwd:i,stdio:`pipe`,timeout:6e4}),_.info(`Native module rebuild completed successfully`),!0}catch(e){return _.warn(`Native module rebuild failed — continuing with sql.js fallback`,m(e)),!1}}let T=!1;function E(){return!!process.env.VITEST||process.argv.some(e=>e.includes(`vitest`))}async function D(e){if(!E()){let e=await C();e===`abi-mismatch`?(_.info(`Detected NODE_MODULE_VERSION mismatch via pre-flight probe — rebuilding before load`),await w(!0)&&_.info(`Pre-flight rebuild succeeded — proceeding with native adapter`)):e===`missing`&&(_.info(`No native binding found — attempting rebuild before load`),await w(!1))}let t=new y;try{return await t.open(e),t}catch(t){let n=t instanceof Error?t.message:String(t);if(!E()&&/NODE_MODULE_VERSION|Could not locate the bindings file|no native build was found/.test(n)&&await w(!1)){let t=new y;try{return await t.open(e),_.info(`better-sqlite3 recovered after native module rebuild`),t}catch{}}T||(T=!0,_.warn(`[aikit] better-sqlite3 unavailable — falling back to sql.js (vector search disabled). Reinstall with prebuild support or rebuild from source to enable vector search.`,m(t)))}let n=new x;try{return await n.open(e),n}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`[aikit] SQLite adapter "sql.js" failed to load: ${t}`)}}async function O(e){let t=new x;return await t.open(e),t}var k=class{adapter=null;reopenPromise=null;dbPath;externalAdapter;constructor(e={}){if(e.adapter)this.adapter=e.adapter,this.externalAdapter=!0,this.dbPath=``;else{let t=e.path??l.data;this.dbPath=c(t,`graph.db`),this.externalAdapter=!1}}async initialize(){if(this.externalAdapter){let e=this.getAdapter();this.createTables(e),this.migrateSchema(e),e.flush();return}let e=s(this.dbPath);t(e)||n(e,{recursive:!0}),this.adapter=await D(this.dbPath),this.configureAdapter(this.adapter),this.createTables(this.adapter),this.migrateSchema(this.adapter),this.adapter.flush()}configureAdapter(e){e.pragma(`journal_mode = WAL`),e.pragma(`foreign_keys = ON`)}createTables(e){e.exec(`
1
+ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as n,readFileSync as r,renameSync as i,unlinkSync as a,writeFileSync as o}from"node:fs";import{dirname as s,join as c}from"node:path";import{AIKIT_PATHS as l,EMBEDDING_DEFAULTS as u,SEARCH_DEFAULTS as d,STORE_DEFAULTS as f,createLogger as p,serializeError as m,sourceTypeContentTypes as h}from"../../core/dist/index.js";var g=e(import.meta.url);function _(e){e.exec(`
2
+ CREATE TABLE IF NOT EXISTS _migrations (
3
+ version INTEGER PRIMARY KEY,
4
+ name TEXT NOT NULL,
5
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
6
+ )
7
+ `)}function v(e,t){_(e);let n=new Set(e.queryAll(`SELECT version FROM _migrations`).map(e=>e.version)),r=[...t].sort((e,t)=>e.version-t.version).filter(e=>!n.has(e.version));for(let t of r){e.exec(`BEGIN`);try{t.up(e),e.run(`INSERT INTO _migrations (version, name) VALUES (?, ?)`,[t.version,t.name]),e.exec(`COMMIT`)}catch(t){try{e.exec(`ROLLBACK`)}catch{}throw t}}}const y=[{version:1,name:`create state store tables`,up(e){e.exec(`
8
+ CREATE TABLE IF NOT EXISTS stash (
9
+ key TEXT PRIMARY KEY,
10
+ value TEXT NOT NULL,
11
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
12
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS checkpoints (
16
+ id TEXT PRIMARY KEY,
17
+ label TEXT NOT NULL,
18
+ data TEXT NOT NULL,
19
+ notes TEXT,
20
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
21
+ );
22
+
23
+ CREATE TABLE IF NOT EXISTS sessions (
24
+ session_id TEXT PRIMARY KEY,
25
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
26
+ last_activity TEXT NOT NULL DEFAULT (datetime('now')),
27
+ metadata TEXT
28
+ );
29
+
30
+ CREATE TABLE IF NOT EXISTS signals (
31
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
32
+ workspace TEXT NOT NULL,
33
+ key TEXT NOT NULL,
34
+ value TEXT NOT NULL,
35
+ agent TEXT,
36
+ ttl_seconds INTEGER NOT NULL DEFAULT 300,
37
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
38
+ expires_at TEXT NOT NULL
39
+ );
40
+
41
+ CREATE TABLE IF NOT EXISTS leases (
42
+ workspace TEXT NOT NULL,
43
+ resource TEXT NOT NULL,
44
+ holder TEXT NOT NULL,
45
+ intent TEXT,
46
+ ttl_minutes INTEGER NOT NULL DEFAULT 10,
47
+ acquired_at TEXT NOT NULL DEFAULT (datetime('now')),
48
+ expires_at TEXT NOT NULL,
49
+ PRIMARY KEY (workspace, resource)
50
+ );
51
+
52
+ CREATE TABLE IF NOT EXISTS memory_meta (
53
+ entry_id TEXT PRIMARY KEY,
54
+ tier TEXT NOT NULL DEFAULT 'working',
55
+ retention_score REAL NOT NULL DEFAULT 1.0,
56
+ access_count INTEGER NOT NULL DEFAULT 0,
57
+ last_accessed_at TEXT,
58
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
59
+ promoted_at TEXT,
60
+ superseded_by TEXT,
61
+ confidence INTEGER DEFAULT 50
62
+ )
63
+ `)}},{version:2,name:`scope leases by workspace and resource`,up(e){let t=e.queryAll(`SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'leases'`)[0]?.sql??``;/PRIMARY KEY\s*\(\s*workspace\s*,\s*resource\s*\)/i.test(t)||e.exec(`
64
+ ALTER TABLE leases RENAME TO leases_legacy;
65
+
66
+ CREATE TABLE leases (
67
+ workspace TEXT NOT NULL,
68
+ resource TEXT NOT NULL,
69
+ holder TEXT NOT NULL,
70
+ intent TEXT,
71
+ ttl_minutes INTEGER NOT NULL DEFAULT 10,
72
+ acquired_at TEXT NOT NULL DEFAULT (datetime('now')),
73
+ expires_at TEXT NOT NULL,
74
+ PRIMARY KEY (workspace, resource)
75
+ );
76
+
77
+ INSERT INTO leases (workspace, resource, holder, intent, ttl_minutes, acquired_at, expires_at)
78
+ SELECT workspace, resource, holder, intent, ttl_minutes, acquired_at, expires_at
79
+ FROM leases_legacy;
80
+
81
+ DROP TABLE leases_legacy;
82
+ `)}}],b=p(`sqlite-adapter`),x=e(import.meta.url);var S=class{type=`better-sqlite3`;vectorCapable=!1;db=null;stmtCache=new Map;dbPath=``;DatabaseCtor=null;recovering=!1;async open(e){let t;try{t=x(`better-sqlite3`)}catch(e){throw Error(`better-sqlite3 native binding unavailable: ${e instanceof Error?e.message:String(e)}`)}this.db=new t(e),this.dbPath=e,this.DatabaseCtor=t,this.db.pragma(`journal_mode = WAL`),this.db.pragma(`foreign_keys = ON`),this.db.pragma(`synchronous = NORMAL`),this.runIntegrityCheck(e,t)||(this.db?.pragma(`journal_mode = WAL`),this.db?.pragma(`foreign_keys = ON`),this.db?.pragma(`synchronous = NORMAL`));try{x(`sqlite-vec`).load(this.db),this.vectorCapable=!0,b.info(`sqlite-vec extension loaded`)}catch(e){this.vectorCapable=!1,b.warn(`sqlite-vec extension failed to load; vector search disabled`,m(e))}}exec(e){try{this.getDb().exec(e)}catch(t){if(this.isCorruptionError(t)){this.recover(),this.getDb().exec(e);return}throw t}}pragma(e){this.getDb().pragma(e)}queryAll(e,t=[]){try{let n=this.prepareCached(e);return t.length>0?n.all(...t):n.all()}catch(n){if(this.isCorruptionError(n))return this.recover(),this.queryAll(e,t);throw n}}run(e,t=[]){try{let n=this.prepareCached(e);t.length>0?n.run(...t):n.run()}catch(n){if(this.isCorruptionError(n)){this.recover(),this.run(e,t);return}throw n}}flush(){}close(){this.db&&=(this.stmtCache.clear(),this.db.close(),null)}runIntegrityCheck(e,t){try{let t=this.db?.pragma(`integrity_check`);if(t.length===1&&t[0]?.integrity_check===`ok`)return!0;let n=t.map(e=>e.integrity_check).slice(0,5).join(`; `);b.warn(`Database integrity check failed — recreating`,{dbPath:e,issues:n})}catch(t){b.warn(`Integrity check query failed — recreating database`,{dbPath:e,error:m(t)})}try{this.db?.close()}catch{}this.db=null,this.stmtCache.clear();try{a(e)}catch{}try{a(`${e}-wal`)}catch{}try{a(`${e}-shm`)}catch{}return this.db=new t(e),b.info(`Database recreated successfully — full reindex required`,{dbPath:e}),!1}isCorruptionError(e){if(this.recovering)return!1;let t=e instanceof Error?e.message:String(e);return/database disk image is malformed|file is not a database|database or disk is full/.test(t)}recover(){if(this.recovering)throw Error(`BetterSqlite3Adapter: recovery already in progress`);this.recovering=!0;try{b.warn(`Runtime corruption detected — recovering database`,{dbPath:this.dbPath});try{this.db?.close()}catch{}this.db=null,this.stmtCache.clear();try{a(this.dbPath)}catch{}try{a(`${this.dbPath}-wal`)}catch{}try{a(`${this.dbPath}-shm`)}catch{}if(!this.DatabaseCtor)throw Error(`DatabaseCtor is not initialized`);this.db=this.DatabaseCtor(this.dbPath),this.db.pragma(`journal_mode = WAL`),this.db.pragma(`foreign_keys = ON`),this.db.pragma(`synchronous = NORMAL`);try{x(`sqlite-vec`).load(this.db),this.vectorCapable=!0}catch{this.vectorCapable=!1}b.info(`Database recovered — full reindex required`,{dbPath:this.dbPath})}finally{this.recovering=!1}}getDb(){if(!this.db)throw Error(`BetterSqlite3Adapter: database not opened`);return this.db}prepareCached(e){let t=this.stmtCache.get(e);if(t)return t;let n=this.getDb().prepare(e);return this.stmtCache.set(e,n),n}};function C(e){return x.resolve(`sql.js/dist/${e}`)}var w=class{type=`sql.js`;vectorCapable=!1;db=null;dbPath=``;dirty=!1;inTransaction=!1;async open(e){this.dbPath=e;let n=(await import(`sql.js`)).default,i=await n({locateFile:e=>C(e)});if(t(e)){let t=r(e);this.db=new i.Database(t)}else this.db=new i.Database}exec(e){let t=e.trimStart().toUpperCase();this.getDb().run(e),t.startsWith(`BEGIN`)?this.inTransaction=!0:(t.startsWith(`COMMIT`)||t.startsWith(`ROLLBACK`))&&(this.inTransaction=!1),this.dirty=!0}pragma(e){this.getDb().exec(`PRAGMA ${e}`)}queryAll(e,t=[]){let n=this.getDb().prepare(e);try{t.length>0&&n.bind(t);let e=[];for(;n.step();)e.push(n.getAsObject());return e}finally{n.free()}}run(e,t=[]){let n=this.getDb(),r=e.trimStart().toUpperCase(),i=!this.inTransaction&&(r.startsWith(`INSERT`)||r.startsWith(`UPDATE`));i&&n.run(`SAVEPOINT fk_check`);try{if(t.length>0){let r=n.prepare(e);try{r.bind(t),r.step()}finally{r.free()}}else n.run(e);if(i){if(n.exec(`PRAGMA foreign_key_check`).length>0)throw n.run(`ROLLBACK TO fk_check`),n.run(`RELEASE fk_check`),Error(`FOREIGN KEY constraint failed`);n.run(`RELEASE fk_check`)}}catch(e){if(i)try{n.run(`ROLLBACK TO fk_check`),n.run(`RELEASE fk_check`)}catch{}throw e}this.dirty=!0}flush(){if(!this.dirty||!this.db)return;let e=this.db.export(),r=`${this.dbPath}.tmp`,a=s(this.dbPath);a&&!t(a)&&n(a,{recursive:!0}),o(r,Buffer.from(e)),i(r,this.dbPath),this.dirty=!1}close(){if(this.db){let e=this.db,t;try{this.flush()}catch(e){t=e;try{a(`${this.dbPath}.tmp`)}catch{}}try{e.close()}finally{this.db=null}if(t)throw t}}getDb(){if(!this.db)throw Error(`SqlJsAdapter: database not opened`);return this.db}};function T(){try{let e=c(x.resolve(`better-sqlite3/package.json`).replace(/[\\/]package\.json$/,``),`build`,`Release`,`better_sqlite3.node`);return t(e)?e:null}catch{return null}}async function E(){if(!T())return`missing`;try{let{execSync:e}=await import(`node:child_process`);return e(`"${process.execPath}" -e "require('better-sqlite3')"`,{stdio:`pipe`,timeout:15e3}),`ok`}catch(e){let t=e instanceof Error&&`stderr`in e?String(e.stderr):``;return/NODE_MODULE_VERSION/.test(t)?`abi-mismatch`:/Could not locate the bindings file|no native build was found/.test(t)?`missing`:`error`}}async function D(e=!1){try{let{execSync:n}=await import(`node:child_process`),r=x.resolve(`better-sqlite3/package.json`).replace(/[\\/]package\.json$/,``),i=r.replace(/[\\/]node_modules[\\/]better-sqlite3$/,``);if(e){let e=c(r,`build`,`Release`,`better_sqlite3.node`);if(t(e))try{a(e),b.info(`Deleted stale native binding before rebuild`,{path:e})}catch(t){b.warn(`Cannot delete stale native binding — file may be locked by another process`,{path:e,error:t instanceof Error?t.message:String(t)})}}return b.info(`Attempting native module rebuild for better-sqlite3`,{cwd:i}),n(`npm rebuild better-sqlite3`,{cwd:i,stdio:`pipe`,timeout:6e4}),b.info(`Native module rebuild completed successfully`),!0}catch(e){return b.warn(`Native module rebuild failed — continuing with sql.js fallback`,m(e)),!1}}let O=!1;function k(){return!!process.env.VITEST||process.argv.some(e=>e.includes(`vitest`))}async function A(e){if(!k()){let e=await E();e===`abi-mismatch`?(b.info(`Detected NODE_MODULE_VERSION mismatch via pre-flight probe — rebuilding before load`),await D(!0)&&b.info(`Pre-flight rebuild succeeded — proceeding with native adapter`)):e===`missing`&&(b.info(`No native binding found — attempting rebuild before load`),await D(!1))}let t=new S;try{return await t.open(e),t}catch(t){let n=t instanceof Error?t.message:String(t);if(!k()&&/NODE_MODULE_VERSION|Could not locate the bindings file|no native build was found/.test(n)&&await D(!1)){let t=new S;try{return await t.open(e),b.info(`better-sqlite3 recovered after native module rebuild`),t}catch{}}O||(O=!0,b.warn(`[aikit] better-sqlite3 unavailable — falling back to sql.js (vector search disabled). Reinstall with prebuild support or rebuild from source to enable vector search.`,m(t)))}let n=new w;try{return await n.open(e),n}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`[aikit] SQLite adapter "sql.js" failed to load: ${t}`)}}async function j(e){let t=new w;return await t.open(e),t}var M=class{adapter=null;reopenPromise=null;dbPath;externalAdapter;constructor(e={}){if(e.adapter)this.adapter=e.adapter,this.externalAdapter=!0,this.dbPath=``;else{let t=e.path??l.data;this.dbPath=c(t,`graph.db`),this.externalAdapter=!1}}async initialize(){if(this.externalAdapter){let e=this.getAdapter();this.createTables(e),this.migrateSchema(e),e.flush();return}let e=s(this.dbPath);t(e)||n(e,{recursive:!0}),this.adapter=await A(this.dbPath),this.configureAdapter(this.adapter),this.createTables(this.adapter),this.migrateSchema(this.adapter),this.adapter.flush()}configureAdapter(e){e.pragma(`journal_mode = WAL`),e.pragma(`foreign_keys = ON`)}createTables(e){e.exec(`
2
83
  CREATE TABLE IF NOT EXISTS nodes (
3
84
  id TEXT PRIMARY KEY,
4
85
  type TEXT NOT NULL,
@@ -39,7 +120,7 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
39
120
  FOREIGN KEY (process_id) REFERENCES processes(id) ON DELETE CASCADE,
40
121
  FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE
41
122
  )
42
- `),e.exec(`CREATE INDEX IF NOT EXISTS idx_process_steps_node ON process_steps(node_id)`)}migrateSchema(e){for(let t of[`ALTER TABLE edges ADD COLUMN confidence REAL DEFAULT 1.0`,`ALTER TABLE nodes ADD COLUMN community TEXT`])try{e.exec(t)}catch{}e.exec(`CREATE INDEX IF NOT EXISTS idx_nodes_community ON nodes(community)`)}getAdapter(){if(!this.adapter)throw Error(`SqliteGraphStore not initialized — call initialize() first`);return this.adapter}async ensureOpen(){if(this.adapter)return;if(this.externalAdapter)throw Error(`SqliteGraphStore: external adapter has been closed by its owner; cannot reopen`);if(this.reopenPromise)return this.reopenPromise;let e=this.reopenAdapter();this.reopenPromise=e;try{await e}finally{this.reopenPromise===e&&(this.reopenPromise=null)}}async reopenAdapter(){let e=await D(this.dbPath);this.configureAdapter(e),this.adapter=e}query(e,t=[]){return this.getAdapter().queryAll(e,t)}run(e,t=[]){this.getAdapter().run(e,t)}async upsertNode(e){await this.ensureOpen(),this.run(`INSERT INTO nodes (id, type, name, properties, source_record_id, source_path, created_at, community)
123
+ `),e.exec(`CREATE INDEX IF NOT EXISTS idx_process_steps_node ON process_steps(node_id)`)}migrateSchema(e){for(let t of[`ALTER TABLE edges ADD COLUMN confidence REAL DEFAULT 1.0`,`ALTER TABLE nodes ADD COLUMN community TEXT`])try{e.exec(t)}catch{}e.exec(`CREATE INDEX IF NOT EXISTS idx_nodes_community ON nodes(community)`)}getAdapter(){if(!this.adapter)throw Error(`SqliteGraphStore not initialized — call initialize() first`);return this.adapter}async ensureOpen(){if(this.adapter)return;if(this.externalAdapter)throw Error(`SqliteGraphStore: external adapter has been closed by its owner; cannot reopen`);if(this.reopenPromise)return this.reopenPromise;let e=this.reopenAdapter();this.reopenPromise=e;try{await e}finally{this.reopenPromise===e&&(this.reopenPromise=null)}}async reopenAdapter(){let e=await A(this.dbPath);this.configureAdapter(e),this.adapter=e}query(e,t=[]){return this.getAdapter().queryAll(e,t)}run(e,t=[]){this.getAdapter().run(e,t)}async upsertNode(e){await this.ensureOpen(),this.run(`INSERT INTO nodes (id, type, name, properties, source_record_id, source_path, created_at, community)
43
124
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
44
125
  ON CONFLICT(id) DO UPDATE SET
45
126
  type = excluded.type, name = excluded.name, properties = excluded.properties,
@@ -57,19 +138,19 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
57
138
  VALUES (?, ?, ?, ?, ?, ?, ?)
58
139
  ON CONFLICT(id) DO UPDATE SET
59
140
  from_id = excluded.from_id, to_id = excluded.to_id,
60
- type = excluded.type, weight = excluded.weight, confidence = excluded.confidence, properties = excluded.properties`,[t.id,t.fromId,t.toId,t.type,t.weight??1,t.confidence??1,JSON.stringify(t.properties??{})]);t.exec(`COMMIT`),t.flush()}catch(e){throw t.exec(`ROLLBACK`),e}finally{t.pragma(`foreign_keys = ON`)}}async getNode(e){await this.ensureOpen();let t=this.query(`SELECT * FROM nodes WHERE id = ?`,[e]);return t.length>0?j(t[0]):null}async getNeighbors(e,t){await this.ensureOpen();let n=t?.direction??`both`,r=t?.edgeType,i=t?.limit??50,a=[],o=[],s=new Set;if(n===`outgoing`||n===`both`){let t=`
141
+ type = excluded.type, weight = excluded.weight, confidence = excluded.confidence, properties = excluded.properties`,[t.id,t.fromId,t.toId,t.type,t.weight??1,t.confidence??1,JSON.stringify(t.properties??{})]);t.exec(`COMMIT`),t.flush()}catch(e){throw t.exec(`ROLLBACK`),e}finally{t.pragma(`foreign_keys = ON`)}}async getNode(e){await this.ensureOpen();let t=this.query(`SELECT * FROM nodes WHERE id = ?`,[e]);return t.length>0?P(t[0]):null}async getNeighbors(e,t){await this.ensureOpen();let n=t?.direction??`both`,r=t?.edgeType,i=t?.limit??50,a=[],o=[],s=new Set;if(n===`outgoing`||n===`both`){let t=`
61
142
  SELECT e.id AS edge_id, e.from_id, e.to_id, e.type AS edge_type, e.weight,
62
143
  e.confidence AS edge_confidence, e.properties AS edge_props,
63
144
  n.id AS node_id, n.type AS node_type, n.name AS node_name, n.properties AS node_props,
64
145
  n.source_record_id AS node_src_rec, n.source_path AS node_src_path,
65
146
  n.created_at AS node_created, n.community AS node_community
66
- FROM edges e JOIN nodes n ON e.to_id = n.id WHERE e.from_id = ?`,n=[e];r&&(t+=` AND e.type = ?`,n.push(r)),t+=` LIMIT ?`,n.push(i);let c=this.query(t,n);for(let e of c)o.push(N(e)),s.has(e.node_id)||(s.add(e.node_id),a.push(P(e)))}if(n===`incoming`||n===`both`){let t=`
147
+ FROM edges e JOIN nodes n ON e.to_id = n.id WHERE e.from_id = ?`,n=[e];r&&(t+=` AND e.type = ?`,n.push(r)),t+=` LIMIT ?`,n.push(i);let c=this.query(t,n);for(let e of c)o.push(I(e)),s.has(e.node_id)||(s.add(e.node_id),a.push(L(e)))}if(n===`incoming`||n===`both`){let t=`
67
148
  SELECT e.id AS edge_id, e.from_id, e.to_id, e.type AS edge_type, e.weight,
68
149
  e.confidence AS edge_confidence, e.properties AS edge_props,
69
150
  n.id AS node_id, n.type AS node_type, n.name AS node_name, n.properties AS node_props,
70
151
  n.source_record_id AS node_src_rec, n.source_path AS node_src_path,
71
152
  n.created_at AS node_created, n.community AS node_community
72
- FROM edges e JOIN nodes n ON e.from_id = n.id WHERE e.to_id = ?`,n=[e];r&&(t+=` AND e.type = ?`,n.push(r)),t+=` LIMIT ?`,n.push(i);let c=this.query(t,n);for(let e of c)o.push(N(e)),s.has(e.node_id)||(s.add(e.node_id),a.push(P(e)))}return{nodes:a,edges:o}}async traverse(e,t){await this.ensureOpen();let n=t?.maxDepth??2,r=t?.direction??`both`,i=t?.edgeType,a=t?.limit??50,o=new Map,s=new Map,c=new Set,l=[{nodeId:e,depth:0}];for(;l.length>0&&o.size<a;){let e=l.shift();if(!e||c.has(e.nodeId)||e.depth>n)continue;c.add(e.nodeId);let t=await this.getNeighbors(e.nodeId,{direction:r,edgeType:i,limit:a-o.size});for(let r of t.nodes)o.has(r.id)||(o.set(r.id,r),e.depth+1<n&&l.push({nodeId:r.id,depth:e.depth+1}));for(let e of t.edges)s.set(e.id,e)}return{nodes:[...o.values()],edges:[...s.values()]}}async findNodes(e){await this.ensureOpen();let t=[],n=[];e.type&&(t.push(`type = ?`),n.push(e.type)),e.namePattern&&(t.push(`name LIKE ?`),n.push(`%${e.namePattern}%`)),e.sourcePath&&(t.push(`source_path = ?`),n.push(e.sourcePath));let r=t.length>0?`WHERE ${t.join(` AND `)}`:``,i=e.limit??100;return this.query(`SELECT * FROM nodes ${r} LIMIT ?`,[...n,i]).map(e=>j(e))}async findEdges(e){await this.ensureOpen();let t=[],n=[];e.type&&(t.push(`type = ?`),n.push(e.type)),e.fromId&&(t.push(`from_id = ?`),n.push(e.fromId)),e.toId&&(t.push(`to_id = ?`),n.push(e.toId));let r=t.length>0?`WHERE ${t.join(` AND `)}`:``,i=e.limit??100;return this.query(`SELECT * FROM edges ${r} LIMIT ?`,[...n,i]).map(e=>M(e))}async deleteNode(e){await this.ensureOpen();let t=this.getAdapter();t.exec(`BEGIN TRANSACTION`);try{this.run(`DELETE FROM edges WHERE from_id = ? OR to_id = ?`,[e,e]),this.run(`DELETE FROM nodes WHERE id = ?`,[e]),t.exec(`COMMIT`),t.flush()}catch(e){throw t.exec(`ROLLBACK`),e}}async deleteBySourcePath(e){await this.ensureOpen();let t=this.query(`SELECT id FROM nodes WHERE source_path = ?`,[e]);if(t.length===0)return 0;let n=this.getAdapter();n.exec(`BEGIN TRANSACTION`);try{for(let e of t)this.run(`DELETE FROM edges WHERE from_id = ? OR to_id = ?`,[e.id,e.id]);this.run(`DELETE FROM nodes WHERE source_path = ?`,[e]),n.exec(`COMMIT`),n.flush()}catch(e){throw n.exec(`ROLLBACK`),e}return t.length}async clear(){await this.ensureOpen();let e=this.getAdapter();e.exec(`BEGIN TRANSACTION`);try{this.run(`DELETE FROM process_steps`),this.run(`DELETE FROM processes`),this.run(`DELETE FROM edges`),this.run(`DELETE FROM nodes`),e.exec(`COMMIT`)}catch(t){throw e.exec(`ROLLBACK`),t}e.flush()}async getStats(){await this.ensureOpen();let e=this.query(`SELECT COUNT(*) as count FROM nodes`)[0]?.count??0,t=this.query(`SELECT COUNT(*) as count FROM edges`)[0]?.count??0,n=this.query(`SELECT type, COUNT(*) as count FROM nodes GROUP BY type`),r={};for(let e of n)r[e.type]=e.count;let i=this.query(`SELECT type, COUNT(*) as count FROM edges GROUP BY type`),a={};for(let e of i)a[e.type]=e.count;return{nodeCount:e,edgeCount:t,nodeTypes:r,edgeTypes:a}}async validate(){await this.ensureOpen();let e=await this.getStats(),t=this.query(`SELECT e.id AS edgeId,
153
+ FROM edges e JOIN nodes n ON e.from_id = n.id WHERE e.to_id = ?`,n=[e];r&&(t+=` AND e.type = ?`,n.push(r)),t+=` LIMIT ?`,n.push(i);let c=this.query(t,n);for(let e of c)o.push(I(e)),s.has(e.node_id)||(s.add(e.node_id),a.push(L(e)))}return{nodes:a,edges:o}}async traverse(e,t){await this.ensureOpen();let n=t?.maxDepth??2,r=t?.direction??`both`,i=t?.edgeType,a=t?.limit??50,o=new Map,s=new Map,c=new Set,l=[{nodeId:e,depth:0}];for(;l.length>0&&o.size<a;){let e=l.shift();if(!e||c.has(e.nodeId)||e.depth>n)continue;c.add(e.nodeId);let t=await this.getNeighbors(e.nodeId,{direction:r,edgeType:i,limit:a-o.size});for(let r of t.nodes)o.has(r.id)||(o.set(r.id,r),e.depth+1<n&&l.push({nodeId:r.id,depth:e.depth+1}));for(let e of t.edges)s.set(e.id,e)}return{nodes:[...o.values()],edges:[...s.values()]}}async findNodes(e){await this.ensureOpen();let t=[],n=[];e.type&&(t.push(`type = ?`),n.push(e.type)),e.namePattern&&(t.push(`name LIKE ?`),n.push(`%${e.namePattern}%`)),e.sourcePath&&(t.push(`source_path = ?`),n.push(e.sourcePath));let r=t.length>0?`WHERE ${t.join(` AND `)}`:``,i=e.limit??100;return this.query(`SELECT * FROM nodes ${r} LIMIT ?`,[...n,i]).map(e=>P(e))}async findEdges(e){await this.ensureOpen();let t=[],n=[];e.type&&(t.push(`type = ?`),n.push(e.type)),e.fromId&&(t.push(`from_id = ?`),n.push(e.fromId)),e.toId&&(t.push(`to_id = ?`),n.push(e.toId));let r=t.length>0?`WHERE ${t.join(` AND `)}`:``,i=e.limit??100;return this.query(`SELECT * FROM edges ${r} LIMIT ?`,[...n,i]).map(e=>F(e))}async deleteNode(e){await this.ensureOpen();let t=this.getAdapter();t.exec(`BEGIN TRANSACTION`);try{this.run(`DELETE FROM edges WHERE from_id = ? OR to_id = ?`,[e,e]),this.run(`DELETE FROM nodes WHERE id = ?`,[e]),t.exec(`COMMIT`),t.flush()}catch(e){throw t.exec(`ROLLBACK`),e}}async deleteBySourcePath(e){await this.ensureOpen();let t=this.query(`SELECT id FROM nodes WHERE source_path = ?`,[e]);if(t.length===0)return 0;let n=this.getAdapter();n.exec(`BEGIN TRANSACTION`);try{for(let e of t)this.run(`DELETE FROM edges WHERE from_id = ? OR to_id = ?`,[e.id,e.id]);this.run(`DELETE FROM nodes WHERE source_path = ?`,[e]),n.exec(`COMMIT`),n.flush()}catch(e){throw n.exec(`ROLLBACK`),e}return t.length}async clear(){await this.ensureOpen();let e=this.getAdapter();e.exec(`BEGIN TRANSACTION`);try{this.run(`DELETE FROM process_steps`),this.run(`DELETE FROM processes`),this.run(`DELETE FROM edges`),this.run(`DELETE FROM nodes`),e.exec(`COMMIT`)}catch(t){throw e.exec(`ROLLBACK`),t}e.flush()}async getStats(){await this.ensureOpen();let e=this.query(`SELECT COUNT(*) as count FROM nodes`)[0]?.count??0,t=this.query(`SELECT COUNT(*) as count FROM edges`)[0]?.count??0,n=this.query(`SELECT type, COUNT(*) as count FROM nodes GROUP BY type`),r={};for(let e of n)r[e.type]=e.count;let i=this.query(`SELECT type, COUNT(*) as count FROM edges GROUP BY type`),a={};for(let e of i)a[e.type]=e.count;return{nodeCount:e,edgeCount:t,nodeTypes:r,edgeTypes:a}}async validate(){await this.ensureOpen();let e=await this.getStats(),t=this.query(`SELECT e.id AS edgeId,
73
154
  CASE
74
155
  WHEN n1.id IS NULL THEN e.from_id
75
156
  WHEN n2.id IS NULL THEN e.to_id
@@ -87,7 +168,7 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
87
168
  VALUES (?, ?, ?, '{}', ?)`,[a,e,t,o]);for(let e=0;e<n.length;e++)this.run(`INSERT INTO process_steps (process_id, node_id, step_order) VALUES (?, ?, ?)`,[a,n[e],e]);s.exec(`COMMIT`),s.flush()}catch(e){throw s.exec(`ROLLBACK`),e}return{id:a,entryNodeId:e,label:t,properties:{},steps:n,createdAt:o}}async getProcesses(e){await this.ensureOpen();let t;t=e?this.query(`SELECT DISTINCT p.id, p.entry_node_id, p.label, p.properties, p.created_at
88
169
  FROM processes p
89
170
  JOIN process_steps ps ON p.id = ps.process_id
90
- WHERE ps.node_id = ?`,[e]):this.query(`SELECT * FROM processes`);let n=[];for(let e of t){let t=this.query(`SELECT node_id FROM process_steps WHERE process_id = ? ORDER BY step_order`,[e.id]);n.push({id:e.id,entryNodeId:e.entry_node_id,label:e.label,properties:A(e.properties),steps:t.map(e=>e.node_id),createdAt:e.created_at})}return n}async deleteProcess(e){await this.ensureOpen();let t=this.getAdapter();t.exec(`BEGIN TRANSACTION`);try{this.run(`DELETE FROM process_steps WHERE process_id = ?`,[e]),this.run(`DELETE FROM processes WHERE id = ?`,[e]),t.exec(`COMMIT`),t.flush()}catch(e){throw t.exec(`ROLLBACK`),e}}async depthGroupedTraversal(e,t=3,n){await this.ensureOpen();let r=n?.direction??`both`,i=n?.edgeType,a=n?.limit??100,o={},s=new Set;s.add(e);let c=[e];for(let e=1;e<=t;e++){let t=[],n=[];for(let e of c){let o=await this.getNeighbors(e,{direction:r,edgeType:i,limit:a});for(let e of o.nodes)s.has(e.id)||(s.add(e.id),t.push(e.id),n.push(e))}if(n.length>0&&(o[e]=n),c=t,c.length===0||s.size>=a)break}return o}async getCohesionScore(e){await this.ensureOpen();let t=this.query(`SELECT id FROM nodes WHERE community = ?`,[e]);if(t.length===0)return 0;let n=new Set(t.map(e=>e.id)),r=t.map(()=>`?`).join(`,`),i=t.map(e=>e.id),a=this.query(`SELECT from_id, to_id FROM edges WHERE from_id IN (${r}) OR to_id IN (${r})`,[...i,...i]);if(a.length===0)return 0;let o=0;for(let e of a)n.has(e.from_id)&&n.has(e.to_id)&&o++;return o/a.length}async getSymbol360(e){let t=await this.getNode(e);if(!t)throw Error(`Node '${e}' not found`);let n=await this.findEdges({toId:e}),r=await this.findEdges({fromId:e}),i=await this.getProcesses(e);return{node:t,incoming:n,outgoing:r,community:t.community??null,processes:i}}releaseMemory(){if(this.adapter)try{this.adapter.exec(`PRAGMA shrink_memory`),this.adapter.exec(`PRAGMA wal_checkpoint(TRUNCATE)`)}catch{}}async close(){this.adapter&&=(this.externalAdapter||this.adapter.close(),null)}};function A(e){if(!e)return{};try{return JSON.parse(e)}catch{return{}}}function j(e){return{id:e.id,type:e.type,name:e.name,properties:A(e.properties),sourceRecordId:e.source_record_id??void 0,sourcePath:e.source_path??void 0,createdAt:e.created_at,community:e.community??void 0}}function M(e){return{id:e.id,fromId:e.from_id,toId:e.to_id,type:e.type,weight:e.weight??1,confidence:e.confidence??1,properties:A(e.properties)}}function N(e){return{id:e.edge_id,fromId:e.from_id,toId:e.to_id,type:e.edge_type,weight:e.weight??1,confidence:e.edge_confidence??1,properties:A(e.edge_props??`{}`)}}function P(e){return{id:e.node_id,type:e.node_type,name:e.node_name,properties:A(e.node_props??`{}`),sourceRecordId:e.node_src_rec??void 0,sourcePath:e.node_src_path??void 0,createdAt:e.node_created,community:e.node_community??void 0}}function F(e){let t=0;for(let n=0;n<e.length;n++){let r=e[n]<0?-e[n]:e[n];r>t&&(t=r)}let n=new Int8Array(e.length);if(t===0)return Buffer.from(n.buffer,n.byteOffset,n.byteLength);let r=127/t;for(let t=0;t<e.length;t++){let i=Math.round(e[t]*r);n[t]=i<-127?-127:i>127?127:i}return Buffer.from(n.buffer,n.byteOffset,n.byteLength)}const I=/^[\w.\-/ ]+$/,L=p(`sqlite-vec-store`);function R(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function z(e,t){if(!I.test(e))throw Error(`Invalid ${t} filter value: contains disallowed characters`);return e}var B=class{adapter=null;externalAdapter;dbPath;embeddingDim;coarseDim;vectorEnabled=!1;ftsEnabled=!1;warnedVectorDisabled=!1;_draining=!1;_priorityQueue=[];_normalQueue=[];_onCloseHooks=[];constructor(e={}){this.embeddingDim=e.embeddingDim??u.dimensions,this.coarseDim=Math.min(128,this.embeddingDim),e.adapter?(this.adapter=e.adapter,this.externalAdapter=!0,this.dbPath=``):(this.dbPath=e.path??`${f.path}/aikit.db`,this.externalAdapter=!1)}async initialize(){if(!this.adapter){let e=s(this.dbPath);t(e)||n(e,{recursive:!0}),this.adapter=await D(this.dbPath)}this.vectorEnabled=this.adapter.vectorCapable,this.createKnowledgeTable(),this.createFtsTable(),this.vectorEnabled?this.ensureVecTable():this.warnedVectorDisabled||(this.warnedVectorDisabled=!0,L.warn(`SqliteVecStore: vector search disabled (sqlite-vec extension not loaded). Hybrid search will return FTS-only results.`))}getDiagnostics(){let e=this.adapter,t=e?e.constructor.name:`unknown`,n=null,r=this.externalAdapter?``:this.dbPath;if(r)try{let{statSync:e}=g(`node:fs`);n=e(r).size}catch{n=null}return{adapterType:t,vectorSearchEnabled:this.vectorEnabled,ftsEnabled:this.ftsEnabled,degradedMode:!this.vectorEnabled,dbPath:r,dbSizeBytes:n,embeddingDim:this.embeddingDim,vectorDtype:`int8`}}createKnowledgeTable(){let e=this.getAdapter();e.exec(`
171
+ WHERE ps.node_id = ?`,[e]):this.query(`SELECT * FROM processes`);let n=[];for(let e of t){let t=this.query(`SELECT node_id FROM process_steps WHERE process_id = ? ORDER BY step_order`,[e.id]);n.push({id:e.id,entryNodeId:e.entry_node_id,label:e.label,properties:N(e.properties),steps:t.map(e=>e.node_id),createdAt:e.created_at})}return n}async deleteProcess(e){await this.ensureOpen();let t=this.getAdapter();t.exec(`BEGIN TRANSACTION`);try{this.run(`DELETE FROM process_steps WHERE process_id = ?`,[e]),this.run(`DELETE FROM processes WHERE id = ?`,[e]),t.exec(`COMMIT`),t.flush()}catch(e){throw t.exec(`ROLLBACK`),e}}async depthGroupedTraversal(e,t=3,n){await this.ensureOpen();let r=n?.direction??`both`,i=n?.edgeType,a=n?.limit??100,o={},s=new Set;s.add(e);let c=[e];for(let e=1;e<=t;e++){let t=[],n=[];for(let e of c){let o=await this.getNeighbors(e,{direction:r,edgeType:i,limit:a});for(let e of o.nodes)s.has(e.id)||(s.add(e.id),t.push(e.id),n.push(e))}if(n.length>0&&(o[e]=n),c=t,c.length===0||s.size>=a)break}return o}async getCohesionScore(e){await this.ensureOpen();let t=this.query(`SELECT id FROM nodes WHERE community = ?`,[e]);if(t.length===0)return 0;let n=new Set(t.map(e=>e.id)),r=t.map(()=>`?`).join(`,`),i=t.map(e=>e.id),a=this.query(`SELECT from_id, to_id FROM edges WHERE from_id IN (${r}) OR to_id IN (${r})`,[...i,...i]);if(a.length===0)return 0;let o=0;for(let e of a)n.has(e.from_id)&&n.has(e.to_id)&&o++;return o/a.length}async getSymbol360(e){let t=await this.getNode(e);if(!t)throw Error(`Node '${e}' not found`);let n=await this.findEdges({toId:e}),r=await this.findEdges({fromId:e}),i=await this.getProcesses(e);return{node:t,incoming:n,outgoing:r,community:t.community??null,processes:i}}releaseMemory(){if(this.adapter)try{this.adapter.exec(`PRAGMA shrink_memory`),this.adapter.exec(`PRAGMA wal_checkpoint(TRUNCATE)`)}catch{}}async close(){this.adapter&&=(this.externalAdapter||this.adapter.close(),null)}};function N(e){if(!e)return{};try{return JSON.parse(e)}catch{return{}}}function P(e){return{id:e.id,type:e.type,name:e.name,properties:N(e.properties),sourceRecordId:e.source_record_id??void 0,sourcePath:e.source_path??void 0,createdAt:e.created_at,community:e.community??void 0}}function F(e){return{id:e.id,fromId:e.from_id,toId:e.to_id,type:e.type,weight:e.weight??1,confidence:e.confidence??1,properties:N(e.properties)}}function I(e){return{id:e.edge_id,fromId:e.from_id,toId:e.to_id,type:e.edge_type,weight:e.weight??1,confidence:e.edge_confidence??1,properties:N(e.edge_props??`{}`)}}function L(e){return{id:e.node_id,type:e.node_type,name:e.node_name,properties:N(e.node_props??`{}`),sourceRecordId:e.node_src_rec??void 0,sourcePath:e.node_src_path??void 0,createdAt:e.node_created,community:e.node_community??void 0}}function R(e){let t=0;for(let n=0;n<e.length;n++){let r=e[n]<0?-e[n]:e[n];r>t&&(t=r)}let n=new Int8Array(e.length);if(t===0)return Buffer.from(n.buffer,n.byteOffset,n.byteLength);let r=127/t;for(let t=0;t<e.length;t++){let i=Math.round(e[t]*r);n[t]=i<-127?-127:i>127?127:i}return Buffer.from(n.buffer,n.byteOffset,n.byteLength)}const z=/^[\w.\-/ ]+$/,B=p(`sqlite-vec-store`);function V(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function H(e,t){if(!z.test(e))throw Error(`Invalid ${t} filter value: contains disallowed characters`);return e}var U=class{adapter=null;externalAdapter;dbPath;embeddingDim;coarseDim;vectorEnabled=!1;ftsEnabled=!1;warnedVectorDisabled=!1;_draining=!1;_priorityQueue=[];_normalQueue=[];_onCloseHooks=[];constructor(e={}){this.embeddingDim=e.embeddingDim??u.dimensions,this.coarseDim=Math.min(128,this.embeddingDim),e.adapter?(this.adapter=e.adapter,this.externalAdapter=!0,this.dbPath=``):(this.dbPath=e.path??`${f.path}/aikit.db`,this.externalAdapter=!1)}async initialize(){if(!this.adapter){let e=s(this.dbPath);t(e)||n(e,{recursive:!0}),this.adapter=await A(this.dbPath)}this.configureConnectionPragmas(),this.vectorEnabled=this.adapter.vectorCapable,v(this.adapter,y),this.createKnowledgeTable(),this.createFtsTable(),this.vectorEnabled?this.ensureVecTable():this.warnedVectorDisabled||(this.warnedVectorDisabled=!0,B.warn(`SqliteVecStore: vector search disabled (sqlite-vec extension not loaded). Hybrid search will return FTS-only results.`))}configureConnectionPragmas(){let e=this.getAdapter();e.pragma(`journal_mode = WAL`),e.pragma(`busy_timeout = 5000`)}getDiagnostics(){let e=this.adapter,t=e?e.constructor.name:`unknown`,n=null,r=this.externalAdapter?``:this.dbPath;if(r)try{let{statSync:e}=g(`node:fs`);n=e(r).size}catch{n=null}return{adapterType:t,vectorSearchEnabled:this.vectorEnabled,ftsEnabled:this.ftsEnabled,degradedMode:!this.vectorEnabled,dbPath:r,dbSizeBytes:n,embeddingDim:this.embeddingDim,vectorDtype:`int8`}}createKnowledgeTable(){let e=this.getAdapter();e.exec(`
91
172
  CREATE TABLE IF NOT EXISTS knowledge (
92
173
  id TEXT PRIMARY KEY,
93
174
  content TEXT NOT NULL,
@@ -112,7 +193,7 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
112
193
  content,
113
194
  tokenize = 'unicode61 remove_diacritics 2'
114
195
  )
115
- `),this.ftsEnabled=!0}catch(e){this.ftsEnabled=!1,L.warn(`FTS5 unavailable — keyword search disabled`,m(e))}}ensureVecTable(){let e=this.getAdapter(),t=e.queryAll(`SELECT name, sql FROM sqlite_master WHERE type='table' AND name='vec_knowledge'`);if(t.length>0){let n=t[0].sql??``,r=n.match(/(?:float|int8)\[(\d+)\]/i),i=r?Number(r[1]):null,a=/int8\[/i.test(n);(i!==null&&i!==this.embeddingDim||!a)&&(L.warn(`Vec table schema mismatch — dropping for recreation`,{existingDim:i,newDim:this.embeddingDim,wasInt8:a}),e.exec(`DROP TABLE vec_knowledge`))}e.exec(`
196
+ `),this.ftsEnabled=!0}catch(e){this.ftsEnabled=!1,B.warn(`FTS5 unavailable — keyword search disabled`,m(e))}}ensureVecTable(){let e=this.getAdapter(),t=e.queryAll(`SELECT name, sql FROM sqlite_master WHERE type='table' AND name='vec_knowledge'`);if(t.length>0){let n=t[0].sql??``,r=n.match(/(?:float|int8)\[(\d+)\]/i),i=r?Number(r[1]):null,a=/int8\[/i.test(n);(i!==null&&i!==this.embeddingDim||!a)&&(B.warn(`Vec table schema mismatch — dropping for recreation`,{existingDim:i,newDim:this.embeddingDim,wasInt8:a}),e.exec(`DROP TABLE vec_knowledge`))}e.exec(`
116
197
  CREATE VIRTUAL TABLE IF NOT EXISTS vec_knowledge USING vec0(
117
198
  embedding int8[${this.embeddingDim}] distance_metric=cosine,
118
199
  +knowledge_id TEXT
@@ -122,7 +203,7 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
122
203
  embedding int8[${this.coarseDim}] distance_metric=cosine,
123
204
  +knowledge_id TEXT
124
205
  )
125
- `)}enqueueWrite(e,t=!1){return new Promise((n,r)=>{let i=async()=>{try{n(await e())}catch(e){r(e)}};t?this._priorityQueue.push(i):this._normalQueue.push(i),this._drain()})}async _drain(){if(!this._draining){this._draining=!0;try{for(;this._priorityQueue.length>0||this._normalQueue.length>0;){let e=this._priorityQueue.shift()??this._normalQueue.shift();e&&await e()}}finally{this._draining=!1}}}async upsert(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t))}}async upsertInteractive(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t),!0)}}async upsertWithoutVector(e,t){return this.enqueueWrite(async()=>{let n=this.getAdapter(),r=e;n.exec(`BEGIN`);try{if(this.upsertKnowledgeRow(r),this.ftsEnabled&&(n.run(`DELETE FROM knowledge_fts WHERE id = ?`,[r.id]),n.run(`INSERT INTO knowledge_fts (id, content) VALUES (?, ?)`,[r.id,r.content])),this.vectorEnabled){let e=n.queryAll(`SELECT embedding FROM vec_knowledge WHERE knowledge_id = ?`,[t]);if(e.length>0){if(n.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[r.id]),n.run(`INSERT INTO vec_knowledge (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[e[0].embedding,r.id]),this.coarseDim<this.embeddingDim){let e=n.queryAll(`SELECT embedding FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[t]);e.length>0&&(n.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[r.id]),n.run(`INSERT INTO vec_knowledge_coarse (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[e[0].embedding,r.id]))}}else L.warn(`upsertWithoutVector: source vector not found, record will lack vector`,{recordId:r.id,sourceRecordId:t})}n.exec(`COMMIT`)}catch(e){try{n.exec(`ROLLBACK`)}catch{}throw e}n.flush()})}upsertKnowledgeRow(e){this.getAdapter().run(`INSERT INTO knowledge (id, content, sourcePath, contentType, headingPath, chunkIndex,
206
+ `)}enqueueWrite(e,t=!1){return new Promise((n,r)=>{let i=async()=>{try{n(await e())}catch(e){r(e)}};t?this._priorityQueue.push(i):this._normalQueue.push(i),this._drain()})}async _drain(){if(!this._draining){this._draining=!0;try{for(;this._priorityQueue.length>0||this._normalQueue.length>0;){let e=this._priorityQueue.shift()??this._normalQueue.shift();e&&await e()}}finally{this._draining=!1}}}async upsert(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t))}}async upsertInteractive(e,t){if(e.length!==0){if(e.length!==t.length)throw Error(`Record count (${e.length}) does not match vector count (${t.length})`);for(let n=0;n<t.length;n++)if(t[n].length===0)throw Error(`Zero-length vector at index ${n} for record ${e[n].sourcePath}`);return this.enqueueWrite(()=>this._upsertImpl(e,t),!0)}}async upsertWithoutVector(e,t){return this.enqueueWrite(async()=>{let n=this.getAdapter(),r=e;n.exec(`BEGIN`);try{if(this.upsertKnowledgeRow(r),this.ftsEnabled&&(n.run(`DELETE FROM knowledge_fts WHERE id = ?`,[r.id]),n.run(`INSERT INTO knowledge_fts (id, content) VALUES (?, ?)`,[r.id,r.content])),this.vectorEnabled){let e=n.queryAll(`SELECT embedding FROM vec_knowledge WHERE knowledge_id = ?`,[t]);if(e.length>0){if(n.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[r.id]),n.run(`INSERT INTO vec_knowledge (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[e[0].embedding,r.id]),this.coarseDim<this.embeddingDim){let e=n.queryAll(`SELECT embedding FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[t]);e.length>0&&(n.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[r.id]),n.run(`INSERT INTO vec_knowledge_coarse (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[e[0].embedding,r.id]))}}else B.warn(`upsertWithoutVector: source vector not found, record will lack vector`,{recordId:r.id,sourceRecordId:t})}n.exec(`COMMIT`)}catch(e){try{n.exec(`ROLLBACK`)}catch{}throw e}n.flush()})}upsertKnowledgeRow(e){this.getAdapter().run(`INSERT INTO knowledge (id, content, sourcePath, contentType, headingPath, chunkIndex,
126
207
  totalChunks, startLine, endLine, fileHash, content_hash, indexedAt, origin, tags, category, version)
127
208
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
128
209
  ON CONFLICT(id) DO UPDATE SET
@@ -140,7 +221,7 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
140
221
  origin = excluded.origin,
141
222
  tags = excluded.tags,
142
223
  category = excluded.category,
143
- version = excluded.version`,[e.id,e.content,e.sourcePath,e.contentType,e.headingPath??``,e.chunkIndex,e.totalChunks,e.startLine,e.endLine,e.fileHash,e.contentHash??``,e.indexedAt,e.origin,JSON.stringify(e.tags??[]),e.category??``,e.version])}async _upsertImpl(e,t){let n=this.getAdapter();n.exec(`BEGIN`);try{for(let r=0;r<e.length;r++){let i=e[r];if(this.upsertKnowledgeRow(i),this.ftsEnabled&&(n.run(`DELETE FROM knowledge_fts WHERE id = ?`,[i.id]),n.run(`INSERT INTO knowledge_fts (id, content) VALUES (?, ?)`,[i.id,i.content])),this.vectorEnabled&&(n.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[i.id]),n.run(`INSERT INTO vec_knowledge (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[F(t[r]),i.id]),this.coarseDim<this.embeddingDim)){let e=t[r].subarray(0,this.coarseDim);n.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[i.id]),n.run(`INSERT INTO vec_knowledge_coarse (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[F(e),i.id])}}n.exec(`COMMIT`)}catch(e){try{n.exec(`ROLLBACK`)}catch{}throw e}n.flush()}async search(e,t){if(e.length===0)return[];if(!this.vectorEnabled)return this.warnedVectorDisabled||(this.warnedVectorDisabled=!0,L.warn(`search() called but vector backend is disabled — returning []`)),[];let n=this.getAdapter(),r=t?.limit??d.maxResults,i=t?.minScore??d.minScore,a=r*4,o=`
224
+ version = excluded.version`,[e.id,e.content,e.sourcePath,e.contentType,e.headingPath??``,e.chunkIndex,e.totalChunks,e.startLine,e.endLine,e.fileHash,e.contentHash??``,e.indexedAt,e.origin,JSON.stringify(e.tags??[]),e.category??``,e.version])}async _upsertImpl(e,t){let n=this.getAdapter();n.exec(`BEGIN`);try{for(let r=0;r<e.length;r++){let i=e[r];if(this.upsertKnowledgeRow(i),this.ftsEnabled&&(n.run(`DELETE FROM knowledge_fts WHERE id = ?`,[i.id]),n.run(`INSERT INTO knowledge_fts (id, content) VALUES (?, ?)`,[i.id,i.content])),this.vectorEnabled&&(n.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[i.id]),n.run(`INSERT INTO vec_knowledge (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[R(t[r]),i.id]),this.coarseDim<this.embeddingDim)){let e=t[r].subarray(0,this.coarseDim);n.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[i.id]),n.run(`INSERT INTO vec_knowledge_coarse (embedding, knowledge_id) VALUES (vec_int8(?), ?)`,[R(e),i.id])}}n.exec(`COMMIT`)}catch(e){try{n.exec(`ROLLBACK`)}catch{}throw e}n.flush()}async search(e,t){if(e.length===0)return[];if(!this.vectorEnabled)return this.warnedVectorDisabled||(this.warnedVectorDisabled=!0,B.warn(`search() called but vector backend is disabled — returning []`)),[];let n=this.getAdapter(),r=t?.limit??d.maxResults,i=t?.minScore??d.minScore,a=r*4,o=`
144
225
  SELECT k.*, v.distance AS _distance
145
226
  FROM (
146
227
  SELECT knowledge_id, distance
@@ -153,7 +234,7 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
153
234
  ${this.buildFilterSqlSuffix(t)}
154
235
  ORDER BY v.distance ASC
155
236
  LIMIT ?
156
- `,s;try{s=n.queryAll(o,[F(e),a,r])}catch(e){return L.warn(`vector search failed`,m(e)),[]}return s.map(e=>({record:this.fromRow(e),score:1-(e._distance??1)})).filter(e=>e.score>=i).slice(0,r)}async coarseSearch(e,t){if(!this.vectorEnabled||this.coarseDim>=this.embeddingDim)return this.search(e,t);let n=this.getAdapter(),r=t?.limit??d.maxResults,i=t?.minScore??d.minScore,a=r*4,o=e.subarray(0,this.coarseDim),s=`
237
+ `,s;try{s=n.queryAll(o,[R(e),a,r])}catch(e){return B.warn(`vector search failed`,m(e)),[]}return s.map(e=>({record:this.fromRow(e),score:1-(e._distance??1)})).filter(e=>e.score>=i).slice(0,r)}async coarseSearch(e,t){if(!this.vectorEnabled||this.coarseDim>=this.embeddingDim)return this.search(e,t);let n=this.getAdapter(),r=t?.limit??d.maxResults,i=t?.minScore??d.minScore,a=r*4,o=e.subarray(0,this.coarseDim),s=`
157
238
  SELECT k.*, v.distance AS _distance
158
239
  FROM (
159
240
  SELECT knowledge_id, distance
@@ -166,7 +247,7 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
166
247
  ${this.buildFilterSqlSuffix(t)}
167
248
  ORDER BY v.distance ASC
168
249
  LIMIT ?
169
- `,c;try{c=n.queryAll(s,[F(o),a,r])}catch(n){return L.warn(`coarse vector search failed, falling back to full search`,m(n)),this.search(e,t)}return c.length===0?this.search(e,t):c.map(e=>({record:this.fromRow(e),score:1-(e._distance??1)})).filter(e=>e.score>=i).slice(0,r)}async ftsSearch(e,t){if(!e||e.trim().length===0||!this.ftsEnabled)return[];let n=this.getAdapter(),r=t?.limit??d.maxResults,i=`
250
+ `,c;try{c=n.queryAll(s,[R(o),a,r])}catch(n){return B.warn(`coarse vector search failed, falling back to full search`,m(n)),this.search(e,t)}return c.length===0?this.search(e,t):c.map(e=>({record:this.fromRow(e),score:1-(e._distance??1)})).filter(e=>e.score>=i).slice(0,r)}async ftsSearch(e,t){if(!e||e.trim().length===0||!this.ftsEnabled)return[];let n=this.getAdapter(),r=t?.limit??d.maxResults,i=`
170
251
  SELECT k.*, bm25(knowledge_fts) AS _bm25
171
252
  FROM knowledge_fts
172
253
  JOIN knowledge k ON k.id = knowledge_fts.id
@@ -174,4 +255,358 @@ import{createRequire as e}from"node:module";import{existsSync as t,mkdirSync as
174
255
  ${this.buildFilterSqlSuffix(t,!0)}
175
256
  ORDER BY _bm25 ASC
176
257
  LIMIT ?
177
- `,a;try{let t=V(e);a=n.queryAll(i,[t,r])}catch(e){return L.warn(`fts search failed`,m(e)),[]}return a.map(e=>({record:this.fromRow(e),score:H(e._bm25)}))}async getById(e){let t=this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE id = ? LIMIT 1`,[e]);return t.length===0?null:this.fromRow(t[0])}async deleteBySourcePath(e){return this.enqueueWrite(()=>this._deleteBySourcePathImpl(e))}async _deleteBySourcePathImpl(e){let t=this.getAdapter(),n=t.queryAll(`SELECT id FROM knowledge WHERE sourcePath = ?`,[e]);if(n.length===0)return 0;t.exec(`BEGIN`);try{for(let{id:e}of n)this.vectorEnabled&&(t.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[e])),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]);t.run(`DELETE FROM knowledge WHERE sourcePath = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw e}return t.flush(),n.length}async deleteById(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e))}async deleteByIdInteractive(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e),!0)}async _deleteByIdImpl(e){let t=this.getAdapter();if(t.queryAll(`SELECT id FROM knowledge WHERE id = ? LIMIT 1`,[e]).length===0)return!1;t.exec(`BEGIN`);try{this.vectorEnabled&&(t.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[e])),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]),t.run(`DELETE FROM knowledge WHERE id = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw e}return t.flush(),!0}async getBySourcePath(e){return this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE sourcePath = ? ORDER BY chunkIndex ASC`,[e]).map(e=>this.fromRow(e))}async getStats(){let e=this.getAdapter(),t=e.queryAll(`SELECT COUNT(*) AS n FROM knowledge`)[0]?.n??0;if(t===0)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,storeBackend:`sqlite-vec`,embeddingModel:u.model};let n=e.queryAll(`SELECT COUNT(DISTINCT sourcePath) AS n FROM knowledge`),r=e.queryAll(`SELECT contentType, COUNT(*) AS n FROM knowledge GROUP BY contentType`),i=e.queryAll(`SELECT MAX(indexedAt) AS ts FROM knowledge`),a={};for(let e of r)a[e.contentType]=e.n;return{totalRecords:t,totalFiles:n[0]?.n??0,contentTypeBreakdown:a,lastIndexedAt:i[0]?.ts??null,storeBackend:`sqlite-vec`,embeddingModel:u.model}}async listSourcePaths(){return this.getAdapter().queryAll(`SELECT DISTINCT sourcePath FROM knowledge ORDER BY sourcePath`).map(e=>e.sourcePath)}async createFtsIndex(){this.createFtsTable()}async dropTable(){return this.enqueueWrite(()=>this._dropTableImpl())}async _dropTableImpl(){let e=this.getAdapter();this.ftsEnabled&&e.exec(`DROP TABLE IF EXISTS knowledge_fts`),this.vectorEnabled&&(this.coarseDim<this.embeddingDim&&e.exec(`DROP TABLE IF EXISTS vec_knowledge_coarse`),e.exec(`DROP TABLE IF EXISTS vec_knowledge`)),e.exec(`DROP TABLE IF EXISTS knowledge`),e.flush(),this.createKnowledgeTable(),this.createFtsTable(),this.vectorEnabled&&this.ensureVecTable()}releaseMemory(){if(this.adapter)try{this.adapter.exec(`PRAGMA shrink_memory`),this.adapter.exec(`PRAGMA wal_checkpoint(TRUNCATE)`)}catch{}}onBeforeClose(e){this._onCloseHooks.push(e)}async close(){for(let e of this._onCloseHooks)try{e()}catch{}for(this._onCloseHooks.length=0;this._priorityQueue.length>0||this._normalQueue.length>0||this._draining;)await new Promise(e=>setTimeout(e,5));this.adapter&&!this.externalAdapter&&this.adapter.close(),this.adapter=null}getAdapter(){if(!this.adapter)throw Error(`SqliteVecStore: not initialized — call initialize() first`);return this.adapter}buildFilterSqlSuffix(e,t=!1){if(!e)return``;let n=[];if(e.contentType&&n.push(`k.contentType = '${z(e.contentType,`contentType`)}'`),e.sourceType){let t=h(e.sourceType);if(t.length>0){let e=t.map(e=>`'${z(e,`sourceType`)}'`).join(`, `);n.push(`k.contentType IN (${e})`)}}if(e.origin&&n.push(`k.origin = '${z(e.origin,`origin`)}'`),e.category&&n.push(`k.category = '${z(e.category,`category`)}'`),e.tags&&e.tags.length>0){let t=e.tags.map(e=>`k.tags LIKE '%' || '${z(e,`tag`)}' || '%'`);n.push(`(${t.join(` OR `)})`)}if(n.length===0)return``;let r=n.join(` AND `);return t?`AND ${r}`:`WHERE ${r}`}fromRow(e){return{id:e.id,content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath||void 0,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,contentHash:e.content_hash||void 0,indexedAt:e.indexedAt,origin:e.origin,tags:R(e.tags),category:e.category||void 0,version:e.version}}};function V(e){let t=e.replace(/["'()*:^-]/g,` `).trim();return t?t.split(/\s+/).filter(e=>e.length>0).map(e=>`"${e}"`).join(` OR `):`""`}function H(e){return e==null||Number.isNaN(e)?0:1-Math.exp(-Math.abs(e)/5)}async function U(e){switch(e.backend){case`lancedb`:{let{LanceStore:t}=await import(`./lance-store-BIP1LEiS.js`);return new t({path:e.path})}case`sqlite-vec`:return new B({path:e.path,adapter:e.adapter,embeddingDim:e.embeddingDim});default:{let t=e.backend;throw Error(`Unknown store backend: "${t}". Supported: lancedb, sqlite-vec`)}}}export{k as SqliteGraphStore,B as SqliteVecStore,O as createSqlJsAdapter,D as createSqliteAdapter,U as createStore};
258
+ `,a;try{let t=W(e);a=n.queryAll(i,[t,r])}catch(e){return B.warn(`fts search failed`,m(e)),[]}return a.map(e=>({record:this.fromRow(e),score:G(e._bm25)}))}async getById(e){let t=this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE id = ? LIMIT 1`,[e]);return t.length===0?null:this.fromRow(t[0])}async deleteBySourcePath(e){return this.enqueueWrite(()=>this._deleteBySourcePathImpl(e))}async _deleteBySourcePathImpl(e){let t=this.getAdapter(),n=t.queryAll(`SELECT id FROM knowledge WHERE sourcePath = ?`,[e]);if(n.length===0)return 0;t.exec(`BEGIN`);try{for(let{id:e}of n)this.vectorEnabled&&(t.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[e])),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]);t.run(`DELETE FROM knowledge WHERE sourcePath = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw e}return t.flush(),n.length}async deleteById(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e))}async deleteByIdInteractive(e){return this.enqueueWrite(()=>this._deleteByIdImpl(e),!0)}async _deleteByIdImpl(e){let t=this.getAdapter();if(t.queryAll(`SELECT id FROM knowledge WHERE id = ? LIMIT 1`,[e]).length===0)return!1;t.exec(`BEGIN`);try{this.vectorEnabled&&(t.run(`DELETE FROM vec_knowledge WHERE knowledge_id = ?`,[e]),this.coarseDim<this.embeddingDim&&t.run(`DELETE FROM vec_knowledge_coarse WHERE knowledge_id = ?`,[e])),this.ftsEnabled&&t.run(`DELETE FROM knowledge_fts WHERE id = ?`,[e]),t.run(`DELETE FROM knowledge WHERE id = ?`,[e]),t.exec(`COMMIT`)}catch(e){try{t.exec(`ROLLBACK`)}catch{}throw e}return t.flush(),!0}async getBySourcePath(e){return this.getAdapter().queryAll(`SELECT * FROM knowledge WHERE sourcePath = ? ORDER BY chunkIndex ASC`,[e]).map(e=>this.fromRow(e))}async getStats(){let e=this.getAdapter(),t=e.queryAll(`SELECT COUNT(*) AS n FROM knowledge`)[0]?.n??0;if(t===0)return{totalRecords:0,totalFiles:0,contentTypeBreakdown:{},lastIndexedAt:null,storeBackend:`sqlite-vec`,embeddingModel:u.model};let n=e.queryAll(`SELECT COUNT(DISTINCT sourcePath) AS n FROM knowledge`),r=e.queryAll(`SELECT contentType, COUNT(*) AS n FROM knowledge GROUP BY contentType`),i=e.queryAll(`SELECT MAX(indexedAt) AS ts FROM knowledge`),a={};for(let e of r)a[e.contentType]=e.n;return{totalRecords:t,totalFiles:n[0]?.n??0,contentTypeBreakdown:a,lastIndexedAt:i[0]?.ts??null,storeBackend:`sqlite-vec`,embeddingModel:u.model}}async listSourcePaths(){return this.getAdapter().queryAll(`SELECT DISTINCT sourcePath FROM knowledge ORDER BY sourcePath`).map(e=>e.sourcePath)}async createFtsIndex(){this.createFtsTable()}async dropTable(){return this.enqueueWrite(()=>this._dropTableImpl())}async _dropTableImpl(){let e=this.getAdapter();this.ftsEnabled&&e.exec(`DROP TABLE IF EXISTS knowledge_fts`),this.vectorEnabled&&(this.coarseDim<this.embeddingDim&&e.exec(`DROP TABLE IF EXISTS vec_knowledge_coarse`),e.exec(`DROP TABLE IF EXISTS vec_knowledge`)),e.exec(`DROP TABLE IF EXISTS knowledge`),e.flush(),this.createKnowledgeTable(),this.createFtsTable(),this.vectorEnabled&&this.ensureVecTable()}releaseMemory(){if(this.adapter)try{this.adapter.exec(`PRAGMA shrink_memory`),this.adapter.exec(`PRAGMA wal_checkpoint(TRUNCATE)`)}catch{}}onBeforeClose(e){this._onCloseHooks.push(e)}async close(){for(let e of this._onCloseHooks)try{e()}catch{}for(this._onCloseHooks.length=0;this._priorityQueue.length>0||this._normalQueue.length>0||this._draining;)await new Promise(e=>setTimeout(e,5));this.adapter&&!this.externalAdapter&&this.adapter.close(),this.adapter=null}getAdapter(){if(!this.adapter)throw Error(`SqliteVecStore: not initialized — call initialize() first`);return this.adapter}buildFilterSqlSuffix(e,t=!1){if(!e)return``;let n=[];if(e.contentType&&n.push(`k.contentType = '${H(e.contentType,`contentType`)}'`),e.sourceType){let t=h(e.sourceType);if(t.length>0){let e=t.map(e=>`'${H(e,`sourceType`)}'`).join(`, `);n.push(`k.contentType IN (${e})`)}}if(e.origin&&n.push(`k.origin = '${H(e.origin,`origin`)}'`),e.category&&n.push(`k.category = '${H(e.category,`category`)}'`),e.tags&&e.tags.length>0){let t=e.tags.map(e=>`k.tags LIKE '%' || '${H(e,`tag`)}' || '%'`);n.push(`(${t.join(` OR `)})`)}if(n.length===0)return``;let r=n.join(` AND `);return t?`AND ${r}`:`WHERE ${r}`}fromRow(e){return{id:e.id,content:e.content,sourcePath:e.sourcePath,contentType:e.contentType,headingPath:e.headingPath||void 0,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,startLine:e.startLine,endLine:e.endLine,fileHash:e.fileHash,contentHash:e.content_hash||void 0,indexedAt:e.indexedAt,origin:e.origin,tags:V(e.tags),category:e.category||void 0,version:e.version}}};function W(e){let t=e.replace(/["'()*:^-]/g,` `).trim();return t?t.split(/\s+/).filter(e=>e.length>0).map(e=>`"${e}"`).join(` OR `):`""`}function G(e){return e==null||Number.isNaN(e)?0:1-Math.exp(-Math.abs(e)/5)}function K(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`,n=new Date(t);return Number.isNaN(n.getTime())?t:n.toISOString()}function q(e){return`queryAll`in e&&`run`in e}function J(e){return{get(t){return e.queryAll(`SELECT key, value, updated_at AS updatedAt FROM stash WHERE key = ?`,[t])[0]},set(t,n){e.run(`INSERT INTO stash (key, value)
259
+ VALUES (?, ?)
260
+ ON CONFLICT(key) DO UPDATE SET
261
+ value = excluded.value,
262
+ updated_at = datetime('now')`,[t,n])},list(){return e.queryAll(`SELECT key, value, updated_at AS updatedAt FROM stash ORDER BY key`)},has(t){return e.queryAll(`SELECT 1 AS present FROM stash WHERE key = ?`,[t]).length>0},delete(t){e.run(`DELETE FROM stash WHERE key = ?`,[t])},clear(){e.run(`DELETE FROM stash`)}}}function Y(e){return{save(t,n,r,i){e.run(`INSERT INTO checkpoints (id, label, data, notes)
263
+ VALUES (?, ?, ?, ?)
264
+ ON CONFLICT(id) DO UPDATE SET
265
+ label = excluded.label,
266
+ data = excluded.data,
267
+ notes = excluded.notes,
268
+ created_at = datetime('now')`,[t,n,r,i??null])},get(t){return e.queryAll(`SELECT id, label, data, notes, created_at AS createdAt FROM checkpoints WHERE id = ?`,[t])[0]},list(t,n){return t!==void 0&&n!==void 0?e.queryAll(`SELECT id, label, notes, created_at AS createdAt
269
+ FROM checkpoints
270
+ WHERE label = ?
271
+ ORDER BY created_at DESC, id DESC
272
+ LIMIT ?`,[t,n]):t===void 0?n===void 0?e.queryAll(`SELECT id, label, notes, created_at AS createdAt
273
+ FROM checkpoints
274
+ ORDER BY created_at DESC, id DESC`):e.queryAll(`SELECT id, label, notes, created_at AS createdAt
275
+ FROM checkpoints
276
+ ORDER BY created_at DESC, id DESC
277
+ LIMIT ?`,[n]):e.queryAll(`SELECT id, label, notes, created_at AS createdAt
278
+ FROM checkpoints
279
+ WHERE label = ?
280
+ ORDER BY created_at DESC, id DESC`,[t])},latest(t){let n=t===void 0?[]:[t],r=t===void 0?`SELECT id, label, data, notes, created_at AS createdAt
281
+ FROM checkpoints
282
+ ORDER BY created_at DESC, id DESC
283
+ LIMIT 1`:`SELECT id, label, data, notes, created_at AS createdAt
284
+ FROM checkpoints
285
+ WHERE label = ?
286
+ ORDER BY created_at DESC, id DESC
287
+ LIMIT 1`;return e.queryAll(r,n)[0]},has(t){return e.queryAll(`SELECT 1 AS present FROM checkpoints WHERE id = ?`,[t]).length>0},delete(t){e.run(`DELETE FROM checkpoints WHERE id = ?`,[t])},gc(t=10,n){let r=e.queryAll(`SELECT id, label, notes, created_at AS createdAt
288
+ FROM checkpoints
289
+ ORDER BY label, created_at DESC, id DESC`),i=n===void 0?void 0:Date.now()-n*864e5,a=new Map;for(let e of r){let t=a.get(e.label);t?t.push(e):a.set(e.label,[e])}let o=[];for(let e of a.values())e.forEach((e,n)=>{let r=Date.parse(e.createdAt);n<t&&!(i!==void 0&&!Number.isNaN(r)&&r<i)||o.push(e.id)});for(let t of o)e.run(`DELETE FROM checkpoints WHERE id = ?`,[t]);return o.length}}}function X(e){return{create(t,n){e.run(`INSERT INTO sessions (session_id, metadata)
290
+ VALUES (?, ?)
291
+ ON CONFLICT(session_id) DO UPDATE SET
292
+ last_activity = datetime('now'),
293
+ metadata = excluded.metadata`,[t,n??null])},touch(t){e.run(`UPDATE sessions SET last_activity = datetime('now') WHERE session_id = ?`,[t])},get(t){return e.queryAll(`SELECT session_id AS sessionId,
294
+ created_at AS createdAt,
295
+ last_activity AS lastActivity,
296
+ metadata
297
+ FROM sessions
298
+ WHERE session_id = ?`,[t])[0]},list(){return e.queryAll(`SELECT session_id AS sessionId,
299
+ created_at AS createdAt,
300
+ last_activity AS lastActivity
301
+ FROM sessions
302
+ ORDER BY created_at, session_id`)},has(t){return e.queryAll(`SELECT 1 AS present FROM sessions WHERE session_id = ?`,[t]).length>0},delete(t){e.run(`DELETE FROM sessions WHERE session_id = ?`,[t])},deleteStale(t){let n=`-${Math.max(0,t)} minutes`,r=e.queryAll(`SELECT COUNT(*) AS count
303
+ FROM sessions
304
+ WHERE last_activity < datetime('now', ?)`,[n])[0]?.count??0;return r>0&&e.run(`DELETE FROM sessions
305
+ WHERE last_activity < datetime('now', ?)`,[n]),r}}}function Z(e){return{post(t,n,r,i,a=300){return e.run(`INSERT INTO signals (workspace, key, value, agent, ttl_seconds, expires_at)
306
+ VALUES (?, ?, ?, ?, ?, datetime('now', '+' || ? || ' seconds'))`,[t,n,r,i??null,a,a]),e.queryAll(`SELECT last_insert_rowid() AS id`)[0]?.id??0},get(t,n){return e.queryAll(`SELECT id,
307
+ workspace,
308
+ key,
309
+ value,
310
+ agent,
311
+ created_at AS createdAt,
312
+ expires_at AS expiresAt
313
+ FROM signals
314
+ WHERE workspace = ?
315
+ AND key = ?
316
+ ORDER BY created_at ASC, id ASC`,[t,n])},list(t){return e.queryAll(`SELECT id,
317
+ workspace,
318
+ key,
319
+ value,
320
+ agent,
321
+ created_at AS createdAt,
322
+ expires_at AS expiresAt
323
+ FROM signals
324
+ WHERE workspace = ?
325
+ ORDER BY created_at ASC, id ASC`,[t])},clear(t,n){let r=n===void 0?e.queryAll(`SELECT COUNT(*) AS count FROM signals WHERE workspace = ?`,[t])[0]?.count??0:e.queryAll(`SELECT COUNT(*) AS count FROM signals WHERE workspace = ? AND key = ?`,[t,n])[0]?.count??0;return r>0&&(n===void 0?e.run(`DELETE FROM signals WHERE workspace = ?`,[t]):e.run(`DELETE FROM signals WHERE workspace = ? AND key = ?`,[t,n])),r},cleanExpired(){let t=e.queryAll(`SELECT COUNT(*) AS count
326
+ FROM signals
327
+ WHERE expires_at <= datetime('now')`)[0]?.count??0;return t>0&&e.run(`DELETE FROM signals WHERE expires_at <= datetime('now')`),t}}}function Q(e){return{upsert(t,n,r,i,a=10){e.run(`INSERT INTO leases (resource, holder, intent, workspace, ttl_minutes, expires_at)
328
+ VALUES (?, ?, ?, ?, ?, datetime('now', '+' || ? || ' minutes'))
329
+ ON CONFLICT(workspace, resource) DO UPDATE SET
330
+ holder = excluded.holder,
331
+ intent = excluded.intent,
332
+ ttl_minutes = excluded.ttl_minutes,
333
+ acquired_at = datetime('now'),
334
+ expires_at = excluded.expires_at`,[t,n,i??null,r,a,a])},get(t,n){return e.queryAll(`SELECT resource,
335
+ holder,
336
+ intent,
337
+ workspace,
338
+ acquired_at AS acquiredAt,
339
+ expires_at AS expiresAt
340
+ FROM leases
341
+ WHERE resource = ?
342
+ AND workspace = ?`,[t,n])[0]},list(t){return e.queryAll(`SELECT resource,
343
+ holder,
344
+ intent,
345
+ workspace,
346
+ acquired_at AS acquiredAt,
347
+ expires_at AS expiresAt
348
+ FROM leases
349
+ WHERE workspace = ?
350
+ ORDER BY acquired_at ASC, resource ASC`,[t])},delete(t,n){e.run(`DELETE FROM leases WHERE resource = ? AND workspace = ?`,[t,n])},cleanExpired(){let t=e.queryAll(`SELECT COUNT(*) AS count
351
+ FROM leases
352
+ WHERE expires_at <= datetime('now')`)[0]?.count??0;return t>0&&e.run(`DELETE FROM leases WHERE expires_at <= datetime('now')`),t}}}function $(e){return{create(t,n){e.run(`INSERT INTO memory_meta (entry_id, tier)
353
+ VALUES (?, ?)
354
+ ON CONFLICT(entry_id) DO NOTHING`,[t,n??`working`])},get(t){return e.queryAll(`SELECT entry_id AS entryId,
355
+ tier,
356
+ retention_score AS retentionScore,
357
+ access_count AS accessCount,
358
+ last_accessed_at AS lastAccessedAt,
359
+ created_at AS createdAt,
360
+ promoted_at AS promotedAt,
361
+ superseded_by AS supersededBy,
362
+ confidence
363
+ FROM memory_meta
364
+ WHERE entry_id = ?`,[t])[0]},touch(t){e.run(`UPDATE memory_meta
365
+ SET access_count = access_count + 1,
366
+ last_accessed_at = datetime('now')
367
+ WHERE entry_id = ?`,[t])},updateScore(t,n){e.run(`UPDATE memory_meta SET retention_score = ? WHERE entry_id = ?`,[n,t])},updateConfidence(t,n){e.run(`UPDATE memory_meta SET confidence = ? WHERE entry_id = ?`,[n,t])},updateTier(t,n){e.run(`UPDATE memory_meta
368
+ SET tier = ?,
369
+ promoted_at = CASE
370
+ WHEN ? = tier THEN promoted_at
371
+ WHEN ? = 'working' THEN promoted_at
372
+ ELSE COALESCE(promoted_at, datetime('now'))
373
+ END
374
+ WHERE entry_id = ?`,[n,n,n,t])},setSuperseded(t,n){e.run(`UPDATE memory_meta SET superseded_by = ? WHERE entry_id = ?`,[n,t])},list(t){let n=[],r=[];t?.tier!==void 0&&(n.push(`tier = ?`),r.push(t.tier)),t?.belowScore!==void 0&&(n.push(`retention_score < ?`),r.push(t.belowScore));let i=n.length>0?`WHERE ${n.join(` AND `)}`:``,a=t?.limit===void 0?``:`LIMIT ?`;return t?.limit!==void 0&&r.push(t.limit),e.queryAll(`SELECT entry_id AS entryId,
375
+ tier,
376
+ retention_score AS retentionScore,
377
+ access_count AS accessCount,
378
+ last_accessed_at AS lastAccessedAt,
379
+ created_at AS createdAt,
380
+ promoted_at AS promotedAt,
381
+ superseded_by AS supersededBy,
382
+ confidence
383
+ FROM memory_meta
384
+ ${i}
385
+ ORDER BY retention_score ASC,
386
+ COALESCE(last_accessed_at, created_at) ASC,
387
+ entry_id ASC
388
+ ${a}`,r)}}}function ee(e){let t=e.prepare(`SELECT key, value, updated_at AS updatedAt FROM stash WHERE key = ?`),n=e.prepare(`INSERT INTO stash (key, value)
389
+ VALUES (?, ?)
390
+ ON CONFLICT(key) DO UPDATE SET
391
+ value = excluded.value,
392
+ updated_at = datetime('now')`),r=e.prepare(`SELECT key, value, updated_at AS updatedAt FROM stash ORDER BY key`),i=e.prepare(`SELECT 1 AS present FROM stash WHERE key = ?`),a=e.prepare(`DELETE FROM stash WHERE key = ?`),o=e.prepare(`DELETE FROM stash`);return{get(e){return t.get(e)},set(e,t){n.run(e,t)},list(){return r.all()},has(e){return i.get(e)!==void 0},delete(e){a.run(e)},clear(){o.run()}}}function te(e){let t=e.prepare(`INSERT INTO checkpoints (id, label, data, notes)
393
+ VALUES (?, ?, ?, ?)
394
+ ON CONFLICT(id) DO UPDATE SET
395
+ label = excluded.label,
396
+ data = excluded.data,
397
+ notes = excluded.notes,
398
+ created_at = datetime('now')`),n=e.prepare(`SELECT id, label, data, notes, created_at AS createdAt FROM checkpoints WHERE id = ?`),r=e.prepare(`SELECT id, label, notes, created_at AS createdAt
399
+ FROM checkpoints
400
+ ORDER BY created_at DESC, id DESC`),i=e.prepare(`SELECT id, label, notes, created_at AS createdAt
401
+ FROM checkpoints
402
+ ORDER BY created_at DESC, id DESC
403
+ LIMIT ?`),a=e.prepare(`SELECT id, label, notes, created_at AS createdAt
404
+ FROM checkpoints
405
+ WHERE label = ?
406
+ ORDER BY created_at DESC, id DESC`),o=e.prepare(`SELECT id, label, notes, created_at AS createdAt
407
+ FROM checkpoints
408
+ WHERE label = ?
409
+ ORDER BY created_at DESC, id DESC
410
+ LIMIT ?`),s=e.prepare(`SELECT id, label, data, notes, created_at AS createdAt
411
+ FROM checkpoints
412
+ ORDER BY created_at DESC, id DESC
413
+ LIMIT 1`),c=e.prepare(`SELECT id, label, data, notes, created_at AS createdAt
414
+ FROM checkpoints
415
+ WHERE label = ?
416
+ ORDER BY created_at DESC, id DESC
417
+ LIMIT 1`),l=e.prepare(`SELECT 1 AS present FROM checkpoints WHERE id = ?`),u=e.prepare(`DELETE FROM checkpoints WHERE id = ?`),d=e.prepare(`SELECT id, label, notes, created_at AS createdAt
418
+ FROM checkpoints
419
+ ORDER BY label, created_at DESC, id DESC`);return{save(e,n,r,i){t.run(e,n,r,i??null)},get(e){return n.get(e)},list(e,t){return e!==void 0&&t!==void 0?o.all(e,t):e===void 0?t===void 0?r.all():i.all(t):a.all(e)},latest(e){return e===void 0?s.get():c.get(e)},has(e){return l.get(e)!==void 0},delete(e){u.run(e)},gc(e=10,t){let n=d.all(),r=t===void 0?void 0:Date.now()-t*864e5,i=new Map;for(let e of n){let t=i.get(e.label);t?t.push(e):i.set(e.label,[e])}let a=[];for(let t of i.values())t.forEach((t,n)=>{let i=Date.parse(t.createdAt);n<e&&!(r!==void 0&&!Number.isNaN(i)&&i<r)||a.push(t.id)});for(let e of a)u.run(e);return a.length}}}function ne(e){let t=e.prepare(`INSERT INTO sessions (session_id, metadata)
420
+ VALUES (?, ?)
421
+ ON CONFLICT(session_id) DO UPDATE SET
422
+ last_activity = datetime('now'),
423
+ metadata = excluded.metadata`),n=e.prepare(`UPDATE sessions SET last_activity = datetime('now') WHERE session_id = ?`),r=e.prepare(`SELECT session_id AS sessionId,
424
+ created_at AS createdAt,
425
+ last_activity AS lastActivity,
426
+ metadata
427
+ FROM sessions
428
+ WHERE session_id = ?`),i=e.prepare(`SELECT session_id AS sessionId,
429
+ created_at AS createdAt,
430
+ last_activity AS lastActivity
431
+ FROM sessions
432
+ ORDER BY created_at, session_id`),a=e.prepare(`SELECT 1 AS present FROM sessions WHERE session_id = ?`),o=e.prepare(`DELETE FROM sessions WHERE session_id = ?`),s=e.prepare(`SELECT COUNT(*) AS count
433
+ FROM sessions
434
+ WHERE last_activity < datetime('now', ?)`),c=e.prepare(`DELETE FROM sessions
435
+ WHERE last_activity < datetime('now', ?)`);return{create(e,n){t.run(e,n??null)},touch(e){n.run(e)},get(e){return r.get(e)},list(){return i.all()},has(e){return a.get(e)!==void 0},delete(e){o.run(e)},deleteStale(e){let t=`-${Math.max(0,e)} minutes`,n=s.get(t)?.count??0;return n>0&&c.run(t),n}}}function re(e){let t=e.prepare(`INSERT INTO signals (workspace, key, value, agent, ttl_seconds, expires_at)
436
+ VALUES (?, ?, ?, ?, ?, datetime('now', '+' || ? || ' seconds'))`),n=e.prepare(`SELECT id,
437
+ workspace,
438
+ key,
439
+ value,
440
+ agent,
441
+ created_at AS createdAt,
442
+ expires_at AS expiresAt
443
+ FROM signals
444
+ WHERE workspace = ?
445
+ AND key = ?
446
+ ORDER BY created_at ASC, id ASC`),r=e.prepare(`SELECT id,
447
+ workspace,
448
+ key,
449
+ value,
450
+ agent,
451
+ created_at AS createdAt,
452
+ expires_at AS expiresAt
453
+ FROM signals
454
+ WHERE workspace = ?
455
+ ORDER BY created_at ASC, id ASC`),i=e.prepare(`SELECT COUNT(*) AS count FROM signals WHERE workspace = ?`),a=e.prepare(`SELECT COUNT(*) AS count FROM signals WHERE workspace = ? AND key = ?`),o=e.prepare(`DELETE FROM signals WHERE workspace = ?`),s=e.prepare(`DELETE FROM signals WHERE workspace = ? AND key = ?`),c=e.prepare(`SELECT COUNT(*) AS count
456
+ FROM signals
457
+ WHERE expires_at <= datetime('now')`),l=e.prepare(`DELETE FROM signals WHERE expires_at <= datetime('now')`);return{post(e,n,r,i,a=300){let o=t.run(e,n,r,i??null,a,a);return Number(o.lastInsertRowid)},get(e,t){return n.all(e,t)},list(e){return r.all(e)},clear(e,t){let n=t===void 0?i.get(e)?.count??0:a.get(e,t)?.count??0;return n>0&&(t===void 0?o.run(e):s.run(e,t)),n},cleanExpired(){let e=c.get()?.count??0;return e>0&&l.run(),e}}}function ie(e){let t=e.prepare(`INSERT INTO leases (resource, holder, intent, workspace, ttl_minutes, expires_at)
458
+ VALUES (?, ?, ?, ?, ?, datetime('now', '+' || ? || ' minutes'))
459
+ ON CONFLICT(workspace, resource) DO UPDATE SET
460
+ holder = excluded.holder,
461
+ intent = excluded.intent,
462
+ ttl_minutes = excluded.ttl_minutes,
463
+ acquired_at = datetime('now'),
464
+ expires_at = excluded.expires_at`),n=e.prepare(`SELECT resource,
465
+ holder,
466
+ intent,
467
+ workspace,
468
+ acquired_at AS acquiredAt,
469
+ expires_at AS expiresAt
470
+ FROM leases
471
+ WHERE resource = ?
472
+ AND workspace = ?`),r=e.prepare(`SELECT resource,
473
+ holder,
474
+ intent,
475
+ workspace,
476
+ acquired_at AS acquiredAt,
477
+ expires_at AS expiresAt
478
+ FROM leases
479
+ WHERE workspace = ?
480
+ ORDER BY acquired_at ASC, resource ASC`),i=e.prepare(`DELETE FROM leases WHERE resource = ? AND workspace = ?`),a=e.prepare(`SELECT COUNT(*) AS count
481
+ FROM leases
482
+ WHERE expires_at <= datetime('now')`),o=e.prepare(`DELETE FROM leases WHERE expires_at <= datetime('now')`);return{upsert(e,n,r,i,a=10){t.run(e,n,i??null,r,a,a)},get(e,t){return n.get(e,t)},list(e){return r.all(e)},delete(e,t){i.run(e,t)},cleanExpired(){let e=a.get()?.count??0;return e>0&&o.run(),e}}}function ae(e){let t=e.prepare(`INSERT INTO memory_meta (entry_id, tier)
483
+ VALUES (?, ?)
484
+ ON CONFLICT(entry_id) DO NOTHING`),n=e.prepare(`SELECT entry_id AS entryId,
485
+ tier,
486
+ retention_score AS retentionScore,
487
+ access_count AS accessCount,
488
+ last_accessed_at AS lastAccessedAt,
489
+ created_at AS createdAt,
490
+ promoted_at AS promotedAt,
491
+ superseded_by AS supersededBy,
492
+ confidence
493
+ FROM memory_meta
494
+ WHERE entry_id = ?`),r=e.prepare(`UPDATE memory_meta
495
+ SET access_count = access_count + 1,
496
+ last_accessed_at = datetime('now')
497
+ WHERE entry_id = ?`),i=e.prepare(`UPDATE memory_meta SET retention_score = ? WHERE entry_id = ?`),a=e.prepare(`UPDATE memory_meta SET confidence = ? WHERE entry_id = ?`),o=e.prepare(`UPDATE memory_meta
498
+ SET tier = ?,
499
+ promoted_at = CASE
500
+ WHEN ? = tier THEN promoted_at
501
+ WHEN ? = 'working' THEN promoted_at
502
+ ELSE COALESCE(promoted_at, datetime('now'))
503
+ END
504
+ WHERE entry_id = ?`),s=e.prepare(`UPDATE memory_meta SET superseded_by = ? WHERE entry_id = ?`),c=e.prepare(`SELECT entry_id AS entryId,
505
+ tier,
506
+ retention_score AS retentionScore,
507
+ access_count AS accessCount,
508
+ last_accessed_at AS lastAccessedAt,
509
+ created_at AS createdAt,
510
+ promoted_at AS promotedAt,
511
+ superseded_by AS supersededBy,
512
+ confidence
513
+ FROM memory_meta
514
+ ORDER BY retention_score ASC,
515
+ COALESCE(last_accessed_at, created_at) ASC,
516
+ entry_id ASC`),l=e.prepare(`SELECT entry_id AS entryId,
517
+ tier,
518
+ retention_score AS retentionScore,
519
+ access_count AS accessCount,
520
+ last_accessed_at AS lastAccessedAt,
521
+ created_at AS createdAt,
522
+ promoted_at AS promotedAt,
523
+ superseded_by AS supersededBy,
524
+ confidence
525
+ FROM memory_meta
526
+ ORDER BY retention_score ASC,
527
+ COALESCE(last_accessed_at, created_at) ASC,
528
+ entry_id ASC
529
+ LIMIT ?`),u=e.prepare(`SELECT entry_id AS entryId,
530
+ tier,
531
+ retention_score AS retentionScore,
532
+ access_count AS accessCount,
533
+ last_accessed_at AS lastAccessedAt,
534
+ created_at AS createdAt,
535
+ promoted_at AS promotedAt,
536
+ superseded_by AS supersededBy,
537
+ confidence
538
+ FROM memory_meta
539
+ WHERE tier = ?
540
+ ORDER BY retention_score ASC,
541
+ COALESCE(last_accessed_at, created_at) ASC,
542
+ entry_id ASC`),d=e.prepare(`SELECT entry_id AS entryId,
543
+ tier,
544
+ retention_score AS retentionScore,
545
+ access_count AS accessCount,
546
+ last_accessed_at AS lastAccessedAt,
547
+ created_at AS createdAt,
548
+ promoted_at AS promotedAt,
549
+ superseded_by AS supersededBy,
550
+ confidence
551
+ FROM memory_meta
552
+ WHERE tier = ?
553
+ ORDER BY retention_score ASC,
554
+ COALESCE(last_accessed_at, created_at) ASC,
555
+ entry_id ASC
556
+ LIMIT ?`),f=e.prepare(`SELECT entry_id AS entryId,
557
+ tier,
558
+ retention_score AS retentionScore,
559
+ access_count AS accessCount,
560
+ last_accessed_at AS lastAccessedAt,
561
+ created_at AS createdAt,
562
+ promoted_at AS promotedAt,
563
+ superseded_by AS supersededBy,
564
+ confidence
565
+ FROM memory_meta
566
+ WHERE retention_score < ?
567
+ ORDER BY retention_score ASC,
568
+ COALESCE(last_accessed_at, created_at) ASC,
569
+ entry_id ASC`),p=e.prepare(`SELECT entry_id AS entryId,
570
+ tier,
571
+ retention_score AS retentionScore,
572
+ access_count AS accessCount,
573
+ last_accessed_at AS lastAccessedAt,
574
+ created_at AS createdAt,
575
+ promoted_at AS promotedAt,
576
+ superseded_by AS supersededBy,
577
+ confidence
578
+ FROM memory_meta
579
+ WHERE retention_score < ?
580
+ ORDER BY retention_score ASC,
581
+ COALESCE(last_accessed_at, created_at) ASC,
582
+ entry_id ASC
583
+ LIMIT ?`),m=e.prepare(`SELECT entry_id AS entryId,
584
+ tier,
585
+ retention_score AS retentionScore,
586
+ access_count AS accessCount,
587
+ last_accessed_at AS lastAccessedAt,
588
+ created_at AS createdAt,
589
+ promoted_at AS promotedAt,
590
+ superseded_by AS supersededBy,
591
+ confidence
592
+ FROM memory_meta
593
+ WHERE tier = ?
594
+ AND retention_score < ?
595
+ ORDER BY retention_score ASC,
596
+ COALESCE(last_accessed_at, created_at) ASC,
597
+ entry_id ASC`),h=e.prepare(`SELECT entry_id AS entryId,
598
+ tier,
599
+ retention_score AS retentionScore,
600
+ access_count AS accessCount,
601
+ last_accessed_at AS lastAccessedAt,
602
+ created_at AS createdAt,
603
+ promoted_at AS promotedAt,
604
+ superseded_by AS supersededBy,
605
+ confidence
606
+ FROM memory_meta
607
+ WHERE tier = ?
608
+ AND retention_score < ?
609
+ ORDER BY retention_score ASC,
610
+ COALESCE(last_accessed_at, created_at) ASC,
611
+ entry_id ASC
612
+ LIMIT ?`);return{create(e,n){t.run(e,n??`working`)},get(e){return n.get(e)},touch(e){r.run(e)},updateScore(e,t){i.run(t,e)},updateConfidence(e,t){a.run(t,e)},updateTier(e,t){o.run(t,t,t,e)},setSuperseded(e,t){s.run(t,e)},list(e){return e?.tier!==void 0&&e?.belowScore!==void 0&&e?.limit!==void 0?h.all(e.tier,e.belowScore,e.limit):e?.tier!==void 0&&e?.belowScore!==void 0?m.all(e.tier,e.belowScore):e?.tier!==void 0&&e?.limit!==void 0?d.all(e.tier,e.limit):e?.tier===void 0?e?.belowScore!==void 0&&e?.limit!==void 0?p.all(e.belowScore,e.limit):e?.belowScore===void 0?e?.limit===void 0?c.all():l.all(e.limit):f.all(e.belowScore):u.all(e.tier)}}}function oe(e){let t=q(e)?J(e):ee(e),n=q(e)?Z(e):re(e),r=q(e)?Q(e):ie(e),i=q(e)?X(e):ne(e),a=q(e)?Y(e):te(e),o=q(e)?$(e):ae(e);return{stashGet(e){return t.get(e)?.value},stashSet(e,n){t.set(e,n)},stashList(){return t.list()},stashDelete(e){return t.has(e)?(t.delete(e),!0):!1},stashClear(){t.clear()},signalPost(e,t,r,i,a){return n.post(e,t,r,i,a)},signalGet(e,t){return n.cleanExpired(),n.get(e,t).map(e=>({id:e.id,value:e.value,createdAt:K(e.createdAt),expiresAt:K(e.expiresAt),...e.agent?{agent:e.agent}:{}}))},signalList(e){return n.cleanExpired(),n.list(e).map(e=>({id:e.id,key:e.key,value:e.value,createdAt:K(e.createdAt),...e.agent?{agent:e.agent}:{}}))},signalClear(e,t){return n.cleanExpired(),n.clear(e,t)},signalCleanExpired(){return n.cleanExpired()},leaseAcquire(e,t,n,i,a){r.cleanExpired();let o=r.get(e,n);return o&&o.holder!==t?!1:(r.upsert(e,t,n,i??o?.intent??void 0,a),!0)},leaseRelease(e,t,n){r.cleanExpired();let i=r.get(e,n);return!i||i.holder!==t?!1:(r.delete(e,n),!0)},leaseGet(e,t){r.cleanExpired();let n=r.get(e,t);if(n)return{resource:n.resource,holder:n.holder,workspace:n.workspace,acquiredAt:K(n.acquiredAt),expiresAt:K(n.expiresAt),...n.intent?{intent:n.intent}:{}}},leaseList(e){return r.cleanExpired(),r.list(e).map(e=>({resource:e.resource,holder:e.holder,acquiredAt:K(e.acquiredAt),expiresAt:K(e.expiresAt),...e.intent?{intent:e.intent}:{}}))},leaseCleanExpired(){return r.cleanExpired()},sessionCreate(e,t){i.create(e,t?JSON.stringify(t):void 0)},sessionTouch(e){i.touch(e)},sessionGet(e){let t=i.get(e);if(t)return{sessionId:t.sessionId,createdAt:t.createdAt,lastActivity:t.lastActivity,...t.metadata?{metadata:t.metadata}:{}}},sessionList(){return i.list().map(e=>({sessionId:e.sessionId,createdAt:e.createdAt,lastActivity:e.lastActivity}))},sessionDelete(e){return i.has(e)?(i.delete(e),!0):!1},sessionDeleteStale(e){return i.deleteStale(e)},checkpointSave(e,t,n,r){a.save(e,t,n,r)},checkpointLoad(e){let t=a.get(e);if(t)return{id:t.id,label:t.label,data:t.data,createdAt:t.createdAt,...t.notes?{notes:t.notes}:{}}},checkpointList(e,t){return a.list(e,t).map(e=>({id:e.id,label:e.label,createdAt:e.createdAt,...e.notes?{notes:e.notes}:{}}))},checkpointLatest(e){let t=a.latest(e);if(t)return{id:t.id,label:t.label,data:t.data,createdAt:t.createdAt,...t.notes?{notes:t.notes}:{}}},checkpointDelete(e){return a.has(e)?(a.delete(e),!0):!1},checkpointDiff(e,t){let n=a.get(e),r=a.get(t);if(!(!n||!r))return{from:n.data,to:r.data}},checkpointHistory(e,t){return a.list(e,t).map(e=>({id:e.id,label:e.label,createdAt:e.createdAt,...e.notes?{notes:e.notes}:{}}))},checkpointGc(e,t){return a.gc(e,t)},memoryMetaCreate(e,t){o.create(e,t)},memoryMetaGet(e){return o.get(e)},memoryMetaTouch(e){o.touch(e)},memoryMetaUpdateScore(e,t){o.updateScore(e,t)},memoryMetaUpdateConfidence(e,t){o.updateConfidence(e,t)},memoryMetaUpdateTier(e,t){o.updateTier(e,t)},memoryMetaSetSuperseded(e,t){o.setSuperseded(e,t)},memoryMetaList(e){return o.list(e)}}}async function se(e){switch(e.backend){case`lancedb`:{let{LanceStore:t}=await import(`./lance-store-BRKcJXVO.js`);return new t({path:e.path})}case`sqlite-vec`:return new U({path:e.path,adapter:e.adapter,embeddingDim:e.embeddingDim});default:{let t=e.backend;throw Error(`Unknown store backend: "${t}". Supported: lancedb, sqlite-vec`)}}}export{M as SqliteGraphStore,U as SqliteVecStore,y as allMigrations,j as createSqlJsAdapter,A as createSqliteAdapter,oe as createStateStore,se as createStore,v as runMigrations};