agentfit 0.1.2 → 0.1.5

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 (44) hide show
  1. package/.github/workflows/release.yml +4 -0
  2. package/README.md +0 -2
  3. package/app/(dashboard)/ai-insights/page.tsx +271 -0
  4. package/app/(dashboard)/models/page.tsx +21 -0
  5. package/app/(dashboard)/page.tsx +2 -0
  6. package/app/(dashboard)/sessions/[id]/page.tsx +16 -2
  7. package/app/(dashboard)/settings/page.tsx +168 -0
  8. package/app/api/analyze/aggregate/route.ts +88 -0
  9. package/app/api/analyze/estimate/route.ts +62 -0
  10. package/app/api/analyze/route.ts +142 -0
  11. package/app/api/cc-versions/route.ts +84 -0
  12. package/app/api/config/route.ts +35 -0
  13. package/bin/agentfit.mjs +22 -13
  14. package/components/analyze-confirm-dialog.tsx +81 -0
  15. package/components/app-sidebar.tsx +14 -0
  16. package/components/data-provider.tsx +4 -2
  17. package/components/model-usage-chart.tsx +216 -0
  18. package/components/overview-cards.tsx +1 -1
  19. package/components/session-ai-analysis.tsx +318 -0
  20. package/components/sessions-table.tsx +169 -15
  21. package/components/version-lag-chart.tsx +284 -0
  22. package/electron/main.mjs +81 -59
  23. package/generated/prisma/browser.ts +5 -0
  24. package/generated/prisma/client.ts +5 -0
  25. package/generated/prisma/internal/class.ts +14 -4
  26. package/generated/prisma/internal/prismaNamespace.ts +95 -2
  27. package/generated/prisma/internal/prismaNamespaceBrowser.ts +19 -1
  28. package/generated/prisma/models/Session.ts +57 -1
  29. package/generated/prisma/models/SessionAnalysis.ts +1321 -0
  30. package/generated/prisma/models.ts +1 -0
  31. package/lib/config.ts +45 -0
  32. package/lib/db.ts +1 -1
  33. package/lib/openai.ts +253 -0
  34. package/lib/parse-codex.ts +2 -0
  35. package/lib/parse-logs.ts +21 -7
  36. package/lib/queries.ts +5 -1
  37. package/lib/sync.ts +17 -5
  38. package/package.json +2 -1
  39. package/prisma/migrations/20260404151230_add_session_analysis/migration.sql +18 -0
  40. package/prisma/migrations/20260405230736_add_cli_version/migration.sql +41 -0
  41. package/prisma/migrations/20260406205546_add_model_counts/migration.sql +42 -0
  42. package/prisma/schema.prisma +16 -0
  43. package/prisma/schema.sql +20 -0
  44. /package/prisma/migrations/{20260401144555_add_system_prompt_edits → 20260403214556_init}/migration.sql +0 -0
package/electron/main.mjs CHANGED
@@ -1,6 +1,7 @@
1
- import { app, BrowserWindow, shell, dialog } from 'electron'
2
- import { execSync, spawn } from 'child_process'
3
- import { existsSync } from 'fs'
1
+ import { app, BrowserWindow, shell, dialog, utilityProcess } from 'electron'
2
+ import { createServer } from 'net'
3
+ import { existsSync, readFileSync } from 'fs'
4
+ import { createRequire } from 'module'
4
5
  import path from 'path'
5
6
  import http from 'http'
6
7
 
@@ -17,10 +18,21 @@ const PRISMA_DIR = isPacked
17
18
 
18
19
  const USER_DATA = app.getPath('userData')
19
20
  const DB_PATH = path.join(USER_DATA, 'agentfit.db')
20
- const PORT = 13749
21
+ const PREFERRED_PORT = 13749
21
22
 
22
23
  let serverProcess = null
23
24
  let mainWindow = null
25
+ let activePort = PREFERRED_PORT
26
+
27
+ function findAvailablePort(startPort) {
28
+ return new Promise((resolve) => {
29
+ const server = createServer()
30
+ server.listen(startPort, '127.0.0.1', () => {
31
+ server.close(() => resolve(startPort))
32
+ })
33
+ server.on('error', () => resolve(findAvailablePort(startPort + 1)))
34
+ })
35
+ }
24
36
 
