@aisy/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/dist/agent-loop/index.d.ts +4 -0
- package/dist/agent-loop/index.d.ts.map +1 -0
- package/dist/agent-loop/index.js +352 -0
- package/dist/agent-loop/index.js.map +1 -0
- package/dist/agent-loop/types.d.ts +183 -0
- package/dist/agent-loop/types.d.ts.map +1 -0
- package/dist/agent-loop/types.js +3 -0
- package/dist/agent-loop/types.js.map +1 -0
- package/dist/bin/aisy.d.ts +3 -0
- package/dist/bin/aisy.d.ts.map +1 -0
- package/dist/bin/aisy.js +14 -0
- package/dist/bin/aisy.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +114 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context-engine/index.d.ts +4 -0
- package/dist/context-engine/index.d.ts.map +1 -0
- package/dist/context-engine/index.js +126 -0
- package/dist/context-engine/index.js.map +1 -0
- package/dist/context-engine/types.d.ts +54 -0
- package/dist/context-engine/types.d.ts.map +1 -0
- package/dist/context-engine/types.js +4 -0
- package/dist/context-engine/types.js.map +1 -0
- package/dist/eval/index.d.ts +20 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +128 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/types.d.ts +62 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +17 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/gateway/index.d.ts +5 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +288 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/types.d.ts +194 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +94 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/goals/index.d.ts +11 -0
- package/dist/goals/index.d.ts.map +1 -0
- package/dist/goals/index.js +21 -0
- package/dist/goals/index.js.map +1 -0
- package/dist/goals/types.d.ts +47 -0
- package/dist/goals/types.d.ts.map +1 -0
- package/dist/goals/types.js +5 -0
- package/dist/goals/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +215 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +148 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +4 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +419 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +131 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +33 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/nightly/index.d.ts +4 -0
- package/dist/nightly/index.d.ts.map +1 -0
- package/dist/nightly/index.js +470 -0
- package/dist/nightly/index.js.map +1 -0
- package/dist/nightly/types.d.ts +326 -0
- package/dist/nightly/types.d.ts.map +1 -0
- package/dist/nightly/types.js +3 -0
- package/dist/nightly/types.js.map +1 -0
- package/dist/observability/index.d.ts +11 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +396 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/types.d.ts +139 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +4 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/onboarding/index.d.ts +16 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +787 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/interactive.d.ts +23 -0
- package/dist/onboarding/interactive.d.ts.map +1 -0
- package/dist/onboarding/interactive.js +45 -0
- package/dist/onboarding/interactive.js.map +1 -0
- package/dist/onboarding/types.d.ts +388 -0
- package/dist/onboarding/types.d.ts.map +1 -0
- package/dist/onboarding/types.js +35 -0
- package/dist/onboarding/types.js.map +1 -0
- package/dist/orchestration/index.d.ts +8 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +706 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/types.d.ts +391 -0
- package/dist/orchestration/types.d.ts.map +1 -0
- package/dist/orchestration/types.js +30 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/personality/index.d.ts +65 -0
- package/dist/personality/index.d.ts.map +1 -0
- package/dist/personality/index.js +339 -0
- package/dist/personality/index.js.map +1 -0
- package/dist/personality/types.d.ts +103 -0
- package/dist/personality/types.d.ts.map +1 -0
- package/dist/personality/types.js +15 -0
- package/dist/personality/types.js.map +1 -0
- package/dist/provider/index.d.ts +4 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +236 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/types.d.ts +180 -0
- package/dist/provider/types.d.ts.map +1 -0
- package/dist/provider/types.js +4 -0
- package/dist/provider/types.js.map +1 -0
- package/dist/runtime/agent-cards.d.ts +14 -0
- package/dist/runtime/agent-cards.d.ts.map +1 -0
- package/dist/runtime/agent-cards.js +90 -0
- package/dist/runtime/agent-cards.js.map +1 -0
- package/dist/runtime/agent-runner.d.ts +30 -0
- package/dist/runtime/agent-runner.d.ts.map +1 -0
- package/dist/runtime/agent-runner.js +37 -0
- package/dist/runtime/agent-runner.js.map +1 -0
- package/dist/runtime/budget.d.ts +15 -0
- package/dist/runtime/budget.d.ts.map +1 -0
- package/dist/runtime/budget.js +24 -0
- package/dist/runtime/budget.js.map +1 -0
- package/dist/runtime/delegation-driver.d.ts +11 -0
- package/dist/runtime/delegation-driver.d.ts.map +1 -0
- package/dist/runtime/delegation-driver.js +132 -0
- package/dist/runtime/delegation-driver.js.map +1 -0
- package/dist/runtime/exact-cache.d.ts +10 -0
- package/dist/runtime/exact-cache.d.ts.map +1 -0
- package/dist/runtime/exact-cache.js +30 -0
- package/dist/runtime/exact-cache.js.map +1 -0
- package/dist/runtime/execute-tool.d.ts +29 -0
- package/dist/runtime/execute-tool.d.ts.map +1 -0
- package/dist/runtime/execute-tool.js +80 -0
- package/dist/runtime/execute-tool.js.map +1 -0
- package/dist/runtime/guardian.d.ts +9 -0
- package/dist/runtime/guardian.d.ts.map +1 -0
- package/dist/runtime/guardian.js +41 -0
- package/dist/runtime/guardian.js.map +1 -0
- package/dist/runtime/hook-gate.d.ts +17 -0
- package/dist/runtime/hook-gate.d.ts.map +1 -0
- package/dist/runtime/hook-gate.js +56 -0
- package/dist/runtime/hook-gate.js.map +1 -0
- package/dist/runtime/memory-adapter.d.ts +6 -0
- package/dist/runtime/memory-adapter.d.ts.map +1 -0
- package/dist/runtime/memory-adapter.js +38 -0
- package/dist/runtime/memory-adapter.js.map +1 -0
- package/dist/runtime/nightly-adapters.d.ts +48 -0
- package/dist/runtime/nightly-adapters.d.ts.map +1 -0
- package/dist/runtime/nightly-adapters.js +139 -0
- package/dist/runtime/nightly-adapters.js.map +1 -0
- package/dist/runtime/nightly-generator.d.ts +10 -0
- package/dist/runtime/nightly-generator.d.ts.map +1 -0
- package/dist/runtime/nightly-generator.js +335 -0
- package/dist/runtime/nightly-generator.js.map +1 -0
- package/dist/runtime/onboarding-node.d.ts +6 -0
- package/dist/runtime/onboarding-node.d.ts.map +1 -0
- package/dist/runtime/onboarding-node.js +356 -0
- package/dist/runtime/onboarding-node.js.map +1 -0
- package/dist/runtime/provider-anthropic.d.ts +43 -0
- package/dist/runtime/provider-anthropic.d.ts.map +1 -0
- package/dist/runtime/provider-anthropic.js +148 -0
- package/dist/runtime/provider-anthropic.js.map +1 -0
- package/dist/runtime/provider-cli.d.ts +18 -0
- package/dist/runtime/provider-cli.d.ts.map +1 -0
- package/dist/runtime/provider-cli.js +73 -0
- package/dist/runtime/provider-cli.js.map +1 -0
- package/dist/runtime/provider-openai.d.ts +30 -0
- package/dist/runtime/provider-openai.d.ts.map +1 -0
- package/dist/runtime/provider-openai.js +114 -0
- package/dist/runtime/provider-openai.js.map +1 -0
- package/dist/runtime/providers.d.ts +43 -0
- package/dist/runtime/providers.d.ts.map +1 -0
- package/dist/runtime/providers.js +72 -0
- package/dist/runtime/providers.js.map +1 -0
- package/dist/runtime/sandbox-bash.d.ts +21 -0
- package/dist/runtime/sandbox-bash.d.ts.map +1 -0
- package/dist/runtime/sandbox-bash.js +51 -0
- package/dist/runtime/sandbox-bash.js.map +1 -0
- package/dist/runtime/scoped-tool-executor.d.ts +10 -0
- package/dist/runtime/scoped-tool-executor.d.ts.map +1 -0
- package/dist/runtime/scoped-tool-executor.js +30 -0
- package/dist/runtime/scoped-tool-executor.js.map +1 -0
- package/dist/runtime/session-log.d.ts +6 -0
- package/dist/runtime/session-log.d.ts.map +1 -0
- package/dist/runtime/session-log.js +54 -0
- package/dist/runtime/session-log.js.map +1 -0
- package/dist/runtime/settings.d.ts +24 -0
- package/dist/runtime/settings.d.ts.map +1 -0
- package/dist/runtime/settings.js +29 -0
- package/dist/runtime/settings.js.map +1 -0
- package/dist/runtime/spawn-plan.d.ts +13 -0
- package/dist/runtime/spawn-plan.d.ts.map +1 -0
- package/dist/runtime/spawn-plan.js +107 -0
- package/dist/runtime/spawn-plan.js.map +1 -0
- package/dist/runtime/spend.d.ts +41 -0
- package/dist/runtime/spend.d.ts.map +1 -0
- package/dist/runtime/spend.js +0 -0
- package/dist/runtime/spend.js.map +1 -0
- package/dist/runtime/sub-agent-runner.d.ts +19 -0
- package/dist/runtime/sub-agent-runner.d.ts.map +1 -0
- package/dist/runtime/sub-agent-runner.js +47 -0
- package/dist/runtime/sub-agent-runner.js.map +1 -0
- package/dist/safety/grants.d.ts +7 -0
- package/dist/safety/grants.d.ts.map +1 -0
- package/dist/safety/grants.js +53 -0
- package/dist/safety/grants.js.map +1 -0
- package/dist/safety/index.d.ts +72 -0
- package/dist/safety/index.d.ts.map +1 -0
- package/dist/safety/index.js +464 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/types.d.ts +254 -0
- package/dist/safety/types.d.ts.map +1 -0
- package/dist/safety/types.js +3 -0
- package/dist/safety/types.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +463 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/types.d.ts +177 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +3 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/testing/clock.d.ts +8 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +13 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/effect-verifier.d.ts +15 -0
- package/dist/testing/effect-verifier.d.ts.map +1 -0
- package/dist/testing/effect-verifier.js +27 -0
- package/dist/testing/effect-verifier.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider-fake.d.ts +14 -0
- package/dist/testing/provider-fake.d.ts.map +1 -0
- package/dist/testing/provider-fake.js +18 -0
- package/dist/testing/provider-fake.js.map +1 -0
- package/dist/testing/sandbox-stub.d.ts +15 -0
- package/dist/testing/sandbox-stub.d.ts.map +1 -0
- package/dist/testing/sandbox-stub.js +15 -0
- package/dist/testing/sandbox-stub.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +0 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +138 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +4 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/triggers/index.d.ts +4 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +187 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/types.d.ts +74 -0
- package/dist/triggers/types.d.ts.map +1 -0
- package/dist/triggers/types.js +5 -0
- package/dist/triggers/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { CorruptIndexError, ForgetListTamperError } from './types.js';
|
|
6
|
+
export { CorruptIndexError, ForgetListTamperError, BypassError, GuardBlocked, } from './types.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Deterministic fact-key extraction (§5.4) — equivalence class over
|
|
9
|
+
// (entity, relation, object), no model call on this path.
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
const STOPWORDS = new Set([
|
|
12
|
+
'i', 'my', 'me', 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'in', 'on',
|
|
13
|
+
'at', 'of', 'to', 'and', 'or', 'where', 'that', 'this', 'it', 'be', 'am',
|
|
14
|
+
]);
|
|
15
|
+
/** Relation/synonym canonicalization — collapses common paraphrases. */
|
|
16
|
+
const CANON = {
|
|
17
|
+
live: 'reside', lives: 'reside', living: 'reside', home: 'reside',
|
|
18
|
+
reside: 'reside', resides: 'reside', residence: 'reside',
|
|
19
|
+
job: 'role', position: 'role', role: 'role',
|
|
20
|
+
};
|
|
21
|
+
function keyTokens(text) {
|
|
22
|
+
const tokens = text
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
.replace(/[^a-z0-9\s-]/g, ' ')
|
|
25
|
+
.split(/\s+/)
|
|
26
|
+
.filter(t => t.length > 0 && !STOPWORDS.has(t))
|
|
27
|
+
.map(t => CANON[t] ?? t);
|
|
28
|
+
return [...new Set(tokens)].sort();
|
|
29
|
+
}
|
|
30
|
+
function factKeyOf(tokens) {
|
|
31
|
+
return sha256(tokens.join('|'));
|
|
32
|
+
}
|
|
33
|
+
function sha256(input) {
|
|
34
|
+
return createHash('sha256').update(input).digest('hex');
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Schema
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
const SCHEMA = `
|
|
40
|
+
CREATE TABLE IF NOT EXISTS facts (
|
|
41
|
+
rowid INTEGER PRIMARY KEY,
|
|
42
|
+
id TEXT UNIQUE NOT NULL,
|
|
43
|
+
text TEXT NOT NULL,
|
|
44
|
+
fact_key TEXT NOT NULL,
|
|
45
|
+
key_tokens TEXT NOT NULL,
|
|
46
|
+
valid_at TEXT NOT NULL,
|
|
47
|
+
invalid_at TEXT,
|
|
48
|
+
is_human_confirmed INTEGER NOT NULL DEFAULT 0,
|
|
49
|
+
source_authority INTEGER,
|
|
50
|
+
confidence REAL,
|
|
51
|
+
provenance TEXT NOT NULL DEFAULT '',
|
|
52
|
+
supersedes TEXT,
|
|
53
|
+
contradicts TEXT,
|
|
54
|
+
extends_key TEXT
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_facts_key ON facts(fact_key);
|
|
57
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts5(text);
|
|
58
|
+
CREATE TABLE IF NOT EXISTS do_not_remember (
|
|
59
|
+
rowid INTEGER PRIMARY KEY,
|
|
60
|
+
fact_key TEXT NOT NULL,
|
|
61
|
+
key_tokens TEXT NOT NULL,
|
|
62
|
+
reason TEXT NOT NULL,
|
|
63
|
+
is_human_confirmed INTEGER NOT NULL,
|
|
64
|
+
ts TEXT NOT NULL,
|
|
65
|
+
prev_hash TEXT NOT NULL,
|
|
66
|
+
row_hash TEXT NOT NULL
|
|
67
|
+
);
|
|
68
|
+
`;
|
|
69
|
+
/** The read/ingestion filter (§5.1 step 1) — applied in the SQL itself. */
|
|
70
|
+
const LIVE_FILTER = `invalid_at IS NULL AND fact_key NOT IN (SELECT fact_key FROM do_not_remember)`;
|
|
71
|
+
/**
|
|
72
|
+
* Spec §3 "Events emitted" — the Observability binding vocabulary. Each commit
|
|
73
|
+
* outcome maps to its declared event name (a fact mutation that did not
|
|
74
|
+
* supersede/block is `memory.committed`; NOT_FOUND is still a committed-class
|
|
75
|
+
* no-op outcome). The spec has no `memory.commit`/`memory.forget` event.
|
|
76
|
+
*/
|
|
77
|
+
const EVENT_BY_STATUS = {
|
|
78
|
+
COMMITTED: 'memory.committed',
|
|
79
|
+
SUPERSEDED: 'memory.superseded',
|
|
80
|
+
BLOCKED: 'memory.guard_blocked',
|
|
81
|
+
ROUTED_TO_REVIEW: 'memory.routed_to_review',
|
|
82
|
+
NOT_FOUND: 'memory.committed',
|
|
83
|
+
};
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// makeMemoryStore — the single indexer choke point (§5.1, ADR-0030)
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
export function makeMemoryStore(deps) {
|
|
88
|
+
let db = null;
|
|
89
|
+
let frozen = null;
|
|
90
|
+
const open = () => {
|
|
91
|
+
if (db)
|
|
92
|
+
return db;
|
|
93
|
+
mkdirSync(dirname(deps.dbPath), { recursive: true });
|
|
94
|
+
db = new Database(deps.dbPath);
|
|
95
|
+
db.exec(SCHEMA);
|
|
96
|
+
return db;
|
|
97
|
+
};
|
|
98
|
+
/** Reads block on cold start (§5.8 fail-loud) until an index exists. */
|
|
99
|
+
const openForRead = () => {
|
|
100
|
+
if (db)
|
|
101
|
+
return db;
|
|
102
|
+
if (!existsSync(deps.dbPath)) {
|
|
103
|
+
throw new CorruptIndexError('cold start: no index on disk — run rebuildFromFiles() first');
|
|
104
|
+
}
|
|
105
|
+
return open();
|
|
106
|
+
};
|
|
107
|
+
// --- forget-list (append-only, hash-chained; §4) ---
|
|
108
|
+
const dnrRows = (d) => d.prepare('SELECT * FROM do_not_remember ORDER BY rowid').all();
|
|
109
|
+
const appendForgetRow = (d, factKey, tokens, reason, humanConfirmed) => {
|
|
110
|
+
const last = d.prepare('SELECT row_hash FROM do_not_remember ORDER BY rowid DESC LIMIT 1').get();
|
|
111
|
+
const prevHash = last?.row_hash ?? 'genesis';
|
|
112
|
+
const ts = deps.nowIso();
|
|
113
|
+
const rowHash = sha256(`${prevHash}‖${factKey}‖${tokens.join('|')}‖${reason}‖${ts}`);
|
|
114
|
+
d.prepare('INSERT INTO do_not_remember (fact_key, key_tokens, reason, is_human_confirmed, ts, prev_hash, row_hash) VALUES (?,?,?,?,?,?,?)').run(factKey, tokens.join('|'), reason, humanConfirmed ? 1 : 0, ts, prevHash, rowHash);
|
|
115
|
+
};
|
|
116
|
+
const verifyForgetChain = (d) => {
|
|
117
|
+
let prev = 'genesis';
|
|
118
|
+
for (const row of dnrRows(d)) {
|
|
119
|
+
const expect = sha256(`${prev}‖${row.fact_key}‖${row.key_tokens}‖${row.reason}‖${row.ts}`);
|
|
120
|
+
if (row.prev_hash !== prev || row.row_hash !== expect) {
|
|
121
|
+
return { ok: false, detail: `hash mismatch at row ${row.rowid}` };
|
|
122
|
+
}
|
|
123
|
+
prev = row.row_hash;
|
|
124
|
+
}
|
|
125
|
+
return { ok: true };
|
|
126
|
+
};
|
|
127
|
+
const guardCheck = (d, factKey, tokens) => {
|
|
128
|
+
const exact = d.prepare('SELECT rowid FROM do_not_remember WHERE fact_key = ?').get(factKey);
|
|
129
|
+
if (exact)
|
|
130
|
+
return 'BLOCK';
|
|
131
|
+
// Residual-paraphrase fail-safe (§5.4): partial token overlap with a
|
|
132
|
+
// forgotten equivalence class routes to human review, never silent commit.
|
|
133
|
+
const tokenSet = new Set(tokens);
|
|
134
|
+
for (const row of dnrRows(d)) {
|
|
135
|
+
const theirs = row.key_tokens.split('|');
|
|
136
|
+
if (theirs.some(t => t.length > 0 && tokenSet.has(t)))
|
|
137
|
+
return 'REVIEW';
|
|
138
|
+
}
|
|
139
|
+
return 'PASS';
|
|
140
|
+
};
|
|
141
|
+
// --- tombstone helper (soft delete; no hard DELETE — §4) ---
|
|
142
|
+
const invalidate = (d, row, humanConfirmed) => {
|
|
143
|
+
d.prepare('UPDATE facts SET invalid_at = ?, is_human_confirmed = ? WHERE rowid = ?').run(deps.nowIso(), humanConfirmed ? 1 : 0, row.rowid);
|
|
144
|
+
d.prepare('DELETE FROM fts WHERE rowid = ?').run(row.rowid);
|
|
145
|
+
};
|
|
146
|
+
const insertFact = (d, text, factKey, tokens, supersedes) => {
|
|
147
|
+
const id = randomUUID();
|
|
148
|
+
const info = d.prepare('INSERT INTO facts (id, text, fact_key, key_tokens, valid_at, provenance, supersedes) VALUES (?,?,?,?,?,?,?)').run(id, text, factKey, tokens.join('|'), deps.nowIso(), 'commit', supersedes ?? null);
|
|
149
|
+
d.prepare('INSERT INTO fts (rowid, text) VALUES (?, ?)').run(info.lastInsertRowid, text);
|
|
150
|
+
return id;
|
|
151
|
+
};
|
|
152
|
+
const findById = (d, id) => d.prepare('SELECT * FROM facts WHERE id = ?').get(id);
|
|
153
|
+
const refreshDerivedIndex = (d) => {
|
|
154
|
+
// Every rebuild re-applies the full forget invariant (ADR-0030): the
|
|
155
|
+
// filter is in the SQL — there is no path around it.
|
|
156
|
+
d.exec('BEGIN');
|
|
157
|
+
d.exec('DELETE FROM fts');
|
|
158
|
+
d.exec(`INSERT INTO fts (rowid, text) SELECT rowid, text FROM facts WHERE ${LIVE_FILTER}`);
|
|
159
|
+
d.exec('COMMIT');
|
|
160
|
+
};
|
|
161
|
+
const reindexScoped = (d, ids) => {
|
|
162
|
+
// Scoped reindex (§5.1, ADR-0030): re-sync ONLY the listed ids' FTS rows,
|
|
163
|
+
// still through the forget filter. A listed id that is tombstoned/forgotten
|
|
164
|
+
// is dropped from the index; a live one is re-inserted. Unlisted ids are
|
|
165
|
+
// left untouched.
|
|
166
|
+
const selectLive = d.prepare(`SELECT rowid, text FROM facts WHERE id = ? AND ${LIVE_FILTER}`);
|
|
167
|
+
const findRowid = d.prepare('SELECT rowid FROM facts WHERE id = ?');
|
|
168
|
+
const delFts = d.prepare('DELETE FROM fts WHERE rowid = ?');
|
|
169
|
+
const insFts = d.prepare('INSERT INTO fts (rowid, text) VALUES (?, ?)');
|
|
170
|
+
d.exec('BEGIN');
|
|
171
|
+
try {
|
|
172
|
+
for (const id of ids) {
|
|
173
|
+
const known = findRowid.get(id);
|
|
174
|
+
if (!known)
|
|
175
|
+
continue;
|
|
176
|
+
delFts.run(known.rowid);
|
|
177
|
+
const live = selectLive.get(id);
|
|
178
|
+
if (live)
|
|
179
|
+
insFts.run(live.rowid, live.text);
|
|
180
|
+
}
|
|
181
|
+
d.exec('COMMIT');
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
try {
|
|
185
|
+
d.exec('ROLLBACK');
|
|
186
|
+
}
|
|
187
|
+
catch { /* preserve the original error */ }
|
|
188
|
+
throw err;
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
return {
|
|
192
|
+
// READ PATH — filter applied in the SQL itself (§5.2)
|
|
193
|
+
async search(query, opts) {
|
|
194
|
+
const d = openForRead();
|
|
195
|
+
const chain = verifyForgetChain(d);
|
|
196
|
+
if (!chain.ok)
|
|
197
|
+
throw new ForgetListTamperError(chain.detail ?? 'hash chain break');
|
|
198
|
+
// Reduce each token to its FTS5-indexable content (letters/digits) FIRST,
|
|
199
|
+
// then drop tokens that are now empty, so a query of only quotes /
|
|
200
|
+
// whitespace / punctuation yields no MATCH terms and is caught by the
|
|
201
|
+
// guard below — never relying on FTS5 treating '""' as an empty query.
|
|
202
|
+
const match = query
|
|
203
|
+
.split(/\s+/)
|
|
204
|
+
.map(t => t.replace(/[^a-zA-Z0-9]+/g, ''))
|
|
205
|
+
.filter(t => t.length > 0)
|
|
206
|
+
.map(t => `"${t}"`)
|
|
207
|
+
.join(' OR ');
|
|
208
|
+
if (!match)
|
|
209
|
+
return [];
|
|
210
|
+
const rows = d.prepare(`SELECT f.id, f.fact_key, f.text, bm25(fts) AS score
|
|
211
|
+
FROM fts JOIN facts f ON f.rowid = fts.rowid
|
|
212
|
+
WHERE fts MATCH ? AND f.invalid_at IS NULL
|
|
213
|
+
AND f.fact_key NOT IN (SELECT fact_key FROM do_not_remember)
|
|
214
|
+
ORDER BY score LIMIT ?`).all(match, opts?.limit ?? 20);
|
|
215
|
+
return rows.map(r => ({ id: r.id, factKey: r.fact_key, text: r.text, score: r.score }));
|
|
216
|
+
},
|
|
217
|
+
// Filter applies at EVERY lazy-load step — a tombstoned fact never leaks
|
|
218
|
+
// even as a 50-token annotation (§5.2).
|
|
219
|
+
async load(hitId, step) {
|
|
220
|
+
const d = openForRead();
|
|
221
|
+
const chain = verifyForgetChain(d);
|
|
222
|
+
if (!chain.ok)
|
|
223
|
+
throw new ForgetListTamperError(chain.detail ?? 'hash chain break');
|
|
224
|
+
const row = findById(d, hitId);
|
|
225
|
+
if (!row || row.invalid_at !== null) {
|
|
226
|
+
throw new CorruptIndexError(`fact ${hitId} is not live (tombstoned or unknown)`);
|
|
227
|
+
}
|
|
228
|
+
const dnr = d.prepare('SELECT rowid FROM do_not_remember WHERE fact_key = ?').get(row.fact_key);
|
|
229
|
+
if (dnr)
|
|
230
|
+
throw new CorruptIndexError(`fact ${hitId} is on the forget-list`);
|
|
231
|
+
if (step === 'annotation')
|
|
232
|
+
return row.text.slice(0, 200);
|
|
233
|
+
if (step === 'overview')
|
|
234
|
+
return row.text.slice(0, 2000);
|
|
235
|
+
return row.text;
|
|
236
|
+
},
|
|
237
|
+
// ENUMERATE — all live facts through the same forget filter as search() (Tier-4 B1)
|
|
238
|
+
async listLive() {
|
|
239
|
+
const d = openForRead();
|
|
240
|
+
const chain = verifyForgetChain(d);
|
|
241
|
+
if (!chain.ok)
|
|
242
|
+
throw new ForgetListTamperError(chain.detail ?? 'hash chain break');
|
|
243
|
+
const rows = d.prepare(`SELECT id, text, fact_key, valid_at, invalid_at, is_human_confirmed,
|
|
244
|
+
source_authority, confidence, provenance, supersedes, contradicts, extends_key
|
|
245
|
+
FROM facts WHERE ${LIVE_FILTER}
|
|
246
|
+
ORDER BY valid_at, id`).all();
|
|
247
|
+
return rows.map((r) => ({
|
|
248
|
+
id: r.id,
|
|
249
|
+
text: r.text,
|
|
250
|
+
factKey: r.fact_key,
|
|
251
|
+
validAt: r.valid_at,
|
|
252
|
+
invalidAt: r.invalid_at,
|
|
253
|
+
isHumanConfirmed: r.is_human_confirmed !== 0,
|
|
254
|
+
sourceAuthority: r.source_authority,
|
|
255
|
+
confidence: r.confidence,
|
|
256
|
+
provenance: r.provenance,
|
|
257
|
+
...(r.supersedes != null ? { supersedes: r.supersedes } : {}),
|
|
258
|
+
...(r.contradicts != null ? { contradicts: r.contradicts } : {}),
|
|
259
|
+
...(r.extends_key != null ? { extends: r.extends_key } : {}),
|
|
260
|
+
}));
|
|
261
|
+
},
|
|
262
|
+
// SESSION SNAPSHOT — read once, frozen for the store's lifetime (ADR-0007)
|
|
263
|
+
async readFrozenSnapshot() {
|
|
264
|
+
if (frozen)
|
|
265
|
+
return frozen;
|
|
266
|
+
const parts = [];
|
|
267
|
+
for (const name of ['constitution.md', 'SOUL.md', 'USER.md', 'MEMORY.md']) {
|
|
268
|
+
const p = join(deps.memoryRoot, name);
|
|
269
|
+
if (existsSync(p))
|
|
270
|
+
parts.push(readFileSync(p));
|
|
271
|
+
}
|
|
272
|
+
const bytes = Buffer.concat(parts);
|
|
273
|
+
frozen = { bytes, sha256: sha256(bytes) };
|
|
274
|
+
return frozen;
|
|
275
|
+
},
|
|
276
|
+
// WRITE PATH — the single choke point (§5.1). Guard + contradiction
|
|
277
|
+
// resolution + reindex in one transaction; journal emit is fail-closed.
|
|
278
|
+
async commit(op, _ctx) {
|
|
279
|
+
const d = open();
|
|
280
|
+
d.exec('BEGIN');
|
|
281
|
+
try {
|
|
282
|
+
let result;
|
|
283
|
+
if (op.op === 'NOOP') {
|
|
284
|
+
result = { status: 'COMMITTED', factId: op.targetId };
|
|
285
|
+
}
|
|
286
|
+
else if (op.op === 'DELETE') {
|
|
287
|
+
const target = findById(d, op.targetId);
|
|
288
|
+
if (target) {
|
|
289
|
+
invalidate(d, target, op.humanConfirmed);
|
|
290
|
+
if (op.humanConfirmed) {
|
|
291
|
+
appendForgetRow(d, target.fact_key, target.key_tokens.split('|'), op.reason, true);
|
|
292
|
+
}
|
|
293
|
+
result = { status: 'COMMITTED', factId: op.targetId };
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// No such fact — the intended (permanent) forget never happened.
|
|
297
|
+
// Surface that nothing was deleted rather than a misleading COMMITTED.
|
|
298
|
+
result = { status: 'NOT_FOUND', factId: op.targetId };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
// ADD / UPDATE share the guarded insert path
|
|
303
|
+
const tokens = keyTokens(op.text);
|
|
304
|
+
const factKey = factKeyOf(tokens);
|
|
305
|
+
const guard = guardCheck(d, factKey, tokens);
|
|
306
|
+
if (guard === 'BLOCK') {
|
|
307
|
+
result = {
|
|
308
|
+
status: 'BLOCKED',
|
|
309
|
+
verdict: { decision: 'BLOCK', matched: 'forget_list', factId: factKey },
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
else if (guard === 'REVIEW') {
|
|
313
|
+
// fail-safe: surfaced for human review, never stored searchable
|
|
314
|
+
result = { status: 'ROUTED_TO_REVIEW', verdict: { decision: 'REVIEW', reason: 'residual_paraphrase' } };
|
|
315
|
+
}
|
|
316
|
+
else if (op.op === 'UPDATE') {
|
|
317
|
+
const target = findById(d, op.targetId);
|
|
318
|
+
if (target && target.invalid_at === null)
|
|
319
|
+
invalidate(d, target, false);
|
|
320
|
+
const id = insertFact(d, op.text, factKey, tokens, target?.fact_key);
|
|
321
|
+
result = { status: 'SUPERSEDED', factId: id };
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
// Contradiction resolution (§5.6): a live fact with the same key is
|
|
325
|
+
// recency-superseded (tombstone, NOT forget-list) — re-assertable.
|
|
326
|
+
const live = d.prepare('SELECT * FROM facts WHERE fact_key = ? AND invalid_at IS NULL').all(factKey);
|
|
327
|
+
for (const row of live)
|
|
328
|
+
invalidate(d, row, false);
|
|
329
|
+
const id = insertFact(d, op.text, factKey, tokens);
|
|
330
|
+
result = { status: 'COMMITTED', factId: id };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// Fail-closed journal binding: if the Observability emit fails, the
|
|
334
|
+
// whole commit rolls back and no searchable fact persists (AC-03-15).
|
|
335
|
+
// Event name comes from the spec §3 "Events emitted" vocabulary,
|
|
336
|
+
// selected by outcome so the Observability binding is correct.
|
|
337
|
+
await deps.emitEvent(EVENT_BY_STATUS[result.status], { op: op.op, status: result.status });
|
|
338
|
+
d.exec('COMMIT');
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
try {
|
|
343
|
+
d.exec('ROLLBACK');
|
|
344
|
+
}
|
|
345
|
+
catch { /* preserve the original error */ }
|
|
346
|
+
throw err;
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
// FORGET-LIST — append-only, integrity-protected (§4)
|
|
350
|
+
async forget(factId, reason, humanConfirmed) {
|
|
351
|
+
const d = open();
|
|
352
|
+
d.exec('BEGIN');
|
|
353
|
+
try {
|
|
354
|
+
const row = findById(d, factId);
|
|
355
|
+
if (row) {
|
|
356
|
+
invalidate(d, row, humanConfirmed);
|
|
357
|
+
if (humanConfirmed)
|
|
358
|
+
appendForgetRow(d, row.fact_key, row.key_tokens.split('|'), reason, true);
|
|
359
|
+
}
|
|
360
|
+
// forget() is a fact mutation (tombstone + forget-list append) →
|
|
361
|
+
// the spec §3 vocabulary records it as memory.committed.
|
|
362
|
+
await deps.emitEvent('memory.committed', { op: 'forget', factId, humanConfirmed });
|
|
363
|
+
d.exec('COMMIT');
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
try {
|
|
367
|
+
d.exec('ROLLBACK');
|
|
368
|
+
}
|
|
369
|
+
catch { /* preserve the original error */ }
|
|
370
|
+
throw err;
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
// DERIVED-INDEX CONTRACT — any reindex routes through the choke point's
|
|
374
|
+
// filter, never around it (ADR-0030). A scoped { ids } request reindexes
|
|
375
|
+
// only those ids; 'all' rebuilds the whole derived index.
|
|
376
|
+
async reindex(scope) {
|
|
377
|
+
const d = open();
|
|
378
|
+
if (scope === 'all')
|
|
379
|
+
refreshDerivedIndex(d);
|
|
380
|
+
else
|
|
381
|
+
reindexScoped(d, scope.ids);
|
|
382
|
+
},
|
|
383
|
+
async rebuildFromFiles() {
|
|
384
|
+
// Reconstructs the derived FTS index from the canonical store,
|
|
385
|
+
// re-applying the full forget invariant during rebuild (§5.8).
|
|
386
|
+
refreshDerivedIndex(open());
|
|
387
|
+
},
|
|
388
|
+
// DETERMINISM — byte-stable MEMORY.md regeneration (§5.7): stable sort,
|
|
389
|
+
// fixed UTC format, \n endings, single trailing newline, no volatile ids.
|
|
390
|
+
async serializeMemoryIndex() {
|
|
391
|
+
const d = open();
|
|
392
|
+
const rows = d.prepare(`SELECT fact_key, valid_at, text FROM facts WHERE ${LIVE_FILTER}
|
|
393
|
+
ORDER BY fact_key, valid_at, text`).all();
|
|
394
|
+
const lines = ['# Memory index', ''];
|
|
395
|
+
for (const r of rows) {
|
|
396
|
+
lines.push(`- ${r.fact_key.slice(0, 12)} ${r.valid_at} ${r.text.replace(/\s+/g, ' ').trimEnd()}`);
|
|
397
|
+
}
|
|
398
|
+
const content = lines.join('\n').replace(/\n+$/, '') + '\n';
|
|
399
|
+
return { content, sha256: sha256(content) };
|
|
400
|
+
},
|
|
401
|
+
// INTEGRITY — PRAGMA + forget-list chain (§5.8); fails loud, never empty
|
|
402
|
+
async integrityCheck() {
|
|
403
|
+
if (!db && !existsSync(deps.dbPath)) {
|
|
404
|
+
return { ok: false, detail: 'no index on disk' };
|
|
405
|
+
}
|
|
406
|
+
const d = open();
|
|
407
|
+
const pragma = d.pragma('integrity_check');
|
|
408
|
+
if (pragma[0]?.integrity_check !== 'ok') {
|
|
409
|
+
return { ok: false, detail: `PRAGMA integrity_check: ${pragma[0]?.integrity_check}` };
|
|
410
|
+
}
|
|
411
|
+
const chain = verifyForgetChain(d);
|
|
412
|
+
if (!chain.ok) {
|
|
413
|
+
return { ok: false, detail: `ForgetListTamperError: ${chain.detail}` };
|
|
414
|
+
}
|
|
415
|
+
return { ok: true };
|
|
416
|
+
},
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAarC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAgBrE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAA;AAEnB,8EAA8E;AAC9E,oEAAoE;AACpE,0DAA0D;AAC1D,8EAA8E;AAE9E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;IACzE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CACzE,CAAC,CAAA;AAEF,wEAAwE;AACxE,MAAM,KAAK,GAA2B;IACpC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;IACjE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;IACxD,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAC5C,CAAA;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,MAAM,GAAG,IAAI;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AACpC,CAAC;AAED,SAAS,SAAS,CAAC,MAAgB;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,MAAM,CAAC,KAAsB;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Bd,CAAA;AAwCD,2EAA2E;AAC3E,MAAM,WAAW,GAAG,+EAA+E,CAAA;AAEnG;;;;;GAKG;AACH,MAAM,eAAe,GAA2C;IAC9D,SAAS,EAAE,kBAAkB;IAC7B,UAAU,EAAE,mBAAmB;IAC/B,OAAO,EAAE,sBAAsB;IAC/B,gBAAgB,EAAE,yBAAyB;IAC3C,SAAS,EAAE,kBAAkB;CAC9B,CAAA;AAED,8EAA8E;AAC9E,oEAAoE;AACpE,8EAA8E;AAE9E,MAAM,UAAU,eAAe,CAAC,IAAqB;IACnD,IAAI,EAAE,GAA6B,IAAI,CAAA;IACvC,IAAI,MAAM,GAA0B,IAAI,CAAA;IAExC,MAAM,IAAI,GAAG,GAAsB,EAAE;QACnC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAA;QACjB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACpD,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACf,OAAO,EAAE,CAAA;IACX,CAAC,CAAA;IAED,wEAAwE;IACxE,MAAM,WAAW,GAAG,GAAsB,EAAE;QAC1C,IAAI,EAAE;YAAE,OAAO,EAAE,CAAA;QACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,iBAAiB,CAAC,6DAA6D,CAAC,CAAA;QAC5F,CAAC;QACD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;IAED,sDAAsD;IAEtD,MAAM,OAAO,GAAG,CAAC,CAAoB,EAAY,EAAE,CACjD,CAAC,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAAc,CAAA;IAE7E,MAAM,eAAe,GAAG,CACtB,CAAoB,EACpB,OAAe,EACf,MAAgB,EAChB,MAAc,EACd,cAAuB,EACjB,EAAE;QACR,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,EAEjF,CAAA;QACb,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAA;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,QAAQ,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC,CAAA;QACpF,CAAC,CAAC,OAAO,CACP,gIAAgI,CACjI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IACzF,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,CAAC,CAAoB,EAAoC,EAAE;QACnF,IAAI,IAAI,GAAG,SAAS,CAAA;QACpB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;YAC1F,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACtD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,GAAG,CAAC,KAAK,EAAE,EAAE,CAAA;YACnE,CAAC;YACD,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAA;QACrB,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IACrB,CAAC,CAAA;IAMD,MAAM,UAAU,GAAG,CAAC,CAAoB,EAAE,OAAe,EAAE,MAAgB,EAAS,EAAE;QACpF,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC5F,IAAI,KAAK;YAAE,OAAO,OAAO,CAAA;QACzB,qEAAqE;QACrE,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;QAChC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACxC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,QAAQ,CAAA;QACxE,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,8DAA8D;IAE9D,MAAM,UAAU,GAAG,CAAC,CAAoB,EAAE,GAAY,EAAE,cAAuB,EAAQ,EAAE;QACvF,CAAC,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CACtF,IAAI,CAAC,MAAM,EAAE,EACb,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB,GAAG,CAAC,KAAK,CACV,CAAA;QACD,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7D,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CACjB,CAAoB,EACpB,IAAY,EACZ,OAAe,EACf,MAAgB,EAChB,UAAmB,EACX,EAAE;QACV,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CACpB,6GAA6G,CAC9G,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC,CAAA;QACvF,CAAC,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAA;QACxF,OAAO,EAAE,CAAA;IACX,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,CAAC,CAAoB,EAAE,EAAU,EAAuB,EAAE,CACzE,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAwB,CAAA;IAE9E,MAAM,mBAAmB,GAAG,CAAC,CAAoB,EAAQ,EAAE;QACzD,qEAAqE;QACrE,qDAAqD;QACrD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACf,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACzB,CAAC,CAAC,IAAI,CAAC,qEAAqE,WAAW,EAAE,CAAC,CAAA;QAC1F,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAClB,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,CAAC,CAAoB,EAAE,GAAa,EAAQ,EAAE;QAClE,0EAA0E;QAC1E,4EAA4E;QAC5E,yEAAyE;QACzE,kBAAkB;QAClB,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAC1B,kDAAkD,WAAW,EAAE,CAChE,CAAA;QACD,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAA;QACnE,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAA;QACvE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACf,IAAI,CAAC;YACH,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAkC,CAAA;gBAChE,IAAI,CAAC,KAAK;oBAAE,SAAQ;gBACpB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACvB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAgD,CAAA;gBAC9E,IAAI,IAAI;oBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7C,CAAC;YACD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;YACtE,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC,CAAA;IAED,OAAO;QACL,sDAAsD;QACtD,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAyB;YACnD,MAAM,CAAC,GAAG,WAAW,EAAE,CAAA;YACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,MAAM,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAA;YAClF,0EAA0E;YAC1E,mEAAmE;YACnE,sEAAsE;YACtE,uEAAuE;YACvE,MAAM,KAAK,GAAG,KAAK;iBAChB,KAAK,CAAC,KAAK,CAAC;iBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;iBACzC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;iBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;iBAClB,IAAI,CAAC,MAAM,CAAC,CAAA;YACf,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAA;YACrB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CACpB;;;;gCAIwB,CACzB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAyE,CAAA;YACvG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACzF,CAAC;QAED,yEAAyE;QACzE,wCAAwC;QACxC,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,IAAkB;YAC1C,MAAM,CAAC,GAAG,WAAW,EAAE,CAAA;YACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,MAAM,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAA;YAClF,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,iBAAiB,CAAC,QAAQ,KAAK,sCAAsC,CAAC,CAAA;YAClF,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC/F,IAAI,GAAG;gBAAE,MAAM,IAAI,iBAAiB,CAAC,QAAQ,KAAK,wBAAwB,CAAC,CAAA;YAC3E,IAAI,IAAI,KAAK,YAAY;gBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACxD,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YACvD,OAAO,GAAG,CAAC,IAAI,CAAA;QACjB,CAAC;QAED,oFAAoF;QACpF,KAAK,CAAC,QAAQ;YACZ,MAAM,CAAC,GAAG,WAAW,EAAE,CAAA;YACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,MAAM,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAA;YAClF,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CACpB;;4BAEoB,WAAW;+BACR,CACxB,CAAC,GAAG,EAAmB,CAAA;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAc,EAAE,CAAC,CAAC;gBAClC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,QAAQ;gBACnB,OAAO,EAAE,CAAC,CAAC,QAAQ;gBACnB,SAAS,EAAE,CAAC,CAAC,UAAU;gBACvB,gBAAgB,EAAE,CAAC,CAAC,kBAAkB,KAAK,CAAC;gBAC5C,eAAe,EAAE,CAAC,CAAC,gBAAgB;gBACnC,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D,CAAC,CAAC,CAAA;QACL,CAAC;QAED,2EAA2E;QAC3E,KAAK,CAAC,kBAAkB;YACtB,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;YACzB,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;gBAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;gBACrC,IAAI,UAAU,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;YAChD,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;YACzC,OAAO,MAAM,CAAA;QACf,CAAC;QAED,oEAAoE;QACpE,wEAAwE;QACxE,KAAK,CAAC,MAAM,CAAC,EAAY,EAAE,IAAgC;YACzD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAA;YAChB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACf,IAAI,CAAC;gBACH,IAAI,MAAoB,CAAA;gBAExB,IAAI,EAAE,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;oBACrB,MAAM,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAA;gBACvD,CAAC;qBAAM,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;oBACvC,IAAI,MAAM,EAAE,CAAC;wBACX,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,CAAA;wBACxC,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;4BACtB,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;wBACpF,CAAC;wBACD,MAAM,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAA;oBACvD,CAAC;yBAAM,CAAC;wBACN,iEAAiE;wBACjE,uEAAuE;wBACvE,MAAM,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAA;oBACvD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,6CAA6C;oBAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;oBACjC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;oBACjC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;oBAC5C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;wBACtB,MAAM,GAAG;4BACP,MAAM,EAAE,SAAS;4BACjB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;yBACxE,CAAA;oBACH,CAAC;yBAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;wBAC9B,gEAAgE;wBAChE,MAAM,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,CAAA;oBACzG,CAAC;yBAAM,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;wBAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAA;wBACvC,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI;4BAAE,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;wBACtE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;wBACpE,MAAM,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;oBAC/C,CAAC;yBAAM,CAAC;wBACN,oEAAoE;wBACpE,mEAAmE;wBACnE,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC,GAAG,CACzF,OAAO,CACK,CAAA;wBACd,KAAK,MAAM,GAAG,IAAI,IAAI;4BAAE,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;wBACjD,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;wBAClD,MAAM,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;oBAC9C,CAAC;gBACH,CAAC;gBAED,oEAAoE;gBACpE,sEAAsE;gBACtE,iEAAiE;gBACjE,+DAA+D;gBAC/D,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC1F,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAChB,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;gBACtE,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,MAAc,EAAE,cAAuB;YAClE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAA;YAChB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACf,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;gBAC/B,IAAI,GAAG,EAAE,CAAC;oBACR,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;oBAClC,IAAI,cAAc;wBAAE,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC/F,CAAC;gBACD,iEAAiE;gBACjE,yDAAyD;gBACzD,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAA;gBAClF,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;gBACtE,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,0DAA0D;QAC1D,KAAK,CAAC,OAAO,CAAC,KAAgC;YAC5C,MAAM,CAAC,GAAG,IAAI,EAAE,CAAA;YAChB,IAAI,KAAK,KAAK,KAAK;gBAAE,mBAAmB,CAAC,CAAC,CAAC,CAAA;;gBACtC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC;QAED,KAAK,CAAC,gBAAgB;YACpB,+DAA+D;YAC/D,+DAA+D;YAC/D,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7B,CAAC;QAED,wEAAwE;QACxE,0EAA0E;QAC1E,KAAK,CAAC,oBAAoB;YACxB,MAAM,CAAC,GAAG,IAAI,EAAE,CAAA;YAChB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CACpB,oDAAoD,WAAW;2CAC5B,CACpC,CAAC,GAAG,EAAiE,CAAA;YACtE,MAAM,KAAK,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;YACpC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YACnG,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAA;YAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAC7C,CAAC;QAED,yEAAyE;QACzE,KAAK,CAAC,cAAc;YAClB,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;YAClD,CAAC;YACD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAA;YAChB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAuC,CAAA;YAChF,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,EAAE,CAAC;gBACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,CAAA;YACvF,CAAC;YACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;YAClC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAA;YACxE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACrB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/** Hash of normalized (entity, relation, object) equivalence class. */
|
|
2
|
+
export type FactKey = string;
|
|
3
|
+
/** The unit of forgetting and contradiction resolution (§4 fact row). */
|
|
4
|
+
export interface MemoryFact {
|
|
5
|
+
id: string;
|
|
6
|
+
text: string;
|
|
7
|
+
factKey: FactKey;
|
|
8
|
+
validAt: string;
|
|
9
|
+
invalidAt: string | null;
|
|
10
|
+
isHumanConfirmed: boolean;
|
|
11
|
+
sourceAuthority: number | null;
|
|
12
|
+
confidence: number | null;
|
|
13
|
+
provenance: string;
|
|
14
|
+
supersedes?: string;
|
|
15
|
+
contradicts?: string;
|
|
16
|
+
extends?: string;
|
|
17
|
+
}
|
|
18
|
+
export type MemoryOp = {
|
|
19
|
+
op: 'ADD';
|
|
20
|
+
text: string;
|
|
21
|
+
} | {
|
|
22
|
+
op: 'UPDATE';
|
|
23
|
+
targetId: string;
|
|
24
|
+
text: string;
|
|
25
|
+
} | {
|
|
26
|
+
op: 'DELETE';
|
|
27
|
+
targetId: string;
|
|
28
|
+
humanConfirmed: boolean;
|
|
29
|
+
reason: string;
|
|
30
|
+
} | {
|
|
31
|
+
op: 'NOOP';
|
|
32
|
+
targetId: string;
|
|
33
|
+
};
|
|
34
|
+
export type GuardVerdict = {
|
|
35
|
+
decision: 'PASS';
|
|
36
|
+
} | {
|
|
37
|
+
decision: 'BLOCK';
|
|
38
|
+
matched: 'tombstone' | 'forget_list' | 'human_confirmed_delete';
|
|
39
|
+
factId: string;
|
|
40
|
+
} | {
|
|
41
|
+
decision: 'REVIEW';
|
|
42
|
+
reason: 'residual_paraphrase';
|
|
43
|
+
};
|
|
44
|
+
export interface CommitResult {
|
|
45
|
+
status: 'COMMITTED' | 'BLOCKED' | 'ROUTED_TO_REVIEW' | 'SUPERSEDED' | 'NOT_FOUND';
|
|
46
|
+
factId?: string;
|
|
47
|
+
verdict?: GuardVerdict;
|
|
48
|
+
}
|
|
49
|
+
export interface RankedHit {
|
|
50
|
+
id: string;
|
|
51
|
+
factKey: FactKey;
|
|
52
|
+
text: string;
|
|
53
|
+
score: number;
|
|
54
|
+
annotation?: string;
|
|
55
|
+
}
|
|
56
|
+
/** The three-step lazy-load depth (annotation → overview → full). */
|
|
57
|
+
export type LazyLoadStep = 'annotation' | 'overview' | 'full';
|
|
58
|
+
/** One row of the append-only, hash-chained do_not_remember table (§4). */
|
|
59
|
+
export interface ForgetListEntry {
|
|
60
|
+
factKey: FactKey;
|
|
61
|
+
reason: string;
|
|
62
|
+
isHumanConfirmed: boolean;
|
|
63
|
+
ts: string;
|
|
64
|
+
prevHash: string;
|
|
65
|
+
rowHash: string;
|
|
66
|
+
}
|
|
67
|
+
export interface FrozenSnapshot {
|
|
68
|
+
bytes: Buffer;
|
|
69
|
+
sha256: string;
|
|
70
|
+
}
|
|
71
|
+
export interface IntegrityResult {
|
|
72
|
+
ok: boolean;
|
|
73
|
+
detail?: string;
|
|
74
|
+
}
|
|
75
|
+
/** Fail-loud error: corrupt FTS5/SQLite index detected. */
|
|
76
|
+
export declare class CorruptIndexError extends Error {
|
|
77
|
+
constructor(detail: string);
|
|
78
|
+
}
|
|
79
|
+
/** Fail-loud error: hash-chain break on the do_not_remember forget-list. */
|
|
80
|
+
export declare class ForgetListTamperError extends Error {
|
|
81
|
+
constructor(detail: string);
|
|
82
|
+
}
|
|
83
|
+
/** A fact-mutating write arrived without passing the indexer choke point. */
|
|
84
|
+
export declare class BypassError extends Error {
|
|
85
|
+
constructor(detail: string);
|
|
86
|
+
}
|
|
87
|
+
/** Resurrection-guard blocked a write (convenience alias over CommitResult). */
|
|
88
|
+
export declare class GuardBlocked extends Error {
|
|
89
|
+
readonly verdict: GuardVerdict & {
|
|
90
|
+
decision: 'BLOCK';
|
|
91
|
+
};
|
|
92
|
+
constructor(verdict: GuardVerdict & {
|
|
93
|
+
decision: 'BLOCK';
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export interface Memory {
|
|
97
|
+
search(query: string, opts?: {
|
|
98
|
+
limit?: number;
|
|
99
|
+
}): Promise<RankedHit[]>;
|
|
100
|
+
load(hitId: string, step: LazyLoadStep): Promise<string>;
|
|
101
|
+
/** Enumerate live facts (invalid_at IS NULL, not forgotten) through the read-path
|
|
102
|
+
* forget filter. Used by nightly consolidation (Tier-4). */
|
|
103
|
+
listLive(): Promise<MemoryFact[]>;
|
|
104
|
+
readFrozenSnapshot(): Promise<FrozenSnapshot>;
|
|
105
|
+
commit(op: MemoryOp, ctx: {
|
|
106
|
+
withinSession: boolean;
|
|
107
|
+
}): Promise<CommitResult>;
|
|
108
|
+
forget(factId: string, reason: string, humanConfirmed: boolean): Promise<void>;
|
|
109
|
+
reindex(scope: 'all' | {
|
|
110
|
+
ids: string[];
|
|
111
|
+
}): Promise<void>;
|
|
112
|
+
rebuildFromFiles(): Promise<void>;
|
|
113
|
+
serializeMemoryIndex(): Promise<{
|
|
114
|
+
content: string;
|
|
115
|
+
sha256: string;
|
|
116
|
+
}>;
|
|
117
|
+
integrityCheck(): Promise<IntegrityResult>;
|
|
118
|
+
}
|
|
119
|
+
export interface MemoryStoreDeps {
|
|
120
|
+
/** Filesystem root that contains constitution.md, MEMORY.md, working/, daily/, etc. */
|
|
121
|
+
memoryRoot: string;
|
|
122
|
+
/** Path to the SQLite db file (FTS5 index). */
|
|
123
|
+
dbPath: string;
|
|
124
|
+
/** Emit an event to the Observability journal. Fail-closed: commit rolls back if this throws. */
|
|
125
|
+
emitEvent(event: string, payload: unknown): Promise<void>;
|
|
126
|
+
/** Returns current time as ISO-8601 string (injectable for deterministic tests). */
|
|
127
|
+
nowIso(): string;
|
|
128
|
+
}
|
|
129
|
+
/** The public store type — same contract as Memory with its deps baked in. */
|
|
130
|
+
export type MemoryStore = Memory;
|
|
131
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Memory component types — extracted from spec §3 and §4.
|
|
2
|
+
// Pure interfaces and types; no implementation here.
|
|
3
|
+
/** Fail-loud error: corrupt FTS5/SQLite index detected. */
|
|
4
|
+
export class CorruptIndexError extends Error {
|
|
5
|
+
constructor(detail) {
|
|
6
|
+
super(`CorruptIndexError: ${detail}`);
|
|
7
|
+
this.name = 'CorruptIndexError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** Fail-loud error: hash-chain break on the do_not_remember forget-list. */
|
|
11
|
+
export class ForgetListTamperError extends Error {
|
|
12
|
+
constructor(detail) {
|
|
13
|
+
super(`ForgetListTamperError: ${detail}`);
|
|
14
|
+
this.name = 'ForgetListTamperError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** A fact-mutating write arrived without passing the indexer choke point. */
|
|
18
|
+
export class BypassError extends Error {
|
|
19
|
+
constructor(detail) {
|
|
20
|
+
super(`BypassError: ${detail}`);
|
|
21
|
+
this.name = 'BypassError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Resurrection-guard blocked a write (convenience alias over CommitResult). */
|
|
25
|
+
export class GuardBlocked extends Error {
|
|
26
|
+
verdict;
|
|
27
|
+
constructor(verdict) {
|
|
28
|
+
super(`GuardBlocked: fact_key matched ${verdict.matched}`);
|
|
29
|
+
this.verdict = verdict;
|
|
30
|
+
this.name = 'GuardBlocked';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,qDAAqD;AA+FrD,2DAA2D;AAC3D,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,MAAc;QACxB,KAAK,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,MAAc;QACxB,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,MAAc;QACxB,KAAK,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,OAAO,YAAa,SAAQ,KAAK;IACT;IAA5B,YAA4B,OAA6C;QACvE,KAAK,CAAC,kCAAkC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QADhC,YAAO,GAAP,OAAO,CAAsC;QAEvE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { ConsolidationRunner, ConsolidationDeps, NightlyConfig, LintPassResult, MorningCard, NightResult, Stage, MemOp, FactKey, Fact, Diff, QuarantinedDiff, Generator, Judge, JudgeVerdict, Validators, ValidatorId, ValidatorResult, StagedPatch, StagingArea, SkillDraft, RunLock, LockToken, NormalizedDayLog, NormalizedDayLogRecord, LintFinding, LintOrphan, LintStaleAnnotation, LintBrokenEdge, MorningCardItem, ResurrectionBlocked, HygieneReport, BackupStatus, VerificationMiss, CommitJournalEntry, CommitJournalState, SessionRecord, ArchiveStore, GitBackup, Hygiene, TraceProbe, EnvContext, LintInputs, CommitJournal, } from './types.js';
|
|
2
|
+
import type { ConsolidationRunner, ConsolidationDeps } from './types.js';
|
|
3
|
+
export declare function makeConsolidationRunner(deps: ConsolidationDeps): ConsolidationRunner;
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nightly/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,KAAK,EACL,KAAK,EACL,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,eAAe,EACf,SAAS,EACT,KAAK,EACL,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,UAAU,EACV,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAqBlB,MAAM,YAAY,CAAA;AAkDnB,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CA4bpF"}
|