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,492 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitMem Check Command
|
|
3
|
+
*
|
|
4
|
+
* Diagnostic CLI command for health checks and benchmarks.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* npx gitmem check — Quick health check (~5s)
|
|
8
|
+
* npx gitmem check --full — Full diagnostic (~30s)
|
|
9
|
+
* npx gitmem check --output report.json
|
|
10
|
+
*
|
|
11
|
+
* Issue: OD-584
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, mkdirSync, writeFileSync, readdirSync, statSync } from "fs";
|
|
14
|
+
import { join } from "path";
|
|
15
|
+
import { DiagnosticsCollector, runBenchmark, anonymizeSupabaseUrl, anonymizePath, isApiKeyConfigured, getSafeEnvironmentInfo, } from "../diagnostics/index.js";
|
|
16
|
+
import { getCache, CacheService } from "../services/cache.js";
|
|
17
|
+
import { getTier, hasSupabase } from "../services/tier.js";
|
|
18
|
+
// Report version for schema compatibility
|
|
19
|
+
const REPORT_VERSION = "1.0.0";
|
|
20
|
+
/**
|
|
21
|
+
* Parse command line arguments
|
|
22
|
+
*/
|
|
23
|
+
export function parseArgs(args) {
|
|
24
|
+
const options = {
|
|
25
|
+
full: false,
|
|
26
|
+
};
|
|
27
|
+
for (let i = 0; i < args.length; i++) {
|
|
28
|
+
const arg = args[i];
|
|
29
|
+
if (arg === "--full" || arg === "-f") {
|
|
30
|
+
options.full = true;
|
|
31
|
+
}
|
|
32
|
+
else if (arg === "--output" || arg === "-o") {
|
|
33
|
+
options.output = args[i + 1];
|
|
34
|
+
i++;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return options;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run quick health check (~5s)
|
|
41
|
+
*/
|
|
42
|
+
async function runQuickCheck() {
|
|
43
|
+
const health = {
|
|
44
|
+
supabase: { status: "skip", message: "Not checked" },
|
|
45
|
+
embedding: { status: "skip", message: "Not checked" },
|
|
46
|
+
cache: { status: "skip", message: "Not checked" },
|
|
47
|
+
recall: { status: "skip", message: "Not checked" },
|
|
48
|
+
write: { status: "skip", message: "Not checked" },
|
|
49
|
+
};
|
|
50
|
+
// Detect tier and configuration
|
|
51
|
+
const tier = getTier();
|
|
52
|
+
const supabaseUrl = process.env.SUPABASE_URL;
|
|
53
|
+
const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
|
|
54
|
+
const openaiKey = process.env.OPENAI_API_KEY;
|
|
55
|
+
const openrouterKey = process.env.OPENROUTER_API_KEY;
|
|
56
|
+
const ollamaUrl = process.env.OLLAMA_URL;
|
|
57
|
+
// Determine embedding provider
|
|
58
|
+
let embeddingProvider = "none";
|
|
59
|
+
let embeddingConfigured = false;
|
|
60
|
+
if (isApiKeyConfigured(openaiKey)) {
|
|
61
|
+
embeddingProvider = "openai";
|
|
62
|
+
embeddingConfigured = true;
|
|
63
|
+
}
|
|
64
|
+
else if (isApiKeyConfigured(openrouterKey)) {
|
|
65
|
+
embeddingProvider = "openrouter";
|
|
66
|
+
embeddingConfigured = true;
|
|
67
|
+
}
|
|
68
|
+
else if (ollamaUrl) {
|
|
69
|
+
embeddingProvider = "ollama";
|
|
70
|
+
embeddingConfigured = true;
|
|
71
|
+
}
|
|
72
|
+
// Cache check
|
|
73
|
+
const cache = getCache();
|
|
74
|
+
const cacheEnabled = cache.isEnabled();
|
|
75
|
+
const cachePath = process.env.GITMEM_CACHE_DIR ||
|
|
76
|
+
(process.env.HOME ? `${process.env.HOME}/.cache/gitmem` : "/tmp/gitmem-cache");
|
|
77
|
+
const configuration = {
|
|
78
|
+
supabaseConfigured: hasSupabase(),
|
|
79
|
+
supabaseUrl: anonymizeSupabaseUrl(supabaseUrl),
|
|
80
|
+
embeddingProvider,
|
|
81
|
+
embeddingConfigured,
|
|
82
|
+
cacheEnabled,
|
|
83
|
+
cachePath: anonymizePath(cachePath),
|
|
84
|
+
};
|
|
85
|
+
// Health check: Cache
|
|
86
|
+
if (cacheEnabled) {
|
|
87
|
+
try {
|
|
88
|
+
const startTime = Date.now();
|
|
89
|
+
const stats = await cache.getStats();
|
|
90
|
+
const durationMs = Date.now() - startTime;
|
|
91
|
+
health.cache = {
|
|
92
|
+
status: "pass",
|
|
93
|
+
message: `Cache operational (${stats.resultCount} entries, ${Math.round(stats.resultBytes / 1024)}KB)`,
|
|
94
|
+
durationMs,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
health.cache = {
|
|
99
|
+
status: "fail",
|
|
100
|
+
message: `Cache error: ${error instanceof Error ? error.message : String(error)}`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
health.cache = {
|
|
106
|
+
status: "skip",
|
|
107
|
+
message: "Cache disabled",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Health check: Supabase connection
|
|
111
|
+
if (hasSupabase()) {
|
|
112
|
+
try {
|
|
113
|
+
const startTime = Date.now();
|
|
114
|
+
// Try to fetch from Supabase REST API
|
|
115
|
+
const restUrl = `${supabaseUrl}/rest/v1/gitmem_learnings?select=id&limit=1`;
|
|
116
|
+
const response = await fetch(restUrl, {
|
|
117
|
+
headers: {
|
|
118
|
+
apikey: supabaseKey,
|
|
119
|
+
Authorization: `Bearer ${supabaseKey}`,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
const durationMs = Date.now() - startTime;
|
|
123
|
+
if (response.ok) {
|
|
124
|
+
health.supabase = {
|
|
125
|
+
status: "pass",
|
|
126
|
+
message: "Supabase connection successful",
|
|
127
|
+
durationMs,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
health.supabase = {
|
|
132
|
+
status: "fail",
|
|
133
|
+
message: `Supabase returned ${response.status}: ${response.statusText}`,
|
|
134
|
+
durationMs,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
health.supabase = {
|
|
140
|
+
status: "fail",
|
|
141
|
+
message: `Supabase connection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
health.supabase = {
|
|
147
|
+
status: "skip",
|
|
148
|
+
message: "Supabase not configured (free tier)",
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Health check: Embedding provider
|
|
152
|
+
if (embeddingConfigured) {
|
|
153
|
+
if (embeddingProvider === "openai") {
|
|
154
|
+
try {
|
|
155
|
+
const startTime = Date.now();
|
|
156
|
+
const response = await fetch("https://api.openai.com/v1/models", {
|
|
157
|
+
headers: {
|
|
158
|
+
Authorization: `Bearer ${openaiKey}`,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
const durationMs = Date.now() - startTime;
|
|
162
|
+
if (response.ok) {
|
|
163
|
+
health.embedding = {
|
|
164
|
+
status: "pass",
|
|
165
|
+
message: "OpenAI API accessible",
|
|
166
|
+
durationMs,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
health.embedding = {
|
|
171
|
+
status: "fail",
|
|
172
|
+
message: `OpenAI API returned ${response.status}`,
|
|
173
|
+
durationMs,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
health.embedding = {
|
|
179
|
+
status: "fail",
|
|
180
|
+
message: `OpenAI connection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (embeddingProvider === "openrouter") {
|
|
185
|
+
try {
|
|
186
|
+
const startTime = Date.now();
|
|
187
|
+
const response = await fetch("https://openrouter.ai/api/v1/models", {
|
|
188
|
+
headers: {
|
|
189
|
+
Authorization: `Bearer ${openrouterKey}`,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
const durationMs = Date.now() - startTime;
|
|
193
|
+
if (response.ok) {
|
|
194
|
+
health.embedding = {
|
|
195
|
+
status: "pass",
|
|
196
|
+
message: "OpenRouter API accessible",
|
|
197
|
+
durationMs,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
health.embedding = {
|
|
202
|
+
status: "fail",
|
|
203
|
+
message: `OpenRouter API returned ${response.status}`,
|
|
204
|
+
durationMs,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
health.embedding = {
|
|
210
|
+
status: "fail",
|
|
211
|
+
message: `OpenRouter connection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else if (embeddingProvider === "ollama") {
|
|
216
|
+
try {
|
|
217
|
+
const startTime = Date.now();
|
|
218
|
+
const response = await fetch(`${ollamaUrl}/api/tags`);
|
|
219
|
+
const durationMs = Date.now() - startTime;
|
|
220
|
+
if (response.ok) {
|
|
221
|
+
health.embedding = {
|
|
222
|
+
status: "pass",
|
|
223
|
+
message: "Ollama server accessible",
|
|
224
|
+
durationMs,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
health.embedding = {
|
|
229
|
+
status: "fail",
|
|
230
|
+
message: `Ollama server returned ${response.status}`,
|
|
231
|
+
durationMs,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
health.embedding = {
|
|
237
|
+
status: "fail",
|
|
238
|
+
message: `Ollama connection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
health.embedding = {
|
|
245
|
+
status: "skip",
|
|
246
|
+
message: "No embedding provider configured",
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// Health check: Basic recall test (just verify it doesn't crash)
|
|
250
|
+
try {
|
|
251
|
+
const startTime = Date.now();
|
|
252
|
+
// We can't actually call recall without the full MCP server
|
|
253
|
+
// So we just verify the cache can be read
|
|
254
|
+
const testKey = cache.scarSearchKey("health check test", "test", 5);
|
|
255
|
+
await cache.getResult(testKey);
|
|
256
|
+
const durationMs = Date.now() - startTime;
|
|
257
|
+
health.recall = {
|
|
258
|
+
status: "pass",
|
|
259
|
+
message: "Recall infrastructure operational",
|
|
260
|
+
durationMs,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
health.recall = {
|
|
265
|
+
status: "fail",
|
|
266
|
+
message: `Recall check failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
// Health check: Write test (verify we can write to cache)
|
|
270
|
+
try {
|
|
271
|
+
const startTime = Date.now();
|
|
272
|
+
const testKey = `health_check_${Date.now()}`;
|
|
273
|
+
await cache.setResult(testKey, { test: true }, 1000); // 1 second TTL
|
|
274
|
+
const durationMs = Date.now() - startTime;
|
|
275
|
+
health.write = {
|
|
276
|
+
status: "pass",
|
|
277
|
+
message: "Write operations functional",
|
|
278
|
+
durationMs,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
health.write = {
|
|
283
|
+
status: "fail",
|
|
284
|
+
message: `Write check failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// Data volume (counts only)
|
|
288
|
+
let dataVolume;
|
|
289
|
+
try {
|
|
290
|
+
const gitmemDir = join(process.cwd(), ".gitmem");
|
|
291
|
+
let localCacheFiles = 0;
|
|
292
|
+
let localCacheBytes = 0;
|
|
293
|
+
if (existsSync(gitmemDir)) {
|
|
294
|
+
const files = readdirSync(gitmemDir);
|
|
295
|
+
for (const file of files) {
|
|
296
|
+
if (file.endsWith(".json")) {
|
|
297
|
+
localCacheFiles++;
|
|
298
|
+
try {
|
|
299
|
+
const stat = statSync(join(gitmemDir, file));
|
|
300
|
+
localCacheBytes += stat.size;
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// Ignore stat errors
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// For Supabase counts, we'd need to query the database
|
|
309
|
+
// For now, just report local counts
|
|
310
|
+
dataVolume = {
|
|
311
|
+
learningsCount: 0, // Would need DB query
|
|
312
|
+
sessionsCount: 0,
|
|
313
|
+
decisionsCount: 0,
|
|
314
|
+
localCacheFiles,
|
|
315
|
+
localCacheBytes,
|
|
316
|
+
};
|
|
317
|
+
// If Supabase is configured, try to get counts
|
|
318
|
+
if (hasSupabase()) {
|
|
319
|
+
try {
|
|
320
|
+
const tables = ["learnings", "sessions", "decisions"];
|
|
321
|
+
for (const table of tables) {
|
|
322
|
+
const response = await fetch(`${supabaseUrl}/rest/v1/gitmem_${table}?select=id&limit=0`, {
|
|
323
|
+
method: "HEAD",
|
|
324
|
+
headers: {
|
|
325
|
+
apikey: supabaseKey,
|
|
326
|
+
Authorization: `Bearer ${supabaseKey}`,
|
|
327
|
+
Prefer: "count=exact",
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
const count = response.headers.get("content-range");
|
|
331
|
+
if (count) {
|
|
332
|
+
const match = count.match(/\/(\d+)/);
|
|
333
|
+
if (match) {
|
|
334
|
+
const key = `${table}Count`;
|
|
335
|
+
dataVolume[key] = parseInt(match[1]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
// Ignore count errors
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
// Ignore data volume errors
|
|
347
|
+
}
|
|
348
|
+
return { health, configuration, dataVolume };
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Run full diagnostic with benchmarks (~30s)
|
|
352
|
+
*/
|
|
353
|
+
async function runFullCheck() {
|
|
354
|
+
const benchmarks = {};
|
|
355
|
+
const cache = getCache();
|
|
356
|
+
// Cold start benchmark (cache initialization)
|
|
357
|
+
console.log(" Running cold start benchmark...");
|
|
358
|
+
try {
|
|
359
|
+
benchmarks.coldStart = await runBenchmark("coldStart", async () => {
|
|
360
|
+
// Simulate cold start by creating new cache instance
|
|
361
|
+
const testCache = new CacheService(`/tmp/gitmem-bench-${Date.now()}`);
|
|
362
|
+
await testCache.getStats();
|
|
363
|
+
}, 5);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
console.log(` Cold start benchmark failed: ${error}`);
|
|
367
|
+
}
|
|
368
|
+
// Cache populate benchmark
|
|
369
|
+
console.log(" Running cache populate benchmark...");
|
|
370
|
+
try {
|
|
371
|
+
benchmarks.cachePopulate = await runBenchmark("cachePopulate", async () => {
|
|
372
|
+
const key = `bench_populate_${Date.now()}`;
|
|
373
|
+
await cache.setResult(key, { test: true, data: "x".repeat(1000) }, 60000);
|
|
374
|
+
}, 5);
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
console.log(` Cache populate benchmark failed: ${error}`);
|
|
378
|
+
}
|
|
379
|
+
// Cache hit benchmark
|
|
380
|
+
console.log(" Running cache hit benchmark...");
|
|
381
|
+
try {
|
|
382
|
+
// First, populate a cache entry
|
|
383
|
+
const hitKey = `bench_hit_${Date.now()}`;
|
|
384
|
+
await cache.setResult(hitKey, { test: true, data: "x".repeat(1000) }, 60000);
|
|
385
|
+
benchmarks.cacheHit = await runBenchmark("cacheHit", async () => {
|
|
386
|
+
await cache.getResult(hitKey);
|
|
387
|
+
}, 5);
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
console.log(` Cache hit benchmark failed: ${error}`);
|
|
391
|
+
}
|
|
392
|
+
// Recall benchmark (if Supabase configured)
|
|
393
|
+
if (hasSupabase()) {
|
|
394
|
+
console.log(" Running recall benchmark...");
|
|
395
|
+
try {
|
|
396
|
+
benchmarks.recall = await runBenchmark("recall", async () => {
|
|
397
|
+
// Simulate recall by doing a search
|
|
398
|
+
const supabaseUrl = process.env.SUPABASE_URL;
|
|
399
|
+
const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
|
|
400
|
+
await fetch(`${supabaseUrl}/rest/v1/gitmem_learnings?select=id,title&limit=5`, {
|
|
401
|
+
headers: {
|
|
402
|
+
apikey: supabaseKey,
|
|
403
|
+
Authorization: `Bearer ${supabaseKey}`,
|
|
404
|
+
},
|
|
405
|
+
});
|
|
406
|
+
}, 5);
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
console.log(` Recall benchmark failed: ${error}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return benchmarks;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Main check command
|
|
416
|
+
*/
|
|
417
|
+
export async function runCheck(options) {
|
|
418
|
+
const mode = options.full ? "full" : "quick";
|
|
419
|
+
console.log(`\nGitMem Diagnostic Check (${mode} mode)\n`);
|
|
420
|
+
console.log("=".repeat(50));
|
|
421
|
+
const collector = new DiagnosticsCollector();
|
|
422
|
+
collector.start();
|
|
423
|
+
// Run quick checks
|
|
424
|
+
console.log("\nRunning health checks...");
|
|
425
|
+
const { health, configuration, dataVolume } = await runQuickCheck();
|
|
426
|
+
// Print health check results
|
|
427
|
+
console.log("\nHealth Checks:");
|
|
428
|
+
for (const [name, result] of Object.entries(health)) {
|
|
429
|
+
const icon = result.status === "pass" ? "✓" : result.status === "fail" ? "✗" : "○";
|
|
430
|
+
const time = result.durationMs ? ` (${result.durationMs}ms)` : "";
|
|
431
|
+
console.log(` ${icon} ${name}: ${result.message}${time}`);
|
|
432
|
+
}
|
|
433
|
+
// Run benchmarks if full mode
|
|
434
|
+
let benchmarks;
|
|
435
|
+
if (options.full) {
|
|
436
|
+
console.log("\nRunning benchmarks...");
|
|
437
|
+
benchmarks = await runFullCheck();
|
|
438
|
+
if (benchmarks) {
|
|
439
|
+
console.log("\nBenchmark Results:");
|
|
440
|
+
for (const [name, result] of Object.entries(benchmarks)) {
|
|
441
|
+
if (result) {
|
|
442
|
+
console.log(` ${name}: mean=${result.meanMs.toFixed(2)}ms, p95=${result.p95Ms.toFixed(2)}ms`);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// Stop collecting metrics
|
|
448
|
+
const metrics = collector.stop();
|
|
449
|
+
// Build report
|
|
450
|
+
const envInfo = getSafeEnvironmentInfo();
|
|
451
|
+
const report = {
|
|
452
|
+
version: REPORT_VERSION,
|
|
453
|
+
generatedAt: new Date().toISOString(),
|
|
454
|
+
mode,
|
|
455
|
+
environment: {
|
|
456
|
+
...envInfo,
|
|
457
|
+
tier: getTier(),
|
|
458
|
+
},
|
|
459
|
+
configuration,
|
|
460
|
+
health,
|
|
461
|
+
metrics,
|
|
462
|
+
benchmarks,
|
|
463
|
+
dataVolume,
|
|
464
|
+
};
|
|
465
|
+
// Determine output path
|
|
466
|
+
const gitmemDir = join(process.cwd(), ".gitmem");
|
|
467
|
+
if (!existsSync(gitmemDir)) {
|
|
468
|
+
mkdirSync(gitmemDir, { recursive: true });
|
|
469
|
+
}
|
|
470
|
+
const outputPath = options.output || join(gitmemDir, `diagnostic-${Date.now()}.json`);
|
|
471
|
+
// Write report
|
|
472
|
+
writeFileSync(outputPath, JSON.stringify(report, null, 2));
|
|
473
|
+
console.log(`\nReport saved to: ${outputPath}`);
|
|
474
|
+
// Summary
|
|
475
|
+
const passCount = Object.values(health).filter((h) => h.status === "pass").length;
|
|
476
|
+
const failCount = Object.values(health).filter((h) => h.status === "fail").length;
|
|
477
|
+
const skipCount = Object.values(health).filter((h) => h.status === "skip").length;
|
|
478
|
+
console.log(`\nSummary: ${passCount} passed, ${failCount} failed, ${skipCount} skipped`);
|
|
479
|
+
if (failCount > 0) {
|
|
480
|
+
console.log("\n⚠️ Some health checks failed. Review the report for details.");
|
|
481
|
+
process.exit(1);
|
|
482
|
+
}
|
|
483
|
+
console.log("\n✓ All health checks passed.");
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Entry point for CLI
|
|
487
|
+
*/
|
|
488
|
+
export async function main(args) {
|
|
489
|
+
const options = parseArgs(args);
|
|
490
|
+
await runCheck(options);
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single Source of Truth: Closing Reflection Questions
|
|
3
|
+
*
|
|
4
|
+
* All 7 closing questions defined once. Used by:
|
|
5
|
+
* - definitions.ts (JSON schema for tool registration)
|
|
6
|
+
* - compliance-validator.ts (validation error messages)
|
|
7
|
+
* - schemas/session-close.ts (Zod schema)
|
|
8
|
+
* - types/index.ts (ClosingReflection interface)
|
|
9
|
+
*
|
|
10
|
+
* Changing a question here propagates everywhere.
|
|
11
|
+
*/
|
|
12
|
+
export interface ClosingQuestion {
|
|
13
|
+
/** Field name in closing_reflection object */
|
|
14
|
+
key: string;
|
|
15
|
+
/** Question number (Q1-Q7) */
|
|
16
|
+
number: number;
|
|
17
|
+
/** Full question text */
|
|
18
|
+
question: string;
|
|
19
|
+
/** What type of institutional memory this question surfaces */
|
|
20
|
+
memoryType: "scar" | "win" | "decision" | "synthesis" | null;
|
|
21
|
+
/** Whether compliance validator enforces a non-empty answer */
|
|
22
|
+
required: boolean;
|
|
23
|
+
/** JSON schema type for the field */
|
|
24
|
+
fieldType: "string" | "string[]";
|
|
25
|
+
}
|
|
26
|
+
export declare const CLOSING_QUESTIONS: ClosingQuestion[];
|
|
27
|
+
/**
|
|
28
|
+
* Build JSON schema properties for closing_reflection in tool definitions.
|
|
29
|
+
* Returns the `properties` object for the closing_reflection schema.
|
|
30
|
+
*/
|
|
31
|
+
export declare function closingReflectionSchemaProperties(): Record<string, unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* Build the full closing_reflection JSON schema object for tool definitions.
|
|
34
|
+
*/
|
|
35
|
+
export declare function closingReflectionSchema(): Record<string, unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* Build a description string listing all questions (for tool descriptions or prompts).
|
|
38
|
+
*/
|
|
39
|
+
export declare function closingReflectionDescription(): string;
|
|
40
|
+
//# sourceMappingURL=closing-questions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closing-questions.d.ts","sourceRoot":"","sources":["../../src/constants/closing-questions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC;IAC7D,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAC;CAClC;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA4D9C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iCAAiC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMjE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAIrD"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single Source of Truth: Closing Reflection Questions
|
|
3
|
+
*
|
|
4
|
+
* All 7 closing questions defined once. Used by:
|
|
5
|
+
* - definitions.ts (JSON schema for tool registration)
|
|
6
|
+
* - compliance-validator.ts (validation error messages)
|
|
7
|
+
* - schemas/session-close.ts (Zod schema)
|
|
8
|
+
* - types/index.ts (ClosingReflection interface)
|
|
9
|
+
*
|
|
10
|
+
* Changing a question here propagates everywhere.
|
|
11
|
+
*/
|
|
12
|
+
export const CLOSING_QUESTIONS = [
|
|
13
|
+
{
|
|
14
|
+
key: "what_broke",
|
|
15
|
+
number: 1,
|
|
16
|
+
question: "What broke that you didn't expect?",
|
|
17
|
+
memoryType: "scar",
|
|
18
|
+
required: true,
|
|
19
|
+
fieldType: "string",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
key: "what_took_longer",
|
|
23
|
+
number: 2,
|
|
24
|
+
question: "What took longer than it should have?",
|
|
25
|
+
memoryType: "scar",
|
|
26
|
+
required: true,
|
|
27
|
+
fieldType: "string",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
key: "do_differently",
|
|
31
|
+
number: 3,
|
|
32
|
+
question: "What would you do differently next time?",
|
|
33
|
+
memoryType: "scar",
|
|
34
|
+
required: true,
|
|
35
|
+
fieldType: "string",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
key: "what_worked",
|
|
39
|
+
number: 4,
|
|
40
|
+
question: "What pattern or approach worked well?",
|
|
41
|
+
memoryType: "win",
|
|
42
|
+
required: true,
|
|
43
|
+
fieldType: "string",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
key: "wrong_assumption",
|
|
47
|
+
number: 5,
|
|
48
|
+
question: "What assumption was wrong?",
|
|
49
|
+
memoryType: "scar",
|
|
50
|
+
required: true,
|
|
51
|
+
fieldType: "string",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
key: "scars_applied",
|
|
55
|
+
number: 6,
|
|
56
|
+
question: "Which scars or institutional knowledge did you apply?",
|
|
57
|
+
memoryType: null,
|
|
58
|
+
required: false,
|
|
59
|
+
fieldType: "string[]",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
key: "institutional_memory_items",
|
|
63
|
+
number: 7,
|
|
64
|
+
question: "What from this session should be captured as institutional memory? " +
|
|
65
|
+
"Review Q1-Q6 first — Q1/Q5 are scar candidates, Q3 is almost always a scar, " +
|
|
66
|
+
"Q4 is a win, and any significant design choice is a decision.",
|
|
67
|
+
memoryType: "synthesis",
|
|
68
|
+
required: false,
|
|
69
|
+
fieldType: "string",
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
/**
|
|
73
|
+
* Build JSON schema properties for closing_reflection in tool definitions.
|
|
74
|
+
* Returns the `properties` object for the closing_reflection schema.
|
|
75
|
+
*/
|
|
76
|
+
export function closingReflectionSchemaProperties() {
|
|
77
|
+
const properties = {};
|
|
78
|
+
for (const q of CLOSING_QUESTIONS) {
|
|
79
|
+
if (q.fieldType === "string[]") {
|
|
80
|
+
properties[q.key] = {
|
|
81
|
+
type: "array",
|
|
82
|
+
items: { type: "string" },
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
properties[q.key] = { type: "string" };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return properties;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Build the full closing_reflection JSON schema object for tool definitions.
|
|
93
|
+
*/
|
|
94
|
+
export function closingReflectionSchema() {
|
|
95
|
+
return {
|
|
96
|
+
type: "object",
|
|
97
|
+
properties: closingReflectionSchemaProperties(),
|
|
98
|
+
description: `Answers to ${CLOSING_QUESTIONS.length} closing questions (required for standard close)`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Build a description string listing all questions (for tool descriptions or prompts).
|
|
103
|
+
*/
|
|
104
|
+
export function closingReflectionDescription() {
|
|
105
|
+
return CLOSING_QUESTIONS.map((q) => `Q${q.number} (${q.key}): ${q.question}`).join("\n");
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=closing-questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closing-questions.js","sourceRoot":"","sources":["../../src/constants/closing-questions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD;QACE,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,oCAAoC;QAC9C,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,kBAAkB;QACvB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,uCAAuC;QACjD,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,0CAA0C;QACpD,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,aAAa;QAClB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,uCAAuC;QACjD,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,kBAAkB;QACvB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,4BAA4B;QACtC,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,GAAG,EAAE,eAAe;QACpB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,uDAAuD;QACjE,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,UAAU;KACtB;IACD;QACE,GAAG,EAAE,4BAA4B;QACjC,MAAM,EAAE,CAAC;QACT,QAAQ,EACN,qEAAqE;YACrE,8EAA8E;YAC9E,+DAA+D;QACjE,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iCAAiC;IAC/C,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC/B,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;gBAClB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,iCAAiC,EAAE;QAC/C,WAAW,EAAE,cAAc,iBAAiB,CAAC,MAAM,kDAAkD;KACtG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,iBAAiB,CAAC,GAAG,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|