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 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](../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 sandboxes
52
- nylorun sandbox rm <id> [--tenant <name>] # delete a sandbox and its files
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>] [--vault <id>] [--sse] [--tenant <name>] [--json] # a remote MCP server's tools, with the installation vault's credential
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: add a key or a gateway credential to a
68
- vault instead, and preview the server with `nylorun mcp inspect`).
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](../SELF_HOSTING.md#keys)). `nylorun key` manages both on the
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; the operator gives each URL a vault
205
- credential, a `bearer` token or a `headers` map, with `via` and an identity
206
- header when an MCP gateway holds each person's sign-in. Add it on Studio's
207
- Credentials page or with `@nylorun/admin` (no `nylorun` command adds one); the
208
- whole flow, with gateway recipes, is in
209
- [DEPLOYMENT.md](../DEPLOYMENT.md#mcp-servers-and-http-tools).
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 the installation vault's credential for `<url>` (`--vault <id>` picks the
215
- vault when several hold one), lists the tools within 15 s and calls none. It
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 a vault or an
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 when it is opened with one, or when the Tenant's
317
- default names one (`PUT /v1/tenant/sandbox`). A local Tenant runs them on the
318
- Runtime's **virtual** backend: an emulated shell in the Runtime process, with no
319
- extra containers. It is not a VM or container boundary.
320
-
321
- A sandbox can also be a resource with its own id (`PUT /v1/sandboxes/{id}`,
322
- `client.sandboxes` in `@nylorun/agents`) that sessions attach to and that
323
- outlives them. `nylorun sandbox ls` lists the running Tenant's sandboxes with
324
- their state, attached sessions and labels; `nylorun sandbox rm <id>` deletes one
325
- and its files (refused while a turn runs in it). Neither starts a stopped Tenant
326
- (exit 3).
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 keep using the virtual backend
342
- in this release.
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`](../cli/README.md) runs this `nylo` for one more release.
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|--sandboxes|--all] [--yes]
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 no code of yours during a session) and exits 2.
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 sandboxes or all the data (`--all`) after draining work in flight; the Tenant, its keys and the Project link are kept |
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](../MIGRATION.md).
485
+ See [MIGRATION.md](../../guides/MIGRATION.md).
@@ -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|--sandboxes|--all] [--yes]
15
- clear the Tenant's sessions, sandboxes or all its data
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 no code of yours during a session,
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);
@@ -11,11 +11,12 @@ export type SandboxReport = {
11
11
  version?: string;
12
12
  }[];
13
13
  defaultImage?: string;
14
- /** The Tenant's sandbox configuration (Runtimes with Sandboxes v3). */
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
  };
@@ -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
- if (report.config)
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
- "default",
48
- report.config.default === "none"
49
- ? "none: sessions get a sandbox only when opened with one (set a default with PUT /v1/tenant/sandbox)"
50
- : report.config.default === "virtual"
51
- ? "virtual: sessions that name no sandbox get one"
52
- : "a Tenant sandbox: sessions that name no sandbox get it",
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|--sandboxes|--all] [--yes]`; `--all` asks first. */
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|--sandboxes|--all] [--yes]";
42
- const SCOPES = { "--sessions": "sessions", "--sandboxes": "sandboxes", "--all": "all" };
43
- /** `nylo reset [--sessions|--sandboxes|--all] [--yes]`; `--all` asks first. */
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, --sandboxes, --all.", 2);
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}${sandboxes ? SANDBOXES_RUNTIME_ENV : ""}${identity ? IDENTITY_RUNTIME_ENV : ""}
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:
@@ -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>] [--vault <id>] [--sse] [--tenant <name>] [--json]\n list a remote MCP server's tools with the installation vault's\n credential for <url>: model names, schema sizes, renames, or\n that it needs a person's sign-in (the Runtime calls no tool)";
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 = "The connect subcommand of nylorun mcp was removed with MCP OAuth (protocol 10): add the server's key to an installation vault as a bearer or headers credential (Studio's Credentials page, or @nylorun/admin), or reach a server that needs a person's sign-in through a gateway (a credential with via). See its tools with nylorun mcp inspect <url>.";
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. Its `connect` subcommand (MCP OAuth) was removed
6
- * in protocol 10, and says so.
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>] [--vault <id>] [--sse] [--tenant <name>] [--json]
12
- list a remote MCP server's tools with the installation vault's
13
- credential for <url>: model names, schema sizes, renames, or
14
- that it needs a person's sign-in (the Runtime calls no tool)`;
15
- const INSPECT_USAGE = "nylorun mcp inspect <url> [--server <name>] [--vault <id>] [--sse] [--tenant <name>] [--json]";
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 = "The connect subcommand of nylorun mcp was removed with MCP OAuth (protocol 10): add the server's key to an installation vault as a bearer or headers credential (Studio's Credentials page, or @nylorun/admin), or reach a server that needs a person's sign-in through a gateway (a credential with via). See its tools with nylorun mcp inspect <url>.";
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
- const flags = parseStackFlags(args, { booleans: ["--json", "--sse"], values: ["--server", "--vault", "--tenant"] }, INSPECT_USAGE);
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 vaultId = flags.values.get("--vault");
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
- ...(vaultId === undefined ? {} : { vaultId }),
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
- ? "with the installation vault's credential"
71
- : "with no credential (no installation vault holds one for this URL)";
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 the installation vault's credential.`
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
- "Nylorun holds no OAuth client: add the server's API key to an installation vault, or reach it",
85
- "through a gateway that keeps each person's sign-in (a credential with via and an identity header).",
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;
@@ -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 sandboxes: id, kind, state, attached sessions and labels\n sandbox rm <id> [--tenant <name>] delete a sandbox and its files (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";
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>;
@@ -1,8 +1,8 @@
1
1
  /**
2
- * `nylorun sandbox ls | rm`: the running local Tenant's sandbox resources (Host feature
3
- * `sandboxes`), through its Tenant API with an operator key (`runningTenantApi`). Neither starts the
4
- * Tenant. `nylorun sandbox enable|disable|status` (sandbox pods on a cluster, F7.2) live in
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 sandboxes: id, kind, state, attached sessions and labels
14
- sandbox rm <id> [--tenant <name>] delete a sandbox and its files (refused while a turn runs in it)
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 && path === "/v1/sandboxes")
30
- throw new CliError(`Tenant ${api.name} runs a Runtime without sandboxes. Update it: npx nylorun@latest start.`, 1);
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/sandboxes${search ? `?${search}` : ""}`);
54
- const sandboxes = (body.sandboxes ?? []);
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(sandboxes, null, 2));
57
+ deps.out(JSON.stringify(environments, null, 2));
57
58
  return 0;
58
59
  }
59
- if (sandboxes.length === 0) {
60
- deps.out(`No sandboxes on Tenant ${api.name}.`);
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
- ...sandboxes.map((sandbox) => [
66
- sandbox.id,
67
- sandbox.kind,
68
- sandbox.state,
69
- String(sandbox.sessions.length),
70
- labelsText(sandbox.labels),
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/sandboxes/${encodeURIComponent(id)}`);
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 sandbox ${id} on Tenant ${api.name}.`);
91
+ deps.err(`No Environment ${id} on Tenant ${api.name}.`);
91
92
  return 1;
92
93
  }
93
- deps.out(`Deleted sandbox ${id} and its files.`);
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> ...` */
@@ -1,7 +1,7 @@
1
- /** An image this CLI release pins in `cli/package.json` `nylorun` (D7). */
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 `cli/package.json`
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.
@@ -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 cli/.
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 `cli/package.json`
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(`cli/package.json is missing "nylorun.${name}" (the pinned ${name} image version).`, 1);
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.13.0-beta",
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 ../scripts/check-typescript-version.mjs && tsc -p tsconfig.json",
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.19.0-beta",
34
- "@nylorun/admin": "0.15.0-beta"
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:../agents",
38
+ "@nylorun/agents": "file:../../sdks/agents",
39
39
  "typescript": "npm:@typescript/typescript6@^6.0.2",
40
- "@types/node": "^26.5.0",
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.23.0-beta",
49
- "studio": "0.23.3-beta"
48
+ "runtime": "0.24.0-beta",
49
+ "studio": "0.24.0-beta"
50
50
  }
51
51
  }