@16pxh/cli-bridge 1.0.7 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/claude.mjs +17 -0
- package/lib/server.mjs +15 -1
- package/package.json +1 -1
package/lib/claude.mjs
CHANGED
|
@@ -45,6 +45,12 @@ export function runPrompt(prompt, { sessionId } = {}) {
|
|
|
45
45
|
child.on('close', (code) => {
|
|
46
46
|
if (activeProcess === child) activeProcess = null;
|
|
47
47
|
|
|
48
|
+
// Retry without session if session expired
|
|
49
|
+
if (code !== 0 && sessionId && stderr.includes('No conversation found')) {
|
|
50
|
+
resolve(runPrompt(prompt, {}));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
48
54
|
if (code !== 0) {
|
|
49
55
|
return reject(new Error(`Claude CLI exited with code ${code}: ${stderr.trim()}`));
|
|
50
56
|
}
|
|
@@ -60,6 +66,8 @@ export function runPrompt(prompt, { sessionId } = {}) {
|
|
|
60
66
|
result: parsed.result ?? parsed.content ?? '',
|
|
61
67
|
session_id: parsed.session_id ?? '',
|
|
62
68
|
duration_ms: parsed.duration_ms ?? 0,
|
|
69
|
+
usage: parsed.usage ?? null,
|
|
70
|
+
cost_usd: parsed.total_cost_usd ?? 0,
|
|
63
71
|
});
|
|
64
72
|
});
|
|
65
73
|
|
|
@@ -106,6 +114,13 @@ export function runEditFiles(prompt, files, { sessionId } = {}) {
|
|
|
106
114
|
child.on('close', (code) => {
|
|
107
115
|
if (activeProcess === child) activeProcess = null;
|
|
108
116
|
|
|
117
|
+
// Retry without session if session expired
|
|
118
|
+
if (code !== 0 && sessionId && stderr.includes('No conversation found')) {
|
|
119
|
+
cleanup();
|
|
120
|
+
resolve(runEditFiles(prompt, files, {}));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
109
124
|
if (code !== 0) {
|
|
110
125
|
cleanup();
|
|
111
126
|
return reject(new Error(`Claude CLI exited with code ${code}: ${stderr.trim()}`));
|
|
@@ -132,6 +147,8 @@ export function runEditFiles(prompt, files, { sessionId } = {}) {
|
|
|
132
147
|
result: parsed.result ?? '',
|
|
133
148
|
session_id: parsed.session_id ?? '',
|
|
134
149
|
duration_ms: parsed.duration_ms ?? 0,
|
|
150
|
+
usage: parsed.usage ?? null,
|
|
151
|
+
cost_usd: parsed.total_cost_usd ?? 0,
|
|
135
152
|
});
|
|
136
153
|
} catch (err) {
|
|
137
154
|
cleanup();
|
package/lib/server.mjs
CHANGED
|
@@ -40,6 +40,18 @@ function logRequest(method, path, status, extra = '') {
|
|
|
40
40
|
);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
function logTokens(usage, costUsd) {
|
|
44
|
+
if (!usage) return;
|
|
45
|
+
const input = usage.input_tokens ?? 0;
|
|
46
|
+
const output = usage.output_tokens ?? 0;
|
|
47
|
+
const cacheRead = usage.cache_read_input_tokens ?? 0;
|
|
48
|
+
const cacheCreate = usage.cache_creation_input_tokens ?? 0;
|
|
49
|
+
const cost = typeof costUsd === 'number' ? `$${costUsd.toFixed(4)}` : '';
|
|
50
|
+
console.log(
|
|
51
|
+
`${c.dim}${timestamp()}${c.reset} ${c.dim}tokens: in=${input} out=${output} cache_read=${cacheRead} cache_create=${cacheCreate} ${cost}${c.reset}`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
43
55
|
const CORS_HEADERS = {
|
|
44
56
|
'Access-Control-Allow-Origin': '*',
|
|
45
57
|
'Access-Control-Allow-Headers': 'x-bridge-token, content-type',
|
|
@@ -162,9 +174,10 @@ export function startServer() {
|
|
|
162
174
|
}
|
|
163
175
|
|
|
164
176
|
try {
|
|
165
|
-
const { result, session_id: responseSessionId, duration_ms } = await runPrompt(fullPrompt, { sessionId: session_id });
|
|
177
|
+
const { result, session_id: responseSessionId, duration_ms, usage, cost_usd } = await runPrompt(fullPrompt, { sessionId: session_id });
|
|
166
178
|
const resultPreview = truncateChars(result, 64);
|
|
167
179
|
logRequest('POST', '/prompt', 200, `${c.dim}${duration_ms}ms${c.reset}`);
|
|
180
|
+
logTokens(usage, cost_usd);
|
|
168
181
|
console.log(`${c.dim}${timestamp()}${c.reset} ${c.green}←${c.reset} ${c.dim}${resultPreview}${c.reset}`);
|
|
169
182
|
json(res, 200, { success: true, result, session_id: responseSessionId, duration_ms });
|
|
170
183
|
} catch (err) {
|
|
@@ -208,6 +221,7 @@ export function startServer() {
|
|
|
208
221
|
);
|
|
209
222
|
|
|
210
223
|
logRequest('POST', '/edit-files', 200, `${c.dim}${result.duration_ms}ms${c.reset}`);
|
|
224
|
+
logTokens(result.usage, result.cost_usd);
|
|
211
225
|
console.log(`${c.dim}${timestamp()}${c.reset} ${c.green}← edit done${c.reset}`);
|
|
212
226
|
|
|
213
227
|
json(res, 200, {
|