vg-coder-cli 2.0.52 → 2.0.53

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vg-coder-cli",
3
- "version": "2.0.52",
3
+ "version": "2.0.53",
4
4
  "description": "🚀 CLI tool to analyze projects, concatenate source files, count tokens, and export HTML with syntax highlighting and copy functionality",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -415,7 +415,10 @@ class TaskQueue {
415
415
  return;
416
416
  }
417
417
  task.status = 'done';
418
- task.result = { chatId: payload?.chatId || null };
418
+ task.result = {
419
+ chatId: payload?.chatId || null,
420
+ actualModel: payload?.actualModel || null,
421
+ };
419
422
  task.timing.finishedAt = Date.now();
420
423
  task.timing.durationMs = task.timing.finishedAt - (task.timing.startedAt || task.timing.createdAt);
421
424
  await store.writeResult(task.workingDir, task.id, payload?.markdown || '');
@@ -198,6 +198,39 @@ function throwIfRateLimited(stage = '') {
198
198
  }
199
199
  }
200
200
 
201
+ // Đọc model ID thật từ AI Studio sidebar — bắt được redirect AI Studio làm khi
202
+ // account thiếu access tới preview model (vd request gemini-3-pro-preview, run
203
+ // thật trên gemini-3-flash-preview). URL param không reliable vì AI Studio
204
+ // không update URL khi fallback. Sidebar `<ms-model-selector>` mới là source-
205
+ // of-truth.
206
+ //
207
+ // Strategy: thử đọc DOM sẵn trước (zero side-effect). Nếu panel chưa render —
208
+ // click toggle "Run settings" để mở, đọc, rồi click lại để khôi phục state ban
209
+ // đầu. Không throw — fail thì return null, caller chấp nhận `actualModel: null`.
210
+ async function readActualModel() {
211
+ try {
212
+ // Fast path: panel đã mở (worker tab đã chạy task → AI Studio thường giữ panel open)
213
+ let selector = document.querySelector('ms-model-selector');
214
+ if (selector) {
215
+ const name = selector.querySelector('[data-test-id="model-name"]')?.innerText?.trim();
216
+ if (name) return name;
217
+ }
218
+ // Slow path: toggle panel mở. Lưu state để restore sau khi đọc xong.
219
+ const toggle = document.querySelector('[aria-label="Toggle run settings panel"]');
220
+ if (!toggle) return null;
221
+ toggle.click();
222
+ await new Promise(r => setTimeout(r, 800));
223
+ selector = document.querySelector('ms-model-selector');
224
+ const name = selector?.querySelector('[data-test-id="model-name"]')?.innerText?.trim() || null;
225
+ // Đóng panel lại để không thay đổi UX (panel mở/đóng visible qua noVNC).
226
+ toggle.click();
227
+ return name;
228
+ } catch (err) {
229
+ console.warn('[TaskWorker] readActualModel failed:', err?.message);
230
+ return null;
231
+ }
232
+ }
233
+
201
234
  async function handleTaskExecute(payload) {
202
235
  const { taskId, prompt, files = [] } = payload || {};
203
236
  if (!taskId) return;
@@ -251,6 +284,7 @@ async function handleTaskExecute(payload) {
251
284
 
252
285
  const markdown = await window.AIChat.copyLastTurnAsMarkdown();
253
286
  const chatId = window.AIChat.getChatIdFromUrl?.() || null;
287
+ const actualModel = await readActualModel();
254
288
 
255
289
  if (cancelFlags.has(taskId)) {
256
290
  cancelFlags.delete(taskId);
@@ -258,8 +292,8 @@ async function handleTaskExecute(payload) {
258
292
  return;
259
293
  }
260
294
 
261
- socket.emit('task:complete', { taskId, markdown, chatId });
262
- console.log(`[TaskWorker] Completed ${taskId}`);
295
+ socket.emit('task:complete', { taskId, markdown, chatId, actualModel });
296
+ console.log(`[TaskWorker] Completed ${taskId} (model=${actualModel || 'unknown'})`);
263
297
  } catch (err) {
264
298
  console.error(`[TaskWorker] Failed ${taskId}:`, err);
265
299
  socket.emit('task:failed', {