@stackmemoryai/stackmemory 0.2.3 → 0.2.6

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.
Files changed (187) hide show
  1. package/README.md +108 -0
  2. package/dist/index.js +382 -0
  3. package/dist/src/analytics/api/analytics-api.d.ts +24 -0
  4. package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
  5. package/dist/src/analytics/api/analytics-api.js +279 -0
  6. package/dist/src/analytics/api/analytics-api.js.map +1 -0
  7. package/dist/src/analytics/core/analytics-service.d.ts +23 -0
  8. package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
  9. package/dist/src/analytics/core/analytics-service.js +160 -0
  10. package/dist/src/analytics/core/analytics-service.js.map +1 -0
  11. package/dist/src/analytics/index.d.ts +12 -0
  12. package/dist/src/analytics/index.d.ts.map +1 -0
  13. package/dist/src/analytics/index.js +11 -0
  14. package/dist/src/analytics/index.js.map +1 -0
  15. package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
  16. package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
  17. package/dist/src/analytics/queries/metrics-queries.js +179 -0
  18. package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
  19. package/dist/src/analytics/types/metrics.d.ts +60 -0
  20. package/dist/src/analytics/types/metrics.d.ts.map +1 -0
  21. package/dist/src/analytics/types/metrics.js +2 -0
  22. package/dist/src/analytics/types/metrics.js.map +1 -0
  23. package/dist/src/cli/analytics-viewer.d.ts +3 -0
  24. package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
  25. package/dist/src/cli/analytics-viewer.js +89 -0
  26. package/dist/src/cli/analytics-viewer.js.map +1 -0
  27. package/dist/src/cli/browser-test.d.ts +6 -0
  28. package/dist/src/cli/browser-test.d.ts.map +1 -0
  29. package/dist/src/cli/browser-test.js +32 -0
  30. package/dist/src/cli/browser-test.js.map +1 -0
  31. package/dist/src/cli/cli.js +233 -1
  32. package/dist/src/cli/cli.js.map +1 -1
  33. package/dist/src/cli/commands/projects.d.ts +8 -0
  34. package/dist/src/cli/commands/projects.d.ts.map +1 -0
  35. package/dist/src/cli/commands/projects.js +220 -0
  36. package/dist/src/cli/commands/projects.js.map +1 -0
  37. package/dist/src/cli/index.d.ts +7 -0
  38. package/dist/src/cli/index.d.ts.map +1 -0
  39. package/dist/src/cli/index.js +704 -0
  40. package/dist/src/cli/index.js.map +1 -0
  41. package/dist/src/cli/project-commands.d.ts +8 -0
  42. package/dist/src/cli/project-commands.d.ts.map +1 -0
  43. package/dist/src/cli/project-commands.js +212 -0
  44. package/dist/src/cli/project-commands.js.map +1 -0
  45. package/dist/src/cli/utils/viewer.d.ts +3 -0
  46. package/dist/src/cli/utils/viewer.d.ts.map +1 -0
  47. package/dist/src/cli/utils/viewer.js +89 -0
  48. package/dist/src/cli/utils/viewer.js.map +1 -0
  49. package/dist/src/core/context/frame-manager.d.ts +106 -0
  50. package/dist/src/core/context/frame-manager.d.ts.map +1 -0
  51. package/dist/src/core/context/frame-manager.js +387 -0
  52. package/dist/src/core/context/frame-manager.js.map +1 -0
  53. package/dist/src/core/logger.test.js +1 -1
  54. package/dist/src/core/logger.test.js.map +1 -1
  55. package/dist/src/core/monitoring/error-handler.d.ts +46 -0
  56. package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
  57. package/dist/src/core/monitoring/error-handler.js +212 -0
  58. package/dist/src/core/monitoring/error-handler.js.map +1 -0
  59. package/dist/src/core/monitoring/logger.d.ts +24 -0
  60. package/dist/src/core/monitoring/logger.d.ts.map +1 -0
  61. package/dist/src/core/monitoring/logger.js +121 -0
  62. package/dist/src/core/monitoring/logger.js.map +1 -0
  63. package/dist/src/core/monitoring/metrics.d.ts +7 -0
  64. package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
  65. package/dist/src/core/monitoring/metrics.js +13 -0
  66. package/dist/src/core/monitoring/metrics.js.map +1 -0
  67. package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
  68. package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
  69. package/dist/src/core/monitoring/progress-tracker.js +178 -0
  70. package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
  71. package/dist/src/core/progress-tracker.d.ts +95 -0
  72. package/dist/src/core/progress-tracker.d.ts.map +1 -0
  73. package/dist/src/core/progress-tracker.js +178 -0
  74. package/dist/src/core/progress-tracker.js.map +1 -0
  75. package/dist/src/core/project-manager.d.ts +130 -0
  76. package/dist/src/core/project-manager.d.ts.map +1 -0
  77. package/dist/src/core/project-manager.js +582 -0
  78. package/dist/src/core/project-manager.js.map +1 -0
  79. package/dist/src/core/projects/project-manager.d.ts +130 -0
  80. package/dist/src/core/projects/project-manager.d.ts.map +1 -0
  81. package/dist/src/core/projects/project-manager.js +591 -0
  82. package/dist/src/core/projects/project-manager.js.map +1 -0
  83. package/dist/src/core/update-checker.d.ts +38 -0
  84. package/dist/src/core/update-checker.d.ts.map +1 -0
  85. package/dist/src/core/update-checker.js +156 -0
  86. package/dist/src/core/update-checker.js.map +1 -0
  87. package/dist/src/core/utils/update-checker.d.ts +38 -0
  88. package/dist/src/core/utils/update-checker.d.ts.map +1 -0
  89. package/dist/src/core/utils/update-checker.js +156 -0
  90. package/dist/src/core/utils/update-checker.js.map +1 -0
  91. package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
  92. package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
  93. package/dist/src/features/analytics/api/analytics-api.js +289 -0
  94. package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
  95. package/dist/src/features/analytics/core/analytics-service.d.ts +23 -0
  96. package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
  97. package/dist/src/features/analytics/core/analytics-service.js +160 -0
  98. package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
  99. package/dist/src/features/analytics/index.d.ts +12 -0
  100. package/dist/src/features/analytics/index.d.ts.map +1 -0
  101. package/dist/src/features/analytics/index.js +11 -0
  102. package/dist/src/features/analytics/index.js.map +1 -0
  103. package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
  104. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
  105. package/dist/src/features/analytics/queries/metrics-queries.js +183 -0
  106. package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
  107. package/dist/src/features/analytics/types/metrics.d.ts +60 -0
  108. package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
  109. package/dist/src/features/analytics/types/metrics.js +2 -0
  110. package/dist/src/features/analytics/types/metrics.js.map +1 -0
  111. package/dist/src/features/browser/browser-mcp.d.ts +94 -0
  112. package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
  113. package/dist/src/features/browser/browser-mcp.js +456 -0
  114. package/dist/src/features/browser/browser-mcp.js.map +1 -0
  115. package/dist/src/features/tasks/pebbles-task-store.d.ts +117 -0
  116. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
  117. package/dist/src/features/tasks/pebbles-task-store.js +335 -0
  118. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
  119. package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
  120. package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
  121. package/dist/src/features/tasks/task-aware-context.js +412 -0
  122. package/dist/src/features/tasks/task-aware-context.js.map +1 -0
  123. package/dist/src/index.d.ts +4 -4
  124. package/dist/src/index.d.ts.map +1 -1
  125. package/dist/src/index.js +4 -4
  126. package/dist/src/index.js.map +1 -1
  127. package/dist/src/integrations/browser-mcp.d.ts +94 -0
  128. package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
  129. package/dist/src/integrations/browser-mcp.js +431 -0
  130. package/dist/src/integrations/browser-mcp.js.map +1 -0
  131. package/dist/src/integrations/linear/auth.d.ts +99 -0
  132. package/dist/src/integrations/linear/auth.d.ts.map +1 -0
  133. package/dist/src/integrations/linear/auth.js +319 -0
  134. package/dist/src/integrations/linear/auth.js.map +1 -0
  135. package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
  136. package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
  137. package/dist/src/integrations/linear/auto-sync.js +268 -0
  138. package/dist/src/integrations/linear/auto-sync.js.map +1 -0
  139. package/dist/src/integrations/linear/client.d.ts +86 -0
  140. package/dist/src/integrations/linear/client.d.ts.map +1 -0
  141. package/dist/src/integrations/linear/client.js +277 -0
  142. package/dist/src/integrations/linear/client.js.map +1 -0
  143. package/dist/src/integrations/linear/config.d.ts +51 -0
  144. package/dist/src/integrations/linear/config.d.ts.map +1 -0
  145. package/dist/src/integrations/linear/config.js +103 -0
  146. package/dist/src/integrations/linear/config.js.map +1 -0
  147. package/dist/src/integrations/linear/sync.d.ts +97 -0
  148. package/dist/src/integrations/linear/sync.d.ts.map +1 -0
  149. package/dist/src/integrations/linear/sync.js +391 -0
  150. package/dist/src/integrations/linear/sync.js.map +1 -0
  151. package/dist/src/integrations/mcp/server.d.ts +40 -0
  152. package/dist/src/integrations/mcp/server.d.ts.map +1 -0
  153. package/dist/src/integrations/mcp/server.js +828 -0
  154. package/dist/src/integrations/mcp/server.js.map +1 -0
  155. package/dist/src/mcp/mcp-server.d.ts +2 -0
  156. package/dist/src/mcp/mcp-server.d.ts.map +1 -1
  157. package/dist/src/mcp/mcp-server.js +16 -0
  158. package/dist/src/mcp/mcp-server.js.map +1 -1
  159. package/dist/src/railway/index.d.ts +7 -0
  160. package/dist/src/railway/index.d.ts.map +1 -0
  161. package/dist/src/railway/index.js +401 -0
  162. package/dist/src/railway/index.js.map +1 -0
  163. package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
  164. package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
  165. package/dist/src/runway/auth/auth-middleware.js +337 -0
  166. package/dist/src/runway/auth/auth-middleware.js.map +1 -0
  167. package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
  168. package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
  169. package/dist/src/runway/server/runway-mcp-server.js +601 -0
  170. package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
  171. package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
  172. package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
  173. package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
  174. package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
  175. package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
  176. package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
  177. package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
  178. package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
  179. package/dist/src/servers/production/auth-middleware.d.ts +66 -0
  180. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
  181. package/dist/src/servers/production/auth-middleware.js +346 -0
  182. package/dist/src/servers/production/auth-middleware.js.map +1 -0
  183. package/dist/src/servers/railway/index.d.ts +7 -0
  184. package/dist/src/servers/railway/index.d.ts.map +1 -0
  185. package/dist/src/servers/railway/index.js +401 -0
  186. package/dist/src/servers/railway/index.js.map +1 -0
  187. package/package.json +27 -5
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Pebbles Task Storage
3
+ * Git-native JSONL storage with SQLite cache for tasks
4
+ */
5
+ import { createHash } from 'crypto';
6
+ import { appendFile, existsSync, mkdirSync, readFileSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { logger } from '../../core/monitoring/logger.js';
9
+ export class PebblesTaskStore {
10
+ db;
11
+ projectRoot;
12
+ tasksFile;
13
+ cacheFile;
14
+ constructor(projectRoot, db) {
15
+ this.projectRoot = projectRoot;
16
+ this.db = db;
17
+ // Ensure .stackmemory directory exists
18
+ const stackmemoryDir = join(projectRoot, '.stackmemory');
19
+ if (!existsSync(stackmemoryDir)) {
20
+ mkdirSync(stackmemoryDir, { recursive: true });
21
+ }
22
+ this.tasksFile = join(stackmemoryDir, 'tasks.jsonl');
23
+ this.cacheFile = join(stackmemoryDir, 'cache.db');
24
+ this.initializeCache();
25
+ this.loadFromJSONL();
26
+ }
27
+ initializeCache() {
28
+ this.db.exec(`
29
+ CREATE TABLE IF NOT EXISTS task_cache (
30
+ id TEXT PRIMARY KEY,
31
+ type TEXT NOT NULL,
32
+ timestamp INTEGER NOT NULL,
33
+ parent_id TEXT,
34
+ frame_id TEXT NOT NULL,
35
+ title TEXT NOT NULL,
36
+ description TEXT,
37
+ status TEXT NOT NULL,
38
+ priority TEXT NOT NULL,
39
+ assignee TEXT,
40
+ created_at INTEGER NOT NULL,
41
+ started_at INTEGER,
42
+ completed_at INTEGER,
43
+ estimated_effort INTEGER,
44
+ actual_effort INTEGER,
45
+ depends_on TEXT DEFAULT '[]',
46
+ blocks TEXT DEFAULT '[]',
47
+ tags TEXT DEFAULT '[]',
48
+ external_refs TEXT DEFAULT '{}',
49
+ context_score REAL DEFAULT 0.5,
50
+ last_accessed INTEGER
51
+ );
52
+
53
+ CREATE INDEX IF NOT EXISTS idx_task_status ON task_cache(status);
54
+ CREATE INDEX IF NOT EXISTS idx_task_priority ON task_cache(priority);
55
+ CREATE INDEX IF NOT EXISTS idx_task_frame ON task_cache(frame_id);
56
+ CREATE INDEX IF NOT EXISTS idx_task_timestamp ON task_cache(timestamp);
57
+ CREATE INDEX IF NOT EXISTS idx_task_parent ON task_cache(parent_id);
58
+ `);
59
+ }
60
+ /**
61
+ * Load existing tasks from JSONL into SQLite cache
62
+ */
63
+ loadFromJSONL() {
64
+ if (!existsSync(this.tasksFile))
65
+ return;
66
+ const content = readFileSync(this.tasksFile, 'utf-8');
67
+ const lines = content.split('\n').filter((line) => line.trim());
68
+ let loaded = 0;
69
+ for (const line of lines) {
70
+ try {
71
+ const task = JSON.parse(line);
72
+ this.upsertToCache(task);
73
+ loaded++;
74
+ }
75
+ catch (error) {
76
+ logger.warn('Failed to parse task line', { line, error });
77
+ }
78
+ }
79
+ logger.info('Loaded tasks from JSONL', { loaded, file: this.tasksFile });
80
+ }
81
+ /**
82
+ * Create a new task with content-hash ID
83
+ */
84
+ createTask(options) {
85
+ const now = Math.floor(Date.now() / 1000);
86
+ // Create content for hash (ensures deterministic ID)
87
+ const content = `${options.title}:${options.frameId}:${now}:${Math.random()}`;
88
+ const id = this.generateTaskId(content);
89
+ const task = {
90
+ id,
91
+ type: 'task_create',
92
+ timestamp: now,
93
+ parent_id: options.parentId,
94
+ frame_id: options.frameId,
95
+ title: options.title,
96
+ description: options.description,
97
+ status: 'pending',
98
+ priority: options.priority || 'medium',
99
+ assignee: options.assignee,
100
+ created_at: now,
101
+ estimated_effort: options.estimatedEffort,
102
+ depends_on: options.dependsOn || [],
103
+ blocks: [],
104
+ tags: options.tags || [],
105
+ context_score: 0.5,
106
+ };
107
+ this.appendTask(task);
108
+ return id;
109
+ }
110
+ /**
111
+ * Update task status with new event
112
+ */
113
+ updateTaskStatus(taskId, newStatus, _reason) {
114
+ const existing = this.getTask(taskId);
115
+ if (!existing)
116
+ throw new Error(`Task not found: ${taskId}`);
117
+ const now = Math.floor(Date.now() / 1000);
118
+ const updates = {
119
+ status: newStatus,
120
+ timestamp: now,
121
+ };
122
+ // Automatic time tracking
123
+ if (newStatus === 'in_progress' && existing.status === 'pending') {
124
+ updates.started_at = now;
125
+ updates.type = 'task_update';
126
+ }
127
+ else if (newStatus === 'completed' && existing.status === 'in_progress') {
128
+ updates.completed_at = now;
129
+ updates.type = 'task_complete';
130
+ if (existing.started_at) {
131
+ updates.actual_effort = Math.floor((now - existing.started_at) / 60); // Minutes
132
+ }
133
+ }
134
+ else if (newStatus === 'blocked') {
135
+ updates.type = 'task_block';
136
+ }
137
+ const updatedTask = { ...existing, ...updates };
138
+ this.appendTask(updatedTask);
139
+ }
140
+ /**
141
+ * Add dependency relationship
142
+ */
143
+ addDependency(taskId, dependsOnId) {
144
+ const task = this.getTask(taskId);
145
+ const dependsOnTask = this.getTask(dependsOnId);
146
+ if (!task)
147
+ throw new Error(`Task not found: ${taskId}`);
148
+ if (!dependsOnTask)
149
+ throw new Error(`Dependency task not found: ${dependsOnId}`);
150
+ // Update task dependencies
151
+ const updatedTask = {
152
+ ...task,
153
+ depends_on: [...new Set([...task.depends_on, dependsOnId])],
154
+ timestamp: Math.floor(Date.now() / 1000),
155
+ type: 'task_update',
156
+ };
157
+ // Update blocking task
158
+ const updatedBlockingTask = {
159
+ ...dependsOnTask,
160
+ blocks: [...new Set([...dependsOnTask.blocks, taskId])],
161
+ timestamp: Math.floor(Date.now() / 1000),
162
+ type: 'task_update',
163
+ };
164
+ this.appendTask(updatedTask);
165
+ this.appendTask(updatedBlockingTask);
166
+ }
167
+ /**
168
+ * Get current active tasks
169
+ */
170
+ getActiveTasks(frameId) {
171
+ let query = `
172
+ SELECT * FROM task_cache
173
+ WHERE status IN ('pending', 'in_progress')
174
+ `;
175
+ const params = [];
176
+ if (frameId) {
177
+ query += ` AND frame_id = ?`;
178
+ params.push(frameId);
179
+ }
180
+ query += ` ORDER BY priority DESC, created_at ASC`;
181
+ const rows = this.db.prepare(query).all(...params);
182
+ return this.hydrateTasks(rows);
183
+ }
184
+ /**
185
+ * Get task by ID (latest version)
186
+ */
187
+ getTask(taskId) {
188
+ const row = this.db
189
+ .prepare(`
190
+ SELECT * FROM task_cache WHERE id = ?
191
+ `)
192
+ .get(taskId);
193
+ return row ? this.hydrateTask(row) : undefined;
194
+ }
195
+ /**
196
+ * Get tasks that are blocking other tasks
197
+ */
198
+ getBlockingTasks() {
199
+ const rows = this.db
200
+ .prepare(`
201
+ SELECT * FROM task_cache
202
+ WHERE JSON_ARRAY_LENGTH(blocks) > 0
203
+ AND status NOT IN ('completed', 'cancelled')
204
+ ORDER BY priority DESC
205
+ `)
206
+ .all();
207
+ return this.hydrateTasks(rows);
208
+ }
209
+ /**
210
+ * Get metrics for current project
211
+ */
212
+ getMetrics() {
213
+ const statusCounts = this.db
214
+ .prepare(`
215
+ SELECT status, COUNT(*) as count
216
+ FROM task_cache
217
+ GROUP BY status
218
+ `)
219
+ .all();
220
+ const priorityCounts = this.db
221
+ .prepare(`
222
+ SELECT priority, COUNT(*) as count
223
+ FROM task_cache
224
+ GROUP BY priority
225
+ `)
226
+ .all();
227
+ const totalTasks = statusCounts.reduce((sum, s) => sum + s.count, 0);
228
+ const completedTasks = statusCounts.find((s) => s.status === 'completed')?.count || 0;
229
+ const blockedTasks = statusCounts.find((s) => s.status === 'blocked')?.count || 0;
230
+ // Calculate effort accuracy
231
+ const effortRows = this.db
232
+ .prepare(`
233
+ SELECT estimated_effort, actual_effort
234
+ FROM task_cache
235
+ WHERE estimated_effort IS NOT NULL
236
+ AND actual_effort IS NOT NULL
237
+ `)
238
+ .all();
239
+ let avgEffortAccuracy = 0;
240
+ if (effortRows.length > 0) {
241
+ const accuracies = effortRows.map((r) => 1 -
242
+ Math.abs(r.estimated_effort - r.actual_effort) /
243
+ Math.max(r.estimated_effort, 1));
244
+ avgEffortAccuracy =
245
+ accuracies.reduce((sum, acc) => sum + acc, 0) / accuracies.length;
246
+ }
247
+ return {
248
+ total_tasks: totalTasks,
249
+ by_status: Object.fromEntries(statusCounts.map((s) => [s.status, s.count])),
250
+ by_priority: Object.fromEntries(priorityCounts.map((p) => [p.priority, p.count])),
251
+ completion_rate: totalTasks > 0 ? completedTasks / totalTasks : 0,
252
+ avg_effort_accuracy: avgEffortAccuracy,
253
+ blocked_tasks: blockedTasks,
254
+ overdue_tasks: 0, // TODO: implement due dates
255
+ };
256
+ }
257
+ /**
258
+ * Export tasks for Linear integration (Phase 2)
259
+ */
260
+ exportForLinear() {
261
+ const tasks = this.db
262
+ .prepare(`
263
+ SELECT * FROM task_cache
264
+ WHERE external_refs IS NULL OR JSON_EXTRACT(external_refs, '$.linear') IS NULL
265
+ ORDER BY created_at ASC
266
+ `)
267
+ .all();
268
+ return tasks.map((task) => ({
269
+ title: task.title,
270
+ description: task.description,
271
+ priority: this.mapPriorityToLinear(task.priority),
272
+ status: this.mapStatusToLinear(task.status),
273
+ estimate: task.estimated_effort,
274
+ dependencies: JSON.parse(task.depends_on || '[]'),
275
+ }));
276
+ }
277
+ // Private methods
278
+ appendTask(task) {
279
+ // Append to JSONL file (git-tracked source of truth)
280
+ const jsonLine = JSON.stringify(task) + '\n';
281
+ appendFile(this.tasksFile, jsonLine, (err) => {
282
+ if (err)
283
+ logger.error(`Failed to append task ${task.id} to JSONL: ${err.message}`);
284
+ });
285
+ // Update SQLite cache (for fast queries)
286
+ this.upsertToCache(task);
287
+ logger.info('Appended task', {
288
+ id: task.id,
289
+ type: task.type,
290
+ title: task.title,
291
+ status: task.status,
292
+ });
293
+ }
294
+ upsertToCache(task) {
295
+ this.db
296
+ .prepare(`
297
+ INSERT OR REPLACE INTO task_cache (
298
+ id, type, timestamp, parent_id, frame_id, title, description,
299
+ status, priority, assignee, created_at, started_at, completed_at,
300
+ estimated_effort, actual_effort, depends_on, blocks, tags,
301
+ external_refs, context_score, last_accessed
302
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
303
+ `)
304
+ .run(task.id, task.type, task.timestamp, task.parent_id, task.frame_id, task.title, task.description, task.status, task.priority, task.assignee, task.created_at, task.started_at, task.completed_at, task.estimated_effort, task.actual_effort, JSON.stringify(task.depends_on), JSON.stringify(task.blocks), JSON.stringify(task.tags), JSON.stringify(task.external_refs || {}), task.context_score, task.last_accessed);
305
+ }
306
+ generateTaskId(content) {
307
+ const hash = createHash('sha256').update(content).digest('hex');
308
+ return `tsk-${hash.substring(0, 8)}`;
309
+ }
310
+ hydrateTask = (row) => ({
311
+ ...row,
312
+ depends_on: JSON.parse(row.depends_on || '[]'),
313
+ blocks: JSON.parse(row.blocks || '[]'),
314
+ tags: JSON.parse(row.tags || '[]'),
315
+ external_refs: JSON.parse(row.external_refs || '{}'),
316
+ });
317
+ hydrateTasks(rows) {
318
+ return rows.map(this.hydrateTask);
319
+ }
320
+ mapPriorityToLinear(priority) {
321
+ const map = { low: 1, medium: 2, high: 3, urgent: 4 };
322
+ return map[priority] || 2;
323
+ }
324
+ mapStatusToLinear(status) {
325
+ const map = {
326
+ pending: 'Backlog',
327
+ in_progress: 'In Progress',
328
+ completed: 'Done',
329
+ blocked: 'Blocked',
330
+ cancelled: 'Cancelled',
331
+ };
332
+ return map[status] || 'Backlog';
333
+ }
334
+ }
335
+ //# sourceMappingURL=pebbles-task-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pebbles-task-store.js","sourceRoot":"","sources":["../../../../src/features/tasks/pebbles-task-store.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 '../../core/context/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/features/tasks/task-aware-context.ts"],"names":[],"mappings":"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"}