uplink-cli 0.1.38 → 0.2.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.
Files changed (67) hide show
  1. package/AGENTS.md +177 -0
  2. package/CHANGELOG.md +15 -0
  3. package/LICENSE +21 -0
  4. package/README.md +72 -52
  5. package/cli/src/index.ts +16 -3
  6. package/cli/src/registrars/cloudflare.ts +148 -0
  7. package/cli/src/registrars/dreamhost.ts +129 -0
  8. package/cli/src/registrars/godaddy.ts +105 -0
  9. package/cli/src/registrars/hostinger.ts +106 -0
  10. package/cli/src/registrars/http.ts +18 -0
  11. package/cli/src/registrars/index.ts +32 -0
  12. package/cli/src/registrars/namecheap.ts +163 -0
  13. package/cli/src/registrars/secret.ts +66 -0
  14. package/cli/src/registrars/store.ts +55 -0
  15. package/cli/src/registrars/types.ts +42 -0
  16. package/cli/src/subcommands/admin.ts +17 -30
  17. package/cli/src/subcommands/db.ts +63 -57
  18. package/cli/src/subcommands/dev.ts +23 -25
  19. package/cli/src/subcommands/domains.ts +295 -0
  20. package/cli/src/subcommands/host-domains.ts +148 -0
  21. package/cli/src/subcommands/host.ts +3 -0
  22. package/cli/src/subcommands/login.ts +85 -0
  23. package/cli/src/subcommands/menu/colors.ts +1 -1
  24. package/cli/src/subcommands/menu/effects/tunnel-clients.ts +87 -14
  25. package/cli/src/subcommands/menu/inline-tree-select.ts +6 -5
  26. package/cli/src/subcommands/menu/io.ts +27 -5
  27. package/cli/src/subcommands/menu/menus/domain-check.ts +34 -0
  28. package/cli/src/subcommands/menu/menus/domains.ts +197 -0
  29. package/cli/src/subcommands/menu/menus/hosting.ts +14 -46
  30. package/cli/src/subcommands/menu/menus/index.ts +1 -0
  31. package/cli/src/subcommands/menu/menus/tunnels.ts +25 -67
  32. package/cli/src/subcommands/menu/render.ts +2 -2
  33. package/cli/src/subcommands/menu/requests.ts +9 -2
  34. package/cli/src/subcommands/menu/tests.ts +1 -1
  35. package/cli/src/subcommands/menu/tunnels.ts +10 -99
  36. package/cli/src/subcommands/menu/types.ts +8 -0
  37. package/cli/src/subcommands/menu.ts +32 -524
  38. package/cli/src/subcommands/signup.ts +2 -2
  39. package/cli/src/subcommands/system.ts +58 -36
  40. package/cli/src/subcommands/tunnel.ts +126 -33
  41. package/cli/src/templates/index.ts +3 -3
  42. package/cli/src/tui/App.tsx +202 -0
  43. package/cli/src/tui/AppInspector.tsx +114 -0
  44. package/cli/src/tui/HomeStatus.tsx +92 -0
  45. package/cli/src/tui/brand.tsx +20 -0
  46. package/cli/src/tui/format.ts +22 -0
  47. package/cli/src/tui/index.mts +6 -0
  48. package/cli/src/tui/liveTree.ts +40 -0
  49. package/cli/src/tui/package.json +3 -0
  50. package/cli/src/tui/runMenu.tsx +57 -0
  51. package/cli/src/tui/session.mts +267 -0
  52. package/cli/src/tui/snapshot.ts +175 -0
  53. package/cli/src/utils/api-base.ts +11 -0
  54. package/cli/src/utils/credentials.ts +58 -0
  55. package/cli/src/utils/domain-availability.ts +56 -0
  56. package/cli/src/utils/guest-access.ts +38 -0
  57. package/cli/src/utils/launchDomainking.ts +64 -0
  58. package/cli/src/utils/login-flow.ts +57 -0
  59. package/docs/AGENTS.md +130 -148
  60. package/docs/HOSTING.md +55 -0
  61. package/docs/MENU_STRUCTURE.md +60 -288
  62. package/docs/PRODUCT.md +64 -0
  63. package/docs/README.md +11 -7
  64. package/package.json +22 -36
  65. package/scripts/tunnel/client-improved.js +127 -38
  66. package/scripts/tunnel/client.js +118 -0
  67. package/assets/cli-screenshot.png +0 -0
