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.
Files changed (299) hide show
  1. package/CHANGELOG.md +20 -6
  2. package/README.md +30 -9
  3. package/dist/commands/check.d.ts +1 -1
  4. package/dist/commands/check.js +4 -3
  5. package/dist/diagnostics/anonymizer.d.ts +1 -1
  6. package/dist/diagnostics/anonymizer.js +1 -1
  7. package/dist/diagnostics/channels.d.ts +1 -1
  8. package/dist/diagnostics/channels.js +1 -1
  9. package/dist/diagnostics/collector.d.ts +1 -1
  10. package/dist/diagnostics/collector.js +1 -1
  11. package/dist/diagnostics/index.d.ts +1 -1
  12. package/dist/diagnostics/index.js +1 -1
  13. package/dist/hooks/quick-retrieve.js +2 -1
  14. package/dist/index.js +0 -0
  15. package/dist/schemas/active-sessions.d.ts +9 -9
  16. package/dist/schemas/active-sessions.js +1 -1
  17. package/dist/schemas/common.d.ts +2 -5
  18. package/dist/schemas/common.js +13 -7
  19. package/dist/schemas/create-learning.d.ts +4 -4
  20. package/dist/schemas/create-learning.js +1 -1
  21. package/dist/schemas/session-close.d.ts +5 -8
  22. package/dist/schemas/session-close.js +7 -3
  23. package/dist/schemas/session-start.d.ts +4 -4
  24. package/dist/schemas/session-start.js +1 -1
  25. package/dist/schemas/thread.d.ts +1 -1
  26. package/dist/schemas/thread.js +1 -1
  27. package/dist/server.d.ts +2 -2
  28. package/dist/server.js +21 -10
  29. package/dist/services/active-sessions.js +3 -2
  30. package/dist/services/agent-briefing.d.ts +12 -0
  31. package/dist/services/agent-briefing.js +81 -0
  32. package/dist/services/agent-detection.d.ts +2 -1
  33. package/dist/services/agent-detection.js +23 -14
  34. package/dist/services/analytics.d.ts +1 -1
  35. package/dist/services/analytics.js +3 -3
  36. package/dist/services/behavioral-decay.js +2 -2
  37. package/dist/services/cache.d.ts +1 -1
  38. package/dist/services/cache.js +1 -1
  39. package/dist/services/compliance-validator.d.ts +1 -1
  40. package/dist/services/compliance-validator.js +5 -5
  41. package/dist/services/config.d.ts +1 -1
  42. package/dist/services/config.js +1 -1
  43. package/dist/services/file-lock.js +12 -0
  44. package/dist/services/gitmem-dir.d.ts +17 -4
  45. package/dist/services/gitmem-dir.js +43 -9
  46. package/dist/services/local-file-storage.d.ts +1 -1
  47. package/dist/services/local-file-storage.js +16 -10
  48. package/dist/services/local-vector-search.d.ts +1 -1
  49. package/dist/services/local-vector-search.js +2 -2
  50. package/dist/services/metrics.d.ts +6 -6
  51. package/dist/services/metrics.js +8 -8
  52. package/dist/services/session-state.d.ts +7 -7
  53. package/dist/services/session-state.js +19 -7
  54. package/dist/services/startup.d.ts +1 -1
  55. package/dist/services/startup.js +3 -2
  56. package/dist/services/supabase-client.d.ts +17 -6
  57. package/dist/services/supabase-client.js +44 -8
  58. package/dist/services/thread-manager.d.ts +1 -1
  59. package/dist/services/thread-manager.js +5 -5
  60. package/dist/services/thread-supabase.d.ts +1 -1
  61. package/dist/services/thread-supabase.js +2 -2
  62. package/dist/services/tier.d.ts +2 -0
  63. package/dist/services/tier.js +4 -0
  64. package/dist/services/transcript-chunker.d.ts +1 -1
  65. package/dist/services/transcript-chunker.js +1 -1
  66. package/dist/services/triple-writer.d.ts +4 -4
  67. package/dist/services/triple-writer.js +11 -20
  68. package/dist/services/variant-assignment.d.ts +6 -6
  69. package/dist/services/variant-assignment.js +9 -8
  70. package/dist/tools/analyze.d.ts +2 -2
  71. package/dist/tools/analyze.js +2 -2
  72. package/dist/tools/archive-learning.js +36 -22
  73. package/dist/tools/confirm-scars.js +4 -0
  74. package/dist/tools/create-decision.d.ts +1 -1
  75. package/dist/tools/create-decision.js +2 -2
  76. package/dist/tools/create-learning.d.ts +1 -1
  77. package/dist/tools/create-learning.js +4 -4
  78. package/dist/tools/create-linear-issue.d.ts +18 -0
  79. package/dist/tools/create-linear-issue.js +197 -0
  80. package/dist/tools/create-thread.d.ts +1 -1
  81. package/dist/tools/create-thread.js +2 -2
  82. package/dist/tools/definitions.d.ts +280 -58
  83. package/dist/tools/definitions.js +127 -87
  84. package/dist/tools/get-transcript.d.ts +1 -1
  85. package/dist/tools/get-transcript.js +1 -1
  86. package/dist/tools/graph-traverse.d.ts +1 -1
  87. package/dist/tools/graph-traverse.js +20 -17
  88. package/dist/tools/list-threads.d.ts +2 -2
  89. package/dist/tools/list-threads.js +4 -4
  90. package/dist/tools/log.d.ts +1 -1
  91. package/dist/tools/log.js +1 -1
  92. package/dist/tools/prepare-context.d.ts +1 -1
  93. package/dist/tools/prepare-context.js +2 -2
  94. package/dist/tools/recall.d.ts +5 -4
  95. package/dist/tools/recall.js +37 -28
  96. package/dist/tools/record-scar-usage-batch.js +2 -2
  97. package/dist/tools/record-scar-usage.d.ts +1 -1
  98. package/dist/tools/record-scar-usage.js +3 -3
  99. package/dist/tools/resolve-thread.d.ts +2 -2
  100. package/dist/tools/resolve-thread.js +3 -3
  101. package/dist/tools/save-transcript.d.ts +1 -1
  102. package/dist/tools/save-transcript.js +1 -1
  103. package/dist/tools/search.d.ts +1 -1
  104. package/dist/tools/search.js +1 -1
  105. package/dist/tools/session-close.d.ts +1 -1
  106. package/dist/tools/session-close.js +58 -57
  107. package/dist/tools/session-start.d.ts +5 -5
  108. package/dist/tools/session-start.js +63 -61
  109. package/dist/types/index.d.ts +17 -13
  110. package/hooks/.claude-plugin/plugin.json +1 -1
  111. package/hooks/scripts/post-tool-use.sh +1 -1
  112. package/hooks/scripts/recall-check.sh +1 -1
  113. package/hooks/scripts/session-close-check.sh +1 -1
  114. package/hooks/scripts/session-start.sh +1 -1
  115. package/package.json +6 -3
  116. package/schema/starter-scars.json +3 -153
  117. package/dist/commands/check.d.ts.map +0 -1
  118. package/dist/commands/check.js.map +0 -1
  119. package/dist/constants/closing-questions.d.ts.map +0 -1
  120. package/dist/constants/closing-questions.js.map +0 -1
  121. package/dist/diagnostics/anonymizer.d.ts.map +0 -1
  122. package/dist/diagnostics/anonymizer.js.map +0 -1
  123. package/dist/diagnostics/channels.d.ts.map +0 -1
  124. package/dist/diagnostics/channels.js.map +0 -1
  125. package/dist/diagnostics/collector.d.ts.map +0 -1
  126. package/dist/diagnostics/collector.js.map +0 -1
  127. package/dist/diagnostics/index.d.ts.map +0 -1
  128. package/dist/diagnostics/index.js.map +0 -1
  129. package/dist/hooks/format-utils.d.ts.map +0 -1
  130. package/dist/hooks/format-utils.js.map +0 -1
  131. package/dist/hooks/quick-retrieve.d.ts.map +0 -1
  132. package/dist/hooks/quick-retrieve.js.map +0 -1
  133. package/dist/index.d.ts.map +0 -1
  134. package/dist/index.js.map +0 -1
  135. package/dist/schemas/absorb-observations.d.ts.map +0 -1
  136. package/dist/schemas/absorb-observations.js.map +0 -1
  137. package/dist/schemas/active-sessions.d.ts.map +0 -1
  138. package/dist/schemas/active-sessions.js.map +0 -1
  139. package/dist/schemas/analyze.d.ts.map +0 -1
  140. package/dist/schemas/analyze.js.map +0 -1
  141. package/dist/schemas/common.d.ts.map +0 -1
  142. package/dist/schemas/common.js.map +0 -1
  143. package/dist/schemas/create-decision.d.ts.map +0 -1
  144. package/dist/schemas/create-decision.js.map +0 -1
  145. package/dist/schemas/create-learning.d.ts.map +0 -1
  146. package/dist/schemas/create-learning.js.map +0 -1
  147. package/dist/schemas/get-transcript.d.ts.map +0 -1
  148. package/dist/schemas/get-transcript.js.map +0 -1
  149. package/dist/schemas/index.d.ts.map +0 -1
  150. package/dist/schemas/index.js.map +0 -1
  151. package/dist/schemas/log.d.ts.map +0 -1
  152. package/dist/schemas/log.js.map +0 -1
  153. package/dist/schemas/prepare-context.d.ts.map +0 -1
  154. package/dist/schemas/prepare-context.js.map +0 -1
  155. package/dist/schemas/recall.d.ts.map +0 -1
  156. package/dist/schemas/recall.js.map +0 -1
  157. package/dist/schemas/record-scar-usage-batch.d.ts.map +0 -1
  158. package/dist/schemas/record-scar-usage-batch.js.map +0 -1
  159. package/dist/schemas/record-scar-usage.d.ts.map +0 -1
  160. package/dist/schemas/record-scar-usage.js.map +0 -1
  161. package/dist/schemas/registry.d.ts.map +0 -1
  162. package/dist/schemas/registry.js.map +0 -1
  163. package/dist/schemas/save-transcript.d.ts.map +0 -1
  164. package/dist/schemas/save-transcript.js.map +0 -1
  165. package/dist/schemas/search-transcripts.d.ts.map +0 -1
  166. package/dist/schemas/search-transcripts.js.map +0 -1
  167. package/dist/schemas/search.d.ts.map +0 -1
  168. package/dist/schemas/search.js.map +0 -1
  169. package/dist/schemas/session-close.d.ts.map +0 -1
  170. package/dist/schemas/session-close.js.map +0 -1
  171. package/dist/schemas/session-start.d.ts.map +0 -1
  172. package/dist/schemas/session-start.js.map +0 -1
  173. package/dist/schemas/thread.d.ts.map +0 -1
  174. package/dist/schemas/thread.js.map +0 -1
  175. package/dist/server.d.ts.map +0 -1
  176. package/dist/server.js.map +0 -1
  177. package/dist/services/active-sessions.d.ts.map +0 -1
  178. package/dist/services/active-sessions.js.map +0 -1
  179. package/dist/services/agent-detection.d.ts.map +0 -1
  180. package/dist/services/agent-detection.js.map +0 -1
  181. package/dist/services/analytics.d.ts.map +0 -1
  182. package/dist/services/analytics.js.map +0 -1
  183. package/dist/services/behavioral-decay.d.ts.map +0 -1
  184. package/dist/services/behavioral-decay.js.map +0 -1
  185. package/dist/services/bm25.d.ts.map +0 -1
  186. package/dist/services/bm25.js.map +0 -1
  187. package/dist/services/cache.d.ts.map +0 -1
  188. package/dist/services/cache.js.map +0 -1
  189. package/dist/services/cache.test.d.ts +0 -8
  190. package/dist/services/cache.test.d.ts.map +0 -1
  191. package/dist/services/cache.test.js +0 -267
  192. package/dist/services/cache.test.js.map +0 -1
  193. package/dist/services/compliance-validator.d.ts.map +0 -1
  194. package/dist/services/compliance-validator.js.map +0 -1
  195. package/dist/services/config.d.ts.map +0 -1
  196. package/dist/services/config.js.map +0 -1
  197. package/dist/services/display-protocol.d.ts.map +0 -1
  198. package/dist/services/display-protocol.js.map +0 -1
  199. package/dist/services/effect-tracker.d.ts.map +0 -1
  200. package/dist/services/effect-tracker.js.map +0 -1
  201. package/dist/services/embedding.d.ts.map +0 -1
  202. package/dist/services/embedding.js.map +0 -1
  203. package/dist/services/file-lock.d.ts.map +0 -1
  204. package/dist/services/file-lock.js.map +0 -1
  205. package/dist/services/gitmem-dir.d.ts.map +0 -1
  206. package/dist/services/gitmem-dir.js.map +0 -1
  207. package/dist/services/local-file-storage.d.ts.map +0 -1
  208. package/dist/services/local-file-storage.js.map +0 -1
  209. package/dist/services/local-vector-search.d.ts.map +0 -1
  210. package/dist/services/local-vector-search.js.map +0 -1
  211. package/dist/services/metrics.d.ts.map +0 -1
  212. package/dist/services/metrics.js.map +0 -1
  213. package/dist/services/session-state.d.ts.map +0 -1
  214. package/dist/services/session-state.js.map +0 -1
  215. package/dist/services/startup.d.ts.map +0 -1
  216. package/dist/services/startup.js.map +0 -1
  217. package/dist/services/storage.d.ts.map +0 -1
  218. package/dist/services/storage.js.map +0 -1
  219. package/dist/services/supabase-client.d.ts.map +0 -1
  220. package/dist/services/supabase-client.js.map +0 -1
  221. package/dist/services/thread-dedup.d.ts.map +0 -1
  222. package/dist/services/thread-dedup.js.map +0 -1
  223. package/dist/services/thread-manager.d.ts.map +0 -1
  224. package/dist/services/thread-manager.js.map +0 -1
  225. package/dist/services/thread-suggestions.d.ts.map +0 -1
  226. package/dist/services/thread-suggestions.js.map +0 -1
  227. package/dist/services/thread-supabase.d.ts.map +0 -1
  228. package/dist/services/thread-supabase.js.map +0 -1
  229. package/dist/services/thread-vitality.d.ts.map +0 -1
  230. package/dist/services/thread-vitality.js.map +0 -1
  231. package/dist/services/tier.d.ts.map +0 -1
  232. package/dist/services/tier.js.map +0 -1
  233. package/dist/services/timezone.d.ts.map +0 -1
  234. package/dist/services/timezone.js.map +0 -1
  235. package/dist/services/transcript-chunker.d.ts.map +0 -1
  236. package/dist/services/transcript-chunker.js.map +0 -1
  237. package/dist/services/triple-writer.d.ts.map +0 -1
  238. package/dist/services/triple-writer.js.map +0 -1
  239. package/dist/services/variant-assignment.d.ts.map +0 -1
  240. package/dist/services/variant-assignment.js.map +0 -1
  241. package/dist/services/variant-generation.d.ts.map +0 -1
  242. package/dist/services/variant-generation.js.map +0 -1
  243. package/dist/tools/absorb-observations.d.ts.map +0 -1
  244. package/dist/tools/absorb-observations.js.map +0 -1
  245. package/dist/tools/analyze.d.ts.map +0 -1
  246. package/dist/tools/analyze.js.map +0 -1
  247. package/dist/tools/archive-learning.d.ts.map +0 -1
  248. package/dist/tools/archive-learning.js.map +0 -1
  249. package/dist/tools/cleanup-threads.d.ts.map +0 -1
  250. package/dist/tools/cleanup-threads.js.map +0 -1
  251. package/dist/tools/confirm-scars.d.ts.map +0 -1
  252. package/dist/tools/confirm-scars.js.map +0 -1
  253. package/dist/tools/create-decision.d.ts.map +0 -1
  254. package/dist/tools/create-decision.js.map +0 -1
  255. package/dist/tools/create-learning.d.ts.map +0 -1
  256. package/dist/tools/create-learning.js.map +0 -1
  257. package/dist/tools/create-thread.d.ts.map +0 -1
  258. package/dist/tools/create-thread.js.map +0 -1
  259. package/dist/tools/definitions.d.ts.map +0 -1
  260. package/dist/tools/definitions.js.map +0 -1
  261. package/dist/tools/dismiss-suggestion.d.ts.map +0 -1
  262. package/dist/tools/dismiss-suggestion.js.map +0 -1
  263. package/dist/tools/get-transcript.d.ts.map +0 -1
  264. package/dist/tools/get-transcript.js.map +0 -1
  265. package/dist/tools/graph-traverse.d.ts.map +0 -1
  266. package/dist/tools/graph-traverse.js.map +0 -1
  267. package/dist/tools/list-threads.d.ts.map +0 -1
  268. package/dist/tools/list-threads.js.map +0 -1
  269. package/dist/tools/log.d.ts.map +0 -1
  270. package/dist/tools/log.js.map +0 -1
  271. package/dist/tools/prepare-context.d.ts.map +0 -1
  272. package/dist/tools/prepare-context.js.map +0 -1
  273. package/dist/tools/promote-suggestion.d.ts.map +0 -1
  274. package/dist/tools/promote-suggestion.js.map +0 -1
  275. package/dist/tools/recall.d.ts.map +0 -1
  276. package/dist/tools/recall.js.map +0 -1
  277. package/dist/tools/recall.test.d.ts +0 -5
  278. package/dist/tools/recall.test.d.ts.map +0 -1
  279. package/dist/tools/recall.test.js +0 -155
  280. package/dist/tools/recall.test.js.map +0 -1
  281. package/dist/tools/record-scar-usage-batch.d.ts.map +0 -1
  282. package/dist/tools/record-scar-usage-batch.js.map +0 -1
  283. package/dist/tools/record-scar-usage.d.ts.map +0 -1
  284. package/dist/tools/record-scar-usage.js.map +0 -1
  285. package/dist/tools/resolve-thread.d.ts.map +0 -1
  286. package/dist/tools/resolve-thread.js.map +0 -1
  287. package/dist/tools/save-transcript.d.ts.map +0 -1
  288. package/dist/tools/save-transcript.js.map +0 -1
  289. package/dist/tools/search-transcripts.d.ts.map +0 -1
  290. package/dist/tools/search-transcripts.js.map +0 -1
  291. package/dist/tools/search.d.ts.map +0 -1
  292. package/dist/tools/search.js.map +0 -1
  293. package/dist/tools/session-close.d.ts.map +0 -1
  294. package/dist/tools/session-close.js.map +0 -1
  295. package/dist/tools/session-start.d.ts.map +0 -1
  296. package/dist/tools/session-start.js.map +0 -1
  297. package/dist/types/index.d.ts.map +0 -1
  298. package/dist/types/index.js.map +0 -1
  299. 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 (OD-429)
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"; // OD-547, OD-552, v2 Phase 2
16
- import { normalizeThreads, mergeThreadStates, migrateStringThread, saveThreadsFile } from "../services/thread-manager.js"; // OD-thread-lifecycle
17
- import { deduplicateThreadList } from "../services/thread-dedup.js"; // OD-641
18
- import { syncThreadsToSupabase, loadOpenThreadEmbeddings } from "../services/thread-supabase.js"; // OD-624
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, getGitmemDir, getSessionPath } from "../services/gitmem-dir.js";
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
- * OD-538: Search by recency, not by filename matching (supports post-compaction)
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
- * OD-538: Provides traceability between GitMem sessions and IDE sessions
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
- // OD-thread-lifecycle: Normalize threads for free tier too
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 = path.join(getGitmemDir(), "sessions", sessionId);
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 (OD-548)
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
- // OD-666: Distill Q8+Q9 into rapport_summary for cross-agent surfacing
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
- // OD-thread-lifecycle: Normalize and merge open threads
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
- // OD-534: If project_state provided, prepend it to open_threads as a ThreadObject
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
- // OD-540: Process transcript for semantic search (fire-and-forget — chunking is expensive)
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
- // OD-548: Validate session_id format before any DB calls
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
- // Close type auto-detection: reject mismatched close types based on session activity.
754
- // Standard close on a short/trivial session is wasteful; quick close on a long session loses data.
755
- // t-f7c2fa01: If closing_reflection is already present (agent answered 7 questions),
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
- if (params.close_type === "standard" && activity.duration_min < 30 && isMinimal) {
765
- const latencyMs = timer.stop();
766
- const perfData = buildPerformanceData("session_close", latencyMs, 0);
767
- return {
768
- success: false,
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" && (activity.duration_min >= 30 || !isMinimal)) {
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
- // OD-624: Sync threads to Supabase (fire-and-forget, non-blocking)
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
- // OD-538: Capture transcript if enabled (default true for CLI/DAC)
985
+ // Capture transcript if enabled (default true for CLI/DAC)
988
986
  let transcriptStatus;
989
987
  const shouldCaptureTranscript = params.capture_transcript !== false &&
990
- (agentIdentity === "CLI" || agentIdentity === "DAC");
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
- // OD-552: Auto-bridge Q6 answers to scar_usage records
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
- // OD-646: Upsert session WITHOUT embedding (fast path)
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
- // OD-646: Tracked fire-and-forget embedding generation + session update + thread detection
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
- // OD-646: Tracked fire-and-forget scar usage recording (was blocking ~200-500ms)
1043
- // OD-552: scars_to_record may now come from auto-bridge above
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
- // OD-547: Clear session state after successful close
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
- // OD-547: Clear session state even on error (session is done either way)
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 (OD-645: Lean Start)
7
+ * Performance target: <750ms
8
8
  *
9
- * OD-645: Removed scar/wins queries from start pipeline.
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
- * OD-489: Returns detailed performance breakdown for test harness validation.
18
+ * Returns detailed performance breakdown for test harness validation.
19
19
  * Key metrics: network_calls_made, fully_local, breakdown per component.
20
20
  *
21
- * OD-558: Guards against overwriting existing active sessions.
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
- * OD-645: Scars/wins removed — load on-demand via recall/search.
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.