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 @@
1
+ {"version":3,"file":"local-file-storage.js","sourceRoot":"","sources":["../../src/services/local-file-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Local Vector Search Service
3
+ *
4
+ * Provides consistent, local semantic search using:
5
+ * - OpenRouter API for query embeddings (same model as ww-mcp)
6
+ * - Pure JavaScript cosine similarity (no native dependencies)
7
+ * - In-memory scar index (loaded once from Supabase)
8
+ *
9
+ * Solves the 500-employees-at-8AM problem:
10
+ * - No Supabase contention (data loaded once at startup)
11
+ * - Deterministic results (same model + same data = same results)
12
+ * - Per-container consistency (each loads same data)
13
+ *
14
+ * Issue: OD-473 (cache consistency)
15
+ */
16
+ import type { Project, RelevantScar } from "../types/index.js";
17
+ interface ScarRecord {
18
+ id: string;
19
+ title: string;
20
+ learning_type?: string;
21
+ description: string;
22
+ severity: string;
23
+ counter_arguments?: string[];
24
+ project?: string;
25
+ embedding?: number[];
26
+ why_this_matters?: string;
27
+ action_protocol?: string[];
28
+ self_check_criteria?: string[];
29
+ }
30
+ /**
31
+ * Cache metadata for staleness detection
32
+ */
33
+ export interface CacheMetadata {
34
+ loadedAt: Date;
35
+ scarCount: number;
36
+ latestUpdatedAt: string | null;
37
+ ageMinutes: number;
38
+ isStale: boolean;
39
+ }
40
+ /**
41
+ * LocalVectorSearch class
42
+ *
43
+ * Manages an in-memory index for fast, consistent scar search.
44
+ * Uses pure JavaScript - no native dependencies.
45
+ */
46
+ export declare class LocalVectorSearch {
47
+ private scars;
48
+ private initialized;
49
+ private initPromise;
50
+ private project;
51
+ private loadedAt;
52
+ private latestUpdatedAt;
53
+ private staleTtlMinutes;
54
+ constructor(project?: Project);
55
+ /**
56
+ * Set cache TTL for staleness detection
57
+ */
58
+ setTtlMinutes(minutes: number): void;
59
+ /**
60
+ * Initialize the search index with scars from Supabase
61
+ */
62
+ initialize(scars: ScarRecord[], latestUpdatedAt?: string): Promise<void>;
63
+ /**
64
+ * Force re-initialization with new scars (for flush/refresh)
65
+ */
66
+ reinitialize(scars: ScarRecord[], latestUpdatedAt?: string): Promise<void>;
67
+ private _doInitialize;
68
+ /**
69
+ * Check if the index is ready for queries
70
+ */
71
+ isReady(): boolean;
72
+ /**
73
+ * Get the number of indexed scars
74
+ */
75
+ getScarCount(): number;
76
+ /**
77
+ * Search for scars similar to the query
78
+ *
79
+ * Returns consistent results: same query = same results every time
80
+ */
81
+ search(query: string, k?: number): Promise<RelevantScar[]>;
82
+ /**
83
+ * Generate embedding for text using the shared embedding service.
84
+ * Supports multiple providers (OpenAI, OpenRouter, Ollama) via auto-detection.
85
+ */
86
+ private _embed;
87
+ /**
88
+ * Clear the index and release memory
89
+ */
90
+ clear(): void;
91
+ /**
92
+ * Get cache metadata for status/health checks
93
+ */
94
+ getCacheMetadata(): CacheMetadata | null;
95
+ /**
96
+ * Get the latest updated_at timestamp from loaded scars
97
+ */
98
+ getLatestUpdatedAt(): string | null;
99
+ }
100
+ /**
101
+ * Get the LocalVectorSearch instance for a project
102
+ */
103
+ export declare function getLocalVectorSearch(project?: Project): LocalVectorSearch;
104
+ /**
105
+ * Initialize local vector search with scars from Supabase
106
+ *
107
+ * Call this once at startup with pre-fetched scars
108
+ */
109
+ export declare function initializeLocalSearch(scars: ScarRecord[], project?: Project, latestUpdatedAt?: string): Promise<void>;
110
+ /**
111
+ * Reinitialize local search (for cache flush/refresh)
112
+ */
113
+ export declare function reinitializeLocalSearch(scars: ScarRecord[], project?: Project, latestUpdatedAt?: string): Promise<void>;
114
+ /**
115
+ * Search for scars using local vector search
116
+ *
117
+ * Falls back to empty results if not initialized
118
+ */
119
+ export declare function localScarSearch(query: string, k?: number, project?: Project): Promise<RelevantScar[]>;
120
+ /**
121
+ * Check if local search is ready
122
+ */
123
+ export declare function isLocalSearchReady(project?: Project): boolean;
124
+ /**
125
+ * Get cache metadata for a project
126
+ */
127
+ export declare function getCacheMetadata(project?: Project): CacheMetadata | null;
128
+ /**
129
+ * Set cache TTL for a project
130
+ */
131
+ export declare function setCacheTtl(minutes: number, project?: Project): void;
132
+ /**
133
+ * Clear the local search index
134
+ */
135
+ export declare function clearLocalSearch(project?: Project): void;
136
+ export {};
137
+ //# sourceMappingURL=local-vector-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-vector-search.d.ts","sourceRoot":"","sources":["../../src/services/local-vector-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Local Vector Search Service
3
+ *
4
+ * Provides consistent, local semantic search using:
5
+ * - OpenRouter API for query embeddings (same model as ww-mcp)
6
+ * - Pure JavaScript cosine similarity (no native dependencies)
7
+ * - In-memory scar index (loaded once from Supabase)
8
+ *
9
+ * Solves the 500-employees-at-8AM problem:
10
+ * - No Supabase contention (data loaded once at startup)
11
+ * - Deterministic results (same model + same data = same results)
12
+ * - Per-container consistency (each loads same data)
13
+ *
14
+ * Issue: OD-473 (cache consistency)
15
+ */
16
+ import { embed as generateEmbedding, getEmbeddingDim, isEmbeddingAvailable } from "./embedding.js";
17
+ // Embedding dimension — read from provider config at runtime
18
+ const getExpectedDim = () => getEmbeddingDim() || 1536;
19
+ /**
20
+ * Compute cosine similarity between two vectors
21
+ * Assumes vectors are already normalized (dot product = cosine similarity)
22
+ */
23
+ function cosineSimilarity(a, b) {
24
+ if (a.length !== b.length)
25
+ return 0;
26
+ let dotProduct = 0;
27
+ for (let i = 0; i < a.length; i++) {
28
+ dotProduct += a[i] * b[i];
29
+ }
30
+ return dotProduct;
31
+ }
32
+ /**
33
+ * Normalize a vector to unit length
34
+ */
35
+ function normalize(vec) {
36
+ let magnitude = 0;
37
+ for (const v of vec) {
38
+ magnitude += v * v;
39
+ }
40
+ magnitude = Math.sqrt(magnitude);
41
+ if (magnitude === 0)
42
+ return vec;
43
+ return vec.map((v) => v / magnitude);
44
+ }
45
+ /**
46
+ * LocalVectorSearch class
47
+ *
48
+ * Manages an in-memory index for fast, consistent scar search.
49
+ * Uses pure JavaScript - no native dependencies.
50
+ */
51
+ export class LocalVectorSearch {
52
+ scars = [];
53
+ initialized = false;
54
+ initPromise = null;
55
+ project;
56
+ // Cache metadata
57
+ loadedAt = null;
58
+ latestUpdatedAt = null;
59
+ staleTtlMinutes = 15;
60
+ constructor(project = "orchestra_dev") {
61
+ this.project = project;
62
+ }
63
+ /**
64
+ * Set cache TTL for staleness detection
65
+ */
66
+ setTtlMinutes(minutes) {
67
+ this.staleTtlMinutes = Math.max(1, minutes);
68
+ }
69
+ /**
70
+ * Initialize the search index with scars from Supabase
71
+ */
72
+ async initialize(scars, latestUpdatedAt) {
73
+ if (this.initialized)
74
+ return;
75
+ if (this.initPromise)
76
+ return this.initPromise;
77
+ this.initPromise = this._doInitialize(scars, latestUpdatedAt);
78
+ return this.initPromise;
79
+ }
80
+ /**
81
+ * Force re-initialization with new scars (for flush/refresh)
82
+ */
83
+ async reinitialize(scars, latestUpdatedAt) {
84
+ this.scars = [];
85
+ this.initialized = false;
86
+ this.initPromise = null;
87
+ this.loadedAt = null;
88
+ this.latestUpdatedAt = null;
89
+ await this.initialize(scars, latestUpdatedAt);
90
+ }
91
+ async _doInitialize(scars, latestUpdatedAt) {
92
+ const startTime = Date.now();
93
+ console.error(`[local-vector] Initializing with ${scars.length} scars...`);
94
+ // Parse and filter scars with valid embeddings
95
+ // Note: Supabase REST API returns embeddings as JSON strings, not arrays
96
+ const scarsWithEmbeddings = [];
97
+ for (const scar of scars) {
98
+ if (!scar.embedding)
99
+ continue;
100
+ // Parse embedding if it's a string (Supabase REST API returns vector as JSON string)
101
+ let embedding;
102
+ if (typeof scar.embedding === 'string') {
103
+ try {
104
+ embedding = JSON.parse(scar.embedding);
105
+ }
106
+ catch {
107
+ console.warn(`[local-vector] Failed to parse embedding for scar ${scar.id}`);
108
+ continue;
109
+ }
110
+ }
111
+ else if (Array.isArray(scar.embedding)) {
112
+ embedding = scar.embedding;
113
+ }
114
+ else {
115
+ continue;
116
+ }
117
+ // Validate embedding dimensions (accept any valid length, store for comparison)
118
+ const expectedDim = getExpectedDim();
119
+ if (embedding.length !== expectedDim && embedding.length !== 1536) {
120
+ console.warn(`[local-vector] Scar ${scar.id} has unexpected embedding dimension: ${embedding.length}`);
121
+ continue;
122
+ }
123
+ scarsWithEmbeddings.push({ scar, parsedEmbedding: embedding });
124
+ }
125
+ if (scarsWithEmbeddings.length === 0) {
126
+ console.warn("[local-vector] No scars with valid embeddings found");
127
+ this.initialized = true;
128
+ this.loadedAt = new Date();
129
+ return;
130
+ }
131
+ console.error(`[local-vector] ${scarsWithEmbeddings.length} scars have valid embeddings`);
132
+ // Store scars with normalized embeddings
133
+ this.scars = scarsWithEmbeddings.map(({ scar, parsedEmbedding }) => ({
134
+ scar,
135
+ embedding: normalize(parsedEmbedding),
136
+ }));
137
+ // Track cache metadata
138
+ this.loadedAt = new Date();
139
+ this.latestUpdatedAt = latestUpdatedAt || null;
140
+ this.initialized = true;
141
+ const elapsed = Date.now() - startTime;
142
+ console.error(`[local-vector] Initialized in ${elapsed}ms`);
143
+ }
144
+ /**
145
+ * Check if the index is ready for queries
146
+ */
147
+ isReady() {
148
+ return this.initialized && this.scars.length > 0;
149
+ }
150
+ /**
151
+ * Get the number of indexed scars
152
+ */
153
+ getScarCount() {
154
+ return this.scars.length;
155
+ }
156
+ /**
157
+ * Search for scars similar to the query
158
+ *
159
+ * Returns consistent results: same query = same results every time
160
+ */
161
+ async search(query, k = 5) {
162
+ if (!this.isReady()) {
163
+ console.warn("[local-vector] Index not ready, returning empty results");
164
+ return [];
165
+ }
166
+ const startTime = Date.now();
167
+ // Generate query embedding locally
168
+ const queryEmbedding = await this._embed(query);
169
+ // Compute similarities to all scars
170
+ const scored = this.scars.map((indexed) => ({
171
+ scar: indexed.scar,
172
+ similarity: cosineSimilarity(queryEmbedding, indexed.embedding),
173
+ }));
174
+ // Sort by similarity (descending) and take top k
175
+ scored.sort((a, b) => b.similarity - a.similarity);
176
+ const topK = scored.slice(0, k);
177
+ // Map to result format
178
+ const results = topK.map(({ scar, similarity }) => ({
179
+ id: scar.id,
180
+ title: scar.title,
181
+ learning_type: scar.learning_type || "scar",
182
+ description: scar.description,
183
+ severity: scar.severity || "medium",
184
+ counter_arguments: scar.counter_arguments || [],
185
+ similarity: Math.round(similarity * 1000) / 1000, // 3 decimal places
186
+ // OD-508: Include enriched fields for LLM-cooperative enforcement
187
+ why_this_matters: scar.why_this_matters,
188
+ action_protocol: scar.action_protocol,
189
+ self_check_criteria: scar.self_check_criteria,
190
+ }));
191
+ const elapsed = Date.now() - startTime;
192
+ console.error(`[local-vector] Search completed in ${elapsed}ms, found ${results.length} results`);
193
+ return results;
194
+ }
195
+ /**
196
+ * Generate embedding for text using the shared embedding service.
197
+ * Supports multiple providers (OpenAI, OpenRouter, Ollama) via auto-detection.
198
+ */
199
+ async _embed(text) {
200
+ if (!isEmbeddingAvailable()) {
201
+ throw new Error("No embedding provider configured (set OPENAI_API_KEY, OPENROUTER_API_KEY, or OLLAMA_URL)");
202
+ }
203
+ const result = await generateEmbedding(text);
204
+ if (!result) {
205
+ throw new Error("Embedding generation returned null");
206
+ }
207
+ // Result is already normalized by the embedding service
208
+ return result;
209
+ }
210
+ /**
211
+ * Clear the index and release memory
212
+ */
213
+ clear() {
214
+ this.scars = [];
215
+ this.initialized = false;
216
+ this.initPromise = null;
217
+ this.loadedAt = null;
218
+ this.latestUpdatedAt = null;
219
+ console.error("[local-vector] Index cleared");
220
+ }
221
+ /**
222
+ * Get cache metadata for status/health checks
223
+ */
224
+ getCacheMetadata() {
225
+ if (!this.loadedAt)
226
+ return null;
227
+ const now = new Date();
228
+ const ageMs = now.getTime() - this.loadedAt.getTime();
229
+ const ageMinutes = Math.floor(ageMs / 60000);
230
+ return {
231
+ loadedAt: this.loadedAt,
232
+ scarCount: this.scars.length,
233
+ latestUpdatedAt: this.latestUpdatedAt,
234
+ ageMinutes,
235
+ isStale: ageMinutes >= this.staleTtlMinutes,
236
+ };
237
+ }
238
+ /**
239
+ * Get the latest updated_at timestamp from loaded scars
240
+ */
241
+ getLatestUpdatedAt() {
242
+ return this.latestUpdatedAt;
243
+ }
244
+ }
245
+ // Singleton instances per project
246
+ const instances = new Map();
247
+ /**
248
+ * Get the LocalVectorSearch instance for a project
249
+ */
250
+ export function getLocalVectorSearch(project = "orchestra_dev") {
251
+ let instance = instances.get(project);
252
+ if (!instance) {
253
+ instance = new LocalVectorSearch(project);
254
+ instances.set(project, instance);
255
+ }
256
+ return instance;
257
+ }
258
+ /**
259
+ * Initialize local vector search with scars from Supabase
260
+ *
261
+ * Call this once at startup with pre-fetched scars
262
+ */
263
+ export async function initializeLocalSearch(scars, project = "orchestra_dev", latestUpdatedAt) {
264
+ const instance = getLocalVectorSearch(project);
265
+ await instance.initialize(scars, latestUpdatedAt);
266
+ }
267
+ /**
268
+ * Reinitialize local search (for cache flush/refresh)
269
+ */
270
+ export async function reinitializeLocalSearch(scars, project = "orchestra_dev", latestUpdatedAt) {
271
+ const instance = getLocalVectorSearch(project);
272
+ await instance.reinitialize(scars, latestUpdatedAt);
273
+ }
274
+ /**
275
+ * Search for scars using local vector search
276
+ *
277
+ * Falls back to empty results if not initialized
278
+ */
279
+ export async function localScarSearch(query, k = 5, project = "orchestra_dev") {
280
+ const instance = getLocalVectorSearch(project);
281
+ return instance.search(query, k);
282
+ }
283
+ /**
284
+ * Check if local search is ready
285
+ */
286
+ export function isLocalSearchReady(project = "orchestra_dev") {
287
+ const instance = instances.get(project);
288
+ return instance?.isReady() ?? false;
289
+ }
290
+ /**
291
+ * Get cache metadata for a project
292
+ */
293
+ export function getCacheMetadata(project = "orchestra_dev") {
294
+ const instance = instances.get(project);
295
+ return instance?.getCacheMetadata() ?? null;
296
+ }
297
+ /**
298
+ * Set cache TTL for a project
299
+ */
300
+ export function setCacheTtl(minutes, project = "orchestra_dev") {
301
+ const instance = getLocalVectorSearch(project);
302
+ instance.setTtlMinutes(minutes);
303
+ }
304
+ /**
305
+ * Clear the local search index
306
+ */
307
+ export function clearLocalSearch(project = "orchestra_dev") {
308
+ const instance = instances.get(project);
309
+ instance?.clear();
310
+ }
311
+ //# sourceMappingURL=local-vector-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-vector-search.js","sourceRoot":"","sources":["../../src/services/local-vector-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * GitMem Performance Metrics Service
3
+ *
4
+ * Tracks latency, result counts, and relevance signals for all GitMem tools.
5
+ * Implements OD-429 instrumentation layer.
6
+ */
7
+ /**
8
+ * Tool names that can be tracked
9
+ */
10
+ export type ToolName = "recall" | "search" | "log" | "session_start" | "session_refresh" | "session_close" | "create_learning" | "create_decision" | "record_scar_usage" | "record_scar_usage_batch" | "save_transcript" | "get_transcript" | "analyze" | "graph_traverse" | "prepare_context" | "absorb_observations" | "list_threads" | "resolve_thread" | "create_thread" | "confirm_scars" | "cleanup_threads";
11
+ /**
12
+ * Phase tags for context
13
+ */
14
+ export type PhaseTag = "session_start" | "session_refresh" | "session_close" | "recall" | "learning_capture" | "decision_capture" | "scar_tracking" | "ad_hoc";
15
+ /**
16
+ * Agent identities
17
+ */
18
+ export type AgentIdentity = "CLI" | "DAC" | "CODA-1" | "Brain_Local" | "Brain_Cloud";
19
+ /**
20
+ * Metrics data for a query
21
+ */
22
+ export interface QueryMetrics {
23
+ id: string;
24
+ session_id?: string;
25
+ agent?: AgentIdentity;
26
+ tool_name: ToolName;
27
+ query_text?: string;
28
+ tables_searched?: string[];
29
+ latency_ms: number;
30
+ result_count: number;
31
+ similarity_scores?: number[];
32
+ context_bytes?: number;
33
+ phase_tag?: PhaseTag;
34
+ linear_issue?: string;
35
+ memories_surfaced?: string[];
36
+ metadata?: Record<string, unknown>;
37
+ }
38
+ /**
39
+ * Performance targets from OD-429
40
+ */
41
+ export declare const PERFORMANCE_TARGETS: Record<ToolName, number>;
42
+ /**
43
+ * Timer utility for tracking operation duration
44
+ */
45
+ export declare class Timer {
46
+ private startTime;
47
+ private endTime?;
48
+ constructor();
49
+ stop(): number;
50
+ elapsed(): number;
51
+ }
52
+ /**
53
+ * Track a query and record metrics
54
+ */
55
+ export declare function recordMetrics(metrics: QueryMetrics): Promise<void>;
56
+ /**
57
+ * Re-export performance types from types/index.ts
58
+ * OD-489: Enhanced instrumentation for test harness validation
59
+ */
60
+ export type { PerformanceData, PerformanceBreakdown, ComponentPerformance, DataSource, CacheStatus, } from "../types/index.js";
61
+ import type { PerformanceData, PerformanceBreakdown, ComponentPerformance, DataSource, CacheStatus } from "../types/index.js";
62
+ /**
63
+ * Build component performance data (OD-489)
64
+ */
65
+ export declare function buildComponentPerformance(latencyMs: number, source: DataSource, networkCall: boolean, cacheStatus?: CacheStatus): ComponentPerformance;
66
+ /**
67
+ * Count network calls from breakdown (OD-489)
68
+ */
69
+ export declare function countNetworkCalls(breakdown?: PerformanceBreakdown): number;
70
+ export declare function buildPerformanceData(toolName: ToolName, latencyMs: number, resultCount: number, options?: {
71
+ memoriesSurfaced?: string[];
72
+ similarityScores?: number[];
73
+ cache_hit?: boolean;
74
+ cache_age_ms?: number;
75
+ search_mode?: "local" | "remote";
76
+ breakdown?: PerformanceBreakdown;
77
+ }): PerformanceData;
78
+ /**
79
+ * Calculate response size in bytes (approximate)
80
+ */
81
+ export declare function calculateContextBytes(data: unknown): number;
82
+ /**
83
+ * Wrap an async operation with timing and metrics
84
+ */
85
+ export declare function withMetrics<T>(toolName: ToolName, operation: () => Promise<T>, options?: {
86
+ sessionId?: string;
87
+ agent?: AgentIdentity;
88
+ queryText?: string;
89
+ tablesSearched?: string[];
90
+ phaseTag?: PhaseTag;
91
+ linearIssue?: string;
92
+ }): Promise<{
93
+ result: T;
94
+ metrics: QueryMetrics;
95
+ }>;
96
+ /**
97
+ * Update metrics with relevance data (called at session close)
98
+ */
99
+ export declare function updateRelevanceData(sessionId: string, memoriesApplied: string[]): Promise<void>;
100
+ /**
101
+ * Detect re-query pattern (similar query with different terms)
102
+ */
103
+ export declare function detectRequery(sessionId: string, currentQuery: string, toolName: ToolName): Promise<boolean>;
104
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/services/metrics.ts"],"names":[],"mappings":"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"}