87 lines
2.3 KiB
TypeScript
87 lines
2.3 KiB
TypeScript
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import sqlite3 from "sqlite3";
|
|
|
|
const DB_PATH = process.env.DB_PATH || path.join(process.cwd(), "data", "tasks.db");
|
|
|
|
fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
|
|
|
|
let database: sqlite3.Database | null = null;
|
|
|
|
function getDatabase() {
|
|
if (database) {
|
|
return database;
|
|
}
|
|
|
|
database = new sqlite3.Database(DB_PATH);
|
|
database.serialize(() => {
|
|
database?.run(`
|
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
title TEXT NOT NULL,
|
|
description TEXT DEFAULT '',
|
|
assignee TEXT DEFAULT '',
|
|
priority TEXT NOT NULL DEFAULT 'Medium',
|
|
status TEXT NOT NULL DEFAULT 'Backlog',
|
|
tags TEXT NOT NULL DEFAULT '[]',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
completed_at TEXT
|
|
)
|
|
`);
|
|
database?.run(`
|
|
CREATE TABLE IF NOT EXISTS usage_tracking (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
agent TEXT NOT NULL,
|
|
provider TEXT NOT NULL,
|
|
model TEXT NOT NULL,
|
|
request_type TEXT DEFAULT 'chat',
|
|
tokens_used INTEGER DEFAULT 0,
|
|
cost_estimate REAL DEFAULT 0,
|
|
timestamp TEXT NOT NULL DEFAULT (datetime('now'))
|
|
)
|
|
`);
|
|
});
|
|
|
|
return database;
|
|
}
|
|
|
|
export function all<T>(sql: string, params: unknown[] = []) {
|
|
const db = getDatabase();
|
|
return new Promise<T[]>((resolve, reject) => {
|
|
db.all(sql, params, (error, rows) => {
|
|
if (error) {
|
|
reject(error);
|
|
return;
|
|
}
|
|
resolve(rows as T[]);
|
|
});
|
|
});
|
|
}
|
|
|
|
export function get<T>(sql: string, params: unknown[] = []) {
|
|
const db = getDatabase();
|
|
return new Promise<T | undefined>((resolve, reject) => {
|
|
db.get(sql, params, (error, row) => {
|
|
if (error) {
|
|
reject(error);
|
|
return;
|
|
}
|
|
resolve(row as T | undefined);
|
|
});
|
|
});
|
|
}
|
|
|
|
export function run(sql: string, params: unknown[] = []) {
|
|
const db = getDatabase();
|
|
return new Promise<{ lastID: number; changes: number }>((resolve, reject) => {
|
|
db.run(sql, params, function onRun(error) {
|
|
if (error) {
|
|
reject(error);
|
|
return;
|
|
}
|
|
resolve({ lastID: this.lastID, changes: this.changes });
|
|
});
|
|
});
|
|
}
|