cognova 0.2.26 → 0.2.28

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 (200) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{CxNJcty6.js → -XfM4jpu.js} +1 -1
  3. package/.output/public/_nuxt/0L-9iIbm.js +1 -0
  4. package/.output/public/_nuxt/{RIAd5Wd1.js → 0mcDe5Hg.js} +1 -1
  5. package/.output/public/_nuxt/{DLfV22bF.js → 4Nlt-3Ix.js} +1 -1
  6. package/.output/public/_nuxt/{C_hl3kCw.js → 5FVMuLeh.js} +1 -1
  7. package/.output/public/_nuxt/{C4Ii8cYC.js → 5qkiDtwf.js} +1 -1
  8. package/.output/public/_nuxt/{n_Arasow.js → 6_fEEpaq.js} +1 -1
  9. package/.output/public/_nuxt/{BZjMzGZM.js → 944smzho.js} +1 -1
  10. package/.output/public/_nuxt/{C-tfM08H.js → B03oRqJe.js} +1 -1
  11. package/.output/public/_nuxt/{CGgHmnnS.js → B06CcGVK.js} +3 -3
  12. package/.output/public/_nuxt/{FmfogFAR.js → B0UpgYEt.js} +1 -1
  13. package/.output/public/_nuxt/{CcJ0pNID.js → B0YLhHra.js} +1 -1
  14. package/.output/public/_nuxt/B0v0agy0.js +1 -0
  15. package/.output/public/_nuxt/{DmGbOc_e.js → B1A26hhf.js} +1 -1
  16. package/.output/public/_nuxt/{B38X0n2w.js → B592hx40.js} +1 -1
  17. package/.output/public/_nuxt/B5l6QVGz.js +1 -0
  18. package/.output/public/_nuxt/{BD07a6OS.js → B6BF2w8r.js} +3 -3
  19. package/.output/public/_nuxt/{rY0W1r76.js → B6m5ExpJ.js} +2 -2
  20. package/.output/public/_nuxt/{iTZxBLAr.js → B91qlTSF.js} +3 -3
  21. package/.output/public/_nuxt/B9sXHKws.js +1 -0
  22. package/.output/public/_nuxt/{eB60bVen.js → BAh-k-y8.js} +1 -1
  23. package/.output/public/_nuxt/{wSCSxjgr.js → BDQ6hxO7.js} +1 -1
  24. package/.output/public/_nuxt/{DEmzTuCa.js → BGytjslk.js} +1 -1
  25. package/.output/public/_nuxt/{CZQeFnOf.js → BIoHE1oQ.js} +1 -1
  26. package/.output/public/_nuxt/{BHcVB9Fo.js → BNXyokAF.js} +1 -1
  27. package/.output/public/_nuxt/{Irw5CrIe.js → BNxg8OvE.js} +1 -1
  28. package/.output/public/_nuxt/{C1wI_STa.js → BPBLcBHM.js} +2 -2
  29. package/.output/public/_nuxt/{BGV4_re9.js → BQeDYnyj.js} +1 -1
  30. package/.output/public/_nuxt/{pJF5jz72.js → BUfJTKJk.js} +1 -1
  31. package/.output/public/_nuxt/{B27NM422.js → BVJkcOi4.js} +1 -1
  32. package/.output/public/_nuxt/{B8fLdQfp.js → BVNZYpXH.js} +1 -1
  33. package/.output/public/_nuxt/{Dc_VwXJs.js → BZ3u3Znq.js} +1 -1
  34. package/.output/public/_nuxt/{CjkXqgrT.js → B_V_KZmg.js} +1 -1
  35. package/.output/public/_nuxt/{DB0uzc_1.js → BaTcZylh.js} +1 -1
  36. package/.output/public/_nuxt/{zvDhkxQS.js → BbdFZa4U.js} +1 -1
  37. package/.output/public/_nuxt/{DmHn_Ae8.js → BeAxkmtt.js} +1 -1
  38. package/.output/public/_nuxt/{CruI_TS3.js → BfiU8B4M.js} +1 -1
  39. package/.output/public/_nuxt/{DuH9QzIG.js → BhOf69HZ.js} +1 -1
  40. package/.output/public/_nuxt/{lfg-J79K.js → BlKgmZLh.js} +1 -1
  41. package/.output/public/_nuxt/{Cfce_cVw.js → BlplwzgB.js} +1 -1
  42. package/.output/public/_nuxt/{D5IKvGig.js → BnmZcuhY.js} +1 -1
  43. package/.output/public/_nuxt/{DfAWgXhg.js → BpExBTyC.js} +1 -1
  44. package/.output/public/_nuxt/{DIMnGgEU.js → BuURpKT4.js} +1 -1
  45. package/.output/public/_nuxt/{B5oEzB-M.js → Bvqgc_wA.js} +1 -1
  46. package/.output/public/_nuxt/{Dfi2mj_-.js → C0FuVjdX.js} +1 -1
  47. package/.output/public/_nuxt/{QNqSZCYh.js → C1RFLzd_.js} +1 -1
  48. package/.output/public/_nuxt/{DMCE1Up6.js → C4MrxKnP.js} +1 -1
  49. package/.output/public/_nuxt/{D5AjrkGO.js → C4ui9LWq.js} +1 -1
  50. package/.output/public/_nuxt/{iVfmia7K.js → C7RIYfkH.js} +1 -1
  51. package/.output/public/_nuxt/{D4wS6gzr.js → C7hn68Tp.js} +1 -1
  52. package/.output/public/_nuxt/{BHAaeL5L.js → C8gC5cUj.js} +1 -1
  53. package/.output/public/_nuxt/{CBJQYyqD.js → CAJH0xMY.js} +1 -1
  54. package/.output/public/_nuxt/{Bk_mzzQ3.js → CBpuaar1.js} +1 -1
  55. package/.output/public/_nuxt/{m9zGH_2s.js → CDP4J5em.js} +1 -1
  56. package/.output/public/_nuxt/{NNQizITf.js → CGTQGJ_c.js} +1 -1
  57. package/.output/public/_nuxt/{Ehiy7Wkv.js → CHd8mdNy.js} +1 -1
  58. package/.output/public/_nuxt/{BtVAOj3K.js → CHn6tbtE.js} +1 -1
  59. package/.output/public/_nuxt/{B1ea1Zc2.js → CKfAI3Hb.js} +1 -1
  60. package/.output/public/_nuxt/{CbLvLXmb.js → CLm_rHHY.js} +1 -1
  61. package/.output/public/_nuxt/{DFPu4h4a.js → CLzxl_Kg.js} +1 -1
  62. package/.output/public/_nuxt/{C3dJrgZH.js → CNVj60PG.js} +1 -1
  63. package/.output/public/_nuxt/{VRRYjCaC.js → CNi_mvQS.js} +1 -1
  64. package/.output/public/_nuxt/{46eRQaVv.js → COMJZX17.js} +1 -1
  65. package/.output/public/_nuxt/{Brmj91Ns.js → CQcJNYmv.js} +1 -1
  66. package/.output/public/_nuxt/{BMTKvzsm.js → CT8T1FW9.js} +1 -1
  67. package/.output/public/_nuxt/{B02JOKtW.js → CTJDAjdO.js} +1 -1
  68. package/.output/public/_nuxt/{w3RSHXA6.js → CTXxmwx3.js} +1 -1
  69. package/.output/public/_nuxt/{CIMG8oEU.js → CV92g0qz.js} +1 -1
  70. package/.output/public/_nuxt/{DEBOaUgW.js → CVwzer_Y.js} +1 -1
  71. package/.output/public/_nuxt/{6k0gxaWW.js → CXRkSVkD.js} +1 -1
  72. package/.output/public/_nuxt/{C7Wu2u5C.js → CamCmKfq.js} +1 -1
  73. package/.output/public/_nuxt/{DM9s28TO.js → CaohnGAD.js} +1 -1
  74. package/.output/public/_nuxt/{BqyI8nU4.js → Cg8k3_b4.js} +1 -1
  75. package/.output/public/_nuxt/{rVZcJ6Pz.js → CiQJYbKL.js} +1 -1
  76. package/.output/public/_nuxt/{Co86ycpI.js → Cjj-eCEV.js} +1 -1
  77. package/.output/public/_nuxt/{B3TXSB_R.js → CkfP4uja.js} +1 -1
  78. package/.output/public/_nuxt/{81-iumfM.js → CoUQ3qpL.js} +1 -1
  79. package/.output/public/_nuxt/{CPb6IrVT.js → CopZwjN8.js} +1 -1
  80. package/.output/public/_nuxt/{FGRiZ9J1.js → Cpyrc9BG.js} +1 -1
  81. package/.output/public/_nuxt/{6DKJrPTD.js → CtLfbSRS.js} +1 -1
  82. package/.output/public/_nuxt/{CVTUqEcr.js → CtyKXJ-J.js} +1 -1
  83. package/.output/public/_nuxt/{By5L5Smf.js → CvaD7s2l.js} +1 -1
  84. package/.output/public/_nuxt/{QmdcFt0E.js → Cw2TcJMF.js} +1 -1
  85. package/.output/public/_nuxt/{ByXbV9Xa.js → Cwel2ykQ.js} +1 -1
  86. package/.output/public/_nuxt/{CLmiWiqr.js → CyZlzytZ.js} +1 -1
  87. package/.output/public/_nuxt/{DXAD_aZW.js → Cygjd4rF.js} +1 -1
  88. package/.output/public/_nuxt/{DoSrePUc.js → CzxGRepV.js} +1 -1
  89. package/.output/public/_nuxt/{Dkpxacka.js → D0fJg-Y2.js} +1 -1
  90. package/.output/public/_nuxt/{BW-7wimi.js → D12yGpMq.js} +1 -1
  91. package/.output/public/_nuxt/{uCsI7fpg.js → D7Bxfxio.js} +1 -1
  92. package/.output/public/_nuxt/{D_1GDAlv.js → DEl5RR7R.js} +1 -1
  93. package/.output/public/_nuxt/{3hFj0Mf_.js → DFVXHy0C.js} +1 -1
  94. package/.output/public/_nuxt/{7msxmF5v.js → DFW8HOVB.js} +1 -1
  95. package/.output/public/_nuxt/{CD6r4z4e.js → DH2yWNbZ.js} +1 -1
  96. package/.output/public/_nuxt/{AMPsjNHJ.js → DIDjR8Ry.js} +1 -1
  97. package/.output/public/_nuxt/{B8na0pik.js → DKHJBr2m.js} +1 -1
  98. package/.output/public/_nuxt/{CDKJK4wW.js → DKd2_wBj.js} +1 -1
  99. package/.output/public/_nuxt/{CD_jDSWh.js → DKrd1pCW.js} +1 -1
  100. package/.output/public/_nuxt/{gTGPvkTX.js → DOcEwtqN.js} +1 -1
  101. package/.output/public/_nuxt/{B0_Iu2zi.js → DSQ9bpNJ.js} +1 -1
  102. package/.output/public/_nuxt/{BigIAhcT.js → DWG9jKCo.js} +1 -1
  103. package/.output/public/_nuxt/{Cj3gDP-y.js → DY78sr_b.js} +1 -1
  104. package/.output/public/_nuxt/{Cwdn7ZtG.js → DZQxxfue.js} +1 -1
  105. package/.output/public/_nuxt/{DN5cHXGS.js → DZpgj5sA.js} +1 -1
  106. package/.output/public/_nuxt/{CZ5B974o.js → Dc8vLBQN.js} +1 -1
  107. package/.output/public/_nuxt/{9vdFTPZC.js → DcT64MxD.js} +1 -1
  108. package/.output/public/_nuxt/{BwLYFg9w.js → DdmLHNRP.js} +1 -1
  109. package/.output/public/_nuxt/{Bn175bDC.js → Dg19_qAK.js} +1 -1
  110. package/.output/public/_nuxt/{BTImkTzA.js → DhIZvLeI.js} +1 -1
  111. package/.output/public/_nuxt/{DOTIy97K.js → DjaEQQhf.js} +1 -1
  112. package/.output/public/_nuxt/{CJLlvuDm.js → DkUMlRf8.js} +1 -1
  113. package/.output/public/_nuxt/{BTs0cu3F.js → DkjKiJOq.js} +1 -1
  114. package/.output/public/_nuxt/{CIDjuJ7I.js → DlR5hUi3.js} +1 -1
  115. package/.output/public/_nuxt/{P3qGksT8.js → DnfG5RzJ.js} +1 -1
  116. package/.output/public/_nuxt/{DOs_ozN6.js → DohhIeRk.js} +1 -1
  117. package/.output/public/_nuxt/{lA6pb86B.js → Dom1vIen.js} +1 -1
  118. package/.output/public/_nuxt/{BGa5KqPj.js → Ds97nj0P.js} +1 -1
  119. package/.output/public/_nuxt/{v-LIF5tR.js → DxT3YmAC.js} +1 -1
  120. package/.output/public/_nuxt/{UQIfAAmf.js → DxcN7Uv7.js} +1 -1
  121. package/.output/public/_nuxt/{qI8JV5dU.js → DxcbYcrE.js} +1 -1
  122. package/.output/public/_nuxt/{DfP6jcEM.js → DyVUuE07.js} +1 -1
  123. package/.output/public/_nuxt/{DoGLYOlq.js → Dz-vwDzE.js} +1 -1
  124. package/.output/public/_nuxt/{CrHLmWKE.js → EeCE4NvG.js} +1 -1
  125. package/.output/public/_nuxt/{BVkPh7-9.js → EnGykH_X.js} +1 -1
  126. package/.output/public/_nuxt/{By6urPVf.js → GJMyZaby.js} +1 -1
  127. package/.output/public/_nuxt/{mLs_Q7_U.js → I7OHJVxg.js} +1 -1
  128. package/.output/public/_nuxt/{bHsFNLQP.js → K0RZW9fp.js} +1 -1
  129. package/.output/public/_nuxt/{CSyssKl8.js → K1o4brLx.js} +1 -1
  130. package/.output/public/_nuxt/{CZvTOsiz.js → OKVQJ7yj.js} +1 -1
  131. package/.output/public/_nuxt/{3AgfIirx.js → Q3QJAuZ2.js} +1 -1
  132. package/.output/public/_nuxt/{D57E8FC4.js → Tirj2rC0.js} +1 -1
  133. package/.output/public/_nuxt/{BVcLiEDk.js → VcsszHDj.js} +1 -1
  134. package/.output/public/_nuxt/WG3LXN-9.js +1 -0
  135. package/.output/public/_nuxt/{CCmSsj4q.js → aUYaYlYl.js} +1 -1
  136. package/.output/public/_nuxt/builds/latest.json +1 -1
  137. package/.output/public/_nuxt/builds/meta/7de5e0df-2e0a-435c-a2e3-fc2312beb6ad.json +1 -0
  138. package/.output/public/_nuxt/{swgNRlWy.js → cGEbEAGz.js} +1 -1
  139. package/.output/public/_nuxt/{BaHB7JKe.js → ds0WOZHj.js} +1 -1
  140. package/.output/public/_nuxt/{IIvTjJqa.js → e4zQkzJm.js} +1 -1
  141. package/.output/public/_nuxt/{D45gWhSU.js → eFu2sWbl.js} +1 -1
  142. package/.output/public/_nuxt/entry.B0qcqYYu.css +1 -0
  143. package/.output/public/_nuxt/{ChIzYvpz.js → ggWK6BEa.js} +1 -1
  144. package/.output/public/_nuxt/{pFPRVtL-.js → hkCaWCzP.js} +1 -1
  145. package/.output/public/_nuxt/{BW0bq0Nu.js → jF9FNyOl.js} +1 -1
  146. package/.output/public/_nuxt/{CjVBL0o-.js → jenjyHml.js} +1 -1
  147. package/.output/public/_nuxt/{CtNN2F57.js → kMwuhvCf.js} +1 -1
  148. package/.output/public/_nuxt/{1_nO5SO6.js → oWO88tvt.js} +1 -1
  149. package/.output/public/_nuxt/{d85YwuyC.js → olSL1K5t.js} +1 -1
  150. package/.output/public/_nuxt/{DwEfItxe.js → ptAR8AWT.js} +1 -1
  151. package/.output/public/_nuxt/{Dbv2gAYq.js → rTscsMvH.js} +1 -1
  152. package/.output/public/_nuxt/{Bxs6RCfp.js → xooRr3tW.js} +1 -1
  153. package/.output/public/_nuxt/{n5X4vNX9.js → zApTn6EM.js} +2 -2
  154. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  155. package/.output/server/chunks/build/{memories-BqA719O1.mjs → memories-DLa6uEfV.mjs} +2 -31
  156. package/.output/server/chunks/build/memories-DLa6uEfV.mjs.map +1 -0
  157. package/.output/server/chunks/build/server.mjs +1 -1
  158. package/.output/server/chunks/nitro/nitro.mjs +944 -922
  159. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  160. package/.output/server/chunks/routes/{terminal.mjs → _ws/terminal.mjs} +39 -28
  161. package/.output/server/chunks/routes/_ws/terminal.mjs.map +1 -0
  162. package/.output/server/chunks/routes/api/memory/context.get.mjs +13 -9
  163. package/.output/server/chunks/routes/api/memory/context.get.mjs.map +1 -1
  164. package/.output/server/chunks/routes/api/memory/extract.post.mjs +4 -7
  165. package/.output/server/chunks/routes/api/memory/extract.post.mjs.map +1 -1
  166. package/.output/server/chunks/routes/api/memory/search.get.mjs +22 -25
  167. package/.output/server/chunks/routes/api/memory/search.get.mjs.map +1 -1
  168. package/.output/server/chunks/routes/api/memory/store.post.mjs +1 -3
  169. package/.output/server/chunks/routes/api/memory/store.post.mjs.map +1 -1
  170. package/.output/server/chunks/routes/notifications.mjs +1 -1
  171. package/.output/server/package.json +1 -1
  172. package/Claude/skills/memory/memory.py +1 -7
  173. package/app/composables/useTerminal.ts +1 -1
  174. package/app/pages/memories.vue +0 -15
  175. package/dist/cli/index.js +1 -0
  176. package/package.json +1 -1
  177. package/server/api/memory/context.get.ts +19 -15
  178. package/server/api/memory/extract.post.ts +1 -2
  179. package/server/api/memory/search.get.ts +29 -34
  180. package/server/api/memory/store.post.ts +1 -2
  181. package/server/bridge/responder.ts +10 -5
  182. package/server/db/schema.ts +1 -2
  183. package/server/drizzle/migrations/0017_unusual_landau.sql +1 -0
  184. package/server/drizzle/migrations/meta/0017_snapshot.json +1965 -0
  185. package/server/drizzle/migrations/meta/_journal.json +7 -0
  186. package/server/routes/_ws/terminal.ts +111 -0
  187. package/server/services/memory-extractor.ts +3 -6
  188. package/server/utils/document-sync.ts +27 -20
  189. package/server/utils/pty-manager.ts +12 -3
  190. package/shared/types/index.ts +1 -4
  191. package/.output/public/_nuxt/BhtKu4xV.js +0 -1
  192. package/.output/public/_nuxt/CNB4wNeh.js +0 -1
  193. package/.output/public/_nuxt/CnB-ybCZ.js +0 -1
  194. package/.output/public/_nuxt/DAjV9Cip.js +0 -1
  195. package/.output/public/_nuxt/Suor9Vto.js +0 -1
  196. package/.output/public/_nuxt/builds/meta/d37c41da-8cec-4479-a3ac-3097aa4fb2e0.json +0 -1
  197. package/.output/public/_nuxt/entry.ZJxWCrU6.css +0 -1
  198. package/.output/server/chunks/build/memories-BqA719O1.mjs.map +0 -1
  199. package/.output/server/chunks/routes/terminal.mjs.map +0 -1
  200. package/server/routes/terminal.ts +0 -98
