@markusylisiurunen/tau 0.3.37 → 0.3.39
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 +38 -4
- package/dist/core/agent/agent_runtime.js +22 -0
- package/dist/core/agent/agent_runtime.js.map +1 -1
- package/dist/core/cli.js +3 -0
- package/dist/core/cli.js.map +1 -1
- package/dist/core/config/content_loader.js +3 -1
- package/dist/core/config/content_loader.js.map +1 -1
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/schema.js +67 -0
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/history/cli.js +90 -0
- package/dist/core/history/cli.js.map +1 -0
- package/dist/core/history/config.js +11 -0
- package/dist/core/history/config.js.map +1 -0
- package/dist/core/history/history_manager.js +170 -0
- package/dist/core/history/history_manager.js.map +1 -0
- package/dist/core/history/local_history_store.js +407 -0
- package/dist/core/history/local_history_store.js.map +1 -0
- package/dist/core/history/remote_history_client.js +152 -0
- package/dist/core/history/remote_history_client.js.map +1 -0
- package/dist/core/history/replication.js +89 -0
- package/dist/core/history/replication.js.map +1 -0
- package/dist/core/history/setup.js +187 -0
- package/dist/core/history/setup.js.map +1 -0
- package/dist/core/history/transcript.js +39 -0
- package/dist/core/history/transcript.js.map +1 -0
- package/dist/core/history/types.js +2 -0
- package/dist/core/history/types.js.map +1 -0
- package/dist/core/models/tau_model_overrides.js +63 -4
- package/dist/core/models/tau_model_overrides.js.map +1 -1
- package/dist/core/personas.js +2 -1
- package/dist/core/personas.js.map +1 -1
- package/dist/core/runtime/chat_runtime.js +9 -0
- package/dist/core/runtime/chat_runtime.js.map +1 -1
- package/dist/core/static/code_mode/history/documentation.md +133 -0
- package/dist/core/static/code_mode/history/sandbox_runner.mjs +108 -0
- package/dist/core/static/code_mode/web/documentation.md +7 -7
- package/dist/core/subagents/agent_supervisor.js +1 -1
- package/dist/core/subagents/agent_supervisor.js.map +1 -1
- package/dist/core/subagents/registry.js +2 -1
- package/dist/core/subagents/registry.js.map +1 -1
- package/dist/core/subagents/types.js +2 -1
- package/dist/core/subagents/types.js.map +1 -1
- package/dist/core/telegram/adapter.js +30 -0
- package/dist/core/telegram/adapter.js.map +1 -1
- package/dist/core/telegram/session_manager.js +143 -26
- package/dist/core/telegram/session_manager.js.map +1 -1
- package/dist/core/tools/catalog.js +11 -2
- package/dist/core/tools/catalog.js.map +1 -1
- package/dist/core/tools/history.js +125 -0
- package/dist/core/tools/history.js.map +1 -0
- package/dist/core/tools/spawn_agent.js +1 -0
- package/dist/core/tools/spawn_agent.js.map +1 -1
- package/dist/core/tools/tool_names.js +2 -0
- package/dist/core/tools/tool_names.js.map +1 -1
- package/dist/core/tools/web.js +1 -1
- package/dist/core/tools/web.js.map +1 -1
- package/dist/core/utils/repository.js +44 -0
- package/dist/core/utils/repository.js.map +1 -0
- package/dist/core/version.js +1 -1
- package/dist/history/worker/index.js +1106 -0
- package/dist/history/worker/index.js.map +1 -0
- package/dist/host/local_session_host.js +285 -179
- package/dist/host/local_session_host.js.map +1 -1
- package/dist/main.js +30 -3
- package/dist/main.js.map +1 -1
- package/dist/protocol/session_protocol.d.ts +4 -1
- package/dist/protocol/session_protocol.js +14 -6
- package/dist/protocol/session_protocol.js.map +1 -1
- package/dist/sdk/local_client.js +5 -0
- package/dist/sdk/local_client.js.map +1 -1
- package/dist/store/session_snapshot_migrations.js +61 -1
- package/dist/store/session_snapshot_migrations.js.map +1 -1
- package/dist/tui/session_chat_app.js +3 -0
- package/dist/tui/session_chat_app.js.map +1 -1
- package/dist/tui/session_chat_controller.js +46 -16
- package/dist/tui/session_chat_controller.js.map +1 -1
- package/dist/tui/session_creation_attributes.js +66 -0
- package/dist/tui/session_creation_attributes.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { LocalHistoryStore } from "./local_history_store.js";
|
|
2
|
+
import { RemoteHistoryClient } from "./remote_history_client.js";
|
|
3
|
+
const REPLICATION_BATCH_SIZE = 10;
|
|
4
|
+
const REPLICATION_BATCH_BYTES = 6 * 1024 * 1024;
|
|
5
|
+
const REPLICATION_TIMEOUT_MS = 15_000;
|
|
6
|
+
export class HistoryManager {
|
|
7
|
+
replicationRuns = new Map();
|
|
8
|
+
targets = new Map();
|
|
9
|
+
local;
|
|
10
|
+
failureReason;
|
|
11
|
+
constructor(local, failureReason) {
|
|
12
|
+
if (!local && !failureReason) {
|
|
13
|
+
throw new Error("history manager requires a local store or failure reason");
|
|
14
|
+
}
|
|
15
|
+
this.local = local;
|
|
16
|
+
this.failureReason = failureReason;
|
|
17
|
+
}
|
|
18
|
+
static open(path) {
|
|
19
|
+
try {
|
|
20
|
+
return new HistoryManager(new LocalHistoryStore(path));
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return new HistoryManager(undefined, formatFailureReason(error));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
registerSession(session, remote) {
|
|
27
|
+
return this.runLocalMutation((local) => {
|
|
28
|
+
local.createSession(session, remote);
|
|
29
|
+
if (remote)
|
|
30
|
+
this.scheduleReplication(remote);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
append(sessionId, entries, remote) {
|
|
34
|
+
return this.runLocalMutation((local) => {
|
|
35
|
+
const inserted = local.append(sessionId, entries, remote);
|
|
36
|
+
if (inserted.length > 0 && remote)
|
|
37
|
+
this.scheduleReplication(remote);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
truncateFromSources(sessionId, sourceIds, remote) {
|
|
41
|
+
return this.runLocalMutation((local) => {
|
|
42
|
+
const truncated = local.truncateFromSources(sessionId, sourceIds, remote);
|
|
43
|
+
if (truncated !== undefined && remote)
|
|
44
|
+
this.scheduleReplication(remote);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
query(remote) {
|
|
48
|
+
if (remote) {
|
|
49
|
+
const client = new RemoteHistoryClient(remote);
|
|
50
|
+
return {
|
|
51
|
+
search: async (input, signal) => {
|
|
52
|
+
this.requireLocal();
|
|
53
|
+
return await client.search(input, signal);
|
|
54
|
+
},
|
|
55
|
+
read: async (input, signal) => {
|
|
56
|
+
this.requireLocal();
|
|
57
|
+
return await client.read(input, signal);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
search: async (input) => await this.searchLocal(input),
|
|
63
|
+
read: async (input) => await this.readLocal(input),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async flush() {
|
|
67
|
+
await Promise.allSettled([...this.replicationRuns.values()]);
|
|
68
|
+
}
|
|
69
|
+
close() {
|
|
70
|
+
const local = this.local;
|
|
71
|
+
this.local = undefined;
|
|
72
|
+
this.failureReason ??= "history manager is closed";
|
|
73
|
+
if (!local)
|
|
74
|
+
return;
|
|
75
|
+
try {
|
|
76
|
+
local.close();
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// History is best-effort, including during host shutdown.
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
runLocalMutation(action) {
|
|
83
|
+
const local = this.local;
|
|
84
|
+
if (!local)
|
|
85
|
+
return this.failureReason;
|
|
86
|
+
try {
|
|
87
|
+
action(local);
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return this.disable(error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async searchLocal(input) {
|
|
95
|
+
const local = this.requireLocal();
|
|
96
|
+
return await local.search(input);
|
|
97
|
+
}
|
|
98
|
+
async readLocal(input) {
|
|
99
|
+
const local = this.requireLocal();
|
|
100
|
+
return await local.read(input);
|
|
101
|
+
}
|
|
102
|
+
requireLocal() {
|
|
103
|
+
if (this.local)
|
|
104
|
+
return this.local;
|
|
105
|
+
throw new Error(`session history is unavailable: ${this.failureReason ?? "unknown failure"}`);
|
|
106
|
+
}
|
|
107
|
+
disable(error) {
|
|
108
|
+
const reason = formatFailureReason(error);
|
|
109
|
+
this.failureReason = reason;
|
|
110
|
+
const local = this.local;
|
|
111
|
+
this.local = undefined;
|
|
112
|
+
if (local) {
|
|
113
|
+
try {
|
|
114
|
+
local.close();
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Preserve the original failure reason.
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return reason;
|
|
121
|
+
}
|
|
122
|
+
scheduleReplication(target) {
|
|
123
|
+
this.targets.set(target.endpoint, target);
|
|
124
|
+
if (this.replicationRuns.has(target.endpoint))
|
|
125
|
+
return;
|
|
126
|
+
const run = this.replicate(target.endpoint).finally(() => {
|
|
127
|
+
if (this.replicationRuns.get(target.endpoint) === run) {
|
|
128
|
+
this.replicationRuns.delete(target.endpoint);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
this.replicationRuns.set(target.endpoint, run);
|
|
132
|
+
void run.catch(() => undefined);
|
|
133
|
+
}
|
|
134
|
+
async replicate(endpoint) {
|
|
135
|
+
const target = this.targets.get(endpoint);
|
|
136
|
+
if (!target)
|
|
137
|
+
return;
|
|
138
|
+
const client = new RemoteHistoryClient(target);
|
|
139
|
+
while (true) {
|
|
140
|
+
const local = this.local;
|
|
141
|
+
if (!local)
|
|
142
|
+
return;
|
|
143
|
+
const pending = local.listPendingOperations(endpoint, REPLICATION_BATCH_SIZE);
|
|
144
|
+
if (pending.length === 0)
|
|
145
|
+
return;
|
|
146
|
+
const batch = boundedReplicationBatch(pending);
|
|
147
|
+
await client.applyOperations(batch.map((item) => item.operation), AbortSignal.timeout(REPLICATION_TIMEOUT_MS));
|
|
148
|
+
local.acknowledgeOperations(batch.map((item) => item.rowId));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function formatFailureReason(error) {
|
|
153
|
+
if (error instanceof Error && error.message.trim())
|
|
154
|
+
return error.message.trim();
|
|
155
|
+
const text = String(error).trim();
|
|
156
|
+
return text || "unknown failure";
|
|
157
|
+
}
|
|
158
|
+
function boundedReplicationBatch(pending) {
|
|
159
|
+
const batch = [];
|
|
160
|
+
let bytes = 0;
|
|
161
|
+
for (const item of pending) {
|
|
162
|
+
const itemBytes = Buffer.byteLength(JSON.stringify(item.operation), "utf8");
|
|
163
|
+
if (batch.length > 0 && bytes + itemBytes > REPLICATION_BATCH_BYTES)
|
|
164
|
+
break;
|
|
165
|
+
batch.push(item);
|
|
166
|
+
bytes += itemBytes;
|
|
167
|
+
}
|
|
168
|
+
return batch;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=history_manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history_manager.js","sourceRoot":"","sources":["../../../src/core/history/history_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { DatabaseSync } from "node:sqlite";
|
|
6
|
+
import { batchHistoryEntriesForRemote } from "./replication.js";
|
|
7
|
+
const PRIVATE_DIRECTORY_MODE = 0o700;
|
|
8
|
+
const PRIVATE_FILE_MODE = 0o600;
|
|
9
|
+
const HISTORY_READ_PAGE_MAX_BYTES = 12 * 1024 * 1024;
|
|
10
|
+
const MAX_SEARCH_SNIPPETS = 3;
|
|
11
|
+
export function getDefaultHistoryDatabasePath(homeDir) {
|
|
12
|
+
return join(homeDir ?? homedir(), ".config", "tau", "history.sqlite");
|
|
13
|
+
}
|
|
14
|
+
export class LocalHistoryStore {
|
|
15
|
+
database;
|
|
16
|
+
constructor(path) {
|
|
17
|
+
if (path !== ":memory:") {
|
|
18
|
+
mkdirSync(dirname(path), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
|
|
19
|
+
chmodSync(dirname(path), PRIVATE_DIRECTORY_MODE);
|
|
20
|
+
}
|
|
21
|
+
this.database = new DatabaseSync(path);
|
|
22
|
+
if (path !== ":memory:")
|
|
23
|
+
chmodSync(path, PRIVATE_FILE_MODE);
|
|
24
|
+
this.initialize();
|
|
25
|
+
}
|
|
26
|
+
close() {
|
|
27
|
+
this.database.close();
|
|
28
|
+
}
|
|
29
|
+
createSession(session, remote) {
|
|
30
|
+
this.transaction(() => {
|
|
31
|
+
const existing = this.database
|
|
32
|
+
.prepare("SELECT attributes_json, created_at FROM history_sessions WHERE session_id = ?")
|
|
33
|
+
.get(session.sessionId);
|
|
34
|
+
const attributesJson = stableJson(session.attributes);
|
|
35
|
+
if (existing) {
|
|
36
|
+
if (existing.attributes_json !== attributesJson ||
|
|
37
|
+
existing.created_at !== session.createdAt) {
|
|
38
|
+
throw new Error(`history session '${session.sessionId}' has conflicting immutable data`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this.database
|
|
43
|
+
.prepare("INSERT INTO history_sessions (session_id, attributes_json, created_at, updated_at) VALUES (?, ?, ?, ?)")
|
|
44
|
+
.run(session.sessionId, attributesJson, session.createdAt, session.createdAt);
|
|
45
|
+
const insertAttribute = this.database.prepare("INSERT INTO history_attributes (session_id, key, value) VALUES (?, ?, ?)");
|
|
46
|
+
for (const [key, value] of Object.entries(session.attributes)) {
|
|
47
|
+
insertAttribute.run(session.sessionId, key, value);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (remote) {
|
|
51
|
+
const targetInsert = this.database
|
|
52
|
+
.prepare("INSERT OR IGNORE INTO history_replication_targets (session_id, endpoint) VALUES (?, ?)")
|
|
53
|
+
.run(session.sessionId, remote.endpoint);
|
|
54
|
+
if (Number(targetInsert.changes) > 0) {
|
|
55
|
+
this.enqueue(remote.endpoint, {
|
|
56
|
+
id: randomUUID(),
|
|
57
|
+
sessionId: session.sessionId,
|
|
58
|
+
type: "create",
|
|
59
|
+
session,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
append(sessionId, entries, remote) {
|
|
66
|
+
if (entries.length === 0)
|
|
67
|
+
return [];
|
|
68
|
+
return this.transaction(() => {
|
|
69
|
+
this.requireSession(sessionId);
|
|
70
|
+
const existingIds = new Set(this.database
|
|
71
|
+
.prepare(`SELECT entry_id FROM history_entries WHERE session_id = ? AND entry_id IN (${entries.map(() => "?").join(", ")})`)
|
|
72
|
+
.all(sessionId, ...entries.map((entry) => entry.id)).map((row) => String(row.entry_id)));
|
|
73
|
+
const inserted = entries.filter((entry) => !existingIds.has(entry.id));
|
|
74
|
+
if (inserted.length === 0)
|
|
75
|
+
return [];
|
|
76
|
+
const lastPosition = this.database
|
|
77
|
+
.prepare("SELECT COALESCE(MAX(position), 0) AS position FROM history_entries WHERE session_id = ?")
|
|
78
|
+
.get(sessionId);
|
|
79
|
+
let position = Number(lastPosition.position);
|
|
80
|
+
const insertEntry = this.database.prepare("INSERT INTO history_entries (session_id, position, entry_id, type, timestamp, payload_json, search_text) VALUES (?, ?, ?, ?, ?, ?, ?)");
|
|
81
|
+
const insertSearch = this.database.prepare("INSERT INTO history_entries_fts (rowid, session_id, text) VALUES (?, ?, ?)");
|
|
82
|
+
const insertSource = this.database.prepare("INSERT INTO history_entry_sources (session_id, entry_id, source_id) VALUES (?, ?, ?)");
|
|
83
|
+
for (const entry of inserted) {
|
|
84
|
+
position += 1;
|
|
85
|
+
const searchText = historyEntrySearchText(entry);
|
|
86
|
+
const result = insertEntry.run(sessionId, position, entry.id, entry.type, entry.timestamp, JSON.stringify(entry), searchText);
|
|
87
|
+
insertSearch.run(Number(result.lastInsertRowid), sessionId, searchText);
|
|
88
|
+
for (const sourceId of new Set(entry.sourceIds)) {
|
|
89
|
+
insertSource.run(sessionId, entry.id, sourceId);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const updatedAt = Math.max(...inserted.map((entry) => entry.timestamp), Date.now());
|
|
93
|
+
this.database
|
|
94
|
+
.prepare("UPDATE history_sessions SET updated_at = MAX(updated_at, ?) WHERE session_id = ?")
|
|
95
|
+
.run(updatedAt, sessionId);
|
|
96
|
+
if (remote) {
|
|
97
|
+
for (const entries of batchHistoryEntriesForRemote(sessionId, inserted)) {
|
|
98
|
+
this.enqueue(remote.endpoint, {
|
|
99
|
+
id: randomUUID(),
|
|
100
|
+
sessionId,
|
|
101
|
+
type: "append",
|
|
102
|
+
entries,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return inserted;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
truncateFromSources(sessionId, sourceIds, remote) {
|
|
110
|
+
if (sourceIds.length === 0)
|
|
111
|
+
return undefined;
|
|
112
|
+
return this.transaction(() => {
|
|
113
|
+
const firstRemoved = this.database
|
|
114
|
+
.prepare(`SELECT MIN(e.position) AS position
|
|
115
|
+
FROM history_entries e
|
|
116
|
+
JOIN history_entry_sources s
|
|
117
|
+
ON s.session_id = e.session_id AND s.entry_id = e.entry_id
|
|
118
|
+
WHERE e.session_id = ? AND s.source_id IN (${sourceIds.map(() => "?").join(", ")})`)
|
|
119
|
+
.get(sessionId, ...sourceIds);
|
|
120
|
+
if (firstRemoved.position === null)
|
|
121
|
+
return undefined;
|
|
122
|
+
const position = Number(firstRemoved.position);
|
|
123
|
+
const removedRows = this.database
|
|
124
|
+
.prepare("SELECT rowid, entry_id FROM history_entries WHERE session_id = ? AND position >= ? ORDER BY position")
|
|
125
|
+
.all(sessionId, position);
|
|
126
|
+
const deleteSearch = this.database.prepare("DELETE FROM history_entries_fts WHERE rowid = ?");
|
|
127
|
+
for (const row of removedRows) {
|
|
128
|
+
deleteSearch.run(Number(row.rowid));
|
|
129
|
+
}
|
|
130
|
+
this.database
|
|
131
|
+
.prepare("DELETE FROM history_entries WHERE session_id = ? AND position >= ?")
|
|
132
|
+
.run(sessionId, position);
|
|
133
|
+
const previous = this.database
|
|
134
|
+
.prepare("SELECT entry_id FROM history_entries WHERE session_id = ? ORDER BY position DESC LIMIT 1")
|
|
135
|
+
.get(sessionId);
|
|
136
|
+
const afterEntryId = previous ? String(previous.entry_id) : null;
|
|
137
|
+
this.database
|
|
138
|
+
.prepare("UPDATE history_sessions SET updated_at = ? WHERE session_id = ?")
|
|
139
|
+
.run(Date.now(), sessionId);
|
|
140
|
+
if (remote) {
|
|
141
|
+
this.enqueue(remote.endpoint, {
|
|
142
|
+
id: randomUUID(),
|
|
143
|
+
sessionId,
|
|
144
|
+
type: "truncate",
|
|
145
|
+
afterEntryId,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return afterEntryId;
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
async search(input) {
|
|
152
|
+
const offset = decodeOffsetCursor(input.cursor);
|
|
153
|
+
const values = [];
|
|
154
|
+
const attributeClauses = Object.entries(input.attributes ?? {}).map(([key, filter]) => {
|
|
155
|
+
if (typeof filter === "string") {
|
|
156
|
+
values.push(key, filter);
|
|
157
|
+
return "EXISTS (SELECT 1 FROM history_attributes a WHERE a.session_id = s.session_id AND a.key = ? AND a.value = ?)";
|
|
158
|
+
}
|
|
159
|
+
values.push(key, filter.contains);
|
|
160
|
+
return "EXISTS (SELECT 1 FROM history_attributes a WHERE a.session_id = s.session_id AND a.key = ? AND INSTR(a.value, ?) > 0)";
|
|
161
|
+
});
|
|
162
|
+
const query = input.query?.trim();
|
|
163
|
+
let sql;
|
|
164
|
+
if (query) {
|
|
165
|
+
const matchQuery = buildFtsQuery(query);
|
|
166
|
+
values.unshift(matchQuery);
|
|
167
|
+
sql = `
|
|
168
|
+
WITH matches AS (
|
|
169
|
+
SELECT e.session_id,
|
|
170
|
+
GROUP_CONCAT(SUBSTR(e.search_text, 1, 360), '\n') AS snippets
|
|
171
|
+
FROM history_entries_fts
|
|
172
|
+
JOIN history_entries e ON e.rowid = history_entries_fts.rowid
|
|
173
|
+
WHERE history_entries_fts MATCH ?
|
|
174
|
+
GROUP BY e.session_id
|
|
175
|
+
)
|
|
176
|
+
SELECT s.*, m.snippets
|
|
177
|
+
FROM history_sessions s
|
|
178
|
+
JOIN matches m ON m.session_id = s.session_id
|
|
179
|
+
${attributeClauses.length > 0 ? `WHERE ${attributeClauses.join(" AND ")}` : ""}
|
|
180
|
+
ORDER BY s.updated_at DESC, s.session_id ASC
|
|
181
|
+
LIMIT ? OFFSET ?`;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
sql = `
|
|
185
|
+
SELECT s.*, NULL AS snippets
|
|
186
|
+
FROM history_sessions s
|
|
187
|
+
${attributeClauses.length > 0 ? `WHERE ${attributeClauses.join(" AND ")}` : ""}
|
|
188
|
+
ORDER BY s.updated_at DESC, s.session_id ASC
|
|
189
|
+
LIMIT ? OFFSET ?`;
|
|
190
|
+
}
|
|
191
|
+
values.push(input.limit + 1, offset);
|
|
192
|
+
const rows = this.database.prepare(sql).all(...values);
|
|
193
|
+
const hasMore = rows.length > input.limit;
|
|
194
|
+
const selected = rows.slice(0, input.limit);
|
|
195
|
+
return {
|
|
196
|
+
sessions: selected.map(descriptorFromRow),
|
|
197
|
+
...(hasMore ? { nextCursor: encodeOffsetCursor(offset + input.limit) } : {}),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
async read(input) {
|
|
201
|
+
const position = decodePositionCursor(input.cursor);
|
|
202
|
+
const sessionRow = this.database
|
|
203
|
+
.prepare("SELECT *, NULL AS snippets FROM history_sessions WHERE session_id = ?")
|
|
204
|
+
.get(input.sessionId);
|
|
205
|
+
if (!sessionRow) {
|
|
206
|
+
throw new Error(`history session '${input.sessionId}' was not found`);
|
|
207
|
+
}
|
|
208
|
+
const candidates = this.database
|
|
209
|
+
.prepare("SELECT position, LENGTH(CAST(payload_json AS BLOB)) AS payload_bytes FROM history_entries WHERE session_id = ? AND position > ? ORDER BY position LIMIT ?")
|
|
210
|
+
.all(input.sessionId, position, input.limit + 1);
|
|
211
|
+
const selectedCount = selectHistoryReadPage(candidates, input.limit);
|
|
212
|
+
const rows = this.database
|
|
213
|
+
.prepare("SELECT position, payload_json FROM history_entries WHERE session_id = ? AND position > ? ORDER BY position LIMIT ?")
|
|
214
|
+
.all(input.sessionId, position, selectedCount);
|
|
215
|
+
const last = rows.at(-1);
|
|
216
|
+
return {
|
|
217
|
+
session: descriptorFromRow(sessionRow),
|
|
218
|
+
entries: rows.map((row) => JSON.parse(String(row.payload_json))),
|
|
219
|
+
...(candidates.length > selectedCount && last
|
|
220
|
+
? { nextCursor: encodePositionCursor(Number(last.position)) }
|
|
221
|
+
: {}),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
listPendingOperations(endpoint, limit) {
|
|
225
|
+
return this.database
|
|
226
|
+
.prepare("SELECT id, payload_json FROM history_outbox WHERE endpoint = ? ORDER BY id LIMIT ?")
|
|
227
|
+
.all(endpoint, limit).map((row) => ({
|
|
228
|
+
rowId: Number(row.id),
|
|
229
|
+
operation: JSON.parse(String(row.payload_json)),
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
acknowledgeOperations(rowIds) {
|
|
233
|
+
if (rowIds.length === 0)
|
|
234
|
+
return;
|
|
235
|
+
this.database
|
|
236
|
+
.prepare(`DELETE FROM history_outbox WHERE id IN (${rowIds.map(() => "?").join(", ")})`)
|
|
237
|
+
.run(...rowIds);
|
|
238
|
+
}
|
|
239
|
+
initialize() {
|
|
240
|
+
this.database.exec(`
|
|
241
|
+
PRAGMA journal_mode = WAL;
|
|
242
|
+
PRAGMA busy_timeout = 5000;
|
|
243
|
+
PRAGMA foreign_keys = ON;
|
|
244
|
+
CREATE TABLE IF NOT EXISTS history_sessions (
|
|
245
|
+
session_id TEXT PRIMARY KEY,
|
|
246
|
+
attributes_json TEXT NOT NULL,
|
|
247
|
+
created_at INTEGER NOT NULL,
|
|
248
|
+
updated_at INTEGER NOT NULL,
|
|
249
|
+
digest_title TEXT,
|
|
250
|
+
digest_summary TEXT,
|
|
251
|
+
digest_through_entry_id TEXT
|
|
252
|
+
);
|
|
253
|
+
CREATE TABLE IF NOT EXISTS history_attributes (
|
|
254
|
+
session_id TEXT NOT NULL REFERENCES history_sessions(session_id) ON DELETE CASCADE,
|
|
255
|
+
key TEXT NOT NULL,
|
|
256
|
+
value TEXT NOT NULL,
|
|
257
|
+
PRIMARY KEY (session_id, key)
|
|
258
|
+
);
|
|
259
|
+
CREATE INDEX IF NOT EXISTS history_attributes_lookup
|
|
260
|
+
ON history_attributes(key, value, session_id);
|
|
261
|
+
CREATE TABLE IF NOT EXISTS history_entries (
|
|
262
|
+
session_id TEXT NOT NULL REFERENCES history_sessions(session_id) ON DELETE CASCADE,
|
|
263
|
+
position INTEGER NOT NULL,
|
|
264
|
+
entry_id TEXT NOT NULL,
|
|
265
|
+
type TEXT NOT NULL,
|
|
266
|
+
timestamp INTEGER NOT NULL,
|
|
267
|
+
payload_json TEXT NOT NULL,
|
|
268
|
+
search_text TEXT NOT NULL,
|
|
269
|
+
PRIMARY KEY (session_id, entry_id),
|
|
270
|
+
UNIQUE (session_id, position)
|
|
271
|
+
);
|
|
272
|
+
CREATE INDEX IF NOT EXISTS history_entries_order
|
|
273
|
+
ON history_entries(session_id, position);
|
|
274
|
+
CREATE TABLE IF NOT EXISTS history_entry_sources (
|
|
275
|
+
session_id TEXT NOT NULL,
|
|
276
|
+
entry_id TEXT NOT NULL,
|
|
277
|
+
source_id TEXT NOT NULL,
|
|
278
|
+
PRIMARY KEY (session_id, entry_id, source_id),
|
|
279
|
+
FOREIGN KEY (session_id, entry_id)
|
|
280
|
+
REFERENCES history_entries(session_id, entry_id) ON DELETE CASCADE
|
|
281
|
+
);
|
|
282
|
+
CREATE INDEX IF NOT EXISTS history_entry_sources_lookup
|
|
283
|
+
ON history_entry_sources(session_id, source_id);
|
|
284
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS history_entries_fts USING fts5(session_id UNINDEXED, text);
|
|
285
|
+
CREATE TABLE IF NOT EXISTS history_replication_targets (
|
|
286
|
+
session_id TEXT NOT NULL REFERENCES history_sessions(session_id) ON DELETE CASCADE,
|
|
287
|
+
endpoint TEXT NOT NULL,
|
|
288
|
+
PRIMARY KEY (session_id, endpoint)
|
|
289
|
+
);
|
|
290
|
+
CREATE TABLE IF NOT EXISTS history_outbox (
|
|
291
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
292
|
+
endpoint TEXT NOT NULL,
|
|
293
|
+
payload_json TEXT NOT NULL
|
|
294
|
+
);
|
|
295
|
+
CREATE INDEX IF NOT EXISTS history_outbox_target ON history_outbox(endpoint, id);
|
|
296
|
+
`);
|
|
297
|
+
}
|
|
298
|
+
requireSession(sessionId) {
|
|
299
|
+
const row = this.database
|
|
300
|
+
.prepare("SELECT 1 AS found FROM history_sessions WHERE session_id = ?")
|
|
301
|
+
.get(sessionId);
|
|
302
|
+
if (!row)
|
|
303
|
+
throw new Error(`history session '${sessionId}' was not created`);
|
|
304
|
+
}
|
|
305
|
+
enqueue(endpoint, operation) {
|
|
306
|
+
this.database
|
|
307
|
+
.prepare("INSERT INTO history_outbox (endpoint, payload_json) VALUES (?, ?)")
|
|
308
|
+
.run(endpoint, JSON.stringify(operation));
|
|
309
|
+
}
|
|
310
|
+
transaction(handler) {
|
|
311
|
+
this.database.exec("BEGIN IMMEDIATE");
|
|
312
|
+
try {
|
|
313
|
+
const result = handler();
|
|
314
|
+
this.database.exec("COMMIT");
|
|
315
|
+
return result;
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
this.database.exec("ROLLBACK");
|
|
319
|
+
throw error;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function stableJson(value) {
|
|
324
|
+
return JSON.stringify(Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))));
|
|
325
|
+
}
|
|
326
|
+
function descriptorFromRow(row) {
|
|
327
|
+
const title = typeof row.digest_title === "string" ? row.digest_title : undefined;
|
|
328
|
+
const summary = typeof row.digest_summary === "string" ? row.digest_summary : undefined;
|
|
329
|
+
const updatedThroughEntryId = typeof row.digest_through_entry_id === "string" ? row.digest_through_entry_id : undefined;
|
|
330
|
+
const rawSnippets = typeof row.snippets === "string" ? row.snippets.split("\n") : [];
|
|
331
|
+
return {
|
|
332
|
+
sessionId: String(row.session_id),
|
|
333
|
+
attributes: JSON.parse(String(row.attributes_json)),
|
|
334
|
+
createdAt: Number(row.created_at),
|
|
335
|
+
updatedAt: Number(row.updated_at),
|
|
336
|
+
...(title && summary && updatedThroughEntryId
|
|
337
|
+
? { digest: { title, summary, updatedThroughEntryId } }
|
|
338
|
+
: {}),
|
|
339
|
+
snippets: rawSnippets.filter(Boolean).slice(0, MAX_SEARCH_SNIPPETS),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
function historyEntrySearchText(entry) {
|
|
343
|
+
if (entry.type === "tool") {
|
|
344
|
+
return [entry.name, stringifySearchValue(entry.arguments), stringifySearchValue(entry.result)]
|
|
345
|
+
.filter(Boolean)
|
|
346
|
+
.join("\n");
|
|
347
|
+
}
|
|
348
|
+
return stringifySearchValue(entry.content);
|
|
349
|
+
}
|
|
350
|
+
function stringifySearchValue(value) {
|
|
351
|
+
if (typeof value === "string")
|
|
352
|
+
return value;
|
|
353
|
+
if (Array.isArray(value))
|
|
354
|
+
return value.map(stringifySearchValue).filter(Boolean).join("\n");
|
|
355
|
+
if (typeof value !== "object" || value === null)
|
|
356
|
+
return "";
|
|
357
|
+
return Object.values(value).map(stringifySearchValue).filter(Boolean).join("\n");
|
|
358
|
+
}
|
|
359
|
+
function buildFtsQuery(query) {
|
|
360
|
+
const terms = query.match(/[\p{L}\p{N}_-]+/gu) ?? [];
|
|
361
|
+
if (terms.length === 0)
|
|
362
|
+
return `"${query.replaceAll('"', '""')}"`;
|
|
363
|
+
return terms.map((term) => `"${term.replaceAll('"', '""')}"`).join(" AND ");
|
|
364
|
+
}
|
|
365
|
+
function selectHistoryReadPage(candidates, limit) {
|
|
366
|
+
let count = 0;
|
|
367
|
+
let bytes = 0;
|
|
368
|
+
for (const candidate of candidates.slice(0, limit)) {
|
|
369
|
+
const nextBytes = bytes + Number(candidate.payload_bytes) + 1;
|
|
370
|
+
if (count > 0 && nextBytes > HISTORY_READ_PAGE_MAX_BYTES)
|
|
371
|
+
break;
|
|
372
|
+
count += 1;
|
|
373
|
+
bytes = nextBytes;
|
|
374
|
+
}
|
|
375
|
+
return count;
|
|
376
|
+
}
|
|
377
|
+
function encodeOffsetCursor(offset) {
|
|
378
|
+
return Buffer.from(JSON.stringify({ offset })).toString("base64url");
|
|
379
|
+
}
|
|
380
|
+
function decodeOffsetCursor(cursor) {
|
|
381
|
+
if (!cursor)
|
|
382
|
+
return 0;
|
|
383
|
+
try {
|
|
384
|
+
const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
|
|
385
|
+
if (Number.isSafeInteger(parsed.offset) && Number(parsed.offset) >= 0) {
|
|
386
|
+
return Number(parsed.offset);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch { }
|
|
390
|
+
throw new Error("invalid history search cursor");
|
|
391
|
+
}
|
|
392
|
+
function encodePositionCursor(position) {
|
|
393
|
+
return Buffer.from(JSON.stringify({ position })).toString("base64url");
|
|
394
|
+
}
|
|
395
|
+
function decodePositionCursor(cursor) {
|
|
396
|
+
if (!cursor)
|
|
397
|
+
return 0;
|
|
398
|
+
try {
|
|
399
|
+
const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
|
|
400
|
+
if (Number.isSafeInteger(parsed.position) && Number(parsed.position) >= 0) {
|
|
401
|
+
return Number(parsed.position);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
catch { }
|
|
405
|
+
throw new Error("invalid history read cursor");
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=local_history_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local_history_store.js","sourceRoot":"","sources":["../../../src/core/history/local_history_store.ts"],"names":[],"mappings":"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"}
|