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,209 @@
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 { getCurrentSession, getSurfacedScars, addConfirmations, } from "../services/session-state.js";
19
+ import { Timer, buildPerformanceData } from "../services/metrics.js";
20
+ import { getSessionPath } from "../services/gitmem-dir.js";
21
+ import * as fs from "fs";
22
+ // Minimum evidence length per decision type
23
+ const MIN_EVIDENCE_LENGTH = 50;
24
+ // Future-tense patterns — APPLYING must use past tense
25
+ const FUTURE_PATTERNS = /\b(will|going to|plan to|intend to|I'll|we'll|shall|about to|aim to|expect to)\b/i;
26
+ /**
27
+ * Validate a single confirmation against its surfaced scar.
28
+ * Returns null if valid, or an error string if invalid.
29
+ */
30
+ function validateConfirmation(confirmation, scar) {
31
+ const { decision, evidence } = confirmation;
32
+ // Check evidence length
33
+ if (!evidence || evidence.trim().length < MIN_EVIDENCE_LENGTH) {
34
+ return `${scar.scar_title}: Evidence too short (${evidence?.trim().length || 0} chars, minimum ${MIN_EVIDENCE_LENGTH}). Provide substantive ${decision === "APPLYING" ? "past-tense evidence with artifact" : decision === "N_A" ? "scenario comparison" : "risk acknowledgment"}.`;
35
+ }
36
+ // Decision-specific validation
37
+ switch (decision) {
38
+ case "APPLYING":
39
+ // Must use past tense — no forward-looking language
40
+ if (FUTURE_PATTERNS.test(evidence)) {
41
+ return `${scar.scar_title}: APPLYING evidence must be past-tense (what you DID, not what you WILL do). Found forward-looking language. Rewrite with past-tense evidence and artifact reference.`;
42
+ }
43
+ break;
44
+ case "N_A":
45
+ // Must explain why the scar doesn't apply (scenario comparison)
46
+ // No strict pattern check — just length is enough
47
+ break;
48
+ case "REFUTED":
49
+ // Must acknowledge the risk of overriding
50
+ // Check for risk-related language
51
+ if (!/\b(risk|despite|overrid|acknowledg|accept|aware|trade.?off|exception)\b/i.test(evidence)) {
52
+ return `${scar.scar_title}: REFUTED evidence must acknowledge the risk of overriding this scar. Include explicit risk acknowledgment.`;
53
+ }
54
+ break;
55
+ default:
56
+ return `${scar.scar_title}: Invalid decision "${decision}". Must be APPLYING, N_A, or REFUTED.`;
57
+ }
58
+ return null;
59
+ }
60
+ /**
61
+ * Format the confirmation result as markdown for agent context.
62
+ */
63
+ function formatResponse(valid, confirmations, errors, missingScars) {
64
+ const lines = [];
65
+ if (valid) {
66
+ lines.push("✅ SCAR CONFIRMATIONS ACCEPTED");
67
+ lines.push("");
68
+ for (const conf of confirmations) {
69
+ const emoji = conf.decision === "APPLYING" ? "🟢" : conf.decision === "N_A" ? "⚪" : "🟠";
70
+ lines.push(`${emoji} **${conf.scar_title}** → ${conf.decision}`);
71
+ }
72
+ lines.push("");
73
+ lines.push("All recalled scars addressed. Consequential actions are now unblocked.");
74
+ }
75
+ else {
76
+ lines.push("⛔ SCAR CONFIRMATIONS REJECTED");
77
+ lines.push("");
78
+ if (errors.length > 0) {
79
+ lines.push("**Validation errors:**");
80
+ for (const err of errors) {
81
+ lines.push(`- ${err}`);
82
+ }
83
+ lines.push("");
84
+ }
85
+ if (missingScars.length > 0) {
86
+ lines.push("**Unaddressed scars (must confirm all recalled scars):**");
87
+ for (const title of missingScars) {
88
+ lines.push(`- ${title}`);
89
+ }
90
+ lines.push("");
91
+ }
92
+ lines.push("Fix the errors above and call confirm_scars again.");
93
+ }
94
+ return lines.join("\n");
95
+ }
96
+ /**
97
+ * Update per-session dir with confirmation data.
98
+ */
99
+ function persistConfirmationsToFile(confirmations) {
100
+ try {
101
+ const session = getCurrentSession();
102
+ if (!session)
103
+ return;
104
+ const sessionFilePath = getSessionPath(session.sessionId, "session.json");
105
+ if (!fs.existsSync(sessionFilePath))
106
+ return;
107
+ const data = JSON.parse(fs.readFileSync(sessionFilePath, "utf8"));
108
+ data.confirmations = confirmations;
109
+ fs.writeFileSync(sessionFilePath, JSON.stringify(data, null, 2));
110
+ console.error(`[confirm_scars] Confirmations persisted to ${sessionFilePath}`);
111
+ }
112
+ catch (error) {
113
+ console.warn("[confirm_scars] Failed to persist confirmations to file:", error);
114
+ }
115
+ }
116
+ /**
117
+ * Main tool implementation: confirm_scars
118
+ */
119
+ export async function confirmScars(params) {
120
+ const timer = new Timer();
121
+ // Validate session exists
122
+ const session = getCurrentSession();
123
+ if (!session) {
124
+ const performance = buildPerformanceData("confirm_scars", timer.elapsed(), 0);
125
+ return {
126
+ valid: false,
127
+ errors: ["No active session. Call session_start first."],
128
+ confirmations: [],
129
+ missing_scars: [],
130
+ formatted_response: "⛔ No active session. Call session_start before confirm_scars.",
131
+ performance,
132
+ };
133
+ }
134
+ // Get recall-surfaced scars (only source: "recall", not "session_start")
135
+ const allSurfacedScars = getSurfacedScars();
136
+ const recallScars = allSurfacedScars.filter(s => s.source === "recall");
137
+ if (recallScars.length === 0) {
138
+ const performance = buildPerformanceData("confirm_scars", timer.elapsed(), 0);
139
+ return {
140
+ valid: true,
141
+ errors: [],
142
+ confirmations: [],
143
+ missing_scars: [],
144
+ formatted_response: "✅ No recall-surfaced scars to confirm. Proceed freely.",
145
+ performance,
146
+ };
147
+ }
148
+ // Build scar lookup by ID
149
+ const scarById = new Map();
150
+ for (const scar of recallScars) {
151
+ scarById.set(scar.scar_id, scar);
152
+ }
153
+ // Validate each confirmation
154
+ const errors = [];
155
+ const validConfirmations = [];
156
+ const confirmedIds = new Set();
157
+ if (!params.confirmations || params.confirmations.length === 0) {
158
+ errors.push("No confirmations provided. Each recalled scar must be addressed.");
159
+ }
160
+ else {
161
+ for (const conf of params.confirmations) {
162
+ // Check scar exists in recalled set
163
+ const scar = scarById.get(conf.scar_id);
164
+ if (!scar) {
165
+ errors.push(`Unknown scar_id "${conf.scar_id}". Only confirm scars returned by recall().`);
166
+ continue;
167
+ }
168
+ // Validate the confirmation
169
+ const error = validateConfirmation(conf, scar);
170
+ if (error) {
171
+ errors.push(error);
172
+ }
173
+ else {
174
+ validConfirmations.push({
175
+ scar_id: conf.scar_id,
176
+ scar_title: scar.scar_title,
177
+ decision: conf.decision,
178
+ evidence: conf.evidence.trim(),
179
+ confirmed_at: new Date().toISOString(),
180
+ });
181
+ confirmedIds.add(conf.scar_id);
182
+ }
183
+ }
184
+ }
185
+ // Check for missing scars (all recall scars must be addressed)
186
+ const missingScars = [];
187
+ for (const scar of recallScars) {
188
+ if (!confirmedIds.has(scar.scar_id)) {
189
+ missingScars.push(scar.scar_title);
190
+ }
191
+ }
192
+ const valid = errors.length === 0 && missingScars.length === 0;
193
+ // If valid, persist to session state and file
194
+ if (valid) {
195
+ addConfirmations(validConfirmations);
196
+ persistConfirmationsToFile(validConfirmations);
197
+ }
198
+ const performance = buildPerformanceData("confirm_scars", timer.elapsed(), validConfirmations.length);
199
+ const formatted_response = formatResponse(valid, validConfirmations, errors, missingScars);
200
+ return {
201
+ valid,
202
+ errors,
203
+ confirmations: validConfirmations,
204
+ missing_scars: missingScars,
205
+ formatted_response,
206
+ performance,
207
+ };
208
+ }
209
+ //# sourceMappingURL=confirm-scars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-scars.js","sourceRoot":"","sources":["../../src/tools/confirm-scars.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * create_decision Tool
3
+ *
4
+ * Log architectural/operational decision to orchestra_decisions.
5
+ * Generates embeddings client-side and writes directly to Supabase REST API,
6
+ * eliminating the ww-mcp Edge Function dependency.
7
+ *
8
+ * Performance target: <3000ms (OD-429)
9
+ */
10
+ import type { CreateDecisionParams, CreateDecisionResult } from "../types/index.js";
11
+ /**
12
+ * Execute create_decision tool
13
+ */
14
+ export declare function createDecision(params: CreateDecisionParams): Promise<CreateDecisionResult>;
15
+ //# sourceMappingURL=create-decision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-decision.d.ts","sourceRoot":"","sources":["../../src/tools/create-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EAErB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAyH/B"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * create_decision Tool
3
+ *
4
+ * Log architectural/operational decision to orchestra_decisions.
5
+ * Generates embeddings client-side and writes directly to Supabase REST API,
6
+ * eliminating the ww-mcp Edge Function dependency.
7
+ *
8
+ * Performance target: <3000ms (OD-429)
9
+ */
10
+ import { v4 as uuidv4 } from "uuid";
11
+ import * as supabase from "../services/supabase-client.js";
12
+ import { embed, isEmbeddingAvailable } from "../services/embedding.js";
13
+ import { getAgentIdentity } from "../services/agent-detection.js";
14
+ import { writeTriplesForDecision } from "../services/triple-writer.js";
15
+ import { hasSupabase } from "../services/tier.js";
16
+ import { getStorage } from "../services/storage.js";
17
+ import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
18
+ /**
19
+ * Execute create_decision tool
20
+ */
21
+ export async function createDecision(params) {
22
+ const timer = new Timer();
23
+ const metricsId = uuidv4();
24
+ const decisionId = uuidv4();
25
+ const today = new Date().toISOString().split("T")[0];
26
+ const decisionData = {
27
+ id: decisionId,
28
+ decision_date: today,
29
+ title: params.title,
30
+ decision: params.decision,
31
+ rationale: params.rationale,
32
+ alternatives_considered: params.alternatives_considered || [],
33
+ personas_involved: params.personas_involved || [],
34
+ docs_affected: params.docs_affected || [],
35
+ linear_issue: params.linear_issue || null,
36
+ session_id: params.session_id || null,
37
+ project: params.project || "orchestra_dev",
38
+ created_at: new Date().toISOString(),
39
+ };
40
+ try {
41
+ const breakdown = {};
42
+ if (hasSupabase()) {
43
+ // Pro/Dev tier: Generate embedding and write to Supabase
44
+ if (isEmbeddingAvailable()) {
45
+ try {
46
+ const embedStart = Date.now();
47
+ const embeddingText = `${params.title} | ${params.decision} | ${params.rationale}`;
48
+ const embeddingVector = await embed(embeddingText);
49
+ const embedLatency = Date.now() - embedStart;
50
+ if (embeddingVector) {
51
+ decisionData.embedding = JSON.stringify(embeddingVector);
52
+ console.error(`[create_decision] Embedding generated (${embeddingVector.length} dims)`);
53
+ }
54
+ breakdown.embedding = {
55
+ latency_ms: embedLatency,
56
+ source: "supabase",
57
+ cache_status: "not_applicable",
58
+ network_call: true,
59
+ };
60
+ }
61
+ catch (embError) {
62
+ console.warn("[create_decision] Embedding generation failed (storing without):", embError);
63
+ }
64
+ }
65
+ // Write directly to Supabase REST API (bypasses ww-mcp)
66
+ const upsertStart = Date.now();
67
+ await supabase.directUpsert("orchestra_decisions", decisionData);
68
+ breakdown.upsert = {
69
+ latency_ms: Date.now() - upsertStart,
70
+ source: "supabase",
71
+ cache_status: "not_applicable",
72
+ network_call: true,
73
+ };
74
+ // OD-466: Auto-create knowledge triples (fire-and-forget)
75
+ writeTriplesForDecision({
76
+ id: decisionId,
77
+ title: params.title,
78
+ decision: params.decision,
79
+ rationale: params.rationale,
80
+ personas_involved: params.personas_involved,
81
+ docs_affected: params.docs_affected,
82
+ linear_issue: params.linear_issue,
83
+ session_id: params.session_id,
84
+ project: (params.project || "orchestra_dev"),
85
+ agent: getAgentIdentity(),
86
+ }).catch((err) => {
87
+ console.warn("[create_decision] Triple generation failed (non-fatal):", err);
88
+ });
89
+ }
90
+ else {
91
+ // Free tier: Store locally without embedding
92
+ const upsertStart = Date.now();
93
+ await getStorage().upsert("decisions", decisionData);
94
+ breakdown.upsert = {
95
+ latency_ms: Date.now() - upsertStart,
96
+ source: "memory",
97
+ cache_status: "not_applicable",
98
+ network_call: false,
99
+ };
100
+ }
101
+ const latencyMs = timer.stop();
102
+ const perfData = buildPerformanceData("create_decision", latencyMs, 1, {
103
+ breakdown,
104
+ });
105
+ // Record metrics
106
+ recordMetrics({
107
+ id: metricsId,
108
+ session_id: params.session_id,
109
+ tool_name: "create_decision",
110
+ tables_searched: ["orchestra_decisions"],
111
+ latency_ms: latencyMs,
112
+ result_count: 1,
113
+ phase_tag: "decision_capture",
114
+ linear_issue: params.linear_issue,
115
+ metadata: {
116
+ project: params.project || "orchestra_dev",
117
+ alternatives_count: (params.alternatives_considered || []).length,
118
+ write_path: "directUpsert",
119
+ },
120
+ }).catch(() => { });
121
+ return {
122
+ success: true,
123
+ decision_id: decisionId,
124
+ performance: perfData,
125
+ };
126
+ }
127
+ catch (error) {
128
+ console.error("[create_decision] Failed:", error);
129
+ const latencyMs = timer.stop();
130
+ const perfData = buildPerformanceData("create_decision", latencyMs, 0);
131
+ return {
132
+ success: false,
133
+ decision_id: "",
134
+ performance: perfData,
135
+ };
136
+ }
137
+ }
138
+ //# sourceMappingURL=create-decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-decision.js","sourceRoot":"","sources":["../../src/tools/create-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,KAAK,EACL,aAAa,EACb,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAOhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA4B;IAE5B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,MAAM,YAAY,GAA4B;QAC5C,EAAE,EAAE,UAAU;QACd,aAAa,EAAE,KAAK;QACpB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,IAAI,EAAE;QAC7D,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;QACjD,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;QACzC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;QACzC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,eAAe;QAC1C,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,SAAS,GAAyB,EAAE,CAAC;QAE3C,IAAI,WAAW,EAAE,EAAE,CAAC;YAClB,yDAAyD;YACzD,IAAI,oBAAoB,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC9B,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;oBACnF,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;oBACnD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;oBAC7C,IAAI,eAAe,EAAE,CAAC;wBACpB,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;wBACzD,OAAO,CAAC,KAAK,CAAC,0CAA0C,eAAe,CAAC,MAAM,QAAQ,CAAC,CAAC;oBAC1F,CAAC;oBACD,SAAS,CAAC,SAAS,GAAG;wBACpB,UAAU,EAAE,YAAY;wBACxB,MAAM,EAAE,UAAU;wBAClB,YAAY,EAAE,gBAAgB;wBAC9B,YAAY,EAAE,IAAI;qBACnB,CAAC;gBACJ,CAAC;gBAAC,OAAO,QAAQ,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,kEAAkE,EAAE,QAAQ,CAAC,CAAC;gBAC7F,CAAC;YACH,CAAC;YAED,wDAAwD;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,QAAQ,CAAC,YAAY,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;YACjE,SAAS,CAAC,MAAM,GAAG;gBACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW;gBACpC,MAAM,EAAE,UAAU;gBAClB,YAAY,EAAE,gBAAgB;gBAC9B,YAAY,EAAE,IAAI;aACnB,CAAC;YAEF,0DAA0D;YAC1D,uBAAuB,CAAC;gBACtB,EAAE,EAAE,UAAU;gBACd,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;gBAC3C,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC;gBAC5C,KAAK,EAAE,gBAAgB,EAAE;aAC1B,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAC;YAC/E,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,UAAU,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACrD,SAAS,CAAC,MAAM,GAAG;gBACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW;gBACpC,MAAM,EAAE,QAAQ;gBAChB,YAAY,EAAE,gBAAgB;gBAC9B,YAAY,EAAE,KAAK;aACpB,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAC,EAAE;YACrE,SAAS;SACV,CAAC,CAAC;QAEH,iBAAiB;QACjB,aAAa,CAAC;YACZ,EAAE,EAAE,SAAS;YACb,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,iBAAiB;YAC5B,eAAe,EAAE,CAAC,qBAAqB,CAAC;YACxC,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,kBAAkB;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ,EAAE;gBACR,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,eAAe;gBAC1C,kBAAkB,EAAE,CAAC,MAAM,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,MAAM;gBACjE,UAAU,EAAE,cAAc;aAC3B;SACF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEnB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,QAAQ;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,QAAQ;SACtB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * create_learning Tool
3
+ *
4
+ * Create scar, win, or pattern entry in orchestra_learnings.
5
+ * Generates embeddings client-side and writes directly to Supabase REST API,
6
+ * eliminating the ww-mcp Edge Function dependency.
7
+ *
8
+ * Performance target: <3000ms (OD-429)
9
+ */
10
+ import type { CreateLearningParams, CreateLearningResult } from "../types/index.js";
11
+ /**
12
+ * Execute create_learning tool
13
+ */
14
+ export declare function createLearning(params: CreateLearningParams): Promise<CreateLearningResult>;
15
+ //# sourceMappingURL=create-learning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-learning.d.ts","sourceRoot":"","sources":["../../src/tools/create-learning.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EAIrB,MAAM,mBAAmB,CAAC;AAsC3B;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA8L/B"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * create_learning Tool
3
+ *
4
+ * Create scar, win, or pattern entry in orchestra_learnings.
5
+ * Generates embeddings client-side and writes directly to Supabase REST API,
6
+ * eliminating the ww-mcp Edge Function dependency.
7
+ *
8
+ * Performance target: <3000ms (OD-429)
9
+ */
10
+ import { v4 as uuidv4 } from "uuid";
11
+ import * as supabase from "../services/supabase-client.js";
12
+ import { embed, isEmbeddingAvailable } from "../services/embedding.js";
13
+ import { getAgentIdentity } from "../services/agent-detection.js";
14
+ import { flushCache } from "../services/startup.js";
15
+ import { writeTriplesForLearning } from "../services/triple-writer.js";
16
+ import { hasSupabase } from "../services/tier.js";
17
+ import { getStorage } from "../services/storage.js";
18
+ import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
19
+ /**
20
+ * Validate scar-specific requirements
21
+ */
22
+ function validateScar(params) {
23
+ const errors = [];
24
+ if (!params.severity) {
25
+ errors.push("Scars require severity (critical, high, medium, low)");
26
+ }
27
+ if (!params.counter_arguments || params.counter_arguments.length < 2) {
28
+ errors.push("Scars require at least 2 counter_arguments");
29
+ }
30
+ return errors;
31
+ }
32
+ /**
33
+ * Build embedding text from learning fields
34
+ */
35
+ function buildEmbeddingText(params) {
36
+ const parts = [params.title, params.description];
37
+ if (params.keywords?.length) {
38
+ parts.push(params.keywords.join(", "));
39
+ }
40
+ if (params.domain?.length) {
41
+ parts.push(params.domain.join(", "));
42
+ }
43
+ if (params.counter_arguments?.length) {
44
+ parts.push(params.counter_arguments.join(". "));
45
+ }
46
+ return parts.join(" | ");
47
+ }
48
+ /**
49
+ * Execute create_learning tool
50
+ */
51
+ export async function createLearning(params) {
52
+ const timer = new Timer();
53
+ const metricsId = uuidv4();
54
+ // Validate based on learning type
55
+ if (params.learning_type === "scar") {
56
+ const errors = validateScar(params);
57
+ if (errors.length > 0) {
58
+ const latencyMs = timer.stop();
59
+ const perfData = buildPerformanceData("create_learning", latencyMs, 0);
60
+ return {
61
+ success: false,
62
+ learning_id: "",
63
+ embedding_generated: false,
64
+ performance: perfData,
65
+ };
66
+ }
67
+ }
68
+ const learningId = uuidv4();
69
+ // Detect agent identity for persona_name
70
+ const agentIdentity = getAgentIdentity();
71
+ // Build learning record
72
+ const learningData = {
73
+ id: learningId,
74
+ learning_type: params.learning_type,
75
+ title: params.title,
76
+ description: params.description,
77
+ project: params.project || "orchestra_dev",
78
+ source_linear_issue: params.source_linear_issue || null,
79
+ keywords: params.keywords || [],
80
+ domain: params.domain || [],
81
+ created_at: new Date().toISOString(),
82
+ persona_name: agentIdentity,
83
+ source_date: new Date().toISOString().split("T")[0],
84
+ // OD-508: LLM-cooperative enforcement fields (optional)
85
+ ...(params.why_this_matters && { why_this_matters: params.why_this_matters }),
86
+ ...(params.action_protocol && { action_protocol: params.action_protocol }),
87
+ ...(params.self_check_criteria && { self_check_criteria: params.self_check_criteria }),
88
+ };
89
+ // Add type-specific fields
90
+ if (params.learning_type === "scar") {
91
+ learningData.severity = params.severity;
92
+ learningData.scar_type = params.scar_type || "process";
93
+ learningData.counter_arguments = params.counter_arguments;
94
+ }
95
+ if (params.learning_type === "win") {
96
+ learningData.problem_context = params.problem_context || "";
97
+ learningData.solution_approach = params.solution_approach || "";
98
+ learningData.applies_when = params.applies_when || [];
99
+ learningData.severity = params.severity || "medium";
100
+ }
101
+ if (params.learning_type === "pattern") {
102
+ learningData.severity = params.severity || "low";
103
+ }
104
+ try {
105
+ let embeddingGenerated = false;
106
+ const breakdown = {};
107
+ if (hasSupabase()) {
108
+ // Pro/Dev tier: Generate embedding and write to Supabase
109
+ if (isEmbeddingAvailable()) {
110
+ try {
111
+ const embedStart = Date.now();
112
+ const embeddingText = buildEmbeddingText(params);
113
+ const embeddingVector = await embed(embeddingText);
114
+ const embedLatency = Date.now() - embedStart;
115
+ if (embeddingVector) {
116
+ // Supabase pgvector expects a JSON string for vector columns
117
+ learningData.embedding = JSON.stringify(embeddingVector);
118
+ embeddingGenerated = true;
119
+ console.error(`[create_learning] Embedding generated (${embeddingVector.length} dims)`);
120
+ }
121
+ breakdown.embedding = {
122
+ latency_ms: embedLatency,
123
+ source: "supabase",
124
+ cache_status: "not_applicable",
125
+ network_call: true,
126
+ };
127
+ }
128
+ catch (embError) {
129
+ // Non-fatal: store without embedding, log warning
130
+ console.warn("[create_learning] Embedding generation failed (storing without):", embError);
131
+ }
132
+ }
133
+ else {
134
+ console.warn("[create_learning] No embedding provider configured — storing without embedding");
135
+ }
136
+ console.error(`[create_learning] Attempting directUpsert for learning ${learningId}`);
137
+ console.error(`[create_learning] Learning type: ${params.learning_type}, Project: ${params.project || "orchestra_dev"}`);
138
+ // Write directly to Supabase REST API (bypasses ww-mcp)
139
+ const upsertStart = Date.now();
140
+ const writeResult = await supabase.directUpsert("orchestra_learnings", learningData);
141
+ const upsertLatency = Date.now() - upsertStart;
142
+ breakdown.upsert = {
143
+ latency_ms: upsertLatency,
144
+ source: "supabase",
145
+ cache_status: "not_applicable",
146
+ network_call: true,
147
+ };
148
+ // OD-539: Defense in depth - verify write succeeded
149
+ // directUpsert now throws on empty result, but explicit check documents expectation
150
+ if (!writeResult || !writeResult.id) {
151
+ throw new Error(`Write verification failed: directUpsert returned ${writeResult ? 'record without id' : 'null/undefined'}. ` +
152
+ `Expected record with id field.`);
153
+ }
154
+ console.error(`[create_learning] directUpsert succeeded, verified ID: ${writeResult.id}`);
155
+ // OD-466: Auto-create knowledge triples (fire-and-forget)
156
+ writeTriplesForLearning({
157
+ id: learningId,
158
+ learning_type: params.learning_type,
159
+ title: params.title,
160
+ description: params.description,
161
+ scar_type: params.scar_type,
162
+ source_linear_issue: params.source_linear_issue,
163
+ persona_name: agentIdentity,
164
+ domain: params.domain,
165
+ project: (params.project || "orchestra_dev"),
166
+ }).catch((err) => {
167
+ console.warn("[create_learning] Triple generation failed (non-fatal):", err);
168
+ });
169
+ // Invalidate local cache so next recall picks up the new learning
170
+ const project = (params.project || "orchestra_dev");
171
+ flushCache(project).catch((err) => {
172
+ console.warn("[create_learning] Cache invalidation failed (non-fatal):", err);
173
+ });
174
+ }
175
+ else {
176
+ // Free tier: Store locally without embedding
177
+ console.error(`[create_learning] Storing locally: ${learningId}`);
178
+ const upsertStart = Date.now();
179
+ await getStorage().upsert("learnings", learningData);
180
+ breakdown.upsert = {
181
+ latency_ms: Date.now() - upsertStart,
182
+ source: "memory",
183
+ cache_status: "not_applicable",
184
+ network_call: false,
185
+ };
186
+ }
187
+ const latencyMs = timer.stop();
188
+ const perfData = buildPerformanceData("create_learning", latencyMs, 1, {
189
+ breakdown,
190
+ });
191
+ // Record metrics
192
+ recordMetrics({
193
+ id: metricsId,
194
+ tool_name: "create_learning",
195
+ tables_searched: ["orchestra_learnings"],
196
+ latency_ms: latencyMs,
197
+ result_count: 1,
198
+ phase_tag: "learning_capture",
199
+ metadata: {
200
+ learning_type: params.learning_type,
201
+ project: params.project || "orchestra_dev",
202
+ embedding_generated: embeddingGenerated,
203
+ write_path: "directUpsert",
204
+ },
205
+ }).catch(() => { });
206
+ return {
207
+ success: true,
208
+ learning_id: learningId,
209
+ embedding_generated: embeddingGenerated,
210
+ performance: perfData,
211
+ };
212
+ }
213
+ catch (error) {
214
+ console.error("[create_learning] Failed:", error);
215
+ console.error("[create_learning] Error details:", error instanceof Error ? error.message : String(error));
216
+ const latencyMs = timer.stop();
217
+ const perfData = buildPerformanceData("create_learning", latencyMs, 0);
218
+ return {
219
+ success: false,
220
+ learning_id: "",
221
+ embedding_generated: false,
222
+ performance: perfData,
223
+ };
224
+ }
225
+ }
226
+ //# sourceMappingURL=create-learning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-learning.js","sourceRoot":"","sources":["../../src/tools/create-learning.ts"],"names":[],"mappings":"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"}