@stackmemoryai/stackmemory 0.3.3 → 0.3.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.
- package/README.md +19 -18
- package/dist/cli/commands/chromadb.js +267 -0
- package/dist/cli/commands/chromadb.js.map +7 -0
- package/dist/cli/commands/context.js +15 -5
- package/dist/cli/commands/context.js.map +2 -2
- package/dist/cli/commands/infinite-storage.js +240 -0
- package/dist/cli/commands/infinite-storage.js.map +7 -0
- package/dist/cli/commands/skills.js +262 -0
- package/dist/cli/commands/skills.js.map +7 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +2 -2
- package/dist/core/context/frame-handoff-manager.js +399 -9
- package/dist/core/context/frame-handoff-manager.js.map +2 -2
- package/dist/core/context/frame-manager.js +11 -2
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/storage/chromadb-adapter.js +346 -0
- package/dist/core/storage/chromadb-adapter.js.map +7 -0
- package/dist/core/storage/chromadb-simple.js +160 -0
- package/dist/core/storage/chromadb-simple.js.map +7 -0
- package/dist/core/storage/infinite-storage.js +443 -0
- package/dist/core/storage/infinite-storage.js.map +7 -0
- package/dist/core/utils/compression.js +79 -0
- package/dist/core/utils/compression.js.map +7 -0
- package/dist/features/tui/services/data-service.js +12 -40
- package/dist/features/tui/services/data-service.js.map +2 -2
- package/dist/features/tui/services/linear-task-reader.js +100 -0
- package/dist/features/tui/services/linear-task-reader.js.map +7 -0
- package/dist/features/web/client/stores/task-store.js +22 -0
- package/dist/features/web/client/stores/task-store.js.map +7 -0
- package/dist/features/web/server/index.js +171 -0
- package/dist/features/web/server/index.js.map +7 -0
- package/dist/skills/claude-skills.js +712 -0
- package/dist/skills/claude-skills.js.map +7 -0
- package/dist/skills/dashboard-launcher.js +212 -0
- package/dist/skills/dashboard-launcher.js.map +7 -0
- package/package.json +23 -31
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { createServer } from "http";
|
|
3
|
+
import { Server as SocketServer } from "socket.io";
|
|
4
|
+
import cors from "cors";
|
|
5
|
+
import { LinearTaskReader } from "../../tui/services/linear-task-reader.js";
|
|
6
|
+
import { SessionManager } from "../../../core/session/session-manager.js";
|
|
7
|
+
import { FrameManager } from "../../../core/context/frame-manager.js";
|
|
8
|
+
import Database from "better-sqlite3";
|
|
9
|
+
import { existsSync } from "fs";
|
|
10
|
+
import { join } from "path";
|
|
11
|
+
const app = express();
|
|
12
|
+
const httpServer = createServer(app);
|
|
13
|
+
const io = new SocketServer(httpServer, {
|
|
14
|
+
cors: {
|
|
15
|
+
origin: process.env.CLIENT_URL || "http://localhost:3000",
|
|
16
|
+
methods: ["GET", "POST"]
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
app.use(cors());
|
|
20
|
+
app.use(express.json());
|
|
21
|
+
let taskReader;
|
|
22
|
+
let sessionManager;
|
|
23
|
+
let frameManager = null;
|
|
24
|
+
let db = null;
|
|
25
|
+
function initializeServices() {
|
|
26
|
+
console.log("\u{1F680} Initializing StackMemory Web Server...");
|
|
27
|
+
taskReader = new LinearTaskReader(process.cwd());
|
|
28
|
+
console.log(`\u{1F4CB} TaskReader initialized with ${taskReader.getTasks().length} tasks`);
|
|
29
|
+
sessionManager = new SessionManager({ enableMonitoring: true });
|
|
30
|
+
console.log("\u{1F4CA} SessionManager initialized");
|
|
31
|
+
const dbPath = join(process.cwd(), ".stackmemory", "context.db");
|
|
32
|
+
if (existsSync(dbPath)) {
|
|
33
|
+
try {
|
|
34
|
+
db = new Database(dbPath);
|
|
35
|
+
frameManager = new FrameManager(db, "web");
|
|
36
|
+
console.log("\u{1F4BE} Database and FrameManager initialized");
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error("\u274C Failed to initialize database:", error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
app.get("/api/health", (req, res) => {
|
|
43
|
+
res.json({ status: "ok", timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
44
|
+
});
|
|
45
|
+
app.get("/api/tasks", (req, res) => {
|
|
46
|
+
try {
|
|
47
|
+
const tasks = taskReader.getTasks();
|
|
48
|
+
res.json({ tasks, total: tasks.length });
|
|
49
|
+
} catch (error) {
|
|
50
|
+
res.status(500).json({ error: "Failed to fetch tasks" });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
app.get("/api/tasks/active", (req, res) => {
|
|
54
|
+
try {
|
|
55
|
+
const tasks = taskReader.getActiveTasks();
|
|
56
|
+
res.json({ tasks, total: tasks.length });
|
|
57
|
+
} catch (error) {
|
|
58
|
+
res.status(500).json({ error: "Failed to fetch active tasks" });
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
app.get("/api/tasks/by-state/:state", (req, res) => {
|
|
62
|
+
try {
|
|
63
|
+
const tasks = taskReader.getTasksByState(req.params.state);
|
|
64
|
+
res.json({ tasks, total: tasks.length });
|
|
65
|
+
} catch (error) {
|
|
66
|
+
res.status(500).json({ error: "Failed to fetch tasks by state" });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
app.get("/api/sessions", (req, res) => {
|
|
70
|
+
try {
|
|
71
|
+
const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];
|
|
72
|
+
res.json({ sessions, total: sessions.length });
|
|
73
|
+
} catch (error) {
|
|
74
|
+
res.status(500).json({ error: "Failed to fetch sessions" });
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
app.get("/api/frames", (req, res) => {
|
|
78
|
+
try {
|
|
79
|
+
if (!frameManager) {
|
|
80
|
+
res.json({ frames: [], total: 0 });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const frames = frameManager.getAllFrames();
|
|
84
|
+
res.json({ frames, total: frames.length });
|
|
85
|
+
} catch (error) {
|
|
86
|
+
res.status(500).json({ error: "Failed to fetch frames" });
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
app.get("/api/analytics", (req, res) => {
|
|
90
|
+
try {
|
|
91
|
+
const tasks = taskReader.getTasks();
|
|
92
|
+
const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];
|
|
93
|
+
const frames = frameManager?.getAllFrames() || [];
|
|
94
|
+
const analytics = {
|
|
95
|
+
summary: {
|
|
96
|
+
totalTasks: tasks.length,
|
|
97
|
+
activeTasks: tasks.filter((t) => t.state === "In Progress").length,
|
|
98
|
+
completedTasks: tasks.filter((t) => t.state === "Done").length,
|
|
99
|
+
totalSessions: sessions.length,
|
|
100
|
+
totalFrames: frames.length
|
|
101
|
+
},
|
|
102
|
+
tasksByState: tasks.reduce((acc, task) => {
|
|
103
|
+
acc[task.state] = (acc[task.state] || 0) + 1;
|
|
104
|
+
return acc;
|
|
105
|
+
}, {}),
|
|
106
|
+
tasksByPriority: tasks.reduce((acc, task) => {
|
|
107
|
+
const priority = task.priority || 4;
|
|
108
|
+
acc[priority] = (acc[priority] || 0) + 1;
|
|
109
|
+
return acc;
|
|
110
|
+
}, {}),
|
|
111
|
+
recentActivity: {
|
|
112
|
+
tasksUpdatedToday: tasks.filter((t) => {
|
|
113
|
+
const updated = new Date(t.updatedAt);
|
|
114
|
+
const today = /* @__PURE__ */ new Date();
|
|
115
|
+
return updated.toDateString() === today.toDateString();
|
|
116
|
+
}).length,
|
|
117
|
+
sessionsToday: sessions.filter((s) => {
|
|
118
|
+
const started = new Date(s.startTime);
|
|
119
|
+
const today = /* @__PURE__ */ new Date();
|
|
120
|
+
return started.toDateString() === today.toDateString();
|
|
121
|
+
}).length
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
res.json(analytics);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
res.status(500).json({ error: "Failed to fetch analytics" });
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
io.on("connection", (socket) => {
|
|
130
|
+
console.log("\u{1F464} Client connected:", socket.id);
|
|
131
|
+
socket.emit("initial-data", {
|
|
132
|
+
tasks: taskReader.getTasks(),
|
|
133
|
+
sessions: sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [],
|
|
134
|
+
frames: frameManager?.getAllFrames() || []
|
|
135
|
+
});
|
|
136
|
+
socket.on("refresh-tasks", () => {
|
|
137
|
+
socket.emit("tasks:update", taskReader.getTasks());
|
|
138
|
+
});
|
|
139
|
+
socket.on("refresh-sessions", () => {
|
|
140
|
+
const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];
|
|
141
|
+
socket.emit("sessions:update", sessions);
|
|
142
|
+
});
|
|
143
|
+
socket.on("refresh-frames", () => {
|
|
144
|
+
socket.emit("frames:update", frameManager?.getAllFrames() || []);
|
|
145
|
+
});
|
|
146
|
+
socket.on("disconnect", () => {
|
|
147
|
+
console.log("\u{1F44B} Client disconnected:", socket.id);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
setInterval(() => {
|
|
151
|
+
try {
|
|
152
|
+
io.emit("tasks:update", taskReader.getTasks());
|
|
153
|
+
const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];
|
|
154
|
+
io.emit("sessions:update", sessions);
|
|
155
|
+
io.emit("frames:update", frameManager?.getAllFrames() || []);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error("Error in periodic update:", error);
|
|
158
|
+
}
|
|
159
|
+
}, 5e3);
|
|
160
|
+
const PORT = process.env.WS_PORT || 8080;
|
|
161
|
+
initializeServices();
|
|
162
|
+
httpServer.listen(PORT, () => {
|
|
163
|
+
console.log(`
|
|
164
|
+
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
|
|
165
|
+
\u2551 StackMemory Web Dashboard Server \u2551
|
|
166
|
+
\u2551 Running on http://localhost:${PORT} \u2551
|
|
167
|
+
\u2551 WebSocket: ws://localhost:${PORT} \u2551
|
|
168
|
+
\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
|
|
169
|
+
`);
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/web/server/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * StackMemory Web Dashboard Server\n * Express + Socket.io server for real-time dashboard\n */\n\nimport express from 'express';\nimport { createServer } from 'http';\nimport { Server as SocketServer } from 'socket.io';\nimport cors from 'cors';\nimport { LinearTaskReader } from '../../tui/services/linear-task-reader.js';\nimport { SessionManager } from '../../../core/session/session-manager.js';\nimport { FrameManager } from '../../../core/context/frame-manager.js';\nimport Database from 'better-sqlite3';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nconst app = express();\nconst httpServer = createServer(app);\nconst io = new SocketServer(httpServer, {\n cors: {\n origin: process.env.CLIENT_URL || 'http://localhost:3000',\n methods: ['GET', 'POST'],\n },\n});\n\n// Middleware\napp.use(cors());\napp.use(express.json());\n\n// Data services\nlet taskReader: LinearTaskReader;\nlet sessionManager: SessionManager;\nlet frameManager: FrameManager | null = null;\nlet db: Database.Database | null = null;\n\n// Initialize services\nfunction initializeServices() {\n console.log('\uD83D\uDE80 Initializing StackMemory Web Server...');\n \n // Initialize task reader\n taskReader = new LinearTaskReader(process.cwd());\n console.log(`\uD83D\uDCCB TaskReader initialized with ${taskReader.getTasks().length} tasks`);\n \n // Initialize session manager\n sessionManager = new SessionManager({ enableMonitoring: true });\n console.log('\uD83D\uDCCA SessionManager initialized');\n \n // Initialize database and frame manager\n const dbPath = join(process.cwd(), '.stackmemory', 'context.db');\n if (existsSync(dbPath)) {\n try {\n db = new Database(dbPath);\n frameManager = new FrameManager(db, 'web');\n console.log('\uD83D\uDCBE Database and FrameManager initialized');\n } catch (error) {\n console.error('\u274C Failed to initialize database:', error);\n }\n }\n}\n\n// REST API Routes\napp.get('/api/health', (req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\napp.get('/api/tasks', (req, res) => {\n try {\n const tasks = taskReader.getTasks();\n res.json({ tasks, total: tasks.length });\n } catch (error) {\n res.status(500).json({ error: 'Failed to fetch tasks' });\n }\n});\n\napp.get('/api/tasks/active', (req, res) => {\n try {\n const tasks = taskReader.getActiveTasks();\n res.json({ tasks, total: tasks.length });\n } catch (error) {\n res.status(500).json({ error: 'Failed to fetch active tasks' });\n }\n});\n\napp.get('/api/tasks/by-state/:state', (req, res) => {\n try {\n const tasks = taskReader.getTasksByState(req.params.state);\n res.json({ tasks, total: tasks.length });\n } catch (error) {\n res.status(500).json({ error: 'Failed to fetch tasks by state' });\n }\n});\n\napp.get('/api/sessions', (req, res) => {\n try {\n const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];\n res.json({ sessions, total: sessions.length });\n } catch (error) {\n res.status(500).json({ error: 'Failed to fetch sessions' });\n }\n});\n\napp.get('/api/frames', (req, res) => {\n try {\n if (!frameManager) {\n res.json({ frames: [], total: 0 });\n return;\n }\n const frames = frameManager.getAllFrames();\n res.json({ frames, total: frames.length });\n } catch (error) {\n res.status(500).json({ error: 'Failed to fetch frames' });\n }\n});\n\napp.get('/api/analytics', (req, res) => {\n try {\n const tasks = taskReader.getTasks();\n const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];\n const frames = frameManager?.getAllFrames() || [];\n \n // Calculate analytics\n const analytics = {\n summary: {\n totalTasks: tasks.length,\n activeTasks: tasks.filter(t => t.state === 'In Progress').length,\n completedTasks: tasks.filter(t => t.state === 'Done').length,\n totalSessions: sessions.length,\n totalFrames: frames.length,\n },\n tasksByState: tasks.reduce((acc, task) => {\n acc[task.state] = (acc[task.state] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n tasksByPriority: tasks.reduce((acc, task) => {\n const priority = task.priority || 4;\n acc[priority] = (acc[priority] || 0) + 1;\n return acc;\n }, {} as Record<number, number>),\n recentActivity: {\n tasksUpdatedToday: tasks.filter(t => {\n const updated = new Date(t.updatedAt);\n const today = new Date();\n return updated.toDateString() === today.toDateString();\n }).length,\n sessionsToday: sessions.filter(s => {\n const started = new Date(s.startTime);\n const today = new Date();\n return started.toDateString() === today.toDateString();\n }).length,\n },\n };\n \n res.json(analytics);\n } catch (error) {\n res.status(500).json({ error: 'Failed to fetch analytics' });\n }\n});\n\n// WebSocket handling\nio.on('connection', (socket) => {\n console.log('\uD83D\uDC64 Client connected:', socket.id);\n \n // Send initial data\n socket.emit('initial-data', {\n tasks: taskReader.getTasks(),\n sessions: sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [],\n frames: frameManager?.getAllFrames() || [],\n });\n \n // Handle client requests\n socket.on('refresh-tasks', () => {\n socket.emit('tasks:update', taskReader.getTasks());\n });\n \n socket.on('refresh-sessions', () => {\n const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];\n socket.emit('sessions:update', sessions);\n });\n \n socket.on('refresh-frames', () => {\n socket.emit('frames:update', frameManager?.getAllFrames() || []);\n });\n \n socket.on('disconnect', () => {\n console.log('\uD83D\uDC4B Client disconnected:', socket.id);\n });\n});\n\n// Periodic updates (every 5 seconds)\nsetInterval(() => {\n try {\n io.emit('tasks:update', taskReader.getTasks());\n // SessionManager might not have getActiveSessions yet\n const sessions = sessionManager?.getActiveSessions ? sessionManager.getActiveSessions() : [];\n io.emit('sessions:update', sessions);\n io.emit('frames:update', frameManager?.getAllFrames() || []);\n } catch (error) {\n console.error('Error in periodic update:', error);\n }\n}, 5000);\n\n// Start server\nconst PORT = process.env.WS_PORT || 8080;\n\ninitializeServices();\n\nhttpServer.listen(PORT, () => {\n console.log(`\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 StackMemory Web Dashboard Server \u2551\n\u2551 Running on http://localhost:${PORT} \u2551\n\u2551 WebSocket: ws://localhost:${PORT} \u2551\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n `);\n});"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|