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
@@ -34,6 +34,8 @@ model Session {
34
34
  userInterruptions Int @default(0)
35
35
  permissionModesJson String @default("{}") // JSON: {default:N, acceptEdits:N, bypassPermissions:N, plan:N}
36
36
  systemPromptEdits Int @default(0) // Edits/writes to CLAUDE.md, AGENTS.md, agent.md
37
+ cliVersion String @default("unknown") // Claude Code CLI version from JSONL logs
38
+ modelCountsJson String @default("{}") // JSON: {model_name: message_count}
37
39
  createdAt DateTime @default(now())
38
40
 
39
41
  @@index([project])
@@ -73,3 +75,17 @@ model Report {
73
75
 
74
76
  @@index([generatedAt])
75
77
  }
78
+
79
+ model SessionAnalysis {
80
+ id String @id @default(cuid())
81
+ sessionId String @unique
82
+ model String
83
+ classifications String // JSON array of per-message classifications
84
+ totalMessages Int
85
+ inputTokens Int
86
+ outputTokens Int
87
+ costUSD Float
88
+ analyzedAt DateTime @default(now())
89
+
90
+ @@index([sessionId])
91
+ }
package/prisma/schema.sql CHANGED
@@ -26,6 +26,8 @@ CREATE TABLE IF NOT EXISTS "Session" (
26
26
  "userInterruptions" INTEGER NOT NULL DEFAULT 0,
27
27
  "permissionModesJson" TEXT NOT NULL DEFAULT '{}',
28
28
  "systemPromptEdits" INTEGER NOT NULL DEFAULT 0,
29
+ "cliVersion" TEXT NOT NULL DEFAULT 'unknown',
30
+ "modelCountsJson" TEXT NOT NULL DEFAULT '{}',
29
31
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
30
32
  );
31
33
 
@@ -61,6 +63,19 @@ CREATE TABLE IF NOT EXISTS "Report" (
61
63
  "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
62
64
  );
63
65
 
66
+ -- CreateTable
67
+ CREATE TABLE IF NOT EXISTS "SessionAnalysis" (
68
+ "id" TEXT NOT NULL PRIMARY KEY,
69
+ "sessionId" TEXT NOT NULL,
70
+ "model" TEXT NOT NULL,
71
+ "classifications" TEXT NOT NULL,
72
+ "totalMessages" INTEGER NOT NULL,
73
+ "inputTokens" INTEGER NOT NULL,
74
+ "outputTokens" INTEGER NOT NULL,
75
+ "costUSD" REAL NOT NULL,
76
+ "analyzedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
77
+ );
78
+
64
79
  -- CreateIndex
65
80
  CREATE UNIQUE INDEX IF NOT EXISTS "Session_sessionId_key" ON "Session"("sessionId");
66
81
 
@@ -79,3 +94,8 @@ CREATE UNIQUE INDEX IF NOT EXISTS "Image_sessionId_messageId_filename_key" ON "I
79
94
  -- CreateIndex
80
95
  CREATE INDEX IF NOT EXISTS "Report_generatedAt_idx" ON "Report"("generatedAt");
81
96
 
97
+ -- CreateIndex
98
+ CREATE UNIQUE INDEX IF NOT EXISTS "SessionAnalysis_sessionId_key" ON "SessionAnalysis"("sessionId");
99
+
100
+ -- CreateIndex
101
+ CREATE INDEX IF NOT EXISTS "SessionAnalysis_sessionId_idx" ON "SessionAnalysis"("sessionId");