repospend 0.1.2 → 0.1.4

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/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  All notable changes to RepoSpend will be documented in this file.
4
4
 
5
+ ## 0.1.4
6
+
7
+ - Add exact Standard API-equivalent rates for GPT-6 Astra, Sol, and Luna, including cached input and cache writes.
8
+ - Add Claude Fable 5.1, Mythos 5.1, Opus 5, and Opus 5.5 rates, including the lower cache-read rates for the newest models.
9
+ - Leave unlisted fast-mode model IDs unpriced instead of silently applying Standard rates.
10
+ - Keep legacy full pricing files eligible for bundled rate updates as new model rows are added, while preserving custom pricing overrides.
11
+ - Correct the Claude Sonnet 5 pricing note to reflect Anthropic's permanent $2 input and $10 output rates.
12
+ - Document the limits of short-context Standard pricing estimates for long-context and other processing modes.
13
+
14
+ ## 0.1.3
15
+
16
+ - Correct GPT-5.6 Terra and Luna API-equivalent pricing to the reduced July 30, 2026 OpenAI rates, including cached-input and cache-write rates.
17
+ - Migrate legacy full pricing files so the new Terra and Luna defaults take effect while preserving sparse user overrides and custom model rows.
18
+ - Improve unverified repo and folder grouping by using the outermost project marker below a safe shared-folder boundary, keeping nested non-Git workspace paths together without collapsing them into broad folders such as `Desktop`.
19
+ - Show paths relative to the home directory for unverified workspace labels so similarly named folders such as `src` remain distinguishable.
20
+
5
21
  ## 0.1.2
6
22
 
7
23
  - Add bundled GPT-5.6 API-equivalent pricing for the Sol, Terra, and Luna tiers, including cache-write and cached-input rates.
package/README.md CHANGED
@@ -125,7 +125,7 @@ RepoSpend helps you break down local AI coding usage by:
125
125
  - input, cached input, output, and reasoning token shape
126
126
  - estimated API-equivalent cost
127
127
 
128
- Nested paths are grouped by Git root so usage rolls up to the repository.
128
+ Nested paths are grouped by Git root so usage rolls up to the repository. When no Git root is available, RepoSpend uses the outermost project marker below a safe shared-folder boundary, such as `package.json`, and keeps the grouping visibly unverified.
129
129
 
130
130
  ## Screenshots
131
131
 
package/dist/cli.js CHANGED
@@ -233,8 +233,12 @@ function normalizePricingModelId(model) {
233
233
  }
