Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

## Completed

- [x] Deduplicate DB schema: e2e seeders now reuse `migrate()` from `src/db/migrations.ts` instead of inline CREATE TABLE statements
- [x] Display cost summary in dashboard stats bar (Overall$) and session cards
- [x] Add comprehensive end-to-end tests for dashboard
- [x] Auto-set npm version from release tag in CI publish workflow
Expand Down
63 changes: 2 additions & 61 deletions tests/e2e/seed-db.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Database } from "bun:sqlite";
import { mkdirSync, rmSync } from "node:fs";
import { dirname } from "node:path";
import { migrate } from "../../src/db/migrations";

const dbPath = process.env.OPENCODE_USAGE_STATS_DB;

Expand All @@ -13,67 +14,7 @@ rmSync(dbPath, { force: true });

const db = new Database(dbPath);

// --- Schema ---

db.run(`
CREATE TABLE IF NOT EXISTS sessions (
session_id TEXT PRIMARY KEY,
project_id TEXT,
parent_id TEXT,
title TEXT,
directory TEXT,
first_seen TEXT NOT NULL DEFAULT (datetime('now')),
last_seen TEXT NOT NULL DEFAULT (datetime('now'))
)
`);

db.run(`
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
session_id TEXT NOT NULL,
message_id TEXT NOT NULL,
role TEXT NOT NULL,
model_id TEXT,
provider_id TEXT,
input_tokens INTEGER DEFAULT 0,
output_tokens INTEGER DEFAULT 0,
reasoning_tokens INTEGER DEFAULT 0,
cache_read_tokens INTEGER DEFAULT 0,
cache_write_tokens INTEGER DEFAULT 0,
cost REAL DEFAULT 0,
agent TEXT,
UNIQUE(session_id, message_id)
)
`);

db.run(`
CREATE TABLE IF NOT EXISTS tool_calls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
session_id TEXT NOT NULL,
call_id TEXT NOT NULL UNIQUE,
tool_name TEXT NOT NULL,
agent_type TEXT,
description TEXT,
duration_ms INTEGER,
agent TEXT,
model_id TEXT,
provider_id TEXT
)
`);

db.run(`
CREATE TABLE IF NOT EXISTS daily_usage (
day TEXT PRIMARY KEY,
tokens_total INTEGER NOT NULL DEFAULT 0,
cost_total REAL NOT NULL DEFAULT 0,
sessions_count INTEGER NOT NULL DEFAULT 0,
messages_count INTEGER NOT NULL DEFAULT 0,
tool_calls_count INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
)
`);
migrate(db);

// --- Helper: date strings relative to now ---

Expand Down
61 changes: 2 additions & 59 deletions tests/e2e/seed-empty-db.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Database } from "bun:sqlite";
import { mkdirSync, rmSync } from "node:fs";
import { dirname } from "node:path";
import { migrate } from "../../src/db/migrations";

const dbPath = process.env.OPENCODE_USAGE_STATS_DB;

Expand All @@ -13,64 +14,6 @@ rmSync(dbPath, { force: true });

const db = new Database(dbPath);

db.run(`
CREATE TABLE IF NOT EXISTS sessions (
session_id TEXT PRIMARY KEY,
project_id TEXT,
parent_id TEXT,
title TEXT,
directory TEXT,
first_seen TEXT NOT NULL DEFAULT (datetime('now')),
last_seen TEXT NOT NULL DEFAULT (datetime('now'))
)
`);

db.run(`
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
session_id TEXT NOT NULL,
message_id TEXT NOT NULL,
role TEXT NOT NULL,
model_id TEXT,
provider_id TEXT,
input_tokens INTEGER DEFAULT 0,
output_tokens INTEGER DEFAULT 0,
reasoning_tokens INTEGER DEFAULT 0,
cache_read_tokens INTEGER DEFAULT 0,
cache_write_tokens INTEGER DEFAULT 0,
cost REAL DEFAULT 0,
agent TEXT,
UNIQUE(session_id, message_id)
)
`);

db.run(`
CREATE TABLE IF NOT EXISTS tool_calls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
session_id TEXT NOT NULL,
call_id TEXT NOT NULL UNIQUE,
tool_name TEXT NOT NULL,
agent_type TEXT,
description TEXT,
duration_ms INTEGER,
agent TEXT,
model_id TEXT,
provider_id TEXT
)
`);

db.run(`
CREATE TABLE IF NOT EXISTS daily_usage (
day TEXT PRIMARY KEY,
tokens_total INTEGER NOT NULL DEFAULT 0,
cost_total REAL NOT NULL DEFAULT 0,
sessions_count INTEGER NOT NULL DEFAULT 0,
messages_count INTEGER NOT NULL DEFAULT 0,
tool_calls_count INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
)
`);
migrate(db);

db.close();