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.
- package/.github/workflows/release.yml +111 -0
- package/README.md +15 -8
- package/app/api/commands/route.ts +55 -1
- package/app/api/usage/route.ts +1 -0
- package/components/agent-coach.tsx +1 -1
- package/components/app-sidebar.tsx +12 -227
- package/components/daily-chart.tsx +47 -4
- package/components/dashboard-shell.tsx +22 -9
- package/components/data-provider.tsx +22 -6
- package/electron/entitlements.mac.plist +16 -0
- package/electron/init-db.mjs +37 -0
- package/electron/main.mjs +203 -0
- package/generated/prisma/internal/class.ts +4 -4
- package/generated/prisma/internal/prismaNamespace.ts +1 -0
- package/generated/prisma/internal/prismaNamespaceBrowser.ts +1 -0
- package/generated/prisma/models/Session.ts +35 -1
- package/lib/coach.ts +46 -5
- package/lib/db.ts +2 -2
- package/lib/parse-codex.ts +1 -0
- package/lib/parse-logs.ts +15 -1
- package/lib/queries-codex.ts +2 -0
- package/lib/queries.ts +3 -0
- package/lib/sync.ts +10 -0
- package/package.json +8 -7
- package/prisma/migrations/20260401144555_add_system_prompt_edits/migration.sql +80 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +1 -0
- package/prisma/schema.sql +81 -0
- /package/app/(dashboard)/{settings → data-management}/page.tsx +0 -0
|
@@ -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': '
|
|
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
|
|
74
|
-
const communityPlugin =
|
|
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
|
-
|
|
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
|
|
51
|
-
if (!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 =>
|
|
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(() =>
|
|
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: "
|
|
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
|
|