mirror of
https://github.com/trycua/computer.git
synced 2026-05-07 07:33:08 -05:00
Fix mistakes and add missing HTTP endpoints (with Claude)
This commit is contained in:
@@ -97,7 +97,7 @@ const payload = {
|
||||
}
|
||||
|
||||
const res = await fetch('http://localhost:7777/lume/vms', {
|
||||
methdo: 'POST'
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
@@ -348,7 +348,7 @@ console.log(await res2.json());
|
||||
|
||||
Update the configuration of a virtual machine.
|
||||
|
||||
`PUT: /vms/:name`
|
||||
`PATCH: /vms/:name`
|
||||
|
||||
#### Parameters
|
||||
|
||||
@@ -368,7 +368,7 @@ Update the configuration of a virtual machine.
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X PUT \
|
||||
-X PATCH \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"cpu": 4,
|
||||
@@ -393,7 +393,7 @@ payload = {
|
||||
"display": "1920x1080",
|
||||
"storage": "ssd"
|
||||
}
|
||||
r = requests.put("http://localhost:7777/lume/vms/lume_vm", json=payload, timeout=50)
|
||||
r = requests.patch("http://localhost:7777/lume/vms/lume_vm", json=payload, timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
@@ -409,7 +409,7 @@ const payload = {
|
||||
storage: 'ssd',
|
||||
};
|
||||
const res = await fetch('http://localhost:7777/lume/vms/lume_vm', {
|
||||
method: 'PUT',
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
@@ -425,16 +425,29 @@ Stop a running virtual machine.
|
||||
|
||||
`POST: /vms/:name/stop`
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Required | Description |
|
||||
| ------- | ------ | -------- | -------------------------- |
|
||||
| storage | string | No | Storage type (`ssd`, etc.) |
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
# Basic stop
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X POST \
|
||||
http://localhost:7777/lume/vms/lume_vm/stop
|
||||
|
||||
# Stop with storage location specified
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X POST \
|
||||
http://localhost:7777/lume/vms/lume_vm/stop?storage=ssd
|
||||
```
|
||||
|
||||
</Tab>
|
||||
@@ -443,18 +456,30 @@ curl --connect-timeout 6000 \
|
||||
```python
|
||||
import requests
|
||||
|
||||
# Basic stop
|
||||
r = requests.post("http://localhost:7777/lume/vms/lume_vm/stop", timeout=50)
|
||||
print(r.json())
|
||||
|
||||
# Stop with storage location specified
|
||||
r = requests.post("http://localhost:7777/lume/vms/lume_vm/stop", params={"storage": "ssd"}, timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
// Basic stop
|
||||
const res = await fetch('http://localhost:7777/lume/vms/lume_vm/stop', {
|
||||
method: 'POST',
|
||||
});
|
||||
console.log(await res.json());
|
||||
|
||||
// Stop with storage location specified
|
||||
const res2 = await fetch('http://localhost:7777/lume/vms/lume_vm/stop?storage=ssd', {
|
||||
method: 'POST',
|
||||
});
|
||||
console.log(await res2.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
@@ -526,19 +551,91 @@ console.log(res2.status);
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Clone VM
|
||||
|
||||
Clone an existing virtual machine.
|
||||
|
||||
`POST: /vms/:name/clone`
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Required | Description |
|
||||
| -------------- | ------ | -------- | ----------------------------------- |
|
||||
| name | string | Yes | Source VM name |
|
||||
| newName | string | Yes | New VM name |
|
||||
| sourceLocation | string | No | Source storage location (`default`) |
|
||||
| destLocation | string | No | Destination storage location |
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "source-vm",
|
||||
"newName": "cloned-vm",
|
||||
"sourceLocation": "default",
|
||||
"destLocation": "ssd"
|
||||
}' \
|
||||
http://localhost:7777/lume/vms/clone
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
payload = {
|
||||
"name": "source-vm",
|
||||
"newName": "cloned-vm",
|
||||
"sourceLocation": "default",
|
||||
"destLocation": "ssd"
|
||||
}
|
||||
r = requests.post("http://localhost:7777/lume/vms/clone", json=payload, timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const payload = {
|
||||
name: 'source-vm',
|
||||
newName: 'cloned-vm',
|
||||
sourceLocation: 'default',
|
||||
destLocation: 'ssd',
|
||||
};
|
||||
const res = await fetch('http://localhost:7777/lume/vms/clone', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Pull VM Image
|
||||
|
||||
Pull a VM image from a registry.
|
||||
|
||||
`POST: /images/pull`
|
||||
`POST: /pull`
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Required | Description |
|
||||
| ------------ | ------ | -------- | ------------------------------------- |
|
||||
| image | string | Yes | Image name (e.g. `macos-sequoia-...`) |
|
||||
| registry | string | Yes | Registry host (e.g. `ghcr.io`) |
|
||||
| organization | string | Yes | Organization name |
|
||||
| name | string | No | VM name for the pulled image |
|
||||
| registry | string | No | Registry host (e.g. `ghcr.io`) |
|
||||
| organization | string | No | Organization name |
|
||||
| storage | string | No | Storage type (`ssd`, etc.) |
|
||||
|
||||
#### Example Request
|
||||
@@ -553,11 +650,12 @@ curl --connect-timeout 6000 \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"image": "macos-sequoia-vanilla:latest",
|
||||
"name": "my-vm-name",
|
||||
"registry": "ghcr.io",
|
||||
"organization": "trycua",
|
||||
"storage": "ssd"
|
||||
}' \
|
||||
http://localhost:7777/lume/images/pull
|
||||
http://localhost:7777/lume/pull
|
||||
```
|
||||
|
||||
</Tab>
|
||||
@@ -568,11 +666,12 @@ import requests
|
||||
|
||||
payload = {
|
||||
"image": "macos-sequoia-vanilla:latest",
|
||||
"name": "my-vm-name",
|
||||
"registry": "ghcr.io",
|
||||
"organization": "trycua",
|
||||
"storage": "ssd"
|
||||
}
|
||||
r = requests.post("http://localhost:7777/lume/images/pull", json=payload, timeout=50)
|
||||
r = requests.post("http://localhost:7777/lume/pull", json=payload, timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
@@ -582,11 +681,12 @@ print(r.json())
|
||||
```typescript
|
||||
const payload = {
|
||||
image: 'macos-sequoia-vanilla:latest',
|
||||
name: 'my-vm-name',
|
||||
registry: 'ghcr.io',
|
||||
organization: 'trycua',
|
||||
storage: 'ssd',
|
||||
};
|
||||
const res = await fetch('http://localhost:7777/lume/images/pull', {
|
||||
const res = await fetch('http://localhost:7777/lume/pull', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
@@ -596,3 +696,421 @@ console.log(await res.json());
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Push VM Image
|
||||
|
||||
Push a VM to a registry as an image (asynchronous operation).
|
||||
|
||||
`POST: /vms/push`
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Required | Description |
|
||||
| ------------ | ------------ | -------- | ----------------------------------------------- |
|
||||
| name | string | Yes | Local VM name to push |
|
||||
| imageName | string | Yes | Image name in registry |
|
||||
| tags | array | Yes | Image tags (e.g. `["latest", "v1"]`) |
|
||||
| organization | string | Yes | Organization name |
|
||||
| registry | string | No | Registry host (e.g. `ghcr.io`) |
|
||||
| chunkSizeMb | integer | No | Chunk size in MB for upload |
|
||||
| storage | string/null | No | Storage type (`ssd`, etc.) |
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "my-local-vm",
|
||||
"imageName": "my-image",
|
||||
"tags": ["latest", "v1"],
|
||||
"organization": "my-org",
|
||||
"registry": "ghcr.io",
|
||||
"chunkSizeMb": 512,
|
||||
"storage": null
|
||||
}' \
|
||||
http://localhost:7777/lume/vms/push
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
payload = {
|
||||
"name": "my-local-vm",
|
||||
"imageName": "my-image",
|
||||
"tags": ["latest", "v1"],
|
||||
"organization": "my-org",
|
||||
"registry": "ghcr.io",
|
||||
"chunkSizeMb": 512,
|
||||
"storage": None
|
||||
}
|
||||
r = requests.post("http://localhost:7777/lume/vms/push", json=payload, timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const payload = {
|
||||
name: 'my-local-vm',
|
||||
imageName: 'my-image',
|
||||
tags: ['latest', 'v1'],
|
||||
organization: 'my-org',
|
||||
registry: 'ghcr.io',
|
||||
chunkSizeMb: 512,
|
||||
storage: null,
|
||||
};
|
||||
const res = await fetch('http://localhost:7777/lume/vms/push', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
**Response (202 Accepted):**
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Push initiated in background",
|
||||
"name": "my-local-vm",
|
||||
"imageName": "my-image",
|
||||
"tags": [
|
||||
"latest",
|
||||
"v1"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### List Images
|
||||
|
||||
List available VM images.
|
||||
|
||||
`GET: /images`
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
http://localhost:7777/lume/images
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
r = requests.get("http://localhost:7777/lume/images", timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const res = await fetch('http://localhost:7777/lume/images');
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
```json
|
||||
{
|
||||
"local": [
|
||||
"macos-sequoia-xcode:latest",
|
||||
"macos-sequoia-vanilla:latest"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Prune Images
|
||||
|
||||
Remove unused VM images to free up disk space.
|
||||
|
||||
`POST: /lume/prune`
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X POST \
|
||||
http://localhost:7777/lume/prune
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
r = requests.post("http://localhost:7777/lume/prune", timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const res = await fetch('http://localhost:7777/lume/prune', {
|
||||
method: 'POST',
|
||||
});
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Get Latest IPSW URL
|
||||
|
||||
Get the URL for the latest macOS IPSW file.
|
||||
|
||||
`GET: /ipsw`
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
http://localhost:7777/lume/ipsw
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
r = requests.get("http://localhost:7777/lume/ipsw", timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const res = await fetch('http://localhost:7777/lume/ipsw');
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Configuration Management
|
||||
|
||||
### Get Configuration
|
||||
|
||||
Get current Lume configuration settings.
|
||||
|
||||
`GET: /lume/config`
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
http://localhost:7777/lume/config
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
r = requests.get("http://localhost:7777/lume/config", timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const res = await fetch('http://localhost:7777/lume/config');
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
```json
|
||||
{
|
||||
"homeDirectory": "~/.lume",
|
||||
"cacheDirectory": "~/.lume/cache",
|
||||
"cachingEnabled": true
|
||||
}
|
||||
```
|
||||
|
||||
### Update Configuration
|
||||
|
||||
Update Lume configuration settings.
|
||||
|
||||
`POST: /lume/config`
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Required | Description |
|
||||
| --------------- | ------- | -------- | -------------------------------- |
|
||||
| homeDirectory | string | No | Lume home directory path |
|
||||
| cacheDirectory | string | No | Cache directory path |
|
||||
| cachingEnabled | boolean | No | Enable or disable caching |
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"homeDirectory": "~/custom/lume",
|
||||
"cacheDirectory": "~/custom/lume/cache",
|
||||
"cachingEnabled": true
|
||||
}' \
|
||||
http://localhost:7777/lume/config
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
payload = {
|
||||
"homeDirectory": "~/custom/lume",
|
||||
"cacheDirectory": "~/custom/lume/cache",
|
||||
"cachingEnabled": True
|
||||
}
|
||||
r = requests.post("http://localhost:7777/lume/config", json=payload, timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const payload = {
|
||||
homeDirectory: '~/custom/lume',
|
||||
cacheDirectory: '~/custom/lume/cache',
|
||||
cachingEnabled: true,
|
||||
};
|
||||
const res = await fetch('http://localhost:7777/lume/config', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
});
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Storage Location Management
|
||||
|
||||
### Get VM Storage Locations
|
||||
|
||||
List all configured VM storage locations.
|
||||
|
||||
`GET: /lume/config/locations`
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
http://localhost:7777/lume/config/locations
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="Python">
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
r = requests.get("http://localhost:7777/lume/config/locations", timeout=50)
|
||||
print(r.json())
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab value="TypeScript">
|
||||
|
||||
```typescript
|
||||
const res = await fetch('http://localhost:7777/lume/config/locations');
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"name": "default",
|
||||
"path": "~/.lume/vms",
|
||||
"isDefault": true
|
||||
},
|
||||
{
|
||||
"name": "ssd",
|
||||
"path": "/Volumes/SSD/lume/vms",
|
||||
"isDefault": false
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Add VM Storage Location
|
||||
|
||||
Add a new VM storage location.
|
||||
|
||||
`POST: /lume/config/locations`
|
||||
|
||||
#### Parameters
|
||||
|
||||
| Name | Type | Required | Description |
|
||||
| ---- | ------ | -------- | ------------------------------ |
|
||||
| name | string | Yes | Storage location name |
|
||||
| path | string | Yes | File system path for storage |
|
||||
|
||||
#### Example Request
|
||||
|
||||
<Tabs groupId="language" persist items={['Curl', 'Python', 'TypeScript']}>
|
||||
<Tab value="Curl">
|
||||
|
||||
```bash
|
||||
curl --connect-timeout 6000 \
|
||||
--max-time 5000 \
|
||||
-X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
|
||||
Reference in New Issue
Block a user