agentfit 0.1.1 → 0.1.2

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.
@@ -11,7 +11,7 @@ import {
11
11
  SelectValue,
12
12
  } from '@/components/ui/select'
13
13
  import { AppSidebar } from './app-sidebar'
14
- import { useData, type TimeRange } from './data-provider'
14
+ import { useData, type TimeRange, type AgentType } from './data-provider'
15
15
  import { getPlugin } from '@/lib/plugins'
16
16
  import '@/plugins' // ensure plugins are registered
17
17
  import type { ReactNode } from 'react'
@@ -25,23 +25,22 @@ const VIEW_TITLES: Record<string, ReactNode> = {
25
25
  '/sessions': 'Sessions',
26
26
  '/personality': 'Personality Fit',
27
27
  '/commands': 'Command Usage',
28
- '/images': 'Images',
28
+ '/images': 'Image Analysis',
29
29
  '/coach': 'CRAFT Coach',
30
30
  '/flow': 'Session Flow',
31
+ '/community': 'Community',
32
+ '/reports': 'Reports',
33
+ '/data-management': 'Data Management',
31
34
  }
32
35
 
33
36
  function resolveTitle(pathname: string): ReactNode {
34
37
  if (VIEW_TITLES[pathname]) return VIEW_TITLES[pathname]
35
- if (pathname === '/community') return 'Community'
36
- // Community plugin routes: /community/<slug>
37
38
  const match = pathname.match(/^\/community\/([a-z0-9-]+)$/)
38
39
  if (match) {
39
40
  const plugin = getPlugin(match[1])
40
41
  if (plugin) return plugin.manifest.name
41
42
  }
42
- if (pathname === '/reports') return 'Reports'
43
43
  if (pathname.startsWith('/reports/')) return 'Report Detail'
44
- if (pathname === '/settings') return 'Settings'
45
44
  if (pathname.startsWith('/sessions/')) return 'Session Detail'
46
45
  return 'Dashboard'
47
46
  }
@@ -66,12 +65,13 @@ export function DashboardShell({ children }: { children: ReactNode }) {
66
65
  const pathname = usePathname()
67
66
  const {
68
67
  agent, setAgent, timeRange, setTimeRange,
68
+ selectedProject, setSelectedProject, allProjects,
69
69
  loading,
70
70
  } = useData()
71
71
 
72
72
  const title = resolveTitle(pathname)
73
- const communityMatch = pathname.match(/^\/community\/([a-z0-9-]+)$/)
74
- const communityPlugin = communityMatch ? getPlugin(communityMatch[1]) : undefined
73
+ const communitySlug = pathname.match(/^\/community\/([a-z0-9-]+)$/)?.[1]
74
+ const communityPlugin = communitySlug ? getPlugin(communitySlug) : undefined
75
75
  const showTimeFilter =
76
76
  !NO_TIME_FILTER.has(pathname) && !communityPlugin?.manifest.customDataSource
77
77
 
@@ -113,7 +113,20 @@ export function DashboardShell({ children }: { children: ReactNode }) {
113
113
  ))}
114
114
  </div>
115
115
  )}
116
- <Select value={agent} onValueChange={(v) => v && setAgent(v as 'claude' | 'codex' | 'combined')}>
116
+ {allProjects.length > 1 && (
117
+ <Select value={selectedProject} onValueChange={(v) => v && setSelectedProject(v)}>
118
+ <SelectTrigger className="h-8 w-[160px] text-xs">
119
+ <SelectValue>{selectedProject === 'all' ? 'All Projects' : selectedProject}</SelectValue>
120
+ </SelectTrigger>
121
+ <SelectContent>
122
+ <SelectItem value="all">All Projects</SelectItem>
123
+ {allProjects.map((p) => (
124
+ <SelectItem key={p} value={p}>{p}</SelectItem>
125
+ ))}
126
+ </SelectContent>
127
+ </Select>
128
+ )}
129
+ <Select value={agent} onValueChange={(v) => v && setAgent(v as AgentType)}>
117
130
  <SelectTrigger className="h-8 w-[130px] text-xs">
118
131
  <SelectValue>{AGENT_LABELS[agent]}</SelectValue>
119
132
  </SelectTrigger>
