omp-fabric 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.4.1
4
+
5
+ ### Fixed
6
+
7
+ - LCM suites left SQLite handles open on windows-latest: Bun's `node:sqlite` keeps the database, WAL and shared-memory descriptors open after `close()` reports the handle closed, releasing them only at collection, so `afterEach` removal failed with `EBUSY`. Tests now hand every ledger and runtime to a shared fixture that closes tracked handles, drops their references, forces collection, and retries removal, tolerating only lock codes on Windows. `LcmLedger.close()` is idempotent and marks itself closed only after the underlying close succeeds.
8
+ - The ledger backup test asserted POSIX permission bits on Windows, where `chmod` honours only the read-only flag; that assertion now runs where it has meaning.
9
+
3
10
  ## 1.4.0
4
11
 
5
12
  ### Added
@@ -29,7 +29,7 @@ import {
29
29
  } from "./chunk-6QBPSZJ5.js";
30
30
  import {
31
31
  hashLcmPayload
32
- } from "./chunk-IY3IQPRQ.js";
32
+ } from "./chunk-MBOXJKF6.js";
33
33
 
34
34
  // src/providers/memory-provider.ts
35
35
  import fs from "node:fs";
@@ -2132,4 +2132,4 @@ export {
2132
2132
  normalizeMemoryArgs,
2133
2133
  MemoryProvider
2134
2134
  };
2135
- //# sourceMappingURL=chunk-3H5LZWAG.js.map
2135
+ //# sourceMappingURL=chunk-6JPXLXDS.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  canonicalLcmPayload,
3
3
  hashLcmPayload
