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.
- package/dist/hook.d.ts +6 -5
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +200 -81
- package/dist/hook.js.map +1 -1
- package/dist/hooks/daemon-client.d.ts +39 -0
- package/dist/hooks/daemon-client.d.ts.map +1 -0
- package/dist/hooks/daemon-client.js +238 -0
- package/dist/hooks/daemon-client.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +23 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/server/auth.d.ts +51 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +154 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/index.d.ts +156 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +595 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/port-finder.d.ts +45 -0
- package/dist/server/port-finder.d.ts.map +1 -0
- package/dist/server/port-finder.js +267 -0
- package/dist/server/port-finder.js.map +1 -0
- package/dist/storage/index.d.ts +82 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +209 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/manager.d.ts +112 -0
- package/dist/storage/manager.d.ts.map +1 -0
- package/dist/storage/manager.js +200 -0
- package/dist/storage/manager.js.map +1 -0
- package/dist/storage/repositories/events.d.ts +101 -0
- package/dist/storage/repositories/events.d.ts.map +1 -0
- package/dist/storage/repositories/events.js +258 -0
- package/dist/storage/repositories/events.js.map +1 -0
- package/dist/storage/repositories/index.d.ts +9 -0
- package/dist/storage/repositories/index.d.ts.map +1 -0
- package/dist/storage/repositories/index.js +25 -0
- package/dist/storage/repositories/index.js.map +1 -0
- package/dist/storage/repositories/messages.d.ts +123 -0
- package/dist/storage/repositories/messages.d.ts.map +1 -0
- package/dist/storage/repositories/messages.js +209 -0
- package/dist/storage/repositories/messages.js.map +1 -0
- package/dist/storage/repositories/sessions.d.ts +158 -0
- package/dist/storage/repositories/sessions.d.ts.map +1 -0
- package/dist/storage/repositories/sessions.js +342 -0
- package/dist/storage/repositories/sessions.js.map +1 -0
- package/dist/storage/schema.d.ts +42 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +278 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/sync/background-sync.d.ts +83 -0
- package/dist/sync/background-sync.d.ts.map +1 -0
- package/dist/sync/background-sync.js +367 -0
- package/dist/sync/background-sync.js.map +1 -0
- package/dist/sync/index.d.ts +7 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +23 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/unified-daemon.js +219 -0
- package/dist/unified-daemon.js.map +1 -1
- package/dist/unified-hook.d.ts +4 -3
- package/dist/unified-hook.d.ts.map +1 -1
- package/dist/unified-hook.js +155 -31
- package/dist/unified-hook.js.map +1 -1
- 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
|