@tonycasey/lisa 2.12.0 → 2.25.2
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/README.md +2 -2
- package/dist/lib/application/handlers/PromptSubmitHandler.js +2 -2
- package/dist/lib/application/handlers/PromptSubmitHandler.js.map +1 -1
- package/dist/lib/application/handlers/SessionStopHandler.d.ts.map +1 -1
- package/dist/lib/application/handlers/SessionStopHandler.js +12 -2
- package/dist/lib/application/handlers/SessionStopHandler.js.map +1 -1
- package/dist/lib/commands/init.js +3 -3
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/knowledge.d.ts.map +1 -1
- package/dist/lib/commands/knowledge.js +449 -1
- package/dist/lib/commands/knowledge.js.map +1 -1
- package/dist/lib/domain/errors/LlmErrors.d.ts +41 -0
- package/dist/lib/domain/errors/LlmErrors.d.ts.map +1 -0
- package/dist/lib/domain/errors/LlmErrors.js +64 -0
- package/dist/lib/domain/errors/LlmErrors.js.map +1 -0
- package/dist/lib/domain/interfaces/IConsolidationService.d.ts +65 -0
- package/dist/lib/domain/interfaces/IConsolidationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IConsolidationService.js +21 -0
- package/dist/lib/domain/interfaces/IConsolidationService.js.map +1 -0
- package/dist/lib/domain/interfaces/ICurationService.d.ts +81 -0
- package/dist/lib/domain/interfaces/ICurationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ICurationService.js +65 -0
- package/dist/lib/domain/interfaces/ICurationService.js.map +1 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.d.ts +67 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.js +9 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.d.ts +36 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.js +11 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmGuard.d.ts +35 -0
- package/dist/lib/domain/interfaces/ILlmGuard.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmGuard.js +12 -0
- package/dist/lib/domain/interfaces/ILlmGuard.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmService.d.ts +87 -0
- package/dist/lib/domain/interfaces/ILlmService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmService.js +40 -0
- package/dist/lib/domain/interfaces/ILlmService.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.d.ts +60 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.js +29 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.js.map +1 -0
- package/dist/lib/domain/interfaces/IMemoryService.d.ts +90 -0
- package/dist/lib/domain/interfaces/IMemoryService.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/INlCurationService.d.ts +75 -0
- package/dist/lib/domain/interfaces/INlCurationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/INlCurationService.js +31 -0
- package/dist/lib/domain/interfaces/INlCurationService.js.map +1 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.d.ts +46 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.js +11 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.js.map +1 -0
- package/dist/lib/domain/interfaces/IRecursionService.d.ts +10 -6
- package/dist/lib/domain/interfaces/IRecursionService.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/ISummarizationService.d.ts +52 -0
- package/dist/lib/domain/interfaces/ISummarizationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ISummarizationService.js +11 -0
- package/dist/lib/domain/interfaces/ISummarizationService.js.map +1 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.d.ts +34 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.js +9 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.js.map +1 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.d.ts +68 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.js +32 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.js.map +1 -0
- package/dist/lib/domain/interfaces/IWorkSummary.d.ts +64 -0
- package/dist/lib/domain/interfaces/IWorkSummary.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IWorkSummary.js +13 -0
- package/dist/lib/domain/interfaces/IWorkSummary.js.map +1 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.d.ts +46 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.js +9 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.js.map +1 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRepository.d.ts +62 -1
- package/dist/lib/domain/interfaces/dal/IMemoryRepository.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/dal/index.d.ts +3 -2
- package/dist/lib/domain/interfaces/dal/index.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/dal/index.js.map +1 -1
- package/dist/lib/domain/interfaces/dal/types.d.ts +37 -0
- package/dist/lib/domain/interfaces/dal/types.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/dal/types.js.map +1 -1
- package/dist/lib/domain/interfaces/index.d.ts +15 -1
- package/dist/lib/domain/interfaces/index.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/index.js +21 -1
- package/dist/lib/domain/interfaces/index.js.map +1 -1
- package/dist/lib/domain/interfaces/types/ICapturedWork.d.ts +3 -0
- package/dist/lib/domain/interfaces/types/ICapturedWork.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/types/ICapturedWork.js.map +1 -1
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.d.ts +56 -0
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.js +94 -0
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.js.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.d.ts +113 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.js +195 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.js.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.d.ts +49 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.js +62 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.js.map +1 -0
- package/dist/lib/domain/interfaces/types/ITaskType.d.ts +59 -0
- package/dist/lib/domain/interfaces/types/ITaskType.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/ITaskType.js +104 -0
- package/dist/lib/domain/interfaces/types/ITaskType.js.map +1 -0
- package/dist/lib/domain/interfaces/types/index.d.ts +4 -0
- package/dist/lib/domain/interfaces/types/index.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/types/index.js +33 -1
- package/dist/lib/domain/interfaces/types/index.js.map +1 -1
- package/dist/lib/domain/utils/deduplication.d.ts +38 -0
- package/dist/lib/domain/utils/deduplication.d.ts.map +1 -0
- package/dist/lib/domain/utils/deduplication.js +225 -0
- package/dist/lib/domain/utils/deduplication.js.map +1 -0
- package/dist/lib/domain/utils/index.d.ts +1 -0
- package/dist/lib/domain/utils/index.d.ts.map +1 -1
- package/dist/lib/domain/utils/index.js +6 -1
- package/dist/lib/domain/utils/index.js.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.d.ts +12 -2
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.d.ts.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.js +14 -0
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.js.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.d.ts +25 -3
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.d.ts.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.js +156 -1
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.js.map +1 -1
- package/dist/lib/infrastructure/di/bootstrap.d.ts.map +1 -1
- package/dist/lib/infrastructure/di/bootstrap.js +92 -2
- package/dist/lib/infrastructure/di/bootstrap.js.map +1 -1
- package/dist/lib/infrastructure/di/tokens.d.ts +24 -0
- package/dist/lib/infrastructure/di/tokens.d.ts.map +1 -1
- package/dist/lib/infrastructure/di/tokens.js +12 -0
- package/dist/lib/infrastructure/di/tokens.js.map +1 -1
- package/dist/lib/infrastructure/services/ConsolidationService.d.ts +21 -0
- package/dist/lib/infrastructure/services/ConsolidationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/ConsolidationService.js +134 -0
- package/dist/lib/infrastructure/services/ConsolidationService.js.map +1 -0
- package/dist/lib/infrastructure/services/CurationService.d.ts +28 -0
- package/dist/lib/infrastructure/services/CurationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/CurationService.js +112 -0
- package/dist/lib/infrastructure/services/CurationService.js.map +1 -0
- package/dist/lib/infrastructure/services/DeduplicationService.d.ts +21 -0
- package/dist/lib/infrastructure/services/DeduplicationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/DeduplicationService.js +111 -0
- package/dist/lib/infrastructure/services/DeduplicationService.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmConfigService.d.ts +19 -0
- package/dist/lib/infrastructure/services/LlmConfigService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmConfigService.js +161 -0
- package/dist/lib/infrastructure/services/LlmConfigService.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.d.ts +47 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.js +176 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmGuard.d.ts +29 -0
- package/dist/lib/infrastructure/services/LlmGuard.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmGuard.js +92 -0
- package/dist/lib/infrastructure/services/LlmGuard.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmService.d.ts +19 -0
- package/dist/lib/infrastructure/services/LlmService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmService.js +253 -0
- package/dist/lib/infrastructure/services/LlmService.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.d.ts +25 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.js +130 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.js.map +1 -0
- package/dist/lib/infrastructure/services/MemoryService.d.ts +29 -2
- package/dist/lib/infrastructure/services/MemoryService.d.ts.map +1 -1
- package/dist/lib/infrastructure/services/MemoryService.js +93 -0
- package/dist/lib/infrastructure/services/MemoryService.js.map +1 -1
- package/dist/lib/infrastructure/services/NlCurationService.d.ts +29 -0
- package/dist/lib/infrastructure/services/NlCurationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/NlCurationService.js +276 -0
- package/dist/lib/infrastructure/services/NlCurationService.js.map +1 -0
- package/dist/lib/infrastructure/services/PreferenceStore.d.ts +19 -0
- package/dist/lib/infrastructure/services/PreferenceStore.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/PreferenceStore.js +109 -0
- package/dist/lib/infrastructure/services/PreferenceStore.js.map +1 -0
- package/dist/lib/infrastructure/services/SessionCaptureService.d.ts +60 -19
- package/dist/lib/infrastructure/services/SessionCaptureService.d.ts.map +1 -1
- package/dist/lib/infrastructure/services/SessionCaptureService.js +474 -51
- package/dist/lib/infrastructure/services/SessionCaptureService.js.map +1 -1
- package/dist/lib/infrastructure/services/SummarizationService.d.ts +21 -0
- package/dist/lib/infrastructure/services/SummarizationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/SummarizationService.js +132 -0
- package/dist/lib/infrastructure/services/SummarizationService.js.map +1 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.d.ts +23 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.js +170 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.js.map +1 -0
- package/dist/lib/infrastructure/services/index.d.ts +12 -0
- package/dist/lib/infrastructure/services/index.d.ts.map +1 -1
- package/dist/lib/infrastructure/services/index.js +31 -1
- package/dist/lib/infrastructure/services/index.js.map +1 -1
- package/dist/lib/infrastructure/services/prompts/curation.d.ts +22 -0
- package/dist/lib/infrastructure/services/prompts/curation.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/curation.js +73 -0
- package/dist/lib/infrastructure/services/prompts/curation.js.map +1 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.d.ts +31 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.js +52 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.js.map +1 -0
- package/dist/lib/infrastructure/services/prompts/extraction.d.ts +27 -0
- package/dist/lib/infrastructure/services/prompts/extraction.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/extraction.js +94 -0
- package/dist/lib/infrastructure/services/prompts/extraction.js.map +1 -0
- package/dist/lib/infrastructure/services/prompts/summarization.d.ts +25 -0
- package/dist/lib/infrastructure/services/prompts/summarization.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/summarization.js +60 -0
- package/dist/lib/infrastructure/services/prompts/summarization.js.map +1 -0
- package/dist/lib/skills/common/type-mappings.d.ts.map +1 -1
- package/dist/lib/skills/common/type-mappings.js +5 -0
- package/dist/lib/skills/common/type-mappings.js.map +1 -1
- package/dist/lib/skills/memory/memory.d.ts +8 -2
- package/dist/lib/skills/memory/memory.d.ts.map +1 -1
- package/dist/lib/skills/memory/memory.js +27 -3
- package/dist/lib/skills/memory/memory.js.map +1 -1
- package/dist/lib/skills/shared/clients/Neo4jClient.d.ts.map +1 -1
- package/dist/lib/skills/shared/clients/Neo4jClient.js +75 -30
- package/dist/lib/skills/shared/clients/Neo4jClient.js.map +1 -1
- package/dist/lib/skills/shared/clients/interfaces/INeo4jClient.d.ts +16 -0
- package/dist/lib/skills/shared/clients/interfaces/INeo4jClient.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/MemoryCliService.d.ts +28 -2
- package/dist/lib/skills/shared/services/MemoryCliService.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/MemoryCliService.js +112 -5
- package/dist/lib/skills/shared/services/MemoryCliService.js.map +1 -1
- package/dist/lib/skills/shared/services/MemoryService.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/MemoryService.js +410 -1
- package/dist/lib/skills/shared/services/MemoryService.js.map +1 -1
- package/dist/lib/skills/shared/services/index.d.ts +1 -1
- package/dist/lib/skills/shared/services/index.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/index.js +2 -1
- package/dist/lib/skills/shared/services/index.js.map +1 -1
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.d.ts +148 -0
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.js +0 -4
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.js.map +1 -1
- package/dist/opencode/lisa.js +3904 -507
- package/dist/package.json +16 -16
- package/dist/project/.lisa/skills/git/SKILL.md +4 -13
- package/dist/project/.lisa/skills/init-review/SKILL.md +1 -1
- package/dist/project/.lisa/skills/jira/SKILL.md +1 -1
- package/dist/project/.lisa/skills/lisa/SKILL.md +1 -1
- package/dist/project/.lisa/skills/memory/SKILL.md +1 -2
- package/dist/project/.lisa/skills/tasks/SKILL.md +3 -4
- package/package.json +1 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Natural Language Curation Service.
|
|
4
|
+
*
|
|
5
|
+
* Translates natural language memory management commands into
|
|
6
|
+
* structured operations via LLM intent classification.
|
|
7
|
+
* Supports plan-then-execute workflow with confirmation for
|
|
8
|
+
* destructive actions.
|
|
9
|
+
*
|
|
10
|
+
* Part of Phase 6E: Natural Language Curation.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.createNlCurationService = createNlCurationService;
|
|
14
|
+
const ICurationService_1 = require("../../domain/interfaces/ICurationService");
|
|
15
|
+
const INlCurationService_1 = require("../../domain/interfaces/INlCurationService");
|
|
16
|
+
const curation_1 = require("./prompts/curation");
|
|
17
|
+
/**
|
|
18
|
+
* Create a Natural Language Curation Service.
|
|
19
|
+
*
|
|
20
|
+
* @param llmGuard - LLM guard for policy-enforced completions
|
|
21
|
+
* @param memoryService - Memory service for search and expire operations
|
|
22
|
+
* @param curationService - Curation service for mark operations
|
|
23
|
+
* @param consolidationService - Consolidation service for merge operations
|
|
24
|
+
* @param summarizationService - Summarization service for summary operations
|
|
25
|
+
* @param logger - Optional logger
|
|
26
|
+
*/
|
|
27
|
+
function createNlCurationService(llmGuard, memoryService, curationService, consolidationService, summarizationService, logger) {
|
|
28
|
+
return {
|
|
29
|
+
async plan(input, _groupId) {
|
|
30
|
+
const prompt = (0, curation_1.buildCurationPrompt)(input);
|
|
31
|
+
const response = await llmGuard.complete(prompt.user, 'curation', {
|
|
32
|
+
systemPrompt: prompt.system,
|
|
33
|
+
temperature: 0.2,
|
|
34
|
+
maxTokens: 1024,
|
|
35
|
+
});
|
|
36
|
+
const parsed = parsePlanResponse(response.text, logger);
|
|
37
|
+
return {
|
|
38
|
+
intent: parsed.intent,
|
|
39
|
+
description: parsed.description,
|
|
40
|
+
isDestructive: parsed.isDestructive,
|
|
41
|
+
operations: parsed.operations,
|
|
42
|
+
usage: response.usage,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
async execute(plan, groupId) {
|
|
46
|
+
const outputParts = [];
|
|
47
|
+
for (const operation of plan.operations) {
|
|
48
|
+
try {
|
|
49
|
+
const result = await executeOperation(operation, groupId, memoryService, curationService, consolidationService, summarizationService, logger);
|
|
50
|
+
outputParts.push(result);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
54
|
+
logger?.warn('NL curation operation failed', {
|
|
55
|
+
type: operation.type,
|
|
56
|
+
error: msg,
|
|
57
|
+
});
|
|
58
|
+
outputParts.push(`Failed: ${operation.description} — ${msg}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
plan,
|
|
63
|
+
executed: true,
|
|
64
|
+
output: outputParts.join('\n\n'),
|
|
65
|
+
usage: plan.usage,
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse the LLM plan response into a structured plan.
|
|
72
|
+
*/
|
|
73
|
+
function parsePlanResponse(responseText, logger) {
|
|
74
|
+
const jsonText = extractJson(responseText);
|
|
75
|
+
if (!jsonText) {
|
|
76
|
+
logger?.debug('Failed to extract JSON from NL curation response');
|
|
77
|
+
return fallbackPlan();
|
|
78
|
+
}
|
|
79
|
+
let parsed;
|
|
80
|
+
try {
|
|
81
|
+
parsed = JSON.parse(jsonText);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
logger?.debug('Failed to parse NL curation response as JSON');
|
|
85
|
+
return fallbackPlan();
|
|
86
|
+
}
|
|
87
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
88
|
+
return fallbackPlan();
|
|
89
|
+
const obj = parsed;
|
|
90
|
+
// Validate intent
|
|
91
|
+
const rawIntent = typeof obj.intent === 'string' ? obj.intent : '';
|
|
92
|
+
const intent = (0, INlCurationService_1.isValidNlCurationIntent)(rawIntent) ? rawIntent : 'query';
|
|
93
|
+
// Extract description
|
|
94
|
+
const description = typeof obj.description === 'string' && obj.description.trim().length > 0
|
|
95
|
+
? obj.description.trim()
|
|
96
|
+
: 'Execute memory operation';
|
|
97
|
+
// Extract operations
|
|
98
|
+
const rawOps = Array.isArray(obj.operations) ? obj.operations : [];
|
|
99
|
+
const operations = [];
|
|
100
|
+
for (const raw of rawOps) {
|
|
101
|
+
if (typeof raw !== 'object' || raw === null)
|
|
102
|
+
continue;
|
|
103
|
+
const opObj = raw;
|
|
104
|
+
const type = typeof opObj.type === 'string' ? opObj.type : '';
|
|
105
|
+
if (!['search', 'mark', 'expire', 'summarize', 'consolidate'].includes(type))
|
|
106
|
+
continue;
|
|
107
|
+
const params = typeof opObj.params === 'object' && opObj.params !== null
|
|
108
|
+
? opObj.params
|
|
109
|
+
: {};
|
|
110
|
+
const opDesc = typeof opObj.description === 'string'
|
|
111
|
+
? opObj.description
|
|
112
|
+
: `Perform ${type} operation`;
|
|
113
|
+
operations.push({
|
|
114
|
+
type: type,
|
|
115
|
+
params,
|
|
116
|
+
description: opDesc,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Ensure at least one operation
|
|
120
|
+
if (operations.length === 0) {
|
|
121
|
+
operations.push({
|
|
122
|
+
type: 'search',
|
|
123
|
+
params: { query: description, limit: 10 },
|
|
124
|
+
description: `Search for relevant facts`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// Compute isDestructive: OR the LLM flag with intent and operation types.
|
|
128
|
+
// Destructive intents (expire, consolidate) must always be flagged,
|
|
129
|
+
// even if the LLM incorrectly returns isDestructive: false.
|
|
130
|
+
const hasDestructiveOp = operations.some((op) => op.type === 'expire' || op.type === 'consolidate');
|
|
131
|
+
const llmFlag = typeof obj.isDestructive === 'boolean' ? obj.isDestructive : false;
|
|
132
|
+
const isDestructive = llmFlag
|
|
133
|
+
|| intent === 'expire' || intent === 'consolidate'
|
|
134
|
+
|| hasDestructiveOp;
|
|
135
|
+
return { intent, description, isDestructive, operations };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Fallback plan when LLM response is unparseable.
|
|
139
|
+
*/
|
|
140
|
+
function fallbackPlan() {
|
|
141
|
+
return {
|
|
142
|
+
intent: 'query',
|
|
143
|
+
description: 'Search for relevant memories',
|
|
144
|
+
isDestructive: false,
|
|
145
|
+
operations: [{
|
|
146
|
+
type: 'search',
|
|
147
|
+
params: { query: '', limit: 10 },
|
|
148
|
+
description: 'Search for recent facts',
|
|
149
|
+
}],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Execute a single operation within a curation plan.
|
|
154
|
+
*/
|
|
155
|
+
async function executeOperation(operation, groupId, memoryService, curationService, consolidationService, summarizationService, logger) {
|
|
156
|
+
switch (operation.type) {
|
|
157
|
+
case 'search': {
|
|
158
|
+
const query = typeof operation.params.query === 'string'
|
|
159
|
+
? operation.params.query
|
|
160
|
+
: '';
|
|
161
|
+
const limit = typeof operation.params.limit === 'number'
|
|
162
|
+
? operation.params.limit
|
|
163
|
+
: 10;
|
|
164
|
+
const facts = await memoryService.searchFacts([groupId], query, limit);
|
|
165
|
+
if (facts.length === 0) {
|
|
166
|
+
return `No facts found matching "${query}".`;
|
|
167
|
+
}
|
|
168
|
+
const lines = facts.map((f, i) => `${i + 1}. [${f.uuid ?? 'no-uuid'}] ${f.fact ?? '(no text)'}`);
|
|
169
|
+
return `Found ${facts.length} fact(s):\n${lines.join('\n')}`;
|
|
170
|
+
}
|
|
171
|
+
case 'mark': {
|
|
172
|
+
const query = typeof operation.params.query === 'string'
|
|
173
|
+
? operation.params.query
|
|
174
|
+
: '';
|
|
175
|
+
const mark = typeof operation.params.mark === 'string'
|
|
176
|
+
? operation.params.mark
|
|
177
|
+
: '';
|
|
178
|
+
if (!(0, ICurationService_1.isValidCurationMark)(mark)) {
|
|
179
|
+
return `Invalid curation mark: "${mark}". Valid marks: authoritative, draft, deprecated, needs-review.`;
|
|
180
|
+
}
|
|
181
|
+
const facts = await memoryService.searchFacts([groupId], query, 5);
|
|
182
|
+
if (facts.length === 0) {
|
|
183
|
+
return `No facts found matching "${query}" to mark as ${mark}.`;
|
|
184
|
+
}
|
|
185
|
+
let marked = 0;
|
|
186
|
+
for (const fact of facts) {
|
|
187
|
+
if (!fact.uuid)
|
|
188
|
+
continue;
|
|
189
|
+
try {
|
|
190
|
+
await curationService.markFact(groupId, fact.uuid, mark);
|
|
191
|
+
marked++;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
logger?.debug('Failed to mark fact', {
|
|
195
|
+
uuid: fact.uuid,
|
|
196
|
+
error: error instanceof Error ? error.message : String(error),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return `Marked ${marked} fact(s) as ${mark}.`;
|
|
201
|
+
}
|
|
202
|
+
case 'expire': {
|
|
203
|
+
const query = typeof operation.params.query === 'string'
|
|
204
|
+
? operation.params.query
|
|
205
|
+
: '';
|
|
206
|
+
const facts = await memoryService.searchFacts([groupId], query, 20);
|
|
207
|
+
if (facts.length === 0) {
|
|
208
|
+
return `No facts found matching "${query}" to expire.`;
|
|
209
|
+
}
|
|
210
|
+
let expired = 0;
|
|
211
|
+
for (const fact of facts) {
|
|
212
|
+
if (!fact.uuid)
|
|
213
|
+
continue;
|
|
214
|
+
try {
|
|
215
|
+
await memoryService.expireFact(groupId, fact.uuid);
|
|
216
|
+
expired++;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
logger?.debug('Failed to expire fact', {
|
|
220
|
+
uuid: fact.uuid,
|
|
221
|
+
error: error instanceof Error ? error.message : String(error),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return `Expired ${expired} fact(s) matching "${query}".`;
|
|
226
|
+
}
|
|
227
|
+
case 'summarize': {
|
|
228
|
+
const topic = typeof operation.params.topic === 'string'
|
|
229
|
+
? operation.params.topic
|
|
230
|
+
: undefined;
|
|
231
|
+
const style = operation.params.style === 'detailed' ? 'detailed' : 'concise';
|
|
232
|
+
const result = await summarizationService.summarize(groupId, {
|
|
233
|
+
topic,
|
|
234
|
+
style,
|
|
235
|
+
});
|
|
236
|
+
return result.summary;
|
|
237
|
+
}
|
|
238
|
+
case 'consolidate': {
|
|
239
|
+
const query = typeof operation.params.query === 'string'
|
|
240
|
+
? operation.params.query
|
|
241
|
+
: '';
|
|
242
|
+
const facts = await memoryService.searchFacts([groupId], query, 10);
|
|
243
|
+
const uuids = facts.filter(f => f.uuid).map(f => f.uuid);
|
|
244
|
+
if (uuids.length < 2) {
|
|
245
|
+
return `Not enough facts found matching "${query}" to consolidate (need at least 2).`;
|
|
246
|
+
}
|
|
247
|
+
const result = await consolidationService.consolidate(groupId, uuids, 'archive-duplicates');
|
|
248
|
+
return `Consolidated ${uuids.length} facts: retained ${result.retainedUuid}, archived ${result.archivedUuids.length}.`;
|
|
249
|
+
}
|
|
250
|
+
default:
|
|
251
|
+
return `Unknown operation type: ${operation.type}`;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Extract JSON from LLM response text.
|
|
256
|
+
* Uses progressive try-parse from each '{' position.
|
|
257
|
+
*/
|
|
258
|
+
function extractJson(text) {
|
|
259
|
+
const trimmed = text.trim();
|
|
260
|
+
let start = trimmed.indexOf('{');
|
|
261
|
+
while (start !== -1) {
|
|
262
|
+
for (let end = trimmed.lastIndexOf('}'); end > start; end = trimmed.lastIndexOf('}', end - 1)) {
|
|
263
|
+
const candidate = trimmed.slice(start, end + 1);
|
|
264
|
+
try {
|
|
265
|
+
JSON.parse(candidate);
|
|
266
|
+
return candidate;
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Try shorter substring
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
start = trimmed.indexOf('{', start + 1);
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=NlCurationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NlCurationService.js","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/NlCurationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preference Store Implementation.
|
|
3
|
+
*
|
|
4
|
+
* File-based JSON storage of user preferences in `.lisa/preferences.json`.
|
|
5
|
+
* Reads the full file on every operation (no in-memory cache — simple, correct).
|
|
6
|
+
*
|
|
7
|
+
* Part of Phase 5D: Preference Key-Value Store.
|
|
8
|
+
*/
|
|
9
|
+
import type { IPreferenceStore } from '../../domain/interfaces/IPreferenceStore';
|
|
10
|
+
/**
|
|
11
|
+
* Create a file-based PreferenceStore.
|
|
12
|
+
*
|
|
13
|
+
* @param projectRoot - Project root directory (location of `.lisa/`)
|
|
14
|
+
* @param logger - Optional logger for warnings (invalid JSON, etc.)
|
|
15
|
+
*/
|
|
16
|
+
export declare function createPreferenceStore(projectRoot: string, logger?: {
|
|
17
|
+
warn: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
18
|
+
}): IPreferenceStore;
|
|
19
|
+
//# sourceMappingURL=PreferenceStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferenceStore.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/PreferenceStore.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,0CAA0C,CAAC;AAc9F;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAAE,GACtE,gBAAgB,CAqFlB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Preference Store Implementation.
|
|
4
|
+
*
|
|
5
|
+
* File-based JSON storage of user preferences in `.lisa/preferences.json`.
|
|
6
|
+
* Reads the full file on every operation (no in-memory cache — simple, correct).
|
|
7
|
+
*
|
|
8
|
+
* Part of Phase 5D: Preference Key-Value Store.
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.createPreferenceStore = createPreferenceStore;
|
|
15
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
16
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
17
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
18
|
+
const PREFERENCES_FILE = '.lisa/preferences.json';
|
|
19
|
+
/**
|
|
20
|
+
* Create a file-based PreferenceStore.
|
|
21
|
+
*
|
|
22
|
+
* @param projectRoot - Project root directory (location of `.lisa/`)
|
|
23
|
+
* @param logger - Optional logger for warnings (invalid JSON, etc.)
|
|
24
|
+
*/
|
|
25
|
+
function createPreferenceStore(projectRoot, logger) {
|
|
26
|
+
const filePath = node_path_1.default.join(projectRoot, PREFERENCES_FILE);
|
|
27
|
+
/**
|
|
28
|
+
* Read the preferences file. Returns empty object on missing/invalid file.
|
|
29
|
+
*/
|
|
30
|
+
async function readStore() {
|
|
31
|
+
try {
|
|
32
|
+
const content = await promises_1.default.readFile(filePath, 'utf-8');
|
|
33
|
+
const parsed = JSON.parse(content);
|
|
34
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
35
|
+
logger?.warn('Invalid preferences.json structure, resetting to empty store', { filePath });
|
|
36
|
+
await writeStore({});
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (err instanceof SyntaxError) {
|
|
43
|
+
logger?.warn('Invalid JSON in preferences.json, resetting to empty store', { filePath });
|
|
44
|
+
await writeStore({});
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
// ENOENT (file not found) — empty store, no error
|
|
48
|
+
if (err.code === 'ENOENT') {
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
// Other I/O errors (permissions, etc.) — surface them
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Write the preferences file. Creates `.lisa/` directory if needed.
|
|
57
|
+
*/
|
|
58
|
+
async function writeStore(data) {
|
|
59
|
+
const dir = node_path_1.default.dirname(filePath);
|
|
60
|
+
if (!node_fs_1.default.existsSync(dir)) {
|
|
61
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
await promises_1.default.writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
async get(key) {
|
|
67
|
+
const data = await readStore();
|
|
68
|
+
const entry = data[key];
|
|
69
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
70
|
+
return null;
|
|
71
|
+
const value = entry.value;
|
|
72
|
+
return typeof value === 'string' ? value : null;
|
|
73
|
+
},
|
|
74
|
+
async set(key, value) {
|
|
75
|
+
const data = await readStore();
|
|
76
|
+
data[key] = {
|
|
77
|
+
value,
|
|
78
|
+
updatedAt: new Date().toISOString(),
|
|
79
|
+
};
|
|
80
|
+
await writeStore(data);
|
|
81
|
+
},
|
|
82
|
+
async delete(key) {
|
|
83
|
+
const data = await readStore();
|
|
84
|
+
if (!(key in data))
|
|
85
|
+
return false;
|
|
86
|
+
delete data[key];
|
|
87
|
+
await writeStore(data);
|
|
88
|
+
return true;
|
|
89
|
+
},
|
|
90
|
+
async list() {
|
|
91
|
+
const data = await readStore();
|
|
92
|
+
return Object.entries(data).flatMap(([key, raw]) => {
|
|
93
|
+
const entry = raw;
|
|
94
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
95
|
+
return [];
|
|
96
|
+
const value = entry.value;
|
|
97
|
+
const updatedAt = entry.updatedAt;
|
|
98
|
+
if (typeof value !== 'string' || typeof updatedAt !== 'string')
|
|
99
|
+
return [];
|
|
100
|
+
return [{ key, value, updatedAt }];
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
async has(key) {
|
|
104
|
+
const data = await readStore();
|
|
105
|
+
return key in data;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=PreferenceStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferenceStore.js","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/PreferenceStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
import type { ISessionCaptureService, ICapturedWork, ILogger } from '../../domain';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export interface IWorkSummary {
|
|
6
|
-
messageCount: number;
|
|
7
|
-
userPrompts: number;
|
|
8
|
-
assistantResponses: number;
|
|
9
|
-
toolCalls: number;
|
|
10
|
-
filesCreated: string[];
|
|
11
|
-
filesModified: string[];
|
|
12
|
-
duration: number;
|
|
13
|
-
summary: string;
|
|
14
|
-
}
|
|
2
|
+
import type { ITranscriptEnricher } from '../../domain/interfaces/ITranscriptEnricher';
|
|
3
|
+
import type { IWorkSummary } from '../../domain/interfaces/IWorkSummary';
|
|
4
|
+
export type { IWorkSummary } from '../../domain/interfaces/IWorkSummary';
|
|
15
5
|
/**
|
|
16
6
|
* Service for capturing session work from Claude Code transcripts.
|
|
17
7
|
*
|
|
@@ -20,7 +10,8 @@ export interface IWorkSummary {
|
|
|
20
10
|
*/
|
|
21
11
|
export declare class SessionCaptureService implements ISessionCaptureService {
|
|
22
12
|
private readonly logger?;
|
|
23
|
-
|
|
13
|
+
private readonly transcriptEnricher?;
|
|
14
|
+
constructor(logger?: ILogger, transcriptEnricher?: ITranscriptEnricher);
|
|
24
15
|
/**
|
|
25
16
|
* Capture work from the current session.
|
|
26
17
|
*
|
|
@@ -50,15 +41,17 @@ export declare class SessionCaptureService implements ISessionCaptureService {
|
|
|
50
41
|
/**
|
|
51
42
|
* Find all transcript candidates from standard Claude Code locations.
|
|
52
43
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
44
|
+
* Claude Code stores session transcripts as UUID-named JSONL files:
|
|
45
|
+
* ~/.claude/projects/<project-folder>/<session-uuid>.jsonl
|
|
46
|
+
*
|
|
47
|
+
* The project folder is derived from the working directory path with
|
|
48
|
+
* path separators replaced by dashes (e.g. C:\dev\lisa → C--dev-lisa).
|
|
56
49
|
*
|
|
57
50
|
* @returns Array of candidates with path and modification time
|
|
58
51
|
*/
|
|
59
52
|
private findTranscriptCandidates;
|
|
60
53
|
/**
|
|
61
|
-
* Parse transcript file to extract work summary.
|
|
54
|
+
* Parse transcript file to extract work summary including heuristic detections.
|
|
62
55
|
*/
|
|
63
56
|
parseTranscript(transcriptPath: string): IWorkSummary;
|
|
64
57
|
/**
|
|
@@ -66,13 +59,61 @@ export declare class SessionCaptureService implements ISessionCaptureService {
|
|
|
66
59
|
*/
|
|
67
60
|
hasSignificantWork(work: IWorkSummary): boolean;
|
|
68
61
|
/**
|
|
69
|
-
* Build facts from work summary.
|
|
62
|
+
* Build facts from work summary including heuristic-detected facts.
|
|
70
63
|
*/
|
|
71
64
|
buildFacts(work: IWorkSummary, sessionId?: string): string[];
|
|
72
65
|
/**
|
|
73
66
|
* Rate the complexity of work performed.
|
|
74
67
|
*/
|
|
75
68
|
rateComplexity(work: IWorkSummary): ICapturedWork['complexity'];
|
|
69
|
+
/**
|
|
70
|
+
* Detect user decisions from confirmation patterns.
|
|
71
|
+
*
|
|
72
|
+
* Scans for user messages matching confirmation patterns (yes, ok, sounds good, etc.)
|
|
73
|
+
* preceded by assistant messages that present options or recommendations.
|
|
74
|
+
*/
|
|
75
|
+
private detectDecisions;
|
|
76
|
+
/**
|
|
77
|
+
* Detect errors from stack traces, error types, tool failures, and retry patterns.
|
|
78
|
+
*/
|
|
79
|
+
private detectErrors;
|
|
80
|
+
/**
|
|
81
|
+
* Correlate file changes with preceding user prompts.
|
|
82
|
+
*
|
|
83
|
+
* For each changed file, find preceding user prompt (within 3-message window)
|
|
84
|
+
* whose text mentions the file name or related keywords.
|
|
85
|
+
*/
|
|
86
|
+
private correlateFilePrompts;
|
|
87
|
+
/**
|
|
88
|
+
* Detect the dominant task type from user prompts using DETECTION_SIGNALS.
|
|
89
|
+
*/
|
|
90
|
+
private detectTaskType;
|
|
91
|
+
/**
|
|
92
|
+
* Extract text content from a transcript message.
|
|
93
|
+
*/
|
|
94
|
+
private extractMessageText;
|
|
95
|
+
/**
|
|
96
|
+
* Extract tool name from a transcript message.
|
|
97
|
+
*/
|
|
98
|
+
private extractToolName;
|
|
99
|
+
/**
|
|
100
|
+
* Check if a tool_result message indicates an error.
|
|
101
|
+
*/
|
|
102
|
+
private extractToolError;
|
|
103
|
+
/**
|
|
104
|
+
* Extract the first Error: line from text containing a stack trace.
|
|
105
|
+
*/
|
|
106
|
+
private extractErrorLine;
|
|
107
|
+
/**
|
|
108
|
+
* Extract a decision topic from an assistant's message.
|
|
109
|
+
* Takes the first sentence or first 120 characters.
|
|
110
|
+
*/
|
|
111
|
+
private extractDecisionTopic;
|
|
112
|
+
/**
|
|
113
|
+
* Extract a snippet of conversation text from the transcript for LLM analysis.
|
|
114
|
+
* Concatenates user and assistant text content, truncated to a reasonable length.
|
|
115
|
+
*/
|
|
116
|
+
private getTranscriptSnippet;
|
|
76
117
|
/**
|
|
77
118
|
* Detect repository name from git.
|
|
78
119
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionCaptureService.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/SessionCaptureService.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionCaptureService.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/SessionCaptureService.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAA6D,MAAM,sCAAsC,CAAC;AAKpI,YAAY,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AA4DzE;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAsB;gBAE9C,MAAM,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,mBAAmB;IAKtE;;;;;;;;;;OAUG;IACG,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkE7F;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA2CpD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,wBAAwB;IA+EhC;;OAEG;IACH,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;IAuFrD;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAyB/C;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IA2D5D;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAoB/D;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAyEpB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAyD5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAqCtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqC5B;;OAEG;IACH,UAAU,IAAI,MAAM;IAapB;;OAEG;IACH,OAAO,CAAC,cAAc;CAcvB"}
|