ccgauge 0.4.0 → 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 (68) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +42 -42
  3. package/.next/standalone/.next/app-path-routes-manifest.json +7 -7
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/api/blocks/route.js +1 -1
  7. package/.next/standalone/.next/server/app/api/blocks/route_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/api/export/usage/route.js +1 -1
  9. package/.next/standalone/.next/server/app/api/export/usage/route.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/api/export/usage/route_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/api/pricing/route.js +1 -1
  12. package/.next/standalone/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  14. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/api/scan/route.js +1 -1
  16. package/.next/standalone/.next/server/app/api/scan/route_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/api/sessions/route.js +1 -1
  18. package/.next/standalone/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/api/usage/route.js +1 -1
  20. package/.next/standalone/.next/server/app/api/usage/route_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/models/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/page.js +2 -2
  23. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/projects/[id]/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/projects/page.js +1 -1
  26. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/sessions/page.js +1 -1
  29. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  31. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/usage/page.js +2 -2
  33. package/.next/standalone/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app-paths-manifest.json +7 -7
  35. package/.next/standalone/.next/server/chunks/426.js +9 -4
  36. package/.next/standalone/.next/server/chunks/716.js +1 -1
  37. package/.next/standalone/.next/server/chunks/775.js +1 -1
  38. package/.next/standalone/.next/server/functions-config-manifest.json +3 -3
  39. package/.next/standalone/.next/server/pages/500.html +1 -1
  40. package/.next/standalone/.next/static/chunks/148-557ee562aff993b1.js +1 -0
  41. package/.next/standalone/.next/static/chunks/app/{error-89ee9e078058915d.js → error-3e48784f89c5ae8d.js} +1 -1
  42. package/.next/standalone/.next/static/chunks/app/layout-6c973d790f015707.js +1 -0
  43. package/.next/standalone/.next/static/chunks/app/models/page-dff43b9050382020.js +1 -0
  44. package/.next/standalone/.next/static/chunks/app/page-6d87d7a8aa752100.js +1 -0
  45. package/.next/standalone/.next/static/chunks/app/projects/[id]/page-3f812f0e20137f2b.js +1 -0
  46. package/.next/standalone/.next/static/chunks/app/sessions/[id]/page-3f812f0e20137f2b.js +1 -0
  47. package/.next/standalone/.next/static/chunks/app/settings/{page-334168b522eac1b1.js → page-d1af886a5c22af9b.js} +1 -1
  48. package/.next/standalone/.next/static/chunks/app/usage/page-26297e0641d51da8.js +1 -0
  49. package/.next/standalone/.next/static/css/b07523b7c353538d.css +3 -0
  50. package/.next/standalone/node_modules/next/node_modules/postcss/package.json +0 -0
  51. package/.next/standalone/package.json +15 -4
  52. package/CHANGELOG.md +147 -0
  53. package/README.md +41 -2
  54. package/README.zh-CN.md +39 -2
  55. package/bin/cli.mjs +83 -3
  56. package/dist/mcp/server.mjs +71 -29
  57. package/dist/report/index.mjs +2098 -0
  58. package/package.json +26 -17
  59. package/.next/standalone/.next/static/chunks/454-d0e7d0fa6f643c41.js +0 -1
  60. package/.next/standalone/.next/static/chunks/app/layout-a6e30ba3a7f39737.js +0 -1
  61. package/.next/standalone/.next/static/chunks/app/models/page-e0e1b5979547421a.js +0 -1
  62. package/.next/standalone/.next/static/chunks/app/page-9347dfa20dabb24b.js +0 -1
  63. package/.next/standalone/.next/static/chunks/app/projects/[id]/page-5804875e3dc384df.js +0 -1
  64. package/.next/standalone/.next/static/chunks/app/sessions/[id]/page-5804875e3dc384df.js +0 -1
  65. package/.next/standalone/.next/static/chunks/app/usage/page-7789fec27778df9a.js +0 -1
  66. package/.next/standalone/.next/static/css/c34cd36ce5fc39e2.css +0 -3
  67. /package/.next/standalone/.next/static/{w_l54xHgbhALYXmZcmUxC → ZPycmg0NLiIflO5NXMT75}/_buildManifest.js +0 -0
  68. /package/.next/standalone/.next/static/{w_l54xHgbhALYXmZcmUxC → ZPycmg0NLiIflO5NXMT75}/_ssgManifest.js +0 -0
@@ -21097,13 +21097,52 @@ var StdioServerTransport = class {
21097
21097
  }
21098
21098
  };
21099
21099
 
