gitmem-mcp 0.2.0

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 (316) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/CLAUDE.md.template +65 -0
  3. package/LICENSE +21 -0
  4. package/README.md +221 -0
  5. package/bin/gitmem.js +383 -0
  6. package/dist/commands/check.d.ts +33 -0
  7. package/dist/commands/check.d.ts.map +1 -0
  8. package/dist/commands/check.js +492 -0
  9. package/dist/commands/check.js.map +1 -0
  10. package/dist/constants/closing-questions.d.ts +40 -0
  11. package/dist/constants/closing-questions.d.ts.map +1 -0
  12. package/dist/constants/closing-questions.js +107 -0
  13. package/dist/constants/closing-questions.js.map +1 -0
  14. package/dist/diagnostics/anonymizer.d.ts +55 -0
  15. package/dist/diagnostics/anonymizer.d.ts.map +1 -0
  16. package/dist/diagnostics/anonymizer.js +191 -0
  17. package/dist/diagnostics/anonymizer.js.map +1 -0
  18. package/dist/diagnostics/channels.d.ts +132 -0
  19. package/dist/diagnostics/channels.d.ts.map +1 -0
  20. package/dist/diagnostics/channels.js +150 -0
  21. package/dist/diagnostics/channels.js.map +1 -0
  22. package/dist/diagnostics/collector.d.ts +183 -0
  23. package/dist/diagnostics/collector.d.ts.map +1 -0
  24. package/dist/diagnostics/collector.js +227 -0
  25. package/dist/diagnostics/collector.js.map +1 -0
  26. package/dist/diagnostics/index.d.ts +28 -0
  27. package/dist/diagnostics/index.d.ts.map +1 -0
  28. package/dist/diagnostics/index.js +31 -0
  29. package/dist/diagnostics/index.js.map +1 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +18 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/schemas/absorb-observations.d.ts +63 -0
  35. package/dist/schemas/absorb-observations.d.ts.map +1 -0
  36. package/dist/schemas/absorb-observations.js +25 -0
  37. package/dist/schemas/absorb-observations.js.map +1 -0
  38. package/dist/schemas/active-sessions.d.ts +71 -0
  39. package/dist/schemas/active-sessions.d.ts.map +1 -0
  40. package/dist/schemas/active-sessions.js +19 -0
  41. package/dist/schemas/active-sessions.js.map +1 -0
  42. package/dist/schemas/analyze.d.ts +38 -0
  43. package/dist/schemas/analyze.d.ts.map +1 -0
  44. package/dist/schemas/analyze.js +30 -0
  45. package/dist/schemas/analyze.js.map +1 -0
  46. package/dist/schemas/common.d.ts +55 -0
  47. package/dist/schemas/common.d.ts.map +1 -0
  48. package/dist/schemas/common.js +65 -0
  49. package/dist/schemas/common.js.map +1 -0
  50. package/dist/schemas/create-decision.d.ts +48 -0
  51. package/dist/schemas/create-decision.d.ts.map +1 -0
  52. package/dist/schemas/create-decision.js +31 -0
  53. package/dist/schemas/create-decision.js.map +1 -0
  54. package/dist/schemas/create-learning.d.ts +107 -0
  55. package/dist/schemas/create-learning.d.ts.map +1 -0
  56. package/dist/schemas/create-learning.js +64 -0
  57. package/dist/schemas/create-learning.js.map +1 -0
  58. package/dist/schemas/get-transcript.d.ts +24 -0
  59. package/dist/schemas/get-transcript.d.ts.map +1 -0
  60. package/dist/schemas/get-transcript.js +22 -0
  61. package/dist/schemas/get-transcript.js.map +1 -0
  62. package/dist/schemas/index.d.ts +23 -0
  63. package/dist/schemas/index.d.ts.map +1 -0
  64. package/dist/schemas/index.js +23 -0
  65. package/dist/schemas/index.js.map +1 -0
  66. package/dist/schemas/log.d.ts +36 -0
  67. package/dist/schemas/log.d.ts.map +1 -0
  68. package/dist/schemas/log.js +27 -0
  69. package/dist/schemas/log.js.map +1 -0
  70. package/dist/schemas/prepare-context.d.ts +41 -0
  71. package/dist/schemas/prepare-context.d.ts.map +1 -0
  72. package/dist/schemas/prepare-context.js +31 -0
  73. package/dist/schemas/prepare-context.js.map +1 -0
  74. package/dist/schemas/recall.d.ts +41 -0
  75. package/dist/schemas/recall.d.ts.map +1 -0
  76. package/dist/schemas/recall.js +47 -0
  77. package/dist/schemas/recall.js.map +1 -0
  78. package/dist/schemas/record-scar-usage-batch.d.ts +82 -0
  79. package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -0
  80. package/dist/schemas/record-scar-usage-batch.js +25 -0
  81. package/dist/schemas/record-scar-usage-batch.js.map +1 -0
  82. package/dist/schemas/record-scar-usage.d.ts +51 -0
  83. package/dist/schemas/record-scar-usage.d.ts.map +1 -0
  84. package/dist/schemas/record-scar-usage.js +32 -0
  85. package/dist/schemas/record-scar-usage.js.map +1 -0
  86. package/dist/schemas/save-transcript.d.ts +38 -0
  87. package/dist/schemas/save-transcript.d.ts.map +1 -0
  88. package/dist/schemas/save-transcript.js +30 -0
  89. package/dist/schemas/save-transcript.js.map +1 -0
  90. package/dist/schemas/search.d.ts +36 -0
  91. package/dist/schemas/search.d.ts.map +1 -0
  92. package/dist/schemas/search.js +27 -0
  93. package/dist/schemas/search.js.map +1 -0
  94. package/dist/schemas/session-close.d.ts +371 -0
  95. package/dist/schemas/session-close.d.ts.map +1 -0
  96. package/dist/schemas/session-close.js +95 -0
  97. package/dist/schemas/session-close.js.map +1 -0
  98. package/dist/schemas/session-start.d.ts +46 -0
  99. package/dist/schemas/session-start.d.ts.map +1 -0
  100. package/dist/schemas/session-start.js +33 -0
  101. package/dist/schemas/session-start.js.map +1 -0
  102. package/dist/schemas/thread.d.ts +72 -0
  103. package/dist/schemas/thread.d.ts.map +1 -0
  104. package/dist/schemas/thread.js +39 -0
  105. package/dist/schemas/thread.js.map +1 -0
  106. package/dist/server.d.ts +22 -0
  107. package/dist/server.d.ts.map +1 -0
  108. package/dist/server.js +313 -0
  109. package/dist/server.js.map +1 -0
  110. package/dist/services/active-sessions.d.ts +66 -0
  111. package/dist/services/active-sessions.d.ts.map +1 -0
  112. package/dist/services/active-sessions.js +311 -0
  113. package/dist/services/active-sessions.js.map +1 -0
  114. package/dist/services/agent-detection.d.ts +25 -0
  115. package/dist/services/agent-detection.d.ts.map +1 -0
  116. package/dist/services/agent-detection.js +93 -0
  117. package/dist/services/agent-detection.js.map +1 -0
  118. package/dist/services/analytics.d.ts +201 -0
  119. package/dist/services/analytics.d.ts.map +1 -0
  120. package/dist/services/analytics.js +483 -0
  121. package/dist/services/analytics.js.map +1 -0
  122. package/dist/services/cache.d.ts +148 -0
  123. package/dist/services/cache.d.ts.map +1 -0
  124. package/dist/services/cache.js +384 -0
  125. package/dist/services/cache.js.map +1 -0
  126. package/dist/services/cache.test.d.ts +8 -0
  127. package/dist/services/cache.test.d.ts.map +1 -0
  128. package/dist/services/cache.test.js +267 -0
  129. package/dist/services/cache.test.js.map +1 -0
  130. package/dist/services/compliance-validator.d.ts +30 -0
  131. package/dist/services/compliance-validator.d.ts.map +1 -0
  132. package/dist/services/compliance-validator.js +257 -0
  133. package/dist/services/compliance-validator.js.map +1 -0
  134. package/dist/services/config.d.ts +48 -0
  135. package/dist/services/config.d.ts.map +1 -0
  136. package/dist/services/config.js +128 -0
  137. package/dist/services/config.js.map +1 -0
  138. package/dist/services/embedding.d.ts +58 -0
  139. package/dist/services/embedding.d.ts.map +1 -0
  140. package/dist/services/embedding.js +243 -0
  141. package/dist/services/embedding.js.map +1 -0
  142. package/dist/services/gitmem-dir.d.ts +38 -0
  143. package/dist/services/gitmem-dir.d.ts.map +1 -0
  144. package/dist/services/gitmem-dir.js +84 -0
  145. package/dist/services/gitmem-dir.js.map +1 -0
  146. package/dist/services/local-file-storage.d.ts +56 -0
  147. package/dist/services/local-file-storage.d.ts.map +1 -0
  148. package/dist/services/local-file-storage.js +213 -0
  149. package/dist/services/local-file-storage.js.map +1 -0
  150. package/dist/services/local-vector-search.d.ts +137 -0
  151. package/dist/services/local-vector-search.d.ts.map +1 -0
  152. package/dist/services/local-vector-search.js +311 -0
  153. package/dist/services/local-vector-search.js.map +1 -0
  154. package/dist/services/metrics.d.ts +104 -0
  155. package/dist/services/metrics.d.ts.map +1 -0
  156. package/dist/services/metrics.js +264 -0
  157. package/dist/services/metrics.js.map +1 -0
  158. package/dist/services/session-state.d.ts +113 -0
  159. package/dist/services/session-state.d.ts.map +1 -0
  160. package/dist/services/session-state.js +203 -0
  161. package/dist/services/session-state.js.map +1 -0
  162. package/dist/services/startup.d.ts +112 -0
  163. package/dist/services/startup.d.ts.map +1 -0
  164. package/dist/services/startup.js +436 -0
  165. package/dist/services/startup.js.map +1 -0
  166. package/dist/services/storage.d.ts +43 -0
  167. package/dist/services/storage.d.ts.map +1 -0
  168. package/dist/services/storage.js +92 -0
  169. package/dist/services/storage.js.map +1 -0
  170. package/dist/services/supabase-client.d.ts +163 -0
  171. package/dist/services/supabase-client.d.ts.map +1 -0
  172. package/dist/services/supabase-client.js +510 -0
  173. package/dist/services/supabase-client.js.map +1 -0
  174. package/dist/services/thread-dedup.d.ts +44 -0
  175. package/dist/services/thread-dedup.d.ts.map +1 -0
  176. package/dist/services/thread-dedup.js +113 -0
  177. package/dist/services/thread-dedup.js.map +1 -0
  178. package/dist/services/thread-manager.d.ts +77 -0
  179. package/dist/services/thread-manager.d.ts.map +1 -0
  180. package/dist/services/thread-manager.js +250 -0
  181. package/dist/services/thread-manager.js.map +1 -0
  182. package/dist/services/thread-suggestions.d.ts +66 -0
  183. package/dist/services/thread-suggestions.d.ts.map +1 -0
  184. package/dist/services/thread-suggestions.js +243 -0
  185. package/dist/services/thread-suggestions.js.map +1 -0
  186. package/dist/services/thread-supabase.d.ts +111 -0
  187. package/dist/services/thread-supabase.d.ts.map +1 -0
  188. package/dist/services/thread-supabase.js +459 -0
  189. package/dist/services/thread-supabase.js.map +1 -0
  190. package/dist/services/thread-vitality.d.ts +65 -0
  191. package/dist/services/thread-vitality.d.ts.map +1 -0
  192. package/dist/services/thread-vitality.js +143 -0
  193. package/dist/services/thread-vitality.js.map +1 -0
  194. package/dist/services/tier.d.ts +52 -0
  195. package/dist/services/tier.d.ts.map +1 -0
  196. package/dist/services/tier.js +109 -0
  197. package/dist/services/tier.js.map +1 -0
  198. package/dist/services/timezone.d.ts +37 -0
  199. package/dist/services/timezone.d.ts.map +1 -0
  200. package/dist/services/timezone.js +147 -0
  201. package/dist/services/timezone.js.map +1 -0
  202. package/dist/services/transcript-chunker.d.ts +18 -0
  203. package/dist/services/transcript-chunker.d.ts.map +1 -0
  204. package/dist/services/transcript-chunker.js +237 -0
  205. package/dist/services/transcript-chunker.js.map +1 -0
  206. package/dist/services/triple-writer.d.ts +128 -0
  207. package/dist/services/triple-writer.d.ts.map +1 -0
  208. package/dist/services/triple-writer.js +338 -0
  209. package/dist/services/triple-writer.js.map +1 -0
  210. package/dist/services/variant-assignment.d.ts +92 -0
  211. package/dist/services/variant-assignment.d.ts.map +1 -0
  212. package/dist/services/variant-assignment.js +196 -0
  213. package/dist/services/variant-assignment.js.map +1 -0
  214. package/dist/tools/absorb-observations.d.ts +16 -0
  215. package/dist/tools/absorb-observations.d.ts.map +1 -0
  216. package/dist/tools/absorb-observations.js +82 -0
  217. package/dist/tools/absorb-observations.js.map +1 -0
  218. package/dist/tools/analyze.d.ts +55 -0
  219. package/dist/tools/analyze.d.ts.map +1 -0
  220. package/dist/tools/analyze.js +139 -0
  221. package/dist/tools/analyze.js.map +1 -0
  222. package/dist/tools/cleanup-threads.d.ts +47 -0
  223. package/dist/tools/cleanup-threads.d.ts.map +1 -0
  224. package/dist/tools/cleanup-threads.js +127 -0
  225. package/dist/tools/cleanup-threads.js.map +1 -0
  226. package/dist/tools/confirm-scars.d.ts +23 -0
  227. package/dist/tools/confirm-scars.d.ts.map +1 -0
  228. package/dist/tools/confirm-scars.js +209 -0
  229. package/dist/tools/confirm-scars.js.map +1 -0
  230. package/dist/tools/create-decision.d.ts +15 -0
  231. package/dist/tools/create-decision.d.ts.map +1 -0
  232. package/dist/tools/create-decision.js +138 -0
  233. package/dist/tools/create-decision.js.map +1 -0
  234. package/dist/tools/create-learning.d.ts +15 -0
  235. package/dist/tools/create-learning.d.ts.map +1 -0
  236. package/dist/tools/create-learning.js +226 -0
  237. package/dist/tools/create-learning.js.map +1 -0
  238. package/dist/tools/create-thread.d.ts +42 -0
  239. package/dist/tools/create-thread.d.ts.map +1 -0
  240. package/dist/tools/create-thread.js +180 -0
  241. package/dist/tools/create-thread.js.map +1 -0
  242. package/dist/tools/definitions.d.ts +5013 -0
  243. package/dist/tools/definitions.d.ts.map +1 -0
  244. package/dist/tools/definitions.js +2017 -0
  245. package/dist/tools/definitions.js.map +1 -0
  246. package/dist/tools/dismiss-suggestion.d.ts +20 -0
  247. package/dist/tools/dismiss-suggestion.d.ts.map +1 -0
  248. package/dist/tools/dismiss-suggestion.js +40 -0
  249. package/dist/tools/dismiss-suggestion.js.map +1 -0
  250. package/dist/tools/get-transcript.d.ts +24 -0
  251. package/dist/tools/get-transcript.d.ts.map +1 -0
  252. package/dist/tools/get-transcript.js +52 -0
  253. package/dist/tools/get-transcript.js.map +1 -0
  254. package/dist/tools/graph-traverse.d.ts +83 -0
  255. package/dist/tools/graph-traverse.d.ts.map +1 -0
  256. package/dist/tools/graph-traverse.js +394 -0
  257. package/dist/tools/graph-traverse.js.map +1 -0
  258. package/dist/tools/list-threads.d.ts +15 -0
  259. package/dist/tools/list-threads.d.ts.map +1 -0
  260. package/dist/tools/list-threads.js +114 -0
  261. package/dist/tools/list-threads.js.map +1 -0
  262. package/dist/tools/log.d.ts +43 -0
  263. package/dist/tools/log.d.ts.map +1 -0
  264. package/dist/tools/log.js +157 -0
  265. package/dist/tools/log.js.map +1 -0
  266. package/dist/tools/prepare-context.d.ts +36 -0
  267. package/dist/tools/prepare-context.d.ts.map +1 -0
  268. package/dist/tools/prepare-context.js +353 -0
  269. package/dist/tools/prepare-context.js.map +1 -0
  270. package/dist/tools/promote-suggestion.d.ts +25 -0
  271. package/dist/tools/promote-suggestion.d.ts.map +1 -0
  272. package/dist/tools/promote-suggestion.js +60 -0
  273. package/dist/tools/promote-suggestion.js.map +1 -0
  274. package/dist/tools/recall.d.ts +77 -0
  275. package/dist/tools/recall.d.ts.map +1 -0
  276. package/dist/tools/recall.js +423 -0
  277. package/dist/tools/recall.js.map +1 -0
  278. package/dist/tools/recall.test.d.ts +5 -0
  279. package/dist/tools/recall.test.d.ts.map +1 -0
  280. package/dist/tools/recall.test.js +155 -0
  281. package/dist/tools/recall.test.js.map +1 -0
  282. package/dist/tools/record-scar-usage-batch.d.ts +10 -0
  283. package/dist/tools/record-scar-usage-batch.d.ts.map +1 -0
  284. package/dist/tools/record-scar-usage-batch.js +153 -0
  285. package/dist/tools/record-scar-usage-batch.js.map +1 -0
  286. package/dist/tools/record-scar-usage.d.ts +14 -0
  287. package/dist/tools/record-scar-usage.d.ts.map +1 -0
  288. package/dist/tools/record-scar-usage.js +94 -0
  289. package/dist/tools/record-scar-usage.js.map +1 -0
  290. package/dist/tools/resolve-thread.d.ts +16 -0
  291. package/dist/tools/resolve-thread.d.ts.map +1 -0
  292. package/dist/tools/resolve-thread.js +102 -0
  293. package/dist/tools/resolve-thread.js.map +1 -0
  294. package/dist/tools/save-transcript.d.ts +29 -0
  295. package/dist/tools/save-transcript.d.ts.map +1 -0
  296. package/dist/tools/save-transcript.js +97 -0
  297. package/dist/tools/save-transcript.js.map +1 -0
  298. package/dist/tools/search.d.ts +46 -0
  299. package/dist/tools/search.d.ts.map +1 -0
  300. package/dist/tools/search.js +186 -0
  301. package/dist/tools/search.js.map +1 -0
  302. package/dist/tools/session-close.d.ts +14 -0
  303. package/dist/tools/session-close.d.ts.map +1 -0
  304. package/dist/tools/session-close.js +881 -0
  305. package/dist/tools/session-close.js.map +1 -0
  306. package/dist/tools/session-start.d.ts +38 -0
  307. package/dist/tools/session-start.d.ts.map +1 -0
  308. package/dist/tools/session-start.js +1104 -0
  309. package/dist/tools/session-start.js.map +1 -0
  310. package/dist/types/index.d.ts +456 -0
  311. package/dist/types/index.d.ts.map +1 -0
  312. package/dist/types/index.js +5 -0
  313. package/dist/types/index.js.map +1 -0
  314. package/package.json +76 -0
  315. package/schema/setup.sql +193 -0
  316. package/schema/starter-scars.json +206 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Thread Suggestions Service (Phase 5: Implicit Thread Detection)
