@codemieai/code 0.3.2 → 0.4.1
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/README.md +2 -0
- package/dist/agents/core/session/BaseSessionAdapter.d.ts +5 -2
- package/dist/agents/core/session/BaseSessionAdapter.d.ts.map +1 -1
- package/dist/agents/core/types.d.ts +11 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +3 -3
- package/dist/agents/plugins/claude/claude.session.d.ts +13 -0
- package/dist/agents/plugins/claude/claude.session.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.session.js +122 -42
- package/dist/agents/plugins/claude/claude.session.js.map +1 -1
- package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/agents/plugins/claude/plugin/skills/codemie-analytics/scripts/analytics-cli.js +12 -8
- package/dist/agents/plugins/claude/plugin/skills/msgraph/SKILL.md +95 -8
- package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +333 -2
- package/dist/agents/plugins/claude/plugin/statusline.mjs +11 -3
- package/dist/agents/plugins/claude/session/claude-file-operation.d.ts +38 -0
- package/dist/agents/plugins/claude/session/claude-file-operation.d.ts.map +1 -0
- package/dist/agents/plugins/claude/session/claude-file-operation.js +67 -0
- package/dist/agents/plugins/claude/session/claude-file-operation.js.map +1 -0
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts +0 -4
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts.map +1 -1
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js +7 -56
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js.map +1 -1
- package/dist/bin/proxy-daemon.js +54 -5
- package/dist/bin/proxy-daemon.js.map +1 -1
- package/dist/cli/commands/analytics/aggregator.d.ts +1 -1
- package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -1
- package/dist/cli/commands/analytics/aggregator.js +84 -23
- package/dist/cli/commands/analytics/aggregator.js.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-calculator.d.ts +10 -0
- package/dist/cli/commands/analytics/cost/cost-calculator.d.ts.map +1 -0
- package/dist/cli/commands/analytics/cost/cost-calculator.js +24 -0
- package/dist/cli/commands/analytics/cost/cost-calculator.js.map +1 -0
- package/dist/cli/commands/analytics/cost/cost-enricher.d.ts +24 -0
- package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -0
- package/dist/cli/commands/analytics/cost/cost-enricher.js +152 -0
- package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -0
- package/dist/cli/commands/analytics/cost/pricing.d.ts +23 -0
- package/dist/cli/commands/analytics/cost/pricing.d.ts.map +1 -0
- package/dist/cli/commands/analytics/cost/pricing.js +82 -0
- package/dist/cli/commands/analytics/cost/pricing.js.map +1 -0
- package/dist/cli/commands/analytics/cost/pricing.json +975 -0
- package/dist/cli/commands/analytics/cost/types.d.ts +51 -0
- package/dist/cli/commands/analytics/cost/types.d.ts.map +1 -0
- package/dist/cli/commands/analytics/cost/types.js +8 -0
- package/dist/cli/commands/analytics/cost/types.js.map +1 -0
- package/dist/cli/commands/analytics/cost/usage-readers.d.ts +40 -0
- package/dist/cli/commands/analytics/cost/usage-readers.d.ts.map +1 -0
- package/dist/cli/commands/analytics/cost/usage-readers.js +165 -0
- package/dist/cli/commands/analytics/cost/usage-readers.js.map +1 -0
- package/dist/cli/commands/analytics/data-loader.d.ts +11 -0
- package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/data-loader.js +7 -0
- package/dist/cli/commands/analytics/data-loader.js.map +1 -1
- package/dist/cli/commands/analytics/exporter.d.ts.map +1 -1
- package/dist/cli/commands/analytics/exporter.js +2 -2
- package/dist/cli/commands/analytics/exporter.js.map +1 -1
- package/dist/cli/commands/analytics/index.d.ts.map +1 -1
- package/dist/cli/commands/analytics/index.js +107 -10
- package/dist/cli/commands/analytics/index.js.map +1 -1
- package/dist/cli/commands/analytics/native-loader.d.ts +48 -0
- package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -0
- package/dist/cli/commands/analytics/native-loader.js +220 -0
- package/dist/cli/commands/analytics/native-loader.js.map +1 -0
- package/dist/cli/commands/analytics/report/assets/chart.umd.js +14 -0
- package/dist/cli/commands/analytics/report/assets/codemie-bundle.css +1 -0
- package/dist/cli/commands/analytics/report/client/app.js +676 -0
- package/dist/cli/commands/analytics/report/payload-builder.d.ts +15 -0
- package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -0
- package/dist/cli/commands/analytics/report/payload-builder.js +107 -0
- package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -0
- package/dist/cli/commands/analytics/report/report-generator.d.ts +47 -0
- package/dist/cli/commands/analytics/report/report-generator.d.ts.map +1 -0
- package/dist/cli/commands/analytics/report/report-generator.js +102 -0
- package/dist/cli/commands/analytics/report/report-generator.js.map +1 -0
- package/dist/cli/commands/analytics/report/template.html +217 -0
- package/dist/cli/commands/analytics/report/types.d.ts +55 -0
- package/dist/cli/commands/analytics/report/types.d.ts.map +1 -0
- package/dist/cli/commands/analytics/report/types.js +6 -0
- package/dist/cli/commands/analytics/report/types.js.map +1 -0
- package/dist/cli/commands/analytics/types.d.ts +13 -0
- package/dist/cli/commands/analytics/types.d.ts.map +1 -1
- package/dist/cli/commands/proxy/daemon-manager.d.ts +5 -0
- package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
- package/dist/cli/commands/proxy/daemon-manager.js +25 -9
- package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
- package/dist/cli/commands/proxy/health-check.d.ts +16 -0
- package/dist/cli/commands/proxy/health-check.d.ts.map +1 -0
- package/dist/cli/commands/proxy/health-check.js +81 -0
- package/dist/cli/commands/proxy/health-check.js.map +1 -0
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +54 -4
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/commands/proxy/watcher.d.ts +31 -0
- package/dist/cli/commands/proxy/watcher.d.ts.map +1 -0
- package/dist/cli/commands/proxy/watcher.js +97 -0
- package/dist/cli/commands/proxy/watcher.js.map +1 -0
- package/dist/cli/commands/skills/setup/sync-plugin.d.ts +15 -0
- package/dist/cli/commands/skills/setup/sync-plugin.d.ts.map +1 -0
- package/dist/cli/commands/skills/setup/sync-plugin.js +63 -0
- package/dist/cli/commands/skills/setup/sync-plugin.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/proxy-errors.js +2 -2
- package/dist/providers/plugins/sso/proxy/proxy-errors.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/proxy-types.d.ts +6 -0
- package/dist/providers/plugins/sso/proxy/proxy-types.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts +1 -0
- package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.js +39 -3
- package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js +14 -4
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js.map +1 -1
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.d.ts.map +1 -1
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.js +5 -0
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.js.map +1 -1
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-types.d.ts +2 -0
- package/dist/providers/plugins/sso/session/processors/metrics/metrics-types.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/copy-plugins.js +39 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage and cost types for the analytics HTML report.
|
|
3
|
+
*
|
|
4
|
+
* Cost is computed at report time by re-parsing each session's native agent log
|
|
5
|
+
* (see cost-enricher.ts) and applying the pricing table (pricing.ts).
|
|
6
|
+
*/
|
|
7
|
+
/** Token usage normalized across agents. All counts default to 0 when unknown. */
|
|
8
|
+
export interface TokenUsage {
|
|
9
|
+
input: number;
|
|
10
|
+
output: number;
|
|
11
|
+
cacheRead: number;
|
|
12
|
+
cacheCreation: number;
|
|
13
|
+
total: number;
|
|
14
|
+
}
|
|
15
|
+
/** Per-model cost line for one session. */
|
|
16
|
+
export interface ModelCost {
|
|
17
|
+
model: string;
|
|
18
|
+
tokens: TokenUsage;
|
|
19
|
+
costUSD: number;
|
|
20
|
+
unpriced: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Cost result for a single session. */
|
|
23
|
+
export interface SessionCost {
|
|
24
|
+
sessionId: string;
|
|
25
|
+
tokens: TokenUsage;
|
|
26
|
+
costUSD: number;
|
|
27
|
+
perModel: ModelCost[];
|
|
28
|
+
priced: boolean;
|
|
29
|
+
hadLog: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** sessionId -> SessionCost */
|
|
32
|
+
export type SessionCostIndex = Map<string, SessionCost>;
|
|
33
|
+
/**
|
|
34
|
+
* Per-agent pricing coverage — answers "which tools' metrics are included?".
|
|
35
|
+
* Computed over the deduped, displayed session set (in payload-builder) so it stays
|
|
36
|
+
* consistent with the report's headline session count.
|
|
37
|
+
*/
|
|
38
|
+
export interface AgentCoverage {
|
|
39
|
+
agentName: string;
|
|
40
|
+
total: number;
|
|
41
|
+
priced: number;
|
|
42
|
+
withLog: number;
|
|
43
|
+
}
|
|
44
|
+
/** Run-level cost rollup for honesty banners. */
|
|
45
|
+
export interface CostSummary {
|
|
46
|
+
totalCostUSD: number;
|
|
47
|
+
pricedSessions: number;
|
|
48
|
+
totalSessions: number;
|
|
49
|
+
unpricedModels: string[];
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/analytics/cost/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2CAA2C;AAC3C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage and cost types for the analytics HTML report.
|
|
3
|
+
*
|
|
4
|
+
* Cost is computed at report time by re-parsing each session's native agent log
|
|
5
|
+
* (see cost-enricher.ts) and applying the pricing table (pricing.ts).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/cli/commands/analytics/cost/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-agent token usage extraction from a parsed native session.
|
|
3
|
+
*
|
|
4
|
+
* Each agent stores token usage differently in its native transcript. These
|
|
5
|
+
* readers normalize that into a per-model {@link TokenUsage} map. Agents without
|
|
6
|
+
* a reader (or sessions with no usage data) return an empty map, which the
|
|
7
|
+
* enricher treats as "unpriced".
|
|
8
|
+
*/
|
|
9
|
+
import type { ParsedSession } from '../../../../agents/core/session/BaseSessionAdapter.js';
|
|
10
|
+
import type { TokenUsage } from './types.js';
|
|
11
|
+
/** model -> usage */
|
|
12
|
+
type UsageMap = Map<string, TokenUsage>;
|
|
13
|
+
/** One assistant API response's usage, plus a dedup key for cross-session de-duplication. */
|
|
14
|
+
export interface UsageRecord {
|
|
15
|
+
/** `${message.id}::${requestId}` — null when neither is present (cannot dedupe ⇒ always counted). */
|
|
16
|
+
key: string | null;
|
|
17
|
+
model: string;
|
|
18
|
+
usage: TokenUsage;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract one {@link UsageRecord} per Claude assistant message (skipping `<synthetic>`).
|
|
22
|
+
* Claude Code replays prior turns into resumed/forked session files, so the SAME API
|
|
23
|
+
* response (same message.id + requestId) appears in multiple logs — callers dedupe by `key`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractClaudeUsageRecords(parsed: ParsedSession): UsageRecord[];
|
|
26
|
+
/**
|
|
27
|
+
* Returns per-model {@link TokenUsage}. An empty map means the agent is
|
|
28
|
+
* unsupported or the session carried no usage data. (Session-local; does NOT
|
|
29
|
+
* dedupe across sessions — use {@link gatherUsageDeduped} for run-level totals.)
|
|
30
|
+
*/
|
|
31
|
+
export declare function readUsageByModel(agentName: string, parsed: ParsedSession): UsageMap;
|
|
32
|
+
/**
|
|
33
|
+
* Per-model usage for the cost enricher, deduping Claude API responses across sessions
|
|
34
|
+
* by `(message.id, requestId)`. `seen` is shared across all sessions in a run (pass a
|
|
35
|
+
* fresh set to disable cross-session dedup). When a Claude session carries an authoritative
|
|
36
|
+
* SDK `modelUsage` rollup (audit.jsonl), that is used as-is (session-local, no cross-file dup).
|
|
37
|
+
*/
|
|
38
|
+
export declare function gatherUsageDeduped(agentName: string, parsed: ParsedSession, seen: Set<string>): UsageMap;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=usage-readers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-readers.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/analytics/cost/usage-readers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAC3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,qBAAqB;AACrB,KAAK,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AA6BxC,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,qGAAqG;IACrG,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,EAAE,CAyB9E;AA+FD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,QAAQ,CAYnF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,CAuBxG"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-agent token usage extraction from a parsed native session.
|
|
3
|
+
*
|
|
4
|
+
* Each agent stores token usage differently in its native transcript. These
|
|
5
|
+
* readers normalize that into a per-model {@link TokenUsage} map. Agents without
|
|
6
|
+
* a reader (or sessions with no usage data) return an empty map, which the
|
|
7
|
+
* enricher treats as "unpriced".
|
|
8
|
+
*/
|
|
9
|
+
import { emptyUsage, addUsage } from './cost-calculator.js';
|
|
10
|
+
function accumulate(map, model, usage) {
|
|
11
|
+
map.set(model, addUsage(map.get(model) ?? emptyUsage(), usage));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Adapters are contracted to return `messages: unknown[]`, but a malformed or partially-written
|
|
15
|
+
* native log can yield a non-array. Coerce defensively so a single bad session never throws out
|
|
16
|
+
* of cost enrichment (matching the graceful degradation used elsewhere in the cost pipeline).
|
|
17
|
+
*/
|
|
18
|
+
function messagesOf(parsed) {
|
|
19
|
+
return Array.isArray(parsed.messages) ? parsed.messages : [];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract one {@link UsageRecord} per Claude assistant message (skipping `<synthetic>`).
|
|
23
|
+
* Claude Code replays prior turns into resumed/forked session files, so the SAME API
|
|
24
|
+
* response (same message.id + requestId) appears in multiple logs — callers dedupe by `key`.
|
|
25
|
+
*/
|
|
26
|
+
export function extractClaudeUsageRecords(parsed) {
|
|
27
|
+
const records = [];
|
|
28
|
+
for (const raw of messagesOf(parsed)) {
|
|
29
|
+
const usage = raw.message?.usage;
|
|
30
|
+
if (!usage) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const model = raw.message?.model ?? 'unknown';
|
|
34
|
+
if (model === '<synthetic>') {
|
|
35
|
+
continue; // synthetic system messages — not a billable model
|
|
36
|
+
}
|
|
37
|
+
const input = usage.input_tokens ?? 0;
|
|
38
|
+
const output = usage.output_tokens ?? 0;
|
|
39
|
+
const cacheRead = usage.cache_read_input_tokens ?? 0;
|
|
40
|
+
const cacheCreation = usage.cache_creation_input_tokens ?? 0;
|
|
41
|
+
const id = raw.message?.id;
|
|
42
|
+
const reqId = raw.requestId;
|
|
43
|
+
const key = id || reqId ? `${id ?? ''}::${reqId ?? ''}` : null;
|
|
44
|
+
records.push({
|
|
45
|
+
key,
|
|
46
|
+
model,
|
|
47
|
+
usage: { input, output, cacheRead, cacheCreation, total: input + output + cacheRead + cacheCreation },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return records;
|
|
51
|
+
}
|
|
52
|
+
function readClaude(parsed) {
|
|
53
|
+
const out = new Map();
|
|
54
|
+
for (const r of extractClaudeUsageRecords(parsed)) {
|
|
55
|
+
accumulate(out, r.model, r.usage);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Claude-3p / Agent SDK transcripts (Claude Desktop local-agent mode, audit.jsonl)
|
|
61
|
+
* emit `result` lines carrying an authoritative `modelUsage` rollup. Summing the
|
|
62
|
+
* streamed assistant turns over-counts cache reads (and some turns carry no usage at
|
|
63
|
+
* all), so prefer modelUsage when present. Returns null when there is no result line.
|
|
64
|
+
*/
|
|
65
|
+
function readClaudeSdkResult(parsed) {
|
|
66
|
+
const out = new Map();
|
|
67
|
+
let found = false;
|
|
68
|
+
for (const raw of messagesOf(parsed)) {
|
|
69
|
+
if (raw.type !== 'result' || !raw.modelUsage) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
for (const [model, u] of Object.entries(raw.modelUsage)) {
|
|
73
|
+
if (model === '<synthetic>') {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
found = true;
|
|
77
|
+
const input = u.inputTokens ?? 0;
|
|
78
|
+
const output = u.outputTokens ?? 0;
|
|
79
|
+
const cacheRead = u.cacheReadInputTokens ?? 0;
|
|
80
|
+
const cacheCreation = u.cacheCreationInputTokens ?? 0;
|
|
81
|
+
accumulate(out, model, {
|
|
82
|
+
input,
|
|
83
|
+
output,
|
|
84
|
+
cacheRead,
|
|
85
|
+
cacheCreation,
|
|
86
|
+
total: input + output + cacheRead + cacheCreation,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return found ? out : null;
|
|
91
|
+
}
|
|
92
|
+
/** Claude Desktop: prefer the SDK modelUsage rollup, else sum assistant usage. */
|
|
93
|
+
function readClaudeDesktop(parsed) {
|
|
94
|
+
return readClaudeSdkResult(parsed) ?? readClaude(parsed);
|
|
95
|
+
}
|
|
96
|
+
function readGemini(parsed) {
|
|
97
|
+
const out = new Map();
|
|
98
|
+
for (const raw of messagesOf(parsed)) {
|
|
99
|
+
const t = raw.tokens;
|
|
100
|
+
if (!t) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const model = raw.model ?? 'gemini';
|
|
104
|
+
const input = t.input ?? 0;
|
|
105
|
+
const output = t.output ?? 0;
|
|
106
|
+
const cacheRead = t.cached ?? 0;
|
|
107
|
+
accumulate(out, model, {
|
|
108
|
+
input,
|
|
109
|
+
output,
|
|
110
|
+
cacheRead,
|
|
111
|
+
cacheCreation: 0,
|
|
112
|
+
total: t.total ?? input + output + cacheRead,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Returns per-model {@link TokenUsage}. An empty map means the agent is
|
|
119
|
+
* unsupported or the session carried no usage data. (Session-local; does NOT
|
|
120
|
+
* dedupe across sessions — use {@link gatherUsageDeduped} for run-level totals.)
|
|
121
|
+
*/
|
|
122
|
+
export function readUsageByModel(agentName, parsed) {
|
|
123
|
+
switch (agentName.toLowerCase()) {
|
|
124
|
+
case 'claude':
|
|
125
|
+
case 'claude-acp':
|
|
126
|
+
return readClaude(parsed);
|
|
127
|
+
case 'claude-desktop': // native logs are Claude-shaped (~/.claude/projects + Claude-3p audit.jsonl)
|
|
128
|
+
return readClaudeDesktop(parsed);
|
|
129
|
+
case 'gemini':
|
|
130
|
+
return readGemini(parsed);
|
|
131
|
+
default:
|
|
132
|
+
return new Map();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Per-model usage for the cost enricher, deduping Claude API responses across sessions
|
|
137
|
+
* by `(message.id, requestId)`. `seen` is shared across all sessions in a run (pass a
|
|
138
|
+
* fresh set to disable cross-session dedup). When a Claude session carries an authoritative
|
|
139
|
+
* SDK `modelUsage` rollup (audit.jsonl), that is used as-is (session-local, no cross-file dup).
|
|
140
|
+
*/
|
|
141
|
+
export function gatherUsageDeduped(agentName, parsed, seen) {
|
|
142
|
+
const a = agentName.toLowerCase();
|
|
143
|
+
if (a === 'gemini') {
|
|
144
|
+
return readGemini(parsed);
|
|
145
|
+
}
|
|
146
|
+
if (a === 'claude' || a === 'claude-acp' || a === 'claude-desktop') {
|
|
147
|
+
const rollup = readClaudeSdkResult(parsed);
|
|
148
|
+
if (rollup) {
|
|
149
|
+
return rollup; // authoritative SDK rollup
|
|
150
|
+
}
|
|
151
|
+
const out = new Map();
|
|
152
|
+
for (const r of extractClaudeUsageRecords(parsed)) {
|
|
153
|
+
if (r.key !== null) {
|
|
154
|
+
if (seen.has(r.key)) {
|
|
155
|
+
continue; // duplicate API response replayed into another session file
|
|
156
|
+
}
|
|
157
|
+
seen.add(r.key);
|
|
158
|
+
}
|
|
159
|
+
accumulate(out, r.model, r.usage);
|
|
160
|
+
}
|
|
161
|
+
return out;
|
|
162
|
+
}
|
|
163
|
+
return new Map(); // codex/opencode/etc — no usage reader yet
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=usage-readers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-readers.js","sourceRoot":"","sources":["../../../../../src/cli/commands/analytics/cost/usage-readers.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,12 @@ export interface RawSessionData {
|
|
|
45
45
|
startEvent?: SessionStartEvent;
|
|
46
46
|
endEvent?: SessionEndEvent;
|
|
47
47
|
deltas: MetricDelta[];
|
|
48
|
+
/**
|
|
49
|
+
* Native agent log path, set for sessions discovered directly from agent logs
|
|
50
|
+
* (not tracked by CodeMie). When present, the cost enricher prices from this path
|
|
51
|
+
* instead of the ~/.codemie/sessions correlation file.
|
|
52
|
+
*/
|
|
53
|
+
agentSessionFile?: string;
|
|
48
54
|
}
|
|
49
55
|
/**
|
|
50
56
|
* Load all metric files from ~/.codemie/sessions/
|
|
@@ -60,6 +66,11 @@ export declare class MetricsDataLoader {
|
|
|
60
66
|
* Load a single session's records
|
|
61
67
|
*/
|
|
62
68
|
private loadSession;
|
|
69
|
+
/**
|
|
70
|
+
* Public filter check — apply the same criteria to externally-sourced sessions
|
|
71
|
+
* (e.g. native-discovered ones) so all surfaces filter consistently.
|
|
72
|
+
*/
|
|
73
|
+
sessionMatchesFilter(sessionData: RawSessionData, filter?: AnalyticsFilter): boolean;
|
|
63
74
|
/**
|
|
64
75
|
* Check if session matches filter criteria
|
|
65
76
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-loader.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/data-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD;;;GAGG;AACH,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAyDD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"data-loader.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/data-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD;;;GAGG;AACH,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAyDD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAIhC;;OAEG;IACH,YAAY,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,cAAc,EAAE;IAuCxD;;OAEG;IACH,OAAO,CAAC,WAAW;IAyEnB;;;OAGG;IACI,oBAAoB,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO;IAI3F;;OAEG;IACH,OAAO,CAAC,aAAa;IA2CrB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;CA6C9B"}
|
|
@@ -117,6 +117,13 @@ export class MetricsDataLoader {
|
|
|
117
117
|
return null;
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Public filter check — apply the same criteria to externally-sourced sessions
|
|
122
|
+
* (e.g. native-discovered ones) so all surfaces filter consistently.
|
|
123
|
+
*/
|
|
124
|
+
sessionMatchesFilter(sessionData, filter) {
|
|
125
|
+
return this.matchesFilter(sessionData, filter);
|
|
126
|
+
}
|
|
120
127
|
/**
|
|
121
128
|
* Check if session matches filter criteria
|
|
122
129
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-loader.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/data-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"data-loader.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/data-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/exporter.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/exporter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAWrE;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA8DpE;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAIzE"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Export functionality for analytics data
|
|
3
3
|
*/
|
|
4
4
|
import { writeFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
5
6
|
import chalk from 'chalk';
|
|
6
7
|
export class AnalyticsExporter {
|
|
7
8
|
/**
|
|
@@ -84,8 +85,7 @@ export class AnalyticsExporter {
|
|
|
84
85
|
*/
|
|
85
86
|
static getDefaultOutputPath(format, cwd) {
|
|
86
87
|
const timestamp = new Date().toISOString().split('T')[0];
|
|
87
|
-
|
|
88
|
-
return `${cwd}/${filename}`;
|
|
88
|
+
return join(cwd, `codemie-analytics-${timestamp}.${format}`);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
//# sourceMappingURL=exporter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/exporter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,sBAAsB,IAAI,OAAO,CAgMhD"}
|
|
@@ -22,20 +22,56 @@ export function createAnalyticsCommand() {
|
|
|
22
22
|
.option('-v, --verbose', 'Show detailed session-level breakdown')
|
|
23
23
|
.option('--export <format>', 'Export to file (json or csv)')
|
|
24
24
|
.option('-o, --output <path>', 'Output file path (default: ./codemie-analytics-YYYY-MM-DD.{format})')
|
|
25
|
+
.option('--report', 'Generate a self-contained HTML dashboard')
|
|
26
|
+
.option('--open', 'Open the generated HTML report in the default browser')
|
|
27
|
+
.option('--report-output <path>', 'HTML report output path (default: ./codemie-analytics-YYYY-MM-DD.html)')
|
|
28
|
+
.option('--report-format <format>', 'Report serialization: html, json, or both (default: html)')
|
|
29
|
+
.option('--no-scan-native', 'Skip native agent-log discovery (use only CodeMie-tracked sessions)')
|
|
25
30
|
.action(async (options) => {
|
|
26
31
|
try {
|
|
27
32
|
// Parse filter options
|
|
28
33
|
const filter = parseFilterOptions(options);
|
|
29
|
-
// Load
|
|
34
|
+
// Load CodeMie-tracked sessions
|
|
30
35
|
const loader = new MetricsDataLoader();
|
|
31
36
|
const rawSessions = loader.loadSessions(filter);
|
|
37
|
+
// Discover native agent logs (plain `claude` etc. — not tracked by CodeMie) and merge,
|
|
38
|
+
// so the analytics reflect ALL usage. Deduped against tracked logs inside the loader.
|
|
39
|
+
if (options.scanNative !== false) {
|
|
40
|
+
try {
|
|
41
|
+
const { loadNativeSessions } = await import('./native-loader.js');
|
|
42
|
+
const natives = (await loadNativeSessions(filter)).filter((s) => loader.sessionMatchesFilter(s, filter));
|
|
43
|
+
rawSessions.push(...natives);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger.debug('Native session discovery failed (continuing with tracked sessions):', error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
32
49
|
if (rawSessions.length === 0) {
|
|
33
50
|
console.log(chalk.yellow('\nNo sessions found matching the specified criteria.'));
|
|
34
51
|
console.log(chalk.dim('Run with different filters or check that metrics are being collected.\n'));
|
|
35
52
|
return;
|
|
36
53
|
}
|
|
54
|
+
// A report needs cost, and cost must be computed BEFORE aggregation so that zero-delta
|
|
55
|
+
// sessions which still carry cost (empty metrics file but real usage in a correlated
|
|
56
|
+
// agent log) are retained instead of dropped as "empty". Price first, then aggregate.
|
|
57
|
+
const wantReport = Boolean(options.report || options.reportOutput || options.open || options.reportFormat);
|
|
58
|
+
const reportFormat = (options.reportFormat ?? 'html').toLowerCase();
|
|
59
|
+
if (wantReport && reportFormat !== 'html' && reportFormat !== 'json' && reportFormat !== 'both') {
|
|
60
|
+
console.log(chalk.red('\n✗ Invalid report format. Use "html", "json", or "both".'));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
let costResult;
|
|
64
|
+
let keepSessionIds;
|
|
65
|
+
if (wantReport) {
|
|
66
|
+
const { enrichCosts, realDeps } = await import('./cost/cost-enricher.js');
|
|
67
|
+
costResult = await enrichCosts(rawSessions, realDeps);
|
|
68
|
+
// Retain zero-delta sessions that still carry real recoverable token usage — even
|
|
69
|
+
// when the model is unpriced (costUSD === 0) — so they are not silently dropped and
|
|
70
|
+
// can surface in the unpriced-models coverage. Filtering on cost would lose them.
|
|
71
|
+
keepSessionIds = new Set([...costResult.index.values()].filter((c) => c.tokens.total > 0).map((c) => c.sessionId));
|
|
72
|
+
}
|
|
37
73
|
// Aggregate data (normalize models unless --verbose flag is set)
|
|
38
|
-
const analytics = AnalyticsAggregator.aggregate(rawSessions, !options.verbose);
|
|
74
|
+
const analytics = AnalyticsAggregator.aggregate(rawSessions, !options.verbose, keepSessionIds);
|
|
39
75
|
if (analytics.totalSessions === 0) {
|
|
40
76
|
console.log(chalk.yellow('\nNo analytics data available.'));
|
|
41
77
|
console.log(chalk.dim('Metrics collection may not have been enabled for these sessions.\n'));
|
|
@@ -60,6 +96,69 @@ export function createAnalyticsCommand() {
|
|
|
60
96
|
AnalyticsExporter.exportCSV(analytics, outputPath);
|
|
61
97
|
}
|
|
62
98
|
}
|
|
99
|
+
// Generate the report if requested (--report-output and --open imply --report)
|
|
100
|
+
if (wantReport && costResult) {
|
|
101
|
+
const { buildPayload } = await import('./report/payload-builder.js');
|
|
102
|
+
const { generateReport, generateReportJson, getDefaultReportPath, getDefaultReportJsonPath, writeReportWithFallback } = await import('./report/report-generator.js');
|
|
103
|
+
const { index: costIndex, summary } = costResult;
|
|
104
|
+
const payload = buildPayload(analytics, costIndex, summary, {
|
|
105
|
+
rangeLabel: options.last ?? (options.from || options.to ? 'custom' : 'all'),
|
|
106
|
+
projectFilter: options.project ?? 'all',
|
|
107
|
+
generatedAt: new Date().toISOString()
|
|
108
|
+
});
|
|
109
|
+
const cwd = process.cwd();
|
|
110
|
+
let htmlPath;
|
|
111
|
+
let jsonPath;
|
|
112
|
+
// Default (cwd-derived) paths may relocate when cwd is unwritable (drive root,
|
|
113
|
+
// read-only volume); an explicit --report-output is honored as-is, errors included.
|
|
114
|
+
let htmlIsDefault = false;
|
|
115
|
+
let jsonIsDefault = false;
|
|
116
|
+
if (reportFormat === 'both') {
|
|
117
|
+
// Derive a shared base (strip a trailing .html/.json from --report-output, if any)
|
|
118
|
+
// so the two artifacts are siblings and never collide, whatever extension was passed.
|
|
119
|
+
const base = options.reportOutput?.replace(/\.(html|json)$/i, '');
|
|
120
|
+
htmlPath = base ? `${base}.html` : getDefaultReportPath(cwd);
|
|
121
|
+
jsonPath = base ? `${base}.json` : getDefaultReportJsonPath(cwd);
|
|
122
|
+
htmlIsDefault = jsonIsDefault = !base;
|
|
123
|
+
}
|
|
124
|
+
else if (reportFormat === 'html') {
|
|
125
|
+
htmlPath = options.reportOutput || getDefaultReportPath(cwd);
|
|
126
|
+
htmlIsDefault = !options.reportOutput;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
jsonPath = options.reportOutput || getDefaultReportJsonPath(cwd);
|
|
130
|
+
jsonIsDefault = !options.reportOutput;
|
|
131
|
+
}
|
|
132
|
+
if (htmlPath) {
|
|
133
|
+
const result = writeReportWithFallback((p) => generateReport(payload, p), htmlPath, htmlIsDefault);
|
|
134
|
+
htmlPath = result.path; // keep --open and the success line pointed at the real file
|
|
135
|
+
if (result.relocatedFrom) {
|
|
136
|
+
console.log(chalk.yellow(`\n! ${result.relocatedFrom} is not writable (drive root or read-only volume); using a writable location instead.`));
|
|
137
|
+
}
|
|
138
|
+
console.log(chalk.green(`\n✓ HTML report written to: ${htmlPath}`));
|
|
139
|
+
}
|
|
140
|
+
if (jsonPath) {
|
|
141
|
+
const result = writeReportWithFallback((p) => generateReportJson(payload, p), jsonPath, jsonIsDefault);
|
|
142
|
+
jsonPath = result.path;
|
|
143
|
+
if (result.relocatedFrom) {
|
|
144
|
+
console.log(chalk.yellow(`\n! ${result.relocatedFrom} is not writable (drive root or read-only volume); using a writable location instead.`));
|
|
145
|
+
}
|
|
146
|
+
console.log(chalk.green(`\n✓ JSON report written to: ${jsonPath}`));
|
|
147
|
+
}
|
|
148
|
+
const { sessions: totalReportSessions, pricedSessions } = payload.meta.totals;
|
|
149
|
+
if (pricedSessions < totalReportSessions) {
|
|
150
|
+
console.log(chalk.dim(` Cost priced for ${pricedSessions}/${totalReportSessions} sessions (native agent logs required for the rest).`));
|
|
151
|
+
}
|
|
152
|
+
if (options.open) {
|
|
153
|
+
if (htmlPath) {
|
|
154
|
+
const { openUrlInBrowser } = await import('../../../utils/browser.js');
|
|
155
|
+
await openUrlInBrowser(htmlPath);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log(chalk.dim(' --open ignored: no HTML produced (use --report-format html or both).'));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
63
162
|
console.log('');
|
|
64
163
|
}
|
|
65
164
|
catch (error) {
|
|
@@ -122,16 +221,14 @@ function parseFilterOptions(options) {
|
|
|
122
221
|
* Parse date string (YYYY-MM-DD) to Date object
|
|
123
222
|
*/
|
|
124
223
|
function parseDate(dateStr) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
return date;
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
224
|
+
// Enforce the documented YYYY-MM-DD shape. Without this, `new Date()` accepts ambiguous
|
|
225
|
+
// inputs (MM/DD/YYYY, prose dates) with format-dependent timezone handling, silently
|
|
226
|
+
// producing a wrong filter window instead of triggering the caller's "invalid date" warning.
|
|
227
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
|
|
133
228
|
return null;
|
|
134
229
|
}
|
|
230
|
+
const date = new Date(dateStr);
|
|
231
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
135
232
|
}
|
|
136
233
|
/**
|
|
137
234
|
* Parse duration string (e.g., "7d", "24h") to milliseconds
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/index.ts"],"names":[],"mappings":"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"}
|