25
37
  function log(msg) {
26
38
  try {
@@ -36,11 +48,8 @@ process.on('uncaughtException', (err) => {
36
48
  throw err
37
49
  })
38
50
 
39
- function ensureDatabase() {
51
+ async function ensureDatabase() {
40
52
  const schemaSQL = path.join(PRISMA_DIR, 'schema.sql')
41
- const initScript = isPacked
42
- ? path.join(process.resourcesPath, 'app.asar.unpacked', 'electron', 'init-db.mjs')
43
- : path.join(import.meta.dirname, 'init-db.mjs')
44
53
 
45
54
  if (!existsSync(schemaSQL)) {
46
55
  throw new Error(`schema.sql not found at ${schemaSQL}. Run "npm run prisma:schema-sql" first.`)
@@ -48,68 +57,81 @@ function ensureDatabase() {
48
57
 
49
58
  log(existsSync(DB_PATH) ? 'Checking database schema...' : 'Creating database...')
50
59
 
51
- // Run init-db.mjs using Electron's bundled Node.js runtime.
60
+ // Run DB init inline to avoid spawning a child Electron process,
61
+ // which causes a second dock icon on macOS.
52
62
  // Uses @libsql/client (already bundled) — works on macOS, Linux, and Windows.
53
63
  // schema.sql uses IF NOT EXISTS — safe to run on existing DBs.
54
64
  try {
55
- execSync(
56
- `"${process.execPath}" "${initScript}" "${DB_PATH}" "${schemaSQL}"`,
57
- {
58
- stdio: 'pipe',
59
- timeout: 15000,
60
- env: { ...process.env, ELECTRON_RUN_AS_NODE: '1' },
61
- }
62
- )
65
+ const serverDir = isPacked
66
+ ? path.join(process.resourcesPath, 'app.asar.unpacked', 'electron', 'server')
67
+ : path.join(import.meta.dirname, 'server')
68
+ const require = createRequire(path.join(serverDir, 'package.json'))
69
+ const { createClient } = require('@libsql/client')
70
+
71
+ const client = createClient({ url: `file:${DB_PATH}` })
72
+ const sql = readFileSync(schemaSQL, 'utf-8')
73
+ await client.executeMultiple(sql)
74
+
75
+ // Add missing columns for existing databases (IF NOT EXISTS is not supported
76
+ // for ALTER TABLE in SQLite, so we catch and ignore "duplicate column" errors)
77
+ const migrations = [
78
+ 'ALTER TABLE "Session" ADD COLUMN "cliVersion" TEXT NOT NULL DEFAULT \'unknown\'',
79
+ 'ALTER TABLE "Session" ADD COLUMN "modelCountsJson" TEXT NOT NULL DEFAULT \'{}\'',
80
+ ]
81
+ for (const stmt of migrations) {
82
+ try { await client.execute(stmt) } catch { /* column already exists */ }
83
+ }
84
+
85
+ client.close()
63
86
  log('Database ready.')
64
87
  } catch (err) {
65
- const stderr = err.stderr?.toString() || err.message
66
- log(`Database setup warning: ${stderr}`)
88
+ log(`Database setup warning: ${err.message}`)
67
89
  }
68
90
  }
69
91
 
70
- function startServer() {
71
- return new Promise((resolve, reject) => {
72
- const serverJs = path.join(SERVER_DIR, 'server.js')
92
+ async function startServer() {
93
+ const serverJs = path.join(SERVER_DIR, 'server.js')
73
94
 
74
- if (!existsSync(serverJs)) {
75
- reject(new Error(`Server not found at ${serverJs}. Run "npm run electron:prepare" first.`))
76
- return
77
- }
95
+ if (!existsSync(serverJs)) {
96
+ throw new Error(`Server not found at ${serverJs}. Run "npm run electron:prepare" first.`)
97
+ }
78
98
 
79
- log(`Starting server from ${serverJs}`)
80
-
81
- // In packaged Electron, process.execPath is the Electron binary.
82
- // We need to set ELECTRON_RUN_AS_NODE=1 so it acts as plain Node.js.
83
- serverProcess = spawn(process.execPath, [serverJs], {
84
- cwd: SERVER_DIR,
85
- stdio: ['ignore', 'pipe', 'pipe'],
86
- env: {
87
- ...process.env,
88
- ELECTRON_RUN_AS_NODE: '1',
89
- PORT: String(PORT),
90
- HOSTNAME: '127.0.0.1',
91
- DATABASE_URL: `file:${DB_PATH}`,
92
- NODE_ENV: 'production',
93
- },
94
- })
99
+ activePort = await findAvailablePort(PREFERRED_PORT)
100
+ if (activePort !== PREFERRED_PORT) {
101
+ log(`Port ${PREFERRED_PORT} is in use, using ${activePort} instead`)
102
+ }
95
103
 
96
- serverProcess.stdout?.on('data', (d) => log(d.toString().trim()))
97
- serverProcess.stderr?.on('data', (d) => log(d.toString().trim()))
98
- serverProcess.on('error', (err) => {
99
- log(`Server process error: ${err.message}`)
100
- reject(err)
101
- })
102
- serverProcess.on('exit', (code) => {
103
- if (code !== null && code !== 0) {
104
- log(`Server exited with code ${code}`)
105
- }
106
- })
104
+ log(`Starting server from ${serverJs}`)
105
+
106
+ // Use utilityProcess.fork() instead of child_process.spawn() to avoid
107
+ // a second dock icon on macOS. It runs as a background Node.js process.
108
+ serverProcess = utilityProcess.fork(serverJs, [], {
109
+ cwd: SERVER_DIR,
110
+ stdio: 'pipe',
111
+ serviceName: 'agentfit-server',
112
+ env: {
113
+ ...process.env,
114
+ PORT: String(activePort),
115
+ HOSTNAME: '127.0.0.1',
116
+ DATABASE_URL: `file:${DB_PATH}`,
117
+ NODE_ENV: 'production',
118
+ },
119
+ })
107
120
 
108
- // Poll until ready
121
+ serverProcess.stdout?.on('data', (d) => log(d.toString().trim()))
122
+ serverProcess.stderr?.on('data', (d) => log(d.toString().trim()))
123
+ serverProcess.on('exit', (code) => {
124
+ if (code !== null && code !== 0) {
125
+ log(`Server exited with code ${code}`)
126
+ }
127
+ })
128
+
129
+ // Poll until ready
130
+ return new Promise((resolve, reject) => {
109
131
  let attempts = 0
110
132
  const check = () => {
111
133
  attempts++
112
- http.get(`http://127.0.0.1:${PORT}`, () => resolve()).on('error', () => {
134
+ http.get(`http://127.0.0.1:${activePort}`, () => resolve()).on('error', () => {
113
135
  if (attempts >= 60) reject(new Error('Server failed to start within 30s'))
114
136
  else setTimeout(check, 500)
115
137
  })
@@ -131,7 +153,7 @@ function createWindow() {
131
153
  },
132
154
  })
133
155
 
134
- mainWindow.loadURL(`http://127.0.0.1:${PORT}`)
156
+ mainWindow.loadURL(`http://127.0.0.1:${activePort}`)
135
157
 
136
158
  mainWindow.webContents.setWindowOpenHandler(({ url }) => {
137
159
  shell.openExternal(url)
@@ -171,7 +193,7 @@ app.whenReady().then(async () => {
171
193
  const splash = showSplash()
172
194
 
173
195
  try {
174
- ensureDatabase()
196
+ await ensureDatabase()
175
197
  await startServer()
176
198
  splash.close()
177
199
  createWindow()
@@ -185,7 +207,7 @@ app.whenReady().then(async () => {
185
207
 
186
208
  app.on('window-all-closed', () => {
187
209
  if (serverProcess) {
188
- serverProcess.kill('SIGTERM')
210
+ serverProcess.kill()
189
211
  serverProcess = null
190
212
  }
191
213
  app.quit()
@@ -193,7 +215,7 @@ app.on('window-all-closed', () => {
193
215
 
194
216
  app.on('before-quit', () => {
195
217
  if (serverProcess) {
196
- serverProcess.kill('SIGTERM')
218
+ serverProcess.kill()
197
219
  serverProcess = null
198
220
  }
199
221
  })
@@ -37,3 +37,8 @@ export type SyncLog = Prisma.SyncLogModel
37
37
  *
38
38
  */
39
39
  export type Report = Prisma.ReportModel
40
+ /**
41
+ * Model SessionAnalysis
42
+ *
43
+ */
44
+ export type SessionAnalysis = Prisma.SessionAnalysisModel
@@ -61,3 +61,8 @@ export type SyncLog = Prisma.SyncLogModel
61
61
  *
62
62
  */
63
63
  export type Report = Prisma.ReportModel
64
+ /**
65
+ * Model SessionAnalysis
66
+ *
67
+ */
68
+ export type SessionAnalysis = Prisma.SessionAnalysisModel
@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
20
20
  "clientVersion": "7.6.0",
21
21
  "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711",
22
22
  "activeProvider": "sqlite",
23
- "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nmodel Session {\n id String @id @default(cuid())\n sessionId String @unique\n project String\n projectPath String\n startTime DateTime\n endTime DateTime\n durationMinutes Float\n userMessages Int\n assistantMessages Int\n totalMessages Int\n inputTokens Int\n outputTokens Int\n cacheCreationTokens Int\n cacheReadTokens Int\n totalTokens Int\n costUSD Float\n model String\n toolCallsTotal Int\n toolCallsJson String // JSON string of Record<string, number>\n skillCallsJson String @default(\"{}\") // JSON string of Record<string, number>\n messageTimestamps String @default(\"[]\") // JSON array of ISO timestamp strings\n apiErrors Int @default(0)\n rateLimitErrors Int @default(0)\n userInterruptions Int @default(0)\n permissionModesJson String @default(\"{}\") // JSON: {default:N, acceptEdits:N, bypassPermissions:N, plan:N}\n systemPromptEdits Int @default(0) // Edits/writes to CLAUDE.md, AGENTS.md, agent.md\n createdAt DateTime @default(now())\n\n @@index([project])\n @@index([startTime])\n}\n\nmodel Image {\n id String @id @default(cuid())\n sessionId String\n messageId String // uuid of the message containing the image\n filename String // relative path under data/images/\n mediaType String // e.g. image/png\n sizeBytes Int\n timestamp DateTime\n role String // user or assistant\n createdAt DateTime @default(now())\n\n @@unique([sessionId, messageId, filename])\n @@index([sessionId])\n}\n\nmodel SyncLog {\n id String @id @default(cuid())\n syncedAt DateTime @default(now())\n filesProcessed Int\n sessionsAdded Int\n sessionsSkipped Int\n}\n\nmodel Report {\n id String @id @default(cuid())\n title String\n generatedAt DateTime @default(now())\n contentJson String\n sessionCount Int\n createdAt DateTime @default(now())\n\n @@index([generatedAt])\n}\n",
23
+ "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nmodel Session {\n id String @id @default(cuid())\n sessionId String @unique\n project String\n projectPath String\n startTime DateTime\n endTime DateTime\n durationMinutes Float\n userMessages Int\n assistantMessages Int\n totalMessages Int\n inputTokens Int\n outputTokens Int\n cacheCreationTokens Int\n cacheReadTokens Int\n totalTokens Int\n costUSD Float\n model String\n toolCallsTotal Int\n toolCallsJson String // JSON string of Record<string, number>\n skillCallsJson String @default(\"{}\") // JSON string of Record<string, number>\n messageTimestamps String @default(\"[]\") // JSON array of ISO timestamp strings\n apiErrors Int @default(0)\n rateLimitErrors Int @default(0)\n userInterruptions Int @default(0)\n permissionModesJson String @default(\"{}\") // JSON: {default:N, acceptEdits:N, bypassPermissions:N, plan:N}\n systemPromptEdits Int @default(0) // Edits/writes to CLAUDE.md, AGENTS.md, agent.md\n cliVersion String @default(\"unknown\") // Claude Code CLI version from JSONL logs\n modelCountsJson String @default(\"{}\") // JSON: {model_name: message_count}\n createdAt DateTime @default(now())\n\n @@index([project])\n @@index([startTime])\n}\n\nmodel Image {\n id String @id @default(cuid())\n sessionId String\n messageId String // uuid of the message containing the image\n filename String // relative path under data/images/\n mediaType String // e.g. image/png\n sizeBytes Int\n timestamp DateTime\n role String // user or assistant\n createdAt DateTime @default(now())\n\n @@unique([sessionId, messageId, filename])\n @@index([sessionId])\n}\n\nmodel SyncLog {\n id String @id @default(cuid())\n syncedAt DateTime @default(now())\n filesProcessed Int\n sessionsAdded Int\n sessionsSkipped Int\n}\n\nmodel Report {\n id String @id @default(cuid())\n title String\n generatedAt DateTime @default(now())\n contentJson String\n sessionCount Int\n createdAt DateTime @default(now())\n\n @@index([generatedAt])\n}\n\nmodel SessionAnalysis {\n id String @id @default(cuid())\n sessionId String @unique\n model String\n classifications String // JSON array of per-message classifications\n totalMessages Int\n inputTokens Int\n outputTokens Int\n costUSD Float\n analyzedAt DateTime @default(now())\n\n @@index([sessionId])\n}\n",
24
24
  "runtimeDataModel": {
25
25
  "models": {},
26
26
  "enums": {},
@@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = {
32
32
  }
33
33
  }
34
34
 
35
- config.runtimeDataModel = JSON.parse("{\"models\":{\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"project\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationMinutes\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"userMessages\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"assistantMessages\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"totalMessages\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inputTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"outputTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cacheCreationTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cacheReadTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"totalTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"costUSD\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"toolCallsTotal\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"toolCallsJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"skillCallsJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"messageTimestamps\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"apiErrors\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"rateLimitErrors\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userInterruptions\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"permissionModesJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"systemPromptEdits\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Image\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"messageId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"filename\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mediaType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sizeBytes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SyncLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"syncedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"filesProcessed\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"sessionsAdded\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"sessionsSkipped\",\"kind\":\"scalar\",\"type\":\"Int\"}],\"dbName\":null},\"Report\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"generatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"contentJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
35
+ config.runtimeDataModel = JSON.parse("{\"models\":{\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"project\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationMinutes\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"userMessages\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"assistantMessages\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"totalMessages\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inputTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"outputTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cacheCreationTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cacheReadTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"totalTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"costUSD\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"toolCallsTotal\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"toolCallsJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"skillCallsJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"messageTimestamps\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"apiErrors\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"rateLimitErrors\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userInterruptions\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"permissionModesJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"systemPromptEdits\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cliVersion\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"modelCountsJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Image\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"messageId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"filename\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mediaType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sizeBytes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SyncLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"syncedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"filesProcessed\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"sessionsAdded\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"sessionsSkipped\",\"kind\":\"scalar\",\"type\":\"Int\"}],\"dbName\":null},\"Report\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"generatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"contentJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SessionAnalysis\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classifications\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"totalMessages\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inputTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"outputTokens\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"costUSD\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"analyzedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
36
36
  config.parameterizationSchema = {
37
- strings: JSON.parse("[\"where\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"data\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"create\",\"update\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"Session.groupBy\",\"Session.aggregate\",\"Image.findUnique\",\"Image.findUniqueOrThrow\",\"Image.findFirst\",\"Image.findFirstOrThrow\",\"Image.findMany\",\"Image.createOne\",\"Image.createMany\",\"Image.createManyAndReturn\",\"Image.updateOne\",\"Image.updateMany\",\"Image.updateManyAndReturn\",\"Image.upsertOne\",\"Image.deleteOne\",\"Image.deleteMany\",\"Image.groupBy\",\"Image.aggregate\",\"SyncLog.findUnique\",\"SyncLog.findUniqueOrThrow\",\"SyncLog.findFirst\",\"SyncLog.findFirstOrThrow\",\"SyncLog.findMany\",\"SyncLog.createOne\",\"SyncLog.createMany\",\"SyncLog.createManyAndReturn\",\"SyncLog.updateOne\",\"SyncLog.updateMany\",\"SyncLog.updateManyAndReturn\",\"SyncLog.upsertOne\",\"SyncLog.deleteOne\",\"SyncLog.deleteMany\",\"SyncLog.groupBy\",\"SyncLog.aggregate\",\"Report.findUnique\",\"Report.findUniqueOrThrow\",\"Report.findFirst\",\"Report.findFirstOrThrow\",\"Report.findMany\",\"Report.createOne\",\"Report.createMany\",\"Report.createManyAndReturn\",\"Report.updateOne\",\"Report.updateMany\",\"Report.updateManyAndReturn\",\"Report.upsertOne\",\"Report.deleteOne\",\"Report.deleteMany\",\"Report.groupBy\",\"Report.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"title\",\"generatedAt\",\"contentJson\",\"sessionCount\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"syncedAt\",\"filesProcessed\",\"sessionsAdded\",\"sessionsSkipped\",\"sessionId\",\"messageId\",\"filename\",\"mediaType\",\"sizeBytes\",\"timestamp\",\"role\",\"sessionId_messageId_filename\",\"project\",\"projectPath\",\"startTime\",\"endTime\",\"durationMinutes\",\"userMessages\",\"assistantMessages\",\"totalMessages\",\"inputTokens\",\"outputTokens\",\"cacheCreationTokens\",\"cacheReadTokens\",\"totalTokens\",\"costUSD\",\"model\",\"toolCallsTotal\",\"toolCallsJson\",\"skillCallsJson\",\"messageTimestamps\",\"apiErrors\",\"rateLimitErrors\",\"userInterruptions\",\"permissionModesJson\",\"systemPromptEdits\",\"set\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
38
- graph: "lQEpQB5MAAB8ADBNAAAEABBOAAB8ADBPAQAAAAFUQAByACFkAQAAAAFsAQBxACFtAQBxACFuQAByACFvQAByACFwCAB9ACFxAgBzACFyAgBzACFzAgBzACF0AgBzACF1AgBzACF2AgBzACF3AgBzACF4AgBzACF5CAB9ACF6AQBxACF7AgBzACF8AQBxACF9AQBxACF-AQBxACF_AgBzACGAAQIAcwAhgQECAHMAIYIBAQBxACGDAQIAcwAhAQAAAAEAIAEAAAABACAeTAAAfAAwTQAABAAQTgAAfAAwTwEAcQAhVEAAcgAhZAEAcQAhbAEAcQAhbQEAcQAhbkAAcgAhb0AAcgAhcAgAfQAhcQIAcwAhcgIAcwAhcwIAcwAhdAIAcwAhdQIAcwAhdgIAcwAhdwIAcwAheAIAcwAheQgAfQAhegEAcQAhewIAcwAhfAEAcQAhfQEAcQAhfgEAcQAhfwIAcwAhgAECAHMAIYEBAgBzACGCAQEAcQAhgwECAHMAIQADAAAABAAgAwAABQAwBAAAAQAgAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACAbTwEAAAABVEAAAAABZAEAAAABbAEAAAABbQEAAAABbkAAAAABb0AAAAABcAgAAAABcQIAAAABcgIAAAABcwIAAAABdAIAAAABdQIAAAABdgIAAAABdwIAAAABeAIAAAABeQgAAAABegEAAAABewIAAAABfAEAAAABfQEAAAABfgEAAAABfwIAAAABgAECAAAAAYEBAgAAAAGCAQEAAAABgwECAAAAAQEIAAAJACAbTwEAAAABVEAAAAABZAEAAAABbAEAAAABbQEAAAABbkAAAAABb0AAAAABcAgAAAABcQIAAAABcgIAAAABcwIAAAABdAIAAAABdQIAAAABdgIAAAABdwIAAAABeAIAAAABeQgAAAABegEAAAABewIAAAABfAEAAAABfQEAAAABfgEAAAABfwIAAAABgAECAAAAAYEBAgAAAAGCAQEAAAABgwECAAAAAQEIAAALADABCAAACwAwG08BAIMBACFUQACEAQAhZAEAgwEAIWwBAIMBACFtAQCDAQAhbkAAhAEAIW9AAIQBACFwCACVAQAhcQIAhQEAIXICAIUBACFzAgCFAQAhdAIAhQEAIXUCAIUBACF2AgCFAQAhdwIAhQEAIXgCAIUBACF5CACVAQAhegEAgwEAIXsCAIUBACF8AQCDAQAhfQEAgwEAIX4BAIMBACF_AgCFAQAhgAECAIUBACGBAQIAhQEAIYIBAQCDAQAhgwECAIUBACECAAAAAQAgCAAADgAgG08BAIMBACFUQACEAQAhZAEAgwEAIWwBAIMBACFtAQCDAQAhbkAAhAEAIW9AAIQBACFwCACVAQAhcQIAhQEAIXICAIUBACFzAgCFAQAhdAIAhQEAIXUCAIUBACF2AgCFAQAhdwIAhQEAIXgCAIUBACF5CACVAQAhegEAgwEAIXsCAIUBACF8AQCDAQAhfQEAgwEAIX4BAIMBACF_AgCFAQAhgAECAIUBACGBAQIAhQEAIYIBAQCDAQAhgwECAIUBACECAAAABAAgCAAAEAAgAgAAAAQAIAgAABAAIAMAAAABACAPAAAJACAQAAAOACABAAAAAQAgAQAAAAQAIAUVAACQAQAgFgAAkQEAIBcAAJQBACAYAACTAQAgGQAAkgEAIB5MAAB5ADBNAAAXABBOAAB5ADBPAQBmACFUQABnACFkAQBmACFsAQBmACFtAQBmACFuQABnACFvQABnACFwCAB6ACFxAgBoACFyAgBoACFzAgBoACF0AgBoACF1AgBoACF2AgBoACF3AgBoACF4AgBoACF5CAB6ACF6AQBmACF7AgBoACF8AQBmACF9AQBmACF-AQBmACF_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-AQBxACF_AgBzACGAAQIAcwAhgQECAHMAIYIBAQBxACGDAQIAcwAhCFUIAAAAAVYIAAAABFcIAAAABFgIAAAAAVkIAAAAAVoIAAAAAVsIAAAAAVwIAGsAIQAAAAAAAYQBAQAAAAEBhAFAAAAAAQWEAQIAAAABhQECAAAAAYYBAgAAAAGHAQIAAAABiAECAAAAAQAAAAAAAAAAAAAAAAAAAAWEAQgAAAABhQEIAAAAAYYBCAAAAAGHAQgAAAABiAEIAAAAAQAAAAAFFQAGFgAHFwAIGAAJGQAKAAAAAAAFFQAGFgAHFwAIGAAJGQAKAAAABRUAEBYAERcAEhgAExkAFAAAAAAABRUAEBYAERcAEhgAExkAFAAAAAUVABoWABsXABwYAB0ZAB4AAAAAAAUVABoWABsXABwYAB0ZAB4AAAAFFQAkFgAlFwAmGAAnGQAoAAAAAAAFFQAkFgAlFwAmGAAnGQAoAQIBAgMBBQYBBgcBBwgBCQoBCgwCCw0DDA8BDRECDhIEERMBEhQBExUCGhgFGxkLHBsMHRwMHh8MHyAMICEMISMMIiUCIyYNJCgMJSoCJisOJywMKC0MKS4CKjEPKzIVLDQWLTUWLjgWLzkWMDoWMTwWMj4CMz8XNEEWNUMCNkQYN0UWOEYWOUcCOkoZO0sfPE0gPU4gPlEgP1IgQFMgQVUgQlcCQ1ghRFogRVwCRl0iR14gSF8gSWACSmMjS2Qp"
37
+ strings: JSON.parse("[\"where\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"data\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"create\",\"update\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"Session.groupBy\",\"Session.aggregate\",\"Image.findUnique\",\"Image.findUniqueOrThrow\",\"Image.findFirst\",\"Image.findFirstOrThrow\",\"Image.findMany\",\"Image.createOne\",\"Image.createMany\",\"Image.createManyAndReturn\",\"Image.updateOne\",\"Image.updateMany\",\"Image.updateManyAndReturn\",\"Image.upsertOne\",\"Image.deleteOne\",\"Image.deleteMany\",\"Image.groupBy\",\"Image.aggregate\",\"SyncLog.findUnique\",\"SyncLog.findUniqueOrThrow\",\"SyncLog.findFirst\",\"SyncLog.findFirstOrThrow\",\"SyncLog.findMany\",\"SyncLog.createOne\",\"SyncLog.createMany\",\"SyncLog.createManyAndReturn\",\"SyncLog.updateOne\",\"SyncLog.updateMany\",\"SyncLog.updateManyAndReturn\",\"SyncLog.upsertOne\",\"SyncLog.deleteOne\",\"SyncLog.deleteMany\",\"SyncLog.groupBy\",\"SyncLog.aggregate\",\"Report.findUnique\",\"Report.findUniqueOrThrow\",\"Report.findFirst\",\"Report.findFirstOrThrow\",\"Report.findMany\",\"Report.createOne\",\"Report.createMany\",\"Report.createManyAndReturn\",\"Report.updateOne\",\"Report.updateMany\",\"Report.updateManyAndReturn\",\"Report.upsertOne\",\"Report.deleteOne\",\"Report.deleteMany\",\"Report.groupBy\",\"Report.aggregate\",\"SessionAnalysis.findUnique\",\"SessionAnalysis.findUniqueOrThrow\",\"SessionAnalysis.findFirst\",\"SessionAnalysis.findFirstOrThrow\",\"SessionAnalysis.findMany\",\"SessionAnalysis.createOne\",\"SessionAnalysis.createMany\",\"SessionAnalysis.createManyAndReturn\",\"SessionAnalysis.updateOne\",\"SessionAnalysis.updateMany\",\"SessionAnalysis.updateManyAndReturn\",\"SessionAnalysis.upsertOne\",\"SessionAnalysis.deleteOne\",\"SessionAnalysis.deleteMany\",\"SessionAnalysis.groupBy\",\"SessionAnalysis.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"sessionId\",\"model\",\"classifications\",\"totalMessages\",\"inputTokens\",\"outputTokens\",\"costUSD\",\"analyzedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"title\",\"generatedAt\",\"contentJson\",\"sessionCount\",\"createdAt\",\"syncedAt\",\"filesProcessed\",\"sessionsAdded\",\"sessionsSkipped\",\"messageId\",\"filename\",\"mediaType\",\"sizeBytes\",\"timestamp\",\"role\",\"sessionId_messageId_filename\",\"project\",\"projectPath\",\"startTime\",\"endTime\",\"durationMinutes\",\"userMessages\",\"assistantMessages\",\"cacheCreationTokens\",\"cacheReadTokens\",\"totalTokens\",\"toolCallsTotal\",\"toolCallsJson\",\"skillCallsJson\",\"messageTimestamps\",\"apiErrors\",\"rateLimitErrors\",\"userInterruptions\",\"permissionModesJson\",\"systemPromptEdits\",\"cliVersion\",\"modelCountsJson\",\"set\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
38
+ graph: "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_ACFgAQB_ACFhAQB_ACFjAgCAAQAhZAIAgAEAIWUCAIABACFmCACBAQAhd0AAggEAIYMBAQB_ACGEAQEAfwAhhQFAAIIBACGGAUAAggEAIYcBCACBAQAhiAECAIABACGJAQIAgAEAIYoBAgCAAQAhiwECAIABACGMAQIAgAEAIY0BAgCAAQAhjgEBAH8AIY8BAQB_ACGQAQEAfwAhkQECAIABACGSAQIAgAEAIZMBAgCAAQAhlAEBAH8AIZUBAgCAAQAhlgEBAH8AIZcBAQB_ACEDAAAABAAgAwAAFgAwFAAAFwAgAwAAAAQAIAMAAAUAMAQAAAEAIA1cAACVAQAwXQAAHQAQXgAAlQEAMF8BAAAAAWABAIwBACF3QACPAQAhfAEAjAEAIX0BAIwBACF-AQCMAQAhfwIAjQEAIYABQACPAQAhgQEBAIwBACGCAQAAlgEAIAEAAAAaACABAAAAGgAgDFwAAJUBADBdAAAdABBeAACVAQAwXwEAjAEAIWABAIwBACF3QACPAQAhfAEAjAEAIX0BAIwBACF-AQCMAQAhfwIAjQEAIYABQACPAQAhgQEBAIwBACEAAwAAAB0AIAMAAB4AMAQAABoAIAMAAAAdACADAAAeADAEAAAaACADAAAAHQAgAwAAHgAwBAAAGgAgCV8BAAAAAWABAAAAAXdAAAAAAXwBAAAAAX0BAAAAAX4BAAAAAX8CAAAAAYABQAAAAAGBAQEAAAABAQgAACIAIAlfAQAAAAFgAQAAAAF3QAAAAAF8AQAAAAF9AQAAAAF-AQAAAAF_AgAAAAGAAUAAAAABgQEBAAAAAQEIAAAkADABCAAAJAAwCV8BAJ4BACFgAQCeAQAhd0AAoQEAIXwBAJ4BACF9AQCeAQAhfgEAngEAIX8CAJ8BACGAAUAAoQEAIYEBAQCeAQAhAgAAABoAIAgAACcAIAlfAQCeAQAhYAEAngEAIXdAAKEBACF8AQCeAQAhfQEAngEAIX4BAJ4BACF_AgCfAQAhgAFAAKEBACGBAQEAngEAIQIAAAAdACAIAAApACACAAAAHQAgCAAAKQAgAwAAABoAIA8AACIAIBAAACcAIAEAAAAaACABAAAAHQAgBRUAAKwBACAWAACtAQAgFwAAsAEAIBgAAK8BACAZAACuAQAgDFwAAJQBADBdAAAwABBeAACUAQAwXwEAfwAhYAEAfwAhd0AAggEAIXwBAH8AIX0BAH8AIX4BAH8AIX8CAIABACGAAUAAggEAIYEBAQB_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-ADBdAAB7ABBeAAB-ADBfAQB_ACFgAQB_ACFhAQB_ACFiAQB_ACFjAgCAAQAhZAIAgAEAIWUCAIABACFmCACBAQAhZ0AAggEAIQMAAABoACADAAB6ADAUAAB7ACADAAAAaAAgAwAAaQAwBAAAZQAgDFwAAH4AMF0AAHsAEF4AAH4AMF8BAH8AIWABAH8AIWEBAH8AIWIBAH8AIWMCAIABACFkAgCAAQAhZQIAgAEAIWYIAIEBACFnQACCAQAhDhUAAIQBACAYAACKAQAgGQAAigEAIGgBAAAAAWkBAAAABGoBAAAABGsBAAAAAWwBAAAAAW0BAAAAAW4BAAAAAW8BAIkBACFwAQAAAAFxAQAAAAFyAQAAAAENFQAAhAEAIBYAAIcBACAXAACEAQAgGAAAhAEAIBkAAIQBACBoAgAAAAFpAgAAAARqAgAAAARrAgAAAAFsAgAAAAFtAgAAAAFuAgAAAAFvAgCIAQAhDRUAAIQBACAWAACHAQAgFwAAhwEAIBgAAIcBACAZAACHAQAgaAgAAAABaQgAAAAEaggAAAAEawgAAAABbAgAAAABbQgAAAABbggAAAABbwgAhgEAIQsVAACEAQAgGAAAhQEAIBkAAIUBACBoQAAAAAFpQAAAAARqQAAAAARrQAAAAAFsQAAAAAFtQAAAAAFuQAAAAAFvQACDAQAhCxUAAIQBACAYAACFAQAgGQAAhQEAIGhAAAAAAWlAAAAABGpAAAAABGtAAAAAAWxAAAAAAW1AAAAAAW5AAAAAAW9AAIMBACEIaAIAAAABaQIAAAAEagIAAAAEawIAAAABbAIAAAABbQIAAAABbgIAAAABbwIAhAEAIQhoQAAAAAFpQAAAAARqQAAAAARrQAAAAAFsQAAAAAFtQAAAAAFuQAAAAAFvQACFAQAhDRUAAIQBACAWAACHAQAgFwAAhwEAIBgAAIcBACAZAACHAQAgaAgAAAABaQgAAAAEaggAAAAEawgAAAABbAgAAAABbQgAAAABbggAAAABbwgAhgEAIQhoCAAAAAFpCAAAAARqCAAAAARrCAAAAAFsCAAAAAFtCAAAAAFuCAAAAAFvCACHAQAhDRUAAIQBACAWAACHAQAgFwAAhAEAIBgAAIQBACAZAACEAQAgaAIAAAABaQIAAAAEagIAAAAEawIAAAABbAIAAAABbQIAAAABbgIAAAABbwIAiAEAIQ4VAACEAQAgGAAAigEAIBkAAIoBACBoAQAAAAFpAQAAAARqAQAAAARrAQAAAAFsAQAAAAFtAQAAAAFuAQAAAAFvAQCJAQAhcAEAAAABcQEAAAABcgEAAAABC2gBAAAAAWkBAAAABGoBAAAABGsBAAAAAWwBAAAAAW0BAAAAAW4BAAAAAW8BAIoBACFwAQAAAAFxAQAAAAFyAQAAAAEMXAAAiwEAMF0AAGgAEF4AAIsBADBfAQCMAQAhYAEAjAEAIWEBAIwBACFiAQCMAQAhYwIAjQEAIWQCAI0BACFlAgCNAQAhZggAjgEAIWdAAI8BACELaAEAAAABaQEAAAAEagEAAAAEawEAAAABbAEAAAABbQEAAAABbgEAAAABbwEAigEAIXABAAAAAXEBAAAAAXIBAAAAAQhoAgAAAAFpAgAAAARqAgAAAARrAgAAAAFsAgAAAAFtAgAAAAFuAgAAAAFvAgCEAQAhCGgIAAAAAWkIAAAABGoIAAAABGsIAAAAAWwIAAAAAW0IAAAAAW4IAAAAAW8IAIcBACEIaEAAAAABaUAAAAAEakAAAAAEa0AAAAABbEAAAAABbUAAAAABbkAAAAABb0AAhQEAIQlcAACQAQAwXQAAYgAQXgAAkAEAMF8BAH8AIXMBAH8AIXRAAIIBACF1AQB_ACF2AgCAAQAhd0AAggEAIQlcAACRAQAwXQAATwAQXgAAkQEAMF8BAIwBACFzAQCMAQAhdEAAjwEAIXUBAIwBACF2AgCNAQAhd0AAjwEAIQhcAACSAQAwXQAASQAQXgAAkgEAMF8BAH8AIXhAAIIBACF5AgCAAQAhegIAgAEAIXsCAIABACEIXAAAkwEAMF0AADYAEF4AAJMBADBfAQCMAQAheEAAjwEAIXkCAI0BACF6AgCNAQAhewIAjQEAIQxcAACUAQAwXQAAMAAQXgAAlAEAMF8BAH8AIWABAH8AIXdAAIIBACF8AQB_ACF9AQB_ACF-AQB_ACF_AgCAAQAhgAFAAIIBACGBAQEAfwAhDFwAAJUBADBdAAAdABBeAACVAQAwXwEAjAEAIWABAIwBACF3QACPAQAhfAEAjAEAIX0BAIwBACF-AQCMAQAhfwIAjQEAIYABQACPAQAhgQEBAIwBACEDYAEAAAABfAEAAAABfQEAAAABIFwAAJcBADBdAAAXABBeAACXAQAwXwEAfwAhYAEAfwAhYQEAfwAhYwIAgAEAIWQCAIABACFlAgCAAQAhZggAgQEAIXdAAIIBACGDAQEAfwAhhAEBAH8AIYUBQACCAQAhhgFAAIIBACGHAQgAgQEAIYgBAgCAAQAhiQECAIABACGKAQIAgAEAIYsBAgCAAQAhjAECAIABACGNAQIAgAEAIY4BAQB_ACGPAQEAfwAhkAEBAH8AIZEBAgCAAQAhkgECAIABACGTAQIAgAEAIZQBAQB_ACGVAQIAgAEAIZYBAQB_ACGXAQEAfwAhIFwAAJgBADBdAAAEABBeAACYAQAwXwEAjAEAIWABAIwBACFhAQCMAQAhYwIAjQEAIWQCAI0BACFlAgCNAQAhZggAjgEAIXdAAI8BACGDAQEAjAEAIYQBAQCMAQAhhQFAAI8BACGGAUAAjwEAIYcBCACOAQAhiAECAI0BACGJAQIAjQEAIYoBAgCNAQAhiwECAI0BACGMAQIAjQEAIY0BAgCNAQAhjgEBAIwBACGPAQEAjAEAIZABAQCMAQAhkQECAI0BACGSAQIAjQEAIZMBAgCNAQAhlAEBAIwBACGVAQIAjQEAIZYBAQCMAQAhlwEBAIwBACEAAAAAAAGYAQEAAAABBZgBAgAAAAGZAQIAAAABmgECAAAAAZsBAgAAAAGcAQIAAAABBZgBCAAAAAGZAQgAAAABmgEIAAAAAZsBCAAAAAGcAQgAAAABAZgBQAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFQAGFgAHFwAIGAAJGQAKAAAAAAAFFQAGFgAHFwAIGAAJGQAKAAAABRUAEBYAERcAEhgAExkAFAAAAAAABRUAEBYAERcAEhgAExkAFAAAAAUVABoWABsXABwYAB0ZAB4AAAAAAAUVABoWABsXABwYAB0ZAB4AAAAFFQAkFgAlFwAmGAAnGQAoAAAAAAAFFQAkFgAlFwAmGAAnGQAoAAAABRUALhYALxcAMBgAMRkAMgAAAAAABRUALhYALxcAMBgAMRkAMgECAQIDAQUGAQYHAQcIAQkKAQoMAgsNAwwPAQ0RAg4SBBETARIUARMVAhoYBRsZCxwbDB0cDB4fDB8gDCAhDCEjDCIlAiMmDSQoDCUqAiYrDicsDCgtDCkuAioxDysyFSw0Fi01Fi44Fi85FjA6FjE8FjI-AjM_FzRBFjVDAjZEGDdFFjhGFjlHAjpKGTtLHzxNID1OID5RID9SIEBTIEFVIEJXAkNYIURaIEVcAkZdIkdeIEhfIElgAkpjI0tkKUxmKk1nKk5qKk9rKlBsKlFuKlJwAlNxK1RzKlV1AlZ2LFd3Klh4Kll5Alp8LVt9Mw"
39
39
  }
40
40
 
41
41
  async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
@@ -227,6 +227,16 @@ export interface PrismaClient<
227
227
  * ```
228
228
  */
229
229
  get report(): Prisma.ReportDelegate<ExtArgs, { omit: OmitOpts }>;
230
+
231
+ /**
232
+ * `prisma.sessionAnalysis`: Exposes CRUD operations for the **SessionAnalysis** model.
233
+ * Example usage:
234
+ * ```ts
235
+ * // Fetch zero or more SessionAnalyses
236
+ * const sessionAnalyses = await prisma.sessionAnalysis.findMany()
237
+ * ```
238
+ */
239
+ get sessionAnalysis(): Prisma.SessionAnalysisDelegate<ExtArgs, { omit: OmitOpts }>;
230
240
  }
231
241
 
232
242
  export function getPrismaClientClass(): PrismaClientConstructor {
@@ -387,7 +387,8 @@ export const ModelName = {
387
387
  Session: 'Session',
388
388
  Image: 'Image',
389
389
  SyncLog: 'SyncLog',
390
- Report: 'Report'
390
+ Report: 'Report',
391
+ SessionAnalysis: 'SessionAnalysis'
391
392
  } as const
392
393
 
393
394
  export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -403,7 +404,7 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
403
404
  omit: GlobalOmitOptions
404
405
  }
405
406
  meta: {
406
- modelProps: "session" | "image" | "syncLog" | "report"
407
+ modelProps: "session" | "image" | "syncLog" | "report" | "sessionAnalysis"
407
408
  txIsolationLevel: TransactionIsolationLevel
408
409
  }
409
410
  model: {
@@ -703,6 +704,80 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
703
704
  }
704
705
  }
705
706
  }
707
+ SessionAnalysis: {
708
+ payload: Prisma.$SessionAnalysisPayload<ExtArgs>
709
+ fields: Prisma.SessionAnalysisFieldRefs
710
+ operations: {
711
+ findUnique: {
712
+ args: Prisma.SessionAnalysisFindUniqueArgs<ExtArgs>
713
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload> | null
714
+ }
715
+ findUniqueOrThrow: {
716
+ args: Prisma.SessionAnalysisFindUniqueOrThrowArgs<ExtArgs>
717
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>
718
+ }
719
+ findFirst: {
720
+ args: Prisma.SessionAnalysisFindFirstArgs<ExtArgs>
721
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload> | null
722
+ }
723
+ findFirstOrThrow: {
724
+ args: Prisma.SessionAnalysisFindFirstOrThrowArgs<ExtArgs>
725
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>
726
+ }
727
+ findMany: {
728
+ args: Prisma.SessionAnalysisFindManyArgs<ExtArgs>
729
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>[]
730
+ }
731
+ create: {
732
+ args: Prisma.SessionAnalysisCreateArgs<ExtArgs>
733
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>
734
+ }
735
+ createMany: {
736
+ args: Prisma.SessionAnalysisCreateManyArgs<ExtArgs>
737
+ result: BatchPayload
738
+ }
739
+ createManyAndReturn: {
740
+ args: Prisma.SessionAnalysisCreateManyAndReturnArgs<ExtArgs>
741
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>[]
742
+ }
743
+ delete: {
744
+ args: Prisma.SessionAnalysisDeleteArgs<ExtArgs>
745
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>
746
+ }
747
+ update: {
748
+ args: Prisma.SessionAnalysisUpdateArgs<ExtArgs>
749
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>
750
+ }
751
+ deleteMany: {
752
+ args: Prisma.SessionAnalysisDeleteManyArgs<ExtArgs>
753
+ result: BatchPayload
754
+ }
755
+ updateMany: {
756
+ args: Prisma.SessionAnalysisUpdateManyArgs<ExtArgs>
757
+ result: BatchPayload
758
+ }
759
+ updateManyAndReturn: {
760
+ args: Prisma.SessionAnalysisUpdateManyAndReturnArgs<ExtArgs>
761
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>[]
762
+ }
763
+ upsert: {
764
+ args: Prisma.SessionAnalysisUpsertArgs<ExtArgs>
765
+ result: runtime.Types.Utils.PayloadToResult<Prisma.$SessionAnalysisPayload>
766
+ }
767
+ aggregate: {
768
+ args: Prisma.SessionAnalysisAggregateArgs<ExtArgs>
769
+ result: runtime.Types.Utils.Optional<Prisma.AggregateSessionAnalysis>
770
+ }
771
+ groupBy: {
772
+ args: Prisma.SessionAnalysisGroupByArgs<ExtArgs>
773
+ result: runtime.Types.Utils.Optional<Prisma.SessionAnalysisGroupByOutputType>[]
774
+ }
775
+ count: {
776
+ args: Prisma.SessionAnalysisCountArgs<ExtArgs>
777
+ result: runtime.Types.Utils.Optional<Prisma.SessionAnalysisCountAggregateOutputType> | number
778
+ }
779
+ }
780
+ }
706
781
  }
707
782
  } & {
708
783
  other: {
@@ -766,6 +841,8 @@ export const SessionScalarFieldEnum = {
766
841
  userInterruptions: 'userInterruptions',
767
842
  permissionModesJson: 'permissionModesJson',
768
843
  systemPromptEdits: 'systemPromptEdits',
844
+ cliVersion: 'cliVersion',
845
+ modelCountsJson: 'modelCountsJson',
769
846
  createdAt: 'createdAt'
770
847
  } as const
771
848
 
@@ -810,6 +887,21 @@ export const ReportScalarFieldEnum = {
810
887
  export type ReportScalarFieldEnum = (typeof ReportScalarFieldEnum)[keyof typeof ReportScalarFieldEnum]
811
888
 
812
889
 
890
+ export const SessionAnalysisScalarFieldEnum = {
891
+ id: 'id',
892
+ sessionId: 'sessionId',
893
+ model: 'model',
894
+ classifications: 'classifications',
895
+ totalMessages: 'totalMessages',
896
+ inputTokens: 'inputTokens',
897
+ outputTokens: 'outputTokens',
898
+ costUSD: 'costUSD',
899
+ analyzedAt: 'analyzedAt'
900
+ } as const
901
+
902
+ export type SessionAnalysisScalarFieldEnum = (typeof SessionAnalysisScalarFieldEnum)[keyof typeof SessionAnalysisScalarFieldEnum]
903
+
904
+
813
905
  export const SortOrder = {
814
906
  asc: 'asc',
815
907
  desc: 'desc'
@@ -950,6 +1042,7 @@ export type GlobalOmitConfig = {
950
1042
  image?: Prisma.ImageOmit
951
1043
  syncLog?: Prisma.SyncLogOmit
952
1044
  report?: Prisma.ReportOmit
1045
+ sessionAnalysis?: Prisma.SessionAnalysisOmit
953
1046
  }
954
1047
 
955
1048
  /* Types for Logging */
@@ -54,7 +54,8 @@ export const ModelName = {
54
54
  Session: 'Session',
55
55
  Image: 'Image',
56
56
  SyncLog: 'SyncLog',
57
- Report: 'Report'
57
+ Report: 'Report',
58
+ SessionAnalysis: 'SessionAnalysis'
58
59
  } as const
59
60
 
60
61
  export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -97,6 +98,8 @@ export const SessionScalarFieldEnum = {
97
98
  userInterruptions: 'userInterruptions',
98
99
  permissionModesJson: 'permissionModesJson',
99
100
  systemPromptEdits: 'systemPromptEdits',
101
+ cliVersion: 'cliVersion',
102
+ modelCountsJson: 'modelCountsJson',
100
103
  createdAt: 'createdAt'
101
104
  } as const
102
105
 
@@ -141,6 +144,21 @@ export const ReportScalarFieldEnum = {
141
144
  export type ReportScalarFieldEnum = (typeof ReportScalarFieldEnum)[keyof typeof ReportScalarFieldEnum]
142
145
 
143
146
 
147
+ export const SessionAnalysisScalarFieldEnum = {
148
+ id: 'id',
149
+ sessionId: 'sessionId',
150
+ model: 'model',
151
+ classifications: 'classifications',
152
+ totalMessages: 'totalMessages',
153
+ inputTokens: 'inputTokens',
154
+ outputTokens: 'outputTokens',
155
+ costUSD: 'costUSD',
156
+ analyzedAt: 'analyzedAt'
157
+ } as const
158
+
159
+ export type SessionAnalysisScalarFieldEnum = (typeof SessionAnalysisScalarFieldEnum)[keyof typeof SessionAnalysisScalarFieldEnum]
160
+
161
+
144
162
  export const SortOrder = {
145
163
  asc: 'asc',
146
164
  desc: 'desc'