@codemieai/code 0.3.1 → 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 (120) 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/plugins/index.d.ts +0 -1
  97. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  98. package/dist/providers/plugins/sso/proxy/plugins/index.js +0 -3
  99. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  100. package/dist/providers/plugins/sso/proxy/proxy-errors.js +2 -2
  101. package/dist/providers/plugins/sso/proxy/proxy-errors.js.map +1 -1
  102. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts +6 -0
  103. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts.map +1 -1
  104. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts +1 -10
  105. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  106. package/dist/providers/plugins/sso/proxy/sso.proxy.js +39 -76
  107. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  108. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js +14 -4
  109. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js.map +1 -1
  110. package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.d.ts.map +1 -1
  111. package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.js +5 -0
  112. package/dist/providers/plugins/sso/session/processors/metrics/metrics-post-processor.js.map +1 -1
  113. package/dist/providers/plugins/sso/session/processors/metrics/metrics-types.d.ts +2 -0
  114. package/dist/providers/plugins/sso/session/processors/metrics/metrics-types.d.ts.map +1 -1
  115. package/package.json +2 -3
  116. package/scripts/copy-plugins.js +39 -0
  117. package/dist/providers/plugins/sso/proxy/plugins/session-expiry-handler.plugin.d.ts +0 -9
  118. package/dist/providers/plugins/sso/proxy/plugins/session-expiry-handler.plugin.d.ts.map +0 -1
  119. package/dist/providers/plugins/sso/proxy/plugins/session-expiry-handler.plugin.js +0 -23
  120. package/dist/providers/plugins/sso/proxy/plugins/session-expiry-handler.plugin.js.map +0 -1