@@ -1,5 +1,5 @@
1
- import { sql, desc, eq, and, gte, inArray } from 'drizzle-orm'
2
- import { getDb, schema } from '~~/server/db'
1
+ import { sql } from 'drizzle-orm'
2
+ import { getDb } from '~~/server/db'
3
3
  import { requireDb } from '~~/server/utils/db-guard'
4
4
  import type { MemoryChunk, MemoryChunkType } from '~~/shared/types'
5
5
 
@@ -12,48 +12,43 @@ export default defineEventHandler(async (event) => {
12
12
  const searchQuery = query.query as string | undefined
13
13
  const projectPath = query.projectPath as string | undefined
14
14
  const chunkType = query.chunkType as MemoryChunkType | undefined
15
- const minRelevance = query.minRelevance ? parseFloat(query.minRelevance as string) : undefined
16
15
  const limit = Math.min(parseInt(query.limit as string) || 20, 100)
17
16
 
18
- const conditions = []
17
+ // Build WHERE conditions
18
+ const conditions: ReturnType<typeof sql>[] = []
19
19
 
20
- // Project filter
21
20
  if (projectPath)
22
- conditions.push(eq(schema.memoryChunks.projectPath, projectPath))
21
+ conditions.push(sql`project_path = ${projectPath}`)
23
22
 
24
- // Type filter
25
23
  if (chunkType)
26
- conditions.push(eq(schema.memoryChunks.chunkType, chunkType))
24
+ conditions.push(sql`chunk_type = ${chunkType}`)
27
25
 
28
- // Relevance filter
29
- if (minRelevance !== undefined)
30
- conditions.push(gte(schema.memoryChunks.relevanceScore, minRelevance))
26
+ if (searchQuery)
27
+ conditions.push(sql`search_vector @@ plainto_tsquery('english', ${searchQuery})`)
31
28
 
32
- // Full-text search via tsvector + GIN index
33
- if (searchQuery) {
34
- const ftsResult = await db.execute<{ id: string }>(sql`
35
- SELECT id FROM memory_chunks
36
- WHERE search_vector @@ plainto_tsquery('english', ${searchQuery})
37
- ORDER BY ts_rank(search_vector, plainto_tsquery('english', ${searchQuery})) DESC
38
- LIMIT ${limit}
39
- `)
40
- const ids = ftsResult.map(r => r.id)
41
- if (ids.length === 0) return { data: [] as MemoryChunk[] }
42
- conditions.push(inArray(schema.memoryChunks.id, ids))
43
- }
44
-
45
- let dbQuery = db.select()
46
- .from(schema.memoryChunks)
29
+ const whereClause = conditions.length > 0
30
+ ? sql`WHERE ${sql.join(conditions, sql` AND `)}`
31
+ : sql``
47
32
 
48
- if (conditions.length > 0)
49
- dbQuery = dbQuery.where(and(...conditions)) as typeof dbQuery
33
+ // Computed score: FTS rank (if searching) * access boost * recency decay
34
+ const scoreExpr = searchQuery
35
+ ? sql`
36
+ ts_rank(search_vector, plainto_tsquery('english', ${searchQuery}))
37
+ * (1.0 + LN(1 + access_count))
38
+ * (1.0 / (1.0 + EXTRACT(EPOCH FROM NOW() - COALESCE(last_accessed_at, created_at)) / 2592000))
39
+ `
40
+ : sql`
41
+ (1.0 + LN(1 + access_count))
42
+ * (1.0 / (1.0 + EXTRACT(EPOCH FROM NOW() - COALESCE(last_accessed_at, created_at)) / 2592000))
43
+ `
50
44
 
51
- const memories = await dbQuery
52
- .orderBy(
53
- desc(schema.memoryChunks.relevanceScore),
54
- desc(schema.memoryChunks.createdAt)
55
- )
56
- .limit(limit)
45
+ const memories = await db.execute<MemoryChunk>(sql`
46
+ SELECT *, ${scoreExpr} AS score
47
+ FROM memory_chunks
48
+ ${whereClause}
49
+ ORDER BY score DESC
50
+ LIMIT ${limit}
51
+ `)
57
52
 
58
53
  // Update access count and timestamp for retrieved memories
59
54
  if (memories.length > 0) {
@@ -21,8 +21,7 @@ export default defineEventHandler(async (event) => {
21
21
  projectPath: body.projectPath,
22
22
  chunkType: body.chunkType,
23
23
  content: body.content,
24
- sourceExcerpt: body.sourceExcerpt,
25
- relevanceScore: body.relevanceScore ?? 1.0
24
+ sourceExcerpt: body.sourceExcerpt
26
25
  })
27
26
  .returning()
28
27
 
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from 'crypto'
2
2
  import { query } from '@anthropic-ai/claude-agent-sdk'
3
- import { desc, eq } from 'drizzle-orm'
3
+ import { eq, sql } from 'drizzle-orm'
4
4
  import { getDb, schema } from '~~/server/db'
5
5
  import { logTokenUsage } from '~~/server/utils/log-token-usage'
6
6
  import { sdkEnv } from '~~/server/utils/sdk-env'
@@ -44,10 +44,15 @@ async function getOrCreateMainChat() {
44
44
  async function loadMemoryContext(): Promise<string> {
45
45
  try {
46
46
  const db = getDb()
47
- const memories = await db.select()
48
- .from(schema.memoryChunks)
49
- .orderBy(desc(schema.memoryChunks.relevanceScore), desc(schema.memoryChunks.createdAt))
50
- .limit(10)
47
+ const memories = await db.execute<{ content: string }>(sql`
48
+ SELECT content,
49
+ (1.0 + LN(1 + access_count))
50
+ * (1.0 / (1.0 + EXTRACT(EPOCH FROM NOW() - COALESCE(last_accessed_at, created_at)) / 2592000))
51
+ AS score
52
+ FROM memory_chunks
53
+ ORDER BY score DESC
54
+ LIMIT 10
55
+ `)
51
56
 
52
57
  if (memories.length === 0) return ''
53
58
 
@@ -333,8 +333,7 @@ export const memoryChunks = pgTable('memory_chunks', {
333
333
  content: text('content').notNull(), // The extracted memory (concise)
334
334
  sourceExcerpt: text('source_excerpt'), // Original context (truncated for reference)
335
335
 
336
- // Relevance & lifecycle (Mem0-inspired)
337
- relevanceScore: real('relevance_score').default(1.0).notNull(), // 0-1, decays over time
336
+ // Usage tracking (relevance is computed at query time from access + recency)
338
337
  accessCount: integer('access_count').default(0).notNull(), // How often retrieved
339
338
  lastAccessedAt: timestamp('last_accessed_at', { withTimezone: true }),
340
339
 
@@ -0,0 +1 @@
1
+ ALTER TABLE "memory_chunks" DROP COLUMN "relevance_score";