1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
import { getDb } from "./index";
import { v4 as uuid } from "uuid";
export type Phase = "research" | "plan" | "implement";
export type PermissionMode = "acceptEdits" | "bypassPermissions";
export interface Session {
id: string;
project_id: string;
name: string;
phase: Phase;
claude_session_id: string | null;
permission_mode: PermissionMode;
git_branch: string | null;
created_at: number;
updated_at: number;
}
export interface Message {
id: string;
session_id: string;
role: "user" | "assistant";
content: string;
created_at: number;
}
export function listSessions(projectId: string): Session[] {
return getDb()
.prepare("SELECT * FROM sessions WHERE project_id = ? ORDER BY updated_at DESC")
.all(projectId) as Session[];
}
export function getSession(id: string): Session | undefined {
return getDb()
.prepare("SELECT * FROM sessions WHERE id = ?")
.get(id) as Session | undefined;
}
export function createSession(projectId: string, name: string): Session {
const db = getDb();
const id = uuid();
const now = Math.floor(Date.now() / 1000);
db.prepare(
`INSERT INTO sessions (id, project_id, name, phase, permission_mode, created_at, updated_at)
VALUES (?, ?, ?, 'research', 'acceptEdits', ?, ?)`
).run(id, projectId, name, now, now);
return {
id,
project_id: projectId,
name,
phase: "research",
claude_session_id: null,
permission_mode: "acceptEdits",
git_branch: null,
created_at: now,
updated_at: now,
};
}
export function updateSession(
id: string,
updates: Partial<Pick<Session, "name" | "phase" | "claude_session_id" | "permission_mode" | "git_branch">>
): void {
const db = getDb();
const sets: string[] = [];
const values: any[] = [];
for (const [key, value] of Object.entries(updates)) {
if (value !== undefined) {
sets.push(`${key} = ?`);
values.push(value);
}
}
if (sets.length > 0) {
sets.push("updated_at = ?");
values.push(Math.floor(Date.now() / 1000));
values.push(id);
db.prepare(`UPDATE sessions SET ${sets.join(", ")} WHERE id = ?`).run(...values);
}
}
export function deleteSession(id: string): void {
getDb().prepare("DELETE FROM sessions WHERE id = ?").run(id);
}
// Messages
export function listMessages(sessionId: string): Message[] {
return getDb()
.prepare("SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC")
.all(sessionId) as Message[];
}
export function addMessage(sessionId: string, role: Message["role"], content: string): Message {
const db = getDb();
const id = uuid();
const now = Math.floor(Date.now() / 1000);
db.prepare(
"INSERT INTO messages (id, session_id, role, content, created_at) VALUES (?, ?, ?, ?, ?)"
).run(id, sessionId, role, content, now);
db.prepare("UPDATE sessions SET updated_at = ? WHERE id = ?").run(now, sessionId);
return { id, session_id: sessionId, role, content, created_at: now };
}
|