@nylorun/agents 0.21.0-beta → 0.22.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,40 @@
1
1
  # @nylorun/agents
2
2
 
3
+ ## 0.22.0-beta
4
+
5
+ ### Minor Changes
6
+
7
+ - a0cf8b2: **HTTP tools take `GET` and `DELETE`, and URL path parameters.**
8
+
9
+ - `method` is `GET`, `POST` (default), `PUT`, `PATCH` or `DELETE`. `POST`, `PUT` and `PATCH` send the input as the JSON body, as before. `GET` and `DELETE` send no body: the input becomes the query string, after any query string written in the URL. An array repeats its name (`tag=a&tag=b`) and a `null` is left out.
10
+ - The URL's path may name input fields as `{field}`, as in `https://api.example.com/orders/{orderId}`. Each value is percent-encoded into the path and is not sent again in the body or query string. A value that is empty, `.` or `..`, or not a string, number or boolean is refused before the call is sent (`tool.invalid-input`).
11
+ - `http()` and the manifest contract check a tool against its input schema. Each `{field}` must be a required scalar property. For `GET` and `DELETE`, a property must not be an object and must not repeat a query parameter the URL already sets.
12
+ - An HTTP verifier still takes only `POST`, `PUT` or `PATCH` and a URL without `{field}` parameters, because it is sent `{ input, output, iteration }` as a body. A credential with `via` cannot serve a tool with `{field}` parameters (`http.credential`).
13
+ - core exports `httpToolRequest`, which maps a call's input to the request, and `httpPathParameters`. The Runtime's outbound `post()` is now `send()`, which can send a request without a body.
14
+
15
+ ### Patch Changes
16
+
17
+ - 620072d: **Docs and schemas match what the CLI and the Runtime do.**
18
+
19
+ - `@nylorun/core`: the environment manifest's JSON Schema (`@nylorun/core/schemas/environment-manifest.json`) takes the CLI's `{ path, from }` `files` entry, so an editor no longer flags a manifest that `nylorun environments manifests save` accepts. The Runtime's own schema is unchanged: the CLI turns the folder into `{ path, files }` before saving. `manifest_changed` says to save without `If-Match` (`--if-match`, `ifMatch`); no command takes `--force`.
20
+ - Tool names, skill names and MCP server names are each unique within their kind, as the builder and the Runtime check; a tool, a skill and a server may share a name. The docs said they were unique across kinds.
21
+ - `harness_mismatch` is described as what it is since protocol 14: an Environment's harness is fixed for its life (fork onto a manifest version to run another), and a session's turn is refused when its Environment id was deleted and made again with another harness, or an Environment changed in place before protocol 14 applies that change.
22
+ - `@nylorun/agents`: the README names `nylorun environments list | delete`, not `nylorun local sandbox ls | rm`.
23
+ - MIGRATION.md no longer offers a tool's `approval`, removed in protocol 11, as a replacement for step middleware.
24
+
25
+ - 000ff75: **READMEs and help text match protocol 14.**
26
+
27
+ - `nylorun --help` lists `environments fork`, `manifests` and `delete-version`. The package description no longer offers `nylo` as the Runtime client, and the README says nylorun depends on `@nylorun/agents` too.
28
+ - The READMEs name the current commands: `nylorun tenant keys`, `nylorun tenant mcp inspect`, `nylorun local logs` and `nylorun local reset`. `@nylorun/admin` says it speaks protocol 14.
29
+ - `@nylorun/agents`: a lost MCP or HTTP tool call is sent again with its key, then fails to the model as `tool.interrupted` (it is not left `uncertain`). Every manifest is v7. A2A takes `raw` files. A delegated agent cannot pause.
30
+ - `@nylorun/runtime`: the README describes protocol 14, `PUT /v1/sessions/{id}` says it answers an identical session (vaults are no longer attached), and the database-layout error names `nylorun local reset`.
31
+ - `@nylorun/create-agent`: `nylorun start` writes the project's keys (no key is derived any more).
32
+
33
+ - Pin core to the tested release.
34
+ - Updated dependencies [620072d]
35
+ - Updated dependencies [a0cf8b2]
36
+ - @nylorun/core@0.22.0-beta
37
+
3
38
  ## 0.21.0-beta
4
39
 
5
40
  ### Minor Changes
