ccusage 0.4.2 → 0.6.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 (43) hide show
  1. package/README.md +106 -1
  2. package/dist/arktype-C-GObzDh-Dj1DVoqC.js +5 -0
  3. package/dist/calculate-cost.d.ts +5 -5
  4. package/dist/calculate-cost.js +1 -1
  5. package/dist/core-BgFXUe_h.js +693 -0
  6. package/dist/{data-loader-B8mdiY5r.js → data-loader-CDv0IYZx.js} +59 -22
  7. package/dist/{data-loader-DtCt7sNl.d.ts → data-loader-aUOjeZ06.d.ts} +17 -6
  8. package/dist/data-loader.d.ts +5 -5
  9. package/dist/data-loader.js +5 -5
  10. package/dist/{debug-Oce2b5bO.js → debug-Dk36WQTw.js} +4 -4
  11. package/dist/debug.js +5 -5
  12. package/dist/dist-C_i5I27w.js +469 -0
  13. package/dist/{dist-D6rk8Ra5.js → dist-FwNhpFrW.js} +30 -1
  14. package/dist/effect-WSjEuzC9-BsxP11fz.js +10 -0
  15. package/dist/esm-vjyZjnpZ.js +1090 -0
  16. package/dist/index-CISmcbXk-BotItq1T.js +23 -0
  17. package/dist/index.js +171 -23
  18. package/dist/{logger-nCODI08N.js → logger-DhDyJEC5.js} +2 -2
  19. package/dist/logger.js +1 -1
  20. package/dist/mcp-G-TIOcuj.js +37580 -0
  21. package/dist/mcp.d.ts +15 -0
  22. package/dist/mcp.js +10 -0
  23. package/dist/{pricing-fetcher-bvi4lbXl.js → pricing-fetcher-BCv1Vods.js} +2 -2
  24. package/dist/{pricing-fetcher-BqlslEH3.d.ts → pricing-fetcher-DygIroMj.d.ts} +1 -1
  25. package/dist/pricing-fetcher.d.ts +2 -2
  26. package/dist/pricing-fetcher.js +3 -3
  27. package/dist/{shared-args-DWaGio0e.js → shared-args-BtMSktLn.js} +10 -3
  28. package/dist/shared-args.d.ts +14 -0
  29. package/dist/shared-args.js +6 -6
  30. package/dist/sury-DmrZ3_Oj-DhGOjCNc.js +10 -0
  31. package/dist/{types-DjlBTM5P.js → types-BcXIBMQk.js} +3 -2
  32. package/dist/types-CFnCBr2I.js +3586 -0
  33. package/dist/{types-BfZ5dOy7.d.ts → types-y1JQzaKZ.d.ts} +4 -2
  34. package/dist/types.d.ts +3 -3
  35. package/dist/types.js +3 -3
  36. package/dist/utils.js +1 -1
  37. package/dist/valibot-CQk-M5rL-Cq5E7F3g.js +10 -0
  38. package/dist/zod-Db63SLXj-BWdcigdx.js +30 -0
  39. package/package.json +2 -1
  40. /package/dist/{calculate-cost-BnufbprY.js → calculate-cost-2IwHSzmi.js} +0 -0
  41. /package/dist/{index-Bazt8Nfd.d.ts → index-BurjgCfW.d.ts} +0 -0
  42. /package/dist/{prompt-BwcIpzWm.js → prompt-IToGuko2.js} +0 -0
  43. /package/dist/{utils-BeihwpHn.js → utils-C7kg8MXN.js} +0 -0
@@ -1,5 +1,5 @@
1
- import { array, number, object, optional, safeParse, string } from "./dist-D6rk8Ra5.js";
2
- import { calculateCostFromTokens, fetchModelPricing, getModelPricing } from "./pricing-fetcher-bvi4lbXl.js";
1
+ import { array, number, object, optional, pipe, regex, safeParse, string } from "./dist-FwNhpFrW.js";
2
+ import { calculateCostFromTokens, fetchModelPricing, getModelPricing } from "./pricing-fetcher-BCv1Vods.js";
3
3
  import { createRequire } from "node:module";
4
4
  import { readFile } from "node:fs/promises";
