@stackmemoryai/stackmemory 0.1.0 → 0.2.1
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/scripts/initialize.js +15 -15
- package/dist/scripts/initialize.js.map +1 -1
- package/dist/scripts/status.js +21 -11
- package/dist/scripts/status.js.map +1 -1
- package/dist/src/beads/beads-task-store.d.ts +117 -0
- package/dist/src/beads/beads-task-store.d.ts.map +1 -0
- package/dist/src/beads/beads-task-store.js +318 -0
- package/dist/src/beads/beads-task-store.js.map +1 -0
- package/dist/src/beads/task-aware-context.d.ts +103 -0
- package/dist/src/beads/task-aware-context.d.ts.map +1 -0
- package/dist/src/beads/task-aware-context.js +395 -0
- package/dist/src/beads/task-aware-context.js.map +1 -0
- package/dist/src/beads-task-store.d.ts +117 -0
- package/dist/src/beads-task-store.d.ts.map +1 -0
- package/dist/src/beads-task-store.js +318 -0
- package/dist/src/beads-task-store.js.map +1 -0
- package/dist/src/cli/cli.d.ts +7 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +471 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/core/error-handler.d.ts +46 -0
- package/dist/src/core/error-handler.d.ts.map +1 -0
- package/dist/src/core/error-handler.js +212 -0
- package/dist/src/core/error-handler.js.map +1 -0
- package/dist/src/core/frame-manager.d.ts +106 -0
- package/dist/src/core/frame-manager.d.ts.map +1 -0
- package/dist/src/core/frame-manager.js +387 -0
- package/dist/src/core/frame-manager.js.map +1 -0
- package/dist/src/core/logger.d.ts +24 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +121 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/logger.test.d.ts +2 -0
- package/dist/src/core/logger.test.d.ts.map +1 -0
- package/dist/src/core/logger.test.js +31 -0
- package/dist/src/core/logger.test.js.map +1 -0
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/linear-auth.d.ts +99 -0
- package/dist/src/integrations/linear-auth.d.ts.map +1 -0
- package/dist/src/integrations/linear-auth.js +319 -0
- package/dist/src/integrations/linear-auth.js.map +1 -0
- package/dist/src/integrations/linear-auto-sync.d.ts +77 -0
- package/dist/src/integrations/linear-auto-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear-auto-sync.js +268 -0
- package/dist/src/integrations/linear-auto-sync.js.map +1 -0
- package/dist/src/integrations/linear-client.d.ts +86 -0
- package/dist/src/integrations/linear-client.d.ts.map +1 -0
- package/dist/src/integrations/linear-client.js +275 -0
- package/dist/src/integrations/linear-client.js.map +1 -0
- package/dist/src/integrations/linear-config.d.ts +51 -0
- package/dist/src/integrations/linear-config.d.ts.map +1 -0
- package/dist/src/integrations/linear-config.js +103 -0
- package/dist/src/integrations/linear-config.js.map +1 -0
- package/dist/src/integrations/linear-sync.d.ts +95 -0
- package/dist/src/integrations/linear-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear-sync.js +340 -0
- package/dist/src/integrations/linear-sync.js.map +1 -0
- package/dist/src/mcp/mcp-server.d.ts +38 -0
- package/dist/src/mcp/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp/mcp-server.js +812 -0
- package/dist/src/mcp/mcp-server.js.map +1 -0
- package/dist/src/pebbles/pebbles-task-store.d.ts +117 -0
- package/dist/src/pebbles/pebbles-task-store.d.ts.map +1 -0
- package/dist/src/pebbles/pebbles-task-store.js +335 -0
- package/dist/src/pebbles/pebbles-task-store.js.map +1 -0
- package/dist/src/pebbles/task-aware-context.d.ts +103 -0
- package/dist/src/pebbles/task-aware-context.d.ts.map +1 -0
- package/dist/src/pebbles/task-aware-context.js +412 -0
- package/dist/src/pebbles/task-aware-context.js.map +1 -0
- package/dist/src/task-aware-context.d.ts +103 -0
- package/dist/src/task-aware-context.d.ts.map +1 -0
- package/dist/src/task-aware-context.js +395 -0
- package/dist/src/task-aware-context.js.map +1 -0
- package/package.json +41 -9
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task-Aware Context Assembly
|
|
3
|
+
* Intelligently selects context based on active tasks and their relationships
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../core/logger.js';
|
|
6
|
+
export class TaskAwareContextManager {
|
|
7
|
+
db;
|
|
8
|
+
frameManager;
|
|
9
|
+
projectId;
|
|
10
|
+
constructor(db, frameManager, projectId) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.frameManager = frameManager;
|
|
13
|
+
this.projectId = projectId;
|
|
14
|
+
this.initializeTaskSchema();
|
|
15
|
+
}
|
|
16
|
+
initializeTaskSchema() {
|
|
17
|
+
this.db.exec(`
|
|
18
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
19
|
+
task_id TEXT PRIMARY KEY,
|
|
20
|
+
frame_id TEXT NOT NULL,
|
|
21
|
+
anchor_id TEXT,
|
|
22
|
+
name TEXT NOT NULL,
|
|
23
|
+
description TEXT,
|
|
24
|
+
status TEXT DEFAULT 'pending',
|
|
25
|
+
priority TEXT DEFAULT 'medium',
|
|
26
|
+
parent_task_id TEXT,
|
|
27
|
+
depends_on TEXT DEFAULT '[]',
|
|
28
|
+
assigned_to TEXT,
|
|
29
|
+
estimated_effort INTEGER,
|
|
30
|
+
actual_effort INTEGER,
|
|
31
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
32
|
+
started_at INTEGER,
|
|
33
|
+
completed_at INTEGER,
|
|
34
|
+
blocked_reason TEXT,
|
|
35
|
+
context_tags TEXT DEFAULT '[]',
|
|
36
|
+
metadata TEXT DEFAULT '{}',
|
|
37
|
+
FOREIGN KEY(frame_id) REFERENCES frames(frame_id),
|
|
38
|
+
FOREIGN KEY(anchor_id) REFERENCES anchors(anchor_id),
|
|
39
|
+
FOREIGN KEY(parent_task_id) REFERENCES tasks(task_id)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE TABLE IF NOT EXISTS task_dependencies (
|
|
43
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
44
|
+
task_id TEXT NOT NULL,
|
|
45
|
+
depends_on_task_id TEXT NOT NULL,
|
|
46
|
+
dependency_type TEXT DEFAULT 'blocks',
|
|
47
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
48
|
+
FOREIGN KEY(task_id) REFERENCES tasks(task_id),
|
|
49
|
+
FOREIGN KEY(depends_on_task_id) REFERENCES tasks(task_id)
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
CREATE TABLE IF NOT EXISTS context_access_log (
|
|
53
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
54
|
+
request_id TEXT NOT NULL,
|
|
55
|
+
task_ids TEXT, -- JSON array of relevant task IDs
|
|
56
|
+
context_items TEXT, -- JSON array of included context items
|
|
57
|
+
relevance_scores TEXT, -- JSON object of item -> score mappings
|
|
58
|
+
total_tokens INTEGER,
|
|
59
|
+
query_hash TEXT,
|
|
60
|
+
timestamp INTEGER DEFAULT (unixepoch())
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_frame ON tasks(frame_id);
|
|
66
|
+
CREATE INDEX IF NOT EXISTS idx_task_deps ON task_dependencies(task_id);
|
|
67
|
+
`);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create task from TODO anchor or standalone
|
|
71
|
+
*/
|
|
72
|
+
createTask(options) {
|
|
73
|
+
const taskId = `task_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
74
|
+
const frameId = options.frameId || this.frameManager.getCurrentFrameId();
|
|
75
|
+
if (!frameId) {
|
|
76
|
+
throw new Error('No active frame for task creation');
|
|
77
|
+
}
|
|
78
|
+
const task = {
|
|
79
|
+
task_id: taskId,
|
|
80
|
+
frame_id: frameId,
|
|
81
|
+
anchor_id: options.anchorId,
|
|
82
|
+
name: options.name,
|
|
83
|
+
description: options.description,
|
|
84
|
+
status: 'pending',
|
|
85
|
+
priority: options.priority || 'medium',
|
|
86
|
+
parent_task_id: options.parentTaskId,
|
|
87
|
+
depends_on: options.dependsOn || [],
|
|
88
|
+
estimated_effort: options.estimatedEffort,
|
|
89
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
90
|
+
context_tags: options.contextTags || [],
|
|
91
|
+
metadata: options.metadata || {},
|
|
92
|
+
};
|
|
93
|
+
// Insert task
|
|
94
|
+
this.db
|
|
95
|
+
.prepare(`
|
|
96
|
+
INSERT INTO tasks (
|
|
97
|
+
task_id, frame_id, anchor_id, name, description, status, priority,
|
|
98
|
+
parent_task_id, depends_on, estimated_effort, created_at, context_tags, metadata
|
|
99
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
100
|
+
`)
|
|
101
|
+
.run(task.task_id, task.frame_id, task.anchor_id, task.name, task.description, task.status, task.priority, task.parent_task_id, JSON.stringify(task.depends_on), task.estimated_effort, task.created_at, JSON.stringify(task.context_tags), JSON.stringify(task.metadata));
|
|
102
|
+
// Create dependency relationships
|
|
103
|
+
if (task.depends_on.length > 0) {
|
|
104
|
+
const dependencyStmt = this.db.prepare(`
|
|
105
|
+
INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (?, ?)
|
|
106
|
+
`);
|
|
107
|
+
task.depends_on.forEach((depTaskId) => {
|
|
108
|
+
dependencyStmt.run(taskId, depTaskId);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Log event
|
|
112
|
+
this.frameManager.addEvent('decision', {
|
|
113
|
+
action: 'create_task',
|
|
114
|
+
task_id: taskId,
|
|
115
|
+
name: task.name,
|
|
116
|
+
priority: task.priority,
|
|
117
|
+
});
|
|
118
|
+
logger.info('Created task', { taskId, name: task.name, frameId });
|
|
119
|
+
return taskId;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Update task status with automatic time tracking
|
|
123
|
+
*/
|
|
124
|
+
updateTaskStatus(taskId, newStatus, reason) {
|
|
125
|
+
const task = this.getTask(taskId);
|
|
126
|
+
if (!task)
|
|
127
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
128
|
+
const now = Math.floor(Date.now() / 1000);
|
|
129
|
+
const updates = { status: newStatus };
|
|
130
|
+
// Automatic time tracking
|
|
131
|
+
if (newStatus === 'in_progress' && task.status === 'pending') {
|
|
132
|
+
updates.started_at = now;
|
|
133
|
+
}
|
|
134
|
+
else if (newStatus === 'completed' && task.status === 'in_progress') {
|
|
135
|
+
updates.completed_at = now;
|
|
136
|
+
if (task.started_at) {
|
|
137
|
+
updates.actual_effort = now - task.started_at;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (newStatus === 'blocked') {
|
|
141
|
+
updates.blocked_reason = reason || 'No reason provided';
|
|
142
|
+
}
|
|
143
|
+
// Build dynamic update query
|
|
144
|
+
const setClause = Object.keys(updates)
|
|
145
|
+
.map((key) => `${key} = ?`)
|
|
146
|
+
.join(', ');
|
|
147
|
+
const values = Object.values(updates);
|
|
148
|
+
this.db
|
|
149
|
+
.prepare(`UPDATE tasks SET ${setClause} WHERE task_id = ?`)
|
|
150
|
+
.run(...values, taskId);
|
|
151
|
+
// Log status change
|
|
152
|
+
this.frameManager.addEvent('observation', {
|
|
153
|
+
action: 'task_status_change',
|
|
154
|
+
task_id: taskId,
|
|
155
|
+
old_status: task.status,
|
|
156
|
+
new_status: newStatus,
|
|
157
|
+
reason,
|
|
158
|
+
});
|
|
159
|
+
logger.info('Updated task status', {
|
|
160
|
+
taskId,
|
|
161
|
+
oldStatus: task.status,
|
|
162
|
+
newStatus,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Assemble context optimized for active tasks and query
|
|
167
|
+
*/
|
|
168
|
+
assembleTaskAwareContext(request) {
|
|
169
|
+
const startTime = Date.now();
|
|
170
|
+
// 1. Get active and relevant tasks
|
|
171
|
+
const activeTasks = this.getActiveTasks(request.taskFocus);
|
|
172
|
+
const blockedTasks = this.getBlockedTasks();
|
|
173
|
+
// 2. Score and select relevant context
|
|
174
|
+
const contextItems = this.selectRelevantContext(activeTasks, request);
|
|
175
|
+
// 3. Assemble final context with smart ordering
|
|
176
|
+
const { context, totalTokens, relevanceScores } = this.buildContextString(contextItems, activeTasks, request.maxTokens || 4000);
|
|
177
|
+
// 4. Log context access for learning
|
|
178
|
+
this.logContextAccess({
|
|
179
|
+
taskIds: activeTasks.map((t) => t.task_id),
|
|
180
|
+
contextItems: contextItems.map((item) => item.id),
|
|
181
|
+
relevanceScores,
|
|
182
|
+
totalTokens,
|
|
183
|
+
query: request.query || '',
|
|
184
|
+
});
|
|
185
|
+
const metadata = {
|
|
186
|
+
includedTasks: activeTasks,
|
|
187
|
+
contextSources: contextItems.map((item) => `${item.type}:${item.id}`),
|
|
188
|
+
totalTokens,
|
|
189
|
+
relevanceScores,
|
|
190
|
+
};
|
|
191
|
+
logger.info('Assembled task-aware context', {
|
|
192
|
+
activeTasks: activeTasks.length,
|
|
193
|
+
blockedTasks: blockedTasks.length,
|
|
194
|
+
contextItems: contextItems.length,
|
|
195
|
+
totalTokens,
|
|
196
|
+
assemblyTimeMs: Date.now() - startTime,
|
|
197
|
+
});
|
|
198
|
+
return { context, metadata };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get tasks that are currently active or should be in context
|
|
202
|
+
*/
|
|
203
|
+
getActiveTasks(taskFocus) {
|
|
204
|
+
let query = `
|
|
205
|
+
SELECT * FROM tasks
|
|
206
|
+
WHERE status IN ('in_progress', 'pending')
|
|
207
|
+
`;
|
|
208
|
+
let params = [];
|
|
209
|
+
if (taskFocus && taskFocus.length > 0) {
|
|
210
|
+
query += ` AND task_id IN (${taskFocus.map(() => '?').join(',')})`;
|
|
211
|
+
params = taskFocus;
|
|
212
|
+
}
|
|
213
|
+
query += ` ORDER BY priority DESC, created_at ASC`;
|
|
214
|
+
const rows = this.db.prepare(query).all(...params);
|
|
215
|
+
return this.hydrateTasks(rows);
|
|
216
|
+
}
|
|
217
|
+
getBlockedTasks() {
|
|
218
|
+
const rows = this.db
|
|
219
|
+
.prepare(`
|
|
220
|
+
SELECT * FROM tasks WHERE status = 'blocked' ORDER BY priority DESC
|
|
221
|
+
`)
|
|
222
|
+
.all();
|
|
223
|
+
return this.hydrateTasks(rows);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Select context items relevant to active tasks
|
|
227
|
+
*/
|
|
228
|
+
selectRelevantContext(activeTasks, request) {
|
|
229
|
+
const contextItems = [];
|
|
230
|
+
// Get frames for active tasks
|
|
231
|
+
const frameIds = [...new Set(activeTasks.map((t) => t.frame_id))];
|
|
232
|
+
frameIds.forEach((frameId) => {
|
|
233
|
+
const frame = this.frameManager.getFrame(frameId);
|
|
234
|
+
if (frame) {
|
|
235
|
+
const score = this.calculateFrameRelevance(frame, activeTasks, request.query);
|
|
236
|
+
contextItems.push({
|
|
237
|
+
id: frameId,
|
|
238
|
+
type: 'frame',
|
|
239
|
+
content: `Frame: ${frame.name} (${frame.type})`,
|
|
240
|
+
relevanceScore: score,
|
|
241
|
+
tokenEstimate: frame.name.length + 20,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
// Get relevant anchors
|
|
246
|
+
const anchors = this.getRelevantAnchors(frameIds, request);
|
|
247
|
+
anchors.forEach((anchor) => {
|
|
248
|
+
const score = this.calculateAnchorRelevance(anchor, activeTasks, request.query);
|
|
249
|
+
contextItems.push({
|
|
250
|
+
id: anchor.anchor_id,
|
|
251
|
+
type: 'anchor',
|
|
252
|
+
content: `${anchor.type}: ${anchor.text}`,
|
|
253
|
+
relevanceScore: score,
|
|
254
|
+
tokenEstimate: anchor.text.length + 10,
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
// Get recent events from active frames
|
|
258
|
+
if (request.includeHistory) {
|
|
259
|
+
frameIds.forEach((frameId) => {
|
|
260
|
+
const events = this.frameManager.getFrameEvents(frameId, 5);
|
|
261
|
+
events.forEach((event) => {
|
|
262
|
+
const score = this.calculateEventRelevance(event, activeTasks, request.query);
|
|
263
|
+
if (score > 0.3) {
|
|
264
|
+
contextItems.push({
|
|
265
|
+
id: event.event_id,
|
|
266
|
+
type: 'event',
|
|
267
|
+
content: `Event: ${event.event_type}`,
|
|
268
|
+
relevanceScore: score,
|
|
269
|
+
tokenEstimate: 30,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
// Sort by relevance score
|
|
276
|
+
return contextItems.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
277
|
+
}
|
|
278
|
+
buildContextString(contextItems, activeTasks, maxTokens) {
|
|
279
|
+
let context = '# Active Task Context\n\n';
|
|
280
|
+
let totalTokens = 20; // Header estimate
|
|
281
|
+
const relevanceScores = {};
|
|
282
|
+
// Always include active tasks summary
|
|
283
|
+
context += '## Current Tasks\n';
|
|
284
|
+
activeTasks.forEach((task) => {
|
|
285
|
+
const line = `- [${task.status.toUpperCase()}] ${task.name} (${task.priority})\n`;
|
|
286
|
+
context += line;
|
|
287
|
+
totalTokens += line.length / 4; // Rough token estimate
|
|
288
|
+
relevanceScores[task.task_id] = 1.0;
|
|
289
|
+
});
|
|
290
|
+
context += '\n';
|
|
291
|
+
// Add context items within token budget
|
|
292
|
+
context += '## Relevant Context\n';
|
|
293
|
+
for (const item of contextItems) {
|
|
294
|
+
if (totalTokens + item.tokenEstimate > maxTokens)
|
|
295
|
+
break;
|
|
296
|
+
context += `${item.content}\n`;
|
|
297
|
+
totalTokens += item.tokenEstimate;
|
|
298
|
+
relevanceScores[item.id] = item.relevanceScore;
|
|
299
|
+
}
|
|
300
|
+
return { context, totalTokens, relevanceScores };
|
|
301
|
+
}
|
|
302
|
+
// Relevance scoring methods
|
|
303
|
+
calculateFrameRelevance(frame, activeTasks, query) {
|
|
304
|
+
let score = 0.5; // Base relevance
|
|
305
|
+
// Higher score if frame contains active tasks
|
|
306
|
+
if (activeTasks.some((t) => t.frame_id === frame.frame_id)) {
|
|
307
|
+
score += 0.4;
|
|
308
|
+
}
|
|
309
|
+
// Query matching
|
|
310
|
+
if (query) {
|
|
311
|
+
const queryLower = query.toLowerCase();
|
|
312
|
+
if (frame.name.toLowerCase().includes(queryLower)) {
|
|
313
|
+
score += 0.3;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Recent frames get boost
|
|
317
|
+
const ageHours = (Date.now() / 1000 - frame.created_at) / 3600;
|
|
318
|
+
if (ageHours < 24)
|
|
319
|
+
score += 0.2;
|
|
320
|
+
return Math.min(score, 1.0);
|
|
321
|
+
}
|
|
322
|
+
calculateAnchorRelevance(anchor, activeTasks, query) {
|
|
323
|
+
let score = 0.3; // Base relevance
|
|
324
|
+
// Task-related anchors get priority
|
|
325
|
+
if (anchor.type === 'TODO')
|
|
326
|
+
score += 0.4;
|
|
327
|
+
if (anchor.type === 'DECISION')
|
|
328
|
+
score += 0.3;
|
|
329
|
+
if (anchor.type === 'CONSTRAINT')
|
|
330
|
+
score += 0.2;
|
|
331
|
+
// Priority-based boost
|
|
332
|
+
score += (anchor.priority / 10) * 0.2;
|
|
333
|
+
// Query matching
|
|
334
|
+
if (query) {
|
|
335
|
+
const queryLower = query.toLowerCase();
|
|
336
|
+
if (anchor.text.toLowerCase().includes(queryLower)) {
|
|
337
|
+
score += 0.3;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return Math.min(score, 1.0);
|
|
341
|
+
}
|
|
342
|
+
calculateEventRelevance(event, _activeTasks, _query) {
|
|
343
|
+
let score = 0.1; // Base relevance
|
|
344
|
+
// Event type relevance
|
|
345
|
+
if (event.event_type === 'decision')
|
|
346
|
+
score += 0.4;
|
|
347
|
+
if (event.event_type === 'tool_call')
|
|
348
|
+
score += 0.3;
|
|
349
|
+
if (event.event_type === 'observation')
|
|
350
|
+
score += 0.2;
|
|
351
|
+
// Recent events get boost
|
|
352
|
+
const ageHours = (Date.now() / 1000 - event.ts) / 3600;
|
|
353
|
+
if (ageHours < 1)
|
|
354
|
+
score += 0.3;
|
|
355
|
+
else if (ageHours < 6)
|
|
356
|
+
score += 0.2;
|
|
357
|
+
return Math.min(score, 1.0);
|
|
358
|
+
}
|
|
359
|
+
// Helper methods
|
|
360
|
+
getTask(taskId) {
|
|
361
|
+
const row = this.db
|
|
362
|
+
.prepare(`SELECT * FROM tasks WHERE task_id = ?`)
|
|
363
|
+
.get(taskId);
|
|
364
|
+
return row ? this.hydrateTask(row) : undefined;
|
|
365
|
+
}
|
|
366
|
+
getRelevantAnchors(frameIds, _request) {
|
|
367
|
+
if (frameIds.length === 0)
|
|
368
|
+
return [];
|
|
369
|
+
const placeholders = frameIds.map(() => '?').join(',');
|
|
370
|
+
const rows = this.db
|
|
371
|
+
.prepare(`
|
|
372
|
+
SELECT * FROM anchors
|
|
373
|
+
WHERE frame_id IN (${placeholders})
|
|
374
|
+
ORDER BY priority DESC, created_at DESC
|
|
375
|
+
LIMIT 20
|
|
376
|
+
`)
|
|
377
|
+
.all(...frameIds);
|
|
378
|
+
return rows.map((row) => ({
|
|
379
|
+
...row,
|
|
380
|
+
metadata: JSON.parse(row.metadata || '{}'),
|
|
381
|
+
}));
|
|
382
|
+
}
|
|
383
|
+
hydrateTasks(rows) {
|
|
384
|
+
return rows.map(this.hydrateTask);
|
|
385
|
+
}
|
|
386
|
+
hydrateTask = (row) => ({
|
|
387
|
+
...row,
|
|
388
|
+
depends_on: JSON.parse(row.depends_on || '[]'),
|
|
389
|
+
context_tags: JSON.parse(row.context_tags || '[]'),
|
|
390
|
+
metadata: JSON.parse(row.metadata || '{}'),
|
|
391
|
+
});
|
|
392
|
+
logContextAccess(data) {
|
|
393
|
+
const requestId = `ctx_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;
|
|
394
|
+
this.db
|
|
395
|
+
.prepare(`
|
|
396
|
+
INSERT INTO context_access_log (
|
|
397
|
+
request_id, task_ids, context_items, relevance_scores, total_tokens, query_hash
|
|
398
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
399
|
+
`)
|
|
400
|
+
.run(requestId, JSON.stringify(data.taskIds), JSON.stringify(data.contextItems), JSON.stringify(data.relevanceScores), data.totalTokens, this.hashString(data.query));
|
|
401
|
+
}
|
|
402
|
+
hashString(str) {
|
|
403
|
+
let hash = 0;
|
|
404
|
+
for (let i = 0; i < str.length; i++) {
|
|
405
|
+
const char = str.charCodeAt(i);
|
|
406
|
+
hash = (hash << 5) - hash + char;
|
|
407
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
408
|
+
}
|
|
409
|
+
return hash.toString(16);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=task-aware-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-aware-context.js","sourceRoot":"","sources":["../../../src/pebbles/task-aware-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task-Aware Context Assembly
|
|
3
|
+
* Intelligently selects context based on active tasks and their relationships
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
import { Frame, Anchor, Event, FrameManager } from './frame-manager.js';
|
|
7
|
+
export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'cancelled';
|
|
8
|
+
export type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';
|
|
9
|
+
export interface Task {
|
|
10
|
+
task_id: string;
|
|
11
|
+
frame_id: string;
|
|
12
|
+
anchor_id?: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
status: TaskStatus;
|
|
16
|
+
priority: TaskPriority;
|
|
17
|
+
parent_task_id?: string;
|
|
18
|
+
depends_on: string[];
|
|
19
|
+
assigned_to?: string;
|
|
20
|
+
estimated_effort?: number;
|
|
21
|
+
actual_effort?: number;
|
|
22
|
+
created_at: number;
|
|
23
|
+
started_at?: number;
|
|
24
|
+
completed_at?: number;
|
|
25
|
+
blocked_reason?: string;
|
|
26
|
+
context_tags: string[];
|
|
27
|
+
metadata: Record<string, any>;
|
|
28
|
+
}
|
|
29
|
+
export interface TaskContext {
|
|
30
|
+
activeTasks: Task[];
|
|
31
|
+
blockedTasks: Task[];
|
|
32
|
+
relatedContext: {
|
|
33
|
+
frames: Frame[];
|
|
34
|
+
anchors: Anchor[];
|
|
35
|
+
recentEvents: Event[];
|
|
36
|
+
};
|
|
37
|
+
contextScore: number;
|
|
38
|
+
}
|
|
39
|
+
export interface ContextRequest {
|
|
40
|
+
query?: string;
|
|
41
|
+
maxTokens?: number;
|
|
42
|
+
taskFocus?: string[];
|
|
43
|
+
includeHistory?: boolean;
|
|
44
|
+
priorityFilter?: TaskPriority[];
|
|
45
|
+
}
|
|
46
|
+
export declare class TaskAwareContextManager {
|
|
47
|
+
private db;
|
|
48
|
+
private frameManager;
|
|
49
|
+
private projectId;
|
|
50
|
+
constructor(db: Database.Database, frameManager: FrameManager, projectId: string);
|
|
51
|
+
private initializeTaskSchema;
|
|
52
|
+
/**
|
|
53
|
+
* Create task from TODO anchor or standalone
|
|
54
|
+
*/
|
|
55
|
+
createTask(options: {
|
|
56
|
+
name: string;
|
|
57
|
+
description?: string;
|
|
58
|
+
priority?: TaskPriority;
|
|
59
|
+
frameId?: string;
|
|
60
|
+
anchorId?: string;
|
|
61
|
+
parentTaskId?: string;
|
|
62
|
+
dependsOn?: string[];
|
|
63
|
+
contextTags?: string[];
|
|
64
|
+
estimatedEffort?: number;
|
|
65
|
+
metadata?: Record<string, any>;
|
|
66
|
+
}): string;
|
|
67
|
+
/**
|
|
68
|
+
* Update task status with automatic time tracking
|
|
69
|
+
*/
|
|
70
|
+
updateTaskStatus(taskId: string, newStatus: TaskStatus, reason?: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Assemble context optimized for active tasks and query
|
|
73
|
+
*/
|
|
74
|
+
assembleTaskAwareContext(request: ContextRequest): {
|
|
75
|
+
context: string;
|
|
76
|
+
metadata: {
|
|
77
|
+
includedTasks: Task[];
|
|
78
|
+
contextSources: string[];
|
|
79
|
+
totalTokens: number;
|
|
80
|
+
relevanceScores: Record<string, number>;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Get tasks that are currently active or should be in context
|
|
85
|
+
*/
|
|
86
|
+
private getActiveTasks;
|
|
87
|
+
private getBlockedTasks;
|
|
88
|
+
/**
|
|
89
|
+
* Select context items relevant to active tasks
|
|
90
|
+
*/
|
|
91
|
+
private selectRelevantContext;
|
|
92
|
+
private buildContextString;
|
|
93
|
+
private calculateFrameRelevance;
|
|
94
|
+
private calculateAnchorRelevance;
|
|
95
|
+
private calculateEventRelevance;
|
|
96
|
+
private getTask;
|
|
97
|
+
private getRelevantAnchors;
|
|
98
|
+
private hydrateTasks;
|
|
99
|
+
private hydrateTask;
|
|
100
|
+
private logContextAccess;
|
|
101
|
+
private hashString;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=task-aware-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-aware-context.d.ts","sourceRoot":"","sources":["../../src/task-aware-context.ts"],"names":[],"mappings":"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"}
|