aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/db/sessions.ts
blob: bc22d15ab1994eb0a167471533f33f0f3369c4e1 (plain)
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, phase: Phase = "research"): 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 (?, ?, ?, ?, 'acceptEdits', ?, ?)`
  ).run(id, projectId, name, phase, now, now);

  return {
    id,
    project_id: projectId,
    name,
    phase,
    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 };
}