@soat/sdk 0.43.0 → 0.45.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.
package/dist/index.cjs CHANGED
@@ -960,7 +960,14 @@ var AiProviders = class {
960
960
  /**
961
961
  * Create an AI provider
962
962
  *
963
- * Creates a new LLM provider configuration
963
+ * Creates a new LLM provider configuration.
964
+ *
965
+ * A `bedrock` or `vertex` record must carry a credential of its own — a
966
+ * linked `secret_id`, or an `apiKey` in `config`. Without one the provider
967
+ * SDK signs with the server's own credentials (the AWS default credential
968
+ * chain, Google Application Default Credentials), which is refused with
969
+ * `400 VALIDATION_FAILED` unless the deployment allows it.
970
+ *
964
971
  */
965
972
  static createAiProvider(options) {
966
973
  return (options.client ?? client).post({
@@ -1018,7 +1025,7 @@ var AiProviders = class {
1018
1025
  * Asks the provider which models it can run, using this provider record's own credentials and configuration, and returns provider-native model ids — the same strings `default_model` and an agent's `model` carry.
1019
1026
  * Which models are reachable is a property of the credential, not of the provider type: a Vertex provider sees only the publisher models its Google Cloud project and location serve, and a Bedrock provider only the foundation models enabled in its region. Reading the list is how a caller avoids pinning a model that fails at generation time.
1020
1027
  * Not every provider type can answer. `azure` lists deployments an operator named rather than models, and `ollama` lists whatever was pulled onto that host, so both return `400 MODEL_LISTING_UNSUPPORTED`.
1021
- * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret when there is one — IAM keys or a Bedrock API key, a Google service-account key — and otherwise fall back to the server environment (the AWS default credential chain, Google Application Default Credentials), so a record with no `secret_id` can still list.
1028
+ * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret — IAM keys or a Bedrock API key, a Google service-account key. A record with no `secret_id` would fall back to the server's own credentials (the AWS default credential chain, Google Application Default Credentials); it can list only on a deployment that allows a record to use them, and returns `400 AI_PROVIDER_MISCONFIGURED` otherwise.
1022
1029
  * A Vertex record needs no `config.project` when its secret is a service-account key, since the key file names its own project. A Vertex record in express mode (API key) cannot list at all: the publisher-model listing rejects API keys and needs a credential that asserts a principal, so it returns `400 MODEL_LISTING_UNSUPPORTED`.
1023
1030
  * The Vertex answer is the publisher catalogue the record's `config.location` region serves. The project behind the credential is billed and quota'd for the call but does not filter the result, so a listed model may still be unavailable to that project at generation time.
1024
1031
  *
@@ -1062,7 +1069,11 @@ var ApiKeys = class {
1062
1069
  /**
1063
1070
  * List API keys
1064
1071
  *
1065
- * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns only API keys scoped to that project.
1072
+ * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns the caller's own
1073
+ * keys scoped to that project, or every key scoped to it when the credential
1074
+ * holds `api-keys:ListApiKeys` on the project. Confinement to a project is not
1075
+ * authority over it, and a key's metadata names its owner, prefix and attached
1076
+ * policies.
1066
1077
  *
1067
1078
  */
1068
1079
  static listApiKeys(options) {
@@ -2874,7 +2885,8 @@ var Orchestrations = class {
2874
2885
  /**
2875
2886
  * Get orchestration queue stats
2876
2887
  *
2877
- * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`. A project-scoped caller sees only their own projects under `per_project`.
2888
+ * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`.
2889
+ * Every figure is scoped to what the caller may see. A project-scoped caller gets `per_project` for their own projects only, `queue_depth` and `claimed_tasks` summed over those same 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.
2878
2890
  *
2879
2891
  */
2880
2892
  static getQueueStats(options) {
@@ -3244,7 +3256,9 @@ var Quotas = class {
3244
3256
  /**
3245
3257
  * Create a quota
3246
3258
  *
3247
- * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
3259
+ * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`; `storage_bytes` is valid for `scope: project` only. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
3260
+ *
3261
+ * `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory-entry create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.
3248
3262
  */
3249
3263
  static createQuota(options) {
3250
3264
  return (options.client ?? client).post({
@@ -3738,6 +3752,7 @@ var Tools = class {
3738
3752
  * Directly invokes a tool and returns its output. Supported for `http`, `builtin`, `mcp`, and `pipeline` tools. `client` tools cannot be invoked server-side and will return 422. A `pipeline` tool runs its declared steps in order and returns the mapped `output` (or the last step's output); `action` is ignored and `input` is the pipeline input.
3739
3753
  * For `builtin` and `mcp` tools the `action` field is required and identifies which action (SOAT) or tool name (MCP) to invoke. For `http` tools `action` is ignored. When a `builtin` or `mcp` tool declares an `actions` allowlist, an action outside it is rejected with `400 VALIDATION_FAILED` ("not available on this tool") before any outbound request is made.
3740
3754
  * `preset_parameters` stored on the tool are pinned over the caller-supplied `input` before execution: a key the tool presets keeps its preset value even when `input` sets it. Keys the presets do not name are taken from `input` as sent.
3755
+ * Guardrails attached to the tool or to its project adjudicate the call before dispatch, composing project + tool scope. A call this route cannot await a decision on — class C (human sign-off), class D, or a class-B tripwire — is refused with `422 TOOL_DISPATCH_FAILED`, whose `meta` carries the `tool_id` and the `outcome`. A `pipeline` tool is adjudicated before its first step runs, and every step is adjudicated as the call of that tool it is.
3741
3756
  *
3742
3757
  */
3743
3758
  static callTool(options) {
@@ -3855,7 +3870,8 @@ var Triggers = class {
3855
3870
  /**
3856
3871
  * Update a trigger
3857
3872
  *
3858
- * Updates an existing trigger's configuration. The type is immutable.
3873
+ * 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.
3874
+ *
3859
3875
  */
3860
3876
  static updateTrigger(options) {
3861
3877
  return (options.client ?? client).patch({
package/dist/index.d.cts CHANGED
@@ -340,7 +340,7 @@ type ActivityEntry = {
340
340
  /**
341
341
  * How the entry was produced
342
342
  */
343
- kind?: 'action_executed' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
343
+ kind?: 'action_executed' | 'approval_created' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
344
344
  severity?: 'info' | 'warning' | 'critical';
345
345
  /**
346
346
  * One-line, human-readable description
@@ -2172,7 +2172,7 @@ type FormationTemplate = {
2172
2172
  [key: string]: ResourceDeclaration;
2173
2173
  };
2174
2174
  /**
2175
- * Map of output names to values. Values may use `{ "ref": "logicalId" }` to reference physical IDs of created resources, or `{ "param": "ParamName" }` and `{ "sub": "text ${ParamName}" }` to embed parameter values.
2175
+ * Map of output names to values. Values may use `{ "ref": "logicalId" }` to reference physical IDs of created resources, or `{ "param": "ParamName" }` and `{ "sub": "text ${ParamName}" }` to embed parameter values. `{ "ref_attr": "LogicalId.attribute" }` resolves a named attribute of a created resource, except one carrying credential material — a trigger's or webhook's `secret` is refused with 400 VALIDATION_FAILED, since a formation is readable by anyone holding `formations:GetFormation`. Read those from the resource's own secret route instead.
2176
2176
  *
2177
2177
  */
2178
2178
  outputs?: {
@@ -3113,13 +3113,13 @@ type QuotaResourceProperties = {
3113
3113
  /**
3114
3114
  * The metric being capped
3115
3115
  */
3116
- metric: 'requests' | 'tokens' | 'cost_usd';
3116
+ metric: 'requests' | 'tokens' | 'cost_usd' | 'storage_bytes';
3117
3117
  /**
3118
- * The window over which the metric is aggregated
3118
+ * The window over which the metric is aggregated. storage_bytes caps a stored total rather than a windowed one, so it takes current and refuses every other value; current is refused for every other metric.
3119
3119
  */
3120
- window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month';
3120
+ window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month' | 'current';
3121
3121
  /**
3122
- * The cap. Positive integer for requests/tokens; fractional allowed for cost_usd.
3122
+ * The cap. Positive integer for requests/tokens/storage_bytes (bytes); fractional allowed for cost_usd.
3123
3123
  */
3124
3124
  limit: number;
3125
3125
  /**
@@ -3239,9 +3239,14 @@ type Formation = {
3239
3239
  * Human-readable formation name
3240
3240
  */
3241
3241
  name?: string;
3242
+ /**
3243
+ * The template as deployed. Credential-bearing properties — a `secret` resource's `value`, and any property a custom resource type declares `write_only` — read back as `{ "no_echo": true }` rather than the value that was supplied.
3244
+ *
3245
+ */
3242
3246
  template?: FormationTemplate;
3243
3247
  /**
3244
- * Resolved output values after stack deployment
3248
+ * Resolved output values after stack deployment. An output that resolved a credential attribute on a formation deployed before those were refused is omitted.
3249
+ *
3245
3250
  */
3246
3251
  outputs?: {
3247
3252
  [key: string]: string;
@@ -4281,19 +4286,19 @@ type QueueStats = {
4281
4286
  */
4282
4287
  driver?: 'postgres' | 'sqs';
4283
4288
  /**
4284
- * Tasks waiting to be claimed now (unclaimed and past their `available_at`). Backoff-delayed tasks are excluded.
4289
+ * Tasks waiting to be claimed now (unclaimed and past their `available_at`). Backoff-delayed tasks are excluded. Summed over the caller's own projects when the caller is project-scoped.
4285
4290
  */
4286
4291
  queue_depth?: number;
4287
4292
  /**
4288
- * Tasks currently claimed with a valid (unexpired) lease.
4293
+ * Tasks currently claimed with a valid (unexpired) lease. Summed over the caller's own projects when the caller is project-scoped.
4289
4294
  */
4290
4295
  claimed_tasks?: number;
4291
4296
  /**
4292
- * Age in seconds of the oldest claimable-now task, or `null` when none are waiting.
4297
+ * Age in seconds of the oldest claimable-now task, or `null` when none are waiting. Also `null` for a project-scoped caller: the figure is deployment-wide.
4293
4298
  */
4294
4299
  oldest_queued_age_seconds?: number | null;
4295
4300
  /**
4296
- * Claim-latency percentiles (time from a task becoming available to being claimed) over a rolling in-process window. `p50`/`p95` are `null` when no claim happened in the window.
4301
+ * Claim-latency percentiles (time from a task becoming available to being claimed) over a rolling in-process window. `p50`/`p95` are `null` when no claim happened in the window, and for a project-scoped caller: the window is deployment-wide.
4297
4302
  */
4298
4303
  claim_latency_ms?: {
4299
4304
  p50?: number | null;
@@ -5045,8 +5050,11 @@ type Quota = {
5045
5050
  * Public id of the api key / agent / actor the quota applies to. For `api_key` and `agent` scope, NULL means all entities of that scope type in the project. For `actor` scope, NULL means one budget *per* actor rather than a pooled total across all actors.
5046
5051
  */
5047
5052
  scope_ref?: string | null;
5048
- metric?: 'requests' | 'tokens' | 'cost_usd';
5049
- window?: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month';
5053
+ metric?: 'requests' | 'tokens' | 'cost_usd' | 'storage_bytes';
5054
+ /**
5055
+ * The window the metric is aggregated over; `current` on storage_bytes, which caps a stored total and never resets.
5056
+ */
5057
+ window?: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month' | 'current';
5050
5058
  limit?: number;
5051
5059
  mode?: 'enforce' | 'monitor';
5052
5060
  /**
@@ -5058,7 +5066,7 @@ type Quota = {
5058
5066
  */
5059
5067
  on_unpriced?: 'block' | 'allow' | null;
5060
5068
  /**
5061
- * Current fixed-window usage for the requests metric. Null for token/cost quotas (which aggregate the usage meter at check time rather than keeping a counter) and in list responses.
5069
+ * Current fixed-window usage for the requests metric. Null for token/cost quotas (which aggregate the usage meter at check time rather than keeping a counter), null for storage_bytes (a stored total has no window and no counter — read the footprint from the storage meter), and null in list responses.
5062
5070
  */
5063
5071
  current_usage?: {
5064
5072
  window_key?: string;
@@ -5523,6 +5531,8 @@ type Tool = {
5523
5531
  *
5524
5532
  * Credential 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.
5525
5533
  *
5534
+ * A credential written as a **literal** is stored and still sent on every call, but it is masked on every read: `secret_access_key`, `session_token` and `credentials` under `auth`, and any credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), come back as `{"no_echo": true}`. The mask is 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.
5535
+ *
5526
5536
  * `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 a prefixed context 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.
5527
5537
  *
5528
5538
  */
@@ -5530,7 +5540,7 @@ type Tool = {
5530
5540
  [key: string]: unknown;
5531
5541
  } | null;
5532
5542
  /**
5533
- * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only.
5543
+ * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only. A literal credential in `headers` is masked on read, exactly as in `execute`.
5534
5544
  */
5535
5545
  mcp?: {
5536
5546
  [key: string]: unknown;
@@ -5607,6 +5617,8 @@ type CreateToolRequest = {
5607
5617
  *
5608
5618
  * Credential 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.
5609
5619
  *
5620
+ * A credential written as a **literal** is stored and still sent on every call, but it is masked on every read: `secret_access_key`, `session_token` and `credentials` under `auth`, and any credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), come back as `{"no_echo": true}`. The mask is 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.
5621
+ *
5610
5622
  * `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-Soat-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.
5611
5623
  *
5612
5624
  */
@@ -5614,7 +5626,7 @@ type CreateToolRequest = {
5614
5626
  [key: string]: unknown;
5615
5627
  };
5616
5628
  /**
5617
- * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only.
5629
+ * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only. A literal credential in `headers` is masked on read, exactly as in `execute`.
5618
5630
  */
5619
5631
  mcp?: {
5620
5632
  [key: string]: unknown;
@@ -5673,6 +5685,8 @@ type UpdateToolRequest = {
5673
5685
  *
5674
5686
  * Credential 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.
5675
5687
  *
5688
+ * A credential written as a **literal** is stored and still sent on every call, but it is masked on every read: `secret_access_key`, `session_token` and `credentials` under `auth`, and any credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), come back as `{"no_echo": true}`. The mask is 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.
5689
+ *
5676
5690
  * `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-Soat-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.
5677
5691
  *
5678
5692
  */
@@ -5680,7 +5694,7 @@ type UpdateToolRequest = {
5680
5694
  [key: string]: unknown;
5681
5695
  } | null;
5682
5696
  /**
5683
- * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only.
5697
+ * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only. A literal credential in `headers` is masked on read, exactly as in `execute`.
5684
5698
  */
5685
5699
  mcp?: {
5686
5700
  [key: string]: unknown;
@@ -6659,7 +6673,7 @@ type ListActivityData = {
6659
6673
  /**
6660
6674
  * Filter by activity kind
6661
6675
  */
6662
- kind?: 'action_executed' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
6676
+ kind?: 'action_executed' | 'approval_created' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
6663
6677
  /**
6664
6678
  * Filter by severity
6665
6679
  */
@@ -7643,7 +7657,7 @@ type CreateAiProviderData = {
7643
7657
  */
7644
7658
  default_model: string;
7645
7659
  /**
7646
- * Secret ID containing API credentials
7660
+ * Secret ID containing API credentials. Required for `bedrock` and `vertex` unless `config.apiKey` carries one.
7647
7661
  */
7648
7662
  secret_id?: string;
7649
7663
  /**
@@ -8276,7 +8290,7 @@ type GetApprovalResponse = GetApprovalResponses[keyof GetApprovalResponses];
8276
8290
  type ApproveApprovalData = {
8277
8291
  body?: {
8278
8292
  /**
8279
- * Edited arguments to execute instead of the proposed ones
8293
+ * 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.
8280
8294
  */
8281
8295
  arguments?: {
8282
8296
  [key: string]: unknown;
@@ -8293,7 +8307,7 @@ type ApproveApprovalData = {
8293
8307
  };
8294
8308
  type ApproveApprovalErrors = {
8295
8309
  /**
8296
- * Edited arguments are not a JSON object
8310
+ * Edited arguments are not a JSON object, or do not satisfy the tool's parameters schema
8297
8311
  */
8298
8312
  400: unknown;
8299
8313
  /**
@@ -8301,7 +8315,7 @@ type ApproveApprovalErrors = {
8301
8315
  */
8302
8316
  401: unknown;
8303
8317
  /**
8304
- * Forbidden
8318
+ * Forbidden — including an edit by a caller who may resolve the item but not make the call it proposes
8305
8319
  */
8306
8320
  403: unknown;
8307
8321
  /**
@@ -9403,6 +9417,10 @@ type CreateDocumentErrors = {
9403
9417
  * Forbidden
9404
9418
  */
9405
9419
  403: ErrorResponse;
9420
+ /**
9421
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
9422
+ */
9423
+ 409: ErrorResponse;
9406
9424
  };
9407
9425
  type CreateDocumentError = CreateDocumentErrors[keyof CreateDocumentErrors];
9408
9426
  type CreateDocumentResponses = {
@@ -9468,7 +9486,7 @@ type IngestDocumentErrors = {
9468
9486
  */
9469
9487
  403: ErrorResponse;
9470
9488
  /**
9471
- * The file already backs a Document (a file can only be ingested once). Use `POST /documents/{document_id}/ingest` to re-process the existing document, or upload a new copy of the file to ingest it separately.
9489
+ * The file already backs a Document (a file can only be ingested once — use `POST /documents/{document_id}/ingest` to re-process the existing document, or upload a new copy of the file to ingest it separately), or the project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`; delete stored content or raise the quota — no `Retry-After` is sent, since no window reset clears a stored total).
9472
9490
  */
9473
9491
  409: ErrorResponse;
9474
9492
  /**
@@ -9687,6 +9705,10 @@ type ReingestDocumentErrors = {
9687
9705
  * Document not found
9688
9706
  */
9689
9707
  404: ErrorResponse;
9708
+ /**
9709
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
9710
+ */
9711
+ 409: ErrorResponse;
9690
9712
  /**
9691
9713
  * The file is too large to re-ingest synchronously (`?wait=true`). Retry in background mode.
9692
9714
  */
@@ -9876,7 +9898,7 @@ type CreateEmbeddingsData = {
9876
9898
  */
9877
9899
  input?: string;
9878
9900
  /**
9879
- * Batch of texts to embed.
9901
+ * Batch of texts to embed. At most 256 per request — each input is one call to the embedding model, so a larger batch is refused (`VALIDATION_FAILED`) rather than queued. Split it across requests.
9880
9902
  */
9881
9903
  inputs?: Array<string>;
9882
9904
  };
@@ -10196,6 +10218,10 @@ type CreateDatasetItemErrors = {
10196
10218
  * Dataset not found
10197
10219
  */
10198
10220
  404: unknown;
10221
+ /**
10222
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). A fixture is a corpus write like a document, so it is bounded by the same cap; delete stored content or raise the quota — no `Retry-After` is sent, since no window reset clears a stored total.
10223
+ */
10224
+ 409: unknown;
10199
10225
  };
10200
10226
  type CreateDatasetItemResponses = {
10201
10227
  /**
@@ -10248,7 +10274,7 @@ type CreateDatasetItemFromGenerationErrors = {
10248
10274
  */
10249
10275
  404: unknown;
10250
10276
  /**
10251
- * The generation has not completed, or its content was never stored or has been purged
10277
+ * The generation has not completed, its content was never stored or has been purged, or the project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`; delete stored content or raise the quota — no `Retry-After` is sent, since no window reset clears a stored total)
10252
10278
  */
10253
10279
  409: unknown;
10254
10280
  };
@@ -11036,6 +11062,10 @@ type CreateFileData = {
11036
11062
  url: '/api/v1/files';
11037
11063
  };
11038
11064
  type CreateFileErrors = {
11065
+ /**
11066
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
11067
+ */
11068
+ 409: ErrorResponse;
11039
11069
  /**
11040
11070
  * Internal server error
11041
11071
  */
@@ -11089,6 +11119,14 @@ type UploadFileErrors = {
11089
11119
  * Insufficient permissions
11090
11120
  */
11091
11121
  403: ErrorResponse;
11122
+ /**
11123
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
11124
+ */
11125
+ 409: ErrorResponse;
11126
+ /**
11127
+ * The upload is over this deployment's byte ceiling (`UPLOAD_TOO_LARGE`; `FILE_UPLOAD_MAX_BYTES`, 25 MB by default). The request is refused while the body is still streaming, so nothing was stored.
11128
+ */
11129
+ 413: ErrorResponse;
11092
11130
  };
11093
11131
  type UploadFileError = UploadFileErrors[keyof UploadFileErrors];
11094
11132
  type UploadFileResponses = {
@@ -11117,6 +11155,10 @@ type UploadFileBase64Errors = {
11117
11155
  * Insufficient permissions
11118
11156
  */
11119
11157
  403: ErrorResponse;
11158
+ /**
11159
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
11160
+ */
11161
+ 409: ErrorResponse;
11120
11162
  };
11121
11163
  type UploadFileBase64Error = UploadFileBase64Errors[keyof UploadFileBase64Errors];
11122
11164
  type UploadFileBase64Responses = {
@@ -11175,13 +11217,17 @@ type UploadFileWithTokenErrors = {
11175
11217
  */
11176
11218
  404: ErrorResponse;
11177
11219
  /**
11178
- * Upload token already used
11220
+ * Upload token already used, or the project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`)
11179
11221
  */
11180
11222
  409: ErrorResponse;
11181
11223
  /**
11182
11224
  * Upload token expired
11183
11225
  */
11184
11226
  410: ErrorResponse;
11227
+ /**
11228
+ * The upload is over this deployment's byte ceiling (`UPLOAD_TOO_LARGE`; `FILE_UPLOAD_MAX_BYTES`, 25 MB by default). The request is refused while the body is still streaming, so nothing was stored.
11229
+ */
11230
+ 413: ErrorResponse;
11185
11231
  };
11186
11232
  type UploadFileWithTokenError = UploadFileWithTokenErrors[keyof UploadFileWithTokenErrors];
11187
11233
  type UploadFileWithTokenResponses = {
@@ -12394,7 +12440,7 @@ type CreateIngestionRuleData = {
12394
12440
  */
12395
12441
  project_id?: string;
12396
12442
  /**
12397
- * MIME type glob matched against a file's content_type
12443
+ * MIME type glob matched against a file's content_type. At most 4 wildcards and 255 characters — a MIME glob needs one on each side of the slash at most.
12398
12444
  */
12399
12445
  content_type_glob: string;
12400
12446
  /**
@@ -12541,6 +12587,9 @@ type GetIngestionRuleResponses = {
12541
12587
  type GetIngestionRuleResponse = GetIngestionRuleResponses[keyof GetIngestionRuleResponses];
12542
12588
  type UpdateIngestionRuleData = {
12543
12589
  body: {
12590
+ /**
12591
+ * MIME type glob matched against a file's content_type. At most 4 wildcards and 255 characters.
12592
+ */
12544
12593
  content_type_glob?: string;
12545
12594
  tool_id?: string | null;
12546
12595
  agent_id?: string | null;
@@ -12613,7 +12662,7 @@ type SearchKnowledgeData = {
12613
12662
  */
12614
12663
  min_score?: number;
12615
12664
  /**
12616
- * Maximum number of results to return (default 10)
12665
+ * Maximum number of results to return (default 10). A value above 100 is clamped to 100 — the ceiling bounds the vector scan this one request performs, so a larger `limit` returns everything there is up to that many rows rather than being refused.
12617
12666
  */
12618
12667
  limit?: number;
12619
12668
  /**
@@ -12974,6 +13023,10 @@ type CreateMemoryEntryErrors = {
12974
13023
  * Memory not found
12975
13024
  */
12976
13025
  404: unknown;
13026
+ /**
13027
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
13028
+ */
13029
+ 409: unknown;
12977
13030
  /**
12978
13031
  * Internal server error
12979
13032
  */
@@ -14456,13 +14509,13 @@ type CreateQuotaData = {
14456
14509
  /**
14457
14510
  * The metric being capped
14458
14511
  */
14459
- metric: 'requests' | 'tokens' | 'cost_usd';
14512
+ metric: 'requests' | 'tokens' | 'cost_usd' | 'storage_bytes';
14460
14513
  /**
14461
- * The window over which the metric is aggregated
14514
+ * The window over which the metric is aggregated. `current` is the only accepted value for storage_bytes (a stored total is not aggregated over time) and is refused for every other metric.
14462
14515
  */
14463
- window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month';
14516
+ window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month' | 'current';
14464
14517
  /**
14465
- * The cap. Must be a positive integer for requests/tokens; fractional values are allowed for cost_usd.
14518
+ * The cap. Must be a positive integer for requests/tokens/storage_bytes (bytes); fractional values are allowed for cost_usd.
14466
14519
  */
14467
14520
  limit: number;
14468
14521
  /**
@@ -17659,7 +17712,14 @@ declare class AiProviders {
17659
17712
  /**
17660
17713
  * Create an AI provider
17661
17714
  *
17662
- * Creates a new LLM provider configuration
17715
+ * Creates a new LLM provider configuration.
17716
+ *
17717
+ * A `bedrock` or `vertex` record must carry a credential of its own — a
17718
+ * linked `secret_id`, or an `apiKey` in `config`. Without one the provider
17719
+ * SDK signs with the server's own credentials (the AWS default credential
17720
+ * chain, Google Application Default Credentials), which is refused with
17721
+ * `400 VALIDATION_FAILED` unless the deployment allows it.
17722
+ *
17663
17723
  */
17664
17724
  static createAiProvider<ThrowOnError extends boolean = false>(options: Options<CreateAiProviderData, ThrowOnError>): RequestResult<CreateAiProviderResponses, CreateAiProviderErrors, ThrowOnError>;
17665
17725
  /**
@@ -17689,7 +17749,7 @@ declare class AiProviders {
17689
17749
  * Asks the provider which models it can run, using this provider record's own credentials and configuration, and returns provider-native model ids — the same strings `default_model` and an agent's `model` carry.
17690
17750
  * Which models are reachable is a property of the credential, not of the provider type: a Vertex provider sees only the publisher models its Google Cloud project and location serve, and a Bedrock provider only the foundation models enabled in its region. Reading the list is how a caller avoids pinning a model that fails at generation time.
17691
17751
  * Not every provider type can answer. `azure` lists deployments an operator named rather than models, and `ollama` lists whatever was pulled onto that host, so both return `400 MODEL_LISTING_UNSUPPORTED`.
17692
- * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret when there is one — IAM keys or a Bedrock API key, a Google service-account key — and otherwise fall back to the server environment (the AWS default credential chain, Google Application Default Credentials), so a record with no `secret_id` can still list.
17752
+ * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret — IAM keys or a Bedrock API key, a Google service-account key. A record with no `secret_id` would fall back to the server's own credentials (the AWS default credential chain, Google Application Default Credentials); it can list only on a deployment that allows a record to use them, and returns `400 AI_PROVIDER_MISCONFIGURED` otherwise.
17693
17753
  * A Vertex record needs no `config.project` when its secret is a service-account key, since the key file names its own project. A Vertex record in express mode (API key) cannot list at all: the publisher-model listing rejects API keys and needs a credential that asserts a principal, so it returns `400 MODEL_LISTING_UNSUPPORTED`.
17694
17754
  * The Vertex answer is the publisher catalogue the record's `config.location` region serves. The project behind the credential is billed and quota'd for the call but does not filter the result, so a listed model may still be unavailable to that project at generation time.
17695
17755
  *
@@ -17714,7 +17774,11 @@ declare class ApiKeys {
17714
17774
  /**
17715
17775
  * List API keys
17716
17776
  *
17717
- * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns only API keys scoped to that project.
17777
+ * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns the caller's own
17778
+ * keys scoped to that project, or every key scoped to it when the credential
17779
+ * holds `api-keys:ListApiKeys` on the project. Confinement to a project is not
17780
+ * authority over it, and a key's metadata names its owner, prefix and attached
17781
+ * policies.
17718
17782
  *
17719
17783
  */
17720
17784
  static listApiKeys<ThrowOnError extends boolean = false>(options?: Options<ListApiKeysData, ThrowOnError>): RequestResult<ListApiKeysResponses, ListApiKeysErrors, ThrowOnError>;
@@ -18648,7 +18712,8 @@ declare class Orchestrations {
18648
18712
  /**
18649
18713
  * Get orchestration queue stats
18650
18714
  *
18651
- * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`. A project-scoped caller sees only their own projects under `per_project`.
18715
+ * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`.
18716
+ * Every figure is scoped to what the caller may see. A project-scoped caller gets `per_project` for their own projects only, `queue_depth` and `claimed_tasks` summed over those same 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.
18652
18717
  *
18653
18718
  */
18654
18719
  static getQueueStats<ThrowOnError extends boolean = false>(options?: Options<GetQueueStatsData, ThrowOnError>): RequestResult<GetQueueStatsResponses, GetQueueStatsErrors, ThrowOnError>;
@@ -18835,7 +18900,9 @@ declare class Quotas {
18835
18900
  /**
18836
18901
  * Create a quota
18837
18902
  *
18838
- * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
18903
+ * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`; `storage_bytes` is valid for `scope: project` only. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
18904
+ *
18905
+ * `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory-entry create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.
18839
18906
  */
18840
18907
  static createQuota<ThrowOnError extends boolean = false>(options: Options<CreateQuotaData, ThrowOnError>): RequestResult<CreateQuotaResponses, CreateQuotaErrors, ThrowOnError>;
18841
18908
  /**
@@ -19077,6 +19144,7 @@ declare class Tools {
19077
19144
  * Directly invokes a tool and returns its output. Supported for `http`, `builtin`, `mcp`, and `pipeline` tools. `client` tools cannot be invoked server-side and will return 422. A `pipeline` tool runs its declared steps in order and returns the mapped `output` (or the last step's output); `action` is ignored and `input` is the pipeline input.
19078
19145
  * For `builtin` and `mcp` tools the `action` field is required and identifies which action (SOAT) or tool name (MCP) to invoke. For `http` tools `action` is ignored. When a `builtin` or `mcp` tool declares an `actions` allowlist, an action outside it is rejected with `400 VALIDATION_FAILED` ("not available on this tool") before any outbound request is made.
19079
19146
  * `preset_parameters` stored on the tool are pinned over the caller-supplied `input` before execution: a key the tool presets keeps its preset value even when `input` sets it. Keys the presets do not name are taken from `input` as sent.
19147
+ * Guardrails attached to the tool or to its project adjudicate the call before dispatch, composing project + tool scope. A call this route cannot await a decision on — class C (human sign-off), class D, or a class-B tripwire — is refused with `422 TOOL_DISPATCH_FAILED`, whose `meta` carries the `tool_id` and the `outcome`. A `pipeline` tool is adjudicated before its first step runs, and every step is adjudicated as the call of that tool it is.
19080
19148
  *
19081
19149
  */
19082
19150
  static callTool<ThrowOnError extends boolean = false>(options: Options<CallToolData, ThrowOnError>): RequestResult<CallToolResponses, CallToolErrors, ThrowOnError>;
@@ -19141,7 +19209,8 @@ declare class Triggers {
19141
19209
  /**
19142
19210
  * Update a trigger
19143
19211
  *
19144
- * Updates an existing trigger's configuration. The type is immutable.
19212
+ * 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.
19213
+ *
19145
19214
  */
19146
19215
  static updateTrigger<ThrowOnError extends boolean = false>(options: Options<UpdateTriggerData, ThrowOnError>): RequestResult<UpdateTriggerResponses, UpdateTriggerErrors, ThrowOnError>;
19147
19216
  /**
package/dist/index.d.mts CHANGED
@@ -340,7 +340,7 @@ type ActivityEntry = {
340
340
  /**
341
341
  * How the entry was produced
342
342
  */
343
- kind?: 'action_executed' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
343
+ kind?: 'action_executed' | 'approval_created' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
344
344
  severity?: 'info' | 'warning' | 'critical';
345
345
  /**
346
346
  * One-line, human-readable description
@@ -2172,7 +2172,7 @@ type FormationTemplate = {
2172
2172
  [key: string]: ResourceDeclaration;
2173
2173
  };
2174
2174
  /**
2175
- * Map of output names to values. Values may use `{ "ref": "logicalId" }` to reference physical IDs of created resources, or `{ "param": "ParamName" }` and `{ "sub": "text ${ParamName}" }` to embed parameter values.
2175
+ * Map of output names to values. Values may use `{ "ref": "logicalId" }` to reference physical IDs of created resources, or `{ "param": "ParamName" }` and `{ "sub": "text ${ParamName}" }` to embed parameter values. `{ "ref_attr": "LogicalId.attribute" }` resolves a named attribute of a created resource, except one carrying credential material — a trigger's or webhook's `secret` is refused with 400 VALIDATION_FAILED, since a formation is readable by anyone holding `formations:GetFormation`. Read those from the resource's own secret route instead.
2176
2176
  *
2177
2177
  */
2178
2178
  outputs?: {
@@ -3113,13 +3113,13 @@ type QuotaResourceProperties = {
3113
3113
  /**
3114
3114
  * The metric being capped
3115
3115
  */
3116
- metric: 'requests' | 'tokens' | 'cost_usd';
3116
+ metric: 'requests' | 'tokens' | 'cost_usd' | 'storage_bytes';
3117
3117
  /**
3118
- * The window over which the metric is aggregated
3118
+ * The window over which the metric is aggregated. storage_bytes caps a stored total rather than a windowed one, so it takes current and refuses every other value; current is refused for every other metric.
3119
3119
  */
3120
- window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month';
3120
+ window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month' | 'current';
3121
3121
  /**
3122
- * The cap. Positive integer for requests/tokens; fractional allowed for cost_usd.
3122
+ * The cap. Positive integer for requests/tokens/storage_bytes (bytes); fractional allowed for cost_usd.
3123
3123
  */
3124
3124
  limit: number;
3125
3125
  /**
@@ -3239,9 +3239,14 @@ type Formation = {
3239
3239
  * Human-readable formation name
3240
3240
  */
3241
3241
  name?: string;
3242
+ /**
3243
+ * The template as deployed. Credential-bearing properties — a `secret` resource's `value`, and any property a custom resource type declares `write_only` — read back as `{ "no_echo": true }` rather than the value that was supplied.
3244
+ *
3245
+ */
3242
3246
  template?: FormationTemplate;
3243
3247
  /**
3244
- * Resolved output values after stack deployment
3248
+ * Resolved output values after stack deployment. An output that resolved a credential attribute on a formation deployed before those were refused is omitted.
3249
+ *
3245
3250
  */
3246
3251
  outputs?: {
3247
3252
  [key: string]: string;
@@ -4281,19 +4286,19 @@ type QueueStats = {
4281
4286
  */
4282
4287
  driver?: 'postgres' | 'sqs';
4283
4288
  /**
4284
- * Tasks waiting to be claimed now (unclaimed and past their `available_at`). Backoff-delayed tasks are excluded.
4289
+ * Tasks waiting to be claimed now (unclaimed and past their `available_at`). Backoff-delayed tasks are excluded. Summed over the caller's own projects when the caller is project-scoped.
4285
4290
  */
4286
4291
  queue_depth?: number;
4287
4292
  /**
4288
- * Tasks currently claimed with a valid (unexpired) lease.
4293
+ * Tasks currently claimed with a valid (unexpired) lease. Summed over the caller's own projects when the caller is project-scoped.
4289
4294
  */
4290
4295
  claimed_tasks?: number;
4291
4296
  /**
4292
- * Age in seconds of the oldest claimable-now task, or `null` when none are waiting.
4297
+ * Age in seconds of the oldest claimable-now task, or `null` when none are waiting. Also `null` for a project-scoped caller: the figure is deployment-wide.
4293
4298
  */
4294
4299
  oldest_queued_age_seconds?: number | null;
4295
4300
  /**
4296
- * Claim-latency percentiles (time from a task becoming available to being claimed) over a rolling in-process window. `p50`/`p95` are `null` when no claim happened in the window.
4301
+ * Claim-latency percentiles (time from a task becoming available to being claimed) over a rolling in-process window. `p50`/`p95` are `null` when no claim happened in the window, and for a project-scoped caller: the window is deployment-wide.
4297
4302
  */
4298
4303
  claim_latency_ms?: {
4299
4304
  p50?: number | null;
@@ -5045,8 +5050,11 @@ type Quota = {
5045
5050
  * Public id of the api key / agent / actor the quota applies to. For `api_key` and `agent` scope, NULL means all entities of that scope type in the project. For `actor` scope, NULL means one budget *per* actor rather than a pooled total across all actors.
5046
5051
  */
5047
5052
  scope_ref?: string | null;
5048
- metric?: 'requests' | 'tokens' | 'cost_usd';
5049
- window?: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month';
5053
+ metric?: 'requests' | 'tokens' | 'cost_usd' | 'storage_bytes';
5054
+ /**
5055
+ * The window the metric is aggregated over; `current` on storage_bytes, which caps a stored total and never resets.
5056
+ */
5057
+ window?: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month' | 'current';
5050
5058
  limit?: number;
5051
5059
  mode?: 'enforce' | 'monitor';
5052
5060
  /**
@@ -5058,7 +5066,7 @@ type Quota = {
5058
5066
  */
5059
5067
  on_unpriced?: 'block' | 'allow' | null;
5060
5068
  /**
5061
- * Current fixed-window usage for the requests metric. Null for token/cost quotas (which aggregate the usage meter at check time rather than keeping a counter) and in list responses.
5069
+ * Current fixed-window usage for the requests metric. Null for token/cost quotas (which aggregate the usage meter at check time rather than keeping a counter), null for storage_bytes (a stored total has no window and no counter — read the footprint from the storage meter), and null in list responses.
5062
5070
  */
5063
5071
  current_usage?: {
5064
5072
  window_key?: string;
@@ -5523,6 +5531,8 @@ type Tool = {
5523
5531
  *
5524
5532
  * Credential 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.
5525
5533
  *
5534
+ * A credential written as a **literal** is stored and still sent on every call, but it is masked on every read: `secret_access_key`, `session_token` and `credentials` under `auth`, and any credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), come back as `{"no_echo": true}`. The mask is 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.
5535
+ *
5526
5536
  * `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 a prefixed context 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.
5527
5537
  *
5528
5538
  */
@@ -5530,7 +5540,7 @@ type Tool = {
5530
5540
  [key: string]: unknown;
5531
5541
  } | null;
5532
5542
  /**
5533
- * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only.
5543
+ * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only. A literal credential in `headers` is masked on read, exactly as in `execute`.
5534
5544
  */
5535
5545
  mcp?: {
5536
5546
  [key: string]: unknown;
@@ -5607,6 +5617,8 @@ type CreateToolRequest = {
5607
5617
  *
5608
5618
  * Credential 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.
5609
5619
  *
5620
+ * A credential written as a **literal** is stored and still sent on every call, but it is masked on every read: `secret_access_key`, `session_token` and `credentials` under `auth`, and any credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), come back as `{"no_echo": true}`. The mask is 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.
5621
+ *
5610
5622
  * `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-Soat-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.
5611
5623
  *
5612
5624
  */
@@ -5614,7 +5626,7 @@ type CreateToolRequest = {
5614
5626
  [key: string]: unknown;
5615
5627
  };
5616
5628
  /**
5617
- * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only.
5629
+ * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only. A literal credential in `headers` is masked on read, exactly as in `execute`.
5618
5630
  */
5619
5631
  mcp?: {
5620
5632
  [key: string]: unknown;
@@ -5673,6 +5685,8 @@ type UpdateToolRequest = {
5673
5685
  *
5674
5686
  * Credential 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.
5675
5687
  *
5688
+ * A credential written as a **literal** is stored and still sent on every call, but it is masked on every read: `secret_access_key`, `session_token` and `credentials` under `auth`, and any credential-named `headers` value (`Authorization`, `Cookie`, or a name containing `api-key`/`token`/`secret`/`password`), come back as `{"no_echo": true}`. The mask is 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.
5689
+ *
5676
5690
  * `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-Soat-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.
5677
5691
  *
5678
5692
  */
@@ -5680,7 +5694,7 @@ type UpdateToolRequest = {
5680
5694
  [key: string]: unknown;
5681
5695
  } | null;
5682
5696
  /**
5683
- * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only.
5697
+ * MCP server config (`url`, `headers`). `headers` values accept `{{secret:...}}` and `{{context:<key>}}` references, resolved right before the outbound MCP request; `url` accepts `{{secret:...}}` only. A literal credential in `headers` is masked on read, exactly as in `execute`.
5684
5698
  */
5685
5699
  mcp?: {
5686
5700
  [key: string]: unknown;
@@ -6659,7 +6673,7 @@ type ListActivityData = {
6659
6673
  /**
6660
6674
  * Filter by activity kind
6661
6675
  */
6662
- kind?: 'action_executed' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
6676
+ kind?: 'action_executed' | 'approval_created' | 'approval_resolved' | 'exception_created' | 'schedule_fired';
6663
6677
  /**
6664
6678
  * Filter by severity
6665
6679
  */
@@ -7643,7 +7657,7 @@ type CreateAiProviderData = {
7643
7657
  */
7644
7658
  default_model: string;
7645
7659
  /**
7646
- * Secret ID containing API credentials
7660
+ * Secret ID containing API credentials. Required for `bedrock` and `vertex` unless `config.apiKey` carries one.
7647
7661
  */
7648
7662
  secret_id?: string;
7649
7663
  /**
@@ -8276,7 +8290,7 @@ type GetApprovalResponse = GetApprovalResponses[keyof GetApprovalResponses];
8276
8290
  type ApproveApprovalData = {
8277
8291
  body?: {
8278
8292
  /**
8279
- * Edited arguments to execute instead of the proposed ones
8293
+ * 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.
8280
8294
  */
8281
8295
  arguments?: {
8282
8296
  [key: string]: unknown;
@@ -8293,7 +8307,7 @@ type ApproveApprovalData = {
8293
8307
  };
8294
8308
  type ApproveApprovalErrors = {
8295
8309
  /**
8296
- * Edited arguments are not a JSON object
8310
+ * Edited arguments are not a JSON object, or do not satisfy the tool's parameters schema
8297
8311
  */
8298
8312
  400: unknown;
8299
8313
  /**
@@ -8301,7 +8315,7 @@ type ApproveApprovalErrors = {
8301
8315
  */
8302
8316
  401: unknown;
8303
8317
  /**
8304
- * Forbidden
8318
+ * Forbidden — including an edit by a caller who may resolve the item but not make the call it proposes
8305
8319
  */
8306
8320
  403: unknown;
8307
8321
  /**
@@ -9403,6 +9417,10 @@ type CreateDocumentErrors = {
9403
9417
  * Forbidden
9404
9418
  */
9405
9419
  403: ErrorResponse;
9420
+ /**
9421
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
9422
+ */
9423
+ 409: ErrorResponse;
9406
9424
  };
9407
9425
  type CreateDocumentError = CreateDocumentErrors[keyof CreateDocumentErrors];
9408
9426
  type CreateDocumentResponses = {
@@ -9468,7 +9486,7 @@ type IngestDocumentErrors = {
9468
9486
  */
9469
9487
  403: ErrorResponse;
9470
9488
  /**
9471
- * The file already backs a Document (a file can only be ingested once). Use `POST /documents/{document_id}/ingest` to re-process the existing document, or upload a new copy of the file to ingest it separately.
9489
+ * The file already backs a Document (a file can only be ingested once — use `POST /documents/{document_id}/ingest` to re-process the existing document, or upload a new copy of the file to ingest it separately), or the project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`; delete stored content or raise the quota — no `Retry-After` is sent, since no window reset clears a stored total).
9472
9490
  */
9473
9491
  409: ErrorResponse;
9474
9492
  /**
@@ -9687,6 +9705,10 @@ type ReingestDocumentErrors = {
9687
9705
  * Document not found
9688
9706
  */
9689
9707
  404: ErrorResponse;
9708
+ /**
9709
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
9710
+ */
9711
+ 409: ErrorResponse;
9690
9712
  /**
9691
9713
  * The file is too large to re-ingest synchronously (`?wait=true`). Retry in background mode.
9692
9714
  */
@@ -9876,7 +9898,7 @@ type CreateEmbeddingsData = {
9876
9898
  */
9877
9899
  input?: string;
9878
9900
  /**
9879
- * Batch of texts to embed.
9901
+ * Batch of texts to embed. At most 256 per request — each input is one call to the embedding model, so a larger batch is refused (`VALIDATION_FAILED`) rather than queued. Split it across requests.
9880
9902
  */
9881
9903
  inputs?: Array<string>;
9882
9904
  };
@@ -10196,6 +10218,10 @@ type CreateDatasetItemErrors = {
10196
10218
  * Dataset not found
10197
10219
  */
10198
10220
  404: unknown;
10221
+ /**
10222
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). A fixture is a corpus write like a document, so it is bounded by the same cap; delete stored content or raise the quota — no `Retry-After` is sent, since no window reset clears a stored total.
10223
+ */
10224
+ 409: unknown;
10199
10225
  };
10200
10226
  type CreateDatasetItemResponses = {
10201
10227
  /**
@@ -10248,7 +10274,7 @@ type CreateDatasetItemFromGenerationErrors = {
10248
10274
  */
10249
10275
  404: unknown;
10250
10276
  /**
10251
- * The generation has not completed, or its content was never stored or has been purged
10277
+ * The generation has not completed, its content was never stored or has been purged, or the project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`; delete stored content or raise the quota — no `Retry-After` is sent, since no window reset clears a stored total)
10252
10278
  */
10253
10279
  409: unknown;
10254
10280
  };
@@ -11036,6 +11062,10 @@ type CreateFileData = {
11036
11062
  url: '/api/v1/files';
11037
11063
  };
11038
11064
  type CreateFileErrors = {
11065
+ /**
11066
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
11067
+ */
11068
+ 409: ErrorResponse;
11039
11069
  /**
11040
11070
  * Internal server error
11041
11071
  */
@@ -11089,6 +11119,14 @@ type UploadFileErrors = {
11089
11119
  * Insufficient permissions
11090
11120
  */
11091
11121
  403: ErrorResponse;
11122
+ /**
11123
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
11124
+ */
11125
+ 409: ErrorResponse;
11126
+ /**
11127
+ * The upload is over this deployment's byte ceiling (`UPLOAD_TOO_LARGE`; `FILE_UPLOAD_MAX_BYTES`, 25 MB by default). The request is refused while the body is still streaming, so nothing was stored.
11128
+ */
11129
+ 413: ErrorResponse;
11092
11130
  };
11093
11131
  type UploadFileError = UploadFileErrors[keyof UploadFileErrors];
11094
11132
  type UploadFileResponses = {
@@ -11117,6 +11155,10 @@ type UploadFileBase64Errors = {
11117
11155
  * Insufficient permissions
11118
11156
  */
11119
11157
  403: ErrorResponse;
11158
+ /**
11159
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
11160
+ */
11161
+ 409: ErrorResponse;
11120
11162
  };
11121
11163
  type UploadFileBase64Error = UploadFileBase64Errors[keyof UploadFileBase64Errors];
11122
11164
  type UploadFileBase64Responses = {
@@ -11175,13 +11217,17 @@ type UploadFileWithTokenErrors = {
11175
11217
  */
11176
11218
  404: ErrorResponse;
11177
11219
  /**
11178
- * Upload token already used
11220
+ * Upload token already used, or the project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`)
11179
11221
  */
11180
11222
  409: ErrorResponse;
11181
11223
  /**
11182
11224
  * Upload token expired
11183
11225
  */
11184
11226
  410: ErrorResponse;
11227
+ /**
11228
+ * The upload is over this deployment's byte ceiling (`UPLOAD_TOO_LARGE`; `FILE_UPLOAD_MAX_BYTES`, 25 MB by default). The request is refused while the body is still streaming, so nothing was stored.
11229
+ */
11230
+ 413: ErrorResponse;
11185
11231
  };
11186
11232
  type UploadFileWithTokenError = UploadFileWithTokenErrors[keyof UploadFileWithTokenErrors];
11187
11233
  type UploadFileWithTokenResponses = {
@@ -12394,7 +12440,7 @@ type CreateIngestionRuleData = {
12394
12440
  */
12395
12441
  project_id?: string;
12396
12442
  /**
12397
- * MIME type glob matched against a file's content_type
12443
+ * MIME type glob matched against a file's content_type. At most 4 wildcards and 255 characters — a MIME glob needs one on each side of the slash at most.
12398
12444
  */
12399
12445
  content_type_glob: string;
12400
12446
  /**
@@ -12541,6 +12587,9 @@ type GetIngestionRuleResponses = {
12541
12587
  type GetIngestionRuleResponse = GetIngestionRuleResponses[keyof GetIngestionRuleResponses];
12542
12588
  type UpdateIngestionRuleData = {
12543
12589
  body: {
12590
+ /**
12591
+ * MIME type glob matched against a file's content_type. At most 4 wildcards and 255 characters.
12592
+ */
12544
12593
  content_type_glob?: string;
12545
12594
  tool_id?: string | null;
12546
12595
  agent_id?: string | null;
@@ -12613,7 +12662,7 @@ type SearchKnowledgeData = {
12613
12662
  */
12614
12663
  min_score?: number;
12615
12664
  /**
12616
- * Maximum number of results to return (default 10)
12665
+ * Maximum number of results to return (default 10). A value above 100 is clamped to 100 — the ceiling bounds the vector scan this one request performs, so a larger `limit` returns everything there is up to that many rows rather than being refused.
12617
12666
  */
12618
12667
  limit?: number;
12619
12668
  /**
@@ -12974,6 +13023,10 @@ type CreateMemoryEntryErrors = {
12974
13023
  * Memory not found
12975
13024
  */
12976
13025
  404: unknown;
13026
+ /**
13027
+ * The project's `storage_bytes` quota is exceeded (`QUOTA_STORAGE_EXCEEDED`). Delete stored content, or raise the quota — no window reset clears a stored total, so no `Retry-After` is sent.
13028
+ */
13029
+ 409: unknown;
12977
13030
  /**
12978
13031
  * Internal server error
12979
13032
  */
@@ -14456,13 +14509,13 @@ type CreateQuotaData = {
14456
14509
  /**
14457
14510
  * The metric being capped
14458
14511
  */
14459
- metric: 'requests' | 'tokens' | 'cost_usd';
14512
+ metric: 'requests' | 'tokens' | 'cost_usd' | 'storage_bytes';
14460
14513
  /**
14461
- * The window over which the metric is aggregated
14514
+ * The window over which the metric is aggregated. `current` is the only accepted value for storage_bytes (a stored total is not aggregated over time) and is refused for every other metric.
14462
14515
  */
14463
- window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month';
14516
+ window: 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month' | 'current';
14464
14517
  /**
14465
- * The cap. Must be a positive integer for requests/tokens; fractional values are allowed for cost_usd.
14518
+ * The cap. Must be a positive integer for requests/tokens/storage_bytes (bytes); fractional values are allowed for cost_usd.
14466
14519
  */
14467
14520
  limit: number;
14468
14521
  /**
@@ -17659,7 +17712,14 @@ declare class AiProviders {
17659
17712
  /**
17660
17713
  * Create an AI provider
17661
17714
  *
17662
- * Creates a new LLM provider configuration
17715
+ * Creates a new LLM provider configuration.
17716
+ *
17717
+ * A `bedrock` or `vertex` record must carry a credential of its own — a
17718
+ * linked `secret_id`, or an `apiKey` in `config`. Without one the provider
17719
+ * SDK signs with the server's own credentials (the AWS default credential
17720
+ * chain, Google Application Default Credentials), which is refused with
17721
+ * `400 VALIDATION_FAILED` unless the deployment allows it.
17722
+ *
17663
17723
  */
17664
17724
  static createAiProvider<ThrowOnError extends boolean = false>(options: Options<CreateAiProviderData, ThrowOnError>): RequestResult<CreateAiProviderResponses, CreateAiProviderErrors, ThrowOnError>;
17665
17725
  /**
@@ -17689,7 +17749,7 @@ declare class AiProviders {
17689
17749
  * Asks the provider which models it can run, using this provider record's own credentials and configuration, and returns provider-native model ids — the same strings `default_model` and an agent's `model` carry.
17690
17750
  * Which models are reachable is a property of the credential, not of the provider type: a Vertex provider sees only the publisher models its Google Cloud project and location serve, and a Bedrock provider only the foundation models enabled in its region. Reading the list is how a caller avoids pinning a model that fails at generation time.
17691
17751
  * Not every provider type can answer. `azure` lists deployments an operator named rather than models, and `ollama` lists whatever was pulled onto that host, so both return `400 MODEL_LISTING_UNSUPPORTED`.
17692
- * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret when there is one — IAM keys or a Bedrock API key, a Google service-account key — and otherwise fall back to the server environment (the AWS default credential chain, Google Application Default Credentials), so a record with no `secret_id` can still list.
17752
+ * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret — IAM keys or a Bedrock API key, a Google service-account key. A record with no `secret_id` would fall back to the server's own credentials (the AWS default credential chain, Google Application Default Credentials); it can list only on a deployment that allows a record to use them, and returns `400 AI_PROVIDER_MISCONFIGURED` otherwise.
17693
17753
  * A Vertex record needs no `config.project` when its secret is a service-account key, since the key file names its own project. A Vertex record in express mode (API key) cannot list at all: the publisher-model listing rejects API keys and needs a credential that asserts a principal, so it returns `400 MODEL_LISTING_UNSUPPORTED`.
17694
17754
  * The Vertex answer is the publisher catalogue the record's `config.location` region serves. The project behind the credential is billed and quota'd for the call but does not filter the result, so a listed model may still be unavailable to that project at generation time.
17695
17755
  *
@@ -17714,7 +17774,11 @@ declare class ApiKeys {
17714
17774
  /**
17715
17775
  * List API keys
17716
17776
  *
17717
- * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns only API keys scoped to that project.
17777
+ * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns the caller's own
17778
+ * keys scoped to that project, or every key scoped to it when the credential
17779
+ * holds `api-keys:ListApiKeys` on the project. Confinement to a project is not
17780
+ * authority over it, and a key's metadata names its owner, prefix and attached
17781
+ * policies.
17718
17782
  *
17719
17783
  */
17720
17784
  static listApiKeys<ThrowOnError extends boolean = false>(options?: Options<ListApiKeysData, ThrowOnError>): RequestResult<ListApiKeysResponses, ListApiKeysErrors, ThrowOnError>;
@@ -18648,7 +18712,8 @@ declare class Orchestrations {
18648
18712
  /**
18649
18713
  * Get orchestration queue stats
18650
18714
  *
18651
- * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`. A project-scoped caller sees only their own projects under `per_project`.
18715
+ * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`.
18716
+ * Every figure is scoped to what the caller may see. A project-scoped caller gets `per_project` for their own projects only, `queue_depth` and `claimed_tasks` summed over those same 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.
18652
18717
  *
18653
18718
  */
18654
18719
  static getQueueStats<ThrowOnError extends boolean = false>(options?: Options<GetQueueStatsData, ThrowOnError>): RequestResult<GetQueueStatsResponses, GetQueueStatsErrors, ThrowOnError>;
@@ -18835,7 +18900,9 @@ declare class Quotas {
18835
18900
  /**
18836
18901
  * Create a quota
18837
18902
  *
18838
- * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
18903
+ * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`; `storage_bytes` is valid for `scope: project` only. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
18904
+ *
18905
+ * `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory-entry create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.
18839
18906
  */
18840
18907
  static createQuota<ThrowOnError extends boolean = false>(options: Options<CreateQuotaData, ThrowOnError>): RequestResult<CreateQuotaResponses, CreateQuotaErrors, ThrowOnError>;
18841
18908
  /**
@@ -19077,6 +19144,7 @@ declare class Tools {
19077
19144
  * Directly invokes a tool and returns its output. Supported for `http`, `builtin`, `mcp`, and `pipeline` tools. `client` tools cannot be invoked server-side and will return 422. A `pipeline` tool runs its declared steps in order and returns the mapped `output` (or the last step's output); `action` is ignored and `input` is the pipeline input.
19078
19145
  * For `builtin` and `mcp` tools the `action` field is required and identifies which action (SOAT) or tool name (MCP) to invoke. For `http` tools `action` is ignored. When a `builtin` or `mcp` tool declares an `actions` allowlist, an action outside it is rejected with `400 VALIDATION_FAILED` ("not available on this tool") before any outbound request is made.
19079
19146
  * `preset_parameters` stored on the tool are pinned over the caller-supplied `input` before execution: a key the tool presets keeps its preset value even when `input` sets it. Keys the presets do not name are taken from `input` as sent.
19147
+ * Guardrails attached to the tool or to its project adjudicate the call before dispatch, composing project + tool scope. A call this route cannot await a decision on — class C (human sign-off), class D, or a class-B tripwire — is refused with `422 TOOL_DISPATCH_FAILED`, whose `meta` carries the `tool_id` and the `outcome`. A `pipeline` tool is adjudicated before its first step runs, and every step is adjudicated as the call of that tool it is.
19080
19148
  *
19081
19149
  */
19082
19150
  static callTool<ThrowOnError extends boolean = false>(options: Options<CallToolData, ThrowOnError>): RequestResult<CallToolResponses, CallToolErrors, ThrowOnError>;
@@ -19141,7 +19209,8 @@ declare class Triggers {
19141
19209
  /**
19142
19210
  * Update a trigger
19143
19211
  *
19144
- * Updates an existing trigger's configuration. The type is immutable.
19212
+ * 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.
19213
+ *
19145
19214
  */
19146
19215
  static updateTrigger<ThrowOnError extends boolean = false>(options: Options<UpdateTriggerData, ThrowOnError>): RequestResult<UpdateTriggerResponses, UpdateTriggerErrors, ThrowOnError>;
19147
19216
  /**
package/dist/index.mjs CHANGED
@@ -959,7 +959,14 @@ var AiProviders = class {
959
959
  /**
960
960
  * Create an AI provider
961
961
  *
962
- * Creates a new LLM provider configuration
962
+ * Creates a new LLM provider configuration.
963
+ *
964
+ * A `bedrock` or `vertex` record must carry a credential of its own — a
965
+ * linked `secret_id`, or an `apiKey` in `config`. Without one the provider
966
+ * SDK signs with the server's own credentials (the AWS default credential
967
+ * chain, Google Application Default Credentials), which is refused with
968
+ * `400 VALIDATION_FAILED` unless the deployment allows it.
969
+ *
963
970
  */
964
971
  static createAiProvider(options) {
965
972
  return (options.client ?? client).post({
@@ -1017,7 +1024,7 @@ var AiProviders = class {
1017
1024
  * Asks the provider which models it can run, using this provider record's own credentials and configuration, and returns provider-native model ids — the same strings `default_model` and an agent's `model` carry.
1018
1025
  * Which models are reachable is a property of the credential, not of the provider type: a Vertex provider sees only the publisher models its Google Cloud project and location serve, and a Bedrock provider only the foundation models enabled in its region. Reading the list is how a caller avoids pinning a model that fails at generation time.
1019
1026
  * Not every provider type can answer. `azure` lists deployments an operator named rather than models, and `ollama` lists whatever was pulled onto that host, so both return `400 MODEL_LISTING_UNSUPPORTED`.
1020
- * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret when there is one — IAM keys or a Bedrock API key, a Google service-account key — and otherwise fall back to the server environment (the AWS default credential chain, Google Application Default Credentials), so a record with no `secret_id` can still list.
1027
+ * Listing resolves credentials the same way generation does, so a record that can generate can list. The API-key types (`openai`, `groq`, `xai`, `gateway`, `custom`, `anthropic`, `google`) use the record's linked secret and cannot list without one. `bedrock` and `vertex` use the linked secret — IAM keys or a Bedrock API key, a Google service-account key. A record with no `secret_id` would fall back to the server's own credentials (the AWS default credential chain, Google Application Default Credentials); it can list only on a deployment that allows a record to use them, and returns `400 AI_PROVIDER_MISCONFIGURED` otherwise.
1021
1028
  * A Vertex record needs no `config.project` when its secret is a service-account key, since the key file names its own project. A Vertex record in express mode (API key) cannot list at all: the publisher-model listing rejects API keys and needs a credential that asserts a principal, so it returns `400 MODEL_LISTING_UNSUPPORTED`.
1022
1029
  * The Vertex answer is the publisher catalogue the record's `config.location` region serves. The project behind the credential is billed and quota'd for the call but does not filter the result, so a listed model may still be unavailable to that project at generation time.
1023
1030
  *
@@ -1061,7 +1068,11 @@ var ApiKeys = class {
1061
1068
  /**
1062
1069
  * List API keys
1063
1070
  *
1064
- * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns only API keys scoped to that project.
1071
+ * Lists API keys accessible to the caller. - JWT admin: returns all API keys. - JWT regular user: returns only the user's own API keys. - Project-scoped credential (API key or OAuth token): returns the caller's own
1072
+ * keys scoped to that project, or every key scoped to it when the credential
1073
+ * holds `api-keys:ListApiKeys` on the project. Confinement to a project is not
1074
+ * authority over it, and a key's metadata names its owner, prefix and attached
1075
+ * policies.
1065
1076
  *
1066
1077
  */
1067
1078
  static listApiKeys(options) {
@@ -2873,7 +2884,8 @@ var Orchestrations = class {
2873
2884
  /**
2874
2885
  * Get orchestration queue stats
2875
2886
  *
2876
- * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`. A project-scoped caller sees only their own projects under `per_project`.
2887
+ * 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, and a per-project breakdown. Intended for admin/operator policies; guarded by `orchestrations:GetQueueStats`.
2888
+ * Every figure is scoped to what the caller may see. A project-scoped caller gets `per_project` for their own projects only, `queue_depth` and `claimed_tasks` summed over those same 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.
2877
2889
  *
2878
2890
  */
2879
2891
  static getQueueStats(options) {
@@ -3243,7 +3255,9 @@ var Quotas = class {
3243
3255
  /**
3244
3256
  * Create a quota
3245
3257
  *
3246
- * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
3258
+ * Creates a project-scoped quota. `requests` is valid for `scope: project`/`api_key`; `tokens` and `cost_usd` are valid for `scope: project`/`agent`/`actor`; `storage_bytes` is valid for `scope: project` only. Any other scope/metric pair is rejected with 400 (no attribution exists to enforce it). An `actor` quota caps one end user's spend, matched from the generation's session; a null `scope_ref` means one budget *per* actor rather than a pooled project total. A `cost_usd` quota may name one `meter_type` to cap; omitting it caps every priced meter. A duplicate quota (same project, scope, scope_ref, metric, window, meter_type) is rejected with 409.
3259
+ *
3260
+ * `storage_bytes` caps a stored total rather than a windowed one, so it takes `window: current` and every other metric refuses that value (400 either way). It is enforced at the corpus write paths — file upload and create, document create, document ingest and re-ingest, memory-entry create — with `409 QUOTA_STORAGE_EXCEEDED` and no `Retry-After`, since no window reset clears a footprint.
3247
3261
  */
3248
3262
  static createQuota(options) {
3249
3263
  return (options.client ?? client).post({
@@ -3737,6 +3751,7 @@ var Tools = class {
3737
3751
  * Directly invokes a tool and returns its output. Supported for `http`, `builtin`, `mcp`, and `pipeline` tools. `client` tools cannot be invoked server-side and will return 422. A `pipeline` tool runs its declared steps in order and returns the mapped `output` (or the last step's output); `action` is ignored and `input` is the pipeline input.
3738
3752
  * For `builtin` and `mcp` tools the `action` field is required and identifies which action (SOAT) or tool name (MCP) to invoke. For `http` tools `action` is ignored. When a `builtin` or `mcp` tool declares an `actions` allowlist, an action outside it is rejected with `400 VALIDATION_FAILED` ("not available on this tool") before any outbound request is made.
3739
3753
  * `preset_parameters` stored on the tool are pinned over the caller-supplied `input` before execution: a key the tool presets keeps its preset value even when `input` sets it. Keys the presets do not name are taken from `input` as sent.
3754
+ * Guardrails attached to the tool or to its project adjudicate the call before dispatch, composing project + tool scope. A call this route cannot await a decision on — class C (human sign-off), class D, or a class-B tripwire — is refused with `422 TOOL_DISPATCH_FAILED`, whose `meta` carries the `tool_id` and the `outcome`. A `pipeline` tool is adjudicated before its first step runs, and every step is adjudicated as the call of that tool it is.
3740
3755
  *
3741
3756
  */
3742
3757
  static callTool(options) {
@@ -3854,7 +3869,8 @@ var Triggers = class {
3854
3869
  /**
3855
3870
  * Update a trigger
3856
3871
  *
3857
- * Updates an existing trigger's configuration. The type is immutable.
3872
+ * 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.
3873
+ *
3858
3874
  */
3859
3875
  static updateTrigger(options) {
3860
3876
  return (options.client ?? client).patch({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soat/sdk",
3
- "version": "0.43.0",
3
+ "version": "0.45.0",
4
4
  "description": "TypeScript SDK for SOAT — open-source infrastructure for production-ready AI agents.",
5
5
  "keywords": [
6
6
  "ai-agents",