4
- } from "./chunk-IY3IQPRQ.js";
4
+ } from "./chunk-MBOXJKF6.js";
5
5
  import {
6
6
  clipUtf8,
7
7
  compactionRequestBoundsError,
@@ -557,4 +557,4 @@ export {
557
557
  buildPeerCards,
558
558
  awaitPeerSettle
559
559
  };
560
- //# sourceMappingURL=chunk-WPU4PKXQ.js.map
560
+ //# sourceMappingURL=chunk-LB2EC7FZ.js.map
@@ -82,6 +82,7 @@ var LcmLedger = class {
82
82
  maintenanceBytes;
83
83
  writeChain = Promise.resolve();
84
84
  transactionDepth = 0;
85
+ closed = false;
85
86
  constructor(options = {}) {
86
87
  this.now = options.now ?? Date.now;
87
88
  this.warningBytes = options.warningBytes ?? LCM_LEDGER_WARNING_BYTES;
@@ -294,7 +295,9 @@ var LcmLedger = class {
294
295
  return operation();
295
296
  }
296
297
  close() {
298
+ if (this.closed) return;
297
299
  this.db.close();
300
+ this.closed = true;
298
301
  }
299
302
  };
300
303
 
@@ -305,4 +308,4 @@ export {
305
308
  defaultLedgerPath,
306
309
  LcmLedger
307
310
  };
308
- //# sourceMappingURL=chunk-IY3IQPRQ.js.map
311
+ //# sourceMappingURL=chunk-MBOXJKF6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/storage/lcm-ledger.ts"],
4
+ "sourcesContent": ["import { DatabaseSync } from \"node:sqlite\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\n\nexport interface ProjectIdentityInput { recordedCwd?: string; liveCwd?: string }\nexport interface ProjectIdentity { version: 1; key: string; canonicalPath?: string; device?: number; inode?: number; aliases: string[] }\nconst LCM_LEDGER_WARNING_BYTES = 8 * 1024 ** 3;\nconst LCM_LEDGER_MAINTENANCE_BYTES = 10 * 1024 ** 3;\nexport interface LedgerOptions { dbPath?: string; rootDir?: string; project?: ProjectIdentityInput; now?: () => number; warningBytes?: number; maintenanceBytes?: number }\nexport type OperationalState = \"healthy\" | \"warning\" | \"maintenance\" | \"degraded\";\nexport interface CheckpointMetrics { mode: \"passive\" | \"truncate\"; busy: number; logPages: number; checkpointedPages: number; truncated: boolean }\nexport interface BackupManifest { format: \"lcm-ledger-backup\"; version: 1; source: string; destination: string; sourceSha256: string; backupSha256: string; sourceStateSha256: string; rowCounts: Record<string, number>; integrity: \"ok\" | string; createdAt: number }\nexport interface DeleteConfirmationToken { readonly projectKey: string; readonly value: string; readonly __brand: \"DeleteConfirmationToken\" }\nexport function createDeleteConfirmationToken(projectKey: string): DeleteConfirmationToken { return { projectKey, value: hash(`delete:${projectKey}`), __brand: \"DeleteConfirmationToken\" }; }\nexport interface SessionEntry { projectKey: string; sessionId: string; entryId: string; revision?: number; role: string; content: string; payloadJson: string; parentEntryId?: string | null; branch?: string | null; recordedCwd?: string; createdAt?: number }\nexport interface RawEntry extends SessionEntry { revision: number; contentHash: string; payloadHash: string; createdAt: number }\n\nexport function canonicalLcmPayload(value: unknown): string {\n const normalized: unknown = JSON.parse(JSON.stringify(value));\n const encode = (item: unknown): string => {\n if (Array.isArray(item)) return `[${item.map(encode).join(\",\")}]`;\n if (item !== null && typeof item === \"object\") return `{${Object.keys(item).sort().map(key => `${JSON.stringify(key)}:${encode((item as Record<string, unknown>)[key])}`).join(\",\")}}`;\n return JSON.stringify(item);\n };\n return encode(normalized);\n}\nexport function hashLcmPayload(value: unknown): string { return crypto.createHash(\"sha256\").update(canonicalLcmPayload(value), \"utf8\").digest(\"hex\"); }\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS schema_metadata (key TEXT PRIMARY KEY, value TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS projects (project_key TEXT PRIMARY KEY, identity_json TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);\nCREATE TABLE IF NOT EXISTS project_aliases (alias TEXT PRIMARY KEY, project_key TEXT NOT NULL REFERENCES projects(project_key));\nCREATE TABLE IF NOT EXISTS sessions (project_key TEXT NOT NULL, session_id TEXT NOT NULL, created_at INTEGER NOT NULL, PRIMARY KEY(project_key, session_id));\nCREATE TABLE IF NOT EXISTS raw_entries (project_key TEXT NOT NULL, session_id TEXT NOT NULL, entry_id TEXT NOT NULL, revision INTEGER NOT NULL, role TEXT NOT NULL, content TEXT NOT NULL, content_hash TEXT NOT NULL, payload_json TEXT NOT NULL, parent_entry_id TEXT, branch TEXT, created_at INTEGER NOT NULL, PRIMARY KEY(project_key, session_id, entry_id, revision), UNIQUE(project_key, session_id, entry_id, content_hash));\nCREATE TABLE IF NOT EXISTS summary_nodes (node_id TEXT PRIMARY KEY, project_key TEXT NOT NULL, payload TEXT NOT NULL, created_at INTEGER NOT NULL);\nCREATE TABLE IF NOT EXISTS summary_edges (parent_id TEXT NOT NULL, child_id TEXT NOT NULL, PRIMARY KEY(parent_id, child_id));\nCREATE TABLE IF NOT EXISTS frontiers (project_key TEXT NOT NULL, frontier_id TEXT NOT NULL, node_id TEXT NOT NULL, created_at INTEGER NOT NULL, PRIMARY KEY(project_key, frontier_id, node_id));\nCREATE TABLE IF NOT EXISTS maintenance_jobs (job_id TEXT PRIMARY KEY, project_key TEXT NOT NULL, status TEXT NOT NULL, payload TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);\nCREATE TABLE IF NOT EXISTS maintenance_usage (project_key TEXT NOT NULL, day TEXT NOT NULL, session_id TEXT NOT NULL, calls INTEGER NOT NULL, input_tokens INTEGER NOT NULL, output_tokens INTEGER NOT NULL, cost REAL NOT NULL, wall_ms INTEGER NOT NULL, PRIMARY KEY(project_key,day,session_id));\nCREATE INDEX IF NOT EXISTS raw_entries_lookup ON raw_entries(project_key, session_id, entry_id, revision);\n`;\n\nconst hash = (s: string) => crypto.createHash(\"sha256\").update(s).digest(\"hex\");\nconst fileHash = (file: string) => crypto.createHash(\"sha256\").update(fs.readFileSync(file)).digest(\"hex\");\nconst snapshotHash = (db: DatabaseSync): string => {\n const digest = crypto.createHash(\"sha256\");\n for (const [table, order] of [[\"schema_metadata\", \"key\"], [\"projects\", \"project_key\"], [\"project_aliases\", \"alias\"], [\"sessions\", \"project_key,session_id\"], [\"raw_entries\", \"project_key,session_id,entry_id,revision\"], [\"summary_nodes\", \"node_id\"], [\"summary_edges\", \"parent_id,child_id\"], [\"frontiers\", \"project_key,frontier_id,node_id\"], [\"maintenance_jobs\", \"job_id\"], [\"maintenance_usage\", \"project_key,day,session_id\"]] as const) {\n digest.update(`${table}\\0`);\n for (const row of db.prepare(`SELECT * FROM ${table} ORDER BY ${order}`).all()) digest.update(`${JSON.stringify(row)}\\0`);\n }\n return digest.digest(\"hex\");\n};\nconst normalize = (p: string) => path.normalize(path.resolve(p));\nconst statIdentity = (p: string) => { try { const s = fs.statSync(p); return { device: Number(s.dev), inode: Number(s.ino) }; } catch { return {}; } };\n\nexport function canonicalProjectIdentity(input: ProjectIdentityInput): ProjectIdentity {\n const source = input.recordedCwd?.trim() || input.liveCwd?.trim();\n if (!source) throw new Error(\"project cwd is required\");\n const normalized = normalize(source);\n let canonicalPath = normalized;\n try { canonicalPath = fs.realpathSync.native(normalized); } catch {}\n const ids = statIdentity(canonicalPath);\n const key = ids.device !== undefined && ids.inode !== undefined ? `v1:devino:${ids.device}:${ids.inode}` : `v1:path:${canonicalPath}`;\n return { version: 1, key, canonicalPath, ...ids, aliases: [normalized, canonicalPath] };\n}\n\nexport function defaultLedgerPath(rootDir = path.join(process.env.XDG_STATE_HOME || path.join(process.env.HOME || \".\", \".local\", \"state\"), \"omp-fabric\", \"lcm\"), projectKey = \"default\"): string {\n return path.join(rootDir, `${hash(projectKey).slice(0, 24)}.sqlite`);\n}\n\nclass LedgerDegradedError extends Error { constructor(message: string, public readonly cause?: unknown) { super(message); this.name = \"LedgerDegradedError\"; } }\n\nexport class LcmLedger {\n readonly db: DatabaseSync;\n readonly project: ProjectIdentity;\n private degraded = false;\n private readonly dbPath: string;\n private readonly now: () => number;\n private readonly warningBytes: number;\n private readonly maintenanceBytes: number;\n private writeChain: Promise<void> = Promise.resolve();\n private transactionDepth = 0;\n private closed = false;\n constructor(options: LedgerOptions = {}) {\n this.now = options.now ?? Date.now;\n this.warningBytes = options.warningBytes ?? LCM_LEDGER_WARNING_BYTES;\n this.maintenanceBytes = options.maintenanceBytes ?? LCM_LEDGER_MAINTENANCE_BYTES;\n if (!Number.isSafeInteger(this.warningBytes) || !Number.isSafeInteger(this.maintenanceBytes) || this.warningBytes < 0 || this.maintenanceBytes < this.warningBytes) {\n throw new Error(\"invalid ledger size thresholds\");\n }\n this.project = canonicalProjectIdentity(options.project ?? { liveCwd: process.cwd() });\n const dbPath = options.dbPath ?? defaultLedgerPath(options.rootDir, this.project.key);\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n this.dbPath = dbPath;\n this.db = new DatabaseSync(dbPath);\n try {\n this.db.exec(\"PRAGMA journal_mode=WAL; PRAGMA synchronous=FULL; PRAGMA busy_timeout=5000; PRAGMA wal_autocheckpoint=1000;\");\n this.db.exec(\"BEGIN IMMEDIATE;\" + SCHEMA + \"INSERT INTO schema_metadata(key,value) VALUES ('version','1') ON CONFLICT(key) DO UPDATE SET value='1'; COMMIT;\");\n const columns = this.db.prepare(\"PRAGMA table_info(raw_entries)\").all() as Array<{ name: string }>;\n if (!columns.some(column => column.name === \"payload_json\")) {\n if (Number((this.db.prepare(\"SELECT count(*) n FROM raw_entries\").get() as { n: number }).n)) throw new Error(\"raw payloads missing; reimport authoritative session entries\");\n this.db.exec(\"ALTER TABLE raw_entries ADD COLUMN payload_json TEXT NOT NULL DEFAULT ''\");\n }\n const result = this.db.prepare(\"PRAGMA integrity_check\").get() as { integrity_check?: string };\n if (result.integrity_check !== \"ok\") throw new Error(String(result.integrity_check));\n this.registerProject(this.project);\n } catch (error) { this.degraded = true; throw new LedgerDegradedError(\"ledger startup failed\", error); }\n }\n get isDegraded() { return this.degraded; }\n get operationalState(): OperationalState {\n if (this.degraded) return \"degraded\";\n try { const size = fs.statSync(this.dbPath).size; if (size >= this.maintenanceBytes) return \"maintenance\"; if (size >= this.warningBytes) return \"warning\"; } catch {}\n return \"healthy\";\n }\n markDegraded(error?: unknown) { this.degraded = true; return new LedgerDegradedError(\"ledger is degraded\", error); }\n private registerProject(identity: ProjectIdentity) {\n const now = this.now();\n this.db.prepare(\"INSERT INTO projects(project_key,identity_json,created_at,updated_at) VALUES(?,?,?,?) ON CONFLICT(project_key) DO UPDATE SET identity_json=excluded.identity_json,updated_at=excluded.updated_at\").run(identity.key, JSON.stringify(identity), now, now);\n for (const alias of identity.aliases) {\n const existing = this.db.prepare(\"SELECT project_key FROM project_aliases WHERE alias=?\").get(alias) as { project_key?: string } | undefined;\n if (existing && existing.project_key !== identity.key) throw new LedgerDegradedError(`ambiguous project alias: ${alias}`);\n this.db.prepare(\"INSERT OR IGNORE INTO project_aliases(alias,project_key) VALUES(?,?)\").run(alias, identity.key);\n }\n }\n private guard() { if (this.degraded) throw new LedgerDegradedError(\"ledger is degraded\"); }\n private assertProjectKey(projectKey: string) { if (projectKey !== this.project.key) throw new Error(\"project key does not match ledger project\"); }\n async serialize<T>(operation: () => T): Promise<T> { const previous = this.writeChain; let release!: () => void; this.writeChain = new Promise<void>(resolve => { release = resolve }); await previous; try { this.guard(); return operation(); } finally { release(); } }\n appendRaw(entry: SessionEntry): RawEntry {\n this.guard();\n if (entry.projectKey !== this.project.key) throw new Error(\"entry project does not match ledger project\");\n if (entry.entryId.trim().length === 0) throw new Error(\"entry ID is required\");\n if (typeof entry.payloadJson !== \"string\" || !entry.payloadJson.trim()) throw new Error(\"full payload JSON is required\");\n let payload: Record<string, unknown>;\n try { payload = JSON.parse(entry.payloadJson) as Record<string, unknown>; } catch { throw new Error(\"invalid payload JSON\"); }\n if (!payload || typeof payload !== \"object\" || typeof payload.type !== \"string\" || typeof payload.id !== \"string\" || payload.id !== entry.entryId) throw new Error(\"payload must be a full SessionEntry\");\n const payloadJson = canonicalLcmPayload(payload);\n const contentHash = hashLcmPayload(payload);\n const ownsTransaction = this.transactionDepth === 0;\n if (ownsTransaction) this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n const existing = this.db.prepare(\"SELECT revision,created_at FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND content_hash=?\").get(entry.projectKey, entry.sessionId, entry.entryId, contentHash) as { revision: number; created_at: number } | undefined;\n if (existing) { if (ownsTransaction) this.db.exec(\"COMMIT\"); return { ...entry, payloadJson, payloadHash: contentHash, revision: existing.revision, contentHash, createdAt: existing.created_at }; }\n const latest = this.db.prepare(\"SELECT COALESCE(MAX(revision),0) revision FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=?\").get(entry.projectKey, entry.sessionId, entry.entryId) as { revision: number };\n const revision = latest.revision + 1; const createdAt = entry.createdAt ?? this.now();\n this.db.prepare(\"INSERT OR IGNORE INTO sessions(project_key,session_id,created_at) VALUES(?,?,?)\").run(entry.projectKey, entry.sessionId, createdAt);\n this.db.prepare(\"INSERT INTO raw_entries(project_key,session_id,entry_id,revision,role,content,content_hash,payload_json,parent_entry_id,branch,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?)\").run(entry.projectKey,entry.sessionId,entry.entryId,revision,entry.role,entry.content,contentHash,payloadJson,entry.parentEntryId ?? null,entry.branch ?? null,createdAt);\n if (ownsTransaction) this.db.exec(\"COMMIT\");\n return { ...entry, payloadJson, payloadHash: contentHash, revision, contentHash, createdAt };\n } catch (error) {\n if (ownsTransaction) this.db.exec(\"ROLLBACK\");\n const code = (error as NodeJS.ErrnoException).code; if (code === \"ENOSPC\" || code === \"SQLITE_FULL\" || String(error).includes(\"database or disk is full\")) this.degraded = true; throw new LedgerDegradedError(\"ledger write failed\", error);\n }\n }\n readRaw(projectKey = this.project.key, sessionId?: string): RawEntry[] { this.guard(); this.assertProjectKey(projectKey); const rows = sessionId ? this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? AND session_id=? ORDER BY created_at,revision\").all(projectKey,sessionId) : this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? ORDER BY created_at,session_id,entry_id,revision\").all(projectKey); return (rows as Array<Record<string, unknown>>).map(row => ({ projectKey: row.project_key as string, sessionId: row.session_id as string, entryId: row.entry_id as string, revision: row.revision as number, role: row.role as string, content: row.content as string, contentHash: row.content_hash as string, payloadHash: row.content_hash as string, payloadJson: row.payload_json as string, parentEntryId: row.parent_entry_id as string | null, branch: row.branch as string | null, createdAt: row.created_at as number })); }\n readRawPage(projectKey = this.project.key, sessionId?: string, offset = 0, limit = 100): RawEntry[] { if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(limit) || limit < 1) throw new Error(\"invalid raw page\"); this.guard(); this.assertProjectKey(projectKey); const rows = sessionId ? this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? AND session_id=? ORDER BY created_at,revision LIMIT ? OFFSET ?\").all(projectKey,sessionId,limit,offset) : this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? ORDER BY created_at,session_id,entry_id,revision LIMIT ? OFFSET ?\").all(projectKey,limit,offset); return (rows as Array<Record<string, unknown>>).map(row => ({ projectKey: row.project_key as string, sessionId: row.session_id as string, entryId: row.entry_id as string, revision: row.revision as number, role: row.role as string, content: row.content as string, contentHash: row.content_hash as string, payloadHash: row.content_hash as string, payloadJson: row.payload_json as string, parentEntryId: row.parent_entry_id as string | null, branch: row.branch as string | null, createdAt: row.created_at as number })); }\n readRawEntry(projectKey: string, sessionId: string, entryId: string, revision: number): RawEntry | undefined { this.guard(); this.assertProjectKey(projectKey); const row = this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(projectKey,sessionId,entryId,revision) as Record<string, unknown> | undefined; return row ? { projectKey: row.project_key as string, sessionId: row.session_id as string, entryId: row.entry_id as string, revision: row.revision as number, role: row.role as string, content: row.content as string, contentHash: row.content_hash as string, payloadHash: row.content_hash as string, payloadJson: row.payload_json as string, parentEntryId: row.parent_entry_id as string | null, branch: row.branch as string | null, createdAt: row.created_at as number } : undefined; }\n readOnly<T>(fn: (db: DatabaseSync) => T): T { this.guard(); return fn(this.db); }\n transaction<T>(fn: (db: DatabaseSync) => T): T { this.guard(); if (this.transactionDepth > 0) return fn(this.db); this.db.exec(\"BEGIN IMMEDIATE\"); this.transactionDepth = 1; try { const result = fn(this.db); this.db.exec(\"COMMIT\"); return result; } catch (error) { this.db.exec(\"ROLLBACK\"); throw error; } finally { this.transactionDepth = 0; } }\n checkpoint(mode: \"passive\" | \"truncate\" = \"passive\"): CheckpointMetrics {\n const row = this.db.prepare(`PRAGMA wal_checkpoint(${mode.toUpperCase()})`).get() as { busy?: number; log?: number; checkpointed?: number };\n const busy = row.busy ?? 0;\n const logPages = row.log ?? 0;\n return { mode, busy, logPages, checkpointedPages: row.checkpointed ?? 0, truncated: mode === \"truncate\" && busy === 0 && logPages === 0 };\n }\n backup(destination: string): BackupManifest {\n this.guard();\n return this.serializeSync(() => {\n const target = path.resolve(destination);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n if (fs.existsSync(target)) throw new Error(\"backup destination exists\");\n this.db.exec(`VACUUM INTO '${target.replace(/'/g, \"''\")}'`);\n fs.chmodSync(target, 0o600);\n const copy = new DatabaseSync(target);\n let integrity = \"unknown\";\n let backupStateSha256 = \"\";\n const rowCounts: Record<string, number> = {};\n try {\n integrity = (copy.prepare(\"PRAGMA integrity_check\").get() as { integrity_check?: string }).integrity_check ?? \"unknown\";\n for (const table of [\"projects\", \"sessions\", \"raw_entries\", \"summary_nodes\", \"summary_edges\", \"frontiers\", \"maintenance_jobs\", \"maintenance_usage\"]) {\n rowCounts[table] = Number((copy.prepare(`SELECT count(*) n FROM ${table}`).get() as { n: number }).n);\n }\n backupStateSha256 = snapshotHash(copy);\n } finally {\n copy.close();\n }\n const manifest: BackupManifest = { format: \"lcm-ledger-backup\", version: 1, source: this.dbPath, destination: target, sourceSha256: fileHash(this.dbPath), backupSha256: fileHash(target), sourceStateSha256: backupStateSha256, rowCounts, integrity, createdAt: this.now() };\n fs.writeFileSync(`${target}.manifest.json`, JSON.stringify(manifest), { mode: 0o600 });\n fs.chmodSync(`${target}.manifest.json`, 0o600);\n return manifest;\n });\n }\n exportBackup(destination: string): BackupManifest { return this.backup(destination); }\n deleteProject(token: DeleteConfirmationToken, backupManifest: BackupManifest): void {\n this.guard();\n if (token.__brand !== \"DeleteConfirmationToken\" || token.projectKey !== this.project.key || token.value !== hash(`delete:${this.project.key}`)) throw new Error(\"invalid delete confirmation token\");\n const backupDb = fs.existsSync(backupManifest.destination) ? new DatabaseSync(backupManifest.destination) : undefined;\n let backupStateSha256: string | undefined;\n try {\n if (backupDb) backupStateSha256 = snapshotHash(backupDb);\n } finally {\n backupDb?.close();\n }\n if (backupManifest.integrity !== \"ok\" || backupManifest.source !== this.dbPath || !backupManifest.backupSha256 || backupManifest.backupSha256 !== fileHash(backupManifest.destination) || !backupManifest.sourceStateSha256 || backupManifest.sourceStateSha256 !== backupStateSha256 || backupManifest.sourceSha256 !== fileHash(this.dbPath) || backupManifest.sourceStateSha256 !== snapshotHash(this.db)) throw new Error(\"backup verification failed\");\n this.transaction(db => {\n db.prepare(\"DELETE FROM summary_edges WHERE parent_id IN (SELECT node_id FROM summary_nodes WHERE project_key=?) OR child_id IN (SELECT node_id FROM summary_nodes WHERE project_key=?)\").run(this.project.key, this.project.key);\n for (const table of [\"raw_entries\", \"sessions\", \"frontiers\", \"summary_nodes\", \"maintenance_jobs\", \"maintenance_usage\"]) db.prepare(`DELETE FROM ${table} WHERE project_key=?`).run(this.project.key);\n db.prepare(\"DELETE FROM project_aliases WHERE project_key=?\").run(this.project.key);\n db.prepare(\"DELETE FROM projects WHERE project_key=?\").run(this.project.key);\n });\n const integrity = (this.db.prepare(\"PRAGMA integrity_check\").get() as { integrity_check?: string }).integrity_check;\n if (integrity !== \"ok\") throw new Error(`post-delete integrity failed: ${integrity}`);\n const audit = { format: \"lcm-ledger-delete\", version: 1, projectKey: this.project.key, deletedAt: this.now(), integrity, remaining: Number((this.db.prepare(\"SELECT count(*) n FROM projects WHERE project_key=?\").get(this.project.key) as { n: number }).n) };\n fs.writeFileSync(`${backupManifest.destination}.delete-manifest.json`, JSON.stringify(audit), { mode: 0o600 });\n }\n private serializeSync<T>(operation: () => T): T { this.guard(); return operation(); }\n close() { if (this.closed) return; this.db.close(); this.closed = true; }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  peerLabelPrefix,
23
23
  writeHandoffSession
24
- } from "./chunk-WPU4PKXQ.js";
24
+ } from "./chunk-LB2EC7FZ.js";
25
25
  import {
26
26
  DEFAULT_FABRIC_CONFIG,
27
27
  MAX_AGENT_TIMEOUT_MS,
@@ -6635,4 +6635,4 @@ export {
6635
6635
  agentParticipantRecords,
6636
6636
  actorParticipantRecord
6637
6637
  };
6638
- //# sourceMappingURL=chunk-S4I7RMR5.js.map
6638
+ //# sourceMappingURL=chunk-OW2LSF5R.js.map
@@ -10,7 +10,7 @@ import {
10
10
  lifecycleSourceIdentity,
11
11
  loadModelUsage,
12
12
  useBudgetLedger
13
- } from "./chunk-S4I7RMR5.js";
13
+ } from "./chunk-OW2LSF5R.js";
14
14
  import {
15
15
  normalizeModelAliases,
16
16
  resolveAvailableOmpModel
@@ -685,4 +685,4 @@ if (isMain) {
685
685
  export {
686
686
  runResidentHostFromConfigPath
687
687
  };
688
- //# sourceMappingURL=chunk-IMSGR6OW.js.map
688
+ //# sourceMappingURL=chunk-SZWF6C4V.js.map
@@ -12,7 +12,7 @@ import {
12
12
  buildThinkingDigest,
13
13
  snapshotHandoffSession,
14
14
  thinkingTransferPolicy
15
- } from "./chunk-WPU4PKXQ.js";
15
+ } from "./chunk-LB2EC7FZ.js";
16
16
  import {
17
17
  isFabricThinking
18
18
  } from "./chunk-JSBTB3P6.js";
@@ -2803,4 +2803,4 @@ export {
2803
2803
  resolveFabricIdentity,
2804
2804
  MainAgentController
2805
2805
  };
2806
- //# sourceMappingURL=chunk-RTDJFHGH.js.map
2806
+ //# sourceMappingURL=chunk-TR3LQHO7.js.map
@@ -11,7 +11,7 @@ import {
11
11
  MemoryProvider,
12
12
  actionArgNormalizer,
13
13
  uniqueDeclaredKeyForSpelling
14
- } from "./chunks/chunk-3H5LZWAG.js";
14
+ } from "./chunks/chunk-6JPXLXDS.js";
15
15
  import "./chunks/chunk-2KEWFW56.js";
16
16
  import "./chunks/chunk-U5FYOMG5.js";
17
17
  import {
@@ -33,7 +33,7 @@ import {
33
33
  repairFabricGuestCode,
34
34
  resolveFabricIdentity,
35
35
  runFabricHandoffAtBoundary
36
- } from "./chunks/chunk-RTDJFHGH.js";
36
+ } from "./chunks/chunk-TR3LQHO7.js";
37
37
  import "./chunks/chunk-7VIQNUPS.js";
38
38
  import {
39
39
  AgentTranscriptReader,
@@ -94,7 +94,7 @@ import {
94
94
  resolveAgentCwd,
95
95
  resolveOmpBinary,
96
96
  validateAgentCwdRequest
97
- } from "./chunks/chunk-S4I7RMR5.js";
97
+ } from "./chunks/chunk-OW2LSF5R.js";
98
98
  import "./chunks/chunk-VPPIJRNZ.js";
99
99
  import {
100
100
  executeFile,
@@ -104,7 +104,7 @@ import {
104
104
  import "./chunks/chunk-CT2AJ2UI.js";
105
105
  import {
106
106
  checkedHandoffCompaction
107
- } from "./chunks/chunk-WPU4PKXQ.js";
107
+ } from "./chunks/chunk-LB2EC7FZ.js";
108
108
  import {
109
109
  DEFAULT_FABRIC_CONFIG,
110
110
  FUZZY_RESOLUTION_MARKERS,
@@ -123,7 +123,7 @@ import {
123
123
  import {
124
124
  isFabricThinking
125
125
  } from "./chunks/chunk-JSBTB3P6.js";
126
- import "./chunks/chunk-IY3IQPRQ.js";
126
+ import "./chunks/chunk-MBOXJKF6.js";
127
127
  import {
128
128
  MAX_FABRIC_MODEL_GUIDANCE_PER_COMPONENT,
129
129
  MAX_FABRIC_MODEL_GUIDANCE_REGISTRATIONS,
package/dist/index.js CHANGED
@@ -67,7 +67,7 @@ import {
67
67
  resolveFabricIdentity,
68
68
  settleInPlacePrewalk,
69
69
  streamedToolCallName
70
- } from "./chunks/chunk-RTDJFHGH.js";
70
+ } from "./chunks/chunk-TR3LQHO7.js";
71
71
  import "./chunks/chunk-7VIQNUPS.js";
72
72
  import {
73
73
  AgentTranscriptReader
@@ -194,7 +194,7 @@ import {
194
194
  buildLcmPrompt,
195
195
  buildPeerCards,
196
196
  emergencyReduce
197
- } from "./chunks/chunk-WPU4PKXQ.js";
197
+ } from "./chunks/chunk-LB2EC7FZ.js";
198
198
  import {
199
199
  DEFAULT_FABRIC_CONFIG,
200
200
  effectiveToolCaptureConfig,
@@ -215,7 +215,7 @@ import {
215
215
  canonicalProjectIdentity,
216
216
  defaultLedgerPath,
217
217
  hashLcmPayload
218
- } from "./chunks/chunk-IY3IQPRQ.js";
218
+ } from "./chunks/chunk-MBOXJKF6.js";
219
219
  import {
220
220
  FABRIC_EXECUTION_GUIDANCE_SLOT,
221
221
  MAX_FABRIC_MODEL_GUIDANCE_CONTENT_CHARS,
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  MemoryProvider,
3
3
  normalizeMemoryArgs
4
- } from "../chunks/chunk-3H5LZWAG.js";
4
+ } from "../chunks/chunk-6JPXLXDS.js";
5
5
  import "../chunks/chunk-2KEWFW56.js";
6
6
  import "../chunks/chunk-U5FYOMG5.js";
7
7
  import "../chunks/chunk-FX3XLQYI.js";
8
8
  import "../chunks/chunk-6QBPSZJ5.js";
9
- import "../chunks/chunk-IY3IQPRQ.js";
9
+ import "../chunks/chunk-MBOXJKF6.js";
10
10
  import "../chunks/chunk-4HQDSTHN.js";
11
11
  import "../chunks/chunk-T5ZA5YRU.js";
12
12
  import "../chunks/chunk-6N4XGAZY.js";
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runResidentHostFromConfigPath
4
- } from "../chunks/chunk-IMSGR6OW.js";
5
- import "../chunks/chunk-S4I7RMR5.js";
4
+ } from "../chunks/chunk-SZWF6C4V.js";
5
+ import "../chunks/chunk-OW2LSF5R.js";
6
6
  import "../chunks/chunk-VPPIJRNZ.js";
7
7
  import "../chunks/chunk-JZWLICMS.js";
8
8
  import "../chunks/chunk-CT2AJ2UI.js";
9
- import "../chunks/chunk-WPU4PKXQ.js";
9
+ import "../chunks/chunk-LB2EC7FZ.js";
10
10
  import "../chunks/chunk-2J2GOB4A.js";
11
11
  import "../chunks/chunk-3LI7YO4M.js";
12
12
  import "../chunks/chunk-JSBTB3P6.js";
13
- import "../chunks/chunk-IY3IQPRQ.js";
13
+ import "../chunks/chunk-MBOXJKF6.js";
14
14
  import "../chunks/chunk-77FQHHZD.js";
15
15
  import "../chunks/chunk-7363CD5A.js";
16
16
  import "../chunks/chunk-ED3BRM6P.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  runResidentHostFromConfigPath
3
- } from "../chunks/chunk-IMSGR6OW.js";
4
- import "../chunks/chunk-S4I7RMR5.js";
3
+ } from "../chunks/chunk-SZWF6C4V.js";
4
+ import "../chunks/chunk-OW2LSF5R.js";
5
5
  import "../chunks/chunk-VPPIJRNZ.js";
