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,157 @@
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 * as supabase from "../services/supabase-client.js";
13
+ import { hasSupabase } from "../services/tier.js";
14
+ import { getStorage } from "../services/storage.js";
15
+ import { Timer, recordMetrics, buildPerformanceData, buildComponentPerformance, } from "../services/metrics.js";
16
+ import { v4 as uuidv4 } from "uuid";
17
+ import { formatTimestamp } from "../services/timezone.js";
18
+ // --- Implementation ---
19
+ export async function log(params) {
20
+ const timer = new Timer();
21
+ const metricsId = uuidv4();
22
+ const limit = params.limit || 10;
23
+ const project = params.project || "orchestra_dev";
24
+ const typeFilter = params.learning_type;
25
+ const severityFilter = params.severity;
26
+ const sinceDays = params.since;
27
+ // Compute since date if provided
28
+ let sinceDate;
29
+ if (sinceDays && sinceDays > 0) {
30
+ const d = new Date();
31
+ d.setDate(d.getDate() - sinceDays);
32
+ sinceDate = d.toISOString();
33
+ }
34
+ // FREE TIER: read from local storage
35
+ if (!hasSupabase()) {
36
+ try {
37
+ const queryTimer = new Timer();
38
+ const storage = getStorage();
39
+ const filters = {};
40
+ if (typeFilter)
41
+ filters.learning_type = typeFilter;
42
+ if (severityFilter)
43
+ filters.severity = severityFilter;
44
+ const records = await storage.query("learnings", {
45
+ filters,
46
+ order: "created_at.desc",
47
+ limit,
48
+ });
49
+ // Post-filter by since date (local storage doesn't support gte filters)
50
+ let filtered = records;
51
+ if (sinceDate) {
52
+ filtered = filtered.filter(r => r.created_at >= sinceDate);
53
+ }
54
+ filtered = filtered.slice(0, limit);
55
+ const queryLatencyMs = queryTimer.stop();
56
+ const latencyMs = timer.stop();
57
+ return {
58
+ entries: filtered.map(e => ({ ...e, created_at: formatTimestamp(e.created_at) })),
59
+ total: filtered.length,
60
+ filters: {
61
+ project,
62
+ learning_type: typeFilter,
63
+ severity: severityFilter,
64
+ since_days: sinceDays,
65
+ since_date: sinceDate ? formatTimestamp(sinceDate) : undefined,
66
+ },
67
+ performance: buildPerformanceData("log", latencyMs, filtered.length, {
68
+ search_mode: "local",
69
+ }),
70
+ };
71
+ }
72
+ catch (error) {
73
+ const latencyMs = timer.stop();
74
+ return {
75
+ entries: [],
76
+ total: 0,
77
+ filters: { project },
78
+ performance: buildPerformanceData("log", latencyMs, 0),
79
+ };
80
+ }
81
+ }
82
+ // PRO/DEV TIER: Direct Supabase REST query
83
+ if (!supabase.isConfigured()) {
84
+ const latencyMs = timer.stop();
85
+ return {
86
+ entries: [],
87
+ total: 0,
88
+ filters: { project },
89
+ performance: buildPerformanceData("log", latencyMs, 0),
90
+ };
91
+ }
92
+ try {
93
+ const queryTimer = new Timer();
94
+ // Build PostgREST filters
95
+ const filters = {
96
+ project,
97
+ };
98
+ if (typeFilter) {
99
+ filters.learning_type = typeFilter;
100
+ }
101
+ if (severityFilter) {
102
+ filters.severity = severityFilter;
103
+ }
104
+ if (sinceDate) {
105
+ filters.created_at = `gte.${sinceDate}`;
106
+ }
107
+ const records = await supabase.directQuery("orchestra_learnings", {
108
+ select: "id,title,learning_type,severity,created_at,source_linear_issue,project,persona_name",
109
+ filters,
110
+ order: "created_at.desc",
111
+ limit,
112
+ });
113
+ const queryLatencyMs = queryTimer.stop();
114
+ const latencyMs = timer.stop();
115
+ const breakdown = {
116
+ scar_search: buildComponentPerformance(queryLatencyMs, "supabase", true, "not_applicable"),
117
+ };
118
+ const perfData = buildPerformanceData("log", latencyMs, records.length, {
119
+ breakdown,
120
+ search_mode: "remote",
121
+ });
122
+ // Record metrics (fire and forget)
123
+ recordMetrics({
124
+ id: metricsId,
125
+ tool_name: "log",
126
+ tables_searched: ["orchestra_learnings"],
127
+ latency_ms: latencyMs,
128
+ result_count: records.length,
129
+ phase_tag: "ad_hoc",
130
+ metadata: { project, limit, typeFilter, severityFilter, sinceDays },
131
+ }).catch(() => { });
132
+ return {
133
+ entries: records.map(e => ({ ...e, created_at: formatTimestamp(e.created_at) })),
134
+ total: records.length,
135
+ filters: {
136
+ project,
137
+ learning_type: typeFilter,
138
+ severity: severityFilter,
139
+ since_days: sinceDays,
140
+ since_date: sinceDate ? formatTimestamp(sinceDate) : undefined,
141
+ },
142
+ performance: perfData,
143
+ };
144
+ }
145
+ catch (error) {
146
+ const message = error instanceof Error ? error.message : String(error);
147
+ console.error("[log] Query failed:", message);
148
+ const latencyMs = timer.stop();
149
+ return {
150
+ entries: [],
151
+ total: 0,
152
+ filters: { project },
153
+ performance: buildPerformanceData("log", latencyMs, 0),
154
+ };
155
+ }
156
+ }
157
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/tools/log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * prepare_context Tool (GitMem v2 Phase 1 — OD-593)
3
+ *
4
+ * Bridge between global memory and agents that can't call recall directly.
5
+ * The lead agent calls this to generate a portable memory payload that
6
+ * gets injected into sub-agent prompts via the Task tool.
7
+ *
8
+ * Three format modes:
9
+ * full — Unlimited, rich markdown (same as recall output)
10
+ * compact — ~500 tokens, severity + title + one-line per scar
11
+ * gate — ~100 tokens, only blocking scars, pass/fail
12
+ *
13
+ * No side effects: no variant assignment, no session state mutation,
14
+ * no surfaced scar tracking.
15
+ *
16
+ * Performance target: <500ms (same pipeline as search)
17
+ */
18
+ import type { Project, PerformanceData } from "../types/index.js";
19
+ export type PrepareContextFormat = "full" | "compact" | "gate";
20
+ export interface PrepareContextParams {
21
+ plan: string;
22
+ format: PrepareContextFormat;
23
+ max_tokens?: number;
24
+ agent_role?: string;
25
+ project?: Project;
26
+ }
27
+ export interface PrepareContextResult {
28
+ memory_payload: string;
29
+ scars_included: number;
30
+ blocking_scars: number;
31
+ format: string;
32
+ token_estimate: number;
33
+ performance: PerformanceData;
34
+ }
35
+ export declare function prepareContext(params: PrepareContextParams): Promise<PrepareContextResult>;
36
+ //# sourceMappingURL=prepare-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-context.d.ts","sourceRoot":"","sources":["../../src/tools/prepare-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH,OAAO,KAAK,EAAE,OAAO,EAAwB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIxF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;CAC9B;AAmUD,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA4G/B"}
@@ -0,0 +1,353 @@
1
+ /**
2
+ * prepare_context Tool (GitMem v2 Phase 1 — OD-593)
3
+ *
4
+ * Bridge between global memory and agents that can't call recall directly.
5
+ * The lead agent calls this to generate a portable memory payload that
6
+ * gets injected into sub-agent prompts via the Task tool.
7
+ *
8
+ * Three format modes:
9
+ * full — Unlimited, rich markdown (same as recall output)
10
+ * compact — ~500 tokens, severity + title + one-line per scar
11
+ * gate — ~100 tokens, only blocking scars, pass/fail
12
+ *
13
+ * No side effects: no variant assignment, no session state mutation,
14
+ * no surfaced scar tracking.
15
+ *
16
+ * Performance target: <500ms (same pipeline as search)
17
+ */
18
+ import * as supabase from "../services/supabase-client.js";
19
+ import { localScarSearch, isLocalSearchReady } from "../services/local-vector-search.js";
20
+ import { hasSupabase } from "../services/tier.js";
21
+ import { getStorage } from "../services/storage.js";
22
+ import { Timer, recordMetrics, buildPerformanceData, buildComponentPerformance, } from "../services/metrics.js";
23
+ import { v4 as uuidv4 } from "uuid";
24
+ // --- Token Estimation ---
25
+ /**
26
+ * Estimate tokens from a string.
27
+ * Rough heuristic: ~4 characters per token for English text.
28
+ */
29
+ function estimateTokens(text) {
30
+ return Math.ceil(text.length / 4);
31
+ }
32
+ // --- Severity Helpers ---
33
+ const SEVERITY_EMOJI = {
34
+ critical: "🔴",
35
+ high: "🟠",
36
+ medium: "🟡",
37
+ low: "🟢",
38
+ };
39
+ const SEVERITY_LABEL = {
40
+ critical: "CRITICAL",
41
+ high: "HIGH",
42
+ medium: "MEDIUM",
43
+ low: "LOW",
44
+ };
45
+ const SEVERITY_ORDER = {
46
+ critical: 0,
47
+ high: 1,
48
+ medium: 2,
49
+ low: 3,
50
+ };
51
+ // --- Formatters ---
52
+ /**
53
+ * Format scars in compact mode.
54
+ * One line per scar: emoji LABEL: Title — first sentence of description.
55
+ * Sorted by severity (critical first). Truncated to token budget.
56
+ */
57
+ function formatCompact(scars, plan, maxTokens) {
58
+ const sorted = [...scars].sort((a, b) => (SEVERITY_ORDER[a.severity] ?? 3) - (SEVERITY_ORDER[b.severity] ?? 3));
59
+ const header = `[INSTITUTIONAL MEMORY — ${sorted.length} scars for: "${plan.slice(0, 60)}"]`;
60
+ const lines = [header];
61
+ let included = 0;
62
+ for (const scar of sorted) {
63
+ const emoji = SEVERITY_EMOJI[scar.severity] || "⚪";
64
+ const label = SEVERITY_LABEL[scar.severity] || "UNKNOWN";
65
+ const firstSentence = scar.description.split(/\.\s/)[0].slice(0, 120);
66
+ const line = `${emoji} ${label}: ${scar.title} — ${firstSentence}`;
67
+ // Check token budget before adding (always include at least one)
68
+ const candidate = [...lines, line].join("\n");
69
+ if (estimateTokens(candidate) > maxTokens && included > 0) {
70
+ break;
71
+ }
72
+ lines.push(line);
73
+ included++;
74
+ }
75
+ return { payload: lines.join("\n"), included };
76
+ }
77
+ /**
78
+ * Format scars in gate mode.
79
+ * Only blocking scars (required_verification.blocking === true).
80
+ * Returns PASS if none found.
81
+ */
82
+ function formatGate(scars) {
83
+ const blockingScars = scars.filter((s) => s.required_verification?.blocking === true);
84
+ if (blockingScars.length === 0) {
85
+ return {
86
+ payload: "[MEMORY GATE: PASS — no blocking scars]",
87
+ blocking: 0,
88
+ };
89
+ }
90
+ const lines = [
91
+ `[MEMORY GATE: ${blockingScars.length} blocking scar${blockingScars.length === 1 ? "" : "s"}]`,
92
+ ];
93
+ for (const scar of blockingScars) {
94
+ const rv = scar.required_verification;
95
+ lines.push(`🚨 BLOCK: ${rv.when}`);
96
+ if (rv.queries && rv.queries.length > 0) {
97
+ for (const query of rv.queries) {
98
+ lines.push(` RUN: ${query}`);
99
+ }
100
+ }
101
+ lines.push(`MUST SHOW: ${rv.must_show}`);
102
+ }
103
+ return { payload: lines.join("\n"), blocking: blockingScars.length };
104
+ }
105
+ /**
106
+ * Format scars in full mode.
107
+ * Rich markdown matching recall's formatResponse output.
108
+ * No token limit.
109
+ */
110
+ function formatFull(scars, plan) {
111
+ if (scars.length === 0) {
112
+ return `[INSTITUTIONAL MEMORY — no relevant scars for: "${plan.slice(0, 100)}"]
113
+
114
+ Proceed with caution — this may be new territory without documented lessons.`;
115
+ }
116
+ const lines = [
117
+ "⚠️ INSTITUTIONAL MEMORY ACTIVATED",
118
+ "",
119
+ `Found ${scars.length} relevant scar${scars.length === 1 ? "" : "s"} for your plan:`,
120
+ "",
121
+ ];
122
+ // Blocking verification requirements first
123
+ const blockingScars = scars.filter((s) => s.required_verification?.blocking);
124
+ if (blockingScars.length > 0) {
125
+ lines.push("═══════════════════════════════════════════════════════════════");
126
+ lines.push("🚨 **VERIFICATION REQUIRED BEFORE PROCEEDING**");
127
+ lines.push("═══════════════════════════════════════════════════════════════");
128
+ lines.push("");
129
+ for (const scar of blockingScars) {
130
+ const rv = scar.required_verification;
131
+ lines.push(`**${scar.title}**`);
132
+ lines.push(`*When:* ${rv.when}`);
133
+ lines.push("");
134
+ lines.push("**YOU MUST RUN:**");
135
+ for (const query of rv.queries) {
136
+ lines.push("```sql");
137
+ lines.push(query);
138
+ lines.push("```");
139
+ }
140
+ lines.push("");
141
+ lines.push(`**MUST SHOW:** ${rv.must_show}`);
142
+ lines.push("");
143
+ }
144
+ lines.push("═══════════════════════════════════════════════════════════════");
145
+ lines.push("");
146
+ }
147
+ for (const scar of scars) {
148
+ const emoji = SEVERITY_EMOJI[scar.severity] || "⚪";
149
+ lines.push(`${emoji} **${scar.title}** (${scar.severity}, score: ${(scar.similarity || 0).toFixed(2)})`);
150
+ lines.push(scar.description);
151
+ if (scar.counter_arguments && scar.counter_arguments.length > 0) {
152
+ lines.push("");
153
+ lines.push("*You might think:*");
154
+ for (const counter of scar.counter_arguments.slice(0, 2)) {
155
+ lines.push(` - ${counter}`);
156
+ }
157
+ }
158
+ if (scar.why_this_matters) {
159
+ lines.push("");
160
+ lines.push(`**Why this matters:** ${scar.why_this_matters}`);
161
+ }
162
+ if (scar.action_protocol && scar.action_protocol.length > 0) {
163
+ lines.push("");
164
+ lines.push("**Action Protocol:**");
165
+ scar.action_protocol.forEach((step, i) => {
166
+ lines.push(` ${i + 1}. ${step}`);
167
+ });
168
+ }
169
+ if (scar.self_check_criteria && scar.self_check_criteria.length > 0) {
170
+ lines.push("");
171
+ lines.push("**Self-Check:**");
172
+ for (const criterion of scar.self_check_criteria) {
173
+ lines.push(` - [ ] ${criterion}`);
174
+ }
175
+ }
176
+ if (scar.source_linear_issue) {
177
+ lines.push(`*Source:* ${scar.source_linear_issue}`);
178
+ }
179
+ lines.push("");
180
+ lines.push("---");
181
+ lines.push("");
182
+ }
183
+ lines.push("**Acknowledge these lessons before proceeding.**");
184
+ return lines.join("\n");
185
+ }
186
+ // --- Build Result Helper ---
187
+ function buildResult(scars, plan, format, maxTokens, timer, metricsId, project, search_mode, searchLatencyMs, network_call, cache_hit, cache_age_ms) {
188
+ let memory_payload;
189
+ let scars_included;
190
+ let blocking_scars;
191
+ switch (format) {
192
+ case "compact": {
193
+ const result = formatCompact(scars, plan, maxTokens);
194
+ memory_payload = result.payload;
195
+ scars_included = result.included;
196
+ blocking_scars = scars.filter((s) => s.required_verification?.blocking).length;
197
+ break;
198
+ }
199
+ case "gate": {
200
+ const result = formatGate(scars);
201
+ memory_payload = result.payload;
202
+ scars_included = result.blocking;
203
+ blocking_scars = result.blocking;
204
+ break;
205
+ }
206
+ case "full":
207
+ default: {
208
+ memory_payload = formatFull(scars, plan);
209
+ scars_included = scars.length;
210
+ blocking_scars = scars.filter((s) => s.required_verification?.blocking).length;
211
+ break;
212
+ }
213
+ }
214
+ const token_estimate = estimateTokens(memory_payload);
215
+ const latencyMs = timer.stop();
216
+ const breakdown = searchLatencyMs !== undefined
217
+ ? {
218
+ scar_search: buildComponentPerformance(searchLatencyMs, search_mode === "local" ? "local_cache" : "supabase", network_call ?? false, (network_call ?? false) ? "miss" : "hit"),
219
+ }
220
+ : undefined;
221
+ const perfData = buildPerformanceData("prepare_context", latencyMs, scars_included, {
222
+ memoriesSurfaced: scars.slice(0, scars_included).map((s) => s.id),
223
+ similarityScores: scars.slice(0, scars_included).map((s) => s.similarity || 0),
224
+ cache_hit: cache_hit ?? false,
225
+ cache_age_ms,
226
+ search_mode,
227
+ breakdown,
228
+ });
229
+ // Fire-and-forget metrics
230
+ recordMetrics({
231
+ id: metricsId,
232
+ tool_name: "prepare_context",
233
+ query_text: `prepare_context:${format}:${plan.slice(0, 80)}`,
234
+ tables_searched: search_mode === "local" ? [] : ["orchestra_learnings"],
235
+ latency_ms: latencyMs,
236
+ result_count: scars_included,
237
+ phase_tag: "recall",
238
+ metadata: {
239
+ tool: "prepare_context",
240
+ project,
241
+ format,
242
+ max_tokens: maxTokens,
243
+ agent_role: undefined, // Reserved for Phase 3
244
+ token_estimate,
245
+ blocking_scars,
246
+ },
247
+ }).catch(() => { });
248
+ return {
249
+ memory_payload,
250
+ scars_included,
251
+ blocking_scars,
252
+ format,
253
+ token_estimate,
254
+ performance: perfData,
255
+ };
256
+ }
257
+ // --- Main Implementation ---
258
+ export async function prepareContext(params) {
259
+ const timer = new Timer();
260
+ const metricsId = uuidv4();
261
+ const plan = params.plan;
262
+ const format = params.format;
263
+ const project = params.project || "orchestra_dev";
264
+ const maxTokens = params.max_tokens || (format === "compact" ? 500 : format === "gate" ? 100 : 10000);
265
+ const matchCount = 5;
266
+ // FREE TIER: local keyword search
267
+ if (!hasSupabase()) {
268
+ try {
269
+ const storage = getStorage();
270
+ const rawResults = await storage.search(plan, matchCount);
271
+ const scars = rawResults.map((r) => ({
272
+ id: r.id,
273
+ title: r.title,
274
+ description: r.description || "",
275
+ severity: r.severity || "medium",
276
+ counter_arguments: r.counter_arguments || [],
277
+ similarity: r.similarity || 0,
278
+ }));
279
+ return buildResult(scars, plan, format, maxTokens, timer, metricsId, project, "local");
280
+ }
281
+ catch (error) {
282
+ const latencyMs = timer.stop();
283
+ return {
284
+ memory_payload: "[INSTITUTIONAL MEMORY — error loading scars]",
285
+ scars_included: 0,
286
+ blocking_scars: 0,
287
+ format,
288
+ token_estimate: 0,
289
+ performance: buildPerformanceData("prepare_context", latencyMs, 0),
290
+ };
291
+ }
292
+ }
293
+ // PRO/DEV TIER: vector search
294
+ if (!supabase.isConfigured()) {
295
+ const latencyMs = timer.stop();
296
+ return {
297
+ memory_payload: "[INSTITUTIONAL MEMORY — not configured]",
298
+ scars_included: 0,
299
+ blocking_scars: 0,
300
+ format,
301
+ token_estimate: 0,
302
+ performance: buildPerformanceData("prepare_context", latencyMs, 0),
303
+ };
304
+ }
305
+ try {
306
+ let rawScars = [];
307
+ let search_mode = "remote";
308
+ let network_call = true;
309
+ let cache_hit = false;
310
+ let cache_age_ms;
311
+ const searchTimer = new Timer();
312
+ if (isLocalSearchReady(project)) {
313
+ search_mode = "local";
314
+ cache_hit = true;
315
+ network_call = false;
316
+ const localResults = await localScarSearch(plan, matchCount, project);
317
+ rawScars = localResults.map((r) => ({
318
+ id: r.id,
319
+ title: r.title,
320
+ description: r.description,
321
+ severity: r.severity,
322
+ counter_arguments: r.counter_arguments,
323
+ similarity: r.similarity,
324
+ why_this_matters: r.why_this_matters,
325
+ action_protocol: r.action_protocol,
326
+ self_check_criteria: r.self_check_criteria,
327
+ }));
328
+ }
329
+ else {
330
+ search_mode = "remote";
331
+ const supabaseResult = await supabase.cachedScarSearch(plan, matchCount, project);
332
+ rawScars = supabaseResult.results;
333
+ cache_hit = supabaseResult.cache_hit;
334
+ cache_age_ms = supabaseResult.cache_age_ms;
335
+ }
336
+ const searchLatencyMs = searchTimer.stop();
337
+ return buildResult(rawScars, plan, format, maxTokens, timer, metricsId, project, search_mode, searchLatencyMs, network_call, cache_hit, cache_age_ms);
338
+ }
339
+ catch (error) {
340
+ const message = error instanceof Error ? error.message : String(error);
341
+ console.error("[prepare_context] Search failed:", message);
342
+ const latencyMs = timer.stop();
343
+ return {
344
+ memory_payload: `[INSTITUTIONAL MEMORY — error: ${message}]`,
345
+ scars_included: 0,
346
+ blocking_scars: 0,
347
+ format,
348
+ token_estimate: 0,
349
+ performance: buildPerformanceData("prepare_context", latencyMs, 0),
350
+ };
351
+ }
352
+ }
353
+ //# sourceMappingURL=prepare-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-context.js","sourceRoot":"","sources":["../../src/tools/prepare-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * promote_suggestion Tool (Phase 5: Implicit Thread Detection)
3
+ *
4
+ * Promotes a suggested thread to an actual open thread.
5
+ * 1. Load suggestions, find by ID
6
+ * 2. Create thread via createThread()
7
+ * 3. Mark suggestion as promoted with promoted_thread_id
8
+ * 4. Save updated suggestions
9
+ *
10
+ * Performance target: <1000ms (thread creation + file write)
11
+ */
12
+ import type { ThreadObject, PerformanceData, Project, ThreadSuggestion } from "../types/index.js";
13
+ export interface PromoteSuggestionParams {
14
+ suggestion_id: string;
15
+ project?: Project;
16
+ }
17
+ export interface PromoteSuggestionResult {
18
+ success: boolean;
19
+ thread?: ThreadObject;
20
+ suggestion?: ThreadSuggestion;
21
+ error?: string;
22
+ performance: PerformanceData;
23
+ }
24
+ export declare function promoteSuggestion(params: PromoteSuggestionParams): Promise<PromoteSuggestionResult>;
25
+ //# sourceMappingURL=promote-suggestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote-suggestion.d.ts","sourceRoot":"","sources":["../../src/tools/promote-suggestion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIlG,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,eAAe,CAAC;CAC9B;AAID,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAoDlC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * promote_suggestion Tool (Phase 5: Implicit Thread Detection)
3
+ *
4
+ * Promotes a suggested thread to an actual open thread.
5
+ * 1. Load suggestions, find by ID
6
+ * 2. Create thread via createThread()
7
+ * 3. Mark suggestion as promoted with promoted_thread_id
8
+ * 4. Save updated suggestions
9
+ *
10
+ * Performance target: <1000ms (thread creation + file write)
11
+ */
12
+ import { loadSuggestions, saveSuggestions, promoteSuggestionById, } from "../services/thread-suggestions.js";
13
+ import { createThread } from "./create-thread.js";
14
+ import { Timer, buildPerformanceData, } from "../services/metrics.js";
15
+ // --- Handler ---
16
+ export async function promoteSuggestion(params) {
17
+ const timer = new Timer();
18
+ if (!params.suggestion_id) {
19
+ const latencyMs = timer.stop();
20
+ return {
21
+ success: false,
22
+ error: "suggestion_id is required",
23
+ performance: buildPerformanceData("promote_suggestion", latencyMs, 0),
24
+ };
25
+ }
26
+ const suggestions = loadSuggestions();
27
+ const target = suggestions.find((s) => s.id === params.suggestion_id && s.status === "pending");
28
+ if (!target) {
29
+ const latencyMs = timer.stop();
30
+ return {
31
+ success: false,
32
+ error: `Pending suggestion not found: "${params.suggestion_id}"`,
33
+ performance: buildPerformanceData("promote_suggestion", latencyMs, 0),
34
+ };
35
+ }
36
+ // Create the thread from the suggestion text
37
+ const threadResult = await createThread({
38
+ text: target.text,
39
+ project: params.project,
40
+ });
41
+ if (!threadResult.success || !threadResult.thread) {
42
+ const latencyMs = timer.stop();
43
+ return {
44
+ success: false,
45
+ error: `Thread creation failed: ${threadResult.error || "unknown"}`,
46
+ performance: buildPerformanceData("promote_suggestion", latencyMs, 0),
47
+ };
48
+ }
49
+ // Mark suggestion as promoted
50
+ promoteSuggestionById(params.suggestion_id, threadResult.thread.id, suggestions);
51
+ saveSuggestions(suggestions);
52
+ const latencyMs = timer.stop();
53
+ return {
54
+ success: true,
55
+ thread: threadResult.thread,
56
+ suggestion: target,
57
+ performance: buildPerformanceData("promote_suggestion", latencyMs, 1),
58
+ };
59
+ }
60
+ //# sourceMappingURL=promote-suggestion.js.map