From 2f4cc48d0572065616bdd106b189e34eed9d6a41 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 26 Sep 2025 22:26:44 +0000 Subject: [PATCH 1/3] Initial plan From 33e21f33cd0502ea3e61549690eef6e872fb1124 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 26 Sep 2025 22:29:23 +0000 Subject: [PATCH 2/3] Initial plan for water usage estimation feature Co-authored-by: rajbos <6085745+rajbos@users.noreply.github.com> --- package-lock.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a689708..e074e8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -898,7 +898,6 @@ "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/types": "8.44.1", @@ -1145,7 +1144,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2394,7 +2392,6 @@ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6368,7 +6365,6 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" From 2056bf23646cd42e0b5e605c1e4d9195f60669bd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 26 Sep 2025 22:33:20 +0000 Subject: [PATCH 3/3] Add water usage estimation feature with UI integration Co-authored-by: rajbos <6085745+rajbos@users.noreply.github.com> --- src/extension.ts | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 7183ef0..8c03861 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -22,6 +22,7 @@ interface DetailedStats { modelUsage: ModelUsage; co2: number; treesEquivalent: number; + waterUsage: number; }; month: { tokens: number; @@ -31,6 +32,7 @@ interface DetailedStats { modelUsage: ModelUsage; co2: number; treesEquivalent: number; + waterUsage: number; }; lastUpdated: Date; } @@ -56,6 +58,7 @@ class CopilotTokenTracker { }; private co2Per1kTokens = 0.2; // gCO2e per 1000 tokens, a rough estimate private co2AbsorptionPerTreePerYear = 21000; // grams of CO2 per tree per year + private waterUsagePer1kTokens = 0.3; // liters of water per 1000 tokens, based on data center usage estimates constructor() { console.log('CopilotTokenTracker: Constructor called'); @@ -95,12 +98,14 @@ class CopilotTokenTracker { tooltip.appendMarkdown('### 📅 Today\n'); tooltip.appendMarkdown(`**Tokens:** ${detailedStats.today.tokens.toLocaleString()}\n\n`); tooltip.appendMarkdown(`**COâ‚‚ Est.:** ${detailedStats.today.co2.toFixed(2)}g\n\n`); + tooltip.appendMarkdown(`**Water Est.:** ${detailedStats.today.waterUsage.toFixed(3)}L\n\n`); tooltip.appendMarkdown(`**Sessions:** ${detailedStats.today.sessions}\n\n`); tooltip.appendMarkdown(`**Avg Interactions/Session:** ${detailedStats.today.avgInteractionsPerSession}\n\n`); tooltip.appendMarkdown(`**Avg Tokens/Session:** ${detailedStats.today.avgTokensPerSession.toLocaleString()}\n\n`); tooltip.appendMarkdown('### 📊 This Month\n'); tooltip.appendMarkdown(`**Tokens:** ${detailedStats.month.tokens.toLocaleString()}\n\n`); tooltip.appendMarkdown(`**COâ‚‚ Est.:** ${detailedStats.month.co2.toFixed(2)}g\n\n`); + tooltip.appendMarkdown(`**Water Est.:** ${detailedStats.month.waterUsage.toFixed(3)}L\n\n`); tooltip.appendMarkdown(`**Sessions:** ${detailedStats.month.sessions}\n\n`); tooltip.appendMarkdown(`**Avg Interactions/Session:** ${detailedStats.month.avgInteractionsPerSession}\n\n`); tooltip.appendMarkdown(`**Avg Tokens/Session:** ${detailedStats.month.avgTokensPerSession.toLocaleString()}\n\n`); @@ -215,6 +220,9 @@ class CopilotTokenTracker { const todayCo2 = (todayStats.tokens / 1000) * this.co2Per1kTokens; const monthCo2 = (monthStats.tokens / 1000) * this.co2Per1kTokens; + + const todayWater = (todayStats.tokens / 1000) * this.waterUsagePer1kTokens; + const monthWater = (monthStats.tokens / 1000) * this.waterUsagePer1kTokens; const result: DetailedStats = { today: { @@ -224,7 +232,8 @@ class CopilotTokenTracker { avgTokensPerSession: todayStats.sessions > 0 ? Math.round(todayStats.tokens / todayStats.sessions) : 0, modelUsage: todayStats.modelUsage, co2: todayCo2, - treesEquivalent: todayCo2 / this.co2AbsorptionPerTreePerYear + treesEquivalent: todayCo2 / this.co2AbsorptionPerTreePerYear, + waterUsage: todayWater }, month: { tokens: monthStats.tokens, @@ -233,7 +242,8 @@ class CopilotTokenTracker { avgTokensPerSession: monthStats.sessions > 0 ? Math.round(monthStats.tokens / monthStats.sessions) : 0, modelUsage: monthStats.modelUsage, co2: monthCo2, - treesEquivalent: monthCo2 / this.co2AbsorptionPerTreePerYear + treesEquivalent: monthCo2 / this.co2AbsorptionPerTreePerYear, + waterUsage: monthWater }, lastUpdated: now }; @@ -460,6 +470,7 @@ class CopilotTokenTracker { const projectedSessions = calculateProjection(stats.month.sessions); const projectedCo2 = calculateProjection(stats.month.co2); const projectedTrees = calculateProjection(stats.month.treesEquivalent); + const projectedWater = calculateProjection(stats.month.waterUsage); return ` @@ -642,6 +653,12 @@ class CopilotTokenTracker { ${stats.month.co2.toFixed(2)} g ${projectedCo2.toFixed(2)} g + + 💧 Est. Water (${this.waterUsagePer1kTokens}L/1k tk) + ${stats.today.waterUsage.toFixed(3)} L + ${stats.month.waterUsage.toFixed(3)} L + ${projectedWater.toFixed(3)} L + 🌳 Tree Equivalent (yr) ${stats.today.treesEquivalent.toFixed(6)} @@ -659,11 +676,12 @@ class CopilotTokenTracker { Calculation & Estimates

- Token counts are estimated based on character count. COâ‚‚ and tree equivalents are derived from these token estimates. + Token counts are estimated based on character count. COâ‚‚, tree equivalents, and water usage are derived from these token estimates.