package/docs/AGENTS.md CHANGED
@@ -1,195 +1,177 @@
1
1
  # Agent Integration Guide
2
2
 
3
- For agents (Cursor/Claude/GPT/Windsurf) to use Uplink non-interactively.
3
+ For agents (Cursor, Claude Code, Codex, Windsurf, and similar) to use Uplink **non-interactively**.
4
+
5
+ Install: `npm install -g uplink-cli` or `npx uplink-cli …`
6
+ Until **0.2.0** is on npm: `npm install -g github:firstprinciplecode/uplink#v0.2.0`
7
+ Package name: `uplink-cli` · Binary: `uplink`
4
8
 
5
9
  ## Auth
6
- - Use `AGENTCLOUD_TOKEN` (bearer). Avoid argv; prefer stdin:
10
+
11
+ - `uplink tunnel create` automatically creates guest access when no token exists. Guest access includes **1 active tunnel**, expiring after **24 hours**.
12
+ - Use `AGENTCLOUD_TOKEN` (bearer). Prefer stdin over argv:
7
13
  ```bash
8
- echo "$TOKEN" | uplink --token-stdin ...
14
+ echo "$TOKEN" | uplink --token-stdin
9
15
  ```
10
- - API base override: `--api-base https://api.uplink.spot` (or `AGENTCLOUD_API_BASE`).
16
+ - Humans: `uplink login --email you@example.com` then `--code 123456`. This upgrades current guest access, preserves its tunnel, and unlocks persistent features. Credentials are saved to `~/.uplink/credentials` (chmod 600).
17
+ - API base: `--api-base https://api.uplink.spot` or `AGENTCLOUD_API_BASE`.
18
+
19
+ ## Explicit guest token (optional)
11
20
 
12
- ## Signup (no auth required)
13
21
  ```bash
14
22
  uplink signup --json
15
23
  uplink signup --label "cursor-agent" --expires-days 30 --json
16
24
  ```
17
- JSON example:
18
- ```json
19
- {
20
- "id": "tok_xxx",
21
- "token": "abc123...",
22
- "tokenPrefix": "abc123",
23
- "role": "user",
24
- "userId": "user_xxx",
25
- "label": "cursor-agent",
26
- "createdAt": "2025-01-01T00:00:00.000Z",
27
- "expiresAt": "2025-01-31T00:00:00.000Z",
28
- "message": "Token created successfully. Save this token securely..."
29
- }
25
+
26
+ Save `token` from the JSON — it is shown only once. Then:
27
+
28
+ ```bash
29
+ export AGENTCLOUD_TOKEN='…'
30
30
  ```
31
- Save `token`—shown only once.
31
+
32
+ Explicit signup creates guest access. A later email login upgrades that guest account when the current token is available.
32
33
 
33
34
  ## Machine-mode contract
34
- - `--json` → stdout = JSON only; stderr = logs/errors.
35
- - Exit codes: 0 ok; 2 usage; 10 auth missing/invalid; 20 network; 30 server/unknown.
36
- - Premium alias gating: alias commands may return `ALIAS_NOT_ENABLED` / `ALIAS_LIMIT_REACHED`.
37
35
 
38
- ## Core CLI flows (non-interactive)
36
+ | Rule | Detail |
37
+ |------|--------|
38
+ | `--json` | stdout = JSON only; logs/errors go to stderr |
39
+ | Exit `0` | success |
40
+ | Exit `2` | usage / bad args |
41
+ | Exit `10` | auth missing/invalid |
42
+ | Exit `20` | network |
43
+ | Exit `30` | server / unknown |
44
+
45
+ Guest accounts can share one local port and use public domain search. Hosting, databases, aliases, and custom domains require a verified email account. Gate error: `ACCOUNT_VERIFICATION_REQUIRED`.
46
+
47
+ Premium aliases may return `ALIAS_NOT_ENABLED` / `ALIAS_LIMIT_REACHED`.
48
+
49
+ Free hosting (new accounts): **1 app**, **100 MB** of live artifacts, **no custom domains**, app **sleeps after 30 minutes idle**. Errors: `HOST_APP_LIMIT_REACHED`, `HOST_STORAGE_LIMIT_REACHED`, `HOST_DOMAIN_NOT_ENABLED`. Check quota: the `hosting` object on `GET /v1/me`.
50
+
51
+ ## Tunnels (share localhost)
52
+
53
+ `tunnel create` **creates the API record and starts the local client** so the public URL works. Use `--api-only` only if you will start the client yourself.
54
+
39
55
  ```bash
