anygate 0.5.4 → 0.5.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.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getTemplateById
4
- } from "./chunk-VKROC37K.js";
4
+ } from "./chunk-YYSUTRMV.js";
5
5
 
6
6
  // src/core/constants.ts
7
7
  import { homedir } from "os";
@@ -10,7 +10,7 @@ import { join } from "path";
10
10
  // package.json
11
11
  var package_default = {
12
12
  name: "anygate",
13
- version: "0.5.4",
13
+ version: "0.5.5",
14
14
  publishConfig: {
15
15
  access: "public"
16
16
  },
@@ -4782,8 +4782,8 @@ function getUsage(chunk) {
4782
4782
  const u = resp?.usageMetadata;
4783
4783
  if (!u) return null;
4784
4784
  return {
4785
- input: u.promptTokenCount ?? 0,
4786
- output: u.candidatesTokenCount ?? 0
4785
+ inputTokens: u.promptTokenCount ?? 0,
4786
+ outputTokens: u.candidatesTokenCount ?? 0
4787
4787
  };
4788
4788
  }
4789
4789
  function partThoughtSignature(part) {
@@ -4842,7 +4842,7 @@ async function streamCloudCodeToAnthropic(res, upstreamRes, model, log7) {
4842
4842
  textBlockOpen: false,
4843
4843
  pendingThoughtSignature: void 0,
4844
4844
  toolCalls: [],
4845
- usage: { input: 0, output: 0 },
4845
+ usage: { inputTokens: 0, outputTokens: 0 },
4846
4846
  emittedTextChars: 0,
4847
4847
  suppressedThoughtChars: 0
4848
4848
  };
@@ -4869,7 +4869,7 @@ async function streamCloudCodeToAnthropic(res, upstreamRes, model, log7) {
4869
4869
  writeEvent(res, "message_delta", { type: "message_delta", delta: { stop_reason: "end_turn", stop_sequence: null }, usage: { output_tokens: 0 } });
4870
4870
  writeEvent(res, "message_stop", { type: "message_stop" });
4871
4871
  res.end();
4872
- return;
4872
+ return state.usage;
4873
4873
  }
4874
4874
  const reader = upstreamRes.body.getReader();
4875
4875
  const decoder = new TextDecoder();
@@ -4919,7 +4919,7 @@ async function streamCloudCodeToAnthropic(res, upstreamRes, model, log7) {
4919
4919
  finalStopReason = mapStopReason(finishReason);
4920
4920
  log7?.(() => {
4921
4921
  const toolNames = state.toolCalls.map((tc) => tc.name).filter(Boolean).join(",");
4922
- return `cloud-code stream finish=${finishReason} mapped=${finalStopReason} ${summarizeParts(parts)} emittedTextChars=${state.emittedTextChars} suppressedThoughtChars=${state.suppressedThoughtChars} queuedToolCalls=${state.toolCalls.length} queuedToolNames=${toolNames || "-"} outputTokens=${state.usage.output}`;
4922
+ return `cloud-code stream finish=${finishReason} mapped=${finalStopReason} ${summarizeParts(parts)} emittedTextChars=${state.emittedTextChars} suppressedThoughtChars=${state.suppressedThoughtChars} queuedToolCalls=${state.toolCalls.length} queuedToolNames=${toolNames || "-"} outputTokens=${state.usage.outputTokens}`;
4923
4923
  });
4924
4924
  if (state.textBlockOpen) {
4925
4925
  closeBlock(res, state);
@@ -4951,11 +4951,11 @@ async function streamCloudCodeToAnthropic(res, upstreamRes, model, log7) {
4951
4951
  writeEvent(res, "message_delta", {
4952
4952
  type: "message_delta",
4953
4953
  delta: { stop_reason: anthropicStopReason, stop_sequence: null },
4954
- usage: { output_tokens: state.usage.output }
4954
+ usage: { output_tokens: state.usage.outputTokens }
4955
4955
  });
4956
4956
  writeEvent(res, "message_stop", { type: "message_stop" });
4957
4957
  res.end();
4958
- return;
4958
+ return state.usage;
4959
4959
  }
4960
4960
  }
4961
4961
  }
@@ -4969,10 +4969,11 @@ async function streamCloudCodeToAnthropic(res, upstreamRes, model, log7) {
4969
4969
  writeEvent(res, "message_delta", {
4970
4970
  type: "message_delta",
4971
4971
  delta: { stop_reason: finalStopReason, stop_sequence: null },
4972
- usage: { output_tokens: state.usage.output }
4972
+ usage: { output_tokens: state.usage.outputTokens }
4973
4973
  });
4974
4974
  writeEvent(res, "message_stop", { type: "message_stop" });
4975
4975
  res.end();
4976
+ return state.usage;
4976
4977
  }
4977
4978
  async function collectCloudCodeToAnthropic(upstreamRes, model, log7) {
4978
4979
  const text4 = await upstreamRes.text();
@@ -4988,8 +4989,8 @@ async function collectCloudCodeToAnthropic(upstreamRes, model, log7) {
4988
4989
  if (!chunk) continue;
4989
4990
  const usage = getUsage(chunk);
4990
4991
  if (usage) {
4991
- inputTokens = usage.input;
4992
- outputTokens = usage.output;
4992
+ inputTokens = usage.inputTokens;
4993
+ outputTokens = usage.outputTokens;
4993
4994
  }
4994
4995
  const candidate = getCandidate(chunk);
4995
4996
  if (!candidate) continue;
@@ -5033,7 +5034,9 @@ async function collectCloudCodeToAnthropic(upstreamRes, model, log7) {
5033
5034
  model,
5034
5035
  stop_reason: stopReason,
5035
5036
  stop_sequence: null,
5036
- usage: { input_tokens: inputTokens, output_tokens: outputTokens }
5037
+ usage: { input_tokens: inputTokens, output_tokens: outputTokens },
5038
+ inputTokens,
5039
+ outputTokens
5037
5040
  };
5038
5041
  }
5039
5042
 
@@ -5472,6 +5475,9 @@ async function generateAnthropicResponse(model, params, modelId, options) {
5472
5475
  import { appendFileSync as appendFileSync2, openSync as openSync2, writeSync as writeSync2, closeSync as closeSync2, readFileSync as readFileSync9, existsSync as existsSync9 } from "fs";
5473
5476
  import { join as join9 } from "path";
5474
5477
  var ANALYTICS_FILE = "analytics.jsonl";
5478
+ function normalizeModelKey(modelId) {
5479
+ return modelId.toLowerCase().replace(/\//g, ":").replace(/\s*\([^)]*\)\s*$/g, "").replace(/\s+/g, " ").trim();
5480
+ }
5475
5481
  function analyticsPath() {
5476
5482
  return join9(getAppHome(), ANALYTICS_FILE);
5477
5483
  }
@@ -5576,21 +5582,27 @@ function aggregateAnalytics(range) {
5576
5582
  const hour = Number(e.ts.slice(11, 13));
5577
5583
  if (Number.isFinite(hour) && hour >= 0 && hour < 24) hourCounts[hour] += 1;
5578
5584
  const provider = e.providerId ?? e.npm?.replace(/^@/, "").replace(/\//g, "-") ?? "unknown";
5579
- const key = `${provider}|${e.modelId}`;
5580
- const m = modelMap.get(key) ?? { provider, model: e.modelId, app: e.app, inputTokens: 0, outputTokens: 0 };
5585
+ const key = `${provider}|${normalizeModelKey(e.modelId)}`;
5586
+ const m = modelMap.get(key) ?? { provider, model: e.modelId, app: e.app, apps: /* @__PURE__ */ new Set(), inputTokens: 0, outputTokens: 0 };
5587
+ if (!/\s/.test(m.model) && /\s/.test(e.modelId)) m.model = e.modelId;
5581
5588
  m.inputTokens += e.inputTokens;
5582
5589
  m.outputTokens += e.outputTokens;
5590
+ m.apps.add(e.app);
5583
5591
  modelMap.set(key, m);
5584
5592
  }
5585
- const busiestDay = Math.max(1, ...[...eventsByDay.values()]);
5593
+ const busiestDay = Math.max(1, ...[...tokensByDay.values()]);
5586
5594
  const heatmap = [];
5587
5595
  for (let i = rangeDays(range) - 1; i >= 0; i--) {
5588
5596
  const d = new Date(today);
5589
5597
  d.setUTCDate(today.getUTCDate() - i);
5590
5598
  const date = d.toISOString().slice(0, 10);
5591
- const count = eventsByDay.get(date) ?? 0;
5592
- const intensity = Math.min(4, Math.round(count / busiestDay * 4)) || 0;
5593
- heatmap.push({ date, count, intensity });
5599
+ const tokens = tokensByDay.get(date) ?? 0;
5600
+ let intensity = 0;
5601
+ if (tokens > 0) {
5602
+ const pct = tokens / busiestDay;
5603
+ intensity = Math.max(1, Math.min(4, Math.round(1 + pct * 3)));
5604
+ }
5605
+ heatmap.push({ date, count: tokens, intensity });
5594
5606
  }
5595
5607
  const dailyTokens = [];
5596
5608
  for (let i = rangeDays(range) - 1; i >= 0; i--) {
@@ -5625,12 +5637,14 @@ function aggregateAnalytics(range) {
5625
5637
  }
5626
5638
  const models = [...modelMap.entries()].map(([, m], idx) => {
5627
5639
  const share = totalTokens > 0 ? (m.inputTokens + m.outputTokens) / totalTokens : 0;
5640
+ const apps = [...m.apps];
5628
5641
  return {
5629
5642
  provider: m.provider,
5630
5643
  model: m.model,
5631
5644
  tier: "",
5632
5645
  // source tier isn't tracked in the log; UI shows it from catalog elsewhere
5633
- app: m.app,
5646
+ app: apps[0] ?? m.app,
5647
+ apps,
5634
5648
  inputTokens: m.inputTokens,
5635
5649
  outputTokens: m.outputTokens,
5636
5650
  share,
@@ -5939,12 +5953,22 @@ data: ${JSON.stringify({ type: "error", error: { type: errorType, message } })}
5939
5953
  anthropicError(res, upstream.status >= 500 ? 502 : upstream.status, errBody);
5940
5954
  return;
5941
5955
  }
5956
+ let usage = { inputTokens: 0, outputTokens: 0 };
5942
5957
  if (clientWantsStream) {
5943
- await streamCloudCodeToAnthropic(res, upstream, route.realModelId, plog);
5958
+ usage = await streamCloudCodeToAnthropic(res, upstream, route.realModelId, plog);
5944
5959
  } else {
5945
5960
  const response = await collectCloudCodeToAnthropic(upstream, route.realModelId, plog);
5961
+ usage = { inputTokens: response.inputTokens ?? 0, outputTokens: response.outputTokens ?? 0 };
5946
5962
  sendJson(res, 200, response);
5947
5963
  }
5964
+ recordUsage({
5965
+ ts: (/* @__PURE__ */ new Date()).toISOString(),
5966
+ modelId: route.realModelId,
5967
+ providerId: route.providerId,
5968
+ app: route.app ?? "Antigravity",
5969
+ inputTokens: usage.inputTokens,
5970
+ outputTokens: usage.outputTokens
5971
+ });
5948
5972
  } catch (err) {
5949
5973
  const message = err instanceof Error ? err.message : String(err);
5950
5974
  plog(() => `cloud-code fetch error: ${message}`);
@@ -10749,6 +10773,7 @@ export {
10749
10773
  encodeToolUseId,
10750
10774
  serializeToolResultContent,
10751
10775
  translateRequest,
10776
+ recordUsage,
10752
10777
  aggregateAnalytics,
10753
10778
  aliasModelId,
10754
10779
  startProxyCatalog,
@@ -10817,4 +10842,4 @@ export {
10817
10842
  quitClaudeAppGracefully,
10818
10843
  launchOrRestartClaudeApp
10819
10844
  };
10820
- //# sourceMappingURL=chunk-E2MV3GDX.js.map
10845
+ //# sourceMappingURL=chunk-CH5IEXJN.js.map