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,112 @@
1
+ /**
2
+ * GitMem MCP Startup Service
3
+ *
4
+ * Initializes local vector search at server startup.
5
+ * Loads all scars once from Supabase, builds in-memory index.
6
+ * Provides cache management (status, flush, health check).
7
+ *
8
+ * Solves:
9
+ * - Cache consistency (no file-based cache race conditions)
10
+ * - 500-employees-at-8AM (no Supabase contention during session_start)
11
+ * - Cross-container consistency (same data = same results)
12
+ *
13
+ * Issue: OD-473
14
+ */
15
+ import type { Project } from "../types/index.js";
16
+ /**
17
+ * Initialize GitMem MCP server
18
+ *
19
+ * Call this at server startup to pre-load the scar index.
20
+ * Subsequent session_start calls will use the in-memory index.
21
+ */
22
+ export declare function initializeGitMem(project?: Project): Promise<{
23
+ success: boolean;
24
+ scar_count: number;
25
+ elapsed_ms: number;
26
+ search_mode: "local" | "remote";
27
+ error?: string;
28
+ }>;
29
+ /**
30
+ * Ensure GitMem is initialized (idempotent)
31
+ *
32
+ * Safe to call multiple times - only initializes once.
33
+ */
34
+ export declare function ensureInitialized(project?: Project): Promise<void>;
35
+ /**
36
+ * Check if local search is available
37
+ */
38
+ export declare function isLocalSearchAvailable(project?: Project): boolean;
39
+ /**
40
+ * Get initialization status
41
+ */
42
+ export declare function getInitStatus(): {
43
+ complete: boolean;
44
+ search_mode: "local" | "remote";
45
+ orchestra_dev_ready: boolean;
46
+ weekend_warrior_ready: boolean;
47
+ };
48
+ export interface CacheStatus {
49
+ search_mode: "local" | "remote";
50
+ initialized: boolean;
51
+ scar_count: number;
52
+ loaded_at: string | null;
53
+ age_minutes: number;
54
+ ttl_minutes: number;
55
+ is_stale: boolean;
56
+ latest_scar_updated_at: string | null;
57
+ }
58
+ export interface CacheHealth {
59
+ status: "healthy" | "stale" | "out_of_sync" | "unavailable";
60
+ local_scar_count: number;
61
+ remote_scar_count: number;
62
+ local_latest_updated_at: string | null;
63
+ remote_latest_updated_at: string | null;
64
+ needs_refresh: boolean;
65
+ details: string;
66
+ }
67
+ export interface CacheFlushResult {
68
+ success: boolean;
69
+ previous_scar_count: number;
70
+ new_scar_count: number;
71
+ elapsed_ms: number;
72
+ error?: string;
73
+ }
74
+ /**
75
+ * Get cache status for a project
76
+ */
77
+ export declare function getCacheStatus(project?: Project): CacheStatus;
78
+ /**
79
+ * Check cache health against remote Supabase
80
+ */
81
+ export declare function checkCacheHealth(project?: Project): Promise<CacheHealth>;
82
+ /**
83
+ * Flush and reload the cache
84
+ */
85
+ export declare function flushCache(project?: Project): Promise<CacheFlushResult>;
86
+ /**
87
+ * Check if cache needs refresh based on TTL or staleness
88
+ * Returns true if a refresh is recommended
89
+ */
90
+ export declare function shouldRefreshCache(project?: Project): Promise<boolean>;
91
+ /**
92
+ * Auto-refresh cache if stale (call periodically or before critical operations)
93
+ */
94
+ export declare function autoRefreshIfStale(project?: Project): Promise<boolean>;
95
+ /**
96
+ * Start background initialization of local vector search
97
+ *
98
+ * This allows the server to start immediately while scars load in the background.
99
+ * First few queries will use Supabase fallback until cache is ready.
100
+ */
101
+ export declare function startBackgroundInit(project?: Project): void;
102
+ /**
103
+ * Start periodic cache refresh
104
+ *
105
+ * Refreshes the local cache every TTL period to keep it fresh.
106
+ */
107
+ export declare function startPeriodicRefresh(project: Project, intervalMinutes: number): void;
108
+ /**
109
+ * Stop periodic refresh (for cleanup)
110
+ */
111
+ export declare function stopPeriodicRefresh(): void;
112
+ //# sourceMappingURL=startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../../src/services/startup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA2FjD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,OAAyB,GAAG,OAAO,CAAC;IAClF,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CA6DD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,OAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,OAAyB,GAAG,OAAO,CAKlF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC;IAChC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qBAAqB,EAAE,OAAO,CAAC;CAChC,CAQA;AAMD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,OAAyB,GAAG,WAAW,CAwC9E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,OAAyB,GAAG,OAAO,CAAC,WAAW,CAAC,CAgE/F;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,OAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+C9F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,OAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB7F;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,OAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7F;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,OAAyB,GAAG,IAAI,CA2B5E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAsBpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C"}
@@ -0,0 +1,436 @@
1
+ /**
2
+ * GitMem MCP Startup Service
3
+ *
4
+ * Initializes local vector search at server startup.
5
+ * Loads all scars once from Supabase, builds in-memory index.
6
+ * Provides cache management (status, flush, health check).
7
+ *
8
+ * Solves:
9
+ * - Cache consistency (no file-based cache race conditions)
10
+ * - 500-employees-at-8AM (no Supabase contention during session_start)
11
+ * - Cross-container consistency (same data = same results)
12
+ *
13
+ * Issue: OD-473
14
+ */
15
+ import { isConfigured, loadScarsWithEmbeddings } from "./supabase-client.js";
16
+ import { initializeLocalSearch, reinitializeLocalSearch, isLocalSearchReady, getLocalVectorSearch, getCacheMetadata, setCacheTtl, } from "./local-vector-search.js";
17
+ import { getConfig, shouldUseLocalSearch } from "./config.js";
18
+ // Track startup state
19
+ let startupComplete = false;
20
+ let startupPromise = null;
21
+ let backgroundRefreshInterval = null;
22
+ /**
23
+ * Load all learnings with embeddings from Supabase
24
+ *
25
+ * Uses direct Supabase REST API (bypasses ww-mcp) to get embedding vectors.
26
+ * ww-mcp doesn't return embeddings by default to avoid bloated responses.
27
+ *
28
+ * NOTE: Now loads all learning types (scars, patterns, wins, anti-patterns),
29
+ * not just scars. This fixes the issue where ~64 patterns were being ignored.
30
+ */
31
+ async function loadScarsFromSupabase(project) {
32
+ console.error(`[startup] Loading learnings with embeddings from Supabase (direct) for project: ${project}`);
33
+ const startTime = Date.now();
34
+ try {
35
+ // Load directly from Supabase REST API (not ww-mcp) to get embeddings
36
+ const learnings = await loadScarsWithEmbeddings(project, 500);
37
+ const elapsed = Date.now() - startTime;
38
+ console.error(`[startup] Loaded ${learnings.length} learnings in ${elapsed}ms`);
39
+ // Log embedding stats
40
+ const withEmbeddings = learnings.filter((s) => s.embedding && Array.isArray(s.embedding));
41
+ console.error(`[startup] ${withEmbeddings.length}/${learnings.length} learnings have embeddings`);
42
+ // Get latest updated_at for staleness tracking
43
+ const latestUpdatedAt = learnings.length > 0 ? learnings[0].updated_at || null : null;
44
+ return { scars: learnings, latestUpdatedAt };
45
+ }
46
+ catch (error) {
47
+ console.error("[startup] Failed to load learnings:", error);
48
+ return { scars: [], latestUpdatedAt: null };
49
+ }
50
+ }
51
+ /**
52
+ * Get remote learning count and latest updated_at for health check
53
+ *
54
+ * Uses direct Supabase REST API for consistency with loadScarsFromSupabase.
55
+ * NOTE: Now loads all learning types (scars, patterns, wins, anti-patterns).
56
+ */
57
+ async function getRemoteScarStats(project) {
58
+ try {
59
+ // Import directQuery here to avoid circular dependency issues
60
+ const { directQuery } = await import("./supabase-client.js");
61
+ // Quick query to get count and latest timestamp (no embeddings needed)
62
+ const learnings = await directQuery("orchestra_learnings", {
63
+ select: "id,updated_at",
64
+ filters: {
65
+ project,
66
+ learning_type: "in.(scar,pattern,win,anti_pattern)"
67
+ },
68
+ order: "updated_at.desc",
69
+ limit: 500,
70
+ });
71
+ return {
72
+ count: learnings.length,
73
+ latestUpdatedAt: learnings.length > 0 ? learnings[0].updated_at || null : null,
74
+ };
75
+ }
76
+ catch (error) {
77
+ console.error("[startup] Failed to get remote stats:", error);
78
+ return { count: -1, latestUpdatedAt: null };
79
+ }
80
+ }
81
+ /**
82
+ * Initialize GitMem MCP server
83
+ *
84
+ * Call this at server startup to pre-load the scar index.
85
+ * Subsequent session_start calls will use the in-memory index.
86
+ */
87
+ export async function initializeGitMem(project = "orchestra_dev") {
88
+ const startTime = Date.now();
89
+ const config = getConfig();
90
+ // Set TTL from config
91
+ setCacheTtl(config.cacheTtlMinutes, project);
92
+ // If remote mode, skip local initialization
93
+ if (!shouldUseLocalSearch()) {
94
+ console.error("[startup] Remote search mode, skipping local initialization");
95
+ return {
96
+ success: true,
97
+ scar_count: 0,
98
+ elapsed_ms: Date.now() - startTime,
99
+ search_mode: "remote",
100
+ };
101
+ }
102
+ // Check if Supabase is configured
103
+ if (!isConfigured()) {
104
+ console.warn("[startup] Supabase not configured, local search disabled");
105
+ return {
106
+ success: false,
107
+ scar_count: 0,
108
+ elapsed_ms: Date.now() - startTime,
109
+ search_mode: "local",
110
+ error: "Supabase not configured",
111
+ };
112
+ }
113
+ try {
114
+ // Load scars from Supabase
115
+ const { scars, latestUpdatedAt } = await loadScarsFromSupabase(project);
116
+ // Initialize local vector search
117
+ await initializeLocalSearch(scars, project, latestUpdatedAt || undefined);
118
+ const elapsed = Date.now() - startTime;
119
+ const scarCount = getLocalVectorSearch(project).getScarCount();
120
+ console.error(`[startup] GitMem initialized: ${scarCount} scars indexed in ${elapsed}ms`);
121
+ return {
122
+ success: true,
123
+ scar_count: scarCount,
124
+ elapsed_ms: elapsed,
125
+ search_mode: "local",
126
+ };
127
+ }
128
+ catch (error) {
129
+ const elapsed = Date.now() - startTime;
130
+ const errorMsg = error instanceof Error ? error.message : String(error);
131
+ console.error("[startup] GitMem initialization failed:", errorMsg);
132
+ return {
133
+ success: false,
134
+ scar_count: 0,
135
+ elapsed_ms: elapsed,
136
+ search_mode: "local",
137
+ error: errorMsg,
138
+ };
139
+ }
140
+ }
141
+ /**
142
+ * Ensure GitMem is initialized (idempotent)
143
+ *
144
+ * Safe to call multiple times - only initializes once.
145
+ */
146
+ export async function ensureInitialized(project = "orchestra_dev") {
147
+ if (!shouldUseLocalSearch()) {
148
+ return; // Remote mode, nothing to initialize
149
+ }
150
+ if (startupComplete && isLocalSearchReady(project)) {
151
+ return;
152
+ }
153
+ if (startupPromise) {
154
+ return startupPromise;
155
+ }
156
+ startupPromise = (async () => {
157
+ const result = await initializeGitMem(project);
158
+ startupComplete = result.success;
159
+ if (!result.success) {
160
+ console.warn(`[startup] GitMem not fully initialized: ${result.error}`);
161
+ }
162
+ })();
163
+ return startupPromise;
164
+ }
165
+ /**
166
+ * Check if local search is available
167
+ */
168
+ export function isLocalSearchAvailable(project = "orchestra_dev") {
169
+ if (!shouldUseLocalSearch()) {
170
+ return false; // Remote mode
171
+ }
172
+ return isLocalSearchReady(project);
173
+ }
174
+ /**
175
+ * Get initialization status
176
+ */
177
+ export function getInitStatus() {
178
+ const config = getConfig();
179
+ return {
180
+ complete: startupComplete,
181
+ search_mode: config.resolvedSearchMode,
182
+ orchestra_dev_ready: isLocalSearchReady("orchestra_dev"),
183
+ weekend_warrior_ready: isLocalSearchReady("weekend_warrior"),
184
+ };
185
+ }
186
+ /**
187
+ * Get cache status for a project
188
+ */
189
+ export function getCacheStatus(project = "orchestra_dev") {
190
+ const config = getConfig();
191
+ const metadata = getCacheMetadata(project);
192
+ if (config.resolvedSearchMode === "remote") {
193
+ return {
194
+ search_mode: "remote",
195
+ initialized: true,
196
+ scar_count: 0,
197
+ loaded_at: null,
198
+ age_minutes: 0,
199
+ ttl_minutes: config.cacheTtlMinutes,
200
+ is_stale: false,
201
+ latest_scar_updated_at: null,
202
+ };
203
+ }
204
+ if (!metadata) {
205
+ return {
206
+ search_mode: "local",
207
+ initialized: false,
208
+ scar_count: 0,
209
+ loaded_at: null,
210
+ age_minutes: 0,
211
+ ttl_minutes: config.cacheTtlMinutes,
212
+ is_stale: true,
213
+ latest_scar_updated_at: null,
214
+ };
215
+ }
216
+ return {
217
+ search_mode: "local",
218
+ initialized: true,
219
+ scar_count: metadata.scarCount,
220
+ loaded_at: metadata.loadedAt.toISOString(),
221
+ age_minutes: metadata.ageMinutes,
222
+ ttl_minutes: config.cacheTtlMinutes,
223
+ is_stale: metadata.isStale,
224
+ latest_scar_updated_at: metadata.latestUpdatedAt,
225
+ };
226
+ }
227
+ /**
228
+ * Check cache health against remote Supabase
229
+ */
230
+ export async function checkCacheHealth(project = "orchestra_dev") {
231
+ const config = getConfig();
232
+ if (config.resolvedSearchMode === "remote") {
233
+ return {
234
+ status: "healthy",
235
+ local_scar_count: 0,
236
+ remote_scar_count: 0,
237
+ local_latest_updated_at: null,
238
+ remote_latest_updated_at: null,
239
+ needs_refresh: false,
240
+ details: "Remote search mode - no local cache to check",
241
+ };
242
+ }
243
+ const metadata = getCacheMetadata(project);
244
+ if (!metadata) {
245
+ return {
246
+ status: "unavailable",
247
+ local_scar_count: 0,
248
+ remote_scar_count: -1,
249
+ local_latest_updated_at: null,
250
+ remote_latest_updated_at: null,
251
+ needs_refresh: true,
252
+ details: "Local search not initialized",
253
+ };
254
+ }
255
+ // Get remote stats
256
+ const remoteStats = await getRemoteScarStats(project);
257
+ const localCount = metadata.scarCount;
258
+ const remoteCount = remoteStats.count;
259
+ const localLatest = metadata.latestUpdatedAt;
260
+ const remoteLatest = remoteStats.latestUpdatedAt;
261
+ // Determine health status
262
+ let status = "healthy";
263
+ let needsRefresh = false;
264
+ let details = "Cache is current";
265
+ if (metadata.isStale) {
266
+ status = "stale";
267
+ needsRefresh = true;
268
+ details = `Cache age (${metadata.ageMinutes}min) exceeds TTL (${config.cacheTtlMinutes}min)`;
269
+ }
270
+ else if (remoteCount !== localCount) {
271
+ status = "out_of_sync";
272
+ needsRefresh = true;
273
+ details = `Count mismatch: local=${localCount}, remote=${remoteCount}`;
274
+ }
275
+ else if (remoteLatest && localLatest && remoteLatest !== localLatest) {
276
+ status = "out_of_sync";
277
+ needsRefresh = true;
278
+ details = `Timestamp mismatch: local=${localLatest}, remote=${remoteLatest}`;
279
+ }
280
+ return {
281
+ status,
282
+ local_scar_count: localCount,
283
+ remote_scar_count: remoteCount,
284
+ local_latest_updated_at: localLatest,
285
+ remote_latest_updated_at: remoteLatest,
286
+ needs_refresh: needsRefresh,
287
+ details,
288
+ };
289
+ }
290
+ /**
291
+ * Flush and reload the cache
292
+ */
293
+ export async function flushCache(project = "orchestra_dev") {
294
+ const startTime = Date.now();
295
+ const config = getConfig();
296
+ if (config.resolvedSearchMode === "remote") {
297
+ return {
298
+ success: true,
299
+ previous_scar_count: 0,
300
+ new_scar_count: 0,
301
+ elapsed_ms: Date.now() - startTime,
302
+ error: "Remote search mode - no cache to flush",
303
+ };
304
+ }
305
+ const previousCount = getLocalVectorSearch(project).getScarCount();
306
+ try {
307
+ // Load fresh scars
308
+ const { scars, latestUpdatedAt } = await loadScarsFromSupabase(project);
309
+ // Reinitialize the index
310
+ await reinitializeLocalSearch(scars, project, latestUpdatedAt || undefined);
311
+ const newCount = getLocalVectorSearch(project).getScarCount();
312
+ const elapsed = Date.now() - startTime;
313
+ console.error(`[cache] Flushed and reloaded: ${previousCount} → ${newCount} scars in ${elapsed}ms`);
314
+ return {
315
+ success: true,
316
+ previous_scar_count: previousCount,
317
+ new_scar_count: newCount,
318
+ elapsed_ms: elapsed,
319
+ };
320
+ }
321
+ catch (error) {
322
+ const elapsed = Date.now() - startTime;
323
+ const errorMsg = error instanceof Error ? error.message : String(error);
324
+ console.error("[cache] Flush failed:", errorMsg);
325
+ return {
326
+ success: false,
327
+ previous_scar_count: previousCount,
328
+ new_scar_count: previousCount,
329
+ elapsed_ms: elapsed,
330
+ error: errorMsg,
331
+ };
332
+ }
333
+ }
334
+ /**
335
+ * Check if cache needs refresh based on TTL or staleness
336
+ * Returns true if a refresh is recommended
337
+ */
338
+ export async function shouldRefreshCache(project = "orchestra_dev") {
339
+ const config = getConfig();
340
+ if (!config.staleCheckEnabled) {
341
+ return false;
342
+ }
343
+ if (config.resolvedSearchMode === "remote") {
344
+ return false;
345
+ }
346
+ const metadata = getCacheMetadata(project);
347
+ if (!metadata) {
348
+ return true; // Not initialized
349
+ }
350
+ return metadata.isStale;
351
+ }
352
+ /**
353
+ * Auto-refresh cache if stale (call periodically or before critical operations)
354
+ */
355
+ export async function autoRefreshIfStale(project = "orchestra_dev") {
356
+ const needsRefresh = await shouldRefreshCache(project);
357
+ if (needsRefresh) {
358
+ console.error("[cache] Auto-refreshing stale cache...");
359
+ const result = await flushCache(project);
360
+ return result.success;
361
+ }
362
+ return false; // No refresh needed
363
+ }
364
+ // ============================================================================
365
+ // BACKGROUND INITIALIZATION (non-blocking startup)
366
+ // ============================================================================
367
+ /**
368
+ * Start background initialization of local vector search
369
+ *
370
+ * This allows the server to start immediately while scars load in the background.
371
+ * First few queries will use Supabase fallback until cache is ready.
372
+ */
373
+ export function startBackgroundInit(project = "orchestra_dev") {
374
+ const config = getConfig();
375
+ if (!shouldUseLocalSearch()) {
376
+ console.error("[startup] Remote search mode, skipping background init");
377
+ return;
378
+ }
379
+ console.error("[startup] Starting background initialization...");
380
+ // Initialize in background (don't await)
381
+ initializeGitMem(project)
382
+ .then((result) => {
383
+ if (result.success) {
384
+ console.error(`[startup] Background init complete: ${result.scar_count} scars loaded in ${result.elapsed_ms}ms`);
385
+ }
386
+ else {
387
+ console.warn(`[startup] Background init failed: ${result.error}`);
388
+ }
389
+ })
390
+ .catch((error) => {
391
+ console.error("[startup] Background init error:", error);
392
+ });
393
+ // Start periodic refresh if configured
394
+ if (config.staleCheckEnabled && config.cacheTtlMinutes > 0) {
395
+ startPeriodicRefresh(project, config.cacheTtlMinutes);
396
+ }
397
+ }
398
+ /**
399
+ * Start periodic cache refresh
400
+ *
401
+ * Refreshes the local cache every TTL period to keep it fresh.
402
+ */
403
+ export function startPeriodicRefresh(project, intervalMinutes) {
404
+ // Clear any existing interval
405
+ if (backgroundRefreshInterval) {
406
+ clearInterval(backgroundRefreshInterval);
407
+ }
408
+ const intervalMs = intervalMinutes * 60 * 1000;
409
+ console.error(`[startup] Starting periodic refresh every ${intervalMinutes} minutes`);
410
+ backgroundRefreshInterval = setInterval(async () => {
411
+ console.error("[startup] Periodic refresh triggered...");
412
+ try {
413
+ const result = await flushCache(project);
414
+ if (result.success) {
415
+ console.error(`[startup] Periodic refresh complete: ${result.new_scar_count} scars`);
416
+ }
417
+ else {
418
+ console.warn(`[startup] Periodic refresh failed: ${result.error}`);
419
+ }
420
+ }
421
+ catch (error) {
422
+ console.error("[startup] Periodic refresh error:", error);
423
+ }
424
+ }, intervalMs);
425
+ }
426
+ /**
427
+ * Stop periodic refresh (for cleanup)
428
+ */
429
+ export function stopPeriodicRefresh() {
430
+ if (backgroundRefreshInterval) {
431
+ clearInterval(backgroundRefreshInterval);
432
+ backgroundRefreshInterval = null;
433
+ console.error("[startup] Periodic refresh stopped");
434
+ }
435
+ }
436
+ //# sourceMappingURL=startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../../src/services/startup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Unified Storage Abstraction
3
+ *
4
+ * Routes to LocalFileStorage (free tier) or Supabase (pro/dev tier)
5
+ * based on the detected tier. Tools call getStorage() instead of
6
+ * importing supabase-client directly.
7
+ */
8
+ import type { RelevantScar } from "../types/index.js";
9
+ /**
10
+ * Storage backend interface
11
+ */
12
+ export interface StorageBackend {
13
+ /**
14
+ * Query records from a collection
15
+ */
16
+ query<T = unknown>(collection: string, options?: {
17
+ select?: string;
18
+ filters?: Record<string, string>;
19
+ order?: string;
20
+ limit?: number;
21
+ }): Promise<T[]>;
22
+ /**
23
+ * Get a single record by ID
24
+ */
25
+ get<T = unknown>(collection: string, id: string): Promise<T | null>;
26
+ /**
27
+ * Upsert (insert or update) a record
28
+ */
29
+ upsert(collection: string, data: Record<string, unknown>): Promise<unknown>;
30
+ /**
31
+ * Search for relevant scars
32
+ */
33
+ search(query: string, k?: number): Promise<RelevantScar[]>;
34
+ }
35
+ /**
36
+ * Get the storage backend for the current tier
37
+ */
38
+ export declare function getStorage(): StorageBackend;
39
+ /**
40
+ * Reset storage (for testing)
41
+ */
42
+ export declare function resetStorage(): void;
43
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/services/storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,KAAK,CAAC,CAAC,GAAG,OAAO,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEhB;;OAEG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpE;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5E;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CAC5D;AAgGD;;GAEG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAK3C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}