Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a104ad8d0 | ||
|
|
59c911dff4 | ||
|
|
127fc82b2a | ||
|
|
9bde5b74a0 | ||
|
|
bdede36b5f | ||
|
|
d2cb75a8dc | ||
|
|
01188b3009 | ||
|
|
54b89b8e55 | ||
|
|
24dbf013e7 | ||
|
|
5a799899ef | ||
|
|
f318713ba5 |
@@ -30,7 +30,6 @@ jobs:
|
||||
dotnet publish windows/ClaudeCheckerWindows.csproj `
|
||||
-c Release -r win-x64 `
|
||||
--self-contained true `
|
||||
-p:PublishSingleFile=true `
|
||||
-p:Version=${{ steps.version.outputs.version }} `
|
||||
-o publish
|
||||
|
||||
|
||||
@@ -31,7 +31,6 @@ jobs:
|
||||
dotnet publish windows/ClaudeCheckerWindows.csproj `
|
||||
-c Release -r win-x64 `
|
||||
--self-contained true `
|
||||
-p:PublishSingleFile=true `
|
||||
-p:Version=${{ steps.version.outputs.version }} `
|
||||
-o publish
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
VerticalAlignment="Center" Text="Waiting for sign-in…"/>
|
||||
<Button Grid.Column="1" Content="Done — I'm signed in"
|
||||
Style="{StaticResource PrimaryButton}" Click="Done_Click"
|
||||
x:Name="DoneButton" IsEnabled="False"/>
|
||||
x:Name="DoneButton"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
@@ -33,13 +33,11 @@ public partial class LoginWindow : Window
|
||||
|
||||
var cookies = await Browser.CoreWebView2.CookieManager.GetCookiesAsync("https://claude.ai");
|
||||
var signedIn = System.Linq.Enumerable.Any(cookies, c =>
|
||||
c.Name.Equals("sessionKey", System.StringComparison.OrdinalIgnoreCase) ||
|
||||
c.Name.StartsWith("sk-ant", System.StringComparison.OrdinalIgnoreCase));
|
||||
c.Domain.Contains("claude.ai") || c.Domain.Contains("anthropic.com"));
|
||||
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
DoneButton.IsEnabled = !uri.Contains("/login") && !uri.Contains("/signin");
|
||||
StatusText.Text = signedIn
|
||||
StatusText.Text = signedIn && !uri.Contains("/login") && !uri.Contains("/signin")
|
||||
? "Signed in — click Done to continue."
|
||||
: "Complete sign-in, then click Done.";
|
||||
});
|
||||
|
||||
@@ -495,13 +495,21 @@ public partial class PopupWindow : Window
|
||||
|
||||
private void CopyDiag_Click(object s, RoutedEventArgs e)
|
||||
{
|
||||
var diagText = BuildDiagText();
|
||||
for (int i = 0; i < 5; i++)
|
||||
try
|
||||
{
|
||||
try { Clipboard.SetText(diagText); break; }
|
||||
catch (Exception) { System.Threading.Thread.Sleep(100); }
|
||||
// SetDataObject(data, false) skips Flush() — avoids CLIPBRD_E_CANT_OPEN crash
|
||||
var diagText = BuildDiagText();
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
try { Clipboard.SetDataObject(diagText, false); break; }
|
||||
catch (Exception) { System.Threading.Thread.Sleep(100); }
|
||||
}
|
||||
CopyDiagButton.Content = "Copied! (IDs redacted)";
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
CopyDiagButton.Content = "Copy failed";
|
||||
}
|
||||
CopyDiagButton.Content = "Copied! (IDs redacted)";
|
||||
var t = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1.5) };
|
||||
t.Tick += (_, _) => { CopyDiagButton.Content = "Copy All"; t.Stop(); };
|
||||
t.Start();
|
||||
@@ -700,7 +708,9 @@ public partial class PopupWindow : Window
|
||||
|
||||
_ = Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(3000);
|
||||
// Re-navigate background browser with fresh session, then refresh immediately
|
||||
await Application.Current.Dispatcher.InvokeAsync(
|
||||
() => App.BackgroundBrowser.ReloadAsync()).Task.Unwrap();
|
||||
await VM.RefreshAsync();
|
||||
await Application.Current.Dispatcher.InvokeAsync(InitSettings);
|
||||
});
|
||||
|
||||
+14
-19
@@ -1,23 +1,18 @@
|
||||
## What's new in beta.49
|
||||
## What's new in beta.62
|
||||
|
||||
### Architecture
|
||||
- All data (usage, plan, overage, prepaid credits) now fetched via the persistent background WebView2 — the same always-live session as the macOS app, so Cloudflare cookies never expire between refreshes
|
||||
- HttpClient path kept only as a brief startup fallback before the browser is ready
|
||||
- Settings file simplified: only stores session signal, burn history, and user preferences — no more cached API responses
|
||||
### Installer
|
||||
- App now ships as a proper Windows installer (no more zip extract)
|
||||
- Installs to user AppData — no admin rights required
|
||||
- Auto-update now downloads and silently runs the new installer, then relaunches
|
||||
- Desktop shortcut creation is optional during install
|
||||
|
||||
### Bug fixes
|
||||
- Plan label (e.g. "Pro") now updates on every refresh, not just at login
|
||||
- Extra Usage Credits values now correct (were 100× too large)
|
||||
- Limit and balance now update live on every refresh
|
||||
- Refresh interval dropdown now shows "1 min", "2 min" etc. correctly
|
||||
- ComboBox no longer flashes bright blue when clicked
|
||||
- Buttons now show a visible pressed state
|
||||
- Footer "Updated X ago" counter now ticks every second; shows "X min, Y sec ago" past 60 s
|
||||
- Removed stray sparkline bars from the 5 h and 7 d limit cards
|
||||
- App window now shown on launch
|
||||
- Fixed app crash on launch (startup DllNotFoundException caused by single-file publish; all DLLs now installed alongside the exe)
|
||||
- Fixed clicking Copy in Diagnostics crashing the app (CLIPBRD_E_CANT_OPEN)
|
||||
- Fixed Sign In — Done button now always clickable; session detection no longer depends on specific cookie names that may have changed
|
||||
|
||||
### UI improvements
|
||||
- Gauge percentage larger, "used" label removed
|
||||
- Each limit card now shows an "after reset" or "today HH:MM" badge
|
||||
- Session Diary card redesigned to match macOS layout (stats row + sparkline, no Claude header)
|
||||
- Reset date moved inline with time remaining
|
||||
### Diagnostics
|
||||
- Org IDs are now redacted when copying diagnostics text
|
||||
- Removed stale Cookie Store section (always showed 0)
|
||||
- Fixed missing fields in copied diagnostics output
|
||||
- Privacy note added below diagnostics header
|
||||
|
||||
@@ -129,6 +129,20 @@ public sealed class WebViewFetchWindow : Window
|
||||
return await tcs.Task;
|
||||
}
|
||||
|
||||
// Re-navigate to claude.ai with the current session (call after sign-in).
|
||||
public async Task ReloadAsync()
|
||||
{
|
||||
if (_wv.CoreWebView2 == null) { await InitAsync(); return; }
|
||||
_readyForScript = false;
|
||||
var navDone = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||
EventHandler<CoreWebView2NavigationCompletedEventArgs>? h = null;
|
||||
h = (_, e) => { _wv.CoreWebView2.NavigationCompleted -= h; navDone.TrySetResult(e.IsSuccess); };
|
||||
_wv.CoreWebView2.NavigationCompleted += h;
|
||||
_wv.CoreWebView2.Navigate("https://claude.ai");
|
||||
await Task.WhenAny(navDone.Task, Task.Delay(15000));
|
||||
_readyForScript = navDone.Task.IsCompletedSuccessfully && navDone.Task.Result;
|
||||
}
|
||||
|
||||
// ── Shared init ───────────────────────────────────────────────────────────
|
||||
|
||||
private int _initGuard;
|
||||
|
||||
@@ -13,7 +13,7 @@ DefaultDirName={localappdata}\ClaudeChecker
|
||||
DefaultGroupName=ClaudeChecker
|
||||
DisableProgramGroupPage=yes
|
||||
PrivilegesRequired=lowest
|
||||
OutputDir=..
|
||||
OutputDir=.
|
||||
OutputBaseFilename=ClaudeChecker-Installer
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
@@ -28,12 +28,11 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
|
||||
[Files]
|
||||
Source: "publish\ClaudeChecker.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "publish\Assets\*"; DestDir: "{app}\Assets"; Flags: ignoreversion recursesubdirs
|
||||
Source: "publish\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
|
||||
|
||||
[Icons]
|
||||
Name: "{group}\ClaudeChecker"; Filename: "{app}\ClaudeChecker.exe"
|
||||
Name: "{commondesktop}\ClaudeChecker"; Filename: "{app}\ClaudeChecker.exe"; Tasks: desktopicon
|
||||
Name: "{userdesktop}\ClaudeChecker"; Filename: "{app}\ClaudeChecker.exe"; Tasks: desktopicon
|
||||
|
||||
[Run]
|
||||
; Silent install (auto-update): launch automatically
|
||||
|
||||
Reference in New Issue
Block a user