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,226 @@
1
+ /**
2
+ * turns.ts — turn structural + turn-content node builders (extracted from
3
+ * sources.ts). Turns live in turns.db while raw_transcript lives in the main
4
+ * db — can't JOIN across databases, so these query separately and merge in JS.
5
+ */
6
+ import type { DatabaseSync } from "node:sqlite";
7
+ import type { MemoryGraphNode, MemoryGraphEdge } from "../../memoryGraph.js";
8
+ import { getOrComputeEmbedding, cosineSimilarity } from "../embedding.js";
9
+
10
+ export function buildTurnNodes(
11
+ db: DatabaseSync,
12
+ sessionId: string,
13
+ nodes: MemoryGraphNode[],
14
+ edges: MemoryGraphEdge[],
15
+ ): void {
16
+ const existingIds = new Set(nodes.map((n) => n.id));
17
+ const rows = sessionId
18
+ ? (db
19
+ .prepare(
20
+ `SELECT turn_index, session_id, role, pressure_band, ctx_tokens, ctx_percent,
21
+ epoch_id, ended_at
22
+ FROM turns
23
+ WHERE session_id = ?
24
+ ORDER BY turn_index ASC`,
25
+ )
26
+ .all(sessionId) as Array<Record<string, unknown>>)
27
+ : (db
28
+ .prepare(
29
+ `SELECT turn_index, session_id, role, pressure_band, ctx_tokens, ctx_percent,
30
+ epoch_id, ended_at
31
+ FROM turns
32
+ ORDER BY turn_index ASC`,
33
+ )
34
+ .all() as Array<Record<string, unknown>>);
35
+
36
+ if (rows.length === 0) return;
37
+
38
+ let prevId: string | null = null;
39
+ for (const row of rows) {
40
+ const ti = Number(row.turn_index);
41
+ const rowSessionId = sessionId || String(row.session_id ?? "");
42
+ const nodeId = `turn:${rowSessionId}:${ti}`;
43
+ if (existingIds.has(nodeId)) continue;
44
+ existingIds.add(nodeId);
45
+
46
+ const role = row.role ? String(row.role) : "unknown";
47
+ const endedAt = row.ended_at ? Number(row.ended_at) : Date.now();
48
+
49
+ const node: MemoryGraphNode = {
50
+ id: nodeId,
51
+ sessionId: rowSessionId,
52
+ label: `Turn ${ti}`,
53
+ summaryTruncated: `Turn ${ti}: ${role}${row.epoch_id ? ` (epoch: ${String(row.epoch_id)})` : ""}`,
54
+ tokenEstimate: row.ctx_tokens ? Number(row.ctx_tokens) : 0,
55
+ timestamp: endedAt,
56
+ dedupStatus: undefined,
57
+ raptorLevel: 0,
58
+ topicSummary: undefined,
59
+ decisionCount: 0,
60
+ textSnippet: `Turn ${ti}: ${role} — ${String(row.ctx_tokens ?? "?")} tokens`,
61
+ nodeType: "turn",
62
+ epochId: row.epoch_id ? String(row.epoch_id) : undefined,
63
+ };
64
+ nodes.push(node);
65
+
66
+ if (prevId !== null) {
67
+ edges.push({ source: prevId, target: nodeId, weight: 1.0, type: "temporal" });
68
+ }
69
+ prevId = nodeId;
70
+ }
71
+ }
72
+
73
+ export function buildTurnContentNodes(
74
+ turnDb: DatabaseSync,
75
+ mainDb: DatabaseSync,
76
+ sessionId: string,
77
+ nodes: MemoryGraphNode[],
78
+ edges: MemoryGraphEdge[],
79
+ ): void {
80
+ // Local dedup only — DON'T skip ids from Source A (turn-structural). Source A
81
+ // and Source B share the same node id (turn:<session>:<idx>); Gate 2
82
+ // (identity_merge) merges them with the richest nodeType winning. Using the
83
+ // global nodes array here would skip every node (Source A already added them).
84
+ const seen = new Set<string>();
85
+
86
+ const turnRows = sessionId
87
+ ? (turnDb
88
+ .prepare(
89
+ `SELECT turn_index, role, ended_at
90
+ FROM turns
91
+ WHERE session_id = ?
92
+ ORDER BY turn_index ASC`,
93
+ )
94
+ .all(sessionId) as Array<Record<string, unknown>>)
95
+ : (turnDb
96
+ .prepare(
97
+ `SELECT turn_index, role, ended_at
98
+ FROM turns
99
+ ORDER BY turn_index ASC`,
100
+ )
101
+ .all() as Array<Record<string, unknown>>);
102
+
103
+ // Build a map of (session_id, turn_index) → content from raw_transcript.
104
+ const contentMap = new Map<string, string>();
105
+ try {
106
+ const transcriptRows = sessionId
107
+ ? (mainDb
108
+ .prepare(
109
+ `SELECT turn_index, content_bytes FROM raw_transcript WHERE session_id = ?`,
110
+ )
111
+ .all(sessionId) as Array<Record<string, unknown>>)
112
+ : (mainDb
113
+ .prepare(
114
+ `SELECT turn_index, content_bytes FROM raw_transcript`,
115
+ )
116
+ .all() as Array<Record<string, unknown>>);
117
+ for (const r of transcriptRows) {
118
+ contentMap.set(String(r.turn_index), String(r.content_bytes ?? ""));
119
+ }
120
+ } catch {
121
+ // raw_transcript may not exist in the main db (dbMirror off) — return empty.
122
+ return;
123
+ }
124
+
125
+ // Merge: only produce nodes where both a turn row AND transcript content exist.
126
+ const rows = turnRows
127
+ .filter((t) => contentMap.has(String(t.turn_index)))
128
+ .map((t) => ({
129
+ turn_index: t.turn_index,
130
+ role: t.role,
131
+ ended_at: t.ended_at,
132
+ content_bytes: contentMap.get(String(t.turn_index)) ?? "",
133
+ }));
134
+
135
+ if (rows.length === 0) return;
136
+
137
+ const turnContentNodes: MemoryGraphNode[] = [];
138
+
139
+ for (const row of rows) {
140
+ const ti = Number(row.turn_index);
141
+ const nodeId = `turn:${sessionId}:${ti}`;
142
+ if (seen.has(nodeId)) continue;
143
+ seen.add(nodeId);
144
+
145
+ const contentBytes = row.content_bytes ? String(row.content_bytes) : "";
146
+ const snippet = contentBytes.length > 200 ? contentBytes.slice(0, 197) + "..." : contentBytes;
147
+
148
+ const node: MemoryGraphNode = {
149
+ id: nodeId,
150
+ sessionId,
151
+ label: `Turn ${ti}`,
152
+ summaryTruncated: snippet,
153
+ tokenEstimate: contentBytes.length,
154
+ timestamp: row.ended_at ? Number(row.ended_at) : Date.now(),
155
+ dedupStatus: undefined,
156
+ raptorLevel: 0,
157
+ topicSummary: undefined,
158
+ decisionCount: 0,
159
+ textSnippet: snippet,
160
+ nodeType: "turn-content",
161
+ epochId: undefined,
162
+ };
163
+ turnContentNodes.push(node);
164
+ }
165
+
166
+ if (turnContentNodes.length > 1) {
167
+ const embeddings = turnContentNodes.map((n) => {
168
+ try {
169
+ return { id: n.id, vec: getOrComputeEmbedding(mainDb, n.textSnippet) };
170
+ } catch {
171
+ return { id: n.id, vec: null as number[] | null };
172
+ }
173
+ });
174
+
175
+ for (let i = 0; i < embeddings.length; i++) {
176
+ if (!embeddings[i].vec) continue;
177
+ for (let j = i + 1; j < embeddings.length; j++) {
178
+ if (!embeddings[j].vec) continue;
179
+ const sim = cosineSimilarity(embeddings[i].vec!, embeddings[j].vec!);
180
+ if (sim > 0) {
181
+ edges.push({
182
+ source: embeddings[i].id,
183
+ target: embeddings[j].id,
184
+ weight: sim,
185
+ type: "semantic",
186
+ });
187
+ }
188
+ }
189
+ }
190
+
191
+ linkTurnToCheckpointEdges(mainDb, sessionId, turnContentNodes, edges);
192
+ }
193
+
194
+ nodes.push(...turnContentNodes);
195
+ }
196
+
197
+ function linkTurnToCheckpointEdges(
198
+ db: DatabaseSync,
199
+ sessionId: string,
200
+ turnNodes: MemoryGraphNode[],
201
+ edges: MemoryGraphEdge[],
202
+ ): void {
203
+ const checkpoints = db
204
+ .prepare(
205
+ `SELECT id, timestamp FROM context_chunks WHERE session_id = ? ORDER BY timestamp ASC`,
206
+ )
207
+ .all(sessionId) as Array<{ id: string; timestamp: number }>;
208
+
209
+ for (const tn of turnNodes) {
210
+ let bestCp: { id: string; diff: number } | null = null;
211
+ for (const cp of checkpoints) {
212
+ const diff = Math.abs(tn.timestamp - cp.timestamp);
213
+ if (bestCp === null || diff < bestCp.diff) {
214
+ bestCp = { id: cp.id, diff };
215
+ }
216
+ }
217
+ if (bestCp) {
218
+ edges.push({
219
+ source: tn.id,
220
+ target: bestCp.id,
221
+ weight: 1.0,
222
+ type: "temporal",
223
+ });
224
+ }
225
+ }
226
+ }