gitmem-mcp 1.0.3 → 1.0.5
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 +14 -14
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/check.js +4 -3
- package/dist/diagnostics/anonymizer.d.ts +1 -1
- package/dist/diagnostics/anonymizer.js +1 -1
- package/dist/diagnostics/channels.d.ts +1 -1
- package/dist/diagnostics/channels.js +1 -1
- package/dist/diagnostics/collector.d.ts +1 -1
- package/dist/diagnostics/collector.js +1 -1
- package/dist/diagnostics/index.d.ts +1 -1
- package/dist/diagnostics/index.js +1 -1
- package/dist/hooks/quick-retrieve.js +2 -1
- package/dist/index.js +0 -0
- package/dist/schemas/active-sessions.d.ts +9 -9
- package/dist/schemas/active-sessions.js +1 -1
- package/dist/schemas/common.d.ts +2 -5
- package/dist/schemas/common.js +13 -7
- package/dist/schemas/create-learning.js +1 -1
- package/dist/schemas/session-close.d.ts +5 -8
- package/dist/schemas/session-close.js +7 -3
- package/dist/schemas/session-start.d.ts +4 -4
- package/dist/schemas/session-start.js +1 -1
- package/dist/schemas/thread.d.ts +1 -1
- package/dist/schemas/thread.js +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +21 -10
- package/dist/services/active-sessions.js +3 -2
- package/dist/services/agent-briefing.d.ts +1 -1
- package/dist/services/agent-briefing.js +1 -1
- package/dist/services/agent-detection.d.ts +1 -0
- package/dist/services/agent-detection.js +21 -12
- package/dist/services/analytics.d.ts +1 -1
- package/dist/services/analytics.js +3 -3
- package/dist/services/behavioral-decay.js +2 -2
- package/dist/services/cache.d.ts +1 -1
- package/dist/services/cache.js +1 -1
- package/dist/services/compliance-validator.d.ts +1 -1
- package/dist/services/compliance-validator.js +5 -5
- package/dist/services/config.d.ts +1 -1
- package/dist/services/config.js +1 -1
- package/dist/services/file-lock.js +12 -0
- package/dist/services/gitmem-dir.d.ts +17 -4
- package/dist/services/gitmem-dir.js +43 -9
- package/dist/services/local-file-storage.d.ts +1 -1
- package/dist/services/local-file-storage.js +4 -3
- package/dist/services/local-vector-search.d.ts +1 -1
- package/dist/services/local-vector-search.js +2 -2
- package/dist/services/metrics.d.ts +6 -6
- package/dist/services/metrics.js +8 -8
- package/dist/services/session-state.d.ts +7 -7
- package/dist/services/session-state.js +19 -7
- package/dist/services/startup.d.ts +1 -1
- package/dist/services/startup.js +3 -2
- package/dist/services/supabase-client.d.ts +17 -6
- package/dist/services/supabase-client.js +44 -8
- package/dist/services/thread-manager.d.ts +1 -1
- package/dist/services/thread-manager.js +5 -5
- package/dist/services/thread-supabase.d.ts +1 -1
- package/dist/services/thread-supabase.js +2 -2
- package/dist/services/transcript-chunker.d.ts +1 -1
- package/dist/services/transcript-chunker.js +1 -1
- package/dist/services/variant-assignment.d.ts +6 -6
- package/dist/services/variant-assignment.js +9 -8
- package/dist/tools/analyze.d.ts +2 -2
- package/dist/tools/analyze.js +2 -2
- package/dist/tools/archive-learning.js +36 -22
- package/dist/tools/confirm-scars.js +1 -1
- package/dist/tools/create-decision.d.ts +1 -1
- package/dist/tools/create-decision.js +2 -2
- package/dist/tools/create-learning.d.ts +1 -1
- package/dist/tools/create-learning.js +4 -4
- package/dist/tools/create-linear-issue.d.ts +18 -0
- package/dist/tools/create-linear-issue.js +197 -0
- package/dist/tools/create-thread.d.ts +1 -1
- package/dist/tools/create-thread.js +2 -2
- package/dist/tools/definitions.js +50 -48
- package/dist/tools/get-transcript.d.ts +1 -1
- package/dist/tools/get-transcript.js +1 -1
- package/dist/tools/graph-traverse.d.ts +1 -1
- package/dist/tools/graph-traverse.js +18 -16
- package/dist/tools/list-threads.d.ts +2 -2
- package/dist/tools/list-threads.js +4 -4
- package/dist/tools/log.d.ts +1 -1
- package/dist/tools/log.js +1 -1
- package/dist/tools/prepare-context.d.ts +1 -1
- package/dist/tools/prepare-context.js +1 -1
- package/dist/tools/recall.d.ts +4 -4
- package/dist/tools/recall.js +25 -25
- package/dist/tools/record-scar-usage-batch.js +2 -2
- package/dist/tools/record-scar-usage.d.ts +1 -1
- package/dist/tools/record-scar-usage.js +3 -3
- package/dist/tools/resolve-thread.d.ts +2 -2
- package/dist/tools/resolve-thread.js +3 -3
- package/dist/tools/save-transcript.d.ts +1 -1
- package/dist/tools/save-transcript.js +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.js +1 -1
- package/dist/tools/session-close.d.ts +1 -1
- package/dist/tools/session-close.js +31 -31
- package/dist/tools/session-start.d.ts +5 -5
- package/dist/tools/session-start.js +63 -61
- package/dist/types/index.d.ts +13 -13
- package/hooks/.claude-plugin/plugin.json +1 -1
- package/hooks/scripts/post-tool-use.sh +1 -1
- package/hooks/scripts/recall-check.sh +1 -1
- package/hooks/scripts/session-close-check.sh +1 -1
- package/hooks/scripts/session-start.sh +1 -1
- package/package.json +6 -3
- package/dist/commands/check.d.ts.map +0 -1
- package/dist/commands/check.js.map +0 -1
- package/dist/constants/closing-questions.d.ts.map +0 -1
- package/dist/constants/closing-questions.js.map +0 -1
- package/dist/diagnostics/anonymizer.d.ts.map +0 -1
- package/dist/diagnostics/anonymizer.js.map +0 -1
- package/dist/diagnostics/channels.d.ts.map +0 -1
- package/dist/diagnostics/channels.js.map +0 -1
- package/dist/diagnostics/collector.d.ts.map +0 -1
- package/dist/diagnostics/collector.js.map +0 -1
- package/dist/diagnostics/index.d.ts.map +0 -1
- package/dist/diagnostics/index.js.map +0 -1
- package/dist/hooks/format-utils.d.ts.map +0 -1
- package/dist/hooks/format-utils.js.map +0 -1
- package/dist/hooks/quick-retrieve.d.ts.map +0 -1
- package/dist/hooks/quick-retrieve.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/schemas/absorb-observations.d.ts.map +0 -1
- package/dist/schemas/absorb-observations.js.map +0 -1
- package/dist/schemas/active-sessions.d.ts.map +0 -1
- package/dist/schemas/active-sessions.js.map +0 -1
- package/dist/schemas/analyze.d.ts.map +0 -1
- package/dist/schemas/analyze.js.map +0 -1
- package/dist/schemas/common.d.ts.map +0 -1
- package/dist/schemas/common.js.map +0 -1
- package/dist/schemas/create-decision.d.ts.map +0 -1
- package/dist/schemas/create-decision.js.map +0 -1
- package/dist/schemas/create-learning.d.ts.map +0 -1
- package/dist/schemas/create-learning.js.map +0 -1
- package/dist/schemas/get-transcript.d.ts.map +0 -1
- package/dist/schemas/get-transcript.js.map +0 -1
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/log.d.ts.map +0 -1
- package/dist/schemas/log.js.map +0 -1
- package/dist/schemas/prepare-context.d.ts.map +0 -1
- package/dist/schemas/prepare-context.js.map +0 -1
- package/dist/schemas/recall.d.ts.map +0 -1
- package/dist/schemas/recall.js.map +0 -1
- package/dist/schemas/record-scar-usage-batch.d.ts.map +0 -1
- package/dist/schemas/record-scar-usage-batch.js.map +0 -1
- package/dist/schemas/record-scar-usage.d.ts.map +0 -1
- package/dist/schemas/record-scar-usage.js.map +0 -1
- package/dist/schemas/registry.d.ts.map +0 -1
- package/dist/schemas/registry.js.map +0 -1
- package/dist/schemas/save-transcript.d.ts.map +0 -1
- package/dist/schemas/save-transcript.js.map +0 -1
- package/dist/schemas/search-transcripts.d.ts.map +0 -1
- package/dist/schemas/search-transcripts.js.map +0 -1
- package/dist/schemas/search.d.ts.map +0 -1
- package/dist/schemas/search.js.map +0 -1
- package/dist/schemas/session-close.d.ts.map +0 -1
- package/dist/schemas/session-close.js.map +0 -1
- package/dist/schemas/session-start.d.ts.map +0 -1
- package/dist/schemas/session-start.js.map +0 -1
- package/dist/schemas/thread.d.ts.map +0 -1
- package/dist/schemas/thread.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/services/active-sessions.d.ts.map +0 -1
- package/dist/services/active-sessions.js.map +0 -1
- package/dist/services/agent-briefing.d.ts.map +0 -1
- package/dist/services/agent-briefing.js.map +0 -1
- package/dist/services/agent-detection.d.ts.map +0 -1
- package/dist/services/agent-detection.js.map +0 -1
- package/dist/services/analytics.d.ts.map +0 -1
- package/dist/services/analytics.js.map +0 -1
- package/dist/services/behavioral-decay.d.ts.map +0 -1
- package/dist/services/behavioral-decay.js.map +0 -1
- package/dist/services/bm25.d.ts.map +0 -1
- package/dist/services/bm25.js.map +0 -1
- package/dist/services/cache.d.ts.map +0 -1
- package/dist/services/cache.js.map +0 -1
- package/dist/services/cache.test.d.ts +0 -8
- package/dist/services/cache.test.d.ts.map +0 -1
- package/dist/services/cache.test.js +0 -267
- package/dist/services/cache.test.js.map +0 -1
- package/dist/services/compliance-validator.d.ts.map +0 -1
- package/dist/services/compliance-validator.js.map +0 -1
- package/dist/services/config.d.ts.map +0 -1
- package/dist/services/config.js.map +0 -1
- package/dist/services/display-protocol.d.ts.map +0 -1
- package/dist/services/display-protocol.js.map +0 -1
- package/dist/services/effect-tracker.d.ts.map +0 -1
- package/dist/services/effect-tracker.js.map +0 -1
- package/dist/services/embedding.d.ts.map +0 -1
- package/dist/services/embedding.js.map +0 -1
- package/dist/services/file-lock.d.ts.map +0 -1
- package/dist/services/file-lock.js.map +0 -1
- package/dist/services/gitmem-dir.d.ts.map +0 -1
- package/dist/services/gitmem-dir.js.map +0 -1
- package/dist/services/local-file-storage.d.ts.map +0 -1
- package/dist/services/local-file-storage.js.map +0 -1
- package/dist/services/local-vector-search.d.ts.map +0 -1
- package/dist/services/local-vector-search.js.map +0 -1
- package/dist/services/metrics.d.ts.map +0 -1
- package/dist/services/metrics.js.map +0 -1
- package/dist/services/session-state.d.ts.map +0 -1
- package/dist/services/session-state.js.map +0 -1
- package/dist/services/startup.d.ts.map +0 -1
- package/dist/services/startup.js.map +0 -1
- package/dist/services/storage.d.ts.map +0 -1
- package/dist/services/storage.js.map +0 -1
- package/dist/services/supabase-client.d.ts.map +0 -1
- package/dist/services/supabase-client.js.map +0 -1
- package/dist/services/thread-dedup.d.ts.map +0 -1
- package/dist/services/thread-dedup.js.map +0 -1
- package/dist/services/thread-manager.d.ts.map +0 -1
- package/dist/services/thread-manager.js.map +0 -1
- package/dist/services/thread-suggestions.d.ts.map +0 -1
- package/dist/services/thread-suggestions.js.map +0 -1
- package/dist/services/thread-supabase.d.ts.map +0 -1
- package/dist/services/thread-supabase.js.map +0 -1
- package/dist/services/thread-vitality.d.ts.map +0 -1
- package/dist/services/thread-vitality.js.map +0 -1
- package/dist/services/tier.d.ts.map +0 -1
- package/dist/services/tier.js.map +0 -1
- package/dist/services/timezone.d.ts.map +0 -1
- package/dist/services/timezone.js.map +0 -1
- package/dist/services/transcript-chunker.d.ts.map +0 -1
- package/dist/services/transcript-chunker.js.map +0 -1
- package/dist/services/triple-writer.d.ts.map +0 -1
- package/dist/services/triple-writer.js.map +0 -1
- package/dist/services/variant-assignment.d.ts.map +0 -1
- package/dist/services/variant-assignment.js.map +0 -1
- package/dist/services/variant-generation.d.ts.map +0 -1
- package/dist/services/variant-generation.js.map +0 -1
- package/dist/tools/absorb-observations.d.ts.map +0 -1
- package/dist/tools/absorb-observations.js.map +0 -1
- package/dist/tools/analyze.d.ts.map +0 -1
- package/dist/tools/analyze.js.map +0 -1
- package/dist/tools/archive-learning.d.ts.map +0 -1
- package/dist/tools/archive-learning.js.map +0 -1
- package/dist/tools/cleanup-threads.d.ts.map +0 -1
- package/dist/tools/cleanup-threads.js.map +0 -1
- package/dist/tools/confirm-scars.d.ts.map +0 -1
- package/dist/tools/confirm-scars.js.map +0 -1
- package/dist/tools/create-decision.d.ts.map +0 -1
- package/dist/tools/create-decision.js.map +0 -1
- package/dist/tools/create-learning.d.ts.map +0 -1
- package/dist/tools/create-learning.js.map +0 -1
- package/dist/tools/create-thread.d.ts.map +0 -1
- package/dist/tools/create-thread.js.map +0 -1
- package/dist/tools/definitions.d.ts.map +0 -1
- package/dist/tools/definitions.js.map +0 -1
- package/dist/tools/dismiss-suggestion.d.ts.map +0 -1
- package/dist/tools/dismiss-suggestion.js.map +0 -1
- package/dist/tools/get-transcript.d.ts.map +0 -1
- package/dist/tools/get-transcript.js.map +0 -1
- package/dist/tools/graph-traverse.d.ts.map +0 -1
- package/dist/tools/graph-traverse.js.map +0 -1
- package/dist/tools/list-threads.d.ts.map +0 -1
- package/dist/tools/list-threads.js.map +0 -1
- package/dist/tools/log.d.ts.map +0 -1
- package/dist/tools/log.js.map +0 -1
- package/dist/tools/prepare-context.d.ts.map +0 -1
- package/dist/tools/prepare-context.js.map +0 -1
- package/dist/tools/promote-suggestion.d.ts.map +0 -1
- package/dist/tools/promote-suggestion.js.map +0 -1
- package/dist/tools/recall.d.ts.map +0 -1
- package/dist/tools/recall.js.map +0 -1
- package/dist/tools/recall.test.d.ts +0 -5
- package/dist/tools/recall.test.d.ts.map +0 -1
- package/dist/tools/recall.test.js +0 -155
- package/dist/tools/recall.test.js.map +0 -1
- package/dist/tools/record-scar-usage-batch.d.ts.map +0 -1
- package/dist/tools/record-scar-usage-batch.js.map +0 -1
- package/dist/tools/record-scar-usage.d.ts.map +0 -1
- package/dist/tools/record-scar-usage.js.map +0 -1
- package/dist/tools/resolve-thread.d.ts.map +0 -1
- package/dist/tools/resolve-thread.js.map +0 -1
- package/dist/tools/save-transcript.d.ts.map +0 -1
- package/dist/tools/save-transcript.js.map +0 -1
- package/dist/tools/search-transcripts.d.ts.map +0 -1
- package/dist/tools/search-transcripts.js.map +0 -1
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/session-close.d.ts.map +0 -1
- package/dist/tools/session-close.js.map +0 -1
- package/dist/tools/session-start.d.ts.map +0 -1
- package/dist/tools/session-start.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/hooks/tests/test-hooks.sh +0 -577
|
@@ -17,29 +17,31 @@ import { Timer, buildPerformanceData, } from "../services/metrics.js";
|
|
|
17
17
|
import { wrapDisplay } from "../services/display-protocol.js";
|
|
18
18
|
// --- Constants ---
|
|
19
19
|
const SELECT_COLS = "id,subject,predicate,object,event_time,decay_weight,source_type,source_id,source_linear_issue,created_by";
|
|
20
|
-
const KNOWN_AGENTS = ["CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud"];
|
|
20
|
+
const KNOWN_AGENTS = ["cli", "desktop", "autonomous", "local", "cloud", "CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud"];
|
|
21
21
|
/** Persona names are resolved dynamically via triple-writer's normalizePersonaLabel */
|
|
22
22
|
const KNOWN_PERSONAS = [];
|
|
23
23
|
function normalizeNode(input) {
|
|
24
24
|
const trimmed = input.trim();
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
// Sanitize: strip PostgREST structural chars that could escape ilike/or expressions
|
|
26
|
+
const safe = trimmed.replace(/[(),\0]/g, "");
|
|
27
|
+
// Already prefixed: "Scar: Title", "Issue: PROJ-123", etc.
|
|
28
|
+
if (/^(Scar|Win|Decision|Pattern|Anti-Pattern|Issue|Agent|Persona|Thread):/.test(safe)) {
|
|
29
|
+
return { pattern: `*${safe}*`, type: safe.split(":")[0] };
|
|
28
30
|
}
|
|
29
|
-
//
|
|
30
|
-
if (/^
|
|
31
|
-
return { pattern: `*${
|
|
31
|
+
// Issue identifier pattern (e.g., PROJ-123, ENG-456)
|
|
32
|
+
if (/^[A-Z]+-\d+$/i.test(safe)) {
|
|
33
|
+
return { pattern: `*${safe.toUpperCase()}*`, type: "Issue" };
|
|
32
34
|
}
|
|
33
35
|
// Known agent names
|
|
34
|
-
if (KNOWN_AGENTS.includes(
|
|
35
|
-
return { pattern: `*Agent: ${
|
|
36
|
+
if (KNOWN_AGENTS.includes(safe)) {
|
|
37
|
+
return { pattern: `*Agent: ${safe}*`, type: "Agent" };
|
|
36
38
|
}
|
|
37
39
|
// Known persona names
|
|
38
|
-
if (KNOWN_PERSONAS.includes(
|
|
39
|
-
return { pattern: `*Persona: ${
|
|
40
|
+
if (KNOWN_PERSONAS.includes(safe)) {
|
|
41
|
+
return { pattern: `*Persona: ${safe}*`, type: "Persona" };
|
|
40
42
|
}
|
|
41
43
|
// Fallback: fuzzy search
|
|
42
|
-
return { pattern: `*${
|
|
44
|
+
return { pattern: `*${safe}*`, type: "Unknown" };
|
|
43
45
|
}
|
|
44
46
|
/** Detect the type label from a subject/object string */
|
|
45
47
|
function detectNodeType(label) {
|
|
@@ -283,13 +285,13 @@ async function stats(params, timer) {
|
|
|
283
285
|
for (const t of allTriples) {
|
|
284
286
|
objectCounts[t.object] = (objectCounts[t.object] || 0) + 1;
|
|
285
287
|
}
|
|
286
|
-
// Issues by learning count (objects matching "Issue:
|
|
288
|
+
// Issues by learning count (objects matching "Issue: *")
|
|
287
289
|
const issueCounts = {};
|
|
288
290
|
for (const t of allTriples) {
|
|
289
|
-
if (t.object.startsWith("Issue:
|
|
291
|
+
if (t.object.startsWith("Issue: ")) {
|
|
290
292
|
issueCounts[t.object] = (issueCounts[t.object] || 0) + 1;
|
|
291
293
|
}
|
|
292
|
-
if (t.subject.startsWith("Issue:
|
|
294
|
+
if (t.subject.startsWith("Issue: ")) {
|
|
293
295
|
issueCounts[t.subject] = (issueCounts[t.subject] || 0) + 1;
|
|
294
296
|
}
|
|
295
297
|
}
|
|
@@ -359,7 +361,7 @@ export async function graphTraverse(params) {
|
|
|
359
361
|
}
|
|
360
362
|
// Validate: node required for all lenses except stats
|
|
361
363
|
if (lens !== "stats" && !params.node) {
|
|
362
|
-
const missingNodeMsg = `The '${lens}' lens requires a 'node' parameter (e.g., "
|
|
364
|
+
const missingNodeMsg = `The '${lens}' lens requires a 'node' parameter (e.g., "PROJ-123", "cli", "Scar: Done ≠ Deployed")`;
|
|
363
365
|
return {
|
|
364
366
|
success: false,
|
|
365
367
|
lens,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* list_threads Tool
|
|
2
|
+
* list_threads Tool
|
|
3
3
|
*
|
|
4
4
|
* List open threads across recent sessions. Shows unresolved work items
|
|
5
5
|
* that carry over between sessions, with IDs for resolution.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Primary read from Supabase (source of truth).
|
|
8
8
|
* Falls back to session-based aggregation (same as session_start),
|
|
9
9
|
* then in-memory session state, then .gitmem/threads.json.
|
|
10
10
|
*
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* list_threads Tool
|
|
2
|
+
* list_threads Tool
|
|
3
3
|
*
|
|
4
4
|
* List open threads across recent sessions. Shows unresolved work items
|
|
5
5
|
* that carry over between sessions, with IDs for resolution.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Primary read from Supabase (source of truth).
|
|
8
8
|
* Falls back to session-based aggregation (same as session_start),
|
|
9
9
|
* then in-memory session state, then .gitmem/threads.json.
|
|
10
10
|
*
|
|
@@ -14,7 +14,7 @@ import { v4 as uuidv4 } from "uuid";
|
|
|
14
14
|
import { hasSupabase } from "../services/tier.js";
|
|
15
15
|
import { getProject } from "../services/session-state.js";
|
|
16
16
|
import { aggregateThreads, loadThreadsFile, mergeThreadStates } from "../services/thread-manager.js";
|
|
17
|
-
import { deduplicateThreadList } from "../services/thread-dedup.js";
|
|
17
|
+
import { deduplicateThreadList } from "../services/thread-dedup.js";
|
|
18
18
|
import { listThreadsFromSupabase } from "../services/thread-supabase.js";
|
|
19
19
|
import * as supabase from "../services/supabase-client.js";
|
|
20
20
|
import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
|
|
@@ -67,7 +67,7 @@ export async function listThreads(params) {
|
|
|
67
67
|
const project = params.project || getProject() || "default";
|
|
68
68
|
let allThreads = null;
|
|
69
69
|
let source = "file";
|
|
70
|
-
//
|
|
70
|
+
// Try Supabase first (source of truth)
|
|
71
71
|
const supabaseThreads = await listThreadsFromSupabase(project, {
|
|
72
72
|
statusFilter: includeResolved ? undefined : statusFilter,
|
|
73
73
|
includeResolved,
|
package/dist/tools/log.d.ts
CHANGED
package/dist/tools/log.js
CHANGED
package/dist/tools/recall.d.ts
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Check institutional memory for relevant scars before taking action.
|
|
5
5
|
* Core GitMem MVP tool that enables "check before act" workflow.
|
|
6
6
|
*
|
|
7
|
-
* Performance target: <2000ms response time
|
|
7
|
+
* Performance target: <2000ms response time
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Uses local vector search when available for speed,
|
|
10
10
|
* falls back to Supabase scar_search when local cache isn't ready.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
12
|
+
* After scar search, fetches related knowledge triples and
|
|
13
13
|
* includes them in the formatted response for relationship context.
|
|
14
14
|
*/
|
|
15
15
|
import type { KnowledgeTriple } from "../services/supabase-client.js";
|
|
@@ -26,7 +26,7 @@ export interface RecallParams {
|
|
|
26
26
|
similarity_threshold?: number;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
* Required verification block for enforcement gate
|
|
29
|
+
* Required verification block for enforcement gate
|
|
30
30
|
*/
|
|
31
31
|
interface RequiredVerification {
|
|
32
32
|
when: string;
|
package/dist/tools/recall.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Check institutional memory for relevant scars before taking action.
|
|
5
5
|
* Core GitMem MVP tool that enables "check before act" workflow.
|
|
6
6
|
*
|
|
7
|
-
* Performance target: <2000ms response time
|
|
7
|
+
* Performance target: <2000ms response time
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Uses local vector search when available for speed,
|
|
10
10
|
* falls back to Supabase scar_search when local cache isn't ready.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
12
|
+
* After scar search, fetches related knowledge triples and
|
|
13
13
|
* includes them in the formatted response for relationship context.
|
|
14
14
|
*/
|
|
15
15
|
import * as supabase from "../services/supabase-client.js";
|
|
@@ -19,8 +19,8 @@ import { getProject } from "../services/session-state.js";
|
|
|
19
19
|
import { getStorage } from "../services/storage.js";
|
|
20
20
|
import { Timer, recordMetrics, buildPerformanceData, buildComponentPerformance, calculateContextBytes, } from "../services/metrics.js";
|
|
21
21
|
import { getOrAssignVariant, formatVariantEnforcement, } from "../services/variant-assignment.js";
|
|
22
|
-
import { addSurfacedScars, getCurrentSession } from "../services/session-state.js";
|
|
23
|
-
import { getAgentIdentity } from "../services/agent-detection.js";
|
|
22
|
+
import { addSurfacedScars, getCurrentSession } from "../services/session-state.js";
|
|
23
|
+
import { getAgentIdentity } from "../services/agent-detection.js";
|
|
24
24
|
import { v4 as uuidv4 } from "uuid";
|
|
25
25
|
import * as fs from "fs";
|
|
26
26
|
import { getSessionPath } from "../services/gitmem-dir.js";
|
|
@@ -35,7 +35,7 @@ function formatResponse(scars, plan, dismissals) {
|
|
|
35
35
|
|
|
36
36
|
No past lessons match this plan closely enough. Scars accumulate as you work — create learnings during session close to build institutional memory.`;
|
|
37
37
|
}
|
|
38
|
-
//
|
|
38
|
+
// Check if any scars have required_verification (blocking gates)
|
|
39
39
|
const scarsWithVerification = scars.filter((s) => s.required_verification?.blocking);
|
|
40
40
|
const lines = [
|
|
41
41
|
"🧠 INSTITUTIONAL MEMORY ACTIVATED",
|
|
@@ -43,7 +43,7 @@ No past lessons match this plan closely enough. Scars accumulate as you work —
|
|
|
43
43
|
`Found ${scars.length} relevant scar${scars.length === 1 ? "" : "s"} for your plan:`,
|
|
44
44
|
"",
|
|
45
45
|
];
|
|
46
|
-
//
|
|
46
|
+
// Display blocking verification requirements FIRST and prominently
|
|
47
47
|
if (scarsWithVerification.length > 0) {
|
|
48
48
|
lines.push("═══════════════════════════════════════════════════════════════");
|
|
49
49
|
lines.push("🚨 **VERIFICATION REQUIRED BEFORE PROCEEDING**");
|
|
@@ -84,7 +84,7 @@ No past lessons match this plan closely enough. Scars accumulate as you work —
|
|
|
84
84
|
lines.push(` _[${counts.dismissed}x dismissed — consider archiving with gm-archive]_`);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
//
|
|
87
|
+
// Use variant enforcement text if available (blind to variant name)
|
|
88
88
|
if (scar.variant_info?.has_variants && scar.variant_info.variant) {
|
|
89
89
|
const variantText = formatVariantEnforcement(scar.variant_info.variant, scar.title);
|
|
90
90
|
lines.push(variantText);
|
|
@@ -104,7 +104,7 @@ No past lessons match this plan closely enough. Scars accumulate as you work —
|
|
|
104
104
|
lines.push("");
|
|
105
105
|
lines.push("*Applies when:* " + scar.applies_when.slice(0, 3).join(", "));
|
|
106
106
|
}
|
|
107
|
-
//
|
|
107
|
+
// Render LLM-cooperative enforcement fields
|
|
108
108
|
if (scar.why_this_matters) {
|
|
109
109
|
lines.push("");
|
|
110
110
|
lines.push(`**Why this matters:** ${scar.why_this_matters}`);
|
|
@@ -123,7 +123,7 @@ No past lessons match this plan closely enough. Scars accumulate as you work —
|
|
|
123
123
|
lines.push(` - [ ] ${criterion}`);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
//
|
|
126
|
+
// Render related knowledge triples
|
|
127
127
|
if (scar.related_triples && scar.related_triples.length > 0) {
|
|
128
128
|
lines.push("");
|
|
129
129
|
lines.push("*Related knowledge:*");
|
|
@@ -170,8 +170,8 @@ export async function recall(params) {
|
|
|
170
170
|
}
|
|
171
171
|
const project = params.project || getProject() || "default";
|
|
172
172
|
const matchCount = params.match_count || 3;
|
|
173
|
-
const issueId = params.issue_id; //
|
|
174
|
-
//
|
|
173
|
+
const issueId = params.issue_id; // For variant assignment
|
|
174
|
+
// Similarity threshold — suppress weak matches
|
|
175
175
|
const defaultThreshold = hasSupabase() ? 0.35 : 0.4;
|
|
176
176
|
const similarityThreshold = params.similarity_threshold ?? defaultThreshold;
|
|
177
177
|
// Free tier: use local keyword search
|
|
@@ -191,7 +191,7 @@ export async function recall(params) {
|
|
|
191
191
|
applies_when: [],
|
|
192
192
|
similarity: scar.similarity || 0,
|
|
193
193
|
}))
|
|
194
|
-
//
|
|
194
|
+
// Filter below threshold
|
|
195
195
|
.filter((scar) => scar.similarity >= similarityThreshold);
|
|
196
196
|
const latencyMs = timer.stop();
|
|
197
197
|
const perfData = buildPerformanceData("recall", latencyMs, scars.length, {
|
|
@@ -253,7 +253,7 @@ export async function recall(params) {
|
|
|
253
253
|
let cache_age_ms;
|
|
254
254
|
let search_mode = "remote";
|
|
255
255
|
let network_call = true; // Assume network call until proven otherwise
|
|
256
|
-
//
|
|
256
|
+
// Try local vector search first (fast, no Supabase hit)
|
|
257
257
|
// Falls back to Supabase scar_search if local cache isn't ready
|
|
258
258
|
const searchTimer = new Timer();
|
|
259
259
|
if (isLocalSearchReady(project)) {
|
|
@@ -275,7 +275,7 @@ export async function recall(params) {
|
|
|
275
275
|
cache_age_ms = supabaseResult.cache_age_ms;
|
|
276
276
|
}
|
|
277
277
|
const searchLatencyMs = searchTimer.stop();
|
|
278
|
-
//
|
|
278
|
+
// Assign variants for A/B testing (dev tier only)
|
|
279
279
|
// Agent identity is always available, so variants are always assigned
|
|
280
280
|
const variantTimer = new Timer();
|
|
281
281
|
const variantResults = new Map();
|
|
@@ -296,7 +296,7 @@ export async function recall(params) {
|
|
|
296
296
|
for (const { scarId, variantInfo } of results) {
|
|
297
297
|
variantResults.set(scarId, variantInfo);
|
|
298
298
|
}
|
|
299
|
-
//
|
|
299
|
+
// Record enforcement metrics for variants (dev only)
|
|
300
300
|
if (hasMetrics()) {
|
|
301
301
|
const metricsPromises = results
|
|
302
302
|
.filter(({ variantInfo }) => variantInfo.has_variants && variantInfo.variant)
|
|
@@ -322,7 +322,7 @@ export async function recall(params) {
|
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
324
|
const variantLatencyMs = variantTimer.stop();
|
|
325
|
-
//
|
|
325
|
+
// Fetch related knowledge triples for surfaced scars
|
|
326
326
|
const tripleTimer = new Timer();
|
|
327
327
|
const scarIds = rawScars.map((s) => s.id);
|
|
328
328
|
const triplesMap = await supabase.fetchRelatedTriples(scarIds);
|
|
@@ -351,19 +351,19 @@ export async function recall(params) {
|
|
|
351
351
|
source_issue: scar.source_linear_issue,
|
|
352
352
|
similarity: scar.similarity || 0,
|
|
353
353
|
required_verification: scar.required_verification,
|
|
354
|
-
variant_info: variantResults.get(scar.id),
|
|
355
|
-
//
|
|
354
|
+
variant_info: variantResults.get(scar.id),
|
|
355
|
+
// LLM-cooperative enforcement fields
|
|
356
356
|
why_this_matters: scar.why_this_matters,
|
|
357
357
|
action_protocol: scar.action_protocol,
|
|
358
358
|
self_check_criteria: scar.self_check_criteria,
|
|
359
|
-
//
|
|
359
|
+
// Knowledge triples
|
|
360
360
|
related_triples: triplesMap.get(scar.id),
|
|
361
361
|
// Behavioral decay
|
|
362
362
|
decay_multiplier: scar.decay_multiplier,
|
|
363
363
|
}))
|
|
364
|
-
//
|
|
364
|
+
// Filter below threshold
|
|
365
365
|
.filter((scar) => scar.similarity >= similarityThreshold);
|
|
366
|
-
//
|
|
366
|
+
// Track surfaced scars for auto-bridge at session close
|
|
367
367
|
const recallSurfacedAt = new Date().toISOString();
|
|
368
368
|
const recallSurfacedScars = scars.map((scar) => ({
|
|
369
369
|
scar_id: scar.id,
|
|
@@ -374,7 +374,7 @@ export async function recall(params) {
|
|
|
374
374
|
variant_id: variantResults.get(scar.id)?.assignment?.variant_id,
|
|
375
375
|
}));
|
|
376
376
|
addSurfacedScars(recallSurfacedScars);
|
|
377
|
-
//
|
|
377
|
+
// Update per-session dir with accumulated surfaced scars
|
|
378
378
|
try {
|
|
379
379
|
const session = getCurrentSession();
|
|
380
380
|
if (session) {
|
|
@@ -393,7 +393,7 @@ export async function recall(params) {
|
|
|
393
393
|
const latencyMs = timer.stop();
|
|
394
394
|
const memoriesSurfaced = scars.map((s) => s.id);
|
|
395
395
|
const similarityScores = scars.map((s) => s.similarity);
|
|
396
|
-
//
|
|
396
|
+
// Build detailed performance breakdown for test harness
|
|
397
397
|
const breakdown = {
|
|
398
398
|
scar_search: buildComponentPerformance(searchLatencyMs, search_mode === "local" ? "local_cache" : "supabase", network_call, network_call ? "miss" : "hit"),
|
|
399
399
|
};
|
|
@@ -436,7 +436,7 @@ export async function recall(params) {
|
|
|
436
436
|
cache_hit,
|
|
437
437
|
cache_age_ms,
|
|
438
438
|
search_mode,
|
|
439
|
-
//
|
|
439
|
+
// Detailed instrumentation
|
|
440
440
|
network_calls_made: perfData.network_calls_made,
|
|
441
441
|
fully_local: perfData.fully_local,
|
|
442
442
|
},
|
|
@@ -94,8 +94,8 @@ export async function recordScarUsageBatch(params) {
|
|
|
94
94
|
scar_id: scarId,
|
|
95
95
|
issue_id: entry.issue_id || null,
|
|
96
96
|
issue_identifier: entry.issue_identifier || null,
|
|
97
|
-
session_id: entry.session_id || null, //
|
|
98
|
-
agent: entry.agent || null, //
|
|
97
|
+
session_id: entry.session_id || null, // Session tracking
|
|
98
|
+
agent: entry.agent || null, // Agent identity
|
|
99
99
|
surfaced_at: entry.surfaced_at,
|
|
100
100
|
acknowledged_at: entry.acknowledged_at || null,
|
|
101
101
|
referenced: entry.reference_type !== "none",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Track scar application for effectiveness measurement.
|
|
5
5
|
* Records to scar_usage table.
|
|
6
6
|
*
|
|
7
|
-
* Performance target: <1000ms
|
|
7
|
+
* Performance target: <1000ms
|
|
8
8
|
*/
|
|
9
9
|
import type { RecordScarUsageParams, RecordScarUsageResult } from "../types/index.js";
|
|
10
10
|
/**
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Track scar application for effectiveness measurement.
|
|
5
5
|
* Records to scar_usage table.
|
|
6
6
|
*
|
|
7
|
-
* Performance target: <1000ms
|
|
7
|
+
* Performance target: <1000ms
|
|
8
8
|
*/
|
|
9
9
|
import { v4 as uuidv4 } from "uuid";
|
|
10
10
|
import { wrapDisplay } from "../services/display-protocol.js";
|
|
@@ -24,8 +24,8 @@ export async function recordScarUsage(params) {
|
|
|
24
24
|
scar_id: params.scar_id,
|
|
25
25
|
issue_id: params.issue_id || null,
|
|
26
26
|
issue_identifier: params.issue_identifier || null,
|
|
27
|
-
session_id: params.session_id || null, //
|
|
28
|
-
agent: params.agent || null, //
|
|
27
|
+
session_id: params.session_id || null, // Session tracking
|
|
28
|
+
agent: params.agent || null, // Agent identity
|
|
29
29
|
surfaced_at: params.surfaced_at,
|
|
30
30
|
acknowledged_at: params.acknowledged_at || null,
|
|
31
31
|
referenced: params.reference_type !== "none",
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* resolve_thread Tool
|
|
2
|
+
* resolve_thread Tool
|
|
3
3
|
*
|
|
4
4
|
* Mark an open thread as resolved. Supports resolution by:
|
|
5
5
|
* - thread_id: exact match (preferred)
|
|
6
6
|
* - text_match: case-insensitive substring match (fallback)
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* Updates Supabase (source of truth) + local file (cache).
|
|
9
9
|
* Falls back to local-only if Supabase is unavailable or thread
|
|
10
10
|
* doesn't exist in Supabase.
|
|
11
11
|
*
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* resolve_thread Tool
|
|
2
|
+
* resolve_thread Tool
|
|
3
3
|
*
|
|
4
4
|
* Mark an open thread as resolved. Supports resolution by:
|
|
5
5
|
* - thread_id: exact match (preferred)
|
|
6
6
|
* - text_match: case-insensitive substring match (fallback)
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* Updates Supabase (source of truth) + local file (cache).
|
|
9
9
|
* Falls back to local-only if Supabase is unavailable or thread
|
|
10
10
|
* doesn't exist in Supabase.
|
|
11
11
|
*
|
|
@@ -82,7 +82,7 @@ export async function resolveThread(params) {
|
|
|
82
82
|
}
|
|
83
83
|
// Persist to local file (cache)
|
|
84
84
|
saveThreadsFile(threads);
|
|
85
|
-
//
|
|
85
|
+
// Update Supabase (source of truth) — graceful fallback on failure
|
|
86
86
|
let supabaseSynced = false;
|
|
87
87
|
const supabaseSuccess = await resolveThreadInSupabase(resolved.id, {
|
|
88
88
|
resolvedAt: resolved.resolved_at,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Save full session transcript to Supabase storage for training data,
|
|
5
5
|
* post-mortems, and pattern mining.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
8
|
*/
|
|
9
9
|
import { detectAgent } from "../services/agent-detection.js";
|
|
10
10
|
import * as supabase from "../services/supabase-client.js";
|
package/dist/tools/search.d.ts
CHANGED
package/dist/tools/search.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Persist session with compliance validation.
|
|
5
5
|
* Validates that required fields are present based on close type.
|
|
6
6
|
*
|
|
7
|
-
* Performance target: <3000ms
|
|
7
|
+
* Performance target: <3000ms
|
|
8
8
|
*/
|
|
9
9
|
import type { SessionCloseParams, SessionCloseResult } from "../types/index.js";
|
|
10
10
|
/**
|