0xkobold 0.4.3 → 0.5.0

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 (130) hide show
  1. package/README.md +226 -383
  2. package/dist/package.json +13 -4
  3. package/dist/src/agent/DraconicCapabilityRouter.js +556 -0
  4. package/dist/src/agent/DraconicCapabilityRouter.js.map +1 -0
  5. package/dist/src/agent/DraconicErrorClassifier.js +606 -0
  6. package/dist/src/agent/DraconicErrorClassifier.js.map +1 -0
  7. package/dist/src/agent/DraconicRunRegistry.js +460 -0
  8. package/dist/src/agent/DraconicRunRegistry.js.map +1 -0
  9. package/dist/src/agent/DraconicTokenPredictor.js +500 -0
  10. package/dist/src/agent/DraconicTokenPredictor.js.map +1 -0
  11. package/dist/src/agent/embedded-runner.js +3 -2
  12. package/dist/src/agent/embedded-runner.js.map +1 -1
  13. package/dist/src/cli/commands/doctor.js +199 -0
  14. package/dist/src/cli/commands/doctor.js.map +1 -0
  15. package/dist/src/cli/commands/migrate-from-openclaw.js +39 -0
  16. package/dist/src/cli/commands/migrate-from-openclaw.js.map +1 -0
  17. package/dist/src/cli/commands/migrate.js +6 -4
  18. package/dist/src/cli/commands/migrate.js.map +1 -1
  19. package/dist/src/cli/program.js +3 -1
  20. package/dist/src/cli/program.js.map +1 -1
  21. package/dist/src/config/unified-config.js +195 -0
  22. package/dist/src/config/unified-config.js.map +1 -0
  23. package/dist/src/cron/notifications.js +1 -1
  24. package/dist/src/cron/notifications.js.map +1 -1
  25. package/dist/src/cron/runner.js +9 -3
  26. package/dist/src/cron/runner.js.map +1 -1
  27. package/dist/src/event-bus/index.js +3 -1
  28. package/dist/src/event-bus/index.js.map +1 -1
  29. package/dist/src/extensions/community/draconic-messenger-wrapper.js +35 -0
  30. package/dist/src/extensions/community/draconic-messenger-wrapper.js.map +1 -0
  31. package/dist/src/extensions/community/draconic-subagents-wrapper.js +115 -0
  32. package/dist/src/extensions/community/draconic-subagents-wrapper.js.map +1 -0
  33. package/dist/src/extensions/core/compaction-safeguard-v2.js +95 -0
  34. package/dist/src/extensions/core/compaction-safeguard-v2.js.map +1 -0
  35. package/dist/src/extensions/core/compaction-safeguard.js +206 -137
  36. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -1
  37. package/dist/src/extensions/core/config-extension.js +122 -0
  38. package/dist/src/extensions/core/config-extension.js.map +1 -0
  39. package/dist/src/extensions/core/draconic-hoard-extension.js +194 -0
  40. package/dist/src/extensions/core/draconic-hoard-extension.js.map +1 -0
  41. package/dist/src/extensions/core/draconic-lair-extension.js +146 -0
  42. package/dist/src/extensions/core/draconic-lair-extension.js.map +1 -0
  43. package/dist/src/extensions/core/draconic-safety-extension.js +402 -0
  44. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -0
  45. package/dist/src/extensions/core/ext-manager.js +40 -0
  46. package/dist/src/extensions/core/ext-manager.js.map +1 -0
  47. package/dist/src/extensions/core/gateway-extension.js +413 -624
  48. package/dist/src/extensions/core/gateway-extension.js.map +1 -1
  49. package/dist/src/extensions/core/generative-agents-extension.js +704 -0
  50. package/dist/src/extensions/core/generative-agents-extension.js.map +1 -0
  51. package/dist/src/extensions/core/memory-bootstrap-extension.js +279 -0
  52. package/dist/src/extensions/core/memory-bootstrap-extension.js.map +1 -0
  53. package/dist/src/extensions/core/ollama-extension.js +442 -0
  54. package/dist/src/extensions/core/ollama-extension.js.map +1 -0
  55. package/dist/src/extensions/core/ollama-router-extension.js +34 -93
  56. package/dist/src/extensions/core/ollama-router-extension.js.map +1 -1
  57. package/dist/src/extensions/core/perennial-memory-extension.js +5 -2
  58. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  59. package/dist/src/extensions/core/persona-loader-extension.js +41 -15
  60. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  61. package/dist/src/extensions/core/pi-notify-extension.js +6 -0
  62. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -1
  63. package/dist/src/extensions/core/session-bridge-extension.js +8 -72
  64. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -1
  65. package/dist/src/extensions/core/tui-integration-extension-fixed.js +3 -0
  66. package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +1 -0
  67. package/dist/src/extensions/core/tui-integration-extension.js +984 -0
  68. package/dist/src/extensions/core/tui-integration-extension.js.map +1 -0
  69. package/dist/src/gateway/persistence/AgentStore.js +399 -0
  70. package/dist/src/gateway/persistence/AgentStore.js.map +1 -0
  71. package/dist/src/gateway/persistence/index.js +9 -0
  72. package/dist/src/gateway/persistence/index.js.map +1 -0
  73. package/dist/src/hoard/DraconicHoardSystem.js +465 -0
  74. package/dist/src/hoard/DraconicHoardSystem.js.map +1 -0
  75. package/dist/src/index.js +7 -5
  76. package/dist/src/index.js.map +1 -1
  77. package/dist/src/infra/DraconicConnectionPool.js +492 -0
  78. package/dist/src/infra/DraconicConnectionPool.js.map +1 -0
  79. package/dist/src/lair/DraconicLairSystem.js +387 -0
  80. package/dist/src/lair/DraconicLairSystem.js.map +1 -0
  81. package/dist/src/llm/ollama.js +143 -99
  82. package/dist/src/llm/ollama.js.map +1 -1
  83. package/dist/src/migration/openclaw.js +5 -5
  84. package/dist/src/migration/openclaw.js.map +1 -1
  85. package/dist/src/pi-config.js +52 -27
  86. package/dist/src/pi-config.js.map +1 -1
  87. package/dist/src/sessions/SessionManager.js +416 -0
  88. package/dist/src/sessions/SessionManager.js.map +1 -0
  89. package/dist/src/sessions/SessionStore.js +580 -0
  90. package/dist/src/sessions/SessionStore.js.map +1 -0
  91. package/dist/src/sessions/UnifiedSessionBridge.js +394 -0
  92. package/dist/src/sessions/UnifiedSessionBridge.js.map +1 -0
  93. package/dist/src/sessions/index.js +15 -0
  94. package/dist/src/sessions/index.js.map +1 -0
  95. package/dist/src/sessions/migration/index.js +156 -0
  96. package/dist/src/sessions/migration/index.js.map +1 -0
  97. package/dist/src/sessions/types.js +8 -0
  98. package/dist/src/sessions/types.js.map +1 -0
  99. package/dist/src/skills/framework.js +1 -1
  100. package/dist/src/skills/framework.js.map +1 -1
  101. package/dist/src/tui/commands/final-functions.js +39 -0
  102. package/dist/src/tui/commands/final-functions.js.map +1 -0
  103. package/dist/src/tui/commands/natural-language-commands.js +231 -0
  104. package/dist/src/tui/commands/natural-language-commands.js.map +1 -0
  105. package/dist/src/tui/commands/orchestration-commands.js +340 -0
  106. package/dist/src/tui/commands/orchestration-commands.js.map +1 -0
  107. package/dist/src/tui/commands/orchestration-final-section.js +84 -0
  108. package/dist/src/tui/commands/orchestration-final-section.js.map +1 -0
  109. package/dist/src/tui/components/agent-tree-overlay.js +210 -0
  110. package/dist/src/tui/components/agent-tree-overlay.js.map +1 -0
  111. package/dist/src/tui/components/agent-tree-panel.js +229 -0
  112. package/dist/src/tui/components/agent-tree-panel.js.map +1 -0
  113. package/dist/src/tui/components/sidebar.js +82 -0
  114. package/dist/src/tui/components/sidebar.js.map +1 -0
  115. package/dist/src/tui/components/status-bar.js +115 -0
  116. package/dist/src/tui/components/status-bar.js.map +1 -0
  117. package/dist/src/tui/components/tree-header.js +85 -0
  118. package/dist/src/tui/components/tree-header.js.map +1 -0
  119. package/dist/src/tui/draconic-tui.js +291 -0
  120. package/dist/src/tui/draconic-tui.js.map +1 -0
  121. package/dist/src/tui/index.js +93 -0
  122. package/dist/src/tui/index.js.map +1 -0
  123. package/dist/src/tui/pi-tui-integration.js +260 -0
  124. package/dist/src/tui/pi-tui-integration.js.map +1 -0
  125. package/dist/src/utils/nl-patterns.js +145 -0
  126. package/dist/src/utils/nl-patterns.js.map +1 -0
  127. package/package.json +13 -4
  128. package/scripts/migrate-from-openclaw.sh +498 -0
  129. package/HEARTBEAT.md +0 -121
  130. package/USAGE.md +0 -191