40
- # Create tunnel (optional alias if enabled)
41
- echo "$TOKEN" | uplink --token-stdin --api-base https://api.uplink.spot \
56
+ # Create + start client (optional alias if enabled)
57
+ echo "$TOKEN" | uplink --token-stdin \
42
58
  tunnel create --port 3000 --alias myapp --json
43
59
 
44
- # List tunnels (includes connection status)
60
+ # List (includes connected status)
45
61
  echo "$TOKEN" | uplink --token-stdin tunnel list --json
46
62
 
47
- # Set alias on tunnel
63
+ # Alias on an existing tunnel
48
64
  echo "$TOKEN" | uplink --token-stdin tunnel alias-set --id tun_xxx --alias myapp --json
49
-
50
- # Delete alias from tunnel
51
65
  echo "$TOKEN" | uplink --token-stdin tunnel alias-delete --id tun_xxx --json
52
66
 
53
- # Stats
67
+ # Stats / stop
54
68
  echo "$TOKEN" | uplink --token-stdin tunnel stats --id tun_xxx --json
55
-
56
- # Stop/delete tunnel
57
69
  echo "$TOKEN" | uplink --token-stdin tunnel stop --id tun_xxx --json
70
+ echo "$TOKEN" | uplink --token-stdin tunnel stop --all --json
71
+ ```
72
+
73
+ JSON create shape (representative):
74
+
75
+ ```json
76
+ {
77
+ "tunnel": { "id": "tun_…", "url": "https://abc.x.uplink.spot", "token": "…", "status": "…" },
78
+ "alias": "myapp",
79
+ "aliasError": null,
80
+ "url": "https://myapp.uplink.spot",
81
+ "client": { "pid": 12345, "started": true }
82
+ }
58
83
  ```
59
84
 
60
- ## Hosting flows (non-interactive)
61
- Use `--json` for machine-mode output. For interactive prompts, pass `--yes`.
85
+ `connected` on `tunnel list` means the local client is attached to the relay.
86
+
87
+ ## Hosting
88
+
89
+ Use `--json`. For prompts, pass `--yes`.
62
90
 
63
91
  ```bash
64
- # Full setup (analyze + init + create + deploy)
65
92
  echo "$TOKEN" | uplink --token-stdin host setup \
66
- --path /path/to/app \
67
- --name myapp \
68
- --env-file /path/to/.env \
69
- --wait-timeout 900 \
70
- --wait-interval 5 \
71
- --yes \
72
- --json
73
-
74
- # Deploy only (Dockerfile-based app)
93
+ --path /path/to/app --name myapp --env-file /path/to/.env \
94
+ --wait-timeout 900 --wait-interval 5 --yes --json
95
+
75
96
  echo "$TOKEN" | uplink --token-stdin host deploy \
76
- --path /path/to/app \
77
- --name myapp \
78
- --env-file /path/to/.env \
79
- --wait \
80
- --wait-timeout 900 \
81
- --wait-interval 5 \
82
- --json
83
-
84
- # Analyze project
85
- echo "$TOKEN" | uplink --token-stdin host analyze --path /path/to/app --json
97
+ --path /path/to/app --name myapp --wait --json
86
98
 
87
- # List hosted apps
99
+ echo "$TOKEN" | uplink --token-stdin host analyze --path /path/to/app --json
100
+ echo "$TOKEN" | uplink --token-stdin host preflight --path /path/to/app --json
88
101
  echo "$TOKEN" | uplink --token-stdin host list --json
89
-
90
- # Status + logs
91
102
  echo "$TOKEN" | uplink --token-stdin host status --id app_xxx --json
92
103
  echo "$TOKEN" | uplink --token-stdin host logs --id app_xxx --json
93
-
94
- # Delete app
95
104
  echo "$TOKEN" | uplink --token-stdin host delete --id app_xxx --yes --json
