spawn/fixtures/digitalocean/sizes.json
L 65a81edc57
fix: add unique spawn IDs to prevent history record corruption (#2235)
* fix: add unique spawn IDs to prevent history record corruption

History records were matched by heuristic ("most recent record for this
cloud without a connection"), which caused saveVmConnection and
saveLaunchCmd to overwrite the wrong record during concurrent or failed
spawns.

Fix: every SpawnRecord now has a unique `id` (UUID). All history
operations (saveVmConnection, saveLaunchCmd, removeRecord,
markRecordDeleted, mergeLastConnection) match by id when available,
falling back to the old heuristic for pre-migration records.

The orchestrator (TS path) now creates the history record AFTER server
creation succeeds, not before — so failed provisions don't leave orphan
entries.

Also adds "Remove from history" option to the spawn ls action picker,
restoring the ability to soft-delete entries without destroying the VM.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test: add 18 unit tests for spawn ID history behavior

Tests cover:
- generateSpawnId returns unique UUIDs
- saveSpawnRecord auto-generates id when not provided
- saveVmConnection matches by spawnId (not heuristic)
- saveVmConnection does not cross-contaminate concurrent spawns
- saveVmConnection falls back to heuristic without spawnId
- saveLaunchCmd matches by spawnId (not heuristic)
- saveLaunchCmd falls back without spawnId
- removeRecord matches by id, not by timestamp+agent+cloud
- removeRecord handles duplicate timestamps correctly
- removeRecord falls back for legacy records without id
- markRecordDeleted targets correct record by id
- mergeLastConnection uses spawn_id from last-connection.json
- mergeLastConnection falls back to heuristic without spawn_id

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: enable biome import sorting with grouped imports

Adds organizeImports to biome assist config with groups:
1. Type imports
2. Node built-ins
3. Third-party packages
4. @openrouter/* packages
5. Aliases

Auto-fixed import order and lint issues across all TypeScript files,
including .claude/skills/ and packages/cli/src/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-05 23:27:03 -08:00

430 lines
9.4 KiB
JSON

{
"links": {},
"meta": {
"total": 16
},
"sizes": [
{
"available": true,
"description": "Basic",
"disk": 10,
"disk_info": [
{
"size": {
"amount": 10,
"unit": "gib"
},
"type": "local"
}
],
"memory": 512,
"networking_throughput": 2000,
"price_hourly": 0.00595,
"price_monthly": 4,
"regions": ["ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo2", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-1vcpu-512mb-10gb",
"transfer": 0.5,
"vcpus": 1
},
{
"available": true,
"description": "Basic",
"disk": 25,
"disk_info": [
{
"size": {
"amount": 25,
"unit": "gib"
},
"type": "local"
}
],
"memory": 1024,
"networking_throughput": 2000,
"price_hourly": 0.00893,
"price_monthly": 6,
"regions": ["ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo2", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-1vcpu-1gb",
"transfer": 1.0,
"vcpus": 1
},
{
"available": true,
"description": "Basic Intel",
"disk": 25,
"disk_info": [
{
"size": {
"amount": 25,
"unit": "gib"
},
"type": "local"
}
],
"memory": 1024,
"networking_throughput": 2000,
"price_hourly": 0.01042,
"price_monthly": 7,
"regions": ["ams3", "atl1", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-1vcpu-1gb-intel",
"transfer": 1.0,
"vcpus": 1
},
{
"available": true,
"description": "Basic Intel",
"disk": 35,
"disk_info": [
{
"size": {
"amount": 35,
"unit": "gib"
},
"type": "local"
}
],
"memory": 1024,
"networking_throughput": 2000,
"price_hourly": 0.0119,
"price_monthly": 8,
"regions": [
"ams3",
"atl1",
"blr1",
"fra1",
"lon1",
"nyc1",
"nyc2",
"nyc3",
"sfo2",
"sfo3",
"sgp1",
"syd1",
"tor1"
],
"slug": "s-1vcpu-1gb-35gb-intel",
"transfer": 1.0,
"vcpus": 1
},
{
"available": true,
"description": "Basic",
"disk": 50,
"disk_info": [
{
"size": {
"amount": 50,
"unit": "gib"
},
"type": "local"
}
],
"memory": 2048,
"networking_throughput": 2000,
"price_hourly": 0.01786,
"price_monthly": 12,
"regions": ["ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo2", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-1vcpu-2gb",
"transfer": 2.0,
"vcpus": 1
},
{
"available": true,
"description": "Basic Intel",
"disk": 50,
"disk_info": [
{
"size": {
"amount": 50,
"unit": "gib"
},
"type": "local"
}
],
"memory": 2048,
"networking_throughput": 2000,
"price_hourly": 0.02083,
"price_monthly": 14,
"regions": ["ams3", "atl1", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-1vcpu-2gb-intel",
"transfer": 2.0,
"vcpus": 1
},
{
"available": true,
"description": "Basic Intel",
"disk": 70,
"disk_info": [
{
"size": {
"amount": 70,
"unit": "gib"
},
"type": "local"
}
],
"memory": 2048,
"networking_throughput": 2000,
"price_hourly": 0.02381,
"price_monthly": 16,
"regions": [
"ams3",
"atl1",
"blr1",
"fra1",
"lon1",
"nyc1",
"nyc2",
"nyc3",
"sfo2",
"sfo3",
"sgp1",
"syd1",
"tor1"
],
"slug": "s-1vcpu-2gb-70gb-intel",
"transfer": 2.0,
"vcpus": 1
},
{
"available": true,
"description": "Basic",
"disk": 60,
"disk_info": [
{
"size": {
"amount": 60,
"unit": "gib"
},
"type": "local"
}
],
"memory": 2048,
"networking_throughput": 2000,
"price_hourly": 0.02679,
"price_monthly": 18,
"regions": ["ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo2", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-2vcpu-2gb",
"transfer": 3.0,
"vcpus": 2
},
{
"available": true,
"description": "Basic Intel",
"disk": 60,
"disk_info": [
{
"size": {
"amount": 60,
"unit": "gib"
},
"type": "local"
}
],
"memory": 2048,
"networking_throughput": 2000,
"price_hourly": 0.03125,
"price_monthly": 21,
"regions": ["ams3", "atl1", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-2vcpu-2gb-intel",
"transfer": 3.0,
"vcpus": 2
},
{
"available": true,
"description": "Basic Intel",
"disk": 90,
"disk_info": [
{
"size": {
"amount": 90,
"unit": "gib"
},
"type": "local"
}
],
"memory": 2048,
"networking_throughput": 2000,
"price_hourly": 0.03571,
"price_monthly": 24,
"regions": [
"ams3",
"atl1",
"blr1",
"fra1",
"lon1",
"nyc1",
"nyc2",
"nyc3",
"sfo2",
"sfo3",
"sgp1",
"syd1",
"tor1"
],
"slug": "s-2vcpu-2gb-90gb-intel",
"transfer": 3.0,
"vcpus": 2
},
{
"available": true,
"description": "Basic",
"disk": 80,
"disk_info": [
{
"size": {
"amount": 80,
"unit": "gib"
},
"type": "local"
}
],
"memory": 4096,
"networking_throughput": 2000,
"price_hourly": 0.03571,
"price_monthly": 24,
"regions": ["ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo2", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-2vcpu-4gb",
"transfer": 4.0,
"vcpus": 2
},
{
"available": true,
"description": "Basic Intel",
"disk": 80,
"disk_info": [
{
"size": {
"amount": 80,
"unit": "gib"
},
"type": "local"
}
],
"memory": 4096,
"networking_throughput": 2000,
"price_hourly": 0.04167,
"price_monthly": 28,
"regions": ["ams3", "atl1", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-2vcpu-4gb-intel",
"transfer": 4.0,
"vcpus": 2
},
{
"available": true,
"description": "Basic Intel",
"disk": 120,
"disk_info": [
{
"size": {
"amount": 120,
"unit": "gib"
},
"type": "local"
}
],
"memory": 4096,
"networking_throughput": 2000,
"price_hourly": 0.04762,
"price_monthly": 32,
"regions": [
"ams3",
"atl1",
"blr1",
"fra1",
"lon1",
"nyc1",
"nyc2",
"nyc3",
"sfo2",
"sfo3",
"sgp1",
"syd1",
"tor1"
],
"slug": "s-2vcpu-4gb-120gb-intel",
"transfer": 4.0,
"vcpus": 2
},
{
"available": true,
"description": "Basic Intel",
"disk": 160,
"disk_info": [
{
"size": {
"amount": 160,
"unit": "gib"
},
"type": "local"
}
],
"memory": 8192,
"networking_throughput": 2000,
"price_hourly": 0.07143,
"price_monthly": 48,
"regions": [
"ams3",
"atl1",
"blr1",
"fra1",
"lon1",
"nyc1",
"nyc2",
"nyc3",
"sfo2",
"sfo3",
"sgp1",
"syd1",
"tor1"
],
"slug": "s-2vcpu-8gb-160gb-intel",
"transfer": 5.0,
"vcpus": 2
},
{
"available": true,
"description": "Basic",
"disk": 160,
"disk_info": [
{
"size": {
"amount": 160,
"unit": "gib"
},
"type": "local"
}
],
"memory": 8192,
"networking_throughput": 2000,
"price_hourly": 0.07143,
"price_monthly": 48,
"regions": ["ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo2", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-4vcpu-8gb",
"transfer": 5.0,
"vcpus": 4
},
{
"available": true,
"description": "Basic Intel",
"disk": 160,
"disk_info": [
{
"size": {
"amount": 160,
"unit": "gib"
},
"type": "local"
}
],
"memory": 8192,
"networking_throughput": 2000,
"price_hourly": 0.08333,
"price_monthly": 56,
"regions": ["ams3", "atl1", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo3", "sgp1", "syd1", "tor1"],
"slug": "s-4vcpu-8gb-intel",
"transfer": 5.0,
"vcpus": 4
}
]
}