@dsiloed/silo-link 1.11.1 → 1.12.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.
- package/README.md +53 -5
- package/dist/cable/subscription-manager.d.ts +2 -1
- package/dist/cable/subscription-manager.d.ts.map +1 -1
- package/dist/cable/subscription-manager.js +39 -15
- package/dist/cable/subscription-manager.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +58 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +24 -9
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/codex-launcher.d.ts +89 -0
- package/dist/core/codex-launcher.d.ts.map +1 -0
- package/dist/core/codex-launcher.js +296 -0
- package/dist/core/codex-launcher.js.map +1 -0
- package/dist/core/launcher-factory.d.ts +1 -1
- package/dist/core/launcher-factory.d.ts.map +1 -1
- package/dist/core/launcher-factory.js +4 -4
- package/dist/core/launcher-factory.js.map +1 -1
- package/dist/core/report-usage.d.ts +51 -0
- package/dist/core/report-usage.d.ts.map +1 -0
- package/dist/core/report-usage.js +112 -0
- package/dist/core/report-usage.js.map +1 -0
- package/dist/core/session-manager.d.ts +9 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +21 -5
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/transcript-usage.d.ts +36 -0
- package/dist/core/transcript-usage.d.ts.map +1 -1
- package/dist/core/transcript-usage.js +190 -0
- package/dist/core/transcript-usage.js.map +1 -1
- package/dist/mcp/tools/register-tools.d.ts.map +1 -1
- package/dist/mcp/tools/register-tools.js +8 -1
- package/dist/mcp/tools/register-tools.js.map +1 -1
- package/dist/types/index.d.ts +9 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
import { parseClaudeTranscript, parseGeminiTranscript, parseCodexTranscript, locateClaudeTranscript, locateGeminiTranscript, locateCodexTranscript, claudeCostBasis, geminiCostBasis, codexCostBasis, } from './transcript-usage.js';
|
|
4
|
+
const PARSERS = {
|
|
5
|
+
claude: parseClaudeTranscript,
|
|
6
|
+
gemini: parseGeminiTranscript,
|
|
7
|
+
codex: parseCodexTranscript,
|
|
8
|
+
};
|
|
9
|
+
const LOCATORS = {
|
|
10
|
+
claude: locateClaudeTranscript,
|
|
11
|
+
gemini: locateGeminiTranscript,
|
|
12
|
+
codex: locateCodexTranscript,
|
|
13
|
+
};
|
|
14
|
+
const COST_BASIS = {
|
|
15
|
+
claude: claudeCostBasis,
|
|
16
|
+
gemini: geminiCostBasis,
|
|
17
|
+
codex: codexCostBasis,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Locate + parse a coding-agent transcript into the per-model usage summary the
|
|
21
|
+
* report_coding_usage endpoint expects. Pure (no network) so it's unit-testable.
|
|
22
|
+
*/
|
|
23
|
+
export function collectUsage(opts) {
|
|
24
|
+
const cli = opts.cli;
|
|
25
|
+
const cwd = opts.cwd || process.cwd();
|
|
26
|
+
const sessionId = opts.sessionId ?? null;
|
|
27
|
+
const transcriptPath = opts.transcriptPath && existsSync(opts.transcriptPath)
|
|
28
|
+
? opts.transcriptPath
|
|
29
|
+
: LOCATORS[cli](cwd, sessionId);
|
|
30
|
+
const usage = transcriptPath && existsSync(transcriptPath)
|
|
31
|
+
? PARSERS[cli](readFileSync(transcriptPath, 'utf8'))
|
|
32
|
+
: [];
|
|
33
|
+
return {
|
|
34
|
+
cli,
|
|
35
|
+
cost_basis: COST_BASIS[cli](),
|
|
36
|
+
cli_session_id: sessionId,
|
|
37
|
+
usage,
|
|
38
|
+
transcriptPath,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Collect usage for a coding session and POST it to model_api's
|
|
43
|
+
* report_coding_usage endpoint, attributed to the configured user. Returns the
|
|
44
|
+
* collected usage even when nothing is posted (empty usage / dry run) so callers
|
|
45
|
+
* can log what happened. Never throws on HTTP failure — returns posted: false.
|
|
46
|
+
*/
|
|
47
|
+
export async function reportUsage(config, opts) {
|
|
48
|
+
const collected = collectUsage(opts);
|
|
49
|
+
if (collected.usage.length === 0) {
|
|
50
|
+
return { posted: false, message: 'No usage found in transcript', collected };
|
|
51
|
+
}
|
|
52
|
+
if (opts.dryRun) {
|
|
53
|
+
return { posted: false, message: 'Dry run — not posted', collected };
|
|
54
|
+
}
|
|
55
|
+
const body = {
|
|
56
|
+
cli_type: collected.cli,
|
|
57
|
+
cost_basis: collected.cost_basis,
|
|
58
|
+
cli_session_id: collected.cli_session_id,
|
|
59
|
+
session_name: opts.sessionName || defaultSessionName(opts.cli, opts.cwd || process.cwd()),
|
|
60
|
+
usage: collected.usage,
|
|
61
|
+
};
|
|
62
|
+
try {
|
|
63
|
+
const res = await fetch(`${config.host}/api/v1/silolink/report_coding_usage`, {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers: {
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
'Authorization': `Bearer ${opts.getToken()}`,
|
|
68
|
+
'Tenant-Id': config.tenant_id,
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify(body),
|
|
71
|
+
});
|
|
72
|
+
const data = (await res.json().catch(() => ({})));
|
|
73
|
+
return {
|
|
74
|
+
posted: !!data.success,
|
|
75
|
+
status: res.status,
|
|
76
|
+
recorded: data.recorded,
|
|
77
|
+
skipped: data.skipped,
|
|
78
|
+
agent_session_id: data.agent_session_id,
|
|
79
|
+
message: data.message,
|
|
80
|
+
collected,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return { posted: false, message: `POST failed: ${err.message}`, collected };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function defaultSessionName(cli, cwd) {
|
|
88
|
+
const label = { claude: 'Claude Code', gemini: 'Gemini', codex: 'Codex' }[cli];
|
|
89
|
+
return `${label} — ${basename(cwd) || cwd}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Read a coding-agent hook's JSON payload from stdin (when invoked as a Stop /
|
|
93
|
+
* SessionEnd hook). Returns {} when there's no piped input or it isn't JSON.
|
|
94
|
+
* Claude Code passes { session_id, transcript_path, cwd, ... } on stdin.
|
|
95
|
+
*/
|
|
96
|
+
export async function readHookStdin() {
|
|
97
|
+
if (process.stdin.isTTY)
|
|
98
|
+
return {};
|
|
99
|
+
try {
|
|
100
|
+
const chunks = [];
|
|
101
|
+
for await (const chunk of process.stdin)
|
|
102
|
+
chunks.push(chunk);
|
|
103
|
+
const raw = Buffer.concat(chunks).toString('utf8').trim();
|
|
104
|
+
if (!raw)
|
|
105
|
+
return {};
|
|
106
|
+
return JSON.parse(raw);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return {};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=report-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-usage.js","sourceRoot":"","sources":["../../src/core/report-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,15 @@ export declare class SessionManager {
|
|
|
11
11
|
register(session: Session): void;
|
|
12
12
|
/** Store the provider for a conversation before the session registers */
|
|
13
13
|
setPendingProvider(conversationId: number, provider: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* True when a deliberate launch was kicked off for this conversation and the
|
|
16
|
+
* session hasn't registered yet (within `windowMs`). Lets the inbound
|
|
17
|
+
* auto-launcher skip conversations already being launched (e.g. a UI Codex
|
|
18
|
+
* launch) instead of spawning a duplicate default-provider session. The window
|
|
19
|
+
* bounds it so a launch that dies before registering doesn't suppress recovery
|
|
20
|
+
* forever.
|
|
21
|
+
*/
|
|
22
|
+
pendingLaunch(conversationId: number, windowMs?: number): boolean;
|
|
14
23
|
unregister(sessionId: string): Session | undefined;
|
|
15
24
|
get(sessionId: string): Session | undefined;
|
|
16
25
|
getByMcpSessionId(mcpSessionId: string): Session | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,qBAAqB,CAAkC;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,qBAAqB,CAAkC;IAK/D,OAAO,CAAC,gBAAgB,CAA4D;IACpF,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,gBAAgB,CAAC,CAA6B;IACtD,OAAO,CAAC,WAAW,CAAC,CAAgC;gBAGlD,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EAC7C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO;IAO7C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAYhC,yEAAyE;IACzE,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIlE;;;;;;;OAOG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,SAAgB,GAAG,OAAO;IAKxE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAUlD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAK5D;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAUjE,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAKhE,MAAM,IAAI,OAAO,EAAE;IASnB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO3C;;;OAGG;IACH,QAAQ,IAAI,OAAO;IAyDnB,OAAO,CAAC,WAAW;IAwBnB,OAAO,IAAI,IAAI;CAShB"}
|
|
@@ -3,7 +3,11 @@ export class SessionManager {
|
|
|
3
3
|
sessions = new Map();
|
|
4
4
|
mcpToSession = new Map();
|
|
5
5
|
conversationToSession = new Map();
|
|
6
|
-
|
|
6
|
+
// conversationId -> { provider, at }. Set by the Bridge when it kicks off a
|
|
7
|
+
// deliberate launch; cleared when that session registers. Doubles as a
|
|
8
|
+
// "launch in flight" signal so the inbound auto-launcher doesn't spawn a
|
|
9
|
+
// SECOND (default-provider) session for a conversation already being launched.
|
|
10
|
+
pendingProviders = new Map();
|
|
7
11
|
cleanupTimer = null;
|
|
8
12
|
onSessionCleaned;
|
|
9
13
|
shouldEvict;
|
|
@@ -14,9 +18,9 @@ export class SessionManager {
|
|
|
14
18
|
}
|
|
15
19
|
register(session) {
|
|
16
20
|
// Apply pending provider if set (from Bridge launch)
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
19
|
-
session.agentProvider = provider;
|
|
21
|
+
const pending = this.pendingProviders.get(session.conversationId);
|
|
22
|
+
if (pending) {
|
|
23
|
+
session.agentProvider = pending.provider;
|
|
20
24
|
this.pendingProviders.delete(session.conversationId);
|
|
21
25
|
}
|
|
22
26
|
this.sessions.set(session.sessionId, session);
|
|
@@ -25,7 +29,19 @@ export class SessionManager {
|
|
|
25
29
|
}
|
|
26
30
|
/** Store the provider for a conversation before the session registers */
|
|
27
31
|
setPendingProvider(conversationId, provider) {
|
|
28
|
-
this.pendingProviders.set(conversationId, provider);
|
|
32
|
+
this.pendingProviders.set(conversationId, { provider, at: Date.now() });
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* True when a deliberate launch was kicked off for this conversation and the
|
|
36
|
+
* session hasn't registered yet (within `windowMs`). Lets the inbound
|
|
37
|
+
* auto-launcher skip conversations already being launched (e.g. a UI Codex
|
|
38
|
+
* launch) instead of spawning a duplicate default-provider session. The window
|
|
39
|
+
* bounds it so a launch that dies before registering doesn't suppress recovery
|
|
40
|
+
* forever.
|
|
41
|
+
*/
|
|
42
|
+
pendingLaunch(conversationId, windowMs = 3 * 60 * 1000) {
|
|
43
|
+
const pending = this.pendingProviders.get(conversationId);
|
|
44
|
+
return !!pending && Date.now() - pending.at < windowMs;
|
|
29
45
|
}
|
|
30
46
|
unregister(sessionId) {
|
|
31
47
|
const session = this.sessions.get(sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAErD,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC3C,YAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC9C,qBAAqB,GAAwB,IAAI,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,6 +55,42 @@ export declare function claudeCostBasis(): 'real' | 'imputed';
|
|
|
55
55
|
* the slug when the session id isn't known.
|
|
56
56
|
*/
|
|
57
57
|
export declare function locateGeminiTranscript(cwd: string, sessionId: string | null): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Parse a Codex CLI rollout transcript (JSONL) into per-model token totals.
|
|
60
|
+
*
|
|
61
|
+
* Codex writes one rollout file per session under ~/.codex/sessions/YYYY/MM/DD/.
|
|
62
|
+
* Each line is `{ timestamp, type, payload }`. Token usage arrives in
|
|
63
|
+
* `token_count` event payloads carrying `info.total_token_usage` — a CUMULATIVE
|
|
64
|
+
* running total for the whole session (NOT a per-turn delta). So we take the
|
|
65
|
+
* LAST total_token_usage we see rather than summing (summing cumulative totals
|
|
66
|
+
* would massively overcount). The model is read from the session_meta /
|
|
67
|
+
* turn_context line(s); the most recent wins.
|
|
68
|
+
*
|
|
69
|
+
* Codex `TokenUsage` keys map straight onto model_api's OpenAI pricing
|
|
70
|
+
* convention (input_tokens is cache-INCLUSIVE, output_tokens is
|
|
71
|
+
* reasoning-INCLUSIVE — model_api subtracts the subsets itself), so we forward
|
|
72
|
+
* the raw cumulative values:
|
|
73
|
+
* input_tokens <- input_tokens (incl. cached)
|
|
74
|
+
* cache_read_input_tokens<- cached_input_tokens
|
|
75
|
+
* output_tokens <- output_tokens (incl. reasoning)
|
|
76
|
+
* reasoning_tokens <- reasoning_output_tokens
|
|
77
|
+
*/
|
|
78
|
+
export declare function parseCodexTranscript(content: string): UsageEntry[];
|
|
79
|
+
/**
|
|
80
|
+
* Locate a Codex rollout transcript. Rollouts live under
|
|
81
|
+
* ~/.codex/sessions/YYYY/MM/DD/rollout-<ts>-<uuid>.jsonl. When sessionId is
|
|
82
|
+
* known, match it in the filename or the session_meta header; otherwise pick the
|
|
83
|
+
* newest rollout whose session_meta cwd matches, falling back to the newest
|
|
84
|
+
* rollout overall.
|
|
85
|
+
*/
|
|
86
|
+
export declare function locateCodexTranscript(cwd: string, sessionId: string | null): string | null;
|
|
87
|
+
/**
|
|
88
|
+
* Codex billing basis: API key (env OPENAI_API_KEY, or an api-key entry in
|
|
89
|
+
* ~/.codex/auth.json) => real metered dollars; "Sign in with ChatGPT" (OAuth
|
|
90
|
+
* tokens, no api key) => subscription/imputed. Defaults to 'imputed' when the
|
|
91
|
+
* auth config can't be read.
|
|
92
|
+
*/
|
|
93
|
+
export declare function codexCostBasis(): 'real' | 'imputed';
|
|
58
94
|
/**
|
|
59
95
|
* Real metered billing vs subscription-imputed, read from the live Gemini auth
|
|
60
96
|
* config: an explicit API key means real dollars; OAuth (personal account)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-usage.d.ts","sourceRoot":"","sources":["../../src/core/transcript-usage.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAgCnE;AA4BD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAgCnE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAe3F;AAED,mFAAmF;AACnF,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAmC3F;AAUD;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAOpD"}
|
|
1
|
+
{"version":3,"file":"transcript-usage.d.ts","sourceRoot":"","sources":["../../src/core/transcript-usage.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAgCnE;AA4BD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAgCnE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAe3F;AAED,mFAAmF;AACnF,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAmC3F;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAqClE;AA2CD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAuC1F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAgBnD;AAUD;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAOpD"}
|
|
@@ -187,6 +187,196 @@ export function locateGeminiTranscript(cwd, sessionId) {
|
|
|
187
187
|
.map((f) => join(chatsDir, f))
|
|
188
188
|
.sort((a, b) => statMtime(b) - statMtime(a))[0] ?? null;
|
|
189
189
|
}
|
|
190
|
+
function codexHome() {
|
|
191
|
+
return process.env.CODEX_HOME || join(homedir(), '.codex');
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Parse a Codex CLI rollout transcript (JSONL) into per-model token totals.
|
|
195
|
+
*
|
|
196
|
+
* Codex writes one rollout file per session under ~/.codex/sessions/YYYY/MM/DD/.
|
|
197
|
+
* Each line is `{ timestamp, type, payload }`. Token usage arrives in
|
|
198
|
+
* `token_count` event payloads carrying `info.total_token_usage` — a CUMULATIVE
|
|
199
|
+
* running total for the whole session (NOT a per-turn delta). So we take the
|
|
200
|
+
* LAST total_token_usage we see rather than summing (summing cumulative totals
|
|
201
|
+
* would massively overcount). The model is read from the session_meta /
|
|
202
|
+
* turn_context line(s); the most recent wins.
|
|
203
|
+
*
|
|
204
|
+
* Codex `TokenUsage` keys map straight onto model_api's OpenAI pricing
|
|
205
|
+
* convention (input_tokens is cache-INCLUSIVE, output_tokens is
|
|
206
|
+
* reasoning-INCLUSIVE — model_api subtracts the subsets itself), so we forward
|
|
207
|
+
* the raw cumulative values:
|
|
208
|
+
* input_tokens <- input_tokens (incl. cached)
|
|
209
|
+
* cache_read_input_tokens<- cached_input_tokens
|
|
210
|
+
* output_tokens <- output_tokens (incl. reasoning)
|
|
211
|
+
* reasoning_tokens <- reasoning_output_tokens
|
|
212
|
+
*/
|
|
213
|
+
export function parseCodexTranscript(content) {
|
|
214
|
+
let model = 'unknown';
|
|
215
|
+
let lastUsage = null;
|
|
216
|
+
let lastTimestamp;
|
|
217
|
+
for (const line of content.split('\n')) {
|
|
218
|
+
const trimmed = line.trim();
|
|
219
|
+
if (!trimmed)
|
|
220
|
+
continue;
|
|
221
|
+
let obj;
|
|
222
|
+
try {
|
|
223
|
+
obj = JSON.parse(trimmed);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const ts = obj.timestamp;
|
|
229
|
+
const m = findModel(obj);
|
|
230
|
+
if (m)
|
|
231
|
+
model = m;
|
|
232
|
+
const usage = findTotalTokenUsage(obj);
|
|
233
|
+
if (usage) {
|
|
234
|
+
lastUsage = usage;
|
|
235
|
+
if (typeof ts === 'string')
|
|
236
|
+
lastTimestamp = ts;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (!lastUsage)
|
|
240
|
+
return [];
|
|
241
|
+
return [{
|
|
242
|
+
model,
|
|
243
|
+
input_tokens: num(lastUsage.input_tokens),
|
|
244
|
+
output_tokens: num(lastUsage.output_tokens),
|
|
245
|
+
cache_read_input_tokens: num(lastUsage.cached_input_tokens),
|
|
246
|
+
reasoning_tokens: num(lastUsage.reasoning_output_tokens),
|
|
247
|
+
usage_at: lastTimestamp,
|
|
248
|
+
}];
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Deep-search for the LAST object that looks like a Codex config carrying a
|
|
252
|
+
* model name — session_meta / turn_context payloads have `model` alongside
|
|
253
|
+
* config-ish siblings (cwd, model_provider, model_context_window, …). We avoid
|
|
254
|
+
* picking up a stray `model` on an unrelated object by requiring one of those
|
|
255
|
+
* siblings; falling back to any `model` string only if nothing better is found.
|
|
256
|
+
*/
|
|
257
|
+
function findModel(root) {
|
|
258
|
+
let strong = null;
|
|
259
|
+
let weak = null;
|
|
260
|
+
const visit = (x) => {
|
|
261
|
+
if (!x || typeof x !== 'object')
|
|
262
|
+
return;
|
|
263
|
+
if (Array.isArray(x)) {
|
|
264
|
+
x.forEach(visit);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const obj = x;
|
|
268
|
+
if (typeof obj.model === 'string' && obj.model) {
|
|
269
|
+
const configish = ['cwd', 'model_provider', 'model_context_window', 'instructions', 'reasoning_effort']
|
|
270
|
+
.some((k) => k in obj);
|
|
271
|
+
if (configish)
|
|
272
|
+
strong = obj.model;
|
|
273
|
+
else
|
|
274
|
+
weak ??= obj.model;
|
|
275
|
+
}
|
|
276
|
+
for (const key of Object.keys(obj))
|
|
277
|
+
visit(obj[key]);
|
|
278
|
+
};
|
|
279
|
+
visit(root);
|
|
280
|
+
return strong ?? weak;
|
|
281
|
+
}
|
|
282
|
+
/** Deep-search for a cumulative `total_token_usage` block, if present. */
|
|
283
|
+
function findTotalTokenUsage(root) {
|
|
284
|
+
let found = null;
|
|
285
|
+
const visit = (x) => {
|
|
286
|
+
if (!x || typeof x !== 'object')
|
|
287
|
+
return;
|
|
288
|
+
if (Array.isArray(x)) {
|
|
289
|
+
x.forEach(visit);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const obj = x;
|
|
293
|
+
const ttu = obj.total_token_usage;
|
|
294
|
+
if (ttu && typeof ttu === 'object')
|
|
295
|
+
found = ttu;
|
|
296
|
+
for (const key of Object.keys(obj))
|
|
297
|
+
visit(obj[key]);
|
|
298
|
+
};
|
|
299
|
+
visit(root);
|
|
300
|
+
return found;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Locate a Codex rollout transcript. Rollouts live under
|
|
304
|
+
* ~/.codex/sessions/YYYY/MM/DD/rollout-<ts>-<uuid>.jsonl. When sessionId is
|
|
305
|
+
* known, match it in the filename or the session_meta header; otherwise pick the
|
|
306
|
+
* newest rollout whose session_meta cwd matches, falling back to the newest
|
|
307
|
+
* rollout overall.
|
|
308
|
+
*/
|
|
309
|
+
export function locateCodexTranscript(cwd, sessionId) {
|
|
310
|
+
const sessionsDir = join(codexHome(), 'sessions');
|
|
311
|
+
if (!existsSync(sessionsDir))
|
|
312
|
+
return null;
|
|
313
|
+
let files;
|
|
314
|
+
try {
|
|
315
|
+
files = readdirSync(sessionsDir, { recursive: true })
|
|
316
|
+
.map((f) => String(f))
|
|
317
|
+
.filter((f) => f.endsWith('.jsonl'))
|
|
318
|
+
.map((f) => join(sessionsDir, f));
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
if (files.length === 0)
|
|
324
|
+
return null;
|
|
325
|
+
if (sessionId) {
|
|
326
|
+
const byName = files.find((f) => f.includes(sessionId));
|
|
327
|
+
if (byName)
|
|
328
|
+
return byName;
|
|
329
|
+
for (const f of files) {
|
|
330
|
+
try {
|
|
331
|
+
const firstLine = readFileSync(f, 'utf8').split('\n', 1)[0];
|
|
332
|
+
const header = JSON.parse(firstLine);
|
|
333
|
+
if (header.id === sessionId || header.payload?.id === sessionId)
|
|
334
|
+
return f;
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// unreadable header — keep scanning
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const byMtime = files.sort((a, b) => statMtime(b) - statMtime(a));
|
|
342
|
+
const matchingCwd = byMtime.find((f) => {
|
|
343
|
+
try {
|
|
344
|
+
const firstLine = readFileSync(f, 'utf8').split('\n', 1)[0];
|
|
345
|
+
return firstLine.includes(`"cwd":"${cwd}"`) || firstLine.includes(`"cwd": "${cwd}"`);
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
return matchingCwd ?? byMtime[0] ?? null;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Codex billing basis: API key (env OPENAI_API_KEY, or an api-key entry in
|
|
355
|
+
* ~/.codex/auth.json) => real metered dollars; "Sign in with ChatGPT" (OAuth
|
|
356
|
+
* tokens, no api key) => subscription/imputed. Defaults to 'imputed' when the
|
|
357
|
+
* auth config can't be read.
|
|
358
|
+
*/
|
|
359
|
+
export function codexCostBasis() {
|
|
360
|
+
if (process.env.OPENAI_API_KEY)
|
|
361
|
+
return 'real';
|
|
362
|
+
try {
|
|
363
|
+
// codex auth.json (validated against codex-cli 0.141.0):
|
|
364
|
+
// { auth_mode: 'chatgpt' | 'apikey', OPENAI_API_KEY: string|null, tokens, ... }
|
|
365
|
+
const auth = JSON.parse(readFileSync(join(codexHome(), 'auth.json'), 'utf8'));
|
|
366
|
+
if (auth.auth_mode === 'apikey')
|
|
367
|
+
return 'real';
|
|
368
|
+
if (auth.auth_mode === 'chatgpt')
|
|
369
|
+
return 'imputed';
|
|
370
|
+
if (auth.OPENAI_API_KEY)
|
|
371
|
+
return 'real';
|
|
372
|
+
if (auth.tokens)
|
|
373
|
+
return 'imputed';
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
// fall through
|
|
377
|
+
}
|
|
378
|
+
return 'imputed';
|
|
379
|
+
}
|
|
190
380
|
function statMtime(path) {
|
|
191
381
|
try {
|
|
192
382
|
return statSync(path).mtimeMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-usage.js","sourceRoot":"","sources":["../../src/core/transcript-usage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transcript-usage.js","sourceRoot":"","sources":["../../src/core/transcript-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/register-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,UAAU,QAAQ;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"register-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/register-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,UAAU,QAAQ;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAiCD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,6BAA6B,EACxC,IAAI,EAAE,QAAQ,GACb,IAAI,CAkgCN"}
|
|
@@ -17,7 +17,8 @@ function getSessionForTransport(transport, sessionManager) {
|
|
|
17
17
|
function getAgentPrefix(session) {
|
|
18
18
|
switch (session.agentProvider) {
|
|
19
19
|
case 'gemini': return '**[Gemini]**';
|
|
20
|
-
case '
|
|
20
|
+
case 'codex':
|
|
21
|
+
case 'openai': return '**[Codex]**'; // 'openai' is the legacy alias for the Codex CLI
|
|
21
22
|
default: return '**[Claude Code]**';
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -138,6 +139,12 @@ export function registerTools(server, transport, deps) {
|
|
|
138
139
|
if (agentSession) {
|
|
139
140
|
session.agentSessionId = agentSession.id;
|
|
140
141
|
setAgentStatus(session, 'agent_session_idle', dsiloedClient);
|
|
142
|
+
// Persist which coding agent this conversation runs so a later restart
|
|
143
|
+
// (auto-launch on inbound) relaunches with the SAME provider instead of
|
|
144
|
+
// the daemon default — e.g. a Codex conversation stays Codex.
|
|
145
|
+
if (session.agentProvider) {
|
|
146
|
+
dsiloedClient.mergeAgentSessionMetadata(agentSession.id, { coding_agent: session.agentProvider }, agentSession.metadata).catch(() => { });
|
|
147
|
+
}
|
|
141
148
|
// Sync workspace metadata if a worktree exists for this conversation.
|
|
142
149
|
// Match by conversation ID first (deterministic), then fall back to
|
|
143
150
|
// unclaimed workspace from the launcher's temp session ID.
|