21100
+ // lib/date-utils.ts
21101
+ var DATE_PREFIX_RE = /^(\d{4})-(\d{2})-(\d{2})(.*)$/;
21102
+ function atStartOfDay(d) {
21103
+ const r = new Date(d);
21104
+ r.setHours(0, 0, 0, 0);
21105
+ return r;
21106
+ }
21107
+ function atEndOfDay(d) {
21108
+ const r = new Date(d);
21109
+ r.setHours(23, 59, 59, 999);
21110
+ return r;
21111
+ }
21112
+ function parseLocalDateOnly(s) {
21113
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
21114
+ if (!m) return null;
21115
+ const y = Number(m[1]);
21116
+ const month = Number(m[2]);
21117
+ const day = Number(m[3]);
21118
+ const dt = new Date(y, month - 1, day);
21119
+ if (dt.getFullYear() !== y || dt.getMonth() !== month - 1 || dt.getDate() !== day) {
21120
+ return null;
21121
+ }
21122
+ return dt;
21123
+ }
21124
+ function isLocalDateOnly(s) {
21125
+ return parseLocalDateOnly(s) !== null;
21126
+ }
21127
+ function parseDateLike(s, opts = {}) {
21128
+ const datePrefix = DATE_PREFIX_RE.exec(s);
21129
+ if (datePrefix) {
21130
+ const dateOnly = `${datePrefix[1]}-${datePrefix[2]}-${datePrefix[3]}`;
21131
+ const localDate = parseLocalDateOnly(dateOnly);
21132
+ if (!localDate) return null;
21133
+ if (datePrefix[4] === "") {
21134
+ return opts.upperBoundDateOnly ? atEndOfDay(localDate) : localDate;
21135
+ }
21136
+ }
21137
+ const dt = new Date(s);
21138
+ return Number.isNaN(dt.getTime()) ? null : dt;
21139
+ }
21140
+
21100
21141
  // lib/mcp/schema.ts
21101
21142
  var sourceSchema = external_exports.enum(["claude", "codex", "all"]).default("all");
21102
21143
  var granularitySchema = external_exports.enum(["hour", "day", "week", "month"]).default("day");
21103
21144
  function isValidDateString(s) {
21104
- if (/^\d{4}-\d{2}-\d{2}$/.test(s)) return true;
21105
- const dt = new Date(s);
21106
- return !Number.isNaN(dt.getTime());
21145
+ return parseDateLike(s) !== null;
21107
21146
  }
