@codemieai/code 0.15.3 → 0.15.5

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 (208) hide show
  1. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  2. package/dist/agents/core/AgentCLI.js +9 -0
  3. package/dist/agents/core/AgentCLI.js.map +1 -1
  4. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  5. package/dist/agents/core/BaseAgentAdapter.js +34 -9
  6. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  7. package/dist/agents/plugins/claude/claude.models.d.ts +58 -0
  8. package/dist/agents/plugins/claude/claude.models.d.ts.map +1 -1
  9. package/dist/agents/plugins/claude/claude.models.js +196 -10
  10. package/dist/agents/plugins/claude/claude.models.js.map +1 -1
  11. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  12. package/dist/agents/plugins/claude/claude.plugin.js +147 -45
  13. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  14. package/dist/agents/plugins/claude/plugin/statusline.bundle.mjs +729 -0
  15. package/dist/agents/plugins/claude/statusline-installer.d.ts +1 -1
  16. package/dist/agents/plugins/claude/statusline-installer.d.ts.map +1 -1
  17. package/dist/agents/plugins/claude/statusline-installer.js +41 -3
  18. package/dist/agents/plugins/claude/statusline-installer.js.map +1 -1
  19. package/dist/agents/plugins/codex/codex-models.d.ts.map +1 -1
  20. package/dist/agents/plugins/codex/codex-models.js +109 -8
  21. package/dist/agents/plugins/codex/codex-models.js.map +1 -1
  22. package/dist/agents/plugins/codex/codex.correlation.d.ts +39 -0
  23. package/dist/agents/plugins/codex/codex.correlation.d.ts.map +1 -0
  24. package/dist/agents/plugins/codex/codex.correlation.js +150 -0
  25. package/dist/agents/plugins/codex/codex.correlation.js.map +1 -0
  26. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  27. package/dist/agents/plugins/codex/codex.plugin.js +8 -40
  28. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  29. package/dist/agents/plugins/kimi/kimi.env-model.d.ts +27 -0
  30. package/dist/agents/plugins/kimi/kimi.env-model.d.ts.map +1 -0
  31. package/dist/agents/plugins/kimi/kimi.env-model.js +52 -0
  32. package/dist/agents/plugins/kimi/kimi.env-model.js.map +1 -0
  33. package/dist/agents/plugins/kimi/kimi.session.d.ts +6 -0
  34. package/dist/agents/plugins/kimi/kimi.session.d.ts.map +1 -1
  35. package/dist/agents/plugins/kimi/kimi.session.js +24 -2
  36. package/dist/agents/plugins/kimi/kimi.session.js.map +1 -1
  37. package/dist/agents/plugins/opencode/opencode-dynamic-models.js +1 -1
  38. package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
  39. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts +19 -2
  40. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -1
  41. package/dist/cli/commands/analytics/cost/cost-enricher.js +171 -14
  42. package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
  43. package/dist/cli/commands/analytics/cost/local-models.d.ts +15 -0
  44. package/dist/cli/commands/analytics/cost/local-models.d.ts.map +1 -0
  45. package/dist/cli/commands/analytics/cost/local-models.js +21 -0
  46. package/dist/cli/commands/analytics/cost/local-models.js.map +1 -0
  47. package/dist/cli/commands/analytics/cost/types.d.ts +60 -0
  48. package/dist/cli/commands/analytics/cost/types.d.ts.map +1 -1
  49. package/dist/cli/commands/analytics/cost/types.js.map +1 -1
  50. package/dist/cli/commands/analytics/cost/usage-readers.d.ts +25 -2
  51. package/dist/cli/commands/analytics/cost/usage-readers.d.ts.map +1 -1
  52. package/dist/cli/commands/analytics/cost/usage-readers.js +61 -3
  53. package/dist/cli/commands/analytics/cost/usage-readers.js.map +1 -1
  54. package/dist/cli/commands/analytics/formatter.d.ts +11 -0
  55. package/dist/cli/commands/analytics/formatter.d.ts.map +1 -1
  56. package/dist/cli/commands/analytics/formatter.js +28 -0
  57. package/dist/cli/commands/analytics/formatter.js.map +1 -1
  58. package/dist/cli/commands/analytics/index.d.ts.map +1 -1
  59. package/dist/cli/commands/analytics/index.js +113 -72
  60. package/dist/cli/commands/analytics/index.js.map +1 -1
  61. package/dist/cli/commands/analytics/otel-loader.d.ts.map +1 -1
  62. package/dist/cli/commands/analytics/otel-loader.js +60 -14
  63. package/dist/cli/commands/analytics/otel-loader.js.map +1 -1
  64. package/dist/cli/commands/analytics/otel-pricing.d.ts +38 -0
  65. package/dist/cli/commands/analytics/otel-pricing.d.ts.map +1 -0
  66. package/dist/cli/commands/analytics/otel-pricing.js +33 -0
  67. package/dist/cli/commands/analytics/otel-pricing.js.map +1 -0
  68. package/dist/cli/commands/analytics/report/client/app.js +279 -18
  69. package/dist/cli/commands/analytics/report/output-target.d.ts +22 -0
  70. package/dist/cli/commands/analytics/report/output-target.d.ts.map +1 -0
  71. package/dist/cli/commands/analytics/report/output-target.js +56 -0
  72. package/dist/cli/commands/analytics/report/output-target.js.map +1 -0
  73. package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
  74. package/dist/cli/commands/analytics/report/payload-builder.js +6 -0
  75. package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
  76. package/dist/cli/commands/analytics/report/report-generator.d.ts +1 -1
  77. package/dist/cli/commands/analytics/report/report-generator.js +1 -1
  78. package/dist/cli/commands/analytics/report/session-report.d.ts +1 -3
  79. package/dist/cli/commands/analytics/report/session-report.d.ts.map +1 -1
  80. package/dist/cli/commands/analytics/report/session-report.js +1 -3
  81. package/dist/cli/commands/analytics/report/session-report.js.map +1 -1
  82. package/dist/cli/commands/analytics/report/template.html +6 -6
  83. package/dist/cli/commands/analytics/report/types.d.ts +17 -1
  84. package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
  85. package/dist/cli/commands/analytics/sources/sessions-source.d.ts.map +1 -1
  86. package/dist/cli/commands/analytics/sources/sessions-source.js +9 -11
  87. package/dist/cli/commands/analytics/sources/sessions-source.js.map +1 -1
  88. package/dist/cli/commands/analytics/sources/types.d.ts +0 -2
  89. package/dist/cli/commands/analytics/sources/types.d.ts.map +1 -1
  90. package/dist/cli/commands/analytics/types.d.ts +13 -7
  91. package/dist/cli/commands/analytics/types.d.ts.map +1 -1
  92. package/dist/cli/commands/doctor/checks/NpmPrefixOverrideCheck.d.ts +9 -0
  93. package/dist/cli/commands/doctor/checks/NpmPrefixOverrideCheck.d.ts.map +1 -0
  94. package/dist/cli/commands/doctor/checks/NpmPrefixOverrideCheck.js +42 -0
  95. package/dist/cli/commands/doctor/checks/NpmPrefixOverrideCheck.js.map +1 -0
  96. package/dist/cli/commands/doctor/checks/index.d.ts +1 -0
  97. package/dist/cli/commands/doctor/checks/index.d.ts.map +1 -1
  98. package/dist/cli/commands/doctor/checks/index.js +1 -0
  99. package/dist/cli/commands/doctor/checks/index.js.map +1 -1
  100. package/dist/cli/commands/doctor/index.d.ts.map +1 -1
  101. package/dist/cli/commands/doctor/index.js +2 -1
  102. package/dist/cli/commands/doctor/index.js.map +1 -1
  103. package/dist/cli/commands/models.d.ts.map +1 -1
  104. package/dist/cli/commands/models.js +16 -3
  105. package/dist/cli/commands/models.js.map +1 -1
  106. package/dist/cli/commands/proxy/connect-orchestrator.js +1 -1
  107. package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -1
  108. package/dist/cli/commands/proxy/connectors/tenant-catalog.d.ts +16 -4
  109. package/dist/cli/commands/proxy/connectors/tenant-catalog.d.ts.map +1 -1
  110. package/dist/cli/commands/proxy/connectors/tenant-catalog.js +42 -14
  111. package/dist/cli/commands/proxy/connectors/tenant-catalog.js.map +1 -1
  112. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts +18 -0
  113. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts.map +1 -1
  114. package/dist/cli/commands/proxy/connectors/vscode-models.js +58 -0
  115. package/dist/cli/commands/proxy/connectors/vscode-models.js.map +1 -1
  116. package/dist/cli/commands/proxy/connectors/vscode.d.ts +2 -2
  117. package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -1
  118. package/dist/cli/commands/proxy/connectors/vscode.js +27 -38
  119. package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -1
  120. package/dist/cli/commands/update.d.ts.map +1 -1
  121. package/dist/cli/commands/update.js +4 -3
  122. package/dist/cli/commands/update.js.map +1 -1
  123. package/dist/frameworks/plugins/codegraph.plugin.js +2 -2
  124. package/dist/frameworks/plugins/codegraph.plugin.js.map +1 -1
  125. package/dist/providers/core/codemie-auth-helpers.d.ts.map +1 -1
  126. package/dist/providers/core/codemie-auth-helpers.js +6 -1
  127. package/dist/providers/core/codemie-auth-helpers.js.map +1 -1
  128. package/dist/providers/core/default-agent-hooks.d.ts.map +1 -1
  129. package/dist/providers/core/default-agent-hooks.js +9 -0
  130. package/dist/providers/core/default-agent-hooks.js.map +1 -1
  131. package/dist/providers/plugins/bedrock/bedrock.template.d.ts.map +1 -1
  132. package/dist/providers/plugins/bedrock/bedrock.template.js +5 -31
  133. package/dist/providers/plugins/bedrock/bedrock.template.js.map +1 -1
  134. package/dist/providers/plugins/sso/proxy/plugins/background-request-normalizer.plugin.d.ts +44 -0
  135. package/dist/providers/plugins/sso/proxy/plugins/background-request-normalizer.plugin.d.ts.map +1 -0
  136. package/dist/providers/plugins/sso/proxy/plugins/background-request-normalizer.plugin.js +106 -0
  137. package/dist/providers/plugins/sso/proxy/plugins/background-request-normalizer.plugin.js.map +1 -0
  138. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +3 -1
  139. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  140. package/dist/providers/plugins/sso/proxy/plugins/index.js +5 -1
  141. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  142. package/dist/providers/plugins/sso/proxy/plugins/routing-header-injector.plugin.d.ts +67 -0
  143. package/dist/providers/plugins/sso/proxy/plugins/routing-header-injector.plugin.d.ts.map +1 -0
  144. package/dist/providers/plugins/sso/proxy/plugins/routing-header-injector.plugin.js +203 -0
  145. package/dist/providers/plugins/sso/proxy/plugins/routing-header-injector.plugin.js.map +1 -0
  146. package/dist/providers/plugins/sso/sso.http-client.d.ts +95 -0
  147. package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -1
  148. package/dist/providers/plugins/sso/sso.http-client.js +79 -0
  149. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  150. package/dist/providers/plugins/sso/sso.models.d.ts +7 -0
  151. package/dist/providers/plugins/sso/sso.models.d.ts.map +1 -1
  152. package/dist/providers/plugins/sso/sso.models.js +22 -14
  153. package/dist/providers/plugins/sso/sso.models.js.map +1 -1
  154. package/dist/utils/bedrock-pricing.mjs +111 -0
  155. package/dist/utils/cli-bin.d.ts.map +1 -1
  156. package/dist/utils/cli-bin.js +3 -4
  157. package/dist/utils/cli-bin.js.map +1 -1
  158. package/dist/utils/cli-updater.d.ts +1 -0
  159. package/dist/utils/cli-updater.d.ts.map +1 -1
  160. package/dist/utils/cli-updater.js +37 -9
  161. package/dist/utils/cli-updater.js.map +1 -1
  162. package/dist/utils/credential-crypto.d.ts +51 -0
  163. package/dist/utils/credential-crypto.d.ts.map +1 -0
  164. package/dist/utils/credential-crypto.js +96 -0
  165. package/dist/utils/credential-crypto.js.map +1 -0
  166. package/dist/utils/model-normalizer.d.ts +6 -0
  167. package/dist/utils/model-normalizer.d.ts.map +1 -1
  168. package/dist/utils/model-normalizer.js +37 -19
  169. package/dist/utils/model-normalizer.js.map +1 -1
  170. package/dist/utils/npm-prefix.d.ts +48 -0
  171. package/dist/utils/npm-prefix.d.ts.map +1 -0
  172. package/dist/utils/npm-prefix.js +142 -0
  173. package/dist/utils/npm-prefix.js.map +1 -0
  174. package/dist/utils/paths.d.ts +7 -0
  175. package/dist/utils/paths.d.ts.map +1 -1
  176. package/dist/utils/paths.js +10 -0
  177. package/dist/utils/paths.js.map +1 -1
  178. package/dist/utils/platform.d.ts +10 -0
  179. package/dist/utils/platform.d.ts.map +1 -0
  180. package/dist/utils/platform.js +14 -0
  181. package/dist/utils/platform.js.map +1 -0
  182. package/dist/utils/price-resolution.d.ts +42 -0
  183. package/dist/utils/price-resolution.d.ts.map +1 -0
  184. package/dist/utils/price-resolution.js +112 -0
  185. package/dist/utils/price-resolution.js.map +1 -0
  186. package/dist/utils/pricing.d.ts +65 -6
  187. package/dist/utils/pricing.d.ts.map +1 -1
  188. package/dist/utils/pricing.js +91 -117
  189. package/dist/utils/pricing.js.map +1 -1
  190. package/dist/utils/pricing.json +201 -20
  191. package/dist/utils/processes.d.ts.map +1 -1
  192. package/dist/utils/processes.js +6 -3
  193. package/dist/utils/processes.js.map +1 -1
  194. package/dist/utils/routing-headers.mjs +104 -0
  195. package/dist/utils/security.d.ts +0 -32
  196. package/dist/utils/security.d.ts.map +1 -1
  197. package/dist/utils/security.js +20 -102
  198. package/dist/utils/security.js.map +1 -1
  199. package/package.json +4 -2
  200. package/scripts/bundle-statusline.mjs +37 -0
  201. package/scripts/copy-plugins.js +19 -2
  202. package/src/utils/tips.json +9 -9
  203. package/dist/agents/plugins/claude/plugin/__tests__/statusline.test.ts +0 -323
  204. package/dist/agents/plugins/claude/plugin/statusline.mjs +0 -282
  205. package/dist/cli/commands/analytics/exporter.d.ts +0 -20
  206. package/dist/cli/commands/analytics/exporter.d.ts.map +0 -1
  207. package/dist/cli/commands/analytics/exporter.js +0 -91
  208. package/dist/cli/commands/analytics/exporter.js.map +0 -1