package/README.md CHANGED
@@ -46,7 +46,7 @@ const refundOrder = http({
46
46
  input: z.object({ orderId: z.string(), amount: z.number() }), // or a JSON Schema object
47
47
  output: z.object({ refundId: z.string() }), // optional
48
48
  url: "https://billing.example.com/refunds",
49
- method: "POST", // default; or PUT, PATCH
49
+ method: "POST", // default; or GET, PUT, PATCH, DELETE
50
50
  credential: "billing", // optional: the session's Environment holds a credential for this URL
51
51
  timeoutMs: 20_000, // default 60000, at most 300000
52
52
  });
@@ -54,9 +54,51 @@ const refundOrder = http({
54
54
  export const support = Agent({ id: "support" }).tools(refundOrder);
55
55
  ```
56
56
 
57
- The tool goes into the manifest as `http`, and the Runtime's
58
- Tool Gate sends the model's input as the JSON body, under the Host's address
59
- policy (`NYLORUN_ENDPOINT_*`), with `content-type: application/json`,
57
+ The method decides where the input goes:
58
+
59
+ | Method | Request |
60
+ | -------------------------------- | -------------------------------------------------------------- |
61
+ | `POST` (default), `PUT`, `PATCH` | The input as the JSON body (`content-type: application/json`) |
62
+ | `GET`, `DELETE` | No body: the input as the query string |
63
+
64
+ The URL's path may name input fields as `{field}`. Each one must be a required string,
65
+ number or boolean field of `input`. Its value goes into the path percent-encoded (so `/`,
66
+ `?` and `#` cannot change the request), and it is not sent again in the body or query
67
+ string. A query string written in the URL is kept, and the input's fields come after it.
68
+ In the query string an array repeats its name (`tag=a&tag=b`) and a `null` is left out.
69
+
70
+ `http()`, and the Runtime when it saves a manifest, refuse a tool whose URL names a field
71
+ the input does not require. For `GET` and `DELETE` they also refuse a field that is an object (a query string cannot hold one), and a
72
+ field that repeats a query parameter the URL already sets. A call is refused before it is
73
+ sent (`tool.invalid-input`) when a URL value is empty, `.` or `..`, or not a string, number
74
+ or boolean.
75
+
76
+ ```ts
77
+ // GET https://api.open-meteo.com/v1/forecast?current=…&latitude=22.57&longitude=88.36
78
+ const forecast = http({
79
+ name: "get_forecast",
80
+ description: "Current weather at a latitude and longitude.",
81
+ input: z.object({
82
+ latitude: z.number(),
83
+ longitude: z.number(),
84
+ temperature_unit: z.enum(["celsius", "fahrenheit"]).optional(),
85
+ }),
86
+ url: "https://api.open-meteo.com/v1/forecast?current=temperature_2m,relative_humidity_2m,wind_speed_10m&timezone=auto",
87
+ method: "GET",
88
+ });
89
+
90
+ // DELETE https://billing.example.com/orders/A-17?reason=duplicate
91
+ const cancelOrder = http({
92
+ name: "cancel_order",
93
+ input: z.object({ orderId: z.string(), reason: z.string() }),
94
+ url: "https://billing.example.com/orders/{orderId}",
95
+ method: "DELETE",
96
+ credential: "billing",
97
+ });
98
+ ```
99
+
100
+ The tool goes into the manifest as `http`, and the Runtime's Tool Gate sends
101
+ the request under the Host's address policy (`NYLORUN_ENDPOINT_*`), with
60
102
  `Nylorun-Session-Id`, `Nylorun-Turn-Id`, `Nylorun-Agent-Id` and an
61
103
  `Idempotency-Key` that is the same when the Runtime re-sends the call after a
62
104
  restart, so your service can drop duplicates. A `2xx` JSON answer is the output
@@ -81,10 +123,11 @@ turn say, that is a new call with a new key: put a business key (an order or
81
123
  charge id) in the tool's input schema to refuse it too.
82
124
 
83
125
  `credential` works as for a remote MCP server: the vault of the session's
84
- Environment must hold a credential bound to the tool's exact URL, else the call
85
- fails before it is sent (`http.credential`). A credential with `via`
86
- sends the call there instead, such as a gateway, with the session owner in its
87
- identity header, and a `401` is `credential_rejected` to the model, not retried.
126
+ Environment must hold a credential bound to the tool's exact URL (as written,
127
+ `{field}` parameters included), else the call fails before it is sent
128
+ (`http.credential`). A credential with `via` sends the call there instead, such
129
+ as a gateway, with the session owner in its identity header (a gateway has one
130
+ URL, so a tool with `{field}` parameters fails with `http.credential`), and a `401` is `credential_rejected` to the model, not retried.
88
131
  Whether a call waits for a person is not the tool's to say: it is the Tenant's
89
132
  [tool policy](#tool-policy). An HTTP tool is also a flow stage (see [Flow agents](#flow-agents)), and runs
90
133
  only on the Runtime (a local `run()` reports `http.runtime-only`).
@@ -215,11 +258,11 @@ const assistant = Agent({ id: "assistant", name: "Assistant" })
215
258
  });
