create-ai-chat-context-experimental
Version:
Phase 2: TypeScript rewrite - AI Chat Context & Memory System with conversation extraction and AICF format support (powered by aicf-core v2.1.0).
98 lines • 3.73 kB
JavaScript
;
/**
* This file is part of create-ai-chat-context-experimental.
* Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).
* See LICENSE file for details.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActionExtractor = void 0;
const index_js_1 = require("../types/index.js");
const index_js_2 = require("../types/index.js");
/**
* Extract AI actions using priority-based approach
* PRIORITY 1: Use conversation summary (full content)
* PRIORITY 2: Extract from individual messages (fallback)
*/
class ActionExtractor {
/**
* Extract AI actions from messages and summary
*
* @param messages - Array of messages
* @param summary - Conversation summary (optional)
* @returns Result with AIAction[] or error
*/
extract(messages, summary) {
try {
// PRIORITY 1: Extract from conversation summary
if (summary && summary.aiResponses) {
return (0, index_js_2.Ok)(this.extractFromSummary(summary));
}
// PRIORITY 2: Extract from individual messages
return (0, index_js_2.Ok)(this.extractFromMessages(messages));
}
catch (error) {
const message = error instanceof Error ? error.message : 'Unknown error';
return (0, index_js_2.Err)(new index_js_1.ExtractionError(`Failed to extract AI actions: ${message}`, error));
}
}
/**
* Extract actions from conversation summary
* @param summary - Conversation summary
* @returns AIAction[]
*/
extractFromSummary(summary) {
const actions = [];
// Split AI responses by [AI N] markers
const aiResponseMatches = summary.aiResponses.match(/\[AI \d+\] (.+?)(?=\n\n\[AI \d+\]|\n\n$|$)/gs);
if (aiResponseMatches && aiResponseMatches.length > 0) {
aiResponseMatches.forEach((response, index) => {
const cleanResponse = response.replace(/\[AI \d+\] /, '').trim();
if (cleanResponse.length > 0) {
actions.push({
timestamp: new Date().toISOString(),
details: cleanResponse, // ✅ FULL content, not truncated
type: this.detectActionType(cleanResponse),
source: 'conversation_summary',
messageIndex: index + 1,
});
}
});
}
return actions;
}
/**
* Extract actions from individual messages
* @param messages - Array of messages
* @returns AIAction[]
*/
extractFromMessages(messages) {
const actions = [];
const aiMessages = messages.filter((m) => m.role === 'assistant');
aiMessages.forEach((msg, index) => {
actions.push({
timestamp: msg.timestamp,
details: msg.content, // ✅ FULL content, not truncated
type: this.detectActionType(msg.content),
source: 'augment_leveldb',
messageIndex: index + 1,
});
});
return actions;
}
/**
* Detect action type from content
* @param content - Action content
* @returns Action type
*/
detectActionType(content) {
const lowerContent = content.toLowerCase();
// Check for agent actions (code blocks are the primary indicator)
if (lowerContent.includes('```')) {
return 'augment_agent_action';
}
// Default to response
return 'augment_ai_response';
}
}
exports.ActionExtractor = ActionExtractor;
//# sourceMappingURL=ActionExtractor.js.map