@@ -23,6 +23,9 @@ interface DataContextValue {
23
23
  setAgent: (agent: AgentType) => void
24
24
  timeRange: TimeRange
25
25
  setTimeRange: (range: TimeRange) => void
26
+ selectedProject: string
27
+ setSelectedProject: (project: string) => void
28
+ allProjects: string[]
26
29
  syncing: boolean
27
30
  resetting: boolean
28
31
  lastSyncResult: SyncResult | null
@@ -47,16 +50,21 @@ const RANGE_DAYS: Record<TimeRange, number> = {
47
50
  'all': Infinity,
48
51
  }
49
52
 
50
- function filterByTimeRange(raw: UsageData | null, range: TimeRange): UsageData | null {
51
- if (!raw || range === 'all') return raw
53
+ function filterData(raw: UsageData | null, range: TimeRange, project: string): UsageData | null {
54
+ if (!raw) return raw
55
+ if (range === 'all' && project === 'all') return raw
52
56
 
53
57
  const days = RANGE_DAYS[range]
54
58
  const cutoff = new Date()
55
59
  cutoff.setDate(cutoff.getDate() - days)
56
- const cutoffISO = cutoff.toISOString()
60
+ const cutoffISO = range === 'all' ? '' : cutoff.toISOString()
57
61
 
58
- // Filter sessions
59
- const sessions = raw.sessions.filter(s => s.startTime >= cutoffISO)
62
+ // Filter sessions by time range and project
63
+ const sessions = raw.sessions.filter(s => {
64
+ if (range !== 'all' && s.startTime < cutoffISO) return false
65
+ if (project !== 'all' && s.project !== project) return false
66
+ return true
67
+ })
60
68
 
61
69
  // Re-aggregate from filtered sessions
62
70
  const projectMap = new Map<string, ProjectSummary>()
@@ -142,6 +150,7 @@ function filterByTimeRange(raw: UsageData | null, range: TimeRange): UsageData |
142
150
  totalCacheReadTokens: sessions.reduce((a, s) => a + s.cacheReadTokens, 0),
143
151
  totalTokens: sessions.reduce((a, s) => a + s.totalTokens, 0),
144
152
  totalCostUSD: sessions.reduce((a, s) => a + s.costUSD, 0),
153
+ totalSystemPromptEdits: sessions.reduce((a, s) => a + (s.systemPromptEdits ?? 0), 0),
145
154
  totalDurationMinutes: sessions.reduce((a, s) => a + s.durationMinutes, 0),
146
155
  totalToolCalls: sessions.reduce((a, s) => a + s.toolCallsTotal, 0),
147
156
  totalApiErrors: sessions.reduce((a, s) => a + s.apiErrors, 0),
@@ -183,13 +192,19 @@ export function DataProvider({ children }: { children: ReactNode }) {
183
192
  const [error, setError] = useState<string | null>(null)
184
193
  const [agent, setAgentState] = useState<AgentType>('claude')
185
194
  const [timeRange, setTimeRange] = useState<TimeRange>('all')
195
+ const [selectedProject, setSelectedProject] = useState<string>('all')
186
196
  const [syncing, setSyncing] = useState(false)
187
197
  const [resetting, setResetting] = useState(false)
188
198
  const [lastSyncResult, setLastSyncResult] = useState<SyncResult | null>(null)
189
199
  const [lastSyncTime, setLastSyncTime] = useState<Date | null>(null)
190
200
  const [newSessionsAvailable, setNewSessionsAvailable] = useState(0)
191
201
 
192
- const data = useMemo(() => filterByTimeRange(rawData, timeRange), [rawData, timeRange])
202
+ const data = useMemo(() => filterData(rawData, timeRange, selectedProject), [rawData, timeRange, selectedProject])
203
+
204
+ const allProjects = useMemo(() => {
205
+ if (!rawData) return []
206
+ return rawData.projects.map(p => p.name).sort((a, b) => a.localeCompare(b))
207
+ }, [rawData])
193
208
 
194
209
  const fetchData = useCallback(async (selectedAgent: AgentType) => {
195
210
  try {
@@ -268,6 +283,7 @@ export function DataProvider({ children }: { children: ReactNode }) {
268
283
  <DataContext.Provider value={{
269
284
  data, loading, error, agent, setAgent,
270
285
  timeRange, setTimeRange,
286
+ selectedProject, setSelectedProject, allProjects,
271
287
  syncing, resetting, lastSyncResult, lastSyncTime, handleSync, handleReset,
272
288
  newSessionsAvailable,
273
289
  }}>
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>com.apple.security.cs.allow-jit</key>
6
+ <true/>
7
+ <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
8
+ <true/>
9
+ <key>com.apple.security.cs.allow-dyld-environment-variables</key>
10
+ <true/>
11
+ <key>com.apple.security.network.client</key>
12
+ <true/>
13
+ <key>com.apple.security.files.user-selected.read-write</key>
14
+ <true/>
15
+ </dict>
16
+ </plist>
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Database initialization script.
3
+ * Spawned by Electron main process with ELECTRON_RUN_AS_NODE=1.
4
+ * Reads schema.sql and executes it against the SQLite database.
5
+ * Uses @libsql/client which is already bundled — works on macOS, Linux, and Windows.
6
+ *
7
+ * Usage: node init-db.mjs <db-path> <schema-sql-path>
8
+ */
9
+
10
+ import { readFileSync } from 'fs'
11
+ import { createRequire } from 'module'
12
+ import path from 'path'
13
+
14
+ const [dbPath, schemaPath] = process.argv.slice(2)
15
+
16
+ // In packaged app, @libsql/client lives inside electron/server/node_modules
17
+ const serverDir = path.join(path.dirname(new URL(import.meta.url).pathname), 'server')
18
+ const require = createRequire(path.join(serverDir, 'package.json'))
19
+ const { createClient } = require('@libsql/client')
20
+
21
+ if (!dbPath || !schemaPath) {
22
+ console.error('Usage: node init-db.mjs <db-path> <schema-sql-path>')
23
+ process.exit(1)
24
+ }
25
+
26
+ const client = createClient({ url: `file:${dbPath}` })
27
+ const sql = readFileSync(schemaPath, 'utf-8')
28
+
29
+ try {
30
+ await client.executeMultiple(sql)
31
+ console.log('Database ready.')
32
+ } catch (err) {
33
+ console.error(`Database init error: ${err.message}`)
34
+ process.exit(1)
35
+ } finally {
36
+ client.close()
37
+ }
@@ -0,0 +1,203 @@
1
+ import { app, BrowserWindow, shell, dialog } from 'electron'
2
+ import { execSync, spawn } from 'child_process'
3
+ import { existsSync } from 'fs'
4
+ import path from 'path'
5
+ import http from 'http'
6
+
7
+ const isPacked = app.isPackaged
8
+
9
+ // In packed app, asarUnpacked content is at app.asar.unpacked
10
+ const SERVER_DIR = isPacked
11
+ ? path.join(process.resourcesPath, 'app.asar.unpacked', 'electron', 'server')
12
+ : path.join(import.meta.dirname, 'server')
13
+
14
+ const PRISMA_DIR = isPacked
15
+ ? path.join(process.resourcesPath, 'prisma')
16
+ : path.join(import.meta.dirname, '..', 'prisma')
17
+
18
+ const USER_DATA = app.getPath('userData')
19
+ const DB_PATH = path.join(USER_DATA, 'agentfit.db')
20
+ const PORT = 13749
21
+
22
+ let serverProcess = null
23
+ let mainWindow = null
24
+
25
+ function log(msg) {
26
+ try {
27
+ console.log(`[AgentFit] ${msg}`)
28
+ } catch {
29
+ // Ignore EPIPE — no terminal in packaged app
30
+ }
31
+ }
32
+
33
+ // Prevent uncaught EPIPE from crashing the app
34
+ process.on('uncaughtException', (err) => {
35
+ if (err.code === 'EPIPE') return
36
+ throw err
37
+ })
38
+
39
+ function ensureDatabase() {
40
+ 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
+
45
+ if (!existsSync(schemaSQL)) {
46
+ throw new Error(`schema.sql not found at ${schemaSQL}. Run "npm run prisma:schema-sql" first.`)
47
+ }
48
+
49
+ log(existsSync(DB_PATH) ? 'Checking database schema...' : 'Creating database...')
50
+
51
+ // Run init-db.mjs using Electron's bundled Node.js runtime.
52
+ // Uses @libsql/client (already bundled) — works on macOS, Linux, and Windows.
53
+ // schema.sql uses IF NOT EXISTS — safe to run on existing DBs.
54
+ 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
+ )
63
+ log('Database ready.')
64
+ } catch (err) {
65
+ const stderr = err.stderr?.toString() || err.message
66
+ log(`Database setup warning: ${stderr}`)
67
+ }
68
+ }
69
+
70
+ function startServer() {
71
+ return new Promise((resolve, reject) => {
72
+ const serverJs = path.join(SERVER_DIR, 'server.js')
73
+
74
+ if (!existsSync(serverJs)) {
75
+ reject(new Error(`Server not found at ${serverJs}. Run "npm run electron:prepare" first.`))
76
+ return
77
+ }
78
+
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
+ })
95
+
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
+ })
107
+
108
+ // Poll until ready
109
+ let attempts = 0
110
+ const check = () => {
111
+ attempts++
112
+ http.get(`http://127.0.0.1:${PORT}`, () => resolve()).on('error', () => {
113
+ if (attempts >= 60) reject(new Error('Server failed to start within 30s'))
114
+ else setTimeout(check, 500)
115
+ })
116
+ }
117
+ setTimeout(check, 1000)
118
+ })
119
+ }
120
+
121
+ function createWindow() {
122
+ mainWindow = new BrowserWindow({
123
+ width: 1400,
124
+ height: 900,
125
+ minWidth: 900,
126
+ minHeight: 600,
127
+ title: 'AgentFit',
128
+ webPreferences: {
129
+ nodeIntegration: false,
130
+ contextIsolation: true,
131
+ },
132
+ })
133
+
134
+ mainWindow.loadURL(`http://127.0.0.1:${PORT}`)
135
+
136
+ mainWindow.webContents.setWindowOpenHandler(({ url }) => {
137
+ shell.openExternal(url)
138
+ return { action: 'deny' }
139
+ })
140
+
141
+ mainWindow.on('closed', () => {
142
+ mainWindow = null
143
+ })
144
+ }
145
+
146
+ function showSplash() {
147
+ const splash = new BrowserWindow({
148
+ width: 400,
149
+ height: 300,
150
+ frame: false,
151
+ transparent: true,
152
+ resizable: false,
153
+ alwaysOnTop: true,
154
+ })
155
+
156
+ splash.loadURL(`data:text/html,
157
+ <html>
158
+ <body style="display:flex;align-items:center;justify-content:center;height:100vh;margin:0;font-family:system-ui;background:rgba(0,0,0,0.85);color:white;border-radius:16px;-webkit-app-region:drag;">
159
+ <div style="text-align:center">
160
+ <h1 style="font-size:28px;margin-bottom:8px">AgentFit</h1>
161
+ <p style="opacity:0.7;font-size:14px">Starting server...</p>
162
+ </div>
163
+ </body>
164
+ </html>
165
+ `)
166
+
167
+ return splash
168
+ }
169
+
170
+ app.whenReady().then(async () => {
171
+ const splash = showSplash()
172
+
173
+ try {
174
+ ensureDatabase()
175
+ await startServer()
176
+ splash.close()
177
+ createWindow()
178
+ } catch (err) {
179
+ splash.close()
180
+ log(`Startup error: ${err.message}`)
181
+ dialog.showErrorBox('AgentFit Startup Error', `Failed to start: ${err.message}`)
182
+ app.quit()
183
+ }
184
+ })
185
+
186
+ app.on('window-all-closed', () => {
187
+ if (serverProcess) {
188
+ serverProcess.kill('SIGTERM')
189
+ serverProcess = null
190
+ }
191
+ app.quit()
192
+ })
193
+
194
+ app.on('before-quit', () => {
195
+ if (serverProcess) {
196
+ serverProcess.kill('SIGTERM')
197
+ serverProcess = null
198
+ }
199
+ })
200
+
201
+ app.on('activate', () => {
202
+ if (mainWindow === null) createWindow()
203
+ })
@@ -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 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 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",
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\":\"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\":\"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\":{}}")
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\",\"set\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
38
- graph: "lQEpQB1MAAB8ADBNAAAEABBOAAB8ADBPAQAAAAFUQAByACFkAQAAAAFsAQBxACFtAQBxACFuQAByACFvQAByACFwCAB9ACFxAgBzACFyAgBzACFzAgBzACF0AgBzACF1AgBzACF2AgBzACF3AgBzACF4AgBzACF5CAB9ACF6AQBxACF7AgBzACF8AQBxACF9AQBxACF-AQBxACF_AgBzACGAAQIAcwAhgQECAHMAIYIBAQBxACEBAAAAAQAgAQAAAAEAIB1MAAB8ADBNAAAEABBOAAB8ADBPAQBxACFUQAByACFkAQBxACFsAQBxACFtAQBxACFuQAByACFvQAByACFwCAB9ACFxAgBzACFyAgBzACFzAgBzACF0AgBzACF1AgBzACF2AgBzACF3AgBzACF4AgBzACF5CAB9ACF6AQBxACF7AgBzACF8AQBxACF9AQBxACF-AQBxACF_AgBzACGAAQIAcwAhgQECAHMAIYIBAQBxACEAAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACADAAAABAAgAwAABQAwBAAAAQAgGk8BAAAAAVRAAAAAAWQBAAAAAWwBAAAAAW0BAAAAAW5AAAAAAW9AAAAAAXAIAAAAAXECAAAAAXICAAAAAXMCAAAAAXQCAAAAAXUCAAAAAXYCAAAAAXcCAAAAAXgCAAAAAXkIAAAAAXoBAAAAAXsCAAAAAXwBAAAAAX0BAAAAAX4BAAAAAX8CAAAAAYABAgAAAAGBAQIAAAABggEBAAAAAQEIAAAJACAaTwEAAAABVEAAAAABZAEAAAABbAEAAAABbQEAAAABbkAAAAABb0AAAAABcAgAAAABcQIAAAABcgIAAAABcwIAAAABdAIAAAABdQIAAAABdgIAAAABdwIAAAABeAIAAAABeQgAAAABegEAAAABewIAAAABfAEAAAABfQEAAAABfgEAAAABfwIAAAABgAECAAAAAYEBAgAAAAGCAQEAAAABAQgAAAsAMAEIAAALADAaTwEAgwEAIVRAAIQBACFkAQCDAQAhbAEAgwEAIW0BAIMBACFuQACEAQAhb0AAhAEAIXAIAJUBACFxAgCFAQAhcgIAhQEAIXMCAIUBACF0AgCFAQAhdQIAhQEAIXYCAIUBACF3AgCFAQAheAIAhQEAIXkIAJUBACF6AQCDAQAhewIAhQEAIXwBAIMBACF9AQCDAQAhfgEAgwEAIX8CAIUBACGAAQIAhQEAIYEBAgCFAQAhggEBAIMBACECAAAAAQAgCAAADgAgGk8BAIMBACFUQACEAQAhZAEAgwEAIWwBAIMBACFtAQCDAQAhbkAAhAEAIW9AAIQBACFwCACVAQAhcQIAhQEAIXICAIUBACFzAgCFAQAhdAIAhQEAIXUCAIUBACF2AgCFAQAhdwIAhQEAIXgCAIUBACF5CACVAQAhegEAgwEAIXsCAIUBACF8AQCDAQAhfQEAgwEAIX4BAIMBACF_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-AjM_FzRBFjVDAjZEGDdFFjhGFjlHAjpKGTtLHzxNID1OID5RID9SIEBTIEFVIEJXAkNYIURaIEVcAkZdIkdeIEhfIElgAkpjI0tkKQ"
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"
39
39
  }
40
40
 
41
41
  async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
@@ -765,6 +765,7 @@ export const SessionScalarFieldEnum = {
765
765
  rateLimitErrors: 'rateLimitErrors',
766
766
  userInterruptions: 'userInterruptions',
767
767
  permissionModesJson: 'permissionModesJson',
768
+ systemPromptEdits: 'systemPromptEdits',
768
769
  createdAt: 'createdAt'
769
770
  } as const
770
771
 
@@ -96,6 +96,7 @@ export const SessionScalarFieldEnum = {
96
96
  rateLimitErrors: 'rateLimitErrors',
97
97
  userInterruptions: 'userInterruptions',
98
98
  permissionModesJson: 'permissionModesJson',
99
+ systemPromptEdits: 'systemPromptEdits',
99
100
  createdAt: 'createdAt'
100
101
  } as const
101
102