216
259
  ```
217
260
 
218
- Each key names a server; its `name` defaults to the key and, when given, must equal it. Repeated `.mcp()` calls add servers to the manifest's `mcpServers`. Nylorun accepts remote servers only: `streamable-http` and `sse` ([Agent Plugins MCP servers](https://agent-plugins.org/plugin-authors/mcp-servers)); a `stdio` server is refused, so run it behind an HTTP transport and declare its URL. Attach an Agent Plugin package with `.plugin(path)`: its skills and remote MCP servers join the agent's `skills` and `mcpServers`, each labelled `plugin: { name, version }` from its `plugin.json`, and a stdio server in its `mcp.json` throws. Names are unique across the agent's tools, skills and servers.
261
+ Each key names a server; its `name` defaults to the key and, when given, must equal it. Repeated `.mcp()` calls add servers to the manifest's `mcpServers`. Nylorun accepts remote servers only: `streamable-http` and `sse` ([Agent Plugins MCP servers](https://agent-plugins.org/plugin-authors/mcp-servers)); a `stdio` server is refused, so run it behind an HTTP transport and declare its URL. Attach an Agent Plugin package with `.plugin(path)`: its skills and remote MCP servers join the agent's `skills` and `mcpServers`, each labelled `plugin: { name, version }` from its `plugin.json`, and a stdio server in its `mcp.json` throws. Tool names, skill names and server names are each unique within their kind; a tool, a skill and a server may share a name, since a server's tools are called `<server>__<tool>`.
219
262
 
220
- Set a server's tools one by one with `tools`, keyed by the server's own tool names, `"*"` for the rest: `{ "*": { enabled: false }, search_issues: { enabled: true }, create_issue: { enabled: true } }` is an allowlist (whether a call waits for a person is the [tool policy](#tool-policy)). When an agent's MCP tools would fill more than a tenth of the model's context window, the Runtime defers them: the model finds them with `tool_search` and runs them with `tool_call`. `deferred: true` or `false`, on a tool or on the server, decides instead. Either setting makes the manifest v6 (see MIGRATION.md).
263
+ Set a server's tools one by one with `tools`, keyed by the server's own tool names, `"*"` for the rest: `{ "*": { enabled: false }, search_issues: { enabled: true }, create_issue: { enabled: true } }` is an allowlist (whether a call waits for a person is the [tool policy](#tool-policy)). When an agent's MCP tools would fill more than a tenth of the model's context window, the Runtime defers them: the model finds them with `tool_search` and runs them with `tool_call`. `deferred: true` or `false`, on a tool or on the server, decides instead.
221
264
 
222
- A manifest never carries a server's credential, and its `headers` hold no secret. You write a credential for the server's URL into an Environment (a token or a header map, or a gateway's key with `via` and an identity header for servers that need each person's sign-in, with `client.environments.secrets.put`), and sessions that name the Environment use it: [DEPLOYMENT.md](../../guides/DEPLOYMENT.md#mcp-servers-and-http-tools), which also shows `nylorun mcp inspect` for listing a server's tools first. After `saveAgent`, `admin.coverage({ agentId, environmentId })` in `@nylorun/admin` says which credential each server and HTTP tool would get in that Environment ([Checking an agent's credentials](../../guides/DEPLOYMENT.md#checking-an-agents-credentials)). The model knows each tool as `server__tool`, with characters outside `[A-Za-z0-9_-]` replaced by `_`; a failed call reaches it with a code (`credential_rejected` on a `401`, `mcp.unreachable`, …), and a result past 32 KiB, or an image, becomes an artifact of the session that it reads with `read_artifact`.
265
+ A manifest never carries a server's credential, and its `headers` hold no secret. You write a credential for the server's URL into an Environment (a token or a header map, or a gateway's key with `via` and an identity header for servers that need each person's sign-in, with `client.environments.secrets.put`), and sessions that name the Environment use it: [DEPLOYMENT.md](../../guides/DEPLOYMENT.md#mcp-servers-and-http-tools), which also shows `nylorun tenant mcp inspect` for listing a server's tools first. After `saveAgent`, `admin.coverage({ agentId, environmentId })` in `@nylorun/admin` says which credential each server and HTTP tool would get in that Environment ([Checking an agent's credentials](../../guides/DEPLOYMENT.md#checking-an-agents-credentials)). The model knows each tool as `server__tool`, with characters outside `[A-Za-z0-9_-]` replaced by `_`; a failed call reaches it with a code (`credential_rejected` on a `401`, `mcp.unreachable`, …), and a result past 32 KiB, or an image, becomes an artifact of the session that it reads with `read_artifact`.
223
266
 
224
267
  A session runs in an **Environment**: one sandbox and one vault, with an id you choose, which outlives the sessions that name it (protocol 11). It is made from one version of an **environment manifest** or from inline fields, and never changes what it runs after that (protocol 14). The agent names no Environment, so the same agent runs in any Tenant; it may state what it needs (`.requires()`). Whether an Environment serves one session, one person or a project is your app's choice:
225
268
 
@@ -271,7 +314,7 @@ An Environment never changes what it runs (protocol 14, its view's `manifest`):
271
314
 
272
315
  Secrets are write-only: `client.environments.secrets.put(id, name, secret)` creates or replaces one, and `list`, `get` and `delete` never return a value. An `environment_secret` (`{ value, allowedHosts, inject? }`) shows its name to commands as the sentinel `nylorun-managed`, and egress-gate sets its header on HTTPS requests to `allowedHosts` (pods only); an `environment_variable` (`{ value }`) is a plain variable; `bearer` (`{ url, value, via?, identity? }`) and `headers` (`{ url, headers, via?, identity? }`) are credentials for the MCP servers and HTTP tools at `url`. A second secret for one host, or a second credential for one URL, is `409 credential_conflict` at the write ([DEPLOYMENT.md](../../guides/DEPLOYMENT.md#credentials)). When what an Environment runs declares a secret's slot (a manifest's `secrets`), send only `{ value }` (or `{ headers }`): the type and binding come from the slot, and a name it does not declare is `409 secret_not_in_manifest`. An agent built with `.requires({ sandbox: "pod", secrets: ["GH_TOKEN"] })` opens a session only on an Environment that has them (`409 environment_unsuitable`). `saveAgent(agent, { dryRun: true })` checks a definition and saves nothing.
273
316
 
274
- Sessions on one Environment share its `/workspace` and run their turns at the same time (one turn per session); which sessions work on one disk, and when, is your app's call. Stop, reset, snapshot and restore wait until no turn runs (`409 environment_busy`). Deleting a session only detaches it. With `ownerUserId` set, a session of another owner is `403 environment_owner_mismatch` (a caller acting for a person gets the `404` of a missing Environment), checked when it opens and at every turn start. `client.environments.list({ labels })`, `page`, `get(id)`, `events(id, { types, since, until })` (its lifecycle, and `environment.egress` for every connection its sandbox opens, naming the turns that were running), `stop(id)`, `reset(id)` and `delete(id)` manage them, and `npx nylorun local sandbox ls | rm` does the same on a local Tenant. Acting for a person (`app.as(...)`), changing an Environment or its secrets needs `environments:write`. A trusted issuer's token reaches only the Environments its issuer grants (the identity file's `environments` templates, exact ids or prefixes ending in `/*`), checked at every turn start. The Tenant holds at most `limits.environments` of them (`PUT /v1/tenant/sandbox`, default 100).
317
+ Sessions on one Environment share its `/workspace` and run their turns at the same time (one turn per session); which sessions work on one disk, and when, is your app's call. Stop, reset, snapshot and restore wait until no turn runs (`409 environment_busy`). Deleting a session only detaches it. With `ownerUserId` set, a session of another owner is `403 environment_owner_mismatch` (a caller acting for a person gets the `404` of a missing Environment), checked when it opens and at every turn start. `client.environments.list({ labels })`, `page`, `get(id)`, `events(id, { types, since, until })` (its lifecycle, and `environment.egress` for every connection its sandbox opens, naming the turns that were running), `stop(id)`, `reset(id)` and `delete(id)` manage them, and `npx nylorun environments list | delete` does the same from the command line. Acting for a person (`app.as(...)`), changing an Environment or its secrets needs `environments:write`. A trusted issuer's token reaches only the Environments its issuer grants (the identity file's `environments` templates, exact ids or prefixes ending in `/*`), checked at every turn start. The Tenant holds at most `limits.environments` of them (`PUT /v1/tenant/sandbox`, default 100).
275
318
 
276
319
  A pod's disk can start prepared: `files` copies versions of Tenant-wide artifacts in, then `setup` runs its commands, once per new disk and before its first turn (a failed command fails the pod, and the next turn start runs the setup again). Between turns, `client.environments.snapshot(id)` keeps a version of the disk, `restore(id, version)` puts one back (a pod on a new volume seeded before its next turn), `put(newId, { from: { environment: id, version: "latest" } })` starts a new Environment from it, and `versions(id)` and `deleteVersion(id, n)` manage them ([DEPLOYMENT.md](../../guides/DEPLOYMENT.md#environments)):
277
320
 
@@ -312,7 +355,7 @@ The tool is named after the agent's `id` and takes `{ task: string }`; the agent
312
355
 
313
356
  A flow agent can be a subagent too: `.subagents(researchFlow)` with a `description` like any other. Its manifest is inlined in the parent's, so it is saved with the parent. When the model calls it, the flow runs on the Runtime in its own linked session (a fresh one per call, linked from the parent's with a `node.agent` event at `support/<flow id>`), its agents in theirs, and the flow's output comes back as the tool result; a failed flow is a failed tool result. Cancelling the parent cancels the flow. Flow agents as subagents run on the Runtime only, not in a local `run()`. An approval asked for inside the flow waits on the flow's own session.
314
357
 
315
- Delegate when the parent should keep the answer. When a specialist should own the rest of the conversation, send the next message with a turn manifest that has the specialist's instructions instead. This version is one level deep and non-interactive: a delegated agent cannot use agents as tools, and its tools cannot declare `approval` (keep those on the parent). In the local engine (`@nylorun/harness/run`), a delegated agent's `tool({ run })` tools start with empty `ctx.state`, can read `ctx.agent` (`{ id, path, delegationId }`), and fail with `delegation.interaction-unsupported` on `ctx.ask`, `ctx.approve`, `ctx.sleep` or `ctx.waitFor`. Delegation is not an approval boundary; approvals live on tools.
358
+ Delegate when the parent should keep the answer. When a specialist should own the rest of the conversation, send the next message with a turn manifest that has the specialist's instructions instead. This version is one level deep and non-interactive: a delegated agent cannot use agents as tools, and cannot pause for input, an approval or a wait (keep those on the parent). In the local engine (`@nylorun/harness/run`), a delegated agent's `tool({ run })` tools start with empty `ctx.state`, can read `ctx.agent` (`{ id, path, delegationId }`), and fail with `delegation.interaction-unsupported` on `ctx.ask`, `ctx.approve`, `ctx.sleep` or `ctx.waitFor`. Delegation is not an approval boundary.
316
359
 
317
360
  ## Flow agents
318
361
 
@@ -398,7 +441,8 @@ an answer that does not match `output` fails the stage with its code (`http.stat
398
441
  is retried with the Loop's input, not the feedback.
399
442
 
400
443
  A Loop may be judged by your service instead of an agent: `http({ url, method?,
401
- credential?, timeoutMs? })`, with no name or input, is an HTTP verifier. The Runtime
444
+ credential?, timeoutMs? })`, with no name or input, is an HTTP verifier. Its method is
445
+ `POST`, `PUT` or `PATCH` and its URL has no `{field}` parameters, because the Runtime
402
446
  sends `{ input, output, iteration }` (the Loop's input, the attempt's output, its
403
447
  number) and reads a verdict, `{ pass, feedback? }`, from the answer; anything else, or a
404
448
  failed request, fails the Loop (`loop.verify-failed`). Its verdicts are recorded as
@@ -459,7 +503,8 @@ then `dev`. Agents do not hash the manifest; the Runtime pins the digest of the
459
503
  definition a session opens with. Model selection and model credentials belong to
460
504
  the Tenant.
461
505
 
462
- The Runtime makes a lost HTTP tool call `uncertain` instead of repeating its external effect.
506
+ The Runtime sends a lost MCP or HTTP tool call again with the same key, then fails it to the
507
+ model as `tool.interrupted` (see **How tool calls are delivered**).
463
508
  In the local engine (`@nylorun/harness/run`), `tool({ run })` tools receive state, info,
464
509
  identity, resume, signal, approval/response helpers and memoized `step`. Agent definitions
465
510
  have no `.run()`; explicit
@@ -590,8 +635,10 @@ What the Runtime answers (Host feature `a2a-endpoint`):
590
635
  on the same `taskId`.
591
636
  - The `messageId` is the idempotency key: a retried message returns the same
592
637
  task.
593
- - Text parts, or a single data part, in; the turn's output as the artifact
594
- `output` (text, or JSON as a data part). Files are
638
+ - Text parts, a single data part, or text and `raw` file parts in (at most
639
+ 20 MiB each, stored as artifacts of the context's session); the turn's
640
+ output as the artifact `output` (text, or JSON as a data part). A file by
641
+ `url`, or one the Tenant's model does not read, is
595
642
  `ContentTypeNotSupportedError`.
596
643
  - Clients must send `A2A-Version: 1.0` (header or `?A2A-Version=`).
597
644
  - Not yet: `ListTasks`, streaming and `SubscribeToTask`
package/dist/client.d.ts CHANGED
@@ -2,7 +2,7 @@ export * from "./session-client.js";
2
2
  import { AgentsClient } from "./session-client.js";
3
3
  import type { Destination } from "./http.js";
4
4
  /**
5
- * Build a Tenant API client.
5
+ * Build a Runtime API client.
6
6
  * Explicit connection fields keep today's sync Transport resolution (including
7
7
  * environment fill-ins). With no connection fields, resolves via
8
8
  * `resolveConnection` (environment → project link), which reads the Project's files: it is
@@ -9,7 +9,7 @@ export declare class ConnectionError extends Error {
9
9
  constructor(message: string);
10
10
  }
11
11
  /**
12
- * Resolve Tenant API connection: options → environment → project link (D§7.1). A connection is a
12
+ * Resolve a Runtime API connection: options → environment → project link (D§7.1). A connection is a
13
13
  * Runtime URL and a key: the Runtime serves one Tenant, so nothing names it.
14
14
  */