21108
21147
  var dateBoundSchema = external_exports.string().refine(isValidDateString, {
21109
21148
  message: "must be a YYYY-MM-DD date or a full ISO 8601 timestamp"
@@ -21131,7 +21170,7 @@ var daySchema = external_exports.string().refine(
21131
21170
  const lower = s.toLowerCase();
21132
21171
  if (SPECIAL_DAYS.includes(lower)) return true;
21133
21172
  if (WEEKDAYS.includes(lower)) return true;
21134
- return /^\d{4}-\d{2}-\d{2}$/.test(s);
21173
+ return isLocalDateOnly(s);
21135
21174
  },
21136
21175
  {
21137
21176
  message: 'must be "today", "yesterday", a weekday name (monday..sunday), or YYYY-MM-DD'
@@ -21277,6 +21316,7 @@ function parseUser(raw, file) {
21277
21316
  }
21278
21317
  }
21279
21318
  }
21319
+ const isSynthetic = !!textPreview && isSyntheticUserText(textPreview);
21280
21320
  return {
21281
21321
  type: "user",
21282
21322
  source: "claude",
@@ -21286,9 +21326,17 @@ function parseUser(raw, file) {
21286
21326
  sessionId: raw.sessionId ?? "",
21287
21327
  cwd: raw.cwd ?? "",
21288
21328
  textPreview,
21329
+ isSynthetic,
21289
21330
  filePath: file
21290
21331
  };
21291
21332
  }
21333
+ function isSyntheticUserText(text) {
21334
+ const t = text.trimStart();
21335
+ if (t.startsWith("Base directory for this skill:")) return true;
21336
+ if (t.startsWith("<system-reminder>")) return true;
21337
+ if (t.startsWith("Caveat: The messages below were generated by")) return true;
21338
+ return false;
21339
+ }
21292
21340
 
21293
21341
  // lib/pricing/builtin.ts
21294
21342
  var BUILTIN_PRICING = {
@@ -21489,7 +21537,13 @@ var claudeAdapter = {
21489
21537
  displayName: { en: "Claude", zh: "Claude" },
21490
21538
  shortLabel: "C",
21491
21539
  color: { fg: "#b45309", bg: "#fef3c7" },
21492
- parserVersion: "claude-v1",
21540
+ // v2: blank textPreview on synthetic user messages (skill metadata,
21541
+ // <system-reminder> blocks) so they don't split a single conversation
21542
+ // into multiple "turns" in the usage table.
21543
+ // v3: keep textPreview but add an `isSynthetic` flag — child rows in the
21544
+ // usage table show skill metadata as their per-call "prompt"; only
21545
+ // turn-boundary detection skips synthetic users.
21546
+ parserVersion: "claude-v3-synthetic-flag",
21493
21547
  capabilities: {
21494
21548
  hasCacheCreation: true,
21495
21549
  hasReasoningTokens: false,
@@ -21714,7 +21768,8 @@ async function parseCodexJsonlFile(file) {
21714
21768
  toolNames: [...turn.toolNames],
21715
21769
  hasThinking: turn.hasThinking,
21716
21770
  textPreview: turn.pendingTextPreview,
21717
- filePath: file
21771
+ filePath: file,
21772
+ effort: turn.effort
21718
21773
  });
21719
21774
  parentLinks.push([uuid2, turn.userUuid]);
21720
21775
  turn.toolNames = [];
@@ -21930,7 +21985,9 @@ var codexAdapter = {
21930
21985
  // ~26% over-counting from duplicate/refresh token_count events).
21931
21986
  // v3: split reasoning_tokens out as a display-only breakdown alongside
21932
21987
  // output_tokens (which still includes reasoning for billing).
21933
- parserVersion: "codex-v3-reasoning-detail",
21988
+ // v4: persist `effort` from turn_context onto each emitted record so the
21989
+ // UI can tag the model column (e.g. `gpt-5.2-codex · high`).
21990
+ parserVersion: "codex-v4-effort",
21934
21991
  capabilities: {
21935
21992
  hasCacheCreation: false,
21936
21993
  hasReasoningTokens: true,
@@ -22591,29 +22648,14 @@ function parseDateRange(args) {
22591
22648
  }
22592
22649
  }
22593
22650
  function parseStrictDate(s, field, isUpperBound) {
22594
- if (/^\d{4}-\d{2}-\d{2}$/.test(s)) {
22595
- const [y, m, d] = s.split("-").map(Number);
22596
- const dt2 = new Date(y, m - 1, d);
22597
- return isUpperBound ? atEndOfDay(dt2) : dt2;
22598
- }
22599
- const dt = new Date(s);
22600
- if (Number.isNaN(dt.getTime())) {
22651
+ const dt = parseDateLike(s, { upperBoundDateOnly: isUpperBound });
22652
+ if (!dt) {
22601
22653
  throw new Error(
22602
22654
  `invalid '${field}' argument: ${JSON.stringify(s)}. Expected YYYY-MM-DD or a full ISO 8601 timestamp.`
22603
22655
  );
22604
22656
  }
22605
22657
  return dt;
22606
22658
  }
22607
- function atStartOfDay(d) {
22608
- const r = new Date(d);
22609
- r.setHours(0, 0, 0, 0);
22610
- return r;
22611
- }
22612
- function atEndOfDay(d) {
22613
- const r = new Date(d);
22614
- r.setHours(23, 59, 59, 999);
22615
- return r;
22616
- }
22617
22659
  function startOfWeek(d) {
22618
22660
  const day = d.getDay() || 7;
22619
22661
  const monday = new Date(d);
@@ -22632,7 +22674,8 @@ function costOfRecord(rec) {
22632
22674
  // lib/utils.ts
22633
22675
  function projectNameFromCwd(cwd) {
22634
22676
  if (!cwd) return "(unknown)";
22635
- const parts = cwd.replace(/\/+$/, "").split("/");
22677
+ const trimmed = cwd.replace(/[/\\]+$/, "");
22678
+ const parts = trimmed.split(/[/\\]+/);
22636
22679
  return parts[parts.length - 1] || cwd;
22637
22680
  }
22638
22681
 
@@ -23317,10 +23360,9 @@ function parseDayArg(input) {
23317
23360
  const { start, end } = dayOf(target);
23318
23361
  return { from: start, to: end, label: lower };
23319
23362
  }
23320
- if (/^\d{4}-\d{2}-\d{2}$/.test(input)) {
23321
- const [y, m, d] = input.split("-").map(Number);
23322
- const dt = new Date(y, m - 1, d);
23323
- const { start, end } = dayOf(dt);
23363
+ const explicitDate = parseLocalDateOnly(input);
23364
+ if (explicitDate) {
23365
+ const { start, end } = dayOf(explicitDate);
23324
23366
  return { from: start, to: end, label: input };
23325
23367
  }
23326
23368
  throw new Error(