genbox-agent 1.0.39 → 1.0.41

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 (67) hide show
  1. package/dist/hook.d.ts +6 -5
  2. package/dist/hook.d.ts.map +1 -1
  3. package/dist/hook.js +200 -81
  4. package/dist/hook.js.map +1 -1
  5. package/dist/hooks/daemon-client.d.ts +39 -0
  6. package/dist/hooks/daemon-client.d.ts.map +1 -0
  7. package/dist/hooks/daemon-client.js +238 -0
  8. package/dist/hooks/daemon-client.js.map +1 -0
  9. package/dist/hooks/index.d.ts +7 -0
  10. package/dist/hooks/index.d.ts.map +1 -0
  11. package/dist/hooks/index.js +23 -0
  12. package/dist/hooks/index.js.map +1 -0
  13. package/dist/server/auth.d.ts +51 -0
  14. package/dist/server/auth.d.ts.map +1 -0
  15. package/dist/server/auth.js +154 -0
  16. package/dist/server/auth.js.map +1 -0
  17. package/dist/server/index.d.ts +156 -0
  18. package/dist/server/index.d.ts.map +1 -0
  19. package/dist/server/index.js +595 -0
  20. package/dist/server/index.js.map +1 -0
  21. package/dist/server/port-finder.d.ts +45 -0
  22. package/dist/server/port-finder.d.ts.map +1 -0
  23. package/dist/server/port-finder.js +267 -0
  24. package/dist/server/port-finder.js.map +1 -0
  25. package/dist/storage/index.d.ts +82 -0
  26. package/dist/storage/index.d.ts.map +1 -0
  27. package/dist/storage/index.js +209 -0
  28. package/dist/storage/index.js.map +1 -0
  29. package/dist/storage/manager.d.ts +112 -0
  30. package/dist/storage/manager.d.ts.map +1 -0
  31. package/dist/storage/manager.js +200 -0
  32. package/dist/storage/manager.js.map +1 -0
  33. package/dist/storage/repositories/events.d.ts +101 -0
  34. package/dist/storage/repositories/events.d.ts.map +1 -0
  35. package/dist/storage/repositories/events.js +258 -0
  36. package/dist/storage/repositories/events.js.map +1 -0
  37. package/dist/storage/repositories/index.d.ts +9 -0
  38. package/dist/storage/repositories/index.d.ts.map +1 -0
  39. package/dist/storage/repositories/index.js +25 -0
  40. package/dist/storage/repositories/index.js.map +1 -0
  41. package/dist/storage/repositories/messages.d.ts +123 -0
  42. package/dist/storage/repositories/messages.d.ts.map +1 -0
  43. package/dist/storage/repositories/messages.js +209 -0
  44. package/dist/storage/repositories/messages.js.map +1 -0
  45. package/dist/storage/repositories/sessions.d.ts +158 -0
  46. package/dist/storage/repositories/sessions.d.ts.map +1 -0
  47. package/dist/storage/repositories/sessions.js +342 -0
  48. package/dist/storage/repositories/sessions.js.map +1 -0
  49. package/dist/storage/schema.d.ts +42 -0
  50. package/dist/storage/schema.d.ts.map +1 -0
  51. package/dist/storage/schema.js +278 -0
  52. package/dist/storage/schema.js.map +1 -0
  53. package/dist/sync/background-sync.d.ts +83 -0
  54. package/dist/sync/background-sync.d.ts.map +1 -0
  55. package/dist/sync/background-sync.js +367 -0
  56. package/dist/sync/background-sync.js.map +1 -0
  57. package/dist/sync/index.d.ts +7 -0
  58. package/dist/sync/index.d.ts.map +1 -0
  59. package/dist/sync/index.js +23 -0
  60. package/dist/sync/index.js.map +1 -0
  61. package/dist/unified-daemon.js +219 -0
  62. package/dist/unified-daemon.js.map +1 -1
  63. package/dist/unified-hook.d.ts +4 -3
  64. package/dist/unified-hook.d.ts.map +1 -1
  65. package/dist/unified-hook.js +155 -31
  66. package/dist/unified-hook.js.map +1 -1
  67. package/package.json +4 -1
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ /**
3
+ * Session Repository
4
+ *
5
+ * CRUD operations for sessions, compatible with Session V2 API.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.SessionRepository = void 0;
42
+ const crypto = __importStar(require("crypto"));
43
+ /**
44
+ * Session repository
45
+ */
46
+ class SessionRepository {
47
+ db;
48
+ stmts;
49
+ constructor(db) {
50
+ this.db = db;
51
+ this.stmts = this.prepareStatements();
52
+ }
53
+ prepareStatements() {
54
+ return {
55
+ insert: this.db.prepare(`
56
+ INSERT INTO sessions (
57
+ id, user_id, name, type, provider, model, project_path,
58
+ git_branch, git_repo, status, control_token, started_at,
59
+ last_activity_at, created_at, updated_at
60
+ ) VALUES (
61
+ @id, @userId, @name, @type, @provider, @model, @projectPath,
62
+ @gitBranch, @gitRepo, @status, @controlToken, @startedAt,
63
+ @lastActivityAt, @createdAt, @updatedAt
64
+ )
65
+ `),
66
+ getById: this.db.prepare(`
67
+ SELECT * FROM sessions WHERE id = ?
68
+ `),
69
+ getByStatus: this.db.prepare(`
70
+ SELECT * FROM sessions WHERE status = ? ORDER BY created_at DESC
71
+ `),
72
+ getActive: this.db.prepare(`
73
+ SELECT * FROM sessions WHERE status != 'ended' ORDER BY last_activity_at DESC
74
+ `),
75
+ getAll: this.db.prepare(`
76
+ SELECT * FROM sessions ORDER BY created_at DESC LIMIT ?
77
+ `),
78
+ update: this.db.prepare(`
79
+ UPDATE sessions SET
80
+ name = COALESCE(@name, name),
81
+ status = COALESCE(@status, status),
82
+ current_state = COALESCE(@currentState, current_state),
83
+ current_tool_name = COALESCE(@currentToolName, current_tool_name),
84
+ last_message_preview = COALESCE(@lastMessagePreview, last_message_preview),
85
+ last_message_role = COALESCE(@lastMessageRole, last_message_role),
86
+ model = COALESCE(@model, model),
87
+ git_branch = COALESCE(@gitBranch, git_branch),
88
+ git_repo = COALESCE(@gitRepo, git_repo),
89
+ ended_at = COALESCE(@endedAt, ended_at),
90
+ duration_ms = COALESCE(@durationMs, duration_ms),
91
+ last_activity_at = @lastActivityAt,
92
+ updated_at = @updatedAt,
93
+ sync_pending = 1
94
+ WHERE id = @id
95
+ `),
96
+ updateStatus: this.db.prepare(`
97
+ UPDATE sessions SET
98
+ status = @status,
99
+ ended_at = CASE WHEN @status = 'ended' THEN @now ELSE ended_at END,
100
+ duration_ms = CASE WHEN @status = 'ended' THEN @now - started_at ELSE duration_ms END,
101
+ last_activity_at = @now,
102
+ updated_at = @now,
103
+ sync_pending = 1
104
+ WHERE id = @id
105
+ `),
106
+ updateState: this.db.prepare(`
107
+ UPDATE sessions SET
108
+ current_state = @currentState,
109
+ current_tool_name = @currentToolName,
110
+ last_activity_at = @now,
111
+ updated_at = @now,
112
+ sync_pending = 1
113
+ WHERE id = @id
114
+ `),
115
+ updateMetrics: this.db.prepare(`
116
+ UPDATE sessions SET
117
+ total_input_tokens = total_input_tokens + @inputTokens,
118
+ total_output_tokens = total_output_tokens + @outputTokens,
119
+ total_cache_read_tokens = total_cache_read_tokens + @cacheReadTokens,
120
+ total_cache_write_tokens = total_cache_write_tokens + @cacheWriteTokens,
121
+ context_tokens = COALESCE(@contextTokens, context_tokens),
122
+ estimated_cost_cents = estimated_cost_cents + @costCents,
123
+ last_activity_at = @now,
124
+ updated_at = @now,
125
+ sync_pending = 1
126
+ WHERE id = @id
127
+ `),
128
+ incrementCounts: this.db.prepare(`
129
+ UPDATE sessions SET
130
+ message_count = message_count + @messages,
131
+ tool_use_count = tool_use_count + @toolUses,
132
+ user_prompt_count = user_prompt_count + @userPrompts,
133
+ assistant_response_count = assistant_response_count + @assistantResponses,
134
+ last_activity_at = @now,
135
+ updated_at = @now,
136
+ sync_pending = 1
137
+ WHERE id = @id
138
+ `),
139
+ markSynced: this.db.prepare(`
140
+ UPDATE sessions SET
141
+ synced_at = @syncedAt,
142
+ sync_pending = 0
143
+ WHERE id = @id
144
+ `),
145
+ getUnsynced: this.db.prepare(`
146
+ SELECT * FROM sessions WHERE sync_pending = 1 ORDER BY updated_at ASC LIMIT ?
147
+ `),
148
+ delete: this.db.prepare(`
149
+ DELETE FROM sessions WHERE id = ?
150
+ `),
151
+ };
152
+ }
153
+ /**
154
+ * Create a new session
155
+ */
156
+ create(input) {
157
+ const now = Date.now();
158
+ const id = input.id || crypto.randomUUID();
159
+ const controlToken = input.controlToken || crypto.randomUUID();
160
+ this.stmts.insert.run({
161
+ id,
162
+ userId: input.userId || null,
163
+ name: input.name || null,
164
+ type: input.type || 'native',
165
+ provider: input.provider || 'claude',
166
+ model: input.model || null,
167
+ projectPath: input.projectPath || null,
168
+ gitBranch: input.gitBranch || null,
169
+ gitRepo: input.gitRepo || null,
170
+ status: 'active',
171
+ controlToken,
172
+ startedAt: now,
173
+ lastActivityAt: now,
174
+ createdAt: now,
175
+ updatedAt: now,
176
+ });
177
+ return this.getById(id);
178
+ }
179
+ /**
180
+ * Get session by ID
181
+ */
182
+ getById(id) {
183
+ const row = this.stmts.getById.get(id);
184
+ return row ? this.mapRow(row) : null;
185
+ }
186
+ /**
187
+ * Get sessions by status
188
+ */
189
+ getByStatus(status) {
190
+ const rows = this.stmts.getByStatus.all(status);
191
+ return rows.map(row => this.mapRow(row));
192
+ }
193
+ /**
194
+ * Get active sessions (not ended)
195
+ */
196
+ getActive() {
197
+ const rows = this.stmts.getActive.all();
198
+ return rows.map(row => this.mapRow(row));
199
+ }
200
+ /**
201
+ * Get all sessions
202
+ */
203
+ getAll(limit = 100) {
204
+ const rows = this.stmts.getAll.all(limit);
205
+ return rows.map(row => this.mapRow(row));
206
+ }
207
+ /**
208
+ * Update session
209
+ */
210
+ update(id, input) {
211
+ const now = Date.now();
212
+ this.stmts.update.run({
213
+ id,
214
+ name: input.name,
215
+ status: input.status,
216
+ currentState: input.currentState,
217
+ currentToolName: input.currentToolName,
218
+ lastMessagePreview: input.lastMessagePreview,
219
+ lastMessageRole: input.lastMessageRole,
220
+ model: input.model,
221
+ gitBranch: input.gitBranch,
222
+ gitRepo: input.gitRepo,
223
+ endedAt: input.endedAt,
224
+ durationMs: input.durationMs,
225
+ lastActivityAt: now,
226
+ updatedAt: now,
227
+ });
228
+ return this.getById(id);
229
+ }
230
+ /**
231
+ * Update session status
232
+ */
233
+ updateStatus(id, status) {
234
+ const now = Date.now();
235
+ this.stmts.updateStatus.run({ id, status, now });
236
+ }
237
+ /**
238
+ * Update session state (for live monitoring)
239
+ */
240
+ updateState(id, state, toolName) {
241
+ const now = Date.now();
242
+ this.stmts.updateState.run({
243
+ id,
244
+ currentState: state,
245
+ currentToolName: toolName || null,
246
+ now,
247
+ });
248
+ }
249
+ /**
250
+ * Update token metrics
251
+ */
252
+ updateMetrics(id, metrics, costCents = 0) {
253
+ const now = Date.now();
254
+ this.stmts.updateMetrics.run({
255
+ id,
256
+ inputTokens: metrics.inputTokens || 0,
257
+ outputTokens: metrics.outputTokens || 0,
258
+ cacheReadTokens: metrics.cacheReadTokens || 0,
259
+ cacheWriteTokens: metrics.cacheWriteTokens || 0,
260
+ contextTokens: metrics.contextTokens,
261
+ costCents,
262
+ now,
263
+ });
264
+ }
265
+ /**
266
+ * Increment counts
267
+ */
268
+ incrementCounts(id, counts) {
269
+ const now = Date.now();
270
+ this.stmts.incrementCounts.run({
271
+ id,
272
+ messages: counts.messages || 0,
273
+ toolUses: counts.toolUses || 0,
274
+ userPrompts: counts.userPrompts || 0,
275
+ assistantResponses: counts.assistantResponses || 0,
276
+ now,
277
+ });
278
+ }
279
+ /**
280
+ * Mark session as synced
281
+ */
282
+ markSynced(id) {
283
+ this.stmts.markSynced.run({ id, syncedAt: Date.now() });
284
+ }
285
+ /**
286
+ * Get unsynced sessions
287
+ */
288
+ getUnsynced(limit = 100) {
289
+ const rows = this.stmts.getUnsynced.all(limit);
290
+ return rows.map(row => this.mapRow(row));
291
+ }
292
+ /**
293
+ * Delete session
294
+ */
295
+ delete(id) {
296
+ const result = this.stmts.delete.run(id);
297
+ return result.changes > 0;
298
+ }
299
+ /**
300
+ * Map database row to Session object
301
+ */
302
+ mapRow(row) {
303
+ return {
304
+ id: row.id,
305
+ userId: row.user_id,
306
+ name: row.name,
307
+ type: row.type,
308
+ provider: row.provider,
309
+ model: row.model,
310
+ projectPath: row.project_path,
311
+ gitBranch: row.git_branch,
312
+ gitRepo: row.git_repo,
313
+ status: row.status,
314
+ currentState: row.current_state,
315
+ currentToolName: row.current_tool_name,
316
+ lastMessagePreview: row.last_message_preview,
317
+ lastMessageRole: row.last_message_role,
318
+ totalInputTokens: row.total_input_tokens,
319
+ totalOutputTokens: row.total_output_tokens,
320
+ totalCacheReadTokens: row.total_cache_read_tokens,
321
+ totalCacheWriteTokens: row.total_cache_write_tokens,
322
+ contextTokens: row.context_tokens,
323
+ maxContextTokens: row.max_context_tokens,
324
+ estimatedCostUsd: row.estimated_cost_cents / 100,
325
+ messageCount: row.message_count,
326
+ toolUseCount: row.tool_use_count,
327
+ userPromptCount: row.user_prompt_count,
328
+ assistantResponseCount: row.assistant_response_count,
329
+ controlToken: row.control_token,
330
+ startedAt: row.started_at,
331
+ endedAt: row.ended_at,
332
+ durationMs: row.duration_ms,
333
+ lastActivityAt: row.last_activity_at,
334
+ createdAt: row.created_at,
335
+ updatedAt: row.updated_at,
336
+ syncedAt: row.synced_at,
337
+ syncPending: row.sync_pending === 1,
338
+ };
339
+ }
340
+ }
341
+ exports.SessionRepository = SessionRepository;
342
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/storage/repositories/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * SQLite Database Schema
3
+ *
4
+ * Compatible with Session V2 API schema for seamless sync.
5
+ * Stores sessions, messages, tool uses, and events locally.
6
+ */
7
+ export declare const SCHEMA_VERSION = 1;
8
+ /**
9
+ * Initial schema creation SQL
10
+ */
11
+ export declare const SCHEMA_SQL = "\n-- Schema version tracking\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- Sessions table (mirrors Session V2 entity)\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY, -- sessionId (UUID)\n user_id TEXT, -- userId\n name TEXT, -- session name\n\n -- Environment\n type TEXT DEFAULT 'native', -- native | local | cloud\n provider TEXT DEFAULT 'claude', -- claude | gemini | codex\n model TEXT, -- model name\n project_path TEXT, -- working directory\n git_branch TEXT, -- current git branch\n git_repo TEXT, -- git remote URL\n\n -- Status\n status TEXT DEFAULT 'active', -- active | idle | waiting_input | ended | error\n current_state TEXT, -- waiting_for_input | thinking | executing_tool | responding\n current_tool_name TEXT, -- tool being executed\n last_message_preview TEXT, -- first 200 chars of last message\n last_message_role TEXT, -- user | assistant\n\n -- Token metrics\n total_input_tokens INTEGER DEFAULT 0,\n total_output_tokens INTEGER DEFAULT 0,\n total_cache_read_tokens INTEGER DEFAULT 0,\n total_cache_write_tokens INTEGER DEFAULT 0,\n context_tokens INTEGER DEFAULT 0,\n max_context_tokens INTEGER DEFAULT 200000,\n\n -- Cost tracking (in USD, stored as cents for precision)\n estimated_cost_cents INTEGER DEFAULT 0,\n\n -- Counts\n message_count INTEGER DEFAULT 0,\n tool_use_count INTEGER DEFAULT 0,\n user_prompt_count INTEGER DEFAULT 0,\n assistant_response_count INTEGER DEFAULT 0,\n\n -- Control\n control_token TEXT, -- for remote control auth\n\n -- Timestamps (stored as milliseconds since epoch)\n started_at INTEGER,\n ended_at INTEGER,\n duration_ms INTEGER,\n last_activity_at INTEGER,\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n\n -- Sync tracking\n synced_at INTEGER, -- last sync to cloud\n sync_pending INTEGER DEFAULT 1 -- 1 if needs sync, 0 if synced\n);\n\nCREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id);\nCREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\nCREATE INDEX IF NOT EXISTS idx_sessions_sync ON sessions(sync_pending, synced_at);\nCREATE INDEX IF NOT EXISTS idx_sessions_created ON sessions(created_at);\n\n-- Messages table (mirrors SessionMessage V2 entity)\nCREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY, -- message UUID\n session_id TEXT NOT NULL, -- FK to sessions\n sequence INTEGER NOT NULL, -- order in conversation\n\n -- Content\n role TEXT NOT NULL, -- user | assistant\n content TEXT, -- JSON array of content blocks\n\n -- Token metrics\n input_tokens INTEGER DEFAULT 0,\n output_tokens INTEGER DEFAULT 0,\n cache_read_tokens INTEGER DEFAULT 0,\n cache_write_tokens INTEGER DEFAULT 0,\n\n -- Cost (cents)\n cost_cents INTEGER DEFAULT 0,\n\n -- Tool usage\n tool_use_ids TEXT, -- JSON array of tool use IDs\n\n -- Timestamps\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n\n -- Sync tracking\n synced_at INTEGER,\n sync_pending INTEGER DEFAULT 1,\n\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, sequence);\nCREATE INDEX IF NOT EXISTS idx_messages_sync ON messages(sync_pending, synced_at);\n\n-- Tool uses table (mirrors SessionToolUse V2 entity)\nCREATE TABLE IF NOT EXISTS tool_uses (\n id TEXT PRIMARY KEY, -- tool use UUID\n session_id TEXT NOT NULL, -- FK to sessions\n message_id TEXT, -- FK to messages (optional)\n\n -- Tool info\n name TEXT NOT NULL, -- tool name (Read, Write, Bash, etc.)\n category TEXT, -- file | shell | search | web | agent\n\n -- Input/Output\n input TEXT, -- JSON input\n output TEXT, -- JSON output (truncated if large)\n\n -- Status\n status TEXT DEFAULT 'pending', -- pending | running | success | error\n error_message TEXT,\n exit_code INTEGER,\n\n -- File operations (for file tools)\n file_path TEXT,\n operation TEXT, -- read | write | edit | glob | grep\n lines_affected INTEGER,\n\n -- Timing\n started_at INTEGER,\n completed_at INTEGER,\n duration_ms INTEGER,\n\n -- Timestamps\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n\n -- Sync tracking\n synced_at INTEGER,\n sync_pending INTEGER DEFAULT 1,\n\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_tool_uses_session ON tool_uses(session_id);\nCREATE INDEX IF NOT EXISTS idx_tool_uses_name ON tool_uses(name);\nCREATE INDEX IF NOT EXISTS idx_tool_uses_sync ON tool_uses(sync_pending, synced_at);\n\n-- Events table (mirrors SessionEvent V2 entity)\n-- Events are lightweight activity markers, auto-deleted after 7 days\nCREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY, -- event UUID\n session_id TEXT NOT NULL, -- FK to sessions\n\n -- Event info\n type TEXT NOT NULL, -- event type (see EVENT_TYPES)\n data TEXT, -- JSON event data\n\n -- Snapshot metrics at time of event\n context_tokens INTEGER,\n cost_cents_so_far INTEGER,\n message_count INTEGER,\n\n -- Timestamps\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n\n -- Sync tracking\n synced_at INTEGER,\n sync_pending INTEGER DEFAULT 1,\n\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id, created_at);\nCREATE INDEX IF NOT EXISTS idx_events_type ON events(type);\nCREATE INDEX IF NOT EXISTS idx_events_sync ON events(sync_pending, synced_at);\nCREATE INDEX IF NOT EXISTS idx_events_created ON events(created_at);\n\n-- Output history table (for terminal output playback)\nCREATE TABLE IF NOT EXISTS output_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n\n -- Output snapshot\n output TEXT NOT NULL, -- terminal output\n status TEXT, -- session status at capture time\n\n -- Timestamps\n captured_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_output_session ON output_history(session_id, captured_at);\n\n-- Cleanup trigger: auto-delete events older than 7 days\n-- This runs on every insert to events table\nCREATE TRIGGER IF NOT EXISTS cleanup_old_events\nAFTER INSERT ON events\nBEGIN\n DELETE FROM events\n WHERE created_at < (strftime('%s', 'now') * 1000 - 7 * 24 * 60 * 60 * 1000);\nEND;\n\n-- Cleanup trigger: auto-delete output history older than 24 hours\nCREATE TRIGGER IF NOT EXISTS cleanup_old_output\nAFTER INSERT ON output_history\nBEGIN\n DELETE FROM output_history\n WHERE captured_at < (strftime('%s', 'now') * 1000 - 24 * 60 * 60 * 1000);\nEND;\n";
12
+ /**
13
+ * Event types (matching Session V2 API)
14
+ */
15
+ export declare const EVENT_TYPES: readonly ["session_start", "session_end", "prompt_submitted", "response_started", "response_completed", "tool_started", "tool_completed", "tool_error", "state_change", "command_received", "command_executed", "context_window_warning", "context_compression", "git_commit", "git_push", "file_created", "file_modified", "file_deleted", "error", "warning"];
16
+ export type EventType = typeof EVENT_TYPES[number];
17
+ /**
18
+ * Session status values
19
+ */
20
+ export declare const SESSION_STATUSES: readonly ["active", "idle", "waiting_input", "ended", "error"];
21
+ export type SessionStatus = typeof SESSION_STATUSES[number];
22
+ /**
23
+ * Session state values (for live monitoring)
24
+ */
25
+ export declare const SESSION_STATES: readonly ["waiting_for_input", "thinking", "executing_tool", "responding"];
26
+ export type SessionState = typeof SESSION_STATES[number];
27
+ /**
28
+ * Provider types
29
+ */
30
+ export declare const PROVIDERS: readonly ["claude", "gemini", "codex"];
31
+ export type Provider = typeof PROVIDERS[number];
32
+ /**
33
+ * Environment types
34
+ */
35
+ export declare const ENV_TYPES: readonly ["native", "local", "cloud"];
36
+ export type EnvType = typeof ENV_TYPES[number];
37
+ /**
38
+ * Tool categories
39
+ */
40
+ export declare const TOOL_CATEGORIES: readonly ["file", "shell", "search", "web", "agent"];
41
+ export type ToolCategory = typeof TOOL_CATEGORIES[number];
42
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;GAEG;AACH,eAAO,MAAM,UAAU,47OA+MtB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,iWAqBd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,gBAAgB,gEAMnB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,cAAc,4EAKjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,SAAS,wCAAyC,CAAC;AAChE,MAAM,MAAM,QAAQ,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,SAAS,uCAAwC,CAAC;AAC/D,MAAM,MAAM,OAAO,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,eAAe,sDAAuD,CAAC;AACpF,MAAM,MAAM,YAAY,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ /**
3
+ * SQLite Database Schema
4
+ *
5
+ * Compatible with Session V2 API schema for seamless sync.
6
+ * Stores sessions, messages, tool uses, and events locally.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TOOL_CATEGORIES = exports.ENV_TYPES = exports.PROVIDERS = exports.SESSION_STATES = exports.SESSION_STATUSES = exports.EVENT_TYPES = exports.SCHEMA_SQL = exports.SCHEMA_VERSION = void 0;
10
+ exports.SCHEMA_VERSION = 1;
11
+ /**
12
+ * Initial schema creation SQL
13
+ */
14
+ exports.SCHEMA_SQL = `
15
+ -- Schema version tracking
16
+ CREATE TABLE IF NOT EXISTS schema_version (
17
+ version INTEGER PRIMARY KEY,
18
+ applied_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
19
+ );
20
+
21
+ -- Sessions table (mirrors Session V2 entity)
22
+ CREATE TABLE IF NOT EXISTS sessions (
23
+ id TEXT PRIMARY KEY, -- sessionId (UUID)
24
+ user_id TEXT, -- userId
25
+ name TEXT, -- session name
26
+
27
+ -- Environment
28
+ type TEXT DEFAULT 'native', -- native | local | cloud
29
+ provider TEXT DEFAULT 'claude', -- claude | gemini | codex
30
+ model TEXT, -- model name
31
+ project_path TEXT, -- working directory
32
+ git_branch TEXT, -- current git branch
33
+ git_repo TEXT, -- git remote URL
34
+
35
+ -- Status
36
+ status TEXT DEFAULT 'active', -- active | idle | waiting_input | ended | error
37
+ current_state TEXT, -- waiting_for_input | thinking | executing_tool | responding
38
+ current_tool_name TEXT, -- tool being executed
39
+ last_message_preview TEXT, -- first 200 chars of last message
40
+ last_message_role TEXT, -- user | assistant
41
+
42
+ -- Token metrics
43
+ total_input_tokens INTEGER DEFAULT 0,
44
+ total_output_tokens INTEGER DEFAULT 0,
45
+ total_cache_read_tokens INTEGER DEFAULT 0,
46
+ total_cache_write_tokens INTEGER DEFAULT 0,
47
+ context_tokens INTEGER DEFAULT 0,
48
+ max_context_tokens INTEGER DEFAULT 200000,
49
+
50
+ -- Cost tracking (in USD, stored as cents for precision)
51
+ estimated_cost_cents INTEGER DEFAULT 0,
52
+
53
+ -- Counts
54
+ message_count INTEGER DEFAULT 0,
55
+ tool_use_count INTEGER DEFAULT 0,
56
+ user_prompt_count INTEGER DEFAULT 0,
57
+ assistant_response_count INTEGER DEFAULT 0,
58
+
59
+ -- Control
60
+ control_token TEXT, -- for remote control auth
61
+
62
+ -- Timestamps (stored as milliseconds since epoch)
63
+ started_at INTEGER,
64
+ ended_at INTEGER,
65
+ duration_ms INTEGER,
66
+ last_activity_at INTEGER,
67
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
68
+ updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
69
+
70
+ -- Sync tracking
71
+ synced_at INTEGER, -- last sync to cloud
72
+ sync_pending INTEGER DEFAULT 1 -- 1 if needs sync, 0 if synced
73
+ );
74
+
75
+ CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id);
76
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
77
+ CREATE INDEX IF NOT EXISTS idx_sessions_sync ON sessions(sync_pending, synced_at);
78
+ CREATE INDEX IF NOT EXISTS idx_sessions_created ON sessions(created_at);
79
+
80
+ -- Messages table (mirrors SessionMessage V2 entity)
81
+ CREATE TABLE IF NOT EXISTS messages (
82
+ id TEXT PRIMARY KEY, -- message UUID
83
+ session_id TEXT NOT NULL, -- FK to sessions
84
+ sequence INTEGER NOT NULL, -- order in conversation
85
+
86
+ -- Content
87
+ role TEXT NOT NULL, -- user | assistant
88
+ content TEXT, -- JSON array of content blocks
89
+
90
+ -- Token metrics
91
+ input_tokens INTEGER DEFAULT 0,
92
+ output_tokens INTEGER DEFAULT 0,
93
+ cache_read_tokens INTEGER DEFAULT 0,
94
+ cache_write_tokens INTEGER DEFAULT 0,
95
+
96
+ -- Cost (cents)
97
+ cost_cents INTEGER DEFAULT 0,
98
+
99
+ -- Tool usage
100
+ tool_use_ids TEXT, -- JSON array of tool use IDs
101
+
102
+ -- Timestamps
103
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
104
+
105
+ -- Sync tracking
106
+ synced_at INTEGER,
107
+ sync_pending INTEGER DEFAULT 1,
108
+
109
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
110
+ );
111
+
112
+ CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, sequence);
113
+ CREATE INDEX IF NOT EXISTS idx_messages_sync ON messages(sync_pending, synced_at);
114
+
115
+ -- Tool uses table (mirrors SessionToolUse V2 entity)
116
+ CREATE TABLE IF NOT EXISTS tool_uses (
117
+ id TEXT PRIMARY KEY, -- tool use UUID
118
+ session_id TEXT NOT NULL, -- FK to sessions
119
+ message_id TEXT, -- FK to messages (optional)
120
+
121
+ -- Tool info
122
+ name TEXT NOT NULL, -- tool name (Read, Write, Bash, etc.)
123
+ category TEXT, -- file | shell | search | web | agent
124
+
125
+ -- Input/Output
126
+ input TEXT, -- JSON input
127
+ output TEXT, -- JSON output (truncated if large)
128
+
129
+ -- Status
130
+ status TEXT DEFAULT 'pending', -- pending | running | success | error
131
+ error_message TEXT,
132
+ exit_code INTEGER,
133
+
134
+ -- File operations (for file tools)
135
+ file_path TEXT,
136
+ operation TEXT, -- read | write | edit | glob | grep
137
+ lines_affected INTEGER,
138
+
139
+ -- Timing
140
+ started_at INTEGER,
141
+ completed_at INTEGER,
142
+ duration_ms INTEGER,
143
+
144
+ -- Timestamps
145
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
146
+
147
+ -- Sync tracking
148
+ synced_at INTEGER,
149
+ sync_pending INTEGER DEFAULT 1,
150
+
151
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
152
+ );
153
+
154
+ CREATE INDEX IF NOT EXISTS idx_tool_uses_session ON tool_uses(session_id);
155
+ CREATE INDEX IF NOT EXISTS idx_tool_uses_name ON tool_uses(name);
156
+ CREATE INDEX IF NOT EXISTS idx_tool_uses_sync ON tool_uses(sync_pending, synced_at);
157
+
158
+ -- Events table (mirrors SessionEvent V2 entity)
159
+ -- Events are lightweight activity markers, auto-deleted after 7 days
160
+ CREATE TABLE IF NOT EXISTS events (
161
+ id TEXT PRIMARY KEY, -- event UUID
162
+ session_id TEXT NOT NULL, -- FK to sessions
163
+
164
+ -- Event info
165
+ type TEXT NOT NULL, -- event type (see EVENT_TYPES)
166
+ data TEXT, -- JSON event data
167
+
168
+ -- Snapshot metrics at time of event
169
+ context_tokens INTEGER,
170
+ cost_cents_so_far INTEGER,
171
+ message_count INTEGER,
172
+
173
+ -- Timestamps
174
+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
175
+
176
+ -- Sync tracking
177
+ synced_at INTEGER,
178
+ sync_pending INTEGER DEFAULT 1,
179
+
180
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
181
+ );
182
+
183
+ CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id, created_at);
184
+ CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
185
+ CREATE INDEX IF NOT EXISTS idx_events_sync ON events(sync_pending, synced_at);
186
+ CREATE INDEX IF NOT EXISTS idx_events_created ON events(created_at);
187
+
188
+ -- Output history table (for terminal output playback)
189
+ CREATE TABLE IF NOT EXISTS output_history (
190
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
191
+ session_id TEXT NOT NULL,
192
+
193
+ -- Output snapshot
194
+ output TEXT NOT NULL, -- terminal output
195
+ status TEXT, -- session status at capture time
196
+
197
+ -- Timestamps
198
+ captured_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
199
+
200
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
201
+ );
202
+
203
+ CREATE INDEX IF NOT EXISTS idx_output_session ON output_history(session_id, captured_at);
204
+
205
+ -- Cleanup trigger: auto-delete events older than 7 days
206
+ -- This runs on every insert to events table
207
+ CREATE TRIGGER IF NOT EXISTS cleanup_old_events
208
+ AFTER INSERT ON events
209
+ BEGIN
210
+ DELETE FROM events
211
+ WHERE created_at < (strftime('%s', 'now') * 1000 - 7 * 24 * 60 * 60 * 1000);
212
+ END;
213
+
214
+ -- Cleanup trigger: auto-delete output history older than 24 hours
215
+ CREATE TRIGGER IF NOT EXISTS cleanup_old_output
216
+ AFTER INSERT ON output_history
217
+ BEGIN
218
+ DELETE FROM output_history
219
+ WHERE captured_at < (strftime('%s', 'now') * 1000 - 24 * 60 * 60 * 1000);
220
+ END;
221
+ `;
222
+ /**
223
+ * Event types (matching Session V2 API)
224
+ */
225
+ exports.EVENT_TYPES = [
226
+ 'session_start',
227
+ 'session_end',
228
+ 'prompt_submitted',
229
+ 'response_started',
230
+ 'response_completed',
231
+ 'tool_started',
232
+ 'tool_completed',
233
+ 'tool_error',
234
+ 'state_change',
235
+ 'command_received',
236
+ 'command_executed',
237
+ 'context_window_warning',
238
+ 'context_compression',
239
+ 'git_commit',
240
+ 'git_push',
241
+ 'file_created',
242
+ 'file_modified',
243
+ 'file_deleted',
244
+ 'error',
245
+ 'warning',
246
+ ];
247
+ /**
248
+ * Session status values
249
+ */
250
+ exports.SESSION_STATUSES = [
251
+ 'active',
252
+ 'idle',
253
+ 'waiting_input',
254
+ 'ended',
255
+ 'error',
256
+ ];
257
+ /**
258
+ * Session state values (for live monitoring)
259
+ */
260
+ exports.SESSION_STATES = [
261
+ 'waiting_for_input',
262
+ 'thinking',
263
+ 'executing_tool',
264
+ 'responding',
265
+ ];
266
+ /**
267
+ * Provider types
268
+ */
269
+ exports.PROVIDERS = ['claude', 'gemini', 'codex'];
270
+ /**
271
+ * Environment types
272
+ */
273
+ exports.ENV_TYPES = ['native', 'local', 'cloud'];
274
+ /**
275
+ * Tool categories
276
+ */
277
+ exports.TOOL_CATEGORIES = ['file', 'shell', 'search', 'web', 'agent'];
278
+ //# sourceMappingURL=schema.js.map