@codemieai/code 0.3.2 → 0.4.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 (112) hide show
  1. package/README.md +2 -0
  2. package/dist/agents/core/session/BaseSessionAdapter.d.ts +5 -2
  3. package/dist/agents/core/session/BaseSessionAdapter.d.ts.map +1 -1
  4. package/dist/agents/core/types.d.ts +11 -0
  5. package/dist/agents/core/types.d.ts.map +1 -1
  6. package/dist/agents/plugins/claude/claude.plugin.js +3 -3
  7. package/dist/agents/plugins/claude/claude.session.d.ts +13 -0
  8. package/dist/agents/plugins/claude/claude.session.d.ts.map +1 -1
  9. package/dist/agents/plugins/claude/claude.session.js +122 -42
  10. package/dist/agents/plugins/claude/claude.session.js.map +1 -1
  11. package/dist/agents/plugins/claude/plugin/skills/codemie-analytics/scripts/analytics-cli.js +12 -8
  12. package/dist/agents/plugins/claude/plugin/statusline.mjs +11 -3
  13. package/dist/agents/plugins/claude/session/claude-file-operation.d.ts +38 -0
  14. package/dist/agents/plugins/claude/session/claude-file-operation.d.ts.map +1 -0
  15. package/dist/agents/plugins/claude/session/claude-file-operation.js +67 -0
  16. package/dist/agents/plugins/claude/session/claude-file-operation.js.map +1 -0
  17. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts +0 -4
  18. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts.map +1 -1
  19. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js +7 -56
  20. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js.map +1 -1
  21. package/dist/bin/proxy-daemon.js +54 -5
  22. package/dist/bin/proxy-daemon.js.map +1 -1
  23. package/dist/cli/commands/analytics/aggregator.d.ts +1 -1
  24. package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -1
  25. package/dist/cli/commands/analytics/aggregator.js +84 -23
  26. package/dist/cli/commands/analytics/aggregator.js.map +1 -1
  27. package/dist/cli/commands/analytics/cost/cost-calculator.d.ts +10 -0
  28. package/dist/cli/commands/analytics/cost/cost-calculator.d.ts.map +1 -0
  29. package/dist/cli/commands/analytics/cost/cost-calculator.js +24 -0
  30. package/dist/cli/commands/analytics/cost/cost-calculator.js.map +1 -0
  31. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts +24 -0
  32. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -0
  33. package/dist/cli/commands/analytics/cost/cost-enricher.js +152 -0
  34. package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -0
  35. package/dist/cli/commands/analytics/cost/pricing.d.ts +23 -0
  36. package/dist/cli/commands/analytics/cost/pricing.d.ts.map +1 -0
  37. package/dist/cli/commands/analytics/cost/pricing.js +82 -0
  38. package/dist/cli/commands/analytics/cost/pricing.js.map +1 -0
  39. package/dist/cli/commands/analytics/cost/pricing.json +975 -0
  40. package/dist/cli/commands/analytics/cost/types.d.ts +51 -0
  41. package/dist/cli/commands/analytics/cost/types.d.ts.map +1 -0
  42. package/dist/cli/commands/analytics/cost/types.js +8 -0
  43. package/dist/cli/commands/analytics/cost/types.js.map +1 -0
  44. package/dist/cli/commands/analytics/cost/usage-readers.d.ts +40 -0
  45. package/dist/cli/commands/analytics/cost/usage-readers.d.ts.map +1 -0
  46. package/dist/cli/commands/analytics/cost/usage-readers.js +165 -0
  47. package/dist/cli/commands/analytics/cost/usage-readers.js.map +1 -0
  48. package/dist/cli/commands/analytics/data-loader.d.ts +11 -0
  49. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
  50. package/dist/cli/commands/analytics/data-loader.js +7 -0
  51. package/dist/cli/commands/analytics/data-loader.js.map +1 -1
  52. package/dist/cli/commands/analytics/index.d.ts.map +1 -1
  53. package/dist/cli/commands/analytics/index.js +92 -10
  54. package/dist/cli/commands/analytics/index.js.map +1 -1
  55. package/dist/cli/commands/analytics/native-loader.d.ts +48 -0
  56. package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -0
  57. package/dist/cli/commands/analytics/native-loader.js +220 -0
  58. package/dist/cli/commands/analytics/native-loader.js.map +1 -0
  59. package/dist/cli/commands/analytics/report/assets/chart.umd.js +14 -0
  60. package/dist/cli/commands/analytics/report/assets/codemie-bundle.css +1 -0
  61. package/dist/cli/commands/analytics/report/client/app.js +676 -0
  62. package/dist/cli/commands/analytics/report/payload-builder.d.ts +15 -0
  63. package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -0
  64. package/dist/cli/commands/analytics/report/payload-builder.js +107 -0
  65. package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -0
  66. package/dist/cli/commands/analytics/report/report-generator.d.ts +26 -0
  67. package/dist/cli/commands/analytics/report/report-generator.d.ts.map +1 -0
  68. package/dist/cli/commands/analytics/report/report-generator.js +58 -0
  69. package/dist/cli/commands/analytics/report/report-generator.js.map +1 -0
  70. package/dist/cli/commands/analytics/report/template.html +217 -0
  71. package/dist/cli/commands/analytics/report/types.d.ts +55 -0
  72. package/dist/cli/commands/analytics/report/types.d.ts.map +1 -0
  73. package/dist/cli/commands/analytics/report/types.js +6 -0
  74. package/dist/cli/commands/analytics/report/types.js.map +1 -0
  75. package/dist/cli/commands/analytics/types.d.ts +13 -0
  76. package/dist/cli/commands/analytics/types.d.ts.map +1 -1
  77. package/dist/cli/commands/proxy/daemon-manager.d.ts +5 -0
  78. package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
  79. package/dist/cli/commands/proxy/daemon-manager.js +25 -9
  80. package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
  81. package/dist/cli/commands/proxy/health-check.d.ts +16 -0
  82. package/dist/cli/commands/proxy/health-check.d.ts.map +1 -0
  83. package/dist/cli/commands/proxy/health-check.js +81 -0
  84. package/dist/cli/commands/proxy/health-check.js.map +1 -0
  85. package/dist/cli/commands/proxy/index.d.ts.map +1 -1
  86. package/dist/cli/commands/proxy/index.js +54 -4
  87. package/dist/cli/commands/proxy/index.js.map +1 -1
  88. package/dist/cli/commands/proxy/watcher.d.ts +31 -0
  89. package/dist/cli/commands/proxy/watcher.d.ts.map +1 -0
  90. package/dist/cli/commands/proxy/watcher.js +97 -0
  91. package/dist/cli/commands/proxy/watcher.js.map +1 -0
  92. package/dist/cli/commands/skills/setup/sync-plugin.d.ts +15 -0
  93. package/dist/cli/commands/skills/setup/sync-plugin.d.ts.map +1 -0
  94. package/dist/cli/commands/skills/setup/sync-plugin.js +63 -0
  95. package/dist/cli/commands/skills/setup/sync-plugin.js.map +1 -0
  96. package/dist/providers/plugins/sso/proxy/proxy-errors.js +2 -2
  97. package/dist/providers/plugins/sso/proxy/proxy-errors.js.map +1 -1
  98. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts +6 -0
  99. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts.map +1 -1
  100. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts +1 -0
  101. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  102. package/dist/providers/plugins/sso/proxy/sso.proxy.js +39 -3
  103. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  104. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js +14 -4
  105. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js.map +1 -1
  106. package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.d.ts.map +1 -1
  107. package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.js +5 -0
  108. package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.js.map +1 -1
  109. package/dist/providers/plugins/sso/session/processors/metrics/metrics-types.d.ts +2 -0
  110. package/dist/providers/plugins/sso/session/processors/metrics/metrics-types.d.ts.map +1 -1
  111. package/package.json +1 -1
  112. 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":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAK5D,SAAS,UAAU,CAAC,GAAa,EAAE,KAAa,EAAE,KAAiB;IACjE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,MAAqB;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/D,CAAC;AAwBD;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAqB;IAC7D,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAuB,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,SAAS,CAAC;QAC9C,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC5B,SAAS,CAAC,mDAAmD;QAC/D,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC;QAC5B,MAAM,GAAG,GAAG,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC;YACX,GAAG;YACH,KAAK;YACL,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE;SACtG,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,MAAqB;IACvC,MAAM,GAAG,GAAa,IAAI,GAAG,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAgBD;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,MAAqB;IAChD,MAAM,GAAG,GAAa,IAAI,GAAG,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAsB,EAAE,CAAC;QAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,KAAK,GAAG,IAAI,CAAC;YACb,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;YACnC,MAAM,SAAS,GAAG,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,CAAC,CAAC,wBAAwB,IAAI,CAAC,CAAC;YACtD,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE;gBACrB,KAAK;gBACL,MAAM;gBACN,SAAS;gBACT,aAAa;gBACb,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B,CAAC;AAED,kFAAkF;AAClF,SAAS,iBAAiB,CAAC,MAAqB;IAC9C,OAAO,mBAAmB,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAYD,SAAS,UAAU,CAAC,MAAqB;IACvC,MAAM,GAAG,GAAa,IAAI,GAAG,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAuB,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAChC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE;YACrB,KAAK;YACL,MAAM;YACN,SAAS;YACT,aAAa,EAAE,CAAC;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK,GAAG,MAAM,GAAG,SAAS;SAC7C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,MAAqB;IACvE,QAAQ,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY;YACf,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,gBAAgB,EAAE,6EAA6E;YAClG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B;YACE,OAAO,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,MAAqB,EAAE,IAAiB;IAC5F,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,gBAAgB,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,CAAC,2BAA2B;QAC5C,CAAC;QACD,MAAM,GAAG,GAAa,IAAI,GAAG,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpB,SAAS,CAAC,4DAA4D;gBACxE,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;YACD,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC,2CAA2C;AAC/D,CAAC"}
