claude-accountant 1.0.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 (83) hide show
  1. package/.claude-plugin/plugin.json +14 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +148 -0
  4. package/dist/admin-api.d.ts +3 -0
  5. package/dist/admin-api.d.ts.map +1 -0
  6. package/dist/admin-api.js +39 -0
  7. package/dist/admin-api.js.map +1 -0
  8. package/dist/budget.d.ts +4 -0
  9. package/dist/budget.d.ts.map +1 -0
  10. package/dist/budget.js +33 -0
  11. package/dist/budget.js.map +1 -0
  12. package/dist/config.d.ts +5 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +42 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/db.d.ts +10 -0
  17. package/dist/db.d.ts.map +1 -0
  18. package/dist/db.js +111 -0
  19. package/dist/db.js.map +1 -0
  20. package/dist/estimator.d.ts +4 -0
  21. package/dist/estimator.d.ts.map +1 -0
  22. package/dist/estimator.js +90 -0
  23. package/dist/estimator.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +13 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/offload.d.ts +3 -0
  29. package/dist/offload.d.ts.map +1 -0
  30. package/dist/offload.js +68 -0
  31. package/dist/offload.js.map +1 -0
  32. package/dist/pricing.d.ts +5 -0
  33. package/dist/pricing.d.ts.map +1 -0
  34. package/dist/pricing.js +49 -0
  35. package/dist/pricing.js.map +1 -0
  36. package/dist/resources/budget-status.d.ts +7 -0
  37. package/dist/resources/budget-status.d.ts.map +1 -0
  38. package/dist/resources/budget-status.js +10 -0
  39. package/dist/resources/budget-status.js.map +1 -0
  40. package/dist/resources/pricing-table.d.ts +6 -0
  41. package/dist/resources/pricing-table.d.ts.map +1 -0
  42. package/dist/resources/pricing-table.js +9 -0
  43. package/dist/resources/pricing-table.js.map +1 -0
  44. package/dist/resources/usage-summary.d.ts +7 -0
  45. package/dist/resources/usage-summary.d.ts.map +1 -0
  46. package/dist/resources/usage-summary.js +10 -0
  47. package/dist/resources/usage-summary.js.map +1 -0
  48. package/dist/server.d.ts +3 -0
  49. package/dist/server.d.ts.map +1 -0
  50. package/dist/server.js +234 -0
  51. package/dist/server.js.map +1 -0
  52. package/dist/tools/check-budget.d.ts +11 -0
  53. package/dist/tools/check-budget.d.ts.map +1 -0
  54. package/dist/tools/check-budget.js +23 -0
  55. package/dist/tools/check-budget.js.map +1 -0
  56. package/dist/tools/configure-budget.d.ts +27 -0
  57. package/dist/tools/configure-budget.d.ts.map +1 -0
  58. package/dist/tools/configure-budget.js +54 -0
  59. package/dist/tools/configure-budget.js.map +1 -0
  60. package/dist/tools/estimate-task-cost.d.ts +30 -0
  61. package/dist/tools/estimate-task-cost.d.ts.map +1 -0
  62. package/dist/tools/estimate-task-cost.js +37 -0
  63. package/dist/tools/estimate-task-cost.js.map +1 -0
  64. package/dist/tools/get-recommendations.d.ts +27 -0
  65. package/dist/tools/get-recommendations.d.ts.map +1 -0
  66. package/dist/tools/get-recommendations.js +47 -0
  67. package/dist/tools/get-recommendations.js.map +1 -0
  68. package/dist/tools/get-usage-history.d.ts +34 -0
  69. package/dist/tools/get-usage-history.d.ts.map +1 -0
  70. package/dist/tools/get-usage-history.js +42 -0
  71. package/dist/tools/get-usage-history.js.map +1 -0
  72. package/dist/tools/log-usage.d.ts +42 -0
  73. package/dist/tools/log-usage.d.ts.map +1 -0
  74. package/dist/tools/log-usage.js +42 -0
  75. package/dist/tools/log-usage.js.map +1 -0
  76. package/dist/types.d.ts +73 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +2 -0
  79. package/dist/types.js.map +1 -0
  80. package/hooks/hooks.json +10 -0
  81. package/package.json +51 -0
  82. package/scripts/post-tool-hook.sh +14 -0
  83. package/skills/usage-awareness/SKILL.md +29 -0