3
+ *
4
+ * Detects recurring session topics not captured by existing threads.
5
+ * Core detection is pure (no I/O). File persistence and Supabase
6
+ * queries are separate functions called by the session lifecycle.
7
+ *
8
+ * Algorithm:
9
+ * 1. Compare current session embedding against recent sessions
10
+ * 2. If 3+ sessions are similar AND no matching open thread exists
11
+ * → create a thread suggestion
12
+ * 3. Suggestions surfaced at session_start, managed via promote/dismiss
13
+ */
14
+ import * as fs from "fs";
15
+ import * as path from "path";
16
+ import * as crypto from "crypto";
17
+ import { getGitmemDir } from "./gitmem-dir.js";
18
+ import { directQuery } from "./supabase-client.js";
19
+ import { hasSupabase } from "./tier.js";
20
+ import { cosineSimilarity } from "./thread-dedup.js";
21
+ // ---------- Constants ----------
22
+ export const SESSION_SIMILARITY_THRESHOLD = 0.70;
23
+ export const THREAD_MATCH_THRESHOLD = 0.80;
24
+ export const SUGGESTION_MATCH_THRESHOLD = 0.80;
25
+ export const MIN_EVIDENCE_SESSIONS = 3;
26
+ const SUGGESTIONS_FILENAME = "suggested-threads.json";
27
+ // ---------- Pure Detection ----------
28
+ /**
29
+ * Detect suggested threads from session embedding clustering.
30
+ * Pure function — no I/O, no side effects.
31
+ *
32
+ * Returns the full updated suggestions list (existing + any new/updated).
33
+ */
34
+ export function detectSuggestedThreads(currentSession, recentSessions, openThreadEmbeddings, existingSuggestions) {
35
+ const now = new Date().toISOString();
36
+ // Step 1: Find historical sessions similar to current
37
+ const similarSessions = [];
38
+ let totalSimilarity = 0;
39
+ for (const session of recentSessions) {
40
+ // Skip self
41
+ if (session.session_id === currentSession.session_id)
42
+ continue;
43
+ const sim = cosineSimilarity(currentSession.embedding, session.embedding);
44
+ if (sim >= SESSION_SIMILARITY_THRESHOLD) {
45
+ similarSessions.push(session);
46
+ totalSimilarity += sim;
47
+ }
48
+ }
49
+ // Step 2: Need at least 2 similar historical sessions (3+ total including current)
50
+ if (similarSessions.length < MIN_EVIDENCE_SESSIONS - 1) {
51
+ return existingSuggestions;
52
+ }
53
+ const avgSimilarity = totalSimilarity / similarSessions.length;
54
+ // Step 3: Check if any open thread already covers this topic
55
+ for (const thread of openThreadEmbeddings) {
56
+ if (thread.embedding === null)
57
+ continue;
58
+ const sim = cosineSimilarity(currentSession.embedding, thread.embedding);
59
+ if (sim >= THREAD_MATCH_THRESHOLD) {
60
+ // Topic is already captured by an existing thread — no suggestion
61
+ return existingSuggestions;
62
+ }
63
+ }
64
+ // Step 4: Check if any existing pending suggestion matches
65
+ const updated = [...existingSuggestions];
66
+ for (const suggestion of updated) {
67
+ if (suggestion.status !== "pending")
68
+ continue;
69
+ if (suggestion.embedding === null)
70
+ continue;
71
+ const sim = cosineSimilarity(currentSession.embedding, suggestion.embedding);
72
+ if (sim >= SUGGESTION_MATCH_THRESHOLD) {
73
+ // Update existing suggestion with new evidence
74
+ if (!suggestion.evidence_sessions.includes(currentSession.session_id)) {
75
+ suggestion.evidence_sessions.push(currentSession.session_id);
76
+ suggestion.similarity_score = round((suggestion.similarity_score + avgSimilarity) / 2, 4);
77
+ suggestion.updated_at = now;
78
+ }
79
+ return updated;
80
+ }
81
+ }
82
+ // Step 5: No existing match — create new suggestion
83
+ const evidenceIds = [
84
+ currentSession.session_id,
85
+ ...similarSessions.map((s) => s.session_id),
86
+ ];
87
+ const newSuggestion = {
88
+ id: generateSuggestionId(),
89
+ text: currentSession.title,
90
+ embedding: currentSession.embedding,
91
+ evidence_sessions: evidenceIds,
92
+ similarity_score: round(avgSimilarity, 4),
93
+ status: "pending",
94
+ dismissed_count: 0,
95
+ created_at: now,
96
+ updated_at: now,
97
+ };
98
+ updated.push(newSuggestion);
99
+ return updated;
100
+ }
101
+ // ---------- State Management (Pure) ----------
102
+ /**
103
+ * Promote a suggestion to an open thread.
104
+ * Mutates the suggestion in-place and returns it, or null if not found.
105
+ */
106
+ export function promoteSuggestionById(id, threadId, suggestions) {
107
+ const suggestion = suggestions.find((s) => s.id === id);
108
+ if (!suggestion)
109
+ return null;
110
+ suggestion.status = "promoted";
111
+ suggestion.promoted_thread_id = threadId;
112
+ suggestion.updated_at = new Date().toISOString();
113
+ return suggestion;
114
+ }
115
+ /**
116
+ * Dismiss a suggestion. Increments dismissed_count.
117
+ * Mutates the suggestion in-place and returns it, or null if not found.
118
+ */
119
+ export function dismissSuggestionById(id, suggestions) {
120
+ const suggestion = suggestions.find((s) => s.id === id);
121
+ if (!suggestion)
122
+ return null;
123
+ suggestion.status = "dismissed";
124
+ suggestion.dismissed_count += 1;
125
+ suggestion.updated_at = new Date().toISOString();
126
+ return suggestion;
127
+ }
128
+ /**
129
+ * Filter to only pending suggestions (not promoted/dismissed).
130
+ * Excludes suggestions dismissed 3+ times (permanently suppressed).
131
+ */
132
+ export function getPendingSuggestions(suggestions) {
133
+ return suggestions.filter((s) => s.status === "pending" && s.dismissed_count < 3);
134
+ }
135
+ // ---------- File I/O ----------
136
+ /**
137
+ * Load suggestions from .gitmem/suggested-threads.json.
138
+ * Returns empty array if file doesn't exist or is corrupted.
139
+ */
140
+ export function loadSuggestions() {
141
+ try {
142
+ const gitmemDir = getGitmemDir();
143
+ const filePath = path.join(gitmemDir, SUGGESTIONS_FILENAME);
144
+ if (!fs.existsSync(filePath))
145
+ return [];
146
+ const content = fs.readFileSync(filePath, "utf-8");
147
+ const parsed = JSON.parse(content);
148
+ if (!Array.isArray(parsed))
149
+ return [];
150
+ return parsed;
151
+ }
152
+ catch {
153
+ return [];
154
+ }
155
+ }
156
+ /**
157
+ * Save suggestions to .gitmem/suggested-threads.json.
158
+ */
159
+ export function saveSuggestions(suggestions) {
160
+ try {
161
+ const gitmemDir = getGitmemDir();
162
+ if (!fs.existsSync(gitmemDir)) {
163
+ fs.mkdirSync(gitmemDir, { recursive: true });
164
+ }
165
+ const filePath = path.join(gitmemDir, SUGGESTIONS_FILENAME);
166
+ fs.writeFileSync(filePath, JSON.stringify(suggestions, null, 2), "utf-8");
167
+ }
168
+ catch (error) {
169
+ console.error("[thread-suggestions] Failed to save suggestions:", error instanceof Error ? error.message : error);
170
+ }
171
+ }
172
+ // ---------- Supabase Query ----------
173
+ /**
174
+ * Parse embedding from Supabase REST response.
175
+ * REST returns vector columns as JSON strings, not arrays.
176
+ */
177
+ function parseEmbedding(raw) {
178
+ if (raw === null || raw === undefined)
179
+ return null;
180
+ if (Array.isArray(raw))
181
+ return raw;
182
+ if (typeof raw === "string") {
183
+ try {
184
+ const parsed = JSON.parse(raw);
185
+ if (Array.isArray(parsed))
186
+ return parsed;
187
+ }
188
+ catch {
189
+ // Invalid JSON
190
+ }
191
+ }
192
+ return null;
193
+ }
194
+ /**
195
+ * Fetch recent session embeddings from Supabase for clustering comparison.
196
+ * Returns null if Supabase is unavailable.
197
+ */
198
+ export async function loadRecentSessionEmbeddings(project = "orchestra_dev", days = 30, limit = 20) {
199
+ if (!hasSupabase()) {
200
+ return null;
201
+ }
202
+ try {
203
+ const cutoff = new Date();
204
+ cutoff.setDate(cutoff.getDate() - days);
205
+ const cutoffStr = cutoff.toISOString().split("T")[0]; // YYYY-MM-DD
206
+ const rows = await directQuery("orchestra_sessions", {
207
+ select: "id,session_title,embedding",
208
+ filters: {
209
+ project,
210
+ session_date: `gte.${cutoffStr}`,
211
+ },
212
+ order: "created_at.desc",
213
+ limit,
214
+ });
215
+ // Filter to rows that have embeddings
216
+ const records = [];
217
+ for (const row of rows) {
218
+ const emb = parseEmbedding(row.embedding);
219
+ if (emb && row.session_title) {
220
+ records.push({
221
+ session_id: row.id,
222
+ session_title: row.session_title,
223
+ embedding: emb,
224
+ });
225
+ }
226
+ }
227
+ console.error(`[thread-suggestions] Loaded ${records.length} session embeddings (${rows.length} rows, last ${days} days)`);
228
+ return records;
229
+ }
230
+ catch (error) {
231
+ console.error("[thread-suggestions] Failed to load session embeddings:", error instanceof Error ? error.message : error);
232
+ return null;
233
+ }
234
+ }
235
+ // ---------- Helpers ----------
236
+ export function generateSuggestionId() {
237
+ return "ts-" + crypto.randomBytes(4).toString("hex");
238
+ }
239
+ function round(value, decimals) {
240
+ const factor = 10 ** decimals;
241
+ return Math.round(value * factor) / factor;
242
+ }
243
+ //# sourceMappingURL=thread-suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-suggestions.js","sourceRoot":"","sources":["../../src/services/thread-suggestions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Thread Supabase Service (OD-620, OD-621, OD-622, OD-623, OD-624)
3
+ *
4
+ * Provides Supabase CRUD operations for the orchestra_threads table.
5
+ * Supabase is the source of truth; local .gitmem/threads.json is a cache.
6
+ *
7
+ * Uses directQuery/directUpsert (PostgREST) like other Supabase operations
8
+ * in this codebase. Graceful fallback: if Supabase is unreachable, callers
9
+ * fall back to local file operations.
10
+ */
11
+ import type { LifecycleStatus } from "./thread-vitality.js";
12
+ import type { ThreadWithEmbedding } from "./thread-dedup.js";
13
+ import type { ThreadObject, Project } from "../types/index.js";
14
+ /** Shape of a row in orchestra_threads / orchestra_threads_lite */
15
+ export interface ThreadRow {
16
+ id: string;
17
+ thread_id: string;
18
+ text: string;
19
+ status: string;
20
+ thread_class: string;
21
+ vitality_score: number;
22
+ last_touched_at: string;
23
+ touch_count: number;
24
+ created_at: string;
25
+ updated_at: string;
26
+ resolved_at: string | null;
27
+ resolution_note: string | null;
28
+ source_session: string | null;
29
+ resolved_by_session: string | null;
30
+ related_issues: string[] | null;
31
+ domain: string[] | null;
32
+ project: string;
33
+ metadata: Record<string, unknown>;
34
+ }
35
+ /** Display-enriched thread info for session_start (Phase 6) */
36
+ export interface ThreadDisplayInfo {
37
+ thread: ThreadObject;
38
+ vitality_score: number;
39
+ lifecycle_status: LifecycleStatus;
40
+ thread_class: string;
41
+ days_since_touch: number;
42
+ }
43
+ /**
44
+ * Map a local ThreadObject to a Supabase row for insert/upsert.
45
+ */
46
+ export declare function threadObjectToRow(thread: ThreadObject, project?: Project, embedding?: string | null): Record<string, unknown>;
47
+ /**
48
+ * Map a Supabase row to a local ThreadObject.
49
+ */
50
+ export declare function rowToThreadObject(row: ThreadRow): ThreadObject;
51
+ /**
52
+ * Create a thread in Supabase.
53
+ * Returns the created row or null if Supabase is unavailable.
54
+ */
55
+ export declare function createThreadInSupabase(thread: ThreadObject, project?: Project, embedding?: string | null): Promise<ThreadRow | null>;
56
+ /**
57
+ * Resolve a thread in Supabase by thread_id.
58
+ * Updates status, resolved_at, resolution_note, resolved_by_session.
59
+ * Returns true if update succeeded.
60
+ */
61
+ export declare function resolveThreadInSupabase(threadId: string, options?: {
62
+ resolvedAt?: string;
63
+ resolutionNote?: string;
64
+ resolvedBySession?: string;
65
+ }): Promise<boolean>;
66
+ /**
67
+ * List threads from Supabase with project filter.
68
+ * Uses orchestra_threads_lite view (no embedding column).
69
+ * Returns null if Supabase is unavailable (caller should fall back to local).
70
+ */
71
+ export declare function listThreadsFromSupabase(project?: Project, options?: {
72
+ statusFilter?: string;
73
+ includeResolved?: boolean;
74
+ }): Promise<ThreadObject[] | null>;
75
+ /**
76
+ * Load active (non-archived, non-resolved) threads from Supabase for session_start.
77
+ * Uses orchestra_threads_lite view ordered by vitality_score DESC.
78
+ * Returns null if Supabase is unavailable.
79
+ */
80
+ export declare function loadActiveThreadsFromSupabase(project?: Project): Promise<{
81
+ open: ThreadObject[];
82
+ recentlyResolved: ThreadObject[];
83
+ displayInfo: ThreadDisplayInfo[];
84
+ } | null>;
85
+ /**
86
+ * Touch threads in Supabase — increment touch_count and update last_touched_at.
87
+ * Called during session_close for threads that were referenced during the session.
88
+ */
89
+ export declare function touchThreadsInSupabase(threadIds: string[]): Promise<void>;
90
+ /**
91
+ * Batch create/update threads in Supabase.
92
+ * Used by session_close to sync thread state.
93
+ * New threads (not in Supabase) get created; existing threads get touched.
94
+ */
95
+ export declare function syncThreadsToSupabase(threads: ThreadObject[], project?: Project, sessionId?: string): Promise<void>;
96
+ /**
97
+ * Archive dormant threads that have been dormant for 30+ days.
98
+ * Reads metadata.dormant_since to determine eligibility.
99
+ * Called at session_start as fire-and-forget.
100
+ */
101
+ export declare function archiveDormantThreads(project?: Project, dormantDays?: number): Promise<{
102
+ archived_count: number;
103
+ archived_ids: string[];
104
+ }>;
105
+ /**
106
+ * Load open threads WITH embeddings from Supabase for dedup comparison.
107
+ * Uses the full orchestra_threads table (not _lite view) to include embedding column.
108
+ * Returns null if Supabase is unavailable.
109
+ */
110
+ export declare function loadOpenThreadEmbeddings(project?: Project): Promise<ThreadWithEmbedding[] | null>;
111
+ //# sourceMappingURL=thread-supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-supabase.d.ts","sourceRoot":"","sources":["../../src/services/thread-supabase.ts"],"names":[],"mappings":"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"}