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.
- package/CHANGELOG.md +47 -0
- package/CLAUDE.md.template +65 -0
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/bin/gitmem.js +383 -0
- package/dist/commands/check.d.ts +33 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +492 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/constants/closing-questions.d.ts +40 -0
- package/dist/constants/closing-questions.d.ts.map +1 -0
- package/dist/constants/closing-questions.js +107 -0
- package/dist/constants/closing-questions.js.map +1 -0
- package/dist/diagnostics/anonymizer.d.ts +55 -0
- package/dist/diagnostics/anonymizer.d.ts.map +1 -0
- package/dist/diagnostics/anonymizer.js +191 -0
- package/dist/diagnostics/anonymizer.js.map +1 -0
- package/dist/diagnostics/channels.d.ts +132 -0
- package/dist/diagnostics/channels.d.ts.map +1 -0
- package/dist/diagnostics/channels.js +150 -0
- package/dist/diagnostics/channels.js.map +1 -0
- package/dist/diagnostics/collector.d.ts +183 -0
- package/dist/diagnostics/collector.d.ts.map +1 -0
- package/dist/diagnostics/collector.js +227 -0
- package/dist/diagnostics/collector.js.map +1 -0
- package/dist/diagnostics/index.d.ts +28 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +31 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/absorb-observations.d.ts +63 -0
- package/dist/schemas/absorb-observations.d.ts.map +1 -0
- package/dist/schemas/absorb-observations.js +25 -0
- package/dist/schemas/absorb-observations.js.map +1 -0
- package/dist/schemas/active-sessions.d.ts +71 -0
- package/dist/schemas/active-sessions.d.ts.map +1 -0
- package/dist/schemas/active-sessions.js +19 -0
- package/dist/schemas/active-sessions.js.map +1 -0
- package/dist/schemas/analyze.d.ts +38 -0
- package/dist/schemas/analyze.d.ts.map +1 -0
- package/dist/schemas/analyze.js +30 -0
- package/dist/schemas/analyze.js.map +1 -0
- package/dist/schemas/common.d.ts +55 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +65 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/create-decision.d.ts +48 -0
- package/dist/schemas/create-decision.d.ts.map +1 -0
- package/dist/schemas/create-decision.js +31 -0
- package/dist/schemas/create-decision.js.map +1 -0
- package/dist/schemas/create-learning.d.ts +107 -0
- package/dist/schemas/create-learning.d.ts.map +1 -0
- package/dist/schemas/create-learning.js +64 -0
- package/dist/schemas/create-learning.js.map +1 -0
- package/dist/schemas/get-transcript.d.ts +24 -0
- package/dist/schemas/get-transcript.d.ts.map +1 -0
- package/dist/schemas/get-transcript.js +22 -0
- package/dist/schemas/get-transcript.js.map +1 -0
- package/dist/schemas/index.d.ts +23 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +23 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/log.d.ts +36 -0
- package/dist/schemas/log.d.ts.map +1 -0
- package/dist/schemas/log.js +27 -0
- package/dist/schemas/log.js.map +1 -0
- package/dist/schemas/prepare-context.d.ts +41 -0
- package/dist/schemas/prepare-context.d.ts.map +1 -0
- package/dist/schemas/prepare-context.js +31 -0
- package/dist/schemas/prepare-context.js.map +1 -0
- package/dist/schemas/recall.d.ts +41 -0
- package/dist/schemas/recall.d.ts.map +1 -0
- package/dist/schemas/recall.js +47 -0
- package/dist/schemas/recall.js.map +1 -0
- package/dist/schemas/record-scar-usage-batch.d.ts +82 -0
- package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage-batch.js +25 -0
- package/dist/schemas/record-scar-usage-batch.js.map +1 -0
- package/dist/schemas/record-scar-usage.d.ts +51 -0
- package/dist/schemas/record-scar-usage.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage.js +32 -0
- package/dist/schemas/record-scar-usage.js.map +1 -0
- package/dist/schemas/save-transcript.d.ts +38 -0
- package/dist/schemas/save-transcript.d.ts.map +1 -0
- package/dist/schemas/save-transcript.js +30 -0
- package/dist/schemas/save-transcript.js.map +1 -0
- package/dist/schemas/search.d.ts +36 -0
- package/dist/schemas/search.d.ts.map +1 -0
- package/dist/schemas/search.js +27 -0
- package/dist/schemas/search.js.map +1 -0
- package/dist/schemas/session-close.d.ts +371 -0
- package/dist/schemas/session-close.d.ts.map +1 -0
- package/dist/schemas/session-close.js +95 -0
- package/dist/schemas/session-close.js.map +1 -0
- package/dist/schemas/session-start.d.ts +46 -0
- package/dist/schemas/session-start.d.ts.map +1 -0
- package/dist/schemas/session-start.js +33 -0
- package/dist/schemas/session-start.js.map +1 -0
- package/dist/schemas/thread.d.ts +72 -0
- package/dist/schemas/thread.d.ts.map +1 -0
- package/dist/schemas/thread.js +39 -0
- package/dist/schemas/thread.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +313 -0
- package/dist/server.js.map +1 -0
- package/dist/services/active-sessions.d.ts +66 -0
- package/dist/services/active-sessions.d.ts.map +1 -0
- package/dist/services/active-sessions.js +311 -0
- package/dist/services/active-sessions.js.map +1 -0
- package/dist/services/agent-detection.d.ts +25 -0
- package/dist/services/agent-detection.d.ts.map +1 -0
- package/dist/services/agent-detection.js +93 -0
- package/dist/services/agent-detection.js.map +1 -0
- package/dist/services/analytics.d.ts +201 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +483 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/cache.d.ts +148 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +384 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/cache.test.d.ts +8 -0
- package/dist/services/cache.test.d.ts.map +1 -0
- package/dist/services/cache.test.js +267 -0
- package/dist/services/cache.test.js.map +1 -0
- package/dist/services/compliance-validator.d.ts +30 -0
- package/dist/services/compliance-validator.d.ts.map +1 -0
- package/dist/services/compliance-validator.js +257 -0
- package/dist/services/compliance-validator.js.map +1 -0
- package/dist/services/config.d.ts +48 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +128 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/embedding.d.ts +58 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +243 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/gitmem-dir.d.ts +38 -0
- package/dist/services/gitmem-dir.d.ts.map +1 -0
- package/dist/services/gitmem-dir.js +84 -0
- package/dist/services/gitmem-dir.js.map +1 -0
- package/dist/services/local-file-storage.d.ts +56 -0
- package/dist/services/local-file-storage.d.ts.map +1 -0
- package/dist/services/local-file-storage.js +213 -0
- package/dist/services/local-file-storage.js.map +1 -0
- package/dist/services/local-vector-search.d.ts +137 -0
- package/dist/services/local-vector-search.d.ts.map +1 -0
- package/dist/services/local-vector-search.js +311 -0
- package/dist/services/local-vector-search.js.map +1 -0
- package/dist/services/metrics.d.ts +104 -0
- package/dist/services/metrics.d.ts.map +1 -0
- package/dist/services/metrics.js +264 -0
- package/dist/services/metrics.js.map +1 -0
- package/dist/services/session-state.d.ts +113 -0
- package/dist/services/session-state.d.ts.map +1 -0
- package/dist/services/session-state.js +203 -0
- package/dist/services/session-state.js.map +1 -0
- package/dist/services/startup.d.ts +112 -0
- package/dist/services/startup.d.ts.map +1 -0
- package/dist/services/startup.js +436 -0
- package/dist/services/startup.js.map +1 -0
- package/dist/services/storage.d.ts +43 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +92 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/supabase-client.d.ts +163 -0
- package/dist/services/supabase-client.d.ts.map +1 -0
- package/dist/services/supabase-client.js +510 -0
- package/dist/services/supabase-client.js.map +1 -0
- package/dist/services/thread-dedup.d.ts +44 -0
- package/dist/services/thread-dedup.d.ts.map +1 -0
- package/dist/services/thread-dedup.js +113 -0
- package/dist/services/thread-dedup.js.map +1 -0
- package/dist/services/thread-manager.d.ts +77 -0
- package/dist/services/thread-manager.d.ts.map +1 -0
- package/dist/services/thread-manager.js +250 -0
- package/dist/services/thread-manager.js.map +1 -0
- package/dist/services/thread-suggestions.d.ts +66 -0
- package/dist/services/thread-suggestions.d.ts.map +1 -0
- package/dist/services/thread-suggestions.js +243 -0
- package/dist/services/thread-suggestions.js.map +1 -0
- package/dist/services/thread-supabase.d.ts +111 -0
- package/dist/services/thread-supabase.d.ts.map +1 -0
- package/dist/services/thread-supabase.js +459 -0
- package/dist/services/thread-supabase.js.map +1 -0
- package/dist/services/thread-vitality.d.ts +65 -0
- package/dist/services/thread-vitality.d.ts.map +1 -0
- package/dist/services/thread-vitality.js +143 -0
- package/dist/services/thread-vitality.js.map +1 -0
- package/dist/services/tier.d.ts +52 -0
- package/dist/services/tier.d.ts.map +1 -0
- package/dist/services/tier.js +109 -0
- package/dist/services/tier.js.map +1 -0
- package/dist/services/timezone.d.ts +37 -0
- package/dist/services/timezone.d.ts.map +1 -0
- package/dist/services/timezone.js +147 -0
- package/dist/services/timezone.js.map +1 -0
- package/dist/services/transcript-chunker.d.ts +18 -0
- package/dist/services/transcript-chunker.d.ts.map +1 -0
- package/dist/services/transcript-chunker.js +237 -0
- package/dist/services/transcript-chunker.js.map +1 -0
- package/dist/services/triple-writer.d.ts +128 -0
- package/dist/services/triple-writer.d.ts.map +1 -0
- package/dist/services/triple-writer.js +338 -0
- package/dist/services/triple-writer.js.map +1 -0
- package/dist/services/variant-assignment.d.ts +92 -0
- package/dist/services/variant-assignment.d.ts.map +1 -0
- package/dist/services/variant-assignment.js +196 -0
- package/dist/services/variant-assignment.js.map +1 -0
- package/dist/tools/absorb-observations.d.ts +16 -0
- package/dist/tools/absorb-observations.d.ts.map +1 -0
- package/dist/tools/absorb-observations.js +82 -0
- package/dist/tools/absorb-observations.js.map +1 -0
- package/dist/tools/analyze.d.ts +55 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +139 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/cleanup-threads.d.ts +47 -0
- package/dist/tools/cleanup-threads.d.ts.map +1 -0
- package/dist/tools/cleanup-threads.js +127 -0
- package/dist/tools/cleanup-threads.js.map +1 -0
- package/dist/tools/confirm-scars.d.ts +23 -0
- package/dist/tools/confirm-scars.d.ts.map +1 -0
- package/dist/tools/confirm-scars.js +209 -0
- package/dist/tools/confirm-scars.js.map +1 -0
- package/dist/tools/create-decision.d.ts +15 -0
- package/dist/tools/create-decision.d.ts.map +1 -0
- package/dist/tools/create-decision.js +138 -0
- package/dist/tools/create-decision.js.map +1 -0
- package/dist/tools/create-learning.d.ts +15 -0
- package/dist/tools/create-learning.d.ts.map +1 -0
- package/dist/tools/create-learning.js +226 -0
- package/dist/tools/create-learning.js.map +1 -0
- package/dist/tools/create-thread.d.ts +42 -0
- package/dist/tools/create-thread.d.ts.map +1 -0
- package/dist/tools/create-thread.js +180 -0
- package/dist/tools/create-thread.js.map +1 -0
- package/dist/tools/definitions.d.ts +5013 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +2017 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/dismiss-suggestion.d.ts +20 -0
- package/dist/tools/dismiss-suggestion.d.ts.map +1 -0
- package/dist/tools/dismiss-suggestion.js +40 -0
- package/dist/tools/dismiss-suggestion.js.map +1 -0
- package/dist/tools/get-transcript.d.ts +24 -0
- package/dist/tools/get-transcript.d.ts.map +1 -0
- package/dist/tools/get-transcript.js +52 -0
- package/dist/tools/get-transcript.js.map +1 -0
- package/dist/tools/graph-traverse.d.ts +83 -0
- package/dist/tools/graph-traverse.d.ts.map +1 -0
- package/dist/tools/graph-traverse.js +394 -0
- package/dist/tools/graph-traverse.js.map +1 -0
- package/dist/tools/list-threads.d.ts +15 -0
- package/dist/tools/list-threads.d.ts.map +1 -0
- package/dist/tools/list-threads.js +114 -0
- package/dist/tools/list-threads.js.map +1 -0
- package/dist/tools/log.d.ts +43 -0
- package/dist/tools/log.d.ts.map +1 -0
- package/dist/tools/log.js +157 -0
- package/dist/tools/log.js.map +1 -0
- package/dist/tools/prepare-context.d.ts +36 -0
- package/dist/tools/prepare-context.d.ts.map +1 -0
- package/dist/tools/prepare-context.js +353 -0
- package/dist/tools/prepare-context.js.map +1 -0
- package/dist/tools/promote-suggestion.d.ts +25 -0
- package/dist/tools/promote-suggestion.d.ts.map +1 -0
- package/dist/tools/promote-suggestion.js +60 -0
- package/dist/tools/promote-suggestion.js.map +1 -0
- package/dist/tools/recall.d.ts +77 -0
- package/dist/tools/recall.d.ts.map +1 -0
- package/dist/tools/recall.js +423 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/recall.test.d.ts +5 -0
- package/dist/tools/recall.test.d.ts.map +1 -0
- package/dist/tools/recall.test.js +155 -0
- package/dist/tools/recall.test.js.map +1 -0
- package/dist/tools/record-scar-usage-batch.d.ts +10 -0
- package/dist/tools/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/tools/record-scar-usage-batch.js +153 -0
- package/dist/tools/record-scar-usage-batch.js.map +1 -0
- package/dist/tools/record-scar-usage.d.ts +14 -0
- package/dist/tools/record-scar-usage.d.ts.map +1 -0
- package/dist/tools/record-scar-usage.js +94 -0
- package/dist/tools/record-scar-usage.js.map +1 -0
- package/dist/tools/resolve-thread.d.ts +16 -0
- package/dist/tools/resolve-thread.d.ts.map +1 -0
- package/dist/tools/resolve-thread.js +102 -0
- package/dist/tools/resolve-thread.js.map +1 -0
- package/dist/tools/save-transcript.d.ts +29 -0
- package/dist/tools/save-transcript.d.ts.map +1 -0
- package/dist/tools/save-transcript.js +97 -0
- package/dist/tools/save-transcript.js.map +1 -0
- package/dist/tools/search.d.ts +46 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +186 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/session-close.d.ts +14 -0
- package/dist/tools/session-close.d.ts.map +1 -0
- package/dist/tools/session-close.js +881 -0
- package/dist/tools/session-close.js.map +1 -0
- package/dist/tools/session-start.d.ts +38 -0
- package/dist/tools/session-start.d.ts.map +1 -0
- package/dist/tools/session-start.js +1104 -0
- package/dist/tools/session-start.js.map +1 -0
- package/dist/types/index.d.ts +456 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +76 -0
- package/schema/setup.sql +193 -0
- 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"}
|