claude-accountant 1.0.0 → 1.3.0

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 (41) hide show
  1. package/README.md +47 -6
  2. package/dist/admin-api.d.ts +2 -2
  3. package/dist/admin-api.d.ts.map +1 -1
  4. package/dist/admin-api.js +39 -22
  5. package/dist/admin-api.js.map +1 -1
  6. package/dist/budget.d.ts +1 -1
  7. package/dist/budget.d.ts.map +1 -1
  8. package/dist/budget.js +30 -5
  9. package/dist/budget.js.map +1 -1
  10. package/dist/db.d.ts +1 -0
  11. package/dist/db.d.ts.map +1 -1
  12. package/dist/db.js +41 -0
  13. package/dist/db.js.map +1 -1
  14. package/dist/hook-estimator.d.ts +11 -0
  15. package/dist/hook-estimator.d.ts.map +1 -0
  16. package/dist/hook-estimator.js +25 -0
  17. package/dist/hook-estimator.js.map +1 -0
  18. package/dist/resources/budget-status.d.ts +2 -2
  19. package/dist/resources/budget-status.d.ts.map +1 -1
  20. package/dist/resources/budget-status.js +2 -2
  21. package/dist/resources/budget-status.js.map +1 -1
  22. package/dist/server.js +3 -3
  23. package/dist/server.js.map +1 -1
  24. package/dist/tools/check-budget.d.ts +2 -2
  25. package/dist/tools/check-budget.d.ts.map +1 -1
  26. package/dist/tools/check-budget.js +15 -2
  27. package/dist/tools/check-budget.js.map +1 -1
  28. package/dist/tools/estimate-task-cost.d.ts +2 -2
  29. package/dist/tools/get-recommendations.d.ts +2 -2
  30. package/dist/tools/get-recommendations.d.ts.map +1 -1
  31. package/dist/tools/get-recommendations.js +2 -2
  32. package/dist/tools/get-recommendations.js.map +1 -1
  33. package/dist/tools/get-usage-history.d.ts.map +1 -1
  34. package/dist/tools/get-usage-history.js +3 -1
  35. package/dist/tools/get-usage-history.js.map +1 -1
  36. package/dist/tools/log-usage.d.ts +1 -1
  37. package/dist/types.d.ts +17 -1
  38. package/dist/types.d.ts.map +1 -1
  39. package/package.json +2 -2
  40. package/scripts/post-tool-hook.sh +3 -1
  41. package/skills/usage-awareness/SKILL.md +7 -2
package/README.md CHANGED
@@ -50,8 +50,8 @@ Then add to `~/.claude.json`:
50
50
  ### Option 3: From source
51
51
 
52
52
  ```bash
53
- git clone <repo-url>
54
- cd usage_plugin
53
+ git clone https://github.com/grantlouisherman/claude-accountant.git
54
+ cd claude-accountant
55
55
  npm install && npm run build
56
56
  ```
57
57
 
@@ -104,18 +104,58 @@ You can edit this file directly or use the `configure_budget` tool during a sess
104
104
 
105
105
  ### Optional: Anthropic Admin API
106
106
 
