@h-rig/runtime 0.0.6-alpha.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/README.md +27 -0
- package/dist/bin/rig-agent-dispatch.js +9615 -0
- package/dist/bin/rig-agent.js +9512 -0
- package/dist/bin/rig-browser-tool.js +269 -0
- package/dist/src/agent-mode.js +48 -0
- package/dist/src/baked-secrets.js +121 -0
- package/dist/src/binary-build-worker.js +312 -0
- package/dist/src/binary-run.js +540 -0
- package/dist/src/boundaries.js +1 -0
- package/dist/src/build-time-config.js +25 -0
- package/dist/src/control-plane/agent-roles.js +27 -0
- package/dist/src/control-plane/agent-wrapper.js +9621 -0
- package/dist/src/control-plane/authority-files.js +582 -0
- package/dist/src/control-plane/browser-contract.js +135 -0
- package/dist/src/control-plane/controlled-bash.js +1111 -0
- package/dist/src/control-plane/errors.js +13 -0
- package/dist/src/control-plane/harness-main.js +10828 -0
- package/dist/src/control-plane/hook-materializer.js +75 -0
- package/dist/src/control-plane/hooks/audit-trail.js +353 -0
- package/dist/src/control-plane/hooks/completion-verification.js +7552 -0
- package/dist/src/control-plane/hooks/import-guard.js +890 -0
- package/dist/src/control-plane/hooks/inject-context.js +4189 -0
- package/dist/src/control-plane/hooks/post-edit-lint.js +43 -0
- package/dist/src/control-plane/hooks/safety-guard.js +910 -0
- package/dist/src/control-plane/hooks/scope-guard.js +907 -0
- package/dist/src/control-plane/hooks/shared.js +44 -0
- package/dist/src/control-plane/hooks/submodule-branch.js +7797 -0
- package/dist/src/control-plane/hooks/task-runtime-start.js +7799 -0
- package/dist/src/control-plane/hooks/test-integrity-guard.js +891 -0
- package/dist/src/control-plane/materialize-task-config.js +453 -0
- package/dist/src/control-plane/memory-sync/cli.js +2019 -0
- package/dist/src/control-plane/memory-sync/db.js +753 -0
- package/dist/src/control-plane/memory-sync/embed.js +281 -0
- package/dist/src/control-plane/memory-sync/index.js +2049 -0
- package/dist/src/control-plane/memory-sync/query.js +294 -0
- package/dist/src/control-plane/memory-sync/read.js +784 -0
- package/dist/src/control-plane/memory-sync/types.js +6 -0
- package/dist/src/control-plane/memory-sync/write.js +1547 -0
- package/dist/src/control-plane/native/git-native.js +490 -0
- package/dist/src/control-plane/native/git-ops.js +2860 -0
- package/dist/src/control-plane/native/harness-cli.js +9721 -0
- package/dist/src/control-plane/native/pr-automation.js +373 -0
- package/dist/src/control-plane/native/profile-ops.js +481 -0
- package/dist/src/control-plane/native/repo-ops.js +2342 -0
- package/dist/src/control-plane/native/root-resolver.js +66 -0
- package/dist/src/control-plane/native/run-ops.js +3281 -0
- package/dist/src/control-plane/native/runtime-native-sidecar.js +299 -0
- package/dist/src/control-plane/native/runtime-native.js +392 -0
- package/dist/src/control-plane/native/scope-rules.js +17 -0
- package/dist/src/control-plane/native/task-ops.js +6320 -0
- package/dist/src/control-plane/native/task-state.js +1512 -0
- package/dist/src/control-plane/native/utils.js +535 -0
- package/dist/src/control-plane/native/validator-binaries.js +889 -0
- package/dist/src/control-plane/native/validator.js +2197 -0
- package/dist/src/control-plane/native/verifier.js +3249 -0
- package/dist/src/control-plane/native/workspace-ops.js +1635 -0
- package/dist/src/control-plane/plugin-host-context.js +334 -0
- package/dist/src/control-plane/project-main-pre-run-sync.js +630 -0
- package/dist/src/control-plane/provider/claude-stream-records.js +158 -0
- package/dist/src/control-plane/provider/codex-app-server.js +885 -0
- package/dist/src/control-plane/provider/codex-exec-records.js +203 -0
- package/dist/src/control-plane/provider/rig-task-run-skill.js +39 -0
- package/dist/src/control-plane/provider/runtime-instructions.js +96 -0
- package/dist/src/control-plane/remote.js +854 -0
- package/dist/src/control-plane/repos/index.js +473 -0
- package/dist/src/control-plane/repos/layout.js +124 -0
- package/dist/src/control-plane/repos/mirror/bootstrap.js +268 -0
- package/dist/src/control-plane/repos/mirror/refresh.js +398 -0
- package/dist/src/control-plane/repos/mirror/state.js +167 -0
- package/dist/src/control-plane/repos/registry.js +77 -0
- package/dist/src/control-plane/repos/types.js +1 -0
- package/dist/src/control-plane/runtime/agent-mode.js +48 -0
- package/dist/src/control-plane/runtime/baked-secrets.js +120 -0
- package/dist/src/control-plane/runtime/claude-tool-router-binary.js +343 -0
- package/dist/src/control-plane/runtime/claude-tool-router.js +520 -0
- package/dist/src/control-plane/runtime/context.js +216 -0
- package/dist/src/control-plane/runtime/events.js +218 -0
- package/dist/src/control-plane/runtime/guard-types.js +6 -0
- package/dist/src/control-plane/runtime/guard.js +880 -0
- package/dist/src/control-plane/runtime/image/fingerprint-sidecar.js +1194 -0
- package/dist/src/control-plane/runtime/image/index.js +2255 -0
- package/dist/src/control-plane/runtime/image-fingerprint-sidecar.js +1191 -0
- package/dist/src/control-plane/runtime/image.js +2255 -0
- package/dist/src/control-plane/runtime/index.js +8511 -0
- package/dist/src/control-plane/runtime/isolation/discovery.js +599 -0
- package/dist/src/control-plane/runtime/isolation/home.js +1217 -0
- package/dist/src/control-plane/runtime/isolation/index.js +8193 -0
- package/dist/src/control-plane/runtime/isolation/runner.js +2651 -0
- package/dist/src/control-plane/runtime/isolation/shared.js +501 -0
- package/dist/src/control-plane/runtime/isolation/toolchain.js +1892 -0
- package/dist/src/control-plane/runtime/isolation/types.js +1 -0
- package/dist/src/control-plane/runtime/isolation/worktree.js +509 -0
- package/dist/src/control-plane/runtime/isolation.js +8193 -0
- package/dist/src/control-plane/runtime/overlay.js +67 -0
- package/dist/src/control-plane/runtime/plugin-mode.js +41 -0
- package/dist/src/control-plane/runtime/plugins.js +1131 -0
- package/dist/src/control-plane/runtime/provisioning-env.js +220 -0
- package/dist/src/control-plane/runtime/queue.js +8358 -0
- package/dist/src/control-plane/runtime/rig-shell.js +205 -0
- package/dist/src/control-plane/runtime/rig-tools.js +182 -0
- package/dist/src/control-plane/runtime/runner-context.js +1 -0
- package/dist/src/control-plane/runtime/runtime-paths.js +184 -0
- package/dist/src/control-plane/runtime/sandbox/backend-bwrap.js +311 -0
- package/dist/src/control-plane/runtime/sandbox/backend-none.js +21 -0
- package/dist/src/control-plane/runtime/sandbox/backend-seatbelt.js +268 -0
- package/dist/src/control-plane/runtime/sandbox/backend.js +1718 -0
- package/dist/src/control-plane/runtime/sandbox/orchestrator.js +1745 -0
- package/dist/src/control-plane/runtime/sandbox/utils.js +137 -0
- package/dist/src/control-plane/runtime/sandbox-backend-bwrap.js +311 -0
- package/dist/src/control-plane/runtime/sandbox-backend-none.js +21 -0
- package/dist/src/control-plane/runtime/sandbox-backend-seatbelt.js +268 -0
- package/dist/src/control-plane/runtime/sandbox-backend.js +1718 -0
- package/dist/src/control-plane/runtime/sandbox-orchestrator.js +1745 -0
- package/dist/src/control-plane/runtime/sandbox-utils.js +137 -0
- package/dist/src/control-plane/runtime/snapshot/index.js +454 -0
- package/dist/src/control-plane/runtime/snapshot/sidecar.js +502 -0
- package/dist/src/control-plane/runtime/snapshot/task-run.js +1578 -0
- package/dist/src/control-plane/runtime/snapshot-sidecar.js +498 -0
- package/dist/src/control-plane/runtime/snapshot.js +454 -0
- package/dist/src/control-plane/runtime/task-run-snapshot.js +1578 -0
- package/dist/src/control-plane/runtime/tool-gateway.js +422 -0
- package/dist/src/control-plane/runtime/tooling/browser-tools.js +32 -0
- package/dist/src/control-plane/runtime/tooling/claude-router-binary.js +343 -0
- package/dist/src/control-plane/runtime/tooling/claude-router.js +524 -0
- package/dist/src/control-plane/runtime/tooling/file-tools.js +182 -0
- package/dist/src/control-plane/runtime/tooling/gateway.js +422 -0
- package/dist/src/control-plane/runtime/tooling/index.js +1290 -0
- package/dist/src/control-plane/runtime/tooling/shell.js +205 -0
- package/dist/src/control-plane/runtime/types.js +1 -0
- package/dist/src/control-plane/setup-version.js +14 -0
- package/dist/src/control-plane/state-sync/index.js +1509 -0
- package/dist/src/control-plane/state-sync/read.js +856 -0
- package/dist/src/control-plane/state-sync/reconcile.js +260 -0
- package/dist/src/control-plane/state-sync/repo.js +302 -0
- package/dist/src/control-plane/state-sync/types.js +111 -0
- package/dist/src/control-plane/state-sync/write.js +1469 -0
- package/dist/src/control-plane/task-fields.js +38 -0
- package/dist/src/control-plane/task-source-bootstrap.js +46 -0
- package/dist/src/control-plane/task-source.js +30 -0
- package/dist/src/control-plane/tasks/legacy-task-config-source.js +130 -0
- package/dist/src/control-plane/tasks/plugin-task-source.js +103 -0
- package/dist/src/control-plane/tasks/source-aware-task-config-source.js +611 -0
- package/dist/src/control-plane/tasks/source-lifecycle.js +1093 -0
- package/dist/src/control-plane/tasks/task-record-reader.js +9 -0
- package/dist/src/control-plane/validators/boundary/public-apis.js +107 -0
- package/dist/src/control-plane/validators/integration/_shared.js +51 -0
- package/dist/src/control-plane/validators/integration/adm-audit-http.js +85 -0
- package/dist/src/control-plane/validators/integration/adm-auth-http.js +78 -0
- package/dist/src/control-plane/validators/integration/adm-issuer-http.js +80 -0
- package/dist/src/control-plane/validators/integration/adm-migration.js +78 -0
- package/dist/src/control-plane/validators/integration/adm-scaffold.js +78 -0
- package/dist/src/control-plane/validators/runtime-registration.js +64 -0
- package/dist/src/control-plane/validators/shared.js +683 -0
- package/dist/src/events.js +218 -0
- package/dist/src/execution.js +35 -0
- package/dist/src/index.js +1633 -0
- package/dist/src/layout.js +145 -0
- package/dist/src/local-server.js +202 -0
- package/dist/src/plugins.js +329 -0
- package/dist/src/remote-http.js +83 -0
- package/dist/src/runtime-context.js +216 -0
- package/dist/src/types.js +1 -0
- package/native/darwin-arm64/bin/rig-git +0 -0
- package/native/darwin-arm64/bin/rig-shell +0 -0
- package/native/darwin-arm64/bin/rig-tools +0 -0
- package/native/darwin-arm64/lib/runtime-native-darwin-arm64.dylib +0 -0
- package/native/darwin-arm64/lib/runtime-native.dylib +0 -0
- package/native/darwin-arm64/manifest.json +1 -0
- package/native/linux-x64/bin/rig-git +0 -0
- package/native/linux-x64/bin/rig-shell +0 -0
- package/native/linux-x64/bin/rig-tools +0 -0
- package/native/linux-x64/lib/runtime-native-linux-x64.so +0 -0
- package/native/linux-x64/lib/runtime-native.so +0 -0
- package/native/linux-x64/manifest.json +1 -0
- package/package.json +74 -0
- package/skills/rig-task-run.md +71 -0
|
@@ -0,0 +1,753 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/runtime/src/control-plane/memory-sync/db.ts
|
|
3
|
+
import { Database } from "bun:sqlite";
|
|
4
|
+
import { mkdirSync } from "fs";
|
|
5
|
+
import { dirname } from "path";
|
|
6
|
+
|
|
7
|
+
// packages/runtime/src/control-plane/memory-sync/types.ts
|
|
8
|
+
var NO_MATCH_RETRIEVAL_CANONICAL_KEY = "__memory_recall__:none";
|
|
9
|
+
|
|
10
|
+
// packages/runtime/src/control-plane/memory-sync/db.ts
|
|
11
|
+
var SCHEMA_STATEMENTS = [
|
|
12
|
+
`CREATE TABLE IF NOT EXISTS memory_events (
|
|
13
|
+
event_id TEXT PRIMARY KEY,
|
|
14
|
+
event_type TEXT NOT NULL,
|
|
15
|
+
canonical_key TEXT NOT NULL,
|
|
16
|
+
summary TEXT,
|
|
17
|
+
kind TEXT,
|
|
18
|
+
category TEXT,
|
|
19
|
+
confidence REAL,
|
|
20
|
+
source_run_id TEXT,
|
|
21
|
+
source_task_id TEXT,
|
|
22
|
+
branch TEXT,
|
|
23
|
+
source_canonical_key TEXT,
|
|
24
|
+
replacement_canonical_key TEXT,
|
|
25
|
+
retrieval_query TEXT,
|
|
26
|
+
retrieval_rank INTEGER,
|
|
27
|
+
feedback_outcome TEXT,
|
|
28
|
+
details_json TEXT,
|
|
29
|
+
created_at TEXT NOT NULL
|
|
30
|
+
)`,
|
|
31
|
+
`CREATE TABLE IF NOT EXISTS memory_items (
|
|
32
|
+
canonical_key TEXT PRIMARY KEY,
|
|
33
|
+
summary TEXT NOT NULL,
|
|
34
|
+
kind TEXT,
|
|
35
|
+
category TEXT,
|
|
36
|
+
status TEXT NOT NULL,
|
|
37
|
+
confidence REAL NOT NULL,
|
|
38
|
+
source_run_id TEXT,
|
|
39
|
+
source_task_id TEXT,
|
|
40
|
+
branch TEXT,
|
|
41
|
+
details_json TEXT,
|
|
42
|
+
created_at TEXT NOT NULL,
|
|
43
|
+
updated_at TEXT NOT NULL,
|
|
44
|
+
last_event_id TEXT NOT NULL,
|
|
45
|
+
superseded_by TEXT,
|
|
46
|
+
embedding TEXT
|
|
47
|
+
)`,
|
|
48
|
+
`CREATE TABLE IF NOT EXISTS memory_links (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
from_key TEXT NOT NULL,
|
|
51
|
+
to_key TEXT NOT NULL,
|
|
52
|
+
relation TEXT NOT NULL,
|
|
53
|
+
source_event_id TEXT NOT NULL,
|
|
54
|
+
created_at TEXT NOT NULL
|
|
55
|
+
)`,
|
|
56
|
+
`CREATE TABLE IF NOT EXISTS task_runs (
|
|
57
|
+
run_id TEXT PRIMARY KEY,
|
|
58
|
+
task_id TEXT,
|
|
59
|
+
branch TEXT,
|
|
60
|
+
first_event_id TEXT,
|
|
61
|
+
last_event_id TEXT,
|
|
62
|
+
created_at TEXT NOT NULL,
|
|
63
|
+
updated_at TEXT NOT NULL
|
|
64
|
+
)`,
|
|
65
|
+
`CREATE TABLE IF NOT EXISTS retrieval_feedback (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
+
canonical_key TEXT NOT NULL,
|
|
68
|
+
outcome TEXT NOT NULL,
|
|
69
|
+
retrieval_rank INTEGER,
|
|
70
|
+
source_run_id TEXT,
|
|
71
|
+
source_task_id TEXT,
|
|
72
|
+
query_text TEXT,
|
|
73
|
+
source_event_id TEXT NOT NULL,
|
|
74
|
+
created_at TEXT NOT NULL
|
|
75
|
+
)`
|
|
76
|
+
];
|
|
77
|
+
var MEMORY_EVENT_COLUMNS = [
|
|
78
|
+
["summary", "TEXT"],
|
|
79
|
+
["kind", "TEXT"],
|
|
80
|
+
["category", "TEXT"],
|
|
81
|
+
["confidence", "REAL"],
|
|
82
|
+
["source_run_id", "TEXT"],
|
|
83
|
+
["source_task_id", "TEXT"],
|
|
84
|
+
["branch", "TEXT"],
|
|
85
|
+
["source_canonical_key", "TEXT"],
|
|
86
|
+
["replacement_canonical_key", "TEXT"],
|
|
87
|
+
["retrieval_query", "TEXT"],
|
|
88
|
+
["retrieval_rank", "INTEGER"],
|
|
89
|
+
["feedback_outcome", "TEXT"],
|
|
90
|
+
["details_json", "TEXT"]
|
|
91
|
+
];
|
|
92
|
+
var MEMORY_ITEM_COLUMNS = [
|
|
93
|
+
["kind", "TEXT"],
|
|
94
|
+
["category", "TEXT"],
|
|
95
|
+
["branch", "TEXT"],
|
|
96
|
+
["details_json", "TEXT"],
|
|
97
|
+
["superseded_by", "TEXT"],
|
|
98
|
+
["embedding", "TEXT"]
|
|
99
|
+
];
|
|
100
|
+
function jsonText(value) {
|
|
101
|
+
if (value == null) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
return JSON.stringify(value);
|
|
105
|
+
}
|
|
106
|
+
function parseJsonRecord(value) {
|
|
107
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
return JSON.parse(value);
|
|
111
|
+
}
|
|
112
|
+
function parseEmbedding(value) {
|
|
113
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return JSON.parse(value);
|
|
117
|
+
}
|
|
118
|
+
function rowString(row, key) {
|
|
119
|
+
const value = row[key];
|
|
120
|
+
return value == null ? null : String(value);
|
|
121
|
+
}
|
|
122
|
+
function eventSummary(event) {
|
|
123
|
+
return "summary" in event ? event.summary : null;
|
|
124
|
+
}
|
|
125
|
+
function eventKind(event) {
|
|
126
|
+
return "kind" in event ? event.kind : null;
|
|
127
|
+
}
|
|
128
|
+
function eventCategory(event) {
|
|
129
|
+
return "category" in event ? event.category ?? null : null;
|
|
130
|
+
}
|
|
131
|
+
function eventConfidence(event) {
|
|
132
|
+
return "confidence" in event ? event.confidence : null;
|
|
133
|
+
}
|
|
134
|
+
function eventDetails(event) {
|
|
135
|
+
return "details" in event ? event.details ?? null : null;
|
|
136
|
+
}
|
|
137
|
+
function eventSourceCanonicalKey(event) {
|
|
138
|
+
return "sourceCanonicalKey" in event ? event.sourceCanonicalKey : null;
|
|
139
|
+
}
|
|
140
|
+
function eventReplacementCanonicalKey(event) {
|
|
141
|
+
return "replacementCanonicalKey" in event ? event.replacementCanonicalKey : null;
|
|
142
|
+
}
|
|
143
|
+
function eventRetrievalQuery(event) {
|
|
144
|
+
return "retrievalQuery" in event ? event.retrievalQuery ?? null : null;
|
|
145
|
+
}
|
|
146
|
+
function eventRetrievalRank(event) {
|
|
147
|
+
return "retrievalRank" in event ? event.retrievalRank : null;
|
|
148
|
+
}
|
|
149
|
+
function eventFeedbackOutcome(event) {
|
|
150
|
+
return "feedbackOutcome" in event ? event.feedbackOutcome : null;
|
|
151
|
+
}
|
|
152
|
+
function normalizeStatement(statement, args) {
|
|
153
|
+
if (typeof statement === "string") {
|
|
154
|
+
return { sql: statement, args };
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
sql: statement.sql,
|
|
158
|
+
args: statement.args ?? args
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function normalizeBindings(bindings) {
|
|
162
|
+
return (bindings ?? []).map((binding) => binding === undefined ? null : binding);
|
|
163
|
+
}
|
|
164
|
+
function statementVerb(sql) {
|
|
165
|
+
const match = sql.trim().match(/^[A-Za-z]+/);
|
|
166
|
+
return match ? match[0].toUpperCase() : "";
|
|
167
|
+
}
|
|
168
|
+
function isMutationStatement(sql) {
|
|
169
|
+
return new Set([
|
|
170
|
+
"ALTER",
|
|
171
|
+
"ATTACH",
|
|
172
|
+
"BEGIN",
|
|
173
|
+
"COMMIT",
|
|
174
|
+
"CREATE",
|
|
175
|
+
"DELETE",
|
|
176
|
+
"DETACH",
|
|
177
|
+
"DROP",
|
|
178
|
+
"END",
|
|
179
|
+
"INSERT",
|
|
180
|
+
"REINDEX",
|
|
181
|
+
"RELEASE",
|
|
182
|
+
"REPLACE",
|
|
183
|
+
"ROLLBACK",
|
|
184
|
+
"SAVEPOINT",
|
|
185
|
+
"UPDATE",
|
|
186
|
+
"VACUUM"
|
|
187
|
+
]).has(statementVerb(sql));
|
|
188
|
+
}
|
|
189
|
+
function executeSqlite(sqlite, statement, args) {
|
|
190
|
+
const normalized = normalizeStatement(statement, args);
|
|
191
|
+
const bindings = normalizeBindings(normalized.args);
|
|
192
|
+
if (isMutationStatement(normalized.sql)) {
|
|
193
|
+
const result = bindings.length > 0 ? sqlite.run(normalized.sql, ...bindings) : sqlite.run(normalized.sql);
|
|
194
|
+
return {
|
|
195
|
+
rows: [],
|
|
196
|
+
rowsAffected: Number(result.changes)
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const query = sqlite.query(normalized.sql);
|
|
200
|
+
const rows = bindings.length > 0 ? query.all(...bindings) : query.all();
|
|
201
|
+
return {
|
|
202
|
+
rows,
|
|
203
|
+
rowsAffected: 0
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function createTransaction(sqlite, mode) {
|
|
207
|
+
sqlite.run(mode === "write" ? "BEGIN IMMEDIATE" : "BEGIN");
|
|
208
|
+
let active = true;
|
|
209
|
+
return {
|
|
210
|
+
async execute(statement, args) {
|
|
211
|
+
if (!active) {
|
|
212
|
+
throw new Error("memory transaction is closed");
|
|
213
|
+
}
|
|
214
|
+
return executeSqlite(sqlite, statement, args);
|
|
215
|
+
},
|
|
216
|
+
async commit() {
|
|
217
|
+
if (!active) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
sqlite.run("COMMIT");
|
|
221
|
+
active = false;
|
|
222
|
+
},
|
|
223
|
+
async rollback() {
|
|
224
|
+
if (!active) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
sqlite.run("ROLLBACK");
|
|
228
|
+
active = false;
|
|
229
|
+
},
|
|
230
|
+
close() {
|
|
231
|
+
if (!active) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
sqlite.run("ROLLBACK");
|
|
236
|
+
} catch {} finally {
|
|
237
|
+
active = false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function createMemoryDbClient(sqlite) {
|
|
243
|
+
return {
|
|
244
|
+
async execute(statement, args) {
|
|
245
|
+
return executeSqlite(sqlite, statement, args);
|
|
246
|
+
},
|
|
247
|
+
async transaction(mode) {
|
|
248
|
+
return createTransaction(sqlite, mode);
|
|
249
|
+
},
|
|
250
|
+
close() {
|
|
251
|
+
sqlite.close();
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
async function listColumns(executor, tableName) {
|
|
256
|
+
const result = await executor.execute(`PRAGMA table_info(${tableName})`);
|
|
257
|
+
return new Set(result.rows.map((row) => String(row.name)));
|
|
258
|
+
}
|
|
259
|
+
async function ensureColumns(executor, tableName, columns) {
|
|
260
|
+
const existing = await listColumns(executor, tableName);
|
|
261
|
+
for (const [columnName, definition] of columns) {
|
|
262
|
+
if (!existing.has(columnName)) {
|
|
263
|
+
await executor.execute(`ALTER TABLE ${tableName} ADD COLUMN ${columnName} ${definition}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async function ensureSchema(db) {
|
|
268
|
+
for (const statement of SCHEMA_STATEMENTS) {
|
|
269
|
+
await db.client.execute(statement);
|
|
270
|
+
}
|
|
271
|
+
await ensureColumns(db.client, "memory_events", MEMORY_EVENT_COLUMNS);
|
|
272
|
+
await ensureColumns(db.client, "memory_items", MEMORY_ITEM_COLUMNS);
|
|
273
|
+
}
|
|
274
|
+
function toMemoryItemRow(row) {
|
|
275
|
+
return {
|
|
276
|
+
canonicalKey: String(row.canonical_key),
|
|
277
|
+
summary: String(row.summary),
|
|
278
|
+
kind: rowString(row, "kind"),
|
|
279
|
+
category: rowString(row, "category"),
|
|
280
|
+
status: String(row.status),
|
|
281
|
+
confidence: Number(row.confidence),
|
|
282
|
+
sourceRunId: rowString(row, "source_run_id"),
|
|
283
|
+
sourceTaskId: rowString(row, "source_task_id"),
|
|
284
|
+
branch: rowString(row, "branch"),
|
|
285
|
+
details: parseJsonRecord(row.details_json),
|
|
286
|
+
createdAt: String(row.created_at),
|
|
287
|
+
updatedAt: String(row.updated_at),
|
|
288
|
+
lastEventId: String(row.last_event_id),
|
|
289
|
+
supersededBy: rowString(row, "superseded_by"),
|
|
290
|
+
embedding: parseEmbedding(row.embedding)
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function toMemoryEventRow(row) {
|
|
294
|
+
return {
|
|
295
|
+
eventId: String(row.event_id),
|
|
296
|
+
eventType: String(row.event_type),
|
|
297
|
+
canonicalKey: String(row.canonical_key),
|
|
298
|
+
summary: rowString(row, "summary") ?? "",
|
|
299
|
+
createdAt: String(row.created_at)
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
async function hasMemoryItem(executor, canonicalKey) {
|
|
303
|
+
const result = await executor.execute({
|
|
304
|
+
sql: "SELECT 1 AS present FROM memory_items WHERE canonical_key = ? LIMIT 1",
|
|
305
|
+
args: [canonicalKey]
|
|
306
|
+
});
|
|
307
|
+
return result.rows.length > 0;
|
|
308
|
+
}
|
|
309
|
+
async function assertMemoryItemExists(executor, canonicalKey, errorPrefix) {
|
|
310
|
+
if (!await hasMemoryItem(executor, canonicalKey)) {
|
|
311
|
+
throw new Error(`${errorPrefix}: unknown memory ${canonicalKey}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async function upsertTaskRun(executor, event) {
|
|
315
|
+
if (!event.sourceRunId) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
await executor.execute({
|
|
319
|
+
sql: `
|
|
320
|
+
INSERT INTO task_runs (
|
|
321
|
+
run_id,
|
|
322
|
+
task_id,
|
|
323
|
+
branch,
|
|
324
|
+
first_event_id,
|
|
325
|
+
last_event_id,
|
|
326
|
+
created_at,
|
|
327
|
+
updated_at
|
|
328
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
329
|
+
ON CONFLICT(run_id) DO UPDATE SET
|
|
330
|
+
task_id = COALESCE(excluded.task_id, task_runs.task_id),
|
|
331
|
+
branch = COALESCE(excluded.branch, task_runs.branch),
|
|
332
|
+
last_event_id = excluded.last_event_id,
|
|
333
|
+
updated_at = excluded.updated_at
|
|
334
|
+
`,
|
|
335
|
+
args: [
|
|
336
|
+
event.sourceRunId,
|
|
337
|
+
event.sourceTaskId ?? null,
|
|
338
|
+
event.branch ?? null,
|
|
339
|
+
event.eventId,
|
|
340
|
+
event.eventId,
|
|
341
|
+
event.createdAt,
|
|
342
|
+
event.createdAt
|
|
343
|
+
]
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
async function insertEventRow(executor, event) {
|
|
347
|
+
await executor.execute({
|
|
348
|
+
sql: `
|
|
349
|
+
INSERT INTO memory_events (
|
|
350
|
+
event_id,
|
|
351
|
+
event_type,
|
|
352
|
+
canonical_key,
|
|
353
|
+
summary,
|
|
354
|
+
kind,
|
|
355
|
+
category,
|
|
356
|
+
confidence,
|
|
357
|
+
source_run_id,
|
|
358
|
+
source_task_id,
|
|
359
|
+
branch,
|
|
360
|
+
source_canonical_key,
|
|
361
|
+
replacement_canonical_key,
|
|
362
|
+
retrieval_query,
|
|
363
|
+
retrieval_rank,
|
|
364
|
+
feedback_outcome,
|
|
365
|
+
details_json,
|
|
366
|
+
created_at
|
|
367
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
368
|
+
`,
|
|
369
|
+
args: [
|
|
370
|
+
event.eventId,
|
|
371
|
+
event.eventType,
|
|
372
|
+
event.canonicalKey,
|
|
373
|
+
eventSummary(event),
|
|
374
|
+
eventKind(event),
|
|
375
|
+
eventCategory(event),
|
|
376
|
+
eventConfidence(event),
|
|
377
|
+
event.sourceRunId ?? null,
|
|
378
|
+
event.sourceTaskId ?? null,
|
|
379
|
+
event.branch ?? null,
|
|
380
|
+
eventSourceCanonicalKey(event),
|
|
381
|
+
eventReplacementCanonicalKey(event),
|
|
382
|
+
eventRetrievalQuery(event),
|
|
383
|
+
eventRetrievalRank(event),
|
|
384
|
+
eventFeedbackOutcome(event),
|
|
385
|
+
jsonText(eventDetails(event)),
|
|
386
|
+
event.createdAt
|
|
387
|
+
]
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
async function upsertProjectedMemory(executor, event, status = "active") {
|
|
391
|
+
await executor.execute({
|
|
392
|
+
sql: `
|
|
393
|
+
INSERT INTO memory_items (
|
|
394
|
+
canonical_key,
|
|
395
|
+
summary,
|
|
396
|
+
kind,
|
|
397
|
+
category,
|
|
398
|
+
status,
|
|
399
|
+
confidence,
|
|
400
|
+
source_run_id,
|
|
401
|
+
source_task_id,
|
|
402
|
+
branch,
|
|
403
|
+
details_json,
|
|
404
|
+
created_at,
|
|
405
|
+
updated_at,
|
|
406
|
+
last_event_id,
|
|
407
|
+
superseded_by,
|
|
408
|
+
embedding
|
|
409
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)
|
|
410
|
+
ON CONFLICT(canonical_key) DO UPDATE SET
|
|
411
|
+
summary = excluded.summary,
|
|
412
|
+
kind = excluded.kind,
|
|
413
|
+
category = excluded.category,
|
|
414
|
+
status = excluded.status,
|
|
415
|
+
confidence = COALESCE(excluded.confidence, memory_items.confidence),
|
|
416
|
+
source_run_id = COALESCE(excluded.source_run_id, memory_items.source_run_id),
|
|
417
|
+
source_task_id = COALESCE(excluded.source_task_id, memory_items.source_task_id),
|
|
418
|
+
branch = COALESCE(excluded.branch, memory_items.branch),
|
|
419
|
+
details_json = COALESCE(excluded.details_json, memory_items.details_json),
|
|
420
|
+
updated_at = excluded.updated_at,
|
|
421
|
+
last_event_id = excluded.last_event_id,
|
|
422
|
+
superseded_by = excluded.superseded_by,
|
|
423
|
+
embedding = excluded.embedding
|
|
424
|
+
`,
|
|
425
|
+
args: [
|
|
426
|
+
event.canonicalKey,
|
|
427
|
+
eventSummary(event),
|
|
428
|
+
eventKind(event),
|
|
429
|
+
eventCategory(event),
|
|
430
|
+
status,
|
|
431
|
+
eventConfidence(event) ?? 0,
|
|
432
|
+
event.sourceRunId ?? null,
|
|
433
|
+
event.sourceTaskId ?? null,
|
|
434
|
+
event.branch ?? null,
|
|
435
|
+
jsonText(eventDetails(event)),
|
|
436
|
+
event.createdAt,
|
|
437
|
+
event.createdAt,
|
|
438
|
+
event.eventId,
|
|
439
|
+
eventReplacementCanonicalKey(event)
|
|
440
|
+
]
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
async function insertMemoryLink(executor, fromKey, toKey, relation, event) {
|
|
444
|
+
await executor.execute({
|
|
445
|
+
sql: `
|
|
446
|
+
INSERT INTO memory_links (from_key, to_key, relation, source_event_id, created_at)
|
|
447
|
+
VALUES (?, ?, ?, ?, ?)
|
|
448
|
+
`,
|
|
449
|
+
args: [fromKey, toKey, relation, event.eventId, event.createdAt]
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
async function markSuperseded(executor, event) {
|
|
453
|
+
const result = await executor.execute({
|
|
454
|
+
sql: `
|
|
455
|
+
UPDATE memory_items
|
|
456
|
+
SET
|
|
457
|
+
status = 'superseded',
|
|
458
|
+
superseded_by = ?,
|
|
459
|
+
updated_at = ?,
|
|
460
|
+
last_event_id = ?
|
|
461
|
+
WHERE canonical_key = ?
|
|
462
|
+
`,
|
|
463
|
+
args: [eventReplacementCanonicalKey(event), event.createdAt, event.eventId, event.canonicalKey]
|
|
464
|
+
});
|
|
465
|
+
if ((result.rowsAffected ?? 0) === 0) {
|
|
466
|
+
throw new Error(`cannot supersede unknown memory ${event.canonicalKey}`);
|
|
467
|
+
}
|
|
468
|
+
if (eventReplacementCanonicalKey(event)) {
|
|
469
|
+
await insertMemoryLink(executor, event.canonicalKey, eventReplacementCanonicalKey(event), "superseded_by", event);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
async function activeMemoryItem(executor, canonicalKey) {
|
|
473
|
+
const result = await executor.execute({
|
|
474
|
+
sql: `
|
|
475
|
+
SELECT
|
|
476
|
+
canonical_key,
|
|
477
|
+
summary,
|
|
478
|
+
kind,
|
|
479
|
+
category,
|
|
480
|
+
status,
|
|
481
|
+
confidence,
|
|
482
|
+
source_run_id,
|
|
483
|
+
source_task_id,
|
|
484
|
+
branch,
|
|
485
|
+
details_json,
|
|
486
|
+
created_at,
|
|
487
|
+
updated_at,
|
|
488
|
+
last_event_id,
|
|
489
|
+
superseded_by,
|
|
490
|
+
embedding
|
|
491
|
+
FROM memory_items
|
|
492
|
+
WHERE canonical_key = ?
|
|
493
|
+
LIMIT 1
|
|
494
|
+
`,
|
|
495
|
+
args: [canonicalKey]
|
|
496
|
+
});
|
|
497
|
+
const row = result.rows[0];
|
|
498
|
+
return row ? toMemoryItemRow(row) : null;
|
|
499
|
+
}
|
|
500
|
+
async function markRetracted(executor, event) {
|
|
501
|
+
const result = await executor.execute({
|
|
502
|
+
sql: `
|
|
503
|
+
UPDATE memory_items
|
|
504
|
+
SET
|
|
505
|
+
status = 'retracted',
|
|
506
|
+
updated_at = ?,
|
|
507
|
+
last_event_id = ?
|
|
508
|
+
WHERE canonical_key = ?
|
|
509
|
+
`,
|
|
510
|
+
args: [event.createdAt, event.eventId, event.canonicalKey]
|
|
511
|
+
});
|
|
512
|
+
if ((result.rowsAffected ?? 0) === 0) {
|
|
513
|
+
throw new Error(`cannot retract unknown memory ${event.canonicalKey}`);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
async function recordRetrievalFeedback(executor, event) {
|
|
517
|
+
await executor.execute({
|
|
518
|
+
sql: `
|
|
519
|
+
INSERT INTO retrieval_feedback (
|
|
520
|
+
canonical_key,
|
|
521
|
+
outcome,
|
|
522
|
+
retrieval_rank,
|
|
523
|
+
source_run_id,
|
|
524
|
+
source_task_id,
|
|
525
|
+
query_text,
|
|
526
|
+
source_event_id,
|
|
527
|
+
created_at
|
|
528
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
529
|
+
`,
|
|
530
|
+
args: [
|
|
531
|
+
event.canonicalKey,
|
|
532
|
+
eventFeedbackOutcome(event) ?? "ignored",
|
|
533
|
+
eventRetrievalRank(event),
|
|
534
|
+
event.sourceRunId ?? null,
|
|
535
|
+
event.sourceTaskId ?? null,
|
|
536
|
+
eventRetrievalQuery(event),
|
|
537
|
+
event.eventId,
|
|
538
|
+
event.createdAt
|
|
539
|
+
]
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
async function applyReinforcement(executor, event) {
|
|
543
|
+
const existing = await activeMemoryItem(executor, event.canonicalKey);
|
|
544
|
+
if (!existing) {
|
|
545
|
+
throw new Error(`cannot reinforce unknown memory ${event.canonicalKey}`);
|
|
546
|
+
}
|
|
547
|
+
if (existing.status !== "active") {
|
|
548
|
+
throw new Error(`cannot reinforce non-active memory ${event.canonicalKey}`);
|
|
549
|
+
}
|
|
550
|
+
const result = await executor.execute({
|
|
551
|
+
sql: `
|
|
552
|
+
UPDATE memory_items
|
|
553
|
+
SET
|
|
554
|
+
status = 'active',
|
|
555
|
+
confidence = ?,
|
|
556
|
+
source_run_id = COALESCE(?, source_run_id),
|
|
557
|
+
source_task_id = COALESCE(?, source_task_id),
|
|
558
|
+
branch = COALESCE(?, branch),
|
|
559
|
+
updated_at = ?,
|
|
560
|
+
last_event_id = ?,
|
|
561
|
+
superseded_by = NULL
|
|
562
|
+
WHERE canonical_key = ?
|
|
563
|
+
`,
|
|
564
|
+
args: [
|
|
565
|
+
eventConfidence(event),
|
|
566
|
+
event.sourceRunId ?? null,
|
|
567
|
+
event.sourceTaskId ?? null,
|
|
568
|
+
event.branch ?? null,
|
|
569
|
+
event.createdAt,
|
|
570
|
+
event.eventId,
|
|
571
|
+
event.canonicalKey
|
|
572
|
+
]
|
|
573
|
+
});
|
|
574
|
+
if ((result.rowsAffected ?? 0) === 0) {
|
|
575
|
+
throw new Error(`cannot reinforce unknown memory ${event.canonicalKey}`);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
async function validateEventTargets(executor, event) {
|
|
579
|
+
switch (event.eventType) {
|
|
580
|
+
case "observed":
|
|
581
|
+
return;
|
|
582
|
+
case "promoted":
|
|
583
|
+
case "corrected":
|
|
584
|
+
await assertMemoryItemExists(executor, event.sourceCanonicalKey, `cannot ${event.eventType}`);
|
|
585
|
+
return;
|
|
586
|
+
case "superseded":
|
|
587
|
+
await assertMemoryItemExists(executor, event.replacementCanonicalKey, "cannot supersede");
|
|
588
|
+
await assertMemoryItemExists(executor, event.canonicalKey, "cannot supersede");
|
|
589
|
+
return;
|
|
590
|
+
case "retracted":
|
|
591
|
+
case "feedback_recorded":
|
|
592
|
+
await assertMemoryItemExists(executor, event.canonicalKey, `cannot ${event.eventType}`);
|
|
593
|
+
return;
|
|
594
|
+
case "reinforced":
|
|
595
|
+
await assertMemoryItemExists(executor, event.canonicalKey, "cannot reinforce");
|
|
596
|
+
return;
|
|
597
|
+
case "retrieved":
|
|
598
|
+
if (event.retrievalRank === 0 && event.canonicalKey === NO_MATCH_RETRIEVAL_CANONICAL_KEY) {
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
await assertMemoryItemExists(executor, event.canonicalKey, `cannot ${event.eventType}`);
|
|
602
|
+
return;
|
|
603
|
+
default: {
|
|
604
|
+
const _exhaustive = event;
|
|
605
|
+
return _exhaustive;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
async function openMemoryDb(dbPath) {
|
|
610
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
611
|
+
const sqlite = new Database(dbPath, { create: true, strict: true });
|
|
612
|
+
const client = createMemoryDbClient(sqlite);
|
|
613
|
+
const db = {
|
|
614
|
+
path: dbPath,
|
|
615
|
+
client,
|
|
616
|
+
async close() {
|
|
617
|
+
client.close();
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
await ensureSchema(db);
|
|
621
|
+
return db;
|
|
622
|
+
}
|
|
623
|
+
async function applyMemoryEvent(db, event) {
|
|
624
|
+
const transaction = await db.client.transaction("write");
|
|
625
|
+
try {
|
|
626
|
+
await validateEventTargets(transaction, event);
|
|
627
|
+
await insertEventRow(transaction, event);
|
|
628
|
+
await upsertTaskRun(transaction, event);
|
|
629
|
+
switch (event.eventType) {
|
|
630
|
+
case "observed":
|
|
631
|
+
await upsertProjectedMemory(transaction, event, "active");
|
|
632
|
+
break;
|
|
633
|
+
case "promoted":
|
|
634
|
+
await upsertProjectedMemory(transaction, event, "active");
|
|
635
|
+
if (event.sourceCanonicalKey) {
|
|
636
|
+
await insertMemoryLink(transaction, event.canonicalKey, event.sourceCanonicalKey, "promoted_from", event);
|
|
637
|
+
}
|
|
638
|
+
break;
|
|
639
|
+
case "corrected":
|
|
640
|
+
await upsertProjectedMemory(transaction, event, "active");
|
|
641
|
+
if (event.sourceCanonicalKey) {
|
|
642
|
+
await insertMemoryLink(transaction, event.canonicalKey, event.sourceCanonicalKey, "corrected_from", event);
|
|
643
|
+
}
|
|
644
|
+
break;
|
|
645
|
+
case "superseded":
|
|
646
|
+
await markSuperseded(transaction, event);
|
|
647
|
+
break;
|
|
648
|
+
case "retracted":
|
|
649
|
+
await markRetracted(transaction, event);
|
|
650
|
+
break;
|
|
651
|
+
case "reinforced":
|
|
652
|
+
await applyReinforcement(transaction, event);
|
|
653
|
+
break;
|
|
654
|
+
case "retrieved":
|
|
655
|
+
break;
|
|
656
|
+
case "feedback_recorded":
|
|
657
|
+
await recordRetrievalFeedback(transaction, event);
|
|
658
|
+
break;
|
|
659
|
+
}
|
|
660
|
+
await transaction.commit();
|
|
661
|
+
} catch (error) {
|
|
662
|
+
await transaction.rollback();
|
|
663
|
+
throw error;
|
|
664
|
+
} finally {
|
|
665
|
+
transaction.close();
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
async function setMemoryItemEmbedding(db, canonicalKey, embedding) {
|
|
669
|
+
await db.client.execute({
|
|
670
|
+
sql: `
|
|
671
|
+
UPDATE memory_items
|
|
672
|
+
SET embedding = ?
|
|
673
|
+
WHERE canonical_key = ?
|
|
674
|
+
`,
|
|
675
|
+
args: [JSON.stringify(embedding), canonicalKey]
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
async function getMemoryItemByKey(db, canonicalKey) {
|
|
679
|
+
const result = await db.client.execute({
|
|
680
|
+
sql: `
|
|
681
|
+
SELECT
|
|
682
|
+
canonical_key,
|
|
683
|
+
summary,
|
|
684
|
+
kind,
|
|
685
|
+
category,
|
|
686
|
+
status,
|
|
687
|
+
confidence,
|
|
688
|
+
source_run_id,
|
|
689
|
+
source_task_id,
|
|
690
|
+
branch,
|
|
691
|
+
details_json,
|
|
692
|
+
created_at,
|
|
693
|
+
updated_at,
|
|
694
|
+
last_event_id,
|
|
695
|
+
superseded_by,
|
|
696
|
+
embedding
|
|
697
|
+
FROM memory_items
|
|
698
|
+
WHERE canonical_key = ?
|
|
699
|
+
LIMIT 1
|
|
700
|
+
`,
|
|
701
|
+
args: [canonicalKey]
|
|
702
|
+
});
|
|
703
|
+
const row = result.rows[0];
|
|
704
|
+
return row ? toMemoryItemRow(row) : null;
|
|
705
|
+
}
|
|
706
|
+
async function listActiveMemoryItems(db) {
|
|
707
|
+
const result = await db.client.execute(`
|
|
708
|
+
SELECT
|
|
709
|
+
canonical_key,
|
|
710
|
+
summary,
|
|
711
|
+
kind,
|
|
712
|
+
category,
|
|
713
|
+
status,
|
|
714
|
+
confidence,
|
|
715
|
+
source_run_id,
|
|
716
|
+
source_task_id,
|
|
717
|
+
branch,
|
|
718
|
+
details_json,
|
|
719
|
+
created_at,
|
|
720
|
+
updated_at,
|
|
721
|
+
last_event_id,
|
|
722
|
+
superseded_by,
|
|
723
|
+
embedding
|
|
724
|
+
FROM memory_items
|
|
725
|
+
WHERE status = 'active'
|
|
726
|
+
ORDER BY canonical_key
|
|
727
|
+
`);
|
|
728
|
+
return result.rows.map((row) => toMemoryItemRow(row));
|
|
729
|
+
}
|
|
730
|
+
async function hasMemoryEvent(db, eventId) {
|
|
731
|
+
const result = await db.client.execute({
|
|
732
|
+
sql: "SELECT 1 AS present FROM memory_events WHERE event_id = ? LIMIT 1",
|
|
733
|
+
args: [eventId]
|
|
734
|
+
});
|
|
735
|
+
return result.rows.length > 0;
|
|
736
|
+
}
|
|
737
|
+
async function listMemoryEvents(db) {
|
|
738
|
+
const result = await db.client.execute(`
|
|
739
|
+
SELECT event_id, event_type, canonical_key, summary, created_at
|
|
740
|
+
FROM memory_events
|
|
741
|
+
ORDER BY created_at, event_id
|
|
742
|
+
`);
|
|
743
|
+
return result.rows.map((row) => toMemoryEventRow(row));
|
|
744
|
+
}
|
|
745
|
+
export {
|
|
746
|
+
setMemoryItemEmbedding,
|
|
747
|
+
openMemoryDb,
|
|
748
|
+
listMemoryEvents,
|
|
749
|
+
listActiveMemoryItems,
|
|
750
|
+
hasMemoryEvent,
|
|
751
|
+
getMemoryItemByKey,
|
|
752
|
+
applyMemoryEvent
|
|
753
|
+
};
|