paseo-acp-agy 1.2.8 → 1.2.10

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.
@@ -31,7 +31,7 @@ export function loadNativeAntigravitySessions(cwd) {
31
31
  .prepare(`SELECT conversation_id, title, preview, last_modified_time, workspace_uris
32
32
  FROM conversation_summaries
33
33
  ORDER BY last_modified_time DESC
34
- LIMIT 200`)
34
+ LIMIT 100`)
35
35
  .all();
36
36
  for (const row of rows) {
37
37
  if (!row.conversation_id)
@@ -77,34 +77,40 @@ export function loadNativeAntigravitySessions(cwd) {
77
77
  }
78
78
  }
79
79
  }
80
- // Fallback: Also scan brainDir for any conversation not in DB
81
- try {
82
- const brainDir = path.join(appDataDir, "brain");
83
- if (fs.existsSync(brainDir)) {
84
- const entries = fs.readdirSync(brainDir, { withFileTypes: true });
85
- for (const entry of entries) {
86
- if (!entry.isDirectory())
87
- continue;
88
- const convId = entry.name;
89
- if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(convId)) {
90
- continue;
91
- }
92
- if (results.some((r) => r.sessionId === convId))
93
- continue;
94
- const transcriptPath = path.join(brainDir, convId, ".system_generated", "logs", "transcript.jsonl");
95
- if (fs.existsSync(transcriptPath)) {
96
- const stat = fs.statSync(transcriptPath);
97
- results.push({
98
- sessionId: convId,
99
- cwd: process.cwd(),
100
- title: "Antigravity Session",
101
- updatedAt: stat.mtime.toISOString(),
102
- });
80
+ // Fallback: Only scan brainDir if no conversations were found in DB
81
+ if (results.length === 0) {
82
+ try {
83
+ const brainDir = path.join(appDataDir, "brain");
84
+ if (fs.existsSync(brainDir)) {
85
+ const entries = fs.readdirSync(brainDir, { withFileTypes: true });
86
+ for (const entry of entries) {
87
+ if (!entry.isDirectory())
88
+ continue;
89
+ const convId = entry.name;
90
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(convId)) {
91
+ continue;
92
+ }
93
+ if (results.some((r) => r.sessionId === convId))
94
+ continue;
95
+ const transcriptPath = path.join(brainDir, convId, ".system_generated", "logs", "transcript.jsonl");
96
+ if (fs.existsSync(transcriptPath)) {
97
+ const stat = fs.statSync(transcriptPath);
98
+ if (stat.size > 0) {
99
+ results.push({
100
+ sessionId: convId,
101
+ cwd: process.cwd(),
102
+ title: "Antigravity Session",
103
+ updatedAt: stat.mtime.toISOString(),
104
+ });
105
+ if (results.length >= 50)
106
+ break;
107
+ }
108
+ }
103
109
  }
104
110
  }
105
111
  }
112
+ catch { }
106
113
  }
107
- catch { }
108
114
  return results;
109
115
  }
110
116
  export function getNativeAntigravitySession(conversationId) {
@@ -444,7 +444,7 @@ export class AntigravityQuotaProvider {
444
444
  let remainingPct = null;
445
445
  let resetsAt = null;
446
446
 
447
- const m = trimmed.match(/^(.*?)\\s{2,}(.*?Remaining)\\s+(\\d+)%(?:\\s+(.*))?$/i);
447
+ const m = trimmed.match(/^(.*?)\\s{2,}(.*?)\\s+(\\d+)%(?:\\s+(.*))?$/i);
448
448
  if (m) {
449
449
  scope = m[1].trim();
450
450
  limitType = m[2].trim();
@@ -477,13 +477,18 @@ export class AntigravityQuotaProvider {
477
477
 
478
478
  if (remainingPct !== null && !isNaN(remainingPct)) {
479
479
  const usedPct = Math.max(0, Math.min(100, 100 - remainingPct));
480
- const isFiveHour = /five\\s*hour/i.test(limitType);
481
- const isWeekly = /weekly/i.test(limitType);
482
- const isGemini = /gemini/i.test(scope);
480
+ const isFiveHour = /session|five\\s*hour|5-?hour|5h/i.test(limitType);
481
+ const isWeekly = /week|7-?day/i.test(limitType);
482
+ const isArgon = /argon/i.test(scope) || /argon/i.test(limitType);
483
+ const isClaude = /claude|gpt/i.test(scope);
484
+ const isGemini = (/gemini/i.test(scope) || !isClaude) && !isArgon;
483
485
 
484
486
  let id = isFiveHour ? "session" : isWeekly ? "weekly" : "quota";
485
487
  let label = isFiveHour ? "Session" : isWeekly ? "Weekly" : limitType.replace(/\\s+Remaining$/i, "");
486
- if (!isGemini) {
488
+ if (isArgon) {
489
+ id = \`argon_\${id}\`;
490
+ label = \`Gemini 4 Argon \${isFiveHour ? "Session" : isWeekly ? "Weekly" : limitType.replace(/\\s+Remaining$/i, "").replace(/^Gemini 4 Argon\\s+/i, "")}\`;
491
+ } else if (!isGemini) {
487
492
  id = \`claude_\${id}\`;
488
493
  label = \`Claude \${label}\`;
489
494
  }
@@ -496,16 +501,18 @@ export class AntigravityQuotaProvider {
496
501
  tone: toneFromUsedPct(usedPct),
497
502
  isFiveHour,
498
503
  isGemini,
504
+ isArgon,
499
505
  });
500
506
  }
501
507
  }
502
508
 
503
509
  rawWindows.sort((a, b) => {
504
- if (a.isGemini && !b.isGemini) return -1;
505
- if (!a.isGemini && b.isGemini) return 1;
506
- if (a.isFiveHour && !b.isFiveHour) return -1;
507
- if (!a.isFiveHour && b.isFiveHour) return 1;
508
- return 0;
510
+ const score = (w) => {
511
+ if (w.isGemini && !w.isArgon) return w.isFiveHour ? 1 : 2;
512
+ if (w.isArgon) return w.isFiveHour ? 3 : 4;
513
+ return w.isFiveHour ? 5 : 6;
514
+ };
515
+ return score(a) - score(b);
509
516
  });
510
517
 
511
518
  const windows = rawWindows.map(w => windowFromUsedPct(w));
@@ -724,7 +731,7 @@ export async function fetchAntigravityUsage() {
724
731
  let resetsAt = null;
725
732
 
726
733
  // Format 1: Table format e.g. "Gemini Models Weekly Limit Remaining 56% 2026-10-14 04:37 UTC"
727
- const m = line.match(/^(.*?)\\s{2,}(.*?Remaining)\\s+(\\d+)%(?:\\s+(.*))?$/i);
734
+ const m = line.match(/^(.*?)\\s{2,}(.*?)\\s+(\\d+)%(?:\\s+(.*))?$/i);
728
735
  if (m) {
729
736
  scope = m[1].trim();
730
737
  limitType = m[2].trim();
@@ -738,7 +745,7 @@ export async function fetchAntigravityUsage() {
738
745
  } else {
739
746
  // Format 2: Tab / multi-space separated
740
747
  const parts = line.split(/\\t+|\\s{2,}/).map(p => p.trim());
741
- if (parts.length >= 3 && parts[1]?.toLowerCase().includes("remaining")) {
748
+ if (parts.length >= 3) {
742
749
  scope = parts[0];
743
750
  limitType = parts[1];
744
751
  const remMatch = parts[2].match(/(\\d+)%/);
@@ -779,11 +786,16 @@ export async function fetchAntigravityUsage() {
779
786
  const usedPct = Math.max(0, Math.min(100, 100 - remainingPct));
780
787
  const isFiveHour = /session|five\\s*hour|5-?hour|5h/i.test(limitType);
781
788
  const isWeekly = /week|7-?day/i.test(limitType);
782
- const isGemini = /gemini/i.test(scope) || !/claude/i.test(scope);
789
+ const isArgon = /argon/i.test(scope) || /argon/i.test(limitType);
790
+ const isClaude = /claude|gpt/i.test(scope);
791
+ const isGemini = (/gemini/i.test(scope) || !isClaude) && !isArgon;
783
792
 
784
793
  let id = isFiveHour ? "session" : isWeekly ? "weekly" : "quota";
785
794
  let label = isFiveHour ? "Session" : isWeekly ? "Weekly" : limitType.replace(/\\s+Remaining$/i, "");
786
- if (!isGemini) {
795
+ if (isArgon) {
796
+ id = \`argon_\${id}\`;
797
+ label = \`Gemini 4 Argon \${isFiveHour ? "Session" : isWeekly ? "Weekly" : limitType.replace(/\\s+Remaining$/i, "").replace(/^Gemini 4 Argon\\s+/i, "")}\`;
798
+ } else if (!isGemini) {
787
799
  id = \`claude_\${id}\`;
788
800
  label = \`Claude \${label}\`;
789
801
  }
@@ -791,7 +803,7 @@ export async function fetchAntigravityUsage() {
791
803
  rawWindows.push({
792
804
  id,
793
805
  label,
794
- shortLabel: isFiveHour ? "5h" : isWeekly ? "wk" : "",
806
+ shortLabel: isFiveHour ? "5h" : isWeekly ? "wk" : isArgon ? "Argon" : "",
795
807
  summary: true,
796
808
  usedPct,
797
809
  remainingPct,
@@ -799,16 +811,18 @@ export async function fetchAntigravityUsage() {
799
811
  tone: toneFromUsedPct(usedPct),
800
812
  isFiveHour,
801
813
  isGemini,
814
+ isArgon,
802
815
  });
803
816
  }
804
817
  }
805
818
 
806
819
  rawWindows.sort((a, b) => {
807
- if (a.isGemini && !b.isGemini) return -1;
808
- if (!a.isGemini && b.isGemini) return 1;
809
- if (a.isFiveHour && !b.isFiveHour) return -1;
810
- if (!a.isFiveHour && b.isFiveHour) return 1;
811
- return 0;
820
+ const score = (w) => {
821
+ if (w.isGemini && !w.isArgon) return w.isFiveHour ? 1 : 2;
822
+ if (w.isArgon) return w.isFiveHour ? 3 : 4;
823
+ return w.isFiveHour ? 5 : 6;
824
+ };
825
+ return score(a) - score(b);
812
826
  });
813
827
 
814
828
  const windows = rawWindows.map(w => ({
package/dist/protocol.js CHANGED
@@ -137,6 +137,7 @@ export function extractPromptText(promptInput) {
137
137
  return "Please continue.";
138
138
  }
139
139
  export const MODEL_PRICING = {
140
+ "gemini-4-argon": { inputCostPerM: 1.25, outputCostPerM: 5.00, cachedInputCostPerM: 0.3125 },
140
141
  "gemini-3.8-flash": { inputCostPerM: 0.10, outputCostPerM: 0.40, cachedInputCostPerM: 0.025 },
141
142
  "gemini-3.7-flash": { inputCostPerM: 0.10, outputCostPerM: 0.40, cachedInputCostPerM: 0.025 },
142
143
  "gemini-3.6-flash": { inputCostPerM: 0.10, outputCostPerM: 0.40, cachedInputCostPerM: 0.025 },
@@ -148,6 +149,7 @@ export const MODEL_PRICING = {
148
149
  "gpt-oss-120b": { inputCostPerM: 0.15, outputCostPerM: 0.60, cachedInputCostPerM: 0.0375 },
149
150
  };
150
151
  export const MODEL_CONTEXT_WINDOWS = {
152
+ "gemini-4-argon": 1_048_576,
151
153
  "gemini-3.8-flash": 1_048_576,
152
154
  "gemini-3.7-flash": 1_048_576,
153
155
  "gemini-3.6-flash": 1_048_576,
@@ -164,6 +166,8 @@ export function getModelContextWindow(modelId) {
164
166
  if (MODEL_CONTEXT_WINDOWS[modelId])
165
167
  return MODEL_CONTEXT_WINDOWS[modelId];
166
168
  const lower = modelId.toLowerCase();
169
+ if (lower.includes("argon"))
170
+ return 1_048_576;
167
171
  if (lower.includes("pro"))
168
172
  return 2_097_152;
169
173
  if (lower.includes("claude"))
@@ -180,6 +184,8 @@ export function getModelPricing(modelId) {
180
184
  if (MODEL_PRICING[modelId])
181
185
  return MODEL_PRICING[modelId];
182
186
  const lower = modelId.toLowerCase();
187
+ if (lower.includes("argon"))
188
+ return MODEL_PRICING["gemini-4-argon"];
183
189
  if (lower.includes("opus"))
184
190
  return MODEL_PRICING["claude-opus-4-6-thinking"];
185
191
  if (lower.includes("claude") || lower.includes("sonnet"))
@@ -225,7 +231,7 @@ export function parseAgyQuotaOutput(raw) {
225
231
  let limitType = "";
226
232
  let remainingMatch = null;
227
233
  let resetsAt = null;
228
- const m = trimmed.match(/^(.*?)\s{2,}(.*?Remaining)\s+(\d+%)(?:\s+(.*))?$/i);
234
+ const m = trimmed.match(/^(.*?)\s{2,}(.*?)\s+(\d+%)(?:\s+(.*))?$/i);
229
235
  if (m) {
230
236
  scope = m[1].trim();
231
237
  limitType = m[2].trim();
@@ -244,12 +250,18 @@ export function parseAgyQuotaOutput(raw) {
244
250
  if (remainingMatch) {
245
251
  const remainingPct = parseInt(remainingMatch[1], 10);
246
252
  const usedPct = Math.max(0, Math.min(100, 100 - remainingPct));
247
- const isFiveHour = /five\s*hour/i.test(limitType);
248
- const isWeekly = /weekly/i.test(limitType);
249
- const isGemini = /gemini/i.test(scope);
253
+ const isFiveHour = /session|five\s*hour|5-?hour|5h/i.test(limitType);
254
+ const isWeekly = /week|7-?day/i.test(limitType);
255
+ const isArgon = /argon/i.test(scope) || /argon/i.test(limitType);
256
+ const isClaude = /claude|gpt/i.test(scope);
257
+ const isGemini = (/gemini/i.test(scope) || !isClaude) && !isArgon;
250
258
  let id = isFiveHour ? "session" : isWeekly ? "weekly" : "quota";
251
259
  let label = isFiveHour ? "Session (5h)" : isWeekly ? "Weekly" : limitType;
252
- if (!isGemini) {
260
+ if (isArgon) {
261
+ id = `argon_${id}`;
262
+ label = `Gemini 4 Argon ${isFiveHour ? "Session (5h)" : isWeekly ? "Weekly" : limitType.replace(/^Gemini 4 Argon\s+/i, "")}`;
263
+ }
264
+ else if (!isGemini) {
253
265
  id = `claude_${id}`;
254
266
  label = `Claude ${label}`;
255
267
  }
@@ -394,6 +406,7 @@ export const ALL_THINKING_LEVELS = {
394
406
  high: { name: "High", description: "Deep reasoning effort for complex tasks" },
395
407
  };
396
408
  export const FALLBACK_MODELS = [
409
+ { modelId: "gemini-4-argon", name: "Gemini 4 Argon", description: "Google Gemini 4 Argon", supportedEfforts: ["high", "medium", "low"], contextWindowMaxTokens: 1_048_576 },
397
410
  { modelId: "gemini-3.8-flash", name: "Gemini 3.8 Flash", description: "Google Gemini 3.8 Flash", supportedEfforts: ["high", "medium", "low"], contextWindowMaxTokens: 1_048_576 },
398
411
  { modelId: "gemini-3.7-flash", name: "Gemini 3.7 Flash", description: "Google Gemini 3.7 Flash", supportedEfforts: ["high", "medium", "low"], contextWindowMaxTokens: 1_048_576 },
399
412
  { modelId: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Google Gemini 3.6 Flash", supportedEfforts: ["high", "medium", "low"], contextWindowMaxTokens: 1_048_576 },
@@ -116,6 +116,13 @@ export class SessionStore {
116
116
  const parsed = JSON.parse(content);
117
117
  if (!parsed.sessionId)
118
118
  continue;
119
+ // Skip untitled placeholder sessions that have neither conversationId nor any recorded usage
120
+ const hasTitle = Boolean(parsed.title && parsed.title.trim());
121
+ const hasConv = Boolean(parsed.conversationId);
122
+ const hasUsage = Boolean(parsed.usage && (parsed.usage.totalTokens > 0 || parsed.usage.inputTokens > 0));
123
+ if (!hasTitle && !hasConv && !hasUsage) {
124
+ continue;
125
+ }
119
126
  if (normalizedTargetCwd && parsed.cwd) {
120
127
  const sessionCwd = path.resolve(parsed.cwd).toLowerCase();
121
128
  if (sessionCwd !== normalizedTargetCwd)
package/dist/session.js CHANGED
@@ -327,6 +327,11 @@ export class SessionManager {
327
327
  if (targetCwd !== activeCwd)
328
328
  continue;
329
329
  }
330
+ const hasTitle = Boolean(active.title && active.title.trim());
331
+ const hasConv = Boolean(active.process.currentConversationId);
332
+ const hasUsage = Boolean(active.usage && active.usage.totalTokens > 0);
333
+ if (!hasTitle && !hasConv && !hasUsage)
334
+ continue;
330
335
  const existing = sessionMap.get(active.id);
331
336
  sessionMap.set(active.id, {
332
337
  sessionId: active.id,
@@ -341,6 +346,6 @@ export class SessionManager {
341
346
  const timeB = b.updatedAt ? new Date(b.updatedAt).getTime() : 0;
342
347
  return timeB - timeA;
343
348
  });
344
- return list;
349
+ return list.slice(0, 100);
345
350
  }
346
351
  }
@@ -281,7 +281,7 @@ export function formatUsageOutput(rawText) {
281
281
  let rawWindow = "";
282
282
  let pctStr = "";
283
283
  let reset = "";
284
- const m = trimmedLine.match(/^(.*?)\s{2,}(.*?Remaining)\s+(\d+%)(?:\s+(.*))?$/i);
284
+ const m = trimmedLine.match(/^(.*?)\s{2,}(.*?)\s+(\d+%)(?:\s+(.*))?$/i);
285
285
  if (m) {
286
286
  fam = m[1].trim();
287
287
  rawWindow = m[2].trim();
@@ -298,20 +298,25 @@ export function formatUsageOutput(rawText) {
298
298
  reset = parts[3]?.trim() || "";
299
299
  }
300
300
  let icon = "🤖";
301
- if (fam.toLowerCase().includes("gemini")) {
301
+ const isArgon = fam.toLowerCase().includes("argon") || rawWindow.toLowerCase().includes("argon");
302
+ if (isArgon) {
303
+ fam = "Gemini 4 Argon";
304
+ icon = "⚡";
305
+ }
306
+ else if (fam.toLowerCase().includes("gemini")) {
302
307
  fam = "Google Gemini";
303
308
  icon = "🔷";
304
309
  }
305
- else if (fam.toLowerCase().includes("claude")) {
310
+ else if (fam.toLowerCase().includes("claude") || fam.toLowerCase().includes("gpt")) {
306
311
  fam = "Claude & GPT";
307
312
  icon = "🔶";
308
313
  }
309
- rawWindow = rawWindow.replace(/\s+Remaining$/i, "").trim();
314
+ rawWindow = rawWindow.replace(/\s+Remaining$/i, "").replace(/^Gemini 4 Argon\s+/i, "").trim();
310
315
  const lowerWindow = rawWindow.toLowerCase();
311
316
  const isFiveHour = lowerWindow.includes("five hour") || /\b5\s*hour/.test(lowerWindow);
312
317
  const win = isFiveHour
313
318
  ? "Janela de 5 Horas"
314
- : lowerWindow.includes("weekly")
319
+ : lowerWindow.includes("weekly") || lowerWindow.includes("week")
315
320
  ? "Cota Semanal"
316
321
  : rawWindow;
317
322
  const parsedPct = Number.parseInt(pctStr.replace("%", ""), 10);
package/dist/version.js CHANGED
@@ -122,7 +122,7 @@ export function formatDiagnosticVersion() {
122
122
  ` • CLI Backend: ${meta.agyBinaryPath} (v${meta.agyVersion})`,
123
123
  ` • Runtime: Node.js ${meta.nodeVersion} (${meta.platform} ${meta.arch})`,
124
124
  ` • Features: Token Tracking, Context Meter, Quota Windows, Model Pricing, Slash Commands (/help, /resume, /usage)`,
125
- ` • Supported Models: 7 (gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.1-pro, claude-sonnet-4-6, claude-opus-4-6-thinking, gpt-oss-120b)`,
125
+ ` • Supported Models: 8 (gemini-4-argon, gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.1-pro, claude-sonnet-4-6, claude-opus-4-6-thinking, gpt-oss-120b)`,
126
126
  ` • Session Isolation: persistent agy subprocess per Paseo session`,
127
127
  ];
128
128
  return lines.join("\n ");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paseo-acp-agy",
3
- "version": "1.2.8",
3
+ "version": "1.2.10",
4
4
  "description": "ACP (Agent Client Protocol) provider for Google Antigravity in Paseo and Zed",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",