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.
- package/CHANGELOG.md +47 -0
- package/CLAUDE.md.template +65 -0
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/bin/gitmem.js +383 -0
- package/dist/commands/check.d.ts +33 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +492 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/constants/closing-questions.d.ts +40 -0
- package/dist/constants/closing-questions.d.ts.map +1 -0
- package/dist/constants/closing-questions.js +107 -0
- package/dist/constants/closing-questions.js.map +1 -0
- package/dist/diagnostics/anonymizer.d.ts +55 -0
- package/dist/diagnostics/anonymizer.d.ts.map +1 -0
- package/dist/diagnostics/anonymizer.js +191 -0
- package/dist/diagnostics/anonymizer.js.map +1 -0
- package/dist/diagnostics/channels.d.ts +132 -0
- package/dist/diagnostics/channels.d.ts.map +1 -0
- package/dist/diagnostics/channels.js +150 -0
- package/dist/diagnostics/channels.js.map +1 -0
- package/dist/diagnostics/collector.d.ts +183 -0
- package/dist/diagnostics/collector.d.ts.map +1 -0
- package/dist/diagnostics/collector.js +227 -0
- package/dist/diagnostics/collector.js.map +1 -0
- package/dist/diagnostics/index.d.ts +28 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +31 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/absorb-observations.d.ts +63 -0
- package/dist/schemas/absorb-observations.d.ts.map +1 -0
- package/dist/schemas/absorb-observations.js +25 -0
- package/dist/schemas/absorb-observations.js.map +1 -0
- package/dist/schemas/active-sessions.d.ts +71 -0
- package/dist/schemas/active-sessions.d.ts.map +1 -0
- package/dist/schemas/active-sessions.js +19 -0
- package/dist/schemas/active-sessions.js.map +1 -0
- package/dist/schemas/analyze.d.ts +38 -0
- package/dist/schemas/analyze.d.ts.map +1 -0
- package/dist/schemas/analyze.js +30 -0
- package/dist/schemas/analyze.js.map +1 -0
- package/dist/schemas/common.d.ts +55 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +65 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/create-decision.d.ts +48 -0
- package/dist/schemas/create-decision.d.ts.map +1 -0
- package/dist/schemas/create-decision.js +31 -0
- package/dist/schemas/create-decision.js.map +1 -0
- package/dist/schemas/create-learning.d.ts +107 -0
- package/dist/schemas/create-learning.d.ts.map +1 -0
- package/dist/schemas/create-learning.js +64 -0
- package/dist/schemas/create-learning.js.map +1 -0
- package/dist/schemas/get-transcript.d.ts +24 -0
- package/dist/schemas/get-transcript.d.ts.map +1 -0
- package/dist/schemas/get-transcript.js +22 -0
- package/dist/schemas/get-transcript.js.map +1 -0
- package/dist/schemas/index.d.ts +23 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +23 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/log.d.ts +36 -0
- package/dist/schemas/log.d.ts.map +1 -0
- package/dist/schemas/log.js +27 -0
- package/dist/schemas/log.js.map +1 -0
- package/dist/schemas/prepare-context.d.ts +41 -0
- package/dist/schemas/prepare-context.d.ts.map +1 -0
- package/dist/schemas/prepare-context.js +31 -0
- package/dist/schemas/prepare-context.js.map +1 -0
- package/dist/schemas/recall.d.ts +41 -0
- package/dist/schemas/recall.d.ts.map +1 -0
- package/dist/schemas/recall.js +47 -0
- package/dist/schemas/recall.js.map +1 -0
- package/dist/schemas/record-scar-usage-batch.d.ts +82 -0
- package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage-batch.js +25 -0
- package/dist/schemas/record-scar-usage-batch.js.map +1 -0
- package/dist/schemas/record-scar-usage.d.ts +51 -0
- package/dist/schemas/record-scar-usage.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage.js +32 -0
- package/dist/schemas/record-scar-usage.js.map +1 -0
- package/dist/schemas/save-transcript.d.ts +38 -0
- package/dist/schemas/save-transcript.d.ts.map +1 -0
- package/dist/schemas/save-transcript.js +30 -0
- package/dist/schemas/save-transcript.js.map +1 -0
- package/dist/schemas/search.d.ts +36 -0
- package/dist/schemas/search.d.ts.map +1 -0
- package/dist/schemas/search.js +27 -0
- package/dist/schemas/search.js.map +1 -0
- package/dist/schemas/session-close.d.ts +371 -0
- package/dist/schemas/session-close.d.ts.map +1 -0
- package/dist/schemas/session-close.js +95 -0
- package/dist/schemas/session-close.js.map +1 -0
- package/dist/schemas/session-start.d.ts +46 -0
- package/dist/schemas/session-start.d.ts.map +1 -0
- package/dist/schemas/session-start.js +33 -0
- package/dist/schemas/session-start.js.map +1 -0
- package/dist/schemas/thread.d.ts +72 -0
- package/dist/schemas/thread.d.ts.map +1 -0
- package/dist/schemas/thread.js +39 -0
- package/dist/schemas/thread.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +313 -0
- package/dist/server.js.map +1 -0
- package/dist/services/active-sessions.d.ts +66 -0
- package/dist/services/active-sessions.d.ts.map +1 -0
- package/dist/services/active-sessions.js +311 -0
- package/dist/services/active-sessions.js.map +1 -0
- package/dist/services/agent-detection.d.ts +25 -0
- package/dist/services/agent-detection.d.ts.map +1 -0
- package/dist/services/agent-detection.js +93 -0
- package/dist/services/agent-detection.js.map +1 -0
- package/dist/services/analytics.d.ts +201 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +483 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/cache.d.ts +148 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +384 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/cache.test.d.ts +8 -0
- package/dist/services/cache.test.d.ts.map +1 -0
- package/dist/services/cache.test.js +267 -0
- package/dist/services/cache.test.js.map +1 -0
- package/dist/services/compliance-validator.d.ts +30 -0
- package/dist/services/compliance-validator.d.ts.map +1 -0
- package/dist/services/compliance-validator.js +257 -0
- package/dist/services/compliance-validator.js.map +1 -0
- package/dist/services/config.d.ts +48 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +128 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/embedding.d.ts +58 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +243 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/gitmem-dir.d.ts +38 -0
- package/dist/services/gitmem-dir.d.ts.map +1 -0
- package/dist/services/gitmem-dir.js +84 -0
- package/dist/services/gitmem-dir.js.map +1 -0
- package/dist/services/local-file-storage.d.ts +56 -0
- package/dist/services/local-file-storage.d.ts.map +1 -0
- package/dist/services/local-file-storage.js +213 -0
- package/dist/services/local-file-storage.js.map +1 -0
- package/dist/services/local-vector-search.d.ts +137 -0
- package/dist/services/local-vector-search.d.ts.map +1 -0
- package/dist/services/local-vector-search.js +311 -0
- package/dist/services/local-vector-search.js.map +1 -0
- package/dist/services/metrics.d.ts +104 -0
- package/dist/services/metrics.d.ts.map +1 -0
- package/dist/services/metrics.js +264 -0
- package/dist/services/metrics.js.map +1 -0
- package/dist/services/session-state.d.ts +113 -0
- package/dist/services/session-state.d.ts.map +1 -0
- package/dist/services/session-state.js +203 -0
- package/dist/services/session-state.js.map +1 -0
- package/dist/services/startup.d.ts +112 -0
- package/dist/services/startup.d.ts.map +1 -0
- package/dist/services/startup.js +436 -0
- package/dist/services/startup.js.map +1 -0
- package/dist/services/storage.d.ts +43 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +92 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/supabase-client.d.ts +163 -0
- package/dist/services/supabase-client.d.ts.map +1 -0
- package/dist/services/supabase-client.js +510 -0
- package/dist/services/supabase-client.js.map +1 -0
- package/dist/services/thread-dedup.d.ts +44 -0
- package/dist/services/thread-dedup.d.ts.map +1 -0
- package/dist/services/thread-dedup.js +113 -0
- package/dist/services/thread-dedup.js.map +1 -0
- package/dist/services/thread-manager.d.ts +77 -0
- package/dist/services/thread-manager.d.ts.map +1 -0
- package/dist/services/thread-manager.js +250 -0
- package/dist/services/thread-manager.js.map +1 -0
- package/dist/services/thread-suggestions.d.ts +66 -0
- package/dist/services/thread-suggestions.d.ts.map +1 -0
- package/dist/services/thread-suggestions.js +243 -0
- package/dist/services/thread-suggestions.js.map +1 -0
- package/dist/services/thread-supabase.d.ts +111 -0
- package/dist/services/thread-supabase.d.ts.map +1 -0
- package/dist/services/thread-supabase.js +459 -0
- package/dist/services/thread-supabase.js.map +1 -0
- package/dist/services/thread-vitality.d.ts +65 -0
- package/dist/services/thread-vitality.d.ts.map +1 -0
- package/dist/services/thread-vitality.js +143 -0
- package/dist/services/thread-vitality.js.map +1 -0
- package/dist/services/tier.d.ts +52 -0
- package/dist/services/tier.d.ts.map +1 -0
- package/dist/services/tier.js +109 -0
- package/dist/services/tier.js.map +1 -0
- package/dist/services/timezone.d.ts +37 -0
- package/dist/services/timezone.d.ts.map +1 -0
- package/dist/services/timezone.js +147 -0
- package/dist/services/timezone.js.map +1 -0
- package/dist/services/transcript-chunker.d.ts +18 -0
- package/dist/services/transcript-chunker.d.ts.map +1 -0
- package/dist/services/transcript-chunker.js +237 -0
- package/dist/services/transcript-chunker.js.map +1 -0
- package/dist/services/triple-writer.d.ts +128 -0
- package/dist/services/triple-writer.d.ts.map +1 -0
- package/dist/services/triple-writer.js +338 -0
- package/dist/services/triple-writer.js.map +1 -0
- package/dist/services/variant-assignment.d.ts +92 -0
- package/dist/services/variant-assignment.d.ts.map +1 -0
- package/dist/services/variant-assignment.js +196 -0
- package/dist/services/variant-assignment.js.map +1 -0
- package/dist/tools/absorb-observations.d.ts +16 -0
- package/dist/tools/absorb-observations.d.ts.map +1 -0
- package/dist/tools/absorb-observations.js +82 -0
- package/dist/tools/absorb-observations.js.map +1 -0
- package/dist/tools/analyze.d.ts +55 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +139 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/cleanup-threads.d.ts +47 -0
- package/dist/tools/cleanup-threads.d.ts.map +1 -0
- package/dist/tools/cleanup-threads.js +127 -0
- package/dist/tools/cleanup-threads.js.map +1 -0
- package/dist/tools/confirm-scars.d.ts +23 -0
- package/dist/tools/confirm-scars.d.ts.map +1 -0
- package/dist/tools/confirm-scars.js +209 -0
- package/dist/tools/confirm-scars.js.map +1 -0
- package/dist/tools/create-decision.d.ts +15 -0
- package/dist/tools/create-decision.d.ts.map +1 -0
- package/dist/tools/create-decision.js +138 -0
- package/dist/tools/create-decision.js.map +1 -0
- package/dist/tools/create-learning.d.ts +15 -0
- package/dist/tools/create-learning.d.ts.map +1 -0
- package/dist/tools/create-learning.js +226 -0
- package/dist/tools/create-learning.js.map +1 -0
- package/dist/tools/create-thread.d.ts +42 -0
- package/dist/tools/create-thread.d.ts.map +1 -0
- package/dist/tools/create-thread.js +180 -0
- package/dist/tools/create-thread.js.map +1 -0
- package/dist/tools/definitions.d.ts +5013 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +2017 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/dismiss-suggestion.d.ts +20 -0
- package/dist/tools/dismiss-suggestion.d.ts.map +1 -0
- package/dist/tools/dismiss-suggestion.js +40 -0
- package/dist/tools/dismiss-suggestion.js.map +1 -0
- package/dist/tools/get-transcript.d.ts +24 -0
- package/dist/tools/get-transcript.d.ts.map +1 -0
- package/dist/tools/get-transcript.js +52 -0
- package/dist/tools/get-transcript.js.map +1 -0
- package/dist/tools/graph-traverse.d.ts +83 -0
- package/dist/tools/graph-traverse.d.ts.map +1 -0
- package/dist/tools/graph-traverse.js +394 -0
- package/dist/tools/graph-traverse.js.map +1 -0
- package/dist/tools/list-threads.d.ts +15 -0
- package/dist/tools/list-threads.d.ts.map +1 -0
- package/dist/tools/list-threads.js +114 -0
- package/dist/tools/list-threads.js.map +1 -0
- package/dist/tools/log.d.ts +43 -0
- package/dist/tools/log.d.ts.map +1 -0
- package/dist/tools/log.js +157 -0
- package/dist/tools/log.js.map +1 -0
- package/dist/tools/prepare-context.d.ts +36 -0
- package/dist/tools/prepare-context.d.ts.map +1 -0
- package/dist/tools/prepare-context.js +353 -0
- package/dist/tools/prepare-context.js.map +1 -0
- package/dist/tools/promote-suggestion.d.ts +25 -0
- package/dist/tools/promote-suggestion.d.ts.map +1 -0
- package/dist/tools/promote-suggestion.js +60 -0
- package/dist/tools/promote-suggestion.js.map +1 -0
- package/dist/tools/recall.d.ts +77 -0
- package/dist/tools/recall.d.ts.map +1 -0
- package/dist/tools/recall.js +423 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/recall.test.d.ts +5 -0
- package/dist/tools/recall.test.d.ts.map +1 -0
- package/dist/tools/recall.test.js +155 -0
- package/dist/tools/recall.test.js.map +1 -0
- package/dist/tools/record-scar-usage-batch.d.ts +10 -0
- package/dist/tools/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/tools/record-scar-usage-batch.js +153 -0
- package/dist/tools/record-scar-usage-batch.js.map +1 -0
- package/dist/tools/record-scar-usage.d.ts +14 -0
- package/dist/tools/record-scar-usage.d.ts.map +1 -0
- package/dist/tools/record-scar-usage.js +94 -0
- package/dist/tools/record-scar-usage.js.map +1 -0
- package/dist/tools/resolve-thread.d.ts +16 -0
- package/dist/tools/resolve-thread.d.ts.map +1 -0
- package/dist/tools/resolve-thread.js +102 -0
- package/dist/tools/resolve-thread.js.map +1 -0
- package/dist/tools/save-transcript.d.ts +29 -0
- package/dist/tools/save-transcript.d.ts.map +1 -0
- package/dist/tools/save-transcript.js +97 -0
- package/dist/tools/save-transcript.js.map +1 -0
- package/dist/tools/search.d.ts +46 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +186 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/session-close.d.ts +14 -0
- package/dist/tools/session-close.d.ts.map +1 -0
- package/dist/tools/session-close.js +881 -0
- package/dist/tools/session-close.js.map +1 -0
- package/dist/tools/session-start.d.ts +38 -0
- package/dist/tools/session-start.d.ts.map +1 -0
- package/dist/tools/session-start.js +1104 -0
- package/dist/tools/session-start.js.map +1 -0
- package/dist/types/index.d.ts +456 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +76 -0
- package/schema/setup.sql +193 -0
- 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":"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"}
|
|
@@ -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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"}
|