@memnexus-ai/mx-agent-cli 0.1.54 → 0.1.56

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.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8BD,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAgFtD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+BD,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAgFtD"}
@@ -13,6 +13,7 @@ import chalk from 'chalk';
13
13
  import { loadConfig, setConfigValue, getConfigValue, deleteConfigValue } from '../lib/config.js';
14
14
  const KNOWN_KEYS = {
15
15
  'slack-webhook': 'Slack incoming webhook URL for pager notifications',
16
+ 'observability-api-url': 'Observability API URL for mx-agent sync (default: http://localhost:3100)',
16
17
  };
17
18
  function validateKey(key) {
18
19
  if (!KNOWN_KEYS[key]) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6InE"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsVnE"}
@@ -64,6 +64,8 @@ export async function runStart(options) {
64
64
  // ── 4. Rebase worktree onto latest origin/<baseBranch> ───────────
65
65
  // Ensures the worktree has the latest roleguides, CLI fixes, and
66
66
  // templates even if it was created before those commits landed.
67
+ // Rebase failure is blocking — a session must not start on stale state.
68
+ const DIVERGENCE_WARN_THRESHOLD = 20;
67
69
  console.log(chalk.dim(` Syncing with origin/${cfg.baseBranch}...`));
68
70
  const fetchResult = spawnSync('git', ['fetch', 'origin', cfg.baseBranch], {
69
71
  cwd: worktreePath,
@@ -71,23 +73,190 @@ export async function runStart(options) {
71
73
  encoding: 'utf-8',
72
74
  });
73
75
  if (fetchResult.status !== 0) {
76
+ // Fetch failure is non-fatal (offline / no remote) but surfaced clearly.
74
77
  console.log(chalk.yellow(` ⚠ Could not fetch origin/${cfg.baseBranch} — starting with local state.`));
78
+ const fetchErr = fetchResult.stderr?.trim();
79
+ if (fetchErr)
80
+ console.log(chalk.dim(` ${fetchErr}`));
75
81
  }
76
82
  else {
83
+ // ── Divergence check ─────────────────────────────────────────
84
+ const behindR = spawnSync('git', ['rev-list', '--count', `HEAD..origin/${cfg.baseBranch}`], { cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8' });
85
+ const aheadR = spawnSync('git', ['rev-list', '--count', `origin/${cfg.baseBranch}..HEAD`], { cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8' });
86
+ const commitsBehind = parseInt(behindR.stdout.trim(), 10) || 0;
87
+ const commitsAhead = parseInt(aheadR.stdout.trim(), 10) || 0;
88
+ if (commitsBehind >= DIVERGENCE_WARN_THRESHOLD) {
89
+ console.log();
90
+ console.log(chalk.yellow(` ⚠ This branch is ${commitsBehind} commits behind origin/${cfg.baseBranch}.`));
91
+ if (commitsAhead > 0) {
92
+ console.log(chalk.yellow(` It also has ${commitsAhead} unmerged commit${commitsAhead === 1 ? '' : 's'}.`));
93
+ console.log(chalk.yellow(` Consider opening a PR for completed work before continuing to reduce conflict risk.`));
94
+ }
95
+ console.log();
96
+ }
97
+ // ── Auto-stash dirty worktree before rebase ─────────────────
98
+ const statusR = spawnSync('git', ['status', '--porcelain'], {
99
+ cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8',
100
+ });
101
+ const hasDirtyFiles = statusR.stdout.trim().length > 0;
102
+ let didStash = false;
103
+ if (hasDirtyFiles) {
104
+ const stashR = spawnSync('git', ['stash', 'push', '-m', 'mx-agent-start: auto-stash before rebase'], {
105
+ cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8',
106
+ });
107
+ if (stashR.status === 0 && !stashR.stdout.includes('No local changes')) {
108
+ didStash = true;
109
+ console.log(chalk.dim(' Stashed uncommitted changes before rebase.'));
110
+ }
111
+ }
112
+ // ── Rebase with auto-skip for already-upstream commits ──────
77
113
  const rebaseResult = spawnSync('git', ['rebase', `origin/${cfg.baseBranch}`], {
78
114
  cwd: worktreePath,
79
115
  stdio: 'pipe',
80
116
  encoding: 'utf-8',
81
117
  });
82
118
  if (rebaseResult.status !== 0) {
83
- // Abort the rebase so the worktree is left in a clean state
84
- spawnSync('git', ['rebase', '--abort'], { cwd: worktreePath, stdio: 'pipe' });
85
- console.log(chalk.yellow(` ⚠ Could not rebase onto origin/${cfg.baseBranch} (conflicts) starting with local state.`));
86
- console.log(chalk.dim(` Resolve manually: git -C ${worktreePath} rebase origin/${cfg.baseBranch}`));
119
+ // Rebase failed try auto-skipping already-upstream commits.
120
+ // When a PR is squash-merged, the original branch commits still
121
+ // exist but their content is already on main. Git usually drops
122
+ // these ("patch contents already upstream") but if formatting
123
+ // differs slightly, it raises a conflict instead. We detect this
124
+ // by checking whether the conflicting commit's changes are already
125
+ // present in origin/main and auto-skip if so.
126
+ const MAX_AUTO_SKIP = 20; // safety cap
127
+ let skipped = 0;
128
+ let resolved = false;
129
+ for (let i = 0; i < MAX_AUTO_SKIP; i++) {
130
+ // Check if we're still mid-rebase
131
+ const rebaseHeadR = spawnSync('git', ['rev-parse', '--verify', 'REBASE_HEAD'], {
132
+ cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8',
133
+ });
134
+ if (rebaseHeadR.status !== 0) {
135
+ // No longer in rebase — either resolved or something unexpected
136
+ resolved = true;
137
+ break;
138
+ }
139
+ const rebaseHead = rebaseHeadR.stdout.trim();
140
+ // Check if this commit's patch-id matches any commit already on main.
141
+ // patch-id produces a content-based hash of the diff, ignoring whitespace.
142
+ // Uses array-form spawnSync + manual piping to avoid shell interpolation.
143
+ const showR = spawnSync('git', ['-C', worktreePath, 'show', rebaseHead], {
144
+ stdio: 'pipe',
145
+ });
146
+ const patchIdR = spawnSync('git', ['-C', worktreePath, 'patch-id', '--stable'], {
147
+ input: showR.stdout,
148
+ stdio: ['pipe', 'pipe', 'pipe'],
149
+ encoding: 'utf-8',
150
+ });
151
+ const branchPatchId = patchIdR.stdout.trim().split(/\s+/)[0] || '';
152
+ let isAlreadyUpstream = false;
153
+ if (branchPatchId) {
154
+ // Get patch-ids for recent main commits in one shot:
155
+ // `git log -100 -p` outputs all diffs, piped to `git patch-id --stable`
156
+ const logR = spawnSync('git', ['-C', worktreePath, 'log', '-100', '-p', `origin/${cfg.baseBranch}`], {
157
+ stdio: 'pipe',
158
+ });
159
+ const mainPatchR = spawnSync('git', ['-C', worktreePath, 'patch-id', '--stable'], {
160
+ input: logR.stdout,
161
+ stdio: ['pipe', 'pipe', 'pipe'],
162
+ encoding: 'utf-8',
163
+ });
164
+ const mainPatchIds = mainPatchR.stdout.trim().split('\n')
165
+ .map(line => line.split(/\s+/)[0])
166
+ .filter(Boolean);
167
+ isAlreadyUpstream = mainPatchIds.includes(branchPatchId);
168
+ }
169
+ if (!isAlreadyUpstream) {
170
+ // Also check: if we accept main's version for all conflicts,
171
+ // does the tree match main exactly? This catches squash-merged
172
+ // commits where patch-id differs due to combined squashing.
173
+ spawnSync('git', ['-C', worktreePath, 'checkout', '--theirs', '.'], {
174
+ stdio: 'pipe',
175
+ });
176
+ spawnSync('git', ['-C', worktreePath, 'add', '-A'], {
177
+ stdio: 'pipe',
178
+ });
179
+ const diffR = spawnSync('git', ['-C', worktreePath, 'diff', '--cached', '--stat', 'HEAD'], {
180
+ stdio: 'pipe', encoding: 'utf-8',
181
+ });
182
+ const diffAfterTheirs = diffR.stdout.trim();
183
+ if (diffAfterTheirs === '') {
184
+ // Tree is identical to main after accepting theirs — commit is redundant
185
+ isAlreadyUpstream = true;
186
+ }
187
+ }
188
+ if (isAlreadyUpstream) {
189
+ // Skip this commit — its changes are already on main
190
+ const skipR = spawnSync('git', ['rebase', '--skip'], {
191
+ cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8',
192
+ });
193
+ skipped++;
194
+ if (skipR.status === 0) {
195
+ resolved = true;
196
+ break;
197
+ }
198
+ // Skip succeeded but rebase continues with next commit — loop again
199
+ continue;
200
+ }
201
+ // Genuine conflict — not already upstream. Abort and block.
202
+ break;
203
+ }
204
+ if (!resolved) {
205
+ // Genuine conflict that couldn't be auto-resolved.
206
+ const conflictR = spawnSync('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8' });
207
+ const conflictFiles = conflictR.stdout.trim().split('\n').filter(Boolean);
208
+ spawnSync('git', ['rebase', '--abort'], { cwd: worktreePath, stdio: 'pipe' });
209
+ // Restore stash if we created one
210
+ if (didStash) {
211
+ spawnSync('git', ['stash', 'pop'], { cwd: worktreePath, stdio: 'pipe' });
212
+ }
213
+ console.error();
214
+ console.error(chalk.red.bold(` ✗ Rebase onto origin/${cfg.baseBranch} failed — session blocked.`));
215
+ console.error(chalk.dim(' ─────────────────────────────────────────────'));
216
+ if (conflictFiles.length > 0) {
217
+ console.error(chalk.red(` Conflicting files (${conflictFiles.length}):`));
218
+ for (const f of conflictFiles) {
219
+ console.error(chalk.dim(` • ${f}`));
220
+ }
221
+ console.error();
222
+ }
223
+ console.error(chalk.bold(' To resolve:'));
224
+ console.error(` 1. Run the rebase manually:`);
225
+ console.error(chalk.cyan(` git -C ${worktreePath} rebase origin/${cfg.baseBranch}`));
226
+ console.error(` 2. Fix each conflict, then stage the resolved files:`);
227
+ console.error(chalk.cyan(` git -C ${worktreePath} add <file>`));
228
+ console.error(` 3. Continue the rebase:`);
229
+ console.error(chalk.cyan(` git -C ${worktreePath} rebase --continue`));
230
+ console.error(` 4. Re-run:`);
231
+ console.error(chalk.cyan(` mx-agent start ${name}`));
232
+ console.error();
233
+ console.error(chalk.dim(` Tip: if this branch has completed work, open a PR first.`));
234
+ console.error(chalk.dim(` Smaller PRs merged frequently reduce conflict surface.`));
235
+ console.error();
236
+ process.exit(1);
237
+ }
238
+ if (skipped > 0) {
239
+ console.log(chalk.green(` ✓ Rebased onto origin/${cfg.baseBranch} (auto-skipped ${skipped} already-upstream commit${skipped === 1 ? '' : 's'})`));
240
+ }
241
+ }
242
+ else if (commitsBehind > 0) {
243
+ console.log(chalk.green(` ✓ Rebased ${commitsBehind} commit${commitsBehind === 1 ? '' : 's'} from origin/${cfg.baseBranch}`));
87
244
  }
88
245
  else {
89
246
  console.log(chalk.green(` ✓ Worktree up to date with origin/${cfg.baseBranch}`));
90
247
  }
248
+ // ── Restore stashed changes ───────────────────────────────
249
+ if (didStash) {
250
+ const popR = spawnSync('git', ['stash', 'pop'], {
251
+ cwd: worktreePath, stdio: 'pipe', encoding: 'utf-8',
252
+ });
253
+ if (popR.status === 0) {
254
+ console.log(chalk.dim(' Restored stashed changes.'));
255
+ }
256
+ else {
257
+ console.log(chalk.yellow(' ⚠ Could not restore stashed changes — run `git stash pop` manually.'));
258
+ }
259
+ }
91
260
  }
92
261
  console.log();
93
262
  // ── 5. Sync Claude config from origin/<baseBranch> ────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * mx-agent sync [--name <team>] [--api-url <url>]
3
+ *
4
+ * Reads local Claude session JSONL logs and ships them to the observability API.
5
+ * Designed to run at session end (via StopHook) to preserve data before container exits.
6
+ *
7
+ * Usage:
8
+ * mx-agent sync # sync all teams on this machine
9
+ * mx-agent sync --name retrieval # sync a specific team
10
+ * mx-agent sync --api-url http://observability.internal:3100
11
+ */
12
+ export interface SyncOptions {
13
+ name?: string;
14
+ apiUrl?: string;
15
+ quiet?: boolean;
16
+ }
17
+ export declare function runSync(options: SyncOptions): Promise<void>;
18
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EjE"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * mx-agent sync [--name <team>] [--api-url <url>]
3
+ *
4
+ * Reads local Claude session JSONL logs and ships them to the observability API.
5
+ * Designed to run at session end (via StopHook) to preserve data before container exits.
6
+ *
7
+ * Usage:
8
+ * mx-agent sync # sync all teams on this machine
9
+ * mx-agent sync --name retrieval # sync a specific team
10
+ * mx-agent sync --api-url http://observability.internal:3100
11
+ */
12
+ import { join } from 'path';
13
+ import { homedir, hostname } from 'os';
14
+ import chalk from 'chalk';
15
+ import { findProjectRoot, findWorktreePath } from '../lib/worktree.js';
16
+ import { listTeams } from '../lib/catalog.js';
17
+ import { getConfigValue } from '../lib/config.js';
18
+ import { parseSessionRecords, pathToProjectDirName } from '../lib/jsonl.js';
19
+ const DEFAULT_API_URL = 'http://localhost:3100';
20
+ export async function runSync(options) {
21
+ const { name, quiet = false } = options;
22
+ const apiUrl = options.apiUrl
23
+ || getConfigValue('observability-api-url')
24
+ || DEFAULT_API_URL;
25
+ let projectRoot;
26
+ try {
27
+ projectRoot = findProjectRoot();
28
+ }
29
+ catch (err) {
30
+ if (!quiet) {
31
+ console.error(chalk.red(`sync: ${err instanceof Error ? err.message : String(err)}`));
32
+ }
33
+ return;
34
+ }
35
+ const allTeams = listTeams(projectRoot);
36
+ const teams = name ? allTeams.filter((t) => t.slug === name) : allTeams;
37
+ if (teams.length === 0) {
38
+ if (!quiet) {
39
+ console.error(chalk.red(name ? `sync: team '${name}' not found` : 'sync: no teams found'));
40
+ }
41
+ return;
42
+ }
43
+ const projectsDir = join(homedir(), '.claude', 'projects');
44
+ const machine = hostname();
45
+ let totalSynced = 0;
46
+ for (const team of teams) {
47
+ const worktreePath = findWorktreePath(projectRoot, team.slug);
48
+ if (!worktreePath)
49
+ continue;
50
+ const worktreeDirName = worktreePath.split('/').pop();
51
+ const projectDirName = pathToProjectDirName(worktreePath);
52
+ const projectDir = join(projectsDir, projectDirName);
53
+ const sessions = parseSessionRecords(projectDir);
54
+ if (sessions.length === 0)
55
+ continue;
56
+ try {
57
+ const resp = await fetch(`${apiUrl}/v1/sessions/sync`, {
58
+ method: 'POST',
59
+ headers: { 'Content-Type': 'application/json' },
60
+ body: JSON.stringify({ team: team.slug, worktree: worktreeDirName, machine, sessions }),
61
+ signal: AbortSignal.timeout(10_000),
62
+ });
63
+ if (!resp.ok) {
64
+ if (!quiet) {
65
+ console.warn(chalk.yellow(`sync: ${team.slug}: HTTP ${resp.status} from ${apiUrl}`));
66
+ }
67
+ continue;
68
+ }
69
+ const { synced } = await resp.json();
70
+ totalSynced += synced;
71
+ if (!quiet && synced > 0) {
72
+ console.log(chalk.green(`✓ sync: ${team.slug}: ${synced} session${synced !== 1 ? 's' : ''}`));
73
+ }
74
+ }
75
+ catch (err) {
76
+ // Network errors are non-fatal — the observability API may not be running
77
+ if (!quiet) {
78
+ const msg = err instanceof Error ? err.message : String(err);
79
+ if (!msg.includes('ECONNREFUSED') && !msg.includes('TimeoutError')) {
80
+ console.warn(chalk.yellow(`sync: ${team.slug}: ${msg}`));
81
+ }
82
+ }
83
+ }
84
+ }
85
+ if (!quiet && totalSynced === 0 && !name) {
86
+ // Silently succeed if nothing needed syncing (common case for StopHook)
87
+ }
88
+ }
89
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAmqBD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFnE"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AA0cD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFnE"}
@@ -6,55 +6,13 @@
6
6
  * Subagent sessions are included in their team's totals.
7
7
  */
8
8
  import { execSync } from 'child_process';
9
- import { existsSync, readdirSync, readFileSync } from 'fs';
9
+ import { existsSync } from 'fs';
10
10
  import { join } from 'path';
11
11
  import { homedir } from 'os';
12
12
  import chalk from 'chalk';
13
13
  import { findProjectRoot, findWorktreePath } from '../lib/worktree.js';
14
14
  import { listTeams } from '../lib/catalog.js';
15
- const MODEL_PRICING = {
16
- 'claude-opus-4-6': { input: 5, output: 25, cacheRead: 0.50, cacheWrite: 6.25 },
17
- 'claude-opus-4-5': { input: 5, output: 25, cacheRead: 0.50, cacheWrite: 6.25 },
18
- 'claude-opus-4-1': { input: 15, output: 75, cacheRead: 1.50, cacheWrite: 18.75 },
19
- 'claude-sonnet-4-6': { input: 3, output: 15, cacheRead: 0.30, cacheWrite: 3.75 },
20
- 'claude-sonnet-4-5': { input: 3, output: 15, cacheRead: 0.30, cacheWrite: 3.75 },
21
- 'claude-haiku-4-5': { input: 1, output: 5, cacheRead: 0.10, cacheWrite: 1.25 },
22
- };
23
- /** Default rates when model is unknown — use Opus 4.6 as conservative estimate */
24
- const DEFAULT_RATES = MODEL_PRICING['claude-opus-4-6'];
25
- function getRates(model) {
26
- return MODEL_PRICING[model] || DEFAULT_RATES;
27
- }
28
- function calcLineCost(input, output, cacheR, cacheW, rates) {
29
- return (input / 1e6) * rates.input
30
- + (output / 1e6) * rates.output
31
- + (cacheR / 1e6) * rates.cacheRead
32
- + (cacheW / 1e6) * rates.cacheWrite;
33
- }
34
- function newTotals() {
35
- return {
36
- sessions: new Set(),
37
- inputTokens: 0,
38
- outputTokens: 0,
39
- cacheReadTokens: 0,
40
- cacheWriteTokens: 0,
41
- cost: 0,
42
- models: new Set(),
43
- mxCalls: 0,
44
- mxEstTokens: 0,
45
- };
46
- }
47
- function addToTotals(dest, src) {
48
- dest.inputTokens += src.inputTokens;
49
- dest.outputTokens += src.outputTokens;
50
- dest.cacheReadTokens += src.cacheReadTokens;
51
- dest.cacheWriteTokens += src.cacheWriteTokens;
52
- dest.cost += src.cost;
53
- dest.mxCalls += src.mxCalls;
54
- dest.mxEstTokens += src.mxEstTokens;
55
- src.sessions.forEach((s) => dest.sessions.add(s));
56
- src.models.forEach((m) => dest.models.add(m));
57
- }
15
+ import { readProjectUsage, pathToProjectDirName, newTotals, addToTotals, } from '../lib/jsonl.js';
58
16
  // ── Helpers ──────────────────────────────────────────────────────────────────
59
17
  /**
60
18
  * Parse a period string ("7d", "30d", "24h", "1w") into milliseconds.
@@ -72,17 +30,6 @@ function parsePeriodMs(period) {
72
30
  default: return 30 * 24 * 60 * 60 * 1000;
73
31
  }
74
32
  }
75
- /**
76
- * Map a worktree path to the Claude project directory name.
77
- *
78
- * Claude names project dirs by taking the cwd path, replacing "/" with "-"
79
- * and stripping ".". For example:
80
- * /workspace/.worktrees/code-context-20260223
81
- * → -workspace--worktrees-code-context-20260223
82
- */
83
- function pathToProjectDirName(worktreePath) {
84
- return worktreePath.replace(/\//g, '-').replace(/\./g, '-');
85
- }
86
33
  /**
87
34
  * Format a token count as a compact human-readable string.
88
35
  */
@@ -107,133 +54,6 @@ function fmtCost(n) {
107
54
  return '<$0.01';
108
55
  return `$${n.toFixed(2)}`;
109
56
  }
110
- // ── JSONL parsing ────────────────────────────────────────────────────────────
111
- /**
112
- * Collect all .jsonl file paths under a project dir, including subagents/.
113
- */
114
- function collectJsonlFiles(projectDir) {
115
- const files = [];
116
- if (!existsSync(projectDir))
117
- return files;
118
- try {
119
- for (const entry of readdirSync(projectDir)) {
120
- const fullPath = join(projectDir, entry);
121
- if (entry.endsWith('.jsonl')) {
122
- files.push(fullPath);
123
- }
124
- else if (entry === 'subagents') {
125
- try {
126
- for (const sub of readdirSync(fullPath)) {
127
- if (sub.endsWith('.jsonl'))
128
- files.push(join(fullPath, sub));
129
- }
130
- }
131
- catch { /* ignore */ }
132
- }
133
- }
134
- }
135
- catch { /* ignore */ }
136
- return files;
137
- }
138
- /**
139
- * Read a project dir's JSONL logs and return all-time and recent token totals.
140
- */
141
- function readProjectUsage(projectDir, recentCutoffMs) {
142
- const allTime = newTotals();
143
- const recent = newTotals();
144
- const cutoff = Date.now() - recentCutoffMs;
145
- for (const filePath of collectJsonlFiles(projectDir)) {
146
- let content;
147
- try {
148
- content = readFileSync(filePath, 'utf-8');
149
- }
150
- catch {
151
- continue;
152
- }
153
- // Per-file map: tool_use_id → timestamp, for memnexus calls only.
154
- // Populated when we see a tool_use, consumed when we see its tool_result.
155
- const mxToolUseIds = new Map();
156
- for (const line of content.split('\n')) {
157
- if (!line.trim())
158
- continue;
159
- try {
160
- const entry = JSON.parse(line);
161
- const ts = entry?.timestamp ? new Date(entry.timestamp).getTime() : 0;
162
- const role = entry?.message?.role;
163
- const msgContent = entry?.message?.content;
164
- // ── MemNexus tool tracking (runs regardless of usage presence) ──
165
- // Covers two call paths:
166
- // 1. MCP server: tool_use name starts with "mcp__memnexus__"
167
- // 2. CLI via Bash: tool_use name is "Bash" and command matches
168
- // `mx (memories|conversations|facts|topics)` pattern
169
- if (role === 'assistant' && Array.isArray(msgContent)) {
170
- for (const block of msgContent) {
171
- if (block?.type !== 'tool_use' || typeof block.id !== 'string')
172
- continue;
173
- const toolName = typeof block.name === 'string' ? block.name : '';
174
- const isMcp = toolName.startsWith('mcp__memnexus__');
175
- const isCli = toolName === 'Bash' &&
176
- /\bmx (memories|conversations|facts|topics)\b/.test(typeof block.input?.command === 'string' ? block.input.command : '');
177
- if (isMcp || isCli) {
178
- mxToolUseIds.set(block.id, ts);
179
- allTime.mxCalls++;
180
- if (ts >= cutoff)
181
- recent.mxCalls++;
182
- }
183
- }
184
- }
185
- if (role === 'user' && Array.isArray(msgContent)) {
186
- for (const block of msgContent) {
187
- if (block?.type === 'tool_result' &&
188
- typeof block.tool_use_id === 'string' &&
189
- mxToolUseIds.has(block.tool_use_id)) {
190
- const origTs = mxToolUseIds.get(block.tool_use_id);
191
- const estTokens = Math.round(JSON.stringify(block.content ?? '').length / 4);
192
- allTime.mxEstTokens += estTokens;
193
- if (origTs >= cutoff)
194
- recent.mxEstTokens += estTokens;
195
- }
196
- }
197
- }
198
- // ── Token usage (assistant messages with usage field only) ──────
199
- const usage = entry?.message?.usage;
200
- if (!usage || typeof usage !== 'object' || !('input_tokens' in usage))
201
- continue;
202
- const input = usage.input_tokens || 0;
203
- const output = usage.output_tokens || 0;
204
- const cacheR = usage.cache_read_input_tokens || 0;
205
- const cacheW = usage.cache_creation_input_tokens || 0;
206
- const model = entry?.message?.model || '';
207
- const session = entry?.sessionId || '';
208
- const lineCost = calcLineCost(input, output, cacheR, cacheW, getRates(model));
209
- // All-time
210
- allTime.inputTokens += input;
211
- allTime.outputTokens += output;
212
- allTime.cacheReadTokens += cacheR;
213
- allTime.cacheWriteTokens += cacheW;
214
- allTime.cost += lineCost;
215
- if (session)
216
- allTime.sessions.add(session);
217
- if (model)
218
- allTime.models.add(model);
219
- // Recent window
220
- if (ts >= cutoff) {
221
- recent.inputTokens += input;
222
- recent.outputTokens += output;
223
- recent.cacheReadTokens += cacheR;
224
- recent.cacheWriteTokens += cacheW;
225
- recent.cost += lineCost;
226
- if (session)
227
- recent.sessions.add(session);
228
- if (model)
229
- recent.models.add(model);
230
- }
231
- }
232
- catch { /* skip malformed line */ }
233
- }
234
- }
235
- return { allTime, recent };
236
- }
237
57
  function totalInput(t) {
238
58
  return t.inputTokens + t.cacheReadTokens + t.cacheWriteTokens;
239
59
  }