5
5
  import { homedir } from "node:os";
@@ -2110,9 +2110,9 @@ var require_picomatch$1 = __commonJS({ "node_modules/picomatch/lib/picomatch.js"
2110
2110
  if (glob$1 === "" || typeof glob$1 !== "string" && !isState) throw new TypeError("Expected pattern to be a non-empty string");
2111
2111
  const opts = options || {};
2112
2112
  const posix$1 = opts.windows;
2113
- const regex = isState ? picomatch$2.compileRe(glob$1, options) : picomatch$2.makeRe(glob$1, options, false, true);
2114
- const state = regex.state;
2115
- delete regex.state;
2113
+ const regex$1 = isState ? picomatch$2.compileRe(glob$1, options) : picomatch$2.makeRe(glob$1, options, false, true);
2114
+ const state = regex$1.state;
2115
+ delete regex$1.state;
2116
2116
  let isIgnored = () => false;
2117
2117
  if (opts.ignore) {
2118
2118
  const ignoreOpts = {
@@ -2124,14 +2124,14 @@ var require_picomatch$1 = __commonJS({ "node_modules/picomatch/lib/picomatch.js"
2124
2124
  isIgnored = picomatch$2(opts.ignore, ignoreOpts, returnState);
2125
2125
  }
2126
2126
  const matcher = (input, returnObject = false) => {
2127
- const { isMatch, match, output } = picomatch$2.test(input, regex, options, {
2127
+ const { isMatch, match, output } = picomatch$2.test(input, regex$1, options, {
2128
2128
  glob: glob$1,
2129
2129
  posix: posix$1
2130
2130
  });
2131
2131
  const result = {
2132
2132
  glob: glob$1,
2133
2133
  state,
2134
- regex,
2134
+ regex: regex$1,
2135
2135
  posix: posix$1,
2136
2136
  input,
2137
2137
  output,
@@ -2170,7 +2170,7 @@ var require_picomatch$1 = __commonJS({ "node_modules/picomatch/lib/picomatch.js"
2170
2170
  * @return {Object} Returns an object with matching info.
2171
2171
  * @api public
2172
2172
  */
2173
- picomatch$2.test = (input, regex, options, { glob: glob$1, posix: posix$1 } = {}) => {
2173
+ picomatch$2.test = (input, regex$1, options, { glob: glob$1, posix: posix$1 } = {}) => {
2174
2174
  if (typeof input !== "string") throw new TypeError("Expected input to be a string");
2175
2175
  if (input === "") return {
2176
2176
  isMatch: false,
@@ -2184,8 +2184,8 @@ var require_picomatch$1 = __commonJS({ "node_modules/picomatch/lib/picomatch.js"
2184
2184
  output = format ? format(input) : input;
2185
2185
  match = output === glob$1;
2186
2186
  }
2187
- if (match === false || opts.capture === true) if (opts.matchBase === true || opts.basename === true) match = picomatch$2.matchBase(input, regex, options, posix$1);
2188
- else match = regex.exec(output);
2187
+ if (match === false || opts.capture === true) if (opts.matchBase === true || opts.basename === true) match = picomatch$2.matchBase(input, regex$1, options, posix$1);
2188
+ else match = regex$1.exec(output);
2189
2189
  return {
2190
2190
  isMatch: Boolean(match),
2191
2191
  match,
@@ -2206,8 +2206,8 @@ var require_picomatch$1 = __commonJS({ "node_modules/picomatch/lib/picomatch.js"
2206
2206
  * @api public
2207
2207
  */
2208
2208
  picomatch$2.matchBase = (input, glob$1, options) => {
2209
- const regex = glob$1 instanceof RegExp ? glob$1 : picomatch$2.makeRe(glob$1, options);
2210
- return regex.test(utils$1.basename(input));
2209
+ const regex$1 = glob$1 instanceof RegExp ? glob$1 : picomatch$2.makeRe(glob$1, options);
2210
+ return regex$1.test(utils$1.basename(input));
2211
2211
  };
2212
2212
  /**
2213
2213
  * Returns true if **any** of the given glob `patterns` match the specified `string`.
@@ -2291,9 +2291,9 @@ var require_picomatch$1 = __commonJS({ "node_modules/picomatch/lib/picomatch.js"
2291
2291
  const append = opts.contains ? "" : "$";
2292
2292
  let source = `${prepend}(?:${state.output})${append}`;
2293
2293
  if (state && state.negated === true) source = `^(?!${source}).*$`;
2294
- const regex = picomatch$2.toRegex(source, options);
2295
- if (returnState === true) regex.state = state;
2296
- return regex;
2294
+ const regex$1 = picomatch$2.toRegex(source, options);
2295
+ if (returnState === true) regex$1.state = state;
2296
+ return regex$1;
2297
2297
  };
2298
2298
  /**
2299
2299
  * Create a regular expression from a parsed glob pattern.
@@ -2573,14 +2573,14 @@ function getPartialMatcher(patterns, options) {
2573
2573
  if (inputParts[0] === ".." && ONLY_PARENT_DIRECTORIES.test(input)) return true;
2574
2574
  for (let i = 0; i < patterns.length; i++) {
2575
2575
  const patternParts = patternsParts[i];
2576
- const regex = regexes[i];
2576
+ const regex$1 = regexes[i];
2577
2577
  const inputPatternCount = inputParts.length;
2578
2578
  const minParts = Math.min(inputPatternCount, patternParts.length);
2579
2579
  let j = 0;
2580
2580
  while (j < minParts) {
2581
2581
  const part = patternParts[j];
2582
2582
  if (part.includes("/")) return true;
2583
- const match = regex[j].test(inputParts[j]);
2583
+ const match = regex$1[j].test(inputParts[j]);
2584
2584
  if (!match) break;
2585
2585
  if (part === "**") return true;
2586
2586
  j++;
@@ -2786,7 +2786,7 @@ const UsageDataSchema = object({
2786
2786
  costUSD: optional(number())
2787
2787
  });
2788
2788
  const DailyUsageSchema = object({
2789
- date: string(),
2789
+ date: pipe(string(), regex(/^\d{4}-\d{2}-\d{2}$/)),
2790
2790
  inputTokens: number(),
2791
2791
  outputTokens: number(),
2792
2792
  cacheCreationTokens: number(),
@@ -2804,6 +2804,14 @@ const SessionUsageSchema = object({
2804
2804
  lastActivity: string(),
2805
2805
  versions: array(string())
2806
2806
  });
2807
+ const MonthlyUsageSchema = object({
2808
+ month: pipe(string(), regex(/^\d{4}-\d{2}$/)),
2809
+ inputTokens: number(),
2810
+ outputTokens: number(),
2811
+ cacheCreationTokens: number(),
2812
+ cacheReadTokens: number(),
2813
+ totalCost: number()
2814
+ });
2807
2815
  const formatDate = (dateStr) => {
2808
2816
  const date = new Date(dateStr);
2809
2817
  const year = date.getFullYear();
@@ -2827,7 +2835,7 @@ const calculateCostForEntry = (data, mode, modelPricing) => {
2827
2835
  }
2828
2836
  return 0;
2829
2837
  };
2830
- async function loadUsageData(options) {
2838
+ async function loadDailyUsageData(options) {
2831
2839
  const claudePath = options?.claudePath ?? getDefaultClaudePath();
2832
2840
  const claudeDir = path.join(claudePath, "projects");
2833
2841
  const files = await glob(["**/*.jsonl"], {
@@ -2871,7 +2879,9 @@ async function loadUsageData(options) {
2871
2879
  if (options.until && dateStr > options.until) return false;
2872
2880
  return true;
2873
2881
  });
2874
- return sort(results).desc((item) => new Date(item.date).getTime());
2882
+ const sortOrder = options?.order || "desc";
2883
+ const sortedResults = sort(results);
2884
+ return sortOrder === "desc" ? sortedResults.desc((item) => new Date(item.date).getTime()) : sortedResults.asc((item) => new Date(item.date).getTime());
2875
2885
  }
2876
2886
  async function loadSessionData(options) {
2877
2887
  const claudePath = options?.claudePath ?? getDefaultClaudePath();
@@ -2937,8 +2947,35 @@ async function loadSessionData(options) {
2937
2947
  if (options.until && dateStr > options.until) return false;
2938
2948
  return true;
2939
2949
  });
2940
- return sort(results).desc((item) => new Date(item.lastActivity).getTime());
2950
+ const sortOrder = options?.order || "desc";
2951
+ const sortedResults = sort(results);
2952
+ return sortOrder === "desc" ? sortedResults.desc((item) => new Date(item.lastActivity).getTime()) : sortedResults.asc((item) => new Date(item.lastActivity).getTime());
2953
+ }
2954
+ async function loadMonthlyUsageData(options) {
2955
+ const dailyData = await loadDailyUsageData(options);
2956
+ const monthlyMap = new Map();
2957
+ for (const data of dailyData) {
2958
+ const month = data.date.substring(0, 7);
2959
+ const existing = monthlyMap.get(month) || {
2960
+ month,
2961
+ inputTokens: 0,
2962
+ outputTokens: 0,
2963
+ cacheCreationTokens: 0,
2964
+ cacheReadTokens: 0,
2965
+ totalCost: 0
2966
+ };
2967
+ existing.inputTokens += data.inputTokens;
2968
+ existing.outputTokens += data.outputTokens;
2969
+ existing.cacheCreationTokens += data.cacheCreationTokens;
2970
+ existing.cacheReadTokens += data.cacheReadTokens;
2971
+ existing.totalCost += data.totalCost;
2972
+ monthlyMap.set(month, existing);
2973
+ }
2974
+ const monthlyArray = Array.from(monthlyMap.values());
2975
+ const sortOrder = options?.order || "desc";
2976
+ const sortedMonthly = sort(monthlyArray);
2977
+ return sortOrder === "desc" ? sortedMonthly.desc((item) => item.month) : sortedMonthly.asc((item) => item.month);
2941
2978
  }
2942
2979
 
2943
2980
  //#endregion
2944
- export { DailyUsageSchema, SessionUsageSchema, UsageDataSchema, __commonJS, __require, __toESM, calculateCostForEntry, formatDate, getDefaultClaudePath, glob, loadSessionData, loadUsageData };
2981
+ export { DailyUsageSchema, MonthlyUsageSchema, SessionUsageSchema, UsageDataSchema, __commonJS, __require, __toESM, calculateCostForEntry, formatDate, getDefaultClaudePath, glob, loadDailyUsageData, loadMonthlyUsageData, loadSessionData };
@@ -1,6 +1,6 @@
1
- import { ArraySchema, InferOutput, NumberSchema, ObjectSchema, OptionalSchema, StringSchema } from "./index-Bazt8Nfd.js";
2
- import { ModelPricing } from "./pricing-fetcher-BqlslEH3.js";
3
- import { CostMode } from "./types-BfZ5dOy7.js";
1
+ import { ArraySchema, InferOutput, NumberSchema, ObjectSchema, OptionalSchema, RegexAction, SchemaWithPipe, StringSchema } from "./index-BurjgCfW.js";
2
+ import { ModelPricing } from "./pricing-fetcher-DygIroMj.js";
3
+ import { CostMode, SortOrder } from "./types-y1JQzaKZ.js";
4
4
 
5
5
  //#region src/data-loader.d.ts
6
6
  declare const getDefaultClaudePath: () => string;
@@ -20,7 +20,7 @@ declare const UsageDataSchema: ObjectSchema<{
20
20
  }, undefined>;
21
21
  type UsageData = InferOutput<typeof UsageDataSchema>;
22
22
  declare const DailyUsageSchema: ObjectSchema<{
23
- readonly date: StringSchema<undefined>;
23
+ readonly date: SchemaWithPipe<readonly [StringSchema<undefined>, RegexAction<string, undefined>]>;
24
24
  readonly inputTokens: NumberSchema<undefined>;
25
25
  readonly outputTokens: NumberSchema<undefined>;
26
26
  readonly cacheCreationTokens: NumberSchema<undefined>;
@@ -40,6 +40,15 @@ declare const SessionUsageSchema: ObjectSchema<{
40
40
  readonly versions: ArraySchema<StringSchema<undefined>, undefined>;
41
41
  }, undefined>;
42
42
  type SessionUsage = InferOutput<typeof SessionUsageSchema>;
43
+ declare const MonthlyUsageSchema: ObjectSchema<{
44
+ readonly month: SchemaWithPipe<readonly [StringSchema<undefined>, RegexAction<string, undefined>]>;
45
+ readonly inputTokens: NumberSchema<undefined>;
46
+ readonly outputTokens: NumberSchema<undefined>;
47
+ readonly cacheCreationTokens: NumberSchema<undefined>;
48
+ readonly cacheReadTokens: NumberSchema<undefined>;
49
+ readonly totalCost: NumberSchema<undefined>;
50
+ }, undefined>;
51
+ type MonthlyUsage = InferOutput<typeof MonthlyUsageSchema>;
43
52
  declare const formatDate: (dateStr: string) => string;
44
53
  declare const calculateCostForEntry: (data: UsageData, mode: CostMode, modelPricing: Record<string, ModelPricing>) => number;
45
54
  interface DateFilter {
@@ -49,8 +58,10 @@ interface DateFilter {
49
58
  interface LoadOptions extends DateFilter {
50
59
  claudePath?: string;
51
60
  mode?: CostMode;
61
+ order?: SortOrder;
52
62
  }
53
- declare function loadUsageData(options?: LoadOptions): Promise<DailyUsage[]>;
63
+ declare function loadDailyUsageData(options?: LoadOptions): Promise<DailyUsage[]>;
54
64
  declare function loadSessionData(options?: LoadOptions): Promise<SessionUsage[]>;
65
+ declare function loadMonthlyUsageData(options?: LoadOptions): Promise<MonthlyUsage[]>;
55
66
  //#endregion
56
- export { DailyUsage, DailyUsageSchema as DailyUsageSchema$1, DateFilter, LoadOptions, SessionUsage, SessionUsageSchema as SessionUsageSchema$1, UsageData, UsageDataSchema as UsageDataSchema$1, calculateCostForEntry as calculateCostForEntry$1, formatDate as formatDate$1, getDefaultClaudePath as getDefaultClaudePath$1, loadSessionData as loadSessionData$1, loadUsageData as loadUsageData$1 };
67
+ export { DailyUsage, DailyUsageSchema as DailyUsageSchema$1, DateFilter, LoadOptions, MonthlyUsage, MonthlyUsageSchema as MonthlyUsageSchema$1, SessionUsage, SessionUsageSchema as SessionUsageSchema$1, UsageData, UsageDataSchema as UsageDataSchema$1, calculateCostForEntry as calculateCostForEntry$1, formatDate as formatDate$1, getDefaultClaudePath as getDefaultClaudePath$1, loadDailyUsageData as loadDailyUsageData$1, loadMonthlyUsageData as loadMonthlyUsageData$1, loadSessionData as loadSessionData$1 };
@@ -1,5 +1,5 @@
1
- import "./index-Bazt8Nfd.js";
2
- import "./pricing-fetcher-BqlslEH3.js";
3
- import "./types-BfZ5dOy7.js";
4
- import { DailyUsage, DailyUsageSchema$1 as DailyUsageSchema, DateFilter, LoadOptions, SessionUsage, SessionUsageSchema$1 as SessionUsageSchema, UsageData, UsageDataSchema$1 as UsageDataSchema, calculateCostForEntry$1 as calculateCostForEntry, formatDate$1 as formatDate, getDefaultClaudePath$1 as getDefaultClaudePath, loadSessionData$1 as loadSessionData, loadUsageData$1 as loadUsageData } from "./data-loader-DtCt7sNl.js";
5
- export { DailyUsage, DailyUsageSchema, DateFilter, LoadOptions, SessionUsage, SessionUsageSchema, UsageData, UsageDataSchema, calculateCostForEntry, formatDate, getDefaultClaudePath, loadSessionData, loadUsageData };
1
+ import "./index-BurjgCfW.js";
2
+ import "./pricing-fetcher-DygIroMj.js";
3
+ import "./types-y1JQzaKZ.js";
4
+ import { DailyUsage, DailyUsageSchema$1 as DailyUsageSchema, DateFilter, LoadOptions, MonthlyUsage, MonthlyUsageSchema$1 as MonthlyUsageSchema, SessionUsage, SessionUsageSchema$1 as SessionUsageSchema, UsageData, UsageDataSchema$1 as UsageDataSchema, calculateCostForEntry$1 as calculateCostForEntry, formatDate$1 as formatDate, getDefaultClaudePath$1 as getDefaultClaudePath, loadDailyUsageData$1 as loadDailyUsageData, loadMonthlyUsageData$1 as loadMonthlyUsageData, loadSessionData$1 as loadSessionData } from "./data-loader-aUOjeZ06.js";
5
+ export { DailyUsage, DailyUsageSchema, DateFilter, LoadOptions, MonthlyUsage, MonthlyUsageSchema, SessionUsage, SessionUsageSchema, UsageData, UsageDataSchema, calculateCostForEntry, formatDate, getDefaultClaudePath, loadDailyUsageData, loadMonthlyUsageData, loadSessionData };
@@ -1,6 +1,6 @@
1
- import { DailyUsageSchema, SessionUsageSchema, UsageDataSchema, calculateCostForEntry, formatDate, getDefaultClaudePath, loadSessionData, loadUsageData } from "./data-loader-B8mdiY5r.js";
2
- import "./dist-D6rk8Ra5.js";
3
- import "./logger-nCODI08N.js";
4
- import "./pricing-fetcher-bvi4lbXl.js";
1
+ import { DailyUsageSchema, MonthlyUsageSchema, SessionUsageSchema, UsageDataSchema, calculateCostForEntry, formatDate, getDefaultClaudePath, loadDailyUsageData, loadMonthlyUsageData, loadSessionData } from "./data-loader-CDv0IYZx.js";
2
+ import "./dist-FwNhpFrW.js";
3
+ import "./logger-DhDyJEC5.js";
4
+ import "./pricing-fetcher-BCv1Vods.js";
5
5
 
6
- export { DailyUsageSchema, SessionUsageSchema, UsageDataSchema, calculateCostForEntry, formatDate, getDefaultClaudePath, loadSessionData, loadUsageData };
6
+ export { DailyUsageSchema, MonthlyUsageSchema, SessionUsageSchema, UsageDataSchema, calculateCostForEntry, formatDate, getDefaultClaudePath, loadDailyUsageData, loadMonthlyUsageData, loadSessionData };
@@ -1,7 +1,7 @@
1
- import { UsageDataSchema, glob } from "./data-loader-B8mdiY5r.js";
2
- import { safeParse } from "./dist-D6rk8Ra5.js";
3
- import { logger } from "./logger-nCODI08N.js";
4
- import { calculateCostFromTokens, fetchModelPricing, getModelPricing } from "./pricing-fetcher-bvi4lbXl.js";
1
+ import { UsageDataSchema, glob } from "./data-loader-CDv0IYZx.js";
2
+ import { safeParse } from "./dist-FwNhpFrW.js";
3
+ import { logger } from "./logger-DhDyJEC5.js";
4
+ import { calculateCostFromTokens, fetchModelPricing, getModelPricing } from "./pricing-fetcher-BCv1Vods.js";
5
5
  import { readFile } from "node:fs/promises";
6
6
  import { homedir } from "node:os";
7
7
  import path from "node:path";
package/dist/debug.js CHANGED
@@ -1,7 +1,7 @@
1
- import "./data-loader-B8mdiY5r.js";
2
- import "./dist-D6rk8Ra5.js";
3
- import "./logger-nCODI08N.js";
4
- import "./pricing-fetcher-bvi4lbXl.js";
5
- import { detectMismatches, printMismatchReport } from "./debug-Oce2b5bO.js";
1
+ import "./data-loader-CDv0IYZx.js";
2
+ import "./dist-FwNhpFrW.js";
3
+ import "./logger-DhDyJEC5.js";
4
+ import "./pricing-fetcher-BCv1Vods.js";
5
+ import { detectMismatches, printMismatchReport } from "./debug-Dk36WQTw.js";
6
6
 
7
7
  export { detectMismatches, printMismatchReport };