96
105
  ```
97
106
 
98
107
  Notes:
99
- - `host logs` returns `NOT_READY` until a deployment is running.
100
- - If builds stay `queued`, check builder/runner services and build logs on the server.
101
- - For Prisma apps, ensure the Dockerfile copies `prisma/schema.prisma` before `npm ci` and runs `npx prisma generate` before `npm run build`.
102
- - Use a `.uplinkignore` file to keep tarballs small. Typical entries include `node_modules`, `.next`, `dist`, `build`, `coverage`, `.turbo`, `.cache`, `.vercel`, `*.log`, and any local SQLite `.db` files.
103
- - `host list` (non-JSON) prints two lines per app: `- name (app_id)` and the URL on the next line.
104
- - `host delete` requires typing `DELETE` unless `--yes` is provided.
105
- - Hosting output modes: Next.js expects `output: "standalone"` for server builds. Vite and CRA are treated as static builds (dist/build).
106
-
107
- ## Interactive menu notes
108
- - All selection lists use arrow keys + Enter (no numeric entry required).
109
- - Hosted app lists display the app URL alongside name and ID.
110
-
111
- ### JSON shapes (representative)
112
- - Create: `{ "tunnel": { id, url?, token?, alias?, aliasUrl?, targetPort, status, connected?, createdAt }, "alias": "myapp"|null, "aliasError": "..."|null }`
113
- - List: `{ "tunnels": [ { id, url?, token?, alias?, aliasUrl?, targetPort, status, connected, createdAt } ], "count": n }`
114
- - Stats: alias tunnels include persisted totals + relay overlay; token-only tunnels show in-memory relay stats.
115
-
116
- **Note:** The `connected` field indicates whether the tunnel is actually connected to the relay server (verified via socket health check).
117
-
118
- ## HTTP API Reference
119
-
120
- Auth: `Authorization: Bearer <AGENTCLOUD_TOKEN>`
121
-
122
- ### Tunnels
123
- | Method | Endpoint | Description |
124
- |--------|----------|-------------|
125
- | `POST` | `/v1/tunnels` | Create tunnel (body: `{ port, alias? }`) |
126
- | `GET` | `/v1/tunnels` | List user's tunnels (includes `connected` status) |
127
- | `GET` | `/v1/tunnels/{id}` | Get tunnel details |
128
- | `GET` | `/v1/tunnels/{id}/stats` | Get tunnel statistics |
129
- | `DELETE` | `/v1/tunnels/{id}` | Delete tunnel |
130
- | `POST` | `/v1/tunnels/{id}/alias` | Set alias on tunnel (body: `{ alias }`) |
131
- | `DELETE` | `/v1/tunnels/{id}/alias` | Remove alias from tunnel |
132
-
133
- ### Port-Based Aliases (Premium)
134
- Aliases are now **port-based**: they persist across tunnel restarts and always point to the same port.
135
-
136
- | Method | Endpoint | Description |
137
- |--------|----------|-------------|
138
- | `GET` | `/v1/tunnels/aliases` | List all aliases for user |
139
- | `POST` | `/v1/tunnels/aliases` | Create alias for port (body: `{ alias, port }`) |
140
- | `PUT` | `/v1/tunnels/aliases/{alias}` | Reassign alias to different port (body: `{ port }`) |
141
- | `DELETE` | `/v1/tunnels/aliases/{alias}` | Delete alias |
142
-
143
- ### Example: Create port-based alias
144
- ```bash
145
- curl -X POST https://api.uplink.spot/v1/tunnels/aliases \
146
- -H "Authorization: Bearer $TOKEN" \
147
- -H "Content-Type: application/json" \
148
- -d '{"alias": "myapp", "port": 3000}'
149
- ```
108
+ - Next.js server hosting expects `output: "standalone"`. Vite/CRA static `dist`/`build`.
109
+ - Prefer a `.uplinkignore` (`node_modules`, `.next`, `dist`, `*.log`, local `.db`, …).
110
+ - `host logs` may return `NOT_READY` until a deployment is running.
111
+ - `host delete` requires `--yes` (or typing `DELETE` interactively).
150
112
 
151
- Response:
152
- ```json
153
- {
154
- "id": "alias_xxx",
155
- "alias": "myapp",
156
- "targetPort": 3000,
157
- "url": "https://myapp.uplink.spot",
158
- "createdAt": "2025-01-03T00:00:00.000Z"
159
- }
113
+ ## Custom domains
114
+
115
+ Registrar inventory is CLI. Attach/verify is under `host domains`.
116
+ The bare `uplink domains` search TUI is **optional** and not bundled with npm — use the JSON commands below.
117
+
118
+ ```bash
119
+ uplink domains providers connect godaddy --token-env GODADDY_PAT --json
120
+ uplink domains providers connect cloudflare --token-env CF_API_TOKEN --json
121
+ uplink domains providers connect hostinger --token-env HOSTINGER_API_TOKEN --json
122
+ uplink domains providers connect dreamhost --token-env DREAMHOST_API_KEY --json
123
+ uplink domains providers connect namecheap --token-env NAMECHEAP_API_KEY --user-env NAMECHEAP_API_USER --json
124
+ uplink domains providers list --json
125
+ uplink domains providers disconnect godaddy --json
126
+
127
+ uplink domains list --json
128
+ uplink domains check example.com --json
129
+
130
+ echo "$TOKEN" | uplink --token-stdin host domains add --id app_xxx --hostname example.com --json
131
+ echo "$TOKEN" | uplink --token-stdin host domains verify --id app_xxx --hostname example.com --json
132
+ echo "$TOKEN" | uplink --token-stdin host domains list --id app_xxx --json
133
+ echo "$TOKEN" | uplink --token-stdin host domains remove --id app_xxx --hostname example.com --json
160
134
  ```
