gitmem-mcp 0.2.0

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 (316) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/CLAUDE.md.template +65 -0
  3. package/LICENSE +21 -0
  4. package/README.md +221 -0
  5. package/bin/gitmem.js +383 -0
  6. package/dist/commands/check.d.ts +33 -0
  7. package/dist/commands/check.d.ts.map +1 -0
  8. package/dist/commands/check.js +492 -0
  9. package/dist/commands/check.js.map +1 -0
  10. package/dist/constants/closing-questions.d.ts +40 -0
  11. package/dist/constants/closing-questions.d.ts.map +1 -0
  12. package/dist/constants/closing-questions.js +107 -0
  13. package/dist/constants/closing-questions.js.map +1 -0
  14. package/dist/diagnostics/anonymizer.d.ts +55 -0
  15. package/dist/diagnostics/anonymizer.d.ts.map +1 -0
  16. package/dist/diagnostics/anonymizer.js +191 -0
  17. package/dist/diagnostics/anonymizer.js.map +1 -0
  18. package/dist/diagnostics/channels.d.ts +132 -0
  19. package/dist/diagnostics/channels.d.ts.map +1 -0
  20. package/dist/diagnostics/channels.js +150 -0
  21. package/dist/diagnostics/channels.js.map +1 -0
  22. package/dist/diagnostics/collector.d.ts +183 -0
  23. package/dist/diagnostics/collector.d.ts.map +1 -0
  24. package/dist/diagnostics/collector.js +227 -0
  25. package/dist/diagnostics/collector.js.map +1 -0
  26. package/dist/diagnostics/index.d.ts +28 -0
  27. package/dist/diagnostics/index.d.ts.map +1 -0
  28. package/dist/diagnostics/index.js +31 -0
  29. package/dist/diagnostics/index.js.map +1 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +18 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/schemas/absorb-observations.d.ts +63 -0
  35. package/dist/schemas/absorb-observations.d.ts.map +1 -0
  36. package/dist/schemas/absorb-observations.js +25 -0
  37. package/dist/schemas/absorb-observations.js.map +1 -0
  38. package/dist/schemas/active-sessions.d.ts +71 -0
  39. package/dist/schemas/active-sessions.d.ts.map +1 -0
  40. package/dist/schemas/active-sessions.js +19 -0
  41. package/dist/schemas/active-sessions.js.map +1 -0
  42. package/dist/schemas/analyze.d.ts +38 -0
  43. package/dist/schemas/analyze.d.ts.map +1 -0
  44. package/dist/schemas/analyze.js +30 -0
  45. package/dist/schemas/analyze.js.map +1 -0
  46. package/dist/schemas/common.d.ts +55 -0
  47. package/dist/schemas/common.d.ts.map +1 -0
  48. package/dist/schemas/common.js +65 -0
  49. package/dist/schemas/common.js.map +1 -0
  50. package/dist/schemas/create-decision.d.ts +48 -0
  51. package/dist/schemas/create-decision.d.ts.map +1 -0
  52. package/dist/schemas/create-decision.js +31 -0
  53. package/dist/schemas/create-decision.js.map +1 -0
  54. package/dist/schemas/create-learning.d.ts +107 -0
  55. package/dist/schemas/create-learning.d.ts.map +1 -0
  56. package/dist/schemas/create-learning.js +64 -0
  57. package/dist/schemas/create-learning.js.map +1 -0
  58. package/dist/schemas/get-transcript.d.ts +24 -0
  59. package/dist/schemas/get-transcript.d.ts.map +1 -0
  60. package/dist/schemas/get-transcript.js +22 -0
  61. package/dist/schemas/get-transcript.js.map +1 -0
  62. package/dist/schemas/index.d.ts +23 -0
  63. package/dist/schemas/index.d.ts.map +1 -0
  64. package/dist/schemas/index.js +23 -0
  65. package/dist/schemas/index.js.map +1 -0
  66. package/dist/schemas/log.d.ts +36 -0
  67. package/dist/schemas/log.d.ts.map +1 -0
  68. package/dist/schemas/log.js +27 -0
  69. package/dist/schemas/log.js.map +1 -0
  70. package/dist/schemas/prepare-context.d.ts +41 -0
  71. package/dist/schemas/prepare-context.d.ts.map +1 -0
  72. package/dist/schemas/prepare-context.js +31 -0
  73. package/dist/schemas/prepare-context.js.map +1 -0
  74. package/dist/schemas/recall.d.ts +41 -0
  75. package/dist/schemas/recall.d.ts.map +1 -0
  76. package/dist/schemas/recall.js +47 -0
  77. package/dist/schemas/recall.js.map +1 -0
  78. package/dist/schemas/record-scar-usage-batch.d.ts +82 -0
  79. package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -0
  80. package/dist/schemas/record-scar-usage-batch.js +25 -0
  81. package/dist/schemas/record-scar-usage-batch.js.map +1 -0
  82. package/dist/schemas/record-scar-usage.d.ts +51 -0
  83. package/dist/schemas/record-scar-usage.d.ts.map +1 -0
  84. package/dist/schemas/record-scar-usage.js +32 -0
  85. package/dist/schemas/record-scar-usage.js.map +1 -0
  86. package/dist/schemas/save-transcript.d.ts +38 -0
  87. package/dist/schemas/save-transcript.d.ts.map +1 -0
  88. package/dist/schemas/save-transcript.js +30 -0
  89. package/dist/schemas/save-transcript.js.map +1 -0
  90. package/dist/schemas/search.d.ts +36 -0
  91. package/dist/schemas/search.d.ts.map +1 -0
  92. package/dist/schemas/search.js +27 -0
  93. package/dist/schemas/search.js.map +1 -0
  94. package/dist/schemas/session-close.d.ts +371 -0
  95. package/dist/schemas/session-close.d.ts.map +1 -0
  96. package/dist/schemas/session-close.js +95 -0
  97. package/dist/schemas/session-close.js.map +1 -0
  98. package/dist/schemas/session-start.d.ts +46 -0
  99. package/dist/schemas/session-start.d.ts.map +1 -0
  100. package/dist/schemas/session-start.js +33 -0
  101. package/dist/schemas/session-start.js.map +1 -0
  102. package/dist/schemas/thread.d.ts +72 -0
  103. package/dist/schemas/thread.d.ts.map +1 -0
  104. package/dist/schemas/thread.js +39 -0
  105. package/dist/schemas/thread.js.map +1 -0
  106. package/dist/server.d.ts +22 -0
  107. package/dist/server.d.ts.map +1 -0
  108. package/dist/server.js +313 -0
  109. package/dist/server.js.map +1 -0
  110. package/dist/services/active-sessions.d.ts +66 -0
  111. package/dist/services/active-sessions.d.ts.map +1 -0
  112. package/dist/services/active-sessions.js +311 -0
  113. package/dist/services/active-sessions.js.map +1 -0
  114. package/dist/services/agent-detection.d.ts +25 -0
  115. package/dist/services/agent-detection.d.ts.map +1 -0
  116. package/dist/services/agent-detection.js +93 -0
  117. package/dist/services/agent-detection.js.map +1 -0
  118. package/dist/services/analytics.d.ts +201 -0
  119. package/dist/services/analytics.d.ts.map +1 -0
  120. package/dist/services/analytics.js +483 -0
  121. package/dist/services/analytics.js.map +1 -0
  122. package/dist/services/cache.d.ts +148 -0
  123. package/dist/services/cache.d.ts.map +1 -0
  124. package/dist/services/cache.js +384 -0
  125. package/dist/services/cache.js.map +1 -0
  126. package/dist/services/cache.test.d.ts +8 -0
  127. package/dist/services/cache.test.d.ts.map +1 -0
  128. package/dist/services/cache.test.js +267 -0
  129. package/dist/services/cache.test.js.map +1 -0
  130. package/dist/services/compliance-validator.d.ts +30 -0
  131. package/dist/services/compliance-validator.d.ts.map +1 -0
  132. package/dist/services/compliance-validator.js +257 -0
  133. package/dist/services/compliance-validator.js.map +1 -0
  134. package/dist/services/config.d.ts +48 -0
  135. package/dist/services/config.d.ts.map +1 -0
  136. package/dist/services/config.js +128 -0
  137. package/dist/services/config.js.map +1 -0
  138. package/dist/services/embedding.d.ts +58 -0
  139. package/dist/services/embedding.d.ts.map +1 -0
  140. package/dist/services/embedding.js +243 -0
  141. package/dist/services/embedding.js.map +1 -0
  142. package/dist/services/gitmem-dir.d.ts +38 -0
  143. package/dist/services/gitmem-dir.d.ts.map +1 -0
  144. package/dist/services/gitmem-dir.js +84 -0
  145. package/dist/services/gitmem-dir.js.map +1 -0
  146. package/dist/services/local-file-storage.d.ts +56 -0
  147. package/dist/services/local-file-storage.d.ts.map +1 -0
  148. package/dist/services/local-file-storage.js +213 -0
  149. package/dist/services/local-file-storage.js.map +1 -0
  150. package/dist/services/local-vector-search.d.ts +137 -0
  151. package/dist/services/local-vector-search.d.ts.map +1 -0
  152. package/dist/services/local-vector-search.js +311 -0
  153. package/dist/services/local-vector-search.js.map +1 -0
  154. package/dist/services/metrics.d.ts +104 -0
  155. package/dist/services/metrics.d.ts.map +1 -0
  156. package/dist/services/metrics.js +264 -0
  157. package/dist/services/metrics.js.map +1 -0
  158. package/dist/services/session-state.d.ts +113 -0
  159. package/dist/services/session-state.d.ts.map +1 -0
  160. package/dist/services/session-state.js +203 -0
  161. package/dist/services/session-state.js.map +1 -0
  162. package/dist/services/startup.d.ts +112 -0
  163. package/dist/services/startup.d.ts.map +1 -0
  164. package/dist/services/startup.js +436 -0
  165. package/dist/services/startup.js.map +1 -0
  166. package/dist/services/storage.d.ts +43 -0
  167. package/dist/services/storage.d.ts.map +1 -0
  168. package/dist/services/storage.js +92 -0
  169. package/dist/services/storage.js.map +1 -0
  170. package/dist/services/supabase-client.d.ts +163 -0
  171. package/dist/services/supabase-client.d.ts.map +1 -0
  172. package/dist/services/supabase-client.js +510 -0
  173. package/dist/services/supabase-client.js.map +1 -0
  174. package/dist/services/thread-dedup.d.ts +44 -0
  175. package/dist/services/thread-dedup.d.ts.map +1 -0
  176. package/dist/services/thread-dedup.js +113 -0
  177. package/dist/services/thread-dedup.js.map +1 -0
  178. package/dist/services/thread-manager.d.ts +77 -0
  179. package/dist/services/thread-manager.d.ts.map +1 -0
  180. package/dist/services/thread-manager.js +250 -0
  181. package/dist/services/thread-manager.js.map +1 -0
  182. package/dist/services/thread-suggestions.d.ts +66 -0
  183. package/dist/services/thread-suggestions.d.ts.map +1 -0
  184. package/dist/services/thread-suggestions.js +243 -0
  185. package/dist/services/thread-suggestions.js.map +1 -0
  186. package/dist/services/thread-supabase.d.ts +111 -0
  187. package/dist/services/thread-supabase.d.ts.map +1 -0
  188. package/dist/services/thread-supabase.js +459 -0
  189. package/dist/services/thread-supabase.js.map +1 -0
  190. package/dist/services/thread-vitality.d.ts +65 -0
  191. package/dist/services/thread-vitality.d.ts.map +1 -0
  192. package/dist/services/thread-vitality.js +143 -0
  193. package/dist/services/thread-vitality.js.map +1 -0
  194. package/dist/services/tier.d.ts +52 -0
  195. package/dist/services/tier.d.ts.map +1 -0
  196. package/dist/services/tier.js +109 -0
  197. package/dist/services/tier.js.map +1 -0
  198. package/dist/services/timezone.d.ts +37 -0
  199. package/dist/services/timezone.d.ts.map +1 -0
  200. package/dist/services/timezone.js +147 -0
  201. package/dist/services/timezone.js.map +1 -0
  202. package/dist/services/transcript-chunker.d.ts +18 -0
  203. package/dist/services/transcript-chunker.d.ts.map +1 -0
  204. package/dist/services/transcript-chunker.js +237 -0
  205. package/dist/services/transcript-chunker.js.map +1 -0
  206. package/dist/services/triple-writer.d.ts +128 -0
  207. package/dist/services/triple-writer.d.ts.map +1 -0
  208. package/dist/services/triple-writer.js +338 -0
  209. package/dist/services/triple-writer.js.map +1 -0
  210. package/dist/services/variant-assignment.d.ts +92 -0
  211. package/dist/services/variant-assignment.d.ts.map +1 -0
  212. package/dist/services/variant-assignment.js +196 -0
  213. package/dist/services/variant-assignment.js.map +1 -0
  214. package/dist/tools/absorb-observations.d.ts +16 -0
  215. package/dist/tools/absorb-observations.d.ts.map +1 -0
  216. package/dist/tools/absorb-observations.js +82 -0
  217. package/dist/tools/absorb-observations.js.map +1 -0
  218. package/dist/tools/analyze.d.ts +55 -0
  219. package/dist/tools/analyze.d.ts.map +1 -0
  220. package/dist/tools/analyze.js +139 -0
  221. package/dist/tools/analyze.js.map +1 -0
  222. package/dist/tools/cleanup-threads.d.ts +47 -0
  223. package/dist/tools/cleanup-threads.d.ts.map +1 -0
  224. package/dist/tools/cleanup-threads.js +127 -0
  225. package/dist/tools/cleanup-threads.js.map +1 -0
  226. package/dist/tools/confirm-scars.d.ts +23 -0
  227. package/dist/tools/confirm-scars.d.ts.map +1 -0
  228. package/dist/tools/confirm-scars.js +209 -0
  229. package/dist/tools/confirm-scars.js.map +1 -0
  230. package/dist/tools/create-decision.d.ts +15 -0
  231. package/dist/tools/create-decision.d.ts.map +1 -0
  232. package/dist/tools/create-decision.js +138 -0
  233. package/dist/tools/create-decision.js.map +1 -0
  234. package/dist/tools/create-learning.d.ts +15 -0
  235. package/dist/tools/create-learning.d.ts.map +1 -0
  236. package/dist/tools/create-learning.js +226 -0
  237. package/dist/tools/create-learning.js.map +1 -0
  238. package/dist/tools/create-thread.d.ts +42 -0
  239. package/dist/tools/create-thread.d.ts.map +1 -0
  240. package/dist/tools/create-thread.js +180 -0
  241. package/dist/tools/create-thread.js.map +1 -0
  242. package/dist/tools/definitions.d.ts +5013 -0
  243. package/dist/tools/definitions.d.ts.map +1 -0
  244. package/dist/tools/definitions.js +2017 -0
  245. package/dist/tools/definitions.js.map +1 -0
  246. package/dist/tools/dismiss-suggestion.d.ts +20 -0
  247. package/dist/tools/dismiss-suggestion.d.ts.map +1 -0
  248. package/dist/tools/dismiss-suggestion.js +40 -0
  249. package/dist/tools/dismiss-suggestion.js.map +1 -0
  250. package/dist/tools/get-transcript.d.ts +24 -0
  251. package/dist/tools/get-transcript.d.ts.map +1 -0
  252. package/dist/tools/get-transcript.js +52 -0
  253. package/dist/tools/get-transcript.js.map +1 -0
  254. package/dist/tools/graph-traverse.d.ts +83 -0
  255. package/dist/tools/graph-traverse.d.ts.map +1 -0
  256. package/dist/tools/graph-traverse.js +394 -0
  257. package/dist/tools/graph-traverse.js.map +1 -0
  258. package/dist/tools/list-threads.d.ts +15 -0
  259. package/dist/tools/list-threads.d.ts.map +1 -0
  260. package/dist/tools/list-threads.js +114 -0
  261. package/dist/tools/list-threads.js.map +1 -0
  262. package/dist/tools/log.d.ts +43 -0
  263. package/dist/tools/log.d.ts.map +1 -0
  264. package/dist/tools/log.js +157 -0
  265. package/dist/tools/log.js.map +1 -0
  266. package/dist/tools/prepare-context.d.ts +36 -0
  267. package/dist/tools/prepare-context.d.ts.map +1 -0
  268. package/dist/tools/prepare-context.js +353 -0
  269. package/dist/tools/prepare-context.js.map +1 -0
  270. package/dist/tools/promote-suggestion.d.ts +25 -0
  271. package/dist/tools/promote-suggestion.d.ts.map +1 -0
  272. package/dist/tools/promote-suggestion.js +60 -0
  273. package/dist/tools/promote-suggestion.js.map +1 -0
  274. package/dist/tools/recall.d.ts +77 -0
  275. package/dist/tools/recall.d.ts.map +1 -0
  276. package/dist/tools/recall.js +423 -0
  277. package/dist/tools/recall.js.map +1 -0
  278. package/dist/tools/recall.test.d.ts +5 -0
  279. package/dist/tools/recall.test.d.ts.map +1 -0
  280. package/dist/tools/recall.test.js +155 -0
  281. package/dist/tools/recall.test.js.map +1 -0
  282. package/dist/tools/record-scar-usage-batch.d.ts +10 -0
  283. package/dist/tools/record-scar-usage-batch.d.ts.map +1 -0
  284. package/dist/tools/record-scar-usage-batch.js +153 -0
  285. package/dist/tools/record-scar-usage-batch.js.map +1 -0
  286. package/dist/tools/record-scar-usage.d.ts +14 -0
  287. package/dist/tools/record-scar-usage.d.ts.map +1 -0
  288. package/dist/tools/record-scar-usage.js +94 -0
  289. package/dist/tools/record-scar-usage.js.map +1 -0
  290. package/dist/tools/resolve-thread.d.ts +16 -0
  291. package/dist/tools/resolve-thread.d.ts.map +1 -0
  292. package/dist/tools/resolve-thread.js +102 -0
  293. package/dist/tools/resolve-thread.js.map +1 -0
  294. package/dist/tools/save-transcript.d.ts +29 -0
  295. package/dist/tools/save-transcript.d.ts.map +1 -0
  296. package/dist/tools/save-transcript.js +97 -0
  297. package/dist/tools/save-transcript.js.map +1 -0
  298. package/dist/tools/search.d.ts +46 -0
  299. package/dist/tools/search.d.ts.map +1 -0
  300. package/dist/tools/search.js +186 -0
  301. package/dist/tools/search.js.map +1 -0
  302. package/dist/tools/session-close.d.ts +14 -0
  303. package/dist/tools/session-close.d.ts.map +1 -0
  304. package/dist/tools/session-close.js +881 -0
  305. package/dist/tools/session-close.js.map +1 -0
  306. package/dist/tools/session-start.d.ts +38 -0
  307. package/dist/tools/session-start.d.ts.map +1 -0
  308. package/dist/tools/session-start.js +1104 -0
  309. package/dist/tools/session-start.js.map +1 -0
  310. package/dist/types/index.d.ts +456 -0
  311. package/dist/types/index.d.ts.map +1 -0
  312. package/dist/types/index.js +5 -0
  313. package/dist/types/index.js.map +1 -0
  314. package/package.json +76 -0
  315. package/schema/setup.sql +193 -0
  316. package/schema/starter-scars.json +206 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * absorb_observations Tool (GitMem v2 Phase 2)
