Add CLI support for toggling the show_freeze_page service setting,
which controls whether frozen services display an HTML payment page
or return a JSON error response.
Updated 18 SDK implementations + CLI_SPEC.md documentation.
- Add csharp job: builds with Mono, tests sync version
- Add dotnet job: builds both sync and async with .NET 10
- Update clients/dotnet/Makefile to support sync and async builds
- Update clients/csharp/Makefile to remove reference to deleted dotnet folder
- Add both to summary job dependencies
- Add UnsandboxVault for encrypted credential storage (browser only)
- Update loadCredentialsFromStorage() with 3-tier priority:
1. UnsandboxVault (own encrypted vault)
2. External vaults (window.UncloseVault for uncloseai.com)
3. Plain localStorage (legacy fallback)
- Export UnsandboxVault in both named and default exports
- Makes window.UnsandboxVault available globally in browser
- 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.
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>
- bash: Add file existence check before reading
- bash: Improve exit code handling for invalid JSON results
- bash: Expand detect_language to support all 42 languages
- python: Use detect_language() instead of non-existent EXT_MAP
- python: Remove exit_on_error param that doesn't exist
- python: Replace read_file test with validate_keys existence check
The CLI was using library-only types and functions (unsandbox_languages_t,
unsandbox_image_list_t, etc.) that are only available when UNSANDBOX_LIBRARY
is defined. This caused build failures when building as CLI.
Changes:
- Add static list_languages_cli() for CLI language listing
- Fix image list to parse JSON directly instead of using library types
- Fix spawn_from_image() call with missing bootstrap/network_mode args
- Fix image_publish/clone_image calls to use static functions
Also update CLAUDE.md with release/versioning documentation.
- Add `un languages [--json]` command to list available execution languages
- Add `un image` command with full image management:
- --list, --info, --delete, --lock, --unlock
- --publish, --visibility, --spawn, --clone
- Update CLI_SPEC.md with new command documentation
- All implementations follow consistent patterns
- Build C CLI binary for testing all SDKs through unsandbox
- test-sdk.sh runs: build/un → unsandbox → SDK → unsandbox → test code
- Each SDK is tested for --help and code execution
- No local language interpreters needed on build server
Complete SDK implementations with full API surface:
- Python: sync/async with all 43 functions
- Go: sync/async with full API
- Java: sync/async with full API
- JavaScript: sync/async with full API
- PHP: sync/async with full API
- Ruby: sync/async with full API
- Rust: sync/async with full API
Added:
- clients/README.md - SDK overview
- clients/CLI_SPEC.md - CLI specification
Removed:
- un_deno.ts (moved to clients/typescript/)
C SDK now declares the complete API matching Python/Go/Java/etc:
- 8 Execution functions (stubbed - need JSON parsing)
- 9 Session functions (5 working: destroy/freeze/unfreeze/boost/unboost)
- 17 Service functions (11 working: all operations except list/get/execute)
- 8 Snapshot functions (6 working: all operations except list/get)
- 1 Key validation function (working)
Working functions call actual internal CLI code via wrappers.
Stubbed functions return NULL - they need JSON response parsing
which the CLI doesn't have (it prints to stdout).
Header includes complete struct definitions for all return types.
33 unit tests pass.
C SDK changes:
- Add #include un.h when building as library
- Export library functions: version, detect_language, hmac_sign, health_check
- Add NULL safety checks to wrapper functions
- Rewrite tests to call ACTUAL exported functions (no more local re-implementations)
- Tests now verify real HMAC-SHA256 against known test vectors
Documentation:
- Add SDK Testing Philosophy to CLAUDE.md
- Create docs/TESTING.md with unit/integration/functional test definitions
- Document the THREE testing levels required for all SDKs
- Explicitly forbid mocking and local re-implementation in tests
33 unit tests pass, testing real exported functions.
- Add #ifndef UNSANDBOX_LIBRARY around main() to allow library use
- Add CFLAGS_LIB with -DUNSANDBOX_LIBRARY for library compilation
- Add -lwebsockets to LDFLAGS for WebSocket support
- Build now compiles cleanly, tests pass (22/0)