161
135
 
162
- ## Domains
163
- - Public tunnels: `https://<token>.x.uplink.spot`
164
- - Permanent URLs (aliases): `https://<alias>.uplink.spot`
136
+ `domains check` works without a registrar: it falls back to public DNS/RDAP and returns `provider: "public"` with no price. Do not treat RDAP “available” as buyable unless `domains check` says `buyable: true`. Purchase is not wired yet.
165
137
 
166
- ## Server Deployment (for self-hosted)
167
- Control plane + hosting runtime live in the private repo `uplink-hosting-runtime`.
138
+ ## Databases (optional)
168
139
 
169
- ### Deploy code changes
170
140
  ```bash
171
- # On server (via SSH)
172
- cd /opt/uplink-hosting-runtime
173
- git pull origin main
174
- systemctl restart backend-api
175
- systemctl restart tunnel-relay
176
- systemctl restart uplink-builder uplink-runner uplink-router # if hosting runtime changed
141
+ echo "$TOKEN" | uplink --token-stdin db create --name mydb --project myproj --json
142
+ echo "$TOKEN" | uplink --token-stdin db list --json
143
+ echo "$TOKEN" | uplink --token-stdin db info --id db_xxx --json
144
+ echo "$TOKEN" | uplink --token-stdin db delete --id db_xxx --yes --json
177
145
  ```
178
146
 