15
15
  export declare function resolveConnection(options?: {
@@ -42,7 +42,7 @@ function readProjectLink(cwd) {
42
42
  };
43
43
  }
44
44
  /**
45
- * Resolve Tenant API connection: options → environment → project link (D§7.1). A connection is a
45
+ * Resolve a Runtime API connection: options → environment → project link (D§7.1). A connection is a
46
46
  * Runtime URL and a key: the Runtime serves one Tenant, so nothing names it.
47
47
  */
48
48
  export async function resolveConnection(options) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The Tenant API client classes, with no Node-only imports. `client.ts` adds `createClient`,
2
+ * The Runtime API client classes, with no Node-only imports. `client.ts` adds `createClient`,
3
3
  * which resolves the connection from the environment or the Project link.
4
4
  */
5
5
  import type { AgentManifest, BuiltAgent, BuiltWorkflow, JsonValue, SandboxToolName, WorkflowManifest } from "@nylorun/core/define";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nylorun/agents",
3
- "version": "0.21.0-beta",
3
+ "version": "0.22.0-beta",
4
4
  "description": "Nylorun agent definitions and session client",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -43,7 +43,7 @@
43
43
  "test": "vitest run --passWithNoTests"
44
44
  },
45
45
  "dependencies": {
46
- "@nylorun/core": "0.21.0-beta",
46
+ "@nylorun/core": "0.22.0-beta",
47
47
  "gray-matter": "^4.0.3"
48
48
  },
49
49
  "peerDependencies": {