omp-fabric 1.8.1 → 1.8.2
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 +7 -0
- package/dist/compaction/lcm-maintenance.d.ts +2 -1
- package/dist/compaction/lcm-maintenance.d.ts.map +1 -1
- package/dist/compaction/lcm-runtime.d.ts.map +1 -1
- package/dist/compaction/lcm-runtime.js +26 -2
- package/dist/compaction/lcm-runtime.js.map +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.8.2
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Upgrading a deterministic node left the text readers actually see unchanged. Context assembly serves the frontier, and a leaf folded into a condensed parent is no longer on it, so replacing that leaf's excerpt with a model summary improved nothing while spending a model call; the parent kept prose written from the excerpt and, carrying a real model hash, was never reconsidered. An upgrade now reopens the ready ancestors of the node it improved, so the summary that reaches the model is rebuilt from the upgraded child.
|
|
8
|
+
- The Test workflow keyed its concurrency group by branch, so a second commit cancelled the run still verifying the first. The release gate reads the run for the tagged commit and would have refused a cancelled one, which this repository's push-then-tag rhythm makes likely. The group is keyed by commit.
|
|
9
|
+
|
|
3
10
|
## 1.8.1
|
|
4
11
|
|
|
5
12
|
### Changed
|
|
@@ -75,7 +75,8 @@ export declare class LcmMaintenance {
|
|
|
75
75
|
constructor(ledger: LcmLedger, options?: LcmMaintenanceOptions);
|
|
76
76
|
budgetPolicy(): LcmBudgetPolicy;
|
|
77
77
|
selectUpgrades(sessionId?: string, activeSources?: ReadonlySet<string>, branch?: string | null, limit?: number): LcmNode[];
|
|
78
|
-
|
|
78
|
+
ancestorsOf(nodeId: string): string[];
|
|
79
|
+
reopen(nodeId: string, force?: boolean): LcmJob;
|
|
79
80
|
listNodes(limit?: number): LcmNode[];
|
|
80
81
|
getNode(nodeId: string): LcmNode | undefined;
|
|
81
82
|
getFrontier(sessionId?: string, branch?: string | null, activeSources?: ReadonlySet<string>): LcmNode[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lcm-maintenance.d.ts","sourceRoot":"","sources":["../../src/compaction/lcm-maintenance.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"lcm-maintenance.d.ts","sourceRoot":"","sources":["../../src/compaction/lcm-maintenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lcm-runtime.d.ts","sourceRoot":"","sources":["../../src/compaction/lcm-runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"lcm-runtime.d.ts","sourceRoot":"","sources":["../../src/compaction/lcm-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -610,13 +610,31 @@ var LcmMaintenance = class {
|
|
|
610
610
|
selectUpgrades(sessionId, activeSources, branch, limit = 1) {
|
|
611
611
|
return this.listNodes(1e5).filter((node) => node.state === "ready" && node.modelHash === "emergency" && node.policyHash === this.policyHash && (!sessionId || node.sessionId === sessionId) && (branch === void 0 || node.branch === branch || node.branch === null) && (!activeSources || node.sources.every((source) => activeSources.has(this.sourceKey(source))))).sort((left, right) => left.depth - right.depth || left.nodeId.localeCompare(right.nodeId)).slice(0, limit);
|
|
612
612
|
}
|
|
613
|
-
|
|
613
|
+
ancestorsOf(nodeId) {
|
|
614
|
+
return this.ledger.readOnly((db) => {
|
|
615
|
+
const seen = /* @__PURE__ */ new Set();
|
|
616
|
+
const stack = [nodeId];
|
|
617
|
+
const order = [];
|
|
618
|
+
while (stack.length > 0) {
|
|
619
|
+
const current = stack.pop();
|
|
620
|
+
const parents = db.prepare("SELECT e.parent_id FROM summary_edges e JOIN summary_nodes parent ON parent.node_id=e.parent_id WHERE e.child_id=? AND parent.project_key=?").all(current, this.projectKey);
|
|
621
|
+
for (const { parent_id: parent } of parents) {
|
|
622
|
+
if (seen.has(parent)) continue;
|
|
623
|
+
seen.add(parent);
|
|
624
|
+
order.push(parent);
|
|
625
|
+
stack.push(parent);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
return order;
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
reopen(nodeId, force = false) {
|
|
614
632
|
return this.ledger.transaction((db) => {
|
|
615
633
|
const row = db.prepare("SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?").get(nodeId, this.projectKey);
|
|
616
634
|
if (!row?.payload) throw new Error("node not found");
|
|
617
635
|
const node = parse(row.payload);
|
|
618
636
|
if (node.projectKey !== this.projectKey) throw new Error("node project does not match ledger project");
|
|
619
|
-
if (node.modelHash !== "emergency") throw new Error("node already carries a model summary");
|
|
637
|
+
if (!force && node.modelHash !== "emergency") throw new Error("node already carries a model summary");
|
|
620
638
|
const t = this.now();
|
|
621
639
|
const job = { ...this.job(node), jobId: `job:upgrade:${token()}:${node.nodeId}`, createdAt: t, updatedAt: t };
|
|
622
640
|
db.prepare("INSERT INTO maintenance_jobs(job_id,project_key,status,payload,created_at,updated_at) VALUES(?,?,?,?,?,?)").run(job.jobId, this.projectKey, job.state, JSON.stringify(job), job.createdAt, job.updatedAt);
|
|
@@ -1122,6 +1140,12 @@ var LcmRuntime = class {
|
|
|
1122
1140
|
if (!upgrade) break;
|
|
1123
1141
|
const job = this.maintenance.reopen(upgrade.nodeId);
|
|
1124
1142
|
await runJob(job, upgrade);
|
|
1143
|
+
if (this.maintenance.getNode(upgrade.nodeId)?.modelHash !== "emergency") {
|
|
1144
|
+
for (const ancestor of this.maintenance.ancestorsOf(upgrade.nodeId)) {
|
|
1145
|
+
const node = this.maintenance.getNode(ancestor);
|
|
1146
|
+
if (node?.state === "ready") this.maintenance.reopen(ancestor, true);
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1125
1149
|
continue;
|
|
1126
1150
|
}
|
|
1127
1151
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/storage/lcm-ledger.ts", "../../src/storage/lcm-migration.ts", "../../src/compaction/lcm-maintenance.ts", "../../src/compaction/lcm-runtime.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport { sqliteDriver, type SqliteDatabase } from \"./sqlite.js\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, createDeleteConfirmationToken, defaultLedgerPath, hash, hashLcmPayload, type DeleteConfirmationToken, type ProjectIdentity, type ProjectIdentityInput, type RawEntry, type SessionEntry } from \"./lcm-identity.js\";\n\nexport { canonicalLcmPayload, canonicalProjectIdentity, createDeleteConfirmationToken, defaultLedgerPath, hashLcmPayload };\nexport type { DeleteConfirmationToken, ProjectIdentity, RawEntry, SessionEntry };\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 }\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 fileHash = (file: string) => crypto.createHash(\"sha256\").update(fs.readFileSync(file)).digest(\"hex\");\nconst snapshotHash = (db: SqliteDatabase): 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};\n\nclass LedgerDegradedError extends Error { constructor(message: string, public readonly cause?: unknown) { super(message); this.name = \"LedgerDegradedError\"; } }\n\nexport class LcmLedger {\n readonly db: SqliteDatabase;\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 (sqliteDriver())(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: SqliteDatabase) => T): T { this.guard(); return fn(this.db); }\n transaction<T>(fn: (db: SqliteDatabase) => 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 (sqliteDriver())(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 (sqliteDriver())(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", "import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { sqliteDriver, type SqliteDatabase } from \"./sqlite.js\";\nimport { sessionsDirRoot, sessionDirNamesForCwd } from \"../memory/discovery.js\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, defaultLedgerPath, hashLcmPayload, LcmLedger } from \"./lcm-ledger.js\";\n\nexport interface MigrationOptions {\n agentDir: string;\n ledgerRoot?: string;\n ledger?: LcmLedger;\n files?: string[];\n candidateDirs?: string[];\n projectCwd?: string;\n liveCwd?: string;\n since?: string;\n until?: string;\n onDemand?: boolean;\n now?: number;\n apply?: boolean;\n allowIncompleteDiscovery?: boolean;\n maxFiles?: number;\n maxDiscoveryEntries?: number;\n maxFileBytes?: number;\n maxLineBytes?: number;\n maxTotalBytes?: number;\n onProgress?: (progress: MigrationProgress) => void;\n}\ninterface MigrationProgress {\n projectKey: string;\n sessionPath: string;\n sourceHash: string;\n lineOrdinal: number;\n entryId: string;\n contentHash: string;\n}\ninterface MigrationCounts {\n eligible: number;\n imported: number;\n skippedDuplicate: number;\n skippedOutOfWindow: number;\n malformed: number;\n oversized: number;\n incompleteDiscovery: number;\n errors: number;\n}\nexport interface MigrationResult {\n mode: \"apply\" | \"dry-run\";\n since: string;\n until: string;\n counts: MigrationCounts;\n filesScanned: number;\n bytesScanned: number;\n generations: Array<{ sessionPath: string; sourceHash: string }>;\n exitCode: number;\n}\nconst hash = (data: string | Buffer): string => crypto.createHash(\"sha256\").update(data).digest(\"hex\");\nconst record = (value: unknown): Record<string, unknown> | undefined =>\n value !== null && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\nconst nonblank = (value: unknown): value is string => typeof value === \"string\" && value.trim().length > 0;\nconst utc = (value: string): number => {\n if (!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|\\+00:00)$/.test(value)) throw new Error(\"timestamps must be explicit UTC ISO-8601 values\");\n const at = Date.parse(value);\n const normalized = value.replace(\"+00:00\", \"Z\").replace(/Z$/, \"\");\n if (!Number.isFinite(at) || new Date(at).toISOString().slice(0, 19) !== normalized.slice(0, 19)) throw new Error(\"invalid UTC timestamp\");\n return at;\n};\nexport function migrationWindow(options: Pick<MigrationOptions, \"since\" | \"until\" | \"now\">): { since: number; until: number } {\n const now = options.now ?? Date.now();\n const since = options.since === undefined ? now - 72 * 60 * 60 * 1000 : utc(options.since);\n const until = options.until === undefined ? now : utc(options.until);\n if (!Number.isFinite(since) || !Number.isFinite(until) || since > until) throw new Error(\"invalid migration window\");\n return { since, until };\n}\nconst positive = (value: number | undefined, fallback: number): number => {\n const result = value ?? fallback;\n if (!Number.isSafeInteger(result) || result < 1) throw new Error(\"scan limits must be positive safe integers\");\n return result;\n};\nexport function discoverMigrationSessions(options: MigrationOptions): { files: string[]; incomplete: number } {\n const maxFiles = positive(options.maxFiles, 10_000);\n const maxEntries = positive(options.maxDiscoveryEntries, 100_000);\n const files = new Set<string>();\n let incomplete = 0;\n let entries = 0;\n const add = (file: string): void => {\n if (files.size >= maxFiles && !files.has(path.resolve(file))) { incomplete++; return; }\n files.add(path.resolve(file));\n };\n if (options.files) {\n for (const file of options.files.slice(0, maxFiles)) add(file);\n if (options.files.length > maxFiles) incomplete++;\n return { files: [...files].sort(), incomplete };\n }\n const list = (dir: string, visit: (entry: fs.Dirent) => void): void => {\n let handle: fs.Dir | undefined;\n try {\n handle = fs.opendirSync(dir);\n let entry: fs.Dirent | null;\n while ((entry = handle.readSync()) !== null) {\n if (++entries > maxEntries) { incomplete++; break; }\n visit(entry);\n }\n } catch { incomplete++; } finally { handle?.closeSync(); }\n };\n const scan = (dir: string): void => list(dir, entry => {\n if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(dir, entry.name));\n else if (entry.isSymbolicLink() && entry.name.endsWith(\".jsonl\")) incomplete++;\n });\n if (options.candidateDirs) {\n for (const dir of options.candidateDirs) { if (entries >= maxEntries) { incomplete++; break; } scan(dir); }\n } else if (options.projectCwd) {\n const names = sessionDirNamesForCwd(options.projectCwd);\n let found = false;\n for (const name of [names.canonical, ...names.legacy]) {\n const dir = path.join(sessionsDirRoot(options.agentDir), name);\n try { if (fs.statSync(dir).isDirectory()) { found = true; scan(dir); } }\n catch (error) { if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") incomplete++; }\n }\n if (!found) incomplete++;\n } else {\n const root = sessionsDirRoot(options.agentDir);\n list(root, entry => {\n if (entry.isDirectory()) scan(path.join(root, entry.name));\n else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(root, entry.name));\n else if (entry.isSymbolicLink()) incomplete++;\n });\n }\n return { files: [...files].sort(), incomplete };\n}\nconst CHECKPOINT_SCHEMA = \"CREATE TABLE IF NOT EXISTS migration_checkpoints (project_key TEXT NOT NULL, session_path TEXT NOT NULL, source_hash TEXT NOT NULL, line_ordinal INTEGER NOT NULL, entry_id TEXT NOT NULL, content_hash TEXT NOT NULL, PRIMARY KEY(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash))\";\nexport function reconcileSession(options: Omit<MigrationOptions, \"files\"> & { files: [string] }): MigrationResult {\n return migrateSessions({ ...options, onDemand: true });\n}\n\nexport function migrateSessions(options: MigrationOptions): MigrationResult {\n const window = migrationWindow(options);\n const maxFileBytes = positive(options.maxFileBytes, 64 * 1024 ** 2);\n const maxLineBytes = positive(options.maxLineBytes, 8 * 1024 ** 2);\n const maxTotalBytes = positive(options.maxTotalBytes, 1024 ** 3);\n const discovery = discoverMigrationSessions(options);\n const result: MigrationResult = {\n mode: options.apply ? \"apply\" : \"dry-run\", since: new Date(window.since).toISOString(), until: new Date(window.until).toISOString(),\n counts: { eligible: 0, imported: 0, skippedDuplicate: 0, skippedOutOfWindow: 0, malformed: 0, oversized: 0, incompleteDiscovery: discovery.incomplete, errors: 0 },\n filesScanned: 0, bytesScanned: 0, generations: [], exitCode: 0,\n };\n const counts = result.counts;\n const drySeen = new Set<string>();\n for (const file of discovery.files) {\n let data: Buffer;\n let fd: number | undefined;\n try {\n fd = fs.openSync(file, \"r\");\n const before = fs.fstatSync(fd);\n if (!before.isFile()) { counts.incompleteDiscovery++; continue; }\n if (before.size > maxFileBytes) { counts.oversized++; continue; }\n if (result.bytesScanned + before.size > maxTotalBytes) { counts.incompleteDiscovery++; break; }\n data = Buffer.allocUnsafe(before.size);\n let offset = 0;\n while (offset < data.length) {\n const size = fs.readSync(fd, data, offset, data.length - offset, offset);\n if (size === 0) throw new Error(\"source shortened during read\");\n offset += size;\n }\n const after = fs.fstatSync(fd);\n if (after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs) throw new Error(\"source changed during read\");\n } catch { counts.errors++; counts.incompleteDiscovery++; continue; }\n finally { if (fd !== undefined) fs.closeSync(fd); }\n result.filesScanned++;\n result.bytesScanned += data.length;\n const sourceHash = hash(data);\n result.generations.push({ sessionPath: file, sourceHash });\n let header: Record<string, unknown> | undefined;\n let ledger: LcmLedger | undefined;\n let database: SqliteDatabase | undefined;\n let sessionId = \"\";\n let projectKey = \"\";\n let cwd: string | undefined;\n let ordinal = 0;\n try {\n for (let start = 0; start < data.length;) {\n ordinal++;\n const newline = data.indexOf(10, start);\n const end = newline < 0 ? data.length : newline;\n const bytes = data.subarray(start, end);\n start = newline < 0 ? data.length : end + 1;\n if (bytes.length > maxLineBytes) { counts.oversized++; continue; }\n const content = bytes.toString(\"utf8\").replace(/\\r$/, \"\");\n if (!content.trim()) continue;\n let row: Record<string, unknown> | undefined;\n try { row = record(JSON.parse(content)); } catch { counts.malformed++; continue; }\n if (!row) { counts.malformed++; continue; }\n if (row.type === \"message_end\") continue;\n if (!header) {\n if (row.type !== \"session\") { if (record(row.message)) counts.malformed++; continue; }\n if (!nonblank(row.id)) { counts.malformed++; break; }\n header = row;\n sessionId = row.id;\n cwd = nonblank(row.cwd) ? row.cwd : options.liveCwd;\n if (!cwd) { counts.malformed++; break; }\n const projectInput = options.liveCwd ? { recordedCwd: cwd, liveCwd: options.liveCwd } : { recordedCwd: cwd };\n projectKey = canonicalProjectIdentity(projectInput).key;\n if (options.ledger && options.ledger.project.key !== projectKey) { counts.errors++; break; }\n if (options.apply) {\n if (options.ledger) ledger = options.ledger;\n else if (options.ledgerRoot) ledger = new LcmLedger({ rootDir: options.ledgerRoot, project: { recordedCwd: cwd } });\n else ledger = new LcmLedger({ project: { recordedCwd: cwd } });\n database = ledger.db;\n database.exec(CHECKPOINT_SCHEMA);\n } else if (options.ledger) database = options.ledger.db;\n else {\n const dbPath = defaultLedgerPath(options.ledgerRoot, projectKey);\n if (fs.existsSync(dbPath)) database = new (sqliteDriver())(dbPath, { readOnly: true });\n }\n continue;\n }\n if (row.type === \"session\" || !nonblank(row.type) || !nonblank(row.id) || (row.parentId !== null && row.parentId !== undefined && typeof row.parentId !== \"string\")) { counts.malformed++; continue; }\n const message = record(row.message);\n if (row.type === \"message\" && (!message || !nonblank(message.role))) { counts.malformed++; continue; }\n let at: number;\n try { at = typeof row.timestamp === \"string\" ? utc(row.timestamp) : NaN; } catch { at = NaN; }\n if (!Number.isFinite(at)) { counts.malformed++; continue; }\n if (!options.onDemand && (at < window.since || at > window.until)) { counts.skippedOutOfWindow++; continue; }\n counts.eligible++;\n const payloadJson = canonicalLcmPayload(row);\n const contentHash = hashLcmPayload(row);\n const identity = JSON.stringify([projectKey, sessionId, row.id, contentHash]);\n const progress: MigrationProgress = { projectKey, sessionPath: file, sourceHash, lineOrdinal: ordinal, entryId: row.id, contentHash };\n const duplicate = drySeen.has(identity) || database?.prepare(\"SELECT 1 FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND content_hash=?\").get(projectKey, sessionId, row.id, contentHash) !== undefined;\n if (duplicate) counts.skippedDuplicate++;\n else if (ledger) {\n ledger.appendRaw({\n projectKey, sessionId, entryId: row.id, role: message && typeof message.role === \"string\" ? message.role : row.type,\n content, payloadJson, parentEntryId: typeof row.parentId === \"string\" ? row.parentId : null,\n branch: typeof row.branch === \"string\" ? row.branch : typeof row.branchId === \"string\" ? row.branchId : null,\n ...(cwd ? { recordedCwd: cwd } : {}), createdAt: at\n });\n counts.imported++;\n }\n else if (!duplicate) counts.imported++;\n drySeen.add(identity);\n if (ledger) database!.prepare(\"INSERT OR IGNORE INTO migration_checkpoints(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash) VALUES(?,?,?,?,?,?)\")\n .run(projectKey, file, sourceHash, ordinal, row.id, contentHash);\n options.onProgress?.(progress);\n }\n if (!header) counts.malformed++;\n } catch (error) {\n counts.errors++;\n if (options.onProgress) throw error;\n } finally {\n if (ledger && ledger !== options.ledger) ledger.close();\n else if (!ledger && database && database !== options.ledger?.db) database.close();\n }\n }\n result.exitCode = counts.errors || counts.malformed || counts.oversized || (counts.incompleteDiscovery && !options.allowIncompleteDiscovery) ? 1 : 0;\n return result;\n}\n", "import crypto from \"node:crypto\";\nimport { hashLcmPayload, type RawEntry } from \"../storage/lcm-identity.js\";\nimport type { LcmLedger } from \"../storage/lcm-ledger.js\";\nimport { buildLcmPrompt, emergencyReduce, type LcmModelResult, type LcmSummarizer } from \"./lcm-model.js\";\n\ntype LcmNodeState = \"pending\" | \"ready\" | \"running\" | \"failed\";\ntype LcmJobState = \"pending\" | \"running\" | \"completed\" | \"failed\";\nexport interface LcmSourceRef { sessionId: string; entryId: string; revision: number; payloadHash: string; }\ntype RawSourceRef = LcmSourceRef;\nexport interface LcmNode { nodeId: string; projectKey: string; sessionId: string; branch: string | null; kind: \"leaf\" | \"condensed\"; sources: LcmSourceRef[]; children: string[]; depth: number; sourceHash: string; policyHash: string; modelHash: string; state: LcmNodeState; text?: string; createdAt: number; }\nexport interface LcmJob { jobId: string; projectKey: string; nodeId: string; priority: number; eligibleAt: number; state: LcmJobState; ownerId?: string; leaseToken?: string; leaseUntil?: number; attempts: number; nextRetryAt: number; error?: string; createdAt: number; updatedAt: number; }\nexport interface LcmBudget { calls: number; inputTokens: number; outputTokens: number; cost: number; wallMs: number; }\nexport interface LcmBudgetPolicy extends LcmBudget { sessionCalls: number; }\nconst DEFAULT_LCM_BUDGET: LcmBudgetPolicy = { calls: Number.POSITIVE_INFINITY, inputTokens: Number.POSITIVE_INFINITY, outputTokens: Number.POSITIVE_INFINITY, cost: Number.POSITIVE_INFINITY, wallMs: Number.POSITIVE_INFINITY, sessionCalls: Number.POSITIVE_INFINITY };\nexport interface LcmMaintenanceOptions { now?: () => number; ownerId?: string; policyHash?: string; maxLeafEntries?: number; maxCondenseChildren?: number; maxInputChars?: number; maxOutputChars?: number; budget?: Partial<LcmBudgetPolicy>; }\nconst hash = (v: unknown) => hashLcmPayload(v);\nconst parse = <T>(v: unknown): T => JSON.parse(String(v));\nconst rawHash = (e: RawEntry) => e.payloadHash;\nconst token = () => crypto.randomUUID();\n\nexport class LcmMaintenance {\n readonly projectKey: string;\n private readonly now: () => number;\n private readonly ownerId: string;\n private readonly policyHash: string;\n private readonly maxLeaf: number;\n private readonly maxChildren: number;\n private readonly maxInputChars: number;\n private readonly maxOutputChars: number;\n private readonly budget: LcmBudgetPolicy;\n constructor(private readonly ledger: LcmLedger, options: LcmMaintenanceOptions = {}) { this.projectKey = ledger.project.key; this.now = options.now ?? Date.now; this.ownerId = options.ownerId ?? crypto.randomUUID(); this.policyHash = options.policyHash ?? hash(\"lcm-policy-v1\"); this.maxLeaf = options.maxLeafEntries ?? 32; this.maxChildren = options.maxCondenseChildren ?? 4; this.maxInputChars = options.maxInputChars ?? 200_000; this.maxOutputChars = options.maxOutputChars ?? 4_096; this.budget = { ...DEFAULT_LCM_BUDGET, ...options.budget }; }\n budgetPolicy(): LcmBudgetPolicy { return { ...this.budget }; }\n selectUpgrades(sessionId?: string, activeSources?: ReadonlySet<string>, branch?: string | null, limit = 1): LcmNode[] {\n return this.listNodes(100000)\n .filter(node => node.state === \"ready\" && node.modelHash === \"emergency\" && node.policyHash === this.policyHash\n && (!sessionId || node.sessionId === sessionId)\n && (branch === undefined || node.branch === branch || node.branch === null)\n && (!activeSources || node.sources.every(source => activeSources.has(this.sourceKey(source)))))\n .sort((left, right) => left.depth - right.depth || left.nodeId.localeCompare(right.nodeId))\n .slice(0, limit);\n }\n reopen(nodeId: string): LcmJob {\n return this.ledger.transaction(db => {\n const row = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(nodeId, this.projectKey) as { payload?: string } | undefined;\n if (!row?.payload) throw new Error(\"node not found\");\n const node = parse<LcmNode>(row.payload);\n if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\");\n if (node.modelHash !== \"emergency\") throw new Error(\"node already carries a model summary\");\n const t = this.now();\n const job: LcmJob = { ...this.job(node), jobId: `job:upgrade:${token()}:${node.nodeId}`, createdAt: t, updatedAt: t };\n db.prepare(\"INSERT INTO maintenance_jobs(job_id,project_key,status,payload,created_at,updated_at) VALUES(?,?,?,?,?,?)\")\n .run(job.jobId, this.projectKey, job.state, JSON.stringify(job), job.createdAt, job.updatedAt);\n return job;\n });\n }\n listNodes(limit = 100): LcmNode[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM summary_nodes WHERE project_key=? ORDER BY created_at,node_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const node = parse<LcmNode>(r.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; })); }\n getNode(nodeId: string): LcmNode | undefined { return this.ledger.readOnly(db => { const row = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(nodeId, this.projectKey) as {payload?:string}|undefined; if (!row?.payload) return undefined; const node = parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; }); }\n getFrontier(sessionId?: string, branch?: string | null, activeSources?: ReadonlySet<string>): LcmNode[] { const nodes=this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (branch === undefined || n.branch === branch || n.branch === null) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s))))) ; const covered=new Set(nodes.flatMap(n=>n.children)); return nodes.filter(n=>!covered.has(n.nodeId)); }\n listJobs(limit = 100): LcmJob[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? ORDER BY created_at,job_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const job = parse<LcmJob>(r.payload); if (job.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; })); }\n selectLeaf(entries = this.ledger.readRaw(this.projectKey), branch?: string | null): RawEntry[] { const first = entries[0]; if (!first) return []; const nodes = this.listNodes(100000).filter(n => n.state !== \"failed\" && n.policyHash === this.policyHash && n.sessionId === first.sessionId && (branch === undefined || n.branch === branch || n.branch === null)); const covered = new Set(nodes.flatMap(n => n.sources.map(s => this.sourceKey(s)))); const candidates = entries.filter(e => e.sessionId === first.sessionId && (branch === undefined || e.branch === branch || e.branch === null) && !covered.has(this.sourceKey(e))); const picked: RawEntry[] = []; let chars = 0; for (const entry of candidates) { if (picked.length >= this.maxLeaf) break; const size = entry.payloadJson.length; if (picked.length > 0 && chars + size > this.maxInputChars) break; picked.push(entry); chars += size; } return picked; }\n selectCondensation(sessionId?: string, activeSources?: ReadonlySet<string>, branch?: string | null): LcmNode[] { const nodes = this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s)))) && (branch === undefined || n.branch === branch || n.branch === null)); const eligible = new Set(nodes.map(n => n.nodeId)); const edges = this.ledger.readOnly(db => db.prepare(\"SELECT e.parent_id,e.child_id FROM summary_edges e JOIN summary_nodes parent ON parent.node_id=e.parent_id AND parent.project_key=? JOIN summary_nodes child ON child.node_id=e.child_id AND child.project_key=parent.project_key WHERE parent.project_key=?\").all(this.projectKey, this.projectKey) as Array<{parent_id:string;child_id:string}>); const consumed = new Set(edges.filter(e => eligible.has(e.parent_id)).map(e => e.child_id)); const candidates = nodes.filter(n => !consumed.has(n.nodeId)); const first = candidates[0]; if (!first) return []; const depth = Math.min(...candidates.map(n => n.depth)); const sameDepth = candidates.filter(n => n.depth === depth); if (depth > 0 && sameDepth.length < 2) return []; return candidates.filter(n => n.projectKey === first.projectKey && n.sessionId === first.sessionId && n.depth === depth).sort((a,b) => a.nodeId.localeCompare(b.nodeId)).slice(0, this.maxChildren); }\n createLeaf(entries = this.selectLeaf()): LcmNode | undefined { if (!entries.length) return undefined; const branches = new Set(entries.map(entry => entry.branch).filter((value): value is string => typeof value === \"string\")); if (branches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...branches][0] ?? null; const source = entries.map((e, index) => { if (e.projectKey !== this.projectKey) throw new Error(\"entry project does not match ledger project\"); const payload = parse<{type?: unknown; id?: unknown}>(e.payloadJson); if (typeof payload.type !== \"string\" || !payload.type || payload.id !== e.entryId) throw new Error(\"invalid raw payload\"); if (hash(payload) !== rawHash(e)) throw new Error(\"payload hash mismatch\"); return { sessionId:e.sessionId, entryId:e.entryId, revision:e.revision, payloadHash:rawHash(e) }; }); this.validateSources(source); const node: LcmNode = { nodeId:`leaf:${hash({ projectKey:this.projectKey, source, branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:entries[0]!.sessionId, branch, kind:\"leaf\", sources:source, children:[], depth:0, sourceHash:hash(source.map(s=>s.payloadHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n createCondensed(children = this.selectCondensation()): LcmNode | undefined { if (!children.length) return undefined; if (children.some(c => c.state !== \"ready\")) throw new Error(\"condensation requires ready children\"); if (new Set(children.map(c=>c.sessionId)).size !== 1 || new Set(children.map(c=>c.depth)).size !== 1) throw new Error(\"cross-branch ranges\"); const storedChildren = children.map((child) => this.getNode(child.nodeId)); if (storedChildren.some((child) => !child || child.projectKey !== this.projectKey)) throw new Error(\"child project does not match ledger project\"); if (storedChildren.some((child, index) => JSON.stringify(child) !== JSON.stringify(children[index]))) throw new Error(\"child payload changed\"); const concreteBranches = new Set(storedChildren.map(c => c!.branch).filter((value): value is string => typeof value === \"string\")); if (concreteBranches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...concreteBranches][0] ?? null; const source = [...new Map(storedChildren.flatMap(c => c!.sources).map((value) => [this.sourceKey(value), value])).values()]; this.validateSources(source); const node: LcmNode = { nodeId:`condensed:${hash({ projectKey:this.projectKey, children:storedChildren.map(c=>c!.nodeId), branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:children[0]!.sessionId, branch, kind:\"condensed\", sources:source, children:children.map(c=>c.nodeId), depth:Math.max(...children.map(c=>c.depth))+1, sourceHash:hash(children.map(c=>c.sourceHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n private validateSources(source: LcmSourceRef[]) { const seen = new Set<string>(); for (const s of source) { if (seen.has(this.sourceKey(s))) throw new Error(\"duplicate source identity\"); seen.add(this.sourceKey(s)); } if (new Set(source.map(s => s.sessionId)).size !== 1) throw new Error(\"cross-session ranges\"); }\n private sourceKey(source: Pick<LcmSourceRef, \"sessionId\" | \"entryId\" | \"revision\">) { return `${source.sessionId}:${source.entryId}:${source.revision}`; }\n private publish(node: LcmNode) { this.ledger.transaction(db => { if (node.children.includes(node.nodeId)) throw new Error(\"cycle\"); for (const child of node.children) if (!db.prepare(\"SELECT 1 FROM summary_nodes WHERE node_id=? AND project_key=?\").get(child,this.projectKey)) throw new Error(\"missing child\"); db.prepare(\"INSERT OR IGNORE INTO summary_nodes(node_id,project_key,payload,created_at) VALUES(?,?,?,?)\").run(node.nodeId,this.projectKey,JSON.stringify(node),node.createdAt); for (const child of node.children) db.prepare(\"INSERT OR IGNORE INTO summary_edges(parent_id,child_id) VALUES(?,?)\").run(node.nodeId,child); const job = this.job(node); db.prepare(\"INSERT OR IGNORE INTO maintenance_jobs(job_id,project_key,status,payload,created_at,updated_at) VALUES(?,?,?,?,?,?)\").run(job.jobId,this.projectKey,job.state,JSON.stringify(job),job.createdAt,job.updatedAt); }); }\n private job(node:LcmNode): LcmJob { const t=this.now(); return {jobId:`job:${node.nodeId}`,projectKey:this.projectKey,nodeId:node.nodeId,priority:node.kind === \"condensed\" ? 20 : 10,eligibleAt:t,state:\"pending\",attempts:0,nextRetryAt:t,createdAt:t,updatedAt:t}; }\n claim(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old=parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t=this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if ((old.state !== \"pending\" && !expired) || old.eligibleAt > t || old.nextRetryAt > t) throw new Error(\"job not eligible\"); const active = (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? AND status=?\").all(this.projectKey, \"running\") as Array<{payload:string}>).map(r => parse<LcmJob>(r.payload)).filter(j => j.jobId !== old.jobId && (j.leaseUntil ?? 0) > t); if (active.length) throw new Error(\"project lease held\"); const nodeRow = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(old.nodeId,this.projectKey) as {payload?:string}|undefined; const sessionId = nodeRow?.payload ? parse<LcmNode>(nodeRow.payload).sessionId : \"\"; const day = this.day(t); const projectUsage = this.usage(db, day); const sessionUsage = this.usage(db, day, sessionId); if (projectUsage.calls >= this.budget.calls || projectUsage.inputTokens >= this.budget.inputTokens || projectUsage.outputTokens >= this.budget.outputTokens || projectUsage.cost >= this.budget.cost || projectUsage.wallMs >= this.budget.wallMs || sessionUsage.calls >= this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...old,state:\"running\" as const,ownerId,leaseToken:token(),leaseUntil:t+30_000,updatedAt:t}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n claimEmergency(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old = parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t = this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if (old.state === \"completed\") throw new Error(\"job already completed\"); const out = { ...old, state: \"running\" as const, ownerId, leaseToken: token(), leaseUntil: t + 30_000, updatedAt: t }; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n renew(job:LcmJob): LcmJob { return this.fenced(job, old => ({...old,leaseUntil:this.now()+30_000,updatedAt:this.now()})); }\n private validateText(text: unknown): asserts text is string { if (typeof text !== \"string\" || text.length === 0) throw new Error(\"invalid summary text\"); let length = 0; for (const _ of text) { length += 1; if (length > this.maxOutputChars) throw new Error(\"summary exceeds output bound\"); } }\n complete(job:LcmJob, result:LcmModelResult): LcmNode { this.validateText(result.text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } if (![result.inputTokens,result.outputTokens,result.cost,result.wallMs].every((value) => Number.isFinite(value) && value >= 0)) throw new Error(\"invalid model usage\"); const projectUsage = this.usage(db, this.day(this.now())); const sessionUsage = this.usage(db, this.day(this.now()), node.sessionId); if (projectUsage.calls + 1 > this.budget.calls || projectUsage.inputTokens + result.inputTokens > this.budget.inputTokens || projectUsage.outputTokens + result.outputTokens > this.budget.outputTokens || projectUsage.cost + result.cost > this.budget.cost || projectUsage.wallMs + result.wallMs > this.budget.wallMs || sessionUsage.calls + 1 > this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...node,state:\"ready\" as const,text:result.text,modelHash:result.modelHash}; this.account(db,node.sessionId,result); db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n completeEmergency(job:LcmJob, text:string): LcmNode { this.validateText(text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } const out={...node,state:\"ready\" as const,text,modelHash:\"emergency\"}; db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n fail(job:LcmJob,error:string): LcmJob { return this.fenced(job, old => { const attempts=old.attempts+1; const delay=Math.min(900_000,30_000*2**(attempts-1)); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = old; return {...base,attempts,error,state:attempts>=3?\"failed\":\"pending\",eligibleAt:this.now()+delay,nextRetryAt:this.now()+delay,updatedAt:this.now()}; }); }\n async run(job:LcmJob, model:LcmSummarizer, input:string, signal=new AbortController().signal): Promise<LcmNode> { let sources: LcmSourceRef[] = []; let claimed: LcmJob | undefined; const controller = new AbortController(); let renew: ReturnType<typeof setInterval> | undefined; const timer = setTimeout(() => controller.abort(), 60_000); const abort = () => controller.abort(); signal.addEventListener(\"abort\", abort, { once: true }); try { claimed=this.claim(job.jobId,job.ownerId ?? this.ownerId); const node=this.getNode(claimed.nodeId); sources=node?.sources ?? []; renew = setInterval(() => { try { if (claimed) claimed = this.renew(claimed); } catch {} }, 10_000); const result=await Promise.race([model.generate({prompt:buildLcmPrompt(node?.kind ?? \"leaf\",input,this.maxInputChars),sessionId:node?.sessionId ?? \"\",signal:controller.signal}), new Promise<never>((_, reject) => controller.signal.addEventListener(\"abort\", () => reject(new Error(\"LCM timeout\")), { once: true }))]); return this.complete(claimed,result); } catch (error) { if (!claimed) throw error; const fallback=emergencyReduce(input,this.maxOutputChars,sources); try { return this.completeEmergency(claimed,fallback); } catch { try { this.fail(claimed,String(error)); } catch {} throw error; } } finally { clearTimeout(timer); if (renew) clearInterval(renew); signal.removeEventListener(\"abort\", abort); } }\n private day(ms:number): string { return new Date(ms).toISOString().slice(0,10); }\n private usage(db:any, day:string, sessionId?:string): LcmBudget { const q = sessionId === undefined ? \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=?\" : \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=? AND session_id=?\"; const r=(sessionId === undefined ? db.prepare(q).get(this.projectKey,day) : db.prepare(q).get(this.projectKey,day,sessionId)) as LcmBudget; return r; }\n private account(db:any, sessionId:string, result:LcmModelResult) { const d=this.day(this.now()); db.prepare(\"INSERT INTO maintenance_usage(project_key,day,session_id,calls,input_tokens,output_tokens,cost,wall_ms) VALUES(?,?,?,?,?,?,?,?) ON CONFLICT(project_key,day,session_id) DO UPDATE SET calls=calls+excluded.calls,input_tokens=input_tokens+excluded.input_tokens,output_tokens=output_tokens+excluded.output_tokens,cost=cost+excluded.cost,wall_ms=wall_ms+excluded.wall_ms\").run(this.projectKey,d,sessionId,1,result.inputTokens,result.outputTokens,result.cost,result.wallMs); }\n private readJob(db: any,id:string):LcmJob { const row=db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(id,this.projectKey) as {payload:string}|undefined; if(!row) throw new Error(\"job not found\"); const job=parse<LcmJob>(row.payload); if(job.projectKey!==this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; }\n private assertLease(current:LcmJob, expected:LcmJob) { if(current.ownerId!==expected.ownerId || current.leaseToken!==expected.leaseToken || current.state!==\"running\" || (current.leaseUntil??0)<this.now()) throw new Error(\"lease fenced\"); }\n private fenced(job:LcmJob, update:(old:LcmJob)=>LcmJob):LcmJob { return this.ledger.transaction(db => { const old=this.readJob(db,job.jobId); this.assertLease(old,job); const out=update(old); db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),out.updatedAt,out.jobId,this.projectKey); return out; }); }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, hashLcmPayload, LcmLedger, type RawEntry } from \"../storage/lcm-ledger.js\";\nimport { reconcileSession } from \"../storage/lcm-migration.js\";\nimport { emergencyReduce, LcmModelAdapter, type LcmSummarizer } from \"./lcm-model.js\";\nimport { LcmMaintenance, type LcmBudgetPolicy, type LcmJob, type LcmNode } from \"./lcm-maintenance.js\";\nimport type { LcmCompactionInput, LcmCompactionOutput } from \"./hook.js\";\n\nexport interface LcmReport {\n projectKey: string;\n sessionId: string | undefined;\n state: string;\n degraded: string | undefined;\n summaryModel: string | undefined;\n rawEntries: number;\n sessionEntries: number;\n modelNodes: number;\n emergencyNodes: number;\n pendingNodes: number;\n pendingJobs: number;\n upgradableNodes: number;\n usage: { calls: number; inputTokens: number; outputTokens: number; cost: number; wallMs: number };\n budget: { calls: number; sessionCalls: number; wallMs: number };\n}\n\nexport interface LcmRuntimeOptions {\n rootDir?: string;\n summaryModel?: string;\n maxLeafEntries?: number;\n maxCondenseChildren?: number;\n lcmMaxInputChars?: number;\n lcmMaxOutputTokens?: number;\n lcmMaxOutputChars?: number;\n maxMaintenancePasses?: number;\n modelSummaries?: boolean;\n maxDailyModelCalls?: number;\n maxSessionModelCalls?: number;\n maxDailyModelSeconds?: number;\n maintenanceRunSeconds?: number;\n}\n\nexport class LcmRuntime {\n readonly ledger: LcmLedger;\n readonly maintenance: LcmMaintenance;\n private readonly context: ExtensionContext;\n private readonly resolveOptions: () => LcmRuntimeOptions;\n private readonly abort = new AbortController();\n private writePending: Promise<void> = Promise.resolve();\n private maintenancePending: Promise<void> = Promise.resolve();\n private closed = false;\n private dirty = false;\n private degradedError: unknown;\n private activeSources = new Set<string>();\n private activeSessionId: string | undefined;\n\n constructor(context: ExtensionContext, options: LcmRuntimeOptions | (() => LcmRuntimeOptions) = {}) {\n this.context = context;\n this.resolveOptions = typeof options === \"function\" ? options : () => options;\n const initial = this.resolveOptions();\n const recorded = context.sessionManager.getRecordedCwd?.();\n const liveCwd = recorded || context.cwd;\n const project = canonicalProjectIdentity({ liveCwd });\n const ledgerOptions = initial.rootDir === undefined\n ? { project: { liveCwd: project.canonicalPath ?? liveCwd } }\n : { rootDir: initial.rootDir, project: { liveCwd: project.canonicalPath ?? liveCwd } };\n this.ledger = new LcmLedger(ledgerOptions);\n this.maintenance = new LcmMaintenance(this.ledger, {\n ...initial,\n ...(initial.lcmMaxInputChars === undefined ? {} : { maxInputChars: initial.lcmMaxInputChars }),\n ...(initial.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: initial.lcmMaxOutputChars }),\n budget: {\n ...(initial.maxDailyModelCalls ? { calls: initial.maxDailyModelCalls } : {}),\n ...(initial.maxSessionModelCalls ? { sessionCalls: initial.maxSessionModelCalls } : {}),\n ...(initial.maxDailyModelSeconds ? { wallMs: initial.maxDailyModelSeconds * 1_000 } : {}),\n },\n });\n }\n\n private get options(): LcmRuntimeOptions { return this.resolveOptions(); }\n\n get projectKey(): string { return this.ledger.project.key; }\n get signal(): AbortSignal { return this.abort.signal; }\n get status(): \"healthy\" | \"degraded\" { return this.degradedError === undefined ? \"healthy\" : \"degraded\"; }\n get error(): unknown { return this.degradedError; }\n markDirty(): void { this.dirty = true; }\n\n private enqueueWrite(operation: () => void | Promise<void>): Promise<void> {\n const run = this.writePending.then(operation);\n this.writePending = run.catch((error) => { this.degradedError = error; });\n return run;\n }\n\n private refreshActiveSources(sessionId: string, entries: readonly { id: string }[]): void {\n const ids = new Set(entries.map((entry) => entry.id));\n const latest = new Map<string, RawEntry>();\n for (const entry of this.ledger.readRaw(this.projectKey, sessionId)) {\n if (!ids.has(entry.entryId)) continue;\n const previous = latest.get(entry.entryId);\n if (!previous || previous.revision < entry.revision) latest.set(entry.entryId, entry);\n }\n this.activeSources = new Set(\n [...latest.values()].map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n this.activeSessionId = sessionId;\n }\n\n reconcileSelectedSession(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n const getSessionFile = this.context.sessionManager.getSessionFile;\n if (typeof getSessionFile !== \"function\") return;\n const sessionFile = getSessionFile.call(this.context.sessionManager);\n if (!sessionFile) return;\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const cwd = recorded || this.context.cwd;\n const result = reconcileSession({\n agentDir: this.options.rootDir ?? process.env.PI_CODING_AGENT_DIR ?? `${process.env.HOME ?? \".\"}/.omp/agent`,\n ledger: this.ledger,\n files: [sessionFile],\n liveCwd: cwd,\n projectCwd: cwd,\n apply: true,\n });\n this.degradedError = result.counts.errors > 0\n ? new Error(`LCM session reconciliation reported ${result.counts.errors} error(s)`)\n : undefined;\n const sessionId = this.context.sessionManager.getSessionId();\n this.refreshActiveSources(sessionId, this.context.sessionManager.getBranch());\n });\n }\n\n readback(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n if (this.closed) return;\n const entries = this.context.sessionManager.getBranch();\n const sessionId = this.context.sessionManager.getSessionId();\n const branch = this.context.sessionManager.getLeafId();\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const active = new Set<string>();\n for (const entry of entries) {\n const payloadJson = canonicalLcmPayload(entry);\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch,\n ...(recorded || this.context.cwd ? { recordedCwd: recorded || this.context.cwd } : {}),\n });\n active.add(`${sessionId}:${stored.entryId}:${stored.revision}`);\n }\n this.activeSources = active;\n this.activeSessionId = sessionId;\n this.dirty = false;\n this.degradedError = undefined;\n });\n }\n\n async syncAndSchedule(): Promise<void> {\n if (this.closed) return;\n await this.readback();\n this.scheduleMaintenance();\n }\n\n maintain(): Promise<void> { return this.syncAndSchedule(); }\n\n scheduleMaintenance(): void {\n if (this.closed) return;\n const run = this.maintenancePending.then(() => this.runMaintenance());\n this.maintenancePending = run.catch((error) => { this.degradedError = error; });\n }\n\n private async runMaintenance(): Promise<void> {\n if (this.closed || !this.activeSessionId || this.activeSources.size === 0) return;\n const wantsModel = this.options.modelSummaries !== false;\n let model: LcmSummarizer;\n try {\n if (!wantsModel) throw new Error(\"model summaries are disabled by configuration\");\n model = new LcmModelAdapter(this.context, this.options.summaryModel, true, {\n ...(this.options.lcmMaxInputChars === undefined ? {} : { maxInputChars: this.options.lcmMaxInputChars }),\n ...(this.options.lcmMaxOutputTokens === undefined ? {} : { maxOutputTokens: this.options.lcmMaxOutputTokens }),\n ...(this.options.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: this.options.lcmMaxOutputChars }),\n });\n } catch (error) {\n this.degradedError = error;\n model = { modelHash: \"unavailable\", generate: async () => { throw error instanceof Error ? error : new Error(String(error)); } };\n }\n const fanIn = Math.max(2, this.options.maxCondenseChildren ?? 4);\n const passes = Math.max(1, this.options.maxMaintenancePasses ?? 4);\n const runDeadline = Date.now() + Math.max(1, this.options.maintenanceRunSeconds ?? 60) * 1_000;\n const sessionId = this.activeSessionId;\n const raw = this.ledger.readRaw(this.projectKey, sessionId).filter((entry) =>\n this.activeSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n const inputFor = (node: NonNullable<ReturnType<LcmMaintenance[\"getNode\"]>>): string => {\n if (node.kind === \"condensed\") return node.children.map((id) => this.maintenance.getNode(id)?.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n return node.sources.map((source) => {\n const entry = this.ledger.readRawEntry(this.projectKey, source.sessionId, source.entryId, source.revision);\n if (!entry || entry.payloadHash !== source.payloadHash) throw new Error(\"stale source\");\n return entry.payloadJson;\n }).join(\"\\n\");\n };\n const runJob = async (job: LcmJob, node: LcmNode): Promise<void> => {\n try { await this.maintenance.run(job, model, inputFor(node), this.signal); } catch {}\n };\n for (let pass = 0; pass < passes && !this.closed && Date.now() < runDeadline; pass += 1) {\n const leafCandidate = this.maintenance.createLeaf(this.maintenance.selectLeaf(raw, this.context.sessionManager.getLeafId()));\n const leaf = leafCandidate ? this.maintenance.getNode(leafCandidate.nodeId) : undefined;\n if (leaf?.state === \"pending\") {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (job) await runJob(job, leaf);\n }\n const branch = this.context.sessionManager.getLeafId();\n const pending = this.maintenance.listJobs().filter((job) => job.state === \"pending\").flatMap((job) => {\n const node = this.maintenance.getNode(job.nodeId);\n if (!node || node.sessionId !== sessionId || (branch !== null && node.branch !== branch && node.branch !== null) || !node.sources.every((source) => this.activeSources.has(`${source.sessionId}:${source.entryId}:${source.revision}`))) return [];\n return [{ job, node }];\n }).slice(0, passes);\n for (const item of pending) await runJob(item.job, item.node);\n const children = this.maintenance.selectCondensation(sessionId, this.activeSources, this.context.sessionManager.getLeafId());\n if (children.length >= fanIn) {\n const node = this.maintenance.createCondensed(children);\n if (node) {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === node.nodeId);\n if (job) await runJob(job, node);\n }\n }\n if (!leaf && pending.length === 0 && children.length < fanIn) {\n const upgrades = this.maintenance.selectUpgrades(sessionId, this.activeSources, this.context.sessionManager.getLeafId(), 1);\n const upgrade = upgrades[0];\n if (!upgrade) break;\n const job = this.maintenance.reopen(upgrade.nodeId);\n await runJob(job, upgrade);\n continue;\n }\n }\n }\n\n compact(input: LcmCompactionInput): LcmCompactionOutput {\n const persistedEntries = new Map<string, RawEntry>();\n for (const entry of input.branchEntries) {\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const payloadJson = canonicalLcmPayload(entry);\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId: input.sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch: input.branch,\n });\n persistedEntries.set(`${entry.id}:${stored.payloadHash}`, stored);\n }\n const firstKeptIndex = input.firstKeptEntryId\n ? input.branchEntries.findIndex((entry) => entry.id === input.firstKeptEntryId)\n : input.branchEntries.length;\n const sourceEntries = input.branchEntries.slice(0, firstKeptIndex < 0 ? input.branchEntries.length : firstKeptIndex);\n const selectedStored = sourceEntries.map((entry) => {\n const payloadHash = hashLcmPayload(JSON.parse(canonicalLcmPayload(entry)));\n const stored = persistedEntries.get(`${entry.id}:${payloadHash}`);\n if (!stored) throw new Error(\"compaction source was not persisted\");\n return stored;\n });\n const activeSources = new Set(selectedStored.map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`));\n const frontier = this.maintenance.getFrontier(input.sessionId, input.branch, activeSources);\n const coveredSources = new Set(frontier.flatMap((node) => node.sources.map((source) => `${source.sessionId}:${source.entryId}:${source.revision}`)));\n const summary = frontier.map((node) => node.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n if (summary && selectedStored.every((entry) => coveredSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`))) return { summary, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"ready-frontier\", branch: input.branch };\n if (selectedStored.length === 0) throw new Error(\"LCM emergency fallback has no persisted sources\");\n const payloads = sourceEntries.map((entry) => canonicalLcmPayload(entry)).join(\"\\n\");\n const sources = selectedStored.map((stored) => ({ sessionId: stored.sessionId, entryId: stored.entryId, revision: stored.revision, payloadHash: stored.payloadHash }));\n const fallback = emergencyReduce(payloads, this.options.lcmMaxOutputChars ?? 4_096, sources);\n const leaf = this.maintenance.createLeaf(selectedStored);\n if (!leaf) throw new Error(\"LCM emergency fallback node was not created\");\n const persisted = this.maintenance.getNode(leaf.nodeId);\n if (persisted?.state === \"ready\") {\n if (persisted.branch !== input.branch || JSON.stringify(persisted.sources) !== JSON.stringify(sources)) throw new Error(\"LCM emergency fallback provenance mismatch\");\n if (!persisted.text) throw new Error(\"LCM emergency fallback text is missing\");\n return { summary: persisted.text, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (!job) throw new Error(\"LCM emergency fallback job was not created\");\n const completed = this.maintenance.completeEmergency(this.maintenance.claimEmergency(job.jobId), fallback);\n return { summary: completed.text ?? fallback, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n\n report(): LcmReport {\n const day = new Date(Date.now()).toISOString().slice(0, 10);\n return this.ledger.readOnly((db) => {\n const count = (sql: string, ...params: unknown[]): number =>\n Number((db.prepare(sql).get(...params) as { n: number }).n);\n const nodes = db.prepare(\"SELECT json_extract(payload,'$.kind') kind, json_extract(payload,'$.state') state, json_extract(payload,'$.modelHash') model, count(*) n FROM summary_nodes WHERE project_key=? GROUP BY kind, state, model\")\n .all(this.projectKey) as Array<{ kind: string; state: string; model: string; n: number }>;\n const usage = db.prepare(\"SELECT coalesce(sum(calls),0) calls, coalesce(sum(input_tokens),0) input, coalesce(sum(output_tokens),0) output, coalesce(sum(cost),0) cost, coalesce(sum(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=?\")\n .get(this.projectKey, day) as { calls: number; input: number; output: number; cost: number; wallMs: number };\n const budget = this.maintenance.budgetPolicy();\n return {\n projectKey: this.projectKey,\n sessionId: this.activeSessionId,\n state: this.ledger.operationalState,\n degraded: this.degradedError === undefined ? undefined : String(this.degradedError instanceof Error ? this.degradedError.message : this.degradedError),\n summaryModel: this.options.summaryModel,\n rawEntries: count(\"SELECT count(*) n FROM raw_entries WHERE project_key=?\", this.projectKey),\n sessionEntries: this.activeSessionId === undefined ? 0 : count(\"SELECT count(*) n FROM raw_entries WHERE project_key=? AND session_id=?\", this.projectKey, this.activeSessionId),\n modelNodes: nodes.filter((row) => row.model && row.model !== \"emergency\").reduce((total, row) => total + row.n, 0),\n emergencyNodes: nodes.filter((row) => row.model === \"emergency\").reduce((total, row) => total + row.n, 0),\n pendingNodes: nodes.filter((row) => row.state !== \"ready\").reduce((total, row) => total + row.n, 0),\n pendingJobs: count(\"SELECT count(*) n FROM maintenance_jobs WHERE project_key=? AND status=?\", this.projectKey, \"pending\"),\n upgradableNodes: count(\"SELECT count(*) n FROM summary_nodes WHERE project_key=? AND json_extract(payload,'$.modelHash')=?\", this.projectKey, \"emergency\"),\n usage: { calls: usage.calls, inputTokens: usage.input, outputTokens: usage.output, cost: usage.cost, wallMs: usage.wallMs },\n budget: { calls: budget.calls, sessionCalls: budget.sessionCalls, wallMs: budget.wallMs },\n };\n });\n }\n\n coverage(): { active: number; covered: number } {\n if (!this.activeSessionId) return { active: 0, covered: 0 };\n const frontier = this.maintenance.getFrontier(this.activeSessionId, this.context.sessionManager.getLeafId(), this.activeSources);\n const covered = new Set(frontier.flatMap((node) => node.sources.map((source) => `${source.sessionId}:${source.entryId}:${source.revision}`)));\n let hits = 0;\n for (const key of this.activeSources) if (covered.has(key)) hits += 1;\n return { active: this.activeSources.size, covered: hits };\n }\n\n memoryContext() {\n return {\n ledger: {\n projectKey: this.projectKey,\n readRaw: (sessionId?: string) => this.ledger.readRaw(this.projectKey, sessionId),\n readRawPage: (sessionId?: string, offset?: number, limit?: number) => this.ledger.readRawPage(this.projectKey, sessionId, offset, limit),\n readRawEntry: (sessionId: string, entryId: string, revision: number) => this.ledger.readRawEntry(this.projectKey, sessionId, entryId, revision),\n },\n ...(this.activeSessionId === undefined ? {} : { currentSessionId: this.activeSessionId }),\n summaries: {\n listNodes: ({ sessionId, branch, limit }: { sessionId?: string; branch?: string | null; limit: number }) => this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined).slice(0, limit).map((node) => ({ ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) })),\n getNode: (nodeId: string) => {\n const node = this.maintenance.getNode(nodeId);\n return node ? { ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) } : undefined;\n },\n },\n branchForSession: (sessionId: string) => sessionId === this.activeSessionId\n ? { branch: this.context.sessionManager.getLeafId(), activeSourceKeys: [...this.activeSources], ready: this.status === \"healthy\" }\n : undefined,\n };\n }\n\n frontier(sessionId?: string, branch?: string | null) {\n return this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined);\n }\n\n raw(sessionId?: string): RawEntry[] { return this.ledger.readRaw(this.projectKey, sessionId); }\n\n async shutdown(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.abort.abort();\n await this.writePending.catch(() => undefined);\n await this.maintenancePending.catch(() => undefined);\n this.ledger.close();\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;AAMnB,IAAM,2BAA2B,IAAI,QAAQ;AAC7C,IAAM,+BAA+B,KAAK,QAAQ;AAMlD,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcf,IAAM,WAAW,CAAC,SAAiB,OAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,aAAa,IAAI,CAAC,EAAE,OAAO,KAAK;AACzG,IAAM,eAAe,CAAC,OAA+B;AACnD,QAAM,SAAS,OAAO,WAAW,QAAQ;AACzC,aAAW,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,mBAAmB,KAAK,GAAG,CAAC,YAAY,aAAa,GAAG,CAAC,mBAAmB,OAAO,GAAG,CAAC,YAAY,wBAAwB,GAAG,CAAC,eAAe,0CAA0C,GAAG,CAAC,iBAAiB,SAAS,GAAG,CAAC,iBAAiB,oBAAoB,GAAG,CAAC,aAAa,iCAAiC,GAAG,CAAC,oBAAoB,QAAQ,GAAG,CAAC,qBAAqB,4BAA4B,CAAC,GAAY;AAChb,WAAO,OAAO,GAAG,KAAK,IAAI;AAC1B,eAAW,OAAO,GAAG,QAAQ,iBAAiB,KAAK,aAAa,KAAK,EAAE,EAAE,IAAI,EAAG,QAAO,OAAO,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI;AAAA,EAC1H;AACA,SAAO,OAAO,OAAO,KAAK;AAC5B;AAEA,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAAE,YAAY,SAAiC,OAAiB;AAAE,UAAM,OAAO;AAAhC;AAAmC,SAAK,OAAO;AAAA,EAAuB;AAAE;AAExJ,IAAM,YAAN,MAAgB;AAAA,EACZ;AAAA,EACA;AAAA,EACD,WAAW;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,aAA4B,QAAQ,QAAQ;AAAA,EAC5C,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACjB,YAAY,UAAyB,CAAC,GAAG;AACvC,SAAK,MAAM,QAAQ,OAAO,KAAK;AAC/B,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,mBAAmB,QAAQ,oBAAoB;AACpD,QAAI,CAAC,OAAO,cAAc,KAAK,YAAY,KAAK,CAAC,OAAO,cAAc,KAAK,gBAAgB,KAAK,KAAK,eAAe,KAAK,KAAK,mBAAmB,KAAK,cAAc;AAClK,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,SAAK,UAAU,yBAAyB,QAAQ,WAAW,EAAE,SAAS,QAAQ,IAAI,EAAE,CAAC;AACrF,UAAM,SAAS,QAAQ,UAAU,kBAAkB,QAAQ,SAAS,KAAK,QAAQ,GAAG;AACpF,OAAG,UAAU,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,SAAK,SAAS;AACd,SAAK,KAAK,KAAK,aAAa,GAAG,MAAM;AACrC,QAAI;AACF,WAAK,GAAG,KAAK,6GAA6G;AAC1H,WAAK,GAAG,KAAK,qBAAqB,SAAS,iHAAiH;AAC5J,YAAM,UAAU,KAAK,GAAG,QAAQ,gCAAgC,EAAE,IAAI;AACtE,UAAI,CAAC,QAAQ,KAAK,YAAU,OAAO,SAAS,cAAc,GAAG;AAC3D,YAAI,OAAQ,KAAK,GAAG,QAAQ,oCAAoC,EAAE,IAAI,EAAoB,CAAC,EAAG,OAAM,IAAI,MAAM,8DAA8D;AAC5K,aAAK,GAAG,KAAK,0EAA0E;AAAA,MACzF;AACA,YAAM,SAAS,KAAK,GAAG,QAAQ,wBAAwB,EAAE,IAAI;AAC7D,UAAI,OAAO,oBAAoB,KAAM,OAAM,IAAI,MAAM,OAAO,OAAO,eAAe,CAAC;AACnF,WAAK,gBAAgB,KAAK,OAAO;AAAA,IACnC,SAAS,OAAO;AAAE,WAAK,WAAW;AAAM,YAAM,IAAI,oBAAoB,yBAAyB,KAAK;AAAA,IAAG;AAAA,EACzG;AAAA,EACA,IAAI,aAAa;AAAE,WAAO,KAAK;AAAA,EAAU;AAAA,EACzC,IAAI,mBAAqC;AACvC,QAAI,KAAK,SAAU,QAAO;AAC1B,QAAI;AAAE,YAAM,OAAO,GAAG,SAAS,KAAK,MAAM,EAAE;AAAM,UAAI,QAAQ,KAAK,iBAAkB,QAAO;AAAe,UAAI,QAAQ,KAAK,aAAc,QAAO;AAAA,IAAW,QAAQ;AAAA,IAAC;AACrK,WAAO;AAAA,EACT;AAAA,EACA,aAAa,OAAiB;AAAE,SAAK,WAAW;AAAM,WAAO,IAAI,oBAAoB,sBAAsB,KAAK;AAAA,EAAG;AAAA,EAC3G,gBAAgB,UAA2B;AACjD,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,GAAG,QAAQ,kMAAkM,EAAE,IAAI,SAAS,KAAK,KAAK,UAAU,QAAQ,GAAG,KAAK,GAAG;AACxQ,eAAW,SAAS,SAAS,SAAS;AACpC,YAAM,WAAW,KAAK,GAAG,QAAQ,uDAAuD,EAAE,IAAI,KAAK;AACnG,UAAI,YAAY,SAAS,gBAAgB,SAAS,IAAK,OAAM,IAAI,oBAAoB,4BAA4B,KAAK,EAAE;AACxH,WAAK,GAAG,QAAQ,sEAAsE,EAAE,IAAI,OAAO,SAAS,GAAG;AAAA,IACjH;AAAA,EACF;AAAA,EACQ,QAAQ;AAAE,QAAI,KAAK,SAAU,OAAM,IAAI,oBAAoB,oBAAoB;AAAA,EAAG;AAAA,EAClF,iBAAiB,YAAoB;AAAE,QAAI,eAAe,KAAK,QAAQ,IAAK,OAAM,IAAI,MAAM,2CAA2C;AAAA,EAAG;AAAA,EAClJ,MAAM,UAAa,WAAgC;AAAE,UAAM,WAAW,KAAK;AAAY,QAAI;AAAsB,SAAK,aAAa,IAAI,QAAc,aAAW;AAAE,gBAAU;AAAA,IAAQ,CAAC;AAAG,UAAM;AAAU,QAAI;AAAE,WAAK,MAAM;AAAG,aAAO,UAAU;AAAA,IAAG,UAAE;AAAU,cAAQ;AAAA,IAAG;AAAA,EAAE;AAAA,EACzQ,UAAU,OAA+B;AACvC,SAAK,MAAM;AACX,QAAI,MAAM,eAAe,KAAK,QAAQ,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACxG,QAAI,MAAM,QAAQ,KAAK,EAAE,WAAW,EAAG,OAAM,IAAI,MAAM,sBAAsB;AAC7E,QAAI,OAAO,MAAM,gBAAgB,YAAY,CAAC,MAAM,YAAY,KAAK,EAAG,OAAM,IAAI,MAAM,+BAA+B;AACvH,QAAI;AACJ,QAAI;AAAE,gBAAU,KAAK,MAAM,MAAM,WAAW;AAAA,IAA8B,QAAQ;AAAE,YAAM,IAAI,MAAM,sBAAsB;AAAA,IAAG;AAC7H,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,OAAO,QAAQ,SAAS,YAAY,OAAO,QAAQ,OAAO,YAAY,QAAQ,OAAO,MAAM,QAAS,OAAM,IAAI,MAAM,qCAAqC;AACxM,UAAM,cAAc,oBAAoB,OAAO;AAC/C,UAAM,cAAc,eAAe,OAAO;AAC1C,UAAM,kBAAkB,KAAK,qBAAqB;AAClD,QAAI,gBAAiB,MAAK,GAAG,KAAK,iBAAiB;AACnD,QAAI;AACF,YAAM,WAAW,KAAK,GAAG,QAAQ,oHAAoH,EAAE,IAAI,MAAM,YAAY,MAAM,WAAW,MAAM,SAAS,WAAW;AACxN,UAAI,UAAU;AAAE,YAAI,gBAAiB,MAAK,GAAG,KAAK,QAAQ;AAAG,eAAO,EAAE,GAAG,OAAO,aAAa,aAAa,aAAa,UAAU,SAAS,UAAU,aAAa,WAAW,SAAS,WAAW;AAAA,MAAG;AACnM,YAAM,SAAS,KAAK,GAAG,QAAQ,gHAAgH,EAAE,IAAI,MAAM,YAAY,MAAM,WAAW,MAAM,OAAO;AACrM,YAAM,WAAW,OAAO,WAAW;AAAG,YAAM,YAAY,MAAM,aAAa,KAAK,IAAI;AACpF,WAAK,GAAG,QAAQ,iFAAiF,EAAE,IAAI,MAAM,YAAY,MAAM,WAAW,SAAS;AACnJ,WAAK,GAAG,QAAQ,0KAA0K,EAAE,IAAI,MAAM,YAAW,MAAM,WAAU,MAAM,SAAQ,UAAS,MAAM,MAAK,MAAM,SAAQ,aAAY,aAAY,MAAM,iBAAiB,MAAK,MAAM,UAAU,MAAK,SAAS;AACnW,UAAI,gBAAiB,MAAK,GAAG,KAAK,QAAQ;AAC1C,aAAO,EAAE,GAAG,OAAO,aAAa,aAAa,aAAa,UAAU,aAAa,UAAU;AAAA,IAC7F,SAAS,OAAO;AACd,UAAI,gBAAiB,MAAK,GAAG,KAAK,UAAU;AAC5C,YAAM,OAAQ,MAAgC;AAAM,UAAI,SAAS,YAAY,SAAS,iBAAiB,OAAO,KAAK,EAAE,SAAS,0BAA0B,EAAG,MAAK,WAAW;AAAM,YAAM,IAAI,oBAAoB,uBAAuB,KAAK;AAAA,IAC7O;AAAA,EACF;AAAA,EACA,QAAQ,aAAa,KAAK,QAAQ,KAAK,WAAgC;AAAE,SAAK,MAAM;AAAG,SAAK,iBAAiB,UAAU;AAAG,UAAM,OAAO,YAAY,KAAK,GAAG,QAAQ,6FAA6F,EAAE,IAAI,YAAW,SAAS,IAAI,KAAK,GAAG,QAAQ,gGAAgG,EAAE,IAAI,UAAU;AAAG,WAAQ,KAAwC,IAAI,UAAQ,EAAE,YAAY,IAAI,aAAuB,WAAW,IAAI,YAAsB,SAAS,IAAI,UAAoB,UAAU,IAAI,UAAoB,MAAM,IAAI,MAAgB,SAAS,IAAI,SAAmB,aAAa,IAAI,cAAwB,aAAa,IAAI,cAAwB,aAAa,IAAI,cAAwB,eAAe,IAAI,iBAAkC,QAAQ,IAAI,QAAyB,WAAW,IAAI,WAAqB,EAAE;AAAA,EAAG;AAAA,EACt6B,YAAY,aAAa,KAAK,QAAQ,KAAK,WAAoB,SAAS,GAAG,QAAQ,KAAiB;AAAE,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,KAAK,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,EAAG,OAAM,IAAI,MAAM,kBAAkB;AAAG,SAAK,MAAM;AAAG,SAAK,iBAAiB,UAAU;AAAG,UAAM,OAAO,YAAY,KAAK,GAAG,QAAQ,8GAA8G,EAAE,IAAI,YAAW,WAAU,OAAM,MAAM,IAAI,KAAK,GAAG,QAAQ,iHAAiH,EAAE,IAAI,YAAW,OAAM,MAAM;AAAG,WAAQ,KAAwC,IAAI,UAAQ,EAAE,YAAY,IAAI,aAAuB,WAAW,IAAI,YAAsB,SAAS,IAAI,UAAoB,UAAU,IAAI,UAAoB,MAAM,IAAI,MAAgB,SAAS,IAAI,SAAmB,aAAa,IAAI,cAAwB,aAAa,IAAI,cAAwB,aAAa,IAAI,cAAwB,eAAe,IAAI,iBAAkC,QAAQ,IAAI,QAAyB,WAAW,IAAI,WAAqB,EAAE;AAAA,EAAG;AAAA,EACloC,aAAa,YAAoB,WAAmB,SAAiB,UAAwC;AAAE,SAAK,MAAM;AAAG,SAAK,iBAAiB,UAAU;AAAG,UAAM,MAAM,KAAK,GAAG,QAAQ,8FAA8F,EAAE,IAAI,YAAW,WAAU,SAAQ,QAAQ;AAA0C,WAAO,MAAM,EAAE,YAAY,IAAI,aAAuB,WAAW,IAAI,YAAsB,SAAS,IAAI,UAAoB,UAAU,IAAI,UAAoB,MAAM,IAAI,MAAgB,SAAS,IAAI,SAAmB,aAAa,IAAI,cAAwB,aAAa,IAAI,cAAwB,aAAa,IAAI,cAAwB,eAAe,IAAI,iBAAkC,QAAQ,IAAI,QAAyB,WAAW,IAAI,WAAqB,IAAI;AAAA,EAAW;AAAA,EAC/0B,SAAY,IAAkC;AAAE,SAAK,MAAM;AAAG,WAAO,GAAG,KAAK,EAAE;AAAA,EAAG;AAAA,EAClF,YAAe,IAAkC;AAAE,SAAK,MAAM;AAAG,QAAI,KAAK,mBAAmB,EAAG,QAAO,GAAG,KAAK,EAAE;AAAG,SAAK,GAAG,KAAK,iBAAiB;AAAG,SAAK,mBAAmB;AAAG,QAAI;AAAE,YAAM,SAAS,GAAG,KAAK,EAAE;AAAG,WAAK,GAAG,KAAK,QAAQ;AAAG,aAAO;AAAA,IAAQ,SAAS,OAAO;AAAE,WAAK,GAAG,KAAK,UAAU;AAAG,YAAM;AAAA,IAAO,UAAE;AAAU,WAAK,mBAAmB;AAAA,IAAG;AAAA,EAAE;AAAA,EAC3V,WAAW,OAA+B,WAA8B;AACtE,UAAM,MAAM,KAAK,GAAG,QAAQ,yBAAyB,KAAK,YAAY,CAAC,GAAG,EAAE,IAAI;AAChF,UAAM,OAAO,IAAI,QAAQ;AACzB,UAAM,WAAW,IAAI,OAAO;AAC5B,WAAO,EAAE,MAAM,MAAM,UAAU,mBAAmB,IAAI,gBAAgB,GAAG,WAAW,SAAS,cAAc,SAAS,KAAK,aAAa,EAAE;AAAA,EAC1I;AAAA,EACA,OAAO,aAAqC;AAC1C,SAAK,MAAM;AACX,WAAO,KAAK,cAAc,MAAM;AAC9B,YAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,SAAG,UAAU,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,UAAI,GAAG,WAAW,MAAM,EAAG,OAAM,IAAI,MAAM,2BAA2B;AACtE,WAAK,GAAG,KAAK,gBAAgB,OAAO,QAAQ,MAAM,IAAI,CAAC,GAAG;AAC1D,SAAG,UAAU,QAAQ,GAAK;AAC1B,YAAM,OAAO,KAAK,aAAa,GAAG,MAAM;AACxC,UAAI,YAAY;AAChB,UAAI,oBAAoB;AACxB,YAAM,YAAoC,CAAC;AAC3C,UAAI;AACF,oBAAa,KAAK,QAAQ,wBAAwB,EAAE,IAAI,EAAmC,mBAAmB;AAC9G,mBAAW,SAAS,CAAC,YAAY,YAAY,eAAe,iBAAiB,iBAAiB,aAAa,oBAAoB,mBAAmB,GAAG;AACnJ,oBAAU,KAAK,IAAI,OAAQ,KAAK,QAAQ,0BAA0B,KAAK,EAAE,EAAE,IAAI,EAAoB,CAAC;AAAA,QACtG;AACA,4BAAoB,aAAa,IAAI;AAAA,MACvC,UAAE;AACA,aAAK,MAAM;AAAA,MACb;AACA,YAAM,WAA2B,EAAE,QAAQ,qBAAqB,SAAS,GAAG,QAAQ,KAAK,QAAQ,aAAa,QAAQ,cAAc,SAAS,KAAK,MAAM,GAAG,cAAc,SAAS,MAAM,GAAG,mBAAmB,mBAAmB,WAAW,WAAW,WAAW,KAAK,IAAI,EAAE;AAC7Q,SAAG,cAAc,GAAG,MAAM,kBAAkB,KAAK,UAAU,QAAQ,GAAG,EAAE,MAAM,IAAM,CAAC;AACrF,SAAG,UAAU,GAAG,MAAM,kBAAkB,GAAK;AAC7C,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EACA,aAAa,aAAqC;AAAE,WAAO,KAAK,OAAO,WAAW;AAAA,EAAG;AAAA,EACrF,cAAcA,QAAgC,gBAAsC;AAClF,SAAK,MAAM;AACX,QAAIA,OAAM,YAAY,6BAA6BA,OAAM,eAAe,KAAK,QAAQ,OAAOA,OAAM,UAAU,KAAK,UAAU,KAAK,QAAQ,GAAG,EAAE,EAAG,OAAM,IAAI,MAAM,mCAAmC;AACnM,UAAM,WAAW,GAAG,WAAW,eAAe,WAAW,IAAI,KAAK,aAAa,GAAG,eAAe,WAAW,IAAI;AAChH,QAAI;AACJ,QAAI;AACF,UAAI,SAAU,qBAAoB,aAAa,QAAQ;AAAA,IACzD,UAAE;AACA,gBAAU,MAAM;AAAA,IAClB;AACA,QAAI,eAAe,cAAc,QAAQ,eAAe,WAAW,KAAK,UAAU,CAAC,eAAe,gBAAgB,eAAe,iBAAiB,SAAS,eAAe,WAAW,KAAK,CAAC,eAAe,qBAAqB,eAAe,sBAAsB,qBAAqB,eAAe,iBAAiB,SAAS,KAAK,MAAM,KAAK,eAAe,sBAAsB,aAAa,KAAK,EAAE,EAAG,OAAM,IAAI,MAAM,4BAA4B;AAC1b,SAAK,YAAY,QAAM;AACrB,SAAG,QAAQ,6KAA6K,EAAE,IAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,GAAG;AAChO,iBAAW,SAAS,CAAC,eAAe,YAAY,aAAa,iBAAiB,oBAAoB,mBAAmB,EAAG,IAAG,QAAQ,eAAe,KAAK,sBAAsB,EAAE,IAAI,KAAK,QAAQ,GAAG;AACnM,SAAG,QAAQ,iDAAiD,EAAE,IAAI,KAAK,QAAQ,GAAG;AAClF,SAAG,QAAQ,0CAA0C,EAAE,IAAI,KAAK,QAAQ,GAAG;AAAA,IAC7E,CAAC;AACD,UAAM,YAAa,KAAK,GAAG,QAAQ,wBAAwB,EAAE,IAAI,EAAmC;AACpG,QAAI,cAAc,KAAM,OAAM,IAAI,MAAM,iCAAiC,SAAS,EAAE;AACpF,UAAM,QAAQ,EAAE,QAAQ,qBAAqB,SAAS,GAAG,YAAY,KAAK,QAAQ,KAAK,WAAW,KAAK,IAAI,GAAG,WAAW,WAAW,OAAQ,KAAK,GAAG,QAAQ,qDAAqD,EAAE,IAAI,KAAK,QAAQ,GAAG,EAAoB,CAAC,EAAE;AAC9P,OAAG,cAAc,GAAG,eAAe,WAAW,yBAAyB,KAAK,UAAU,KAAK,GAAG,EAAE,MAAM,IAAM,CAAC;AAAA,EAC/G;AAAA,EACQ,cAAiB,WAAuB;AAAE,SAAK,MAAM;AAAG,WAAO,UAAU;AAAA,EAAG;AAAA,EACpF,QAAQ;AAAE,QAAI,KAAK,OAAQ;AAAQ,SAAK,GAAG,MAAM;AAAG,SAAK,SAAS;AAAA,EAAM;AAC1E;;;ACzLA,OAAOC,aAAY;AACnB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAsDjB,IAAMC,QAAO,CAAC,SAAkCC,QAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACrG,IAAM,SAAS,CAAC,UACd,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AAC5G,IAAM,WAAW,CAAC,UAAoC,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AACzG,IAAM,MAAM,CAAC,UAA0B;AACrC,MAAI,CAAC,mEAAmE,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,iDAAiD;AACtJ,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,QAAM,aAAa,MAAM,QAAQ,UAAU,GAAG,EAAE,QAAQ,MAAM,EAAE;AAChE,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,IAAI,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,MAAM,WAAW,MAAM,GAAG,EAAE,EAAG,OAAM,IAAI,MAAM,uBAAuB;AACxI,SAAO;AACT;AACO,SAAS,gBAAgB,SAA8F;AAC5H,QAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;AACpC,QAAM,QAAQ,QAAQ,UAAU,SAAY,MAAM,KAAK,KAAK,KAAK,MAAO,IAAI,QAAQ,KAAK;AACzF,QAAM,QAAQ,QAAQ,UAAU,SAAY,MAAM,IAAI,QAAQ,KAAK;AACnE,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,MAAO,OAAM,IAAI,MAAM,0BAA0B;AACnH,SAAO,EAAE,OAAO,MAAM;AACxB;AACA,IAAM,WAAW,CAAC,OAA2B,aAA6B;AACxE,QAAM,SAAS,SAAS;AACxB,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,EAAG,OAAM,IAAI,MAAM,4CAA4C;AAC7G,SAAO;AACT;AACO,SAAS,0BAA0B,SAAoE;AAC5G,QAAM,WAAW,SAAS,QAAQ,UAAU,GAAM;AAClD,QAAM,aAAa,SAAS,QAAQ,qBAAqB,GAAO;AAChE,QAAM,QAAQ,oBAAI,IAAY;AAC9B,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,QAAM,MAAM,CAAC,SAAuB;AAClC,QAAI,MAAM,QAAQ,YAAY,CAAC,MAAM,IAAIC,MAAK,QAAQ,IAAI,CAAC,GAAG;AAAE;AAAc;AAAA,IAAQ;AACtF,UAAM,IAAIA,MAAK,QAAQ,IAAI,CAAC;AAAA,EAC9B;AACA,MAAI,QAAQ,OAAO;AACjB,eAAW,QAAQ,QAAQ,MAAM,MAAM,GAAG,QAAQ,EAAG,KAAI,IAAI;AAC7D,QAAI,QAAQ,MAAM,SAAS,SAAU;AACrC,WAAO,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,GAAG,WAAW;AAAA,EAChD;AACA,QAAM,OAAO,CAAC,KAAa,UAA4C;AACrE,QAAI;AACJ,QAAI;AACF,eAASC,IAAG,YAAY,GAAG;AAC3B,UAAI;AACJ,cAAQ,QAAQ,OAAO,SAAS,OAAO,MAAM;AAC3C,YAAI,EAAE,UAAU,YAAY;AAAE;AAAc;AAAA,QAAO;AACnD,cAAM,KAAK;AAAA,MACb;AAAA,IACF,QAAQ;AAAE;AAAA,IAAc,UAAE;AAAU,cAAQ,UAAU;AAAA,IAAG;AAAA,EAC3D;AACA,QAAM,OAAO,CAAC,QAAsB,KAAK,KAAK,WAAS;AACrD,QAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,QAAQ,EAAG,KAAID,MAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,aAC1E,MAAM,eAAe,KAAK,MAAM,KAAK,SAAS,QAAQ,EAAG;AAAA,EACpE,CAAC;AACD,MAAI,QAAQ,eAAe;AACzB,eAAW,OAAO,QAAQ,eAAe;AAAE,UAAI,WAAW,YAAY;AAAE;AAAc;AAAA,MAAO;AAAE,WAAK,GAAG;AAAA,IAAG;AAAA,EAC5G,WAAW,QAAQ,YAAY;AAC7B,UAAM,QAAQ,sBAAsB,QAAQ,UAAU;AACtD,QAAI,QAAQ;AACZ,eAAW,QAAQ,CAAC,MAAM,WAAW,GAAG,MAAM,MAAM,GAAG;AACrD,YAAM,MAAMA,MAAK,KAAK,gBAAgB,QAAQ,QAAQ,GAAG,IAAI;AAC7D,UAAI;AAAE,YAAIC,IAAG,SAAS,GAAG,EAAE,YAAY,GAAG;AAAE,kBAAQ;AAAM,eAAK,GAAG;AAAA,QAAG;AAAA,MAAE,SAChE,OAAO;AAAE,YAAK,MAAgC,SAAS,SAAU;AAAA,MAAc;AAAA,IACxF;AACA,QAAI,CAAC,MAAO;AAAA,EACd,OAAO;AACL,UAAM,OAAO,gBAAgB,QAAQ,QAAQ;AAC7C,SAAK,MAAM,WAAS;AAClB,UAAI,MAAM,YAAY,EAAG,MAAKD,MAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,eAChD,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,QAAQ,EAAG,KAAIA,MAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,eAChF,MAAM,eAAe,EAAG;AAAA,IACnC,CAAC;AAAA,EACH;AACA,SAAO,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,GAAG,WAAW;AAChD;AACA,IAAM,oBAAsB;AACrB,SAAS,iBAAiB,SAAiF;AAChH,SAAO,gBAAgB,EAAE,GAAG,SAAS,UAAU,KAAK,CAAC;AACvD;AAEO,SAAS,gBAAgB,SAA4C;AAC1E,QAAM,SAAS,gBAAgB,OAAO;AACtC,QAAM,eAAe,SAAS,QAAQ,cAAc,KAAK,QAAQ,CAAC;AAClE,QAAM,eAAe,SAAS,QAAQ,cAAc,IAAI,QAAQ,CAAC;AACjE,QAAM,gBAAgB,SAAS,QAAQ,eAAe,QAAQ,CAAC;AAC/D,QAAM,YAAY,0BAA0B,OAAO;AACnD,QAAM,SAA0B;AAAA,IAC9B,MAAM,QAAQ,QAAQ,UAAU;AAAA,IAAW,OAAO,IAAI,KAAK,OAAO,KAAK,EAAE,YAAY;AAAA,IAAG,OAAO,IAAI,KAAK,OAAO,KAAK,EAAE,YAAY;AAAA,IAClI,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,WAAW,GAAG,WAAW,GAAG,qBAAqB,UAAU,YAAY,QAAQ,EAAE;AAAA,IACjK,cAAc;AAAA,IAAG,cAAc;AAAA,IAAG,aAAa,CAAC;AAAA,IAAG,UAAU;AAAA,EAC/D;AACA,QAAM,SAAS,OAAO;AACtB,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,QAAQ,UAAU,OAAO;AAClC,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,WAAKC,IAAG,SAAS,MAAM,GAAG;AAC1B,YAAM,SAASA,IAAG,UAAU,EAAE;AAC9B,UAAI,CAAC,OAAO,OAAO,GAAG;AAAE,eAAO;AAAuB;AAAA,MAAU;AAChE,UAAI,OAAO,OAAO,cAAc;AAAE,eAAO;AAAa;AAAA,MAAU;AAChE,UAAI,OAAO,eAAe,OAAO,OAAO,eAAe;AAAE,eAAO;AAAuB;AAAA,MAAO;AAC9F,aAAO,OAAO,YAAY,OAAO,IAAI;AACrC,UAAI,SAAS;AACb,aAAO,SAAS,KAAK,QAAQ;AAC3B,cAAM,OAAOA,IAAG,SAAS,IAAI,MAAM,QAAQ,KAAK,SAAS,QAAQ,MAAM;AACvE,YAAI,SAAS,EAAG,OAAM,IAAI,MAAM,8BAA8B;AAC9D,kBAAU;AAAA,MACZ;AACA,YAAM,QAAQA,IAAG,UAAU,EAAE;AAC7B,UAAI,MAAM,SAAS,OAAO,QAAQ,MAAM,YAAY,OAAO,WAAW,MAAM,YAAY,OAAO,QAAS,OAAM,IAAI,MAAM,4BAA4B;AAAA,IACtJ,QAAQ;AAAE,aAAO;AAAU,aAAO;AAAuB;AAAA,IAAU,UACnE;AAAU,UAAI,OAAO,OAAW,CAAAA,IAAG,UAAU,EAAE;AAAA,IAAG;AAClD,WAAO;AACP,WAAO,gBAAgB,KAAK;AAC5B,UAAM,aAAaH,MAAK,IAAI;AAC5B,WAAO,YAAY,KAAK,EAAE,aAAa,MAAM,WAAW,CAAC;AACzD,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,YAAY;AAChB,QAAI,aAAa;AACjB,QAAI;AACJ,QAAI,UAAU;AACd,QAAI;AACF,eAAS,QAAQ,GAAG,QAAQ,KAAK,UAAS;AACxC;AACA,cAAM,UAAU,KAAK,QAAQ,IAAI,KAAK;AACtC,cAAM,MAAM,UAAU,IAAI,KAAK,SAAS;AACxC,cAAM,QAAQ,KAAK,SAAS,OAAO,GAAG;AACtC,gBAAQ,UAAU,IAAI,KAAK,SAAS,MAAM;AAC1C,YAAI,MAAM,SAAS,cAAc;AAAE,iBAAO;AAAa;AAAA,QAAU;AACjE,cAAM,UAAU,MAAM,SAAS,MAAM,EAAE,QAAQ,OAAO,EAAE;AACxD,YAAI,CAAC,QAAQ,KAAK,EAAG;AACrB,YAAI;AACJ,YAAI;AAAE,gBAAM,OAAO,KAAK,MAAM,OAAO,CAAC;AAAA,QAAG,QAAQ;AAAE,iBAAO;AAAa;AAAA,QAAU;AACjF,YAAI,CAAC,KAAK;AAAE,iBAAO;AAAa;AAAA,QAAU;AAC1C,YAAI,IAAI,SAAS,cAAe;AAChC,YAAI,CAAC,QAAQ;AACX,cAAI,IAAI,SAAS,WAAW;AAAE,gBAAI,OAAO,IAAI,OAAO,EAAG,QAAO;AAAa;AAAA,UAAU;AACrF,cAAI,CAAC,SAAS,IAAI,EAAE,GAAG;AAAE,mBAAO;AAAa;AAAA,UAAO;AACpD,mBAAS;AACT,sBAAY,IAAI;AAChB,gBAAM,SAAS,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ;AAC5C,cAAI,CAAC,KAAK;AAAE,mBAAO;AAAa;AAAA,UAAO;AACvC,gBAAM,eAAe,QAAQ,UAAU,EAAE,aAAa,KAAK,SAAS,QAAQ,QAAQ,IAAI,EAAE,aAAa,IAAI;AAC3G,uBAAa,yBAAyB,YAAY,EAAE;AACpD,cAAI,QAAQ,UAAU,QAAQ,OAAO,QAAQ,QAAQ,YAAY;AAAE,mBAAO;AAAU;AAAA,UAAO;AAC3F,cAAI,QAAQ,OAAO;AACjB,gBAAI,QAAQ,OAAQ,UAAS,QAAQ;AAAA,qBAC5B,QAAQ,WAAY,UAAS,IAAI,UAAU,EAAE,SAAS,QAAQ,YAAY,SAAS,EAAE,aAAa,IAAI,EAAE,CAAC;AAAA,gBAC7G,UAAS,IAAI,UAAU,EAAE,SAAS,EAAE,aAAa,IAAI,EAAE,CAAC;AAC7D,uBAAW,OAAO;AAClB,qBAAS,KAAK,iBAAiB;AAAA,UACjC,WAAW,QAAQ,OAAQ,YAAW,QAAQ,OAAO;AAAA,eAChD;AACH,kBAAM,SAAS,kBAAkB,QAAQ,YAAY,UAAU;AAC/D,gBAAIG,IAAG,WAAW,MAAM,EAAG,YAAW,KAAK,aAAa,GAAG,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,UACvF;AACA;AAAA,QACF;AACA,YAAI,IAAI,SAAS,aAAa,CAAC,SAAS,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE,KAAM,IAAI,aAAa,QAAQ,IAAI,aAAa,UAAa,OAAO,IAAI,aAAa,UAAW;AAAE,iBAAO;AAAa;AAAA,QAAU;AACrM,cAAM,UAAU,OAAO,IAAI,OAAO;AAClC,YAAI,IAAI,SAAS,cAAc,CAAC,WAAW,CAAC,SAAS,QAAQ,IAAI,IAAI;AAAE,iBAAO;AAAa;AAAA,QAAU;AACrG,YAAI;AACJ,YAAI;AAAE,eAAK,OAAO,IAAI,cAAc,WAAW,IAAI,IAAI,SAAS,IAAI;AAAA,QAAK,QAAQ;AAAE,eAAK;AAAA,QAAK;AAC7F,YAAI,CAAC,OAAO,SAAS,EAAE,GAAG;AAAE,iBAAO;AAAa;AAAA,QAAU;AAC1D,YAAI,CAAC,QAAQ,aAAa,KAAK,OAAO,SAAS,KAAK,OAAO,QAAQ;AAAE,iBAAO;AAAsB;AAAA,QAAU;AAC5G,eAAO;AACP,cAAM,cAAc,oBAAoB,GAAG;AAC3C,cAAM,cAAc,eAAe,GAAG;AACtC,cAAM,WAAW,KAAK,UAAU,CAAC,YAAY,WAAW,IAAI,IAAI,WAAW,CAAC;AAC5E,cAAM,WAA8B,EAAE,YAAY,aAAa,MAAM,YAAY,aAAa,SAAS,SAAS,IAAI,IAAI,YAAY;AACpI,cAAM,YAAY,QAAQ,IAAI,QAAQ,KAAK,UAAU,QAAQ,kGAAkG,EAAE,IAAI,YAAY,WAAW,IAAI,IAAI,WAAW,MAAM;AACrN,YAAI,UAAW,QAAO;AAAA,iBACb,QAAQ;AACf,iBAAO,UAAU;AAAA,YACf;AAAA,YAAY;AAAA,YAAW,SAAS,IAAI;AAAA,YAAI,MAAM,WAAW,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,IAAI;AAAA,YAC/G;AAAA,YAAS;AAAA,YAAa,eAAe,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,YACvF,QAAQ,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,YACxG,GAAI,MAAM,EAAE,aAAa,IAAI,IAAI,CAAC;AAAA,YAAI,WAAW;AAAA,UACnD,CAAC;AACD,iBAAO;AAAA,QACT,WACS,CAAC,UAAW,QAAO;AAC5B,gBAAQ,IAAI,QAAQ;AACpB,YAAI,OAAQ,UAAU,QAAQ,0IAA0I,EACrK,IAAI,YAAY,MAAM,YAAY,SAAS,IAAI,IAAI,WAAW;AACjE,gBAAQ,aAAa,QAAQ;AAAA,MAC/B;AACA,UAAI,CAAC,OAAQ,QAAO;AAAA,IACtB,SAAS,OAAO;AACd,aAAO;AACP,UAAI,QAAQ,WAAY,OAAM;AAAA,IAChC,UAAE;AACA,UAAI,UAAU,WAAW,QAAQ,OAAQ,QAAO,MAAM;AAAA,eAC7C,CAAC,UAAU,YAAY,aAAa,QAAQ,QAAQ,GAAI,UAAS,MAAM;AAAA,IAClF;AAAA,EACF;AACA,SAAO,WAAW,OAAO,UAAU,OAAO,aAAa,OAAO,aAAc,OAAO,uBAAuB,CAAC,QAAQ,2BAA4B,IAAI;AACnJ,SAAO;AACT;;;AChQA,OAAOC,aAAY;AAanB,IAAM,qBAAsC,EAAE,OAAO,OAAO,mBAAmB,aAAa,OAAO,mBAAmB,cAAc,OAAO,mBAAmB,MAAM,OAAO,mBAAmB,QAAQ,OAAO,mBAAmB,cAAc,OAAO,kBAAkB;AAEvQ,IAAMC,QAAO,CAAC,MAAe,eAAe,CAAC;AAC7C,IAAM,QAAQ,CAAI,MAAkB,KAAK,MAAM,OAAO,CAAC,CAAC;AACxD,IAAM,UAAU,CAAC,MAAgB,EAAE;AACnC,IAAM,QAAQ,MAAMC,QAAO,WAAW;AAE/B,IAAM,iBAAN,MAAqB;AAAA,EAU1B,YAA6B,QAAmB,UAAiC,CAAC,GAAG;AAAxD;AAA0D,SAAK,aAAa,OAAO,QAAQ;AAAK,SAAK,MAAM,QAAQ,OAAO,KAAK;AAAK,SAAK,UAAU,QAAQ,WAAWA,QAAO,WAAW;AAAG,SAAK,aAAa,QAAQ,cAAcD,MAAK,eAAe;AAAG,SAAK,UAAU,QAAQ,kBAAkB;AAAI,SAAK,cAAc,QAAQ,uBAAuB;AAAG,SAAK,gBAAgB,QAAQ,iBAAiB;AAAS,SAAK,iBAAiB,QAAQ,kBAAkB;AAAO,SAAK,SAAS,EAAE,GAAG,oBAAoB,GAAG,QAAQ,OAAO;AAAA,EAAG;AAAA,EAT1hB;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,eAAgC;AAAE,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAAG;AAAA,EAC7D,eAAe,WAAoB,eAAqC,QAAwB,QAAQ,GAAc;AACpH,WAAO,KAAK,UAAU,GAAM,EACzB,OAAO,UAAQ,KAAK,UAAU,WAAW,KAAK,cAAc,eAAe,KAAK,eAAe,KAAK,eAC/F,CAAC,aAAa,KAAK,cAAc,eACjC,WAAW,UAAa,KAAK,WAAW,UAAU,KAAK,WAAW,UAClE,CAAC,iBAAiB,KAAK,QAAQ,MAAM,YAAU,cAAc,IAAI,KAAK,UAAU,MAAM,CAAC,CAAC,EAAE,EAC/F,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,SAAS,KAAK,OAAO,cAAc,MAAM,MAAM,CAAC,EACzF,MAAM,GAAG,KAAK;AAAA,EACnB;AAAA,EACA,OAAO,QAAwB;AAC7B,WAAO,KAAK,OAAO,YAAY,QAAM;AACnC,YAAM,MAAM,GAAG,QAAQ,qEAAqE,EAAE,IAAI,QAAQ,KAAK,UAAU;AACzH,UAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,gBAAgB;AACnD,YAAM,OAAO,MAAe,IAAI,OAAO;AACvC,UAAI,KAAK,eAAe,KAAK,WAAY,OAAM,IAAI,MAAM,4CAA4C;AACrG,UAAI,KAAK,cAAc,YAAa,OAAM,IAAI,MAAM,sCAAsC;AAC1F,YAAM,IAAI,KAAK,IAAI;AACnB,YAAM,MAAc,EAAE,GAAG,KAAK,IAAI,IAAI,GAAG,OAAO,eAAe,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,GAAG,WAAW,EAAE;AACpH,SAAG,QAAQ,2GAA2G,EACnH,IAAI,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,UAAU,GAAG,GAAG,IAAI,WAAW,IAAI,SAAS;AAC/F,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EACA,UAAU,QAAQ,KAAgB;AAAE,WAAO,KAAK,OAAO,SAAS,QAAO,GAAG,QAAQ,2FAA2F,EAAE,IAAI,KAAK,YAAY,KAAK,EAA8B,IAAI,OAAK;AAAE,YAAM,OAAO,MAAe,EAAE,OAAO;AAAG,UAAI,KAAK,eAAe,KAAK,WAAY,OAAM,IAAI,MAAM,4CAA4C;AAAG,aAAO;AAAA,IAAM,CAAC,CAAC;AAAA,EAAG;AAAA,EACpZ,QAAQ,QAAqC;AAAE,WAAO,KAAK,OAAO,SAAS,QAAM;AAAE,YAAM,MAAM,GAAG,QAAQ,qEAAqE,EAAE,IAAI,QAAQ,KAAK,UAAU;AAAkC,UAAI,CAAC,KAAK,QAAS,QAAO;AAAW,YAAM,OAAO,MAAe,IAAI,OAAO;AAAG,UAAI,KAAK,eAAe,KAAK,WAAY,OAAM,IAAI,MAAM,4CAA4C;AAAG,aAAO;AAAA,IAAM,CAAC;AAAA,EAAG;AAAA,EACtb,YAAY,WAAoB,QAAwB,eAAgD;AAAE,UAAM,QAAM,KAAK,UAAU,GAAM,EAAE,OAAO,OAAK,EAAE,UAAU,WAAW,EAAE,eAAe,KAAK,eAAe,CAAC,aAAa,EAAE,cAAc,eAAe,WAAW,UAAa,EAAE,WAAW,UAAU,EAAE,WAAW,UAAU,CAAC,iBAAiB,EAAE,QAAQ,MAAM,OAAK,cAAc,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE;AAAI,UAAM,UAAQ,IAAI,IAAI,MAAM,QAAQ,OAAG,EAAE,QAAQ,CAAC;AAAG,WAAO,MAAM,OAAO,OAAG,CAAC,QAAQ,IAAI,EAAE,MAAM,CAAC;AAAA,EAAG;AAAA,EAC9f,SAAS,QAAQ,KAAe;AAAE,WAAO,KAAK,OAAO,SAAS,QAAO,GAAG,QAAQ,6FAA6F,EAAE,IAAI,KAAK,YAAY,KAAK,EAA8B,IAAI,OAAK;AAAE,YAAM,MAAM,MAAc,EAAE,OAAO;AAAG,UAAI,IAAI,eAAe,KAAK,WAAY,OAAM,IAAI,MAAM,2CAA2C;AAAG,aAAO;AAAA,IAAK,CAAC,CAAC;AAAA,EAAG;AAAA,EAC/Y,WAAW,UAAU,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG,QAAoC;AAAE,UAAM,QAAQ,QAAQ,CAAC;AAAG,QAAI,CAAC,MAAO,QAAO,CAAC;AAAG,UAAM,QAAQ,KAAK,UAAU,GAAM,EAAE,OAAO,OAAK,EAAE,UAAU,YAAY,EAAE,eAAe,KAAK,cAAc,EAAE,cAAc,MAAM,cAAc,WAAW,UAAa,EAAE,WAAW,UAAU,EAAE,WAAW,KAAK;AAAG,UAAM,UAAU,IAAI,IAAI,MAAM,QAAQ,OAAK,EAAE,QAAQ,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;AAAG,UAAM,aAAa,QAAQ,OAAO,OAAK,EAAE,cAAc,MAAM,cAAc,WAAW,UAAa,EAAE,WAAW,UAAU,EAAE,WAAW,SAAS,CAAC,QAAQ,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC;AAAG,UAAM,SAAqB,CAAC;AAAG,QAAI,QAAQ;AAAG,eAAW,SAAS,YAAY;AAAE,UAAI,OAAO,UAAU,KAAK,QAAS;AAAO,YAAM,OAAO,MAAM,YAAY;AAAQ,UAAI,OAAO,SAAS,KAAK,QAAQ,OAAO,KAAK,cAAe;AAAO,aAAO,KAAK,KAAK;AAAG,eAAS;AAAA,IAAM;AAAE,WAAO;AAAA,EAAQ;AAAA,EACr4B,mBAAmB,WAAoB,eAAqC,QAAmC;AAAE,UAAM,QAAQ,KAAK,UAAU,GAAM,EAAE,OAAO,OAAK,EAAE,UAAU,WAAW,EAAE,eAAe,KAAK,eAAe,CAAC,aAAa,EAAE,cAAc,eAAe,CAAC,iBAAiB,EAAE,QAAQ,MAAM,OAAK,cAAc,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,WAAW,UAAa,EAAE,WAAW,UAAU,EAAE,WAAW,KAAK;AAAG,UAAM,WAAW,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,MAAM,CAAC;AAAG,UAAM,QAAQ,KAAK,OAAO,SAAS,QAAM,GAAG,QAAQ,8PAA8P,EAAE,IAAI,KAAK,YAAY,KAAK,UAAU,CAA8C;AAAG,UAAM,WAAW,IAAI,IAAI,MAAM,OAAO,OAAK,SAAS,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,OAAK,EAAE,QAAQ,CAAC;AAAG,UAAM,aAAa,MAAM,OAAO,OAAK,CAAC,SAAS,IAAI,EAAE,MAAM,CAAC;AAAG,UAAM,QAAQ,WAAW,CAAC;AAAG,QAAI,CAAC,MAAO,QAAO,CAAC;AAAG,UAAM,QAAQ,KAAK,IAAI,GAAG,WAAW,IAAI,OAAK,EAAE,KAAK,CAAC;AAAG,UAAM,YAAY,WAAW,OAAO,OAAK,EAAE,UAAU,KAAK;AAAG,QAAI,QAAQ,KAAK,UAAU,SAAS,EAAG,QAAO,CAAC;AAAG,WAAO,WAAW,OAAO,OAAK,EAAE,eAAe,MAAM,cAAc,EAAE,cAAc,MAAM,aAAa,EAAE,UAAU,KAAK,EAAE,KAAK,CAAC,GAAE,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,WAAW;AAAA,EAAG;AAAA,EAC35C,WAAW,UAAU,KAAK,WAAW,GAAwB;AAAE,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAAW,UAAM,WAAW,IAAI,IAAI,QAAQ,IAAI,WAAS,MAAM,MAAM,EAAE,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,CAAC;AAAG,QAAI,SAAS,OAAO,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAAG,UAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,CAAC,KAAK;AAAM,UAAM,SAAS,QAAQ,IAAI,CAAC,GAAG,UAAU;AAAE,UAAI,EAAE,eAAe,KAAK,WAAY,OAAM,IAAI,MAAM,6CAA6C;AAAG,YAAM,UAAU,MAAsC,EAAE,WAAW;AAAG,UAAI,OAAO,QAAQ,SAAS,YAAY,CAAC,QAAQ,QAAQ,QAAQ,OAAO,EAAE,QAAS,OAAM,IAAI,MAAM,qBAAqB;AAAG,UAAIA,MAAK,OAAO,MAAM,QAAQ,CAAC,EAAG,OAAM,IAAI,MAAM,uBAAuB;AAAG,aAAO,EAAE,WAAU,EAAE,WAAW,SAAQ,EAAE,SAAS,UAAS,EAAE,UAAU,aAAY,QAAQ,CAAC,EAAE;AAAA,IAAG,CAAC;AAAG,SAAK,gBAAgB,MAAM;AAAG,UAAM,OAAgB,EAAE,QAAO,QAAQA,MAAK,EAAE,YAAW,KAAK,YAAY,QAAQ,QAAQ,YAAW,KAAK,WAAW,CAAC,CAAC,IAAI,YAAW,KAAK,YAAY,WAAU,QAAQ,CAAC,EAAG,WAAW,QAAQ,MAAK,QAAQ,SAAQ,QAAQ,UAAS,CAAC,GAAG,OAAM,GAAG,YAAWA,MAAK,OAAO,IAAI,OAAG,EAAE,WAAW,CAAC,GAAG,YAAW,KAAK,YAAY,WAAU,IAAI,OAAM,WAAW,WAAU,KAAK,IAAI,EAAE;AAAG,SAAK,QAAQ,IAAI;AAAG,WAAO;AAAA,EAAM;AAAA,EAClwC,gBAAgB,WAAW,KAAK,mBAAmB,GAAwB;AAAE,QAAI,CAAC,SAAS,OAAQ,QAAO;AAAW,QAAI,SAAS,KAAK,OAAK,EAAE,UAAU,OAAO,EAAG,OAAM,IAAI,MAAM,sCAAsC;AAAG,QAAI,IAAI,IAAI,SAAS,IAAI,OAAG,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,IAAI,SAAS,IAAI,OAAG,EAAE,KAAK,CAAC,EAAE,SAAS,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAAG,UAAM,iBAAiB,SAAS,IAAI,CAAC,UAAU,KAAK,QAAQ,MAAM,MAAM,CAAC;AAAG,QAAI,eAAe,KAAK,CAAC,UAAU,CAAC,SAAS,MAAM,eAAe,KAAK,UAAU,EAAG,OAAM,IAAI,MAAM,6CAA6C;AAAG,QAAI,eAAe,KAAK,CAAC,OAAO,UAAU,KAAK,UAAU,KAAK,MAAM,KAAK,UAAU,SAAS,KAAK,CAAC,CAAC,EAAG,OAAM,IAAI,MAAM,uBAAuB;AAAG,UAAM,mBAAmB,IAAI,IAAI,eAAe,IAAI,OAAK,EAAG,MAAM,EAAE,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,CAAC;AAAG,QAAI,iBAAiB,OAAO,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAAG,UAAM,SAAS,CAAC,GAAG,gBAAgB,EAAE,CAAC,KAAK;AAAM,UAAM,SAAS,CAAC,GAAG,IAAI,IAAI,eAAe,QAAQ,OAAK,EAAG,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,UAAU,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;AAAG,SAAK,gBAAgB,MAAM;AAAG,UAAM,OAAgB,EAAE,QAAO,aAAaA,MAAK,EAAE,YAAW,KAAK,YAAY,UAAS,eAAe,IAAI,OAAG,EAAG,MAAM,GAAG,QAAQ,YAAW,KAAK,WAAW,CAAC,CAAC,IAAI,YAAW,KAAK,YAAY,WAAU,SAAS,CAAC,EAAG,WAAW,QAAQ,MAAK,aAAa,SAAQ,QAAQ,UAAS,SAAS,IAAI,OAAG,EAAE,MAAM,GAAG,OAAM,KAAK,IAAI,GAAG,SAAS,IAAI,OAAG,EAAE,KAAK,CAAC,IAAE,GAAG,YAAWA,MAAK,SAAS,IAAI,OAAG,EAAE,UAAU,CAAC,GAAG,YAAW,KAAK,YAAY,WAAU,IAAI,OAAM,WAAW,WAAU,KAAK,IAAI,EAAE;AAAG,SAAK,QAAQ,IAAI;AAAG,WAAO;AAAA,EAAM;AAAA,EAC3mD,gBAAgB,QAAwB;AAAE,UAAM,OAAO,oBAAI,IAAY;AAAG,eAAW,KAAK,QAAQ;AAAE,UAAI,KAAK,IAAI,KAAK,UAAU,CAAC,CAAC,EAAG,OAAM,IAAI,MAAM,2BAA2B;AAAG,WAAK,IAAI,KAAK,UAAU,CAAC,CAAC;AAAA,IAAG;AAAE,QAAI,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAG,OAAM,IAAI,MAAM,sBAAsB;AAAA,EAAG;AAAA,EACjT,UAAU,QAAkE;AAAE,WAAO,GAAG,OAAO,SAAS,IAAI,OAAO,OAAO,IAAI,OAAO,QAAQ;AAAA,EAAI;AAAA,EACjJ,QAAQ,MAAe;AAAE,SAAK,OAAO,YAAY,QAAM;AAAE,UAAI,KAAK,SAAS,SAAS,KAAK,MAAM,EAAG,OAAM,IAAI,MAAM,OAAO;AAAG,iBAAW,SAAS,KAAK,SAAU,KAAI,CAAC,GAAG,QAAQ,+DAA+D,EAAE,IAAI,OAAM,KAAK,UAAU,EAAG,OAAM,IAAI,MAAM,eAAe;AAAG,SAAG,QAAQ,6FAA6F,EAAE,IAAI,KAAK,QAAO,KAAK,YAAW,KAAK,UAAU,IAAI,GAAE,KAAK,SAAS;AAAG,iBAAW,SAAS,KAAK,SAAU,IAAG,QAAQ,qEAAqE,EAAE,IAAI,KAAK,QAAO,KAAK;AAAG,YAAM,MAAM,KAAK,IAAI,IAAI;AAAG,SAAG,QAAQ,qHAAqH,EAAE,IAAI,IAAI,OAAM,KAAK,YAAW,IAAI,OAAM,KAAK,UAAU,GAAG,GAAE,IAAI,WAAU,IAAI,SAAS;AAAA,IAAG,CAAC;AAAA,EAAG;AAAA,EACv2B,IAAI,MAAsB;AAAE,UAAM,IAAE,KAAK,IAAI;AAAG,WAAO,EAAC,OAAM,OAAO,KAAK,MAAM,IAAG,YAAW,KAAK,YAAW,QAAO,KAAK,QAAO,UAAS,KAAK,SAAS,cAAc,KAAK,IAAG,YAAW,GAAE,OAAM,WAAU,UAAS,GAAE,aAAY,GAAE,WAAU,GAAE,WAAU,EAAC;AAAA,EAAG;AAAA,EACtQ,MAAM,OAAe,UAAU,KAAK,SAAiB;AAAE,WAAO,KAAK,OAAO,YAAY,QAAM;AAAE,YAAM,MAAM,GAAG,QAAQ,uEAAuE,EAAE,IAAI,OAAM,KAAK,UAAU;AAAkC,UAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,eAAe;AAAG,YAAM,MAAI,MAAc,IAAI,OAAO;AAAG,UAAI,IAAI,eAAe,KAAK,WAAY,OAAM,IAAI,MAAM,2CAA2C;AAAG,YAAM,IAAE,KAAK,IAAI;AAAG,YAAM,UAAU,IAAI,UAAU,cAAc,IAAI,cAAc,MAAM;AAAG,UAAI,IAAI,UAAU,aAAa,CAAC,QAAS,OAAM,IAAI,MAAM,gBAAgB;AAAG,UAAK,IAAI,UAAU,aAAa,CAAC,WAAY,IAAI,aAAa,KAAK,IAAI,cAAc,EAAG,OAAM,IAAI,MAAM,kBAAkB;AAAG,YAAM,SAAU,GAAG,QAAQ,uEAAuE,EAAE,IAAI,KAAK,YAAY,SAAS,EAA8B,IAAI,OAAK,MAAc,EAAE,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,UAAU,IAAI,UAAU,EAAE,cAAc,KAAK,CAAC;AAAG,UAAI,OAAO,OAAQ,OAAM,IAAI,MAAM,oBAAoB;AAAG,YAAM,UAAU,GAAG,QAAQ,qEAAqE,EAAE,IAAI,IAAI,QAAO,KAAK,UAAU;AAAkC,YAAM,YAAY,SAAS,UAAU,MAAe,QAAQ,OAAO,EAAE,YAAY;AAAI,YAAM,MAAM,KAAK,IAAI,CAAC;AAAG,YAAM,eAAe,KAAK,MAAM,IAAI,GAAG;AAAG,YAAM,eAAe,KAAK,MAAM,IAAI,KAAK,SAAS;AAAG,UAAI,aAAa,SAAS,KAAK,OAAO,SAAS,aAAa,eAAe,KAAK,OAAO,eAAe,aAAa,gBAAgB,KAAK,OAAO,gBAAgB,aAAa,QAAQ,KAAK,OAAO,QAAQ,aAAa,UAAU,KAAK,OAAO,UAAU,aAAa,SAAS,KAAK,OAAO,aAAc,OAAM,IAAI,MAAM,kBAAkB;AAAG,YAAM,MAAI,EAAC,GAAG,KAAI,OAAM,WAAmB,SAAQ,YAAW,MAAM,GAAE,YAAW,IAAE,KAAO,WAAU,EAAC;AAAG,SAAG,QAAQ,8FAA8F,EAAE,IAAI,IAAI,OAAM,KAAK,UAAU,GAAG,GAAE,GAAE,OAAM,KAAK,UAAU;AAAG,aAAO;AAAA,IAAK,CAAC;AAAA,EAAG;AAAA,EACl/D,eAAe,OAAe,UAAU,KAAK,SAAiB;AAAE,WAAO,KAAK,OAAO,YAAY,QAAM;AAAE,YAAM,MAAM,GAAG,QAAQ,uEAAuE,EAAE,IAAI,OAAM,KAAK,UAAU;AAAkC,UAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,eAAe;AAAG,YAAM,MAAM,MAAc,IAAI,OAAO;AAAG,UAAI,IAAI,eAAe,KAAK,WAAY,OAAM,IAAI,MAAM,2CAA2C;AAAG,YAAM,IAAI,KAAK,IAAI;AAAG,YAAM,UAAU,IAAI,UAAU,cAAc,IAAI,cAAc,MAAM;AAAG,UAAI,IAAI,UAAU,aAAa,CAAC,QAAS,OAAM,IAAI,MAAM,gBAAgB;AAAG,UAAI,IAAI,UAAU,YAAa,OAAM,IAAI,MAAM,uBAAuB;AAAG,YAAM,MAAM,EAAE,GAAG,KAAK,OAAO,WAAoB,SAAS,YAAY,MAAM,GAAG,YAAY,IAAI,KAAQ,WAAW,EAAE;AAAG,SAAG,QAAQ,8FAA8F,EAAE,IAAI,IAAI,OAAM,KAAK,UAAU,GAAG,GAAE,GAAE,OAAM,KAAK,UAAU;AAAG,aAAO;AAAA,IAAK,CAAC;AAAA,EAAG;AAAA,EACr+B,MAAM,KAAoB;AAAE,WAAO,KAAK,OAAO,KAAK,UAAQ,EAAC,GAAG,KAAI,YAAW,KAAK,IAAI,IAAE,KAAO,WAAU,KAAK,IAAI,EAAC,EAAE;AAAA,EAAG;AAAA,EAClH,aAAa,MAAuC;AAAE,QAAI,OAAO,SAAS,YAAY,KAAK,WAAW,EAAG,OAAM,IAAI,MAAM,sBAAsB;AAAG,QAAI,SAAS;AAAG,eAAW,KAAK,MAAM;AAAE,gBAAU;AAAG,UAAI,SAAS,KAAK,eAAgB,OAAM,IAAI,MAAM,8BAA8B;AAAA,IAAG;AAAA,EAAE;AAAA,EACpS,SAAS,KAAY,QAAgC;AAAE,SAAK,aAAa,OAAO,IAAI;AAAG,WAAO,KAAK,OAAO,YAAY,QAAM;AAAE,YAAM,UAAQ,KAAK,QAAQ,IAAG,IAAI,KAAK;AAAG,WAAK,YAAY,SAAQ,GAAG;AAAG,UAAI,QAAQ,WAAW,IAAI,OAAQ,OAAM,IAAI,MAAM,mBAAmB;AAAG,YAAM,MAAI,GAAG,QAAQ,qEAAqE,EAAE,IAAI,IAAI,QAAO,KAAK,UAAU;AAAkC,UAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,gBAAgB;AAAG,YAAM,OAAK,MAAe,IAAI,OAAO;AAAG,UAAI,KAAK,eAAe,KAAK,cAAc,KAAK,WAAW,QAAQ,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAAG,iBAAW,UAAU,KAAK,SAAS;AAAE,cAAM,MAAI,GAAG,QAAQ,oHAAoH,EAAE,IAAI,KAAK,YAAW,OAAO,WAAU,OAAO,SAAQ,OAAO,QAAQ;AAA0D,YAAI,CAAC,KAAK,gBAAgBA,MAAK,MAAM,IAAI,YAAY,CAAC,MAAM,OAAO,eAAe,IAAI,eAAe,OAAO,UAAW,OAAM,IAAI,MAAM,cAAc;AAAA,MAAG;AAAE,UAAI,CAAC,CAAC,OAAO,aAAY,OAAO,cAAa,OAAO,MAAK,OAAO,MAAM,EAAE,MAAM,CAAC,UAAU,OAAO,SAAS,KAAK,KAAK,SAAS,CAAC,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAAG,YAAM,eAAe,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAAG,YAAM,eAAe,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS;AAAG,UAAI,aAAa,QAAQ,IAAI,KAAK,OAAO,SAAS,aAAa,cAAc,OAAO,cAAc,KAAK,OAAO,eAAe,aAAa,eAAe,OAAO,eAAe,KAAK,OAAO,gBAAgB,aAAa,OAAO,OAAO,OAAO,KAAK,OAAO,QAAQ,aAAa,SAAS,OAAO,SAAS,KAAK,OAAO,UAAU,aAAa,QAAQ,IAAI,KAAK,OAAO,aAAc,OAAM,IAAI,MAAM,kBAAkB;AAAG,YAAM,MAAI,EAAC,GAAG,MAAK,OAAM,SAAiB,MAAK,OAAO,MAAK,WAAU,OAAO,UAAS;AAAG,WAAK,QAAQ,IAAG,KAAK,WAAU,MAAM;AAAG,SAAG,QAAQ,sEAAsE,EAAE,IAAI,KAAK,UAAU,GAAG,GAAE,KAAK,QAAO,KAAK,UAAU;AAAG,YAAM,EAAE,SAAS,UAAU,YAAY,aAAa,YAAY,aAAa,GAAG,KAAK,IAAI;AAAS,YAAM,OAAK,EAAC,GAAG,MAAK,OAAM,aAAqB,WAAU,KAAK,IAAI,EAAC;AAAG,SAAG,QAAQ,8FAA8F,EAAE,IAAI,KAAK,OAAM,KAAK,UAAU,IAAI,GAAE,KAAK,WAAU,KAAK,OAAM,KAAK,UAAU;AAAG,aAAO;AAAA,IAAK,CAAC;AAAA,EAAG;AAAA,EAC15E,kBAAkB,KAAY,MAAsB;AAAE,SAAK,aAAa,IAAI;AAAG,WAAO,KAAK,OAAO,YAAY,QAAM;AAAE,YAAM,UAAQ,KAAK,QAAQ,IAAG,IAAI,KAAK;AAAG,WAAK,YAAY,SAAQ,GAAG;AAAG,UAAI,QAAQ,WAAW,IAAI,OAAQ,OAAM,IAAI,MAAM,mBAAmB;AAAG,YAAM,MAAI,GAAG,QAAQ,qEAAqE,EAAE,IAAI,IAAI,QAAO,KAAK,UAAU;AAAkC,UAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,gBAAgB;AAAG,YAAM,OAAK,MAAe,IAAI,OAAO;AAAG,UAAI,KAAK,eAAe,KAAK,cAAc,KAAK,WAAW,QAAQ,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAAG,iBAAW,UAAU,KAAK,SAAS;AAAE,cAAM,MAAI,GAAG,QAAQ,oHAAoH,EAAE,IAAI,KAAK,YAAW,OAAO,WAAU,OAAO,SAAQ,OAAO,QAAQ;AAA0D,YAAI,CAAC,KAAK,gBAAgBA,MAAK,MAAM,IAAI,YAAY,CAAC,MAAM,OAAO,eAAe,IAAI,eAAe,OAAO,UAAW,OAAM,IAAI,MAAM,cAAc;AAAA,MAAG;AAAE,YAAM,MAAI,EAAC,GAAG,MAAK,OAAM,SAAiB,MAAK,WAAU,YAAW;AAAG,SAAG,QAAQ,sEAAsE,EAAE,IAAI,KAAK,UAAU,GAAG,GAAE,KAAK,QAAO,KAAK,UAAU;AAAG,YAAM,EAAE,SAAS,UAAU,YAAY,aAAa,YAAY,aAAa,GAAG,KAAK,IAAI;AAAS,YAAM,OAAK,EAAC,GAAG,MAAK,OAAM,aAAqB,WAAU,KAAK,IAAI,EAAC;AAAG,SAAG,QAAQ,8FAA8F,EAAE,IAAI,KAAK,OAAM,KAAK,UAAU,IAAI,GAAE,KAAK,WAAU,KAAK,OAAM,KAAK,UAAU;AAAG,aAAO;AAAA,IAAK,CAAC;AAAA,EAAG;AAAA,EACtpD,KAAK,KAAW,OAAsB;AAAE,WAAO,KAAK,OAAO,KAAK,SAAO;AAAE,YAAM,WAAS,IAAI,WAAS;AAAG,YAAM,QAAM,KAAK,IAAI,KAAQ,MAAO,MAAI,WAAS,EAAE;AAAG,YAAM,EAAE,SAAS,UAAU,YAAY,aAAa,YAAY,aAAa,GAAG,KAAK,IAAI;AAAK,aAAO,EAAC,GAAG,MAAK,UAAS,OAAM,OAAM,YAAU,IAAE,WAAS,WAAU,YAAW,KAAK,IAAI,IAAE,OAAM,aAAY,KAAK,IAAI,IAAE,OAAM,WAAU,KAAK,IAAI,EAAC;AAAA,IAAG,CAAC;AAAA,EAAG;AAAA,EACpZ,MAAM,IAAI,KAAY,OAAqB,OAAc,SAAO,IAAI,gBAAgB,EAAE,QAA0B;AAAE,QAAI,UAA0B,CAAC;AAAG,QAAI;AAA6B,UAAM,aAAa,IAAI,gBAAgB;AAAG,QAAI;AAAmD,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAM;AAAG,UAAM,QAAQ,MAAM,WAAW,MAAM;AAAG,WAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAG,QAAI;AAAE,gBAAQ,KAAK,MAAM,IAAI,OAAM,IAAI,WAAW,KAAK,OAAO;AAAG,YAAM,OAAK,KAAK,QAAQ,QAAQ,MAAM;AAAG,gBAAQ,MAAM,WAAW,CAAC;AAAG,cAAQ,YAAY,MAAM;AAAE,YAAI;AAAE,cAAI,QAAS,WAAU,KAAK,MAAM,OAAO;AAAA,QAAG,QAAQ;AAAA,QAAC;AAAA,MAAE,GAAG,GAAM;AAAG,YAAM,SAAO,MAAM,QAAQ,KAAK,CAAC,MAAM,SAAS,EAAC,QAAO,eAAe,MAAM,QAAQ,QAAO,OAAM,KAAK,aAAa,GAAE,WAAU,MAAM,aAAa,IAAG,QAAO,WAAW,OAAM,CAAC,GAAG,IAAI,QAAe,CAAC,GAAG,WAAW,WAAW,OAAO,iBAAiB,SAAS,MAAM,OAAO,IAAI,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;AAAG,aAAO,KAAK,SAAS,SAAQ,MAAM;AAAA,IAAG,SAAS,OAAO;AAAE,UAAI,CAAC,QAAS,OAAM;AAAO,YAAM,WAAS,gBAAgB,OAAM,KAAK,gBAAe,OAAO;AAAG,UAAI;AAAE,eAAO,KAAK,kBAAkB,SAAQ,QAAQ;AAAA,MAAG,QAAQ;AAAE,YAAI;AAAE,eAAK,KAAK,SAAQ,OAAO,KAAK,CAAC;AAAA,QAAG,QAAQ;AAAA,QAAC;AAAE,cAAM;AAAA,MAAO;AAAA,IAAE,UAAE;AAAU,mBAAa,KAAK;AAAG,UAAI,MAAO,eAAc,KAAK;AAAG,aAAO,oBAAoB,SAAS,KAAK;AAAA,IAAG;AAAA,EAAE;AAAA,EAC51C,IAAI,IAAmB;AAAE,WAAO,IAAI,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,GAAE,EAAE;AAAA,EAAG;AAAA,EACxE,MAAM,IAAQ,KAAY,WAA8B;AAAE,UAAM,IAAI,cAAc,SAAY,8OAA8O;AAA8P,UAAM,IAAG,cAAc,SAAY,GAAG,QAAQ,CAAC,EAAE,IAAI,KAAK,YAAW,GAAG,IAAI,GAAG,QAAQ,CAAC,EAAE,IAAI,KAAK,YAAW,KAAI,SAAS;AAAiB,WAAO;AAAA,EAAG;AAAA,EAChuB,QAAQ,IAAQ,WAAkB,QAAuB;AAAE,UAAM,IAAE,KAAK,IAAI,KAAK,IAAI,CAAC;AAAG,OAAG,QAAQ,8WAA8W,EAAE,IAAI,KAAK,YAAW,GAAE,WAAU,GAAE,OAAO,aAAY,OAAO,cAAa,OAAO,MAAK,OAAO,MAAM;AAAA,EAAG;AAAA,EACzjB,QAAQ,IAAQ,IAAkB;AAAE,UAAM,MAAI,GAAG,QAAQ,uEAAuE,EAAE,IAAI,IAAG,KAAK,UAAU;AAAiC,QAAG,CAAC,IAAK,OAAM,IAAI,MAAM,eAAe;AAAG,UAAM,MAAI,MAAc,IAAI,OAAO;AAAG,QAAG,IAAI,eAAa,KAAK,WAAY,OAAM,IAAI,MAAM,2CAA2C;AAAG,WAAO;AAAA,EAAK;AAAA,EACzX,YAAY,SAAgB,UAAiB;AAAE,QAAG,QAAQ,YAAU,SAAS,WAAW,QAAQ,eAAa,SAAS,cAAc,QAAQ,UAAQ,cAAc,QAAQ,cAAY,KAAG,KAAK,IAAI,EAAG,OAAM,IAAI,MAAM,cAAc;AAAA,EAAG;AAAA,EACtO,OAAO,KAAY,QAAoC;AAAE,WAAO,KAAK,OAAO,YAAY,QAAM;AAAE,YAAM,MAAI,KAAK,QAAQ,IAAG,IAAI,KAAK;AAAG,WAAK,YAAY,KAAI,GAAG;AAAG,YAAM,MAAI,OAAO,GAAG;AAAG,SAAG,QAAQ,8FAA8F,EAAE,IAAI,IAAI,OAAM,KAAK,UAAU,GAAG,GAAE,IAAI,WAAU,IAAI,OAAM,KAAK,UAAU;AAAG,aAAO;AAAA,IAAK,CAAC;AAAA,EAAG;AACzY;;;ACzCO,IAAM,aAAN,MAAiB;AAAA,EACb;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA,QAAQ,IAAI,gBAAgB;AAAA,EACrC,eAA8B,QAAQ,QAAQ;AAAA,EAC9C,qBAAoC,QAAQ,QAAQ;AAAA,EACpD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR;AAAA,EACA,gBAAgB,oBAAI,IAAY;AAAA,EAChC;AAAA,EAER,YAAY,SAA2B,UAAyD,CAAC,GAAG;AAClG,SAAK,UAAU;AACf,SAAK,iBAAiB,OAAO,YAAY,aAAa,UAAU,MAAM;AACtE,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,WAAW,QAAQ,eAAe,iBAAiB;AACzD,UAAM,UAAU,YAAY,QAAQ;AACpC,UAAM,UAAU,yBAAyB,EAAE,QAAQ,CAAC;AACpD,UAAM,gBAAgB,QAAQ,YAAY,SACtC,EAAE,SAAS,EAAE,SAAS,QAAQ,iBAAiB,QAAQ,EAAE,IACzD,EAAE,SAAS,QAAQ,SAAS,SAAS,EAAE,SAAS,QAAQ,iBAAiB,QAAQ,EAAE;AACvF,SAAK,SAAS,IAAI,UAAU,aAAa;AACzC,SAAK,cAAc,IAAI,eAAe,KAAK,QAAQ;AAAA,MACjD,GAAG;AAAA,MACH,GAAI,QAAQ,qBAAqB,SAAY,CAAC,IAAI,EAAE,eAAe,QAAQ,iBAAiB;AAAA,MAC5F,GAAI,QAAQ,sBAAsB,SAAY,CAAC,IAAI,EAAE,gBAAgB,QAAQ,kBAAkB;AAAA,MAC/F,QAAQ;AAAA,QACN,GAAI,QAAQ,qBAAqB,EAAE,OAAO,QAAQ,mBAAmB,IAAI,CAAC;AAAA,QAC1E,GAAI,QAAQ,uBAAuB,EAAE,cAAc,QAAQ,qBAAqB,IAAI,CAAC;AAAA,QACrF,GAAI,QAAQ,uBAAuB,EAAE,QAAQ,QAAQ,uBAAuB,IAAM,IAAI,CAAC;AAAA,MACzF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,IAAY,UAA6B;AAAE,WAAO,KAAK,eAAe;AAAA,EAAG;AAAA,EAEzE,IAAI,aAAqB;AAAE,WAAO,KAAK,OAAO,QAAQ;AAAA,EAAK;AAAA,EAC3D,IAAI,SAAsB;AAAE,WAAO,KAAK,MAAM;AAAA,EAAQ;AAAA,EACtD,IAAI,SAAiC;AAAE,WAAO,KAAK,kBAAkB,SAAY,YAAY;AAAA,EAAY;AAAA,EACzG,IAAI,QAAiB;AAAE,WAAO,KAAK;AAAA,EAAe;AAAA,EAClD,YAAkB;AAAE,SAAK,QAAQ;AAAA,EAAM;AAAA,EAE/B,aAAa,WAAsD;AACzE,UAAM,MAAM,KAAK,aAAa,KAAK,SAAS;AAC5C,SAAK,eAAe,IAAI,MAAM,CAAC,UAAU;AAAE,WAAK,gBAAgB;AAAA,IAAO,CAAC;AACxE,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,WAAmB,SAA0C;AACxF,UAAM,MAAM,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AACpD,UAAM,SAAS,oBAAI,IAAsB;AACzC,eAAW,SAAS,KAAK,OAAO,QAAQ,KAAK,YAAY,SAAS,GAAG;AACnE,UAAI,CAAC,IAAI,IAAI,MAAM,OAAO,EAAG;AAC7B,YAAM,WAAW,OAAO,IAAI,MAAM,OAAO;AACzC,UAAI,CAAC,YAAY,SAAS,WAAW,MAAM,SAAU,QAAO,IAAI,MAAM,SAAS,KAAK;AAAA,IACtF;AACA,SAAK,gBAAgB,IAAI;AAAA,MACvB,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,SAAS,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,EAAE;AAAA,IAC7F;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,2BAA0C;AACxC,QAAI,KAAK,OAAQ,QAAO,QAAQ,QAAQ;AACxC,WAAO,KAAK,aAAa,MAAM;AAC7B,YAAM,iBAAiB,KAAK,QAAQ,eAAe;AACnD,UAAI,OAAO,mBAAmB,WAAY;AAC1C,YAAM,cAAc,eAAe,KAAK,KAAK,QAAQ,cAAc;AACnE,UAAI,CAAC,YAAa;AAClB,YAAM,WAAW,KAAK,QAAQ,eAAe,iBAAiB;AAC9D,YAAM,MAAM,YAAY,KAAK,QAAQ;AACrC,YAAM,SAAS,iBAAiB;AAAA,QAC9B,UAAU,KAAK,QAAQ,WAAW,QAAQ,IAAI,uBAAuB,GAAG,QAAQ,IAAI,QAAQ,GAAG;AAAA,QAC/F,QAAQ,KAAK;AAAA,QACb,OAAO,CAAC,WAAW;AAAA,QACnB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,MACT,CAAC;AACD,WAAK,gBAAgB,OAAO,OAAO,SAAS,IACxC,IAAI,MAAM,uCAAuC,OAAO,OAAO,MAAM,WAAW,IAChF;AACJ,YAAM,YAAY,KAAK,QAAQ,eAAe,aAAa;AAC3D,WAAK,qBAAqB,WAAW,KAAK,QAAQ,eAAe,UAAU,CAAC;AAAA,IAC9E,CAAC;AAAA,EACH;AAAA,EAEA,WAA0B;AACxB,QAAI,KAAK,OAAQ,QAAO,QAAQ,QAAQ;AACxC,WAAO,KAAK,aAAa,MAAM;AAC7B,UAAI,KAAK,OAAQ;AACjB,YAAM,UAAU,KAAK,QAAQ,eAAe,UAAU;AACtD,YAAM,YAAY,KAAK,QAAQ,eAAe,aAAa;AAC3D,YAAM,SAAS,KAAK,QAAQ,eAAe,UAAU;AACrD,YAAM,WAAW,KAAK,QAAQ,eAAe,iBAAiB;AAC9D,YAAM,SAAS,oBAAI,IAAY;AAC/B,iBAAW,SAAS,SAAS;AAC3B,cAAM,cAAc,oBAAoB,KAAK;AAC7C,cAAM,UAAU,MAAM,SAAS,YAAY,MAAM,UAAkD;AACnG,cAAM,SAAS,KAAK,OAAO,UAAU;AAAA,UACnC,YAAY,KAAK;AAAA,UACjB;AAAA,UACA,SAAS,MAAM;AAAA,UACf,MAAM,SAAS,QAAQ,MAAM;AAAA,UAC7B,SAAS,UAAU,KAAK,UAAU,QAAQ,WAAW,EAAE,IAAI;AAAA,UAC3D;AAAA,UACA,eAAe,MAAM,YAAY;AAAA,UACjC;AAAA,UACA,GAAI,YAAY,KAAK,QAAQ,MAAM,EAAE,aAAa,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,QACtF,CAAC;AACD,eAAO,IAAI,GAAG,SAAS,IAAI,OAAO,OAAO,IAAI,OAAO,QAAQ,EAAE;AAAA,MAChE;AACA,WAAK,gBAAgB;AACrB,WAAK,kBAAkB;AACvB,WAAK,QAAQ;AACb,WAAK,gBAAgB;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAiC;AACrC,QAAI,KAAK,OAAQ;AACjB,UAAM,KAAK,SAAS;AACpB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAA0B;AAAE,WAAO,KAAK,gBAAgB;AAAA,EAAG;AAAA,EAE3D,sBAA4B;AAC1B,QAAI,KAAK,OAAQ;AACjB,UAAM,MAAM,KAAK,mBAAmB,KAAK,MAAM,KAAK,eAAe,CAAC;AACpE,SAAK,qBAAqB,IAAI,MAAM,CAAC,UAAU;AAAE,WAAK,gBAAgB;AAAA,IAAO,CAAC;AAAA,EAChF;AAAA,EAEA,MAAc,iBAAgC;AAC5C,QAAI,KAAK,UAAU,CAAC,KAAK,mBAAmB,KAAK,cAAc,SAAS,EAAG;AAC3E,UAAM,aAAa,KAAK,QAAQ,mBAAmB;AACnD,QAAI;AACJ,QAAI;AACF,UAAI,CAAC,WAAY,OAAM,IAAI,MAAM,+CAA+C;AAChF,cAAQ,IAAI,gBAAgB,KAAK,SAAS,KAAK,QAAQ,cAAc,MAAM;AAAA,QACzE,GAAI,KAAK,QAAQ,qBAAqB,SAAY,CAAC,IAAI,EAAE,eAAe,KAAK,QAAQ,iBAAiB;AAAA,QACtG,GAAI,KAAK,QAAQ,uBAAuB,SAAY,CAAC,IAAI,EAAE,iBAAiB,KAAK,QAAQ,mBAAmB;AAAA,QAC5G,GAAI,KAAK,QAAQ,sBAAsB,SAAY,CAAC,IAAI,EAAE,gBAAgB,KAAK,QAAQ,kBAAkB;AAAA,MAC3G,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,gBAAgB;AACrB,cAAQ,EAAE,WAAW,eAAe,UAAU,YAAY;AAAE,cAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MAAG,EAAE;AAAA,IACjI;AACA,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,uBAAuB,CAAC;AAC/D,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,QAAQ,wBAAwB,CAAC;AACjE,UAAM,cAAc,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,QAAQ,yBAAyB,EAAE,IAAI;AACzF,UAAM,YAAY,KAAK;AACvB,UAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,YAAY,SAAS,EAAE;AAAA,MAAO,CAAC,UAClE,KAAK,cAAc,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,EAAE;AAAA,IAChF;AACA,UAAM,WAAW,CAAC,SAAqE;AACrF,UAAI,KAAK,SAAS,YAAa,QAAO,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,YAAY,QAAQ,EAAE,GAAG,QAAQ,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,MAAM;AACrI,aAAO,KAAK,QAAQ,IAAI,CAAC,WAAW;AAClC,cAAM,QAAQ,KAAK,OAAO,aAAa,KAAK,YAAY,OAAO,WAAW,OAAO,SAAS,OAAO,QAAQ;AACzG,YAAI,CAAC,SAAS,MAAM,gBAAgB,OAAO,YAAa,OAAM,IAAI,MAAM,cAAc;AACtF,eAAO,MAAM;AAAA,MACf,CAAC,EAAE,KAAK,IAAI;AAAA,IACd;AACA,UAAM,SAAS,OAAO,KAAa,SAAiC;AAClE,UAAI;AAAE,cAAM,KAAK,YAAY,IAAI,KAAK,OAAO,SAAS,IAAI,GAAG,KAAK,MAAM;AAAA,MAAG,QAAQ;AAAA,MAAC;AAAA,IACtF;AACA,aAAS,OAAO,GAAG,OAAO,UAAU,CAAC,KAAK,UAAU,KAAK,IAAI,IAAI,aAAa,QAAQ,GAAG;AACvF,YAAM,gBAAgB,KAAK,YAAY,WAAW,KAAK,YAAY,WAAW,KAAK,KAAK,QAAQ,eAAe,UAAU,CAAC,CAAC;AAC3H,YAAM,OAAO,gBAAgB,KAAK,YAAY,QAAQ,cAAc,MAAM,IAAI;AAC9E,UAAI,MAAM,UAAU,WAAW;AAC7B,cAAM,MAAM,KAAK,YAAY,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM;AAClF,YAAI,IAAK,OAAM,OAAO,KAAK,IAAI;AAAA,MACjC;AACA,YAAM,SAAS,KAAK,QAAQ,eAAe,UAAU;AACrD,YAAM,UAAU,KAAK,YAAY,SAAS,EAAE,OAAO,CAAC,QAAQ,IAAI,UAAU,SAAS,EAAE,QAAQ,CAAC,QAAQ;AACpG,cAAM,OAAO,KAAK,YAAY,QAAQ,IAAI,MAAM;AAChD,YAAI,CAAC,QAAQ,KAAK,cAAc,aAAc,WAAW,QAAQ,KAAK,WAAW,UAAU,KAAK,WAAW,QAAS,CAAC,KAAK,QAAQ,MAAM,CAAC,WAAW,KAAK,cAAc,IAAI,GAAG,OAAO,SAAS,IAAI,OAAO,OAAO,IAAI,OAAO,QAAQ,EAAE,CAAC,EAAG,QAAO,CAAC;AACjP,eAAO,CAAC,EAAE,KAAK,KAAK,CAAC;AAAA,MACvB,CAAC,EAAE,MAAM,GAAG,MAAM;AAClB,iBAAW,QAAQ,QAAS,OAAM,OAAO,KAAK,KAAK,KAAK,IAAI;AAC5D,YAAM,WAAW,KAAK,YAAY,mBAAmB,WAAW,KAAK,eAAe,KAAK,QAAQ,eAAe,UAAU,CAAC;AAC3H,UAAI,SAAS,UAAU,OAAO;AAC5B,cAAM,OAAO,KAAK,YAAY,gBAAgB,QAAQ;AACtD,YAAI,MAAM;AACR,gBAAM,MAAM,KAAK,YAAY,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM;AAClF,cAAI,IAAK,OAAM,OAAO,KAAK,IAAI;AAAA,QACjC;AAAA,MACF;AACA,UAAI,CAAC,QAAQ,QAAQ,WAAW,KAAK,SAAS,SAAS,OAAO;AAC5D,cAAM,WAAW,KAAK,YAAY,eAAe,WAAW,KAAK,eAAe,KAAK,QAAQ,eAAe,UAAU,GAAG,CAAC;AAC1H,cAAM,UAAU,SAAS,CAAC;AAC1B,YAAI,CAAC,QAAS;AACd,cAAM,MAAM,KAAK,YAAY,OAAO,QAAQ,MAAM;AAClD,cAAM,OAAO,KAAK,OAAO;AACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,OAAgD;AACtD,UAAM,mBAAmB,oBAAI,IAAsB;AACnD,eAAW,SAAS,MAAM,eAAe;AACvC,YAAM,UAAU,MAAM,SAAS,YAAY,MAAM,UAAkD;AACnG,YAAM,cAAc,oBAAoB,KAAK;AAC7C,YAAM,SAAS,KAAK,OAAO,UAAU;AAAA,QACnC,YAAY,KAAK;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,SAAS,MAAM;AAAA,QACf,MAAM,SAAS,QAAQ,MAAM;AAAA,QAC7B,SAAS,UAAU,KAAK,UAAU,QAAQ,WAAW,EAAE,IAAI;AAAA,QAC3D;AAAA,QACA,eAAe,MAAM,YAAY;AAAA,QACjC,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,uBAAiB,IAAI,GAAG,MAAM,EAAE,IAAI,OAAO,WAAW,IAAI,MAAM;AAAA,IAClE;AACA,UAAM,iBAAiB,MAAM,mBACzB,MAAM,cAAc,UAAU,CAAC,UAAU,MAAM,OAAO,MAAM,gBAAgB,IAC5E,MAAM,cAAc;AACxB,UAAM,gBAAgB,MAAM,cAAc,MAAM,GAAG,iBAAiB,IAAI,MAAM,cAAc,SAAS,cAAc;AACnH,UAAM,iBAAiB,cAAc,IAAI,CAAC,UAAU;AAClD,YAAM,cAAc,eAAe,KAAK,MAAM,oBAAoB,KAAK,CAAC,CAAC;AACzE,YAAM,SAAS,iBAAiB,IAAI,GAAG,MAAM,EAAE,IAAI,WAAW,EAAE;AAChE,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAClE,aAAO;AAAA,IACT,CAAC;AACD,UAAM,gBAAgB,IAAI,IAAI,eAAe,IAAI,CAAC,UAAU,GAAG,MAAM,SAAS,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,EAAE,CAAC;AACpH,UAAM,WAAW,KAAK,YAAY,YAAY,MAAM,WAAW,MAAM,QAAQ,aAAa;AAC1F,UAAM,iBAAiB,IAAI,IAAI,SAAS,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW,GAAG,OAAO,SAAS,IAAI,OAAO,OAAO,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;AACnJ,UAAM,UAAU,SAAS,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,MAAM;AACnF,QAAI,WAAW,eAAe,MAAM,CAAC,UAAU,eAAe,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,EAAE,CAAC,EAAG,QAAO,EAAE,SAAS,kBAAkB,MAAM,kBAAkB,cAAc,MAAM,cAAc,QAAQ,kBAAkB,QAAQ,MAAM,OAAO;AAC1Q,QAAI,eAAe,WAAW,EAAG,OAAM,IAAI,MAAM,iDAAiD;AAClG,UAAM,WAAW,cAAc,IAAI,CAAC,UAAU,oBAAoB,KAAK,CAAC,EAAE,KAAK,IAAI;AACnF,UAAM,UAAU,eAAe,IAAI,CAAC,YAAY,EAAE,WAAW,OAAO,WAAW,SAAS,OAAO,SAAS,UAAU,OAAO,UAAU,aAAa,OAAO,YAAY,EAAE;AACrK,UAAM,WAAW,gBAAgB,UAAU,KAAK,QAAQ,qBAAqB,MAAO,OAAO;AAC3F,UAAM,OAAO,KAAK,YAAY,WAAW,cAAc;AACvD,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,6CAA6C;AACxE,UAAM,YAAY,KAAK,YAAY,QAAQ,KAAK,MAAM;AACtD,QAAI,WAAW,UAAU,SAAS;AAChC,UAAI,UAAU,WAAW,MAAM,UAAU,KAAK,UAAU,UAAU,OAAO,MAAM,KAAK,UAAU,OAAO,EAAG,OAAM,IAAI,MAAM,4CAA4C;AACpK,UAAI,CAAC,UAAU,KAAM,OAAM,IAAI,MAAM,wCAAwC;AAC7E,aAAO,EAAE,SAAS,UAAU,MAAM,kBAAkB,MAAM,kBAAkB,cAAc,MAAM,cAAc,QAAQ,aAAa,QAAQ,MAAM,OAAO;AAAA,IAC1J;AACA,UAAM,MAAM,KAAK,YAAY,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM;AAClF,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,4CAA4C;AACtE,UAAM,YAAY,KAAK,YAAY,kBAAkB,KAAK,YAAY,eAAe,IAAI,KAAK,GAAG,QAAQ;AACzG,WAAO,EAAE,SAAS,UAAU,QAAQ,UAAU,kBAAkB,MAAM,kBAAkB,cAAc,MAAM,cAAc,QAAQ,aAAa,QAAQ,MAAM,OAAO;AAAA,EACtK;AAAA,EAEA,SAAoB;AAClB,UAAM,MAAM,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC1D,WAAO,KAAK,OAAO,SAAS,CAAC,OAAO;AAClC,YAAM,QAAQ,CAAC,QAAgB,WAC7B,OAAQ,GAAG,QAAQ,GAAG,EAAE,IAAI,GAAG,MAAM,EAAoB,CAAC;AAC5D,YAAM,QAAQ,GAAG,QAAQ,6MAA6M,EACnO,IAAI,KAAK,UAAU;AACtB,YAAM,QAAQ,GAAG,QAAQ,mOAAmO,EACzP,IAAI,KAAK,YAAY,GAAG;AAC3B,YAAM,SAAS,KAAK,YAAY,aAAa;AAC7C,aAAO;AAAA,QACL,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU,KAAK,kBAAkB,SAAY,SAAY,OAAO,KAAK,yBAAyB,QAAQ,KAAK,cAAc,UAAU,KAAK,aAAa;AAAA,QACrJ,cAAc,KAAK,QAAQ;AAAA,QAC3B,YAAY,MAAM,0DAA0D,KAAK,UAAU;AAAA,QAC3F,gBAAgB,KAAK,oBAAoB,SAAY,IAAI,MAAM,2EAA2E,KAAK,YAAY,KAAK,eAAe;AAAA,QAC/K,YAAY,MAAM,OAAO,CAAC,QAAQ,IAAI,SAAS,IAAI,UAAU,WAAW,EAAE,OAAO,CAAC,OAAO,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAAA,QACjH,gBAAgB,MAAM,OAAO,CAAC,QAAQ,IAAI,UAAU,WAAW,EAAE,OAAO,CAAC,OAAO,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAAA,QACxG,cAAc,MAAM,OAAO,CAAC,QAAQ,IAAI,UAAU,OAAO,EAAE,OAAO,CAAC,OAAO,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAAA,QAClG,aAAa,MAAM,4EAA4E,KAAK,YAAY,SAAS;AAAA,QACzH,iBAAiB,MAAM,sGAAsG,KAAK,YAAY,WAAW;AAAA,QACzJ,OAAO,EAAE,OAAO,MAAM,OAAO,aAAa,MAAM,OAAO,cAAc,MAAM,QAAQ,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO;AAAA,QAC1H,QAAQ,EAAE,OAAO,OAAO,OAAO,cAAc,OAAO,cAAc,QAAQ,OAAO,OAAO;AAAA,MAC1F;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,WAAgD;AAC9C,QAAI,CAAC,KAAK,gBAAiB,QAAO,EAAE,QAAQ,GAAG,SAAS,EAAE;AAC1D,UAAM,WAAW,KAAK,YAAY,YAAY,KAAK,iBAAiB,KAAK,QAAQ,eAAe,UAAU,GAAG,KAAK,aAAa;AAC/H,UAAM,UAAU,IAAI,IAAI,SAAS,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW,GAAG,OAAO,SAAS,IAAI,OAAO,OAAO,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;AAC5I,QAAI,OAAO;AACX,eAAW,OAAO,KAAK,cAAe,KAAI,QAAQ,IAAI,GAAG,EAAG,SAAQ;AACpE,WAAO,EAAE,QAAQ,KAAK,cAAc,MAAM,SAAS,KAAK;AAAA,EAC1D;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,SAAS,CAAC,cAAuB,KAAK,OAAO,QAAQ,KAAK,YAAY,SAAS;AAAA,QAC/E,aAAa,CAAC,WAAoB,QAAiB,UAAmB,KAAK,OAAO,YAAY,KAAK,YAAY,WAAW,QAAQ,KAAK;AAAA,QACvI,cAAc,CAAC,WAAmB,SAAiB,aAAqB,KAAK,OAAO,aAAa,KAAK,YAAY,WAAW,SAAS,QAAQ;AAAA,MAChJ;AAAA,MACA,GAAI,KAAK,oBAAoB,SAAY,CAAC,IAAI,EAAE,kBAAkB,KAAK,gBAAgB;AAAA,MACvF,WAAW;AAAA,QACT,WAAW,CAAC,EAAE,WAAW,QAAQ,MAAM,MAAqE,KAAK,YAAY,YAAY,WAAW,QAAQ,cAAc,KAAK,kBAAkB,KAAK,gBAAgB,MAAS,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,SAAS,OAAO,SAAS,UAAU,OAAO,UAAU,aAAa,OAAO,YAAY,EAAE,EAAE,EAAE;AAAA,QACra,SAAS,CAAC,WAAmB;AAC3B,gBAAM,OAAO,KAAK,YAAY,QAAQ,MAAM;AAC5C,iBAAO,OAAO,EAAE,GAAG,MAAM,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,SAAS,OAAO,SAAS,UAAU,OAAO,UAAU,aAAa,OAAO,YAAY,EAAE,EAAE,IAAI;AAAA,QACvL;AAAA,MACF;AAAA,MACA,kBAAkB,CAAC,cAAsB,cAAc,KAAK,kBACxD,EAAE,QAAQ,KAAK,QAAQ,eAAe,UAAU,GAAG,kBAAkB,CAAC,GAAG,KAAK,aAAa,GAAG,OAAO,KAAK,WAAW,UAAU,IAC/H;AAAA,IACN;AAAA,EACF;AAAA,EAEA,SAAS,WAAoB,QAAwB;AACnD,WAAO,KAAK,YAAY,YAAY,WAAW,QAAQ,cAAc,KAAK,kBAAkB,KAAK,gBAAgB,MAAS;AAAA,EAC5H;AAAA,EAEA,IAAI,WAAgC;AAAE,WAAO,KAAK,OAAO,QAAQ,KAAK,YAAY,SAAS;AAAA,EAAG;AAAA,EAE9F,MAAM,WAA0B;AAC9B,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,MAAM,MAAM;AACjB,UAAM,KAAK,aAAa,MAAM,MAAM,MAAS;AAC7C,UAAM,KAAK,mBAAmB,MAAM,MAAM,MAAS;AACnD,SAAK,OAAO,MAAM;AAAA,EACpB;AACF;",
|
|
4
|
+
"sourcesContent": ["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport { sqliteDriver, type SqliteDatabase } from \"./sqlite.js\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, createDeleteConfirmationToken, defaultLedgerPath, hash, hashLcmPayload, type DeleteConfirmationToken, type ProjectIdentity, type ProjectIdentityInput, type RawEntry, type SessionEntry } from \"./lcm-identity.js\";\n\nexport { canonicalLcmPayload, canonicalProjectIdentity, createDeleteConfirmationToken, defaultLedgerPath, hashLcmPayload };\nexport type { DeleteConfirmationToken, ProjectIdentity, RawEntry, SessionEntry };\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 }\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 fileHash = (file: string) => crypto.createHash(\"sha256\").update(fs.readFileSync(file)).digest(\"hex\");\nconst snapshotHash = (db: SqliteDatabase): 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};\n\nclass LedgerDegradedError extends Error { constructor(message: string, public readonly cause?: unknown) { super(message); this.name = \"LedgerDegradedError\"; } }\n\nexport class LcmLedger {\n readonly db: SqliteDatabase;\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 (sqliteDriver())(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: SqliteDatabase) => T): T { this.guard(); return fn(this.db); }\n transaction<T>(fn: (db: SqliteDatabase) => 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 (sqliteDriver())(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 (sqliteDriver())(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", "import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { sqliteDriver, type SqliteDatabase } from \"./sqlite.js\";\nimport { sessionsDirRoot, sessionDirNamesForCwd } from \"../memory/discovery.js\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, defaultLedgerPath, hashLcmPayload, LcmLedger } from \"./lcm-ledger.js\";\n\nexport interface MigrationOptions {\n agentDir: string;\n ledgerRoot?: string;\n ledger?: LcmLedger;\n files?: string[];\n candidateDirs?: string[];\n projectCwd?: string;\n liveCwd?: string;\n since?: string;\n until?: string;\n onDemand?: boolean;\n now?: number;\n apply?: boolean;\n allowIncompleteDiscovery?: boolean;\n maxFiles?: number;\n maxDiscoveryEntries?: number;\n maxFileBytes?: number;\n maxLineBytes?: number;\n maxTotalBytes?: number;\n onProgress?: (progress: MigrationProgress) => void;\n}\ninterface MigrationProgress {\n projectKey: string;\n sessionPath: string;\n sourceHash: string;\n lineOrdinal: number;\n entryId: string;\n contentHash: string;\n}\ninterface MigrationCounts {\n eligible: number;\n imported: number;\n skippedDuplicate: number;\n skippedOutOfWindow: number;\n malformed: number;\n oversized: number;\n incompleteDiscovery: number;\n errors: number;\n}\nexport interface MigrationResult {\n mode: \"apply\" | \"dry-run\";\n since: string;\n until: string;\n counts: MigrationCounts;\n filesScanned: number;\n bytesScanned: number;\n generations: Array<{ sessionPath: string; sourceHash: string }>;\n exitCode: number;\n}\nconst hash = (data: string | Buffer): string => crypto.createHash(\"sha256\").update(data).digest(\"hex\");\nconst record = (value: unknown): Record<string, unknown> | undefined =>\n value !== null && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\nconst nonblank = (value: unknown): value is string => typeof value === \"string\" && value.trim().length > 0;\nconst utc = (value: string): number => {\n if (!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|\\+00:00)$/.test(value)) throw new Error(\"timestamps must be explicit UTC ISO-8601 values\");\n const at = Date.parse(value);\n const normalized = value.replace(\"+00:00\", \"Z\").replace(/Z$/, \"\");\n if (!Number.isFinite(at) || new Date(at).toISOString().slice(0, 19) !== normalized.slice(0, 19)) throw new Error(\"invalid UTC timestamp\");\n return at;\n};\nexport function migrationWindow(options: Pick<MigrationOptions, \"since\" | \"until\" | \"now\">): { since: number; until: number } {\n const now = options.now ?? Date.now();\n const since = options.since === undefined ? now - 72 * 60 * 60 * 1000 : utc(options.since);\n const until = options.until === undefined ? now : utc(options.until);\n if (!Number.isFinite(since) || !Number.isFinite(until) || since > until) throw new Error(\"invalid migration window\");\n return { since, until };\n}\nconst positive = (value: number | undefined, fallback: number): number => {\n const result = value ?? fallback;\n if (!Number.isSafeInteger(result) || result < 1) throw new Error(\"scan limits must be positive safe integers\");\n return result;\n};\nexport function discoverMigrationSessions(options: MigrationOptions): { files: string[]; incomplete: number } {\n const maxFiles = positive(options.maxFiles, 10_000);\n const maxEntries = positive(options.maxDiscoveryEntries, 100_000);\n const files = new Set<string>();\n let incomplete = 0;\n let entries = 0;\n const add = (file: string): void => {\n if (files.size >= maxFiles && !files.has(path.resolve(file))) { incomplete++; return; }\n files.add(path.resolve(file));\n };\n if (options.files) {\n for (const file of options.files.slice(0, maxFiles)) add(file);\n if (options.files.length > maxFiles) incomplete++;\n return { files: [...files].sort(), incomplete };\n }\n const list = (dir: string, visit: (entry: fs.Dirent) => void): void => {\n let handle: fs.Dir | undefined;\n try {\n handle = fs.opendirSync(dir);\n let entry: fs.Dirent | null;\n while ((entry = handle.readSync()) !== null) {\n if (++entries > maxEntries) { incomplete++; break; }\n visit(entry);\n }\n } catch { incomplete++; } finally { handle?.closeSync(); }\n };\n const scan = (dir: string): void => list(dir, entry => {\n if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(dir, entry.name));\n else if (entry.isSymbolicLink() && entry.name.endsWith(\".jsonl\")) incomplete++;\n });\n if (options.candidateDirs) {\n for (const dir of options.candidateDirs) { if (entries >= maxEntries) { incomplete++; break; } scan(dir); }\n } else if (options.projectCwd) {\n const names = sessionDirNamesForCwd(options.projectCwd);\n let found = false;\n for (const name of [names.canonical, ...names.legacy]) {\n const dir = path.join(sessionsDirRoot(options.agentDir), name);\n try { if (fs.statSync(dir).isDirectory()) { found = true; scan(dir); } }\n catch (error) { if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") incomplete++; }\n }\n if (!found) incomplete++;\n } else {\n const root = sessionsDirRoot(options.agentDir);\n list(root, entry => {\n if (entry.isDirectory()) scan(path.join(root, entry.name));\n else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) add(path.join(root, entry.name));\n else if (entry.isSymbolicLink()) incomplete++;\n });\n }\n return { files: [...files].sort(), incomplete };\n}\nconst CHECKPOINT_SCHEMA = \"CREATE TABLE IF NOT EXISTS migration_checkpoints (project_key TEXT NOT NULL, session_path TEXT NOT NULL, source_hash TEXT NOT NULL, line_ordinal INTEGER NOT NULL, entry_id TEXT NOT NULL, content_hash TEXT NOT NULL, PRIMARY KEY(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash))\";\nexport function reconcileSession(options: Omit<MigrationOptions, \"files\"> & { files: [string] }): MigrationResult {\n return migrateSessions({ ...options, onDemand: true });\n}\n\nexport function migrateSessions(options: MigrationOptions): MigrationResult {\n const window = migrationWindow(options);\n const maxFileBytes = positive(options.maxFileBytes, 64 * 1024 ** 2);\n const maxLineBytes = positive(options.maxLineBytes, 8 * 1024 ** 2);\n const maxTotalBytes = positive(options.maxTotalBytes, 1024 ** 3);\n const discovery = discoverMigrationSessions(options);\n const result: MigrationResult = {\n mode: options.apply ? \"apply\" : \"dry-run\", since: new Date(window.since).toISOString(), until: new Date(window.until).toISOString(),\n counts: { eligible: 0, imported: 0, skippedDuplicate: 0, skippedOutOfWindow: 0, malformed: 0, oversized: 0, incompleteDiscovery: discovery.incomplete, errors: 0 },\n filesScanned: 0, bytesScanned: 0, generations: [], exitCode: 0,\n };\n const counts = result.counts;\n const drySeen = new Set<string>();\n for (const file of discovery.files) {\n let data: Buffer;\n let fd: number | undefined;\n try {\n fd = fs.openSync(file, \"r\");\n const before = fs.fstatSync(fd);\n if (!before.isFile()) { counts.incompleteDiscovery++; continue; }\n if (before.size > maxFileBytes) { counts.oversized++; continue; }\n if (result.bytesScanned + before.size > maxTotalBytes) { counts.incompleteDiscovery++; break; }\n data = Buffer.allocUnsafe(before.size);\n let offset = 0;\n while (offset < data.length) {\n const size = fs.readSync(fd, data, offset, data.length - offset, offset);\n if (size === 0) throw new Error(\"source shortened during read\");\n offset += size;\n }\n const after = fs.fstatSync(fd);\n if (after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs) throw new Error(\"source changed during read\");\n } catch { counts.errors++; counts.incompleteDiscovery++; continue; }\n finally { if (fd !== undefined) fs.closeSync(fd); }\n result.filesScanned++;\n result.bytesScanned += data.length;\n const sourceHash = hash(data);\n result.generations.push({ sessionPath: file, sourceHash });\n let header: Record<string, unknown> | undefined;\n let ledger: LcmLedger | undefined;\n let database: SqliteDatabase | undefined;\n let sessionId = \"\";\n let projectKey = \"\";\n let cwd: string | undefined;\n let ordinal = 0;\n try {\n for (let start = 0; start < data.length;) {\n ordinal++;\n const newline = data.indexOf(10, start);\n const end = newline < 0 ? data.length : newline;\n const bytes = data.subarray(start, end);\n start = newline < 0 ? data.length : end + 1;\n if (bytes.length > maxLineBytes) { counts.oversized++; continue; }\n const content = bytes.toString(\"utf8\").replace(/\\r$/, \"\");\n if (!content.trim()) continue;\n let row: Record<string, unknown> | undefined;\n try { row = record(JSON.parse(content)); } catch { counts.malformed++; continue; }\n if (!row) { counts.malformed++; continue; }\n if (row.type === \"message_end\") continue;\n if (!header) {\n if (row.type !== \"session\") { if (record(row.message)) counts.malformed++; continue; }\n if (!nonblank(row.id)) { counts.malformed++; break; }\n header = row;\n sessionId = row.id;\n cwd = nonblank(row.cwd) ? row.cwd : options.liveCwd;\n if (!cwd) { counts.malformed++; break; }\n const projectInput = options.liveCwd ? { recordedCwd: cwd, liveCwd: options.liveCwd } : { recordedCwd: cwd };\n projectKey = canonicalProjectIdentity(projectInput).key;\n if (options.ledger && options.ledger.project.key !== projectKey) { counts.errors++; break; }\n if (options.apply) {\n if (options.ledger) ledger = options.ledger;\n else if (options.ledgerRoot) ledger = new LcmLedger({ rootDir: options.ledgerRoot, project: { recordedCwd: cwd } });\n else ledger = new LcmLedger({ project: { recordedCwd: cwd } });\n database = ledger.db;\n database.exec(CHECKPOINT_SCHEMA);\n } else if (options.ledger) database = options.ledger.db;\n else {\n const dbPath = defaultLedgerPath(options.ledgerRoot, projectKey);\n if (fs.existsSync(dbPath)) database = new (sqliteDriver())(dbPath, { readOnly: true });\n }\n continue;\n }\n if (row.type === \"session\" || !nonblank(row.type) || !nonblank(row.id) || (row.parentId !== null && row.parentId !== undefined && typeof row.parentId !== \"string\")) { counts.malformed++; continue; }\n const message = record(row.message);\n if (row.type === \"message\" && (!message || !nonblank(message.role))) { counts.malformed++; continue; }\n let at: number;\n try { at = typeof row.timestamp === \"string\" ? utc(row.timestamp) : NaN; } catch { at = NaN; }\n if (!Number.isFinite(at)) { counts.malformed++; continue; }\n if (!options.onDemand && (at < window.since || at > window.until)) { counts.skippedOutOfWindow++; continue; }\n counts.eligible++;\n const payloadJson = canonicalLcmPayload(row);\n const contentHash = hashLcmPayload(row);\n const identity = JSON.stringify([projectKey, sessionId, row.id, contentHash]);\n const progress: MigrationProgress = { projectKey, sessionPath: file, sourceHash, lineOrdinal: ordinal, entryId: row.id, contentHash };\n const duplicate = drySeen.has(identity) || database?.prepare(\"SELECT 1 FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND content_hash=?\").get(projectKey, sessionId, row.id, contentHash) !== undefined;\n if (duplicate) counts.skippedDuplicate++;\n else if (ledger) {\n ledger.appendRaw({\n projectKey, sessionId, entryId: row.id, role: message && typeof message.role === \"string\" ? message.role : row.type,\n content, payloadJson, parentEntryId: typeof row.parentId === \"string\" ? row.parentId : null,\n branch: typeof row.branch === \"string\" ? row.branch : typeof row.branchId === \"string\" ? row.branchId : null,\n ...(cwd ? { recordedCwd: cwd } : {}), createdAt: at\n });\n counts.imported++;\n }\n else if (!duplicate) counts.imported++;\n drySeen.add(identity);\n if (ledger) database!.prepare(\"INSERT OR IGNORE INTO migration_checkpoints(project_key,session_path,source_hash,line_ordinal,entry_id,content_hash) VALUES(?,?,?,?,?,?)\")\n .run(projectKey, file, sourceHash, ordinal, row.id, contentHash);\n options.onProgress?.(progress);\n }\n if (!header) counts.malformed++;\n } catch (error) {\n counts.errors++;\n if (options.onProgress) throw error;\n } finally {\n if (ledger && ledger !== options.ledger) ledger.close();\n else if (!ledger && database && database !== options.ledger?.db) database.close();\n }\n }\n result.exitCode = counts.errors || counts.malformed || counts.oversized || (counts.incompleteDiscovery && !options.allowIncompleteDiscovery) ? 1 : 0;\n return result;\n}\n", "import crypto from \"node:crypto\";\nimport { hashLcmPayload, type RawEntry } from \"../storage/lcm-identity.js\";\nimport type { LcmLedger } from \"../storage/lcm-ledger.js\";\nimport { buildLcmPrompt, emergencyReduce, type LcmModelResult, type LcmSummarizer } from \"./lcm-model.js\";\n\ntype LcmNodeState = \"pending\" | \"ready\" | \"running\" | \"failed\";\ntype LcmJobState = \"pending\" | \"running\" | \"completed\" | \"failed\";\nexport interface LcmSourceRef { sessionId: string; entryId: string; revision: number; payloadHash: string; }\ntype RawSourceRef = LcmSourceRef;\nexport interface LcmNode { nodeId: string; projectKey: string; sessionId: string; branch: string | null; kind: \"leaf\" | \"condensed\"; sources: LcmSourceRef[]; children: string[]; depth: number; sourceHash: string; policyHash: string; modelHash: string; state: LcmNodeState; text?: string; createdAt: number; }\nexport interface LcmJob { jobId: string; projectKey: string; nodeId: string; priority: number; eligibleAt: number; state: LcmJobState; ownerId?: string; leaseToken?: string; leaseUntil?: number; attempts: number; nextRetryAt: number; error?: string; createdAt: number; updatedAt: number; }\nexport interface LcmBudget { calls: number; inputTokens: number; outputTokens: number; cost: number; wallMs: number; }\nexport interface LcmBudgetPolicy extends LcmBudget { sessionCalls: number; }\nconst DEFAULT_LCM_BUDGET: LcmBudgetPolicy = { calls: Number.POSITIVE_INFINITY, inputTokens: Number.POSITIVE_INFINITY, outputTokens: Number.POSITIVE_INFINITY, cost: Number.POSITIVE_INFINITY, wallMs: Number.POSITIVE_INFINITY, sessionCalls: Number.POSITIVE_INFINITY };\nexport interface LcmMaintenanceOptions { now?: () => number; ownerId?: string; policyHash?: string; maxLeafEntries?: number; maxCondenseChildren?: number; maxInputChars?: number; maxOutputChars?: number; budget?: Partial<LcmBudgetPolicy>; }\nconst hash = (v: unknown) => hashLcmPayload(v);\nconst parse = <T>(v: unknown): T => JSON.parse(String(v));\nconst rawHash = (e: RawEntry) => e.payloadHash;\nconst token = () => crypto.randomUUID();\n\nexport class LcmMaintenance {\n readonly projectKey: string;\n private readonly now: () => number;\n private readonly ownerId: string;\n private readonly policyHash: string;\n private readonly maxLeaf: number;\n private readonly maxChildren: number;\n private readonly maxInputChars: number;\n private readonly maxOutputChars: number;\n private readonly budget: LcmBudgetPolicy;\n constructor(private readonly ledger: LcmLedger, options: LcmMaintenanceOptions = {}) { this.projectKey = ledger.project.key; this.now = options.now ?? Date.now; this.ownerId = options.ownerId ?? crypto.randomUUID(); this.policyHash = options.policyHash ?? hash(\"lcm-policy-v1\"); this.maxLeaf = options.maxLeafEntries ?? 32; this.maxChildren = options.maxCondenseChildren ?? 4; this.maxInputChars = options.maxInputChars ?? 200_000; this.maxOutputChars = options.maxOutputChars ?? 4_096; this.budget = { ...DEFAULT_LCM_BUDGET, ...options.budget }; }\n budgetPolicy(): LcmBudgetPolicy { return { ...this.budget }; }\n selectUpgrades(sessionId?: string, activeSources?: ReadonlySet<string>, branch?: string | null, limit = 1): LcmNode[] {\n return this.listNodes(100000)\n .filter(node => node.state === \"ready\" && node.modelHash === \"emergency\" && node.policyHash === this.policyHash\n && (!sessionId || node.sessionId === sessionId)\n && (branch === undefined || node.branch === branch || node.branch === null)\n && (!activeSources || node.sources.every(source => activeSources.has(this.sourceKey(source)))))\n .sort((left, right) => left.depth - right.depth || left.nodeId.localeCompare(right.nodeId))\n .slice(0, limit);\n }\n ancestorsOf(nodeId: string): string[] {\n return this.ledger.readOnly(db => {\n const seen = new Set<string>();\n const stack = [nodeId];\n const order: string[] = [];\n while (stack.length > 0) {\n const current = stack.pop()!;\n const parents = db.prepare(\"SELECT e.parent_id FROM summary_edges e JOIN summary_nodes parent ON parent.node_id=e.parent_id WHERE e.child_id=? AND parent.project_key=?\").all(current, this.projectKey) as Array<{ parent_id: string }>;\n for (const { parent_id: parent } of parents) {\n if (seen.has(parent)) continue;\n seen.add(parent);\n order.push(parent);\n stack.push(parent);\n }\n }\n return order;\n });\n }\n reopen(nodeId: string, force = false): LcmJob {\n return this.ledger.transaction(db => {\n const row = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(nodeId, this.projectKey) as { payload?: string } | undefined;\n if (!row?.payload) throw new Error(\"node not found\");\n const node = parse<LcmNode>(row.payload);\n if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\");\n if (!force && node.modelHash !== \"emergency\") throw new Error(\"node already carries a model summary\");\n const t = this.now();\n const job: LcmJob = { ...this.job(node), jobId: `job:upgrade:${token()}:${node.nodeId}`, createdAt: t, updatedAt: t };\n db.prepare(\"INSERT INTO maintenance_jobs(job_id,project_key,status,payload,created_at,updated_at) VALUES(?,?,?,?,?,?)\")\n .run(job.jobId, this.projectKey, job.state, JSON.stringify(job), job.createdAt, job.updatedAt);\n return job;\n });\n }\n listNodes(limit = 100): LcmNode[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM summary_nodes WHERE project_key=? ORDER BY created_at,node_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const node = parse<LcmNode>(r.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; })); }\n getNode(nodeId: string): LcmNode | undefined { return this.ledger.readOnly(db => { const row = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(nodeId, this.projectKey) as {payload?:string}|undefined; if (!row?.payload) return undefined; const node = parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey) throw new Error(\"node project does not match ledger project\"); return node; }); }\n getFrontier(sessionId?: string, branch?: string | null, activeSources?: ReadonlySet<string>): LcmNode[] { const nodes=this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (branch === undefined || n.branch === branch || n.branch === null) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s))))) ; const covered=new Set(nodes.flatMap(n=>n.children)); return nodes.filter(n=>!covered.has(n.nodeId)); }\n listJobs(limit = 100): LcmJob[] { return this.ledger.readOnly(db => (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? ORDER BY created_at,job_id LIMIT ?\").all(this.projectKey, limit) as Array<{payload:string}>).map(r => { const job = parse<LcmJob>(r.payload); if (job.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; })); }\n selectLeaf(entries = this.ledger.readRaw(this.projectKey), branch?: string | null): RawEntry[] { const first = entries[0]; if (!first) return []; const nodes = this.listNodes(100000).filter(n => n.state !== \"failed\" && n.policyHash === this.policyHash && n.sessionId === first.sessionId && (branch === undefined || n.branch === branch || n.branch === null)); const covered = new Set(nodes.flatMap(n => n.sources.map(s => this.sourceKey(s)))); const candidates = entries.filter(e => e.sessionId === first.sessionId && (branch === undefined || e.branch === branch || e.branch === null) && !covered.has(this.sourceKey(e))); const picked: RawEntry[] = []; let chars = 0; for (const entry of candidates) { if (picked.length >= this.maxLeaf) break; const size = entry.payloadJson.length; if (picked.length > 0 && chars + size > this.maxInputChars) break; picked.push(entry); chars += size; } return picked; }\n selectCondensation(sessionId?: string, activeSources?: ReadonlySet<string>, branch?: string | null): LcmNode[] { const nodes = this.listNodes(100000).filter(n => n.state === \"ready\" && n.policyHash === this.policyHash && (!sessionId || n.sessionId === sessionId) && (!activeSources || n.sources.every(s => activeSources.has(this.sourceKey(s)))) && (branch === undefined || n.branch === branch || n.branch === null)); const eligible = new Set(nodes.map(n => n.nodeId)); const edges = this.ledger.readOnly(db => db.prepare(\"SELECT e.parent_id,e.child_id FROM summary_edges e JOIN summary_nodes parent ON parent.node_id=e.parent_id AND parent.project_key=? JOIN summary_nodes child ON child.node_id=e.child_id AND child.project_key=parent.project_key WHERE parent.project_key=?\").all(this.projectKey, this.projectKey) as Array<{parent_id:string;child_id:string}>); const consumed = new Set(edges.filter(e => eligible.has(e.parent_id)).map(e => e.child_id)); const candidates = nodes.filter(n => !consumed.has(n.nodeId)); const first = candidates[0]; if (!first) return []; const depth = Math.min(...candidates.map(n => n.depth)); const sameDepth = candidates.filter(n => n.depth === depth); if (depth > 0 && sameDepth.length < 2) return []; return candidates.filter(n => n.projectKey === first.projectKey && n.sessionId === first.sessionId && n.depth === depth).sort((a,b) => a.nodeId.localeCompare(b.nodeId)).slice(0, this.maxChildren); }\n createLeaf(entries = this.selectLeaf()): LcmNode | undefined { if (!entries.length) return undefined; const branches = new Set(entries.map(entry => entry.branch).filter((value): value is string => typeof value === \"string\")); if (branches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...branches][0] ?? null; const source = entries.map((e, index) => { if (e.projectKey !== this.projectKey) throw new Error(\"entry project does not match ledger project\"); const payload = parse<{type?: unknown; id?: unknown}>(e.payloadJson); if (typeof payload.type !== \"string\" || !payload.type || payload.id !== e.entryId) throw new Error(\"invalid raw payload\"); if (hash(payload) !== rawHash(e)) throw new Error(\"payload hash mismatch\"); return { sessionId:e.sessionId, entryId:e.entryId, revision:e.revision, payloadHash:rawHash(e) }; }); this.validateSources(source); const node: LcmNode = { nodeId:`leaf:${hash({ projectKey:this.projectKey, source, branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:entries[0]!.sessionId, branch, kind:\"leaf\", sources:source, children:[], depth:0, sourceHash:hash(source.map(s=>s.payloadHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n createCondensed(children = this.selectCondensation()): LcmNode | undefined { if (!children.length) return undefined; if (children.some(c => c.state !== \"ready\")) throw new Error(\"condensation requires ready children\"); if (new Set(children.map(c=>c.sessionId)).size !== 1 || new Set(children.map(c=>c.depth)).size !== 1) throw new Error(\"cross-branch ranges\"); const storedChildren = children.map((child) => this.getNode(child.nodeId)); if (storedChildren.some((child) => !child || child.projectKey !== this.projectKey)) throw new Error(\"child project does not match ledger project\"); if (storedChildren.some((child, index) => JSON.stringify(child) !== JSON.stringify(children[index]))) throw new Error(\"child payload changed\"); const concreteBranches = new Set(storedChildren.map(c => c!.branch).filter((value): value is string => typeof value === \"string\")); if (concreteBranches.size > 1) throw new Error(\"cross-branch ranges\"); const branch = [...concreteBranches][0] ?? null; const source = [...new Map(storedChildren.flatMap(c => c!.sources).map((value) => [this.sourceKey(value), value])).values()]; this.validateSources(source); const node: LcmNode = { nodeId:`condensed:${hash({ projectKey:this.projectKey, children:storedChildren.map(c=>c!.nodeId), branch, policyHash:this.policyHash })}`, projectKey:this.projectKey, sessionId:children[0]!.sessionId, branch, kind:\"condensed\", sources:source, children:children.map(c=>c.nodeId), depth:Math.max(...children.map(c=>c.depth))+1, sourceHash:hash(children.map(c=>c.sourceHash)), policyHash:this.policyHash, modelHash:\"\", state:\"pending\", createdAt:this.now() }; this.publish(node); return node; }\n private validateSources(source: LcmSourceRef[]) { const seen = new Set<string>(); for (const s of source) { if (seen.has(this.sourceKey(s))) throw new Error(\"duplicate source identity\"); seen.add(this.sourceKey(s)); } if (new Set(source.map(s => s.sessionId)).size !== 1) throw new Error(\"cross-session ranges\"); }\n private sourceKey(source: Pick<LcmSourceRef, \"sessionId\" | \"entryId\" | \"revision\">) { return `${source.sessionId}:${source.entryId}:${source.revision}`; }\n private publish(node: LcmNode) { this.ledger.transaction(db => { if (node.children.includes(node.nodeId)) throw new Error(\"cycle\"); for (const child of node.children) if (!db.prepare(\"SELECT 1 FROM summary_nodes WHERE node_id=? AND project_key=?\").get(child,this.projectKey)) throw new Error(\"missing child\"); db.prepare(\"INSERT OR IGNORE INTO summary_nodes(node_id,project_key,payload,created_at) VALUES(?,?,?,?)\").run(node.nodeId,this.projectKey,JSON.stringify(node),node.createdAt); for (const child of node.children) db.prepare(\"INSERT OR IGNORE INTO summary_edges(parent_id,child_id) VALUES(?,?)\").run(node.nodeId,child); const job = this.job(node); db.prepare(\"INSERT OR IGNORE INTO maintenance_jobs(job_id,project_key,status,payload,created_at,updated_at) VALUES(?,?,?,?,?,?)\").run(job.jobId,this.projectKey,job.state,JSON.stringify(job),job.createdAt,job.updatedAt); }); }\n private job(node:LcmNode): LcmJob { const t=this.now(); return {jobId:`job:${node.nodeId}`,projectKey:this.projectKey,nodeId:node.nodeId,priority:node.kind === \"condensed\" ? 20 : 10,eligibleAt:t,state:\"pending\",attempts:0,nextRetryAt:t,createdAt:t,updatedAt:t}; }\n claim(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old=parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t=this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if ((old.state !== \"pending\" && !expired) || old.eligibleAt > t || old.nextRetryAt > t) throw new Error(\"job not eligible\"); const active = (db.prepare(\"SELECT payload FROM maintenance_jobs WHERE project_key=? AND status=?\").all(this.projectKey, \"running\") as Array<{payload:string}>).map(r => parse<LcmJob>(r.payload)).filter(j => j.jobId !== old.jobId && (j.leaseUntil ?? 0) > t); if (active.length) throw new Error(\"project lease held\"); const nodeRow = db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(old.nodeId,this.projectKey) as {payload?:string}|undefined; const sessionId = nodeRow?.payload ? parse<LcmNode>(nodeRow.payload).sessionId : \"\"; const day = this.day(t); const projectUsage = this.usage(db, day); const sessionUsage = this.usage(db, day, sessionId); if (projectUsage.calls >= this.budget.calls || projectUsage.inputTokens >= this.budget.inputTokens || projectUsage.outputTokens >= this.budget.outputTokens || projectUsage.cost >= this.budget.cost || projectUsage.wallMs >= this.budget.wallMs || sessionUsage.calls >= this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...old,state:\"running\" as const,ownerId,leaseToken:token(),leaseUntil:t+30_000,updatedAt:t}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n claimEmergency(jobId: string, ownerId = this.ownerId): LcmJob { return this.ledger.transaction(db => { const row = db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(jobId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"job not found\"); const old = parse<LcmJob>(row.payload); if (old.projectKey !== this.projectKey) throw new Error(\"job project does not match ledger project\"); const t = this.now(); const expired = old.state === \"running\" && (old.leaseUntil ?? 0) <= t; if (old.state === \"running\" && !expired) throw new Error(\"job lease held\"); if (old.state === \"completed\") throw new Error(\"job already completed\"); const out = { ...old, state: \"running\" as const, ownerId, leaseToken: token(), leaseUntil: t + 30_000, updatedAt: t }; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),t,jobId,this.projectKey); return out; }); }\n renew(job:LcmJob): LcmJob { return this.fenced(job, old => ({...old,leaseUntil:this.now()+30_000,updatedAt:this.now()})); }\n private validateText(text: unknown): asserts text is string { if (typeof text !== \"string\" || text.length === 0) throw new Error(\"invalid summary text\"); let length = 0; for (const _ of text) { length += 1; if (length > this.maxOutputChars) throw new Error(\"summary exceeds output bound\"); } }\n complete(job:LcmJob, result:LcmModelResult): LcmNode { this.validateText(result.text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } if (![result.inputTokens,result.outputTokens,result.cost,result.wallMs].every((value) => Number.isFinite(value) && value >= 0)) throw new Error(\"invalid model usage\"); const projectUsage = this.usage(db, this.day(this.now())); const sessionUsage = this.usage(db, this.day(this.now()), node.sessionId); if (projectUsage.calls + 1 > this.budget.calls || projectUsage.inputTokens + result.inputTokens > this.budget.inputTokens || projectUsage.outputTokens + result.outputTokens > this.budget.outputTokens || projectUsage.cost + result.cost > this.budget.cost || projectUsage.wallMs + result.wallMs > this.budget.wallMs || sessionUsage.calls + 1 > this.budget.sessionCalls) throw new Error(\"budget exhausted\"); const out={...node,state:\"ready\" as const,text:result.text,modelHash:result.modelHash}; this.account(db,node.sessionId,result); db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n completeEmergency(job:LcmJob, text:string): LcmNode { this.validateText(text); return this.ledger.transaction(db => { const current=this.readJob(db,job.jobId); this.assertLease(current,job); if (current.nodeId !== job.nodeId) throw new Error(\"job node mismatch\"); const row=db.prepare(\"SELECT payload FROM summary_nodes WHERE node_id=? AND project_key=?\").get(job.nodeId,this.projectKey) as {payload?:string}|undefined; if (!row?.payload) throw new Error(\"node not found\"); const node=parse<LcmNode>(row.payload); if (node.projectKey !== this.projectKey || node.nodeId !== current.nodeId) throw new Error(\"node project does not match ledger project\"); for (const source of node.sources) { const raw=db.prepare(\"SELECT payload_json,session_id FROM raw_entries WHERE project_key=? AND session_id=? AND entry_id=? AND revision=?\").get(this.projectKey,source.sessionId,source.entryId,source.revision) as {payload_json?:string;session_id?:string}|undefined; if (!raw?.payload_json || hash(parse(raw.payload_json)) !== source.payloadHash || raw.session_id !== source.sessionId) throw new Error(\"stale source\"); } const out={...node,state:\"ready\" as const,text,modelHash:\"emergency\"}; db.prepare(\"UPDATE summary_nodes SET payload=? WHERE node_id=? AND project_key=?\").run(JSON.stringify(out),node.nodeId,this.projectKey); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = current; const done={...base,state:\"completed\" as const,updatedAt:this.now()}; db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(done.state,JSON.stringify(done),done.updatedAt,done.jobId,this.projectKey); return out; }); }\n fail(job:LcmJob,error:string): LcmJob { return this.fenced(job, old => { const attempts=old.attempts+1; const delay=Math.min(900_000,30_000*2**(attempts-1)); const { ownerId: _ownerId, leaseToken: _leaseToken, leaseUntil: _leaseUntil, ...base } = old; return {...base,attempts,error,state:attempts>=3?\"failed\":\"pending\",eligibleAt:this.now()+delay,nextRetryAt:this.now()+delay,updatedAt:this.now()}; }); }\n async run(job:LcmJob, model:LcmSummarizer, input:string, signal=new AbortController().signal): Promise<LcmNode> { let sources: LcmSourceRef[] = []; let claimed: LcmJob | undefined; const controller = new AbortController(); let renew: ReturnType<typeof setInterval> | undefined; const timer = setTimeout(() => controller.abort(), 60_000); const abort = () => controller.abort(); signal.addEventListener(\"abort\", abort, { once: true }); try { claimed=this.claim(job.jobId,job.ownerId ?? this.ownerId); const node=this.getNode(claimed.nodeId); sources=node?.sources ?? []; renew = setInterval(() => { try { if (claimed) claimed = this.renew(claimed); } catch {} }, 10_000); const result=await Promise.race([model.generate({prompt:buildLcmPrompt(node?.kind ?? \"leaf\",input,this.maxInputChars),sessionId:node?.sessionId ?? \"\",signal:controller.signal}), new Promise<never>((_, reject) => controller.signal.addEventListener(\"abort\", () => reject(new Error(\"LCM timeout\")), { once: true }))]); return this.complete(claimed,result); } catch (error) { if (!claimed) throw error; const fallback=emergencyReduce(input,this.maxOutputChars,sources); try { return this.completeEmergency(claimed,fallback); } catch { try { this.fail(claimed,String(error)); } catch {} throw error; } } finally { clearTimeout(timer); if (renew) clearInterval(renew); signal.removeEventListener(\"abort\", abort); } }\n private day(ms:number): string { return new Date(ms).toISOString().slice(0,10); }\n private usage(db:any, day:string, sessionId?:string): LcmBudget { const q = sessionId === undefined ? \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=?\" : \"SELECT COALESCE(SUM(calls),0) calls,COALESCE(SUM(input_tokens),0) inputTokens,COALESCE(SUM(output_tokens),0) outputTokens,COALESCE(SUM(cost),0) cost,COALESCE(SUM(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=? AND session_id=?\"; const r=(sessionId === undefined ? db.prepare(q).get(this.projectKey,day) : db.prepare(q).get(this.projectKey,day,sessionId)) as LcmBudget; return r; }\n private account(db:any, sessionId:string, result:LcmModelResult) { const d=this.day(this.now()); db.prepare(\"INSERT INTO maintenance_usage(project_key,day,session_id,calls,input_tokens,output_tokens,cost,wall_ms) VALUES(?,?,?,?,?,?,?,?) ON CONFLICT(project_key,day,session_id) DO UPDATE SET calls=calls+excluded.calls,input_tokens=input_tokens+excluded.input_tokens,output_tokens=output_tokens+excluded.output_tokens,cost=cost+excluded.cost,wall_ms=wall_ms+excluded.wall_ms\").run(this.projectKey,d,sessionId,1,result.inputTokens,result.outputTokens,result.cost,result.wallMs); }\n private readJob(db: any,id:string):LcmJob { const row=db.prepare(\"SELECT payload FROM maintenance_jobs WHERE job_id=? AND project_key=?\").get(id,this.projectKey) as {payload:string}|undefined; if(!row) throw new Error(\"job not found\"); const job=parse<LcmJob>(row.payload); if(job.projectKey!==this.projectKey) throw new Error(\"job project does not match ledger project\"); return job; }\n private assertLease(current:LcmJob, expected:LcmJob) { if(current.ownerId!==expected.ownerId || current.leaseToken!==expected.leaseToken || current.state!==\"running\" || (current.leaseUntil??0)<this.now()) throw new Error(\"lease fenced\"); }\n private fenced(job:LcmJob, update:(old:LcmJob)=>LcmJob):LcmJob { return this.ledger.transaction(db => { const old=this.readJob(db,job.jobId); this.assertLease(old,job); const out=update(old); db.prepare(\"UPDATE maintenance_jobs SET status=?,payload=?,updated_at=? WHERE job_id=? AND project_key=?\").run(out.state,JSON.stringify(out),out.updatedAt,out.jobId,this.projectKey); return out; }); }\n}\n", "import type { ExtensionContext } from \"@oh-my-pi/pi-coding-agent\";\nimport { canonicalLcmPayload, canonicalProjectIdentity, hashLcmPayload, LcmLedger, type RawEntry } from \"../storage/lcm-ledger.js\";\nimport { reconcileSession } from \"../storage/lcm-migration.js\";\nimport { emergencyReduce, LcmModelAdapter, type LcmSummarizer } from \"./lcm-model.js\";\nimport { LcmMaintenance, type LcmBudgetPolicy, type LcmJob, type LcmNode } from \"./lcm-maintenance.js\";\nimport type { LcmCompactionInput, LcmCompactionOutput } from \"./hook.js\";\n\nexport interface LcmReport {\n projectKey: string;\n sessionId: string | undefined;\n state: string;\n degraded: string | undefined;\n summaryModel: string | undefined;\n rawEntries: number;\n sessionEntries: number;\n modelNodes: number;\n emergencyNodes: number;\n pendingNodes: number;\n pendingJobs: number;\n upgradableNodes: number;\n usage: { calls: number; inputTokens: number; outputTokens: number; cost: number; wallMs: number };\n budget: { calls: number; sessionCalls: number; wallMs: number };\n}\n\nexport interface LcmRuntimeOptions {\n rootDir?: string;\n summaryModel?: string;\n maxLeafEntries?: number;\n maxCondenseChildren?: number;\n lcmMaxInputChars?: number;\n lcmMaxOutputTokens?: number;\n lcmMaxOutputChars?: number;\n maxMaintenancePasses?: number;\n modelSummaries?: boolean;\n maxDailyModelCalls?: number;\n maxSessionModelCalls?: number;\n maxDailyModelSeconds?: number;\n maintenanceRunSeconds?: number;\n}\n\nexport class LcmRuntime {\n readonly ledger: LcmLedger;\n readonly maintenance: LcmMaintenance;\n private readonly context: ExtensionContext;\n private readonly resolveOptions: () => LcmRuntimeOptions;\n private readonly abort = new AbortController();\n private writePending: Promise<void> = Promise.resolve();\n private maintenancePending: Promise<void> = Promise.resolve();\n private closed = false;\n private dirty = false;\n private degradedError: unknown;\n private activeSources = new Set<string>();\n private activeSessionId: string | undefined;\n\n constructor(context: ExtensionContext, options: LcmRuntimeOptions | (() => LcmRuntimeOptions) = {}) {\n this.context = context;\n this.resolveOptions = typeof options === \"function\" ? options : () => options;\n const initial = this.resolveOptions();\n const recorded = context.sessionManager.getRecordedCwd?.();\n const liveCwd = recorded || context.cwd;\n const project = canonicalProjectIdentity({ liveCwd });\n const ledgerOptions = initial.rootDir === undefined\n ? { project: { liveCwd: project.canonicalPath ?? liveCwd } }\n : { rootDir: initial.rootDir, project: { liveCwd: project.canonicalPath ?? liveCwd } };\n this.ledger = new LcmLedger(ledgerOptions);\n this.maintenance = new LcmMaintenance(this.ledger, {\n ...initial,\n ...(initial.lcmMaxInputChars === undefined ? {} : { maxInputChars: initial.lcmMaxInputChars }),\n ...(initial.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: initial.lcmMaxOutputChars }),\n budget: {\n ...(initial.maxDailyModelCalls ? { calls: initial.maxDailyModelCalls } : {}),\n ...(initial.maxSessionModelCalls ? { sessionCalls: initial.maxSessionModelCalls } : {}),\n ...(initial.maxDailyModelSeconds ? { wallMs: initial.maxDailyModelSeconds * 1_000 } : {}),\n },\n });\n }\n\n private get options(): LcmRuntimeOptions { return this.resolveOptions(); }\n\n get projectKey(): string { return this.ledger.project.key; }\n get signal(): AbortSignal { return this.abort.signal; }\n get status(): \"healthy\" | \"degraded\" { return this.degradedError === undefined ? \"healthy\" : \"degraded\"; }\n get error(): unknown { return this.degradedError; }\n markDirty(): void { this.dirty = true; }\n\n private enqueueWrite(operation: () => void | Promise<void>): Promise<void> {\n const run = this.writePending.then(operation);\n this.writePending = run.catch((error) => { this.degradedError = error; });\n return run;\n }\n\n private refreshActiveSources(sessionId: string, entries: readonly { id: string }[]): void {\n const ids = new Set(entries.map((entry) => entry.id));\n const latest = new Map<string, RawEntry>();\n for (const entry of this.ledger.readRaw(this.projectKey, sessionId)) {\n if (!ids.has(entry.entryId)) continue;\n const previous = latest.get(entry.entryId);\n if (!previous || previous.revision < entry.revision) latest.set(entry.entryId, entry);\n }\n this.activeSources = new Set(\n [...latest.values()].map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n this.activeSessionId = sessionId;\n }\n\n reconcileSelectedSession(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n const getSessionFile = this.context.sessionManager.getSessionFile;\n if (typeof getSessionFile !== \"function\") return;\n const sessionFile = getSessionFile.call(this.context.sessionManager);\n if (!sessionFile) return;\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const cwd = recorded || this.context.cwd;\n const result = reconcileSession({\n agentDir: this.options.rootDir ?? process.env.PI_CODING_AGENT_DIR ?? `${process.env.HOME ?? \".\"}/.omp/agent`,\n ledger: this.ledger,\n files: [sessionFile],\n liveCwd: cwd,\n projectCwd: cwd,\n apply: true,\n });\n this.degradedError = result.counts.errors > 0\n ? new Error(`LCM session reconciliation reported ${result.counts.errors} error(s)`)\n : undefined;\n const sessionId = this.context.sessionManager.getSessionId();\n this.refreshActiveSources(sessionId, this.context.sessionManager.getBranch());\n });\n }\n\n readback(): Promise<void> {\n if (this.closed) return Promise.resolve();\n return this.enqueueWrite(() => {\n if (this.closed) return;\n const entries = this.context.sessionManager.getBranch();\n const sessionId = this.context.sessionManager.getSessionId();\n const branch = this.context.sessionManager.getLeafId();\n const recorded = this.context.sessionManager.getRecordedCwd?.();\n const active = new Set<string>();\n for (const entry of entries) {\n const payloadJson = canonicalLcmPayload(entry);\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch,\n ...(recorded || this.context.cwd ? { recordedCwd: recorded || this.context.cwd } : {}),\n });\n active.add(`${sessionId}:${stored.entryId}:${stored.revision}`);\n }\n this.activeSources = active;\n this.activeSessionId = sessionId;\n this.dirty = false;\n this.degradedError = undefined;\n });\n }\n\n async syncAndSchedule(): Promise<void> {\n if (this.closed) return;\n await this.readback();\n this.scheduleMaintenance();\n }\n\n maintain(): Promise<void> { return this.syncAndSchedule(); }\n\n scheduleMaintenance(): void {\n if (this.closed) return;\n const run = this.maintenancePending.then(() => this.runMaintenance());\n this.maintenancePending = run.catch((error) => { this.degradedError = error; });\n }\n\n private async runMaintenance(): Promise<void> {\n if (this.closed || !this.activeSessionId || this.activeSources.size === 0) return;\n const wantsModel = this.options.modelSummaries !== false;\n let model: LcmSummarizer;\n try {\n if (!wantsModel) throw new Error(\"model summaries are disabled by configuration\");\n model = new LcmModelAdapter(this.context, this.options.summaryModel, true, {\n ...(this.options.lcmMaxInputChars === undefined ? {} : { maxInputChars: this.options.lcmMaxInputChars }),\n ...(this.options.lcmMaxOutputTokens === undefined ? {} : { maxOutputTokens: this.options.lcmMaxOutputTokens }),\n ...(this.options.lcmMaxOutputChars === undefined ? {} : { maxOutputChars: this.options.lcmMaxOutputChars }),\n });\n } catch (error) {\n this.degradedError = error;\n model = { modelHash: \"unavailable\", generate: async () => { throw error instanceof Error ? error : new Error(String(error)); } };\n }\n const fanIn = Math.max(2, this.options.maxCondenseChildren ?? 4);\n const passes = Math.max(1, this.options.maxMaintenancePasses ?? 4);\n const runDeadline = Date.now() + Math.max(1, this.options.maintenanceRunSeconds ?? 60) * 1_000;\n const sessionId = this.activeSessionId;\n const raw = this.ledger.readRaw(this.projectKey, sessionId).filter((entry) =>\n this.activeSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`),\n );\n const inputFor = (node: NonNullable<ReturnType<LcmMaintenance[\"getNode\"]>>): string => {\n if (node.kind === \"condensed\") return node.children.map((id) => this.maintenance.getNode(id)?.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n return node.sources.map((source) => {\n const entry = this.ledger.readRawEntry(this.projectKey, source.sessionId, source.entryId, source.revision);\n if (!entry || entry.payloadHash !== source.payloadHash) throw new Error(\"stale source\");\n return entry.payloadJson;\n }).join(\"\\n\");\n };\n const runJob = async (job: LcmJob, node: LcmNode): Promise<void> => {\n try { await this.maintenance.run(job, model, inputFor(node), this.signal); } catch {}\n };\n for (let pass = 0; pass < passes && !this.closed && Date.now() < runDeadline; pass += 1) {\n const leafCandidate = this.maintenance.createLeaf(this.maintenance.selectLeaf(raw, this.context.sessionManager.getLeafId()));\n const leaf = leafCandidate ? this.maintenance.getNode(leafCandidate.nodeId) : undefined;\n if (leaf?.state === \"pending\") {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (job) await runJob(job, leaf);\n }\n const branch = this.context.sessionManager.getLeafId();\n const pending = this.maintenance.listJobs().filter((job) => job.state === \"pending\").flatMap((job) => {\n const node = this.maintenance.getNode(job.nodeId);\n if (!node || node.sessionId !== sessionId || (branch !== null && node.branch !== branch && node.branch !== null) || !node.sources.every((source) => this.activeSources.has(`${source.sessionId}:${source.entryId}:${source.revision}`))) return [];\n return [{ job, node }];\n }).slice(0, passes);\n for (const item of pending) await runJob(item.job, item.node);\n const children = this.maintenance.selectCondensation(sessionId, this.activeSources, this.context.sessionManager.getLeafId());\n if (children.length >= fanIn) {\n const node = this.maintenance.createCondensed(children);\n if (node) {\n const job = this.maintenance.listJobs().find((item) => item.nodeId === node.nodeId);\n if (job) await runJob(job, node);\n }\n }\n if (!leaf && pending.length === 0 && children.length < fanIn) {\n const upgrades = this.maintenance.selectUpgrades(sessionId, this.activeSources, this.context.sessionManager.getLeafId(), 1);\n const upgrade = upgrades[0];\n if (!upgrade) break;\n const job = this.maintenance.reopen(upgrade.nodeId);\n await runJob(job, upgrade);\n if (this.maintenance.getNode(upgrade.nodeId)?.modelHash !== \"emergency\") {\n for (const ancestor of this.maintenance.ancestorsOf(upgrade.nodeId)) {\n const node = this.maintenance.getNode(ancestor);\n if (node?.state === \"ready\") this.maintenance.reopen(ancestor, true);\n }\n }\n continue;\n }\n }\n }\n\n compact(input: LcmCompactionInput): LcmCompactionOutput {\n const persistedEntries = new Map<string, RawEntry>();\n for (const entry of input.branchEntries) {\n const message = entry.type === \"message\" ? entry.message as { role?: string; content?: unknown } : undefined;\n const payloadJson = canonicalLcmPayload(entry);\n const stored = this.ledger.appendRaw({\n projectKey: this.projectKey,\n sessionId: input.sessionId,\n entryId: entry.id,\n role: message?.role ?? entry.type,\n content: message ? JSON.stringify(message.content ?? \"\") : payloadJson,\n payloadJson,\n parentEntryId: entry.parentId ?? null,\n branch: input.branch,\n });\n persistedEntries.set(`${entry.id}:${stored.payloadHash}`, stored);\n }\n const firstKeptIndex = input.firstKeptEntryId\n ? input.branchEntries.findIndex((entry) => entry.id === input.firstKeptEntryId)\n : input.branchEntries.length;\n const sourceEntries = input.branchEntries.slice(0, firstKeptIndex < 0 ? input.branchEntries.length : firstKeptIndex);\n const selectedStored = sourceEntries.map((entry) => {\n const payloadHash = hashLcmPayload(JSON.parse(canonicalLcmPayload(entry)));\n const stored = persistedEntries.get(`${entry.id}:${payloadHash}`);\n if (!stored) throw new Error(\"compaction source was not persisted\");\n return stored;\n });\n const activeSources = new Set(selectedStored.map((entry) => `${entry.sessionId}:${entry.entryId}:${entry.revision}`));\n const frontier = this.maintenance.getFrontier(input.sessionId, input.branch, activeSources);\n const coveredSources = new Set(frontier.flatMap((node) => node.sources.map((source) => `${source.sessionId}:${source.entryId}:${source.revision}`)));\n const summary = frontier.map((node) => node.text ?? \"\").filter(Boolean).join(\"\\n\\n\");\n if (summary && selectedStored.every((entry) => coveredSources.has(`${entry.sessionId}:${entry.entryId}:${entry.revision}`))) return { summary, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"ready-frontier\", branch: input.branch };\n if (selectedStored.length === 0) throw new Error(\"LCM emergency fallback has no persisted sources\");\n const payloads = sourceEntries.map((entry) => canonicalLcmPayload(entry)).join(\"\\n\");\n const sources = selectedStored.map((stored) => ({ sessionId: stored.sessionId, entryId: stored.entryId, revision: stored.revision, payloadHash: stored.payloadHash }));\n const fallback = emergencyReduce(payloads, this.options.lcmMaxOutputChars ?? 4_096, sources);\n const leaf = this.maintenance.createLeaf(selectedStored);\n if (!leaf) throw new Error(\"LCM emergency fallback node was not created\");\n const persisted = this.maintenance.getNode(leaf.nodeId);\n if (persisted?.state === \"ready\") {\n if (persisted.branch !== input.branch || JSON.stringify(persisted.sources) !== JSON.stringify(sources)) throw new Error(\"LCM emergency fallback provenance mismatch\");\n if (!persisted.text) throw new Error(\"LCM emergency fallback text is missing\");\n return { summary: persisted.text, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n const job = this.maintenance.listJobs().find((item) => item.nodeId === leaf.nodeId);\n if (!job) throw new Error(\"LCM emergency fallback job was not created\");\n const completed = this.maintenance.completeEmergency(this.maintenance.claimEmergency(job.jobId), fallback);\n return { summary: completed.text ?? fallback, firstKeptEntryId: input.firstKeptEntryId, tokensBefore: input.tokensBefore, source: \"emergency\", branch: input.branch };\n }\n\n report(): LcmReport {\n const day = new Date(Date.now()).toISOString().slice(0, 10);\n return this.ledger.readOnly((db) => {\n const count = (sql: string, ...params: unknown[]): number =>\n Number((db.prepare(sql).get(...params) as { n: number }).n);\n const nodes = db.prepare(\"SELECT json_extract(payload,'$.kind') kind, json_extract(payload,'$.state') state, json_extract(payload,'$.modelHash') model, count(*) n FROM summary_nodes WHERE project_key=? GROUP BY kind, state, model\")\n .all(this.projectKey) as Array<{ kind: string; state: string; model: string; n: number }>;\n const usage = db.prepare(\"SELECT coalesce(sum(calls),0) calls, coalesce(sum(input_tokens),0) input, coalesce(sum(output_tokens),0) output, coalesce(sum(cost),0) cost, coalesce(sum(wall_ms),0) wallMs FROM maintenance_usage WHERE project_key=? AND day=?\")\n .get(this.projectKey, day) as { calls: number; input: number; output: number; cost: number; wallMs: number };\n const budget = this.maintenance.budgetPolicy();\n return {\n projectKey: this.projectKey,\n sessionId: this.activeSessionId,\n state: this.ledger.operationalState,\n degraded: this.degradedError === undefined ? undefined : String(this.degradedError instanceof Error ? this.degradedError.message : this.degradedError),\n summaryModel: this.options.summaryModel,\n rawEntries: count(\"SELECT count(*) n FROM raw_entries WHERE project_key=?\", this.projectKey),\n sessionEntries: this.activeSessionId === undefined ? 0 : count(\"SELECT count(*) n FROM raw_entries WHERE project_key=? AND session_id=?\", this.projectKey, this.activeSessionId),\n modelNodes: nodes.filter((row) => row.model && row.model !== \"emergency\").reduce((total, row) => total + row.n, 0),\n emergencyNodes: nodes.filter((row) => row.model === \"emergency\").reduce((total, row) => total + row.n, 0),\n pendingNodes: nodes.filter((row) => row.state !== \"ready\").reduce((total, row) => total + row.n, 0),\n pendingJobs: count(\"SELECT count(*) n FROM maintenance_jobs WHERE project_key=? AND status=?\", this.projectKey, \"pending\"),\n upgradableNodes: count(\"SELECT count(*) n FROM summary_nodes WHERE project_key=? AND json_extract(payload,'$.modelHash')=?\", this.projectKey, \"emergency\"),\n usage: { calls: usage.calls, inputTokens: usage.input, outputTokens: usage.output, cost: usage.cost, wallMs: usage.wallMs },\n budget: { calls: budget.calls, sessionCalls: budget.sessionCalls, wallMs: budget.wallMs },\n };\n });\n }\n\n coverage(): { active: number; covered: number } {\n if (!this.activeSessionId) return { active: 0, covered: 0 };\n const frontier = this.maintenance.getFrontier(this.activeSessionId, this.context.sessionManager.getLeafId(), this.activeSources);\n const covered = new Set(frontier.flatMap((node) => node.sources.map((source) => `${source.sessionId}:${source.entryId}:${source.revision}`)));\n let hits = 0;\n for (const key of this.activeSources) if (covered.has(key)) hits += 1;\n return { active: this.activeSources.size, covered: hits };\n }\n\n memoryContext() {\n return {\n ledger: {\n projectKey: this.projectKey,\n readRaw: (sessionId?: string) => this.ledger.readRaw(this.projectKey, sessionId),\n readRawPage: (sessionId?: string, offset?: number, limit?: number) => this.ledger.readRawPage(this.projectKey, sessionId, offset, limit),\n readRawEntry: (sessionId: string, entryId: string, revision: number) => this.ledger.readRawEntry(this.projectKey, sessionId, entryId, revision),\n },\n ...(this.activeSessionId === undefined ? {} : { currentSessionId: this.activeSessionId }),\n summaries: {\n listNodes: ({ sessionId, branch, limit }: { sessionId?: string; branch?: string | null; limit: number }) => this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined).slice(0, limit).map((node) => ({ ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) })),\n getNode: (nodeId: string) => {\n const node = this.maintenance.getNode(nodeId);\n return node ? { ...node, text: node.text ?? \"\", sources: node.sources.map((source) => ({ entryId: source.entryId, revision: source.revision, contentHash: source.payloadHash })) } : undefined;\n },\n },\n branchForSession: (sessionId: string) => sessionId === this.activeSessionId\n ? { branch: this.context.sessionManager.getLeafId(), activeSourceKeys: [...this.activeSources], ready: this.status === \"healthy\" }\n : undefined,\n };\n }\n\n frontier(sessionId?: string, branch?: string | null) {\n return this.maintenance.getFrontier(sessionId, branch, sessionId === this.activeSessionId ? this.activeSources : undefined);\n }\n\n raw(sessionId?: string): RawEntry[] { return this.ledger.readRaw(this.projectKey, sessionId); }\n\n async shutdown(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.abort.abort();\n await this.writePending.catch(() => undefined);\n await this.maintenancePending.catch(() => undefined);\n this.ledger.close();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["token", "crypto", "fs", "path", "hash", "crypto", "path", "fs", "crypto", "hash", "crypto"]
|
|
7
7
|
}
|