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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +42 -42
- package/.next/standalone/.next/app-path-routes-manifest.json +7 -7
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/blocks/route.js +1 -1
- package/.next/standalone/.next/server/app/api/blocks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/export/usage/route.js +1 -1
- package/.next/standalone/.next/server/app/api/export/usage/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/export/usage/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/pricing/route.js +1 -1
- package/.next/standalone/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/scan/route.js +1 -1
- package/.next/standalone/.next/server/app/api/scan/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/usage/route.js +1 -1
- package/.next/standalone/.next/server/app/api/usage/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/models/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/sessions/page.js +1 -1
- package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/usage/page.js +2 -2
- package/.next/standalone/.next/server/app/usage/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +7 -7
- package/.next/standalone/.next/server/chunks/426.js +9 -4
- package/.next/standalone/.next/server/chunks/716.js +1 -1
- package/.next/standalone/.next/server/chunks/775.js +1 -1
- package/.next/standalone/.next/server/functions-config-manifest.json +3 -3
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/static/chunks/148-557ee562aff993b1.js +1 -0
- package/.next/standalone/.next/static/chunks/app/{error-89ee9e078058915d.js → error-3e48784f89c5ae8d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/layout-6c973d790f015707.js +1 -0
- package/.next/standalone/.next/static/chunks/app/models/page-dff43b9050382020.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-6d87d7a8aa752100.js +1 -0
- package/.next/standalone/.next/static/chunks/app/projects/[id]/page-3f812f0e20137f2b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/sessions/[id]/page-3f812f0e20137f2b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/{page-334168b522eac1b1.js → page-d1af886a5c22af9b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/usage/page-26297e0641d51da8.js +1 -0
- package/.next/standalone/.next/static/css/b07523b7c353538d.css +3 -0
- package/.next/standalone/node_modules/next/node_modules/postcss/package.json +0 -0
- package/.next/standalone/package.json +15 -4
- package/CHANGELOG.md +147 -0
- package/README.md +41 -2
- package/README.zh-CN.md +39 -2
- package/bin/cli.mjs +83 -3
- package/dist/mcp/server.mjs +71 -29
- package/dist/report/index.mjs +2098 -0
- package/package.json +26 -17
- package/.next/standalone/.next/static/chunks/454-d0e7d0fa6f643c41.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-a6e30ba3a7f39737.js +0 -1
- package/.next/standalone/.next/static/chunks/app/models/page-e0e1b5979547421a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-9347dfa20dabb24b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/projects/[id]/page-5804875e3dc384df.js +0 -1
- package/.next/standalone/.next/static/chunks/app/sessions/[id]/page-5804875e3dc384df.js +0 -1
- package/.next/standalone/.next/static/chunks/app/usage/page-7789fec27778df9a.js +0 -1
- package/.next/standalone/.next/static/css/c34cd36ce5fc39e2.css +0 -3
- /package/.next/standalone/.next/static/{w_l54xHgbhALYXmZcmUxC → ZPycmg0NLiIflO5NXMT75}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{w_l54xHgbhALYXmZcmUxC → ZPycmg0NLiIflO5NXMT75}/_ssgManifest.js +0 -0
package/dist/mcp/server.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
22595
|
-
|
|
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
|
|
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
|
-
|
|
23321
|
-
|
|
23322
|
-
const
|
|
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(
|