3
+ *
4
+ * Captures observations from sub-agents and teammates.
5
+ * The lead agent parses findings from sub-agent responses,
6
+ * then calls this tool to persist and analyze them.
7
+ *
8
+ * Identifies scar candidates via explicit severity or pattern matching.
9
+ * Observations are stored in-memory (session state) and optionally
10
+ * persisted to Supabase as a fire-and-forget upsert.
11
+ *
12
+ * Performance target: <500ms (in-memory + optional upsert)
13
+ */
14
+ import { v4 as uuidv4 } from "uuid";
15
+ import { addObservations, getObservations, getCurrentSession } from "../services/session-state.js";
16
+ import { hasSupabase } from "../services/tier.js";
17
+ import * as supabase from "../services/supabase-client.js";
18
+ import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
19
+ // --- Scar Candidate Detection ---
20
+ const SCAR_CANDIDATE_PATTERNS = [
21
+ /unexpected/i,
22
+ /failed silently/i,
23
+ /assumed/i,
24
+ /didn['']t realize/i,
25
+ /broken/i,
26
+ /missing/i,
27
+ /no tests?\b/i,
28
+ /data loss/i,
29
+ ];
30
+ function isScarCandidate(obs) {
31
+ if (obs.severity === "scar_candidate")
32
+ return true;
33
+ return SCAR_CANDIDATE_PATTERNS.some(p => p.test(obs.text));
34
+ }
35
+ function buildSuggestion(obs) {
36
+ const ctx = obs.context ? ` (in ${obs.context})` : "";
37
+ return `Consider creating a scar for: "${obs.text.slice(0, 80)}"${ctx} — from ${obs.source}`;
38
+ }
39
+ // --- Main Implementation ---
40
+ export async function absorbObservations(params) {
41
+ const timer = new Timer();
42
+ const metricsId = uuidv4();
43
+ // 1. Add to in-memory session state
44
+ const absorbed = addObservations(params.observations);
45
+ // 2. Identify scar candidates
46
+ const candidates = params.observations.filter(isScarCandidate);
47
+ const suggestions = candidates.map(buildSuggestion);
48
+ // 3. Optionally persist to Supabase (fire-and-forget, non-fatal)
49
+ const session = getCurrentSession();
50
+ if (hasSupabase() && supabase.isConfigured() && session) {
51
+ supabase.directUpsert("orchestra_sessions", {
52
+ id: session.sessionId,
53
+ task_observations: getObservations(),
54
+ }).catch((err) => {
55
+ console.error("[absorb_observations] Supabase persist failed (non-fatal):", err);
56
+ });
57
+ }
58
+ const latencyMs = timer.stop();
59
+ const perfData = buildPerformanceData("absorb_observations", latencyMs, absorbed);
60
+ // Fire-and-forget metrics
61
+ recordMetrics({
62
+ id: metricsId,
63
+ tool_name: "absorb_observations",
64
+ query_text: `absorb:${params.task_id || "no-task"}:${absorbed} observations`,
65
+ tables_searched: [],
66
+ latency_ms: latencyMs,
67
+ result_count: absorbed,
68
+ phase_tag: "ad_hoc",
69
+ metadata: {
70
+ task_id: params.task_id,
71
+ scar_candidates: candidates.length,
72
+ total_observations: getObservations().length,
73
+ },
74
+ }).catch(() => { });
75
+ return {
76
+ absorbed,
77
+ scar_candidates: candidates.length,
78
+ suggestions,
79
+ performance: perfData,
80
+ };
81
+ }
82
+ //# sourceMappingURL=absorb-observations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"absorb-observations.js","sourceRoot":"","sources":["../../src/tools/absorb-observations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * analyze Tool (OD-567)
3
+ *
4
+ * Session analytics and insights engine. Provides structured analysis
5
+ * of session history, closing reflections, agent patterns, and more.
6
+ *
7
+ * Starts with "summary" lens; expanded with additional lenses in
8
+ * OD-568 (Tier 1), OD-569 (Tier 2), OD-570 (Tier 3), OD-572 (Tier 4).
9
+ *
10
+ * Performance target: 3000ms
11
+ */
12
+ import type { Project, PerformanceData } from "../types/index.js";
13
+ import type { SummaryAnalytics, BlindspotsData } from "../services/analytics.js";
14
+ export type AnalyzeLens = "summary" | "reflections" | "blindspots";
15
+ export interface AnalyzeParams {
16
+ lens?: AnalyzeLens;
17
+ days?: number;
18
+ project?: Project;
19
+ agent?: string;
20
+ format?: "json" | "text";
21
+ }
22
+ export interface AnalyzeResult {
23
+ success: boolean;
24
+ lens: string;
25
+ data?: SummaryAnalytics | ReflectionsData | BlindspotsData | null;
26
+ text?: string;
27
+ error?: string;
28
+ performance: PerformanceData;
29
+ }
30
+ type ReflectionEntry = {
31
+ text: string;
32
+ session_id: string;
33
+ agent: string;
34
+ date: string;
35
+ };
36
+ type ReflectionCategory = {
37
+ entries: ReflectionEntry[];
38
+ total_count: number;
39
+ };
40
+ interface ReflectionsData {
41
+ period: {
42
+ start: string;
43
+ end: string;
44
+ days: number;
45
+ };
46
+ total_sessions_scanned: number;
47
+ sessions_with_reflections: number;
48
+ what_broke: ReflectionCategory;
49
+ what_worked: ReflectionCategory;
50
+ wrong_assumptions: ReflectionCategory;
51
+ do_differently: ReflectionCategory;
52
+ }
53
+ export declare function analyze(params: AnalyzeParams): Promise<AnalyzeResult>;
54
+ export {};
55
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/tools/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsBH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAIjF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,gBAAgB,GAAG,eAAe,GAAG,cAAc,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,eAAe,CAAC;CAC9B;AAED,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACzF,KAAK,kBAAkB,GAAG;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E,UAAU,eAAe;IACvB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yBAAyB,EAAE,MAAM,CAAC;IAClC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,kBAAkB,CAAC;IAChC,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAID,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAwI3E"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * analyze Tool (OD-567)
3
+ *
4
+ * Session analytics and insights engine. Provides structured analysis
5
+ * of session history, closing reflections, agent patterns, and more.
6
+ *
7
+ * Starts with "summary" lens; expanded with additional lenses in
8
+ * OD-568 (Tier 1), OD-569 (Tier 2), OD-570 (Tier 3), OD-572 (Tier 4).
9
+ *
10
+ * Performance target: 3000ms
11
+ */
12
+ import { querySessionsByDateRange, computeSummary, aggregateClosingReflections, queryScarUsageByDateRange, queryRepeatMistakes, computeBlindspots, enrichScarUsageTitles, formatSummary, formatReflections, formatBlindspots, } from "../services/analytics.js";
13
+ import { hasSupabase } from "../services/tier.js";
14
+ import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
15
+ import { v4 as uuidv4 } from "uuid";
16
+ import { formatDate } from "../services/timezone.js";
17
+ // --- Implementation ---
18
+ export async function analyze(params) {
19
+ const timer = new Timer();
20
+ const metricsId = uuidv4();
21
+ const lens = params.lens || "summary";
22
+ const days = params.days || 30;
23
+ const project = params.project || "orchestra_dev";
24
+ if (!hasSupabase()) {
25
+ return {
26
+ success: false,
27
+ lens,
28
+ data: null,
29
+ error: "Analytics requires Supabase connection (Pro/Dev tier)",
30
+ performance: buildPerformanceData("analyze", 0, 0),
31
+ };
32
+ }
33
+ try {
34
+ // Compute date range
35
+ const endDate = new Date().toISOString();
36
+ const startDate = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
37
+ let data = null;
38
+ switch (lens) {
39
+ case "summary":
40
+ case "reflections": {
41
+ // Both summary and reflections need sessions
42
+ const sessions = await querySessionsByDateRange(startDate, endDate, project, params.agent);
43
+ if (lens === "summary") {
44
+ data = computeSummary(sessions, days);
45
+ }
46
+ else {
47
+ const reflections = aggregateClosingReflections(sessions);
48
+ const sessionsWithReflections = sessions.filter(s => s.closing_reflection?.what_broke).length;
49
+ data = {
50
+ period: {
51
+ start: formatDate(startDate.slice(0, 10)),
52
+ end: formatDate(endDate.slice(0, 10)),
53
+ days,
54
+ },
55
+ total_sessions_scanned: sessions.length,
56
+ sessions_with_reflections: sessionsWithReflections,
57
+ ...reflections,
58
+ };
59
+ }
60
+ break;
61
+ }
62
+ case "blindspots": {
63
+ const [rawUsages, repeats] = await Promise.all([
64
+ queryScarUsageByDateRange(startDate, endDate, project, params.agent),
65
+ queryRepeatMistakes(startDate, endDate, project),
66
+ ]);
67
+ // Resolve missing scar titles from orchestra_learnings
68
+ const usages = await enrichScarUsageTitles(rawUsages);
69
+ data = computeBlindspots(usages, repeats, days);
70
+ break;
71
+ }
72
+ default:
73
+ return {
74
+ success: false,
75
+ lens,
76
+ data: null,
77
+ error: `Unknown lens: ${lens}. Available: summary, reflections, blindspots`,
78
+ performance: buildPerformanceData("analyze", timer.stop(), 0),
79
+ };
80
+ }
81
+ const latencyMs = timer.stop();
82
+ // Determine result count based on lens type
83
+ const resultCount = data
84
+ ? ("total_sessions" in data ? data.total_sessions
85
+ : "total_sessions_scanned" in data ? data.total_sessions_scanned
86
+ : "total_scar_usages" in data ? data.total_scar_usages
87
+ : 0)
88
+ : 0;
89
+ const perfData = buildPerformanceData("analyze", latencyMs, resultCount);
90
+ // Fire-and-forget metrics
91
+ recordMetrics({
92
+ id: metricsId,
93
+ tool_name: "search", // Closest existing tool name for metrics table
94
+ query_text: `analyze:${lens}:${days}d`,
95
+ latency_ms: latencyMs,
96
+ result_count: resultCount,
97
+ phase_tag: "ad_hoc",
98
+ metadata: { lens, days, agent: params.agent, format: params.format },
99
+ }).catch(() => { });
100
+ // Return formatted text by default, raw JSON if requested
101
+ const fmt = params.format || "text";
102
+ if (fmt === "text" && data) {
103
+ let text = "";
104
+ if (lens === "summary" && "total_sessions" in data) {
105
+ text = formatSummary(data);
106
+ }
107
+ else if (lens === "reflections" && "total_sessions_scanned" in data) {
108
+ text = formatReflections(data);
109
+ }
110
+ else if (lens === "blindspots" && "total_scar_usages" in data) {
111
+ text = formatBlindspots(data);
112
+ }
113
+ return {
114
+ success: true,
115
+ lens,
116
+ text,
117
+ performance: perfData,
118
+ };
119
+ }
120
+ return {
121
+ success: true,
122
+ lens,
123
+ data,
124
+ performance: perfData,
125
+ };
126
+ }
127
+ catch (error) {
128
+ const message = error instanceof Error ? error.message : String(error);
129
+ const latencyMs = timer.stop();
130
+ return {
131
+ success: false,
132
+ lens,
133
+ data: null,
134
+ error: message,
135
+ performance: buildPerformanceData("analyze", latencyMs, 0),
136
+ };
137
+ }
138
+ }
139
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/tools/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * cleanup_threads Tool (Phase 6: Thread Lifecycle)
3
+ *
4
+ * Batch triage tool for thread health review. Groups all non-resolved threads
5
+ * by lifecycle status (active/cooling/dormant) with optional auto-archival.
6
+ *
7
+ * Performance target: <2000ms (fetches all threads, computes lifecycle statuses)
8
+ */
9
+ import type { LifecycleStatus } from "../services/thread-vitality.js";
10
+ import type { Project } from "../types/index.js";
11
+ import type { PerformanceData } from "../services/metrics.js";
12
+ export interface CleanupThreadsParams {
13
+ project?: Project;
14
+ /** If true, auto-archive dormant threads that have been dormant 30+ days */
15
+ auto_archive?: boolean;
16
+ }
17
+ interface ThreadSummary {
18
+ thread_id: string;
19
+ text: string;
20
+ lifecycle_status: LifecycleStatus;
21
+ vitality_score: number;
22
+ thread_class: string;
23
+ days_since_touch: number;
24
+ dormant_days?: number;
25
+ }
26
+ export interface CleanupThreadsResult {
27
+ success: boolean;
28
+ summary: {
29
+ emerging: number;
30
+ active: number;
31
+ cooling: number;
32
+ dormant: number;
33
+ total_open: number;
34
+ };
35
+ groups: {
36
+ emerging: ThreadSummary[];
37
+ active: ThreadSummary[];
38
+ cooling: ThreadSummary[];
39
+ dormant: ThreadSummary[];
40
+ };
41
+ archived_count: number;
42
+ archived_ids: string[];
43
+ performance: PerformanceData;
44
+ }
45
+ export declare function cleanupThreads(params: CleanupThreadsParams): Promise<CleanupThreadsResult>;
46
+ export {};
47
+ //# sourceMappingURL=cleanup-threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-threads.d.ts","sourceRoot":"","sources":["../../src/tools/cleanup-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAMnF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,eAAe,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACN,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;QACxB,OAAO,EAAE,aAAa,EAAE,CAAC;QACzB,OAAO,EAAE,aAAa,EAAE,CAAC;KAC1B,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;CAC9B;AAID,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA+H/B"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * cleanup_threads Tool (Phase 6: Thread Lifecycle)
3
+ *
4
+ * Batch triage tool for thread health review. Groups all non-resolved threads
5
+ * by lifecycle status (active/cooling/dormant) with optional auto-archival.
6
+ *
7
+ * Performance target: <2000ms (fetches all threads, computes lifecycle statuses)
8
+ */
9
+ import { v4 as uuidv4 } from "uuid";
10
+ import * as supabase from "../services/supabase-client.js";
11
+ import { hasSupabase } from "../services/tier.js";
12
+ import { computeLifecycleStatus } from "../services/thread-vitality.js";
13
+ import { archiveDormantThreads } from "../services/thread-supabase.js";
14
+ import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
15
+ // ---------- Tool Implementation ----------
16
+ export async function cleanupThreads(params) {
17
+ const timer = new Timer();
18
+ const metricsId = uuidv4();
19
+ const project = (params.project || "orchestra_dev");
20
+ if (!hasSupabase() || !supabase.isConfigured()) {
21
+ const latencyMs = timer.stop();
22
+ return {
23
+ success: false,
24
+ summary: { emerging: 0, active: 0, cooling: 0, dormant: 0, total_open: 0 },
25
+ groups: { emerging: [], active: [], cooling: [], dormant: [] },
26
+ archived_count: 0,
27
+ archived_ids: [],
28
+ performance: buildPerformanceData("cleanup_threads", latencyMs, 0),
29
+ };
30
+ }
31
+ // Step 1: Auto-archive if requested
32
+ let archived_count = 0;
33
+ let archived_ids = [];
34
+ if (params.auto_archive) {
35
+ const archiveResult = await archiveDormantThreads(project);
36
+ archived_count = archiveResult.archived_count;
37
+ archived_ids = archiveResult.archived_ids;
38
+ }
39
+ // Step 2: Fetch all non-resolved, non-archived threads
40
+ const rows = await supabase.directQuery("orchestra_threads_lite", {
41
+ select: "*",
42
+ filters: {
43
+ project,
44
+ status: "not.in.(resolved,archived)",
45
+ },
46
+ order: "vitality_score.desc,last_touched_at.desc",
47
+ limit: 200,
48
+ });
49
+ // Step 3: Compute lifecycle and group
50
+ const now = new Date();
51
+ const groups = {
52
+ emerging: [],
53
+ active: [],
54
+ cooling: [],
55
+ dormant: [],
56
+ };
57
+ for (const row of rows) {
58
+ const dormantSince = row.metadata?.dormant_since;
59
+ const { lifecycle_status, vitality } = computeLifecycleStatus({
60
+ last_touched_at: row.last_touched_at,
61
+ touch_count: row.touch_count,
62
+ created_at: row.created_at,
63
+ thread_class: row.thread_class || "backlog",
64
+ current_status: row.status,
65
+ dormant_since: dormantSince,
66
+ }, now);
67
+ const lastTouched = new Date(row.last_touched_at);
68
+ const daysSinceTouch = Math.max((now.getTime() - lastTouched.getTime()) / (1000 * 60 * 60 * 24), 0);
69
+ const summary = {
70
+ thread_id: row.thread_id,
71
+ text: row.text,
72
+ lifecycle_status,
73
+ vitality_score: vitality.vitality_score,
74
+ thread_class: row.thread_class || "backlog",
75
+ days_since_touch: Math.round(daysSinceTouch),
76
+ };
77
+ if (lifecycle_status === "dormant" && dormantSince) {
78
+ const dormantStart = new Date(dormantSince);
79
+ summary.dormant_days = Math.round((now.getTime() - dormantStart.getTime()) / (1000 * 60 * 60 * 24));
80
+ }
81
+ const bucket = lifecycle_status === "archived" ? "dormant" : lifecycle_status;
82
+ if (groups[bucket]) {
83
+ groups[bucket].push(summary);
84
+ }
85
+ }
86
+ const latencyMs = timer.stop();
87
+ const totalOpen = groups.emerging.length + groups.active.length + groups.cooling.length + groups.dormant.length;
88
+ const perfData = buildPerformanceData("cleanup_threads", latencyMs, totalOpen);
89
+ recordMetrics({
90
+ id: metricsId,
91
+ tool_name: "cleanup_threads",
92
+ query_text: `cleanup:${project}:auto_archive=${!!params.auto_archive}`,
93
+ tables_searched: ["orchestra_threads_lite"],
94
+ latency_ms: latencyMs,
95
+ result_count: totalOpen,
96
+ phase_tag: "ad_hoc",
97
+ metadata: {
98
+ groups: {
99
+ emerging: groups.emerging.length,
100
+ active: groups.active.length,
101
+ cooling: groups.cooling.length,
102
+ dormant: groups.dormant.length,
103
+ },
104
+ archived_count,
105
+ },
106
+ }).catch(() => { });
107
+ return {
108
+ success: true,
109
+ summary: {
110
+ emerging: groups.emerging.length,
111
+ active: groups.active.length,
112
+ cooling: groups.cooling.length,
113
+ dormant: groups.dormant.length,
114
+ total_open: totalOpen,
115
+ },
116
+ groups: {
117
+ emerging: groups.emerging,
118
+ active: groups.active,
119
+ cooling: groups.cooling,
120
+ dormant: groups.dormant,
121
+ },
122
+ archived_count,
123
+ archived_ids,
124
+ performance: perfData,
125
+ };
126
+ }
127
+ //# sourceMappingURL=cleanup-threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-threads.js","sourceRoot":"","sources":["../../src/tools/cleanup-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,OAAO,EACL,KAAK,EACL,aAAa,EACb,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AA0ChC,4CAA4C;AAE5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA4B;IAE5B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,eAAe,CAAY,CAAC;IAE/D,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;YAC1E,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC9D,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC;SACnE,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC3D,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC;QAC9C,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAC5C,CAAC;IAED,uDAAuD;IACvD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAY,wBAAwB,EAAE;QAC3E,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,OAAO;YACP,MAAM,EAAE,4BAA4B;SACrC;QACD,KAAK,EAAE,0CAA0C;QACjD,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAoC;QAC9C,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,YAAY,GAAI,GAAG,CAAC,QAAoC,EAAE,aAAmC,CAAC;QACpG,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC;YAC5D,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,YAAY,EAAG,GAAG,CAAC,YAA4B,IAAI,SAAS;YAC5D,cAAc,EAAE,GAAG,CAAC,MAAM;YAC1B,aAAa,EAAE,YAAY;SAC5B,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAC/D,CAAC,CACF,CAAC;QAEF,MAAM,OAAO,GAAkB;YAC7B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,gBAAgB;YAChB,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;YAC3C,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;SAC7C,CAAC;QAEF,IAAI,gBAAgB,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAC/B,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CACjE,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC9E,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IAChH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAE/E,aAAa,CAAC;QACZ,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,iBAAiB;QAC5B,UAAU,EAAE,WAAW,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE;QACtE,eAAe,EAAE,CAAC,wBAAwB,CAAC;QAC3C,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE;YACR,MAAM,EAAE;gBACN,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAChC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;gBAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;aAC/B;YACD,cAAc;SACf;KACF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YAChC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC9B,UAAU,EAAE,SAAS;SACtB;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;QACD,cAAc;QACd,YAAY;QACZ,WAAW,EAAE,QAAQ;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * confirm_scars Tool
3
+ *
4
+ * Validates scar confirmations (refute-or-obey protocol) for CLI agents.
5
+ * Ported from CODA-1's verify-completion.js but adapted for structured input
6
+ * (agents send JSON params, not free-text output to parse).
7
+ *
8
+ * Flow:
9
+ * recall(plan) → surfaces scars → agent reads scars
10
+ * → confirm_scars(confirmations) → validates each → writes to session state
11
+ * → PreToolUse hook checks confirmation state before consequential actions
12
+ *
13
+ * Each recalled scar must be addressed with:
14
+ * APPLYING — Scar is relevant, past-tense evidence with artifact reference
15
+ * N_A — Scar doesn't apply, scenario comparison required
16
+ * REFUTED — Overriding scar, risk acknowledgment required
17
+ */
18
+ import type { ConfirmScarsParams, ConfirmScarsResult } from "../types/index.js";
19
+ /**
20
+ * Main tool implementation: confirm_scars
21
+ */
22
+ export declare function confirmScars(params: ConfirmScarsParams): Promise<ConfirmScarsResult>;
23
+ //# sourceMappingURL=confirm-scars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-scars.d.ts","sourceRoot":"","sources":["../../src/tools/confirm-scars.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAKnB,MAAM,mBAAmB,CAAC;AAwH3B;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmG1F"}