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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript Chunking Service
|
|
3
|
+
*
|
|
4
|
+
* Parses JSONL session transcripts, chunks them intelligently,
|
|
5
|
+
* generates embeddings, and stores in orchestra_transcript_chunks.
|
|
6
|
+
*
|
|
7
|
+
* Issue: OD-540
|
|
8
|
+
*/
|
|
9
|
+
// OpenRouter API configuration (same as local-vector-search)
|
|
10
|
+
const OPENROUTER_API_URL = "https://openrouter.ai/api/v1/embeddings";
|
|
11
|
+
const EMBEDDING_MODEL = "openai/text-embedding-3-small";
|
|
12
|
+
const EMBEDDING_DIM = 1536;
|
|
13
|
+
// Chunking parameters
|
|
14
|
+
const MAX_TOKENS_PER_CHUNK = 500;
|
|
15
|
+
const TOKEN_OVERLAP = 50;
|
|
16
|
+
const CHARS_PER_TOKEN = 4; // Rough estimate
|
|
17
|
+
/**
|
|
18
|
+
* Normalize embedding vector (required for consistent similarity search)
|
|
19
|
+
*/
|
|
20
|
+
function normalize(vec) {
|
|
21
|
+
let magnitude = 0;
|
|
22
|
+
for (const v of vec) {
|
|
23
|
+
magnitude += v * v;
|
|
24
|
+
}
|
|
25
|
+
magnitude = Math.sqrt(magnitude);
|
|
26
|
+
if (magnitude === 0)
|
|
27
|
+
return vec;
|
|
28
|
+
return vec.map((v) => v / magnitude);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate embedding using OpenRouter API
|
|
32
|
+
*/
|
|
33
|
+
async function generateEmbedding(text) {
|
|
34
|
+
const apiKey = process.env.OPENROUTER_API_KEY;
|
|
35
|
+
if (!apiKey) {
|
|
36
|
+
throw new Error("OPENROUTER_API_KEY not configured");
|
|
37
|
+
}
|
|
38
|
+
const response = await fetch(OPENROUTER_API_URL, {
|
|
39
|
+
method: "POST",
|
|
40
|
+
headers: {
|
|
41
|
+
Authorization: `Bearer ${apiKey}`,
|
|
42
|
+
"Content-Type": "application/json",
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
model: EMBEDDING_MODEL,
|
|
46
|
+
input: text,
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const errorText = await response.text();
|
|
51
|
+
throw new Error(`OpenRouter API error (${response.status}): ${errorText}`);
|
|
52
|
+
}
|
|
53
|
+
const data = (await response.json());
|
|
54
|
+
if (!data.data || data.data.length === 0) {
|
|
55
|
+
throw new Error("No embedding data in response");
|
|
56
|
+
}
|
|
57
|
+
const embedding = data.data[0].embedding;
|
|
58
|
+
if (embedding.length !== EMBEDDING_DIM) {
|
|
59
|
+
throw new Error(`Unexpected embedding dimensions: ${embedding.length}, expected ${EMBEDDING_DIM}`);
|
|
60
|
+
}
|
|
61
|
+
return normalize(embedding);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extract text content from a transcript message
|
|
65
|
+
*/
|
|
66
|
+
function extractContent(msg) {
|
|
67
|
+
// Claude Code JSONL format: type is "user"/"assistant" and content is under msg.message
|
|
68
|
+
// Legacy/API format: type is "message" with role and content at top level
|
|
69
|
+
const role = msg.message?.role || msg.role;
|
|
70
|
+
const content = msg.message?.content || msg.content;
|
|
71
|
+
const msgType = msg.type;
|
|
72
|
+
// User messages (Claude Code: type="user", Legacy: type="message" role="user")
|
|
73
|
+
if ((msgType === "user" || (msgType === "message" && role === "user"))) {
|
|
74
|
+
if (typeof content === "string") {
|
|
75
|
+
return { text: content, type: "user_message" };
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(content)) {
|
|
78
|
+
// Extract text blocks (skip tool_result blocks from user messages)
|
|
79
|
+
const textParts = content
|
|
80
|
+
.filter(c => c.type === "text" && c.text)
|
|
81
|
+
.map(c => c.text);
|
|
82
|
+
if (textParts.length > 0) {
|
|
83
|
+
return { text: textParts.join("\n"), type: "user_message" };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Assistant messages (Claude Code: type="assistant", Legacy: type="message" role="assistant")
|
|
88
|
+
if ((msgType === "assistant" || (msgType === "message" && role === "assistant"))) {
|
|
89
|
+
if (typeof content === "string") {
|
|
90
|
+
return { text: content, type: "assistant_message" };
|
|
91
|
+
}
|
|
92
|
+
if (Array.isArray(content)) {
|
|
93
|
+
const textParts = content
|
|
94
|
+
.filter(c => c.type === "text" && c.text)
|
|
95
|
+
.map(c => c.text);
|
|
96
|
+
if (textParts.length > 0) {
|
|
97
|
+
return { text: textParts.join("\n"), type: "assistant_message" };
|
|
98
|
+
}
|
|
99
|
+
// Thinking blocks
|
|
100
|
+
const thinkingParts = content
|
|
101
|
+
.filter(c => c.type === "thinking" && c.thinking)
|
|
102
|
+
.map(c => c.thinking);
|
|
103
|
+
if (thinkingParts.length > 0) {
|
|
104
|
+
return { text: thinkingParts.join("\n"), type: "thinking" };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Tool results (if we want to include them)
|
|
109
|
+
if (msg.type === "tool_result" && typeof content === "string") {
|
|
110
|
+
// Only include short tool results to avoid noise
|
|
111
|
+
if (content.length < 2000) {
|
|
112
|
+
return { text: content, type: "tool_result" };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Chunk text into overlapping segments
|
|
119
|
+
*/
|
|
120
|
+
function chunkText(text, maxTokens, overlap) {
|
|
121
|
+
const maxChars = maxTokens * CHARS_PER_TOKEN;
|
|
122
|
+
const overlapChars = overlap * CHARS_PER_TOKEN;
|
|
123
|
+
const chunks = [];
|
|
124
|
+
let start = 0;
|
|
125
|
+
while (start < text.length) {
|
|
126
|
+
const end = Math.min(start + maxChars, text.length);
|
|
127
|
+
chunks.push(text.slice(start, end));
|
|
128
|
+
// Move start forward by (maxChars - overlapChars)
|
|
129
|
+
start += maxChars - overlapChars;
|
|
130
|
+
// If we're within one overlap of the end, break to avoid tiny final chunk
|
|
131
|
+
if (start + overlapChars >= text.length) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return chunks;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Parse JSONL transcript and extract content
|
|
139
|
+
*/
|
|
140
|
+
function parseTranscript(jsonlContent) {
|
|
141
|
+
const lines = jsonlContent.trim().split("\n");
|
|
142
|
+
const extracted = [];
|
|
143
|
+
for (const line of lines) {
|
|
144
|
+
if (!line.trim())
|
|
145
|
+
continue;
|
|
146
|
+
try {
|
|
147
|
+
const msg = JSON.parse(line);
|
|
148
|
+
const content = extractContent(msg);
|
|
149
|
+
if (content) {
|
|
150
|
+
extracted.push(content);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
// Skip malformed lines
|
|
155
|
+
console.warn("[transcript-chunker] Failed to parse line:", err);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return extracted;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Process a transcript: parse, chunk, embed, and store
|
|
162
|
+
*/
|
|
163
|
+
export async function processTranscript(sessionId, transcriptContent, project = "orchestra_dev") {
|
|
164
|
+
try {
|
|
165
|
+
console.error(`[transcript-chunker] Processing transcript for session ${sessionId}`);
|
|
166
|
+
// 1. Parse transcript and extract content
|
|
167
|
+
const extracted = parseTranscript(transcriptContent);
|
|
168
|
+
console.error(`[transcript-chunker] Extracted ${extracted.length} content blocks`);
|
|
169
|
+
if (extracted.length === 0) {
|
|
170
|
+
return { success: true, chunksCreated: 0 };
|
|
171
|
+
}
|
|
172
|
+
// 2. Combine extracted content into chunks
|
|
173
|
+
const allChunks = [];
|
|
174
|
+
let globalChunkIndex = 0;
|
|
175
|
+
for (const { text, type } of extracted) {
|
|
176
|
+
// Chunk long content
|
|
177
|
+
const textChunks = chunkText(text, MAX_TOKENS_PER_CHUNK, TOKEN_OVERLAP);
|
|
178
|
+
for (const chunkText of textChunks) {
|
|
179
|
+
const tokenCount = Math.ceil(chunkText.length / CHARS_PER_TOKEN);
|
|
180
|
+
// Generate embedding (with retry logic for rate limits)
|
|
181
|
+
let embedding;
|
|
182
|
+
try {
|
|
183
|
+
embedding = await generateEmbedding(chunkText);
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.error(`[transcript-chunker] Failed to generate embedding for chunk ${globalChunkIndex}:`, err);
|
|
187
|
+
// Skip this chunk if embedding fails
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
allChunks.push({
|
|
191
|
+
session_id: sessionId,
|
|
192
|
+
chunk_index: globalChunkIndex,
|
|
193
|
+
content: chunkText,
|
|
194
|
+
embedding,
|
|
195
|
+
token_count: tokenCount,
|
|
196
|
+
chunk_type: type,
|
|
197
|
+
});
|
|
198
|
+
globalChunkIndex++;
|
|
199
|
+
// Rate limiting: small delay between API calls
|
|
200
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
console.error(`[transcript-chunker] Generated ${allChunks.length} chunks with embeddings`);
|
|
204
|
+
// 3. Batch insert into database
|
|
205
|
+
if (allChunks.length > 0) {
|
|
206
|
+
// Use direct REST API for batch insert (more efficient than MCP)
|
|
207
|
+
const SUPABASE_URL = process.env.SUPABASE_URL || "";
|
|
208
|
+
const SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY || "";
|
|
209
|
+
if (!SUPABASE_URL || !SUPABASE_KEY) {
|
|
210
|
+
throw new Error("Supabase configuration missing");
|
|
211
|
+
}
|
|
212
|
+
const restUrl = `${SUPABASE_URL}/rest/v1/orchestra_transcript_chunks`;
|
|
213
|
+
const response = await fetch(restUrl, {
|
|
214
|
+
method: "POST",
|
|
215
|
+
headers: {
|
|
216
|
+
"Content-Type": "application/json",
|
|
217
|
+
"Authorization": `Bearer ${SUPABASE_KEY}`,
|
|
218
|
+
"apikey": SUPABASE_KEY,
|
|
219
|
+
"Prefer": "return=minimal", // Don't return inserted rows (faster)
|
|
220
|
+
},
|
|
221
|
+
body: JSON.stringify(allChunks),
|
|
222
|
+
});
|
|
223
|
+
if (!response.ok) {
|
|
224
|
+
const errorText = await response.text();
|
|
225
|
+
throw new Error(`Failed to insert chunks: ${response.status} - ${errorText}`);
|
|
226
|
+
}
|
|
227
|
+
console.error(`[transcript-chunker] Successfully stored ${allChunks.length} chunks`);
|
|
228
|
+
}
|
|
229
|
+
return { success: true, chunksCreated: allChunks.length };
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
233
|
+
console.error("[transcript-chunker] Error processing transcript:", errorMessage);
|
|
234
|
+
return { success: false, chunksCreated: 0, error: errorMessage };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=transcript-chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-chunker.js","sourceRoot":"","sources":["../../src/services/transcript-chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Triple Writer Service
|
|
3
|
+
*
|
|
4
|
+
* Phase 2: Rule-based extraction of knowledge triples from
|
|
5
|
+
* create_learning and create_decision operations.
|
|
6
|
+
*
|
|
7
|
+
* Design principles:
|
|
8
|
+
* - Fire-and-forget: never blocks the main tool response
|
|
9
|
+
* - High-confidence only: rule-based, no guessing
|
|
10
|
+
* - Uses directUpsert pattern from supabase-client.ts
|
|
11
|
+
*/
|
|
12
|
+
/** Controlled predicate vocabulary */
|
|
13
|
+
type Predicate = "created_in" | "influenced_by" | "supersedes" | "demonstrates" | "affects_doc" | "created_thread" | "resolves_thread" | "relates_to_thread";
|
|
14
|
+
interface TripleCandidate {
|
|
15
|
+
subject: string;
|
|
16
|
+
predicate: Predicate;
|
|
17
|
+
object: string;
|
|
18
|
+
source_type: string;
|
|
19
|
+
source_id: string;
|
|
20
|
+
source_linear_issue?: string;
|
|
21
|
+
domain?: string[];
|
|
22
|
+
project: string;
|
|
23
|
+
half_life_days: number;
|
|
24
|
+
created_by: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Normalize a persona label to its canonical form.
|
|
28
|
+
* Strips contextual suffixes like " - UX navigation clarity" or ": Prefers non-invasive..."
|
|
29
|
+
* Then maps to canonical short name if known.
|
|
30
|
+
*
|
|
31
|
+
* Examples:
|
|
32
|
+
* "Elena Vos" → "Elena"
|
|
33
|
+
* "Marcus - Architectural pattern" → "Marcus"
|
|
34
|
+
* "Elena: Prefers non-invasive instrumentation" → "Elena"
|
|
35
|
+
* "Chris Crawford - Process decision" → "Chris Crawford"
|
|
36
|
+
*/
|
|
37
|
+
export declare function normalizePersonaLabel(raw: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Build a prefixed node label: "Persona: X" for known personas, "Agent: X" for agents.
|
|
40
|
+
* Normalizes persona names to canonical form.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildInfluencerLabel(rawName: string): string;
|
|
43
|
+
export interface LearningTripleParams {
|
|
44
|
+
id: string;
|
|
45
|
+
learning_type: string;
|
|
46
|
+
title: string;
|
|
47
|
+
description: string;
|
|
48
|
+
scar_type?: string;
|
|
49
|
+
source_linear_issue?: string;
|
|
50
|
+
persona_name: string;
|
|
51
|
+
domain?: string[];
|
|
52
|
+
project: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Extract triples from a newly created learning using rule-based logic.
|
|
56
|
+
* Pure function — no side effects.
|
|
57
|
+
*/
|
|
58
|
+
export declare function extractLearningTriples(params: LearningTripleParams): TripleCandidate[];
|
|
59
|
+
export interface DecisionTripleParams {
|
|
60
|
+
id: string;
|
|
61
|
+
title: string;
|
|
62
|
+
decision: string;
|
|
63
|
+
rationale: string;
|
|
64
|
+
personas_involved?: string[];
|
|
65
|
+
docs_affected?: string[];
|
|
66
|
+
linear_issue?: string;
|
|
67
|
+
session_id?: string;
|
|
68
|
+
project: string;
|
|
69
|
+
agent: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract triples from a newly created decision using rule-based logic.
|
|
73
|
+
* Pure function — no side effects.
|
|
74
|
+
*/
|
|
75
|
+
export declare function extractDecisionTriples(params: DecisionTripleParams): TripleCandidate[];
|
|
76
|
+
/**
|
|
77
|
+
* Write triples to knowledge_triples table.
|
|
78
|
+
* Fire-and-forget: errors logged but never thrown to caller.
|
|
79
|
+
*/
|
|
80
|
+
export declare function writeTriples(candidates: TripleCandidate[]): Promise<number>;
|
|
81
|
+
/**
|
|
82
|
+
* Generate and write triples for a newly created learning.
|
|
83
|
+
* Fire-and-forget — call with .catch(() => {}).
|
|
84
|
+
*/
|
|
85
|
+
export declare function writeTriplesForLearning(params: LearningTripleParams): Promise<number>;
|
|
86
|
+
/**
|
|
87
|
+
* Generate and write triples for a newly created decision.
|
|
88
|
+
* Fire-and-forget — call with .catch(() => {}).
|
|
89
|
+
*/
|
|
90
|
+
export declare function writeTriplesForDecision(params: DecisionTripleParams): Promise<number>;
|
|
91
|
+
export interface ThreadCreationTripleParams {
|
|
92
|
+
thread_id: string;
|
|
93
|
+
text: string;
|
|
94
|
+
linear_issue?: string;
|
|
95
|
+
session_id?: string;
|
|
96
|
+
project: string;
|
|
97
|
+
agent: string;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract triples from a newly created thread.
|
|
101
|
+
* Pure function — no side effects.
|
|
102
|
+
*/
|
|
103
|
+
export declare function extractThreadCreationTriples(params: ThreadCreationTripleParams): TripleCandidate[];
|
|
104
|
+
export interface ThreadResolutionTripleParams {
|
|
105
|
+
thread_id: string;
|
|
106
|
+
text: string;
|
|
107
|
+
resolution_note?: string;
|
|
108
|
+
session_id?: string;
|
|
109
|
+
project: string;
|
|
110
|
+
agent: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Extract triples from a resolved thread.
|
|
114
|
+
* Pure function — no side effects.
|
|
115
|
+
*/
|
|
116
|
+
export declare function extractThreadResolutionTriples(params: ThreadResolutionTripleParams): TripleCandidate[];
|
|
117
|
+
/**
|
|
118
|
+
* Generate and write triples for a newly created thread.
|
|
119
|
+
* Fire-and-forget — call with .catch(() => {}).
|
|
120
|
+
*/
|
|
121
|
+
export declare function writeTriplesForThreadCreation(params: ThreadCreationTripleParams): Promise<number>;
|
|
122
|
+
/**
|
|
123
|
+
* Generate and write triples for a resolved thread.
|
|
124
|
+
* Fire-and-forget — call with .catch(() => {}).
|
|
125
|
+
*/
|
|
126
|
+
export declare function writeTriplesForThreadResolution(params: ThreadResolutionTripleParams): Promise<number>;
|
|
127
|
+
export {};
|
|
128
|
+
//# sourceMappingURL=triple-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triple-writer.d.ts","sourceRoot":"","sources":["../../src/services/triple-writer.ts"],"names":[],"mappings":"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"}
|