@@ -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;CACvB;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;;OAEG;IACH,OAAO,CAAC,aAAa;IA2CrB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;CA6C9B"}
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":"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"}
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":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,sBAAsB,IAAI,OAAO,CAsEhD"}
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,CAwKhD"}
@@ -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 data
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,54 @@ 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 } = 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
+ if (reportFormat === 'both') {
113
+ // Derive a shared base (strip a trailing .html/.json from --report-output, if any)
114
+ // so the two artifacts are siblings and never collide, whatever extension was passed.
115
+ const base = options.reportOutput?.replace(/\.(html|json)$/i, '');
116
+ htmlPath = base ? `${base}.html` : getDefaultReportPath(cwd);
117
+ jsonPath = base ? `${base}.json` : getDefaultReportJsonPath(cwd);
118
+ }
119
+ else if (reportFormat === 'html') {
120
+ htmlPath = options.reportOutput || getDefaultReportPath(cwd);
121
+ }
122
+ else {
123
+ jsonPath = options.reportOutput || getDefaultReportJsonPath(cwd);
124
+ }
125
+ if (htmlPath) {
126
+ generateReport(payload, htmlPath);
127
+ console.log(chalk.green(`\n✓ HTML report written to: ${htmlPath}`));
128
+ }
129
+ if (jsonPath) {
130
+ generateReportJson(payload, jsonPath);
131
+ console.log(chalk.green(`\n✓ JSON report written to: ${jsonPath}`));
132
+ }
133
+ const { sessions: totalReportSessions, pricedSessions } = payload.meta.totals;
134
+ if (pricedSessions < totalReportSessions) {
135
+ console.log(chalk.dim(` Cost priced for ${pricedSessions}/${totalReportSessions} sessions (native agent logs required for the rest).`));
136
+ }
137
+ if (options.open) {
138
+ if (htmlPath) {
139
+ const { openUrlInBrowser } = await import('../../../utils/browser.js');
140
+ await openUrlInBrowser(htmlPath);
141
+ }
142
+ else {
143
+ console.log(chalk.dim(' --open ignored: no HTML produced (use --report-format html or both).'));
144
+ }
145
+ }
146
+ }
63
147
  console.log('');
