gitmem-mcp 1.0.2 → 1.0.4
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 +20 -6
- package/README.md +30 -9
- 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.d.ts +4 -4
- 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 +12 -0
- package/dist/services/agent-briefing.js +81 -0
- package/dist/services/agent-detection.d.ts +2 -1
- package/dist/services/agent-detection.js +23 -14
- 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 +16 -10
- 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/tier.d.ts +2 -0
- package/dist/services/tier.js +4 -0
- package/dist/services/transcript-chunker.d.ts +1 -1
- package/dist/services/transcript-chunker.js +1 -1
- package/dist/services/triple-writer.d.ts +4 -4
- package/dist/services/triple-writer.js +11 -20
- 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 +4 -0
- 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.d.ts +280 -58
- package/dist/tools/definitions.js +127 -87
- 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 +20 -17
- 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 +2 -2
- package/dist/tools/recall.d.ts +5 -4
- package/dist/tools/recall.js +37 -28
- 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 +58 -57
- package/dist/tools/session-start.d.ts +5 -5
- package/dist/tools/session-start.js +63 -61
- package/dist/types/index.d.ts +17 -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/schema/starter-scars.json +3 -153
- 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-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
|
@@ -4,27 +4,26 @@
|
|
|
4
4
|
* Initialize session, detect agent, load institutional context.
|
|
5
5
|
* Returns threads and recent decisions. Scars surface via recall on demand.
|
|
6
6
|
*
|
|
7
|
-
* Performance target: <750ms
|
|
7
|
+
* Performance target: <750ms
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Removed scar/wins queries from start pipeline.
|
|
10
10
|
* Scars load on-demand via recall(). Wins available via search/log.
|
|
11
11
|
* loadLastSession and loadRecentDecisions run in parallel.
|
|
12
12
|
* createSessionRecord is fire-and-forget.
|
|
13
13
|
*/
|
|
14
14
|
import * as fs from "fs";
|
|
15
|
-
import * as path from "path";
|
|
16
15
|
import { v4 as uuidv4 } from "uuid";
|
|
17
16
|
import { detectAgent } from "../services/agent-detection.js";
|
|
18
17
|
import * as supabase from "../services/supabase-client.js";
|
|
19
|
-
//
|
|
18
|
+
// Scar search removed from start pipeline (loads on-demand via recall)
|
|
20
19
|
import { ensureInitialized } from "../services/startup.js";
|
|
21
20
|
import { hasSupabase } from "../services/tier.js";
|
|
22
21
|
import { getStorage } from "../services/storage.js";
|
|
23
22
|
import { Timer, recordMetrics, calculateContextBytes, buildPerformanceData, buildComponentPerformance, } from "../services/metrics.js";
|
|
24
|
-
import { setCurrentSession, getCurrentSession, addSurfacedScars, getSurfacedScars } from "../services/session-state.js";
|
|
25
|
-
import { aggregateThreads, saveThreadsFile, loadThreadsFile, mergeThreadStates } from "../services/thread-manager.js"; //
|
|
26
|
-
import { deduplicateThreadList } from "../services/thread-dedup.js";
|
|
27
|
-
import { loadActiveThreadsFromSupabase, archiveDormantThreads } from "../services/thread-supabase.js";
|
|
23
|
+
import { setCurrentSession, getCurrentSession, addSurfacedScars, getSurfacedScars } from "../services/session-state.js";
|
|
24
|
+
import { aggregateThreads, saveThreadsFile, loadThreadsFile, mergeThreadStates } from "../services/thread-manager.js"; //
|
|
25
|
+
import { deduplicateThreadList } from "../services/thread-dedup.js";
|
|
26
|
+
import { loadActiveThreadsFromSupabase, archiveDormantThreads } from "../services/thread-supabase.js";
|
|
28
27
|
import { setGitmemDir, getGitmemDir, getSessionPath, getConfigProject } from "../services/gitmem-dir.js";
|
|
29
28
|
import { registerSession, findSessionByHostPid, pruneStale, migrateFromLegacy } from "../services/active-sessions.js";
|
|
30
29
|
import * as os from "os";
|
|
@@ -37,19 +36,19 @@ import { formatDate } from "../services/timezone.js";
|
|
|
37
36
|
function normalizeDecisions(decisions) {
|
|
38
37
|
return decisions.map((d) => typeof d === "string" ? d : d.title);
|
|
39
38
|
}
|
|
40
|
-
//
|
|
39
|
+
// WinRecord removed (wins available via search/log)
|
|
41
40
|
/**
|
|
42
41
|
* Aggregate open threads across multiple recent sessions.
|
|
43
42
|
* Deduplicates by exact lowercase match. Excludes PROJECT STATE: threads
|
|
44
43
|
* (handled separately). Only includes sessions from the last maxAgeDays.
|
|
45
44
|
*/
|
|
46
|
-
// aggregateOpenThreads replaced by aggregateThreads from thread-manager.ts (
|
|
45
|
+
// aggregateOpenThreads replaced by aggregateThreads from thread-manager.ts ()
|
|
47
46
|
/**
|
|
48
47
|
* Load the last CLOSED session for this agent.
|
|
49
48
|
* Filters out orphaned sessions (those without close_compliance).
|
|
50
|
-
* Uses _lite view for performance
|
|
49
|
+
* Uses _lite view for performance.
|
|
51
50
|
*
|
|
52
|
-
*
|
|
51
|
+
* Returns timing and network call info for instrumentation.
|
|
53
52
|
*/
|
|
54
53
|
async function loadLastSession(agent, project) {
|
|
55
54
|
const timer = new Timer();
|
|
@@ -67,14 +66,14 @@ async function loadLastSession(agent, project) {
|
|
|
67
66
|
}
|
|
68
67
|
try {
|
|
69
68
|
// Use _lite view for performance (excludes embedding)
|
|
70
|
-
//
|
|
69
|
+
// View now includes decisions/open_threads arrays
|
|
71
70
|
const sessions = await supabase.listRecords({
|
|
72
71
|
table: "orchestra_sessions_lite",
|
|
73
72
|
filters: { agent, project },
|
|
74
73
|
limit: 10, // Get several to find a closed one + aggregate threads
|
|
75
74
|
orderBy: { column: "created_at", ascending: false },
|
|
76
75
|
});
|
|
77
|
-
//
|
|
76
|
+
// Try loading threads from Supabase (source of truth) first
|
|
78
77
|
let aggregated_open_threads;
|
|
79
78
|
let displayInfo = [];
|
|
80
79
|
let threadsFromSupabase = false;
|
|
@@ -86,7 +85,7 @@ async function loadLastSession(agent, project) {
|
|
|
86
85
|
threadsFromSupabase = true;
|
|
87
86
|
console.error(`[session_start] Loaded ${aggregated_open_threads.length} open threads from Supabase`);
|
|
88
87
|
// Phase 6: Auto-archive dormant threads (fire-and-forget)
|
|
89
|
-
archiveDormantThreads(project).catch(() =>
|
|
88
|
+
archiveDormantThreads(project).catch((err) => console.error("[session_start] archiveDormantThreads failed:", err instanceof Error ? err.message : err));
|
|
90
89
|
}
|
|
91
90
|
else {
|
|
92
91
|
// Fallback: aggregate from session records (original behavior)
|
|
@@ -139,9 +138,9 @@ async function loadLastSession(agent, project) {
|
|
|
139
138
|
return { session: null, aggregated_open_threads: [], displayInfo: [], latency_ms: timer.stop(), network_call: true, threadsFromSupabase: false };
|
|
140
139
|
}
|
|
141
140
|
}
|
|
142
|
-
//
|
|
141
|
+
// queryRelevantScars removed — scars load on-demand via recall()
|
|
143
142
|
/**
|
|
144
|
-
*
|
|
143
|
+
* Load recent rapport summaries across all agents for this project.
|
|
145
144
|
* Returns up to 3 most recent sessions that have a non-null rapport_summary.
|
|
146
145
|
* Cross-agent by design: CLI session rapport visible to DAC's next session.
|
|
147
146
|
*/
|
|
@@ -171,14 +170,14 @@ async function loadRecentRapport(project) {
|
|
|
171
170
|
}
|
|
172
171
|
}
|
|
173
172
|
/**
|
|
174
|
-
* Load recent decisions with caching
|
|
173
|
+
* Load recent decisions with caching
|
|
175
174
|
*
|
|
176
|
-
*
|
|
175
|
+
* Returns timing and network call info for instrumentation.
|
|
177
176
|
*/
|
|
178
177
|
async function loadRecentDecisions(project, limit = 5) {
|
|
179
178
|
const timer = new Timer();
|
|
180
179
|
try {
|
|
181
|
-
// Use cached decisions query
|
|
180
|
+
// Use cached decisions query
|
|
182
181
|
// Fetch extra to account for date filtering
|
|
183
182
|
const { data: decisions, cache_hit, cache_age_ms } = await supabase.cachedListDecisions(project, limit + 5);
|
|
184
183
|
// Filter by project in memory if needed (ww-mcp filters may not work with views)
|
|
@@ -216,13 +215,13 @@ async function loadRecentDecisions(project, limit = 5) {
|
|
|
216
215
|
};
|
|
217
216
|
}
|
|
218
217
|
}
|
|
219
|
-
//
|
|
218
|
+
// loadRecentWins removed — wins available via search/log on-demand
|
|
220
219
|
/**
|
|
221
220
|
* Create a new session record
|
|
222
221
|
*
|
|
223
|
-
*
|
|
222
|
+
* Returns timing and network call info for instrumentation.
|
|
224
223
|
*/
|
|
225
|
-
async function createSessionRecord(agent, project, linearIssue, preGeneratedId //
|
|
224
|
+
async function createSessionRecord(agent, project, linearIssue, preGeneratedId // Accept pre-generated UUID for fire-and-forget pattern
|
|
226
225
|
) {
|
|
227
226
|
const sessionId = preGeneratedId || uuidv4();
|
|
228
227
|
const today = new Date().toISOString().split("T")[0];
|
|
@@ -232,7 +231,7 @@ async function createSessionRecord(agent, project, linearIssue, preGeneratedId /
|
|
|
232
231
|
return { session_id: sessionId, latency_ms: timer.stop(), network_call: false };
|
|
233
232
|
}
|
|
234
233
|
try {
|
|
235
|
-
//
|
|
234
|
+
// Capture asciinema recording path from Docker entrypoint
|
|
236
235
|
const recordingPath = process.env.GITMEM_RECORDING_PATH || null;
|
|
237
236
|
await supabase.directUpsert("orchestra_sessions", {
|
|
238
237
|
id: sessionId,
|
|
@@ -308,7 +307,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
|
|
|
308
307
|
order: "session_date.desc",
|
|
309
308
|
limit: 10,
|
|
310
309
|
});
|
|
311
|
-
// Aggregate threads across recent sessions (
|
|
310
|
+
// Aggregate threads across recent sessions ()
|
|
312
311
|
const freeThreadResult = aggregateThreads(sessions);
|
|
313
312
|
freeAggregatedThreads = freeThreadResult.open;
|
|
314
313
|
const closedSession = sessions.find((s) => s.close_compliance != null) || sessions[0];
|
|
@@ -325,7 +324,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
|
|
|
325
324
|
catch (error) {
|
|
326
325
|
console.error("[session_start] Failed to load last session:", error);
|
|
327
326
|
}
|
|
328
|
-
//
|
|
327
|
+
// Scars removed from start pipeline — load on-demand via recall
|
|
329
328
|
// Load recent decisions from local storage (time-scoped to 5 days)
|
|
330
329
|
let decisions = [];
|
|
331
330
|
try {
|
|
@@ -349,7 +348,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
|
|
|
349
348
|
catch (error) {
|
|
350
349
|
console.error("[session_start] Failed to load decisions:", error);
|
|
351
350
|
}
|
|
352
|
-
//
|
|
351
|
+
// Wins removed from start pipeline — available via search/log
|
|
353
352
|
// Create session record locally (skip if resuming existing session)
|
|
354
353
|
if (!isResuming) {
|
|
355
354
|
try {
|
|
@@ -378,9 +377,9 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
|
|
|
378
377
|
?.map((t) => typeof t === "string" ? t : t.text)
|
|
379
378
|
.find((t) => t.startsWith("PROJECT STATE:"))
|
|
380
379
|
?.replace(/^PROJECT STATE:\s*/, "");
|
|
381
|
-
//
|
|
380
|
+
// Simplified performance data (no scars/wins)
|
|
382
381
|
const performance = buildPerformanceData("session_start", latencyMs, decisions.length + (lastSession ? 1 : 0));
|
|
383
|
-
//
|
|
382
|
+
// surfacedScars initialized empty — populated by recall during session
|
|
384
383
|
const surfacedScars = [];
|
|
385
384
|
// GIT-20: Persist to per-session dir, legacy file, and registry
|
|
386
385
|
// writeSessionFiles merges with existing file threads to preserve mid-session creations
|
|
@@ -403,7 +402,7 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
|
|
|
403
402
|
children: forceCarryActivity?.children,
|
|
404
403
|
threads: freeMergedThreads,
|
|
405
404
|
});
|
|
406
|
-
//
|
|
405
|
+
// No scars/wins in start result
|
|
407
406
|
const freeResult = {
|
|
408
407
|
session_id: sessionId,
|
|
409
408
|
agent,
|
|
@@ -421,11 +420,14 @@ async function sessionStartFree(params, env, agent, project, timer, metricsId, e
|
|
|
421
420
|
// Write display to per-session dir
|
|
422
421
|
try {
|
|
423
422
|
const sessionFilePath = getSessionPath(sessionId, "session.json");
|
|
424
|
-
const
|
|
423
|
+
const raw = fs.readFileSync(sessionFilePath, "utf-8");
|
|
424
|
+
const sessionData = JSON.parse(raw);
|
|
425
425
|
sessionData.display = freeResult.display;
|
|
426
426
|
fs.writeFileSync(sessionFilePath, JSON.stringify(sessionData, null, 2));
|
|
427
427
|
}
|
|
428
|
-
catch {
|
|
428
|
+
catch (err) {
|
|
429
|
+
console.error("[session_start] Failed to write display to session file:", err instanceof Error ? err.message : err);
|
|
430
|
+
}
|
|
429
431
|
return freeResult;
|
|
430
432
|
}
|
|
431
433
|
/**
|
|
@@ -465,7 +467,7 @@ function restoreSessionState(existing, fallbackAgent) {
|
|
|
465
467
|
};
|
|
466
468
|
}
|
|
467
469
|
/**
|
|
468
|
-
*
|
|
470
|
+
* Check for existing active session and return it if found.
|
|
469
471
|
*
|
|
470
472
|
* Uses the active-sessions registry (hostname+PID) to identify THIS process's
|
|
471
473
|
* session, preventing cross-process session theft on shared filesystems.
|
|
@@ -506,7 +508,7 @@ function checkExistingSession(agent, force) {
|
|
|
506
508
|
* Consolidates write logic used by session_start (main + free) and session_refresh.
|
|
507
509
|
*/
|
|
508
510
|
function writeSessionFiles(sessionId, agent, project, surfacedScars, threads, recordingPath, isRefresh, supabaseAuthoritative, startedAt) {
|
|
509
|
-
const gitmemDir =
|
|
511
|
+
const gitmemDir = getGitmemDir();
|
|
510
512
|
if (!fs.existsSync(gitmemDir)) {
|
|
511
513
|
fs.mkdirSync(gitmemDir, { recursive: true });
|
|
512
514
|
}
|
|
@@ -671,10 +673,10 @@ function formatStartDisplay(result, displayInfoMap) {
|
|
|
671
673
|
/**
|
|
672
674
|
* Execute session_start tool
|
|
673
675
|
*
|
|
674
|
-
*
|
|
676
|
+
* Returns detailed performance breakdown for test harness validation.
|
|
675
677
|
* Key metrics: network_calls_made, fully_local, breakdown per component.
|
|
676
678
|
*
|
|
677
|
-
*
|
|
679
|
+
* Guards against overwriting existing active sessions.
|
|
678
680
|
* Returns existing session if active-session.json exists (idempotent).
|
|
679
681
|
* Pass force=true to override.
|
|
680
682
|
*/
|
|
@@ -685,7 +687,7 @@ export async function sessionStart(params) {
|
|
|
685
687
|
const env = detectAgent();
|
|
686
688
|
const agent = params.agent_identity || env.agent;
|
|
687
689
|
const project = params.project || getConfigProject() || "default";
|
|
688
|
-
//
|
|
690
|
+
// Check for existing active session — reuse session_id but still load full context
|
|
689
691
|
const existingSession = checkExistingSession(agent, params.force);
|
|
690
692
|
const isResuming = existingSession !== null;
|
|
691
693
|
// t-f7c2fa01: When force:true kills an existing session, carry forward its startedAt
|
|
@@ -700,18 +702,18 @@ export async function sessionStart(params) {
|
|
|
700
702
|
if (!hasSupabase()) {
|
|
701
703
|
return sessionStartFree(params, env, agent, project, timer, metricsId, existingSession?.sessionId, existingSession?.startedAt || forceCarryStartedAt, priorSession ? { surfacedScars: forceCarrySurfacedScars, observations: forceCarryObservations, children: forceCarryChildren } : undefined);
|
|
702
704
|
}
|
|
703
|
-
// 2.
|
|
705
|
+
// 2. Load last session + decisions in parallel (was sequential)
|
|
704
706
|
// Scars and wins removed from pipeline — load on-demand via recall/search
|
|
705
|
-
//
|
|
707
|
+
// Rapport loading disabled — recording kept in session_close but not injected
|
|
706
708
|
const [lastSessionResult, decisionsResult] = await Promise.all([
|
|
707
709
|
loadLastSession(agent, project),
|
|
708
710
|
loadRecentDecisions(project, 3),
|
|
709
711
|
]);
|
|
710
712
|
const lastSession = lastSessionResult.session;
|
|
711
713
|
const decisions = decisionsResult.decisions;
|
|
712
|
-
//
|
|
714
|
+
// surfacedScars initialized empty — populated by recall/confirm_scars during session
|
|
713
715
|
const surfacedScars = [];
|
|
714
|
-
// 3. Create session record — fire-and-forget
|
|
716
|
+
// 3. Create session record — fire-and-forget
|
|
715
717
|
// UUID generated locally, Supabase write runs in background
|
|
716
718
|
let sessionId;
|
|
717
719
|
if (isResuming) {
|
|
@@ -742,12 +744,12 @@ export async function sessionStart(params) {
|
|
|
742
744
|
});
|
|
743
745
|
}).catch(() => { });
|
|
744
746
|
const latencyMs = timer.stop();
|
|
745
|
-
//
|
|
747
|
+
// Extract PROJECT STATE from last session if present
|
|
746
748
|
const projectState = lastSession?.open_threads
|
|
747
749
|
?.map((t) => typeof t === "string" ? t : t.text)
|
|
748
750
|
.find(t => t.startsWith("PROJECT STATE:"))
|
|
749
751
|
?.replace(/^PROJECT STATE:\s*/, "");
|
|
750
|
-
//
|
|
752
|
+
// Simplified performance breakdown (no scar_search, wins, session_create)
|
|
751
753
|
const breakdown = {
|
|
752
754
|
last_session: buildComponentPerformance(lastSessionResult.latency_ms, "supabase", lastSessionResult.network_call, lastSessionResult.network_call ? "miss" : "hit"),
|
|
753
755
|
decisions: buildComponentPerformance(decisionsResult.latency_ms, decisionsResult.cache_hit ? "local_cache" : "supabase", decisionsResult.network_call, decisionsResult.cache_hit ? "hit" : "miss"),
|
|
@@ -770,9 +772,9 @@ export async function sessionStart(params) {
|
|
|
770
772
|
catch (error) {
|
|
771
773
|
console.warn("[session_start] Failed to persist session files:", error);
|
|
772
774
|
}
|
|
773
|
-
//
|
|
774
|
-
//
|
|
775
|
-
//
|
|
775
|
+
// Set active session for variant assignment in recall
|
|
776
|
+
// Initialize with surfaced scars for auto-bridge at close time
|
|
777
|
+
// : Initialize with merged threads (aggregated + mid-session preserved)
|
|
776
778
|
// t-f7c2fa01: On resume OR force, preserve original startedAt so session_close duration is accurate
|
|
777
779
|
const mergedScars = [...forceCarrySurfacedScars, ...surfacedScars];
|
|
778
780
|
setCurrentSession({
|
|
@@ -786,7 +788,7 @@ export async function sessionStart(params) {
|
|
|
786
788
|
children: forceCarryChildren,
|
|
787
789
|
threads: mergedThreads,
|
|
788
790
|
});
|
|
789
|
-
//
|
|
791
|
+
// Build result — no scars/wins (load on-demand via recall/search)
|
|
790
792
|
const openOnly = mergedThreads.filter(t => t.status === "open" || !t.status);
|
|
791
793
|
// Strip bulky fields from last_session — open_threads used only for PROJECT STATE extraction above
|
|
792
794
|
const slimLastSession = lastSession ? {
|
|
@@ -802,7 +804,7 @@ export async function sessionStart(params) {
|
|
|
802
804
|
...(isResuming && { resumed: true }),
|
|
803
805
|
detected_environment: env,
|
|
804
806
|
last_session: slimLastSession,
|
|
805
|
-
...(projectState && { project_state: projectState }),
|
|
807
|
+
...(projectState && { project_state: projectState }),
|
|
806
808
|
...(openOnly.length > 0 && { open_threads: openOnly }),
|
|
807
809
|
recent_decisions: decisions,
|
|
808
810
|
...(recordingPath && { recording_path: recordingPath }),
|
|
@@ -810,7 +812,7 @@ export async function sessionStart(params) {
|
|
|
810
812
|
project,
|
|
811
813
|
performance,
|
|
812
814
|
};
|
|
813
|
-
// Record metrics
|
|
815
|
+
// Record metrics
|
|
814
816
|
recordMetrics({
|
|
815
817
|
id: metricsId,
|
|
816
818
|
session_id: sessionId,
|
|
@@ -859,11 +861,11 @@ export async function sessionRefresh(params) {
|
|
|
859
861
|
let project;
|
|
860
862
|
if (currentSession) {
|
|
861
863
|
sessionId = currentSession.sessionId;
|
|
862
|
-
agent = currentSession.agent || "
|
|
864
|
+
agent = currentSession.agent || "cli";
|
|
863
865
|
project = params.project || currentSession.project || "default";
|
|
864
866
|
}
|
|
865
867
|
else {
|
|
866
|
-
//
|
|
868
|
+
// Fallback — check registry for this process, then legacy file
|
|
867
869
|
const mySession = findSessionByHostPid(os.hostname(), process.pid);
|
|
868
870
|
let raw = null;
|
|
869
871
|
if (mySession) {
|
|
@@ -872,14 +874,14 @@ export async function sessionRefresh(params) {
|
|
|
872
874
|
if (!raw || !raw.session_id) {
|
|
873
875
|
return {
|
|
874
876
|
session_id: "",
|
|
875
|
-
agent: "
|
|
877
|
+
agent: "cli",
|
|
876
878
|
refreshed: true,
|
|
877
879
|
message: "No active session — call session_start first",
|
|
878
880
|
performance: buildPerformanceData("session_refresh", timer.stop(), 0),
|
|
879
881
|
};
|
|
880
882
|
}
|
|
881
883
|
sessionId = raw.session_id;
|
|
882
|
-
agent = raw.agent || "
|
|
884
|
+
agent = raw.agent || "cli";
|
|
883
885
|
project = params.project || raw.project || "default";
|
|
884
886
|
}
|
|
885
887
|
// Free tier: all-local path (reuse session_start free path)
|
|
@@ -892,24 +894,24 @@ export async function sessionRefresh(params) {
|
|
|
892
894
|
performance: buildPerformanceData("session_refresh", timer.stop(), 0),
|
|
893
895
|
};
|
|
894
896
|
}
|
|
895
|
-
// 2.
|
|
897
|
+
// 2. Load last session + decisions in parallel (same as session_start)
|
|
896
898
|
// Scars and wins removed — load on-demand via recall/search
|
|
897
|
-
//
|
|
899
|
+
// Rapport loading disabled — recording kept in session_close but not injected
|
|
898
900
|
const [lastSessionResult, decisionsResult] = await Promise.all([
|
|
899
901
|
loadLastSession(agent, project),
|
|
900
902
|
loadRecentDecisions(project, 3),
|
|
901
903
|
]);
|
|
902
904
|
const lastSession = lastSessionResult.session;
|
|
903
905
|
const decisions = decisionsResult.decisions;
|
|
904
|
-
//
|
|
906
|
+
// surfacedScars not re-queried on refresh — existing ones preserved in session state
|
|
905
907
|
const refreshAggregatedThreads = lastSessionResult.aggregated_open_threads;
|
|
906
908
|
const refreshDisplayInfo = lastSessionResult.displayInfo;
|
|
907
|
-
// 3. Extract PROJECT STATE
|
|
909
|
+
// 3. Extract PROJECT STATE
|
|
908
910
|
const projectState = lastSession?.open_threads
|
|
909
911
|
?.map((t) => typeof t === "string" ? t : t.text)
|
|
910
912
|
.find(t => t.startsWith("PROJECT STATE:"))
|
|
911
913
|
?.replace(/^PROJECT STATE:\s*/, "");
|
|
912
|
-
// 4.
|
|
914
|
+
// 4. Simplified performance breakdown (no scar_search, wins)
|
|
913
915
|
const latencyMs = timer.stop();
|
|
914
916
|
const breakdown = {
|
|
915
917
|
last_session: buildComponentPerformance(lastSessionResult.latency_ms, "supabase", lastSessionResult.network_call, lastSessionResult.network_call ? "miss" : "hit"),
|
|
@@ -917,7 +919,7 @@ export async function sessionRefresh(params) {
|
|
|
917
919
|
};
|
|
918
920
|
const performance = buildPerformanceData("session_refresh", latencyMs, decisions.length + (lastSession ? 1 : 0), { breakdown });
|
|
919
921
|
const recordingPath = process.env.GITMEM_RECORDING_PATH || undefined;
|
|
920
|
-
//
|
|
922
|
+
// Build result — no scars/wins
|
|
921
923
|
const result = {
|
|
922
924
|
session_id: sessionId,
|
|
923
925
|
agent,
|
|
@@ -927,7 +929,7 @@ export async function sessionRefresh(params) {
|
|
|
927
929
|
...(projectState && { project_state: projectState }),
|
|
928
930
|
// open_threads filled after merge below
|
|
929
931
|
recent_decisions: decisions,
|
|
930
|
-
//
|
|
932
|
+
// Rapport disabled — not injected into session context
|
|
931
933
|
...(recordingPath && { recording_path: recordingPath }),
|
|
932
934
|
project,
|
|
933
935
|
performance,
|
|
@@ -957,7 +959,7 @@ export async function sessionRefresh(params) {
|
|
|
957
959
|
threads: refreshMergedThreads,
|
|
958
960
|
linearIssue: currentSession?.linearIssue,
|
|
959
961
|
});
|
|
960
|
-
// Record metrics
|
|
962
|
+
// Record metrics
|
|
961
963
|
recordMetrics({
|
|
962
964
|
id: metricsId,
|
|
963
965
|
session_id: sessionId,
|
package/dist/types/index.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ export interface PerformanceData {
|
|
|
35
35
|
cache_age_ms?: number;
|
|
36
36
|
search_mode?: "local" | "remote";
|
|
37
37
|
}
|
|
38
|
-
export type AgentIdentity = "
|
|
38
|
+
export type AgentIdentity = "cli" | "desktop" | "autonomous" | "local" | "cloud" | "Unknown";
|
|
39
39
|
export type Project = string;
|
|
40
40
|
export type ThreadStatus = "open" | "resolved";
|
|
41
41
|
export interface ThreadObject {
|
|
@@ -94,7 +94,7 @@ export interface SessionStartParams {
|
|
|
94
94
|
issue_description?: string;
|
|
95
95
|
issue_labels?: string[];
|
|
96
96
|
project?: Project;
|
|
97
|
-
/**
|
|
97
|
+
/** Force overwrite of existing active session */
|
|
98
98
|
force?: boolean;
|
|
99
99
|
}
|
|
100
100
|
export interface LastSession {
|
|
@@ -117,6 +117,7 @@ export interface RelevantScar {
|
|
|
117
117
|
action_protocol?: string[];
|
|
118
118
|
self_check_criteria?: string[];
|
|
119
119
|
decay_multiplier?: number;
|
|
120
|
+
is_starter?: boolean;
|
|
120
121
|
}
|
|
121
122
|
export interface RecentDecision {
|
|
122
123
|
id: string;
|
|
@@ -136,7 +137,7 @@ export interface SessionStartResult {
|
|
|
136
137
|
agent: AgentIdentity;
|
|
137
138
|
detected_environment?: DetectedEnvironment;
|
|
138
139
|
last_session?: LastSession | null;
|
|
139
|
-
/**
|
|
140
|
+
/** PROJECT STATE thread extracted from last session (if present) */
|
|
140
141
|
project_state?: string;
|
|
141
142
|
/** Aggregated open threads across last 5 sessions (deduplicated, migrated to objects) */
|
|
142
143
|
open_threads?: ThreadObject[];
|
|
@@ -144,7 +145,7 @@ export interface SessionStartResult {
|
|
|
144
145
|
suggested_threads?: ThreadSuggestion[];
|
|
145
146
|
relevant_scars?: RelevantScar[];
|
|
146
147
|
recent_decisions?: RecentDecision[];
|
|
147
|
-
/**
|
|
148
|
+
/** Cross-agent rapport summaries from recent sessions */
|
|
148
149
|
rapport_summaries?: {
|
|
149
150
|
agent: string;
|
|
150
151
|
summary: string;
|
|
@@ -152,11 +153,11 @@ export interface SessionStartResult {
|
|
|
152
153
|
}[];
|
|
153
154
|
recent_wins?: RecentWin[];
|
|
154
155
|
performance?: PerformanceData;
|
|
155
|
-
/**
|
|
156
|
+
/** Whether this session was resumed from an existing active session */
|
|
156
157
|
resumed?: boolean;
|
|
157
158
|
/** Whether this result is from a mid-session refresh (no new session created) */
|
|
158
159
|
refreshed?: boolean;
|
|
159
|
-
/**
|
|
160
|
+
/** Message explaining session state */
|
|
160
161
|
message?: string;
|
|
161
162
|
/** Asciinema recording path for session replay (from GITMEM_RECORDING_PATH env var) */
|
|
162
163
|
recording_path?: string;
|
|
@@ -183,7 +184,7 @@ export interface ClosingReflection {
|
|
|
183
184
|
rapport_notes?: string;
|
|
184
185
|
}
|
|
185
186
|
/**
|
|
186
|
-
* Task completion proof for standard close
|
|
187
|
+
* Task completion proof for standard close
|
|
187
188
|
*
|
|
188
189
|
* Enforces that each step in the closing protocol was actually completed.
|
|
189
190
|
* Timestamps must be in logical order and human_response requires minimum gap.
|
|
@@ -209,21 +210,21 @@ export interface SessionDecision {
|
|
|
209
210
|
export interface SessionCloseParams {
|
|
210
211
|
session_id: string;
|
|
211
212
|
close_type: CloseType;
|
|
212
|
-
/** Task completion proof - REQUIRED for standard close
|
|
213
|
+
/** Task completion proof - REQUIRED for standard close */
|
|
213
214
|
task_completion?: TaskCompletion;
|
|
214
215
|
closing_reflection?: ClosingReflection;
|
|
215
216
|
human_corrections?: string;
|
|
216
217
|
decisions?: SessionDecision[];
|
|
217
218
|
open_threads?: (string | ThreadObject)[];
|
|
218
|
-
/** Optional PROJECT STATE that auto-prepends to open_threads[0]
|
|
219
|
+
/** Optional PROJECT STATE that auto-prepends to open_threads[0] */
|
|
219
220
|
project_state?: string;
|
|
220
221
|
learnings_created?: (string | Record<string, unknown>)[];
|
|
221
222
|
linear_issue?: string;
|
|
222
223
|
ceremony_duration_ms?: number;
|
|
223
224
|
scars_to_record?: ScarUsageEntry[];
|
|
224
|
-
/**
|
|
225
|
+
/** Capture full conversation transcript to Supabase storage (defaults to true for CLI/DAC) */
|
|
225
226
|
capture_transcript?: boolean;
|
|
226
|
-
/**
|
|
227
|
+
/** Explicit transcript file path (overrides automatic detection) */
|
|
227
228
|
transcript_path?: string;
|
|
228
229
|
}
|
|
229
230
|
export interface CloseCompliance {
|
|
@@ -270,7 +271,7 @@ export interface CreateLearningResult {
|
|
|
270
271
|
success: boolean;
|
|
271
272
|
learning_id: string;
|
|
272
273
|
embedding_generated: boolean;
|
|
273
|
-
/** Error details when success=false
|
|
274
|
+
/** Error details when success=false */
|
|
274
275
|
errors?: string[];
|
|
275
276
|
display?: string;
|
|
276
277
|
performance: PerformanceData;
|
|
@@ -301,18 +302,21 @@ export interface SurfacedScar {
|
|
|
301
302
|
variant_id?: string;
|
|
302
303
|
}
|
|
303
304
|
export type ConfirmationDecision = "APPLYING" | "N_A" | "REFUTED";
|
|
305
|
+
export type ScarRelevance = "high" | "low" | "noise";
|
|
304
306
|
export interface ScarConfirmation {
|
|
305
307
|
scar_id: string;
|
|
306
308
|
scar_title: string;
|
|
307
309
|
decision: ConfirmationDecision;
|
|
308
310
|
evidence: string;
|
|
309
311
|
confirmed_at: string;
|
|
312
|
+
relevance?: ScarRelevance;
|
|
310
313
|
}
|
|
311
314
|
export interface ConfirmScarsParams {
|
|
312
315
|
confirmations: Array<{
|
|
313
316
|
scar_id: string;
|
|
314
317
|
decision: ConfirmationDecision;
|
|
315
318
|
evidence: string;
|
|
319
|
+
relevance?: ScarRelevance;
|
|
316
320
|
}>;
|
|
317
321
|
}
|
|
318
322
|
export interface ConfirmScarsResult {
|
|
@@ -341,7 +345,7 @@ export interface RecordScarUsageParams {
|
|
|
341
345
|
export interface RecordScarUsageResult {
|
|
342
346
|
success: boolean;
|
|
343
347
|
usage_id: string;
|
|
344
|
-
/** Error details when success=false
|
|
348
|
+
/** Error details when success=false */
|
|
345
349
|
errors?: string[];
|
|
346
350
|
display?: string;
|
|
347
351
|
performance: PerformanceData;
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
"description": "Enforces the GitMem institutional memory lifecycle through hooks — auto-starts sessions, reminds you to recall before consequential actions, and ensures proper session closure.",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "nTEG Labs",
|
|
6
|
-
"email": "support@
|
|
6
|
+
"email": "support@gitmem.ai"
|
|
7
7
|
}
|
|
8
8
|
}
|
|
@@ -21,7 +21,7 @@ HOOK_INPUT=$(cat -)
|
|
|
21
21
|
# Graceful degradation: skip if no active gitmem session
|
|
22
22
|
# ============================================================================
|
|
23
23
|
|
|
24
|
-
# Check active sessions registry
|
|
24
|
+
# Check active sessions registry
|
|
25
25
|
ACTIVE_SESSIONS=".gitmem/active-sessions.json"
|
|
26
26
|
if [ ! -f "$ACTIVE_SESSIONS" ]; then
|
|
27
27
|
exit 0
|
|
@@ -26,7 +26,7 @@ set -e
|
|
|
26
26
|
HOOK_INPUT=$(cat -)
|
|
27
27
|
|
|
28
28
|
# ============================================================================
|
|
29
|
-
# Resolve active session from registry
|
|
29
|
+
# Resolve active session from registry
|
|
30
30
|
# ============================================================================
|
|
31
31
|
|
|
32
32
|
ACTIVE_SESSIONS=".gitmem/active-sessions.json"
|
|
@@ -38,7 +38,7 @@ IS_MEANINGFUL=false
|
|
|
38
38
|
ACTIVE_SESSIONS=".gitmem/active-sessions.json"
|
|
39
39
|
SESSION_STARTED=false
|
|
40
40
|
if [ -f "$ACTIVE_SESSIONS" ]; then
|
|
41
|
-
# Check if registry has active session entries
|
|
41
|
+
# Check if registry has active session entries
|
|
42
42
|
if command -v jq &>/dev/null; then
|
|
43
43
|
[ "$(jq '.sessions | length' "$ACTIVE_SESSIONS" 2>/dev/null || echo 0)" -gt 0 ] 2>/dev/null && SESSION_STARTED=true
|
|
44
44
|
elif command -v node &>/dev/null; then
|
|
@@ -183,7 +183,7 @@ if [ "$GITMEM_DETECTED" = "true" ]; then
|
|
|
183
183
|
|
|
184
184
|
# Instruct agent to call session_start via MCP.
|
|
185
185
|
# The MCP server creates sessions with its own PID, enabling multi-session
|
|
186
|
-
# isolation
|
|
186
|
+
# isolation. CLI binary invocation was removed because
|
|
187
187
|
# the CLI PID dies immediately, defeating PID-based session identity.
|
|
188
188
|
#
|
|
189
189
|
# NOTE: ToolSearch (tengu_mcp_tool_search) was removed. MCP tools load
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gitmem-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Institutional memory for AI coding agents. Memory that compounds.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -46,9 +46,12 @@
|
|
|
46
46
|
"node": ">=18.0.0"
|
|
47
47
|
},
|
|
48
48
|
"files": [
|
|
49
|
-
"dist",
|
|
49
|
+
"dist/**/*.js",
|
|
50
|
+
"dist/**/*.d.ts",
|
|
51
|
+
"!dist/**/*.test.*",
|
|
50
52
|
"bin",
|
|
51
53
|
"hooks",
|
|
54
|
+
"!hooks/tests",
|
|
52
55
|
"schema",
|
|
53
56
|
"CLAUDE.md.template",
|
|
54
57
|
"README.md",
|
|
@@ -70,7 +73,7 @@
|
|
|
70
73
|
"type": "git",
|
|
71
74
|
"url": "https://github.com/nTEG-dev/gitmem.git"
|
|
72
75
|
},
|
|
73
|
-
"homepage": "https://
|
|
76
|
+
"homepage": "https://gitmem.ai",
|
|
74
77
|
"publishConfig": {
|
|
75
78
|
"registry": "https://registry.npmjs.org/",
|
|
76
79
|
"access": "public"
|