warpmetal 0.8.12 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -6
- package/package.json +2 -2
- package/skills/warpmetal/SKILL.md +7 -1
- package/skills/warpmetal/references/cli-reference.md +167 -4
- package/skills/warpmetal/references/runtime.md +23 -4
- package/src/account-gateway.js +217 -0
- package/src/account-session.js +209 -0
- package/src/api.js +34 -0
- package/src/cli.js +553 -11
- package/src/customer-auth.js +329 -0
- package/src/models.js +85 -0
- package/src/runtime.js +132 -2
- package/src/state.js +20 -4
package/README.md
CHANGED
|
@@ -41,11 +41,15 @@ x402api help --json
|
|
|
41
41
|
Install the bundled skill for supported coding agents:
|
|
42
42
|
|
|
43
43
|
```sh
|
|
44
|
+
warpmetal agent install --target <codex|claude|all>
|
|
44
45
|
warpmetal agent install --target codex
|
|
45
46
|
warpmetal agent install --target claude
|
|
46
47
|
warpmetal agent install --target all
|
|
47
48
|
```
|
|
48
49
|
|
|
50
|
+
`warpmetal agent install` installs only the bundled WarpMetal skill; it does
|
|
51
|
+
not install sandbox tools or select a sandbox tool profile.
|
|
52
|
+
|
|
49
53
|
Use `--scope project` to install into the current repository instead of the
|
|
50
54
|
user-level agent directory.
|
|
51
55
|
|
|
@@ -58,7 +62,7 @@ integration.
|
|
|
58
62
|
|
|
59
63
|
The repository also contains a skills-only WarpMetal plugin for the public
|
|
60
64
|
Plugins Directory shared by Codex and ChatGPT. The plugin remains a separate
|
|
61
|
-
artifact from the npm CLI and requires `warpmetal` CLI version 0.
|
|
65
|
+
artifact from the npm CLI and requires `warpmetal` CLI version 0.9.0 or newer.
|
|
62
66
|
|
|
63
67
|
To test the repository marketplace after the plugin lands on `main`:
|
|
64
68
|
|
|
@@ -80,9 +84,13 @@ the repo marketplace is only for development, testing, and direct distribution.
|
|
|
80
84
|
## First commands
|
|
81
85
|
|
|
82
86
|
```sh
|
|
87
|
+
warpmetal login
|
|
88
|
+
warpmetal auth status
|
|
83
89
|
warpmetal health
|
|
84
90
|
warpmetal catalog
|
|
91
|
+
warpmetal models --auth-mode chatgpt_subscription
|
|
85
92
|
warpmetal order prepare \
|
|
93
|
+
--account --without-agent-boxes \
|
|
86
94
|
--plan agent \
|
|
87
95
|
--hostname codex-workspace \
|
|
88
96
|
--os '<exact name from warpmetal catalog>' \
|
|
@@ -90,11 +98,54 @@ warpmetal order prepare \
|
|
|
90
98
|
--json
|
|
91
99
|
```
|
|
92
100
|
|
|
101
|
+
`warpmetal login` starts WarpMetal account authorization before any SSH key or
|
|
102
|
+
order configuration is needed. It opens the browser approval page by default;
|
|
103
|
+
use `--no-browser` to print the page and user code without opening it. The
|
|
104
|
+
default session requests `cli:read cli:write`; `--read-only` requests only
|
|
105
|
+
`cli:read`. Check the current account with `warpmetal auth status` and revoke
|
|
106
|
+
the CLI session with `warpmetal logout`.
|
|
107
|
+
|
|
108
|
+
The CLI stores only its own rotating account session under the private
|
|
109
|
+
WarpMetal state directory. Account sessions are separate from browser sessions,
|
|
110
|
+
legacy order owner tokens and SSH credentials, and are bound to the exact
|
|
111
|
+
Identity and account origins that issued them. `--identity-url` and
|
|
112
|
+
`--account-url` accept explicit origins for testing or alternate deployments;
|
|
113
|
+
credentials are never sent after an HTTP redirect or reused for other origins.
|
|
114
|
+
If a refresh response is lost, the CLI clears the local session and requires a
|
|
115
|
+
new login rather than risking reuse of a rotated credential. Logout always
|
|
116
|
+
clears the matching local session, and reports when remote revocation could not
|
|
117
|
+
be confirmed.
|
|
118
|
+
|
|
119
|
+
Use `warpmetal account orders` and `warpmetal account devices` for your account's
|
|
120
|
+
order history and active servers; add `--task <id>` or `--server <id>` for one
|
|
121
|
+
item. `order prepare --account` binds the unpaid order to the signed-in account
|
|
122
|
+
and uses its verified contact. It never issues an owner token. Login and account
|
|
123
|
+
creation do not require SSH keys or order configuration.
|
|
124
|
+
|
|
125
|
+
New account preparation defaults to Agent Boxes and an Agent team. Supply the
|
|
126
|
+
selected team in `--runtime-file`; no provider or model is silently selected.
|
|
127
|
+
Use `--without-team` for a single small persistent box, or
|
|
128
|
+
`--without-agent-boxes` for a VPS without boxes. An explicit runtime file keeps
|
|
129
|
+
its existing selections. `warpmetal models --json` supplies published model and
|
|
130
|
+
authentication choices; server readiness checks still apply.
|
|
131
|
+
|
|
132
|
+
Without `--account`, order preparation retains the existing owner-token
|
|
133
|
+
workflow, including payment and SSH automation. This release adds account order
|
|
134
|
+
preparation and inventory, not a new account payment or runtime-execution grant.
|
|
135
|
+
The account scopes do not authorize charges, renewals, deletion or Fleet access.
|
|
136
|
+
|
|
137
|
+
`warpmetal catalog` lists VPS plans. `warpmetal models` reads the separate,
|
|
138
|
+
public Agent Teams model catalog. It never signs in to a model provider or
|
|
139
|
+
creates an order. Use `--provider` or `--auth-mode api_key|chatgpt_subscription`
|
|
140
|
+
to filter published entries; JSON preserves the catalog snapshot, provenance,
|
|
141
|
+
freshness state and published authentication modes.
|
|
142
|
+
|
|
93
143
|
The generated key defaults to
|
|
94
144
|
`${WARPMETAL_HOME:-~/.config/warpmetal}/ssh/warpmetal-codex-workspace`. A
|
|
95
145
|
collision receives a random suffix; existing keys are never overwritten. Once
|
|
96
146
|
checkout returns `serverId`, the CLI binds that ID to the identity so
|
|
97
|
-
`warpmetal server login`
|
|
147
|
+
`warpmetal server login` is the distinct SSH challenge flow for one server.
|
|
148
|
+
It and `warpmetal runtime install` can select the generated identity without
|
|
98
149
|
an `--identity` flag. Use `--ssh-public-key-file` instead when supplying a
|
|
99
150
|
user-managed public key.
|
|
100
151
|
|
|
@@ -340,6 +391,19 @@ compatible external signer.
|
|
|
340
391
|
and reports an owner-host-key refresh opens one new managed trust epoch;
|
|
341
392
|
failed or ambiguous reloads retain the old pin and never permit replacement.
|
|
342
393
|
Erased workspaces are never described as recoverable.
|
|
394
|
+
- New agent-enabled candidate orders and Runtime-enabled reloads pass the
|
|
395
|
+
closed nested-sandbox opt-in inside verified provider cloud-init. The signed
|
|
396
|
+
Runtime bundle installs the exact-path AppArmor policy for the neutral
|
|
397
|
+
image's immutable Bubblewrap helper; this needs no follow-up customer SSH
|
|
398
|
+
key and adds no public order field or CLI flag. VPS-only cloud-init is
|
|
399
|
+
unchanged. Existing enrolled hosts use reload/reprovision; the CLI does not
|
|
400
|
+
claim a silent in-place policy repair command.
|
|
401
|
+
- Runtime reports a new or replaced sandbox generation as running only after a
|
|
402
|
+
fixed, credential-free inner-Bubblewrap oracle proves nested namespaces, an
|
|
403
|
+
inherited read-only view of the outer Agent Box's already isolated procfs,
|
|
404
|
+
an allowed workspace write, empty Linux capability sets,
|
|
405
|
+
`no-new-privileges`, and protected-root write denial. Failure stops the
|
|
406
|
+
container before access grants or tool setup advance.
|
|
343
407
|
|
|
344
408
|
For a Runtime-enabled reload, no separate installation command is part of the
|
|
345
409
|
successful path:
|
|
@@ -387,6 +451,61 @@ warpmetal sandbox access keygen \
|
|
|
387
451
|
--json
|
|
388
452
|
```
|
|
389
453
|
|
|
454
|
+
### Registered sandbox tools
|
|
455
|
+
|
|
456
|
+
WarpMetal can apply only registered, immutable tool profiles. These commands use
|
|
457
|
+
the owner credential already stored in the private WarpMetal state file; they do
|
|
458
|
+
not accept a bearer token on the command line or permit a caller-supplied URL,
|
|
459
|
+
shell command, environment, or artifact override.
|
|
460
|
+
|
|
461
|
+
```sh
|
|
462
|
+
warpmetal tools list --server <serverId> --json
|
|
463
|
+
warpmetal tools install --server <serverId> --sandbox <sandboxId> --profile <profileId> \
|
|
464
|
+
[--idempotency-key <key>] [--wait] [--timeout-seconds <n>] --json
|
|
465
|
+
warpmetal tools status --server <serverId> [--wait] [--timeout-seconds <n>] --json
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
`tools install` posts only the selected registered `profileId`. Waiting is
|
|
469
|
+
bounded: `ready` exits 0, `failed` or `cancelled` exits 5, and a timeout exits 8.
|
|
470
|
+
JSON output contains public profile, operation, and receipt metadata only.
|
|
471
|
+
Successful non-wait installs and status inspections exit 0 while reporting the
|
|
472
|
+
accepted or current state; exit 8 is reserved for an actual `--wait` deadline
|
|
473
|
+
timeout.
|
|
474
|
+
|
|
475
|
+
Codex is a released automatic tool profile when the public
|
|
476
|
+
`/agent-tool-profiles` endpoint advertises it as `available`. WarpMetal installs
|
|
477
|
+
the exact registered artifacts when selected at order time or through
|
|
478
|
+
`tools install`. Claude Code uses the released `claude-code` automatic tool
|
|
479
|
+
profile under the same public availability gate. Claude Managed Agents are separate:
|
|
480
|
+
`claude-managed-ant` is an install-only CLI profile. Installing `ant` does not
|
|
481
|
+
authenticate a worker and does not activate Managed Agents. Cursor CLI remains
|
|
482
|
+
manual and unavailable as an automatic profile until separately qualified later.
|
|
483
|
+
Gemini CLI remains manual.
|
|
484
|
+
|
|
485
|
+
An order `--runtime-file` may add the closed optional setup intent beside its
|
|
486
|
+
`sandboxes` array:
|
|
487
|
+
|
|
488
|
+
```json
|
|
489
|
+
{
|
|
490
|
+
"sandboxes": [
|
|
491
|
+
{ "name": "codex-worker", "size": "small" },
|
|
492
|
+
{ "name": "claude-worker", "size": "small" },
|
|
493
|
+
{ "name": "managed-worker", "size": "small" }
|
|
494
|
+
],
|
|
495
|
+
"setup": {
|
|
496
|
+
"version": 1,
|
|
497
|
+
"sandboxProfiles": [
|
|
498
|
+
{ "sandboxName": "codex-worker", "profileId": "codex" },
|
|
499
|
+
{ "sandboxName": "claude-worker", "profileId": "claude-code" },
|
|
500
|
+
{ "sandboxName": "managed-worker", "profileId": "claude-managed-ant" }
|
|
501
|
+
]
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
Only those fields are accepted. Each setup entry must name a sandbox in the
|
|
507
|
+
same file and a registered profile ID.
|
|
508
|
+
|
|
390
509
|
### Install a standard sandbox SSH alias
|
|
391
510
|
|
|
392
511
|
Use a separate keypair and access grant for each sandbox. After the grant is
|
|
@@ -410,10 +529,16 @@ ssh -t <alias> gemini
|
|
|
410
529
|
ssh <alias> gemini -p '<task>'
|
|
411
530
|
```
|
|
412
531
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
532
|
+
Authenticate Codex or Claude Code inside the sandbox after its selected profile
|
|
533
|
+
is ready. The public `/agent-tool-profiles` response is authoritative for
|
|
534
|
+
availability and checkout selection. Claude Code uses the `claude-code`
|
|
535
|
+
automatic tool profile. Claude Managed Agents are
|
|
536
|
+
separate: `claude-managed-ant` is an install-only CLI profile. Installing `ant`
|
|
537
|
+
does not authenticate a worker and does not activate Managed Agents. Cursor CLI
|
|
538
|
+
remains manual and unavailable as an automatic profile until separately
|
|
539
|
+
qualified later. Install and authenticate Cursor CLI or Gemini CLI inside the
|
|
540
|
+
sandbox. Provider credentials are sandbox-owned and remain in its
|
|
541
|
+
persistent home; WarpMetal does not perform provider login or receive them.
|
|
417
542
|
|
|
418
543
|
The alias is local-only. It prepends a managed include to `~/.ssh/config` and
|
|
419
544
|
uses the profile's pinned host key plus the sandbox identity. It never uses or
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "warpmetal",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Agent-safe CLI and skill for purchasing, renewing, and managing WarpMetal VPS servers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"node": ">=20.0.0"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
|
-
"check": "node --check bin/warpmetal.js && node --check src/api.js && node --check src/args.js && node --check src/cli.js && node --check src/connection.js && node --check src/errors.js && node --check src/host-trust.js && node --check src/install-skill.js && node --check src/installer.js && node --check src/payment.js && node --check src/runtime.js && node --check src/ssh-alias.js && node --check src/ssh.js && node --check src/state.js && node --check src/version.js",
|
|
19
|
+
"check": "node --check bin/warpmetal.js && node --check src/account-gateway.js && node --check src/account-session.js && node --check src/api.js && node --check src/args.js && node --check src/cli.js && node --check src/connection.js && node --check src/customer-auth.js && node --check src/errors.js && node --check src/host-trust.js && node --check src/install-skill.js && node --check src/installer.js && node --check src/models.js && node --check src/payment.js && node --check src/runtime.js && node --check src/ssh-alias.js && node --check src/ssh.js && node --check src/state.js && node --check src/version.js",
|
|
20
20
|
"plugin:check": "node --test test/plugin.test.js",
|
|
21
21
|
"test": "node --test",
|
|
22
22
|
"prepack": "npm run check && npm test"
|
|
@@ -11,7 +11,7 @@ with ad hoc HTTP commands.
|
|
|
11
11
|
|
|
12
12
|
## Start safely
|
|
13
13
|
|
|
14
|
-
1. Run `warpmetal --version` and require version `0.
|
|
14
|
+
1. Run `warpmetal --version` and require version `0.9.0` or newer for this
|
|
15
15
|
plugin. If it is missing or older, explain the compatibility requirement,
|
|
16
16
|
ask before installing or upgrading software, and use only the official npm
|
|
17
17
|
package from `https://www.npmjs.com/package/warpmetal`.
|
|
@@ -44,8 +44,14 @@ Run:
|
|
|
44
44
|
```sh
|
|
45
45
|
warpmetal health --json
|
|
46
46
|
warpmetal catalog --json
|
|
47
|
+
warpmetal models --json
|
|
47
48
|
```
|
|
48
49
|
|
|
50
|
+
`catalog` is the live VPS plan catalog. `models` is the separate public Agent
|
|
51
|
+
Teams model catalog; it makes one read-only request and never infers model
|
|
52
|
+
availability, credentials, entitlement, or provider support. Filter only with
|
|
53
|
+
published `--provider` or `--auth-mode api_key|chatgpt_subscription` values.
|
|
54
|
+
|
|
49
55
|
Stop the current purchase if `purchasingReady` is false. In unattended
|
|
50
56
|
scheduling, recheck after 60 seconds, then double the delay after each failed
|
|
51
57
|
check up to 15 minutes and honor a longer `Retry-After`; never hot-loop. In an
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
## Contents
|
|
4
4
|
|
|
5
5
|
- Discovery
|
|
6
|
+
- Account authentication
|
|
6
7
|
- Purchase and provisioning
|
|
7
8
|
- SSH identities
|
|
8
9
|
- Renewal and notifications
|
|
@@ -17,11 +18,106 @@
|
|
|
17
18
|
```sh
|
|
18
19
|
warpmetal health --json
|
|
19
20
|
warpmetal catalog [--plan <planId>] --json
|
|
21
|
+
warpmetal models [--provider <id>] [--auth-mode <api_key|chatgpt_subscription>] [--json]
|
|
20
22
|
```
|
|
21
23
|
|
|
24
|
+
## Public model catalog
|
|
25
|
+
|
|
26
|
+
`warpmetal models` performs a read-only `GET /agent-team-model-catalog` request.
|
|
27
|
+
It preserves the published snapshot metadata, source provenance, freshness state
|
|
28
|
+
and authentication modes. `--provider` and `--auth-mode` filter entries and
|
|
29
|
+
remove recommendations whose published entry is no longer present. The command
|
|
30
|
+
does not infer eligibility or contact a model provider. `catalog` remains the
|
|
31
|
+
VPS plan catalog.
|
|
32
|
+
|
|
22
33
|
`health` exits with code 3 when the service responds but purchasing is paused.
|
|
23
34
|
The catalog remains useful for read-only discovery.
|
|
24
35
|
|
|
36
|
+
## Account authentication
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
warpmetal login [--no-browser] [--read-only] --json
|
|
40
|
+
warpmetal auth status --json
|
|
41
|
+
warpmetal logout --json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`login` uses the public `warpmetal-customer-cli` device client. It requests
|
|
45
|
+
`cli:read cli:write` by default or only `cli:read` with `--read-only`, prints the
|
|
46
|
+
bounded verification page and user code to stderr, and opens that page unless
|
|
47
|
+
`--no-browser` is present. Polling follows the server interval and treats
|
|
48
|
+
pending, slow-down, denial, expiry and cancellation as distinct outcomes. JSON
|
|
49
|
+
stdout contains only safe account identity and scope fields; access, refresh
|
|
50
|
+
and device credentials are never output.
|
|
51
|
+
|
|
52
|
+
The rotating CLI refresh family is independent of browser sessions, legacy
|
|
53
|
+
owner tokens and SSH credentials. It is stored in an owner-only, atomic session
|
|
54
|
+
file under the private WarpMetal state directory. Concurrent commands serialize
|
|
55
|
+
refresh. If refresh completion is ambiguous, the saved session is cleared and a
|
|
56
|
+
new login is required rather than replaying the old credential.
|
|
57
|
+
|
|
58
|
+
Sessions are bound to the exact Identity and account origins. Defaults are
|
|
59
|
+
`https://identity.warpmetal.com` and `https://warpmetal.com`; explicit
|
|
60
|
+
`--identity-url` and `--account-url` values must be HTTPS origins (localhost may
|
|
61
|
+
use HTTP). Redirects are refused, and credentials for one origin pair are never
|
|
62
|
+
sent to another. `logout` attempts remote family revocation and always clears
|
|
63
|
+
the matching local session, reporting whether revocation was confirmed.
|
|
64
|
+
|
|
65
|
+
Account login does not grant server SSH access. `warpmetal server login` remains
|
|
66
|
+
the separate, server-specific SSH challenge command.
|
|
67
|
+
|
|
68
|
+
## Account orders and devices
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
warpmetal account orders [--task <taskId>] --json
|
|
72
|
+
warpmetal account devices [--server <serverId>] --json
|
|
73
|
+
warpmetal order prepare --account --without-agent-boxes \
|
|
74
|
+
--plan <planId> --hostname <name> --os '<exact catalog OS>' \
|
|
75
|
+
--generate-ssh-key [--idempotency-key <key>] --json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Reads require `cli:read`; unpaid preparation requires `cli:write`. Only these
|
|
79
|
+
allowlisted operations are granted. Account scope never authorizes a payment,
|
|
80
|
+
renewal, server deletion, credential change or runtime execution. Collections
|
|
81
|
+
return the server's bounded page and `nextCursor`; order history is distinct from
|
|
82
|
+
active devices and can include released or cancelled orders.
|
|
83
|
+
|
|
84
|
+
Account mode signs in before checking order fields. It derives contact and
|
|
85
|
+
ownership from the signed-in principal, rejects `--email`, uses the private
|
|
86
|
+
account gateway, and records `ownershipMode: account` plus principal/origin in
|
|
87
|
+
private local state without an owner token. Use the same idempotency key and
|
|
88
|
+
unchanged payload to retry an ambiguous preparation. Do not retry a charge.
|
|
89
|
+
Existing owner-token checkout commands do not become account payment commands.
|
|
90
|
+
|
|
91
|
+
Boxes/team are selected by default for new account preparation: provide
|
|
92
|
+
`--runtime-file` with your chosen team, `--without-team` for one persistent small
|
|
93
|
+
`main` box, or `--without-agent-boxes` for no runtime. Explicit runtime files keep
|
|
94
|
+
their box/team choices, and older scripts without `--account` retain their
|
|
95
|
+
defaults. Server model/runtime readiness gates remain binding.
|
|
96
|
+
|
|
97
|
+
The optional `teams` sibling of `sandboxes` uses the deployed team-v1 schema:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"sandboxes": [{"name":"manager","size":"small"},{"name":"builder","size":"small"}],
|
|
102
|
+
"teams": {"version":1,"teams":[{
|
|
103
|
+
"name":"Build team",
|
|
104
|
+
"members":[
|
|
105
|
+
{"sandboxName":"manager","role":"manager","providerId":"openai"},
|
|
106
|
+
{"sandboxName":"builder","role":"worker","providerId":"anthropic"}
|
|
107
|
+
],
|
|
108
|
+
"links":[{"from":"manager","to":"builder","capability":"task.delegate"}],
|
|
109
|
+
"startPolicy":"manual"
|
|
110
|
+
}]}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Provider names in this example are preferences, not qualification proof. Optional
|
|
115
|
+
`modelId` and `authMode` must reflect the selected published entry; omitted values
|
|
116
|
+
mean choose later, never automatic credentials. A team has one manager and 2–8
|
|
117
|
+
distinct declared boxes. Credentials, unknown fields, automatic start and
|
|
118
|
+
cross-team links are rejected. Team/setup files are for order preparation;
|
|
119
|
+
`sandbox create --file` accepts a sandbox batch only.
|
|
120
|
+
|
|
25
121
|
## Purchase and provisioning
|
|
26
122
|
|
|
27
123
|
```sh
|
|
@@ -221,6 +317,13 @@ process listings.
|
|
|
221
317
|
|
|
222
318
|
## Agent Runtime and sandboxes
|
|
223
319
|
|
|
320
|
+
Agent-enabled first boot and Runtime-enabled reload automatically carry the
|
|
321
|
+
closed nested-sandbox opt-in inside verified provider cloud-init. The signed
|
|
322
|
+
Runtime bundle installs the exact-path policy for the image's immutable
|
|
323
|
+
Bubblewrap helper without a later customer SSH key. This is not a public order
|
|
324
|
+
field or CLI flag; VPS-only cloud-init remains unchanged, and existing enrolled
|
|
325
|
+
hosts use reload/reprovision. There is no silent in-place policy repair.
|
|
326
|
+
|
|
224
327
|
```sh
|
|
225
328
|
warpmetal runtime enable --server <serverId> [--idempotency-key <key>] --json
|
|
226
329
|
warpmetal runtime get --server <serverId> [--wait] [--timeout-seconds <n>] --json
|
|
@@ -243,6 +346,11 @@ warpmetal sandbox action \
|
|
|
243
346
|
[--wait] --json
|
|
244
347
|
warpmetal sandbox delete \
|
|
245
348
|
--server <serverId> --sandbox <sandboxId> --confirm DELETE [--wait] --json
|
|
349
|
+
|
|
350
|
+
warpmetal tools list --server <serverId> --json
|
|
351
|
+
warpmetal tools install --server <serverId> --sandbox <sandboxId> --profile <profileId> \
|
|
352
|
+
[--idempotency-key <key>] [--wait] [--timeout-seconds <n>] --json
|
|
353
|
+
warpmetal tools status --server <serverId> [--wait] [--timeout-seconds <n>] --json
|
|
246
354
|
```
|
|
247
355
|
|
|
248
356
|
CLI 0.8.8 manages owner-facing VPS host trust during `runtime install`. With no
|
|
@@ -256,7 +364,52 @@ reloads never replace trust. This TOFU step cannot detect an active attacker on
|
|
|
256
364
|
the first connection. Provider-console pre-enrollment is optional and stronger.
|
|
257
365
|
|
|
258
366
|
See [runtime.md](runtime.md) for capacity, lifetime, cleanup, polling, and
|
|
259
|
-
installation safety. Exit 8
|
|
367
|
+
installation safety. Exit 8 is reserved for an actual bounded `--wait`
|
|
368
|
+
deadline timeout; a successful non-wait inspection exits 0 while reporting an
|
|
369
|
+
accepted, pending, applying, ready, or empty current state.
|
|
370
|
+
|
|
371
|
+
The `tools` commands use only the owner token already stored for the named
|
|
372
|
+
server. They do not accept token argv or `--token-file`. `tools list` returns
|
|
373
|
+
the registered immutable profiles. `tools install` sends only `{profileId}`
|
|
374
|
+
with an idempotency key; callers cannot supply download URLs, shell commands,
|
|
375
|
+
argv, environment variables, or artifacts. With `--wait`, `ready` exits 0,
|
|
376
|
+
`failed` or `cancelled` exits 5, and a bounded timeout exits 8. JSON contains
|
|
377
|
+
only the public profile/setup-operation fields returned by WarpMetal.
|
|
378
|
+
|
|
379
|
+
Codex is a released automatic tool profile when the public
|
|
380
|
+
`/agent-tool-profiles` endpoint advertises it as `available`. WarpMetal installs
|
|
381
|
+
the exact registered artifacts when selected at order time or through
|
|
382
|
+
`tools install`. Claude Code uses the released `claude-code` automatic tool
|
|
383
|
+
profile under the same public availability gate. Claude Managed Agents are separate:
|
|
384
|
+
`claude-managed-ant` is an install-only CLI profile. Installing `ant` does not
|
|
385
|
+
authenticate a worker and does not activate Managed Agents. Cursor CLI remains
|
|
386
|
+
manual and unavailable as an automatic profile until separately qualified later.
|
|
387
|
+
Gemini CLI remains manual.
|
|
388
|
+
|
|
389
|
+
For order-time setup, the runtime JSON file may contain the exact optional
|
|
390
|
+
shape below in addition to `sandboxes`:
|
|
391
|
+
|
|
392
|
+
```json
|
|
393
|
+
{
|
|
394
|
+
"sandboxes": [
|
|
395
|
+
{ "name": "codex-worker", "size": "small" },
|
|
396
|
+
{ "name": "claude-worker", "size": "small" },
|
|
397
|
+
{ "name": "managed-worker", "size": "small" }
|
|
398
|
+
],
|
|
399
|
+
"setup": {
|
|
400
|
+
"version": 1,
|
|
401
|
+
"sandboxProfiles": [
|
|
402
|
+
{ "sandboxName": "codex-worker", "profileId": "codex" },
|
|
403
|
+
{ "sandboxName": "claude-worker", "profileId": "claude-code" },
|
|
404
|
+
{ "sandboxName": "managed-worker", "profileId": "claude-managed-ant" }
|
|
405
|
+
]
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
Every selection must reference a sandbox name in the same file. Unknown fields,
|
|
411
|
+
including URL, shell, command, argv, environment, or artifact overrides, are
|
|
412
|
+
rejected before an API request.
|
|
260
413
|
|
|
261
414
|
## Per-agent access
|
|
262
415
|
|
|
@@ -315,9 +468,16 @@ ssh -t <alias> gemini
|
|
|
315
468
|
ssh <alias> gemini -p '<task>'
|
|
316
469
|
```
|
|
317
470
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
471
|
+
Authenticate each selected provider tool inside the sandbox after setup is
|
|
472
|
+
ready. The public `/agent-tool-profiles` response is authoritative for
|
|
473
|
+
availability and checkout selection. Claude Code uses the `claude-code`
|
|
474
|
+
automatic tool profile. Claude Managed Agents are
|
|
475
|
+
separate: `claude-managed-ant` is an install-only CLI profile. Installing `ant`
|
|
476
|
+
does not authenticate a worker and does not activate Managed Agents. Cursor CLI
|
|
477
|
+
remains manual and unavailable as an automatic profile until separately
|
|
478
|
+
qualified later. Install and authenticate Cursor CLI or Gemini CLI inside the
|
|
479
|
+
sandbox. WarpMetal does not perform provider login or receive provider
|
|
480
|
+
credentials.
|
|
321
481
|
|
|
322
482
|
[Codex Desktop](https://learn.chatgpt.com/docs/remote-connections) reads
|
|
323
483
|
the concrete alias from `~/.ssh/config` and starts Codex through the sandbox
|
|
@@ -341,6 +501,9 @@ warpmetal agent install --target <codex|claude|all> [--scope user|project]
|
|
|
341
501
|
warpmetal state list --json
|
|
342
502
|
```
|
|
343
503
|
|
|
504
|
+
`warpmetal agent install` installs only the bundled WarpMetal skill; it does
|
|
505
|
+
not install sandbox tools or select a sandbox tool profile.
|
|
506
|
+
|
|
344
507
|
`state list` returns identifiers, public runtime metadata, and
|
|
345
508
|
credential-presence booleans only. Never
|
|
346
509
|
open the underlying state file from an agent session.
|
|
@@ -46,6 +46,20 @@ Pass it to `warpmetal order prepare --runtime-file <path>`. If it contains a
|
|
|
46
46
|
temporary sandbox, pass `--confirm TEMPORARY`. Preparing remains unpaid; keep
|
|
47
47
|
the existing separate interactive-or-autonomous payment authority check.
|
|
48
48
|
|
|
49
|
+
For released Codex and Claude Code automatic profiles, an agent-enabled first
|
|
50
|
+
boot passes a closed nested-sandbox opt-in through verified
|
|
51
|
+
provider cloud-init. The signed Runtime bundle owns the exact-path AppArmor
|
|
52
|
+
policy for the neutral image's immutable Bubblewrap helper. No later customer
|
|
53
|
+
SSH key is used. No public order field or CLI flag exists; VPS-only cloud-init
|
|
54
|
+
remains unchanged. Existing enrolled hosts require reload/reprovision for this policy
|
|
55
|
+
because no silent in-place repair command is claimed.
|
|
56
|
+
Runtime does not report a new or replaced sandbox generation as running until a
|
|
57
|
+
fixed, credential-free inner-Bubblewrap oracle proves nested namespaces, an
|
|
58
|
+
inherited read-only view of the outer Agent Box's already isolated procfs, an
|
|
59
|
+
allowed workspace write, empty Linux capability sets, `no-new-privileges`, and
|
|
60
|
+
protected-root write denial; failure stops the container before access grants
|
|
61
|
+
or tool setup advance.
|
|
62
|
+
|
|
49
63
|
For an existing ready server:
|
|
50
64
|
|
|
51
65
|
Use the WarpMetal owner account `root` for every supported host image; do not
|
|
@@ -300,10 +314,15 @@ ssh -t <alias> gemini
|
|
|
300
314
|
ssh <alias> gemini -p '<task>'
|
|
301
315
|
```
|
|
302
316
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
317
|
+
Authenticate each selected provider tool inside the sandbox after setup is
|
|
318
|
+
ready. The public `/agent-tool-profiles` endpoint is authoritative for profile
|
|
319
|
+
availability. Claude Code uses the released `claude-code` automatic tool
|
|
320
|
+
profile. Claude Managed Agents are separate: `claude-managed-ant` is an
|
|
321
|
+
install-only CLI profile. Installing `ant` does not authenticate a worker and
|
|
322
|
+
does not activate Managed Agents. Cursor CLI remains manual and unavailable as
|
|
323
|
+
an automatic profile until separately qualified later. Provider authentication
|
|
324
|
+
and credentials are sandbox-owned and persist only in the sandbox home;
|
|
325
|
+
WarpMetal does not perform provider login or receive those credentials.
|
|
307
326
|
|
|
308
327
|
[Codex Desktop](https://learn.chatgpt.com/docs/remote-connections)
|
|
309
328
|
discovers a concrete alias through `~/.ssh/config`, requires ordinary
|