nylorun 0.13.0-beta → 0.14.0-beta
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/CHANGELOG.md +48 -0
- package/README.md +42 -35
- package/dist/client/cli.js +3 -3
- package/dist/client/doctor.d.ts +3 -2
- package/dist/client/doctor.js +14 -7
- package/dist/client/installation/commands.d.ts +1 -1
- package/dist/client/installation/commands.js +6 -4
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/stack/compose-file.js +10 -1
- package/dist/stack/mcp.d.ts +5 -3
- package/dist/stack/mcp.js +30 -18
- package/dist/stack/sandbox.d.ts +1 -1
- package/dist/stack/sandbox.js +23 -22
- package/dist/stack/versions.d.ts +2 -2
- package/dist/stack/versions.js +3 -3
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,53 @@
|
|
|
1
1
|
# nylorun
|
|
2
2
|
|
|
3
|
+
## 0.14.0-beta
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 35e29b7: **Environments replace sandboxes and vaults (protocol 11). This is a fresh start: upgrading deletes your sandboxes, their disks and every vault except the model's, and closes every open session (its history stays readable).** List what you have before upgrading; see "Environments replace sandboxes and vaults" in MIGRATION.md.
|
|
8
|
+
|
|
9
|
+
An Environment is where sessions run: one sandbox (kind `virtual`, `pod` or `none`) with a recipe that can change, and one vault of secrets for its shell, MCP servers and HTTP tools. The app decides who uses which Environment; the Runtime keeps it by id and holds its lifecycle.
|
|
10
|
+
|
|
11
|
+
- `@nylorun/core`: protocol 11 (the Host accepts 11 only; older clients get `426`), required feature `environments`. `PutEnvironmentRequestSchema`, `EnvironmentViewSchema` (`recipe`, `version`, `appliedVersion`, `ownerUserId`, `lastUsedAt`), `PutEnvironmentSecretRequestSchema`, `EnvironmentSecretViewSchema`, `ENVIRONMENT_EVENT_TYPES`, `TenantEnvironmentsConfigSchema`, `environmentGranted`. `PutSessionRequest.environment` replaces `sandbox`, `vaultIds` and `credentialSelections`; `SessionView.environment` replaces the session's sandbox and vault fields. Error codes `environment_busy`, `environment_unavailable`, `environment_lost`, `environment_not_granted`, `environment_owner_mismatch` and `session_closed` (the `sandbox_*` codes and `sandbox_expired` are gone); session events `environment.state`, `environment.exec` and `environment.attached`; scope `environments:write`. Credential coverage takes `environmentId` and answers `covered` or `missing`; the MCP preview takes `environmentId`. The vault Management schemas are removed.
|
|
12
|
+
- `@nylorun/runtime`: `/v1/environments/{id}` replaces `/v1/sandboxes/{id}`: `PUT` creates, finds or changes one (`kind` and `storage` fixed; a recipe change bumps `version`; a pod gets a new image or resources at its next start from stopped, a new allowlist within seconds), with list by label, events (`nylorun.environment-event/1`), stop, reset and delete. Each Environment owns one vault: `PUT|GET|DELETE /v1/environments/{id}/secrets/{name}` on the Runtime API, write-only, with a second credential for a host or URL refused at the write (`409 credential_conflict`). An optional owner guard (`ownerUserId`) is checked when a session opens and at every turn start. `lifecycle.deleteAfter` deletes an Environment unused that long; TTL and `onExpiry` are gone. Kind `none` holds secrets for MCP-only agents. `/v1/tenant/vaults`, user and installation vaults, the Tenant's default sandbox, inline sandboxes and `{ session }` sharing are removed. The Tenant setting is `environments.config` (`limits.environments`). Identity files grant `environments:` (an old `sandboxes:` key, or `sandboxes:write`, stops the Runtime with a message naming the new key). Migration `0020_environments`.
|
|
13
|
+
- `@nylorun/harness`: the Harness API claims `environment.state` and `environment.exec`, and its workspace fields name `environmentId`.
|
|
14
|
+
- `@nylorun/agents`: `client.environments` (`put`, `get`, `list`, `page`, `stop`, `reset`, `delete`, `events`, `secrets.put|list|get|delete`, `forSession`) replaces `client.sandboxes`; `createSession({ environment })`; `sessions.page({ environmentId })` filters by Environment. The AG-UI handler's session options take `environment`.
|
|
15
|
+
- `@nylorun/admin`: `admin.coverage({ agentId, environmentId })` replaces `admin.vaults`; `admin.mcp.preview({ url, environmentId })`.
|
|
16
|
+
- `@nylorun/studio`: Environments replace Sandboxes, with a create form, stop, reset, delete and their secrets; the Credentials forms write an Environment's secrets; New session picks an Environment and shows its coverage.
|
|
17
|
+
- `nylorun`: `nylorun sandbox ls|rm` list and delete Environments; `nylorun mcp inspect --environment <id>` replaces `--vault`; `nylo reset --environments` replaces `--sandboxes`; `nylo doctor sandbox` reports the Environment limits.
|
|
18
|
+
|
|
19
|
+
- 7800358: **Each turn is one OpenTelemetry trace, projected from the session log (R7).** An operator could not see what a turn did or where its time went without grepping container logs. Now every turn is a trace with a span for each model call, tool call and egress tunnel, exported over OTLP to any collector, readable per turn from the Runtime, and joined to the trace of the app that started it. No protocol change.
|
|
20
|
+
|
|
21
|
+
- **Traces from the log.** A turn's end is its root span, `invoke_agent <agent>`; each model call is a `chat <model>` span, each tool call and flow HTTP stage an `execute_tool <tool>` span, each egress-gate tunnel a `CONNECT <host>` span, and each pause and answer a marker. A model or gate tool span is the gate's own start and end; usage and cost are the gate's (`nylorun.usage.mismatch` when the harness reported other numbers). Attribute names follow the OTel GenAI conventions at one pinned commit, recorded as `nylorun.semconv.genai` on the resource. Ids are derived from the log under a key the Tenant keeps (setting `trace.key`), so every export and read of a turn gives the same ids.
|
|
22
|
+
- **OTLP export, off until you set an endpoint.** With `OTEL_EXPORTER_OTLP_ENDPOINT` (or `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`) the Runtime posts OTLP/HTTP JSON from a replication slot of its own, `nylorun_trace_export`, in batches of up to 512 spans or every 2 s; `OTEL_EXPORTER_OTLP_HEADERS`, `OTEL_SERVICE_NAME` and `OTEL_RESOURCE_ATTRIBUTES` work as usual. No turn waits for it. A collector that is down costs only its spans: after three retries a batch is dropped and logged as `trace_export_dropped`, and the slot moves on, so Postgres keeps no WAL for it. `nylorun start` passes these variables to the runtime container.
|
|
23
|
+
- **References by default.** Spans point at log events (`nylorun.event.cursor`) and carry no content unless you opt in per kind with `NYLORUN_TRACE_CONTENT` (`user`, `outputs`, `tool-results`, `errors`), or all of them with `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true`, each cut at 8 KiB. A span never carries a credential value, a prompt, a person's id, an identity header or an idempotency key.
|
|
24
|
+
- **`GET /v1/sessions/{id}/turns/{turnId}/trace`** answers a turn's spans as OTLP JSON, the same spans the exporter posts: look at a turn without a collector, or post it to one to backfill. Application keys, as the `/calls` reads. Host feature `traces`; `@nylorun/agents` adds `session.trace(turnId)`, and `@nylorun/core/contracts` `TurnTraceSchema`.
|
|
25
|
+
- **Trace context in and out.** A `traceparent` (and `tracestate`) on `POST /v1/sessions/{id}/commands`, an AG-UI run or an A2A message puts the turn in the caller's trace; `command.message` records it as `trace`. The turn hands its context on: to the harness in `TurnStart.trace`, to HTTP tools as `traceparent` beside `Idempotency-Key`, to MCP servers as `traceparent` on the call's requests, and to sandbox commands as `TRACEPARENT`.
|
|
26
|
+
- **Harness API** (additive): the `effect.intent` answer `execute` may carry the tool call's `traceparent`. `@nylorun/harness`: `HarnessExecutors.tool` takes it as a fourth argument (`ToolCallContext`).
|
|
27
|
+
|
|
28
|
+
### Patch Changes
|
|
29
|
+
|
|
30
|
+
- a0cbca1: **Clearer wording when a definition runs your code.** The refusal for a code tool or a flow's tool stage, the `hooks were removed` error and `nylo endpoints` now say that the Runtime runs agents from their manifests alone, instead of that it runs no code of yours during a session. Only the message text changed; anything matching the old wording (for example `runs no code of yours during a session`) needs the new text.
|
|
31
|
+
- Pin core to the tested release.
|
|
32
|
+
- Pin admin to the tested release.
|
|
33
|
+
- Pin runtime to the tested release.
|
|
34
|
+
- Pin studio to the tested release.
|
|
35
|
+
- Updated dependencies [17a97e9]
|
|
36
|
+
- Updated dependencies [b6214d9]
|
|
37
|
+
- Updated dependencies [e917bd6]
|
|
38
|
+
- Updated dependencies [5165451]
|
|
39
|
+
- Updated dependencies [35e29b7]
|
|
40
|
+
- Updated dependencies [e917bd6]
|
|
41
|
+
- Updated dependencies [a0cbca1]
|
|
42
|
+
- Updated dependencies [3013501]
|
|
43
|
+
- Updated dependencies [6061a3a]
|
|
44
|
+
- Updated dependencies [7d496e4]
|
|
45
|
+
- Updated dependencies [81c783e]
|
|
46
|
+
- Updated dependencies [7800358]
|
|
47
|
+
- Updated dependencies
|
|
48
|
+
- @nylorun/core@0.20.0-beta
|
|
49
|
+
- @nylorun/admin@0.16.0-beta
|
|
50
|
+
|
|
3
51
|
## 0.13.0-beta
|
|
4
52
|
|
|
5
53
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ provider over its APIs belong to the Runtime client, `nylo`
|
|
|
21
21
|
Depends on `@nylorun/core` and `@nylorun/admin` (for `nylo`) among Nylorun
|
|
22
22
|
packages and never imports `@nylorun/runtime`; the `nylorun` command loads
|
|
23
23
|
neither `nylo` nor `@nylorun/admin`. Vocabulary:
|
|
24
|
-
[runtime/src/CONTEXT.md](
|
|
24
|
+
[runtime/server/src/CONTEXT.md](../../runtime/server/src/CONTEXT.md).
|
|
25
25
|
|
|
26
26
|
Prerequisites, installed by the developer (nylorun never downloads them): Node
|
|
27
27
|
24 or newer, and Docker with Compose v2 ([Docker
|
|
@@ -48,12 +48,12 @@ nylorun studio [--tenant <name>] [--no-open] # sign a browser in to Studio on
|
|
|
48
48
|
nylorun reset [--tenant <name>] [--yes] # delete the Tenant's volumes, Tenant directory and vault key; the next start creates it anew
|
|
49
49
|
nylorun ls [--json] # the Tenants on this machine, with their state, memory and URLs
|
|
50
50
|
nylorun delete <tenant> --yes # remove a Tenant: containers, volumes, Host root and vault key
|
|
51
|
-
nylorun sandbox ls [--tenant <name>] [--label <key=value>]... [--json] # the running Tenant's
|
|
52
|
-
nylorun sandbox rm <id> [--tenant <name>] # delete
|
|
51
|
+
nylorun sandbox ls [--tenant <name>] [--label <key=value>]... [--json] # the running Tenant's Environments
|
|
52
|
+
nylorun sandbox rm <id> [--tenant <name>] # delete an Environment: its sandbox, files and vault
|
|
53
53
|
nylorun key put <id> [--management] [--tenant <name>] # create or rotate the Tenant's application key <id> (--management: a management key); prints it once
|
|
54
54
|
nylorun key list [--tenant <name>] [--json] # the Tenant's keys: id, role, when issued
|
|
55
55
|
nylorun key rm <id> [--tenant <name>] # delete a key: it stops working at once
|
|
56
|
-
nylorun mcp inspect <url> [--server <name>] [--
|
|
56
|
+
nylorun mcp inspect <url> [--server <name>] [--environment <id>] [--sse] [--tenant <name>] [--json] # a remote MCP server's tools, with an Environment's credential
|
|
57
57
|
nylorun doctor [--json] # prerequisites and the Tenant's health
|
|
58
58
|
nylorun telemetry [status|enable|disable] # Studio's anonymous usage analytics
|
|
59
59
|
nylorun sandbox enable --context <name> [--tenant <name>] [--host-address <ip>] [--bind-address <ip>] [--no-pull]
|
|
@@ -64,8 +64,10 @@ nylorun sandbox status [--tenant <name>] [--json] # pods on a Kubernetes conte
|
|
|
64
64
|
`up` and `down` are the Docker Compose spellings of `start` and `stop`: `down`
|
|
65
65
|
stops the containers and keeps the volumes, so no Tenant data is lost. Removed
|
|
66
66
|
commands exit 2 naming the replacement: `nylorun dev` and the MCP OAuth `connect`
|
|
67
|
-
subcommand of `nylorun mcp` (protocol 10:
|
|
68
|
-
|
|
67
|
+
subcommand of `nylorun mcp` (protocol 10: write a key or a gateway credential as
|
|
68
|
+
an Environment's secret instead, and preview the server with
|
|
69
|
+
`nylorun mcp inspect --environment <id>`), and `--vault` of `nylorun mcp inspect`
|
|
70
|
+
(protocol 11: `--environment <id>`).
|
|
69
71
|
`nylorun configure`, `nylorun status --env` and `nylorun doctor sandbox` exit 2
|
|
70
72
|
naming `nylo configure`, `nylo env` and `nylo doctor sandbox`.
|
|
71
73
|
`nylorun status` and `nylorun reset` are not `nylo status` and `nylo reset`: see
|
|
@@ -184,7 +186,7 @@ replaced by the application key otherwise.
|
|
|
184
186
|
|
|
185
187
|
Every Tenant serves the Runtime API, which takes **application keys**, and the
|
|
186
188
|
Management API (`/v1/tenant/*`), which takes **management keys**
|
|
187
|
-
([SELF_HOSTING.md](
|
|
189
|
+
([SELF_HOSTING.md](../../guides/SELF_HOSTING.md#keys)). `nylorun key` manages both on the
|
|
188
190
|
running Tenant through `nylorun-operate` in its runtime container, so only this
|
|
189
191
|
machine can issue a management key.
|
|
190
192
|
|
|
@@ -201,26 +203,28 @@ application key. `nylorun sandbox` and `nylorun mcp` use the linked project's ke
|
|
|
201
203
|
|
|
202
204
|
## MCP servers
|
|
203
205
|
|
|
204
|
-
An agent names its MCP servers by URL;
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
206
|
+
An agent names its MCP servers by URL; a session gets a credential for a URL from
|
|
207
|
+
the Environment it is opened on (`createSession({ environment })`): a secret of that
|
|
208
|
+
Environment, a `bearer` token or a `headers` map, with `via` and an identity
|
|
209
|
+
header when an MCP gateway holds each person's sign-in. Write it with
|
|
210
|
+
`client.environments.secrets.put(id, name, secret)` of `@nylorun/agents` (the
|
|
211
|
+
Runtime API, an application key) or in Studio; no `nylorun` command writes one.
|
|
212
|
+
The whole flow, with gateway recipes, is in
|
|
213
|
+
[DEPLOYMENT.md](../../guides/DEPLOYMENT.md#mcp-servers-and-http-tools).
|
|
210
214
|
|
|
211
215
|
`nylorun mcp inspect <url>` shows what a remote MCP server offers before an
|
|
212
216
|
agent names it, through the running Tenant's Management API
|
|
213
217
|
(`POST /v1/tenant/mcp/preview`, with the management key). The Runtime connects
|
|
214
|
-
with
|
|
215
|
-
|
|
218
|
+
with Environment `<id>`'s credential for `<url>` when `--environment <id>` names one
|
|
219
|
+
(without it, no credential is sent), lists the tools within 15 s and calls none. It
|
|
216
220
|
prints a table of each tool's model name, input schema size, hints
|
|
217
221
|
(`read-only`, `destructive`, `idempotent`) and description, then the tools
|
|
218
222
|
renamed for the model. `--server` is the server name your manifest uses (default:
|
|
219
223
|
the host's name, `linear` for `mcp.linear.app`); `--sse` speaks the older SSE
|
|
220
224
|
transport; `--json` prints the Runtime's answer. A server that answers `401`
|
|
221
225
|
needs a credential: it says so, and names the server's sign-in from its
|
|
222
|
-
protected-resource metadata, since such a server needs a key in
|
|
223
|
-
MCP gateway that holds each person's sign-in. A server it cannot list exits 1 with
|
|
226
|
+
protected-resource metadata, since such a server needs a key in an Environment's
|
|
227
|
+
secrets or an MCP gateway that holds each person's sign-in. A server it cannot list exits 1 with
|
|
224
228
|
the reason (`mcp.unreachable` for an address the Runtime refuses).
|
|
225
229
|
|
|
226
230
|
## The containers
|
|
@@ -313,17 +317,20 @@ on every start and writes the result to `NYLORUN_STUDIO_ANALYTICS_ID` in
|
|
|
313
317
|
|
|
314
318
|
## Sandboxes
|
|
315
319
|
|
|
316
|
-
A session gets a sandbox
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
320
|
+
A session gets a sandbox from the Environment it is opened on
|
|
321
|
+
(`createSession({ environment: id })`; protocol 11): an Environment has its own id
|
|
322
|
+
(`PUT /v1/environments/{id}`, `client.environments` in `@nylorun/agents`), one
|
|
323
|
+
sandbox and one vault of secrets, and outlives the sessions that name it. A session
|
|
324
|
+
opened on none has no sandbox. Kind `virtual` (the default) runs on the Runtime's
|
|
325
|
+
**virtual** backend: an emulated shell in the Runtime process, with no extra
|
|
326
|
+
containers. It is not a VM or container boundary. Kind `pod` runs in a pod on a
|
|
327
|
+
cluster (below).
|
|
328
|
+
|
|
329
|
+
`nylorun sandbox ls` lists the running Tenant's Environments with their kind,
|
|
330
|
+
state, sessions and labels; `nylorun sandbox rm <id>` deletes one, with its files
|
|
331
|
+
and vault (refused while a turn runs in it). Neither starts a stopped Tenant
|
|
332
|
+
(exit 3). The Tenant's limits for Environments (`limits.environments`, `idle`,
|
|
333
|
+
resources, network) are `PUT /v1/tenant/sandbox` on the Management API.
|
|
327
334
|
|
|
328
335
|
### Pods on a cluster (preview)
|
|
329
336
|
|
|
@@ -338,8 +345,8 @@ lets pods reach only three ports on the Docker host, and adds the `sandboxes`
|
|
|
338
345
|
service to the Tenant: the one container holding the cluster credentials
|
|
339
346
|
(`<Host root>/sandboxes/`). On kind under Linux, pass `--host-address 172.17.0.1`.
|
|
340
347
|
`nylorun sandbox disable` removes the service (`--delete-namespace` also deletes
|
|
341
|
-
the namespace and every sandbox in it). Sessions
|
|
342
|
-
|
|
348
|
+
the namespace and every sandbox in it). Sessions run in a pod when their
|
|
349
|
+
Environment has kind `pod` (`client.environments.put(id, { kind: "pod" })`).
|
|
343
350
|
|
|
344
351
|
## Host root
|
|
345
352
|
|
|
@@ -370,11 +377,11 @@ npx nylo status # in a project with nylorun installed
|
|
|
370
377
|
|
|
371
378
|
Outside such a project, `npx nylo` looks for an npm package named `nylo`, which
|
|
372
379
|
is not this one: use `npx -p nylorun nylo`. The deprecated
|
|
373
|
-
[`@nylorun/cli`](../
|
|
380
|
+
[`@nylorun/cli`](../legacy/README.md) runs this `nylo` for one more release.
|
|
374
381
|
|
|
375
382
|
```sh
|
|
376
383
|
nylo status [--json] # the Tenant, its checks and counts
|
|
377
|
-
nylo reset [--sessions|--
|
|
384
|
+
nylo reset [--sessions|--environments|--all] [--yes]
|
|
378
385
|
nylo access signing-keys … # the Tenant's signing keys: list, rotate, revoke
|
|
379
386
|
nylo configure # set or replace the Tenant's model provider
|
|
380
387
|
nylo env # export lines for the linked Project
|
|
@@ -404,7 +411,7 @@ Local Tenant commands (`up`, `down`, `start`, `stop`, `logs`, `studio`) exit 2
|
|
|
404
411
|
naming `npx nylorun <command>`. `nylo tenant …` exits 2: `npx nylorun start`
|
|
405
412
|
creates the project's Tenant and the link, and `nylo status|reset` replace
|
|
406
413
|
`nylo tenant status|reset`. `nylo endpoints` was removed with Action endpoints
|
|
407
|
-
(protocol 8: the Runtime runs
|
|
414
|
+
(protocol 8: the Runtime runs agents from their manifests alone) and exits 2.
|
|
408
415
|
|
|
409
416
|
### `status` and `reset`: `nylorun` or `nylo`
|
|
410
417
|
|
|
@@ -414,7 +421,7 @@ Both commands have a `status` and a `reset`, which act on different things:
|
|
|
414
421
|
| --- | --- | --- |
|
|
415
422
|
| Acts on | the local Tenant on this machine (`--tenant`, `NYLORUN_TENANT` or the link), through Docker and `nylorun-operate` in its runtime container | the linked installation, local or remote, through the Management API with a management key |
|
|
416
423
|
| `status` | the containers, endpoints and Runtime health, and the Tenant's state: it answers when the Tenant is stopped or not open, and says why | the open Tenant's checks, counts and sandbox backend (`GET /v1/tenant`); when the Tenant does not answer it fails and points at `nylorun status` |
|
|
417
|
-
| `reset` | deletes all the Tenant's data: volumes, `tenant/` and the vault key; the next `start` creates it anew, with a new id, and relinks the project | clears the sessions (the default), the
|
|
424
|
+
| `reset` | deletes all the Tenant's data: volumes, `tenant/` and the vault key; the next `start` creates it anew, with a new id, and relinks the project | clears the sessions (the default), the Environments (`--environments`) or all the data (`--all`) after draining work in flight; the Tenant, its keys and the Project link are kept |
|
|
418
425
|
|
|
419
426
|
`nylo reset --all` asks first; pass `--yes` when not in a terminal.
|
|
420
427
|
`nylorun reset` asks too, or takes `--yes`.
|
|
@@ -475,4 +482,4 @@ These are `nylorun`'s; [`nylo`'s](#nylo-exit-codes) are above.
|
|
|
475
482
|
| `nylo`: `403 key_role_mismatch` | The key belongs to the other API: a management key for the Management API, an application key for the Runtime API |
|
|
476
483
|
| `nylo`: old Project link refused | `npx nylorun start` in the project |
|
|
477
484
|
|
|
478
|
-
See [MIGRATION.md](
|
|
485
|
+
See [MIGRATION.md](../../guides/MIGRATION.md).
|
package/dist/client/cli.js
CHANGED
|
@@ -11,8 +11,8 @@ Runtime client for the linked installation and its one Tenant (the Project link
|
|
|
11
11
|
npx nylorun start writes, or NYLORUN_RUNTIME_URL with NYLORUN_SERVER_KEY, and
|
|
12
12
|
NYLORUN_MANAGEMENT_KEY for status, reset, access, configure and doctor):
|
|
13
13
|
status [--json] the Tenant, its checks and counts
|
|
14
|
-
reset [--sessions|--
|
|
15
|
-
clear the Tenant's sessions,
|
|
14
|
+
reset [--sessions|--environments|--all] [--yes]
|
|
15
|
+
clear the Tenant's sessions, Environments or all its data
|
|
16
16
|
access signing-keys list|rotate|revoke the Tenant's token signing keys (nylo access --help)
|
|
17
17
|
configure set the linked Tenant's model provider
|
|
18
18
|
env print the linked Project's NYLORUN_* variables as exports
|
|
@@ -29,7 +29,7 @@ const LOCAL_COMMANDS = new Set([
|
|
|
29
29
|
const TENANT_REMOVED = `nylo tenant was removed: an installation serves one Tenant.
|
|
30
30
|
Run "npx nylorun start" in your project to create its Tenant and the Project link.
|
|
31
31
|
Then use nylo status and nylo reset on the linked installation.`;
|
|
32
|
-
const ENDPOINTS_REMOVED = `nylo endpoints was removed: the Runtime runs
|
|
32
|
+
const ENDPOINTS_REMOVED = `nylo endpoints was removed: the Runtime runs agents from their manifests alone,
|
|
33
33
|
so there are no Action endpoints. An agent's tools are http() tools and remote MCP servers
|
|
34
34
|
(see MIGRATION.md).`;
|
|
35
35
|
const usageError = (message) => new CliError(message, 2);
|
package/dist/client/doctor.d.ts
CHANGED
|
@@ -11,11 +11,12 @@ export type SandboxReport = {
|
|
|
11
11
|
version?: string;
|
|
12
12
|
}[];
|
|
13
13
|
defaultImage?: string;
|
|
14
|
-
/** The Tenant's
|
|
14
|
+
/** The Tenant's Environment settings in force (`environments.config`, protocol 11). */
|
|
15
15
|
config?: {
|
|
16
|
-
default: "none" | "virtual" | Record<string, unknown>;
|
|
17
16
|
limits?: {
|
|
18
17
|
network?: readonly string[];
|
|
18
|
+
idle?: string;
|
|
19
|
+
environments?: number;
|
|
19
20
|
};
|
|
20
21
|
};
|
|
21
22
|
};
|
package/dist/client/doctor.js
CHANGED
|
@@ -42,14 +42,21 @@ export async function doctorSandbox(options) {
|
|
|
42
42
|
? "auto (npx nylorun start seeds the Tenant's sandbox.backend from .env NYLORUN_SANDBOX)"
|
|
43
43
|
: report.preference,
|
|
44
44
|
]);
|
|
45
|
-
|
|
45
|
+
rows.push([
|
|
46
|
+
"sessions",
|
|
47
|
+
"get a sandbox only on an Environment (createSession({ environment }) names one)",
|
|
48
|
+
]);
|
|
49
|
+
const limits = report.config?.limits;
|
|
50
|
+
if (limits)
|
|
46
51
|
rows.push([
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
?
|
|
50
|
-
:
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
"limits",
|
|
53
|
+
[
|
|
54
|
+
limits.idle ? `idle ${limits.idle}` : undefined,
|
|
55
|
+
limits.environments === undefined ? undefined : `${limits.environments} environments`,
|
|
56
|
+
limits.network ? `${limits.network.length} allowed hosts` : undefined,
|
|
57
|
+
]
|
|
58
|
+
.filter((item) => item !== undefined)
|
|
59
|
+
.join(", ") || "-",
|
|
53
60
|
]);
|
|
54
61
|
rows.push([
|
|
55
62
|
"selected",
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* answer: `npx nylorun status` reports why.
|
|
4
4
|
*/
|
|
5
5
|
export declare function statusCommand(args: readonly string[]): Promise<void>;
|
|
6
|
-
/** `nylo reset [--sessions|--
|
|
6
|
+
/** `nylo reset [--sessions|--environments|--all] [--yes]`; `--all` asks first. */
|
|
7
7
|
export declare function resetCommand(args: readonly string[]): Promise<void>;
|
|
@@ -38,16 +38,18 @@ export async function statusCommand(args) {
|
|
|
38
38
|
console.log(`counts sessions=${body.counts.sessions} running=${body.counts.runningSessions} uncertain=${body.counts.uncertainEffects}`);
|
|
39
39
|
console.log(`sandbox ${body.sandbox.backend ?? "none"}`);
|
|
40
40
|
}
|
|
41
|
-
const RESET_USAGE = "Usage: nylo reset [--sessions|--
|
|
42
|
-
const SCOPES = { "--sessions": "sessions", "--
|
|
43
|
-
/** `nylo reset [--sessions|--
|
|
41
|
+
const RESET_USAGE = "Usage: nylo reset [--sessions|--environments|--all] [--yes]";
|
|
42
|
+
const SCOPES = { "--sessions": "sessions", "--environments": "environments", "--all": "all" };
|
|
43
|
+
/** `nylo reset [--sessions|--environments|--all] [--yes]`; `--all` asks first. */
|
|
44
44
|
export async function resetCommand(args) {
|
|
45
45
|
const yes = args.includes("--yes");
|
|
46
46
|
const flags = args.filter((a) => a !== "--yes");
|
|
47
|
+
if (flags.includes("--sandboxes"))
|
|
48
|
+
throw new CliError("--sandboxes is now --environments (protocol 11): nylo reset --environments deletes the Tenant's Environments, their vaults and files.", 2);
|
|
47
49
|
if (flags.some((f) => !(f in SCOPES)) || args.filter((a) => a === "--yes").length > 1)
|
|
48
50
|
throw new CliError(RESET_USAGE, 2);
|
|
49
51
|
if (flags.length > 1)
|
|
50
|
-
throw new CliError("Pass only one of --sessions, --
|
|
52
|
+
throw new CliError("Pass only one of --sessions, --environments, --all.", 2);
|
|
51
53
|
const scope = flags.length ? SCOPES[flags[0]] : "sessions";
|
|
52
54
|
const connection = await linkedConnection(projectRoot());
|
|
53
55
|
const tenant = connection.link?.tenant;
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Exit codes are part of both commands' contract; see nylorun/README.md ("Exit codes"). */
|
|
1
|
+
/** Exit codes are part of both commands' contract; see cli/nylorun/README.md ("Exit codes"). */
|
|
2
2
|
export declare class CliError extends Error {
|
|
3
3
|
readonly exitCode: number;
|
|
4
4
|
constructor(message: string, exitCode?: number);
|
package/dist/errors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Exit codes are part of both commands' contract; see nylorun/README.md ("Exit codes"). */
|
|
1
|
+
/** Exit codes are part of both commands' contract; see cli/nylorun/README.md ("Exit codes"). */
|
|
2
2
|
export class CliError extends Error {
|
|
3
3
|
exitCode;
|
|
4
4
|
constructor(message, exitCode = 1) {
|
|
@@ -238,7 +238,16 @@ ${sandboxes ? SANDBOXES_GATES_PORT : ""} # Egress and the stores; the harness
|
|
|
238
238
|
NYLORUN_HARNESS: \${NYLORUN_HARNESS:-remote}
|
|
239
239
|
NYLORUN_HARNESS_LISTEN_PORT: "4200"
|
|
240
240
|
NYLORUN_HARNESS_ALLOWED_HOSTS: runtime:4200${sandboxes ? SANDBOXES_HARNESS_HOST : ""}
|
|
241
|
-
NYLORUN_HARNESS_TOKEN: \${NYLORUN_HARNESS_TOKEN:?run nylorun start}
|
|
241
|
+
NYLORUN_HARNESS_TOKEN: \${NYLORUN_HARNESS_TOKEN:?run nylorun start}
|
|
242
|
+
# Traces (R7.2): from the shell that runs \`nylorun start\`. Unset, they are
|
|
243
|
+
# empty and the Runtime exports nothing. A collector on this machine is host.docker.internal.
|
|
244
|
+
OTEL_EXPORTER_OTLP_ENDPOINT: \${OTEL_EXPORTER_OTLP_ENDPOINT:-}
|
|
245
|
+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: \${OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:-}
|
|
246
|
+
OTEL_EXPORTER_OTLP_HEADERS: \${OTEL_EXPORTER_OTLP_HEADERS:-}
|
|
247
|
+
OTEL_SERVICE_NAME: \${OTEL_SERVICE_NAME:-}
|
|
248
|
+
OTEL_RESOURCE_ATTRIBUTES: \${OTEL_RESOURCE_ATTRIBUTES:-}
|
|
249
|
+
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT: \${OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT:-}
|
|
250
|
+
NYLORUN_TRACE_CONTENT: \${NYLORUN_TRACE_CONTENT:-}${sandboxes ? SANDBOXES_RUNTIME_ENV : ""}${identity ? IDENTITY_RUNTIME_ENV : ""}
|
|
242
251
|
extra_hosts:
|
|
243
252
|
host.docker.internal: host-gateway # the Docker host, also on Linux Docker Engine
|
|
244
253
|
volumes:
|
package/dist/stack/mcp.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { McpPreview } from "@nylorun/core/contracts";
|
|
2
2
|
import { type StackDeps } from "./commands.js";
|
|
3
|
-
export declare const mcpUsage = " mcp inspect <url> [--server <name>] [--
|
|
3
|
+
export declare const mcpUsage = " mcp inspect <url> [--server <name>] [--environment <id>] [--sse] [--tenant <name>] [--json]\n list a remote MCP server's tools, with Environment <id>'s\n credential for <url> (none without it): model names, schema\n sizes, renames, or that it needs a person's sign-in (the\n Runtime calls no tool)";
|
|
4
|
+
/** What `--vault` says since protocol 11. */
|
|
5
|
+
export declare const MCP_VAULT_REMOVED = "--vault was removed in protocol 11: a credential is a secret of an Environment, in its own vault. Pass --environment <id> to send that Environment's credential for the URL.";
|
|
4
6
|
/** What the removed `connect` subcommand says since protocol 10. */
|
|
5
|
-
export declare const MCP_CONNECT_REMOVED
|
|
7
|
+
export declare const MCP_CONNECT_REMOVED: string;
|
|
6
8
|
/** A preview as a person reads it: the server, a table of tools, the renames, or the sign-in hint. */
|
|
7
|
-
export declare function previewLines(preview: McpPreview): string[];
|
|
9
|
+
export declare function previewLines(preview: McpPreview, environmentId?: string): string[];
|
|
8
10
|
/** `nylorun mcp <inspect|connect> ...` */
|
|
9
11
|
export declare function mcpCommand(deps: StackDeps, args: readonly string[]): Promise<number>;
|
package/dist/stack/mcp.js
CHANGED
|
@@ -2,30 +2,39 @@
|
|
|
2
2
|
* `nylorun mcp inspect <url>`: a remote MCP server's tools before an agent names it (R2b C12),
|
|
3
3
|
* through the running local Tenant's Management API (`POST /v1/tenant/mcp/preview`) with the
|
|
4
4
|
* Project link's management key, else the Host root's (`runningTenantApi`). It never starts the
|
|
5
|
-
* Tenant, and the Runtime never calls a tool.
|
|
6
|
-
*
|
|
5
|
+
* Tenant, and the Runtime never calls a tool. `--environment <id>` sends that Environment's
|
|
6
|
+
* credential for the URL (protocol 11; it replaced `--vault`); an Environment's secrets are
|
|
7
|
+
* written on the Runtime API (`client.environments.secrets.put` of `@nylorun/agents`). Its
|
|
8
|
+
* `connect` subcommand (MCP OAuth) was removed in protocol 10, and says so.
|
|
7
9
|
*/
|
|
8
10
|
import { PROTOCOL_HEADER, PROTOCOL_VERSION } from "@nylorun/core/compatibility";
|
|
9
11
|
import { CliError } from "../errors.js";
|
|
10
12
|
import { parseStackFlags, runningTenantApi } from "./commands.js";
|
|
11
|
-
export const mcpUsage = ` mcp inspect <url> [--server <name>] [--
|
|
12
|
-
list a remote MCP server's tools with
|
|
13
|
-
credential for <url
|
|
14
|
-
that it needs a person's sign-in (the
|
|
15
|
-
|
|
13
|
+
export const mcpUsage = ` mcp inspect <url> [--server <name>] [--environment <id>] [--sse] [--tenant <name>] [--json]
|
|
14
|
+
list a remote MCP server's tools, with Environment <id>'s
|
|
15
|
+
credential for <url> (none without it): model names, schema
|
|
16
|
+
sizes, renames, or that it needs a person's sign-in (the
|
|
17
|
+
Runtime calls no tool)`;
|
|
18
|
+
const INSPECT_USAGE = "nylorun mcp inspect <url> [--server <name>] [--environment <id>] [--sse] [--tenant <name>] [--json]";
|
|
19
|
+
/** Where a credential for an MCP server goes since protocol 11. */
|
|
20
|
+
const SECRET_HINT = "write it as a bearer or headers secret of an Environment (client.environments.secrets.put of @nylorun/agents, or Studio)";
|
|
21
|
+
/** What `--vault` says since protocol 11. */
|
|
22
|
+
export const MCP_VAULT_REMOVED = "--vault was removed in protocol 11: a credential is a secret of an Environment, in its own vault. Pass --environment <id> to send that Environment's credential for the URL.";
|
|
16
23
|
/** What the removed `connect` subcommand says since protocol 10. */
|
|
17
|
-
export const MCP_CONNECT_REMOVED =
|
|
24
|
+
export const MCP_CONNECT_REMOVED = `The connect subcommand of nylorun mcp was removed with MCP OAuth (protocol 10): ${SECRET_HINT.replace("write it", "write the server's key")}, or reach a server that needs a person's sign-in through a gateway (a secret with via). See its tools with nylorun mcp inspect <url> --environment <id>.`;
|
|
18
25
|
/** The preview takes up to 15 s in the Runtime; the hop gets a margin. */
|
|
19
26
|
const PREVIEW_TIMEOUT_MS = 30_000;
|
|
20
27
|
const DESCRIPTION_CHARS = 60;
|
|
21
28
|
const usageError = (message) => new CliError(message, 2);
|
|
22
29
|
async function inspect(deps, args) {
|
|
23
|
-
|
|
30
|
+
if (args.some((arg) => arg === "--vault" || arg.startsWith("--vault=")))
|
|
31
|
+
throw usageError(MCP_VAULT_REMOVED);
|
|
32
|
+
const flags = parseStackFlags(args, { booleans: ["--json", "--sse"], values: ["--server", "--environment", "--tenant"] }, INSPECT_USAGE);
|
|
24
33
|
if (flags.rest.length !== 1)
|
|
25
34
|
throw usageError(`Usage: ${INSPECT_USAGE}`);
|
|
26
35
|
const url = flags.rest[0];
|
|
27
36
|
const name = flags.values.get("--server");
|
|
28
|
-
const
|
|
37
|
+
const environmentId = flags.values.get("--environment");
|
|
29
38
|
const tenant = flags.values.get("--tenant");
|
|
30
39
|
const api = await runningTenantApi(deps, tenant === undefined ? {} : { name: tenant });
|
|
31
40
|
const response = await deps.fetch(`${api.runtimeUrl}/v1/tenant/mcp/preview`, {
|
|
@@ -40,7 +49,7 @@ async function inspect(deps, args) {
|
|
|
40
49
|
url,
|
|
41
50
|
...(flags.booleans.has("--sse") ? { type: "sse" } : {}),
|
|
42
51
|
...(name === undefined ? {} : { name }),
|
|
43
|
-
...(
|
|
52
|
+
...(environmentId === undefined ? {} : { environmentId }),
|
|
44
53
|
}),
|
|
45
54
|
redirect: "error",
|
|
46
55
|
signal: AbortSignal.timeout(PREVIEW_TIMEOUT_MS),
|
|
@@ -60,15 +69,17 @@ async function inspect(deps, args) {
|
|
|
60
69
|
deps.out(JSON.stringify(preview, null, 2));
|
|
61
70
|
return 0;
|
|
62
71
|
}
|
|
63
|
-
for (const line of previewLines(preview))
|
|
72
|
+
for (const line of previewLines(preview, environmentId))
|
|
64
73
|
deps.out(line);
|
|
65
74
|
return 0;
|
|
66
75
|
}
|
|
67
76
|
/** A preview as a person reads it: the server, a table of tools, the renames, or the sign-in hint. */
|
|
68
|
-
export function previewLines(preview) {
|
|
77
|
+
export function previewLines(preview, environmentId) {
|
|
69
78
|
const credential = preview.credentialSent
|
|
70
|
-
?
|
|
71
|
-
:
|
|
79
|
+
? `with Environment ${environmentId ?? "(unnamed)"}'s credential`
|
|
80
|
+
: environmentId === undefined
|
|
81
|
+
? "with no credential (pass --environment <id> to send an Environment's)"
|
|
82
|
+
: `with no credential (Environment ${environmentId} holds none for this URL)`;
|
|
72
83
|
if (preview.authRequired) {
|
|
73
84
|
const metadata = preview.authRequired.resourceMetadata;
|
|
74
85
|
const servers = Array.isArray(metadata?.authorization_servers)
|
|
@@ -76,13 +87,14 @@ export function previewLines(preview) {
|
|
|
76
87
|
: [];
|
|
77
88
|
return [
|
|
78
89
|
preview.credentialSent
|
|
79
|
-
? `The MCP server at ${preview.url} answered 401: it rejected
|
|
90
|
+
? `The MCP server at ${preview.url} answered 401: it rejected Environment ${environmentId ?? "(unnamed)"}'s credential.`
|
|
80
91
|
: `The MCP server at ${preview.url} answered 401: it needs a credential.`,
|
|
81
92
|
...(servers.length > 0
|
|
82
93
|
? [`It signs people in with ${servers.join(", ")} (${preview.authRequired.resourceMetadataUrl}).`]
|
|
83
94
|
: []),
|
|
84
|
-
|
|
85
|
-
"through a gateway that keeps each person's sign-in
|
|
95
|
+
`Nylorun holds no OAuth client: ${SECRET_HINT.replace("write it", "write the server's API key")},`,
|
|
96
|
+
"and pass --environment <id>; or reach it through a gateway that keeps each person's sign-in",
|
|
97
|
+
"(a secret with via and an identity header).",
|
|
86
98
|
];
|
|
87
99
|
}
|
|
88
100
|
const info = preview.serverInfo;
|
package/dist/stack/sandbox.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type StackDeps } from "./commands.js";
|
|
2
|
-
export declare const sandboxUsage = " sandbox ls [--tenant <name>] [--label <key=value>]... [--json]\n the Tenant's
|
|
2
|
+
export declare const sandboxUsage = " sandbox ls [--tenant <name>] [--label <key=value>]... [--json]\n the Tenant's Environments: id, kind, state, sessions and labels\n sandbox rm <id> [--tenant <name>] delete an Environment: its sandbox, files and vault\n (refused while a turn runs in it)\n sandbox enable --context <name> [--tenant <name>] [--host-address <ip>] [--bind-address <ip>] [--no-pull]\n run the Tenant's sandboxes as pods on that kubeconfig context (agent-sandbox v1.0.5)\n sandbox disable [--tenant <name>] [--delete-namespace]\n stop the sandboxes service and forget the cluster\n sandbox status [--tenant <name>] [--json]\n the cluster, the sandboxes service's readiness and what it reports";
|
|
3
3
|
/** `nylorun sandbox <ls|rm|enable|disable|status> ...` */
|
|
4
4
|
export declare function sandboxCommand(deps: StackDeps, args: readonly string[]): Promise<number>;
|
package/dist/stack/sandbox.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `nylorun sandbox ls | rm`: the running local Tenant's
|
|
3
|
-
*
|
|
4
|
-
* Tenant. `nylorun sandbox enable|disable|status` (sandbox pods on a cluster,
|
|
5
|
-
* `../sandbox/commands.ts`.
|
|
2
|
+
* `nylorun sandbox ls | rm`: the running local Tenant's Environments (protocol 11: each holds one
|
|
3
|
+
* sandbox and one vault), through its Runtime API with the application key (`runningTenantApi`).
|
|
4
|
+
* Neither starts the Tenant. `nylorun sandbox enable|disable|status` (sandbox pods on a cluster,
|
|
5
|
+
* F7.2) live in `../sandbox/commands.ts`.
|
|
6
6
|
*/
|
|
7
7
|
import { PROTOCOL_HEADER, PROTOCOL_VERSION } from "@nylorun/core/compatibility";
|
|
8
8
|
import { CliError } from "../errors.js";
|
|
@@ -10,8 +10,9 @@ import { runSandboxCommand, sandboxUsage as clusterUsage } from "../sandbox/comm
|
|
|
10
10
|
import { spawnKubectl } from "../sandbox/kubectl.js";
|
|
11
11
|
import { parseStackFlags, runningTenantApi } from "./commands.js";
|
|
12
12
|
export const sandboxUsage = ` sandbox ls [--tenant <name>] [--label <key=value>]... [--json]
|
|
13
|
-
the Tenant's
|
|
14
|
-
sandbox rm <id> [--tenant <name>] delete
|
|
13
|
+
the Tenant's Environments: id, kind, state, sessions and labels
|
|
14
|
+
sandbox rm <id> [--tenant <name>] delete an Environment: its sandbox, files and vault
|
|
15
|
+
(refused while a turn runs in it)
|
|
15
16
|
${clusterUsage}`;
|
|
16
17
|
const usageError = (message) => new CliError(message, 2);
|
|
17
18
|
async function call(deps, api, method, path) {
|
|
@@ -26,8 +27,8 @@ async function call(deps, api, method, path) {
|
|
|
26
27
|
signal: AbortSignal.timeout(15_000),
|
|
27
28
|
});
|
|
28
29
|
const body = (await response.json().catch(() => ({})));
|
|
29
|
-
if (response.status === 404 &&
|
|
30
|
-
throw new CliError(`Tenant ${api.name} runs a Runtime without
|
|
30
|
+
if (response.status === 404 && /^\/v1\/environments(\?|$)/.test(path))
|
|
31
|
+
throw new CliError(`Tenant ${api.name} runs a Runtime without Environments. Update it: npx nylorun@latest start.`, 1);
|
|
31
32
|
if (!response.ok && response.status !== 404)
|
|
32
33
|
throw new CliError(`${method} ${path} returned ${response.status}${typeof body.message === "string" ? `: ${body.message}` : ""}`, 1);
|
|
33
34
|
return { status: response.status, body };
|
|
@@ -50,24 +51,24 @@ async function ls(deps, args) {
|
|
|
50
51
|
const name = flags.values.get("--tenant");
|
|
51
52
|
const api = await runningTenantApi(deps, name === undefined ? {} : { name });
|
|
52
53
|
const search = query.toString();
|
|
53
|
-
const { body } = await call(deps, api, "GET", `/v1/
|
|
54
|
-
const
|
|
54
|
+
const { body } = await call(deps, api, "GET", `/v1/environments${search ? `?${search}` : ""}`);
|
|
55
|
+
const environments = (body.environments ?? []);
|
|
55
56
|
if (flags.booleans.has("--json")) {
|
|
56
|
-
deps.out(JSON.stringify(
|
|
57
|
+
deps.out(JSON.stringify(environments, null, 2));
|
|
57
58
|
return 0;
|
|
58
59
|
}
|
|
59
|
-
if (
|
|
60
|
-
deps.out(`No
|
|
60
|
+
if (environments.length === 0) {
|
|
61
|
+
deps.out(`No Environments on Tenant ${api.name}.`);
|
|
61
62
|
return 0;
|
|
62
63
|
}
|
|
63
64
|
const rows = [
|
|
64
65
|
["ID", "KIND", "STATE", "SESSIONS", "LABELS"],
|
|
65
|
-
...
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
String(
|
|
70
|
-
labelsText(
|
|
66
|
+
...environments.map((environment) => [
|
|
67
|
+
environment.id,
|
|
68
|
+
environment.kind,
|
|
69
|
+
environment.state,
|
|
70
|
+
String(environment.sessions.length),
|
|
71
|
+
labelsText(environment.labels),
|
|
71
72
|
]),
|
|
72
73
|
];
|
|
73
74
|
const widths = rows[0].map((_, column) => Math.max(...rows.map((row) => row[column].length)));
|
|
@@ -85,12 +86,12 @@ async function rm(deps, args) {
|
|
|
85
86
|
const id = flags.rest[0];
|
|
86
87
|
const name = flags.values.get("--tenant");
|
|
87
88
|
const api = await runningTenantApi(deps, name === undefined ? {} : { name });
|
|
88
|
-
const { status, body } = await call(deps, api, "DELETE", `/v1/
|
|
89
|
+
const { status, body } = await call(deps, api, "DELETE", `/v1/environments/${encodeURIComponent(id)}`);
|
|
89
90
|
if (status === 404 || body.deleted !== true) {
|
|
90
|
-
deps.err(`No
|
|
91
|
+
deps.err(`No Environment ${id} on Tenant ${api.name}.`);
|
|
91
92
|
return 1;
|
|
92
93
|
}
|
|
93
|
-
deps.out(`Deleted
|
|
94
|
+
deps.out(`Deleted Environment ${id}: its sandbox, files and vault.`);
|
|
94
95
|
return 0;
|
|
95
96
|
}
|
|
96
97
|
/** `nylorun sandbox <ls|rm|enable|disable|status> ...` */
|
package/dist/stack/versions.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/** An image this CLI release pins in `
|
|
1
|
+
/** An image this CLI release pins in its `package.json` `nylorun` (D7). */
|
|
2
2
|
export type PinnedImage = "runtime" | "studio";
|
|
3
3
|
/**
|
|
4
|
-
* The version this CLI release pins for an image, from `
|
|
4
|
+
* The version this CLI release pins for an image, from its `package.json`
|
|
5
5
|
* `nylorun.runtime` or `nylorun.studio`: the tag of `ghcr.io/nylorun/<name>`
|
|
6
6
|
* a local Tenant runs unless `NYLORUN_RUNTIME_IMAGE` / `NYLORUN_STUDIO_IMAGE`
|
|
7
7
|
* overrides it. The release tooling writes both pins.
|
package/dist/stack/versions.js
CHANGED
|
@@ -3,11 +3,11 @@ import { dirname, join } from "node:path";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { CliError } from "../errors.js";
|
|
5
5
|
function cliPackageJsonPath() {
|
|
6
|
-
// src/stack/*.ts and dist/stack/*.js both sit two levels below
|
|
6
|
+
// src/stack/*.ts and dist/stack/*.js both sit two levels below the package root.
|
|
7
7
|
return join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* The version this CLI release pins for an image, from `
|
|
10
|
+
* The version this CLI release pins for an image, from its `package.json`
|
|
11
11
|
* `nylorun.runtime` or `nylorun.studio`: the tag of `ghcr.io/nylorun/<name>`
|
|
12
12
|
* a local Tenant runs unless `NYLORUN_RUNTIME_IMAGE` / `NYLORUN_STUDIO_IMAGE`
|
|
13
13
|
* overrides it. The release tooling writes both pins.
|
|
@@ -22,7 +22,7 @@ export function pinnedVersion(name) {
|
|
|
22
22
|
}
|
|
23
23
|
const version = raw?.nylorun?.[name];
|
|
24
24
|
if (typeof version !== "string" || version.trim() === "") {
|
|
25
|
-
throw new CliError(`
|
|
25
|
+
throw new CliError(`nylorun's package.json is missing "nylorun.${name}" (the pinned ${name} image version).`, 1);
|
|
26
26
|
}
|
|
27
27
|
return version;
|
|
28
28
|
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nylorun",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0-beta",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"description": "Set up and run local Nylorun Tenants (Runtime and Studio) with Docker Compose (nylorun), and the Runtime client of the linked installation (nylo)",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "git+https://github.com/nylorun/agents.git",
|
|
10
|
-
"directory": "nylorun"
|
|
10
|
+
"directory": "cli/nylorun"
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
13
13
|
"dist",
|
|
@@ -23,21 +23,21 @@
|
|
|
23
23
|
"node": ">=24.0.0"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
|
-
"build": "npm run clean && node
|
|
26
|
+
"build": "npm run clean && node ../../scripts/check-typescript-version.mjs && tsc -p tsconfig.json",
|
|
27
27
|
"clean": "node -e \"import('node:fs').then(({rmSync})=>rmSync('dist',{recursive:true,force:true}))\"",
|
|
28
28
|
"check": "npm run build && npm test && node scripts/check-package.mjs",
|
|
29
29
|
"test": "vitest run --passWithNoTests",
|
|
30
30
|
"prepack": "npm run build"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@nylorun/core": "0.
|
|
34
|
-
"@nylorun/admin": "0.
|
|
33
|
+
"@nylorun/core": "0.20.0-beta",
|
|
34
|
+
"@nylorun/admin": "0.16.0-beta"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@earendil-works/pi-ai": "0.99.1",
|
|
38
|
-
"@nylorun/agents": "file
|
|
38
|
+
"@nylorun/agents": "file:../../sdks/agents",
|
|
39
39
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
40
|
-
"@types/node": "^26.
|
|
40
|
+
"@types/node": "^26.6.4",
|
|
41
41
|
"vitest": "^5.0.2"
|
|
42
42
|
},
|
|
43
43
|
"bin": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"nylo": "dist/nylo.js"
|
|
46
46
|
},
|
|
47
47
|
"nylorun": {
|
|
48
|
-
"runtime": "0.
|
|
49
|
-
"studio": "0.
|
|
48
|
+
"runtime": "0.24.0-beta",
|
|
49
|
+
"studio": "0.24.0-beta"
|
|
50
50
|
}
|
|
51
51
|
}
|