@@ -0,0 +1,68 @@
1
+ export function getRecommendations(budget, currentModel, taskComplexity, isUrgent = true) {
2
+ const recs = [];
3
+ const pct = budget.pct_used;
4
+ // Model downgrade suggestions
5
+ if (currentModel.includes("opus")) {
6
+ recs.push({
7
+ action: "Switch to Sonnet",
8
+ description: "Use claude-sonnet-4-5 instead of Opus for this task. Sonnet handles most coding tasks well at lower cost.",
9
+ estimated_savings_pct: 40,
10
+ priority: pct > 60 ? "high" : "medium",
11
+ });
12
+ }
13
+ if ((currentModel.includes("sonnet") || currentModel.includes("opus")) &&
14
+ taskComplexity &&
15
+ ["trivial", "simple"].includes(taskComplexity)) {
16
+ recs.push({
17
+ action: "Switch to Haiku",
18
+ description: "Use claude-haiku-3-5 for simple tasks like quick lookups, formatting, or short answers.",
19
+ estimated_savings_pct: 67,
20
+ priority: pct > 50 ? "high" : "low",
21
+ });
22
+ }
23
+ // Defer non-urgent work
24
+ if (pct > 80 && !isUrgent) {
25
+ recs.push({
26
+ action: "Defer to tomorrow",
27
+ description: "Budget is above 80%. Non-urgent work can be deferred to preserve remaining budget for critical tasks.",
28
+ estimated_savings_pct: 100,
29
+ priority: "high",
30
+ });
31
+ }
32
+ // Break into smaller tasks
33
+ if (pct > 60 &&
34
+ taskComplexity &&
35
+ ["complex", "massive"].includes(taskComplexity)) {
36
+ recs.push({
37
+ action: "Break into smaller tasks",
38
+ description: "Split this large task into focused subtasks. Complete the most important parts now and defer the rest.",
39
+ estimated_savings_pct: 30,
40
+ priority: "medium",
41
+ });
42
+ }
43
+ // Shorter responses
44
+ if (pct > 70) {
45
+ recs.push({
46
+ action: "Use shorter responses",
47
+ description: "Ask Claude for concise answers. Avoid extended explanations and verbose output to reduce output tokens.",
48
+ estimated_savings_pct: 20,
49
+ priority: pct > 90 ? "high" : "low",
50
+ });
51
+ }
52
+ // Batch API
53
+ if (taskComplexity &&
54
+ ["complex", "massive"].includes(taskComplexity) &&
55
+ !isUrgent) {
56
+ recs.push({
57
+ action: "Use Batch API",
58
+ description: "For non-time-sensitive bulk operations, use the Batch API for 50% cost reduction.",
59
+ estimated_savings_pct: 50,
60
+ priority: pct > 70 ? "high" : "medium",
61
+ });
62
+ }
63
+ // Sort by priority
64
+ const priorityOrder = { high: 0, medium: 1, low: 2 };
65
+ recs.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
66
+ return recs;
67
+ }
68
+ //# sourceMappingURL=offload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offload.js","sourceRoot":"","sources":["../src/offload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ModelPricing } from "./types.js";
2
+ export declare const MODEL_PRICING: ModelPricing[];
3
+ export declare function getPricing(model: string): ModelPricing | undefined;
4
+ export declare function calculateCost(model: string, inputTokens: number, outputTokens: number, cacheReadTokens?: number, cacheWriteTokens?: number): number;
5
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,aAAa,EAAE,YAAY,EA6BvC,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,eAAe,GAAE,MAAU,EAC3B,gBAAgB,GAAE,MAAU,GAC3B,MAAM,CAsBR"}
@@ -0,0 +1,49 @@
1
+ export const MODEL_PRICING = [
2
+ {
3
+ model: "claude-opus-4-5-20251101",
4
+ input_per_mtok: 15.0,
5
+ output_per_mtok: 75.0,
6
+ cache_read_per_mtok: 1.5,
7
+ cache_write_per_mtok: 18.75,
8
+ },
9
+ {
10
+ model: "claude-sonnet-4-5-20250514",
11
+ input_per_mtok: 3.0,
12
+ output_per_mtok: 15.0,
13
+ cache_read_per_mtok: 0.3,
14
+ cache_write_per_mtok: 3.75,
15
+ },
16
+ {
17
+ model: "claude-sonnet-4-20250514",
18
+ input_per_mtok: 3.0,
19
+ output_per_mtok: 15.0,
20
+ cache_read_per_mtok: 0.3,
21
+ cache_write_per_mtok: 3.75,
22
+ },
23
+ {
24
+ model: "claude-haiku-3-5-20241022",
25
+ input_per_mtok: 0.8,
26
+ output_per_mtok: 4.0,
27
+ cache_read_per_mtok: 0.08,
28
+ cache_write_per_mtok: 1.0,
29
+ },
30
+ ];
31
+ export function getPricing(model) {
32
+ return MODEL_PRICING.find((p) => p.model === model);
33
+ }
34
+ export function calculateCost(model, inputTokens, outputTokens, cacheReadTokens = 0, cacheWriteTokens = 0) {
35
+ const pricing = getPricing(model);
36
+ if (!pricing) {
37
+ // Fallback to Sonnet pricing
38
+ const fallback = MODEL_PRICING.find((p) => p.model.includes("sonnet-4-5"));
39
+ return computeCost(fallback, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens);
40
+ }
41
+ return computeCost(pricing, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens);
42
+ }
43
+ function computeCost(pricing, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens) {
44
+ return ((inputTokens / 1_000_000) * pricing.input_per_mtok +
45
+ (outputTokens / 1_000_000) * pricing.output_per_mtok +
46
+ (cacheReadTokens / 1_000_000) * pricing.cache_read_per_mtok +
47
+ (cacheWriteTokens / 1_000_000) * pricing.cache_write_per_mtok);
48
+ }
49
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C;QACE,KAAK,EAAE,0BAA0B;QACjC,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,IAAI;QACrB,mBAAmB,EAAE,GAAG;QACxB,oBAAoB,EAAE,KAAK;KAC5B;IACD;QACE,KAAK,EAAE,4BAA4B;QACnC,cAAc,EAAE,GAAG;QACnB,eAAe,EAAE,IAAI;QACrB,mBAAmB,EAAE,GAAG;QACxB,oBAAoB,EAAE,IAAI;KAC3B;IACD;QACE,KAAK,EAAE,0BAA0B;QACjC,cAAc,EAAE,GAAG;QACnB,eAAe,EAAE,IAAI;QACrB,mBAAmB,EAAE,GAAG;QACxB,oBAAoB,EAAE,IAAI;KAC3B;IACD;QACE,KAAK,EAAE,2BAA2B;QAClC,cAAc,EAAE,GAAG;QACnB,eAAe,EAAE,GAAG;QACpB,mBAAmB,EAAE,IAAI;QACzB,oBAAoB,EAAE,GAAG;KAC1B;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,WAAmB,EACnB,YAAoB,EACpB,kBAA0B,CAAC,EAC3B,mBAA2B,CAAC;IAE5B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACxC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC9B,CAAC;QACH,OAAO,WAAW,CAChB,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,eAAe,EACf,gBAAgB,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAChB,OAAO,EACP,WAAW,EACX,YAAY,EACZ,eAAe,EACf,gBAAgB,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,OAAqB,EACrB,WAAmB,EACnB,YAAoB,EACpB,eAAuB,EACvB,gBAAwB;IAExB,OAAO,CACL,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc;QAClD,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,eAAe;QACpD,CAAC,eAAe,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,mBAAmB;QAC3D,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAC9D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Config } from "../types.js";
2
+ export declare function budgetStatusResource(config: Config): {
3
+ uri: string;
4
+ mimeType: string;
5
+ text: string;
6
+ };
7
+ //# sourceMappingURL=budget-status.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,10 @@
1
+ import { getBudgetStatus } from "../budget.js";
2
+ export function budgetStatusResource(config) {
3
+ const snapshot = getBudgetStatus(config);
4
+ return {
5
+ uri: "budget://status",
6
+ mimeType: "application/json",
7
+ text: JSON.stringify(snapshot, null, 2),
8
+ };
9
+ }
10
+ //# sourceMappingURL=budget-status.js.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ export declare function pricingTableResource(): {
2
+ uri: string;
3
+ mimeType: string;
4
+ text: string;
5
+ };
6
+ //# sourceMappingURL=pricing-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing-table.d.ts","sourceRoot":"","sources":["../../src/resources/pricing-table.ts"],"names":[],"mappings":"AAEA,wBAAgB,oBAAoB;;;;EAMnC"}
@@ -0,0 +1,9 @@
1
+ import { MODEL_PRICING } from "../pricing.js";
2
+ export function pricingTableResource() {
3
+ return {
4
+ uri: "pricing://models",
5
+ mimeType: "application/json",
6
+ text: JSON.stringify(MODEL_PRICING, null, 2),
7
+ };
8
+ }
9
+ //# sourceMappingURL=pricing-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing-table.js","sourceRoot":"","sources":["../../src/resources/pricing-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,GAAG,EAAE,kBAAkB;QACvB,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;KAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Config } from "../types.js";
2
+ export declare function usageSummaryResource(config: Config): {
3
+ uri: string;
4
+ mimeType: string;
5
+ text: string;
6
+ };
7
+ //# sourceMappingURL=usage-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-summary.d.ts","sourceRoot":"","sources":["../../src/resources/usage-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM;;;;EAOlD"}
@@ -0,0 +1,10 @@
1
+ import { getTodayUsage } from "../db.js";
2
+ export function usageSummaryResource(config) {
3
+ const today = getTodayUsage(config);
4
+ return {
5
+ uri: "usage://today",
6
+ mimeType: "application/json",
7
+ text: JSON.stringify(today, null, 2),
8
+ };
9
+ }
10
+ //# sourceMappingURL=usage-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-summary.js","sourceRoot":"","sources":["../../src/resources/usage-summary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO;QACL,GAAG,EAAE,eAAe;QACpB,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;KACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ export declare function createServer(): Server;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAmCnE,wBAAgB,YAAY,IAAI,MAAM,CAoPrC"}
package/dist/server.js ADDED
@@ -0,0 +1,234 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
3
+ import { loadConfig } from "./config.js";
4
+ // Tools
5
+ import { checkBudget } from "./tools/check-budget.js";
6
+ import { estimateTaskCostSchema, estimateTaskCostTool, } from "./tools/estimate-task-cost.js";
7
+ import { logUsageSchema, logUsageTool } from "./tools/log-usage.js";
8
+ import { getUsageHistorySchema, getUsageHistoryTool, } from "./tools/get-usage-history.js";
9
+ import { getRecommendationsSchema, getRecommendationsTool, } from "./tools/get-recommendations.js";
10
+ import { configureBudgetSchema, configureBudgetTool, } from "./tools/configure-budget.js";
11
+ // Resources
12
+ import { budgetStatusResource } from "./resources/budget-status.js";
13
+ import { usageSummaryResource } from "./resources/usage-summary.js";
14
+ import { pricingTableResource } from "./resources/pricing-table.js";
15
+ export function createServer() {
16
+ let config = loadConfig();
17
+ const server = new Server({ name: "usage-tracker", version: "1.0.0" }, { capabilities: { tools: {}, resources: {} } });
18
+ // --- List Tools ---
19
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
20
+ tools: [
21
+ {
22
+ name: "check_budget",
23
+ description: "Check current daily spending against budget limits. Call this at the start of every session and before expensive operations to stay budget-aware.",
24
+ inputSchema: {
25
+ type: "object",
26
+ properties: {},
27
+ },
28
+ },
29
+ {
30
+ name: "estimate_task_cost",
31
+ description: "Estimate the token cost of an upcoming task before starting it. Helps decide whether to proceed, simplify, or defer.",
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ task_description: {
36
+ type: "string",
37
+ description: "Brief description of the planned task",
38
+ },
39
+ complexity: {
40
+ type: "string",
41
+ enum: ["trivial", "simple", "moderate", "complex", "massive"],
42
+ description: "Override complexity tier (auto-detected if omitted)",
43
+ },
44
+ file_count: {
45
+ type: "number",
46
+ description: "Number of files involved",
47
+ default: 0,
48
+ },
49
+ model: {
50
+ type: "string",
51
+ description: "Model to use for cost calculation",
52
+ },
53
+ extended_thinking: {
54
+ type: "boolean",
55
+ description: "Whether extended thinking will be used",
56
+ default: false,
57
+ },
58
+ },
59
+ required: ["task_description"],
60
+ },
61
+ },
62
+ {
63
+ name: "log_usage",
64
+ description: "Record token usage after completing work. Call this after each significant task to keep budget tracking accurate.",
65
+ inputSchema: {
66
+ type: "object",
67
+ properties: {
68
+ session_id: {
69
+ type: "string",
70
+ description: "Current session identifier",
71
+ },
72
+ model: {
73
+ type: "string",
74
+ description: "Model used",
75
+ },
76
+ input_tokens: {
77
+ type: "number",
78
+ description: "Input tokens consumed",
79
+ },
80
+ output_tokens: {
81
+ type: "number",
82
+ description: "Output tokens consumed",
83
+ },
84
+ cache_read_tokens: { type: "number", default: 0 },
85
+ cache_write_tokens: { type: "number", default: 0 },
86
+ task_description: {
87
+ type: "string",
88
+ description: "What was done",
89
+ default: "",
90
+ },
91
+ source: {
92
+ type: "string",
93
+ enum: ["estimate", "admin_api", "hook", "manual"],
94
+ default: "estimate",
95
+ },
96
+ },
97
+ required: ["session_id", "input_tokens", "output_tokens"],
98
+ },
99
+ },
100
+ {
101
+ name: "get_usage_history",
102
+ description: "Get daily usage breakdown over the past N days. Shows spending trends to help plan work.",
103
+ inputSchema: {
104
+ type: "object",
105
+ properties: {
106
+ days: {
107
+ type: "number",
108
+ description: "Number of days of history (1-90)",
109
+ default: 7,
110
+ },
111
+ },
112
+ },
113
+ },
114
+ {
115
+ name: "get_offload_recommendations",
116
+ description: "Get cost-saving recommendations based on current budget status and planned work. Suggests model downgrades, deferrals, and scope reduction.",
117
+ inputSchema: {
118
+ type: "object",
119
+ properties: {
120
+ current_model: {
121
+ type: "string",
122
+ description: "Model currently being used",
123
+ },
124
+ task_complexity: {
125
+ type: "string",
126
+ enum: ["trivial", "simple", "moderate", "complex", "massive"],
127
+ },
128
+ is_urgent: {
129
+ type: "boolean",
130
+ description: "Whether the task is time-sensitive",
131
+ default: true,
132
+ },
133
+ },
134
+ },
135
+ },
136
+ {
137
+ name: "configure_budget",
138
+ description: "Update budget limits and thresholds at runtime. Changes are persisted to config file.",
139
+ inputSchema: {
140
+ type: "object",
141
+ properties: {
142
+ daily_limit_usd: {
143
+ type: "number",
144
+ description: "New daily limit in USD",
145
+ },
146
+ monthly_limit_usd: {
147
+ type: ["number", "null"],
148
+ description: "Monthly limit (null to disable)",
149
+ },
150
+ warning_threshold_pct: {
151
+ type: "number",
152
+ description: "Warning threshold %",
153
+ },
154
+ critical_threshold_pct: {
155
+ type: "number",
156
+ description: "Critical threshold %",
157
+ },
158
+ },
159
+ },
160
+ },
161
+ ],
162
+ }));
163
+ // --- Call Tool ---
164
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
165
+ const { name, arguments: args } = request.params;
166
+ switch (name) {
167
+ case "check_budget":
168
+ return checkBudget(config);
169
+ case "estimate_task_cost": {
170
+ const input = estimateTaskCostSchema.parse(args);
171
+ return estimateTaskCostTool(config, input);
172
+ }
173
+ case "log_usage": {
174
+ const input = logUsageSchema.parse(args);
175
+ return logUsageTool(config, input);
176
+ }
177
+ case "get_usage_history": {
178
+ const input = getUsageHistorySchema.parse(args ?? {});
179
+ return getUsageHistoryTool(config, input);
180
+ }
181
+ case "get_offload_recommendations": {
182
+ const input = getRecommendationsSchema.parse(args ?? {});
183
+ return getRecommendationsTool(config, input);
184
+ }
185
+ case "configure_budget": {
186
+ const input = configureBudgetSchema.parse(args);
187
+ const result = configureBudgetTool(config, input);
188
+ config = result.config;
189
+ return { content: result.content };
190
+ }
191
+ default:
192
+ throw new Error(`Unknown tool: ${name}`);
193
+ }
194
+ });
195
+ // --- List Resources ---
196
+ server.setRequestHandler(ListResourcesRequestSchema, async () => ({
197
+ resources: [
198
+ {
199
+ uri: "budget://status",
200
+ name: "Budget Status",
201
+ description: "Real-time budget snapshot with spending and limits",
202
+ mimeType: "application/json",
203
+ },
204
+ {
205
+ uri: "usage://today",
206
+ name: "Today's Usage",
207
+ description: "Detailed usage breakdown for today",
208
+ mimeType: "application/json",
209
+ },
210
+ {
211
+ uri: "pricing://models",
212
+ name: "Model Pricing",
213
+ description: "Per-token pricing for all supported Claude models",
214
+ mimeType: "application/json",
215
+ },
216
+ ],
217
+ }));
218
+ // --- Read Resource ---
219
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
220
+ const { uri } = request.params;
221
+ switch (uri) {
222
+ case "budget://status":
223
+ return { contents: [budgetStatusResource(config)] };
224
+ case "usage://today":
225
+ return { contents: [usageSummaryResource(config)] };
226
+ case "pricing://models":
227
+ return { contents: [pricingTableResource()] };
228
+ default:
229
+ throw new Error(`Unknown resource: ${uri}`);
230
+ }
231
+ });
232
+ return server;
233
+ }
234
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,QAAQ;AACR,OAAO,EAAqB,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,YAAY;AACZ,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,UAAU,YAAY;IAC1B,IAAI,MAAM,GAAW,UAAU,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAC3C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAC/C,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,cAAc;gBACpB,WAAW,EACT,mJAAmJ;gBACrJ,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,UAAU,EAAE,EAAE;iBACf;aACF;YACD;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EACT,sHAAsH;gBACxH,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,UAAU,EAAE;wBACV,gBAAgB,EAAE;4BAChB,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uCAAuC;yBACrD;wBACD,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;4BAC7D,WAAW,EAAE,qDAAqD;yBACnE;wBACD,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,0BAA0B;4BACvC,OAAO,EAAE,CAAC;yBACX;wBACD,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mCAAmC;yBACjD;wBACD,iBAAiB,EAAE;4BACjB,IAAI,EAAE,SAAS;4BACf,WAAW,EAAE,wCAAwC;4BACrD,OAAO,EAAE,KAAK;yBACf;qBACF;oBACD,QAAQ,EAAE,CAAC,kBAAkB,CAAC;iBAC/B;aACF;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,WAAW,EACT,mHAAmH;gBACrH,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,UAAU,EAAE;wBACV,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,4BAA4B;yBAC1C;wBACD,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,YAAY;yBAC1B;wBACD,YAAY,EAAE;4BACZ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uBAAuB;yBACrC;wBACD,aAAa,EAAE;4BACb,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,wBAAwB;yBACtC;wBACD,iBAAiB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;wBACjD,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;wBAClD,gBAAgB,EAAE;4BAChB,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,eAAe;4BAC5B,OAAO,EAAE,EAAE;yBACZ;wBACD,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;4BACjD,OAAO,EAAE,UAAU;yBACpB;qBACF;oBACD,QAAQ,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,eAAe,CAAC;iBAC1D;aACF;YACD;gBACE,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EACT,0FAA0F;gBAC5F,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,kCAAkC;4BAC/C,OAAO,EAAE,CAAC;yBACX;qBACF;iBACF;aACF;YACD;gBACE,IAAI,EAAE,6BAA6B;gBACnC,WAAW,EACT,6IAA6I;gBAC/I,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,UAAU,EAAE;wBACV,aAAa,EAAE;4BACb,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,4BAA4B;yBAC1C;wBACD,eAAe,EAAE;4BACf,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;yBAC9D;wBACD,SAAS,EAAE;4BACT,IAAI,EAAE,SAAS;4BACf,WAAW,EAAE,oCAAoC;4BACjD,OAAO,EAAE,IAAI;yBACd;qBACF;iBACF;aACF;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EACT,uFAAuF;gBACzF,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,UAAU,EAAE;wBACV,eAAe,EAAE;4BACf,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,wBAAwB;yBACtC;wBACD,iBAAiB,EAAE;4BACjB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAQ;4BAC/B,WAAW,EAAE,iCAAiC;yBAC/C;wBACD,qBAAqB,EAAE;4BACrB,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,qBAAqB;yBACnC;wBACD,sBAAsB,EAAE;4BACtB,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,sBAAsB;yBACpC;qBACF;iBACF;aACF;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,oBAAoB;IACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,cAAc;gBACjB,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;YAE7B,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjD,OAAO,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACtD,OAAO,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;YAED,KAAK,6BAA6B,CAAC,CAAC,CAAC;gBACnC,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACzD,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC/C,CAAC;YAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAClD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACrC,CAAC;YAED;gBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAChE,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,iBAAiB;gBACtB,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,oDAAoD;gBACjE,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,GAAG,EAAE,eAAe;gBACpB,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,oCAAoC;gBACjD,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,GAAG,EAAE,kBAAkB;gBACvB,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,mDAAmD;gBAChE,QAAQ,EAAE,kBAAkB;aAC7B;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,wBAAwB;IACxB,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAE/B,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,iBAAiB;gBACpB,OAAO,EAAE,QAAQ,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAEtD,KAAK,eAAe;gBAClB,OAAO,EAAE,QAAQ,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAEtD,KAAK,kBAAkB;gBACrB,OAAO,EAAE,QAAQ,EAAE,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC;YAEhD;gBACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from "zod";
2
+ import type { Config } from "../types.js";
3
+ export declare const checkBudgetSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
4
+ export declare function checkBudget(config: Config): {
5
+ content: {
6
+ type: "text";
7
+ text: string;
8
+ }[];
9
+ data: import("../types.js").BudgetSnapshot;
10
+ };
11
+ //# sourceMappingURL=check-budget.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ import { getBudgetStatus } from "../budget.js";
3
+ export const checkBudgetSchema = z.object({});
4
+ export function checkBudget(config) {
5
+ const snapshot = getBudgetStatus(config);
6
+ const lines = [
7
+ `Budget Status: ${snapshot.status.toUpperCase()}`,
8
+ `Daily Limit: $${snapshot.daily_limit_usd.toFixed(2)}`,
9
+ `Spent Today: $${snapshot.spent_today_usd.toFixed(4)}`,
10
+ `Remaining: $${snapshot.remaining_usd.toFixed(4)}`,
11
+ `Used: ${snapshot.pct_used.toFixed(1)}%`,
12
+ `Requests Today: ${snapshot.request_count_today}`,
13
+ ];
14
+ if (snapshot.monthly_limit_usd !== null) {
15
+ lines.push(`Monthly Limit: $${snapshot.monthly_limit_usd.toFixed(2)}`);
16
+ lines.push(`Spent This Month: $${snapshot.spent_this_month_usd?.toFixed(4) ?? "0.0000"}`);
17
+ }
18
+ return {
19
+ content: [{ type: "text", text: lines.join("\n") }],
20
+ data: snapshot,
21
+ };
22
+ }
23
+ //# sourceMappingURL=check-budget.js.map
@@ -0,0 +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"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import type { Config } from "../types.js";
3
+ export declare const configureBudgetSchema: z.ZodObject<{
4
+ daily_limit_usd: z.ZodOptional<z.ZodNumber>;
5
+ monthly_limit_usd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
6
+ warning_threshold_pct: z.ZodOptional<z.ZodNumber>;
7
+ critical_threshold_pct: z.ZodOptional<z.ZodNumber>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ daily_limit_usd?: number | undefined;
10
+ monthly_limit_usd?: number | null | undefined;
11
+ warning_threshold_pct?: number | undefined;
12
+ critical_threshold_pct?: number | undefined;
13
+ }, {
14
+ daily_limit_usd?: number | undefined;
15
+ monthly_limit_usd?: number | null | undefined;
16
+ warning_threshold_pct?: number | undefined;
17
+ critical_threshold_pct?: number | undefined;
18
+ }>;
19
+ export type ConfigureBudgetInput = z.infer<typeof configureBudgetSchema>;
20
+ export declare function configureBudgetTool(config: Config, input: ConfigureBudgetInput): {
21
+ content: Array<{
22
+ type: "text";
23
+ text: string;
24
+ }>;
25
+ config: Config;
26
+ };
27
+ //# sourceMappingURL=configure-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-budget.d.ts","sourceRoot":"","sources":["../../src/tools/configure-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAwBhC,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,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA4BpE"}
@@ -0,0 +1,54 @@
1
+ import { z } from "zod";
2
+ import { saveConfig } from "../config.js";
3
+ export const configureBudgetSchema = z.object({
4
+ daily_limit_usd: z
5
+ .number()
6
+ .positive()
7
+ .optional()
8
+ .describe("New daily spending limit in USD"),
9
+ monthly_limit_usd: z
10
+ .number()
11
+ .positive()
12
+ .nullable()
13
+ .optional()
14
+ .describe("New monthly limit (null to disable)"),
15
+ warning_threshold_pct: z
16
+ .number()
17
+ .min(1)
18
+ .max(100)
19
+ .optional()
20
+ .describe("Warning threshold percentage"),
21
+ critical_threshold_pct: z
22
+ .number()
23
+ .min(1)
24
+ .max(100)
25
+ .optional()
26
+ .describe("Critical threshold percentage"),
27
+ });
28
+ export function configureBudgetTool(config, input) {
29
+ if (input.daily_limit_usd !== undefined) {
30
+ config.budget.daily_limit_usd = input.daily_limit_usd;
31
+ }
32
+ if (input.monthly_limit_usd !== undefined) {
33
+ config.budget.monthly_limit_usd = input.monthly_limit_usd;
34
+ }
35
+ if (input.warning_threshold_pct !== undefined) {
36
+ config.budget.warning_threshold_pct = input.warning_threshold_pct;
37
+ }
38
+ if (input.critical_threshold_pct !== undefined) {
39
+ config.budget.critical_threshold_pct = input.critical_threshold_pct;
40
+ }
41
+ saveConfig(config);
42
+ const lines = [
43
+ "Budget configuration updated:",
44
+ ` Daily limit: $${config.budget.daily_limit_usd.toFixed(2)}`,
45
+ ` Monthly limit: ${config.budget.monthly_limit_usd !== null ? "$" + config.budget.monthly_limit_usd.toFixed(2) : "disabled"}`,
46
+ ` Warning at: ${config.budget.warning_threshold_pct}%`,
47
+ ` Critical at: ${config.budget.critical_threshold_pct}%`,
48
+ ];
49
+ return {
50
+ content: [{ type: "text", text: lines.join("\n") }],
51
+ config,
52
+ };
53
+ }
54
+ //# sourceMappingURL=configure-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-budget.js","sourceRoot":"","sources":["../../src/tools/configure-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,qCAAqC,CAAC;IAClD,qBAAqB,EAAE,CAAC;SACrB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8BAA8B,CAAC;IAC3C,sBAAsB,EAAE,CAAC;SACtB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+BAA+B,CAAC;CAC7C,CAAC,CAAC;AAIH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,KAA2B;IAE3B,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAC5D,CAAC;IACD,IAAI,KAAK,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;IACtE,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnB,MAAM,KAAK,GAAG;QACZ,+BAA+B;QAC/B,mBAAmB,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC7D,oBAAoB,MAAM,CAAC,MAAM,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE;QAC9H,iBAAiB,MAAM,CAAC,MAAM,CAAC,qBAAqB,GAAG;QACvD,kBAAkB,MAAM,CAAC,MAAM,CAAC,sBAAsB,GAAG;KAC1D,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM;KACP,CAAC;AACJ,CAAC"}