conductor-tasks
Version:
Task Manager for AI Development
137 lines • 4.91 kB
JavaScript
export var ContextPriority;
(function (ContextPriority) {
ContextPriority["CRITICAL"] = "critical";
ContextPriority["ESSENTIAL"] = "essential";
ContextPriority["BACKGROUND"] = "background";
})(ContextPriority || (ContextPriority = {}));
export class ContextManager {
constructor() {
this.contextItems = new Map();
this.anchorPoints = new Set();
this.summaries = new Map();
this.lastSummarizationTime = Date.now();
this.summarizationInterval = 1000 * 60 * 10;
}
addContext(item) {
this.contextItems.set(item.id, item);
return item.id;
}
setAnchorPoint(id, isAnchor = true) {
if (isAnchor) {
this.anchorPoints.add(id);
}
else {
this.anchorPoints.delete(id);
}
}
getActiveContext(options = {}) {
const now = Date.now();
const { maxItems = 50, recencyThreshold = 1000 * 60 * 60 * 24, minConfidence = 0.3 } = options;
if (now - this.lastSummarizationTime > this.summarizationInterval) {
this.createSummaries();
this.lastSummarizationTime = now;
}
let items = Array.from(this.contextItems.values())
.filter(item => {
if (this.anchorPoints.has(item.id))
return true;
return item.confidence >= minConfidence &&
(now - item.timestamp <= recencyThreshold);
})
.sort((a, b) => {
const priorityOrder = {
[ContextPriority.CRITICAL]: 0,
[ContextPriority.ESSENTIAL]: 1,
[ContextPriority.BACKGROUND]: 2
};
const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
if (priorityDiff !== 0)
return priorityDiff;
return b.timestamp - a.timestamp;
});
items = this.applyTimeDecay(items);
return items.slice(0, maxItems);
}
applyTimeDecay(items) {
const now = Date.now();
const ONE_HOUR = 1000 * 60 * 60;
return items.map(item => {
if (this.anchorPoints.has(item.id))
return item;
const hoursSinceCreation = (now - item.timestamp) / ONE_HOUR;
const decayRates = {
[ContextPriority.CRITICAL]: 0.005,
[ContextPriority.ESSENTIAL]: 0.01,
[ContextPriority.BACKGROUND]: 0.05
};
const decayRate = decayRates[item.priority];
const decayFactor = Math.max(0, 1 - (hoursSinceCreation * decayRate));
return {
...item,
confidence: item.confidence * decayFactor
};
});
}
createSummaries() {
const topicGroups = new Map();
for (const item of this.contextItems.values()) {
for (const tag of item.tags) {
if (!topicGroups.has(tag)) {
topicGroups.set(tag, []);
}
topicGroups.get(tag)?.push(item);
}
}
for (const [topic, items] of topicGroups.entries()) {
if (items.length > 3) {
const summary = `Summary of ${items.length} items about "${topic}": ` +
items.map(i => i.content.substring(0, 50)).join(" ... ");
this.summaries.set(topic, summary);
}
}
}
getSummaries() {
return this.summaries;
}
integrateMultiModalContent(content, options) {
const { modality, priority = ContextPriority.ESSENTIAL, confidence = 0.8, tags = [] } = options;
const id = `${modality}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
let processedContent;
switch (modality) {
case "text":
processedContent = content;
break;
case "image":
processedContent = `[Image data with ${content.length} bytes]`;
break;
case "audio":
processedContent = `[Audio data with ${content.length} bytes]`;
break;
case "structured":
processedContent = JSON.stringify(content);
break;
}
const item = {
id,
content: processedContent,
priority,
timestamp: Date.now(),
confidence,
source: `${modality}-integration`,
modality,
tags
};
return this.addContext(item);
}
clearNonAnchorContext() {
for (const [id, item] of this.contextItems.entries()) {
if (!this.anchorPoints.has(id)) {
this.contextItems.delete(id);
}
}
}
getContextItem(id) {
return this.contextItems.get(id);
}
}
//# sourceMappingURL=contextManager.js.map