@jamesaphoenix/tx-core 0.4.3 → 0.4.5
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/dist/db.d.ts.map +1 -1
- package/dist/db.js +8 -2
- package/dist/db.js.map +1 -1
- package/dist/layer.d.ts +3 -3
- package/dist/services/auto-sync-service.d.ts +1 -1
- package/dist/services/cycle-scan-service.d.ts.map +1 -1
- package/dist/services/cycle-scan-service.js +6 -2
- package/dist/services/cycle-scan-service.js.map +1 -1
- package/dist/services/learning-service.d.ts +1 -1
- package/dist/services/orchestrator-service.d.ts +1 -1
- package/dist/services/orchestrator-service.d.ts.map +1 -1
- package/dist/services/orchestrator-service.js +14 -13
- package/dist/services/orchestrator-service.js.map +1 -1
- package/dist/services/retriever-service.d.ts +2 -2
- package/dist/services/sync-service.d.ts.map +1 -1
- package/dist/services/sync-service.js +9 -8
- package/dist/services/sync-service.js.map +1 -1
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +3 -2
- package/dist/services/task-service.js.map +1 -1
- package/dist/services/worker-process.d.ts +1 -1
- package/dist/services/worker-process.d.ts.map +1 -1
- package/dist/services/worker-process.js +9 -2
- package/dist/services/worker-process.js.map +1 -1
- package/dist/worker/run-worker.d.ts +1 -1
- package/package.json +1 -1
- package/dist/mappers/anchor.d.ts +0 -28
- package/dist/mappers/anchor.d.ts.map +0 -1
- package/dist/mappers/anchor.js +0 -105
- package/dist/mappers/anchor.js.map +0 -1
- package/dist/mappers/candidate.d.ts +0 -25
- package/dist/mappers/candidate.d.ts.map +0 -1
- package/dist/mappers/candidate.js +0 -83
- package/dist/mappers/candidate.js.map +0 -1
- package/dist/mappers/edge.d.ts +0 -19
- package/dist/mappers/edge.d.ts.map +0 -1
- package/dist/mappers/edge.js +0 -81
- package/dist/mappers/edge.js.map +0 -1
- package/dist/repo/anchor-repo.d.ts +0 -52
- package/dist/repo/anchor-repo.d.ts.map +0 -1
- package/dist/repo/anchor-repo.js +0 -245
- package/dist/repo/anchor-repo.js.map +0 -1
- package/dist/repo/candidate-repo.d.ts +0 -16
- package/dist/repo/candidate-repo.d.ts.map +0 -1
- package/dist/repo/candidate-repo.js +0 -164
- package/dist/repo/candidate-repo.js.map +0 -1
- package/dist/repo/compaction-repo.d.ts +0 -41
- package/dist/repo/compaction-repo.d.ts.map +0 -1
- package/dist/repo/compaction-repo.js +0 -84
- package/dist/repo/compaction-repo.js.map +0 -1
- package/dist/repo/edge-repo.d.ts +0 -26
- package/dist/repo/edge-repo.d.ts.map +0 -1
- package/dist/repo/edge-repo.js +0 -258
- package/dist/repo/edge-repo.js.map +0 -1
- package/dist/services/anchor-service.d.ts +0 -147
- package/dist/services/anchor-service.d.ts.map +0 -1
- package/dist/services/anchor-service.js +0 -540
- package/dist/services/anchor-service.js.map +0 -1
- package/dist/services/anchor-verification.d.ts +0 -102
- package/dist/services/anchor-verification.d.ts.map +0 -1
- package/dist/services/anchor-verification.js +0 -817
- package/dist/services/anchor-verification.js.map +0 -1
- package/dist/services/ast-grep-service.d.ts +0 -58
- package/dist/services/ast-grep-service.d.ts.map +0 -1
- package/dist/services/ast-grep-service.js +0 -427
- package/dist/services/ast-grep-service.js.map +0 -1
- package/dist/services/candidate-extractor-service.d.ts +0 -56
- package/dist/services/candidate-extractor-service.d.ts.map +0 -1
- package/dist/services/candidate-extractor-service.js +0 -365
- package/dist/services/candidate-extractor-service.js.map +0 -1
- package/dist/services/compaction-service.d.ts +0 -105
- package/dist/services/compaction-service.d.ts.map +0 -1
- package/dist/services/compaction-service.js +0 -369
- package/dist/services/compaction-service.js.map +0 -1
- package/dist/services/edge-service.d.ts +0 -78
- package/dist/services/edge-service.d.ts.map +0 -1
- package/dist/services/edge-service.js +0 -158
- package/dist/services/edge-service.js.map +0 -1
- package/dist/services/feedback-tracker.d.ts +0 -64
- package/dist/services/feedback-tracker.d.ts.map +0 -1
- package/dist/services/feedback-tracker.js +0 -110
- package/dist/services/feedback-tracker.js.map +0 -1
- package/dist/services/graph-expansion.d.ts +0 -158
- package/dist/services/graph-expansion.d.ts.map +0 -1
- package/dist/services/graph-expansion.js +0 -487
- package/dist/services/graph-expansion.js.map +0 -1
- package/dist/services/promotion-service.d.ts +0 -67
- package/dist/services/promotion-service.d.ts.map +0 -1
- package/dist/services/promotion-service.js +0 -151
- package/dist/services/promotion-service.js.map +0 -1
- package/dist/services/swarm-verification.d.ts +0 -104
- package/dist/services/swarm-verification.d.ts.map +0 -1
- package/dist/services/swarm-verification.js +0 -406
- package/dist/services/swarm-verification.js.map +0 -1
|
@@ -1,365 +0,0 @@
|
|
|
1
|
-
import { Context, Effect, Layer, Config, Option } from "effect";
|
|
2
|
-
import { ExtractionUnavailableError } from "../errors.js";
|
|
3
|
-
/**
|
|
4
|
-
* The prompt template for learning candidate extraction.
|
|
5
|
-
* Designed to extract actionable, generalizable learnings from Claude Code transcripts.
|
|
6
|
-
* @see PRD-015 for specification
|
|
7
|
-
*/
|
|
8
|
-
const EXTRACTION_PROMPT = `Analyze this Claude Code session transcript and extract actionable learnings.
|
|
9
|
-
|
|
10
|
-
<transcript>
|
|
11
|
-
{transcript_excerpt}
|
|
12
|
-
</transcript>
|
|
13
|
-
|
|
14
|
-
Extract learnings that meet these criteria:
|
|
15
|
-
1. **Technical decisions**: Describes a choice and its rationale
|
|
16
|
-
2. **Gotchas/pitfalls**: Something to avoid next time
|
|
17
|
-
3. **Patterns that worked**: Reusable approaches
|
|
18
|
-
4. **Future improvements**: Things to do differently
|
|
19
|
-
|
|
20
|
-
For each learning, provide:
|
|
21
|
-
- content: The learning text (1-3 sentences, actionable)
|
|
22
|
-
- confidence: "high" (certain, tested), "medium" (likely useful), "low" (speculative)
|
|
23
|
-
- category: One of [architecture, testing, performance, security, debugging, tooling, patterns, other]
|
|
24
|
-
|
|
25
|
-
Return JSON array:
|
|
26
|
-
[
|
|
27
|
-
{
|
|
28
|
-
"content": "Always wrap database operations in transactions to ensure atomicity",
|
|
29
|
-
"confidence": "high",
|
|
30
|
-
"category": "patterns"
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
Rules:
|
|
35
|
-
- Skip generic advice (things any developer knows)
|
|
36
|
-
- Skip context-specific details that won't generalize
|
|
37
|
-
- Prefer actionable "do X when Y" format
|
|
38
|
-
- Maximum 5 learnings per transcript
|
|
39
|
-
- If no meaningful learnings found, return empty array: []`;
|
|
40
|
-
/**
|
|
41
|
-
* Valid confidence levels for validation.
|
|
42
|
-
*/
|
|
43
|
-
const VALID_CONFIDENCES = ["high", "medium", "low"];
|
|
44
|
-
/**
|
|
45
|
-
* Valid categories for validation.
|
|
46
|
-
*/
|
|
47
|
-
const VALID_CATEGORIES = [
|
|
48
|
-
"architecture",
|
|
49
|
-
"testing",
|
|
50
|
-
"performance",
|
|
51
|
-
"security",
|
|
52
|
-
"debugging",
|
|
53
|
-
"tooling",
|
|
54
|
-
"patterns",
|
|
55
|
-
"other"
|
|
56
|
-
];
|
|
57
|
-
/**
|
|
58
|
-
* Parse LLM JSON response, handling common formatting issues.
|
|
59
|
-
* Robust parser following DD-006 patterns.
|
|
60
|
-
*/
|
|
61
|
-
const parseLlmJson = (raw) => {
|
|
62
|
-
// Step 1: Try direct parse
|
|
63
|
-
try {
|
|
64
|
-
return JSON.parse(raw);
|
|
65
|
-
}
|
|
66
|
-
catch { /* continue */ }
|
|
67
|
-
// Step 2: Strip markdown code fences
|
|
68
|
-
const fenceMatch = raw.match(/```(?:json)?\s*\n?([\s\S]*?)```/);
|
|
69
|
-
if (fenceMatch && fenceMatch[1]) {
|
|
70
|
-
try {
|
|
71
|
-
return JSON.parse(fenceMatch[1].trim());
|
|
72
|
-
}
|
|
73
|
-
catch { /* continue */ }
|
|
74
|
-
}
|
|
75
|
-
// Step 3: Find first [ or { and parse from there
|
|
76
|
-
const jsonStart = raw.search(/[[{]/);
|
|
77
|
-
if (jsonStart >= 0) {
|
|
78
|
-
const candidate = raw.slice(jsonStart);
|
|
79
|
-
try {
|
|
80
|
-
return JSON.parse(candidate);
|
|
81
|
-
}
|
|
82
|
-
catch { /* continue */ }
|
|
83
|
-
// Step 4: Find matching bracket and extract
|
|
84
|
-
const openChar = candidate[0];
|
|
85
|
-
const closeChar = openChar === "[" ? "]" : "}";
|
|
86
|
-
const lastClose = candidate.lastIndexOf(closeChar);
|
|
87
|
-
if (lastClose > 0) {
|
|
88
|
-
try {
|
|
89
|
-
return JSON.parse(candidate.slice(0, lastClose + 1));
|
|
90
|
-
}
|
|
91
|
-
catch { /* continue */ }
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return null;
|
|
95
|
-
};
|
|
96
|
-
/**
|
|
97
|
-
* Validate and normalize an extracted candidate from LLM response.
|
|
98
|
-
* Returns null if the candidate is invalid.
|
|
99
|
-
*/
|
|
100
|
-
const validateCandidate = (raw) => {
|
|
101
|
-
if (!raw || typeof raw !== "object")
|
|
102
|
-
return null;
|
|
103
|
-
const obj = raw;
|
|
104
|
-
// Validate content
|
|
105
|
-
if (typeof obj.content !== "string" || obj.content.trim().length === 0)
|
|
106
|
-
return null;
|
|
107
|
-
const content = obj.content.trim();
|
|
108
|
-
// Skip if content is too short (likely not actionable)
|
|
109
|
-
if (content.length < 10)
|
|
110
|
-
return null;
|
|
111
|
-
// Validate confidence
|
|
112
|
-
const rawConfidence = String(obj.confidence || "").toLowerCase();
|
|
113
|
-
const confidence = VALID_CONFIDENCES.includes(rawConfidence)
|
|
114
|
-
? rawConfidence
|
|
115
|
-
: "medium"; // Default to medium if invalid
|
|
116
|
-
// Validate category
|
|
117
|
-
const rawCategory = String(obj.category || "").toLowerCase();
|
|
118
|
-
const category = VALID_CATEGORIES.includes(rawCategory)
|
|
119
|
-
? rawCategory
|
|
120
|
-
: "other"; // Default to other if invalid
|
|
121
|
-
return { content, confidence, category };
|
|
122
|
-
};
|
|
123
|
-
/**
|
|
124
|
-
* CandidateExtractorService extracts learning candidates from Claude Code transcripts.
|
|
125
|
-
*
|
|
126
|
-
* This service uses LLM to analyze transcript content and identify:
|
|
127
|
-
* - Technical decisions with rationale
|
|
128
|
-
* - Gotchas and pitfalls to avoid
|
|
129
|
-
* - Patterns that worked well
|
|
130
|
-
* - Future improvements
|
|
131
|
-
*
|
|
132
|
-
* Design: Following DD-006 patterns for LLM integration with pluggable backends.
|
|
133
|
-
* Supports Anthropic, OpenAI, and noop backends with graceful degradation.
|
|
134
|
-
*
|
|
135
|
-
* @see PRD-015 for the JSONL daemon and knowledge promotion pipeline
|
|
136
|
-
*/
|
|
137
|
-
export class CandidateExtractorService extends Context.Tag("CandidateExtractorService")() {
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Noop implementation - returns empty results without LLM processing.
|
|
141
|
-
* Used when no LLM API key is configured or for testing.
|
|
142
|
-
*/
|
|
143
|
-
export const CandidateExtractorServiceNoop = Layer.succeed(CandidateExtractorService, {
|
|
144
|
-
extract: (chunk) => Effect.succeed({
|
|
145
|
-
candidates: [],
|
|
146
|
-
sourceChunk: chunk,
|
|
147
|
-
wasExtracted: false
|
|
148
|
-
}),
|
|
149
|
-
isAvailable: () => Effect.succeed(false)
|
|
150
|
-
});
|
|
151
|
-
/**
|
|
152
|
-
* Anthropic (Claude) implementation.
|
|
153
|
-
* Uses Claude to extract learning candidates from transcripts.
|
|
154
|
-
*/
|
|
155
|
-
export const CandidateExtractorServiceAnthropic = Layer.effect(CandidateExtractorService, Effect.gen(function* () {
|
|
156
|
-
// Read API key from environment
|
|
157
|
-
const apiKey = yield* Config.string("ANTHROPIC_API_KEY").pipe(Effect.mapError(() => new ExtractionUnavailableError({
|
|
158
|
-
reason: "ANTHROPIC_API_KEY environment variable is not set"
|
|
159
|
-
})));
|
|
160
|
-
// Lazy-load client
|
|
161
|
-
let client = null;
|
|
162
|
-
const ensureClient = Effect.gen(function* () {
|
|
163
|
-
if (client)
|
|
164
|
-
return client;
|
|
165
|
-
// Dynamic import of Anthropic SDK (optional peer dependency)
|
|
166
|
-
const Anthropic = yield* Effect.tryPromise({
|
|
167
|
-
try: async () => {
|
|
168
|
-
// @ts-expect-error - @anthropic-ai/sdk is an optional peer dependency
|
|
169
|
-
const mod = await import("@anthropic-ai/sdk");
|
|
170
|
-
return mod.default;
|
|
171
|
-
},
|
|
172
|
-
catch: () => new ExtractionUnavailableError({
|
|
173
|
-
reason: "@anthropic-ai/sdk is not installed"
|
|
174
|
-
})
|
|
175
|
-
});
|
|
176
|
-
client = new Anthropic({ apiKey });
|
|
177
|
-
return client;
|
|
178
|
-
});
|
|
179
|
-
return {
|
|
180
|
-
extract: (chunk) => Effect.gen(function* () {
|
|
181
|
-
const startTime = Date.now();
|
|
182
|
-
const anthropic = yield* ensureClient;
|
|
183
|
-
// Build prompt with transcript content
|
|
184
|
-
const prompt = EXTRACTION_PROMPT.replace("{transcript_excerpt}", chunk.content);
|
|
185
|
-
const response = yield* Effect.tryPromise({
|
|
186
|
-
try: () => anthropic.messages.create({
|
|
187
|
-
model: "claude-haiku-4-20250514",
|
|
188
|
-
max_tokens: 1024,
|
|
189
|
-
messages: [{
|
|
190
|
-
role: "user",
|
|
191
|
-
content: prompt
|
|
192
|
-
}]
|
|
193
|
-
}),
|
|
194
|
-
catch: (e) => new ExtractionUnavailableError({
|
|
195
|
-
reason: `Anthropic API call failed: ${String(e)}`
|
|
196
|
-
})
|
|
197
|
-
});
|
|
198
|
-
// Extract text from response
|
|
199
|
-
const textContent = response.content.find(c => c.type === "text");
|
|
200
|
-
if (!textContent || !textContent.text) {
|
|
201
|
-
return {
|
|
202
|
-
candidates: [],
|
|
203
|
-
sourceChunk: chunk,
|
|
204
|
-
wasExtracted: true,
|
|
205
|
-
metadata: {
|
|
206
|
-
model: "claude-haiku-4-20250514",
|
|
207
|
-
tokensUsed: (response.usage?.input_tokens ?? 0) + (response.usage?.output_tokens ?? 0),
|
|
208
|
-
durationMs: Date.now() - startTime
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
// Parse the JSON array of candidates
|
|
213
|
-
const rawCandidates = parseLlmJson(textContent.text);
|
|
214
|
-
if (!rawCandidates || !Array.isArray(rawCandidates)) {
|
|
215
|
-
return {
|
|
216
|
-
candidates: [],
|
|
217
|
-
sourceChunk: chunk,
|
|
218
|
-
wasExtracted: true,
|
|
219
|
-
metadata: {
|
|
220
|
-
model: "claude-haiku-4-20250514",
|
|
221
|
-
tokensUsed: (response.usage?.input_tokens ?? 0) + (response.usage?.output_tokens ?? 0),
|
|
222
|
-
durationMs: Date.now() - startTime
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
// Validate and normalize each candidate
|
|
227
|
-
const candidates = rawCandidates
|
|
228
|
-
.map(validateCandidate)
|
|
229
|
-
.filter((c) => c !== null)
|
|
230
|
-
.slice(0, 5); // Max 5 candidates per chunk
|
|
231
|
-
return {
|
|
232
|
-
candidates,
|
|
233
|
-
sourceChunk: chunk,
|
|
234
|
-
wasExtracted: true,
|
|
235
|
-
metadata: {
|
|
236
|
-
model: "claude-haiku-4-20250514",
|
|
237
|
-
tokensUsed: (response.usage?.input_tokens ?? 0) + (response.usage?.output_tokens ?? 0),
|
|
238
|
-
durationMs: Date.now() - startTime
|
|
239
|
-
}
|
|
240
|
-
};
|
|
241
|
-
}),
|
|
242
|
-
isAvailable: () => Effect.succeed(true)
|
|
243
|
-
};
|
|
244
|
-
}));
|
|
245
|
-
/**
|
|
246
|
-
* OpenAI (GPT) implementation.
|
|
247
|
-
* Uses GPT to extract learning candidates from transcripts.
|
|
248
|
-
*/
|
|
249
|
-
export const CandidateExtractorServiceOpenAI = Layer.effect(CandidateExtractorService, Effect.gen(function* () {
|
|
250
|
-
// Read API key from environment
|
|
251
|
-
const apiKey = yield* Config.string("OPENAI_API_KEY").pipe(Effect.mapError(() => new ExtractionUnavailableError({
|
|
252
|
-
reason: "OPENAI_API_KEY environment variable is not set"
|
|
253
|
-
})));
|
|
254
|
-
// Lazy-load client
|
|
255
|
-
let client = null;
|
|
256
|
-
const ensureClient = Effect.gen(function* () {
|
|
257
|
-
if (client)
|
|
258
|
-
return client;
|
|
259
|
-
// Dynamic import of OpenAI SDK (optional peer dependency)
|
|
260
|
-
const OpenAI = yield* Effect.tryPromise({
|
|
261
|
-
try: async () => {
|
|
262
|
-
// @ts-expect-error - openai is an optional peer dependency
|
|
263
|
-
const mod = await import("openai");
|
|
264
|
-
return mod.default;
|
|
265
|
-
},
|
|
266
|
-
catch: () => new ExtractionUnavailableError({
|
|
267
|
-
reason: "openai package is not installed"
|
|
268
|
-
})
|
|
269
|
-
});
|
|
270
|
-
client = new OpenAI({ apiKey });
|
|
271
|
-
return client;
|
|
272
|
-
});
|
|
273
|
-
return {
|
|
274
|
-
extract: (chunk) => Effect.gen(function* () {
|
|
275
|
-
const startTime = Date.now();
|
|
276
|
-
const openai = yield* ensureClient;
|
|
277
|
-
// Build prompt with transcript content
|
|
278
|
-
const prompt = EXTRACTION_PROMPT.replace("{transcript_excerpt}", chunk.content);
|
|
279
|
-
const response = yield* Effect.tryPromise({
|
|
280
|
-
try: () => openai.chat.completions.create({
|
|
281
|
-
model: "gpt-4o-mini",
|
|
282
|
-
max_tokens: 1024,
|
|
283
|
-
messages: [{
|
|
284
|
-
role: "user",
|
|
285
|
-
content: prompt
|
|
286
|
-
}],
|
|
287
|
-
response_format: { type: "json_object" }
|
|
288
|
-
}),
|
|
289
|
-
catch: (e) => new ExtractionUnavailableError({
|
|
290
|
-
reason: `OpenAI API call failed: ${String(e)}`
|
|
291
|
-
})
|
|
292
|
-
});
|
|
293
|
-
// Extract text from response
|
|
294
|
-
const textContent = response.choices[0]?.message?.content;
|
|
295
|
-
if (!textContent) {
|
|
296
|
-
return {
|
|
297
|
-
candidates: [],
|
|
298
|
-
sourceChunk: chunk,
|
|
299
|
-
wasExtracted: true,
|
|
300
|
-
metadata: {
|
|
301
|
-
model: "gpt-4o-mini",
|
|
302
|
-
tokensUsed: (response.usage?.prompt_tokens ?? 0) + (response.usage?.completion_tokens ?? 0),
|
|
303
|
-
durationMs: Date.now() - startTime
|
|
304
|
-
}
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
// Parse the JSON array of candidates
|
|
308
|
-
// OpenAI with json_object mode might wrap in an object
|
|
309
|
-
const parsed = parseLlmJson(textContent);
|
|
310
|
-
let rawCandidates = [];
|
|
311
|
-
if (Array.isArray(parsed)) {
|
|
312
|
-
rawCandidates = parsed;
|
|
313
|
-
}
|
|
314
|
-
else if (parsed && typeof parsed === "object") {
|
|
315
|
-
// Handle wrapped response like { candidates: [...] } or { learnings: [...] }
|
|
316
|
-
const obj = parsed;
|
|
317
|
-
const arrayField = Object.values(obj).find(Array.isArray);
|
|
318
|
-
if (arrayField) {
|
|
319
|
-
rawCandidates = arrayField;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
// Validate and normalize each candidate
|
|
323
|
-
const candidates = rawCandidates
|
|
324
|
-
.map(validateCandidate)
|
|
325
|
-
.filter((c) => c !== null)
|
|
326
|
-
.slice(0, 5); // Max 5 candidates per chunk
|
|
327
|
-
return {
|
|
328
|
-
candidates,
|
|
329
|
-
sourceChunk: chunk,
|
|
330
|
-
wasExtracted: true,
|
|
331
|
-
metadata: {
|
|
332
|
-
model: "gpt-4o-mini",
|
|
333
|
-
tokensUsed: (response.usage?.prompt_tokens ?? 0) + (response.usage?.completion_tokens ?? 0),
|
|
334
|
-
durationMs: Date.now() - startTime
|
|
335
|
-
}
|
|
336
|
-
};
|
|
337
|
-
}),
|
|
338
|
-
isAvailable: () => Effect.succeed(true)
|
|
339
|
-
};
|
|
340
|
-
}));
|
|
341
|
-
/**
|
|
342
|
-
* Auto-detecting layer that selects the appropriate backend based on environment.
|
|
343
|
-
*
|
|
344
|
-
* Priority:
|
|
345
|
-
* 1. ANTHROPIC_API_KEY set → Use Anthropic (Claude)
|
|
346
|
-
* 2. OPENAI_API_KEY set → Use OpenAI (GPT)
|
|
347
|
-
* 3. Neither set → Use Noop (graceful degradation)
|
|
348
|
-
*
|
|
349
|
-
* This allows graceful degradation when no LLM API keys are configured.
|
|
350
|
-
*/
|
|
351
|
-
export const CandidateExtractorServiceAuto = Layer.unwrapEffect(Effect.gen(function* () {
|
|
352
|
-
// Check for Anthropic API key first (preferred)
|
|
353
|
-
const anthropicKey = yield* Config.string("ANTHROPIC_API_KEY").pipe(Effect.option);
|
|
354
|
-
if (Option.isSome(anthropicKey) && anthropicKey.value.trim().length > 0) {
|
|
355
|
-
return CandidateExtractorServiceAnthropic;
|
|
356
|
-
}
|
|
357
|
-
// Fall back to OpenAI if available
|
|
358
|
-
const openaiKey = yield* Config.string("OPENAI_API_KEY").pipe(Effect.option);
|
|
359
|
-
if (Option.isSome(openaiKey) && openaiKey.value.trim().length > 0) {
|
|
360
|
-
return CandidateExtractorServiceOpenAI;
|
|
361
|
-
}
|
|
362
|
-
// No API keys configured - use noop
|
|
363
|
-
return CandidateExtractorServiceNoop;
|
|
364
|
-
}));
|
|
365
|
-
//# sourceMappingURL=candidate-extractor-service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-extractor-service.js","sourceRoot":"","sources":["../../src/services/candidate-extractor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CompactionService - Compacts completed tasks and exports learnings
|
|
3
|
-
*
|
|
4
|
-
* Implements PRD-006: Task Compaction & Learnings Export
|
|
5
|
-
* See DD-006: LLM Integration for implementation details
|
|
6
|
-
*/
|
|
7
|
-
import { Context, Effect, Layer } from "effect";
|
|
8
|
-
import { SqliteClient } from "../db.js";
|
|
9
|
-
import { DatabaseError, ExtractionUnavailableError, ValidationError } from "../errors.js";
|
|
10
|
-
import { CompactionRepository, type CompactionLogEntry } from "../repo/compaction-repo.js";
|
|
11
|
-
import type { Task } from "@jamesaphoenix/tx-types";
|
|
12
|
-
/**
|
|
13
|
-
* Output mode for compaction learnings.
|
|
14
|
-
* - 'database': Store in compaction_log table only
|
|
15
|
-
* - 'markdown': Append to markdown file only
|
|
16
|
-
* - 'both': Store in DB AND append to markdown (default, per DOCTRINE RULE 2)
|
|
17
|
-
*/
|
|
18
|
-
export type CompactionOutputMode = 'database' | 'markdown' | 'both';
|
|
19
|
-
/**
|
|
20
|
-
* Result of a compaction operation.
|
|
21
|
-
*/
|
|
22
|
-
export interface CompactionResult {
|
|
23
|
-
readonly compactedCount: number;
|
|
24
|
-
readonly summary: string;
|
|
25
|
-
readonly learnings: string;
|
|
26
|
-
readonly taskIds: readonly string[];
|
|
27
|
-
readonly learningsExportedTo: string | null;
|
|
28
|
-
readonly outputMode: CompactionOutputMode;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Options for compaction.
|
|
32
|
-
*/
|
|
33
|
-
export interface CompactionOptions {
|
|
34
|
-
/** Compact tasks completed before this date */
|
|
35
|
-
readonly before: Date;
|
|
36
|
-
/** Path to export learnings (default: CLAUDE.md) */
|
|
37
|
-
readonly outputFile?: string;
|
|
38
|
-
/** If true, preview only without actually compacting */
|
|
39
|
-
readonly dryRun?: boolean;
|
|
40
|
-
/**
|
|
41
|
-
* Output mode for learnings: 'database', 'markdown', or 'both'.
|
|
42
|
-
* Default: 'both' (per DOCTRINE RULE 2)
|
|
43
|
-
*/
|
|
44
|
-
readonly outputMode?: CompactionOutputMode;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Preview result showing what would be compacted.
|
|
48
|
-
*/
|
|
49
|
-
export interface CompactionPreview {
|
|
50
|
-
readonly tasks: readonly Task[];
|
|
51
|
-
readonly summary: string | null;
|
|
52
|
-
readonly learnings: string | null;
|
|
53
|
-
}
|
|
54
|
-
declare const CompactionService_base: Context.TagClass<CompactionService, "CompactionService", {
|
|
55
|
-
/**
|
|
56
|
-
* Compact tasks completed before the given date.
|
|
57
|
-
* Requires ANTHROPIC_API_KEY to be set.
|
|
58
|
-
*/
|
|
59
|
-
readonly compact: (options: CompactionOptions) => Effect.Effect<CompactionResult, ExtractionUnavailableError | DatabaseError | ValidationError>;
|
|
60
|
-
/**
|
|
61
|
-
* Preview what would be compacted without LLM processing.
|
|
62
|
-
* Works without ANTHROPIC_API_KEY.
|
|
63
|
-
*/
|
|
64
|
-
readonly preview: (before: Date) => Effect.Effect<readonly Task[], DatabaseError>;
|
|
65
|
-
/**
|
|
66
|
-
* Get all compaction history.
|
|
67
|
-
*/
|
|
68
|
-
readonly getSummaries: () => Effect.Effect<readonly CompactionLogEntry[], DatabaseError>;
|
|
69
|
-
/**
|
|
70
|
-
* Export learnings to a markdown file.
|
|
71
|
-
*/
|
|
72
|
-
readonly exportLearnings: (learnings: string, targetFile: string) => Effect.Effect<void, DatabaseError | ValidationError>;
|
|
73
|
-
/**
|
|
74
|
-
* Check if compaction functionality is available (API key set).
|
|
75
|
-
*/
|
|
76
|
-
readonly isAvailable: () => Effect.Effect<boolean>;
|
|
77
|
-
}>;
|
|
78
|
-
/**
|
|
79
|
-
* CompactionService provides compaction operations for completed tasks.
|
|
80
|
-
*
|
|
81
|
-
* Design: Following DD-006 patterns for LLM integration with graceful degradation.
|
|
82
|
-
* When ANTHROPIC_API_KEY is not set, compact() fails gracefully while preview()
|
|
83
|
-
* and getSummaries() still work.
|
|
84
|
-
*/
|
|
85
|
-
export declare class CompactionService extends CompactionService_base {
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Noop implementation - returns failures for LLM operations.
|
|
89
|
-
* Used for testing and when no API key is configured.
|
|
90
|
-
*/
|
|
91
|
-
export declare const CompactionServiceNoop: Layer.Layer<CompactionService, never, SqliteClient | CompactionRepository>;
|
|
92
|
-
/**
|
|
93
|
-
* Live implementation with Anthropic LLM support.
|
|
94
|
-
*/
|
|
95
|
-
export declare const CompactionServiceLive: Layer.Layer<CompactionService, never, SqliteClient | CompactionRepository>;
|
|
96
|
-
/**
|
|
97
|
-
* Auto-detecting layer that selects the appropriate backend based on environment.
|
|
98
|
-
*
|
|
99
|
-
* Priority:
|
|
100
|
-
* 1. ANTHROPIC_API_KEY set -> Use Live implementation
|
|
101
|
-
* 2. Not set -> Use Noop (graceful degradation)
|
|
102
|
-
*/
|
|
103
|
-
export declare const CompactionServiceAuto: Layer.Layer<CompactionService, never, SqliteClient | CompactionRepository>;
|
|
104
|
-
export {};
|
|
105
|
-
//# sourceMappingURL=compaction-service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compaction-service.d.ts","sourceRoot":"","sources":["../../src/services/compaction-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAkB,MAAM,QAAQ,CAAA;AAG/D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,oBAAoB,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAE1F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAkBnD;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;AAEnE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAA;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;IACrB,oDAAoD;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAA;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;;IA6FG;;;OAGG;sBACe,CAAC,OAAO,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,0BAA0B,GAAG,aAAa,GAAG,eAAe,CAAC;IAC/I;;;OAGG;sBACe,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;IACjF;;OAEG;2BACoB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,kBAAkB,EAAE,EAAE,aAAa,CAAC;IACxF;;OAEG;8BACuB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAAC;IACzH;;OAEG;0BACmB,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;AA/BtD;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,sBA0BpC;CAAG;AAEN;;;GAGG;AACH,eAAO,MAAM,qBAAqB,4EAgEjC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,4EA6OjC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,4EAUjC,CAAA"}
|