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
|
@@ -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 { v4 as uuidv4 } from "uuid";
|
|
10
10
|
import { detectAgent } from "../services/agent-detection.js";
|
|
@@ -12,10 +12,10 @@ import * as supabase from "../services/supabase-client.js";
|
|
|
12
12
|
import { embed, isEmbeddingAvailable } from "../services/embedding.js";
|
|
13
13
|
import { hasSupabase } from "../services/tier.js";
|
|
14
14
|
import { getStorage } from "../services/storage.js";
|
|
15
|
-
import { clearCurrentSession, getSurfacedScars, getConfirmations, getObservations, getChildren, getThreads, getSessionActivity } from "../services/session-state.js";
|
|
16
|
-
import { normalizeThreads, mergeThreadStates, migrateStringThread, saveThreadsFile } from "../services/thread-manager.js"; //
|
|
17
|
-
import { deduplicateThreadList } from "../services/thread-dedup.js";
|
|
18
|
-
import { syncThreadsToSupabase, loadOpenThreadEmbeddings } from "../services/thread-supabase.js";
|
|
15
|
+
import { clearCurrentSession, getSurfacedScars, getConfirmations, getObservations, getChildren, getThreads, getSessionActivity } from "../services/session-state.js";
|
|
16
|
+
import { normalizeThreads, mergeThreadStates, migrateStringThread, saveThreadsFile } from "../services/thread-manager.js"; //
|
|
17
|
+
import { deduplicateThreadList } from "../services/thread-dedup.js";
|
|
18
|
+
import { syncThreadsToSupabase, loadOpenThreadEmbeddings } from "../services/thread-supabase.js";
|
|
19
19
|
import { validateSessionClose, buildCloseCompliance, } from "../services/compliance-validator.js";
|
|
20
20
|
import { normalizeReflectionKeys } from "../constants/closing-questions.js";
|
|
21
21
|
import { Timer, recordMetrics, buildPerformanceData, updateRelevanceData, } from "../services/metrics.js";
|
|
@@ -27,7 +27,7 @@ import { processTranscript } from "../services/transcript-chunker.js";
|
|
|
27
27
|
import * as fs from "fs";
|
|
28
28
|
import * as path from "path";
|
|
29
29
|
import * as os from "os";
|
|
30
|
-
import { getGitmemPath,
|
|
30
|
+
import { getGitmemPath, getSessionPath, getSessionDir } from "../services/gitmem-dir.js";
|
|
31
31
|
import { unregisterSession, findSessionByHostPid } from "../services/active-sessions.js";
|
|
32
32
|
import { loadSuggestions, saveSuggestions, detectSuggestedThreads, loadRecentSessionEmbeddings } from "../services/thread-suggestions.js";
|
|
33
33
|
import { writeAgentBriefing } from "../services/agent-briefing.js";
|
|
@@ -55,7 +55,7 @@ function countScarsApplied(scarsApplied) {
|
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
57
|
* Find the most recently modified transcript file in Claude Code projects directory
|
|
58
|
-
*
|
|
58
|
+
* Search by recency, not by filename matching (supports post-compaction)
|
|
59
59
|
*/
|
|
60
60
|
function findMostRecentTranscript(projectsDir, cwdBasename, cwdFull) {
|
|
61
61
|
// Claude Code names project dirs by replacing / with - in the full CWD path
|
|
@@ -101,7 +101,7 @@ function findMostRecentTranscript(projectsDir, cwdBasename, cwdFull) {
|
|
|
101
101
|
}
|
|
102
102
|
/**
|
|
103
103
|
* Extract Claude Code session ID from transcript JSONL content
|
|
104
|
-
*
|
|
104
|
+
* Provides traceability between GitMem sessions and IDE sessions
|
|
105
105
|
*/
|
|
106
106
|
function extractClaudeSessionId(transcriptContent, filePath) {
|
|
107
107
|
try {
|
|
@@ -168,7 +168,7 @@ async function sessionCloseFree(params, timer) {
|
|
|
168
168
|
if (params.decisions && params.decisions.length > 0) {
|
|
169
169
|
sessionData.decisions = params.decisions.map((d) => d.title);
|
|
170
170
|
}
|
|
171
|
-
//
|
|
171
|
+
// : Normalize threads for free tier too
|
|
172
172
|
const freeSessionThreads = getThreads();
|
|
173
173
|
if (params.open_threads && params.open_threads.length > 0) {
|
|
174
174
|
const normalized = normalizeThreads(params.open_threads, params.session_id);
|
|
@@ -206,7 +206,7 @@ async function sessionCloseFree(params, timer) {
|
|
|
206
206
|
});
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
|
-
//
|
|
209
|
+
// Generate agent-briefing.md for PMEM bridge
|
|
210
210
|
const decisionsCount = params.decisions?.length || 0;
|
|
211
211
|
await writeAgentBriefing(learningsCount, decisionsCount);
|
|
212
212
|
// Clear session state
|
|
@@ -357,9 +357,9 @@ function cleanupSessionFiles(sessionId) {
|
|
|
357
357
|
catch (error) {
|
|
358
358
|
console.warn("[session_close] Failed to unregister session:", error);
|
|
359
359
|
}
|
|
360
|
-
// 2. Delete per-session directory
|
|
360
|
+
// 2. Delete per-session directory (sanitized via getSessionDir to prevent traversal)
|
|
361
361
|
try {
|
|
362
|
-
const sessionDir =
|
|
362
|
+
const sessionDir = getSessionDir(sessionId);
|
|
363
363
|
if (fs.existsSync(sessionDir)) {
|
|
364
364
|
fs.rmSync(sessionDir, { recursive: true, force: true });
|
|
365
365
|
console.error(`[session_close] Cleaned up session directory: ${sessionDir}`);
|
|
@@ -370,7 +370,7 @@ function cleanupSessionFiles(sessionId) {
|
|
|
370
370
|
}
|
|
371
371
|
// Legacy active-session.json cleanup removed — file is no longer written
|
|
372
372
|
}
|
|
373
|
-
// UUID and short-ID format validation for session_id
|
|
373
|
+
// UUID and short-ID format validation for session_id
|
|
374
374
|
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
375
375
|
const SHORT_ID_REGEX = /^[0-9a-f]{8}$/i;
|
|
376
376
|
function isValidSessionId(id) {
|
|
@@ -410,7 +410,7 @@ function buildSessionRecord(params, existingSession, isRetroactive, agentIdentit
|
|
|
410
410
|
reflection.human_additions = params.human_corrections;
|
|
411
411
|
}
|
|
412
412
|
sessionData.closing_reflection = reflection;
|
|
413
|
-
//
|
|
413
|
+
// Distill Q8+Q9 into rapport_summary for cross-agent surfacing
|
|
414
414
|
const q8 = params.closing_reflection.collaborative_dynamic;
|
|
415
415
|
const q9 = params.closing_reflection.rapport_notes;
|
|
416
416
|
if (q8 || q9) {
|
|
@@ -422,7 +422,7 @@ function buildSessionRecord(params, existingSession, isRetroactive, agentIdentit
|
|
|
422
422
|
if (params.decisions && params.decisions.length > 0) {
|
|
423
423
|
sessionData.decisions = params.decisions.map((d) => d.title);
|
|
424
424
|
}
|
|
425
|
-
//
|
|
425
|
+
// : Normalize and merge open threads
|
|
426
426
|
const sessionThreads = getThreads();
|
|
427
427
|
if (params.open_threads && params.open_threads.length > 0) {
|
|
428
428
|
const normalized = normalizeThreads(params.open_threads, params.session_id);
|
|
@@ -434,7 +434,7 @@ function buildSessionRecord(params, existingSession, isRetroactive, agentIdentit
|
|
|
434
434
|
else if (sessionThreads.length > 0) {
|
|
435
435
|
sessionData.open_threads = sessionThreads;
|
|
436
436
|
}
|
|
437
|
-
//
|
|
437
|
+
// If project_state provided, prepend it to open_threads as a ThreadObject
|
|
438
438
|
if (params.project_state) {
|
|
439
439
|
const projectStateText = `PROJECT STATE: ${params.project_state}`;
|
|
440
440
|
const existing = (sessionData.open_threads || []);
|
|
@@ -532,7 +532,7 @@ async function captureSessionTranscript(sessionId, params, existingSession, isRe
|
|
|
532
532
|
patch_warning: saveResult.patch_warning,
|
|
533
533
|
};
|
|
534
534
|
console.error(`[session_close] Transcript saved: ${saveResult.transcript_path} (${saveResult.size_kb}KB)`);
|
|
535
|
-
//
|
|
535
|
+
// Process transcript for semantic search (fire-and-forget — chunking is expensive)
|
|
536
536
|
processTranscript(sessionId, transcriptContent, transcriptProject)
|
|
537
537
|
.then(result => {
|
|
538
538
|
if (result.success) {
|
|
@@ -681,7 +681,7 @@ function bridgeScarsToUsageRecords(normalizedScarsApplied, sessionId, agentIdent
|
|
|
681
681
|
export async function sessionClose(params) {
|
|
682
682
|
const timer = new Timer();
|
|
683
683
|
const metricsId = uuidv4();
|
|
684
|
-
//
|
|
684
|
+
// Validate session_id format before any DB calls
|
|
685
685
|
if (params.session_id && !isValidSessionId(params.session_id)) {
|
|
686
686
|
const latencyMs = timer.stop();
|
|
687
687
|
const perfData = buildPerformanceData("session_close", latencyMs, 0);
|
|
@@ -754,7 +754,7 @@ export async function sessionClose(params) {
|
|
|
754
754
|
human_response: "auto-normalized from string payload",
|
|
755
755
|
};
|
|
756
756
|
}
|
|
757
|
-
//
|
|
757
|
+
// Adaptive ceremony level based on session activity.
|
|
758
758
|
// Three levels: micro (quick fix), standard (normal), full (long/heavy session).
|
|
759
759
|
// t-f7c2fa01: If closing_reflection is already present, skip the mismatch gate.
|
|
760
760
|
const hasReflection = params.closing_reflection &&
|
|
@@ -965,7 +965,7 @@ export async function sessionClose(params) {
|
|
|
965
965
|
}
|
|
966
966
|
// 5. Build session data (merge with existing or create from scratch)
|
|
967
967
|
const sessionData = buildSessionRecord(params, existingSession, isRetroactive, agentIdentity, closeCompliance, sessionId);
|
|
968
|
-
//
|
|
968
|
+
// Sync threads to Supabase (fire-and-forget, non-blocking)
|
|
969
969
|
const closeThreads = (sessionData.open_threads || []);
|
|
970
970
|
if (closeThreads.length > 0) {
|
|
971
971
|
const closeProject = isRetroactive ? "default" : existingSession?.project || "default";
|
|
@@ -982,10 +982,10 @@ export async function sessionClose(params) {
|
|
|
982
982
|
catch (err) {
|
|
983
983
|
console.error("[session_close] Failed to prune threads.json (non-fatal):", err);
|
|
984
984
|
}
|
|
985
|
-
//
|
|
985
|
+
// Capture transcript if enabled (default true for CLI/DAC)
|
|
986
986
|
let transcriptStatus;
|
|
987
987
|
const shouldCaptureTranscript = params.capture_transcript !== false &&
|
|
988
|
-
(agentIdentity === "
|
|
988
|
+
(agentIdentity === "cli" || agentIdentity === "desktop");
|
|
989
989
|
if (shouldCaptureTranscript) {
|
|
990
990
|
const transcriptResult = await captureSessionTranscript(sessionId, params, existingSession, isRetroactive);
|
|
991
991
|
transcriptStatus = transcriptResult.status;
|
|
@@ -993,7 +993,7 @@ export async function sessionClose(params) {
|
|
|
993
993
|
sessionData.claude_code_session_id = transcriptResult.claudeSessionId;
|
|
994
994
|
}
|
|
995
995
|
}
|
|
996
|
-
//
|
|
996
|
+
// Auto-bridge Q6 answers to scar_usage records
|
|
997
997
|
const normalizedScarsApplied = normalizeScarsApplied(params.closing_reflection?.scars_applied);
|
|
998
998
|
if ((!params.scars_to_record || params.scars_to_record.length === 0) &&
|
|
999
999
|
normalizedScarsApplied.length > 0) {
|
|
@@ -1004,10 +1004,10 @@ export async function sessionClose(params) {
|
|
|
1004
1004
|
}
|
|
1005
1005
|
// 6. Persist to Supabase (direct REST API, bypasses ww-mcp)
|
|
1006
1006
|
try {
|
|
1007
|
-
//
|
|
1007
|
+
// Upsert session WITHOUT embedding (fast path)
|
|
1008
1008
|
// Embedding + thread detection run fire-and-forget after
|
|
1009
1009
|
await supabase.directUpsert("orchestra_sessions", sessionData);
|
|
1010
|
-
//
|
|
1010
|
+
// Tracked fire-and-forget embedding generation + session update + thread detection
|
|
1011
1011
|
if (isEmbeddingAvailable()) {
|
|
1012
1012
|
getEffectTracker().track("embedding", "session_close", async () => {
|
|
1013
1013
|
const embeddingParts = [
|
|
@@ -1037,8 +1037,8 @@ export async function sessionClose(params) {
|
|
|
1037
1037
|
}
|
|
1038
1038
|
});
|
|
1039
1039
|
}
|
|
1040
|
-
//
|
|
1041
|
-
//
|
|
1040
|
+
// Tracked fire-and-forget scar usage recording (was blocking ~200-500ms)
|
|
1041
|
+
// scars_to_record may now come from auto-bridge above
|
|
1042
1042
|
if (params.scars_to_record && params.scars_to_record.length > 0) {
|
|
1043
1043
|
const project = isRetroactive
|
|
1044
1044
|
? "default"
|
|
@@ -1052,7 +1052,7 @@ export async function sessionClose(params) {
|
|
|
1052
1052
|
const perfData = buildPerformanceData("session_close", latencyMs, 1);
|
|
1053
1053
|
// Update relevance data for memories applied during session
|
|
1054
1054
|
if (normalizedScarsApplied.length > 0) {
|
|
1055
|
-
updateRelevanceData(sessionId, normalizedScarsApplied).catch(() =>
|
|
1055
|
+
updateRelevanceData(sessionId, normalizedScarsApplied).catch((err) => console.error("[session_close] updateRelevanceData failed:", err instanceof Error ? err.message : err));
|
|
1056
1056
|
}
|
|
1057
1057
|
// Record metrics
|
|
1058
1058
|
recordMetrics({
|
|
@@ -1075,9 +1075,9 @@ export async function sessionClose(params) {
|
|
|
1075
1075
|
retroactive: isRetroactive,
|
|
1076
1076
|
},
|
|
1077
1077
|
}).catch(() => { });
|
|
1078
|
-
//
|
|
1078
|
+
// Clear session state after successful close
|
|
1079
1079
|
clearCurrentSession();
|
|
1080
|
-
//
|
|
1080
|
+
// Generate agent-briefing.md for PMEM bridge
|
|
1081
1081
|
const decisionsCount = params.decisions?.length || 0;
|
|
1082
1082
|
await writeAgentBriefing(learningsCount, decisionsCount);
|
|
1083
1083
|
// GIT-21: Clean up session files (registry, per-session dir, legacy file)
|
|
@@ -1103,7 +1103,7 @@ export async function sessionClose(params) {
|
|
|
1103
1103
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1104
1104
|
const latencyMs = timer.stop();
|
|
1105
1105
|
const perfData = buildPerformanceData("session_close", latencyMs, 0);
|
|
1106
|
-
//
|
|
1106
|
+
// Clear session state even on error (session is done either way)
|
|
1107
1107
|
clearCurrentSession();
|
|
1108
1108
|
const errorDisplay = formatCloseDisplay(sessionId, closeCompliance, params, learningsCount, false, [`Failed to persist session: ${errorMessage}`], transcriptStatus);
|
|
1109
1109
|
return {
|
|
@@ -4,9 +4,9 @@
|
|
|
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.
|
|
@@ -15,10 +15,10 @@ import type { SessionStartParams, SessionStartResult, Project } from "../types/i
|
|
|
15
15
|
/**
|
|
16
16
|
* Execute session_start tool
|
|
17
17
|
*
|
|
18
|
-
*
|
|
18
|
+
* Returns detailed performance breakdown for test harness validation.
|
|
19
19
|
* Key metrics: network_calls_made, fully_local, breakdown per component.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
21
|
+
* Guards against overwriting existing active sessions.
|
|
22
22
|
* Returns existing session if active-session.json exists (idempotent).
|
|
23
23
|
* Pass force=true to override.
|
|
24
24
|
*/
|
|
@@ -30,7 +30,7 @@ export declare function sessionStart(params: SessionStartParams): Promise<Sessio
|
|
|
30
30
|
* without creating a new session ID. Same lean pipeline as session_start
|
|
31
31
|
* (last session, decisions, threads) but skips session creation.
|
|
32
32
|
*
|
|
33
|
-
*
|
|
33
|
+
* Scars/wins removed — load on-demand via recall/search.
|
|
34
34
|
*
|
|
35
35
|
* Use when: mid-session context refresh after compaction, long gaps, or
|
|
36
36
|
* when you need to remember where you left off.
|