@naturali/cli 0.209.3 → 0.209.5

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 +49 -47
  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.3";
20
+ var version = "0.209.5";
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) {
@@ -4300,8 +4302,8 @@ var Orchestrations = class {
4300
4302
  /**
4301
4303
  * Get orchestration queue stats
4302
4304
  *
4303
- * 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`.
4304
- * 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.
4305
4307
  *
4306
4308
  */
4307
4309
  static getQueueStats(options) {
@@ -4322,7 +4324,7 @@ var Orchestrations = class {
4322
4324
  /**
4323
4325
  * List the projects with queued orchestration work
4324
4326
  *
4325
- * 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.
4326
4328
  *
4327
4329
  */
4328
4330
  static listQueueStatsProjects(options) {
@@ -5891,7 +5893,7 @@ var Triggers = class {
5891
5893
  /**
5892
5894
  * Update a trigger
5893
5895
  *
5894
- * 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.
5895
5897
  *
5896
5898
  */
5897
5899
  static updateTrigger(options) {
@@ -7883,7 +7885,7 @@ const routes = {
7883
7885
  "set-address": {
7884
7886
  serviceClass: "Channels",
7885
7887
  operationId: "setAddress",
7886
- 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`.",
7887
7889
  moduleDocsUrl: "https://naturali.ai/docs/modules/addresses",
7888
7890
  httpMethod: "put",
7889
7891
  pathParams: ["project_id", "identifier"],
@@ -8032,7 +8034,7 @@ const routes = {
8032
8034
  serviceClass: "Admin",
8033
8035
  operationId: "listUsers",
8034
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.",
8035
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8037
+ moduleDocsUrl: "https://naturali.ai/docs",
8036
8038
  httpMethod: "get",
8037
8039
  pathParams: [],
8038
8040
  queryParams: [
@@ -8070,7 +8072,7 @@ const routes = {
8070
8072
  serviceClass: "Admin",
8071
8073
  operationId: "setUserRoles",
8072
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.",
8073
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8075
+ moduleDocsUrl: "https://naturali.ai/docs",
8074
8076
  httpMethod: "put",
8075
8077
  pathParams: ["user_id"],
8076
8078
  queryParams: [],
@@ -8094,7 +8096,7 @@ const routes = {
8094
8096
  serviceClass: "Admin",
8095
8097
  operationId: "listUserPlanHistory",
8096
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?\".",
8097
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8099
+ moduleDocsUrl: "https://naturali.ai/docs",
8098
8100
  httpMethod: "get",
8099
8101
  pathParams: ["user_id"],
8100
8102
  queryParams: ["limit", "cursor"],
@@ -8128,7 +8130,7 @@ const routes = {
8128
8130
  serviceClass: "Admin",
8129
8131
  operationId: "grantUserPlan",
8130
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.",
8131
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8133
+ moduleDocsUrl: "https://naturali.ai/docs",
8132
8134
  httpMethod: "put",
8133
8135
  pathParams: ["user_id"],
8134
8136
  queryParams: [],
@@ -8169,7 +8171,7 @@ const routes = {
8169
8171
  serviceClass: "Admin",
8170
8172
  operationId: "listUserCredits",
8171
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.",
8172
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8174
+ moduleDocsUrl: "https://naturali.ai/docs",
8173
8175
  httpMethod: "get",
8174
8176
  pathParams: ["user_id"],
8175
8177
  queryParams: [
@@ -8214,7 +8216,7 @@ const routes = {
8214
8216
  serviceClass: "Admin",
8215
8217
  operationId: "grantUserCredit",
8216
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.",
8217
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8219
+ moduleDocsUrl: "https://naturali.ai/docs",
8218
8220
  httpMethod: "post",
8219
8221
  pathParams: ["user_id"],
8220
8222
  queryParams: [],
@@ -8255,7 +8257,7 @@ const routes = {
8255
8257
  serviceClass: "Admin",
8256
8258
  operationId: "getUserUsage",
8257
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.",
8258
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8260
+ moduleDocsUrl: "https://naturali.ai/docs",
8259
8261
  httpMethod: "get",
8260
8262
  pathParams: ["user_id"],
8261
8263
  queryParams: [],
@@ -8273,7 +8275,7 @@ const routes = {
8273
8275
  serviceClass: "Admin",
8274
8276
  operationId: "getAdminPriceBook",
8275
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.",
8276
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8278
+ moduleDocsUrl: "https://naturali.ai/docs",
8277
8279
  httpMethod: "get",
8278
8280
  pathParams: [],
8279
8281
  queryParams: [],
@@ -8285,7 +8287,7 @@ const routes = {
8285
8287
  serviceClass: "Admin",
8286
8288
  operationId: "listUserStatements",
8287
8289
  description: "The same statements the account reads at `GET /v1/users/me/statements`, for an operator to bill from. Needs the `admin` role.",
8288
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8290
+ moduleDocsUrl: "https://naturali.ai/docs",
8289
8291
  httpMethod: "get",
8290
8292
  pathParams: ["user_id"],
8291
8293
  queryParams: ["limit", "cursor"],
@@ -8319,7 +8321,7 @@ const routes = {
8319
8321
  serviceClass: "Admin",
8320
8322
  operationId: "listAdminListings",
8321
8323
  description: "Every listing in one state, newest first — `in_review` by default, the queue an operator works through.",
8322
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8324
+ moduleDocsUrl: "https://naturali.ai/docs",
8323
8325
  httpMethod: "get",
8324
8326
  pathParams: [],
8325
8327
  queryParams: [
@@ -8357,7 +8359,7 @@ const routes = {
8357
8359
  serviceClass: "Admin",
8358
8360
  operationId: "setAdminListingState",
8359
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`.",
8360
- moduleDocsUrl: "https://naturali.ai/docs/modules/admin",
8362
+ moduleDocsUrl: "https://naturali.ai/docs",
8361
8363
  httpMethod: "put",
8362
8364
  pathParams: ["listing_id"],
8363
8365
  queryParams: [],
@@ -9664,7 +9666,7 @@ const routes = {
9664
9666
  "delete-ai-provider": {
9665
9667
  serviceClass: "AIProviders",
9666
9668
  operationId: "deleteAiProvider",
9667
- 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.",
9668
9670
  moduleDocsUrl: "https://naturali.ai/docs/modules/ai-providers",
9669
9671
  httpMethod: "delete",
9670
9672
  pathParams: ["project_id", "ai_provider_id"],
@@ -9688,7 +9690,7 @@ const routes = {
9688
9690
  },
9689
9691
  {
9690
9692
  "name": "force",
9691
- "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",
9692
9694
  "required": false,
9693
9695
  "type": "boolean",
9694
9696
  "in": "query"
@@ -10124,7 +10126,7 @@ const routes = {
10124
10126
  },
10125
10127
  {
10126
10128
  "name": "arguments",
10127
- "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. Refused on an item with no `proposed_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`.",
10128
10130
  "required": false,
10129
10131
  "type": "object",
10130
10132
  "in": "body"
@@ -10638,7 +10640,7 @@ const routes = {
10638
10640
  "refresh-session": {
10639
10641
  serviceClass: "Auth",
10640
10642
  operationId: "refreshSession",
10641
- 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.",
10642
10644
  moduleDocsUrl: "https://naturali.ai/docs/modules/auth",
10643
10645
  httpMethod: "post",
10644
10646
  pathParams: [],
@@ -11091,7 +11093,7 @@ const routes = {
11091
11093
  "list-project-channel-routes": {
11092
11094
  serviceClass: "Channels",
11093
11095
  operationId: "listProjectChannelRoutes",
11094
- 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.",
11095
11097
  moduleDocsUrl: "https://naturali.ai/docs/modules/channel-routes",
11096
11098
  httpMethod: "get",
11097
11099
  pathParams: ["project_id"],
@@ -11143,7 +11145,7 @@ const routes = {
11143
11145
  "create-channel": {
11144
11146
  serviceClass: "Channels",
11145
11147
  operationId: "createChannel",
11146
- 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.",
11147
11149
  moduleDocsUrl: "https://naturali.ai/docs/modules/channels",
11148
11150
  httpMethod: "post",
11149
11151
  pathParams: ["project_id"],
@@ -11209,7 +11211,7 @@ const routes = {
11209
11211
  },
11210
11212
  {
11211
11213
  "name": "code",
11212
- "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",
11213
11215
  "required": false,
11214
11216
  "type": "string",
11215
11217
  "in": "body"
@@ -16232,7 +16234,7 @@ const routes = {
16232
16234
  serviceClass: "Installs",
16233
16235
  operationId: "listInstalls",
16234
16236
  description: "The listings the project installed, newest first.",
16235
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16237
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16236
16238
  httpMethod: "get",
16237
16239
  pathParams: ["project_id"],
16238
16240
  queryParams: ["limit", "cursor"],
@@ -16266,7 +16268,7 @@ const routes = {
16266
16268
  serviceClass: "Installs",
16267
16269
  operationId: "createInstall",
16268
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`.",
16269
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16271
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16270
16272
  httpMethod: "post",
16271
16273
  pathParams: ["project_id"],
16272
16274
  queryParams: [],
@@ -16290,7 +16292,7 @@ const routes = {
16290
16292
  serviceClass: "Installs",
16291
16293
  operationId: "getInstall",
16292
16294
  description: "One of the project's installs.",
16293
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16295
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16294
16296
  httpMethod: "get",
16295
16297
  pathParams: ["project_id", "install_id"],
16296
16298
  queryParams: [],
@@ -16314,7 +16316,7 @@ const routes = {
16314
16316
  serviceClass: "Installs",
16315
16317
  operationId: "deleteInstall",
16316
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`.",
16317
- moduleDocsUrl: "https://naturali.ai/docs/modules/installs",
16319
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16318
16320
  httpMethod: "delete",
16319
16321
  pathParams: ["project_id", "install_id"],
16320
16322
  queryParams: ["force"],
@@ -16378,14 +16380,14 @@ const routes = {
16378
16380
  },
16379
16381
  {
16380
16382
  "name": "rrf_k",
16381
- "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.",
16382
16384
  "required": false,
16383
16385
  "type": "integer",
16384
16386
  "in": "body"
16385
16387
  },
16386
16388
  {
16387
16389
  "name": "recency_half_life_days",
16388
- "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.",
16389
16391
  "required": false,
16390
16392
  "type": "number",
16391
16393
  "in": "body"
@@ -16452,7 +16454,7 @@ const routes = {
16452
16454
  serviceClass: "Listings",
16453
16455
  operationId: "listPublicListings",
16454
16456
  description: "Every listed entry, newest first. `interface` is what an installing project sees of the resource, read live from the publisher.",
16455
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16457
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16456
16458
  httpMethod: "get",
16457
16459
  pathParams: [],
16458
16460
  queryParams: ["limit", "cursor"],
@@ -16476,7 +16478,7 @@ const routes = {
16476
16478
  serviceClass: "Listings",
16477
16479
  operationId: "getPublicListing",
16478
16480
  description: "One listed entry. A listing that is not listed answers `404`.",
16479
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16481
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16480
16482
  httpMethod: "get",
16481
16483
  pathParams: ["listing_id"],
16482
16484
  queryParams: [],
@@ -16494,7 +16496,7 @@ const routes = {
16494
16496
  serviceClass: "Listings",
16495
16497
  operationId: "listListings",
16496
16498
  description: "The listings the project publishes, newest first.",
16497
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16499
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16498
16500
  httpMethod: "get",
16499
16501
  pathParams: ["project_id"],
16500
16502
  queryParams: ["limit", "cursor"],
@@ -16528,7 +16530,7 @@ const routes = {
16528
16530
  serviceClass: "Listings",
16529
16531
  operationId: "createListing",
16530
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`.",
16531
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16533
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16532
16534
  httpMethod: "post",
16533
16535
  pathParams: ["project_id"],
16534
16536
  queryParams: [],
@@ -16583,7 +16585,7 @@ const routes = {
16583
16585
  serviceClass: "Listings",
16584
16586
  operationId: "getListing",
16585
16587
  description: "One of the project's listings.",
16586
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16588
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16587
16589
  httpMethod: "get",
16588
16590
  pathParams: ["project_id", "listing_id"],
16589
16591
  queryParams: [],
@@ -16607,7 +16609,7 @@ const routes = {
16607
16609
  serviceClass: "Listings",
16608
16610
  operationId: "updateListing",
16609
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`.",
16610
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16612
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16611
16613
  httpMethod: "patch",
16612
16614
  pathParams: ["project_id", "listing_id"],
16613
16615
  queryParams: [],
@@ -16662,7 +16664,7 @@ const routes = {
16662
16664
  serviceClass: "Listings",
16663
16665
  operationId: "deleteListing",
16664
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.",
16665
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16667
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16666
16668
  httpMethod: "delete",
16667
16669
  pathParams: ["project_id", "listing_id"],
16668
16670
  queryParams: [],
@@ -16686,7 +16688,7 @@ const routes = {
16686
16688
  serviceClass: "Listings",
16687
16689
  operationId: "submitListing",
16688
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`.",
16689
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16691
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16690
16692
  httpMethod: "post",
16691
16693
  pathParams: ["project_id", "listing_id"],
16692
16694
  queryParams: [],
@@ -16710,7 +16712,7 @@ const routes = {
16710
16712
  serviceClass: "Listings",
16711
16713
  operationId: "listListingInstalls",
16712
16714
  description: "Each project that installed the listing, with its usage this billing cycle as last sampled. Never the content of a call.",
16713
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16715
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16714
16716
  httpMethod: "get",
16715
16717
  pathParams: ["project_id", "listing_id"],
16716
16718
  queryParams: ["limit", "cursor"],
@@ -16751,7 +16753,7 @@ const routes = {
16751
16753
  serviceClass: "Listings",
16752
16754
  operationId: "deleteListingInstall",
16753
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.",
16754
- moduleDocsUrl: "https://naturali.ai/docs/modules/listings",
16756
+ moduleDocsUrl: "https://naturali.ai/docs/modules/marketplace",
16755
16757
  httpMethod: "delete",
16756
16758
  pathParams: [
16757
16759
  "project_id",
@@ -18561,7 +18563,7 @@ const routes = {
18561
18563
  "get-queue-stats": {
18562
18564
  serviceClass: "Orchestrations",
18563
18565
  operationId: "getQueueStats",
18564
- 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.",
18565
18567
  moduleDocsUrl: "https://naturali.ai/docs/modules/orchestrations",
18566
18568
  httpMethod: "get",
18567
18569
  pathParams: ["project_id"],
@@ -18579,7 +18581,7 @@ const routes = {
18579
18581
  "list-queue-stats-projects": {
18580
18582
  serviceClass: "Orchestrations",
18581
18583
  operationId: "listQueueStatsProjects",
18582
- 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.",
18583
18585
  moduleDocsUrl: "https://naturali.ai/docs/modules/orchestrations",
18584
18586
  httpMethod: "get",
18585
18587
  pathParams: ["project_id"],
@@ -23534,7 +23536,7 @@ const routes = {
23534
23536
  "update-trigger": {
23535
23537
  serviceClass: "Triggers",
23536
23538
  operationId: "updateTrigger",
23537
- 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.",
23538
23540
  moduleDocsUrl: "https://naturali.ai/docs/modules/triggers",
23539
23541
  httpMethod: "patch",
23540
23542
  pathParams: ["project_id", "trigger_id"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturali/cli",
3
- "version": "0.209.3",
3
+ "version": "0.209.5",
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.3",
34
+ "@naturali/sdk": "0.209.5",
35
35
  "@ttoss/openapi-codegen": "^0.10.0",
36
36
  "@types/node": "^26.5.1",
37
37
  "tsdown": "^0.23.0",