179
- ### Services
180
- | Service | Command | Description |
181
- |---------|---------|-------------|
182
- | `backend-api` | `systemctl status backend-api` | REST API server |
183
- | `tunnel-relay` | `systemctl status tunnel-relay` | WebSocket relay for tunnels |
184
- | `uplink-builder` | `systemctl status uplink-builder` | Builds Docker images |
185
- | `uplink-runner` | `systemctl status uplink-runner` | Runs containers |
186
- | `uplink-router` | `systemctl status uplink-router` | Routes host domains |
187
-
188
- ### Relay health check
189
- The relay exposes internal endpoints (protected by `RELAY_INTERNAL_SECRET`):
190
- - `/internal/connected-tokens` - List connected tunnel tokens (with socket health verification)
191
- - `/internal/traffic-stats` - Traffic statistics by token/alias
192
- - `/health` - Basic health check
193
-
194
- ## Optional JS helper
195
- Use `cli/src/agents/tunnels-client.ts` for the same retry/timeout behavior as the CLI.
147
+ ## Failure modes agents should expect
148
+
149
+ | Symptom | Likely cause |
150
+ |---------|----------------|
151
+ | URL 502 / not connected | Local process on `--port` not running, or client died — re-run `tunnel create` or check `tunnel list` |
152
+ | Auth errors | Missing/invalid `AGENTCLOUD_TOKEN`; use `--token-stdin` |
153
+ | `ALIAS_NOT_ENABLED` | Account does not have permanent aliases |
154
+ | Domain search TUI missing | Expected on npm — use `domains list` / `check` / `host domains *` |
155
+ | `HOST_APP_LIMIT_REACHED` | Free plan is 1 hosted app — delete one or the account needs hosting granted |
156
+ | `HOST_STORAGE_LIMIT_REACHED` | Upload exceeds the 100 MB free hosting budget |
157
+ | `HOST_DOMAIN_NOT_ENABLED` | Custom domains are paid — `*.host.uplink.spot` still works |
158
+ | First request after idle is slow | Free apps sleep after 30 minutes; the router wakes them |
159
+ | Hosting stuck `queued` | Edge builder/runner issue — check `host status` / `host logs` |
160
+
161
+ ## Interactive menu
162
+
163
+ Humans: `uplink` or `uplink menu` (Share · Hosting · Domains).
164
+ Agents should prefer the non-interactive commands above.
165
+
166
+ ## URLs
167
+
168
+ - Ephemeral tunnels: `https://<token>.x.uplink.spot`
169
+ - Aliases: `https://<alias>.uplink.spot`
170
+
171
+ ## More
172
+
173
+ - Menu map: `docs/MENU_STRUCTURE.md`
174
+ - Hosting: `docs/HOSTING.md`
175
+ - Product: `docs/PRODUCT.md`
176
+ - Website: https://uplink.spot
177
+ - npm: https://www.npmjs.com/package/uplink-cli (0.2.0 pending; use the GitHub tag until then)
@@ -0,0 +1,55 @@
1
+ # Hosting
2
+
3
+ Verified accounts can deploy apps to `*.host.uplink.spot`. Guests cannot — the API returns `ACCOUNT_VERIFICATION_REQUIRED`.
4
+
5
+ ## Commands
6
+
7
+ ```bash
8
+ echo "$TOKEN" | uplink --token-stdin host setup --path . --name myapp --yes --json
9
+ echo "$TOKEN" | uplink --token-stdin host deploy --path . --name myapp --wait --json
10
+ echo "$TOKEN" | uplink --token-stdin host list --json
11
+ echo "$TOKEN" | uplink --token-stdin host status --id app_xxx --json
12
+ echo "$TOKEN" | uplink --token-stdin host logs --id app_xxx --json
13
+ echo "$TOKEN" | uplink --token-stdin host delete --id app_xxx --yes --json
14
+ ```
15
+
16
+ Public URL is `https://<app_id>.host.uplink.spot` (the app **id**, not the name). Custom hostnames attach with `host domains add` / `verify`.
17
+
18
+ ## What gets deployed
19
+
20
+ - Next.js (App Router): `output: "standalone"` in `next.config`.
21
+ - Vite / CRA: static `dist` or `build`.
22
+ - Anything else: a `Dockerfile` in the project root.
23
+
24
+ Use a `.uplinkignore` so `node_modules`, `.next`, `dist`, logs, and local databases are not uploaded.
25
+
26
+ ## Free-plan quotas
27
+
28
+ From `GET /v1/me` → `hosting`:
29
+
30
+ | Limit | Typical free account |
31
+ |-------|----------------------|
32
+ | Apps | 1 |
33
+ | Live artifacts | 100 MB |
34
+ | Custom domains | off (`HOST_DOMAIN_NOT_ENABLED`) |
35
+ | Idle sleep | 30 minutes with no traffic |
36
+
37
+ The platform URL still works when custom domains are gated.
38
+
39
+ ## Sleep and wake
40
+
41
+ After idle timeout the runner stops the container and keeps the image. Status is `sleeping`, not deleted.
42
+
43
+ The next HTTPS request to the app URL (or a verified custom domain) tells the router to wake it. Expect ~1–4 seconds on first hit, then normal latency.
44
+
45
+ `host list` still shows sleeping apps. `host status` is where you see `running` vs `sleeping`.
46
+
47
+ ## Errors
48
+
49
+ | Code | Meaning |
50
+ |------|---------|
51
+ | `ACCOUNT_VERIFICATION_REQUIRED` | Guest token — run `uplink login` |
52
+ | `HOST_APP_LIMIT_REACHED` | Delete an app or raise the plan |
53
+ | `HOST_STORAGE_LIMIT_REACHED` | Artifact too large |
54
+ | `HOST_DOMAIN_NOT_ENABLED` | Custom domain not on this plan |
55
+ | `NOT_READY` | Logs/status before a deployment is running |