@soat/cli 0.33.0 → 0.34.0

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 +141 -38
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -13,7 +13,7 @@ import * as os from "node:os";
13
13
  import { createHmac, timingSafeEqual } from "node:crypto";
14
14
 
15
15
  //#region package.json
16
- var version = "0.33.0";
16
+ var version = "0.34.0";
17
17
 
18
18
  //#endregion
19
19
  //#region src/cli-wrappers/wrappers/formations.ts
@@ -299,22 +299,19 @@ var extractPositionalArgs = args => {
299
299
  /**
300
300
  * Coerce a raw flag value to the JSON type the spec declares for it.
301
301
  *
302
- * `declaredType` comes from the generated route manifest. A flag the spec
303
- * declares as `string` is passed through untouched its content is data, not
304
- * syntax, so a value that merely *looks* like JSON (a GCP service account key
305
- * file in `create-secret --value`) or like a number (an account number) must
306
- * still arrive as a string. Coercing it produced a body the server rejects,
307
- * with no way to escape it from the shell.
302
+ * A flag the spec declares as `string` is passed through untouched — its
303
+ * content is data, not syntax, so a value that merely *looks* like JSON (a GCP
304
+ * service account key in `create-secret --value`) or like a number must still
305
+ * arrive as a string. Coercing it produced a body the server rejects, with no
306
+ * way to escape it from the shell.
308
307
  *
309
- * The one value a string flag still coerces is the literal `null`: "set it to
310
- * null to clear" is the documented way to detach a nullable reference
311
- * (`--default_model_route_id null`, `--ai_provider_id null`), and the shell has
312
- * no other way to spell JSON null. The cost is that a string whose entire value
313
- * is `null` cannot be sent — a far rarer need than clearing a field.
308
+ * The one exception is the literal `null`: "set it to null to clear" is the
309
+ * documented way to detach a nullable reference and the shell has no other way
310
+ * to spell JSON null. The cost is that a string whose entire value is `null`
311
+ * cannot be sent.
314
312
  *
315
- * Every other flag keeps the permissive behavior: an undeclared type (a flag
316
- * the manifest has no entry for) is still sniffed, since that is the only
317
- * signal available.
313
+ * Every other flag keeps the permissive behavior an undeclared type is still
314
+ * sniffed, since that is the only signal available.
318
315
  */
319
316
  var parseFlagValue = (value, declaredType) => {
320
317
  if (declaredType === "string") return value.trim() === "null" ? null : value;
@@ -793,13 +790,13 @@ var routes = {
793
790
  "in": "body"
794
791
  }, {
795
792
  "name": "tool_choice",
796
- "description": "Tool choice strategy. Accepts a string (`\"auto\"`, `\"required\"`) or an object (`{ \"type\": \"tool\", \"tool_name\": \"my_tool\" }`).",
793
+ "description": "Tool choice strategy. Accepts a string (`\"auto\"`, `\"required\"`) or an object (`{ \"type\": \"tool\", \"tool_name\": \"my_tool\" }`). A forcing value (`\"required\"` or the object form) forbids a final assistant message on every step of every turn, including a resumed or continued one, so it requires a `hasToolCall` entry in `stop_conditions` — otherwise the write is refused with `FORCED_TOOL_CHOICE_CANNOT_STOP`.",
797
794
  "required": false,
798
795
  "type": "any",
799
796
  "in": "body"
800
797
  }, {
801
798
  "name": "stop_conditions",
802
- "description": "",
799
+ "description": "Conditions that end the agent's work early, on top of `max_steps`. Two scopes:\n\n`{\"type\": \"hasToolCall\", \"tool_name\": \"<resolved tool name>\"}` ends the **turn** after the step that calls the named tool. It narrows when the loop ends — it never lets it run past `max_steps`.\n\n`{\"type\": \"maxChainGenerations\", \"max_generations\": <n>}` bounds the **continuation chain** instead: once the chain has spawned that many generations, further resumptions stop with `chain_limit` rather than extending it. It never shortens a turn. The effective ceiling is the smaller of this and the deployment's `MAX_CONTINUATION_CHAIN_GENERATIONS`, so an agent can be stricter than the platform but never looser.\n\nAn unknown `type`, a `hasToolCall` without a `tool_name`, a `maxChainGenerations` whose `max_generations` is not a positive integer, or a non-object entry is rejected with 400.",
803
800
  "required": false,
804
801
  "type": "array",
805
802
  "in": "body"
@@ -863,6 +860,12 @@ var routes = {
863
860
  "required": false,
864
861
  "type": "string",
865
862
  "in": "body"
863
+ }, {
864
+ "name": "on_approval_expiry",
865
+ "description": "What happens when one of this agent's held tool calls expires un-approved. `null` (the default) and `terminate` end the chain there — the expired approval, its `approvals.expired` event and the auto-filed `approval_expired` exception are the whole record. `react` spawns a continuation that reports the staleness to the agent, for an agent that acts on it.",
866
+ "required": false,
867
+ "type": "string",
868
+ "in": "body"
866
869
  }, {
867
870
  "name": "version_label",
868
871
  "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.",
@@ -945,13 +948,13 @@ var routes = {
945
948
  "in": "body"
946
949
  }, {
947
950
  "name": "tool_choice",
948
- "description": "Tool choice strategy. Accepts a string (`\"auto\"`, `\"required\"`) or an object (`{ \"type\": \"tool\", \"tool_name\": \"my_tool\" }`).",
951
+ "description": "Tool choice strategy. Accepts a string (`\"auto\"`, `\"required\"`) or an object (`{ \"type\": \"tool\", \"tool_name\": \"my_tool\" }`). A forcing value (`\"required\"` or the object form) forbids a final assistant message on every step of every turn, including a resumed or continued one, so it requires a `hasToolCall` entry in `stop_conditions` — otherwise the write is refused with `FORCED_TOOL_CHOICE_CANNOT_STOP`.",
949
952
  "required": false,
950
953
  "type": "any",
951
954
  "in": "body"
952
955
  }, {
953
956
  "name": "stop_conditions",
954
- "description": "",
957
+ "description": "Conditions that end the agent's work early, on top of `max_steps`. Two scopes:\n\n`{\"type\": \"hasToolCall\", \"tool_name\": \"<resolved tool name>\"}` ends the **turn** after the step that calls the named tool. It narrows when the loop ends — it never lets it run past `max_steps`.\n\n`{\"type\": \"maxChainGenerations\", \"max_generations\": <n>}` bounds the **continuation chain** instead: once the chain has spawned that many generations, further resumptions stop with `chain_limit` rather than extending it. It never shortens a turn. The effective ceiling is the smaller of this and the deployment's `MAX_CONTINUATION_CHAIN_GENERATIONS`, so an agent can be stricter than the platform but never looser.\n\nAn unknown `type`, a `hasToolCall` without a `tool_name`, a `maxChainGenerations` whose `max_generations` is not a positive integer, or a non-object entry is rejected with 400.",
955
958
  "required": false,
956
959
  "type": "array",
957
960
  "in": "body"
@@ -1015,6 +1018,12 @@ var routes = {
1015
1018
  "required": false,
1016
1019
  "type": "string",
1017
1020
  "in": "body"
1021
+ }, {
1022
+ "name": "on_approval_expiry",
1023
+ "description": "What happens when one of this agent's held tool calls expires un-approved. `null` (the default) and `terminate` end the chain there — the expired approval, its `approvals.expired` event and the auto-filed `approval_expired` exception are the whole record. `react` spawns a continuation that reports the staleness to the agent, for an agent that acts on it.",
1024
+ "required": false,
1025
+ "type": "string",
1026
+ "in": "body"
1018
1027
  }, {
1019
1028
  "name": "version_label",
1020
1029
  "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.",
@@ -1081,13 +1090,13 @@ var routes = {
1081
1090
  "in": "body"
1082
1091
  }, {
1083
1092
  "name": "tool_choice",
1084
- "description": "Tool choice strategy. Accepts a string (`\"auto\"`, `\"required\"`) or an object (`{ \"type\": \"tool\", \"tool_name\": \"my_tool\" }`).",
1093
+ "description": "Tool choice strategy. Accepts a string (`\"auto\"`, `\"required\"`) or an object (`{ \"type\": \"tool\", \"tool_name\": \"my_tool\" }`). A forcing value (`\"required\"` or the object form) forbids a final assistant message on every step of every turn, including a resumed or continued one, so it requires a `hasToolCall` entry in `stop_conditions` — otherwise the write is refused with `FORCED_TOOL_CHOICE_CANNOT_STOP`.",
1085
1094
  "required": false,
1086
1095
  "type": "any",
1087
1096
  "in": "body"
1088
1097
  }, {
1089
1098
  "name": "stop_conditions",
1090
- "description": "",
1099
+ "description": "Conditions that end the agent's work early, on top of `max_steps`. Two scopes:\n\n`{\"type\": \"hasToolCall\", \"tool_name\": \"<resolved tool name>\"}` ends the **turn** after the step that calls the named tool. It narrows when the loop ends — it never lets it run past `max_steps`.\n\n`{\"type\": \"maxChainGenerations\", \"max_generations\": <n>}` bounds the **continuation chain** instead: once the chain has spawned that many generations, further resumptions stop with `chain_limit` rather than extending it. It never shortens a turn. The effective ceiling is the smaller of this and the deployment's `MAX_CONTINUATION_CHAIN_GENERATIONS`, so an agent can be stricter than the platform but never looser.\n\nAn unknown `type`, a `hasToolCall` without a `tool_name`, a `maxChainGenerations` whose `max_generations` is not a positive integer, or a non-object entry is rejected with 400.",
1091
1100
  "required": false,
1092
1101
  "type": "array",
1093
1102
  "in": "body"
@@ -1151,6 +1160,12 @@ var routes = {
1151
1160
  "required": false,
1152
1161
  "type": "string",
1153
1162
  "in": "body"
1163
+ }, {
1164
+ "name": "on_approval_expiry",
1165
+ "description": "What happens when one of this agent's held tool calls expires un-approved. `null` (the default) and `terminate` end the chain there — the expired approval, its `approvals.expired` event and the auto-filed `approval_expired` exception are the whole record. `react` spawns a continuation that reports the staleness to the agent, for an agent that acts on it.",
1166
+ "required": false,
1167
+ "type": "string",
1168
+ "in": "body"
1154
1169
  }, {
1155
1170
  "name": "version_label",
1156
1171
  "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.",
@@ -1973,7 +1988,7 @@ var routes = {
1973
1988
  "in": "query"
1974
1989
  }, {
1975
1990
  "name": "resource_srn",
1976
- "description": "SRN prefix match, e.g. `srn:{project}:secret:`. Entries written before the `soat:` → `srn:` rename keep their original SRN (the log is append-only), so an `srn:` prefix also matches the equivalent `soat:` one and history stays reachable.",
1991
+ "description": "SRN prefix match, e.g. `srn:{project}:secret:`. The log is append-only, so a stored SRN is never rewritten; the filter matches it as stored.",
1977
1992
  "required": false,
1978
1993
  "type": "string",
1979
1994
  "in": "query"
@@ -2037,7 +2052,7 @@ var routes = {
2037
2052
  "in": "query"
2038
2053
  }, {
2039
2054
  "name": "resource_srn",
2040
- "description": "SRN prefix match, e.g. `srn:{project}:secret:`. Entries written before the `soat:` → `srn:` rename keep their original SRN (the log is append-only), so an `srn:` prefix also matches the equivalent `soat:` one and history stays reachable.",
2055
+ "description": "SRN prefix match, e.g. `srn:{project}:secret:`. The log is append-only, so a stored SRN is never rewritten; the filter matches it as stored.",
2041
2056
  "required": false,
2042
2057
  "type": "string",
2043
2058
  "in": "query"
@@ -2071,6 +2086,62 @@ var routes = {
2071
2086
  "in": "path"
2072
2087
  }]
2073
2088
  },
2089
+ "list-chains": {
2090
+ serviceClass: "Chains",
2091
+ operationId: "listChains",
2092
+ description: "Returns the continuation chains in a project, newest first. Filter by `status` to find the chains that may still be spending (`active`) or the ones a budget stopped (`budget_exhausted`).",
2093
+ moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/chains",
2094
+ httpMethod: "get",
2095
+ pathParams: [],
2096
+ queryParams: ["project_id", "status", "agent_id", "limit", "offset"],
2097
+ flags: [{
2098
+ "name": "project_id",
2099
+ "description": "Project ID (required if not using project key auth)",
2100
+ "required": false,
2101
+ "type": "string",
2102
+ "in": "query"
2103
+ }, {
2104
+ "name": "status",
2105
+ "description": "Filter by chain status",
2106
+ "required": false,
2107
+ "type": "string",
2108
+ "in": "query"
2109
+ }, {
2110
+ "name": "agent_id",
2111
+ "description": "Filter by the agent whose continuation opened the chain",
2112
+ "required": false,
2113
+ "type": "string",
2114
+ "in": "query"
2115
+ }, {
2116
+ "name": "limit",
2117
+ "description": "Maximum number of results to return",
2118
+ "required": false,
2119
+ "type": "integer",
2120
+ "in": "query"
2121
+ }, {
2122
+ "name": "offset",
2123
+ "description": "Number of results to skip",
2124
+ "required": false,
2125
+ "type": "integer",
2126
+ "in": "query"
2127
+ }]
2128
+ },
2129
+ "get-chain": {
2130
+ serviceClass: "Chains",
2131
+ operationId: "getChain",
2132
+ description: "Returns a single continuation chain. To read the generations in it, list generations filtered by `chain_id`.",
2133
+ moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/chains",
2134
+ httpMethod: "get",
2135
+ pathParams: ["chain_id"],
2136
+ queryParams: [],
2137
+ flags: [{
2138
+ "name": "chain_id",
2139
+ "description": "Continuation chain ID",
2140
+ "required": true,
2141
+ "type": "string",
2142
+ "in": "path"
2143
+ }]
2144
+ },
2074
2145
  "list-chats": {
2075
2146
  serviceClass: "Chats",
2076
2147
  operationId: "listChats",
@@ -3427,6 +3498,12 @@ var routes = {
3427
3498
  "required": false,
3428
3499
  "type": "object",
3429
3500
  "in": "body"
3501
+ }, {
3502
+ "name": "tool_context",
3503
+ "description": "Key/value context forwarded to every item's generation, so an agent whose tools authorize through `tool_context` is scored against the configuration it runs in production rather than with an empty bag. Each key is forwarded as one `X-Soat-Context-<key>` header and resolves any `{{context:<key>}}` token in a bound tool's headers or `preset_parameters`.\n\nStored on the run and re-read per item, since a queued run (the default) is driven by a worker with no request behind it. **Write-only**: no read of the run returns it, unlike `metadata` — a run is a report other people read, and a credential in it is not theirs to see. Cleared once the run reaches a terminal state.\n\nAn eval generation has no session, so the reserved keys `sessionId`, `actorId` and `actorExternalId` are dropped (in any casing) rather than forwarded. Every other key becomes an HTTP header name and must match that grammar, or the request is rejected with `400 INVALID_TOOL_CONTEXT_KEY` and no run is created.",
3504
+ "required": false,
3505
+ "type": "object",
3506
+ "in": "body"
3430
3507
  }]
3431
3508
  },
3432
3509
  "get-eval-run": {
@@ -4182,7 +4259,7 @@ var routes = {
4182
4259
  moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/generations",
4183
4260
  httpMethod: "get",
4184
4261
  pathParams: [],
4185
- queryParams: ["agent_id", "trace_id", "initiator_generation_id", "orchestration_run_id", "node_id", "status", "limit", "offset"],
4262
+ queryParams: ["agent_id", "trace_id", "initiator_generation_id", "chain_id", "orchestration_run_id", "node_id", "status", "limit", "offset"],
4186
4263
  flags: [{
4187
4264
  "name": "agent_id",
4188
4265
  "description": "Filter by agent public ID",
@@ -4201,6 +4278,12 @@ var routes = {
4201
4278
  "required": false,
4202
4279
  "type": "string",
4203
4280
  "in": "query"
4281
+ }, {
4282
+ "name": "chain_id",
4283
+ "description": "Filter by the continuation chain the generation belongs to. This is how a chain is expanded into its members — the chain record carries only their count.\n",
4284
+ "required": false,
4285
+ "type": "string",
4286
+ "in": "query"
4204
4287
  }, {
4205
4288
  "name": "orchestration_run_id",
4206
4289
  "description": "Filter by the orchestration run that dispatched the generation. This is how a run is traced back to what its agent nodes did — a node execution record stores no generation id.\n",
@@ -5920,7 +6003,7 @@ var routes = {
5920
6003
  "update-project": {
5921
6004
  serviceClass: "Projects",
5922
6005
  operationId: "updateProject",
5923
- description: "Updates a project's name, its attached guardrails (`guardrail_ids` — the project-scope baseline governing every tool call by every agent in the project), its orchestration concurrency limit (`max_concurrent_runs`), its inherited model route (`default_model_route_id`), its read-auditing opt-in (`audit_reads_enabled`), its trace-content retention window (`trace_content_retention_days`), and/or its zero-retention setting (`trace_content_mode`). At least one field is required. Requires admin role. Detaching a guardrail (removing an id) additionally requires guardrails:DetachGuardrail.",
6006
+ description: "Updates a project's name, its attached guardrails (`guardrail_ids` — the project-scope baseline governing every tool call by every agent in the project), its orchestration concurrency limit (`max_concurrent_runs`), its continuation-chain ceiling (`max_chain_generations`), its inherited model route (`default_model_route_id`), its read-auditing opt-in (`audit_reads_enabled`), its trace-content retention window (`trace_content_retention_days`), and/or its zero-retention setting (`trace_content_mode`). At least one field is required. Requires admin role. Detaching a guardrail (removing an id) additionally requires guardrails:DetachGuardrail.",
5924
6007
  moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/projects",
5925
6008
  httpMethod: "patch",
5926
6009
  pathParams: ["project_id"],
@@ -5949,6 +6032,12 @@ var routes = {
5949
6032
  "required": false,
5950
6033
  "type": "integer",
5951
6034
  "in": "body"
6035
+ }, {
6036
+ "name": "max_chain_generations",
6037
+ "description": "Generations one continuation chain in this project may hold before the platform stops resuming it. `null` clears the project's ceiling, leaving the deployment-wide `MAX_CONTINUATION_CHAIN_GENERATIONS`; otherwise an integer >= 1. The effective budget is the smallest of the deployment's ceiling, this one, and the agent's own `maxChainGenerations` stop condition, so an agent author can be stricter than this number but never exceed it.",
6038
+ "required": false,
6039
+ "type": "integer",
6040
+ "in": "body"
5952
6041
  }, {
5953
6042
  "name": "default_model_route_id",
5954
6043
  "description": "Model route inherited by consumers in this project that bind neither `model_route_id` nor `ai_provider_id`. The route must belong to this project (`400` otherwise). `null` clears the default, which is refused with `409` while any consumer inherits it — repointing it to another route is always allowed and immediately changes which targets those consumers use.",
@@ -6113,6 +6202,12 @@ var routes = {
6113
6202
  "required": false,
6114
6203
  "type": "string",
6115
6204
  "in": "body"
6205
+ }, {
6206
+ "name": "on_unpriced",
6207
+ "description": "Only for metric cost_usd (400 on any other metric). What an enforce quota does when the current window is a pricing blackout — several metered events, none of them priced, so the aggregate is 0 however much was actually spent. block (the default) refuses new generations with 409 QUOTA_UNENFORCEABLE until pricing is configured; allow accepts the unmeasurable spend explicitly. Either way a quota_unpriced exception is filed. monitor-mode quotas never block regardless.",
6208
+ "required": false,
6209
+ "type": "string",
6210
+ "in": "body"
6116
6211
  }]
6117
6212
  },
6118
6213
  "get-quota": {
@@ -6157,6 +6252,12 @@ var routes = {
6157
6252
  "required": false,
6158
6253
  "type": "string",
6159
6254
  "in": "body"
6255
+ }, {
6256
+ "name": "on_unpriced",
6257
+ "description": "New pricing posture. Only for metric cost_usd (400 on any other metric); see the create operation for what block and allow mean.",
6258
+ "required": false,
6259
+ "type": "string",
6260
+ "in": "body"
6160
6261
  }]
6161
6262
  },
6162
6263
  "delete-quota": {
@@ -7191,6 +7292,12 @@ var routes = {
7191
7292
  "required": false,
7192
7293
  "type": "object",
7193
7294
  "in": "body"
7295
+ }, {
7296
+ "name": "tool_context",
7297
+ "description": "Key/value context for this call, forwarded to the tool as `X-Soat-Context-<key>` request headers and resolving any `{{context:<key>}}` token in the tool's `execute.headers`, `mcp.headers` or `preset_parameters`. Narrowed by the tool's `context_keys` allowlist when it sets one.\nThis route has no session, so it stamps no server-derived identity: the reserved keys `sessionId`, `actorId` and `actorExternalId` are dropped from this bag (in any casing) rather than forwarded, so a downstream tool can still trust that a context header naming one is server-derived. Every other key becomes an HTTP header name and must match that grammar, or the call fails with `INVALID_TOOL_CONTEXT_KEY`.\n",
7298
+ "required": false,
7299
+ "type": "object",
7300
+ "in": "body"
7194
7301
  }]
7195
7302
  },
7196
7303
  "list-traces": {
@@ -8556,23 +8663,19 @@ var suggestionFor = args => {
8556
8663
  return near ? ` Did you mean --${toKebab(near)}?` : "";
8557
8664
  };
8558
8665
  /**
8559
- * Reject an unrecognized flag **only where the server cannot catch it** — a flag
8560
- * the CLI would otherwise append to the query string.
8666
+ * Reject an unrecognized flag **only where the server cannot catch it** — a
8667
+ * flag the CLI would otherwise append to the query string.
8561
8668
  *
8562
8669
  * An undeclared query param never reaches a check: the server ignores what it
8563
- * does not know, so `list-agents --limitt 1` returned every row instead of one.
8564
- * The filter failed **open**, with exit 0 and no warning, and the caller acted on
8565
- * a superset it never asked for. The name does not survive the request, so only
8670
+ * does not know, so `list-agents --limitt 1` returned every row instead of one,
8671
+ * with exit 0 and no warning. The name does not survive the request, so only
8566
8672
  * the client can catch it.
8567
8673
  *
8568
- * An unrecognized flag on a **write** is deliberately still forwarded. The server
8569
- * already answers `400 VALIDATION_FAILED` naming the field (`strictFields`), and
8570
- * that check is the authority on what a body may contain — rejecting locally
8571
- * would front-run it, hide the real error, and make an older CLI refuse a field a
8572
- * newer server accepts. It would also make the behavior untestable through the
8573
- * CLI: `tests/smoke-tests.sh` asserts precisely that the server rejects
8574
- * `update-agent --reasoning` with a 400, which a client-side refusal turns into a
8575
- * usage error the assertion cannot read.
8674
+ * An unrecognized flag on a **write** is deliberately still forwarded. The
8675
+ * server already answers `400 VALIDATION_FAILED` naming the field, and that
8676
+ * check is the authority on what a body may contain — rejecting locally would
8677
+ * hide the real error and make an older CLI refuse a field a newer server
8678
+ * accepts. `tests/smoke-tests.sh` asserts precisely that server-side 400.
8576
8679
  *
8577
8680
  * Returns the error lines to print; empty when every flag is recognized.
8578
8681
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soat/cli",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
4
4
  "description": "CLI for SOAT — open-source infrastructure for production-ready AI agents.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -22,7 +22,7 @@
22
22
  "dependencies": {
23
23
  "@inquirer/input": "^5.1.2",
24
24
  "@inquirer/password": "^5.1.1",
25
- "@soat/sdk": "0.33.0",
25
+ "@soat/sdk": "0.34.0",
26
26
  "@ttoss/logger": "^0.8.19",
27
27
  "commander": "^15.0.0",
28
28
  "js-yaml": "^5.2.1"