src / tools / usageTracker.ts
import fs from 'fs/promises';
import path from 'path';
const USAGE_FILE = '.timber_tool_usage.json';
interface UsageEntry {
toolName: string;
count: number;
lastUsed: string;
}
/**
* Track a tool usage event. Called after each tool execution.
*/
export async function trackToolUsage(toolName: string, currentWorkingDirectory: string): Promise<void> {
let entries: UsageEntry[] = [];
try {
const content = await fs.readFile(path.join(currentWorkingDirectory, USAGE_FILE), 'utf-8');
entries = JSON.parse(content);
} catch {
// File doesn't exist yet, start fresh
}
const existing = entries.find(e => e.toolName === toolName);
if (existing) {
existing.count++;
existing.lastUsed = new Date().toISOString();
} else {
entries.push({
toolName,
count: 1,
lastUsed: new Date().toISOString()
});
}
await fs.writeFile(
path.join(currentWorkingDirectory, USAGE_FILE),
JSON.stringify(entries, null, 2)
);
}
/**
* Get a usage report sorted by most used tools.
*/
export async function getUsageReport(currentWorkingDirectory: string): Promise<{
report: UsageEntry[];
totalTools: number;
totalCalls: number;
}> {
let entries: UsageEntry[] = [];
try {
const content = await fs.readFile(path.join(currentWorkingDirectory, USAGE_FILE), 'utf-8');
entries = JSON.parse(content);
} catch {}
const sorted = [...entries].sort((a, b) => b.count - a.count);
const totalCalls = entries.reduce((sum, e) => sum + e.count, 0);
return {
report: sorted,
totalTools: entries.length,
totalCalls
};
}
/**
* Reset usage tracking data.
*/
export async function resetUsageTracking(currentWorkingDirectory: string): Promise<{ success: boolean }> {
try {
await fs.unlink(path.join(currentWorkingDirectory, USAGE_FILE));
return { success: true };
} catch {
return { success: false };
}
}
src / tools / usageTracker.ts
import fs from 'fs/promises';
import path from 'path';
const USAGE_FILE = '.timber_tool_usage.json';
interface UsageEntry {
toolName: string;
count: number;
lastUsed: string;
}
/**
* Track a tool usage event. Called after each tool execution.
*/
export async function trackToolUsage(toolName: string, currentWorkingDirectory: string): Promise<void> {
let entries: UsageEntry[] = [];
try {
const content = await fs.readFile(path.join(currentWorkingDirectory, USAGE_FILE), 'utf-8');
entries = JSON.parse(content);
} catch {
// File doesn't exist yet, start fresh
}
const existing = entries.find(e => e.toolName === toolName);
if (existing) {
existing.count++;
existing.lastUsed = new Date().toISOString();
} else {
entries.push({
toolName,
count: 1,
lastUsed: new Date().toISOString()
});
}
await fs.writeFile(
path.join(currentWorkingDirectory, USAGE_FILE),
JSON.stringify(entries, null, 2)
);
}
/**
* Get a usage report sorted by most used tools.
*/
export async function getUsageReport(currentWorkingDirectory: string): Promise<{
report: UsageEntry[];
totalTools: number;
totalCalls: number;
}> {
let entries: UsageEntry[] = [];
try {
const content = await fs.readFile(path.join(currentWorkingDirectory, USAGE_FILE), 'utf-8');
entries = JSON.parse(content);
} catch {}
const sorted = [...entries].sort((a, b) => b.count - a.count);
const totalCalls = entries.reduce((sum, e) => sum + e.count, 0);
return {
report: sorted,
totalTools: entries.length,
totalCalls
};
}
/**
* Reset usage tracking data.
*/
export async function resetUsageTracking(currentWorkingDirectory: string): Promise<{ success: boolean }> {
try {
await fs.unlink(path.join(currentWorkingDirectory, USAGE_FILE));
return { success: true };
} catch {
return { success: false };
}
}