@@ -1,282 +0,0 @@
1
- #!/usr/bin/env node
2
- // CodeMie statusline — shows model, project, branch, context, session cost/duration,
3
- // and (when a CodeMie profile is configured) the CLI budget for the authenticated user.
4
- // Deployed to ~/.claude/ by `codemie install statusline` (also triggered by the `--status`
5
- // CLI flag, which calls the same installer). Runs standalone — Node builtins only, no
6
- // project imports, since it executes via `node <path>` after the project process exits.
7
- import crypto from 'crypto';
8
- import { exec } from 'child_process';
9
- import fs from 'fs/promises';
10
- import os from 'os';
11
- import path from 'path';
12
- import { fileURLToPath } from 'url';
13
-
14
- const HOME = process.env.CODEMIE_HOME || path.join(os.homedir(), '.codemie');
15
- const CACHE_FILE = path.join(HOME, 'budget-cache.json');
16
- const CONFIG_FILE = path.join(HOME, 'codemie-cli.config.json');
17
- const CREDS_DIR = path.join(HOME, 'credentials');
18
- const CACHE_TTL_MS = 60_000;
19
- const CACHE_SCHEMA = 2; // bump when the cache.value shape changes, to discard stale pre-upgrade entries
20
-
21
- const ENCRYPTION_KEY = (() => {
22
- const id = os.hostname() + os.platform() + os.arch();
23
- const hex = crypto.createHash('sha256').update(id).digest('hex');
24
- return crypto.createHash('sha256').update(hex).digest();
25
- })();
26
-
27
- function decrypt(text) {
28
- const parts = text.split(':');
29
- if (parts.length === 3) {
30
- const iv = Buffer.from(parts[0], 'hex');
31
- const authTag = Buffer.from(parts[1], 'hex');
32
- const d = crypto.createDecipheriv('aes-256-gcm', ENCRYPTION_KEY, iv);
33
- d.setAuthTag(authTag);
34
- return d.update(parts[2], 'hex', 'utf8') + d.final('utf8');
35
- }
36
- // Legacy CBC format: iv:encrypted (backward compat for existing stored credentials)
37
- const iv = Buffer.from(parts[0], 'hex');
38
- const d = crypto.createDecipheriv('aes-256-cbc', ENCRYPTION_KEY, iv);
39
- return d.update(parts[1], 'hex', 'utf8') + d.final('utf8');
40
- }
41
-
42
- function urlHash(rawUrl) {
43
- const normalized = rawUrl.replace(/\/$/, '').toLowerCase();
44
- return crypto.createHash('sha256').update(normalized).digest('hex');
45
- }
46
-
47
- async function readCredsFile(filePath) {
48
- try {
49
- return JSON.parse(decrypt(await fs.readFile(filePath, 'utf8')));
50
- } catch {
51
- return null;
52
- }
53
- }
54
-
55
- export async function getAuthHeaders(codeMieUrl) {
56
- const hash = urlHash(codeMieUrl);
57
-
58
- const sso = await readCredsFile(path.join(CREDS_DIR, `sso-${hash}.enc`));
59
- if (sso?.cookies) {
60
- return { cookie: Object.entries(sso.cookies).map(([k, v]) => `${k}=${v}`).join(';') };
61
- }
62
-
63
- const jwt = await readCredsFile(path.join(CREDS_DIR, `jwt-sso-${hash}.enc`));
64
- if (jwt?.token) {
65
- return { authorization: `Bearer ${jwt.token}` };
66
- }
67
-
68
- return null;
69
- }
70
-
71
- // --- Pure functions (unit-testable, no filesystem/network access) ---
72
-
73
- export function matchBudgetRow(rows, userEmail) {
74
- if (!Array.isArray(rows) || !userEmail) return null;
75
- const target = `${userEmail.trim().toLowerCase()} (cli)`;
76
- return rows.find(r => r.project_name?.trim().toLowerCase() === target) ?? null;
77
- }
78
-
79
- export function formatBudgetSegment(row) {
80
- if (!row) return null;
81
- const pct = Math.round(row.total ?? 0);
82
- const reset = row.budget_reset_at ? new Date(row.budget_reset_at).toLocaleDateString() : '?';
83
- return {
84
- text: `$${row.current_spending.toFixed(2)} (${pct}%) resets ${reset}`,
85
- pct,
86
- };
87
- }
88
-
89
- export function extractBasicInfo(ctx) {
90
- const cwd = ctx?.workspace?.current_dir ?? ctx?.cwd ?? '';
91
- return {
92
- projectName: cwd ? path.basename(cwd) : '',
93
- cwd,
94
- model: ctx?.model?.display_name ?? '',
95
- ctxPct: ctx?.context_window?.used_percentage ?? null,
96
- tokIn: ctx?.context_window?.total_input_tokens ?? null,
97
- tokOut: ctx?.context_window?.total_output_tokens ?? null,
98
- cost: ctx?.cost?.total_cost_usd ?? null,
99
- durationMs: ctx?.cost?.total_duration_ms ?? null,
100
- };
101
- }
102
-
103
- export function formatDuration(ms) {
104
- if (typeof ms !== 'number' || Number.isNaN(ms) || ms < 0) return null;
105
- const mins = Math.floor(ms / 60000);
106
- const secs = Math.floor((ms % 60000) / 1000);
107
- return `${mins}m ${secs}s`;
108
- }
109
-
110
- export function fmt(n) {
111
- if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;
112
- if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;
113
- return String(n);
114
- }
115
-
116
- const C = {
117
- reset: '\x1b[0m',
118
- purple: '\x1b[38;2;177;185;249m',
119
- green: '\x1b[0;32m',
120
- yellow: '\x1b[0;33m',
121
- red: '\x1b[0;31m',
122
- cyan: '\x1b[0;36m',
123
- blue: '\x1b[0;94m',
124
- gray: '\x1b[0;37m',
125
- };
126
- const c = (color, text) => `${color}${text}${C.reset}`;
127
-
128
- function budgetColor(pct) {
129
- return pct > 85 ? C.red : pct > 30 ? C.yellow : C.green;
130
- }
131
-
132
- export function ctxBar(pct) {
133
- if (typeof pct !== 'number' || Number.isNaN(pct)) return null;
134
- const clamped = Math.max(0, Math.min(100, pct));
135
- const color = clamped >= 90 ? C.red : clamped >= 70 ? C.yellow : C.green;
136
- const filled = Math.floor(clamped / 10);
137
- const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
138
- return `${c(color, bar)} ${pct}%`;
139
- }
140
-
141
- export function buildStatusLine({ projectName, branch, model, ctxPct, tokIn, tokOut, cost, durationMs, budget, budgetError }) {
142
- const parts = [];
143
-
144
- if (projectName) parts.push(c(C.purple, `[${projectName}]`));
145
- if (budget) parts.push(c(budgetColor(budget.pct), budget.text));
146
- else if (budgetError) parts.push(c(C.yellow, `⚠ ${budgetError}`));
147
- if (branch) parts.push(c(C.blue, `(${branch})`));
148
- if (model) parts.push(c(C.cyan, `[${model}]`));
149
-
150
- const bar = ctxBar(ctxPct);
151
- if (bar) parts.push(bar);
152
-
153
- const stats = [];
154
- if (tokIn != null) stats.push(`in:${fmt(tokIn)}`);
155
- if (tokOut != null) stats.push(`out:${fmt(tokOut)}`);
156
- if (stats.length) parts.push(c(C.gray, stats.join(' ')));
157
-
158
- if (typeof cost === 'number' && !Number.isNaN(cost)) parts.push(c(C.yellow, `$${cost.toFixed(4)}`));
159
-
160
- const dur = formatDuration(durationMs);
161
- if (dur) parts.push(c(C.gray, dur));
162
-
163
- return parts.join(' | ');
164
- }
165
-
166
- function readStdin() {
167
- return new Promise(resolve => {
168
- let data = '';
169
- process.stdin.setEncoding('utf8');
170
- process.stdin.on('data', chunk => { data += chunk; });
171
- process.stdin.on('end', () => resolve(data));
172
- process.stdin.on('error', () => resolve(data));
173
- });
174
- }
175
-
176
- function gitBranch(cwd) {
177
- return new Promise(resolve => {
178
- exec(
179
- 'git --no-optional-locks symbolic-ref --short HEAD 2>/dev/null || git --no-optional-locks rev-parse --short HEAD 2>/dev/null',
180
- { cwd, timeout: 2000 },
181
- (_, stdout) => resolve(stdout.trim() || '')
182
- );
183
- });
184
- }
185
-
186
- // --- Budget resolution (network/filesystem; dependencies injectable for tests) ---
187
-
188
- export async function resolveBudget({
189
- readFile = fs.readFile,
190
- writeFile = fs.writeFile,
191
- fetchImpl = fetch,
192
- getAuthHeadersImpl = getAuthHeaders,
193
- } = {}) {
194
- // Fast path: fresh cache, skip config/network entirely. Discard any cache entry that
195
- // isn't this schema version (e.g. a pre-upgrade string-shaped value) instead of trusting it.
196
- try {
197
- const cacheRaw = await readFile(CACHE_FILE, 'utf8');
198
- const cache = JSON.parse(cacheRaw);
199
- const validShape = cache.schema === CACHE_SCHEMA
200
- && typeof cache.value === 'object' && cache.value !== null
201
- && typeof cache.value.text === 'string';
202
- if (validShape && Date.now() - cache.ts < CACHE_TTL_MS) {
203
- return { budget: cache.value, budgetError: null };
204
- }
205
- } catch {}
206
-
207
- let config;
208
- try {
209
- config = JSON.parse(await readFile(CONFIG_FILE, 'utf8'));
210
- } catch {
211
- return { budget: null, budgetError: null }; // no CodeMie config at all → skip silently
212
- }
213
-
214
- const profile = config.profiles?.[config.activeProfile];
215
- const { baseUrl } = profile ?? {};
216
- // codeMieUrl now lives on the scope-level workspace object (migration 006), and
217
- // userEmail is a top-level MultiProviderConfig field — neither is per-profile anymore.
218
- const codeMieUrl = config.workspace?.codeMieUrl;
219
- const userEmail = config.userEmail;
220
- if (!profile || !codeMieUrl || !baseUrl || !userEmail) {
221
- return { budget: null, budgetError: null }; // no CodeMie profile configured → skip silently
222
- }
223
-
224
- let headers;
225
- try {
226
- headers = await getAuthHeadersImpl(codeMieUrl);
227
- } catch (e) {
228
- return { budget: null, budgetError: e.message };
229
- }
230
- if (!headers) {
231
- return { budget: null, budgetError: 'reauthenticate' };
232
- }
233
-
234
- try {
235
- const res = await fetchImpl(`${baseUrl}/v1/analytics/budget_usage`, {
236
- headers: { 'Content-Type': 'application/json', 'X-CodeMie-Client': 'codemie-cli', ...headers },
237
- });
238
- if (!res.ok) throw new Error(`HTTP ${res.status}`);
239
-
240
- const json = await res.json();
241
- const row = matchBudgetRow(json?.data?.rows, userEmail);
242
- if (!row) throw new Error('budget row not found');
243
-
244
- const budget = formatBudgetSegment(row);
245
- await writeFile(CACHE_FILE, JSON.stringify({ schema: CACHE_SCHEMA, ts: Date.now(), value: budget }), 'utf8');
246
- return { budget, budgetError: null };
247
- } catch (e) {
248
- return { budget: null, budgetError: e.message };
249
- }
250
- }
251
-
252
- export async function main() {
253
- const stdinRaw = await readStdin();
254
-
255
- let basic;
256
- try {
257
- basic = extractBasicInfo(JSON.parse(stdinRaw));
258
- } catch {
259
- basic = extractBasicInfo({});
260
- }
261
-
262
- const branchPromise = basic.cwd ? gitBranch(basic.cwd) : Promise.resolve('');
263
- const [budgetResult, branch] = await Promise.all([resolveBudget(), branchPromise]);
264
-
265
- process.stdout.write(buildStatusLine({ ...basic, branch, ...budgetResult }));
266
- }
267
-
268
- // Compares decoded paths (not raw strings) so this correctly matches even when the
269
- // script's path contains characters import.meta.url percent-encodes (e.g. spaces).
270
- export function isMainModule(argv1, metaUrl) {
271
- if (!argv1) return false;
272
- try {
273
- return fileURLToPath(metaUrl) === argv1;
274
- } catch {
275
- return false;
276
- }
277
- }
278
-
279
- if (isMainModule(process.argv[1], import.meta.url)) {
280
- // Statusline must never crash Claude Code — swallow any unexpected error.
281
- main().catch(() => { process.stdout.write(''); });
282
- }
@@ -1,20 +0,0 @@
1
- /**
2
- * Export functionality for analytics data
3
- */
4
- import type { RootAnalytics } from './types.js';
5
- export declare class AnalyticsExporter {
6
- /**
7
- * Export analytics to JSON file
8
- */
9
- static exportJSON(analytics: RootAnalytics, outputPath: string): void;
10
- /**
11
- * Export analytics to CSV file
12
- * Exports session-level data in flat format
13
- */
14
- static exportCSV(analytics: RootAnalytics, outputPath: string): void;
15
- /**
16
- * Auto-determine output path based on format
17
- */
18
- static getDefaultOutputPath(format: 'json' | 'csv', cwd: string): string;
19
- }
20
- //# sourceMappingURL=exporter.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,91 +0,0 @@
1
- /**
2
- * Export functionality for analytics data
3
- */
4
- import { writeFileSync } from 'fs';
5
- import { join } from 'path';
6
- import chalk from 'chalk';
7
- export class AnalyticsExporter {
8
- /**
9
- * Export analytics to JSON file
10
- */
11
- static exportJSON(analytics, outputPath) {
12
- try {
13
- const json = JSON.stringify(analytics, null, 2);
14
- writeFileSync(outputPath, json, 'utf-8');
15
- console.log(chalk.green(`\n✓ Exported to: ${outputPath}`));
16
- }
17
- catch (error) {
18
- console.error(chalk.red(`\n✗ Failed to export JSON: ${error instanceof Error ? error.message : String(error)}`));
19
- throw error;
20
- }
21
- }
22
- /**
23
- * Export analytics to CSV file
24
- * Exports session-level data in flat format
25
- */
26
- static exportCSV(analytics, outputPath) {
27
- try {
28
- const lines = [];
29
- // CSV header
30
- lines.push([
31
- 'Session ID',
32
- 'Agent',
33
- 'Provider',
34
- 'Project',
35
- 'Branch',
36
- 'Start Time',
37
- 'Duration (s)',
38
- 'Turns',
39
- 'Primary Model',
40
- 'Files Modified',
41
- 'Lines Added',
42
- 'Lines Removed',
43
- 'Net Lines'
44
- ].join(','));
45
- // Session rows
46
- for (const project of analytics.projects) {
47
- for (const branch of project.branches) {
48
- for (const session of branch.sessions) {
49
- const row = [
50
- session.sessionId,
51
- session.agentName,
52
- session.provider,
53
- project.projectPath,
54
- branch.branchName,
55
- new Date(session.startTime).toISOString(),
56
- Math.floor(session.duration / 1000).toString(),
57
- session.totalTurns.toString(),
58
- session.models[0]?.model || 'N/A',
59
- session.files.length.toString(),
60
- session.files.reduce((sum, f) => sum + f.linesAdded, 0).toString(),
61
- session.files.reduce((sum, f) => sum + f.linesRemoved, 0).toString(),
62
- session.files.reduce((sum, f) => sum + f.netLinesChanged, 0).toString()
63
- ];
64
- // Escape CSV fields with commas or quotes
65
- const escapedRow = row.map(field => {
66
- if (field.includes(',') || field.includes('"') || field.includes('\n')) {
67
- return `"${field.replace(/"/g, '""')}"`;
68
- }
69
- return field;
70
- });
71
- lines.push(escapedRow.join(','));
72
- }
73
- }
74
- }
75
- writeFileSync(outputPath, lines.join('\n'), 'utf-8');
76
- console.log(chalk.green(`\n✓ Exported to: ${outputPath}`));
77
- }
78
- catch (error) {
79
- console.error(chalk.red(`\n✗ Failed to export CSV: ${error instanceof Error ? error.message : String(error)}`));
80
- throw error;
81
- }
82
- }
83
- /**
84
- * Auto-determine output path based on format
85
- */
86
- static getDefaultOutputPath(format, cwd) {
87
- const timestamp = new Date().toISOString().split('T')[0];
88
- return join(cwd, `codemie-analytics-${timestamp}.${format}`);
89
- }
90
- }
91
- //# sourceMappingURL=exporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../../src/cli/commands/analytics/exporter.ts"],"names":[],"mappings":"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"}