@naturali/cli 0.209.2 → 0.209.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +67 -68
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -17,7 +17,7 @@ var __exportAll = (all, no_symbols) => {
17
17
  };
18
18
  //#endregion
19
19
  //#region package.json
20
- var version = "0.209.2";
20
+ var version = "0.209.4";
21
21
  //#endregion
22
22
  //#region ../sdk/src/generated/core/bodySerializer.gen.ts
23
23
  const serializeFormDataPair = (data, key, value) => {
@@ -807,6 +807,8 @@ var Channels = class {
807
807
  *
808
808
  * `actor_id` binds an actor of this project, so the address speaks as the same actor your own sessions use. A changed actor deletes the address's conversations and their sessions — a session's actor is fixed — and the next message opens a fresh one; the actor naturali created for the address is deleted with them. An actor you bind is never deleted here.
809
809
  *
810
+ * An identifier no channel kind produces is `400`.
811
+ *
810
812
  */
811
813
  static setAddress(options) {
812
814
  return (options.client ?? client).put({
@@ -913,7 +915,7 @@ var Channels = class {
913
915
  /**
914
916
  * Read the whole route table
915
917
  *
916
- * Every route across every channel in the project, one read — the table is small by construction (CHANNELS-ROUTING.md §3.6), so this is unpaginated.
918
+ * Every route across every channel in the project, one read — the table is small by construction, so this is unpaginated.
917
919
  *
918
920
  */
919
921
  static listProjectChannelRoutes(options) {
@@ -937,7 +939,7 @@ var Channels = class {
937
939
  * Connect a channel
938
940
  *
939
941
  * Connect a channel. The required fields depend on `channel`; no credential is ever returned.
940
- * **Discord** (`channel: discord`) — supply `application_id` and `bot_token`, plus the `modes` selecting which Gateway flows to serve (direct messages, and/or @mention-opens-a-thread). The token is checked with Discord first: `400 invalid_bot_token` when Discord rejects it, `400 application_mismatch` when it belongs to another application. Returns `501` when the deployment has no `CHANNEL_TOKEN_KEY` configured.
942
+ * **Discord** (`channel: discord`) — supply `application_id` and `bot_token`, plus the `modes` selecting which Gateway flows to serve (direct messages, and/or @mention-opens-a-thread). The token is checked with Discord first: `400 invalid_bot_token` when Discord rejects it, `400 application_mismatch` when it belongs to another application. Returns `501` when this deployment does not enable Discord channels.
941
943
  * **WhatsApp** (default) — one of two credential paths, both filling the same write-only secret:
942
944
  * * **BYOT** (`credential_source: byot`, default) — supply
943
945
  * `phone_number_id` and `access_token` from your own Meta app.
@@ -1508,7 +1510,7 @@ var AiProviders = class {
1508
1510
  *
1509
1511
  * Deletes an AI provider configuration.
1510
1512
  *
1511
- * Live references — chats, agents, and model routes whose targets name this provider — always block deletion with `409 AI_PROVIDER_HAS_DEPENDENTS`; `force` does not override them, so delete or repoint those resources first. Soft dependents — price overrides and usage/generation records — also block with `409` unless `force=true`, which deletes the provider's price overrides and unlinks its usage history, preserving those rows: each usage event keeps the provider's id as its `ai_provider_id`. The `409` body's `error.meta` reports the counts, a sample of offending IDs, and a `forcible` flag that is `true` when a `force=true` retry would succeed.
1513
+ * Live references — agents and model routes whose targets name this provider — always block deletion with `409 AI_PROVIDER_HAS_DEPENDENTS`; `force` does not override them, so delete or repoint those resources first. Soft dependents — price overrides and usage/generation records — also block with `409` unless `force=true`, which deletes the provider's price overrides and unlinks its usage history, preserving those rows: each usage event keeps the provider's id as its `ai_provider_id`. The `409` body's `error.meta` reports the counts, a sample of offending IDs, and a `forcible` flag that is `true` when a `force=true` retry would succeed.
1512
1514
  *
1513
1515
  */
1514
1516
  static deleteAiProvider(options) {
@@ -1970,7 +1972,7 @@ var Auth = class {
1970
1972
  /**
1971
1973
  * Refresh a session
1972
1974
  *
1973
- * Exchanges a valid refresh token for a new access JWT and a rotated refresh token, taken from the body or from the `refresh_token` cookie set at sign-in — a browser sends an empty body and the cookie carries the credential. Refresh tokens are single-use; presenting a previously-rotated token is treated as reuse and revokes the whole session family (createRefreshRotation reuse detection), except within a few seconds of the rotation, where it is treated as two tabs racing on one cookie and rotated again.
1975
+ * Exchanges a valid refresh token for a new access JWT and a rotated refresh token, taken from the body or from the `refresh_token` cookie set at sign-in — a browser sends an empty body and the cookie carries the credential. Refresh tokens are single-use; presenting a previously-rotated token is treated as reuse and revokes the whole session family, except within a few seconds of the rotation, where it is treated as two tabs racing on one cookie and rotated again.
1974
1976
  *
1975
1977
  */
1976
1978
  static refreshSession(options) {
@@ -2645,10 +2647,7 @@ var Embeddings = class {
2645
2647
  * Provide `input` for a single text or `inputs` for a batch. At least one is required.
2646
2648
  * Returns `embedding` when `input` is used, and `embeddings` when `inputs` is used.
2647
2649
  *
2648
- * `project_id` names the project the call's token usage is metered against, so
2649
- * embedding spend reaches the usage rollup and the project's `cost_usd` / `tokens`
2650
- * quotas. A project-scoped credential supplies its own project; a call that names
2651
- * none and is bound to none is `400 VALIDATION_FAILED`.
2650
+ * The call's token usage is metered against the project in the path, so embedding spend reaches the usage rollup and the project's `cost_usd` / `tokens` quotas. A body `project_id` is ignored.
2652
2651
  *
2653
2652
  */
2654
2653
  static createEmbeddings(options) {
@@ -3699,7 +3698,7 @@ var Listings = class {
3699
3698
  * Update a listing
3700
3699
  *
3701
3700
  * Change the title or description, or pause and resume the listing.
3702
- * `state: suspended` stops the listing for every installing project at once; their installs are kept. `state: listed` resumes a listing you suspended, provided naturali had listed it; nobody reinstalls. A listing naturali suspended cannot be resumed here, and an invalid move answers `409 invalid_listing_state`.
3701
+ * `state: suspended` stops a `listed` listing for every installing project at once; their installs are kept. `state: listed` resumes a listing you suspended, provided naturali had listed it; nobody reinstalls. A listing naturali suspended cannot be resumed here, and an invalid move answers `409 invalid_listing_state`.
3703
3702
  *
3704
3703
  */
3705
3704
  static updateListing(options) {
@@ -4303,8 +4302,8 @@ var Orchestrations = class {
4303
4302
  /**
4304
4303
  * Get orchestration queue stats
4305
4304
  *
4306
- * Returns a point-in-time snapshot of the orchestration run queue: how many tasks are waiting to be claimed (`queue_depth`), how many are currently claimed with a valid lease (`claimed_tasks`), the age of the oldest waiting task, recent claim-latency percentiles over a rolling in-process window. The per-project breakdown is listed by `GET /v1/projects/{project_id}/orchestrations/queue/stats/projects`. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`.
4307
- * Every figure is scoped to what the caller may see. A project-scoped caller gets `queue_depth` and `claimed_tasks` summed over their own projects, and `null` for `oldest_queued_age_seconds` and the `claim_latency_ms` percentiles — both describe the whole deployment and cannot be narrowed, so they are withheld rather than approximated. An unrestricted caller (the action granted on every project) gets the deployment-wide figures.
4305
+ * Returns a point-in-time snapshot of the orchestration run queue: how many tasks are waiting to be claimed (`queue_depth`), how many are currently claimed with a valid lease (`claimed_tasks`), the age of the oldest waiting task, recent claim-latency percentiles over a rolling in-process window. The per-project breakdown is listed by `GET /v1/projects/{project_id}/orchestrations/queue/stats/projects`.
4306
+ * Every figure is scoped to what the caller may see. A project-scoped caller gets `queue_depth` and `claimed_tasks` summed over their own projects, and `null` for `oldest_queued_age_seconds` and the `claim_latency_ms` percentiles — both describe the whole deployment and cannot be narrowed, so they are withheld rather than approximated.
4308
4307
  *
4309
4308
  */
4310
4309
  static getQueueStats(options) {
@@ -4325,7 +4324,7 @@ var Orchestrations = class {
4325
4324
  /**
4326
4325
  * List the projects with queued orchestration work
4327
4326
  *
4328
- * One row per project with any queued or claimed task, ordered by project ID: the per-project breakdown of `GET /v1/projects/{project_id}/orchestrations/queue/stats`. A project-scoped caller sees its own projects only. Guarded by `orchestrations:GetQueueStats`.
4327
+ * One row per project with any queued or claimed task, ordered by project ID: the per-project breakdown of `GET /v1/projects/{project_id}/orchestrations/queue/stats`. A project-scoped caller sees its own projects only.
4329
4328
  *
4330
4329
  */
4331
4330
  static listQueueStatsProjects(options) {
@@ -5894,7 +5893,7 @@ var Triggers = class {
5894
5893
  /**
5895
5894
  * Update a trigger
5896
5895
  *
5897
- * Updates an existing trigger's configuration. The type is immutable. Changing `target_type` or `target_id` re-checks the target-start action (`orchestrations:StartRun`, `agents:CreateAgentGeneration` or `tools:CallTool`) against the resulting target, because a firing runs with the trigger creator's authority rather than the updater's. A caller who could not start the new target is answered `403` and the trigger keeps the target it had.
5896
+ * Updates an existing trigger's configuration. The type is immutable. Changing `target_type` or `target_id` re-checks that the caller may start the resulting target, because a firing runs with the trigger creator's authority rather than the updater's. A caller who could not start the new target is answered `403` and the trigger keeps the target it had.
5898
5897
  *
5899
5898
  */
5900
5899
  static updateTrigger(options) {
@@ -7886,7 +7885,7 @@ const routes = {
7886
7885
  "set-address": {
7887
7886
  serviceClass: "Channels",
7888
7887
  operationId: "setAddress",
7889
- description: "Upserts the address with its `action`, the actor it speaks as, or both; a field left out is left alone. `action: null` forgets the exception and defers back to the route table; any other `action` requires the same fields a route or channel default would (`agent_id` for `agent`, `text` for `message`). `actor_id` binds an actor of this project, so the address speaks as the same actor your own sessions use. A changed actor deletes the address's conversations and their sessions — a session's actor is fixed — and the next message opens a fresh one; the actor naturali created for the address is deleted with them. An actor you bind is never deleted here.",
7888
+ description: "Upserts the address with its `action`, the actor it speaks as, or both; a field left out is left alone. `action: null` forgets the exception and defers back to the route table; any other `action` requires the same fields a route or channel default would (`agent_id` for `agent`, `text` for `message`). `actor_id` binds an actor of this project, so the address speaks as the same actor your own sessions use. A changed actor deletes the address's conversations and their sessions — a session's actor is fixed — and the next message opens a fresh one; the actor naturali created for the address is deleted with them. An actor you bind is never deleted here. An identifier no channel kind produces is `400`.",
7890
7889
  moduleDocsUrl: "https://naturali.ai/docs/modules/addresses",
7891
7890
  httpMethod: "put",
7892
7891
  pathParams: ["project_id", "identifier"],
@@ -8035,7 +8034,7 @@ const routes = {
8035
8034
  serviceClass: "Admin",
8036
8035
  operationId: "listUsers",
8037
8036
  description: "A cursor page of every account, newest first, each with the plan it is on and the balance of its credit ledger. Needs the `admin` role. `email` narrows the page to one account. It matches the whole address case-insensitively and takes no wildcards: an operator looking for `Ana@Acme.com` finds a row stored as `ana@acme.com`, and there is no substring search across customers' addresses. An account with no subscription reads as `free` with a balance of `0`: the absence of a row is the free plan, and the least-privileged rung is also what any unresolvable lookup should answer.",
8038
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8037
+ moduleDocsUrl: "https://naturali.ai/docs",
8039
8038
  httpMethod: "get",
8040
8039
  pathParams: [],
8041
8040
  queryParams: [
@@ -8073,7 +8072,7 @@ const routes = {
8073
8072
  serviceClass: "Admin",
8074
8073
  operationId: "setUserRoles",
8075
8074
  description: "Replaces the platform roles of any user. Needs the `admin` role, and each role that changes needs the caller to hold the role that grants it (today `admin` grants `admin`). Values outside the catalog are rejected with a 400, and a caller cannot remove their own `admin` role.",
8076
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8075
+ moduleDocsUrl: "https://naturali.ai/docs",
8077
8076
  httpMethod: "put",
8078
8077
  pathParams: ["user_id"],
8079
8078
  queryParams: [],
@@ -8097,7 +8096,7 @@ const routes = {
8097
8096
  serviceClass: "Admin",
8098
8097
  operationId: "listUserPlanHistory",
8099
8098
  description: "A cursor page of the account's plan history, newest first, and the rung it is on now. Needs the `admin` role. The history is append-only, so this is the record of who put the account where and why — nothing edits or removes a line. `plan` at the top level is the same value every entitlement check resolves, so one response answers both \"what plan is this?\" and \"how did it get there?\".",
8100
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8099
+ moduleDocsUrl: "https://naturali.ai/docs",
8101
8100
  httpMethod: "get",
8102
8101
  pathParams: ["user_id"],
8103
8102
  queryParams: ["limit", "cursor"],
@@ -8131,7 +8130,7 @@ const routes = {
8131
8130
  serviceClass: "Admin",
8132
8131
  operationId: "grantUserPlan",
8133
8132
  description: "Puts the account on a rung of the infra ladder. Needs the `admin` role. `PUT` because an account is on exactly one rung at a time, but the change is **recorded rather than overwritten**: the plan history is append-only and the newest line is the account's plan. Setting the rung it already holds still writes a line — a re-confirmation is an act worth a record, and the `reason` given with it would otherwise have nowhere to go. Read the history back with `GET` on this path. An upgrade takes effect at once. A downgrade is the same call with a lower rung and takes effect when the month turns: until then `plan` stays the rung held and `next_plan` names the new one. At the turn, active channels past the new rung's allowance are disabled, oldest first; an upgrade re-enables them. A rung whose content-retention window a contract sets — `enterprise` — **requires `retention_days`**, since nothing else can answer what that window is and an unanswered one bounds nothing. Every other rung sets its own and refuses the field.",
8134
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8133
+ moduleDocsUrl: "https://naturali.ai/docs",
8135
8134
  httpMethod: "put",
8136
8135
  pathParams: ["user_id"],
8137
8136
  queryParams: [],
@@ -8172,7 +8171,7 @@ const routes = {
8172
8171
  serviceClass: "Admin",
8173
8172
  operationId: "listUserCredits",
8174
8173
  description: "A cursor page of the account's credit lines, newest first, with the balance they sum to. Needs the `admin` role — including for the account's own owner, who reads their own balance at `GET /v1/users/me/billing` rather than here. That answers what is left; this is the line-by-line record behind it. What an operator reads it for is writing a correction: the line that was wrong stays on the record, so it has to be legible before it can be compensated for.",
8175
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8174
+ moduleDocsUrl: "https://naturali.ai/docs",
8176
8175
  httpMethod: "get",
8177
8176
  pathParams: ["user_id"],
8178
8177
  queryParams: [
@@ -8217,7 +8216,7 @@ const routes = {
8217
8216
  serviceClass: "Admin",
8218
8217
  operationId: "grantUserCredit",
8219
8218
  description: "Writes one line to the account's credit ledger and answers with the balance it produced. Needs the `admin` role. The ledger is append-only and the balance is its sum — there is no balance to set and no line to edit or delete. A mistake is corrected by writing a **negative** `amount_usd`, which leaves the wrong line on the record beside the one that compensates for it. `kind` is required. Money received and credit given away report differently — one is revenue, the other customer-acquisition cost — so the line says which it is rather than defaulting to one of them. The balance this moves is not yet a ceiling anything enforces; turning it into one is a separate mechanism.",
8220
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8219
+ moduleDocsUrl: "https://naturali.ai/docs",
8221
8220
  httpMethod: "post",
8222
8221
  pathParams: ["user_id"],
8223
8222
  queryParams: [],
@@ -8258,7 +8257,7 @@ const routes = {
8258
8257
  serviceClass: "Admin",
8259
8258
  operationId: "getUserUsage",
8260
8259
  description: "The same answer `GET /v1/users/me/usage` gives the account itself: runs, indexed storage and the plan-capped counts, per project and against the rung. Needs the `admin` role.",
8261
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8260
+ moduleDocsUrl: "https://naturali.ai/docs",
8262
8261
  httpMethod: "get",
8263
8262
  pathParams: ["user_id"],
8264
8263
  queryParams: [],
@@ -8276,7 +8275,7 @@ const routes = {
8276
8275
  serviceClass: "Admin",
8277
8276
  operationId: "getAdminPriceBook",
8278
8277
  description: "The upstream runtime's global default prices — the rows carrying neither a provider nor a project, which is all the upstream listing returns, so no tenant's own rates appear here. These are a cost basis, not a tariff: what a customer pays is the plan they bought plus the multiplier in PRICING.md section 3, applied when spend is reconciled. This is the read behind the storage-rate assertion at boot and the pinned embedding rate.",
8279
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8278
+ moduleDocsUrl: "https://naturali.ai/docs",
8280
8279
  httpMethod: "get",
8281
8280
  pathParams: [],
8282
8281
  queryParams: [],
@@ -8288,7 +8287,7 @@ const routes = {
8288
8287
  serviceClass: "Admin",
8289
8288
  operationId: "listUserStatements",
8290
8289
  description: "The same statements the account reads at `GET /v1/users/me/statements`, for an operator to bill from. Needs the `admin` role.",
8291
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8290
+ moduleDocsUrl: "https://naturali.ai/docs",
8292
8291
  httpMethod: "get",
8293
8292
  pathParams: ["user_id"],
8294
8293
  queryParams: ["limit", "cursor"],
@@ -8322,7 +8321,7 @@ const routes = {
8322
8321
  serviceClass: "Admin",
8323
8322
  operationId: "listAdminListings",
8324
8323
  description: "Every listing in one state, newest first — `in_review` by default, the queue an operator works through.",
8325
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8324
+ moduleDocsUrl: "https://naturali.ai/docs",
8326
8325
  httpMethod: "get",
8327
8326
  pathParams: [],
8328
8327
  queryParams: [
@@ -8360,7 +8359,7 @@ const routes = {
8360
8359
  serviceClass: "Admin",
8361
8360
  operationId: "setAdminListingState",
8362
8361
  description: "List a listing in review or one that is suspended, send one in review back to `draft`, or suspend any listing. A listing an operator suspends cannot be resumed by its publisher. An invalid move answers `409 invalid_listing_state`.",
8363
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8362
+ moduleDocsUrl: "https://naturali.ai/docs",
8364
8363
  httpMethod: "put",
8365
8364
  pathParams: ["listing_id"],
8366
8365
  queryParams: [],
@@ -8595,7 +8594,7 @@ const routes = {
8595
8594
  },
8596
8595
  {
8597
8596
  "name": "version_label",
8598
- "description": "Optional tag for the config version this write archives (e.g. `initial`). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change.",
8597
+ "description": "Optional tag for the config version this write creates (e.g. `initial`). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change.",
8599
8598
  "required": false,
8600
8599
  "type": "string",
8601
8600
  "in": "body"
@@ -8821,7 +8820,7 @@ const routes = {
8821
8820
  },
8822
8821
  {
8823
8822
  "name": "version_label",
8824
- "description": "Optional tag for the config version this write archives (e.g. `pre-tone-change`). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes nothing, since no version is created.",
8823
+ "description": "Optional tag for the config version this write creates (e.g. `tone-change`). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes nothing, since no version is created.",
8825
8824
  "required": false,
8826
8825
  "type": "string",
8827
8826
  "in": "body"
@@ -9030,7 +9029,7 @@ const routes = {
9030
9029
  },
9031
9030
  {
9032
9031
  "name": "version_label",
9033
- "description": "Optional tag for the config version this write archives (e.g. `pre-tone-change`). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes nothing, since no version is created.",
9032
+ "description": "Optional tag for the config version this write creates (e.g. `tone-change`). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes nothing, since no version is created.",
9034
9033
  "required": false,
9035
9034
  "type": "string",
9036
9035
  "in": "body"
@@ -9667,7 +9666,7 @@ const routes = {
9667
9666
  "delete-ai-provider": {
9668
9667
  serviceClass: "AIProviders",
9669
9668
  operationId: "deleteAiProvider",
9670
- description: "Deletes an AI provider configuration. Live references — chats, agents, and model routes whose targets name this provider — always block deletion with `409 AI_PROVIDER_HAS_DEPENDENTS`; `force` does not override them, so delete or repoint those resources first. Soft dependents — price overrides and usage/generation records — also block with `409` unless `force=true`, which deletes the provider's price overrides and unlinks its usage history, preserving those rows: each usage event keeps the provider's id as its `ai_provider_id`. The `409` body's `error.meta` reports the counts, a sample of offending IDs, and a `forcible` flag that is `true` when a `force=true` retry would succeed.",
9669
+ description: "Deletes an AI provider configuration. Live references — agents and model routes whose targets name this provider — always block deletion with `409 AI_PROVIDER_HAS_DEPENDENTS`; `force` does not override them, so delete or repoint those resources first. Soft dependents — price overrides and usage/generation records — also block with `409` unless `force=true`, which deletes the provider's price overrides and unlinks its usage history, preserving those rows: each usage event keeps the provider's id as its `ai_provider_id`. The `409` body's `error.meta` reports the counts, a sample of offending IDs, and a `forcible` flag that is `true` when a `force=true` retry would succeed.",
9671
9670
  moduleDocsUrl: "https://naturali.ai/docs/modules/ai-providers",
9672
9671
  httpMethod: "delete",
9673
9672
  pathParams: ["project_id", "ai_provider_id"],
@@ -9691,7 +9690,7 @@ const routes = {
9691
9690
  },
9692
9691
  {
9693
9692
  "name": "force",
9694
- "description": "When `true`, delete the provider's price overrides and unlink its usage history so a provider with only soft dependents can be removed. Has no effect on live references (chats, agents, model routes), which always block deletion.\n",
9693
+ "description": "When `true`, delete the provider's price overrides and unlink its usage history so a provider with only soft dependents can be removed. Has no effect on live references (agents, model routes), which always block deletion.\n",
9695
9694
  "required": false,
9696
9695
  "type": "boolean",
9697
9696
  "in": "query"
@@ -10127,7 +10126,7 @@ const routes = {
10127
10126
  },
10128
10127
  {
10129
10128
  "name": "arguments",
10130
- "description": "Edited arguments to execute instead of the proposed ones. Editing composes a new call, so it additionally requires permission to make that call: `tools:CallTool` on the tool, and for a `builtin` proposal the action's own IAM action.",
10129
+ "description": "Edited arguments to execute instead of the proposed ones. Editing composes a new call to the tool. Refused on an item with no `proposed_action`.",
10131
10130
  "required": false,
10132
10131
  "type": "object",
10133
10132
  "in": "body"
@@ -10641,7 +10640,7 @@ const routes = {
10641
10640
  "refresh-session": {
10642
10641
  serviceClass: "Auth",
10643
10642
  operationId: "refreshSession",
10644
- description: "Exchanges a valid refresh token for a new access JWT and a rotated refresh token, taken from the body or from the `refresh_token` cookie set at sign-in — a browser sends an empty body and the cookie carries the credential. Refresh tokens are single-use; presenting a previously-rotated token is treated as reuse and revokes the whole session family (createRefreshRotation reuse detection), except within a few seconds of the rotation, where it is treated as two tabs racing on one cookie and rotated again.",
10643
+ description: "Exchanges a valid refresh token for a new access JWT and a rotated refresh token, taken from the body or from the `refresh_token` cookie set at sign-in — a browser sends an empty body and the cookie carries the credential. Refresh tokens are single-use; presenting a previously-rotated token is treated as reuse and revokes the whole session family, except within a few seconds of the rotation, where it is treated as two tabs racing on one cookie and rotated again.",
10645
10644
  moduleDocsUrl: "https://naturali.ai/docs/modules/auth",
10646
10645
  httpMethod: "post",
10647
10646
  pathParams: [],
@@ -11094,7 +11093,7 @@ const routes = {
11094
11093
  "list-project-channel-routes": {
11095
11094
  serviceClass: "Channels",
11096
11095
  operationId: "listProjectChannelRoutes",
11097
- description: "Every route across every channel in the project, one read — the table is small by construction (CHANNELS-ROUTING.md §3.6), so this is unpaginated.",
11096
+ description: "Every route across every channel in the project, one read — the table is small by construction, so this is unpaginated.",
11098
11097
  moduleDocsUrl: "https://naturali.ai/docs/modules/channel-routes",
11099
11098
  httpMethod: "get",
11100
11099
  pathParams: ["project_id"],
@@ -11146,7 +11145,7 @@ const routes = {
11146
11145
  "create-channel": {
11147
11146
  serviceClass: "Channels",
11148
11147
  operationId: "createChannel",
11149
- description: "Connect a channel. The required fields depend on `channel`; no credential is ever returned. **Discord** (`channel: discord`) — supply `application_id` and `bot_token`, plus the `modes` selecting which Gateway flows to serve (direct messages, and/or @mention-opens-a-thread). The token is checked with Discord first: `400 invalid_bot_token` when Discord rejects it, `400 application_mismatch` when it belongs to another application. Returns `501` when the deployment has no `CHANNEL_TOKEN_KEY` configured. **WhatsApp** (default) — one of two credential paths, both filling the same write-only secret: * **BYOT** (`credential_source: byot`, default) — supply `phone_number_id` and `access_token` from your own Meta app. * **Embedded signup** (`credential_source: embedded_signup`) — supply `code` and `waba_id` from the Meta popup; naturali exchanges the `code` for the token, subscribes its app to the WABA and registers the number for sending when it is not yet, so the customer never hands over a token. Returns `501` on deployments where Meta App credentials are not configured. The project's plan limits how many channels it may hold. At the limit this responds `403` with `plan_limit_reached`, whose `details` carry the `plan` and the `limit`, before any credential is acquired. Only `active` channels count, so disabling one frees allowance without deleting it.",
11148
+ description: "Connect a channel. The required fields depend on `channel`; no credential is ever returned. **Discord** (`channel: discord`) — supply `application_id` and `bot_token`, plus the `modes` selecting which Gateway flows to serve (direct messages, and/or @mention-opens-a-thread). The token is checked with Discord first: `400 invalid_bot_token` when Discord rejects it, `400 application_mismatch` when it belongs to another application. Returns `501` when this deployment does not enable Discord channels. **WhatsApp** (default) — one of two credential paths, both filling the same write-only secret: * **BYOT** (`credential_source: byot`, default) — supply `phone_number_id` and `access_token` from your own Meta app. * **Embedded signup** (`credential_source: embedded_signup`) — supply `code` and `waba_id` from the Meta popup; naturali exchanges the `code` for the token, subscribes its app to the WABA and registers the number for sending when it is not yet, so the customer never hands over a token. Returns `501` on deployments where Meta App credentials are not configured. The project's plan limits how many channels it may hold. At the limit this responds `403` with `plan_limit_reached`, whose `details` carry the `plan` and the `limit`, before any credential is acquired. Only `active` channels count, so disabling one frees allowance without deleting it.",
11150
11149
  moduleDocsUrl: "https://naturali.ai/docs/modules/channels",
11151
11150
  httpMethod: "post",
11152
11151
  pathParams: ["project_id"],
@@ -11212,7 +11211,7 @@ const routes = {
11212
11211
  },
11213
11212
  {
11214
11213
  "name": "code",
11215
- "description": "Required for `embedded_signup`. The short-lived authorization code from the Meta popup; naturali exchanges it for the access token server-side. Never stored or returned.\n",
11214
+ "description": "Required for `embedded_signup`. The short-lived authorization code from the Meta popup; naturali exchanges it for the access token server-side. Never stored or returned. A code Meta rejects (malformed, expired or already used) is `400 invalid_signup_code`.\n",
11216
11215
  "required": false,
11217
11216
  "type": "string",
11218
11217
  "in": "body"
@@ -12333,7 +12332,7 @@ const routes = {
12333
12332
  },
12334
12333
  {
12335
12334
  "name": "version_label",
12336
- "description": "Optional tag for the version this write archives. Ignored when the write changes no question, since no version is archived.",
12335
+ "description": "Optional tag for the version this write creates. Ignored when the write changes no question, since no version is archived.",
12337
12336
  "required": false,
12338
12337
  "type": "string",
12339
12338
  "in": "body"
@@ -12793,7 +12792,7 @@ const routes = {
12793
12792
  },
12794
12793
  {
12795
12794
  "name": "filename",
12796
- "description": "",
12795
+ "description": "Download name. Defaults to the leaf of `path`.",
12797
12796
  "required": false,
12798
12797
  "type": "string",
12799
12798
  "in": "body"
@@ -13251,7 +13250,7 @@ const routes = {
13251
13250
  },
13252
13251
  {
13253
13252
  "name": "version_label",
13254
- "description": "Optional tag for the tombstone version this write archives.",
13253
+ "description": "Optional tag for the tombstone version this write creates.",
13255
13254
  "required": false,
13256
13255
  "type": "string",
13257
13256
  "in": "body"
@@ -13553,7 +13552,7 @@ const routes = {
13553
13552
  "create-embeddings": {
13554
13553
  serviceClass: "Embeddings",
13555
13554
  operationId: "createEmbeddings",
13556
- description: "Generates embedding vectors for one or more text inputs using the server's configured embedding model. Provide `input` for a single text or `inputs` for a batch. At least one is required. Returns `embedding` when `input` is used, and `embeddings` when `inputs` is used. `project_id` names the project the call's token usage is metered against, so embedding spend reaches the usage rollup and the project's `cost_usd` / `tokens` quotas. A project-scoped credential supplies its own project; a call that names none and is bound to none is `400 VALIDATION_FAILED`.",
13555
+ description: "Generates embedding vectors for one or more text inputs using the server's configured embedding model. Provide `input` for a single text or `inputs` for a batch. At least one is required. Returns `embedding` when `input` is used, and `embeddings` when `inputs` is used. The call's token usage is metered against the project in the path, so embedding spend reaches the usage rollup and the project's `cost_usd` / `tokens` quotas. A body `project_id` is ignored.",
13557
13556
  moduleDocsUrl: "https://naturali.ai/docs/modules/embeddings",
13558
13557
  httpMethod: "post",
13559
13558
  pathParams: ["project_id"],
@@ -13570,7 +13569,7 @@ const routes = {
13570
13569
  },
13571
13570
  {
13572
13571
  "name": "input",
13573
- "description": "Single text to embed.",
13572
+ "description": "Single text to embed. An empty string is `400 VALIDATION_FAILED`.",
13574
13573
  "required": false,
13575
13574
  "type": "string",
13576
13575
  "in": "body"
@@ -15638,7 +15637,7 @@ const routes = {
15638
15637
  },
15639
15638
  {
15640
15639
  "name": "version_label",
15641
- "description": "Optional tag for the config version this write archives (e.g. `initial`). Annotates the version only — it is not stored on the guardrail and is not part of the config, so labelling a change is never itself a change.",
15640
+ "description": "Optional tag for the config version this write creates (e.g. `initial`). Annotates the version only — it is not stored on the guardrail and is not part of the config, so labelling a change is never itself a change.",
15642
15641
  "required": false,
15643
15642
  "type": "string",
15644
15643
  "in": "body"
@@ -15738,7 +15737,7 @@ const routes = {
15738
15737
  },
15739
15738
  {
15740
15739
  "name": "version_label",
15741
- "description": "Optional tag for the config version this write archives (e.g. `pre-tightening`). Annotates the version only — it is not stored on the guardrail and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes no policy, since no version is created.",
15740
+ "description": "Optional tag for the config version this write creates (e.g. `tightened`). Annotates the version only — it is not stored on the guardrail and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes no policy, since no version is created.",
15742
15741
  "required": false,
15743
15742
  "type": "string",
15744
15743
  "in": "body"
@@ -16235,7 +16234,7 @@ const routes = {
16235
16234
  serviceClass: "Installs",
16236
16235
  operationId: "listInstalls",
16237
16236
  description: "The listings the project installed, newest first.",
16238
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16237
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16239
16238
  httpMethod: "get",
16240
16239
  pathParams: ["project_id"],
16241
16240
  queryParams: ["limit", "cursor"],
@@ -16269,7 +16268,7 @@ const routes = {
16269
16268
  serviceClass: "Installs",
16270
16269
  operationId: "createInstall",
16271
16270
  description: "Install a listing by its id. A listed entry, a draft and a listing in review all install; a suspended one answers `409 listing_suspended`. Installing again answers the existing install. After the publisher removed this project's access, installing answers `403 install_blocked`.",
16272
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16271
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16273
16272
  httpMethod: "post",
16274
16273
  pathParams: ["project_id"],
16275
16274
  queryParams: [],
@@ -16293,7 +16292,7 @@ const routes = {
16293
16292
  serviceClass: "Installs",
16294
16293
  operationId: "getInstall",
16295
16294
  description: "One of the project's installs.",
16296
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16295
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16297
16296
  httpMethod: "get",
16298
16297
  pathParams: ["project_id", "install_id"],
16299
16298
  queryParams: [],
@@ -16317,7 +16316,7 @@ const routes = {
16317
16316
  serviceClass: "Installs",
16318
16317
  operationId: "deleteInstall",
16319
16318
  description: "Remove the install. While the project's agents, ingestion rules or other resources still name the installed resource, this answers `409 install_in_use` with them in `details.references`; `force=true` uninstalls anyway and those resources stop reaching it. A `blocked` install, and the install managed conversion uses, answer `403`.",
16320
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16319
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16321
16320
  httpMethod: "delete",
16322
16321
  pathParams: ["project_id", "install_id"],
16323
16322
  queryParams: ["force"],
@@ -16381,14 +16380,14 @@ const routes = {
16381
16380
  },
16382
16381
  {
16383
16382
  "name": "rrf_k",
16384
- "description": "The `k` in the reciprocal rank fusion term `1 / (k + rank)`, which sets how steeply a result's contribution decays with its position in each ranked list. A smaller value weights the very top of each list more heavily. Defaults to the deployment's `KNOWLEDGE_RRF_K`, itself 60 by default. Only applies when `query` is provided.",
16383
+ "description": "The `k` in the reciprocal rank fusion term `1 / (k + rank)`, which sets how steeply a result's contribution decays with its position in each ranked list. A smaller value weights the very top of each list more heavily. Defaults to 60. Only applies when `query` is provided.",
16385
16384
  "required": false,
16386
16385
  "type": "integer",
16387
16386
  "in": "body"
16388
16387
  },
16389
16388
  {
16390
16389
  "name": "recency_half_life_days",
16391
- "description": "Half-life, in days, of a recency decay applied to **memory store** results after fusion: a result's `score` is multiplied by `2 ^ (-age_in_days / recency_half_life_days)`, where age is measured from its `updated_at`. Document results are never decayed. `0` — the default, and the default of the deployment's `KNOWLEDGE_RECENCY_HALF_LIFE_DAYS` — disables the blend entirely; it is a switch, not a lower bound, and sending `0` turns off a deployment-wide decay for this one request. Accepts fractions (`0.5` is twelve hours). How many ranks a given half-life costs depends on `rrf_k`. Only applies when `query` is provided. **No value is known to be safe in general**: every half-life measured against the reference corpus that lifted recency-sensitive queries also cost relevance-sensitive ones, which is why this ships disabled. Measure against your own corpus before setting it — see the Retrieval Quality guide.",
16390
+ "description": "Half-life, in days, of a recency decay applied to **memory store** results after fusion: a result's `score` is multiplied by `2 ^ (-age_in_days / recency_half_life_days)`, where age is measured from its `updated_at`. Document results are never decayed. `0`, the default, disables the blend entirely. Accepts fractions (`0.5` is twelve hours). How many ranks a given half-life costs depends on `rrf_k`. Only applies when `query` is provided. **No value is known to be safe in general**: every half-life measured against the reference corpus that lifted recency-sensitive queries also cost relevance-sensitive ones, which is why this ships disabled. Measure against your own corpus before setting it.",
16392
16391
  "required": false,
16393
16392
  "type": "number",
16394
16393
  "in": "body"
@@ -16455,7 +16454,7 @@ const routes = {
16455
16454
  serviceClass: "Listings",
16456
16455
  operationId: "listPublicListings",
16457
16456
  description: "Every listed entry, newest first. `interface` is what an installing project sees of the resource, read live from the publisher.",
16458
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16457
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16459
16458
  httpMethod: "get",
16460
16459
  pathParams: [],
16461
16460
  queryParams: ["limit", "cursor"],
@@ -16479,7 +16478,7 @@ const routes = {
16479
16478
  serviceClass: "Listings",
16480
16479
  operationId: "getPublicListing",
16481
16480
  description: "One listed entry. A listing that is not listed answers `404`.",
16482
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16481
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16483
16482
  httpMethod: "get",
16484
16483
  pathParams: ["listing_id"],
16485
16484
  queryParams: [],
@@ -16497,7 +16496,7 @@ const routes = {
16497
16496
  serviceClass: "Listings",
16498
16497
  operationId: "listListings",
16499
16498
  description: "The listings the project publishes, newest first.",
16500
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16499
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16501
16500
  httpMethod: "get",
16502
16501
  pathParams: ["project_id"],
16503
16502
  queryParams: ["limit", "cursor"],
@@ -16531,7 +16530,7 @@ const routes = {
16531
16530
  serviceClass: "Listings",
16532
16531
  operationId: "createListing",
16533
16532
  description: "Publish one of the project's tools or agents as a `draft`. Any project member may publish. An agent on a naturali model whose model has no price answers `503 model_not_priced`. A resource that does not exist in the project answers `400 resource_not_found`, and one that already has a listing `409 listing_exists`.",
16534
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16533
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16535
16534
  httpMethod: "post",
16536
16535
  pathParams: ["project_id"],
16537
16536
  queryParams: [],
@@ -16586,7 +16585,7 @@ const routes = {
16586
16585
  serviceClass: "Listings",
16587
16586
  operationId: "getListing",
16588
16587
  description: "One of the project's listings.",
16589
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16588
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16590
16589
  httpMethod: "get",
16591
16590
  pathParams: ["project_id", "listing_id"],
16592
16591
  queryParams: [],
@@ -16609,8 +16608,8 @@ const routes = {
16609
16608
  "update-listing": {
16610
16609
  serviceClass: "Listings",
16611
16610
  operationId: "updateListing",
16612
- description: "Change the title or description, or pause and resume the listing. `state: suspended` stops the listing for every installing project at once; their installs are kept. `state: listed` resumes a listing you suspended, provided naturali had listed it; nobody reinstalls. A listing naturali suspended cannot be resumed here, and an invalid move answers `409 invalid_listing_state`.",
16613
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16611
+ description: "Change the title or description, or pause and resume the listing. `state: suspended` stops a `listed` listing for every installing project at once; their installs are kept. `state: listed` resumes a listing you suspended, provided naturali had listed it; nobody reinstalls. A listing naturali suspended cannot be resumed here, and an invalid move answers `409 invalid_listing_state`.",
16612
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16614
16613
  httpMethod: "patch",
16615
16614
  pathParams: ["project_id", "listing_id"],
16616
16615
  queryParams: [],
@@ -16665,7 +16664,7 @@ const routes = {
16665
16664
  serviceClass: "Listings",
16666
16665
  operationId: "deleteListing",
16667
16666
  description: "Remove a listing and stop sharing its resource. Refused with `409 listing_has_installs` while any project holds an install, in any state: remove each one first, which takes two deletes of `/installs/{install_id}` for an `active` or `suspended` install. The listing's price stops applying from the next minute, and a later listing of the same resource starts from no price. The tool or agent itself is not touched.",
16668
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16667
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16669
16668
  httpMethod: "delete",
16670
16669
  pathParams: ["project_id", "listing_id"],
16671
16670
  queryParams: [],
@@ -16689,7 +16688,7 @@ const routes = {
16689
16688
  serviceClass: "Listings",
16690
16689
  operationId: "submitListing",
16691
16690
  description: "Move a `draft` listing to `in_review`. naturali lists it in the marketplace or sends it back to `draft`. Any other state answers `409 invalid_listing_state`.",
16692
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16691
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16693
16692
  httpMethod: "post",
16694
16693
  pathParams: ["project_id", "listing_id"],
16695
16694
  queryParams: [],
@@ -16713,7 +16712,7 @@ const routes = {
16713
16712
  serviceClass: "Listings",
16714
16713
  operationId: "listListingInstalls",
16715
16714
  description: "Each project that installed the listing, with its usage this billing cycle as last sampled. Never the content of a call.",
16716
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16715
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16717
16716
  httpMethod: "get",
16718
16717
  pathParams: ["project_id", "listing_id"],
16719
16718
  queryParams: ["limit", "cursor"],
@@ -16754,7 +16753,7 @@ const routes = {
16754
16753
  serviceClass: "Listings",
16755
16754
  operationId: "deleteListingInstall",
16756
16755
  description: "Cut one installing project off. An `active` or `suspended` install becomes `blocked`, and that project cannot install the listing again. Deleting a `blocked` install removes it, which lets that project install again.",
16757
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16756
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16758
16757
  httpMethod: "delete",
16759
16758
  pathParams: [
16760
16759
  "project_id",
@@ -18564,7 +18563,7 @@ const routes = {
18564
18563
  "get-queue-stats": {
18565
18564
  serviceClass: "Orchestrations",
18566
18565
  operationId: "getQueueStats",
18567
- description: "Returns a point-in-time snapshot of the orchestration run queue: how many tasks are waiting to be claimed (`queue_depth`), how many are currently claimed with a valid lease (`claimed_tasks`), the age of the oldest waiting task, recent claim-latency percentiles over a rolling in-process window. The per-project breakdown is listed by `GET /v1/projects/{project_id}/orchestrations/queue/stats/projects`. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`. Every figure is scoped to what the caller may see. A project-scoped caller gets `queue_depth` and `claimed_tasks` summed over their own projects, and `null` for `oldest_queued_age_seconds` and the `claim_latency_ms` percentiles — both describe the whole deployment and cannot be narrowed, so they are withheld rather than approximated. An unrestricted caller (the action granted on every project) gets the deployment-wide figures.",
18566
+ description: "Returns a point-in-time snapshot of the orchestration run queue: how many tasks are waiting to be claimed (`queue_depth`), how many are currently claimed with a valid lease (`claimed_tasks`), the age of the oldest waiting task, recent claim-latency percentiles over a rolling in-process window. The per-project breakdown is listed by `GET /v1/projects/{project_id}/orchestrations/queue/stats/projects`. Every figure is scoped to what the caller may see. A project-scoped caller gets `queue_depth` and `claimed_tasks` summed over their own projects, and `null` for `oldest_queued_age_seconds` and the `claim_latency_ms` percentiles — both describe the whole deployment and cannot be narrowed, so they are withheld rather than approximated.",
18568
18567
  moduleDocsUrl: "https://naturali.ai/docs/modules/orchestrations",
18569
18568
  httpMethod: "get",
18570
18569
  pathParams: ["project_id"],
@@ -18582,7 +18581,7 @@ const routes = {
18582
18581
  "list-queue-stats-projects": {
18583
18582
  serviceClass: "Orchestrations",
18584
18583
  operationId: "listQueueStatsProjects",
18585
- description: "One row per project with any queued or claimed task, ordered by project ID: the per-project breakdown of `GET /v1/projects/{project_id}/orchestrations/queue/stats`. A project-scoped caller sees its own projects only. Guarded by `orchestrations:GetQueueStats`.",
18584
+ description: "One row per project with any queued or claimed task, ordered by project ID: the per-project breakdown of `GET /v1/projects/{project_id}/orchestrations/queue/stats`. A project-scoped caller sees its own projects only.",
18586
18585
  moduleDocsUrl: "https://naturali.ai/docs/modules/orchestrations",
18587
18586
  httpMethod: "get",
18588
18587
  pathParams: ["project_id"],
@@ -18720,7 +18719,7 @@ const routes = {
18720
18719
  },
18721
18720
  {
18722
18721
  "name": "version_label",
18723
- "description": "Optional tag for the version this write archives, e.g. `pre-rewire`. Ignored when the write changes no graph field, since no version is archived.",
18722
+ "description": "Optional tag for the version this write creates, e.g. `rewired`. Ignored when the write changes no graph field, since no version is archived.",
18724
18723
  "required": false,
18725
18724
  "type": "string",
18726
18725
  "in": "body"
@@ -19403,7 +19402,7 @@ const routes = {
19403
19402
  },
19404
19403
  {
19405
19404
  "name": "version_label",
19406
- "description": "Optional tag for the version this write archives. Ignored when the write changes no definition, since no version is archived.",
19405
+ "description": "Optional tag for the version this write creates. Ignored when the write changes no definition, since no version is archived.",
19407
19406
  "required": false,
19408
19407
  "type": "string",
19409
19408
  "in": "body"
@@ -22915,7 +22914,7 @@ const routes = {
22915
22914
  },
22916
22915
  {
22917
22916
  "name": "execute",
22918
- "description": "Execution config for http tools. Supported fields: `url` (required), `method` (default `POST`), `headers`, `body_mode` and `response_mode`. The `url` may contain `{paramName}` placeholders (e.g. `/users/{userId}`) that are replaced at call time with the corresponding tool argument value (URL-encoded). Arguments consumed as path parameters are excluded from the query string and request body. `body_mode` is `json` (default) or `multipart`. In `multipart` mode the merged tool arguments are sent as a `multipart/form-data` body: scalar fields become plain form fields and a field shaped like `{ content_type, filename, data_base64 }` is decoded from base64 and attached as a file part (the hardcoded `Content-Type: application/json` is dropped so `fetch` sets the multipart boundary itself). `response_mode` is `json` (default: the body parsed as JSON, else returned as text) or `base64`, which returns a 2xx body as `{ content_type, filename, data_base64 }` — the same file shape `multipart` accepts, so a pipeline step can relay a downloaded file. `filename` comes from `Content-Disposition` and is omitted when the target names none; a body over `TOOL_RESPONSE_MAX_BYTES` is `502 TOOL_RESPONSE_TOO_LARGE`.\n\n`auth` adds a computed request credential, for targets whose `Authorization` value cannot be expressed as a static header. Supported `auth.type` values:\n\n- `aws_sigv4` — signs the request with AWS Signature Version 4. Requires `region`, `service`, `access_key_id` and `secret_access_key`; `session_token` is optional (temporary credentials). Incompatible with `body_mode: multipart`, whose body bytes are not known at signing time.\n- `gcp_service_account` — mints a Google OAuth 2.0 access token from a signed service account assertion and sends it as a bearer token. Requires `credentials` (the service account key file JSON, as a string) and `scopes` (a non-empty array). Tokens are cached per service account and scope set until shortly before they expire.\n\nCredential fields accept `{{secret:...}}` references and should use them — a tool is readable by anyone who can `GET /tools`, and the stored reference is what is echoed back, never the resolved value.\n\nA credential slot takes a reference, never a literal: a literal `secret_access_key`, `session_token` or `credentials` under `auth`, a literal credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), or a `url` carrying a password or a literal credential-named query parameter (those names, plus `key` and `sig`/`signature`) is refused with `400 LITERAL_CREDENTIAL`, `meta.paths` naming each one. A stored literal reads back as `{\"no_echo\": true}` (a `url` holding one is masked whole), an object rather than a string so a read-edit-write round trip fails the schema check instead of writing the placeholder in as the credential. A value carrying a `{{secret:...}}` reference is the wiring, not the credential, and stays readable.\n\n`headers` values additionally accept `{{context:<key>}}` references, resolved per call from the caller's `tool_context`, so a per-user credential can be placed in the real header the target expects (`Authorization: Bearer {{context:ocaToken}}`) instead of only in an `X-Naturali-Context-<key>` header. Valid **only** inside `headers` — a context value is caller-supplied, so it may not steer the `url` — and a key missing from the `tool_context` at call time fails the tool call with `MISSING_TOOL_CONTEXT_KEY` rather than sending an empty credential. See the Tool Context reference.\n",
22917
+ "description": "Execution config for http tools. An `http` tool without a non-empty `url` is `400 VALIDATION_FAILED`, on create and on an update that would leave it without one. Supported fields: `url` (required), `method` (default `POST`), `headers`, `body_mode` and `response_mode`. The `url` may contain `{paramName}` placeholders (e.g. `/users/{userId}`) that are replaced at call time with the corresponding tool argument value (URL-encoded). Arguments consumed as path parameters are excluded from the query string and request body. `body_mode` is `json` (default) or `multipart`. In `multipart` mode the merged tool arguments are sent as a `multipart/form-data` body: scalar fields become plain form fields and a field shaped like `{ content_type, filename, data_base64 }` is decoded from base64 and attached as a file part (the hardcoded `Content-Type: application/json` is dropped so `fetch` sets the multipart boundary itself). `response_mode` is `json` (default: the body parsed as JSON, else returned as text) or `base64`, which returns a 2xx body as `{ content_type, filename, data_base64 }` — the same file shape `multipart` accepts, so a pipeline step can relay a downloaded file. `filename` comes from `Content-Disposition` and is omitted when the target names none; a body over `TOOL_RESPONSE_MAX_BYTES` is `502 TOOL_RESPONSE_TOO_LARGE`.\n\n`auth` adds a computed request credential, for targets whose `Authorization` value cannot be expressed as a static header. Supported `auth.type` values:\n\n- `aws_sigv4` — signs the request with AWS Signature Version 4. Requires `region`, `service`, `access_key_id` and `secret_access_key`; `session_token` is optional (temporary credentials). Incompatible with `body_mode: multipart`, whose body bytes are not known at signing time.\n- `gcp_service_account` — mints a Google OAuth 2.0 access token from a signed service account assertion and sends it as a bearer token. Requires `credentials` (the service account key file JSON, as a string) and `scopes` (a non-empty array). Tokens are cached per service account and scope set until shortly before they expire.\n\nCredential fields accept `{{secret:...}}` references and should use them — a tool is readable by anyone who can `GET /tools`, and the stored reference is what is echoed back, never the resolved value.\n\nA credential slot takes a reference, never a literal: a literal `secret_access_key`, `session_token` or `credentials` under `auth`, a literal credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), or a `url` carrying a password or a literal credential-named query parameter (those names, plus `key` and `sig`/`signature`) is refused with `400 LITERAL_CREDENTIAL`, `meta.paths` naming each one. A stored literal reads back as `{\"no_echo\": true}` (a `url` holding one is masked whole), an object rather than a string so a read-edit-write round trip fails the schema check instead of writing the placeholder in as the credential. A value carrying a `{{secret:...}}` reference is the wiring, not the credential, and stays readable.\n\n`headers` values additionally accept `{{context:<key>}}` references, resolved per call from the caller's `tool_context`, so a per-user credential can be placed in the real header the target expects (`Authorization: Bearer {{context:ocaToken}}`) instead of only in an `X-Naturali-Context-<key>` header. Valid **only** inside `headers` — a context value is caller-supplied, so it may not steer the `url` — and a key missing from the `tool_context` at call time fails the tool call with `MISSING_TOOL_CONTEXT_KEY` rather than sending an empty credential. See the Tool Context reference.\n",
22919
22918
  "required": false,
22920
22919
  "type": "object",
22921
22920
  "in": "body"
@@ -23057,7 +23056,7 @@ const routes = {
23057
23056
  },
23058
23057
  {
23059
23058
  "name": "execute",
23060
- "description": "Execution config for http tools. Supported fields: `url` (required), `method` (default `POST`), `headers`, `body_mode` and `response_mode`. The `url` may contain `{paramName}` placeholders (e.g. `/users/{userId}`) that are replaced at call time with the corresponding tool argument value (URL-encoded). Arguments consumed as path parameters are excluded from the query string and request body. `body_mode` is `json` (default) or `multipart`. In `multipart` mode the merged tool arguments are sent as a `multipart/form-data` body: scalar fields become plain form fields and a field shaped like `{ content_type, filename, data_base64 }` is decoded from base64 and attached as a file part (the hardcoded `Content-Type: application/json` is dropped so `fetch` sets the multipart boundary itself). `response_mode` is `json` (default: the body parsed as JSON, else returned as text) or `base64`, which returns a 2xx body as `{ content_type, filename, data_base64 }` — the same file shape `multipart` accepts, so a pipeline step can relay a downloaded file. `filename` comes from `Content-Disposition` and is omitted when the target names none; a body over `TOOL_RESPONSE_MAX_BYTES` is `502 TOOL_RESPONSE_TOO_LARGE`.\n\n`auth` adds a computed request credential, for targets whose `Authorization` value cannot be expressed as a static header. Supported `auth.type` values:\n\n- `aws_sigv4` — signs the request with AWS Signature Version 4. Requires `region`, `service`, `access_key_id` and `secret_access_key`; `session_token` is optional (temporary credentials). Incompatible with `body_mode: multipart`, whose body bytes are not known at signing time.\n- `gcp_service_account` — mints a Google OAuth 2.0 access token from a signed service account assertion and sends it as a bearer token. Requires `credentials` (the service account key file JSON, as a string) and `scopes` (a non-empty array). Tokens are cached per service account and scope set until shortly before they expire.\n\nCredential fields accept `{{secret:...}}` references and should use them — a tool is readable by anyone who can `GET /tools`, and the stored reference is what is echoed back, never the resolved value.\n\nA credential slot takes a reference, never a literal: a literal `secret_access_key`, `session_token` or `credentials` under `auth`, a literal credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), or a `url` carrying a password or a literal credential-named query parameter (those names, plus `key` and `sig`/`signature`) is refused with `400 LITERAL_CREDENTIAL`, `meta.paths` naming each one. A stored literal reads back as `{\"no_echo\": true}` (a `url` holding one is masked whole), an object rather than a string so a read-edit-write round trip fails the schema check instead of writing the placeholder in as the credential. A value carrying a `{{secret:...}}` reference is the wiring, not the credential, and stays readable.\n\n`headers` values additionally accept `{{context:<key>}}` references, resolved per call from the caller's `tool_context`, so a per-user credential can be placed in the real header the target expects (`Authorization: Bearer {{context:ocaToken}}`) instead of only in an `X-Naturali-Context-<key>` header. Valid **only** inside `headers` — a context value is caller-supplied, so it may not steer the `url` — and a key missing from the `tool_context` at call time fails the tool call with `MISSING_TOOL_CONTEXT_KEY` rather than sending an empty credential. See the Tool Context reference.\n",
23059
+ "description": "Execution config for http tools. An `http` tool without a non-empty `url` is `400 VALIDATION_FAILED`, on create and on an update that would leave it without one. Supported fields: `url` (required), `method` (default `POST`), `headers`, `body_mode` and `response_mode`. The `url` may contain `{paramName}` placeholders (e.g. `/users/{userId}`) that are replaced at call time with the corresponding tool argument value (URL-encoded). Arguments consumed as path parameters are excluded from the query string and request body. `body_mode` is `json` (default) or `multipart`. In `multipart` mode the merged tool arguments are sent as a `multipart/form-data` body: scalar fields become plain form fields and a field shaped like `{ content_type, filename, data_base64 }` is decoded from base64 and attached as a file part (the hardcoded `Content-Type: application/json` is dropped so `fetch` sets the multipart boundary itself). `response_mode` is `json` (default: the body parsed as JSON, else returned as text) or `base64`, which returns a 2xx body as `{ content_type, filename, data_base64 }` — the same file shape `multipart` accepts, so a pipeline step can relay a downloaded file. `filename` comes from `Content-Disposition` and is omitted when the target names none; a body over `TOOL_RESPONSE_MAX_BYTES` is `502 TOOL_RESPONSE_TOO_LARGE`.\n\n`auth` adds a computed request credential, for targets whose `Authorization` value cannot be expressed as a static header. Supported `auth.type` values:\n\n- `aws_sigv4` — signs the request with AWS Signature Version 4. Requires `region`, `service`, `access_key_id` and `secret_access_key`; `session_token` is optional (temporary credentials). Incompatible with `body_mode: multipart`, whose body bytes are not known at signing time.\n- `gcp_service_account` — mints a Google OAuth 2.0 access token from a signed service account assertion and sends it as a bearer token. Requires `credentials` (the service account key file JSON, as a string) and `scopes` (a non-empty array). Tokens are cached per service account and scope set until shortly before they expire.\n\nCredential fields accept `{{secret:...}}` references and should use them — a tool is readable by anyone who can `GET /tools`, and the stored reference is what is echoed back, never the resolved value.\n\nA credential slot takes a reference, never a literal: a literal `secret_access_key`, `session_token` or `credentials` under `auth`, a literal credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), or a `url` carrying a password or a literal credential-named query parameter (those names, plus `key` and `sig`/`signature`) is refused with `400 LITERAL_CREDENTIAL`, `meta.paths` naming each one. A stored literal reads back as `{\"no_echo\": true}` (a `url` holding one is masked whole), an object rather than a string so a read-edit-write round trip fails the schema check instead of writing the placeholder in as the credential. A value carrying a `{{secret:...}}` reference is the wiring, not the credential, and stays readable.\n\n`headers` values additionally accept `{{context:<key>}}` references, resolved per call from the caller's `tool_context`, so a per-user credential can be placed in the real header the target expects (`Authorization: Bearer {{context:ocaToken}}`) instead of only in an `X-Naturali-Context-<key>` header. Valid **only** inside `headers` — a context value is caller-supplied, so it may not steer the `url` — and a key missing from the `tool_context` at call time fails the tool call with `MISSING_TOOL_CONTEXT_KEY` rather than sending an empty credential. See the Tool Context reference.\n",
23061
23060
  "required": false,
23062
23061
  "type": "object",
23063
23062
  "in": "body"
@@ -23537,7 +23536,7 @@ const routes = {
23537
23536
  "update-trigger": {
23538
23537
  serviceClass: "Triggers",
23539
23538
  operationId: "updateTrigger",
23540
- description: "Updates an existing trigger's configuration. The type is immutable. Changing `target_type` or `target_id` re-checks the target-start action (`orchestrations:StartRun`, `agents:CreateAgentGeneration` or `tools:CallTool`) against the resulting target, because a firing runs with the trigger creator's authority rather than the updater's. A caller who could not start the new target is answered `403` and the trigger keeps the target it had.",
23539
+ description: "Updates an existing trigger's configuration. The type is immutable. Changing `target_type` or `target_id` re-checks that the caller may start the resulting target, because a firing runs with the trigger creator's authority rather than the updater's. A caller who could not start the new target is answered `403` and the trigger keeps the target it had.",
23541
23540
  moduleDocsUrl: "https://naturali.ai/docs/modules/triggers",
23542
23541
  httpMethod: "patch",
23543
23542
  pathParams: ["project_id", "trigger_id"],
@@ -24685,7 +24684,7 @@ const routes = {
24685
24684
  },
24686
24685
  {
24687
24686
  "name": "version_label",
24688
- "description": "Optional tag for the version this write archives, e.g. `pre-rewire`. Ignored when the write changes no definition field, since no version is archived.",
24687
+ "description": "Optional tag for the version this write creates, e.g. `rewired`. Ignored when the write changes no definition field, since no version is archived.",
24689
24688
  "required": false,
24690
24689
  "type": "string",
24691
24690
  "in": "body"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturali/cli",
3
- "version": "0.209.2",
3
+ "version": "0.209.4",
4
4
  "description": "Command-line interface for the naturali.ai API, generated from its OpenAPI specs",
5
5
  "keywords": [
6
6
  "naturali",
@@ -31,7 +31,7 @@
31
31
  "yaml": "^2.9.1"
32
32
  },
33
33
  "devDependencies": {
34
- "@naturali/sdk": "0.209.2",
34
+ "@naturali/sdk": "0.209.4",
35
35
  "@ttoss/openapi-codegen": "^0.10.0",
36
36
  "@types/node": "^26.5.1",
37
37
  "tsdown": "^0.23.0",