234
234
  function claudePricingFamilyModel(model, isUsable = () => true) {
235
235
  const families = [
236
+ "claude-fable-5-1",
236
237
  "claude-fable-5",
238
+ "claude-mythos-5-1",
237
239
  "claude-mythos-5",
240
+ "claude-opus-5-5",
241
+ "claude-opus-5",
238
242
  "claude-opus-4-8-fast-mode",
239
243
  "claude-opus-4-7",
240
244
  "claude-opus-4-6",
@@ -249,8 +253,11 @@ function claudePricingFamilyModel(model, isUsable = () => true) {
249
253
  "claude-3-5-haiku"
250
254
  ];
251
255
  const normalized = normalizePricingModelId(model);
252
- if (normalized === "claude-opus-4-6-fast-mode") return void 0;
253
- return families.find((candidate) => (normalized === candidate || normalized.startsWith(`${candidate}-`) || normalized.startsWith(`${candidate}.`)) && isUsable(candidate));
256
+ const matchesFamily = (candidate) => normalized === candidate || normalized.startsWith(`${candidate}-`) || normalized.startsWith(`${candidate}.`);
257
+ if (normalized.includes("fast-mode")) {
258
+ return families.find((candidate) => candidate.includes("fast-mode") && matchesFamily(candidate) && isUsable(candidate));
259
+ }
260
+ return families.find((candidate) => matchesFamily(candidate) && isUsable(candidate));
254
261
  }
255
262
  function copilotPricingFamilyModel(model, isUsable = () => true) {
256
263
  const normalized = normalizePricingModelId(model);
@@ -323,19 +330,24 @@ var pricingInfo = {
323
330
  sourceUrl: "https://developers.openai.com/api/docs/pricing",
324
331
  sourceUrls: [
325
332
  { label: "OpenAI pricing reference", url: "https://developers.openai.com/api/docs/pricing" },
333
+ { label: "OpenAI GPT-6 model reference", url: "https://developers.openai.com/api/docs/models" },
326
334
  { label: "OpenAI GPT-5.6 preview pricing", url: "https://openai.com/index/previewing-gpt-5-6-sol/" },
335
+ { label: "OpenAI GPT-5.6 price update", url: "https://openai.com/index/advancing-the-price-performance-frontier-with-gpt-5-6/" },
327
336
  { label: "Claude pricing reference", url: "https://platform.claude.com/docs/en/about-claude/pricing" },
328
337
  { label: "GitHub Copilot model pricing reference", url: "https://docs.github.com/en/copilot/reference/copilot-billing/models-and-pricing" }
329
338
  ],
330
339
  unit: "USD per 1M tokens",
331
- updatedAt: "2026-07-02",
332
- note: "RepoSpend estimates API-equivalent cost from local token counts and public API-style Standard pricing. This is not your actual bill; subscriptions, credits, provider terms, cache behavior, regional processing, or other billing factors can make your real cost different."
340
+ updatedAt: "2026-09-24",
341
+ note: "RepoSpend estimates API-equivalent cost from local token counts and public Standard pricing. GPT-6 defaults use short-context rates. Long-context, fast, batch, regional, and account-specific pricing can differ. This is not your actual bill."
333
342
  };
334
343
  var defaultPricing = {
344
+ "gpt-6-astra": { inputPerMillion: 10, cachedInputPerMillion: 1, cacheCreationInputPerMillion: 12.5, outputPerMillion: 50, reasoningOutputPerMillion: 50 },
345
+ "gpt-6-sol": { inputPerMillion: 2, cachedInputPerMillion: 0.2, cacheCreationInputPerMillion: 2.5, outputPerMillion: 10, reasoningOutputPerMillion: 10 },
346
+ "gpt-6-luna": { inputPerMillion: 0.1, cachedInputPerMillion: 0.01, cacheCreationInputPerMillion: 0.125, outputPerMillion: 0.5, reasoningOutputPerMillion: 0.5 },
335
347
  "gpt-5.6": { inputPerMillion: 5, cachedInputPerMillion: 0.5, cacheCreationInputPerMillion: 6.25, outputPerMillion: 30, reasoningOutputPerMillion: 30, note: "GPT-5.6 Sol flagship tier. OpenAI preview pricing lists Sol at $5 input / $30 output per 1M tokens, cache writes at 1.25x input, and cache reads at a 90% discount." },
336
348
  "gpt-5.6-sol": { inputPerMillion: 5, cachedInputPerMillion: 0.5, cacheCreationInputPerMillion: 6.25, outputPerMillion: 30, reasoningOutputPerMillion: 30 },
337
- "gpt-5.6-terra": { inputPerMillion: 2.5, cachedInputPerMillion: 0.25, cacheCreationInputPerMillion: 3.125, outputPerMillion: 15, reasoningOutputPerMillion: 15 },
338
- "gpt-5.6-luna": { inputPerMillion: 1, cachedInputPerMillion: 0.1, cacheCreationInputPerMillion: 1.25, outputPerMillion: 6, reasoningOutputPerMillion: 6 },
349
+ "gpt-5.6-terra": { inputPerMillion: 2, cachedInputPerMillion: 0.2, cacheCreationInputPerMillion: 2.5, outputPerMillion: 12, reasoningOutputPerMillion: 12, note: "GPT-5.6 Terra reduced API pricing effective July 30, 2026. Cache reads are 90% below input and cache writes are 1.25x input." },
350
+ "gpt-5.6-luna": { inputPerMillion: 0.2, cachedInputPerMillion: 0.02, cacheCreationInputPerMillion: 0.25, outputPerMillion: 1.2, reasoningOutputPerMillion: 1.2, note: "GPT-5.6 Luna reduced API pricing effective July 30, 2026. Cache reads are 90% below input and cache writes are 1.25x input." },
339
351
  "gpt-5.5": { inputPerMillion: 5, cachedInputPerMillion: 0.5, outputPerMillion: 30, reasoningOutputPerMillion: 30 },
340
352
  "gpt-5.5-pro": { inputPerMillion: 30, outputPerMillion: 180, reasoningOutputPerMillion: 180 },
341
353
  "gpt-5.4": { inputPerMillion: 2.5, cachedInputPerMillion: 0.25, outputPerMillion: 15, reasoningOutputPerMillion: 15 },
@@ -370,7 +382,11 @@ var defaultPricing = {
370
382
  "mai-code-1-flash": { inputPerMillion: 0.75, cachedInputPerMillion: 0.075, outputPerMillion: 4.5, note: "GitHub Copilot supported Microsoft model; API-equivalent estimate, not a Copilot bill." },
371
383
  "kimi-k2.7-code": { inputPerMillion: 0.95, cachedInputPerMillion: 0.19, outputPerMillion: 4, note: "GitHub Copilot supported Moonshot AI model; API-equivalent estimate, not a Copilot bill." },
372
384
  "claude-fable-5": { inputPerMillion: 10, cacheCreationInput5mPerMillion: 12.5, cacheCreationInput1hPerMillion: 20, cacheCreationInputPerMillion: 20, cachedInputPerMillion: 1, outputPerMillion: 50 },
385
+ "claude-fable-5-1": { inputPerMillion: 10, cacheCreationInput5mPerMillion: 12.5, cacheCreationInput1hPerMillion: 20, cacheCreationInputPerMillion: 20, cachedInputPerMillion: 0.25, outputPerMillion: 50 },
373
386
  "claude-mythos-5": { inputPerMillion: 10, cacheCreationInput5mPerMillion: 12.5, cacheCreationInput1hPerMillion: 20, cacheCreationInputPerMillion: 20, cachedInputPerMillion: 1, outputPerMillion: 50, note: "Limited availability Anthropic model; same public API-equivalent pricing as Claude Fable 5." },
387
+ "claude-mythos-5-1": { inputPerMillion: 10, cacheCreationInput5mPerMillion: 12.5, cacheCreationInput1hPerMillion: 20, cacheCreationInputPerMillion: 20, cachedInputPerMillion: 0.25, outputPerMillion: 50, note: "Limited availability Anthropic model; same public API-equivalent pricing as Claude Fable 5.1." },
388
+ "claude-opus-5-5": { inputPerMillion: 4, cacheCreationInput5mPerMillion: 5, cacheCreationInput1hPerMillion: 8, cacheCreationInputPerMillion: 8, cachedInputPerMillion: 0.2, outputPerMillion: 20 },
389
+ "claude-opus-5": { inputPerMillion: 5, cacheCreationInput5mPerMillion: 6.25, cacheCreationInput1hPerMillion: 10, cacheCreationInputPerMillion: 10, cachedInputPerMillion: 0.5, outputPerMillion: 25 },
374
390
  "claude-opus-4-8": { inputPerMillion: 5, cacheCreationInput5mPerMillion: 6.25, cacheCreationInput1hPerMillion: 10, cacheCreationInputPerMillion: 10, cachedInputPerMillion: 0.5, outputPerMillion: 25 },
375
391
  "claude-opus-4-8-fast-mode": { inputPerMillion: 10, cacheCreationInput5mPerMillion: 12.5, cacheCreationInput1hPerMillion: 20, cacheCreationInputPerMillion: 12.5, cachedInputPerMillion: 1, outputPerMillion: 50, note: "Claude Opus 4.8 fast mode research preview pricing. Prompt caching multipliers apply on top of fast mode pricing." },
376
392
  "claude-opus-4-7": { inputPerMillion: 5, cacheCreationInput5mPerMillion: 6.25, cacheCreationInput1hPerMillion: 10, cacheCreationInputPerMillion: 10, cachedInputPerMillion: 0.5, outputPerMillion: 25 },
@@ -379,24 +395,107 @@ var defaultPricing = {
379
395
  "claude-opus-4-5": { inputPerMillion: 5, cacheCreationInput5mPerMillion: 6.25, cacheCreationInput1hPerMillion: 10, cacheCreationInputPerMillion: 10, cachedInputPerMillion: 0.5, outputPerMillion: 25 },
380
396
  "claude-opus-4-1": { inputPerMillion: 15, cacheCreationInput5mPerMillion: 18.75, cacheCreationInput1hPerMillion: 30, cacheCreationInputPerMillion: 30, cachedInputPerMillion: 1.5, outputPerMillion: 75 },
381
397
  "claude-opus-4": { inputPerMillion: 15, cacheCreationInput5mPerMillion: 18.75, cacheCreationInput1hPerMillion: 30, cacheCreationInputPerMillion: 30, cachedInputPerMillion: 1.5, outputPerMillion: 75 },
382
- "claude-sonnet-5": { inputPerMillion: 2, cacheCreationInput5mPerMillion: 2.5, cacheCreationInput1hPerMillion: 4, cacheCreationInputPerMillion: 4, cachedInputPerMillion: 0.2, outputPerMillion: 10, note: "Anthropic introductory pricing through August 31, 2026. Standard pricing from September 1, 2026 is $3 input / $15 output per 1M tokens." },
398
+ "claude-sonnet-5": { inputPerMillion: 2, cacheCreationInput5mPerMillion: 2.5, cacheCreationInput1hPerMillion: 4, cacheCreationInputPerMillion: 4, cachedInputPerMillion: 0.2, outputPerMillion: 10, note: "Anthropic made the $2 input / $10 output introductory pricing permanent on August 10, 2026." },
383
399
  "claude-sonnet-4-6": { inputPerMillion: 3, cacheCreationInput5mPerMillion: 3.75, cacheCreationInput1hPerMillion: 6, cacheCreationInputPerMillion: 6, cachedInputPerMillion: 0.3, outputPerMillion: 15 },
384
400
  "claude-sonnet-4-5": { inputPerMillion: 3, cacheCreationInput5mPerMillion: 3.75, cacheCreationInput1hPerMillion: 6, cacheCreationInputPerMillion: 6, cachedInputPerMillion: 0.3, outputPerMillion: 15 },
385
401
  "claude-sonnet-4": { inputPerMillion: 3, cacheCreationInput5mPerMillion: 3.75, cacheCreationInput1hPerMillion: 6, cacheCreationInputPerMillion: 6, cachedInputPerMillion: 0.3, outputPerMillion: 15 },
386
402
  "claude-haiku-4-5": { inputPerMillion: 1, cacheCreationInput5mPerMillion: 1.25, cacheCreationInput1hPerMillion: 2, cacheCreationInputPerMillion: 2, cachedInputPerMillion: 0.1, outputPerMillion: 5 },
387
403
  "claude-3-5-haiku": { inputPerMillion: 0.8, cacheCreationInput5mPerMillion: 1, cacheCreationInput1hPerMillion: 1.6, cacheCreationInputPerMillion: 1.6, cachedInputPerMillion: 0.08, outputPerMillion: 4 }
388
404
  };
405
+ var legacyBundledPricing = {
406
+ "gpt-5.6-terra": { inputPerMillion: 2.5, cachedInputPerMillion: 0.25, cacheCreationInputPerMillion: 3.125, outputPerMillion: 15, reasoningOutputPerMillion: 15 },
407
+ "gpt-5.6-luna": { inputPerMillion: 1, cachedInputPerMillion: 0.1, cacheCreationInputPerMillion: 1.25, outputPerMillion: 6, reasoningOutputPerMillion: 6 },
408
+ "claude-sonnet-5": { inputPerMillion: 2, cacheCreationInput5mPerMillion: 2.5, cacheCreationInput1hPerMillion: 4, cacheCreationInputPerMillion: 4, cachedInputPerMillion: 0.2, outputPerMillion: 10, note: "Anthropic introductory pricing through August 31, 2026. Standard pricing from September 1, 2026 is $3 input / $15 output per 1M tokens." }
409
+ };
410
+ var legacyFullTableModelIds = [
411
+ "gpt-5.6",
412
+ "gpt-5.6-sol",
413
+ "gpt-5.6-terra",
414
+ "gpt-5.6-luna",
415
+ "gpt-5.5",
416
+ "gpt-5.5-pro",
417
+ "gpt-5.4",
418
+ "gpt-5.4-mini",
419
+ "gpt-5.4-nano",
420
+ "gpt-5.4-pro",
421
+ "gpt-5.3-codex",
422
+ "gpt-5.3-codex-spark",
423
+ "gpt-5.2",
424
+ "gpt-5.2-chat-latest",
425
+ "gpt-5.2-codex",
426
+ "gpt-5.2-pro",
427
+ "gpt-5.1",
428
+ "gpt-5.1-chat-latest",
429
+ "gpt-5.1-codex",
430
+ "gpt-5.1-codex-max",
431
+ "gpt-5",
432
+ "gpt-5-chat-latest",
433
+ "gpt-5-codex",
434
+ "gpt-5-pro",
435
+ "gpt-5-mini",
436
+ "gpt-5-nano",
437
+ "gpt-4.1",
438
+ "gemini-2.5-pro",
439
+ "gemini-3-flash",
440
+ "gemini-3.1-pro",
441
+ "gemini-3.5-flash",
442
+ "raptor-mini",
443
+ "oswe-vscode-prime",
444
+ "lark",
445
+ "goldeneye",
446
+ "mai-code-1-flash",
447
+ "kimi-k2.7-code",
448
+ "claude-fable-5",
449
+ "claude-mythos-5",
450
+ "claude-opus-4-8",
451
+ "claude-opus-4-8-fast-mode",
452
+ "claude-opus-4-7",
453
+ "claude-opus-4-6",
454
+ "claude-opus-4-6-fast-mode",
455
+ "claude-opus-4-5",
456
+ "claude-opus-4-1",
457
+ "claude-opus-4",
458
+ "claude-sonnet-5",
459
+ "claude-sonnet-4-6",
460
+ "claude-sonnet-4-5",
461
+ "claude-sonnet-4",
462
+ "claude-haiku-4-5",
463
+ "claude-3-5-haiku"
464
+ ];
389
465
  function loadPricingTable(pricingPath) {
390
466
  if (!pricingPath) {
391
467
  return defaultPricing;
392
468
  }
393
469
  try {
394
470
  const resolved = path.resolve(pricingPath);
395
- return { ...defaultPricing, ...JSON.parse(fs.readFileSync(resolved, "utf8")) };
471
+ const stored = JSON.parse(fs.readFileSync(resolved, "utf8"));
472
+ return { ...defaultPricing, ...migrateLegacyBundledPricing(stored) };
396
473
  } catch {
397
474
  return defaultPricing;
398
475
  }
399
476
  }
477
+ function pricingOverrides(pricing) {
478
+ return Object.fromEntries(
479
+ Object.entries(pricing).filter(([model, modelPricing]) => {
480
+ const bundled = defaultPricing[model];
481
+ return !bundled || !pricingEntriesEqual(modelPricing, bundled);
482
+ })
483
+ );
484
+ }
485
+ function migrateLegacyBundledPricing(stored) {
486
+ const isLegacyFullTable = legacyFullTableModelIds.every((model) => Object.hasOwn(stored, model));
487
+ if (!isLegacyFullTable) return stored;
488
+ const migrated = { ...stored };
489
+ for (const [model, legacyPricing] of Object.entries(legacyBundledPricing)) {
490
+ if (pricingEntriesEqual(migrated[model], legacyPricing)) delete migrated[model];
491
+ }
492
+ return pricingOverrides(migrated);
493
+ }
494
+ function pricingEntriesEqual(left, right) {
495
+ if (!left || !right) return left === right;
496
+ const keys = /* @__PURE__ */ new Set([...Object.keys(left), ...Object.keys(right)]);
497
+ return [...keys].every((key) => left[key] === right[key]);
498
+ }
400
499
  function resolvePricingPath(config = {}) {
401
500
  return config.pricingPath ? path.resolve(repospendHome(), config.pricingPath) : path.join(repospendHome(), "pricing.json");
402
501
  }
@@ -1235,6 +1334,7 @@ function isDashboardVisibleSession(session) {
1235
1334
 
1236
1335
  // packages/core/src/repo.ts
1237
1336
  import fs4 from "node:fs";
1337
+ import os2 from "node:os";
1238
1338
  import path4 from "node:path";
1239
1339
  function normalizeRoot(p) {
1240
1340
  const stripped = p.startsWith("\\\\?\\") ? p.slice(4) : p;
@@ -1264,9 +1364,9 @@ function findGitRoot(cwd, fileSystem = fs4) {
1264
1364
  function resolveRepoInfo(cwd, config = {}, fileSystem = fs4) {
1265
1365
  const warnings = [];
1266
1366
  const gitRoot = safeFindGitRoot(cwd, fileSystem);
1267
- const repoRoot = gitRoot ?? fallbackWorkspaceRoot(cwd);
1367
+ const repoRoot = gitRoot ?? fallbackWorkspaceRoot(cwd, fileSystem);
1268
1368
  const alias = aliasForPath(repoRoot, config);
1269
- const repoName = alias ?? (path4.basename(repoRoot) || "unknown-workspace");
1369
+ const repoName = alias ?? (gitRoot ? path4.basename(repoRoot) : fallbackWorkspaceLabel(repoRoot));
1270
1370
  const gitMeta = gitRoot ? readGitMetadata(gitRoot, fileSystem) : { remote: void 0, branch: void 0 };
1271
1371
  if (!gitRoot) {
1272
1372
  warnings.push("repo_unverified_no_git_root");
@@ -1287,16 +1387,59 @@ function safeFindGitRoot(cwd, fileSystem) {
1287
1387
  return void 0;
1288
1388
  }
1289
1389
  }
1290
- function fallbackWorkspaceRoot(cwd) {
1390
+ var workspaceMarkers = [
1391
+ "package.json",
1392
+ "pyproject.toml",
1393
+ "Cargo.toml",
1394
+ "go.mod",
1395
+ "mix.exs",
1396
+ "composer.json",
1397
+ "Gemfile",
1398
+ "pom.xml",
1399
+ "build.gradle",
1400
+ "Package.swift",
1401
+ "CMakeLists.txt"
1402
+ ];
1403
+ var fallbackWorkspaceCache = /* @__PURE__ */ new Map();
1404
+ function fallbackWorkspaceRoot(cwd, fileSystem = fs4) {
1291
1405
  const resolved = normalizeRoot(path4.resolve(cwd || process.cwd()));
1292
- const home = process.env.HOME ? normalizeRoot(path4.resolve(process.env.HOME)) : void 0;
1293
- if (home && (resolved === home || resolved.startsWith(`${home}${path4.sep}`))) {
1294
- const relative = path4.relative(home, resolved).split(path4.sep).filter(Boolean);
1295
- const first = relative[0];
1296
- return first ? path4.join(home, first) : home;
1406
+ if (fileSystem === fs4) {
1407
+ const cached = fallbackWorkspaceCache.get(resolved);
1408
+ if (cached) return cached;
1409
+ }
1410
+ const root = findWorkspaceMarkerRoot(resolved, fileSystem) ?? resolved;
1411
+ if (fileSystem === fs4) fallbackWorkspaceCache.set(resolved, root);
1412
+ return root;
1413
+ }
1414
+ function findWorkspaceMarkerRoot(start, fileSystem) {
1415
+ const home = normalizeRoot(path4.resolve(os2.homedir()));
1416
+ const boundary = isWithin(start, home) ? home : path4.parse(start).root;
1417
+ let candidate;
1418
+ let current = start;
1419
+ while (true) {
1420
+ if (current !== boundary && isAllowedMarkerRoot(current, boundary) && workspaceMarkers.some((marker) => fileSystem.existsSync(path4.join(current, marker)))) {
1421
+ candidate = current;
1422
+ }
1423
+ if (current === boundary) return candidate;
1424
+ const parent = path4.dirname(current);
1425
+ if (parent === current) return candidate;
1426
+ current = parent;
1297
1427
  }
1298
- const parts = resolved.split(path4.sep).filter(Boolean);
1299
- return `${path4.sep}${parts.slice(0, Math.min(parts.length, 3)).join(path4.sep)}`;
1428
+ }
1429
+ function isAllowedMarkerRoot(candidate, boundary) {
1430
+ const relative = path4.relative(boundary, candidate).split(path4.sep).filter(Boolean);
1431
+ return relative.length > 1;
1432
+ }
1433
+ function isWithin(candidate, parent) {
1434
+ return candidate === parent || candidate.startsWith(`${parent}${path4.sep}`);
1435
+ }
1436
+ function fallbackWorkspaceLabel(repoRoot) {
1437
+ const home = normalizeRoot(path4.resolve(os2.homedir()));
1438
+ const relativeToHome = path4.relative(home, repoRoot);
1439
+ if (relativeToHome && !relativeToHome.startsWith("..") && !path4.isAbsolute(relativeToHome)) {
1440
+ return relativeToHome.split(path4.sep).filter(Boolean).join("/");
1441
+ }
1442
+ return path4.basename(repoRoot) || "unknown-workspace";
1300
1443
  }
1301
1444
  function readGitMetadata(repoRoot, fileSystem) {
1302
1445
  const gitPath = path4.join(repoRoot, ".git");
@@ -1331,7 +1474,7 @@ function parseBranch(head) {
1331
1474
  // packages/core/src/sources/codex.ts
1332
1475
  import { spawnSync } from "node:child_process";
1333
1476
  import fs5 from "node:fs";
1334
- import os2 from "node:os";
1477
+ import os3 from "node:os";
1335
1478
  import path5 from "node:path";
1336
1479
  import { fileURLToPath } from "node:url";
1337
1480
  import Database from "better-sqlite3";
@@ -1856,7 +1999,7 @@ function numberFromKeys(object, keys) {
1856
1999
  var codexSessionCacheVersion = "codex-session-v1";
1857
2000
  var nativeSqliteRebuildAttempted = false;
1858
2001
  function scanCodex(options) {
1859
- const codexHome = options.codexHome ?? path5.join(os2.homedir(), ".codex");
2002
+ const codexHome = options.codexHome ?? path5.join(os3.homedir(), ".codex");
1860
2003
  const statePath = path5.join(codexHome, "state_5.sqlite");
1861
2004
  const sessionsPath = path5.join(codexHome, "sessions");
1862
2005
  const configPath2 = path5.join(codexHome, "config.toml");
@@ -1938,7 +2081,7 @@ function readThreads(statePath, sessionFiles, options, warnings) {
1938
2081
  warnings.push("Codex threads table has no recognized columns.");
1939
2082
  return [];
1940
2083
  }
1941
- const importedModels = readImportedModelMap(options.codexHome ?? path5.join(os2.homedir(), ".codex"), warnings);
2084
+ const importedModels = readImportedModelMap(options.codexHome ?? path5.join(os3.homedir(), ".codex"), warnings);
1942
2085
  const rows = db.prepare(`SELECT ${selectedColumns.map((column) => `"${column}"`).join(", ")} FROM threads`).all().filter((row) => rowMatchesScanWindow(row, options.scanWindow));
1943
2086
  const sessions = rows.map((row, index) => threadToUsage(row, index, sessionFiles, options, importedModels));
1944
2087
  return attributeSubagentsToParentSurfaces(sessions, rows);
@@ -2095,7 +2238,7 @@ function threadToUsage(row, index, sessionFiles, options, importedModels = /* @_
2095
2238
  messageCount: sessionBreakdown.messageCount,
2096
2239
  rawTokenTotal: dbTokens || sessionBreakdown.totalTokens || void 0,
2097
2240
  warnings,
2098
- codexHome: options.codexHome ?? path5.join(os2.homedir(), ".codex"),
2241
+ codexHome: options.codexHome ?? path5.join(os3.homedir(), ".codex"),
2099
2242
  durationMs: durationMs(startedAt, endedAt),
2100
2243
  rawEventCount: sessionBreakdown.rawEventCount,
2101
2244
  parseStatus: sessionBreakdown.parseStatus,
@@ -2169,7 +2312,7 @@ function readStandaloneSessions(sessionFiles, options) {
2169
2312
  messageCount: breakdown.messageCount,
2170
2313
  rawTokenTotal: breakdown.totalTokens || void 0,
2171
2314
  warnings: [...repo.warnings, ...breakdown.warnings],
2172
- codexHome: options.codexHome ?? path5.join(os2.homedir(), ".codex"),
2315
+ codexHome: options.codexHome ?? path5.join(os3.homedir(), ".codex"),
2173
2316
  durationMs: durationMs(breakdown.startedAt, breakdown.endedAt),
2174
2317
  rawEventCount: breakdown.rawEventCount,
2175
2318
  parseStatus: breakdown.parseStatus,
@@ -2680,7 +2823,7 @@ function errorMessage(error) {
2680
2823
 
2681
2824
  // packages/core/src/sources/claude.ts
2682
2825
  import fs6 from "node:fs";
2683
- import os3 from "node:os";
2826
+ import os4 from "node:os";
2684
2827
  import path6 from "node:path";
2685
2828
  function scanClaude(options) {
2686
2829
  const claudeHome = options.claudeHome ?? defaultClaudeHome();
@@ -2734,7 +2877,7 @@ function scanClaude(options) {
2734
2877
  function discoverClaudeSessionFiles(claudeHome, warnings, explicitHome) {
2735
2878
  const files = [];
2736
2879
  const projectDirs = /* @__PURE__ */ new Set();
2737
- const projectsPaths = explicitHome ? [path6.join(claudeHome, "projects")] : unique3([...configuredClaudeHomes(claudeHome).map((root) => path6.join(root, "projects")), path6.join(os3.homedir(), ".config", "claude", "projects")]);
2880
+ const projectsPaths = explicitHome ? [path6.join(claudeHome, "projects")] : unique3([...configuredClaudeHomes(claudeHome).map((root) => path6.join(root, "projects")), path6.join(os4.homedir(), ".config", "claude", "projects")]);
2738
2881
  for (const projectsPath of projectsPaths) {
2739
2882
  collectProjectFiles(projectsPath, files, projectDirs, warnings);
2740
2883
  }
@@ -3248,10 +3391,10 @@ function claudeSourceAppLabel(entrypoint) {
3248
3391
  return "Claude Code";
3249
3392
  }
3250
3393
  function defaultClaudeHome() {
3251
- return process.env.CLAUDE_CONFIG_DIR?.split(",").map((item) => item.trim()).filter(Boolean)[0] ?? path6.join(os3.homedir(), ".claude");
3394
+ return process.env.CLAUDE_CONFIG_DIR?.split(",").map((item) => item.trim()).filter(Boolean)[0] ?? path6.join(os4.homedir(), ".claude");
3252
3395
  }
3253
3396
  function defaultDesktopSessionRoots() {
3254
- const home = os3.homedir();
3397
+ const home = os4.homedir();
3255
3398
  const xdg = process.env.XDG_CONFIG_HOME || path6.join(home, ".config");
3256
3399
  return [
3257
3400
  path6.join(home, "Library", "Application Support", "Claude", "local-agent-mode-sessions"),
@@ -3342,12 +3485,12 @@ function safeMtimeMs(filePath) {
3342
3485
 
3343
3486
  // packages/core/src/sources/copilot.ts
3344
3487
  import fs7 from "node:fs";
3345
- import os4 from "node:os";
3488
+ import os5 from "node:os";
3346
3489
  import path7 from "node:path";
3347
3490
  var maxJsonlBytes = 50 * 1024 * 1024;
3348
3491
  var copilotOtelEnv = "COPILOT_OTEL_FILE_EXPORTER_PATH";
3349
3492
  function scanCopilot(options) {
3350
- const copilotHome = options.copilotHome ?? path7.join(os4.homedir(), ".copilot");
3493
+ const copilotHome = options.copilotHome ?? path7.join(os5.homedir(), ".copilot");
3351
3494
  const discovery = discoverCopilotFiles(copilotHome, Boolean(options.copilotHome), options.codeUserRoots);
3352
3495
  const files = discovery.files.filter((file) => fileMayOverlapScanWindow2(file.filePath, options.scanWindow));
3353
3496
  const sessionMap = /* @__PURE__ */ new Map();
@@ -4016,7 +4159,7 @@ function timestampMs2(value) {
4016
4159
  return iso ? Date.parse(iso) : void 0;
4017
4160
  }
4018
4161
  function defaultCodeUserRoots() {
4019
- const home = os4.homedir();
4162
+ const home = os5.homedir();
4020
4163
  if (process.platform === "win32") {
4021
4164
  const appData = process.env.APPDATA ?? path7.join(home, "AppData", "Roaming");
4022
4165
  return ["Code", "Code - Insiders", "VSCodium"].map((name) => path7.join(appData, name, "User"));
@@ -4151,7 +4294,7 @@ function errorMessage3(error) {
4151
4294
 
4152
4295
  // packages/core/src/sources/cursor.ts
4153
4296
  import fs8 from "node:fs";
4154
- import os5 from "node:os";
4297
+ import os6 from "node:os";
4155
4298
  import path8 from "node:path";
4156
4299
  import Database2 from "better-sqlite3";
4157
4300
  var parserVersion = "cursor-v1";
@@ -4160,7 +4303,7 @@ var maxDatabaseBytes = 100 * 1024 * 1024;
4160
4303
  var cursorStoragePrefixes = ["cursor.", "anysphere."];
4161
4304
  var interestingTerms = ["cursor", "composer", "aichat", "ai_chat", "aiservice", "agent-transcript", "prompttokenbreakdown"];
4162
4305
  function scanCursor(options) {
4163
- const cursorHome = options.cursorHome ?? path8.join(os5.homedir(), ".cursor");
4306
+ const cursorHome = options.cursorHome ?? path8.join(os6.homedir(), ".cursor");
4164
4307
  const discovery = discoverCursorFiles(cursorHome, Boolean(options.cursorHome));
4165
4308
  const jsonlFiles = discovery.jsonlFiles.filter((filePath) => fileMayOverlapScanWindow3(filePath, options.scanWindow));
4166
4309
  const databaseFiles = discovery.databaseFiles.filter((filePath) => fileMayOverlapScanWindow3(filePath, options.scanWindow));
@@ -4276,7 +4419,7 @@ function cursorOwnedChildDirs(root) {
4276
4419
  }
4277
4420
  }
4278
4421
  function defaultCursorAppPaths() {
4279
- const home = os5.homedir();
4422
+ const home = os6.homedir();
4280
4423
  if (process.platform === "win32") {
4281
4424
  const appData = process.env.APPDATA ?? path8.join(home, "AppData", "Roaming");
4282
4425
  const globalStoragePath2 = path8.join(appData, "Cursor", "User", "globalStorage");
@@ -5116,7 +5259,7 @@ function writeConfigData(nextConfig) {
5116
5259
  function writePricingData(models) {
5117
5260
  const config = loadConfig();
5118
5261
  const pricingPath = resolvePricingPath(config);
5119
- savePricingTable(pricingPath, models);
5262
+ savePricingTable(pricingPath, pricingOverrides(models));
5120
5263
  clearScanCache();
5121
5264
  return {
5122
5265
  path: pricingPath,
package/docs/pricing.md CHANGED
@@ -4,7 +4,15 @@ RepoSpend estimates API-equivalent cost from a local pricing table. The bundled
4
4
 
5
5
  The bundled table is seeded from public OpenAI, Anthropic, Google, and GitHub Copilot model references and is expressed as USD per 1M tokens. Pricing changes over time, so treat RepoSpend costs as API-equivalent estimates rather than invoice-grade accounting.
6
6
 
7
- The bundled defaults use currently published standard API prices unless a provider has an active introductory API rate. For example, Claude Sonnet 5 uses Anthropic's $2 input and $10 output introductory rate through August 31, 2026, with a pricing-table note for the $3 input and $15 output standard rate that starts September 1, 2026.
7
+ The bundled defaults use currently published standard API prices. Claude Sonnet 5 remains at $2 input and $10 output per 1M tokens because Anthropic made its introductory rate permanent on August 10, 2026.
8
+
9
+ GPT-6 Astra, Sol, and Luna use OpenAI's Standard short-context rates. Their long-context requests above 272,000 input tokens use different rates, and local session totals do not identify every request's pricing tier. Fast, batch, and regional processing can also differ from these defaults. RepoSpend keeps the result labeled as an API-equivalent estimate.
10
+
11
+ Claude Fable 5.1 and Mythos 5.1 retain their predecessor's base rates but have lower cache-read pricing. Claude Opus 5.5 has its own lower base and cache rates. These model rows use Anthropic's global Standard rates.
12
+
13
+ OpenAI reduced GPT-5.6 pricing effective July 30, 2026. RepoSpend uses $2 input and $12 output per 1M tokens for Terra, and $0.20 input and $1.20 output for Luna. Cached input remains 90% below the uncached input rate, and cache writes are billed at 1.25x the uncached input rate, so Luna's bundled cache-write rate is $0.25 per 1M tokens.
14
+
15
+ The Settings page persists only custom or intentionally edited model rows. This lets future bundled rate updates flow through automatically. Older full pricing files are migrated for the GPT-5.6 Terra and Luna reductions when they still contain the previous bundled rates.
8
16
 
9
17
  Some GitHub Copilot model rows are hosted or fine-tuned vendor models such as Raptor mini, MAI-Code-1-Flash, and Kimi K2.7 Code. RepoSpend prices those rows from GitHub's public per-token table as API-equivalent estimates, not as a Copilot invoice.
10
18
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "repospend",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Local-first dashboard for tracking AI coding token usage and API-equivalent spend by repository, session, model, and tool.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Mehmet Mustafa Demir",
@@ -232,7 +232,7 @@ Error generating stack: `+w.message+`
232
232
  *
233
233
  * This source code is licensed under the ISC license.
234
234
  * See the LICENSE file in the root directory of this source tree.
235
- */const NI=qe("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Qa(e){return e.toLowerCase().replace(/^github_copilot\//,"").replace(/^github-copilot\//,"").replace(/^copilot\//,"").replace(/claude-(opus|sonnet|haiku)-(\d+)\.(\d+)(?=$|[-.])/,"claude-$1-$2-$3")}function PP(e,t=()=>!0){const n=["claude-fable-5","claude-mythos-5","claude-opus-4-8-fast-mode","claude-opus-4-7","claude-opus-4-6","claude-opus-4-5","claude-opus-4-1","claude-opus-4","claude-sonnet-5","claude-sonnet-4-6","claude-sonnet-4-5","claude-sonnet-4","claude-haiku-4-5","claude-3-5-haiku"],r=Qa(e);if(r!=="claude-opus-4-6-fast-mode")return n.find(i=>(r===i||r.startsWith(`${i}-`)||r.startsWith(`${i}.`))&&t(i))}function AI(e,t=()=>!0){const n=Qa(e),r=PP(n,t);if(r)return r;if((n==="gpt-4.1"||n.startsWith("gpt-4.1-")||n.startsWith("gpt-41"))&&t("gpt-4.1"))return"gpt-4.1";if((n==="gemini-2.5-pro"||n.startsWith("gemini-2.5-pro-"))&&t("gemini-2.5-pro"))return"gemini-2.5-pro";if((n==="gemini-3-flash"||n.startsWith("gemini-3-flash-"))&&t("gemini-3-flash"))return"gemini-3-flash";if((n==="gemini-3.1-pro"||n.startsWith("gemini-3.1-pro-"))&&t("gemini-3.1-pro"))return"gemini-3.1-pro";if((n==="gemini-3.5-flash"||n.startsWith("gemini-3.5-flash-"))&&t("gemini-3.5-flash"))return"gemini-3.5-flash";if((n==="raptor-mini"||n.startsWith("raptor-mini-")||n.startsWith("oswe-vscode"))&&t("raptor-mini"))return"raptor-mini";if((n==="lark"||n.startsWith("lark-"))&&t("lark"))return"lark";if((n==="goldeneye"||n.startsWith("goldeneye-"))&&t("goldeneye"))return"goldeneye";if((n==="mai-code-1-flash"||n.startsWith("mai-code-1-flash-"))&&t("mai-code-1-flash"))return"mai-code-1-flash";if((n==="kimi-k2.7-code"||n.startsWith("kimi-k2.7-code-"))&&t("kimi-k2.7-code"))return"kimi-k2.7-code"}function rj(e){if(e.includes("fast-mode"))return;const t=e.match(/^(claude-(?:fable|mythos|opus|sonnet|haiku))-(\d+)(?:-(\d+))?/);if(t){const r=t[3]?Number(t[3]):0;return{tier:t[1],version:Number(t[2])+r/100}}const n=e.match(/^(gpt)-(\d)(?:\.(\d+))?(-[a-z][a-z0-9-]*)?$/);if(n){const r=n[3]?Number(n[3]):0;return{tier:`gpt${n[4]??""}`,version:Number(n[2])+r/100}}}function EI(e,t,n=()=>!0){const r=rj(Qa(e));if(!r)return;let i;for(const o of t){const u=rj(Qa(o));!u||u.tier!==r.tier||u.version>r.version||n(o)&&(!i||u.version>i.version)&&(i={id:o,version:u.version})}return i==null?void 0:i.id}function MI(e){const t=Qa(e);return t.startsWith("raptor-mini")||t.startsWith("oswe-vscode")||t==="lark"||t.startsWith("lark-")||t.startsWith("goldeneye")||t.startsWith("mai-code-1-flash")||t.startsWith("kimi-k2.7-code")}function ij(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Ba(e){return ij(e==null?void 0:e.inputPerMillion)&&ij(e==null?void 0:e.outputPerMillion)}function zx(e,t){const n=Qa(e),r=t[e]?e:t[n]?n:void 0,i=r?t[r]:void 0;if(Ba(i))return{pricing:i,sourceModel:r,inherited:!1};const o=EI(n,Object.keys(t),f=>Ba(t[f]));if(o)return{pricing:t[o],sourceModel:o,inherited:o!==e&&o!==n};const u=PP(n,f=>Ba(t[f]));if(u)return{pricing:t[u],sourceModel:u,inherited:u!==e&&u!==n};const c=AI(n,f=>Ba(t[f]));return c?{pricing:t[c],sourceModel:c,inherited:c!==e&&c!==n}:{pricing:i??{inputPerMillion:0,cacheCreationInputPerMillion:0,cachedInputPerMillion:0,outputPerMillion:0,reasoningOutputPerMillion:0},sourceModel:r,inherited:!1}}function NP(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=NP(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}function Be(){for(var e,t,n=0,r="",i=arguments.length;n<i;n++)(e=arguments[n])&&(t=NP(e))&&(r&&(r+=" "),r+=t);return r}var sp,aj;function dn(){if(aj)return sp;aj=1;var e=Array.isArray;return sp=e,sp}var lp,oj;function AP(){if(oj)return lp;oj=1;var e=typeof ec=="object"&&ec&&ec.Object===Object&&ec;return lp=e,lp}var up,sj;function mr(){if(sj)return up;sj=1;var e=AP(),t=typeof self=="object"&&self&&self.Object===Object&&self,n=e||t||Function("return this")();return up=n,up}var cp,lj;function Ml(){if(lj)return cp;lj=1;var e=mr(),t=e.Symbol;return cp=t,cp}var dp,uj;function II(){if(uj)return dp;uj=1;var e=Ml(),t=Object.prototype,n=t.hasOwnProperty,r=t.toString,i=e?e.toStringTag:void 0;function o(u){var c=n.call(u,i),f=u[i];try{u[i]=void 0;var h=!0}catch{}var v=r.call(u);return h&&(c?u[i]=f:delete u[i]),v}return dp=o,dp}var fp,cj;function RI(){if(cj)return fp;cj=1;var e=Object.prototype,t=e.toString;function n(r){return t.call(r)}return fp=n,fp}var hp,dj;function Lr(){if(dj)return hp;dj=1;var e=Ml(),t=II(),n=RI(),r="[object Null]",i="[object Undefined]",o=e?e.toStringTag:void 0;function u(c){return c==null?c===void 0?i:r:o&&o in Object(c)?t(c):n(c)}return hp=u,hp}var pp,fj;function Ur(){if(fj)return pp;fj=1;function e(t){return t!=null&&typeof t=="object"}return pp=e,pp}var mp,hj;function Oo(){if(hj)return mp;hj=1;var e=Lr(),t=Ur(),n="[object Symbol]";function r(i){return typeof i=="symbol"||t(i)&&e(i)==n}return mp=r,mp}var vp,pj;function Wx(){if(pj)return vp;pj=1;var e=dn(),t=Oo(),n=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,r=/^\w*$/;function i(o,u){if(e(o))return!1;var c=typeof o;return c=="number"||c=="symbol"||c=="boolean"||o==null||t(o)?!0:r.test(o)||!n.test(o)||u!=null&&o in Object(u)}return vp=i,vp}var gp,mj;function yi(){if(mj)return gp;mj=1;function e(t){var n=typeof t;return t!=null&&(n=="object"||n=="function")}return gp=e,gp}var yp,vj;function Hx(){if(vj)return yp;vj=1;var e=Lr(),t=yi(),n="[object AsyncFunction]",r="[object Function]",i="[object GeneratorFunction]",o="[object Proxy]";function u(c){if(!t(c))return!1;var f=e(c);return f==r||f==i||f==n||f==o}return yp=u,yp}var xp,gj;function $I(){if(gj)return xp;gj=1;var e=mr(),t=e["__core-js_shared__"];return xp=t,xp}var bp,yj;function DI(){if(yj)return bp;yj=1;var e=$I(),t=(function(){var r=/[^.]+$/.exec(e&&e.keys&&e.keys.IE_PROTO||"");return r?"Symbol(src)_1."+r:""})();function n(r){return!!t&&t in r}return bp=n,bp}var wp,xj;function EP(){if(xj)return wp;xj=1;var e=Function.prototype,t=e.toString;function n(r){if(r!=null){try{return t.call(r)}catch{}try{return r+""}catch{}}return""}return wp=n,wp}var jp,bj;function LI(){if(bj)return jp;bj=1;var e=Hx(),t=DI(),n=yi(),r=EP(),i=/[\\^$.*+?()[\]{}|]/g,o=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,f=u.toString,h=c.hasOwnProperty,v=RegExp("^"+f.call(h).replace(i,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function m(y){if(!n(y)||t(y))return!1;var b=e(y)?v:o;return b.test(r(y))}return jp=m,jp}var Sp,wj;function UI(){if(wj)return Sp;wj=1;function e(t,n){return t==null?void 0:t[n]}return Sp=e,Sp}var kp,jj;function oa(){if(jj)return kp;jj=1;var e=LI(),t=UI();function n(r,i){var o=t(r,i);return e(o)?o:void 0}return kp=n,kp}var Cp,Sj;function Pd(){if(Sj)return Cp;Sj=1;var e=oa(),t=e(Object,"create");return Cp=t,Cp}var _p,kj;function qI(){if(kj)return _p;kj=1;var e=Pd();function t(){this.__data__=e?e(null):{},this.size=0}return _p=t,_p}var Op,Cj;function FI(){if(Cj)return Op;Cj=1;function e(t){var n=this.has(t)&&delete this.__data__[t];return this.size-=n?1:0,n}return Op=e,Op}var Tp,_j;function BI(){if(_j)return Tp;_j=1;var e=Pd(),t="__lodash_hash_undefined__",n=Object.prototype,r=n.hasOwnProperty;function i(o){var u=this.__data__;if(e){var c=u[o];return c===t?void 0:c}return r.call(u,o)?u[o]:void 0}return Tp=i,Tp}var Pp,Oj;function zI(){if(Oj)return Pp;Oj=1;var e=Pd(),t=Object.prototype,n=t.hasOwnProperty;function r(i){var o=this.__data__;return e?o[i]!==void 0:n.call(o,i)}return Pp=r,Pp}var Np,Tj;function WI(){if(Tj)return Np;Tj=1;var e=Pd(),t="__lodash_hash_undefined__";function n(r,i){var o=this.__data__;return this.size+=this.has(r)?0:1,o[r]=e&&i===void 0?t:i,this}return Np=n,Np}var Ap,Pj;function HI(){if(Pj)return Ap;Pj=1;var e=qI(),t=FI(),n=BI(),r=zI(),i=WI();function o(u){var c=-1,f=u==null?0:u.length;for(this.clear();++c<f;){var h=u[c];this.set(h[0],h[1])}}return o.prototype.clear=e,o.prototype.delete=t,o.prototype.get=n,o.prototype.has=r,o.prototype.set=i,Ap=o,Ap}var Ep,Nj;function KI(){if(Nj)return Ep;Nj=1;function e(){this.__data__=[],this.size=0}return Ep=e,Ep}var Mp,Aj;function Kx(){if(Aj)return Mp;Aj=1;function e(t,n){return t===n||t!==t&&n!==n}return Mp=e,Mp}var Ip,Ej;function Nd(){if(Ej)return Ip;Ej=1;var e=Kx();function t(n,r){for(var i=n.length;i--;)if(e(n[i][0],r))return i;return-1}return Ip=t,Ip}var Rp,Mj;function VI(){if(Mj)return Rp;Mj=1;var e=Nd(),t=Array.prototype,n=t.splice;function r(i){var o=this.__data__,u=e(o,i);if(u<0)return!1;var c=o.length-1;return u==c?o.pop():n.call(o,u,1),--this.size,!0}return Rp=r,Rp}var $p,Ij;function GI(){if(Ij)return $p;Ij=1;var e=Nd();function t(n){var r=this.__data__,i=e(r,n);return i<0?void 0:r[i][1]}return $p=t,$p}var Dp,Rj;function XI(){if(Rj)return Dp;Rj=1;var e=Nd();function t(n){return e(this.__data__,n)>-1}return Dp=t,Dp}var Lp,$j;function YI(){if($j)return Lp;$j=1;var e=Nd();function t(n,r){var i=this.__data__,o=e(i,n);return o<0?(++this.size,i.push([n,r])):i[o][1]=r,this}return Lp=t,Lp}var Up,Dj;function Ad(){if(Dj)return Up;Dj=1;var e=KI(),t=VI(),n=GI(),r=XI(),i=YI();function o(u){var c=-1,f=u==null?0:u.length;for(this.clear();++c<f;){var h=u[c];this.set(h[0],h[1])}}return o.prototype.clear=e,o.prototype.delete=t,o.prototype.get=n,o.prototype.has=r,o.prototype.set=i,Up=o,Up}var qp,Lj;function Vx(){if(Lj)return qp;Lj=1;var e=oa(),t=mr(),n=e(t,"Map");return qp=n,qp}var Fp,Uj;function QI(){if(Uj)return Fp;Uj=1;var e=HI(),t=Ad(),n=Vx();function r(){this.size=0,this.__data__={hash:new e,map:new(n||t),string:new e}}return Fp=r,Fp}var Bp,qj;function ZI(){if(qj)return Bp;qj=1;function e(t){var n=typeof t;return n=="string"||n=="number"||n=="symbol"||n=="boolean"?t!=="__proto__":t===null}return Bp=e,Bp}var zp,Fj;function Ed(){if(Fj)return zp;Fj=1;var e=ZI();function t(n,r){var i=n.__data__;return e(r)?i[typeof r=="string"?"string":"hash"]:i.map}return zp=t,zp}var Wp,Bj;function JI(){if(Bj)return Wp;Bj=1;var e=Ed();function t(n){var r=e(this,n).delete(n);return this.size-=r?1:0,r}return Wp=t,Wp}var Hp,zj;function eR(){if(zj)return Hp;zj=1;var e=Ed();function t(n){return e(this,n).get(n)}return Hp=t,Hp}var Kp,Wj;function tR(){if(Wj)return Kp;Wj=1;var e=Ed();function t(n){return e(this,n).has(n)}return Kp=t,Kp}var Vp,Hj;function nR(){if(Hj)return Vp;Hj=1;var e=Ed();function t(n,r){var i=e(this,n),o=i.size;return i.set(n,r),this.size+=i.size==o?0:1,this}return Vp=t,Vp}var Gp,Kj;function Gx(){if(Kj)return Gp;Kj=1;var e=QI(),t=JI(),n=eR(),r=tR(),i=nR();function o(u){var c=-1,f=u==null?0:u.length;for(this.clear();++c<f;){var h=u[c];this.set(h[0],h[1])}}return o.prototype.clear=e,o.prototype.delete=t,o.prototype.get=n,o.prototype.has=r,o.prototype.set=i,Gp=o,Gp}var Xp,Vj;function MP(){if(Vj)return Xp;Vj=1;var e=Gx(),t="Expected a function";function n(r,i){if(typeof r!="function"||i!=null&&typeof i!="function")throw new TypeError(t);var o=function(){var u=arguments,c=i?i.apply(this,u):u[0],f=o.cache;if(f.has(c))return f.get(c);var h=r.apply(this,u);return o.cache=f.set(c,h)||f,h};return o.cache=new(n.Cache||e),o}return n.Cache=e,Xp=n,Xp}var Yp,Gj;function rR(){if(Gj)return Yp;Gj=1;var e=MP(),t=500;function n(r){var i=e(r,function(u){return o.size===t&&o.clear(),u}),o=i.cache;return i}return Yp=n,Yp}var Qp,Xj;function iR(){if(Xj)return Qp;Xj=1;var e=rR(),t=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,n=/\\(\\)?/g,r=e(function(i){var o=[];return i.charCodeAt(0)===46&&o.push(""),i.replace(t,function(u,c,f,h){o.push(f?h.replace(n,"$1"):c||u)}),o});return Qp=r,Qp}var Zp,Yj;function Xx(){if(Yj)return Zp;Yj=1;function e(t,n){for(var r=-1,i=t==null?0:t.length,o=Array(i);++r<i;)o[r]=n(t[r],r,t);return o}return Zp=e,Zp}var Jp,Qj;function aR(){if(Qj)return Jp;Qj=1;var e=Ml(),t=Xx(),n=dn(),r=Oo(),i=e?e.prototype:void 0,o=i?i.toString:void 0;function u(c){if(typeof c=="string")return c;if(n(c))return t(c,u)+"";if(r(c))return o?o.call(c):"";var f=c+"";return f=="0"&&1/c==-1/0?"-0":f}return Jp=u,Jp}var em,Zj;function IP(){if(Zj)return em;Zj=1;var e=aR();function t(n){return n==null?"":e(n)}return em=t,em}var tm,Jj;function RP(){if(Jj)return tm;Jj=1;var e=dn(),t=Wx(),n=iR(),r=IP();function i(o,u){return e(o)?o:t(o,u)?[o]:n(r(o))}return tm=i,tm}var nm,eS;function Md(){if(eS)return nm;eS=1;var e=Oo();function t(n){if(typeof n=="string"||e(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}return nm=t,nm}var rm,tS;function Yx(){if(tS)return rm;tS=1;var e=RP(),t=Md();function n(r,i){i=e(i,r);for(var o=0,u=i.length;r!=null&&o<u;)r=r[t(i[o++])];return o&&o==u?r:void 0}return rm=n,rm}var im,nS;function $P(){if(nS)return im;nS=1;var e=Yx();function t(n,r,i){var o=n==null?void 0:e(n,r);return o===void 0?i:o}return im=t,im}var oR=$P();const In=Ze(oR);var am,rS;function sR(){if(rS)return am;rS=1;function e(t){return t==null}return am=e,am}var lR=sR();const Le=Ze(lR);var om,iS;function uR(){if(iS)return om;iS=1;var e=Lr(),t=dn(),n=Ur(),r="[object String]";function i(o){return typeof o=="string"||!t(o)&&n(o)&&e(o)==r}return om=i,om}var cR=uR();const Qi=Ze(cR);var dR=Hx();const Re=Ze(dR);var fR=yi();const To=Ze(fR);var sm={exports:{}},Ve={};/**
235
+ */const NI=qe("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function Qa(e){return e.toLowerCase().replace(/^github_copilot\//,"").replace(/^github-copilot\//,"").replace(/^copilot\//,"").replace(/claude-(opus|sonnet|haiku)-(\d+)\.(\d+)(?=$|[-.])/,"claude-$1-$2-$3")}function PP(e,t=()=>!0){const n=["claude-fable-5-1","claude-fable-5","claude-mythos-5-1","claude-mythos-5","claude-opus-5-5","claude-opus-5","claude-opus-4-8-fast-mode","claude-opus-4-7","claude-opus-4-6","claude-opus-4-5","claude-opus-4-1","claude-opus-4","claude-sonnet-5","claude-sonnet-4-6","claude-sonnet-4-5","claude-sonnet-4","claude-haiku-4-5","claude-3-5-haiku"],r=Qa(e),i=o=>r===o||r.startsWith(`${o}-`)||r.startsWith(`${o}.`);return r.includes("fast-mode")?n.find(o=>o.includes("fast-mode")&&i(o)&&t(o)):n.find(o=>i(o)&&t(o))}function AI(e,t=()=>!0){const n=Qa(e),r=PP(n,t);if(r)return r;if((n==="gpt-4.1"||n.startsWith("gpt-4.1-")||n.startsWith("gpt-41"))&&t("gpt-4.1"))return"gpt-4.1";if((n==="gemini-2.5-pro"||n.startsWith("gemini-2.5-pro-"))&&t("gemini-2.5-pro"))return"gemini-2.5-pro";if((n==="gemini-3-flash"||n.startsWith("gemini-3-flash-"))&&t("gemini-3-flash"))return"gemini-3-flash";if((n==="gemini-3.1-pro"||n.startsWith("gemini-3.1-pro-"))&&t("gemini-3.1-pro"))return"gemini-3.1-pro";if((n==="gemini-3.5-flash"||n.startsWith("gemini-3.5-flash-"))&&t("gemini-3.5-flash"))return"gemini-3.5-flash";if((n==="raptor-mini"||n.startsWith("raptor-mini-")||n.startsWith("oswe-vscode"))&&t("raptor-mini"))return"raptor-mini";if((n==="lark"||n.startsWith("lark-"))&&t("lark"))return"lark";if((n==="goldeneye"||n.startsWith("goldeneye-"))&&t("goldeneye"))return"goldeneye";if((n==="mai-code-1-flash"||n.startsWith("mai-code-1-flash-"))&&t("mai-code-1-flash"))return"mai-code-1-flash";if((n==="kimi-k2.7-code"||n.startsWith("kimi-k2.7-code-"))&&t("kimi-k2.7-code"))return"kimi-k2.7-code"}function rj(e){if(e.includes("fast-mode"))return;const t=e.match(/^(claude-(?:fable|mythos|opus|sonnet|haiku))-(\d+)(?:-(\d+))?/);if(t){const r=t[3]?Number(t[3]):0;return{tier:t[1],version:Number(t[2])+r/100}}const n=e.match(/^(gpt)-(\d)(?:\.(\d+))?(-[a-z][a-z0-9-]*)?$/);if(n){const r=n[3]?Number(n[3]):0;return{tier:`gpt${n[4]??""}`,version:Number(n[2])+r/100}}}function EI(e,t,n=()=>!0){const r=rj(Qa(e));if(!r)return;let i;for(const o of t){const u=rj(Qa(o));!u||u.tier!==r.tier||u.version>r.version||n(o)&&(!i||u.version>i.version)&&(i={id:o,version:u.version})}return i==null?void 0:i.id}function MI(e){const t=Qa(e);return t.startsWith("raptor-mini")||t.startsWith("oswe-vscode")||t==="lark"||t.startsWith("lark-")||t.startsWith("goldeneye")||t.startsWith("mai-code-1-flash")||t.startsWith("kimi-k2.7-code")}function ij(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function Ba(e){return ij(e==null?void 0:e.inputPerMillion)&&ij(e==null?void 0:e.outputPerMillion)}function zx(e,t){const n=Qa(e),r=t[e]?e:t[n]?n:void 0,i=r?t[r]:void 0;if(Ba(i))return{pricing:i,sourceModel:r,inherited:!1};const o=EI(n,Object.keys(t),f=>Ba(t[f]));if(o)return{pricing:t[o],sourceModel:o,inherited:o!==e&&o!==n};const u=PP(n,f=>Ba(t[f]));if(u)return{pricing:t[u],sourceModel:u,inherited:u!==e&&u!==n};const c=AI(n,f=>Ba(t[f]));return c?{pricing:t[c],sourceModel:c,inherited:c!==e&&c!==n}:{pricing:i??{inputPerMillion:0,cacheCreationInputPerMillion:0,cachedInputPerMillion:0,outputPerMillion:0,reasoningOutputPerMillion:0},sourceModel:r,inherited:!1}}function NP(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=NP(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}function Be(){for(var e,t,n=0,r="",i=arguments.length;n<i;n++)(e=arguments[n])&&(t=NP(e))&&(r&&(r+=" "),r+=t);return r}var sp,aj;function dn(){if(aj)return sp;aj=1;var e=Array.isArray;return sp=e,sp}var lp,oj;function AP(){if(oj)return lp;oj=1;var e=typeof ec=="object"&&ec&&ec.Object===Object&&ec;return lp=e,lp}var up,sj;function mr(){if(sj)return up;sj=1;var e=AP(),t=typeof self=="object"&&self&&self.Object===Object&&self,n=e||t||Function("return this")();return up=n,up}var cp,lj;function Ml(){if(lj)return cp;lj=1;var e=mr(),t=e.Symbol;return cp=t,cp}var dp,uj;function II(){if(uj)return dp;uj=1;var e=Ml(),t=Object.prototype,n=t.hasOwnProperty,r=t.toString,i=e?e.toStringTag:void 0;function o(u){var c=n.call(u,i),f=u[i];try{u[i]=void 0;var h=!0}catch{}var v=r.call(u);return h&&(c?u[i]=f:delete u[i]),v}return dp=o,dp}var fp,cj;function RI(){if(cj)return fp;cj=1;var e=Object.prototype,t=e.toString;function n(r){return t.call(r)}return fp=n,fp}var hp,dj;function Lr(){if(dj)return hp;dj=1;var e=Ml(),t=II(),n=RI(),r="[object Null]",i="[object Undefined]",o=e?e.toStringTag:void 0;function u(c){return c==null?c===void 0?i:r:o&&o in Object(c)?t(c):n(c)}return hp=u,hp}var pp,fj;function Ur(){if(fj)return pp;fj=1;function e(t){return t!=null&&typeof t=="object"}return pp=e,pp}var mp,hj;function Oo(){if(hj)return mp;hj=1;var e=Lr(),t=Ur(),n="[object Symbol]";function r(i){return typeof i=="symbol"||t(i)&&e(i)==n}return mp=r,mp}var vp,pj;function Wx(){if(pj)return vp;pj=1;var e=dn(),t=Oo(),n=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,r=/^\w*$/;function i(o,u){if(e(o))return!1;var c=typeof o;return c=="number"||c=="symbol"||c=="boolean"||o==null||t(o)?!0:r.test(o)||!n.test(o)||u!=null&&o in Object(u)}return vp=i,vp}var gp,mj;function yi(){if(mj)return gp;mj=1;function e(t){var n=typeof t;return t!=null&&(n=="object"||n=="function")}return gp=e,gp}var yp,vj;function Hx(){if(vj)return yp;vj=1;var e=Lr(),t=yi(),n="[object AsyncFunction]",r="[object Function]",i="[object GeneratorFunction]",o="[object Proxy]";function u(c){if(!t(c))return!1;var f=e(c);return f==r||f==i||f==n||f==o}return yp=u,yp}var xp,gj;function $I(){if(gj)return xp;gj=1;var e=mr(),t=e["__core-js_shared__"];return xp=t,xp}var bp,yj;function DI(){if(yj)return bp;yj=1;var e=$I(),t=(function(){var r=/[^.]+$/.exec(e&&e.keys&&e.keys.IE_PROTO||"");return r?"Symbol(src)_1."+r:""})();function n(r){return!!t&&t in r}return bp=n,bp}var wp,xj;function EP(){if(xj)return wp;xj=1;var e=Function.prototype,t=e.toString;function n(r){if(r!=null){try{return t.call(r)}catch{}try{return r+""}catch{}}return""}return wp=n,wp}var jp,bj;function LI(){if(bj)return jp;bj=1;var e=Hx(),t=DI(),n=yi(),r=EP(),i=/[\\^$.*+?()[\]{}|]/g,o=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,f=u.toString,h=c.hasOwnProperty,v=RegExp("^"+f.call(h).replace(i,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function m(y){if(!n(y)||t(y))return!1;var b=e(y)?v:o;return b.test(r(y))}return jp=m,jp}var Sp,wj;function UI(){if(wj)return Sp;wj=1;function e(t,n){return t==null?void 0:t[n]}return Sp=e,Sp}var kp,jj;function oa(){if(jj)return kp;jj=1;var e=LI(),t=UI();function n(r,i){var o=t(r,i);return e(o)?o:void 0}return kp=n,kp}var Cp,Sj;function Pd(){if(Sj)return Cp;Sj=1;var e=oa(),t=e(Object,"create");return Cp=t,Cp}var _p,kj;function qI(){if(kj)return _p;kj=1;var e=Pd();function t(){this.__data__=e?e(null):{},this.size=0}return _p=t,_p}var Op,Cj;function FI(){if(Cj)return Op;Cj=1;function e(t){var n=this.has(t)&&delete this.__data__[t];return this.size-=n?1:0,n}return Op=e,Op}var Tp,_j;function BI(){if(_j)return Tp;_j=1;var e=Pd(),t="__lodash_hash_undefined__",n=Object.prototype,r=n.hasOwnProperty;function i(o){var u=this.__data__;if(e){var c=u[o];return c===t?void 0:c}return r.call(u,o)?u[o]:void 0}return Tp=i,Tp}var Pp,Oj;function zI(){if(Oj)return Pp;Oj=1;var e=Pd(),t=Object.prototype,n=t.hasOwnProperty;function r(i){var o=this.__data__;return e?o[i]!==void 0:n.call(o,i)}return Pp=r,Pp}var Np,Tj;function WI(){if(Tj)return Np;Tj=1;var e=Pd(),t="__lodash_hash_undefined__";function n(r,i){var o=this.__data__;return this.size+=this.has(r)?0:1,o[r]=e&&i===void 0?t:i,this}return Np=n,Np}var Ap,Pj;function HI(){if(Pj)return Ap;Pj=1;var e=qI(),t=FI(),n=BI(),r=zI(),i=WI();function o(u){var c=-1,f=u==null?0:u.length;for(this.clear();++c<f;){var h=u[c];this.set(h[0],h[1])}}return o.prototype.clear=e,o.prototype.delete=t,o.prototype.get=n,o.prototype.has=r,o.prototype.set=i,Ap=o,Ap}var Ep,Nj;function KI(){if(Nj)return Ep;Nj=1;function e(){this.__data__=[],this.size=0}return Ep=e,Ep}var Mp,Aj;function Kx(){if(Aj)return Mp;Aj=1;function e(t,n){return t===n||t!==t&&n!==n}return Mp=e,Mp}var Ip,Ej;function Nd(){if(Ej)return Ip;Ej=1;var e=Kx();function t(n,r){for(var i=n.length;i--;)if(e(n[i][0],r))return i;return-1}return Ip=t,Ip}var Rp,Mj;function VI(){if(Mj)return Rp;Mj=1;var e=Nd(),t=Array.prototype,n=t.splice;function r(i){var o=this.__data__,u=e(o,i);if(u<0)return!1;var c=o.length-1;return u==c?o.pop():n.call(o,u,1),--this.size,!0}return Rp=r,Rp}var $p,Ij;function GI(){if(Ij)return $p;Ij=1;var e=Nd();function t(n){var r=this.__data__,i=e(r,n);return i<0?void 0:r[i][1]}return $p=t,$p}var Dp,Rj;function XI(){if(Rj)return Dp;Rj=1;var e=Nd();function t(n){return e(this.__data__,n)>-1}return Dp=t,Dp}var Lp,$j;function YI(){if($j)return Lp;$j=1;var e=Nd();function t(n,r){var i=this.__data__,o=e(i,n);return o<0?(++this.size,i.push([n,r])):i[o][1]=r,this}return Lp=t,Lp}var Up,Dj;function Ad(){if(Dj)return Up;Dj=1;var e=KI(),t=VI(),n=GI(),r=XI(),i=YI();function o(u){var c=-1,f=u==null?0:u.length;for(this.clear();++c<f;){var h=u[c];this.set(h[0],h[1])}}return o.prototype.clear=e,o.prototype.delete=t,o.prototype.get=n,o.prototype.has=r,o.prototype.set=i,Up=o,Up}var qp,Lj;function Vx(){if(Lj)return qp;Lj=1;var e=oa(),t=mr(),n=e(t,"Map");return qp=n,qp}var Fp,Uj;function QI(){if(Uj)return Fp;Uj=1;var e=HI(),t=Ad(),n=Vx();function r(){this.size=0,this.__data__={hash:new e,map:new(n||t),string:new e}}return Fp=r,Fp}var Bp,qj;function ZI(){if(qj)return Bp;qj=1;function e(t){var n=typeof t;return n=="string"||n=="number"||n=="symbol"||n=="boolean"?t!=="__proto__":t===null}return Bp=e,Bp}var zp,Fj;function Ed(){if(Fj)return zp;Fj=1;var e=ZI();function t(n,r){var i=n.__data__;return e(r)?i[typeof r=="string"?"string":"hash"]:i.map}return zp=t,zp}var Wp,Bj;function JI(){if(Bj)return Wp;Bj=1;var e=Ed();function t(n){var r=e(this,n).delete(n);return this.size-=r?1:0,r}return Wp=t,Wp}var Hp,zj;function eR(){if(zj)return Hp;zj=1;var e=Ed();function t(n){return e(this,n).get(n)}return Hp=t,Hp}var Kp,Wj;function tR(){if(Wj)return Kp;Wj=1;var e=Ed();function t(n){return e(this,n).has(n)}return Kp=t,Kp}var Vp,Hj;function nR(){if(Hj)return Vp;Hj=1;var e=Ed();function t(n,r){var i=e(this,n),o=i.size;return i.set(n,r),this.size+=i.size==o?0:1,this}return Vp=t,Vp}var Gp,Kj;function Gx(){if(Kj)return Gp;Kj=1;var e=QI(),t=JI(),n=eR(),r=tR(),i=nR();function o(u){var c=-1,f=u==null?0:u.length;for(this.clear();++c<f;){var h=u[c];this.set(h[0],h[1])}}return o.prototype.clear=e,o.prototype.delete=t,o.prototype.get=n,o.prototype.has=r,o.prototype.set=i,Gp=o,Gp}var Xp,Vj;function MP(){if(Vj)return Xp;Vj=1;var e=Gx(),t="Expected a function";function n(r,i){if(typeof r!="function"||i!=null&&typeof i!="function")throw new TypeError(t);var o=function(){var u=arguments,c=i?i.apply(this,u):u[0],f=o.cache;if(f.has(c))return f.get(c);var h=r.apply(this,u);return o.cache=f.set(c,h)||f,h};return o.cache=new(n.Cache||e),o}return n.Cache=e,Xp=n,Xp}var Yp,Gj;function rR(){if(Gj)return Yp;Gj=1;var e=MP(),t=500;function n(r){var i=e(r,function(u){return o.size===t&&o.clear(),u}),o=i.cache;return i}return Yp=n,Yp}var Qp,Xj;function iR(){if(Xj)return Qp;Xj=1;var e=rR(),t=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,n=/\\(\\)?/g,r=e(function(i){var o=[];return i.charCodeAt(0)===46&&o.push(""),i.replace(t,function(u,c,f,h){o.push(f?h.replace(n,"$1"):c||u)}),o});return Qp=r,Qp}var Zp,Yj;function Xx(){if(Yj)return Zp;Yj=1;function e(t,n){for(var r=-1,i=t==null?0:t.length,o=Array(i);++r<i;)o[r]=n(t[r],r,t);return o}return Zp=e,Zp}var Jp,Qj;function aR(){if(Qj)return Jp;Qj=1;var e=Ml(),t=Xx(),n=dn(),r=Oo(),i=e?e.prototype:void 0,o=i?i.toString:void 0;function u(c){if(typeof c=="string")return c;if(n(c))return t(c,u)+"";if(r(c))return o?o.call(c):"";var f=c+"";return f=="0"&&1/c==-1/0?"-0":f}return Jp=u,Jp}var em,Zj;function IP(){if(Zj)return em;Zj=1;var e=aR();function t(n){return n==null?"":e(n)}return em=t,em}var tm,Jj;function RP(){if(Jj)return tm;Jj=1;var e=dn(),t=Wx(),n=iR(),r=IP();function i(o,u){return e(o)?o:t(o,u)?[o]:n(r(o))}return tm=i,tm}var nm,eS;function Md(){if(eS)return nm;eS=1;var e=Oo();function t(n){if(typeof n=="string"||e(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}return nm=t,nm}var rm,tS;function Yx(){if(tS)return rm;tS=1;var e=RP(),t=Md();function n(r,i){i=e(i,r);for(var o=0,u=i.length;r!=null&&o<u;)r=r[t(i[o++])];return o&&o==u?r:void 0}return rm=n,rm}var im,nS;function $P(){if(nS)return im;nS=1;var e=Yx();function t(n,r,i){var o=n==null?void 0:e(n,r);return o===void 0?i:o}return im=t,im}var oR=$P();const In=Ze(oR);var am,rS;function sR(){if(rS)return am;rS=1;function e(t){return t==null}return am=e,am}var lR=sR();const Le=Ze(lR);var om,iS;function uR(){if(iS)return om;iS=1;var e=Lr(),t=dn(),n=Ur(),r="[object String]";function i(o){return typeof o=="string"||!t(o)&&n(o)&&e(o)==r}return om=i,om}var cR=uR();const Qi=Ze(cR);var dR=Hx();const Re=Ze(dR);var fR=yi();const To=Ze(fR);var sm={exports:{}},Ve={};/**
236
236
  * @license React
237
237
  * react-is.production.min.js
238
238
  *
@@ -10,7 +10,7 @@
10
10
  <meta name="theme-color" content="#060b12" />
11
11
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
12
12
  <title>RepoSpend</title>
13
- <script type="module" crossorigin src="/assets/index-BgcURWGy.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-C9ld0JFH.js"></script>
14
14
  <link rel="stylesheet" crossorigin href="/assets/index-Bzdfbi5w.css">
15
15
  </head>
16
16
  <body>