6
6
  import "../chunks/chunk-JZWLICMS.js";
7
7
  import "../chunks/chunk-CT2AJ2UI.js";
8
- import "../chunks/chunk-WPU4PKXQ.js";
8
+ import "../chunks/chunk-LB2EC7FZ.js";
9
9
  import "../chunks/chunk-2J2GOB4A.js";
10
10
  import "../chunks/chunk-3LI7YO4M.js";
11
11
  import "../chunks/chunk-JSBTB3P6.js";
12
- import "../chunks/chunk-IY3IQPRQ.js";
12
+ import "../chunks/chunk-MBOXJKF6.js";
13
13
  import "../chunks/chunk-77FQHHZD.js";
14
14
  import "../chunks/chunk-7363CD5A.js";
15
15
  import "../chunks/chunk-ED3BRM6P.js";
@@ -82,6 +82,7 @@ export declare class LcmLedger {
82
82
  private readonly maintenanceBytes;
83
83
  private writeChain;
84
84
  private transactionDepth;
85
+ private closed;
85
86
  constructor(options?: LedgerOptions);
86
87
  get isDegraded(): boolean;
87
88
  get operationalState(): OperationalState;
@@ -1 +1 @@
1
- {"version":3,"file":"lcm-ledger.d.ts","sourceRoot":"","sources":["../../src/storage/lcm-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,WAAW,oBAAoB;IAAG,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAChF,MAAM,WAAW,eAAe;IAAG,OAAO,EAAE,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE;AAGxI,MAAM,WAAW,aAAa;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE;AAC1K,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAClF,MAAM,WAAW,iBAAiB;IAAG,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE;AAClJ,MAAM,WAAW,cAAc;IAAG,MAAM,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACvQ,MAAM,WAAW,uBAAuB;IAAG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAA;CAAE;AAC7I,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,uBAAuB,CAAoG;AAC9L,MAAM,WAAW,YAAY;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AAChQ,MAAM,WAAW,QAAS,SAAQ,YAAY;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAEhI,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ1D;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAiG;AA6BvJ,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CASrF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,SAAsH,EAAE,UAAU,SAAY,GAAG,MAAM,CAE/L;AAED,cAAM,mBAAoB,SAAQ,KAAK;aAAgD,KAAK,CAAC,EAAE,OAAO;gBAAhD,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,OAAO,YAAA;CAA0D;AAEhK,qBAAa,SAAS;IACpB,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,gBAAgB,CAAK;gBACjB,OAAO,GAAE,aAAkB;IAyBvC,IAAI,UAAU,YAA4B;IAC1C,IAAI,gBAAgB,IAAI,gBAAgB,CAIvC;IACD,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO;IAC5B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,gBAAgB;IAClB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAClD,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,QAAQ;IA0BxC,OAAO,CAAC,UAAU,SAAmB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IACtE,WAAW,CAAC,UAAU,SAAmB,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAM,GAAG,QAAQ,EAAE;IACnG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAC5G,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,CAAC,GAAG,CAAC;IAC3C,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,CAAC,GAAG,CAAC;IAC9C,UAAU,CAAC,IAAI,GAAE,SAAS,GAAG,UAAsB,GAAG,iBAAiB;IAMvE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc;IA2B3C,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc;IACjD,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI;IAsBnF,OAAO,CAAC,aAAa;IACrB,KAAK;CACN"}
1
+ {"version":3,"file":"lcm-ledger.d.ts","sourceRoot":"","sources":["../../src/storage/lcm-ledger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omp-fabric",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "A programmable tool and agent runtime for Oh My Pi (OMP)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/storage/lcm-ledger.ts"],
4
- "sourcesContent": ["import { DatabaseSync } from \"node:sqlite\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\n\nexport interface ProjectIdentityInput { recordedCwd?: string; liveCwd?: string }\nexport interface ProjectIdentity { version: 1; key: string; canonicalPath?: string; device?: number; inode?: number; aliases: string[] }\nconst LCM_LEDGER_WARNING_BYTES = 8 * 1024 ** 3;\nconst LCM_LEDGER_MAINTENANCE_BYTES = 10 * 1024 ** 3;\nexport interface LedgerOptions { dbPath?: string; rootDir?: string; project?: ProjectIdentityInput; now?: () => number; warningBytes?: number; maintenanceBytes?: number }\nexport type OperationalState = \"healthy\" | \"warning\" | \"maintenance\" | \"degraded\";\nexport interface CheckpointMetrics { mode: \"passive\" | \"truncate\"; busy: number; logPages: number; checkpointedPages: number; truncated: boolean }\nexport interface BackupManifest { format: \"lcm-ledger-backup\"; version: 1; source: string; destination: string; sourceSha256: string; backupSha256: string; sourceStateSha256: string; rowCounts: Record<string, number>; integrity: \"ok\" | string; createdAt: number }\nexport interface DeleteConfirmationToken { readonly projectKey: string; readonly value: string; readonly __brand: \"DeleteConfirmationToken\" }\nexport function createDeleteConfirmationToken(projectKey: string): DeleteConfirmationToken { return { projectKey, value: hash(`delete:${projectKey}`), __brand: \"DeleteConfirmationToken\" }; }\nexport interface SessionEntry { projectKey: string; sessionId: string; entryId: string; revision?: number; role: string; content: string; payloadJson: string; parentEntryId?: string | null; branch?: string | null; recordedCwd?: string; createdAt?: number }\nexport interface RawEntry extends SessionEntry { revision: number; contentHash: string; payloadHash: string; createdAt: number }\n\nexport function canonicalLcmPayload(value: unknown): string {\n const normalized: unknown = JSON.parse(JSON.stringify(value));\n const encode = (item: unknown): string => {\n if (Array.isArray(item)) return `[${item.map(encode).join(\",\")}]`;\n if (item !== null && typeof item === \"object\") return `{${Object.keys(item).sort().map(key => `${JSON.stringify(key)}:${encode((item as Record<string, unknown>)[key])}`).join(\",\")}}`;\n return JSON.stringify(item);\n };\n return encode(normalized);\n}\nexport function hashLcmPayload(value: unknown): string { return crypto.createHash(\"sha256\").update(canonicalLcmPayload(value), \"utf8\").digest(\"hex\"); }\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS schema_metadata (key TEXT PRIMARY KEY, value TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS projects (project_key TEXT PRIMARY KEY, identity_json TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);\nCREATE TABLE IF NOT EXISTS project_aliases (alias TEXT PRIMARY KEY, project_key TEXT NOT NULL REFERENCES projects(project_key));\nCREATE TABLE IF NOT EXISTS sessions (project_key TEXT NOT NULL, session_id TEXT NOT NULL, created_at INTEGER NOT NULL, PRIMARY KEY(project_key, session_id));\nCREATE TABLE IF NOT EXISTS raw_entries (project_key TEXT NOT NULL, session_id TEXT NOT NULL, entry_id TEXT NOT NULL, revision INTEGER NOT NULL, role TEXT NOT NULL, content TEXT NOT NULL, content_hash TEXT NOT NULL, payload_json TEXT NOT NULL, parent_entry_id TEXT, branch TEXT, created_at INTEGER NOT NULL, PRIMARY KEY(project_key, session_id, entry_id, revision), UNIQUE(project_key, session_id, entry_id, content_hash));\nCREATE TABLE IF NOT EXISTS summary_nodes (node_id TEXT PRIMARY KEY, project_key TEXT NOT NULL, payload TEXT NOT NULL, created_at INTEGER NOT NULL);\nCREATE TABLE IF NOT EXISTS summary_edges (parent_id TEXT NOT NULL, child_id TEXT NOT NULL, PRIMARY KEY(parent_id, child_id));\nCREATE TABLE IF NOT EXISTS frontiers (project_key TEXT NOT NULL, frontier_id TEXT NOT NULL, node_id TEXT NOT NULL, created_at INTEGER NOT NULL, PRIMARY KEY(project_key, frontier_id, node_id));\nCREATE TABLE IF NOT EXISTS maintenance_jobs (job_id TEXT PRIMARY KEY, project_key TEXT NOT NULL, status TEXT NOT NULL, payload TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);\nCREATE TABLE IF NOT EXISTS maintenance_usage (project_key TEXT NOT NULL, day TEXT NOT NULL, session_id TEXT NOT NULL, calls INTEGER NOT NULL, input_tokens INTEGER NOT NULL, output_tokens INTEGER NOT NULL, cost REAL NOT NULL, wall_ms INTEGER NOT NULL, PRIMARY KEY(project_key,day,session_id));\nCREATE INDEX IF NOT EXISTS raw_entries_lookup ON raw_entries(project_key, session_id, entry_id, revision);\n`;\n\nconst hash = (s: string) => crypto.createHash(\"sha256\").update(s).digest(\"hex\");\nconst fileHash = (file: string) => crypto.createHash(\"sha256\").update(fs.readFileSync(file)).digest(\"hex\");\nconst snapshotHash = (db: DatabaseSync): string => {\n const digest = crypto.createHash(\"sha256\");\n for (const [table, order] of [[\"schema_metadata\", \"key\"], [\"projects\", \"project_key\"], [\"project_aliases\", \"alias\"], [\"sessions\", \"project_key,session_id\"], [\"raw_entries\", \"project_key,session_id,entry_id,revision\"], [\"summary_nodes\", \"node_id\"], [\"summary_edges\", \"parent_id,child_id\"], [\"frontiers\", \"project_key,frontier_id,node_id\"], [\"maintenance_jobs\", \"job_id\"], [\"maintenance_usage\", \"project_key,day,session_id\"]] as const) {\n digest.update(`${table}\\0`);\n for (const row of db.prepare(`SELECT * FROM ${table} ORDER BY ${order}`).all()) digest.update(`${JSON.stringify(row)}\\0`);\n }\n return digest.digest(\"hex\");\n};\nconst normalize = (p: string) => path.normalize(path.resolve(p));\nconst statIdentity = (p: string) => { try { const s = fs.statSync(p); return { device: Number(s.dev), inode: Number(s.ino) }; } catch { return {}; } };\n\nexport function canonicalProjectIdentity(input: ProjectIdentityInput): ProjectIdentity {\n const source = input.recordedCwd?.trim() || input.liveCwd?.trim();\n if (!source) throw new Error(\"project cwd is required\");\n const normalized = normalize(source);\n let canonicalPath = normalized;\n try { canonicalPath = fs.realpathSync.native(normalized); } catch {}\n const ids = statIdentity(canonicalPath);\n const key = ids.device !== undefined && ids.inode !== undefined ? `v1:devino:${ids.device}:${ids.inode}` : `v1:path:${canonicalPath}`;\n return { version: 1, key, canonicalPath, ...ids, aliases: [normalized, canonicalPath] };\n}\n\nexport function defaultLedgerPath(rootDir = path.join(process.env.XDG_STATE_HOME || path.join(process.env.HOME || \".\", \".local\", \"state\"), \"omp-fabric\", \"lcm\"), projectKey = \"default\"): string {\n return path.join(rootDir, `${hash(projectKey).slice(0, 24)}.sqlite`);\n}\n\nclass LedgerDegradedError extends Error { constructor(message: string, public readonly cause?: unknown) { super(message); this.name = \"LedgerDegradedError\"; } }\n\nexport class LcmLedger {\n readonly db: DatabaseSync;\n readonly project: ProjectIdentity;\n private degraded = false;\n private readonly dbPath: string;\n private readonly now: () => number;\n private readonly warningBytes: number;\n private readonly maintenanceBytes: number;\n private writeChain: Promise<void> = Promise.resolve();\n private transactionDepth = 0;\n constructor(options: LedgerOptions = {}) {\n this.now = options.now ?? Date.now;\n this.warningBytes = options.warningBytes ?? LCM_LEDGER_WARNING_BYTES;\n this.maintenanceBytes = options.maintenanceBytes ?? LCM_LEDGER_MAINTENANCE_BYTES;\n if (!Number.isSafeInteger(this.warningBytes) || !Number.isSafeInteger(this.maintenanceBytes) || this.warningBytes < 0 || this.maintenanceBytes < this.warningBytes) {\n throw new Error(\"invalid ledger size thresholds\");\n }\n this.project = canonicalProjectIdentity(options.project ?? { liveCwd: process.cwd() });\n const dbPath = options.dbPath ?? defaultLedgerPath(options.rootDir, this.project.key);\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n this.dbPath = dbPath;\n this.db = new DatabaseSync(dbPath);\n try {\n this.db.exec(\"PRAGMA journal_mode=WAL; PRAGMA synchronous=FULL; PRAGMA busy_timeout=5000; PRAGMA wal_autocheckpoint=1000;\");\n this.db.exec(\"BEGIN IMMEDIATE;\" + SCHEMA + \"INSERT INTO schema_metadata(key,value) VALUES ('version','1') ON CONFLICT(key) DO UPDATE SET value='1'; COMMIT;\");\n const columns = this.db.prepare(\"PRAGMA table_info(raw_entries)\").all() as Array<{ name: string }>;\n if (!columns.some(column => column.name === \"payload_json\")) {\n if (Number((this.db.prepare(\"SELECT count(*) n FROM raw_entries\").get() as { n: number }).n)) throw new Error(\"raw payloads missing; reimport authoritative session entries\");\n this.db.exec(\"ALTER TABLE raw_entries ADD COLUMN payload_json TEXT NOT NULL DEFAULT ''\");\n }\n const result = this.db.prepare(\"PRAGMA integrity_check\").get() as { integrity_check?: string };\n if (result.integrity_check !== \"ok\") throw new Error(String(result.integrity_check));\n this.registerProject(this.project);\n } catch (error) { this.degraded = true; throw new LedgerDegradedError(\"ledger startup failed\", error); }\n }\n get isDegraded() { return this.degraded; }\n get operationalState(): OperationalState {\n if (this.degraded) return \"degraded\";\n try { const size = fs.statSync(this.dbPath).size; if (size >= this.maintenanceBytes) return \"maintenance\"; if (size >= this.warningBytes) return \"warning\"; } catch {}\n return \"healthy\";\n }\n markDegraded(error?: unknown) { this.degraded = true; return new LedgerDegradedError(\"ledger is degraded\", error); }\n private registerProject(identity: ProjectIdentity) {\n const now = this.now();\n this.db.prepare(\"INSERT INTO projects(project_key,identity_json,created_at,updated_at) VALUES(?,?,?,?) ON CONFLICT(project_key) DO UPDATE SET identity_json=excluded.identity_json,updated_at=excluded.updated_at\").run(identity.key, JSON.stringify(identity), now, now);\n for (const alias of identity.aliases) {\n const existing = this.db.prepare(\"SELECT project_key FROM project_aliases WHERE alias=?\").get(alias) as { project_key?: string } | undefined;\n if (existing && existing.project_key !== identity.key) throw new LedgerDegradedError(`ambiguous project alias: ${alias}`);\n this.db.prepare(\"INSERT OR IGNORE INTO project_aliases(alias,project_key) VALUES(?,?)\").run(alias, identity.key);\n }\n }\n private guard() { if (this.degraded) throw new LedgerDegradedError(\"ledger is degraded\"); }\n private assertProjectKey(projectKey: string) { if (projectKey !== this.project.key) throw new Error(\"project key does not match ledger project\"); }\n async serialize<T>(operation: () => T): Promise<T> { const previous = this.writeChain; let release!: () => void; this.writeChain = new Promise<void>(resolve => { release = resolve }); await previous; try { this.guard(); return operation(); } finally { release(); } }\n appendRaw(entry: SessionEntry): RawEntry {\n this.guard();\n if (entry.projectKey !== this.project.key) throw new Error(\"entry project does not match ledger project\");\n if (entry.entryId.trim().length === 0) throw new Error(\"entry ID is required\");\n if (typeof entry.payloadJson !== \"string\" || !entry.payloadJson.trim()) throw new Error(\"full payload JSON is required\");\n let payload: Record<string, unknown>;\n try { payload = JSON.parse(entry.payloadJson) as Record<string, unknown>; } catch { throw new Error(\"invalid payload JSON\"); }\n if (!payload || typeof payload !== \"object\" || typeof payload.type !== \"string\" || typeof payload.id !== \"string\" || payload.id !== entry.entryId) throw new Error(\"payload must be a full SessionEntry\");\n const payloadJson = canonicalLcmPayload(payload);\n const contentHash = hashLcmPayload(payload);\n const ownsTransaction = this.transactionDepth === 0;\n if (ownsTransaction) this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n const existing = this.db.prepare(\"SELECT revision,created_at FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND content_hash=?\").get(entry.projectKey, entry.sessionId, entry.entryId, contentHash) as { revision: number; created_at: number } | undefined;\n if (existing) { if (ownsTransaction) this.db.exec(\"COMMIT\"); return { ...entry, payloadJson, payloadHash: contentHash, revision: existing.revision, contentHash, createdAt: existing.created_at }; }\n const latest = this.db.prepare(\"SELECT COALESCE(MAX(revision),0) revision FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=?\").get(entry.projectKey, entry.sessionId, entry.entryId) as { revision: number };\n const revision = latest.revision + 1; const createdAt = entry.createdAt ?? this.now();\n this.db.prepare(\"INSERT OR IGNORE INTO sessions(project_key,session_id,created_at) VALUES(?,?,?)\").run(entry.projectKey, entry.sessionId, createdAt);\n this.db.prepare(\"INSERT INTO raw_entries(project_key,session_id,entry_id,revision,role,content,content_hash,payload_json,parent_entry_id,branch,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?)\").run(entry.projectKey,entry.sessionId,entry.entryId,revision,entry.role,entry.content,contentHash,payloadJson,entry.parentEntryId ?? null,entry.branch ?? null,createdAt);\n if (ownsTransaction) this.db.exec(\"COMMIT\");\n return { ...entry, payloadJson, payloadHash: contentHash, revision, contentHash, createdAt };\n } catch (error) {\n if (ownsTransaction) this.db.exec(\"ROLLBACK\");\n const code = (error as NodeJS.ErrnoException).code; if (code === \"ENOSPC\" || code === \"SQLITE_FULL\" || String(error).includes(\"database or disk is full\")) this.degraded = true; throw new LedgerDegradedError(\"ledger write failed\", error);\n }\n }\n readRaw(projectKey = this.project.key, sessionId?: string): RawEntry[] { this.guard(); this.assertProjectKey(projectKey); const rows = sessionId ? this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? AND session_id=? ORDER BY created_at,revision\").all(projectKey,sessionId) : this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? ORDER BY created_at,session_id,entry_id,revision\").all(projectKey); return (rows as Array<Record<string, unknown>>).map(row => ({ projectKey: row.project_key as string, sessionId: row.session_id as string, entryId: row.entry_id as string, revision: row.revision as number, role: row.role as string, content: row.content as string, contentHash: row.content_hash as string, payloadHash: row.content_hash as string, payloadJson: row.payload_json as string, parentEntryId: row.parent_entry_id as string | null, branch: row.branch as string | null, createdAt: row.created_at as number })); }\n readRawPage(projectKey = this.project.key, sessionId?: string, offset = 0, limit = 100): RawEntry[] { if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(limit) || limit < 1) throw new Error(\"invalid raw page\"); this.guard(); this.assertProjectKey(projectKey); const rows = sessionId ? this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? AND session_id=? ORDER BY created_at,revision LIMIT ? OFFSET ?\").all(projectKey,sessionId,limit,offset) : this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? ORDER BY created_at,session_id,entry_id,revision LIMIT ? OFFSET ?\").all(projectKey,limit,offset); return (rows as Array<Record<string, unknown>>).map(row => ({ projectKey: row.project_key as string, sessionId: row.session_id as string, entryId: row.entry_id as string, revision: row.revision as number, role: row.role as string, content: row.content as string, contentHash: row.content_hash as string, payloadHash: row.content_hash as string, payloadJson: row.payload_json as string, parentEntryId: row.parent_entry_id as string | null, branch: row.branch as string | null, createdAt: row.created_at as number })); }\n readRawEntry(projectKey: string, sessionId: string, entryId: string, revision: number): RawEntry | undefined { this.guard(); this.assertProjectKey(projectKey); const row = this.db.prepare(\"SELECT * FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(projectKey,sessionId,entryId,revision) as Record<string, unknown> | undefined; return row ? { projectKey: row.project_key as string, sessionId: row.session_id as string, entryId: row.entry_id as string, revision: row.revision as number, role: row.role as string, content: row.content as string, contentHash: row.content_hash as string, payloadHash: row.content_hash as string, payloadJson: row.payload_json as string, parentEntryId: row.parent_entry_id as string | null, branch: row.branch as string | null, createdAt: row.created_at as number } : undefined; }\n readOnly<T>(fn: (db: DatabaseSync) => T): T { this.guard(); return fn(this.db); }\n transaction<T>(fn: (db: DatabaseSync) => T): T { this.guard(); if (this.transactionDepth > 0) return fn(this.db); this.db.exec(\"BEGIN IMMEDIATE\"); this.transactionDepth = 1; try { const result = fn(this.db); this.db.exec(\"COMMIT\"); return result; } catch (error) { this.db.exec(\"ROLLBACK\"); throw error; } finally { this.transactionDepth = 0; } }\n checkpoint(mode: \"passive\" | \"truncate\" = \"passive\"): CheckpointMetrics {\n const row = this.db.prepare(`PRAGMA wal_checkpoint(${mode.toUpperCase()})`).get() as { busy?: number; log?: number; checkpointed?: number };\n const busy = row.busy ?? 0;\n const logPages = row.log ?? 0;\n return { mode, busy, logPages, checkpointedPages: row.checkpointed ?? 0, truncated: mode === \"truncate\" && busy === 0 && logPages === 0 };\n }\n backup(destination: string): BackupManifest {\n this.guard();\n return this.serializeSync(() => {\n const target = path.resolve(destination);\n fs.mkdirSync(path.dirname(target), { recursive: true });\n if (fs.existsSync(target)) throw new Error(\"backup destination exists\");\n this.db.exec(`VACUUM INTO '${target.replace(/'/g, \"''\")}'`);\n fs.chmodSync(target, 0o600);\n const copy = new DatabaseSync(target);\n let integrity = \"unknown\";\n let backupStateSha256 = \"\";\n const rowCounts: Record<string, number> = {};\n try {\n integrity = (copy.prepare(\"PRAGMA integrity_check\").get() as { integrity_check?: string }).integrity_check ?? \"unknown\";\n for (const table of [\"projects\", \"sessions\", \"raw_entries\", \"summary_nodes\", \"summary_edges\", \"frontiers\", \"maintenance_jobs\", \"maintenance_usage\"]) {\n rowCounts[table] = Number((copy.prepare(`SELECT count(*) n FROM ${table}`).get() as { n: number }).n);\n }\n backupStateSha256 = snapshotHash(copy);\n } finally {\n copy.close();\n }\n const manifest: BackupManifest = { format: \"lcm-ledger-backup\", version: 1, source: this.dbPath, destination: target, sourceSha256: fileHash(this.dbPath), backupSha256: fileHash(target), sourceStateSha256: backupStateSha256, rowCounts, integrity, createdAt: this.now() };\n fs.writeFileSync(`${target}.manifest.json`, JSON.stringify(manifest), { mode: 0o600 });\n fs.chmodSync(`${target}.manifest.json`, 0o600);\n return manifest;\n });\n }\n exportBackup(destination: string): BackupManifest { return this.backup(destination); }\n deleteProject(token: DeleteConfirmationToken, backupManifest: BackupManifest): void {\n this.guard();\n if (token.__brand !== \"DeleteConfirmationToken\" || token.projectKey !== this.project.key || token.value !== hash(`delete:${this.project.key}`)) throw new Error(\"invalid delete confirmation token\");\n const backupDb = fs.existsSync(backupManifest.destination) ? new DatabaseSync(backupManifest.destination) : undefined;\n let backupStateSha256: string | undefined;\n try {\n if (backupDb) backupStateSha256 = snapshotHash(backupDb);\n } finally {\n backupDb?.close();\n }\n if (backupManifest.integrity !== \"ok\" || backupManifest.source !== this.dbPath || !backupManifest.backupSha256 || backupManifest.backupSha256 !== fileHash(backupManifest.destination) || !backupManifest.sourceStateSha256 || backupManifest.sourceStateSha256 !== backupStateSha256 || backupManifest.sourceSha256 !== fileHash(this.dbPath) || backupManifest.sourceStateSha256 !== snapshotHash(this.db)) throw new Error(\"backup verification failed\");\n this.transaction(db => {\n db.prepare(\"DELETE FROM summary_edges WHERE parent_id IN (SELECT node_id FROM summary_nodes WHERE project_key=?) OR child_id IN (SELECT node_id FROM summary_nodes WHERE project_key=?)\").run(this.project.key, this.project.key);\n for (const table of [\"raw_entries\", \"sessions\", \"frontiers\", \"summary_nodes\", \"maintenance_jobs\", \"maintenance_usage\"]) db.prepare(`DELETE FROM ${table} WHERE project_key=?`).run(this.project.key);\n db.prepare(\"DELETE FROM project_aliases WHERE project_key=?\").run(this.project.key);\n db.prepare(\"DELETE FROM projects WHERE project_key=?\").run(this.project.key);\n });\n const integrity = (this.db.prepare(\"PRAGMA integrity_check\").get() as { integrity_check?: string }).integrity_check;\n if (integrity !== \"ok\") throw new Error(`post-delete integrity failed: ${integrity}`);\n const audit = { format: \"lcm-ledger-delete\", version: 1, projectKey: this.project.key, deletedAt: this.now(), integrity, remaining: Number((this.db.prepare(\"SELECT count(*) n FROM projects WHERE project_key=?\").get(this.project.key) as { n: number }).n) };\n fs.writeFileSync(`${backupManifest.destination}.delete-manifest.json`, JSON.stringify(audit), { mode: 0o600 });\n }\n private serializeSync<T>(operation: () => T): T { this.guard(); return operation(); }\n close() { this.db.close(); }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }