- Add environment detection (IS_BROWSER, IS_NODE)
- Use top-level await for conditional Node.js imports
- Make signRequest async/isomorphic (Node crypto vs Web Crypto API)
- Add loadCredentialsFromStorage() for browser localStorage support
- Update resolveCredentials() with 5-tier priority including localStorage
- Add IS_NODE guards to file-system dependent functions
- Guard CLI entry point to prevent browser errors
- Update header docs with browser usage instructions
All 71 existing tests pass.
Usage: scripts/aggregate-performance-reports.py reports -v 4.2.11 4.2.12
This allows generating an aggregate report from just specific versions
instead of all reports in the directory.
The dotnet language was missing from get_sdk_file() causing tests to skip
in 5 seconds instead of running the actual SDK at clients/dotnet/sync/src/Un.cs
When fanning out SDK tests in CI, concurrent executions can hit the API's
concurrency limit (HTTP 429). Instead of immediately failing, the test
runner now retries up to 42 times with exponential backoff (2s, 4s, 8s...
capped at 30s) until the execution completes.
Updated Python, JavaScript, Go, Rust, Ruby, Java, and TypeScript SDKs:
- Add unfreeze_on_demand field to Service struct/class
- Add setUnfreezeOnDemand function to toggle setting via PATCH /services/:id
- Add unfreeze_on_demand parameter to createService function
- Single-file Un.cs using modern C# features
- Top-level statements, HttpClient, System.Text.Json
- Full feature parity with Mono version (648 lines vs 1260)
- Supports execute, session, service, service env, key commands
- Add --auto-unfreeze / --no-auto-unfreeze commands to toggle setting
- Add --unfreeze-on-demand flag for service create
- Display Auto-Unfreeze status in service --info output
- Add field to unsandbox_service_t struct and API function in un.h
- Add dotnet/ directory with modern .NET 10 implementation
- Use HttpClient, async/await, and System.Text.Json
- Update Makefile to build both Mono and .NET versions
- Add comprehensive README documenting differences
- Both versions now supported in unsandbox-ubuntu container
Change key validation endpoint from portal to API across all clients:
- C: Update PORTAL_BASE to API_BASE in validate_api_key()
- Python (sync/async): Change PORTAL_BASE to API_BASE
- Perl: Change $PORTAL_BASE to $API_BASE
- Rust (sync/async): Change hardcoded URL to api.unsandbox.com
All other languages (Go, Java, Kotlin, C#, Ruby, PHP, JavaScript) already
use their makeRequest() function with API_BASE, so no changes needed.
The key subcommand already exists and continues to work with the new endpoint.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed perf-aggregate-report job failure caused by artifact files
conflicting with git checkout.
The issue:
- Job downloads artifacts from perf-report (reports/4.2.5/*)
- Tries to checkout main with 'git checkout -B main origin/main'
- Fails because artifact files would be overwritten
The solution:
1. Stash all artifact files and generated content
2. Checkout main branch cleanly
3. Pull latest changes from origin/main
4. Pop stash to restore artifacts
5. Add and commit aggregated report
This preserves the artifact files while properly syncing with remote main.
Convert complex shell commands to multi-line blocks to fix YAML parsing:
- Changed `test -z "$VAR" && ... || true` patterns to proper if/else blocks
- Used `|` syntax for multi-line shell scripts
- Fixed variable expansion in $FILES for build/un command
- Separated git diff --cached logic into if/else block
This resolves the error:
"jobs:perf-aggregate-report:script config should be a string or
a nested array of strings up to 10 levels deep"
YAML validated successfully with Python yaml.safe_load()
- Add perf-aggregate-report CI job to analyze variance across releases
- Implement dynamic version discovery using git tags (ever-growing)
- Generate charts via UN sandbox using matplotlib
- Create AGGREGATED-PERFORMANCE.md with comprehensive methodology
- Add Makefile target for local report generation
- Include 3 visualization charts showing variance trends
Key findings: 2-3x performance variance due to orchestrator placement
on CPU-bound pool causing non-deterministic scheduling.