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.
Files changed (212) hide show
  1. package/dist/extensions/dashboard-server/api-contracts/embedder-health.js +11 -0
  2. package/dist/extensions/dashboard-server/api-contracts/endpoints/registry.js +225 -0
  3. package/dist/extensions/dashboard-server/api-contracts/endpoints/types.js +1 -0
  4. package/dist/extensions/dashboard-server/api-contracts/endpoints.js +5 -224
  5. package/dist/extensions/dashboard-server/api-contracts/raptor.js +8 -0
  6. package/dist/extensions/dashboard-server/api-contracts.test/_helpers.js +32 -0
  7. package/dist/extensions/dashboard-server/routes-cache.test/_helpers.js +48 -0
  8. package/dist/extensions/dashboard-server/routes-embedder-health.js +67 -0
  9. package/dist/extensions/dashboard-server/routes-raptor.js +88 -0
  10. package/dist/extensions/dashboard-server/routes-setup.js +1 -1
  11. package/dist/extensions/dashboard-server/routes.js +2 -0
  12. package/dist/extensions/dashboard-server/server.js +5 -1
  13. package/dist/extensions/mega-cache-replay.test/_helpers.js +175 -0
  14. package/dist/extensions/mega-commands/dataCommands.js +151 -0
  15. package/dist/extensions/mega-commands/helpers.js +61 -0
  16. package/dist/extensions/mega-commands/historyCommands.js +97 -0
  17. package/dist/extensions/mega-commands/setupCommand.js +200 -0
  18. package/dist/extensions/mega-commands.js +14 -499
  19. package/dist/extensions/mega-compact-s38.test/_helpers.js +194 -0
  20. package/dist/extensions/mega-compact.js +12 -2
  21. package/dist/extensions/mega-compact.test/_helpers.js +225 -0
  22. package/dist/extensions/mega-events/agent-handlers/agentEndHandler.js +211 -0
  23. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.js +49 -0
  24. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/contextHealth.js +33 -0
  25. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/errorRetry.js +387 -0
  26. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/event.js +7 -0
  27. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/gameScoring.js +55 -0
  28. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/lengthStop.js +12 -0
  29. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/memoryReview.js +22 -0
  30. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.js +38 -0
  31. package/dist/extensions/mega-events/agent-handlers/turnEndHandler.js +36 -0
  32. package/dist/extensions/mega-events/agent-handlers.js +4 -799
  33. package/dist/extensions/mega-events/context-handler/afterCompact.js +163 -0
  34. package/dist/extensions/mega-events/context-handler/messageText.js +12 -0
  35. package/dist/extensions/mega-events/context-handler/tailResult.js +46 -0
  36. package/dist/extensions/mega-events/context-handler.js +11 -198
  37. package/dist/extensions/mega-events/separated-prompt.test/_helpers.js +25 -0
  38. package/dist/src/config.js +2 -0
  39. package/dist/src/dedup-engine.test/_helpers.js +55 -0
  40. package/dist/src/e2e.test/_helpers.js +52 -0
  41. package/dist/src/embedder.js +1 -0
  42. package/dist/src/httpEmbedder.js +6 -0
  43. package/dist/src/hyde.js +146 -0
  44. package/dist/src/importance.test/_helpers.js +5 -0
  45. package/dist/src/memoryGraph/sources/checkpoints.js +78 -0
  46. package/dist/src/memoryGraph/sources/edges.js +17 -0
  47. package/dist/src/memoryGraph/sources/flags.js +22 -0
  48. package/dist/src/memoryGraph/sources/helpers.js +14 -0
  49. package/dist/src/memoryGraph/sources/memories.js +88 -0
  50. package/dist/src/memoryGraph/sources/raptor.js +26 -0
  51. package/dist/src/memoryGraph/sources/turns.js +176 -0
  52. package/dist/src/memoryGraph/sources.js +15 -441
  53. package/dist/src/memoryGraph-gates.test/_helpers.js +120 -0
  54. package/dist/src/ratio.bench.test/_helpers.js +198 -0
  55. package/dist/src/recall/async.js +112 -0
  56. package/dist/src/recall/format.js +149 -0
  57. package/dist/src/recall/memory.js +62 -0
  58. package/dist/src/recall/reformulate.js +82 -0
  59. package/dist/src/recall/sync.js +169 -0
  60. package/dist/src/recall/types.js +1 -0
  61. package/dist/src/recall.js +13 -530
  62. package/dist/src/store/sqlite/schema/core.js +232 -0
  63. package/dist/src/store/sqlite/schema/game.js +65 -0
  64. package/dist/src/store/sqlite/schema/plan-v2.js +107 -0
  65. package/dist/src/store/sqlite/schema/turns.js +59 -0
  66. package/dist/src/store/sqlite/schema.js +8 -441
  67. package/dist/src/store/turns/contract-compliance.test/_helpers.js +21 -0
  68. package/dist/src/store/turns/sqlite-store/admin.js +171 -0
  69. package/dist/src/store/turns/sqlite-store/ctx.js +1 -0
  70. package/dist/src/store/turns/sqlite-store/read.js +111 -0
  71. package/dist/src/store/turns/sqlite-store/rows.js +42 -0
  72. package/dist/src/store/turns/sqlite-store/write.js +102 -0
  73. package/dist/src/store/turns/sqlite-store.js +31 -367
  74. package/dist/src/vectorStore/class.js +356 -0
  75. package/dist/src/vectorStore/hash.js +10 -0
  76. package/dist/src/vectorStore/types.js +2 -0
  77. package/dist/src/vectorStore.js +8 -359
  78. package/dist/src/vectorStore.test/_helpers.js +17 -0
  79. package/extensions/dashboard-client/dist/assets/{CacheTab-BZNnKhh5.js → CacheTab-DPRHjYZ0.js} +2 -2
  80. package/extensions/dashboard-client/dist/assets/{CacheTab-BZNnKhh5.js.map → CacheTab-DPRHjYZ0.js.map} +1 -1
  81. package/extensions/dashboard-client/dist/assets/{EventsTab-CzF5L42U.js → EventsTab-CgwYq-Qf.js} +2 -2
  82. package/extensions/dashboard-client/dist/assets/{EventsTab-CzF5L42U.js.map → EventsTab-CgwYq-Qf.js.map} +1 -1
  83. package/extensions/dashboard-client/dist/assets/{HealthTab-BLpidMrX.js → HealthTab-BgOCjVzR.js} +2 -2
  84. package/extensions/dashboard-client/dist/assets/{HealthTab-BLpidMrX.js.map → HealthTab-BgOCjVzR.js.map} +1 -1
  85. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Yw1yFpsy.js +2 -0
  86. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Yw1yFpsy.js.map +1 -0
  87. package/extensions/dashboard-client/dist/assets/MemoryMapTab-yHUX7Yzi.js +2 -0
  88. package/extensions/dashboard-client/dist/assets/MemoryMapTab-yHUX7Yzi.js.map +1 -0
  89. package/extensions/dashboard-client/dist/assets/{MetricsTab-B0PCysqs.js → MetricsTab-CcH9fP8P.js} +2 -2
  90. package/extensions/dashboard-client/dist/assets/{MetricsTab-B0PCysqs.js.map → MetricsTab-CcH9fP8P.js.map} +1 -1
  91. package/extensions/dashboard-client/dist/assets/{OverviewTab-DsOhqFu4.js → OverviewTab-BOs8ZNev.js} +2 -2
  92. package/extensions/dashboard-client/dist/assets/{OverviewTab-DsOhqFu4.js.map → OverviewTab-BOs8ZNev.js.map} +1 -1
  93. package/extensions/dashboard-client/dist/assets/{ReposTab-B3YKYuOf.js → ReposTab-B-MfSPvg.js} +2 -2
  94. package/extensions/dashboard-client/dist/assets/{ReposTab-B3YKYuOf.js.map → ReposTab-B-MfSPvg.js.map} +1 -1
  95. package/extensions/dashboard-client/dist/assets/{SessionsTab-B96FWcrC.js → SessionsTab-BmeN649Q.js} +2 -2
  96. package/extensions/dashboard-client/dist/assets/{SessionsTab-B96FWcrC.js.map → SessionsTab-BmeN649Q.js.map} +1 -1
  97. package/extensions/dashboard-client/dist/assets/SetupTab-nOknoph5.js +2 -0
  98. package/extensions/dashboard-client/dist/assets/SetupTab-nOknoph5.js.map +1 -0
  99. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BfkUVTvA.js → TimeSavedCard-DnPg0L0z.js} +2 -2
  100. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BfkUVTvA.js.map → TimeSavedCard-DnPg0L0z.js.map} +1 -1
  101. package/extensions/dashboard-client/dist/assets/{TopicsTab-DLRsZmXJ.js → TopicsTab-BODHOg_b.js} +2 -2
  102. package/extensions/dashboard-client/dist/assets/{TopicsTab-DLRsZmXJ.js.map → TopicsTab-BODHOg_b.js.map} +1 -1
  103. package/extensions/dashboard-client/dist/assets/{TurnsTab-DKGU2Bf6.js → TurnsTab-BK0I7hKr.js} +2 -2
  104. package/extensions/dashboard-client/dist/assets/{TurnsTab-DKGU2Bf6.js.map → TurnsTab-BK0I7hKr.js.map} +1 -1
  105. package/extensions/dashboard-client/dist/assets/{index-D-lPLRWB.js → index-mOlljTFI.js} +10 -10
  106. package/extensions/dashboard-client/dist/assets/index-mOlljTFI.js.map +1 -0
  107. package/extensions/dashboard-client/dist/assets/{useSSE-ClbbcgIp.js → useSSE-BYOtv1-3.js} +2 -2
  108. package/extensions/dashboard-client/dist/assets/{useSSE-ClbbcgIp.js.map → useSSE-BYOtv1-3.js.map} +1 -1
  109. package/extensions/dashboard-client/dist/index.html +1 -1
  110. package/extensions/dashboard-client/src/App.tsx +0 -4
  111. package/extensions/dashboard-client/src/api/client.ts +16 -0
  112. package/extensions/dashboard-client/src/tabs/MaintenanceTab/ActionsCard.tsx +178 -0
  113. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DbStatsCard.tsx +140 -0
  114. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DebugBundleCard.tsx +109 -0
  115. package/extensions/dashboard-client/src/tabs/MaintenanceTab/HealthMitigationCard.tsx +98 -0
  116. package/extensions/dashboard-client/src/tabs/MaintenanceTab/SchemaHealthCard.tsx +108 -0
  117. package/extensions/dashboard-client/src/tabs/MaintenanceTab.tsx +12 -598
  118. package/extensions/dashboard-client/src/tabs/MemoryMapTab/MemoryMapView.tsx +476 -0
  119. package/extensions/dashboard-client/src/tabs/MemoryMapTab/RaptorTreeView.tsx +163 -0
  120. package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +56 -466
  121. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderHealthCard.tsx +109 -0
  122. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +468 -0
  123. package/extensions/dashboard-client/src/tabs/SetupTab.tsx +23 -484
  124. package/extensions/dashboard-server/api-contracts/embedder-health.ts +32 -0
  125. package/extensions/dashboard-server/api-contracts/endpoints/registry.ts +360 -0
  126. package/extensions/dashboard-server/api-contracts/endpoints/types.ts +350 -0
  127. package/extensions/dashboard-server/api-contracts/endpoints.ts +27 -648
  128. package/extensions/dashboard-server/api-contracts/index.ts +6 -0
  129. package/extensions/dashboard-server/api-contracts/raptor.ts +49 -0
  130. package/extensions/dashboard-server/api-contracts.test/_helpers.ts +47 -0
  131. package/extensions/dashboard-server/routes-cache.test/_helpers.ts +94 -0
  132. package/extensions/dashboard-server/routes-embedder-health.ts +77 -0
  133. package/extensions/dashboard-server/routes-raptor.ts +128 -0
  134. package/extensions/dashboard-server/routes-setup.ts +1 -1
  135. package/extensions/dashboard-server/routes.ts +2 -0
  136. package/extensions/dashboard-server/server.ts +4 -0
  137. package/extensions/mega-cache-replay.test/_helpers.ts +188 -0
  138. package/extensions/mega-commands/dataCommands.ts +169 -0
  139. package/extensions/mega-commands/helpers.ts +62 -0
  140. package/extensions/mega-commands/historyCommands.ts +117 -0
  141. package/extensions/mega-commands/setupCommand.ts +235 -0
  142. package/extensions/mega-commands.ts +25 -538
  143. package/extensions/mega-compact-s38.test/_helpers.ts +201 -0
  144. package/extensions/mega-compact.test/_helpers.ts +237 -0
  145. package/extensions/mega-compact.ts +12 -2
  146. package/extensions/mega-events/agent-handlers/agentEndHandler.ts +238 -0
  147. package/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.ts +74 -0
  148. package/extensions/mega-events/agent-handlers/turnEndHandler/contextHealth.ts +50 -0
  149. package/extensions/mega-events/agent-handlers/turnEndHandler/errorRetry.ts +421 -0
  150. package/extensions/mega-events/agent-handlers/turnEndHandler/event.ts +16 -0
  151. package/extensions/mega-events/agent-handlers/turnEndHandler/gameScoring.ts +73 -0
  152. package/extensions/mega-events/agent-handlers/turnEndHandler/lengthStop.ts +29 -0
  153. package/extensions/mega-events/agent-handlers/turnEndHandler/memoryReview.ts +42 -0
  154. package/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.ts +61 -0
  155. package/extensions/mega-events/agent-handlers/turnEndHandler.ts +64 -0
  156. package/extensions/mega-events/agent-handlers.ts +15 -861
  157. package/extensions/mega-events/context-handler/afterCompact.ts +213 -0
  158. package/extensions/mega-events/context-handler/messageText.ts +20 -0
  159. package/extensions/mega-events/context-handler/tailResult.ts +63 -0
  160. package/extensions/mega-events/context-handler.ts +17 -235
  161. package/extensions/mega-events/separated-prompt.test/_helpers.ts +35 -0
  162. package/package.json +1 -1
  163. package/src/config.ts +4 -0
  164. package/src/dedup-engine.test/_helpers.ts +79 -0
  165. package/src/e2e.test/_helpers.ts +59 -0
  166. package/src/embedder.ts +4 -0
  167. package/src/httpEmbedder.ts +7 -0
  168. package/src/hyde.ts +162 -0
  169. package/src/importance.test/_helpers.ts +5 -0
  170. package/src/memoryGraph/sources/checkpoints.ts +99 -0
  171. package/src/memoryGraph/sources/edges.ts +23 -0
  172. package/src/memoryGraph/sources/flags.ts +26 -0
  173. package/src/memoryGraph/sources/helpers.ts +13 -0
  174. package/src/memoryGraph/sources/memories.ts +108 -0
  175. package/src/memoryGraph/sources/raptor.ts +37 -0
  176. package/src/memoryGraph/sources/turns.ts +226 -0
  177. package/src/memoryGraph/sources.ts +19 -544
  178. package/src/memoryGraph-gates.test/_helpers.ts +164 -0
  179. package/src/ratio.bench.test/_helpers.ts +268 -0
  180. package/src/recall/async.ts +142 -0
  181. package/src/recall/format.ts +173 -0
  182. package/src/recall/memory.ts +90 -0
  183. package/src/recall/reformulate.ts +111 -0
  184. package/src/recall/sync.ts +196 -0
  185. package/src/recall/types.ts +63 -0
  186. package/src/recall.ts +25 -712
  187. package/src/store/sqlite/schema/core.ts +233 -0
  188. package/src/store/sqlite/schema/game.ts +66 -0
  189. package/src/store/sqlite/schema/plan-v2.ts +108 -0
  190. package/src/store/sqlite/schema/turns.ts +60 -0
  191. package/src/store/sqlite/schema.ts +13 -441
  192. package/src/store/turns/contract-compliance.test/_helpers.ts +38 -0
  193. package/src/store/turns/sqlite-store/admin.ts +249 -0
  194. package/src/store/turns/sqlite-store/ctx.ts +14 -0
  195. package/src/store/turns/sqlite-store/read.ts +174 -0
  196. package/src/store/turns/sqlite-store/rows.ts +55 -0
  197. package/src/store/turns/sqlite-store/write.ts +193 -0
  198. package/src/store/turns/sqlite-store.ts +33 -514
  199. package/src/vectorStore/class.ts +433 -0
  200. package/src/vectorStore/hash.ts +11 -0
  201. package/src/vectorStore/types.ts +58 -0
  202. package/src/vectorStore.test/_helpers.ts +20 -0
  203. package/src/vectorStore.ts +13 -489
  204. package/extensions/dashboard-client/dist/assets/ConfigTab-DG0WkuuG.js +0 -2
  205. package/extensions/dashboard-client/dist/assets/ConfigTab-DG0WkuuG.js.map +0 -1
  206. package/extensions/dashboard-client/dist/assets/MaintenanceTab-BQF7W7xX.js +0 -2
  207. package/extensions/dashboard-client/dist/assets/MaintenanceTab-BQF7W7xX.js.map +0 -1
  208. package/extensions/dashboard-client/dist/assets/MemoryMapTab-CPtHLv0A.js +0 -2
  209. package/extensions/dashboard-client/dist/assets/MemoryMapTab-CPtHLv0A.js.map +0 -1
  210. package/extensions/dashboard-client/dist/assets/SetupTab-hbzQ_NZv.js +0 -2
  211. package/extensions/dashboard-client/dist/assets/SetupTab-hbzQ_NZv.js.map +0 -1
  212. 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
+ }