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 @@
|
|
|
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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"}
|