hungry-ghost-hive 0.52.0 → 0.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/manager/token-capture.d.ts.map +1 -1
- package/dist/cli/commands/manager/token-capture.js +6 -3
- package/dist/cli/commands/manager/token-capture.js.map +1 -1
- package/dist/parsers/token-usage-parser.d.ts.map +1 -1
- package/dist/parsers/token-usage-parser.js +33 -4
- package/dist/parsers/token-usage-parser.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/manager/token-capture.ts +9 -3
- package/src/parsers/token-usage-parser.ts +36 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-capture.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/manager/token-capture.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;CAClB;AAWD,4DAA4D;AAC5D,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"token-capture.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/manager/token-capture.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;CAClB;AAWD,4DAA4D;AAC5D,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAY7B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA+B7B;AAED;;;;;GAKG;AACH,wBAAsB,kCAAkC,CACtD,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,OAAO,CAAC,uBAAuB,CAAC,CAyDlC"}
|
|
@@ -30,7 +30,8 @@ export async function captureAndPersistTokenUsage(sessionName, ctx, agentId, sto
|
|
|
30
30
|
}
|
|
31
31
|
return await parseAndPersistTokenUsage(output, ctx, agentId, storyId);
|
|
32
32
|
}
|
|
33
|
-
catch {
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.error(`[token-capture] captureAndPersistTokenUsage failed for agent=${agentId}:`, err);
|
|
34
35
|
return { captured: false, tokens: null, persisted: false };
|
|
35
36
|
}
|
|
36
37
|
}
|
|
@@ -62,7 +63,8 @@ export async function parseAndPersistTokenUsage(output, ctx, agentId, storyId) {
|
|
|
62
63
|
});
|
|
63
64
|
return { captured: true, tokens, persisted: true };
|
|
64
65
|
}
|
|
65
|
-
catch {
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.error(`[token-capture] parseAndPersistTokenUsage failed for agent=${agentId}:`, err);
|
|
66
68
|
return { captured: false, tokens: null, persisted: false };
|
|
67
69
|
}
|
|
68
70
|
}
|
|
@@ -113,7 +115,8 @@ export async function parseAndPersistTokenUsageIfChanged(output, ctx, agentId, s
|
|
|
113
115
|
});
|
|
114
116
|
return { captured: true, tokens, persisted: true, changed: true };
|
|
115
117
|
}
|
|
116
|
-
catch {
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.error(`[token-capture] parseAndPersistTokenUsageIfChanged failed for agent=${agentId}:`, err);
|
|
117
120
|
return { captured: false, tokens: null, persisted: false, changed: false };
|
|
118
121
|
}
|
|
119
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-capture.js","sourceRoot":"","sources":["../../../../src/cli/commands/manager/token-capture.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,eAAe,GAEhB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAmBvC,wEAAwE;AACxE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA6B,CAAC;AAE/D,4DAA4D;AAC5D,MAAM,UAAU,4BAA4B;IAC1C,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAmB,EACnB,GAAwB,EACxB,OAAe,EACf,OAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7D,CAAC;QAED,OAAO,MAAM,yBAAyB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAAC,
|
|
1
|
+
{"version":3,"file":"token-capture.js","sourceRoot":"","sources":["../../../../src/cli/commands/manager/token-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-usage-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/token-usage-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-usage-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/token-usage-parser.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAsKD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAOvE;AAID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAkClF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmB9E"}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* Supports Claude Code, Codex, and Gemini output formats.
|
|
7
7
|
* Also reads token usage directly from Claude Code's JSONL conversation logs.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { execSync } from 'child_process';
|
|
10
|
+
import { readFileSync, readdirSync, statSync } from 'fs';
|
|
11
|
+
import { homedir, userInfo } from 'os';
|
|
11
12
|
import { join, resolve } from 'path';
|
|
12
13
|
/**
|
|
13
14
|
* Parse a number string that may contain commas (e.g. "12,345" -> 12345)
|
|
@@ -226,12 +227,40 @@ export function getTokenUsageForAgent(workDir) {
|
|
|
226
227
|
return null;
|
|
227
228
|
return { inputTokens: totalInput, outputTokens: totalOutput, totalTokens };
|
|
228
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* Resolve the home directory for the OS user that owns a given path.
|
|
232
|
+
* Falls back to the current process's homedir() if detection fails.
|
|
233
|
+
*/
|
|
234
|
+
function resolveHomeDirForPath(dirPath) {
|
|
235
|
+
try {
|
|
236
|
+
const stat = statSync(dirPath);
|
|
237
|
+
const currentUid = userInfo().uid;
|
|
238
|
+
// If the directory is owned by the current user, just use homedir()
|
|
239
|
+
if (stat.uid === currentUid) {
|
|
240
|
+
return homedir();
|
|
241
|
+
}
|
|
242
|
+
// Look up the owning user's home directory via getent (POSIX)
|
|
243
|
+
const passwd = execSync(`getent passwd ${stat.uid}`, { encoding: 'utf-8' }).trim();
|
|
244
|
+
const fields = passwd.split(':');
|
|
245
|
+
if (fields.length >= 6 && fields[5]) {
|
|
246
|
+
return fields[5];
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Fall through to default
|
|
251
|
+
}
|
|
252
|
+
return homedir();
|
|
253
|
+
}
|
|
229
254
|
/**
|
|
230
255
|
* Find all JSONL session files for a given working directory.
|
|
256
|
+
* Resolves the Claude config directory from the user that owns the workDir,
|
|
257
|
+
* so the manager can read JSONL logs even when running as a different user.
|
|
231
258
|
*/
|
|
232
259
|
function findAllSessionFiles(workDir) {
|
|
233
|
-
const
|
|
234
|
-
const
|
|
260
|
+
const resolvedWorkDir = resolve(workDir);
|
|
261
|
+
const projectDir = pathToClaudeProjectDir(resolvedWorkDir);
|
|
262
|
+
const home = resolveHomeDirForPath(resolvedWorkDir);
|
|
263
|
+
const claudeProjectsDir = join(home, '.claude', 'projects', projectDir);
|
|
235
264
|
try {
|
|
236
265
|
return readdirSync(claudeProjectsDir)
|
|
237
266
|
.filter(f => f.endsWith('.jsonl'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-usage-parser.js","sourceRoot":"","sources":["../../src/parsers/token-usage-parser.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"token-usage-parser.js","sourceRoot":"","sources":["../../src/parsers/token-usage-parser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -63,7 +63,8 @@ export async function captureAndPersistTokenUsage(
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
return await parseAndPersistTokenUsage(output, ctx, agentId, storyId);
|
|
66
|
-
} catch {
|
|
66
|
+
} catch (err) {
|
|
67
|
+
console.error(`[token-capture] captureAndPersistTokenUsage failed for agent=${agentId}:`, err);
|
|
67
68
|
return { captured: false, tokens: null, persisted: false };
|
|
68
69
|
}
|
|
69
70
|
}
|
|
@@ -104,7 +105,8 @@ export async function parseAndPersistTokenUsage(
|
|
|
104
105
|
});
|
|
105
106
|
|
|
106
107
|
return { captured: true, tokens, persisted: true };
|
|
107
|
-
} catch {
|
|
108
|
+
} catch (err) {
|
|
109
|
+
console.error(`[token-capture] parseAndPersistTokenUsage failed for agent=${agentId}:`, err);
|
|
108
110
|
return { captured: false, tokens: null, persisted: false };
|
|
109
111
|
}
|
|
110
112
|
}
|
|
@@ -171,7 +173,11 @@ export async function parseAndPersistTokenUsageIfChanged(
|
|
|
171
173
|
});
|
|
172
174
|
|
|
173
175
|
return { captured: true, tokens, persisted: true, changed: true };
|
|
174
|
-
} catch {
|
|
176
|
+
} catch (err) {
|
|
177
|
+
console.error(
|
|
178
|
+
`[token-capture] parseAndPersistTokenUsageIfChanged failed for agent=${agentId}:`,
|
|
179
|
+
err
|
|
180
|
+
);
|
|
175
181
|
return { captured: false, tokens: null, persisted: false, changed: false };
|
|
176
182
|
}
|
|
177
183
|
}
|
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* Also reads token usage directly from Claude Code's JSONL conversation logs.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { readFileSync, readdirSync, statSync } from 'fs';
|
|
13
|
+
import { homedir, userInfo } from 'os';
|
|
13
14
|
import { join, resolve } from 'path';
|
|
14
15
|
|
|
15
16
|
export interface ParsedTokenUsage {
|
|
@@ -274,12 +275,43 @@ export function getTokenUsageForAgent(workDir: string): ParsedTokenUsage | null
|
|
|
274
275
|
return { inputTokens: totalInput, outputTokens: totalOutput, totalTokens };
|
|
275
276
|
}
|
|
276
277
|
|
|
278
|
+
/**
|
|
279
|
+
* Resolve the home directory for the OS user that owns a given path.
|
|
280
|
+
* Falls back to the current process's homedir() if detection fails.
|
|
281
|
+
*/
|
|
282
|
+
function resolveHomeDirForPath(dirPath: string): string {
|
|
283
|
+
try {
|
|
284
|
+
const stat = statSync(dirPath);
|
|
285
|
+
const currentUid = userInfo().uid;
|
|
286
|
+
|
|
287
|
+
// If the directory is owned by the current user, just use homedir()
|
|
288
|
+
if (stat.uid === currentUid) {
|
|
289
|
+
return homedir();
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Look up the owning user's home directory via getent (POSIX)
|
|
293
|
+
const passwd = execSync(`getent passwd ${stat.uid}`, { encoding: 'utf-8' }).trim();
|
|
294
|
+
const fields = passwd.split(':');
|
|
295
|
+
if (fields.length >= 6 && fields[5]) {
|
|
296
|
+
return fields[5];
|
|
297
|
+
}
|
|
298
|
+
} catch {
|
|
299
|
+
// Fall through to default
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return homedir();
|
|
303
|
+
}
|
|
304
|
+
|
|
277
305
|
/**
|
|
278
306
|
* Find all JSONL session files for a given working directory.
|
|
307
|
+
* Resolves the Claude config directory from the user that owns the workDir,
|
|
308
|
+
* so the manager can read JSONL logs even when running as a different user.
|
|
279
309
|
*/
|
|
280
310
|
function findAllSessionFiles(workDir: string): string[] {
|
|
281
|
-
const
|
|
282
|
-
const
|
|
311
|
+
const resolvedWorkDir = resolve(workDir);
|
|
312
|
+
const projectDir = pathToClaudeProjectDir(resolvedWorkDir);
|
|
313
|
+
const home = resolveHomeDirForPath(resolvedWorkDir);
|
|
314
|
+
const claudeProjectsDir = join(home, '.claude', 'projects', projectDir);
|
|
283
315
|
|
|
284
316
|
try {
|
|
285
317
|
return readdirSync(claudeProjectsDir)
|