@@ -0,0 +1,580 @@
1
+ /**
2
+ * Unified Session Store
3
+ *
4
+ * Central storage for session management with SQLite persistence.
5
+ * All 0xKobold subsystems reference this store via stable session IDs.
6
+ */
7
+ import { Database } from "bun:sqlite";
8
+ import { createHash } from "crypto";
9
+ import { existsSync, readFileSync } from "fs";
10
+ import { dirname, join } from "path";
11
+ import { fileURLToPath } from "url";
12
+ /**
13
+ * Generate stable session ID from pi-coding-agent session
14
+ * Same input = same output (survives restarts)
15
+ */
16
+ export function generateStableSessionId(piSessionId, deviceId) {
17
+ const hash = createHash("sha256")
18
+ .update(piSessionId)
19
+ .update(deviceId || getDeviceId())
20
+ .digest("hex")
21
+ .slice(0, 24);
22
+ return `kobold-${hash}`;
23
+ }
24
+ /**
25
+ * Generate device ID - stable per installation
26
+ */
27
+ export function getDeviceId() {
28
+ // In production, this should read from ~/.0xkobold/device.id
29
+ // For now, use environment or generate
30
+ if (process.env.KOBOLD_DEVICE_ID) {
31
+ return process.env.KOBOLD_DEVICE_ID;
32
+ }
33
+ // Generate stable device ID from hostname + machine ID if available
34
+ const { machineIdSync } = require("node-machine-id");
35
+ try {
36
+ return machineIdSync() || "unknown-device";
37
+ }
38
+ catch {
39
+ return "dev-device";
40
+ }
41
+ }
42
+ /**
43
+ * Unified Session Store
44
+ */
45
+ export class SessionStore {
46
+ db;
47
+ dbPath;
48
+ constructor(dbPath) {
49
+ this.dbPath = dbPath;
50
+ this.db = new Database(dbPath);
51
+ // Performance settings
52
+ this.db.run("PRAGMA journal_mode = WAL;");
53
+ this.db.run("PRAGMA synchronous = NORMAL;");
54
+ this.db.run("PRAGMA foreign_keys = ON;");
55
+ this.db.run("PRAGMA wal_autocheckpoint = 1000;");
56
+ this.initializeSchema();
57
+ console.log(`[SessionStore] Initialized at ${dbPath}`);
58
+ }
59
+ /**
60
+ * Initialize database schema
61
+ */
62
+ initializeSchema() {
63
+ try {
64
+ const __dirname = dirname(fileURLToPath(import.meta.url));
65
+ const schemaPath = join(__dirname, "schema.sql");
66
+ if (existsSync(schemaPath)) {
67
+ const schema = readFileSync(schemaPath, "utf-8");
68
+ this.db.run(schema);
69
+ console.log("[SessionStore] Schema initialized from schema.sql");
70
+ return;
71
+ }
72
+ }
73
+ catch {
74
+ // Fall through to no-op - tables created lazily
75
+ }
76
+ }
77
+ // ============================================================================
78
+ // Session CRUD
79
+ // ============================================================================
80
+ /**
81
+ * Create a new session
82
+ */
83
+ async createSession(piSessionId, data) {
84
+ const id = generateStableSessionId(piSessionId, data.deviceId);
85
+ const now = Date.now();
86
+ const deviceId = data.deviceId || getDeviceId();
87
+ const session = {
88
+ id,
89
+ piSessionId,
90
+ piSessionFile: data.piSessionFile,
91
+ deviceId,
92
+ userId: data.userId,
93
+ state: data.state || "idle",
94
+ mode: data.mode || "persistent",
95
+ cwd: data.cwd || process.cwd(),
96
+ workspaceType: data.workspaceType || "main",
97
+ createdAt: now,
98
+ lastActivityAt: now,
99
+ lastAccessedAt: now,
100
+ completedAt: data.completedAt,
101
+ totalTurns: data.totalTurns || 0,
102
+ totalTokens: data.totalTokens || { input: 0, output: 0 },
103
+ source: data.source || "tui",
104
+ channelId: data.channelId,
105
+ config: data.config,
106
+ metadata: data.metadata,
107
+ };
108
+ const stmt = this.db.prepare(`
109
+ INSERT INTO unified_sessions (
110
+ id, pi_session_id, pi_session_file, device_id, user_id,
111
+ state, mode, cwd, workspace_type,
112
+ created_at, last_activity_at, last_accessed_at, completed_at,
113
+ total_turns, total_tokens_input, total_tokens_output,
114
+ source, channel_id, config, metadata
115
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
116
+ `);
117
+ stmt.run(session.id, session.piSessionId, session.piSessionFile || null, session.deviceId, session.userId || null, session.state, session.mode, session.cwd, session.workspaceType, session.createdAt, session.lastActivityAt, session.lastAccessedAt, session.completedAt || null, session.totalTurns, session.totalTokens.input, session.totalTokens.output, session.source, session.channelId || null, JSON.stringify(session.config || {}), JSON.stringify(session.metadata || {}));
118
+ await this.logEvent(id, "created", { piSessionId });
119
+ console.log(`[SessionStore] Created session: ${id.slice(0, 16)}...`);
120
+ return session;
121
+ }
122
+ /**
123
+ * Get session by ID
124
+ */
125
+ async getSession(id) {
126
+ const row = this.db
127
+ .query("SELECT * FROM unified_sessions WHERE id = ?")
128
+ .get(id);
129
+ if (!row)
130
+ return null;
131
+ return this.rowToSession(row);
132
+ }
133
+ /**
134
+ * Get session by pi-coding-agent session ID
135
+ */
136
+ async getByPiSessionId(piSessionId) {
137
+ const id = generateStableSessionId(piSessionId);
138
+ return this.getSession(id);
139
+ }
140
+ /**
141
+ * Get or create session (idempotent)
142
+ */
143
+ async getOrCreateSession(piSessionId, data) {
144
+ const existing = await this.getByPiSessionId(piSessionId);
145
+ if (existing) {
146
+ await this.touch(existing.id);
147
+ return { session: existing, created: false };
148
+ }
149
+ const created = await this.createSession(piSessionId, data);
150
+ return { session: created, created: true };
151
+ }
152
+ /**
153
+ * Update session fields
154
+ */
155
+ async updateSession(id, updates) {
156
+ const sets = [];
157
+ const values = [];
158
+ if (updates.state !== undefined) {
159
+ sets.push("state = ?");
160
+ values.push(updates.state);
161
+ }
162
+ if (updates.mode !== undefined) {
163
+ sets.push("mode = ?");
164
+ values.push(updates.mode);
165
+ }
166
+ if (updates.cwd !== undefined) {
167
+ sets.push("cwd = ?");
168
+ values.push(updates.cwd);
169
+ }
170
+ if (updates.workspaceType !== undefined) {
171
+ sets.push("workspace_type = ?");
172
+ values.push(updates.workspaceType);
173
+ }
174
+ if (updates.lastActivityAt !== undefined) {
175
+ sets.push("last_activity_at = ?");
176
+ values.push(updates.lastActivityAt);
177
+ }
178
+ if (updates.completedAt !== undefined) {
179
+ sets.push("completed_at = ?");
180
+ values.push(updates.completedAt);
181
+ }
182
+ if (updates.totalTurns !== undefined) {
183
+ sets.push("total_turns = ?");
184
+ values.push(updates.totalTurns);
185
+ }
186
+ if (updates.totalTokens !== undefined) {
187
+ sets.push("total_tokens_input = ?");
188
+ values.push(updates.totalTokens.input);
189
+ sets.push("total_tokens_output = ?");
190
+ values.push(updates.totalTokens.output);
191
+ }
192
+ if (updates.config !== undefined) {
193
+ sets.push("config = ?");
194
+ values.push(JSON.stringify(updates.config));
195
+ }
196
+ if (updates.metadata !== undefined) {
197
+ sets.push("metadata = ?");
198
+ values.push(JSON.stringify(updates.metadata));
199
+ }
200
+ if (sets.length === 0)
201
+ return;
202
+ sets.push("version = version + 1");
203
+ values.push(id);
204
+ const query = `UPDATE unified_sessions SET ${sets.join(", ")} WHERE id = ?`;
205
+ this.db.run(query, values);
206
+ }
207
+ /**
208
+ * Update session state with event logging
209
+ */
210
+ async setState(id, newState, metadata) {
211
+ const current = await this.getSession(id);
212
+ if (!current)
213
+ throw new Error(`Session ${id} not found`);
214
+ await this.updateSession(id, { state: newState });
215
+ const eventType = this.stateToEventType(newState);
216
+ await this.logEvent(id, eventType, { previousState: current.state, ...metadata });
217
+ }
218
+ /**
219
+ * Delete session (cascades to hierarchy, snapshots, events)
220
+ */
221
+ async deleteSession(id) {
222
+ this.db.run("DELETE FROM unified_sessions WHERE id = ?", [id]);
223
+ }
224
+ /**
225
+ * Touch session (update last_accessed_at)
226
+ */
227
+ async touch(id) {
228
+ this.db.run("UPDATE unified_sessions SET last_accessed_at = ? WHERE id = ?", [Date.now(), id]);
229
+ }
230
+ // ============================================================================
231
+ // Queries
232
+ // ============================================================================
233
+ /**
234
+ * List sessions with filters
235
+ */
236
+ async listSessions(filter, limit = 100) {
237
+ let query = `
238
+ SELECT
239
+ s.id, s.state, s.source, s.cwd,
240
+ s.created_at, s.last_activity_at,
241
+ s.total_turns,
242
+ h.spawn_depth,
243
+ (SELECT COUNT(*) FROM session_hierarchy WHERE parent_session_id = s.id) > 0 as has_children
244
+ FROM unified_sessions s
245
+ LEFT JOIN session_hierarchy h ON s.id = h.session_id
246
+ WHERE 1=1
247
+ `;
248
+ const params = [];
249
+ if (filter?.state) {
250
+ const states = Array.isArray(filter.state) ? filter.state : [filter.state];
251
+ query += ` AND s.state IN (${states.map(() => "?").join(", ")})`;
252
+ params.push(...states);
253
+ }
254
+ if (filter?.source) {
255
+ const sources = Array.isArray(filter.source) ? filter.source : [filter.source];
256
+ query += ` AND s.source IN (${sources.map(() => "?").join(", ")})`;
257
+ params.push(...sources);
258
+ }
259
+ if (filter?.deviceId) {
260
+ query += " AND s.device_id = ?";
261
+ params.push(filter.deviceId);
262
+ }
263
+ if (filter?.userId) {
264
+ query += " AND s.user_id = ?";
265
+ params.push(filter.userId);
266
+ }
267
+ if (filter?.activeSince) {
268
+ query += " AND s.last_activity_at > ?";
269
+ params.push(filter.activeSince);
270
+ }
271
+ query += " ORDER BY s.last_activity_at DESC LIMIT ?";
272
+ params.push(limit);
273
+ const rows = this.db.query(query).all(...params);
274
+ return rows.map((row) => ({
275
+ id: row.id,
276
+ state: row.state,
277
+ source: row.source,
278
+ cwd: row.cwd,
279
+ createdAt: row.created_at,
280
+ lastActivityAt: row.last_activity_at,
281
+ totalTurns: row.total_turns,
282
+ hasChildren: !!row.has_children,
283
+ depth: row.spawn_depth || 0,
284
+ }));
285
+ }
286
+ /**
287
+ * Get active sessions (idle + active)
288
+ */
289
+ async getActiveSessions(hours = 168) {
290
+ const cutoff = Date.now() - hours * 60 * 60 * 1000;
291
+ const rows = this.db
292
+ .query(`
293
+ SELECT * FROM unified_sessions
294
+ WHERE state IN ('idle', 'active')
295
+ AND last_activity_at > ?
296
+ ORDER BY last_activity_at DESC
297
+ `)
298
+ .all(cutoff);
299
+ return rows.map((row) => this.rowToSession(row));
300
+ }
301
+ /**
302
+ * Get recent sessions for resume
303
+ */
304
+ async getSessionsForResume(maxAgeHours = 168) {
305
+ const cutoff = Date.now() - maxAgeHours * 60 * 60 * 1000;
306
+ const rows = this.db
307
+ .query(`
308
+ SELECT * FROM unified_sessions
309
+ WHERE (state IN ('idle', 'active', 'suspended')
310
+ OR (state = 'completed' AND completed_at > ?))
311
+ AND last_activity_at > ?
312
+ ORDER BY
313
+ CASE state
314
+ WHEN 'active' THEN 1
315
+ WHEN 'idle' THEN 2
316
+ WHEN 'suspended' THEN 3
317
+ ELSE 4
318
+ END,
319
+ last_activity_at DESC
320
+ `)
321
+ .all(cutoff, cutoff);
322
+ return rows.map((row) => this.rowToSession(row));
323
+ }
324
+ // ============================================================================
325
+ // Hierarchy
326
+ // ============================================================================
327
+ /**
328
+ * Create hierarchy entry
329
+ */
330
+ async createHierarchy(sessionId, data) {
331
+ const hierarchy = {
332
+ sessionId,
333
+ parentSessionId: data.parentSessionId,
334
+ rootSessionId: data.rootSessionId || data.parentSessionId || sessionId,
335
+ spawnDepth: data.spawnDepth || 0,
336
+ spawnedBy: data.spawnedBy,
337
+ spawnReason: data.spawnReason,
338
+ spawnMethod: data.spawnMethod || "auto",
339
+ spawnedAt: data.spawnedAt || Date.now(),
340
+ isFork: data.isFork || false,
341
+ forkedFromParent: data.forkedFromParent || false,
342
+ };
343
+ const stmt = this.db.prepare(`
344
+ INSERT INTO session_hierarchy (
345
+ session_id, parent_session_id, root_session_id, spawn_depth,
346
+ spawned_by, spawn_reason, spawn_method, spawned_at,
347
+ is_fork, forked_from_parent
348
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
349
+ `);
350
+ stmt.run(hierarchy.sessionId, hierarchy.parentSessionId || null, hierarchy.rootSessionId, hierarchy.spawnDepth, hierarchy.spawnedBy || null, hierarchy.spawnReason || null, hierarchy.spawnMethod, hierarchy.spawnedAt, hierarchy.isFork ? 1 : 0, hierarchy.forkedFromParent ? 1 : 0);
351
+ return hierarchy;
352
+ }
353
+ /**
354
+ * Get hierarchy for session
355
+ */
356
+ async getHierarchy(sessionId) {
357
+ const row = this.db
358
+ .query("SELECT * FROM session_hierarchy WHERE session_id = ?")
359
+ .get(sessionId);
360
+ if (!row)
361
+ return null;
362
+ return this.rowToHierarchy(row);
363
+ }
364
+ /**
365
+ * Get children of a session
366
+ */
367
+ async getChildren(parentId) {
368
+ const rows = this.db
369
+ .query("SELECT session_id FROM session_hierarchy WHERE parent_session_id = ? ORDER BY spawned_at")
370
+ .all(parentId);
371
+ return rows.map((r) => r.session_id);
372
+ }
373
+ /**
374
+ * Get tree from root
375
+ */
376
+ async getSessionTree(rootId) {
377
+ const result = [];
378
+ const toProcess = [rootId];
379
+ const processed = new Set();
380
+ while (toProcess.length > 0) {
381
+ const id = toProcess.shift();
382
+ if (processed.has(id))
383
+ continue;
384
+ processed.add(id);
385
+ const session = await this.getSession(id);
386
+ if (session) {
387
+ result.push(session);
388
+ const children = await this.getChildren(id);
389
+ for (const childId of children) {
390
+ if (!processed.has(childId)) {
391
+ toProcess.push(childId);
392
+ }
393
+ }
394
+ }
395
+ }
396
+ return result;
397
+ }
398
+ // ============================================================================
399
+ // Snapshots
400
+ // ============================================================================
401
+ /**
402
+ * Create snapshot
403
+ */
404
+ async createSnapshot(sessionId, type, data) {
405
+ const id = `snap-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
406
+ const stmt = this.db.prepare(`
407
+ INSERT INTO session_snapshots (
408
+ id, session_id, timestamp, type, triggered_by,
409
+ conversation_history, context_window,
410
+ tasks_state, channels_state, agents_state,
411
+ working_memory, perennial_refs, metadata,
412
+ token_count, expires_at
413
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
414
+ `);
415
+ const conversationHistory = JSON.stringify(data.conversationHistory || []);
416
+ const metadata = JSON.stringify(data.metadata || {});
417
+ stmt.run(id, sessionId, data.timestamp || Date.now(), type, data.triggeredBy || null, conversationHistory, JSON.stringify(data.contextWindow || null), JSON.stringify(data.tasks || null), JSON.stringify(data.channels || null), JSON.stringify(data.agents || null), JSON.stringify(data.workingMemory || null), JSON.stringify(data.perennialRefs || null), metadata, conversationHistory.length, data.expiresAt || null);
418
+ return id;
419
+ }
420
+ /**
421
+ * Get latest snapshot
422
+ */
423
+ async getLatestSnapshot(sessionId) {
424
+ const row = this.db
425
+ .query("SELECT * FROM session_snapshots WHERE session_id = ? ORDER BY timestamp DESC LIMIT 1")
426
+ .get(sessionId);
427
+ if (!row)
428
+ return null;
429
+ return this.rowToSnapshot(row);
430
+ }
431
+ /**
432
+ * Clean up old snapshots
433
+ */
434
+ async cleanupSnapshots(keepCount = 10) {
435
+ const result = this.db.run(`
436
+ DELETE FROM session_snapshots
437
+ WHERE id NOT IN (
438
+ SELECT id FROM session_snapshots
439
+ ORDER BY timestamp DESC
440
+ LIMIT ?
441
+ )
442
+ `, [keepCount]);
443
+ return result.changes;
444
+ }
445
+ // ============================================================================
446
+ // Events
447
+ // ============================================================================
448
+ async logEvent(sessionId, type, metadata) {
449
+ const id = `evt-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
450
+ this.db.run(`INSERT INTO session_events (id, session_id, type, timestamp, metadata)
451
+ VALUES (?, ?, ?, ?, ?)`, [id, sessionId, type, Date.now(), JSON.stringify(metadata || {})]);
452
+ }
453
+ /**
454
+ * Get events for session
455
+ */
456
+ async getEvents(sessionId, limit = 50) {
457
+ const rows = this.db
458
+ .query(`SELECT * FROM session_events
459
+ WHERE session_id = ?
460
+ ORDER BY timestamp DESC
461
+ LIMIT ?`)
462
+ .all(sessionId, limit);
463
+ return rows.map((r) => ({
464
+ id: r.id,
465
+ sessionId: r.session_id,
466
+ type: r.type,
467
+ timestamp: r.timestamp,
468
+ metadata: JSON.parse(r.metadata || "{}"),
469
+ }));
470
+ }
471
+ // ============================================================================
472
+ // Statistics
473
+ // ============================================================================
474
+ async getStats() {
475
+ const row = this.db.query("SELECT * FROM session_stats").get();
476
+ return {
477
+ total: row?.total_sessions || 0,
478
+ active: row?.active_count || 0,
479
+ idle: row?.idle_count || 0,
480
+ error: row?.error_count || 0,
481
+ completed: row?.completed_count || 0,
482
+ totalInputTokens: row?.total_input_tokens || 0,
483
+ totalOutputTokens: row?.total_output_tokens || 0,
484
+ totalTurns: row?.total_turns || 0,
485
+ };
486
+ }
487
+ // ============================================================================
488
+ // Maintenance
489
+ // ============================================================================
490
+ async cleanup(completedAgeHours = 168) {
491
+ const cutoff = Date.now() - completedAgeHours * 60 * 60 * 1000;
492
+ // Delete old completed sessions
493
+ const sessionsResult = this.db.run("DELETE FROM unified_sessions WHERE state = 'completed' AND completed_at < ?", [cutoff]);
494
+ // Clean up orphaned snapshots
495
+ const snapshotsResult = await this.cleanupSnapshots();
496
+ return {
497
+ sessionsDeleted: sessionsResult.changes,
498
+ snapshotsDeleted: snapshotsResult,
499
+ };
500
+ }
501
+ async checkpoint() {
502
+ this.db.run("PRAGMA wal_checkpoint(TRUNCATE)");
503
+ }
504
+ async close() {
505
+ await this.checkpoint();
506
+ this.db.close();
507
+ }
508
+ // ============================================================================
509
+ // Helpers
510
+ // ============================================================================
511
+ rowToSession(row) {
512
+ return {
513
+ id: row.id,
514
+ piSessionId: row.pi_session_id,
515
+ piSessionFile: row.pi_session_file || undefined,
516
+ deviceId: row.device_id,
517
+ userId: row.user_id || undefined,
518
+ state: row.state,
519
+ mode: row.mode,
520
+ cwd: row.cwd,
521
+ workspaceType: row.workspace_type,
522
+ createdAt: row.created_at,
523
+ lastActivityAt: row.last_activity_at,
524
+ lastAccessedAt: row.last_accessed_at,
525
+ completedAt: row.completed_at || undefined,
526
+ totalTurns: row.total_turns,
527
+ totalTokens: {
528
+ input: row.total_tokens_input,
529
+ output: row.total_tokens_output,
530
+ },
531
+ source: row.source,
532
+ channelId: row.channel_id || undefined,
533
+ config: JSON.parse(row.config || "{}"),
534
+ metadata: JSON.parse(row.metadata || "{}"),
535
+ };
536
+ }
537
+ rowToHierarchy(row) {
538
+ return {
539
+ sessionId: row.session_id,
540
+ parentSessionId: row.parent_session_id || undefined,
541
+ rootSessionId: row.root_session_id || undefined,
542
+ spawnDepth: row.spawn_depth,
543
+ spawnedBy: row.spawned_by || undefined,
544
+ spawnReason: row.spawn_reason || undefined,
545
+ spawnMethod: row.spawn_method,
546
+ spawnedAt: row.spawned_at,
547
+ isFork: !!row.is_fork,
548
+ forkedFromParent: !!row.forked_from_parent,
549
+ };
550
+ }
551
+ rowToSnapshot(row) {
552
+ return {
553
+ id: row.id,
554
+ sessionId: row.session_id,
555
+ timestamp: row.timestamp,
556
+ type: row.type,
557
+ triggeredBy: row.triggered_by || undefined,
558
+ conversationHistory: JSON.parse(row.conversation_history || "[]"),
559
+ contextWindow: row.context_window ? JSON.parse(row.context_window) : undefined,
560
+ tasks: row.tasks_state ? JSON.parse(row.tasks_state) : undefined,
561
+ channels: row.channels_state ? JSON.parse(row.channels_state) : undefined,
562
+ agents: row.agents_state ? JSON.parse(row.agents_state) : undefined,
563
+ workingMemory: row.working_memory ? JSON.parse(row.working_memory) : undefined,
564
+ perennialRefs: row.perennial_refs ? JSON.parse(row.perennial_refs) : undefined,
565
+ metadata: JSON.parse(row.metadata || "{}"),
566
+ };
567
+ }
568
+ stateToEventType(state) {
569
+ const mapping = {
570
+ idle: "created",
571
+ active: "activated",
572
+ error: "error",
573
+ completed: "completed",
574
+ suspended: "resumed",
575
+ };
576
+ return mapping[state];
577
+ }
578
+ }
579
+ export default SessionStore;
580
+ //# sourceMappingURL=SessionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionStore.js","sourceRoot":"","sources":["../../../src/sessions/SessionStore.ts"],"names":[],"mappings":"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"}