pi-mega-compact 0.13.0 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/dashboard-server/api-contracts/embedder-health.js +11 -0
- package/dist/extensions/dashboard-server/api-contracts/endpoints/registry.js +225 -0
- package/dist/extensions/dashboard-server/api-contracts/endpoints/types.js +1 -0
- package/dist/extensions/dashboard-server/api-contracts/endpoints.js +5 -224
- package/dist/extensions/dashboard-server/api-contracts/raptor.js +8 -0
- package/dist/extensions/dashboard-server/api-contracts.test/_helpers.js +32 -0
- package/dist/extensions/dashboard-server/routes-cache.test/_helpers.js +48 -0
- package/dist/extensions/dashboard-server/routes-embedder-health.js +67 -0
- package/dist/extensions/dashboard-server/routes-raptor.js +88 -0
- package/dist/extensions/dashboard-server/routes-setup.js +1 -1
- package/dist/extensions/dashboard-server/routes.js +2 -0
- package/dist/extensions/dashboard-server/server.js +5 -1
- package/dist/extensions/mega-cache-replay.test/_helpers.js +175 -0
- package/dist/extensions/mega-commands/dataCommands.js +151 -0
- package/dist/extensions/mega-commands/helpers.js +61 -0
- package/dist/extensions/mega-commands/historyCommands.js +97 -0
- package/dist/extensions/mega-commands/setupCommand.js +200 -0
- package/dist/extensions/mega-commands.js +14 -499
- package/dist/extensions/mega-compact-s38.test/_helpers.js +194 -0
- package/dist/extensions/mega-compact.js +12 -2
- package/dist/extensions/mega-compact.test/_helpers.js +225 -0
- package/dist/extensions/mega-events/agent-handlers/agentEndHandler.js +211 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.js +49 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/contextHealth.js +33 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/errorRetry.js +387 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/event.js +7 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/gameScoring.js +55 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/lengthStop.js +12 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/memoryReview.js +22 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.js +38 -0
- package/dist/extensions/mega-events/agent-handlers/turnEndHandler.js +36 -0
- package/dist/extensions/mega-events/agent-handlers.js +4 -799
- package/dist/extensions/mega-events/context-handler/afterCompact.js +163 -0
- package/dist/extensions/mega-events/context-handler/messageText.js +12 -0
- package/dist/extensions/mega-events/context-handler/tailResult.js +46 -0
- package/dist/extensions/mega-events/context-handler.js +11 -198
- package/dist/extensions/mega-events/separated-prompt.test/_helpers.js +25 -0
- package/dist/src/config.js +2 -0
- package/dist/src/dedup-engine.test/_helpers.js +55 -0
- package/dist/src/e2e.test/_helpers.js +52 -0
- package/dist/src/embedder.js +1 -0
- package/dist/src/httpEmbedder.js +6 -0
- package/dist/src/hyde.js +146 -0
- package/dist/src/importance.test/_helpers.js +5 -0
- package/dist/src/memoryGraph/sources/checkpoints.js +78 -0
- package/dist/src/memoryGraph/sources/edges.js +17 -0
- package/dist/src/memoryGraph/sources/flags.js +22 -0
- package/dist/src/memoryGraph/sources/helpers.js +14 -0
- package/dist/src/memoryGraph/sources/memories.js +88 -0
- package/dist/src/memoryGraph/sources/raptor.js +26 -0
- package/dist/src/memoryGraph/sources/turns.js +176 -0
- package/dist/src/memoryGraph/sources.js +15 -441
- package/dist/src/memoryGraph-gates.test/_helpers.js +120 -0
- package/dist/src/ratio.bench.test/_helpers.js +198 -0
- package/dist/src/recall/async.js +112 -0
- package/dist/src/recall/format.js +149 -0
- package/dist/src/recall/memory.js +62 -0
- package/dist/src/recall/reformulate.js +82 -0
- package/dist/src/recall/sync.js +169 -0
- package/dist/src/recall/types.js +1 -0
- package/dist/src/recall.js +13 -530
- package/dist/src/store/sqlite/schema/core.js +232 -0
- package/dist/src/store/sqlite/schema/game.js +65 -0
- package/dist/src/store/sqlite/schema/plan-v2.js +107 -0
- package/dist/src/store/sqlite/schema/turns.js +59 -0
- package/dist/src/store/sqlite/schema.js +8 -441
- package/dist/src/store/turns/contract-compliance.test/_helpers.js +21 -0
- package/dist/src/store/turns/sqlite-store/admin.js +171 -0
- package/dist/src/store/turns/sqlite-store/ctx.js +1 -0
- package/dist/src/store/turns/sqlite-store/read.js +111 -0
- package/dist/src/store/turns/sqlite-store/rows.js +42 -0
- package/dist/src/store/turns/sqlite-store/write.js +102 -0
- package/dist/src/store/turns/sqlite-store.js +31 -367
- package/dist/src/vectorStore/class.js +356 -0
- package/dist/src/vectorStore/hash.js +10 -0
- package/dist/src/vectorStore/types.js +2 -0
- package/dist/src/vectorStore.js +8 -359
- package/dist/src/vectorStore.test/_helpers.js +17 -0
- package/extensions/dashboard-client/dist/assets/{CacheTab-BZNnKhh5.js → CacheTab-DPRHjYZ0.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-BZNnKhh5.js.map → CacheTab-DPRHjYZ0.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-CzF5L42U.js → EventsTab-CgwYq-Qf.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-CzF5L42U.js.map → EventsTab-CgwYq-Qf.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-BLpidMrX.js → HealthTab-BgOCjVzR.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-BLpidMrX.js.map → HealthTab-BgOCjVzR.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-Yw1yFpsy.js +2 -0
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-Yw1yFpsy.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-yHUX7Yzi.js +2 -0
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-yHUX7Yzi.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{MetricsTab-B0PCysqs.js → MetricsTab-CcH9fP8P.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-B0PCysqs.js.map → MetricsTab-CcH9fP8P.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DsOhqFu4.js → OverviewTab-BOs8ZNev.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DsOhqFu4.js.map → OverviewTab-BOs8ZNev.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-B3YKYuOf.js → ReposTab-B-MfSPvg.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-B3YKYuOf.js.map → ReposTab-B-MfSPvg.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-B96FWcrC.js → SessionsTab-BmeN649Q.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-B96FWcrC.js.map → SessionsTab-BmeN649Q.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/SetupTab-nOknoph5.js +2 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-nOknoph5.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BfkUVTvA.js → TimeSavedCard-DnPg0L0z.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BfkUVTvA.js.map → TimeSavedCard-DnPg0L0z.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TopicsTab-DLRsZmXJ.js → TopicsTab-BODHOg_b.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TopicsTab-DLRsZmXJ.js.map → TopicsTab-BODHOg_b.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-DKGU2Bf6.js → TurnsTab-BK0I7hKr.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-DKGU2Bf6.js.map → TurnsTab-BK0I7hKr.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-D-lPLRWB.js → index-mOlljTFI.js} +10 -10
- package/extensions/dashboard-client/dist/assets/index-mOlljTFI.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{useSSE-ClbbcgIp.js → useSSE-BYOtv1-3.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-ClbbcgIp.js.map → useSSE-BYOtv1-3.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +1 -1
- package/extensions/dashboard-client/src/App.tsx +0 -4
- package/extensions/dashboard-client/src/api/client.ts +16 -0
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/ActionsCard.tsx +178 -0
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/DbStatsCard.tsx +140 -0
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/DebugBundleCard.tsx +109 -0
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/HealthMitigationCard.tsx +98 -0
- package/extensions/dashboard-client/src/tabs/MaintenanceTab/SchemaHealthCard.tsx +108 -0
- package/extensions/dashboard-client/src/tabs/MaintenanceTab.tsx +12 -598
- package/extensions/dashboard-client/src/tabs/MemoryMapTab/MemoryMapView.tsx +476 -0
- package/extensions/dashboard-client/src/tabs/MemoryMapTab/RaptorTreeView.tsx +163 -0
- package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +56 -466
- package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderHealthCard.tsx +109 -0
- package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +468 -0
- package/extensions/dashboard-client/src/tabs/SetupTab.tsx +23 -484
- package/extensions/dashboard-server/api-contracts/embedder-health.ts +32 -0
- package/extensions/dashboard-server/api-contracts/endpoints/registry.ts +360 -0
- package/extensions/dashboard-server/api-contracts/endpoints/types.ts +350 -0
- package/extensions/dashboard-server/api-contracts/endpoints.ts +27 -648
- package/extensions/dashboard-server/api-contracts/index.ts +6 -0
- package/extensions/dashboard-server/api-contracts/raptor.ts +49 -0
- package/extensions/dashboard-server/api-contracts.test/_helpers.ts +47 -0
- package/extensions/dashboard-server/routes-cache.test/_helpers.ts +94 -0
- package/extensions/dashboard-server/routes-embedder-health.ts +77 -0
- package/extensions/dashboard-server/routes-raptor.ts +128 -0
- package/extensions/dashboard-server/routes-setup.ts +1 -1
- package/extensions/dashboard-server/routes.ts +2 -0
- package/extensions/dashboard-server/server.ts +4 -0
- package/extensions/mega-cache-replay.test/_helpers.ts +188 -0
- package/extensions/mega-commands/dataCommands.ts +169 -0
- package/extensions/mega-commands/helpers.ts +62 -0
- package/extensions/mega-commands/historyCommands.ts +117 -0
- package/extensions/mega-commands/setupCommand.ts +235 -0
- package/extensions/mega-commands.ts +25 -538
- package/extensions/mega-compact-s38.test/_helpers.ts +201 -0
- package/extensions/mega-compact.test/_helpers.ts +237 -0
- package/extensions/mega-compact.ts +12 -2
- package/extensions/mega-events/agent-handlers/agentEndHandler.ts +238 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.ts +74 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/contextHealth.ts +50 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/errorRetry.ts +421 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/event.ts +16 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/gameScoring.ts +73 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/lengthStop.ts +29 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/memoryReview.ts +42 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.ts +61 -0
- package/extensions/mega-events/agent-handlers/turnEndHandler.ts +64 -0
- package/extensions/mega-events/agent-handlers.ts +15 -861
- package/extensions/mega-events/context-handler/afterCompact.ts +213 -0
- package/extensions/mega-events/context-handler/messageText.ts +20 -0
- package/extensions/mega-events/context-handler/tailResult.ts +63 -0
- package/extensions/mega-events/context-handler.ts +17 -235
- package/extensions/mega-events/separated-prompt.test/_helpers.ts +35 -0
- package/package.json +1 -1
- package/src/config.ts +4 -0
- package/src/dedup-engine.test/_helpers.ts +79 -0
- package/src/e2e.test/_helpers.ts +59 -0
- package/src/embedder.ts +4 -0
- package/src/httpEmbedder.ts +7 -0
- package/src/hyde.ts +162 -0
- package/src/importance.test/_helpers.ts +5 -0
- package/src/memoryGraph/sources/checkpoints.ts +99 -0
- package/src/memoryGraph/sources/edges.ts +23 -0
- package/src/memoryGraph/sources/flags.ts +26 -0
- package/src/memoryGraph/sources/helpers.ts +13 -0
- package/src/memoryGraph/sources/memories.ts +108 -0
- package/src/memoryGraph/sources/raptor.ts +37 -0
- package/src/memoryGraph/sources/turns.ts +226 -0
- package/src/memoryGraph/sources.ts +19 -544
- package/src/memoryGraph-gates.test/_helpers.ts +164 -0
- package/src/ratio.bench.test/_helpers.ts +268 -0
- package/src/recall/async.ts +142 -0
- package/src/recall/format.ts +173 -0
- package/src/recall/memory.ts +90 -0
- package/src/recall/reformulate.ts +111 -0
- package/src/recall/sync.ts +196 -0
- package/src/recall/types.ts +63 -0
- package/src/recall.ts +25 -712
- package/src/store/sqlite/schema/core.ts +233 -0
- package/src/store/sqlite/schema/game.ts +66 -0
- package/src/store/sqlite/schema/plan-v2.ts +108 -0
- package/src/store/sqlite/schema/turns.ts +60 -0
- package/src/store/sqlite/schema.ts +13 -441
- package/src/store/turns/contract-compliance.test/_helpers.ts +38 -0
- package/src/store/turns/sqlite-store/admin.ts +249 -0
- package/src/store/turns/sqlite-store/ctx.ts +14 -0
- package/src/store/turns/sqlite-store/read.ts +174 -0
- package/src/store/turns/sqlite-store/rows.ts +55 -0
- package/src/store/turns/sqlite-store/write.ts +193 -0
- package/src/store/turns/sqlite-store.ts +33 -514
- package/src/vectorStore/class.ts +433 -0
- package/src/vectorStore/hash.ts +11 -0
- package/src/vectorStore/types.ts +58 -0
- package/src/vectorStore.test/_helpers.ts +20 -0
- package/src/vectorStore.ts +13 -489
- package/extensions/dashboard-client/dist/assets/ConfigTab-DG0WkuuG.js +0 -2
- package/extensions/dashboard-client/dist/assets/ConfigTab-DG0WkuuG.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-BQF7W7xX.js +0 -2
- package/extensions/dashboard-client/dist/assets/MaintenanceTab-BQF7W7xX.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-CPtHLv0A.js +0 -2
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-CPtHLv0A.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/SetupTab-hbzQ_NZv.js +0 -2
- package/extensions/dashboard-client/dist/assets/SetupTab-hbzQ_NZv.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-D-lPLRWB.js.map +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { normalizeSessionId, rowToEntry, rowToRecall, rowToFork } from "./rows.js";
|
|
2
|
+
export function query(ctx, filter) {
|
|
3
|
+
const { db } = ctx;
|
|
4
|
+
const clauses = [];
|
|
5
|
+
const params = [];
|
|
6
|
+
if (filter.conversationId !== undefined) {
|
|
7
|
+
clauses.push("conversation_id = ?");
|
|
8
|
+
params.push(filter.conversationId);
|
|
9
|
+
}
|
|
10
|
+
if (filter.sessionId !== undefined) {
|
|
11
|
+
clauses.push("session_id = ?");
|
|
12
|
+
params.push(normalizeSessionId(filter.sessionId));
|
|
13
|
+
}
|
|
14
|
+
if (filter.sinceMs !== undefined) {
|
|
15
|
+
clauses.push("ended_at >= ?");
|
|
16
|
+
params.push(filter.sinceMs);
|
|
17
|
+
}
|
|
18
|
+
if (filter.untilMs !== undefined) {
|
|
19
|
+
clauses.push("ended_at <= ?");
|
|
20
|
+
params.push(filter.untilMs);
|
|
21
|
+
}
|
|
22
|
+
if (filter.pressureBand !== undefined) {
|
|
23
|
+
clauses.push("pressure_band = ?");
|
|
24
|
+
params.push(filter.pressureBand);
|
|
25
|
+
}
|
|
26
|
+
const where = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
|
|
27
|
+
const limit = filter.limit ?? 1000;
|
|
28
|
+
const offset = filter.offset ?? 0;
|
|
29
|
+
const rows = db
|
|
30
|
+
.prepare(`SELECT * FROM turns ${where} ORDER BY ended_at ASC LIMIT ? OFFSET ?`)
|
|
31
|
+
.all(...params, limit, offset);
|
|
32
|
+
return rows.map(rowToEntry);
|
|
33
|
+
}
|
|
34
|
+
export function getTurn(ctx, turnId) {
|
|
35
|
+
const { db } = ctx;
|
|
36
|
+
const row = db
|
|
37
|
+
.prepare("SELECT * FROM turns WHERE id = ?")
|
|
38
|
+
.get(Number(turnId));
|
|
39
|
+
return row ? rowToEntry(row) : undefined;
|
|
40
|
+
}
|
|
41
|
+
export function getTurnByIndex(ctx, conversationId, turnIndex) {
|
|
42
|
+
const { db } = ctx;
|
|
43
|
+
const row = db
|
|
44
|
+
.prepare("SELECT * FROM turns WHERE conversation_id = ? AND turn_index = ?")
|
|
45
|
+
.get(conversationId, turnIndex);
|
|
46
|
+
return row ? rowToEntry(row) : undefined;
|
|
47
|
+
}
|
|
48
|
+
export function listRecall(ctx, turnId) {
|
|
49
|
+
const { db } = ctx;
|
|
50
|
+
const rows = db
|
|
51
|
+
.prepare("SELECT * FROM turn_recall WHERE turn_id = ? ORDER BY score DESC")
|
|
52
|
+
.all(Number(turnId));
|
|
53
|
+
return rows.map(rowToRecall);
|
|
54
|
+
}
|
|
55
|
+
export function listRecallByIndex(ctx, conversationId, turnIndex) {
|
|
56
|
+
const { db } = ctx;
|
|
57
|
+
const row = db
|
|
58
|
+
.prepare("SELECT id FROM turns WHERE conversation_id = ? AND turn_index = ?")
|
|
59
|
+
.get(conversationId, turnIndex);
|
|
60
|
+
if (!row)
|
|
61
|
+
return [];
|
|
62
|
+
return listRecall(ctx, String(row.id));
|
|
63
|
+
}
|
|
64
|
+
export function listForks(ctx, conversationId) {
|
|
65
|
+
const { db } = ctx;
|
|
66
|
+
const rows = db
|
|
67
|
+
.prepare("SELECT * FROM conversation_forks WHERE parent_conversation_id = ? ORDER BY created_at ASC")
|
|
68
|
+
.all(conversationId);
|
|
69
|
+
return rows.map(rowToFork);
|
|
70
|
+
}
|
|
71
|
+
export function countTurns(ctx, conversationId) {
|
|
72
|
+
const { db } = ctx;
|
|
73
|
+
const row = db
|
|
74
|
+
.prepare("SELECT COUNT(*) as cnt FROM turns WHERE conversation_id = ?")
|
|
75
|
+
.get(conversationId);
|
|
76
|
+
return row.cnt;
|
|
77
|
+
}
|
|
78
|
+
export function conversationStats(ctx, conversationId) {
|
|
79
|
+
const { db } = ctx;
|
|
80
|
+
const rows = db
|
|
81
|
+
.prepare("SELECT ended_at, ctx_percent, pressure_band FROM turns WHERE conversation_id = ? ORDER BY ended_at ASC")
|
|
82
|
+
.all(conversationId);
|
|
83
|
+
if (rows.length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
turnCount: 0,
|
|
86
|
+
firstTurnAt: 0,
|
|
87
|
+
lastTurnAt: 0,
|
|
88
|
+
avgCtxPercent: 0,
|
|
89
|
+
pressureBands: {},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
let ctxSum = 0;
|
|
93
|
+
let ctxCount = 0;
|
|
94
|
+
const bands = {};
|
|
95
|
+
for (const r of rows) {
|
|
96
|
+
if (r.ctx_percent !== null) {
|
|
97
|
+
ctxSum += r.ctx_percent;
|
|
98
|
+
ctxCount++;
|
|
99
|
+
}
|
|
100
|
+
const band = r.pressure_band;
|
|
101
|
+
if (band)
|
|
102
|
+
bands[band] = (bands[band] ?? 0) + 1;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
turnCount: rows.length,
|
|
106
|
+
firstTurnAt: rows[0].ended_at,
|
|
107
|
+
lastTurnAt: rows[rows.length - 1].ended_at,
|
|
108
|
+
avgCtxPercent: ctxCount > 0 ? ctxSum / ctxCount : 0,
|
|
109
|
+
pressureBands: bands,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rows.ts — row ↔ entry mappers + id helpers (extracted from sqlite-store.ts).
|
|
3
|
+
*/
|
|
4
|
+
import { randomBytes } from "node:crypto";
|
|
5
|
+
export function newConversationId() {
|
|
6
|
+
return `conv_${randomBytes(8).toString("hex")}`;
|
|
7
|
+
}
|
|
8
|
+
export function normalizeSessionId(sid) {
|
|
9
|
+
// Matches the existing normalizeSessionId in src/store.ts
|
|
10
|
+
return sid.replace(/-.*$/, "");
|
|
11
|
+
}
|
|
12
|
+
export function rowToEntry(r) {
|
|
13
|
+
return {
|
|
14
|
+
conversationId: r.conversation_id,
|
|
15
|
+
sessionId: r.session_id,
|
|
16
|
+
turnIndex: r.turn_index,
|
|
17
|
+
role: r.role,
|
|
18
|
+
endedAt: r.ended_at,
|
|
19
|
+
ctxTokens: r.ctx_tokens ?? undefined,
|
|
20
|
+
ctxPercent: r.ctx_percent ?? undefined,
|
|
21
|
+
pressureBand: r.pressure_band ?? undefined,
|
|
22
|
+
model: r.model ?? undefined,
|
|
23
|
+
epochId: r.epoch_id ?? undefined,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function rowToRecall(r) {
|
|
27
|
+
return {
|
|
28
|
+
turnId: String(r.turn_id),
|
|
29
|
+
checkpointId: r.checkpoint_id,
|
|
30
|
+
score: r.score,
|
|
31
|
+
source: r.source,
|
|
32
|
+
raptorLevel: r.raptor_level ?? undefined,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function rowToFork(r) {
|
|
36
|
+
return {
|
|
37
|
+
parentConversationId: r.parent_conversation_id,
|
|
38
|
+
childConversationId: r.child_conversation_id,
|
|
39
|
+
forkTurnIndex: r.fork_turn_index,
|
|
40
|
+
createdAt: r.created_at,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { DuplicateTurnError } from "../types.js";
|
|
2
|
+
import { newConversationId, normalizeSessionId } from "./rows.js";
|
|
3
|
+
export function appendTurn(ctx, entry) {
|
|
4
|
+
const { db } = ctx;
|
|
5
|
+
const sid = normalizeSessionId(entry.sessionId);
|
|
6
|
+
persistSessionConv(ctx, sid, entry.conversationId);
|
|
7
|
+
try {
|
|
8
|
+
db
|
|
9
|
+
.prepare(`INSERT INTO turns (conversation_id, session_id, turn_index, role, ended_at,
|
|
10
|
+
ctx_tokens, ctx_percent, pressure_band, model, epoch_id)
|
|
11
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
12
|
+
.run(entry.conversationId, sid, entry.turnIndex, entry.role, entry.endedAt, entry.ctxTokens ?? null, entry.ctxPercent ?? null, entry.pressureBand ?? null, entry.model ?? null, entry.epochId ?? null);
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
if (e instanceof Error &&
|
|
16
|
+
e.message.includes("UNIQUE constraint") &&
|
|
17
|
+
e.code === "ERR_SQLITE_ERROR") {
|
|
18
|
+
throw new DuplicateTurnError(entry.conversationId, entry.turnIndex);
|
|
19
|
+
}
|
|
20
|
+
throw e;
|
|
21
|
+
}
|
|
22
|
+
const row = db
|
|
23
|
+
.prepare("SELECT id FROM turns WHERE conversation_id = ? AND turn_index = ?")
|
|
24
|
+
.get(entry.conversationId, entry.turnIndex);
|
|
25
|
+
return String(row.id);
|
|
26
|
+
}
|
|
27
|
+
/** Persist the session → conversation mapping when a turn is written. */
|
|
28
|
+
function persistSessionConv(ctx, sid, conversationId) {
|
|
29
|
+
ctx.db
|
|
30
|
+
.prepare("INSERT OR IGNORE INTO session_conversations (session_id, conversation_id) VALUES (?, ?)")
|
|
31
|
+
.run(sid, conversationId);
|
|
32
|
+
}
|
|
33
|
+
export function appendRecall(ctx, entry) {
|
|
34
|
+
const { db } = ctx;
|
|
35
|
+
db
|
|
36
|
+
.prepare(`INSERT OR IGNORE INTO turn_recall (turn_id, checkpoint_id, score, source, raptor_level)
|
|
37
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
38
|
+
.run(Number(entry.turnId), entry.checkpointId, entry.score, entry.source, entry.raptorLevel ?? null);
|
|
39
|
+
}
|
|
40
|
+
export function ensureConversationId(ctx, sessionId) {
|
|
41
|
+
const { db } = ctx;
|
|
42
|
+
const sid = normalizeSessionId(sessionId);
|
|
43
|
+
// Check session_conversations table first (persistent mapping)
|
|
44
|
+
const row = db
|
|
45
|
+
.prepare("SELECT conversation_id FROM session_conversations WHERE session_id = ?")
|
|
46
|
+
.get(sid);
|
|
47
|
+
if (row)
|
|
48
|
+
return row.conversation_id;
|
|
49
|
+
// Check if any turn exists for this session (fallback)
|
|
50
|
+
const turnRow = db
|
|
51
|
+
.prepare("SELECT conversation_id FROM turns WHERE session_id = ? ORDER BY ended_at DESC LIMIT 1")
|
|
52
|
+
.get(sid);
|
|
53
|
+
if (turnRow) {
|
|
54
|
+
// Persist the mapping so future calls are consistent
|
|
55
|
+
db
|
|
56
|
+
.prepare("INSERT OR IGNORE INTO session_conversations (session_id, conversation_id) VALUES (?, ?)")
|
|
57
|
+
.run(sid, turnRow.conversation_id);
|
|
58
|
+
return turnRow.conversation_id;
|
|
59
|
+
}
|
|
60
|
+
// No turns yet — generate and persist a new conversation id
|
|
61
|
+
const convId = newConversationId();
|
|
62
|
+
db
|
|
63
|
+
.prepare("INSERT OR IGNORE INTO session_conversations (session_id, conversation_id) VALUES (?, ?)")
|
|
64
|
+
.run(sid, convId);
|
|
65
|
+
return convId;
|
|
66
|
+
}
|
|
67
|
+
export function forkConversation(ctx, parentId, forkTurnIndex) {
|
|
68
|
+
const { db } = ctx;
|
|
69
|
+
const childId = newConversationId();
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
// 1. Record the fork lineage
|
|
72
|
+
db
|
|
73
|
+
.prepare(`INSERT INTO conversation_forks (parent_conversation_id, child_conversation_id, fork_turn_index, created_at)
|
|
74
|
+
VALUES (?, ?, ?, ?)`)
|
|
75
|
+
.run(parentId, childId, forkTurnIndex, now);
|
|
76
|
+
// 2. Find the parent's turn at forkTurnIndex
|
|
77
|
+
const parentTurn = db
|
|
78
|
+
.prepare("SELECT id FROM turns WHERE conversation_id = ? AND turn_index = ?")
|
|
79
|
+
.get(parentId, forkTurnIndex);
|
|
80
|
+
if (!parentTurn)
|
|
81
|
+
return childId; // no parent turn at that index — nothing to seed
|
|
82
|
+
// 3. Create a seed turn in the child conversation (turnIndex 0, role system)
|
|
83
|
+
db
|
|
84
|
+
.prepare(`INSERT INTO turns (conversation_id, session_id, turn_index, role, ended_at)
|
|
85
|
+
VALUES (?, ?, 0, 'system', ?)`)
|
|
86
|
+
.run(childId, `fork_${childId}`, now);
|
|
87
|
+
const childTurnRow = db
|
|
88
|
+
.prepare("SELECT id FROM turns WHERE conversation_id = ? AND turn_index = 0")
|
|
89
|
+
.get(childId);
|
|
90
|
+
if (!childTurnRow)
|
|
91
|
+
return childId;
|
|
92
|
+
// 4. Copy the parent's recall entries into the child's seed turn
|
|
93
|
+
const parentRecall = db
|
|
94
|
+
.prepare("SELECT checkpoint_id, score, source, raptor_level FROM turn_recall WHERE turn_id = ?")
|
|
95
|
+
.all(parentTurn.id);
|
|
96
|
+
const insertRecall = db.prepare(`INSERT OR IGNORE INTO turn_recall (turn_id, checkpoint_id, score, source, raptor_level)
|
|
97
|
+
VALUES (?, ?, ?, ?, ?)`);
|
|
98
|
+
for (const r of parentRecall) {
|
|
99
|
+
insertRecall.run(childTurnRow.id, r.checkpoint_id, r.score, r.source, r.raptor_level ?? null);
|
|
100
|
+
}
|
|
101
|
+
return childId;
|
|
102
|
+
}
|