aicf-core
Version:
Universal AI Context Format (AICF) - Enterprise-grade AI memory infrastructure with 95.5% compression and zero semantic loss
212 lines • 6.75 kB
JavaScript
/*
* SPDX-License-Identifier: AGPL-3.0-or-later
* Copyright (c) 2025 Dennis van Leeuwen
*
* AICF API - Complete interface for AI Context Format
*/
import { ok, err, toError } from "./types/result.js";
import { AICFReader, } from "./aicf-reader.js";
import { AICFWriter } from "./aicf-writer.js";
import { ConsoleLogger } from "./utils/logger.js";
/**
* AICF API - High-level interface for AICF operations
*/
export class AICFAPI {
reader;
writer;
aicfDir;
logger;
constructor(aicfDir = ".aicf", fs, logger) {
this.aicfDir = aicfDir;
this.logger = logger ?? new ConsoleLogger();
this.reader = new AICFReader(aicfDir, fs, logger);
this.writer = new AICFWriter(aicfDir, fs, logger);
}
/**
* Get comprehensive project overview
*/
async getProjectOverview() {
try {
const statsResult = await this.reader.getStats();
if (!statsResult.ok) {
return err(statsResult.error);
}
const conversationsResult = await this.reader.getLastConversations(5);
if (!conversationsResult.ok) {
return err(conversationsResult.error);
}
const workStateResult = await this.reader.getCurrentWorkState();
if (!workStateResult.ok) {
return err(workStateResult.error);
}
const stats = statsResult.value;
const conversations = conversationsResult.value;
const workState = workStateResult.value;
const overview = {
stats,
recent: {
conversations,
decisions: [],
workState,
},
summary: this.generateProjectSummary(stats, workState, []),
};
return ok(overview);
}
catch (error) {
return err(toError(error));
}
}
/**
* Generate AI-friendly project summary
*/
generateProjectSummary(stats, workState, decisions) {
const projectName = stats.project.name;
const conversationCount = stats.counts.conversations;
const decisionCount = stats.counts.decisions;
const lastUpdate = stats.lastUpdate;
let summary = `Project: ${projectName}\n`;
summary += `Status: ${stats.state.status}\n`;
summary += `Conversations: ${conversationCount}, Decisions: ${decisionCount}\n`;
summary += `Last Updated: ${lastUpdate}\n`;
if (workState) {
summary += `Current Work: ${workState["id"]} (${workState["status"]})\n`;
}
if (decisions.length > 0) {
summary += `Recent Decisions: ${decisions.length}\n`;
}
return summary;
}
/**
* Query the AICF database
*/
async query(queryText) {
try {
const results = {
conversations: [],
decisions: [],
insights: [],
workStates: [],
relevanceScore: 0,
};
const intent = this.parseQueryIntent(queryText);
switch (intent.type) {
case "recent_activity": {
const conversationsResult = await this.reader.getLastConversations(intent.count ?? 10);
if (conversationsResult.ok) {
results.conversations = conversationsResult.value;
}
const workStateResult = await this.reader.getCurrentWorkState();
if (workStateResult.ok && workStateResult.value) {
results.workStates = [workStateResult.value];
}
results.relevanceScore = 0.9;
break;
}
case "search": {
const conversationsResult = await this.reader.getLastConversations(50);
if (conversationsResult.ok) {
results.conversations = this.filterByKeywords(conversationsResult.value, intent.keywords ?? []);
}
results.relevanceScore = 0.7;
break;
}
default:
results.relevanceScore = 0.1;
}
return ok(results);
}
catch (error) {
return err(toError(error));
}
}
/**
* Parse query intent
*/
parseQueryIntent(queryText) {
const lower = queryText.toLowerCase();
if (lower.includes("recent") ||
lower.includes("last") ||
lower.includes("latest")) {
const countMatch = queryText.match(/\d+/);
return {
type: "recent_activity",
count: countMatch ? parseInt(countMatch[0], 10) : 10,
};
}
if (lower.includes("search") || lower.includes("find")) {
const keywords = queryText
.split(" ")
.filter((word) => word.length > 3)
.map((word) => word.toLowerCase());
return {
type: "search",
keywords,
};
}
return {
type: "unknown",
};
}
/**
* Filter conversations by keywords
*/
filterByKeywords(conversations, keywords) {
if (keywords.length === 0)
return conversations;
return conversations.filter((conv) => {
const content = conv.content.toLowerCase();
return keywords.some((keyword) => content.includes(keyword));
});
}
/**
* Add conversation
*/
async addConversation(conversation) {
return await this.writer.writeConversation(conversation);
}
/**
* Add memory
*/
async addMemory(memory) {
return await this.writer.writeMemory(memory);
}
/**
* Add decision
*/
async addDecision(decision) {
return await this.writer.writeDecision(decision);
}
/**
* Get statistics
*/
async getStats() {
return await this.reader.getStats();
}
/**
* Get last conversations
*/
async getLastConversations(count = 5) {
return await this.reader.getLastConversations(count);
}
/**
* Get current work state
*/
async getCurrentWorkState() {
return await this.reader.getCurrentWorkState();
}
/**
* Get reader instance
*/
getReader() {
return this.reader;
}
/**
* Get writer instance
*/
getWriter() {
return this.writer;
}
}
//# sourceMappingURL=aicf-api.js.map