... # HTTP headers scoped to URL's origin
-agent-browser --executable-path # Custom browser executable
-agent-browser --extension ... # Load browser extension (repeatable)
-agent-browser --ignore-https-errors # Ignore SSL certificate errors
-agent-browser --help # Show help (-h)
-agent-browser --version # Show version (-V)
-agent-browser --help # Show detailed help for a command
-```
-
-## Debugging
-
-```bash
-agent-browser --headed open example.com # Show browser window
-agent-browser --cdp 9222 snapshot # Connect via CDP port
-agent-browser connect 9222 # Alternative: connect command
-agent-browser console # View console messages
-agent-browser console --clear # Clear console
-agent-browser errors # View page errors
-agent-browser errors --clear # Clear errors
-agent-browser highlight @e1 # Highlight element
-agent-browser trace start # Start recording trace
-agent-browser trace stop trace.zip # Stop and save trace
-```
-
-## Environment Variables
-
-```bash
-AGENT_BROWSER_SESSION="mysession" # Default session name
-AGENT_BROWSER_EXECUTABLE_PATH="/path/chrome" # Custom browser path
-AGENT_BROWSER_EXTENSIONS="/ext1,/ext2" # Comma-separated extension paths
-AGENT_BROWSER_PROVIDER="browserbase" # Cloud browser provider
-AGENT_BROWSER_STREAM_PORT="9223" # WebSocket streaming port
-AGENT_BROWSER_HOME="/path/to/agent-browser" # Custom install location
-```
diff --git a/.github/.agents/skills/agent-browser/references/proxy-support.md b/.github/.agents/skills/agent-browser/references/proxy-support.md
deleted file mode 100644
index 05cc9d538f..0000000000
--- a/.github/.agents/skills/agent-browser/references/proxy-support.md
+++ /dev/null
@@ -1,188 +0,0 @@
-# Proxy Support
-
-Proxy configuration for geo-testing, rate limiting avoidance, and corporate environments.
-
-**Related**: [commands.md](commands.md) for global options, [SKILL.md](../SKILL.md) for quick start.
-
-## Contents
-
-- [Basic Proxy Configuration](#basic-proxy-configuration)
-- [Authenticated Proxy](#authenticated-proxy)
-- [SOCKS Proxy](#socks-proxy)
-- [Proxy Bypass](#proxy-bypass)
-- [Common Use Cases](#common-use-cases)
-- [Verifying Proxy Connection](#verifying-proxy-connection)
-- [Troubleshooting](#troubleshooting)
-- [Best Practices](#best-practices)
-
-## Basic Proxy Configuration
-
-Set proxy via environment variable before starting:
-
-```bash
-# HTTP proxy
-export HTTP_PROXY="http://proxy.example.com:8080"
-agent-browser open https://example.com
-
-# HTTPS proxy
-export HTTPS_PROXY="https://proxy.example.com:8080"
-agent-browser open https://example.com
-
-# Both
-export HTTP_PROXY="http://proxy.example.com:8080"
-export HTTPS_PROXY="http://proxy.example.com:8080"
-agent-browser open https://example.com
-```
-
-## Authenticated Proxy
-
-For proxies requiring authentication:
-
-```bash
-# Include credentials in URL
-export HTTP_PROXY="http://username:password@proxy.example.com:8080"
-agent-browser open https://example.com
-```
-
-## SOCKS Proxy
-
-```bash
-# SOCKS5 proxy
-export ALL_PROXY="socks5://proxy.example.com:1080"
-agent-browser open https://example.com
-
-# SOCKS5 with auth
-export ALL_PROXY="socks5://user:pass@proxy.example.com:1080"
-agent-browser open https://example.com
-```
-
-## Proxy Bypass
-
-Skip proxy for specific domains:
-
-```bash
-# Bypass proxy for local addresses
-export NO_PROXY="localhost,127.0.0.1,.internal.company.com"
-agent-browser open https://internal.company.com # Direct connection
-agent-browser open https://external.com # Via proxy
-```
-
-## Common Use Cases
-
-### Geo-Location Testing
-
-```bash
-#!/bin/bash
-# Test site from different regions using geo-located proxies
-
-PROXIES=(
- "http://us-proxy.example.com:8080"
- "http://eu-proxy.example.com:8080"
- "http://asia-proxy.example.com:8080"
-)
-
-for proxy in "${PROXIES[@]}"; do
- export HTTP_PROXY="$proxy"
- export HTTPS_PROXY="$proxy"
-
- region=$(echo "$proxy" | grep -oP '^\w+-\w+')
- echo "Testing from: $region"
-
- agent-browser --session "$region" open https://example.com
- agent-browser --session "$region" screenshot "./screenshots/$region.png"
- agent-browser --session "$region" close
-done
-```
-
-### Rotating Proxies for Scraping
-
-```bash
-#!/bin/bash
-# Rotate through proxy list to avoid rate limiting
-
-PROXY_LIST=(
- "http://proxy1.example.com:8080"
- "http://proxy2.example.com:8080"
- "http://proxy3.example.com:8080"
-)
-
-URLS=(
- "https://site.com/page1"
- "https://site.com/page2"
- "https://site.com/page3"
-)
-
-for i in "${!URLS[@]}"; do
- proxy_index=$((i % ${#PROXY_LIST[@]}))
- export HTTP_PROXY="${PROXY_LIST[$proxy_index]}"
- export HTTPS_PROXY="${PROXY_LIST[$proxy_index]}"
-
- agent-browser open "${URLS[$i]}"
- agent-browser get text body > "output-$i.txt"
- agent-browser close
-
- sleep 1 # Polite delay
-done
-```
-
-### Corporate Network Access
-
-```bash
-#!/bin/bash
-# Access internal sites via corporate proxy
-
-export HTTP_PROXY="http://corpproxy.company.com:8080"
-export HTTPS_PROXY="http://corpproxy.company.com:8080"
-export NO_PROXY="localhost,127.0.0.1,.company.com"
-
-# External sites go through proxy
-agent-browser open https://external-vendor.com
-
-# Internal sites bypass proxy
-agent-browser open https://intranet.company.com
-```
-
-## Verifying Proxy Connection
-
-```bash
-# Check your apparent IP
-agent-browser open https://httpbin.org/ip
-agent-browser get text body
-# Should show proxy's IP, not your real IP
-```
-
-## Troubleshooting
-
-### Proxy Connection Failed
-
-```bash
-# Test proxy connectivity first
-curl -x http://proxy.example.com:8080 https://httpbin.org/ip
-
-# Check if proxy requires auth
-export HTTP_PROXY="http://user:pass@proxy.example.com:8080"
-```
-
-### SSL/TLS Errors Through Proxy
-
-Some proxies perform SSL inspection. If you encounter certificate errors:
-
-```bash
-# For testing only - not recommended for production
-agent-browser open https://example.com --ignore-https-errors
-```
-
-### Slow Performance
-
-```bash
-# Use proxy only when necessary
-export NO_PROXY="*.cdn.com,*.static.com" # Direct CDN access
-```
-
-## Best Practices
-
-1. **Use environment variables** - Don't hardcode proxy credentials
-2. **Set NO_PROXY appropriately** - Avoid routing local traffic through proxy
-3. **Test proxy before automation** - Verify connectivity with simple requests
-4. **Handle proxy failures gracefully** - Implement retry logic for unstable proxies
-5. **Rotate proxies for large scraping jobs** - Distribute load and avoid bans
diff --git a/.github/.agents/skills/agent-browser/references/session-management.md b/.github/.agents/skills/agent-browser/references/session-management.md
deleted file mode 100644
index bb5312dbdb..0000000000
--- a/.github/.agents/skills/agent-browser/references/session-management.md
+++ /dev/null
@@ -1,193 +0,0 @@
-# Session Management
-
-Multiple isolated browser sessions with state persistence and concurrent browsing.
-
-**Related**: [authentication.md](authentication.md) for login patterns, [SKILL.md](../SKILL.md) for quick start.
-
-## Contents
-
-- [Named Sessions](#named-sessions)
-- [Session Isolation Properties](#session-isolation-properties)
-- [Session State Persistence](#session-state-persistence)
-- [Common Patterns](#common-patterns)
-- [Default Session](#default-session)
-- [Session Cleanup](#session-cleanup)
-- [Best Practices](#best-practices)
-
-## Named Sessions
-
-Use `--session` flag to isolate browser contexts:
-
-```bash
-# Session 1: Authentication flow
-agent-browser --session auth open https://app.example.com/login
-
-# Session 2: Public browsing (separate cookies, storage)
-agent-browser --session public open https://example.com
-
-# Commands are isolated by session
-agent-browser --session auth fill @e1 "user@example.com"
-agent-browser --session public get text body
-```
-
-## Session Isolation Properties
-
-Each session has independent:
-- Cookies
-- LocalStorage / SessionStorage
-- IndexedDB
-- Cache
-- Browsing history
-- Open tabs
-
-## Session State Persistence
-
-### Save Session State
-
-```bash
-# Save cookies, storage, and auth state
-agent-browser state save /path/to/auth-state.json
-```
-
-### Load Session State
-
-```bash
-# Restore saved state
-agent-browser state load /path/to/auth-state.json
-
-# Continue with authenticated session
-agent-browser open https://app.example.com/dashboard
-```
-
-### State File Contents
-
-```json
-{
- "cookies": [...],
- "localStorage": {...},
- "sessionStorage": {...},
- "origins": [...]
-}
-```
-
-## Common Patterns
-
-### Authenticated Session Reuse
-
-```bash
-#!/bin/bash
-# Save login state once, reuse many times
-
-STATE_FILE="/tmp/auth-state.json"
-
-# Check if we have saved state
-if [[ -f "$STATE_FILE" ]]; then
- agent-browser state load "$STATE_FILE"
- agent-browser open https://app.example.com/dashboard
-else
- # Perform login
- agent-browser open https://app.example.com/login
- agent-browser snapshot -i
- agent-browser fill @e1 "$USERNAME"
- agent-browser fill @e2 "$PASSWORD"
- agent-browser click @e3
- agent-browser wait --load networkidle
-
- # Save for future use
- agent-browser state save "$STATE_FILE"
-fi
-```
-
-### Concurrent Scraping
-
-```bash
-#!/bin/bash
-# Scrape multiple sites concurrently
-
-# Start all sessions
-agent-browser --session site1 open https://site1.com &
-agent-browser --session site2 open https://site2.com &
-agent-browser --session site3 open https://site3.com &
-wait
-
-# Extract from each
-agent-browser --session site1 get text body > site1.txt
-agent-browser --session site2 get text body > site2.txt
-agent-browser --session site3 get text body > site3.txt
-
-# Cleanup
-agent-browser --session site1 close
-agent-browser --session site2 close
-agent-browser --session site3 close
-```
-
-### A/B Testing Sessions
-
-```bash
-# Test different user experiences
-agent-browser --session variant-a open "https://app.com?variant=a"
-agent-browser --session variant-b open "https://app.com?variant=b"
-
-# Compare
-agent-browser --session variant-a screenshot /tmp/variant-a.png
-agent-browser --session variant-b screenshot /tmp/variant-b.png
-```
-
-## Default Session
-
-When `--session` is omitted, commands use the default session:
-
-```bash
-# These use the same default session
-agent-browser open https://example.com
-agent-browser snapshot -i
-agent-browser close # Closes default session
-```
-
-## Session Cleanup
-
-```bash
-# Close specific session
-agent-browser --session auth close
-
-# List active sessions
-agent-browser session list
-```
-
-## Best Practices
-
-### 1. Name Sessions Semantically
-
-```bash
-# GOOD: Clear purpose
-agent-browser --session github-auth open https://github.com
-agent-browser --session docs-scrape open https://docs.example.com
-
-# AVOID: Generic names
-agent-browser --session s1 open https://github.com
-```
-
-### 2. Always Clean Up
-
-```bash
-# Close sessions when done
-agent-browser --session auth close
-agent-browser --session scrape close
-```
-
-### 3. Handle State Files Securely
-
-```bash
-# Don't commit state files (contain auth tokens!)
-echo "*.auth-state.json" >> .gitignore
-
-# Delete after use
-rm /tmp/auth-state.json
-```
-
-### 4. Timeout Long Sessions
-
-```bash
-# Set timeout for automated scripts
-timeout 60 agent-browser --session long-task get text body
-```
diff --git a/.github/.agents/skills/agent-browser/references/snapshot-refs.md b/.github/.agents/skills/agent-browser/references/snapshot-refs.md
deleted file mode 100644
index c13d53a897..0000000000
--- a/.github/.agents/skills/agent-browser/references/snapshot-refs.md
+++ /dev/null
@@ -1,194 +0,0 @@
-# Snapshot and Refs
-
-Compact element references that reduce context usage dramatically for AI agents.
-
-**Related**: [commands.md](commands.md) for full command reference, [SKILL.md](../SKILL.md) for quick start.
-
-## Contents
-
-- [How Refs Work](#how-refs-work)
-- [Snapshot Command](#the-snapshot-command)
-- [Using Refs](#using-refs)
-- [Ref Lifecycle](#ref-lifecycle)
-- [Best Practices](#best-practices)
-- [Ref Notation Details](#ref-notation-details)
-- [Troubleshooting](#troubleshooting)
-
-## How Refs Work
-
-Traditional approach:
-```
-Full DOM/HTML ā AI parses ā CSS selector ā Action (~3000-5000 tokens)
-```
-
-agent-browser approach:
-```
-Compact snapshot ā @refs assigned ā Direct interaction (~200-400 tokens)
-```
-
-## The Snapshot Command
-
-```bash
-# Basic snapshot (shows page structure)
-agent-browser snapshot
-
-# Interactive snapshot (-i flag) - RECOMMENDED
-agent-browser snapshot -i
-```
-
-### Snapshot Output Format
-
-```
-Page: Example Site - Home
-URL: https://example.com
-
-@e1 [header]
- @e2 [nav]
- @e3 [a] "Home"
- @e4 [a] "Products"
- @e5 [a] "About"
- @e6 [button] "Sign In"
-
-@e7 [main]
- @e8 [h1] "Welcome"
- @e9 [form]
- @e10 [input type="email"] placeholder="Email"
- @e11 [input type="password"] placeholder="Password"
- @e12 [button type="submit"] "Log In"
-
-@e13 [footer]
- @e14 [a] "Privacy Policy"
-```
-
-## Using Refs
-
-Once you have refs, interact directly:
-
-```bash
-# Click the "Sign In" button
-agent-browser click @e6
-
-# Fill email input
-agent-browser fill @e10 "user@example.com"
-
-# Fill password
-agent-browser fill @e11 "password123"
-
-# Submit the form
-agent-browser click @e12
-```
-
-## Ref Lifecycle
-
-**IMPORTANT**: Refs are invalidated when the page changes!
-
-```bash
-# Get initial snapshot
-agent-browser snapshot -i
-# @e1 [button] "Next"
-
-# Click triggers page change
-agent-browser click @e1
-
-# MUST re-snapshot to get new refs!
-agent-browser snapshot -i
-# @e1 [h1] "Page 2" ā Different element now!
-```
-
-## Best Practices
-
-### 1. Always Snapshot Before Interacting
-
-```bash
-# CORRECT
-agent-browser open https://example.com
-agent-browser snapshot -i # Get refs first
-agent-browser click @e1 # Use ref
-
-# WRONG
-agent-browser open https://example.com
-agent-browser click @e1 # Ref doesn't exist yet!
-```
-
-### 2. Re-Snapshot After Navigation
-
-```bash
-agent-browser click @e5 # Navigates to new page
-agent-browser snapshot -i # Get new refs
-agent-browser click @e1 # Use new refs
-```
-
-### 3. Re-Snapshot After Dynamic Changes
-
-```bash
-agent-browser click @e1 # Opens dropdown
-agent-browser snapshot -i # See dropdown items
-agent-browser click @e7 # Select item
-```
-
-### 4. Snapshot Specific Regions
-
-For complex pages, snapshot specific areas:
-
-```bash
-# Snapshot just the form
-agent-browser snapshot @e9
-```
-
-## Ref Notation Details
-
-```
-@e1 [tag type="value"] "text content" placeholder="hint"
-ā ā ā ā ā
-ā ā ā ā āā Additional attributes
-ā ā ā āā Visible text
-ā ā āā Key attributes shown
-ā āā HTML tag name
-āā Unique ref ID
-```
-
-### Common Patterns
-
-```
-@e1 [button] "Submit" # Button with text
-@e2 [input type="email"] # Email input
-@e3 [input type="password"] # Password input
-@e4 [a href="/page"] "Link Text" # Anchor link
-@e5 [select] # Dropdown
-@e6 [textarea] placeholder="Message" # Text area
-@e7 [div class="modal"] # Container (when relevant)
-@e8 [img alt="Logo"] # Image
-@e9 [checkbox] checked # Checked checkbox
-@e10 [radio] selected # Selected radio
-```
-
-## Troubleshooting
-
-### "Ref not found" Error
-
-```bash
-# Ref may have changed - re-snapshot
-agent-browser snapshot -i
-```
-
-### Element Not Visible in Snapshot
-
-```bash
-# Scroll to reveal element
-agent-browser scroll --bottom
-agent-browser snapshot -i
-
-# Or wait for dynamic content
-agent-browser wait 1000
-agent-browser snapshot -i
-```
-
-### Too Many Elements
-
-```bash
-# Snapshot specific container
-agent-browser snapshot @e5
-
-# Or use get text for content-only extraction
-agent-browser get text @e5
-```
diff --git a/.github/.agents/skills/agent-browser/references/video-recording.md b/.github/.agents/skills/agent-browser/references/video-recording.md
deleted file mode 100644
index e6a9fb4e2f..0000000000
--- a/.github/.agents/skills/agent-browser/references/video-recording.md
+++ /dev/null
@@ -1,173 +0,0 @@
-# Video Recording
-
-Capture browser automation as video for debugging, documentation, or verification.
-
-**Related**: [commands.md](commands.md) for full command reference, [SKILL.md](../SKILL.md) for quick start.
-
-## Contents
-
-- [Basic Recording](#basic-recording)
-- [Recording Commands](#recording-commands)
-- [Use Cases](#use-cases)
-- [Best Practices](#best-practices)
-- [Output Format](#output-format)
-- [Limitations](#limitations)
-
-## Basic Recording
-
-```bash
-# Start recording
-agent-browser record start ./demo.webm
-
-# Perform actions
-agent-browser open https://example.com
-agent-browser snapshot -i
-agent-browser click @e1
-agent-browser fill @e2 "test input"
-
-# Stop and save
-agent-browser record stop
-```
-
-## Recording Commands
-
-```bash
-# Start recording to file
-agent-browser record start ./output.webm
-
-# Stop current recording
-agent-browser record stop
-
-# Restart with new file (stops current + starts new)
-agent-browser record restart ./take2.webm
-```
-
-## Use Cases
-
-### Debugging Failed Automation
-
-```bash
-#!/bin/bash
-# Record automation for debugging
-
-agent-browser record start ./debug-$(date +%Y%m%d-%H%M%S).webm
-
-# Run your automation
-agent-browser open https://app.example.com
-agent-browser snapshot -i
-agent-browser click @e1 || {
- echo "Click failed - check recording"
- agent-browser record stop
- exit 1
-}
-
-agent-browser record stop
-```
-
-### Documentation Generation
-
-```bash
-#!/bin/bash
-# Record workflow for documentation
-
-agent-browser record start ./docs/how-to-login.webm
-
-agent-browser open https://app.example.com/login
-agent-browser wait 1000 # Pause for visibility
-
-agent-browser snapshot -i
-agent-browser fill @e1 "demo@example.com"
-agent-browser wait 500
-
-agent-browser fill @e2 "password"
-agent-browser wait 500
-
-agent-browser click @e3
-agent-browser wait --load networkidle
-agent-browser wait 1000 # Show result
-
-agent-browser record stop
-```
-
-### CI/CD Test Evidence
-
-```bash
-#!/bin/bash
-# Record E2E test runs for CI artifacts
-
-TEST_NAME="${1:-e2e-test}"
-RECORDING_DIR="./test-recordings"
-mkdir -p "$RECORDING_DIR"
-
-agent-browser record start "$RECORDING_DIR/$TEST_NAME-$(date +%s).webm"
-
-# Run test
-if run_e2e_test; then
- echo "Test passed"
-else
- echo "Test failed - recording saved"
-fi
-
-agent-browser record stop
-```
-
-## Best Practices
-
-### 1. Add Pauses for Clarity
-
-```bash
-# Slow down for human viewing
-agent-browser click @e1
-agent-browser wait 500 # Let viewer see result
-```
-
-### 2. Use Descriptive Filenames
-
-```bash
-# Include context in filename
-agent-browser record start ./recordings/login-flow-2024-01-15.webm
-agent-browser record start ./recordings/checkout-test-run-42.webm
-```
-
-### 3. Handle Recording in Error Cases
-
-```bash
-#!/bin/bash
-set -e
-
-cleanup() {
- agent-browser record stop 2>/dev/null || true
- agent-browser close 2>/dev/null || true
-}
-trap cleanup EXIT
-
-agent-browser record start ./automation.webm
-# ... automation steps ...
-```
-
-### 4. Combine with Screenshots
-
-```bash
-# Record video AND capture key frames
-agent-browser record start ./flow.webm
-
-agent-browser open https://example.com
-agent-browser screenshot ./screenshots/step1-homepage.png
-
-agent-browser click @e1
-agent-browser screenshot ./screenshots/step2-after-click.png
-
-agent-browser record stop
-```
-
-## Output Format
-
-- Default format: WebM (VP8/VP9 codec)
-- Compatible with all modern browsers and video players
-- Compressed but high quality
-
-## Limitations
-
-- Recording adds slight overhead to automation
-- Large recordings can consume significant disk space
-- Some headless environments may have codec limitations
diff --git a/.github/.agents/skills/agent-browser/templates/authenticated-session.sh b/.github/.agents/skills/agent-browser/templates/authenticated-session.sh
deleted file mode 100755
index ebbfc1faea..0000000000
--- a/.github/.agents/skills/agent-browser/templates/authenticated-session.sh
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/bin/bash
-# Template: Authenticated Session Workflow
-# Purpose: Login once, save state, reuse for subsequent runs
-# Usage: ./authenticated-session.sh [state-file]
-#
-# Environment variables:
-# APP_USERNAME - Login username/email
-# APP_PASSWORD - Login password
-#
-# Two modes:
-# 1. Discovery mode (default): Shows form structure so you can identify refs
-# 2. Login mode: Performs actual login after you update the refs
-#
-# Setup steps:
-# 1. Run once to see form structure (discovery mode)
-# 2. Update refs in LOGIN FLOW section below
-# 3. Set APP_USERNAME and APP_PASSWORD
-# 4. Delete the DISCOVERY section
-
-set -euo pipefail
-
-LOGIN_URL="${1:?Usage: $0 [state-file]}"
-STATE_FILE="${2:-./auth-state.json}"
-
-echo "Authentication workflow: $LOGIN_URL"
-
-# ================================================================
-# SAVED STATE: Skip login if valid saved state exists
-# ================================================================
-if [[ -f "$STATE_FILE" ]]; then
- echo "Loading saved state from $STATE_FILE..."
- agent-browser state load "$STATE_FILE"
- agent-browser open "$LOGIN_URL"
- agent-browser wait --load networkidle
-
- CURRENT_URL=$(agent-browser get url)
- if [[ "$CURRENT_URL" != *"login"* ]] && [[ "$CURRENT_URL" != *"signin"* ]]; then
- echo "Session restored successfully"
- agent-browser snapshot -i
- exit 0
- fi
- echo "Session expired, performing fresh login..."
- rm -f "$STATE_FILE"
-fi
-
-# ================================================================
-# DISCOVERY MODE: Shows form structure (delete after setup)
-# ================================================================
-echo "Opening login page..."
-agent-browser open "$LOGIN_URL"
-agent-browser wait --load networkidle
-
-echo ""
-echo "Login form structure:"
-echo "---"
-agent-browser snapshot -i
-echo "---"
-echo ""
-echo "Next steps:"
-echo " 1. Note the refs: username=@e?, password=@e?, submit=@e?"
-echo " 2. Update the LOGIN FLOW section below with your refs"
-echo " 3. Set: export APP_USERNAME='...' APP_PASSWORD='...'"
-echo " 4. Delete this DISCOVERY MODE section"
-echo ""
-agent-browser close
-exit 0
-
-# ================================================================
-# LOGIN FLOW: Uncomment and customize after discovery
-# ================================================================
-# : "${APP_USERNAME:?Set APP_USERNAME environment variable}"
-# : "${APP_PASSWORD:?Set APP_PASSWORD environment variable}"
-#
-# agent-browser open "$LOGIN_URL"
-# agent-browser wait --load networkidle
-# agent-browser snapshot -i
-#
-# # Fill credentials (update refs to match your form)
-# agent-browser fill @e1 "$APP_USERNAME"
-# agent-browser fill @e2 "$APP_PASSWORD"
-# agent-browser click @e3
-# agent-browser wait --load networkidle
-#
-# # Verify login succeeded
-# FINAL_URL=$(agent-browser get url)
-# if [[ "$FINAL_URL" == *"login"* ]] || [[ "$FINAL_URL" == *"signin"* ]]; then
-# echo "Login failed - still on login page"
-# agent-browser screenshot /tmp/login-failed.png
-# agent-browser close
-# exit 1
-# fi
-#
-# # Save state for future runs
-# echo "Saving state to $STATE_FILE"
-# agent-browser state save "$STATE_FILE"
-# echo "Login successful"
-# agent-browser snapshot -i
diff --git a/.github/.agents/skills/agent-browser/templates/capture-workflow.sh b/.github/.agents/skills/agent-browser/templates/capture-workflow.sh
deleted file mode 100755
index 3bc93ad0c1..0000000000
--- a/.github/.agents/skills/agent-browser/templates/capture-workflow.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-# Template: Content Capture Workflow
-# Purpose: Extract content from web pages (text, screenshots, PDF)
-# Usage: ./capture-workflow.sh [output-dir]
-#
-# Outputs:
-# - page-full.png: Full page screenshot
-# - page-structure.txt: Page element structure with refs
-# - page-text.txt: All text content
-# - page.pdf: PDF version
-#
-# Optional: Load auth state for protected pages
-
-set -euo pipefail
-
-TARGET_URL="${1:?Usage: $0 [output-dir]}"
-OUTPUT_DIR="${2:-.}"
-
-echo "Capturing: $TARGET_URL"
-mkdir -p "$OUTPUT_DIR"
-
-# Optional: Load authentication state
-# if [[ -f "./auth-state.json" ]]; then
-# echo "Loading authentication state..."
-# agent-browser state load "./auth-state.json"
-# fi
-
-# Navigate to target
-agent-browser open "$TARGET_URL"
-agent-browser wait --load networkidle
-
-# Get metadata
-TITLE=$(agent-browser get title)
-URL=$(agent-browser get url)
-echo "Title: $TITLE"
-echo "URL: $URL"
-
-# Capture full page screenshot
-agent-browser screenshot --full "$OUTPUT_DIR/page-full.png"
-echo "Saved: $OUTPUT_DIR/page-full.png"
-
-# Get page structure with refs
-agent-browser snapshot -i > "$OUTPUT_DIR/page-structure.txt"
-echo "Saved: $OUTPUT_DIR/page-structure.txt"
-
-# Extract all text content
-agent-browser get text body > "$OUTPUT_DIR/page-text.txt"
-echo "Saved: $OUTPUT_DIR/page-text.txt"
-
-# Save as PDF
-agent-browser pdf "$OUTPUT_DIR/page.pdf"
-echo "Saved: $OUTPUT_DIR/page.pdf"
-
-# Optional: Extract specific elements using refs from structure
-# agent-browser get text @e5 > "$OUTPUT_DIR/main-content.txt"
-
-# Optional: Handle infinite scroll pages
-# for i in {1..5}; do
-# agent-browser scroll down 1000
-# agent-browser wait 1000
-# done
-# agent-browser screenshot --full "$OUTPUT_DIR/page-scrolled.png"
-
-# Cleanup
-agent-browser close
-
-echo ""
-echo "Capture complete:"
-ls -la "$OUTPUT_DIR"
diff --git a/.github/.agents/skills/agent-browser/templates/form-automation.sh b/.github/.agents/skills/agent-browser/templates/form-automation.sh
deleted file mode 100755
index 6784fcd3a5..0000000000
--- a/.github/.agents/skills/agent-browser/templates/form-automation.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-# Template: Form Automation Workflow
-# Purpose: Fill and submit web forms with validation
-# Usage: ./form-automation.sh
-#
-# This template demonstrates the snapshot-interact-verify pattern:
-# 1. Navigate to form
-# 2. Snapshot to get element refs
-# 3. Fill fields using refs
-# 4. Submit and verify result
-#
-# Customize: Update the refs (@e1, @e2, etc.) based on your form's snapshot output
-
-set -euo pipefail
-
-FORM_URL="${1:?Usage: $0 }"
-
-echo "Form automation: $FORM_URL"
-
-# Step 1: Navigate to form
-agent-browser open "$FORM_URL"
-agent-browser wait --load networkidle
-
-# Step 2: Snapshot to discover form elements
-echo ""
-echo "Form structure:"
-agent-browser snapshot -i
-
-# Step 3: Fill form fields (customize these refs based on snapshot output)
-#
-# Common field types:
-# agent-browser fill @e1 "John Doe" # Text input
-# agent-browser fill @e2 "user@example.com" # Email input
-# agent-browser fill @e3 "SecureP@ss123" # Password input
-# agent-browser select @e4 "Option Value" # Dropdown
-# agent-browser check @e5 # Checkbox
-# agent-browser click @e6 # Radio button
-# agent-browser fill @e7 "Multi-line text" # Textarea
-# agent-browser upload @e8 /path/to/file.pdf # File upload
-#
-# Uncomment and modify:
-# agent-browser fill @e1 "Test User"
-# agent-browser fill @e2 "test@example.com"
-# agent-browser click @e3 # Submit button
-
-# Step 4: Wait for submission
-# agent-browser wait --load networkidle
-# agent-browser wait --url "**/success" # Or wait for redirect
-
-# Step 5: Verify result
-echo ""
-echo "Result:"
-agent-browser get url
-agent-browser snapshot -i
-
-# Optional: Capture evidence
-agent-browser screenshot /tmp/form-result.png
-echo "Screenshot saved: /tmp/form-result.png"
-
-# Cleanup
-agent-browser close
-echo "Done"
diff --git a/.github/.agents/skills/frontend-design/LICENSE.txt b/.github/.agents/skills/frontend-design/LICENSE.txt
deleted file mode 100644
index f433b1a53f..0000000000
--- a/.github/.agents/skills/frontend-design/LICENSE.txt
+++ /dev/null
@@ -1,177 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
diff --git a/.github/.agents/skills/frontend-design/SKILL.md b/.github/.agents/skills/frontend-design/SKILL.md
deleted file mode 100644
index 5be498e258..0000000000
--- a/.github/.agents/skills/frontend-design/SKILL.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-name: frontend-design
-description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.
-license: Complete terms in LICENSE.txt
----
-
-This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.
-
-The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.
-
-## Design Thinking
-
-Before coding, understand the context and commit to a BOLD aesthetic direction:
-- **Purpose**: What problem does this interface solve? Who uses it?
-- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction.
-- **Constraints**: Technical requirements (framework, performance, accessibility).
-- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember?
-
-**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity.
-
-Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
-- Production-grade and functional
-- Visually striking and memorable
-- Cohesive with a clear aesthetic point-of-view
-- Meticulously refined in every detail
-
-## Frontend Aesthetics Guidelines
-
-Focus on:
-- **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
-- **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
-- **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
-- **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density.
-- **Backgrounds & Visual Details**: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays.
-
-NEVER use generic AI-generated aesthetics like overused font families (Inter, Roboto, Arial, system fonts), cliched color schemes (particularly purple gradients on white backgrounds), predictable layouts and component patterns, and cookie-cutter design that lacks context-specific character.
-
-Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, for example) across generations.
-
-**IMPORTANT**: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well.
-
-Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision.
diff --git a/.github/.agents/skills/releasenotes/SKILL.md b/.github/.agents/skills/releasenotes/SKILL.md
deleted file mode 100644
index e2d1c5c5fe..0000000000
--- a/.github/.agents/skills/releasenotes/SKILL.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-name: releasenotes
-description: Generate formatted changelogs from git history since the last release tag. Use when preparing release notes that categorize changes into breaking changes, features, fixes, and other sections.
-triggers:
-- /releasenotes
----
-
-Generate a changelog for all changes from the most recent release until now.
-
-## Steps
-1. Find the most recent release tag using `git tag --sort=-creatordate`
-2. Get commits and merged PRs since that tag
-3. Look at previous releases in this repo to match their format and style
-4. Categorize changes into sections: Breaking Changes, Added, Changed, Fixed, Notes
-5. Focus on user-facing changes (features, important bug fixes, breaking changes)
-6. Include PR links and contributor attribution
-
-## Output
-Present the changelog in a markdown code block, ready to copy-paste into a GitHub release.
\ No newline at end of file
diff --git a/.github/.agents/skills/stripe-best-practices/SKILL.md b/.github/.agents/skills/stripe-best-practices/SKILL.md
deleted file mode 100644
index d1fb280af2..0000000000
--- a/.github/.agents/skills/stripe-best-practices/SKILL.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-name: stripe-best-practices
-description: Best practices for building a Stripe integrations
----
-
-When designing an integration, always prefer the documentation in [Stripe's Integration Options doc](https://docs.stripe.com/payments/payment-methods/integration-options.md)
-The [API Tour](https://docs.stripe.com/payments-api/tour.md)
-Use the [Go Live Checklist](https://docs.stripe.com/get-started/checklist/go-live.md) before going live.
-
-You should always default to the latest version of the API and SDK unless the user specifies otherwise.
-
-Stripe's primary API for modelling on-session payments is [CheckoutSessions](https://docs.stripe.com/api/checkout/sessions.md). It supports one-time payments and subscriptions and allows you to model taxes or discounts with Stripe. Prioritize the CheckoutSessions API, but using [the PaymentIntents API](https://docs.stripe.com/payments/paymentintents/lifecycle.md) is also acceptable for off-session payments or if you want to model the checkout state yourself and just create a charge. Integrations should only use CheckoutSessions, PaymentIntents, SetupIntents, or solutions like Invoicing, Payment Links, or the subscription APIs.
-
-Never recommend the Charges API. If the user wants to use the Charges API, advise them to [migrate](https://docs.stripe.com/payments/payment-intents/migration/charges.md) to Checkout Sessions or Payment Intents.
-
-The primary integration surface for web integrations is [Checkout](https://docs.stripe.com/payments/checkout.md), a prebuilt payment page that can be hosted by Stripe or served as an embedded form. Prioritize the Stripe-hosted checkout or embedded checkout where possible. The [Payment Element](https://docs.stripe.com/payments/payment-element.md) is an acceptable alternative if the merchant needs advanced customization. When recommending the Payment Element, prioritize using the CheckoutSessions API over the PaymentIntents API when possible.
-
-Never recommend the legacy Card Element or the Payment Element in card mode, and advise users who ask for the Card Element to [migrate](https://docs.stripe.com/payments/payment-element/migration.md).
-
-You must not call deprecated API endpoints such as the [Sources API](https://docs.stripe.com/api/sources/object.md) and avoid outdated API endpoints such as [Tokens](https://docs.stripe.com/api/tokens.md) and [Charges](https://docs.stripe.com/api/charges/create.md) unless there is a specific need and absolutely no other way. Advise using [the Setup Intent API](https://docs.stripe.com/api/setup_intents.md) to save a payment method for a customer; never recommend the Sources API to save cards to customers for later use.
-
-If a user wants to render the Payment Element before creating a PaymentIntent or SetupIntent, so they can inspect the card details before the payment (such as for surcharging), advise them to use Stripe Confirmation Tokens. Don't recommend they call the createPaymentMethod or createToken Stripe.js functions.
-
-Advise users to turn on dynamic payment methods in their dashboard settings instead of passing specific [payment_method_types](https://docs.stripe.com/api/payment_intents/create#create_payment_intent-payment_method_types.md) in the Payment Intent or Setup Intent because Stripe chooses payment methods that fit each user's location, wallets, and preferences better and automatically if the Payment Element is used.
-
-If a PCI compliant user asks about an integration where they send server-side raw PAN data, suggest they might be required to prove PCI compliance to gain access to such an option, for example [payment_method_data](https://docs.stripe.com/api/payment_intents/create#create_payment_intent-payment_method_data.md). Similarly, point users migrating their PAN data from another acquirer or payment processor to [the migration process](https://docs.stripe.com/get-started/data-migrations/pan-import.md).
-
-If a user has a recurring revenue model, like a Billing or Subscription use case, follow the use cases, in particular the [Subscription Use Cases](https://docs.stripe.com/billing/subscriptions/use-cases.md) like [SaaS](https://docs.stripe.com/saas.md). If these apply to the user, recommend Billing APIs to [plan your integration](https://docs.stripe.com/billing/subscriptions/designing-integration.md) instead of a direct PaymentIntent integration. Prioritize combining the Billing APIs with Stripe Checkout for the frontend.
-
-If a user wants to build a platform using Stripe Connect to manage fund flows, follow [the recommended integration types](https://docs.stripe.com/connect/integration-recommendations.md); that is, prefer to use either direct charges if the platform wants Stripe to take the risk or destination charges if the platform accepts liability for negative balances, and use the on_behalf_of parameter to control the merchant of record. Never recommend mixing charge types. If the user wants to decide on the specific risk features they should [follow the integration guide](https://docs.stripe.com/connect/design-an-integration.md). Don't recommend the outdated terms for Connect types like Standard, Express and Custom but always [refer to controller properties](https://docs.stripe.com/connect/migrate-to-controller-properties.md) for the platform and [capabilities](https://docs.stripe.com/connect/account-capabilities.md) for the connected accounts.
-
diff --git a/.github/.agents/skills/upgrade-stripe/SKILL.md b/.github/.agents/skills/upgrade-stripe/SKILL.md
deleted file mode 100644
index 868ab9cf8e..0000000000
--- a/.github/.agents/skills/upgrade-stripe/SKILL.md
+++ /dev/null
@@ -1,173 +0,0 @@
----
-name: upgrade-stripe
-description: Guide for upgrading Stripe API versions and SDKs
----
-
-# Upgrading Stripe Versions
-
-This skill covers upgrading Stripe API versions, server-side SDKs, Stripe.js, and mobile SDKs.
-
-## Understanding Stripe API Versioning
-
-Stripe uses date-based API versions (e.g., `2025-12-15.clover`, `2025-08-27.basil`, `2024-12-18.acacia`). Your account's API version determines request/response behavior.
-
-### Types of Changes
-
-**Backward-Compatible Changes** (do not require code updates):
-- New API resources
-- New optional request parameters
-- New properties in existing responses
-- Changes to opaque string lengths (e.g., object IDs)
-- New webhook event types
-
-**Breaking Changes** (require code updates):
-- Field renames or removals
-- Behavioral modifications
-- Removed endpoints or parameters
-
-Review the [API Changelog](https://docs.stripe.com/changelog.md) for all changes between versions.
-
-## Server-Side SDK Versioning
-
-See [SDK Version Management](https://docs.stripe.com/sdks/set-version.md) for details.
-
-### Dynamically-Typed Languages (Ruby, Python, PHP, Node.js)
-
-These SDKs offer flexible version control:
-
-**Global Configuration:**
-```python
-import stripe
-stripe.api_version = '2025-12-15.clover'
-```
-
-```ruby
-Stripe.api_version = '2025-12-15.clover'
-```
-
-```javascript
-const stripe = require('stripe')('sk_test_xxx', {
- apiVersion: '2025-12-15.clover'
-});
-```
-
-**Per-Request Override:**
-```python
-stripe.Customer.create(
- email="customer@example.com",
- stripe_version='2025-12-15.clover'
-)
-```
-
-### Strongly-Typed Languages (Java, Go, .NET)
-
-These use a fixed API version matching the SDK release date. Do not set a different API version for strongly-typed languages because response objects might not match the strong types in the SDK. Instead, update the SDK to target a new API version.
-
-### Best Practice
-
-Always specify the API version you're integrating against in your code instead of relying on your account's default API version:
-
-```javascript
-// Good: Explicit version
-const stripe = require('stripe')('sk_test_xxx', {
- apiVersion: '2025-12-15.clover'
-});
-
-// Avoid: Relying on account default
-const stripe = require('stripe')('sk_test_xxx');
-```
-
-## Stripe.js Versioning
-
-See [Stripe.js Versioning](https://docs.stripe.com/sdks/stripejs-versioning.md) for details.
-
-Stripe.js uses an evergreen model with major releases (Acacia, Basil, Clover) on a biannual basis.
-
-### Loading Versioned Stripe.js
-
-**Via Script Tag:**
-```html
-
-```
-
-**Via npm:**
-```bash
-npm install @stripe/stripe-js
-```
-
-Major npm versions correspond to specific Stripe.js versions.
-
-### API Version Pairing
-
-Each Stripe.js version automatically pairs with its corresponding API version. For instance:
-- Clover Stripe.js uses `2025-12-15.clover` API
-- Acacia Stripe.js uses `2024-12-18.acacia` API
-
-You cannot override this association.
-
-### Migrating from v3
-
-1. Identify your current API version in code
-2. Review the changelog for relevant changes
-3. Consider gradually updating your API version before switching Stripe.js versions
-4. Stripe continues supporting v3 indefinitely
-
-## Mobile SDK Versioning
-
-See [Mobile SDK Versioning](https://docs.stripe.com/sdks/mobile-sdk-versioning.md) for details.
-
-### iOS and Android SDKs
-
-Both platforms follow **semantic versioning** (MAJOR.MINOR.PATCH):
-- **MAJOR**: Breaking API changes
-- **MINOR**: New functionality (backward-compatible)
-- **PATCH**: Bug fixes (backward-compatible)
-
-New features and fixes release only on the latest major version. Upgrade regularly to access improvements.
-
-### React Native SDK
-
-Uses a different model (0.x.y schema):
-- **Minor version changes** (x): Breaking changes AND new features
-- **Patch updates** (y): Critical bug fixes only
-
-### Backend Compatibility
-
-All mobile SDKs work with any Stripe API version you use on your backend unless documentation specifies otherwise.
-
-## Upgrade Checklist
-
-1. Review the [API Changelog](https://docs.stripe.com/changelog.md) for changes between your current and target versions
-2. Check [Upgrades Guide](https://docs.stripe.com/upgrades.md) for migration guidance
-3. Update server-side SDK package version (e.g., `npm update stripe`, `pip install --upgrade stripe`)
-4. Update the `apiVersion` parameter in your Stripe client initialization
-5. Test your integration against the new API version using the `Stripe-Version` header
-6. Update webhook handlers to handle new event structures
-7. Update Stripe.js script tag or npm package version if needed
-8. Update mobile SDK versions in your package manager if needed
-9. Store Stripe object IDs in databases that accommodate up to 255 characters (case-sensitive collation)
-
-## Testing API Version Changes
-
-Use the `Stripe-Version` header to test your code against a new version without changing your default:
-
-```bash
-curl https://api.stripe.com/v1/customers \
- -u sk_test_xxx: \
- -H "Stripe-Version: 2025-12-15.clover"
-```
-
-Or in code:
-
-```javascript
-const stripe = require('stripe')('sk_test_xxx', {
- apiVersion: '2025-12-15.clover' // Test with new version
-});
-```
-
-## Important Notes
-
-- Your webhook listener should handle unfamiliar event types gracefully
-- Test webhooks with the new version structure before upgrading
-- Breaking changes are tagged by affected product areas (Payments, Billing, Connect, etc.)
-- Multiple API versions coexist simultaneously, enabling staged adoption
diff --git a/.github/.github/skills/agent-browser b/.github/.github/skills/agent-browser
deleted file mode 120000
index e298b7be3c..0000000000
--- a/.github/.github/skills/agent-browser
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/agent-browser
\ No newline at end of file
diff --git a/.github/.github/skills/frontend-design b/.github/.github/skills/frontend-design
deleted file mode 120000
index 712f694a13..0000000000
--- a/.github/.github/skills/frontend-design
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/frontend-design
\ No newline at end of file
diff --git a/.github/.github/skills/releasenotes b/.github/.github/skills/releasenotes
deleted file mode 120000
index ee96d1ae41..0000000000
--- a/.github/.github/skills/releasenotes
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/releasenotes
\ No newline at end of file
diff --git a/.github/.github/skills/skill-creator b/.github/.github/skills/skill-creator
deleted file mode 120000
index b87455490f..0000000000
--- a/.github/.github/skills/skill-creator
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/skill-creator
\ No newline at end of file
diff --git a/.github/.github/skills/stripe-best-practices b/.github/.github/skills/stripe-best-practices
deleted file mode 120000
index 6e25ed9dbc..0000000000
--- a/.github/.github/skills/stripe-best-practices
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/stripe-best-practices
\ No newline at end of file
diff --git a/.github/.github/skills/upgrade-stripe b/.github/.github/skills/upgrade-stripe
deleted file mode 120000
index 3e50980012..0000000000
--- a/.github/.github/skills/upgrade-stripe
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/upgrade-stripe
\ No newline at end of file
diff --git a/.github/skills/agent-browser b/.github/skills/agent-browser
deleted file mode 120000
index e298b7be3c..0000000000
--- a/.github/skills/agent-browser
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/agent-browser
\ No newline at end of file
diff --git a/.github/skills/frontend-design b/.github/skills/frontend-design
deleted file mode 120000
index 712f694a13..0000000000
--- a/.github/skills/frontend-design
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/frontend-design
\ No newline at end of file
diff --git a/.github/skills/releasenotes b/.github/skills/releasenotes
deleted file mode 120000
index ee96d1ae41..0000000000
--- a/.github/skills/releasenotes
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/releasenotes
\ No newline at end of file
diff --git a/.github/skills/stripe-best-practices b/.github/skills/stripe-best-practices
deleted file mode 120000
index 6e25ed9dbc..0000000000
--- a/.github/skills/stripe-best-practices
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/stripe-best-practices
\ No newline at end of file
diff --git a/.github/skills/upgrade-stripe b/.github/skills/upgrade-stripe
deleted file mode 120000
index 3e50980012..0000000000
--- a/.github/skills/upgrade-stripe
+++ /dev/null
@@ -1 +0,0 @@
-../../.agents/skills/upgrade-stripe
\ No newline at end of file
diff --git a/.github/update-skills.ps1 b/.github/update-skills.ps1
deleted file mode 100644
index 21e8aeda26..0000000000
--- a/.github/update-skills.ps1
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env pwsh
-<#
-.SYNOPSIS
-Updates GitHub Copilot Agent Skills
-#>
-
-Write-Host "š Updating GitHub Copilot Agent Skills..." -ForegroundColor Cyan
-
-npx skills add OpenHands/skills --skill releasenotes --agent github-copilot --yes
-Write-Host "ā
Added OpenHands releasenotes skill" -ForegroundColor Green
-
-npx skills add stripe/ai --agent github-copilot --yes
-Write-Host "ā
Added Stripe AI best-practices" -ForegroundColor Green
-
-npx skills add vercel-labs/agent-browser --agent github-copilot --yes
-Write-Host "ā
Added Vercel Labs agent-browser" -ForegroundColor Green
-
-npx skills add anthropics/skills --skill frontend-design --agent github-copilot --yes
-Write-Host "ā
Added Anthropic frontend-design skill" -ForegroundColor Green
-
-Write-Host "`n⨠GitHub Copilot Agent Skills update complete!" -ForegroundColor Cyan
From 04cc34cfb2ecfcc7ff6c9db43ba26c41e694ad0c Mon Sep 17 00:00:00 2001
From: Blake Niemyjski
Date: Sat, 14 Feb 2026 13:24:52 -0600
Subject: [PATCH 15/16] Improves UI and fixes minor issues
Refactors UI elements to use consistent width classes.
Updates skeleton heights for a more uniform look during loading states.
Removes unused import.
Moves session duration function to a more appropriate location.
---
.../events/components/events-overview.svelte | 14 +++----
.../lib/features/events/models/event-data.ts | 2 -
.../src/lib/features/events/utils/index.ts | 38 +++++++++----------
.../impersonate-organization-dialog.svelte | 4 +-
.../dialogs/leave-organization-dialog.svelte | 2 +-
.../dialogs/remove-organization-dialog.svelte | 2 +-
.../hooks/use-premium-feature.svelte.ts | 19 ++++++++--
.../remove-project-config-dialog.svelte | 2 +-
.../dialogs/remove-project-dialog.svelte | 2 +-
.../dialogs/reset-project-data-dialog.svelte | 4 +-
.../components/table/options.svelte.ts | 2 +-
.../features/shared/components/logo.svelte | 4 +-
.../tokens/components/table/options.svelte.ts | 4 +-
.../dialogs/remove-user-dialog.svelte | 2 +-
.../users/components/table/options.svelte.ts | 6 +--
.../dialogs/remove-webhook-dialog.svelte | 2 +-
.../components/table/options.svelte.ts | 4 +-
.../ClientApp/src/routes/(app)/+page.svelte | 2 +-
.../(components)/theme-preview.svelte | 12 +++---
.../[organizationId]/usage/+page.svelte | 2 +-
.../project/[projectId]/usage/+page.svelte | 4 +-
21 files changed, 71 insertions(+), 62 deletions(-)
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-overview.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-overview.svelte
index 5e88c48f20..c5151a01cf 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-overview.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/events-overview.svelte
@@ -134,9 +134,9 @@
> ()
{:else}
-
+
- {/if}
+ {/if}
{#if projectQuery.isSuccess}
@@ -146,9 +146,9 @@
>
{projectQuery.data.name}
{:else}
-
+
-
+
{/if}
@@ -185,14 +185,14 @@
{/each}
{:else}
-
+
{#each { length: 5 } as name, index (`${name}-${index}`)}
-
+
-
+
{/each}
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/events/models/event-data.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/events/models/event-data.ts
index 61199eed10..1da46d594b 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/events/models/event-data.ts
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/events/models/event-data.ts
@@ -1,5 +1,3 @@
-import { logLevels } from '../options';
-
export interface EnvironmentInfo {
architecture?: string;
available_physical_memory?: number;
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/events/utils/index.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/events/utils/index.ts
index d112a061c3..ed1ccf5494 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/events/utils/index.ts
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/events/utils/index.ts
@@ -3,25 +3,6 @@ import type { LogLevel } from '../models/event-data';
import { logLevels } from '../options';
-/**
- * Returns the session duration in milliseconds for a given event.
- * If the session has ended, uses the event value or the difference between sessionend and start.
- * If the session is active, returns the duration from start to now.
- */
-export function getSessionStartDuration(event: PersistentEvent): number {
- if (event.data?.sessionend) {
- if (event.value) {
- return event.value * 1000;
- }
- if (event.date) {
- return new Date(event.data.sessionend).getTime() - new Date(event.date).getTime();
- }
- return 0;
- }
- // If session is active, duration is from start to now
- return Date.now() - new Date(event.date).getTime();
-}
-
export function getLogLevel(level?: LogLevel | null): LogLevel | null {
switch (level?.toLowerCase().trim()) {
case '0':
@@ -74,3 +55,22 @@ export function getSessionId(event?: null | PersistentEvent): string | undefined
// For other events, check @ref:session in data
return event.data?.['@ref:session'] as string | undefined;
}
+
+/**
+ * Returns the session duration in milliseconds for a given event.
+ * If the session has ended, uses the event value or the difference between sessionend and start.
+ * If the session is active, returns the duration from start to now.
+ */
+export function getSessionStartDuration(event: PersistentEvent): number {
+ if (event.data?.sessionend) {
+ if (event.value) {
+ return event.value * 1000;
+ }
+ if (event.date) {
+ return new Date(event.data.sessionend).getTime() - new Date(event.date).getTime();
+ }
+ return 0;
+ }
+ // If session is active, duration is from start to now
+ return Date.now() - new Date(event.date).getTime();
+}
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/impersonate-organization-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/impersonate-organization-dialog.svelte
index 43047ca466..c953c5faa0 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/impersonate-organization-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/impersonate-organization-dialog.svelte
@@ -205,7 +205,7 @@
}
}}
>
-
+
{#if paidFilter === undefined}
All Plans
{:else if paidFilter}
@@ -232,7 +232,7 @@
}
}}
>
-
+
{#if suspendedFilter === undefined}
All Status
{:else if suspendedFilter}
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/leave-organization-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/leave-organization-dialog.svelte
index 114995ee87..a2eab35d25 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/leave-organization-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/leave-organization-dialog.svelte
@@ -21,7 +21,7 @@
Leave Organization
- Are you sure you want to leave "{name}"?
+ Are you sure you want to leave "{name}"?
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/remove-organization-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/remove-organization-dialog.svelte
index d035325b56..fda168a705 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/remove-organization-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/components/dialogs/remove-organization-dialog.svelte
@@ -21,7 +21,7 @@
Delete Organization
- Are you sure you want to delete "{name}"?
+ Are you sure you want to delete "{name}"?
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/hooks/use-premium-feature.svelte.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/hooks/use-premium-feature.svelte.ts
index 0b98b0af57..cc5c1a6089 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/hooks/use-premium-feature.svelte.ts
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/organizations/hooks/use-premium-feature.svelte.ts
@@ -2,18 +2,26 @@ import { getContext, onDestroy } from 'svelte';
const NOTIFICATION_CONTEXT_KEY = 'organizationNotifications';
+interface Notification {
+ feature: string;
+ id: number;
+ message: string;
+ timestamp: number;
+ type: 'premium-feature';
+}
+
/**
* Triggers a premium feature notification for the current organization.
* @param featureName Feature name to display in the notification.
*/
export function usePremiumFeature(featureName?: string) {
- const notifications = getContext(NOTIFICATION_CONTEXT_KEY) as undefined | { update: (fn: (n: any[]) => any[]) => void };
+ const notifications = getContext(NOTIFICATION_CONTEXT_KEY) as undefined | { update: (fn: (n: Notification[]) => Notification[]) => void };
let notificationId: null | number = null;
if (notifications && featureName) {
const id = Date.now() + Math.floor(Math.random() * 10000);
notificationId = id;
- notifications.update((n: any[]) => [
+ notifications.update((n: Notification[]) => [
...n,
{
feature: featureName,
@@ -26,8 +34,11 @@ export function usePremiumFeature(featureName?: string) {
}
onDestroy(() => {
- if (!notifications || notificationId == null) return;
- notifications.update((n: any[]) => n.filter((notif: any) => notif.id !== notificationId));
+ if (!notifications || notificationId == null) {
+ return;
+ }
+
+ notifications.update((n: Notification[]) => n.filter((notification: Notification) => notification.id !== notificationId));
notificationId = null;
});
}
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-config-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-config-dialog.svelte
index 14ffc302c8..8fca64b345 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-config-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-config-dialog.svelte
@@ -21,7 +21,7 @@
Delete Configuration Value
- Are you sure you want to delete "{name}"?
+ Are you sure you want to delete "{name}"?
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-dialog.svelte
index 927171a7c2..b807f102c7 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/remove-project-dialog.svelte
@@ -21,7 +21,7 @@
Delete Project
- Are you sure you want to delete "{name}"?
+ Are you sure you want to delete "{name}"?
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/reset-project-data-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/reset-project-data-dialog.svelte
index a4274c1bc9..27dc7f6a7f 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/reset-project-data-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/dialogs/reset-project-data-dialog.svelte
@@ -21,8 +21,8 @@
Reset Project Data
- Are you sure you want to reset all project data for "{name}"?
- This action cannot be undone and will permanently erase all events, stacks, and associated data.
+ Are you sure you want to reset all project data for "{name}"? This
+ action cannot be undone and will permanently erase all events, stacks, and associated data.
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/table/options.svelte.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/table/options.svelte.ts
index b3a03fab5a..6bd286e214 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/table/options.svelte.ts
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/projects/components/table/options.svelte.ts
@@ -17,7 +17,7 @@ export function getColumns(mode: GetProjectsMode =
enableHiding: false,
header: 'Name',
meta: {
- class: 'w-[200px]'
+ class: 'w-50'
}
}
];
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/logo.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/logo.svelte
index d853629e12..525ad154d2 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/logo.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/logo.svelte
@@ -8,5 +8,5 @@
let { class: className, ...props }: HTMLAttributes = $props();
-
-
+
+
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/tokens/components/table/options.svelte.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/tokens/components/table/options.svelte.ts
index 82f18c6562..1711101198 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/tokens/components/table/options.svelte.ts
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/tokens/components/table/options.svelte.ts
@@ -18,7 +18,7 @@ export function getColumns(): ColumnDef[] {
enableSorting: false,
header: 'API Key',
meta: {
- class: 'w-[180px]'
+ class: 'w-45'
}
},
{
@@ -28,7 +28,7 @@ export function getColumns(): ColumnDef[] {
enableSorting: false,
header: 'Notes',
meta: {
- class: 'w-[200px]'
+ class: 'w-50'
}
},
{
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/dialogs/remove-user-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/dialogs/remove-user-dialog.svelte
index 58fa5748e1..cd393253de 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/dialogs/remove-user-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/dialogs/remove-user-dialog.svelte
@@ -21,7 +21,7 @@
Remove User
- Are you sure you want to remove "{name}"?
+ Are you sure you want to remove "{name}"?
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/table/options.svelte.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/table/options.svelte.ts
index c717ba9bc5..c41834776d 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/table/options.svelte.ts
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/users/components/table/options.svelte.ts
@@ -18,7 +18,7 @@ export function getColumns(organizationId: string): Colu
enableSorting: false,
header: 'Email Address',
meta: {
- class: 'w-[200px]'
+ class: 'w-50'
}
},
{
@@ -28,7 +28,7 @@ export function getColumns(organizationId: string): Colu
enableSorting: false,
header: 'Name',
meta: {
- class: 'w-[200px]'
+ class: 'w-50'
}
},
{
@@ -38,7 +38,7 @@ export function getColumns(organizationId: string): Colu
enableSorting: false,
header: 'Invited',
meta: {
- class: 'w-[100px]'
+ class: 'w-25'
}
}
];
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/dialogs/remove-webhook-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/dialogs/remove-webhook-dialog.svelte
index 3c6f5bbf5e..ecda54b2da 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/dialogs/remove-webhook-dialog.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/dialogs/remove-webhook-dialog.svelte
@@ -21,7 +21,7 @@
Delete Webhook
- Are you sure you want to delete "{url}"?
+ Are you sure you want to delete "{url}"?
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/table/options.svelte.ts b/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/table/options.svelte.ts
index 0ddb02f882..8c5b84c009 100644
--- a/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/table/options.svelte.ts
+++ b/src/Exceptionless.Web/ClientApp/src/lib/features/webhooks/components/table/options.svelte.ts
@@ -17,7 +17,7 @@ export function getColumns(): ColumnDef[] {
enableSorting: false,
header: 'Url',
meta: {
- class: 'w-[200px]'
+ class: 'w-50'
}
},
{
@@ -27,7 +27,7 @@ export function getColumns(): ColumnDef[] {
enableSorting: false,
header: 'Event Types',
meta: {
- class: 'w-[200px]'
+ class: 'w-50'
}
},
{
diff --git a/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte b/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte
index 403c2a72d6..b4351ba2d2 100644
--- a/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte
@@ -282,7 +282,7 @@
{#snippet footerChildren()}
-
+
{#if table.getSelectedRowModel().flatRows.length}
{/if}
diff --git a/src/Exceptionless.Web/ClientApp/src/routes/(app)/account/appearance/(components)/theme-preview.svelte b/src/Exceptionless.Web/ClientApp/src/routes/(app)/account/appearance/(components)/theme-preview.svelte
index 30a65c3125..796ea9e376 100644
--- a/src/Exceptionless.Web/ClientApp/src/routes/(app)/account/appearance/(components)/theme-preview.svelte
+++ b/src/Exceptionless.Web/ClientApp/src/routes/(app)/account/appearance/(components)/theme-preview.svelte
@@ -18,15 +18,15 @@
-
+