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,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,9 +27,10 @@ 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
|
+
import { writeAgentBriefing } from "../services/agent-briefing.js";
|
|
33
34
|
/**
|
|
34
35
|
* Normalize scars_applied to string[].
|
|
35
36
|
* Handles both string (prose answer from agents) and string[] (schema-correct array).
|
|
@@ -54,7 +55,7 @@ function countScarsApplied(scarsApplied) {
|
|
|
54
55
|
}
|
|
55
56
|
/**
|
|
56
57
|
* Find the most recently modified transcript file in Claude Code projects directory
|
|
57
|
-
*
|
|
58
|
+
* Search by recency, not by filename matching (supports post-compaction)
|
|
58
59
|
*/
|
|
59
60
|
function findMostRecentTranscript(projectsDir, cwdBasename, cwdFull) {
|
|
60
61
|
// Claude Code names project dirs by replacing / with - in the full CWD path
|
|
@@ -100,7 +101,7 @@ function findMostRecentTranscript(projectsDir, cwdBasename, cwdFull) {
|
|
|
100
101
|
}
|
|
101
102
|
/**
|
|
102
103
|
* Extract Claude Code session ID from transcript JSONL content
|
|
103
|
-
*
|
|
104
|
+
* Provides traceability between GitMem sessions and IDE sessions
|
|
104
105
|
*/
|
|
105
106
|
function extractClaudeSessionId(transcriptContent, filePath) {
|
|
106
107
|
try {
|
|
@@ -167,7 +168,7 @@ async function sessionCloseFree(params, timer) {
|
|
|
167
168
|
if (params.decisions && params.decisions.length > 0) {
|
|
168
169
|
sessionData.decisions = params.decisions.map((d) => d.title);
|
|
169
170
|
}
|
|
170
|
-
//
|
|
171
|
+
// : Normalize threads for free tier too
|
|
171
172
|
const freeSessionThreads = getThreads();
|
|
172
173
|
if (params.open_threads && params.open_threads.length > 0) {
|
|
173
174
|
const normalized = normalizeThreads(params.open_threads, params.session_id);
|
|
@@ -205,6 +206,9 @@ async function sessionCloseFree(params, timer) {
|
|
|
205
206
|
});
|
|
206
207
|
}
|
|
207
208
|
}
|
|
209
|
+
// Generate agent-briefing.md for PMEM bridge
|
|
210
|
+
const decisionsCount = params.decisions?.length || 0;
|
|
211
|
+
await writeAgentBriefing(learningsCount, decisionsCount);
|
|
208
212
|
// Clear session state
|
|
209
213
|
clearCurrentSession();
|
|
210
214
|
// GIT-21: Clean up session files (registry, per-session dir, legacy file)
|
|
@@ -353,9 +357,9 @@ function cleanupSessionFiles(sessionId) {
|
|
|
353
357
|
catch (error) {
|
|
354
358
|
console.warn("[session_close] Failed to unregister session:", error);
|
|
355
359
|
}
|
|
356
|
-
// 2. Delete per-session directory
|
|
360
|
+
// 2. Delete per-session directory (sanitized via getSessionDir to prevent traversal)
|
|
357
361
|
try {
|
|
358
|
-
const sessionDir =
|
|
362
|
+
const sessionDir = getSessionDir(sessionId);
|
|
359
363
|
if (fs.existsSync(sessionDir)) {
|
|
360
364
|
fs.rmSync(sessionDir, { recursive: true, force: true });
|
|
361
365
|
console.error(`[session_close] Cleaned up session directory: ${sessionDir}`);
|
|
@@ -366,7 +370,7 @@ function cleanupSessionFiles(sessionId) {
|
|
|
366
370
|
}
|
|
367
371
|
// Legacy active-session.json cleanup removed — file is no longer written
|
|
368
372
|
}
|
|
369
|
-
// UUID and short-ID format validation for session_id
|
|
373
|
+
// UUID and short-ID format validation for session_id
|
|
370
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;
|
|
371
375
|
const SHORT_ID_REGEX = /^[0-9a-f]{8}$/i;
|
|
372
376
|
function isValidSessionId(id) {
|
|
@@ -406,7 +410,7 @@ function buildSessionRecord(params, existingSession, isRetroactive, agentIdentit
|
|
|
406
410
|
reflection.human_additions = params.human_corrections;
|
|
407
411
|
}
|
|
408
412
|
sessionData.closing_reflection = reflection;
|
|
409
|
-
//
|
|
413
|
+
// Distill Q8+Q9 into rapport_summary for cross-agent surfacing
|
|
410
414
|
const q8 = params.closing_reflection.collaborative_dynamic;
|
|
411
415
|
const q9 = params.closing_reflection.rapport_notes;
|
|
412
416
|
if (q8 || q9) {
|
|
@@ -418,7 +422,7 @@ function buildSessionRecord(params, existingSession, isRetroactive, agentIdentit
|
|
|
418
422
|
if (params.decisions && params.decisions.length > 0) {
|
|
419
423
|
sessionData.decisions = params.decisions.map((d) => d.title);
|
|
420
424
|
}
|
|
421
|
-
//
|
|
425
|
+
// : Normalize and merge open threads
|
|
422
426
|
const sessionThreads = getThreads();
|
|
423
427
|
if (params.open_threads && params.open_threads.length > 0) {
|
|
424
428
|
const normalized = normalizeThreads(params.open_threads, params.session_id);
|
|
@@ -430,7 +434,7 @@ function buildSessionRecord(params, existingSession, isRetroactive, agentIdentit
|
|
|
430
434
|
else if (sessionThreads.length > 0) {
|
|
431
435
|
sessionData.open_threads = sessionThreads;
|
|
432
436
|
}
|
|
433
|
-
//
|
|
437
|
+
// If project_state provided, prepend it to open_threads as a ThreadObject
|
|
434
438
|
if (params.project_state) {
|
|
435
439
|
const projectStateText = `PROJECT STATE: ${params.project_state}`;
|
|
436
440
|
const existing = (sessionData.open_threads || []);
|
|
@@ -528,7 +532,7 @@ async function captureSessionTranscript(sessionId, params, existingSession, isRe
|
|
|
528
532
|
patch_warning: saveResult.patch_warning,
|
|
529
533
|
};
|
|
530
534
|
console.error(`[session_close] Transcript saved: ${saveResult.transcript_path} (${saveResult.size_kb}KB)`);
|
|
531
|
-
//
|
|
535
|
+
// Process transcript for semantic search (fire-and-forget — chunking is expensive)
|
|
532
536
|
processTranscript(sessionId, transcriptContent, transcriptProject)
|
|
533
537
|
.then(result => {
|
|
534
538
|
if (result.success) {
|
|
@@ -677,7 +681,7 @@ function bridgeScarsToUsageRecords(normalizedScarsApplied, sessionId, agentIdent
|
|
|
677
681
|
export async function sessionClose(params) {
|
|
678
682
|
const timer = new Timer();
|
|
679
683
|
const metricsId = uuidv4();
|
|
680
|
-
//
|
|
684
|
+
// Validate session_id format before any DB calls
|
|
681
685
|
if (params.session_id && !isValidSessionId(params.session_id)) {
|
|
682
686
|
const latencyMs = timer.stop();
|
|
683
687
|
const perfData = buildPerformanceData("session_close", latencyMs, 0);
|
|
@@ -750,43 +754,37 @@ export async function sessionClose(params) {
|
|
|
750
754
|
human_response: "auto-normalized from string payload",
|
|
751
755
|
};
|
|
752
756
|
}
|
|
753
|
-
//
|
|
754
|
-
//
|
|
755
|
-
// t-f7c2fa01: If closing_reflection is already present
|
|
756
|
-
// skip the mismatch gate — the ceremony is done, rejecting it wastes work.
|
|
757
|
+
// Adaptive ceremony level based on session activity.
|
|
758
|
+
// Three levels: micro (quick fix), standard (normal), full (long/heavy session).
|
|
759
|
+
// t-f7c2fa01: If closing_reflection is already present, skip the mismatch gate.
|
|
757
760
|
const hasReflection = params.closing_reflection &&
|
|
758
761
|
Object.keys(params.closing_reflection).length > 0;
|
|
759
762
|
const activity = getSessionActivity();
|
|
763
|
+
// Compute recommended ceremony level
|
|
764
|
+
let recommendedLevel = "standard";
|
|
765
|
+
if (activity) {
|
|
766
|
+
const isMinimal = activity.recall_count === 0 &&
|
|
767
|
+
activity.observation_count === 0 &&
|
|
768
|
+
activity.children_count === 0;
|
|
769
|
+
if (activity.duration_min < 15 && isMinimal) {
|
|
770
|
+
recommendedLevel = "micro";
|
|
771
|
+
}
|
|
772
|
+
else if (activity.duration_min >= 60 || activity.recall_count >= 3 ||
|
|
773
|
+
activity.observation_count >= 3) {
|
|
774
|
+
recommendedLevel = "full";
|
|
775
|
+
}
|
|
776
|
+
}
|
|
760
777
|
if (activity && params.close_type && !hasReflection) {
|
|
761
778
|
const isMinimal = activity.recall_count === 0 &&
|
|
762
779
|
activity.observation_count === 0 &&
|
|
763
780
|
activity.children_count === 0;
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
session_id: params.session_id || "",
|
|
770
|
-
close_compliance: {
|
|
771
|
-
close_type: params.close_type,
|
|
772
|
-
agent: detectAgent().agent,
|
|
773
|
-
checklist_displayed: false,
|
|
774
|
-
questions_answered_by_agent: false,
|
|
775
|
-
human_asked_for_corrections: false,
|
|
776
|
-
learnings_stored: 0,
|
|
777
|
-
scars_applied: 0,
|
|
778
|
-
},
|
|
779
|
-
validation_errors: [
|
|
780
|
-
`Close type mismatch: "standard" requested but session qualifies for "quick".`,
|
|
781
|
-
`Session duration: ${Math.round(activity.duration_min)} min (< 30 min threshold).`,
|
|
782
|
-
`Activity: ${activity.recall_count} recalls, ${activity.observation_count} observations, ${activity.children_count} children.`,
|
|
783
|
-
`Re-call with close_type: "quick" for short exploratory sessions.`,
|
|
784
|
-
],
|
|
785
|
-
performance: perfData,
|
|
786
|
-
display: `## CLOSE TYPE MISMATCH\n\nSession is ${Math.round(activity.duration_min)} min with no substantive activity.\nUse \`close_type: "quick"\` instead of \`"standard"\`.`,
|
|
787
|
-
};
|
|
781
|
+
// Suggest micro for short sessions requesting standard (soft nudge, not rejection)
|
|
782
|
+
if (params.close_type === "standard" && recommendedLevel === "micro") {
|
|
783
|
+
console.error(`[session_close] Hint: session qualifies for "quick" close ` +
|
|
784
|
+
`(${Math.round(activity.duration_min)} min, no substantive activity). ` +
|
|
785
|
+
`Proceeding with standard as requested.`);
|
|
788
786
|
}
|
|
789
|
-
if (params.close_type === "quick" &&
|
|
787
|
+
if (params.close_type === "quick" && recommendedLevel === "full") {
|
|
790
788
|
// Warn but don't reject — agent chose quick on a substantive session
|
|
791
789
|
console.error(`[session_close] Warning: "quick" close on substantive session ` +
|
|
792
790
|
`(${Math.round(activity.duration_min)} min, ${activity.recall_count} recalls, ` +
|
|
@@ -967,7 +965,7 @@ export async function sessionClose(params) {
|
|
|
967
965
|
}
|
|
968
966
|
// 5. Build session data (merge with existing or create from scratch)
|
|
969
967
|
const sessionData = buildSessionRecord(params, existingSession, isRetroactive, agentIdentity, closeCompliance, sessionId);
|
|
970
|
-
//
|
|
968
|
+
// Sync threads to Supabase (fire-and-forget, non-blocking)
|
|
971
969
|
const closeThreads = (sessionData.open_threads || []);
|
|
972
970
|
if (closeThreads.length > 0) {
|
|
973
971
|
const closeProject = isRetroactive ? "default" : existingSession?.project || "default";
|
|
@@ -984,10 +982,10 @@ export async function sessionClose(params) {
|
|
|
984
982
|
catch (err) {
|
|
985
983
|
console.error("[session_close] Failed to prune threads.json (non-fatal):", err);
|
|
986
984
|
}
|
|
987
|
-
//
|
|
985
|
+
// Capture transcript if enabled (default true for CLI/DAC)
|
|
988
986
|
let transcriptStatus;
|
|
989
987
|
const shouldCaptureTranscript = params.capture_transcript !== false &&
|
|
990
|
-
(agentIdentity === "
|
|
988
|
+
(agentIdentity === "cli" || agentIdentity === "desktop");
|
|
991
989
|
if (shouldCaptureTranscript) {
|
|
992
990
|
const transcriptResult = await captureSessionTranscript(sessionId, params, existingSession, isRetroactive);
|
|
993
991
|
transcriptStatus = transcriptResult.status;
|
|
@@ -995,7 +993,7 @@ export async function sessionClose(params) {
|
|
|
995
993
|
sessionData.claude_code_session_id = transcriptResult.claudeSessionId;
|
|
996
994
|
}
|
|
997
995
|
}
|
|
998
|
-
//
|
|
996
|
+
// Auto-bridge Q6 answers to scar_usage records
|
|
999
997
|
const normalizedScarsApplied = normalizeScarsApplied(params.closing_reflection?.scars_applied);
|
|
1000
998
|
if ((!params.scars_to_record || params.scars_to_record.length === 0) &&
|
|
1001
999
|
normalizedScarsApplied.length > 0) {
|
|
@@ -1006,10 +1004,10 @@ export async function sessionClose(params) {
|
|
|
1006
1004
|
}
|
|
1007
1005
|
// 6. Persist to Supabase (direct REST API, bypasses ww-mcp)
|
|
1008
1006
|
try {
|
|
1009
|
-
//
|
|
1007
|
+
// Upsert session WITHOUT embedding (fast path)
|
|
1010
1008
|
// Embedding + thread detection run fire-and-forget after
|
|
1011
1009
|
await supabase.directUpsert("orchestra_sessions", sessionData);
|
|
1012
|
-
//
|
|
1010
|
+
// Tracked fire-and-forget embedding generation + session update + thread detection
|
|
1013
1011
|
if (isEmbeddingAvailable()) {
|
|
1014
1012
|
getEffectTracker().track("embedding", "session_close", async () => {
|
|
1015
1013
|
const embeddingParts = [
|
|
@@ -1039,8 +1037,8 @@ export async function sessionClose(params) {
|
|
|
1039
1037
|
}
|
|
1040
1038
|
});
|
|
1041
1039
|
}
|
|
1042
|
-
//
|
|
1043
|
-
//
|
|
1040
|
+
// Tracked fire-and-forget scar usage recording (was blocking ~200-500ms)
|
|
1041
|
+
// scars_to_record may now come from auto-bridge above
|
|
1044
1042
|
if (params.scars_to_record && params.scars_to_record.length > 0) {
|
|
1045
1043
|
const project = isRetroactive
|
|
1046
1044
|
? "default"
|
|
@@ -1054,7 +1052,7 @@ export async function sessionClose(params) {
|
|
|
1054
1052
|
const perfData = buildPerformanceData("session_close", latencyMs, 1);
|
|
1055
1053
|
// Update relevance data for memories applied during session
|
|
1056
1054
|
if (normalizedScarsApplied.length > 0) {
|
|
1057
|
-
updateRelevanceData(sessionId, normalizedScarsApplied).catch(() =>
|
|
1055
|
+
updateRelevanceData(sessionId, normalizedScarsApplied).catch((err) => console.error("[session_close] updateRelevanceData failed:", err instanceof Error ? err.message : err));
|
|
1058
1056
|
}
|
|
1059
1057
|
// Record metrics
|
|
1060
1058
|
recordMetrics({
|
|
@@ -1077,8 +1075,11 @@ export async function sessionClose(params) {
|
|
|
1077
1075
|
retroactive: isRetroactive,
|
|
1078
1076
|
},
|
|
1079
1077
|
}).catch(() => { });
|
|
1080
|
-
//
|
|
1078
|
+
// Clear session state after successful close
|
|
1081
1079
|
clearCurrentSession();
|
|
1080
|
+
// Generate agent-briefing.md for PMEM bridge
|
|
1081
|
+
const decisionsCount = params.decisions?.length || 0;
|
|
1082
|
+
await writeAgentBriefing(learningsCount, decisionsCount);
|
|
1082
1083
|
// GIT-21: Clean up session files (registry, per-session dir, legacy file)
|
|
1083
1084
|
cleanupSessionFiles(sessionId);
|
|
1084
1085
|
// Clean up payload file AFTER successful close (not before — crash safety)
|
|
@@ -1102,7 +1103,7 @@ export async function sessionClose(params) {
|
|
|
1102
1103
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1103
1104
|
const latencyMs = timer.stop();
|
|
1104
1105
|
const perfData = buildPerformanceData("session_close", latencyMs, 0);
|
|
1105
|
-
//
|
|
1106
|
+
// Clear session state even on error (session is done either way)
|
|
1106
1107
|
clearCurrentSession();
|
|
1107
1108
|
const errorDisplay = formatCloseDisplay(sessionId, closeCompliance, params, learningsCount, false, [`Failed to persist session: ${errorMessage}`], transcriptStatus);
|
|
1108
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.
|