64
148
  }
65
149
  catch (error) {
@@ -122,16 +206,14 @@ function parseFilterOptions(options) {
122
206
  * Parse date string (YYYY-MM-DD) to Date object
123
207
  */
124
208
  function parseDate(dateStr) {
125
- try {
126
- const date = new Date(dateStr);
127
- if (isNaN(date.getTime())) {
128
- return null;
129
- }
130
- return date;
131
- }
132
- catch {
209
+ // Enforce the documented YYYY-MM-DD shape. Without this, `new Date()` accepts ambiguous
210
+ // inputs (MM/DD/YYYY, prose dates) with format-dependent timezone handling, silently
211
+ // producing a wrong filter window instead of triggering the caller's "invalid date" warning.
212
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
133
213
  return null;
134
214
  }
215
+ const date = new Date(dateStr);
216
+ return Number.isNaN(date.getTime()) ? null : date;
135
217
  }
136
218
  /**
137
219
  * 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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Native session discovery for analytics.
3
+ *
4
+ * The metrics loader only sees sessions CodeMie tracked into ~/.codemie/sessions/.
5
+ * Plain `claude` usage (the Anthropic subscription, not `codemie-claude`) is never
6
+ * tracked, so it is invisible to the report. This module discovers those native agent
7
+ * logs directly (via SessionAdapter.discoverSessions) and synthesizes the same
8
+ * {@link RawSessionData} shape the loader produces, so the whole downstream pipeline
9
+ * (aggregator → formatter/report → cost) sees them too.
10
+ *
11
+ * Native logs already correlated to a tracked CodeMie session are skipped (deduped by
12
+ * real path) so they are not double-counted.
13
+ */
14
+ import type { RawSessionData } from './data-loader.js';
15
+ import type { AnalyticsFilter } from './types.js';
16
+ import type { ParsedSession } from '../../../agents/core/session/BaseSessionAdapter.js';
17
+ import type { SessionDescriptor } from '../../../agents/core/session/discovery-types.js';
18
+ /** A discovered native session paired with its agent. */
19
+ export interface DiscoveredNative {
20
+ agentName: string;
21
+ descriptor: SessionDescriptor;
22
+ }
23
+ /** Injected boundary so synthesis/dedup logic is unit-testable without fs or the registry. */
24
+ export interface NativeLoaderDeps {
25
+ /** Real paths of native logs already tracked by CodeMie (skip these to avoid double counting). */
26
+ trackedLogPaths(): Set<string>;
27
+ /** Discover native sessions for discovery-capable agents within the age window. */
28
+ discover(maxAgeDays: number): Promise<DiscoveredNative[]>;
29
+ /** Parse a native log into a unified session. */
30
+ parse(agentName: string, filePath: string, sessionId: string): Promise<ParsedSession | null>;
31
+ /** Resolve a path to its real (symlink-free) form for dedup comparison. */
32
+ realPath(p: string): string;
33
+ }
34
+ export declare const realNativeDeps: NativeLoaderDeps;
35
+ /**
36
+ * Synthesize a {@link RawSessionData} from a parsed native session. Turns map to assistant
37
+ * messages (the aggregator derives totalTurns from deltas.length), and all per-session metrics
38
+ * (tools / file ops / models) are carried on a single delta — the aggregator sums across deltas,
39
+ * so one metrics-bearing delta plus empty placeholders is equivalent to per-turn deltas.
40
+ */
41
+ export declare function synthesizeRawSession(agentName: string, descriptor: SessionDescriptor, parsed: ParsedSession): RawSessionData;
42
+ /**
43
+ * Discover native (untracked) sessions and return them as RawSessionData, ready to merge
44
+ * with the tracked sessions from {@link MetricsDataLoader}. Sessions whose native log is
45
+ * already tracked by CodeMie are skipped (deduped by real path).
46
+ */
47
+ export declare function loadNativeSessions(filter?: AnalyticsFilter, deps?: NativeLoaderDeps): Promise<RawSessionData[]>;
48
+ //# sourceMappingURL=native-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-loader.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/native-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AAQzF,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,iBAAiB,CAAC;CAC/B;AAED,8FAA8F;AAC9F,MAAM,WAAW,gBAAgB;IAC/B,kGAAkG;IAClG,eAAe,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC1D,iDAAiD;IACjD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC7F,2EAA2E;IAC3E,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAyCD,eAAO,MAAM,cAAc,EAAE,gBAiC5B,CAAC;AAyCF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,iBAAiB,EAC7B,MAAM,EAAE,aAAa,GACpB,cAAc,CAgEhB;AAWD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,CAAC,EAAE,eAAe,EACxB,IAAI,GAAE,gBAAiC,GACtC,OAAO,CAAC,cAAc,EAAE,CAAC,CAgB3B"}