@@ -0,0 +1,220 @@
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 { realpathSync, readdirSync, readFileSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { AgentRegistry } from '../../../agents/registry.js';
17
+ import { getCodemiePath } from '../../../utils/paths.js';
18
+ import { logger } from '../../../utils/logger.js';
19
+ /** Agents whose native logs we discover + synthesize. (claude is the gap users hit.) */
20
+ const NATIVE_AGENTS = ['claude'];
21
+ function safeRealPath(p) {
22
+ try {
23
+ return realpathSync(p);
24
+ }
25
+ catch {
26
+ return p;
27
+ }
28
+ }
29
+ /** Build the set of native log paths already tracked by CodeMie (from session correlations). */
30
+ function readTrackedLogPaths() {
31
+ const out = new Set();
32
+ let dir;
33
+ try {
34
+ dir = getCodemiePath('sessions');
35
+ }
36
+ catch {
37
+ return out;
38
+ }
39
+ let files;
40
+ try {
41
+ files = readdirSync(dir).filter((f) => f.endsWith('.json') && !f.includes('_metrics'));
42
+ }
43
+ catch {
44
+ return out;
45
+ }
46
+ for (const f of files) {
47
+ try {
48
+ const meta = JSON.parse(readFileSync(join(dir, f), 'utf-8'));
49
+ const asf = meta.correlation?.agentSessionFile;
50
+ if (asf) {
51
+ out.add(safeRealPath(asf));
52
+ }
53
+ }
54
+ catch {
55
+ // skip unreadable / malformed metadata
56
+ }
57
+ }
58
+ return out;
59
+ }
60
+ export const realNativeDeps = {
61
+ trackedLogPaths: readTrackedLogPaths,
62
+ async discover(maxAgeDays) {
63
+ const found = [];
64
+ for (const agentName of NATIVE_AGENTS) {
65
+ const adapter = AgentRegistry.getAgent(agentName)?.getSessionAdapter?.();
66
+ if (!adapter?.discoverSessions) {
67
+ continue;
68
+ }
69
+ try {
70
+ const descriptors = await adapter.discoverSessions({ maxAgeDays });
71
+ for (const descriptor of descriptors) {
72
+ found.push({ agentName, descriptor });
73
+ }
74
+ }
75
+ catch (e) {
76
+ logger.debug(`[native] discovery failed for ${agentName}:`, e);
77
+ }
78
+ }
79
+ return found;
80
+ },
81
+ async parse(agentName, filePath, sessionId) {
82
+ const adapter = AgentRegistry.getAgent(agentName)?.getSessionAdapter?.();
83
+ if (!adapter) {
84
+ return null;
85
+ }
86
+ try {
87
+ return await adapter.parseSessionFile(filePath, sessionId);
88
+ }
89
+ catch (e) {
90
+ logger.debug(`[native] parse failed for ${sessionId}:`, e);
91
+ return null;
92
+ }
93
+ },
94
+ realPath: safeRealPath,
95
+ };
96
+ function toMs(ts) {
97
+ if (ts == null) {
98
+ return null;
99
+ }
100
+ if (typeof ts === 'number') {
101
+ return ts;
102
+ }
103
+ const n = Date.parse(ts);
104
+ return Number.isNaN(n) ? null : n;
105
+ }
106
+ function isAssistant(m) {
107
+ return m.type === 'assistant' || m.message?.role === 'assistant';
108
+ }
109
+ /** Most frequent value in a list (ties → first seen), or undefined if empty. */
110
+ function modal(values) {
111
+ const counts = new Map();
112
+ let best;
113
+ let bestN = 0;
114
+ for (const v of values) {
115
+ const n = (counts.get(v) ?? 0) + 1;
116
+ counts.set(v, n);
117
+ if (n > bestN) {
118
+ bestN = n;
119
+ best = v;
120
+ }
121
+ }
122
+ return best;
123
+ }
124
+ /**
125
+ * Synthesize a {@link RawSessionData} from a parsed native session. Turns map to assistant
126
+ * messages (the aggregator derives totalTurns from deltas.length), and all per-session metrics
127
+ * (tools / file ops / models) are carried on a single delta — the aggregator sums across deltas,
128
+ * so one metrics-bearing delta plus empty placeholders is equivalent to per-turn deltas.
129
+ */
130
+ export function synthesizeRawSession(agentName, descriptor, parsed) {
131
+ const messages = (parsed.messages ?? []);
132
+ const timestamps = messages.map((m) => toMs(m.timestamp)).filter((n) => n != null);
133
+ const startTime = timestamps.length ? Math.min(...timestamps) : descriptor.createdAt;
134
+ const endTime = timestamps.length ? Math.max(...timestamps) : descriptor.updatedAt ?? descriptor.createdAt;
135
+ const cwd = messages.find((m) => m.cwd)?.cwd ?? descriptor.projectPath ?? 'Unknown';
136
+ const branch = modal(messages.map((m) => m.gitBranch).filter((b) => !!b));
137
+ const assistantMsgs = messages.filter(isAssistant);
138
+ const turns = Math.max(assistantMsgs.length, 1);
139
+ const models = assistantMsgs.map((m) => m.message?.model).filter((m) => !!m);
140
+ const metricsDelta = {
141
+ recordId: `${descriptor.sessionId}-native`,
142
+ sessionId: descriptor.sessionId,
143
+ agentSessionId: descriptor.sessionId,
144
+ timestamp: startTime,
145
+ gitBranch: branch,
146
+ tools: parsed.metrics?.tools ?? {},
147
+ toolStatus: parsed.metrics?.toolStatus,
148
+ fileOperations: parsed.metrics?.fileOperations,
149
+ models,
150
+ syncStatus: 'synced',
151
+ syncAttempts: 0,
152
+ };
153
+ // Pad to `turns` deltas so the aggregator's totalTurns (= deltas.length) is correct.
154
+ const deltas = [metricsDelta];
155
+ for (let i = 1; i < turns; i++) {
156
+ deltas.push({
157
+ recordId: `${descriptor.sessionId}-native-${i}`,
158
+ sessionId: descriptor.sessionId,
159
+ agentSessionId: descriptor.sessionId,
160
+ timestamp: startTime,
161
+ gitBranch: branch,
162
+ tools: {},
163
+ syncStatus: 'synced',
164
+ syncAttempts: 0,
165
+ });
166
+ }
167
+ return {
168
+ sessionId: descriptor.sessionId,
169
+ agentSessionFile: descriptor.filePath, // lets the cost enricher price native (untracked) sessions
170
+ startEvent: {
171
+ recordId: descriptor.sessionId,
172
+ type: 'session_start',
173
+ timestamp: startTime,
174
+ codeMieSessionId: descriptor.sessionId,
175
+ agentName,
176
+ syncStatus: 'synced',
177
+ data: { provider: 'native', workingDirectory: cwd, startTime },
178
+ },
179
+ endEvent: {
180
+ recordId: `${descriptor.sessionId}-end`,
181
+ type: 'session_end',
182
+ timestamp: endTime,
183
+ codeMieSessionId: descriptor.sessionId,
184
+ agentName,
185
+ syncStatus: 'synced',
186
+ data: { endTime, duration: Math.max(0, endTime - startTime), totalTurns: turns },
187
+ },
188
+ deltas,
189
+ };
190
+ }
191
+ /** Number of days from a filter's fromDate to now (for the discovery window), or a wide default. */
192
+ function windowDays(filter) {
193
+ if (filter?.fromDate) {
194
+ const days = Math.ceil((Date.now() - filter.fromDate.getTime()) / 86_400_000);
195
+ return Math.max(days + 1, 1);
196
+ }
197
+ return 3650; // no lower bound requested → effectively "all"
198
+ }
199
+ /**
200
+ * Discover native (untracked) sessions and return them as RawSessionData, ready to merge
201
+ * with the tracked sessions from {@link MetricsDataLoader}. Sessions whose native log is
202
+ * already tracked by CodeMie are skipped (deduped by real path).
203
+ */
204
+ export async function loadNativeSessions(filter, deps = realNativeDeps) {
205
+ const tracked = deps.trackedLogPaths();
206
+ const discovered = await deps.discover(windowDays(filter));
207
+ const out = [];
208
+ for (const { agentName, descriptor } of discovered) {
209
+ if (tracked.has(deps.realPath(descriptor.filePath))) {
210
+ continue; // already tracked by CodeMie — avoid double counting
211
+ }
212
+ const parsed = await deps.parse(agentName, descriptor.filePath, descriptor.sessionId);
213
+ if (!parsed) {
214
+ continue;
215
+ }
216
+ out.push(synthesizeRawSession(agentName, descriptor, parsed));
217
+ }
218
+ return out;
219
+ }
220
+ //# sourceMappingURL=native-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-loader.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/native-loader.ts"],"names":[],"mappings":"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"}