107
- For exact usage data instead of estimates, add your Admin API credentials:
107
+ For real usage data instead of estimates, add your Admin API key to the config. This calls the [`/v1/organizations/usage_report/messages`](https://platform.claude.com/docs/en/api/admin/usage_report/retrieve_messages) endpoint to fetch actual spend from Anthropic.
108
+
109
+ **Setup:**
110
+
111
+ 1. Go to the [Anthropic Console](https://console.anthropic.com) and create an **Admin API key** (under your organization's admin settings). This is different from a regular API key.
112
+ 2. Add the `admin_api` block to `~/.config/usage-plugin/config.json`:
108
113
 
109
114
  ```json
110
115
  {
116
+ "budget": {
117
+ "daily_limit_usd": 10.00,
118
+ "monthly_limit_usd": null,
119
+ "warning_threshold_pct": 80,
120
+ "critical_threshold_pct": 95
121
+ },
122
+ "pricing_tier": "standard",
123
+ "default_model": "claude-sonnet-4-5-20250514",
124
+ "data_dir": "~/.config/usage-plugin/data",
111
125
  "admin_api": {
112
126
  "api_key": "sk-ant-admin-...",
113
- "organization_id": "org-...",
114
127
  "sync_interval_minutes": 5
115
128
  }
116
129
  }
117
130
  ```
118
131
 
132
+ When configured, `check_budget` will show both local estimates and real API-reported spend:
133
+
134
+ ```
135
+ Budget Status: WARNING
136
+ Daily Limit: $10.00
137
+ Spent Today: $7.5000
138
+ Remaining: $1.8200
139
+ Used: 75.0%
140
+ Requests Today: 42
141
+
142
+ API Reported Spend: $8.1800
143
+ API Usage: 81.8% of daily limit
144
+ Source: Anthropic Admin API
145
+
146
+ Breakdown by model:
147
+ claude-opus-4-5-20251101: $6.2300 (15000 in / 3200 out)
148
+ claude-sonnet-4-5-20250514: $1.9500 (45000 in / 8000 out)
149
+ ```
150
+
151
+ The budget status uses the **higher** of local estimates and API-reported spend, so you always get the more conservative view.
152
+
153
+ ### Auto-logging via hooks
154
+
155
+ The plugin ships with a PostToolUse hook that automatically logs every tool invocation. Each tool type has a rough token estimate (e.g., Read ~2000 input tokens, Edit ~3000 input tokens), so your budget tracks usage without any manual logging needed.
156
+
157
+ Hook events are written to `~/.config/usage-plugin/data/hook_events.jsonl` and ingested into SQLite automatically when you call `check_budget` or `get_usage_history`.
158
+
119
159
  ## How it works
120
160
 
121
161
  The plugin uses an estimation-based approach since MCP tools can't introspect Claude's actual token usage mid-conversation:
@@ -123,9 +163,10 @@ The plugin uses an estimation-based approach since MCP tools can't introspect Cl
123
163
  1. **Complexity tiers** (trivial/simple/moderate/complex/massive) map to token ranges
124
164
  2. **Per-file multipliers** account for reads (~1500 input tokens) and edits (~3000 output tokens)
125
165
  3. **Extended thinking** multiplies output estimates by 3x
126
- 4. All data is stored locally in SQLite with WAL mode for fast concurrent access
166
+ 4. **Auto-logging hooks** track every tool call with per-tool-type token estimates
167
+ 5. All data is stored locally in SQLite with WAL mode for fast concurrent access
127
168
 
128
- When the Admin API is configured, real usage data supersedes local estimates.
169
+ When the Admin API is configured, real usage data is shown alongside local estimates, and the higher value drives budget status decisions.
129
170
 
130
171
  ## Budget thresholds
131
172
 
@@ -1,3 +1,3 @@
1
- import type { Config } from "./types.js";
2
- export declare function syncFromAdminApi(config: Config): Promise<number>;
1
+ import type { ApiUsageSummary, Config } from "./types.js";
2
+ export declare function fetchApiUsage(config: Config): Promise<ApiUsageSummary>;
3
3
  //# sourceMappingURL=admin-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin-api.d.ts","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAgBzC,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDtE"}
1
+ {"version":3,"file":"admin-api.d.ts","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAiC3E,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CA6E1B"}
package/dist/admin-api.js CHANGED
@@ -1,12 +1,19 @@
1
- import { logUsage } from "./db.js";
2
1
  import { calculateCost } from "./pricing.js";
3
- export async function syncFromAdminApi(config) {
2
+ export async function fetchApiUsage(config) {
4
3
  if (!config.admin_api) {
5
4
  throw new Error("Admin API not configured");
6
5
  }
7
- const { api_key, organization_id } = config.admin_api;
8
- const today = new Date().toISOString().split("T")[0];
9
- const url = `https://api.anthropic.com/v1/organizations/${organization_id}/usage?start_date=${today}&end_date=${today}`;
6
+ const { api_key } = config.admin_api;
7
+ // Start of today in UTC (RFC 3339)
8
+ const now = new Date();
9
+ const startOfDay = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
10
+ const startingAt = startOfDay.toISOString();
11
+ const params = new URLSearchParams({
12
+ starting_at: startingAt,
13
+ bucket_width: "1d",
14
+ "group_by[]": "model",
15
+ });
16
+ const url = `https://api.anthropic.com/v1/organizations/usage_report/messages?${params}`;
10
17
  const response = await fetch(url, {
11
18
  headers: {
12
19
  "x-api-key": api_key,
@@ -17,23 +24,33 @@ export async function syncFromAdminApi(config) {
17
24
  throw new Error(`Admin API error: ${response.status} ${response.statusText}`);
18
25
  }
19
26
  const data = (await response.json());
20
- let synced = 0;
21
- for (const record of data.data) {
22
- const cost = calculateCost(record.model, record.input_tokens, record.output_tokens, record.cache_read_input_tokens, record.cache_creation_input_tokens);
23
- logUsage(config, {
24
- timestamp: new Date().toISOString(),
25
- session_id: "admin-api-sync",
26
- model: record.model,
27
- input_tokens: record.input_tokens,
28
- output_tokens: record.output_tokens,
29
- cache_read_tokens: record.cache_read_input_tokens,
30
- cache_write_tokens: record.cache_creation_input_tokens,
31
- estimated_cost_usd: cost,
32
- task_description: "Synced from Admin API",
33
- source: "admin_api",
34
- });
35
- synced++;
27
+ const byModel = [];
28
+ let totalCost = 0;
29
+ let totalInput = 0;
30
+ let totalOutput = 0;
31
+ for (const bucket of data.data) {
32
+ for (const result of bucket.results) {
33
+ const cacheWriteTokens = (result.cache_creation?.ephemeral_5m_input_tokens ?? 0) +
34
+ (result.cache_creation?.ephemeral_1h_input_tokens ?? 0);
35
+ const cost = calculateCost(result.model, result.uncached_input_tokens, result.output_tokens, result.cache_read_input_tokens, cacheWriteTokens);
36
+ byModel.push({
37
+ model: result.model,
38
+ input_tokens: result.uncached_input_tokens,
39
+ output_tokens: result.output_tokens,
40
+ cache_read_tokens: result.cache_read_input_tokens,
41
+ cache_write_tokens: cacheWriteTokens,
42
+ cost_usd: cost,
43
+ });
44
+ totalCost += cost;
45
+ totalInput += result.uncached_input_tokens;
46
+ totalOutput += result.output_tokens;
47
+ }
36
48
  }
37
- return synced;
49
+ return {
50
+ total_cost_usd: totalCost,
51
+ total_input_tokens: totalInput,
52
+ total_output_tokens: totalOutput,
53
+ by_model: byModel,
54
+ };
38
55
  }
39
56
  //# sourceMappingURL=admin-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin-api.js","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAc7C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,8CAA8C,eAAe,qBAAqB,KAAK,aAAa,KAAK,EAAE,CAAC;IAExH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,WAAW,EAAE,OAAO;YACpB,mBAAmB,EAAE,YAAY;SAClC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;IACzD,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,aAAa,CACxB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,uBAAuB,EAC9B,MAAM,CAAC,2BAA2B,CACnC,CAAC;QAEF,QAAQ,CAAC,MAAM,EAAE;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,UAAU,EAAE,gBAAgB;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,iBAAiB,EAAE,MAAM,CAAC,uBAAuB;YACjD,kBAAkB,EAAE,MAAM,CAAC,2BAA2B;YACtD,kBAAkB,EAAE,IAAI;YACxB,gBAAgB,EAAE,uBAAuB;YACzC,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,MAAM,EAAE,CAAC;IACX,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"admin-api.js","sourceRoot":"","sources":["../src/admin-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgC7C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAErC,mCAAmC;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CACpE,CAAC;IACF,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAE5C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,OAAO;KACtB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,oEAAoE,MAAM,EAAE,CAAC;IAEzF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,WAAW,EAAE,OAAO;YACpB,mBAAmB,EAAE,YAAY;SAClC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;IAE5D,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,gBAAgB,GACpB,CAAC,MAAM,CAAC,cAAc,EAAE,yBAAyB,IAAI,CAAC,CAAC;gBACvD,CAAC,MAAM,CAAC,cAAc,EAAE,yBAAyB,IAAI,CAAC,CAAC,CAAC;YAE1D,MAAM,IAAI,GAAG,aAAa,CACxB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,qBAAqB,EAC5B,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,uBAAuB,EAC9B,gBAAgB,CACjB,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,YAAY,EAAE,MAAM,CAAC,qBAAqB;gBAC1C,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,iBAAiB,EAAE,MAAM,CAAC,uBAAuB;gBACjD,kBAAkB,EAAE,gBAAgB;gBACpC,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,SAAS,IAAI,IAAI,CAAC;YAClB,UAAU,IAAI,MAAM,CAAC,qBAAqB,CAAC;YAC3C,WAAW,IAAI,MAAM,CAAC,aAAa,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,kBAAkB,EAAE,UAAU;QAC9B,mBAAmB,EAAE,WAAW;QAChC,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC"}
package/dist/budget.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import type { BudgetSnapshot, BudgetStatus, Config } from "./types.js";
2
- export declare function getBudgetStatus(config: Config): BudgetSnapshot;
2
+ export declare function getBudgetStatus(config: Config): Promise<BudgetSnapshot>;
3
3
  export declare function computeStatus(pctUsed: number, warningPct: number, criticalPct: number): BudgetStatus;
4
4
  //# sourceMappingURL=budget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CA6B9D;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,YAAY,CAKd"}
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIvE,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6D7E;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,YAAY,CAKd"}
package/dist/budget.js CHANGED
@@ -1,15 +1,17 @@
1
- import { getTodayUsage, getMonthUsage } from "./db.js";
2
- export function getBudgetStatus(config) {
1
+ import { getTodayUsage, getMonthUsage, ingestHookEvents } from "./db.js";
2
+ import { fetchApiUsage } from "./admin-api.js";
3
+ export async function getBudgetStatus(config) {
4
+ // Ingest any pending hook events before calculating budget
5
+ ingestHookEvents(config);
3
6
  const today = getTodayUsage(config);
4
7
  const dailyLimit = config.budget.daily_limit_usd;
5
8
  const spentToday = today.total_cost_usd;
6
9
  const remaining = Math.max(0, dailyLimit - spentToday);
7
10
  const pctUsed = dailyLimit > 0 ? (spentToday / dailyLimit) * 100 : 0;
8
- const status = computeStatus(pctUsed, config.budget.warning_threshold_pct, config.budget.critical_threshold_pct);
9
11
  const monthlyLimit = config.budget.monthly_limit_usd;
10
12
  const spentThisMonth = monthlyLimit !== null ? getMonthUsage(config) : null;
11
- return {
12
- status,
13
+ const snapshot = {
14
+ status: "ok",
13
15
  daily_limit_usd: dailyLimit,
14
16
  spent_today_usd: Math.round(spentToday * 10000) / 10000,
15
17
  remaining_usd: Math.round(remaining * 10000) / 10000,
@@ -20,6 +22,29 @@ export function getBudgetStatus(config) {
20
22
  ? Math.round(spentThisMonth * 10000) / 10000
21
23
  : null,
22
24
  };
25
+ // Try to fetch real API usage if configured
26
+ let effectivePctUsed = pctUsed;
27
+ if (config.admin_api) {
28
+ try {
29
+ const apiUsage = await fetchApiUsage(config);
30
+ const apiPctUsed = dailyLimit > 0 ? (apiUsage.total_cost_usd / dailyLimit) * 100 : 0;
31
+ snapshot.api_usage = apiUsage;
32
+ snapshot.api_spent_today_usd =
33
+ Math.round(apiUsage.total_cost_usd * 10000) / 10000;
34
+ snapshot.api_pct_used = Math.round(apiPctUsed * 100) / 100;
35
+ // Use the higher of local estimate or API-reported spend
36
+ effectivePctUsed = Math.max(pctUsed, apiPctUsed);
37
+ // Update remaining based on API data if it's higher
38
+ if (apiUsage.total_cost_usd > spentToday) {
39
+ snapshot.remaining_usd = Math.round(Math.max(0, dailyLimit - apiUsage.total_cost_usd) * 10000) / 10000;
40
+ }
41
+ }
42
+ catch {
43
+ // API fetch failed — fall back to local estimates silently
44
+ }
45
+ }
46
+ snapshot.status = computeStatus(effectivePctUsed, config.budget.warning_threshold_pct, config.budget.critical_threshold_pct);
47
+ return snapshot;
23
48
  }
24
49
  export function computeStatus(pctUsed, warningPct, criticalPct) {
25
50
  if (pctUsed >= 100)
@@ -1 +1 @@
1
- {"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEvD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;IACjD,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,aAAa,CAC1B,OAAO,EACP,MAAM,CAAC,MAAM,CAAC,qBAAqB,EACnC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CACrC,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACrD,MAAM,cAAc,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE5E,OAAO;QACL,MAAM;QACN,eAAe,EAAE,UAAU;QAC3B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,KAAK;QACvD,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK;QACpD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG;QACzC,mBAAmB,EAAE,KAAK,CAAC,aAAa;QACxC,iBAAiB,EAAE,YAAY;QAC/B,oBAAoB,EAClB,cAAc,KAAK,IAAI;YACrB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,GAAG,KAAK;YAC5C,CAAC,CAAC,IAAI;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,UAAkB,EAClB,WAAmB;IAEnB,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC;IACtC,IAAI,OAAO,IAAI,WAAW;QAAE,OAAO,UAAU,CAAC;IAC9C,IAAI,OAAO,IAAI,UAAU;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts CHANGED
@@ -6,5 +6,6 @@ export declare function logUsage(config: Config, entry: UsageLogEntry): void;
6
6
  export declare function getTodayUsage(config: Config): DailySummary;
7
7
  export declare function getUsageHistory(config: Config, days: number): DailySummary[];
8
8
  export declare function getMonthUsage(config: Config): number;
9
+ export declare function ingestHookEvents(config: Config): number;
9
10
  export declare function closeDb(): void;
10
11
  //# sourceMappingURL=db.d.ts.map
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CASvD;AAiCD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAsBnE;AA6BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAkB1D;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,YAAY,EAAE,CAWhB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYpD;AAED,wBAAgB,OAAO,IAAI,IAAI,CAK9B"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMzC,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CASvD;AAiCD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAsBnE;AA6BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAkB1D;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,YAAY,EAAE,CAWhB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYpD;AAQD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4CvD;AAED,wBAAgB,OAAO,IAAI,IAAI,CAK9B"}
package/dist/db.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import Database from "better-sqlite3";
2
2
  import path from "node:path";
3
+ import fs from "node:fs";
3
4
  import { resolveDataDir } from "./config.js";
5
+ import { estimateToolTokens } from "./hook-estimator.js";
6
+ import { calculateCost } from "./pricing.js";
4
7
  let db = null;
5
8
  export function getDb(config) {
6
9
  if (db)
@@ -102,6 +105,44 @@ export function getMonthUsage(config) {
102
105
  .get(monthStart);
103
106
  return row.total;
104
107
  }
108
+ export function ingestHookEvents(config) {
109
+ const dataDir = resolveDataDir(config);
110
+ const hookFile = path.join(dataDir, "hook_events.jsonl");
111
+ if (!fs.existsSync(hookFile))
112
+ return 0;
113
+ const content = fs.readFileSync(hookFile, "utf-8").trim();
114
+ if (!content)
115
+ return 0;
116
+ const lines = content.split("\n");
117
+ let ingested = 0;
118
+ for (const line of lines) {
119
+ try {
120
+ const event = JSON.parse(line);
121
+ const estimate = estimateToolTokens(event.tool);
122
+ const model = config.default_model;
123
+ const cost = calculateCost(model, estimate.input_tokens, estimate.output_tokens);
124
+ logUsage(config, {
125
+ timestamp: event.timestamp,
126
+ session_id: event.session_id,
127
+ model,
128
+ input_tokens: estimate.input_tokens,
129
+ output_tokens: estimate.output_tokens,
130
+ cache_read_tokens: 0,
131
+ cache_write_tokens: 0,
132
+ estimated_cost_usd: cost,
133
+ task_description: `Auto-logged: ${event.tool} tool use`,
134
+ source: "hook",
135
+ });
136
+ ingested++;
137
+ }
138
+ catch {
139
+ // Skip malformed lines
140
+ }
141
+ }
142
+ // Truncate the file after ingesting
143
+ fs.writeFileSync(hookFile, "");
144
+ return ingested;
145
+ }
105
146
  export function closeDb() {
106
147
  if (db) {
107
148
  db.close();
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Rough token estimates per tool invocation for auto-logging via hooks.
3
+ * These are heuristics — the goal is ballpark tracking without manual input.
4
+ */
5
+ interface ToolEstimate {
6
+ input_tokens: number;
7
+ output_tokens: number;
8
+ }
9
+ export declare function estimateToolTokens(toolName: string): ToolEstimate;
10
+ export {};
11
+ //# sourceMappingURL=hook-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-estimator.d.ts","sourceRoot":"","sources":["../src/hook-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAqBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAEjE"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Rough token estimates per tool invocation for auto-logging via hooks.
3
+ * These are heuristics — the goal is ballpark tracking without manual input.
4
+ */
5
+ const TOOL_ESTIMATES = {
6
+ Read: { input_tokens: 2000, output_tokens: 500 },
7
+ Write: { input_tokens: 3000, output_tokens: 200 },
8
+ Edit: { input_tokens: 3000, output_tokens: 1000 },
9
+ Bash: { input_tokens: 1500, output_tokens: 800 },
10
+ Grep: { input_tokens: 1000, output_tokens: 500 },
11
+ Glob: { input_tokens: 800, output_tokens: 400 },
12
+ WebFetch: { input_tokens: 2000, output_tokens: 1500 },
13
+ WebSearch: { input_tokens: 1500, output_tokens: 1000 },
14
+ Task: { input_tokens: 5000, output_tokens: 3000 },
15
+ NotebookEdit: { input_tokens: 2500, output_tokens: 800 },
16
+ AskUserQuestion: { input_tokens: 500, output_tokens: 200 },
17
+ };
18
+ const DEFAULT_ESTIMATE = {
19
+ input_tokens: 1500,
20
+ output_tokens: 600,
21
+ };
22
+ export function estimateToolTokens(toolName) {
23
+ return TOOL_ESTIMATES[toolName] ?? DEFAULT_ESTIMATE;
24
+ }
25
+ //# sourceMappingURL=hook-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-estimator.js","sourceRoot":"","sources":["../src/hook-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,cAAc,GAAiC;IACnD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IAChD,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IACjD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACjD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IAChD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IAChD,IAAI,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;IAC/C,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACrD,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACtD,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACjD,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE;IACxD,eAAe,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;CAC3D,CAAC;AAEF,MAAM,gBAAgB,GAAiB;IACrC,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,GAAG;CACnB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,cAAc,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC;AACtD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { Config } from "../types.js";
2
- export declare function budgetStatusResource(config: Config): {
2
+ export declare function budgetStatusResource(config: Config): Promise<{
3
3
  uri: string;
4
4
  mimeType: string;
5
5
  text: string;
6
- };
6
+ }>;
7
7
  //# sourceMappingURL=budget-status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"budget-status.d.ts","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM;;;;EAOlD"}
1
+ {"version":3,"file":"budget-status.d.ts","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM;;;;GAOxD"}
@@ -1,6 +1,6 @@
1
1
  import { getBudgetStatus } from "../budget.js";
2
- export function budgetStatusResource(config) {
3
- const snapshot = getBudgetStatus(config);
2
+ export async function budgetStatusResource(config) {
3
+ const snapshot = await getBudgetStatus(config);
4
4
  return {
5
5
  uri: "budget://status",
6
6
  mimeType: "application/json",
@@ -1 +1 @@
1
- {"version":3,"file":"budget-status.js","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO;QACL,GAAG,EAAE,iBAAiB;QACtB,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;KACxC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"budget-status.js","sourceRoot":"","sources":["../../src/resources/budget-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc;IACvD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO;QACL,GAAG,EAAE,iBAAiB;QACtB,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;KACxC,CAAC;AACJ,CAAC"}
package/dist/server.js CHANGED
@@ -165,7 +165,7 @@ export function createServer() {
165
165
  const { name, arguments: args } = request.params;
166
166
  switch (name) {
167
167
  case "check_budget":
168
- return checkBudget(config);
168
+ return await checkBudget(config);
169
169
  case "estimate_task_cost": {
170
170
  const input = estimateTaskCostSchema.parse(args);
171
171
  return estimateTaskCostTool(config, input);
@@ -180,7 +180,7 @@ export function createServer() {
180
180
  }
181
181
  case "get_offload_recommendations": {
182
182
  const input = getRecommendationsSchema.parse(args ?? {});
183
- return getRecommendationsTool(config, input);
183
+ return await getRecommendationsTool(config, input);
184
184
  }
185
185
  case "configure_budget": {
186
186
  const input = configureBudgetSchema.parse(args);
@@ -220,7 +220,7 @@ export function createServer() {
220
220
  const { uri } = request.params;
221
221
  switch (uri) {
222
222
  case "budget://status":
223
- return { contents: [budgetStatusResource(config)] };
223
+ return { contents: [await budgetStatusResource(config)] };
224
224
  case "usage://today":
225
225
  return { contents: [usageSummaryResource(config)] };
226
226
  case "pricing://models":
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { z } from "zod";
2
2
  import type { Config } from "../types.js";
3
3
  export declare const checkBudgetSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
4
- export declare function checkBudget(config: Config): {
4
+ export declare function checkBudget(config: Config): Promise<{
5
5
  content: {
6
6
  type: "text";
7
7
  text: string;
8
8
  }[];
9
9
  data: import("../types.js").BudgetSnapshot;
10
- };
10
+ }>;
11
11
  //# sourceMappingURL=check-budget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-budget.d.ts","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM;;;;;;EAuBzC"}
1
+ {"version":3,"file":"check-budget.d.ts","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM;;;;;;GAwC/C"}
@@ -1,8 +1,8 @@
1
1
  import { z } from "zod";
2
2
  import { getBudgetStatus } from "../budget.js";
3
3
  export const checkBudgetSchema = z.object({});
4
- export function checkBudget(config) {
5
- const snapshot = getBudgetStatus(config);
4
+ export async function checkBudget(config) {
5
+ const snapshot = await getBudgetStatus(config);
6
6
  const lines = [
7
7
  `Budget Status: ${snapshot.status.toUpperCase()}`,
8
8
  `Daily Limit: $${snapshot.daily_limit_usd.toFixed(2)}`,
@@ -15,6 +15,19 @@ export function checkBudget(config) {
15
15
  lines.push(`Monthly Limit: $${snapshot.monthly_limit_usd.toFixed(2)}`);
16
16
  lines.push(`Spent This Month: $${snapshot.spent_this_month_usd?.toFixed(4) ?? "0.0000"}`);
17
17
  }
18
+ if (snapshot.api_spent_today_usd !== undefined) {
19
+ lines.push("");
20
+ lines.push(`API Reported Spend: $${snapshot.api_spent_today_usd.toFixed(4)}`);
21
+ lines.push(`API Usage: ${snapshot.api_pct_used?.toFixed(1)}% of daily limit`);
22
+ lines.push(`Source: Anthropic Admin API`);
23
+ if (snapshot.api_usage && snapshot.api_usage.by_model.length > 0) {
24
+ lines.push("");
25
+ lines.push("Breakdown by model:");
26
+ for (const m of snapshot.api_usage.by_model) {
27
+ lines.push(` ${m.model}: $${m.cost_usd.toFixed(4)} (${m.input_tokens} in / ${m.output_tokens} out)`);
28
+ }
29
+ }
30
+ }
18
31
  return {
19
32
  content: [{ type: "text", text: lines.join("\n") }],
20
33
  data: snapshot,
@@ -1 +1 @@
1
- {"version":3,"file":"check-budget.js","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9C,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG;QACZ,kBAAkB,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;QACjD,iBAAiB,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtD,iBAAiB,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtD,eAAe,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAClD,SAAS,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACxC,mBAAmB,QAAQ,CAAC,mBAAmB,EAAE;KAClD,CAAC;IAEF,IAAI,QAAQ,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CACR,sBAAsB,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"check-budget.js","sourceRoot":"","sources":["../../src/tools/check-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc;IAC9C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG;QACZ,kBAAkB,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;QACjD,iBAAiB,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtD,iBAAiB,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtD,eAAe,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAClD,SAAS,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACxC,mBAAmB,QAAQ,CAAC,mBAAmB,EAAE;KAClD,CAAC;IAEF,IAAI,QAAQ,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CACR,sBAAsB,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAE1C,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,SAAS,CAAC,CAAC,aAAa,OAAO,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC"}
@@ -10,13 +10,13 @@ export declare const estimateTaskCostSchema: z.ZodObject<{
10
10
  task_description: string;
11
11
  file_count: number;
12
12
  extended_thinking: boolean;
13
- complexity?: "trivial" | "simple" | "moderate" | "complex" | "massive" | undefined;
14
13
  model?: string | undefined;
14
+ complexity?: "trivial" | "simple" | "moderate" | "complex" | "massive" | undefined;
15
15
  }, {
16
16
  task_description: string;
17
+ model?: string | undefined;
17
18
  complexity?: "trivial" | "simple" | "moderate" | "complex" | "massive" | undefined;
18
19
  file_count?: number | undefined;
19
- model?: string | undefined;
20
20
  extended_thinking?: boolean | undefined;
21
21
  }>;
22
22
  export type EstimateTaskCostInput = z.infer<typeof estimateTaskCostSchema>;
@@ -14,7 +14,7 @@ export declare const getRecommendationsSchema: z.ZodObject<{
14
14
  is_urgent?: boolean | undefined;
15
15
  }>;
16
16
  export type GetRecommendationsInput = z.infer<typeof getRecommendationsSchema>;
17
- export declare function getRecommendationsTool(config: Config, input: GetRecommendationsInput): {
17
+ export declare function getRecommendationsTool(config: Config, input: GetRecommendationsInput): Promise<{
18
18
  content: {
19
19
  type: "text";
20
20
  text: string;
@@ -23,5 +23,5 @@ export declare function getRecommendationsTool(config: Config, input: GetRecomme
23
23
  recommendations: import("../types.js").Recommendation[];
24
24
  budget_status: import("../types.js").BudgetStatus;
25
25
  };
26
- };
26
+ }>;
27
27
  //# sourceMappingURL=get-recommendations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-recommendations.d.ts","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;EAanC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE/E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,uBAAuB;;;;;;;;;EAwC/B"}
1
+ {"version":3,"file":"get-recommendations.d.ts","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;EAanC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE/E,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,uBAAuB;;;;;;;;;GAwC/B"}
@@ -15,8 +15,8 @@ export const getRecommendationsSchema = z.object({
15
15
  .default(true)
16
16
  .describe("Whether the current task is time-sensitive"),
17
17
  });
18
- export function getRecommendationsTool(config, input) {
19
- const budget = getBudgetStatus(config);
18
+ export async function getRecommendationsTool(config, input) {
19
+ const budget = await getBudgetStatus(config);
20
20
  const model = input.current_model ?? config.default_model;
21
21
  const recs = getRecommendations(budget, model, input.task_complexity, input.is_urgent);
22
22
  if (recs.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"get-recommendations.js","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACzC,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;SAC7D,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;IAC7C,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,4CAA4C,CAAC;CAC1D,CAAC,CAAC;AAIH,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,KAA8B;IAE9B,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC;IAC1D,MAAM,IAAI,GAAG,kBAAkB,CAC7B,MAAM,EACN,KAAK,EACL,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,SAAS,CAChB,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,uEAAuE;iBAC9E;aACF;YACD,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;SAC5D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,WAAW,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7H,EAAE;QACF,kBAAkB;KACnB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,qBAAqB,YAAY,CACzF,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;KAC9D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"get-recommendations.js","sourceRoot":"","sources":["../../src/tools/get-recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACzC,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;SAC7D,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;IAC7C,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,4CAA4C,CAAC;CAC1D,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,KAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC;IAC1D,MAAM,IAAI,GAAG,kBAAkB,CAC7B,MAAM,EACN,KAAK,EACL,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,SAAS,CAChB,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,uEAAuE;iBAC9E;aACF;YACD,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;SAC5D,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,WAAW,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7H,EAAE;QACF,kBAAkB;KACnB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACR,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,qBAAqB,YAAY,CACzF,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;KAC9D,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-usage-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,qBAAqB;;;;;;EAQhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;EAsC5B"}
1
+ {"version":3,"file":"get-usage-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,qBAAqB;;;;;;EAQhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;EAyC5B"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { getUsageHistory } from "../db.js";
2
+ import { getUsageHistory, ingestHookEvents } from "../db.js";
3
3
  export const getUsageHistorySchema = z.object({
4
4
  days: z
5
5
  .number()
@@ -10,6 +10,8 @@ export const getUsageHistorySchema = z.object({
10
10
  .describe("Number of days of history to retrieve"),
11
11
  });
12
12
  export function getUsageHistoryTool(config, input) {
13
+ // Ingest any pending hook events before returning history
14
+ ingestHookEvents(config);
13
15
  const history = getUsageHistory(config, input.days);
14
16
  if (history.length === 0) {
15
17
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"get-usage-history.js","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,uCAAuC,CAAC;CACrD,CAAC,CAAC;AAIH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,KAA2B;IAE3B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,oCAAoC,KAAK,CAAC,IAAI,QAAQ;iBAC7D;aACF;YACD,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAE5C,MAAM,KAAK,GAAG;QACZ,uBAAuB,KAAK,CAAC,IAAI,UAAU,OAAO,CAAC,MAAM,mBAAmB;QAC5E,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,aAAa,cAAc,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,cAAc,EAAE,UAAU,CAChK,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;KAC9D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"get-usage-history.js","sourceRoot":"","sources":["../../src/tools/get-usage-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,uCAAuC,CAAC;CACrD,CAAC,CAAC;AAIH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,KAA2B;IAE3B,0DAA0D;IAC1D,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,oCAAoC,KAAK,CAAC,IAAI,QAAQ;iBAC7D;aACF;YACD,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAE5C,MAAM,KAAK,GAAG;QACZ,uBAAuB,KAAK,CAAC,IAAI,UAAU,OAAO,CAAC,MAAM,mBAAmB;QAC5E,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,aAAa,cAAc,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,cAAc,EAAE,UAAU,CAChK,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;KAC9D,CAAC;AACJ,CAAC"}
@@ -22,8 +22,8 @@ export declare const logUsageSchema: z.ZodObject<{
22
22
  session_id: string;
23
23
  input_tokens: number;
24
24
  output_tokens: number;
25
- task_description?: string | undefined;
26
25
  model?: string | undefined;
26
+ task_description?: string | undefined;
27
27
  cache_read_tokens?: number | undefined;
28
28
  cache_write_tokens?: number | undefined;
29
29
  source?: "estimate" | "admin_api" | "hook" | "manual" | undefined;
package/dist/types.d.ts CHANGED
@@ -13,7 +13,6 @@ export interface Config {
13
13
  data_dir: string;
14
14
  admin_api?: {
15
15
  api_key: string;
16
- organization_id: string;
17
16
  sync_interval_minutes: number;
18
17
  };
19
18
  }
@@ -39,6 +38,20 @@ export interface DailySummary {
39
38
  total_cost_usd: number;
40
39
  request_count: number;
41
40
  }
41
+ export interface ApiUsageByModel {
42
+ model: string;
43
+ input_tokens: number;
44
+ output_tokens: number;
45
+ cache_read_tokens: number;
46
+ cache_write_tokens: number;
47
+ cost_usd: number;
48
+ }
49
+ export interface ApiUsageSummary {
50
+ total_cost_usd: number;
51
+ total_input_tokens: number;
52
+ total_output_tokens: number;
53
+ by_model: ApiUsageByModel[];
54
+ }
42
55
  export interface BudgetSnapshot {
43
56
  status: BudgetStatus;
44
57
  daily_limit_usd: number;
@@ -48,6 +61,9 @@ export interface BudgetSnapshot {
48
61
  request_count_today: number;
49
62
  monthly_limit_usd: number | null;
50
63
  spent_this_month_usd: number | null;
64
+ api_usage?: ApiUsageSummary;
65
+ api_spent_today_usd?: number;
66
+ api_pct_used?: number;
51
67
  }
52
68
  export interface CostEstimate {
53
69
  estimated_input_tokens: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtE,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,qBAAqB,EAAE,MAAM,CAAC;QAC9B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,MAAM,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-accountant",
3
- "version": "1.0.0",
3
+ "version": "1.3.0",
4
4
  "description": "Claude Code plugin that tracks API usage, estimates costs, and recommends budget-aware actions",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,7 +28,7 @@
28
28
  "license": "MIT",
29
29
  "repository": {
30
30
  "type": "git",
31
- "url": ""
31
+ "url": "git+https://github.com/grantlouisherman/claude-accountant.git"
32
32
  },
33
33
  "scripts": {
34
34
  "build": "tsc",
@@ -1,6 +1,7 @@
1
1
  #!/bin/bash
2
- # PostToolUse hook: logs tool invocations to JSONL for usage tracking
2
+ # PostToolUse hook: logs tool invocations to JSONL for automatic usage tracking
3
3
  # Called automatically after each tool use in Claude Code
4
+ # Events are ingested into SQLite by the MCP server on next check_budget or get_usage_history call
4
5
 
5
6
  TOOL_NAME="${1:-unknown}"
6
7
  SESSION_ID="${2:-unknown}"
@@ -11,4 +12,5 @@ mkdir -p "$DATA_DIR"
11
12
 
12
13
  LOG_FILE="${DATA_DIR}/hook_events.jsonl"
13
14
 
15
+ # Log tool name, session, and timestamp — the MCP server estimates tokens per tool type
14
16
  echo "{\"timestamp\":\"${TIMESTAMP}\",\"tool\":\"${TOOL_NAME}\",\"session_id\":\"${SESSION_ID}\"}" >> "$LOG_FILE"
@@ -12,9 +12,9 @@ You have access to a usage tracking plugin. Follow these rules to stay budget-aw
12
12
  - Call `get_offload_recommendations` when budget is above 60% used.
13
13
 
14
14
  ## After Completing Work
15
- - Call `log_usage` with your best estimate of tokens consumed after each significant task.
15
+ - Tool usage is automatically logged via the PostToolUse hook — you do not need to manually call `log_usage` after every tool call.
16
+ - For significant multi-step tasks, you may still call `log_usage` with a summary if you want to add a human-readable description.
16
17
  - Use session_id to group related work within a conversation.
17
- - Include a brief task_description so the user can see what each charge was for.
18
18
 
19
19
  ## Budget Thresholds
20
20
  - **OK** (<80%): Work normally.
@@ -22,6 +22,11 @@ You have access to a usage tracking plugin. Follow these rules to stay budget-aw
22
22
  - **Critical** (95-100%): Only handle urgent requests. Recommend switching to a cheaper model. Strongly suggest deferring.
23
23
  - **Exceeded** (>100%): Inform the user their daily budget is spent. Suggest waiting until tomorrow or increasing the limit.
24
24
 
25
+ ## API Usage Data
26
+ - When `check_budget` returns "API Reported Spend" data, this is real usage from Anthropic's Admin API — prefer it over local estimates for budget decisions.
27
+ - The budget status uses the **higher** of local estimates and API-reported spend, so you always get the more conservative view.
28
+ - If API data shows significantly higher spend than local estimates, mention this discrepancy to the user.
29
+
25
30
  ## Cost-Saving Habits
26
31
  - Prefer concise answers when budget is above 60%.
27
32
  - Suggest Haiku for simple lookups and formatting tasks.