@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 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, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@16pxh/cli-bridge",
3
- "version": "1.0.7",
3
+ "version": "1.1.0",
4
4
  "description": "Bridge local Claude CLI to 16pxh AI features",
5
5
  "type": "module",
6
6
  "bin": {