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,394 @@
1
+ /**
2
+ * graph_traverse Tool
3
+ *
4
+ * Knowledge graph traversal over institutional memory triples.
5
+ * Single tool with 4 lenses: connected_to, produced_by, provenance, stats.
6
+ *
7
+ * No SQL migrations — uses directQuery + client-side assembly.
8
+ * Dataset is small (~668 triples) so full-table fetch is fine for
9
+ * provenance/stats; connected_to/produced_by use targeted PostgREST filters.
10
+ *
11
+ * Performance target: 3000ms
12
+ */
13
+ import { directQuery } from "../services/supabase-client.js";
14
+ import { hasSupabase } from "../services/tier.js";
15
+ import { Timer, buildPerformanceData, } from "../services/metrics.js";
16
+ // --- Constants ---
17
+ const SELECT_COLS = "id,subject,predicate,object,event_time,decay_weight,source_type,source_id,source_linear_issue,created_by";
18
+ const KNOWN_AGENTS = ["CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud"];
19
+ const KNOWN_PERSONAS = ["Elena", "Marcus", "Reiko", "Jax", "Chris Crawford"];
20
+ function normalizeNode(input) {
21
+ const trimmed = input.trim();
22
+ // Already prefixed: "Scar: Title", "Issue: OD-466", etc.
23
+ if (/^(Scar|Win|Decision|Pattern|Anti-Pattern|Issue|Agent|Persona|Thread):/.test(trimmed)) {
24
+ return { pattern: `*${trimmed}*`, type: trimmed.split(":")[0] };
25
+ }
26
+ // OD-XXX issue pattern
27
+ if (/^OD-\d+$/i.test(trimmed)) {
28
+ return { pattern: `*${trimmed.toUpperCase()}*`, type: "Issue" };
29
+ }
30
+ // Known agent names
31
+ if (KNOWN_AGENTS.includes(trimmed)) {
32
+ return { pattern: `*Agent: ${trimmed}*`, type: "Agent" };
33
+ }
34
+ // Known persona names
35
+ if (KNOWN_PERSONAS.includes(trimmed)) {
36
+ return { pattern: `*Persona: ${trimmed}*`, type: "Persona" };
37
+ }
38
+ // Fallback: fuzzy search
39
+ return { pattern: `*${trimmed}*`, type: "Unknown" };
40
+ }
41
+ /** Detect the type label from a subject/object string */
42
+ function detectNodeType(label) {
43
+ if (label.startsWith("Scar:"))
44
+ return "Scar";
45
+ if (label.startsWith("Win:"))
46
+ return "Win";
47
+ if (label.startsWith("Decision:"))
48
+ return "Decision";
49
+ if (label.startsWith("Pattern:"))
50
+ return "Pattern";
51
+ if (label.startsWith("Anti-Pattern:"))
52
+ return "Anti-Pattern";
53
+ if (label.startsWith("Issue:"))
54
+ return "Issue";
55
+ if (label.startsWith("Agent:"))
56
+ return "Agent";
57
+ if (label.startsWith("Persona:"))
58
+ return "Persona";
59
+ if (label.startsWith("Thread:"))
60
+ return "Thread";
61
+ return "Unknown";
62
+ }
63
+ // --- Fetch Helpers ---
64
+ async function fetchTriplesByNode(pattern, project, limit, predicate) {
65
+ const filters = {
66
+ project,
67
+ or: `(subject.ilike.${pattern},object.ilike.${pattern})`,
68
+ };
69
+ if (predicate) {
70
+ filters.predicate = predicate;
71
+ }
72
+ return directQuery("knowledge_triples", {
73
+ select: SELECT_COLS,
74
+ filters,
75
+ order: "event_time.desc",
76
+ limit,
77
+ });
78
+ }
79
+ async function fetchAllTriples(project) {
80
+ return directQuery("knowledge_triples", {
81
+ select: SELECT_COLS,
82
+ filters: { project },
83
+ order: "event_time.desc",
84
+ limit: 2000,
85
+ });
86
+ }
87
+ // --- Summary Helpers ---
88
+ function countByPredicate(triples) {
89
+ const counts = {};
90
+ for (const t of triples) {
91
+ counts[t.predicate] = (counts[t.predicate] || 0) + 1;
92
+ }
93
+ return counts;
94
+ }
95
+ function topN(counts, n) {
96
+ return Object.entries(counts)
97
+ .sort((a, b) => b[1] - a[1])
98
+ .slice(0, n)
99
+ .map(([label, count]) => ({ label, count }));
100
+ }
101
+ // --- Lens: connected_to ---
102
+ async function connectedTo(params, timer) {
103
+ const project = params.project || "orchestra_dev";
104
+ const limit = params.limit || 50;
105
+ const { pattern, type } = normalizeNode(params.node);
106
+ const triples = await fetchTriplesByNode(pattern, project, limit, params.predicate);
107
+ const latencyMs = timer.stop();
108
+ const asSubject = triples.filter((t) => t.subject.toLowerCase().includes(params.node.toLowerCase()));
109
+ const asObject = triples.filter((t) => t.object.toLowerCase().includes(params.node.toLowerCase()));
110
+ // Build summary
111
+ const predicateCounts = countByPredicate(triples);
112
+ const predicateParts = Object.entries(predicateCounts)
113
+ .map(([pred, count]) => `${count} ${pred}`)
114
+ .join(", ");
115
+ const summary = triples.length === 0
116
+ ? `No triples found matching "${params.node}".`
117
+ : `${type}: ${params.node} has ${triples.length} connections (${predicateParts}). Appears as subject in ${asSubject.length}, as object in ${asObject.length}.`;
118
+ return {
119
+ success: true,
120
+ lens: "connected_to",
121
+ query_node: params.node,
122
+ summary,
123
+ node: {
124
+ label: params.node,
125
+ type,
126
+ as_subject: asSubject,
127
+ as_object: asObject,
128
+ },
129
+ total_triples_scanned: triples.length,
130
+ performance: buildPerformanceData("graph_traverse", latencyMs, triples.length),
131
+ };
132
+ }
133
+ // --- Lens: produced_by ---
134
+ async function producedBy(params, timer) {
135
+ const project = params.project || "orchestra_dev";
136
+ const limit = params.limit || 100;
137
+ const { pattern } = normalizeNode(params.node);
138
+ // Find triples where this agent/persona is the object
139
+ const filters = {
140
+ project,
141
+ object: `ilike.${pattern}`,
142
+ };
143
+ if (params.predicate) {
144
+ filters.predicate = params.predicate;
145
+ }
146
+ const triples = await directQuery("knowledge_triples", {
147
+ select: SELECT_COLS,
148
+ filters,
149
+ order: "event_time.desc",
150
+ limit,
151
+ });
152
+ const latencyMs = timer.stop();
153
+ // Group subjects by type
154
+ const byType = {};
155
+ for (const t of triples) {
156
+ const sType = detectNodeType(t.subject);
157
+ if (!byType[sType])
158
+ byType[sType] = [];
159
+ // Deduplicate subjects
160
+ if (!byType[sType].includes(t.subject)) {
161
+ byType[sType].push(t.subject);
162
+ }
163
+ }
164
+ const typeParts = Object.entries(byType)
165
+ .sort((a, b) => b[1].length - a[1].length)
166
+ .map(([type, items]) => `${items.length} ${type.toLowerCase()}${items.length !== 1 ? "s" : ""}`)
167
+ .join(", ");
168
+ const uniqueSubjects = new Set(triples.map((t) => t.subject));
169
+ const summary = triples.length === 0
170
+ ? `No triples found with "${params.node}" as contributor.`
171
+ : `${params.node} contributed to ${uniqueSubjects.size} items: ${typeParts}.`;
172
+ return {
173
+ success: true,
174
+ lens: "produced_by",
175
+ query_node: params.node,
176
+ summary,
177
+ node: {
178
+ label: params.node,
179
+ type: detectNodeType(`Agent: ${params.node}`).startsWith("Agent") ? "Agent" : "Persona",
180
+ as_subject: [],
181
+ as_object: triples,
182
+ },
183
+ total_triples_scanned: triples.length,
184
+ performance: buildPerformanceData("graph_traverse", latencyMs, triples.length),
185
+ };
186
+ }
187
+ // --- Lens: provenance ---
188
+ async function provenance(params, timer) {
189
+ const project = params.project || "orchestra_dev";
190
+ const maxDepth = params.depth || 3;
191
+ // Fetch all triples and traverse in memory
192
+ const allTriples = await fetchAllTriples(project);
193
+ // Build adjacency: subject -> triples where it's the subject
194
+ const subjectIndex = new Map();
195
+ for (const t of allTriples) {
196
+ const key = t.subject.toLowerCase();
197
+ if (!subjectIndex.has(key))
198
+ subjectIndex.set(key, []);
199
+ subjectIndex.get(key).push(t);
200
+ }
201
+ const chain = [];
202
+ const visited = new Set();
203
+ const nodePattern = params.node.toLowerCase();
204
+ // Find starting triples (where subject matches the node)
205
+ let currentNodes = [];
206
+ // Collect subjects that match the input
207
+ for (const [key] of subjectIndex) {
208
+ if (key.includes(nodePattern)) {
209
+ currentNodes.push(key);
210
+ }
211
+ }
212
+ for (let depth = 1; depth <= maxDepth; depth++) {
213
+ const hopTriples = [];
214
+ const nextNodes = [];
215
+ for (const node of currentNodes) {
216
+ const triples = subjectIndex.get(node) || [];
217
+ for (const t of triples) {
218
+ if (visited.has(t.id))
219
+ continue;
220
+ visited.add(t.id);
221
+ hopTriples.push(t);
222
+ // Follow the object as next subject
223
+ const objKey = t.object.toLowerCase();
224
+ if (!currentNodes.includes(objKey) && subjectIndex.has(objKey)) {
225
+ nextNodes.push(objKey);
226
+ }
227
+ }
228
+ }
229
+ if (hopTriples.length === 0)
230
+ break;
231
+ chain.push({ depth, triples: hopTriples });
232
+ currentNodes = nextNodes;
233
+ if (nextNodes.length === 0)
234
+ break;
235
+ }
236
+ const latencyMs = timer.stop();
237
+ const totalEdges = chain.reduce((sum, hop) => sum + hop.triples.length, 0);
238
+ // Build summary
239
+ let summary;
240
+ if (chain.length === 0) {
241
+ summary = `No provenance chain found for "${params.node}".`;
242
+ }
243
+ else {
244
+ const hopSummaries = chain.map((hop) => {
245
+ const edges = hop.triples
246
+ .map((t) => `${t.subject.split(":").slice(1).join(":").trim()} --[${t.predicate}]--> ${t.object}`)
247
+ .slice(0, 5); // Cap at 5 per hop for readability
248
+ const more = hop.triples.length > 5 ? ` (+${hop.triples.length - 5} more)` : "";
249
+ return `Hop ${hop.depth}: ${edges.join("; ")}${more}`;
250
+ });
251
+ summary = `Provenance for "${params.node}" (${totalEdges} edges, ${chain.length} hops):\n${hopSummaries.join("\n")}`;
252
+ }
253
+ return {
254
+ success: true,
255
+ lens: "provenance",
256
+ query_node: params.node,
257
+ summary,
258
+ chain,
259
+ total_triples_scanned: allTriples.length,
260
+ performance: buildPerformanceData("graph_traverse", latencyMs, totalEdges),
261
+ };
262
+ }
263
+ // --- Lens: stats ---
264
+ async function stats(params, timer) {
265
+ const project = params.project || "orchestra_dev";
266
+ const allTriples = await fetchAllTriples(project);
267
+ const latencyMs = timer.stop();
268
+ // Predicate distribution
269
+ const predicateDist = countByPredicate(allTriples);
270
+ // Top subjects
271
+ const subjectCounts = {};
272
+ for (const t of allTriples) {
273
+ subjectCounts[t.subject] = (subjectCounts[t.subject] || 0) + 1;
274
+ }
275
+ // Top objects
276
+ const objectCounts = {};
277
+ for (const t of allTriples) {
278
+ objectCounts[t.object] = (objectCounts[t.object] || 0) + 1;
279
+ }
280
+ // Issues by learning count (objects matching "Issue: OD-*")
281
+ const issueCounts = {};
282
+ for (const t of allTriples) {
283
+ if (t.object.startsWith("Issue: OD-")) {
284
+ issueCounts[t.object] = (issueCounts[t.object] || 0) + 1;
285
+ }
286
+ if (t.subject.startsWith("Issue: OD-")) {
287
+ issueCounts[t.subject] = (issueCounts[t.subject] || 0) + 1;
288
+ }
289
+ }
290
+ // Agent contributions
291
+ const agentCounts = {};
292
+ for (const t of allTriples) {
293
+ if (t.object.startsWith("Agent:") || t.object.startsWith("Persona:")) {
294
+ agentCounts[t.object] = (agentCounts[t.object] || 0) + 1;
295
+ }
296
+ }
297
+ const graphStats = {
298
+ total_triples: allTriples.length,
299
+ predicate_distribution: predicateDist,
300
+ top_subjects: topN(subjectCounts, 10),
301
+ top_objects: topN(objectCounts, 10),
302
+ issues_by_learning_count: topN(issueCounts, 15).map(({ label, count }) => ({
303
+ issue: label,
304
+ count,
305
+ })),
306
+ agents_by_contribution: topN(agentCounts, 10).map(({ label, count }) => ({
307
+ agent: label,
308
+ count,
309
+ })),
310
+ };
311
+ // Build summary
312
+ const predParts = Object.entries(predicateDist)
313
+ .sort((a, b) => b[1] - a[1])
314
+ .map(([pred, count]) => {
315
+ const pct = Math.round((count / allTriples.length) * 100);
316
+ return `${pred}: ${count} (${pct}%)`;
317
+ })
318
+ .join(", ");
319
+ const topIssue = graphStats.issues_by_learning_count[0];
320
+ const topAgent = graphStats.agents_by_contribution[0];
321
+ const summary = [
322
+ `Knowledge graph: ${allTriples.length} triples across ${Object.keys(predicateDist).length} predicates.`,
323
+ `Predicates: ${predParts}.`,
324
+ topIssue ? `Top issue: ${topIssue.issue} (${topIssue.count} connections).` : "",
325
+ topAgent ? `Top contributor: ${topAgent.agent} (${topAgent.count} contributions).` : "",
326
+ ]
327
+ .filter(Boolean)
328
+ .join(" ");
329
+ return {
330
+ success: true,
331
+ lens: "stats",
332
+ summary,
333
+ stats: graphStats,
334
+ total_triples_scanned: allTriples.length,
335
+ performance: buildPerformanceData("graph_traverse", latencyMs, allTriples.length),
336
+ };
337
+ }
338
+ // --- Main Entry Point ---
339
+ export async function graphTraverse(params) {
340
+ const timer = new Timer();
341
+ const lens = params.lens;
342
+ if (!hasSupabase()) {
343
+ return {
344
+ success: false,
345
+ lens,
346
+ summary: "Graph traversal requires Supabase connection",
347
+ total_triples_scanned: 0,
348
+ performance: buildPerformanceData("graph_traverse", timer.stop(), 0),
349
+ };
350
+ }
351
+ // Validate: node required for all lenses except stats
352
+ if (lens !== "stats" && !params.node) {
353
+ return {
354
+ success: false,
355
+ lens,
356
+ summary: `The '${lens}' lens requires a 'node' parameter (e.g., "OD-466", "CLI", "Elena")`,
357
+ total_triples_scanned: 0,
358
+ performance: buildPerformanceData("graph_traverse", timer.stop(), 0),
359
+ };
360
+ }
361
+ try {
362
+ switch (lens) {
363
+ case "connected_to":
364
+ return await connectedTo(params, timer);
365
+ case "produced_by":
366
+ return await producedBy(params, timer);
367
+ case "provenance":
368
+ return await provenance(params, timer);
369
+ case "stats":
370
+ return await stats(params, timer);
371
+ default:
372
+ return {
373
+ success: false,
374
+ lens,
375
+ summary: `Unknown lens: ${lens}. Available: connected_to, produced_by, provenance, stats`,
376
+ total_triples_scanned: 0,
377
+ performance: buildPerformanceData("graph_traverse", timer.stop(), 0),
378
+ };
379
+ }
380
+ }
381
+ catch (error) {
382
+ const latencyMs = timer.stop();
383
+ const message = error instanceof Error ? error.message : String(error);
384
+ return {
385
+ success: false,
386
+ lens,
387
+ query_node: params.node,
388
+ summary: `Graph traversal failed: ${message}`,
389
+ total_triples_scanned: 0,
390
+ performance: buildPerformanceData("graph_traverse", latencyMs, 0),
391
+ };
392
+ }
393
+ }
394
+ //# sourceMappingURL=graph-traverse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-traverse.js","sourceRoot":"","sources":["../../src/tools/graph-traverse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * list_threads Tool (OD-thread-lifecycle, OD-622)
3
+ *
4
+ * List open threads across recent sessions. Shows unresolved work items
5
+ * that carry over between sessions, with IDs for resolution.
6
+ *
7
+ * OD-622: Primary read from Supabase (source of truth).
8
+ * Falls back to session-based aggregation (same as session_start),
9
+ * then in-memory session state, then .gitmem/threads.json.
10
+ *
11
+ * Performance target: <500ms (Supabase query with fallback)
12
+ */
13
+ import type { ListThreadsParams, ListThreadsResult } from "../types/index.js";
14
+ export declare function listThreads(params: ListThreadsParams): Promise<ListThreadsResult>;
15
+ //# sourceMappingURL=list-threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-threads.d.ts","sourceRoot":"","sources":["../../src/tools/list-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAgB,MAAM,mBAAmB,CAAC;AAW5F,wBAAsB,WAAW,CAC/B,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAwG5B"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * list_threads Tool (OD-thread-lifecycle, OD-622)
3
+ *
4
+ * List open threads across recent sessions. Shows unresolved work items
5
+ * that carry over between sessions, with IDs for resolution.
6
+ *
7
+ * OD-622: Primary read from Supabase (source of truth).
8
+ * Falls back to session-based aggregation (same as session_start),
9
+ * then in-memory session state, then .gitmem/threads.json.
10
+ *
11
+ * Performance target: <500ms (Supabase query with fallback)
12
+ */
13
+ import { v4 as uuidv4 } from "uuid";
14
+ import { aggregateThreads, loadThreadsFile, mergeThreadStates } from "../services/thread-manager.js";
15
+ import { listThreadsFromSupabase } from "../services/thread-supabase.js";
16
+ import * as supabase from "../services/supabase-client.js";
17
+ import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
18
+ import { formatThreadForDisplay } from "../services/timezone.js";
19
+ export async function listThreads(params) {
20
+ const timer = new Timer();
21
+ const metricsId = uuidv4();
22
+ const statusFilter = params.status || "open";
23
+ const includeResolved = params.include_resolved ?? false;
24
+ const project = params.project || "orchestra_dev";
25
+ let allThreads = null;
26
+ let source = "file";
27
+ // OD-622: Try Supabase first (source of truth)
28
+ const supabaseThreads = await listThreadsFromSupabase(project, {
29
+ statusFilter: includeResolved ? undefined : statusFilter,
30
+ includeResolved,
31
+ });
32
+ if (supabaseThreads !== null) {
33
+ allThreads = supabaseThreads;
34
+ source = "supabase";
35
+ }
36
+ // Fallback: aggregate from recent sessions, merged with local file
37
+ // (same pattern as session_start: aggregation + mergeThreadStates with local file)
38
+ if (allThreads === null) {
39
+ try {
40
+ const sessions = await supabase.listRecords({
41
+ table: "orchestra_sessions_lite",
42
+ filters: { project },
43
+ limit: 10,
44
+ orderBy: { column: "created_at", ascending: false },
45
+ });
46
+ if (sessions.length > 0) {
47
+ const result = aggregateThreads(sessions);
48
+ const aggregated = [...result.open, ...result.recently_resolved];
49
+ // Merge with local file — mergeThreadStates prefers resolved over open,
50
+ // so local resolve_thread calls survive even if sessions still show "open"
51
+ const fileThreads = loadThreadsFile();
52
+ const merged = fileThreads.length > 0
53
+ ? mergeThreadStates(aggregated, fileThreads)
54
+ : aggregated;
55
+ allThreads = merged;
56
+ source = "aggregation";
57
+ }
58
+ }
59
+ catch (error) {
60
+ console.error("[list_threads] Session aggregation fallback failed:", error instanceof Error ? error.message : error);
61
+ }
62
+ }
63
+ // Fallback: local file only (if aggregation failed entirely)
64
+ if (allThreads === null) {
65
+ allThreads = loadThreadsFile();
66
+ source = "file";
67
+ }
68
+ // Apply filtering for non-Supabase sources (Supabase already filtered)
69
+ let threads;
70
+ if (source === "supabase") {
71
+ // Supabase already applied status filter
72
+ threads = allThreads;
73
+ }
74
+ else if (includeResolved) {
75
+ threads = allThreads;
76
+ }
77
+ else {
78
+ threads = allThreads.filter((t) => t.status === statusFilter);
79
+ }
80
+ // Count totals
81
+ let totalOpen;
82
+ let totalResolved;
83
+ if (source === "supabase" && !includeResolved) {
84
+ totalOpen = threads.length;
85
+ totalResolved = 0;
86
+ }
87
+ else {
88
+ totalOpen = allThreads.filter((t) => t.status === "open").length;
89
+ totalResolved = allThreads.filter((t) => t.status === "resolved").length;
90
+ }
91
+ const latencyMs = timer.stop();
92
+ const perfData = buildPerformanceData("list_threads", latencyMs, threads.length);
93
+ recordMetrics({
94
+ id: metricsId,
95
+ tool_name: "list_threads",
96
+ query_text: `list:${statusFilter}:${includeResolved ? "all" : "filtered"}`,
97
+ tables_searched: source === "supabase" ? ["orchestra_threads_lite"] : source === "aggregation" ? ["orchestra_sessions_lite"] : [],
98
+ latency_ms: latencyMs,
99
+ result_count: threads.length,
100
+ phase_tag: "ad_hoc",
101
+ metadata: {
102
+ total_open: totalOpen,
103
+ total_resolved: totalResolved,
104
+ source,
105
+ },
106
+ }).catch(() => { });
107
+ return {
108
+ threads: threads.map(formatThreadForDisplay),
109
+ total_open: totalOpen,
110
+ total_resolved: totalResolved,
111
+ performance: perfData,
112
+ };
113
+ }
114
+ //# sourceMappingURL=list-threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-threads.js","sourceRoot":"","sources":["../../src/tools/list-threads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * log Tool (OD-561)
3
+ *
4
+ * Chronological listing of recent learnings, like `git log`.
5
+ * Pure read-only operation with no side effects.
6
+ *
7
+ * Uses directQuery to Supabase REST API (no ww-mcp dependency).
8
+ * Free tier reads from local .gitmem/ storage.
9
+ *
10
+ * Performance target: 500ms
11
+ */
12
+ import type { Project, PerformanceData } from "../types/index.js";
13
+ export interface LogParams {
14
+ limit?: number;
15
+ project?: Project;
16
+ learning_type?: "scar" | "win" | "pattern";
17
+ severity?: "critical" | "high" | "medium" | "low";
18
+ since?: number;
19
+ }
20
+ export interface LogEntry {
21
+ id: string;
22
+ title: string;
23
+ learning_type: string;
24
+ severity: string;
25
+ created_at: string;
26
+ source_linear_issue?: string;
27
+ project: string;
28
+ persona_name?: string;
29
+ }
30
+ export interface LogResult {
31
+ entries: LogEntry[];
32
+ total: number;
33
+ filters: {
34
+ project: string;
35
+ learning_type?: string;
36
+ severity?: string;
37
+ since_days?: number;
38
+ since_date?: string;
39
+ };
40
+ performance: PerformanceData;
41
+ }
42
+ export declare function log(params: LogParams): Promise<LogResult>;
43
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/tools/log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,OAAO,KAAK,EAAE,OAAO,EAAwB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIxF,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,WAAW,EAAE,eAAe,CAAC;CAC9B;AAID,wBAAsB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CA2J/D"}