diff --git a/CHANGELOG.md b/CHANGELOG.md index c0a9441..224e865 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,28 @@ existing `0.1.0` release; earlier development prereleases are not listed. ## [Unreleased] +### Added + +- Add typed Forward Session budgets across create/update responses and events, including omission, explicit null clearing and decimal-string limits. +- Add Forward Session `config.model` overrides and model `speed` configuration, plus optional approval evaluation details, Outcome/status event fields and cumulative top-level Credits on `session.usage`. +- Add `startup_script` to Forward/Managed Environment models and Managed cloud/self-hosted parameters. It runs on sandbox start/resume; the external worker controls self-hosted execution. +- Add Managed Memory `version`, version `redacted`, and Vault creation-response `credentials` fields. Vault creation still does not accept credentials in its request. + +### Fixed + +- Decode Forward `evaluated_permission` through a string declaration and make event-specific payload fields optional instead of requiring fields from every event variant. +- Align Managed Thread/coordinator exported model helper types with string effort and context windows. Add Memory version `updated`, retaining `modified` through a deprecated compatibility type. + +### Breaking changes + +- Forward `SessionEvent.evaluated_permission` is now `string | undefined`, and event-specific fields may be absent. The two Managed nested-model helper types now use string effort. + +### Migration + +- Compare `event.evaluated_permission` directly to `"allow"`, `"ask"` or `"deny"`; automatic approval details are under `event.evaluation?.evaluated_permission`. Check optional event fields before reading them. +- Omit `budget` to keep the default/current limit; pass `null` to clear it. Omit the model on create to inherit; update `config.model` to `null` to restore inheritance. +- Use the new `updated` Memory operation for current responses. Legacy Managed nested-model `speed` remains deprecated. Treat `session.usage` as cumulative snapshots rather than adding successive events. + ### Changed - Remove resource-specific sections and inventories from the README to keep it focused on SDK setup and shared client behavior. diff --git a/README.md b/README.md index 3449193..ee4601e 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,22 @@ const params: SessionCreateParams = { identity_id: 'identity_id', template_id: ' All fields keep the snake_case naming used on the wire. Unknown fields are preserved when decoding, so a server-side addition reaches you before the types catch up. On the way out `undefined` is omitted, while `null`, `false`, empty strings and empty arrays are sent as-is. +## Environment startup scripts + +Both Forward and Managed accept `config.startup_script`. For cloud environments, +it runs after `setup_script` on the first sandbox start and again on every resume, +before the first tool call. The server enforces a 64 KB limit and a 5-minute +timeout. Scripts must exit; start long-lived services in the background and wait +for readiness when needed. + +Failure emits a `session.error` event whose `error.type` is +`environment_startup_failed_error`; the session and sandbox remain usable. +The script is not retried during the same start. For self-hosted environments, +the API stores and returns the script; execution depends on the external worker. +See the official [Forward](https://docs.qoder.com/cloud-agents/api/forward/environments/schemas#environment-startup-script) +and [Managed](https://docs.qoder.com/cloud-agents/api/environments/schemas#environment-startup-script) +contracts. + ## Streaming Streaming responses are consumed incrementally. Close the stream when finished and handle interruption explicitly; closing a local stream does not cancel server-side work. diff --git a/docs/api/forward/README.md b/docs/api/forward/README.md index d09f395..dc57bbf 100644 --- a/docs/api/forward/README.md +++ b/docs/api/forward/README.md @@ -196,6 +196,7 @@ - [ServiceAccountTokenRevokeResponse](interfaces/ServiceAccountTokenRevokeResponse.md) - [Session](interfaces/Session.md) - [SessionArchiveParams](interfaces/SessionArchiveParams.md) +- [SessionBudget](interfaces/SessionBudget.md) - [SessionCancelParams](interfaces/SessionCancelParams.md) - [SessionConfig](interfaces/SessionConfig.md) - [SessionEvent](interfaces/SessionEvent.md) @@ -248,6 +249,8 @@ - [TemplateUpdateParams](interfaces/TemplateUpdateParams.md) - [TemplateUsage](interfaces/TemplateUsage.md) - [Tool](interfaces/Tool.md) +- [ToolApprovalDecision](interfaces/ToolApprovalDecision.md) +- [ToolApprovalEvaluation](interfaces/ToolApprovalEvaluation.md) - [ToolConfig](interfaces/ToolConfig.md) - [ToolConfigParam](interfaces/ToolConfigParam.md) - [ToolOverride](interfaces/ToolOverride.md) diff --git a/docs/api/forward/interfaces/EnvironmentConfig.md b/docs/api/forward/interfaces/EnvironmentConfig.md index 06a32e7..a4e6335 100644 --- a/docs/api/forward/interfaces/EnvironmentConfig.md +++ b/docs/api/forward/interfaces/EnvironmentConfig.md @@ -26,6 +26,14 @@ Additional fields are preserved verbatim by the SDK. *** +### startup\_script? + +> `optional` **startup\_script?**: `string` + +Runs on sandbox start/resume; self-hosted execution depends on the worker. + +*** + ### type > **type**: `string` diff --git a/docs/api/forward/interfaces/ModelConfigObject.md b/docs/api/forward/interfaces/ModelConfigObject.md index 0a7f44b..b9e48bb 100644 --- a/docs/api/forward/interfaces/ModelConfigObject.md +++ b/docs/api/forward/interfaces/ModelConfigObject.md @@ -14,18 +14,26 @@ Additional fields are preserved verbatim by the SDK. ## Properties -### context\_window +### context\_window? -> **context\_window**: `number` +> `optional` **context\_window?**: `number` *** -### effort +### effort? -> **effort**: `string` +> `optional` **effort?**: `string` *** ### id > **id**: `string` + +*** + +### speed? + +> `optional` **speed?**: `string` + +Inference speed; consult the model capabilities. diff --git a/docs/api/forward/interfaces/ModelConfigParam.md b/docs/api/forward/interfaces/ModelConfigParam.md index 7cf164d..11ec917 100644 --- a/docs/api/forward/interfaces/ModelConfigParam.md +++ b/docs/api/forward/interfaces/ModelConfigParam.md @@ -29,3 +29,11 @@ Additional fields are preserved verbatim by the SDK. ### id > **id**: `string` + +*** + +### speed? + +> `optional` **speed?**: `string` \| `null` + +Inference speed: standard or high. diff --git a/docs/api/forward/interfaces/Session.md b/docs/api/forward/interfaces/Session.md index ab01677..f4fd516 100644 --- a/docs/api/forward/interfaces/Session.md +++ b/docs/api/forward/interfaces/Session.md @@ -20,6 +20,12 @@ Additional fields are preserved verbatim by the SDK. *** +### budget? + +> `optional` **budget?**: [`SessionBudget`](SessionBudget.md) \| `null` + +*** + ### config > **config**: [`SessionConfig`](SessionConfig.md) diff --git a/docs/api/forward/interfaces/SessionBudget.md b/docs/api/forward/interfaces/SessionBudget.md new file mode 100644 index 0000000..e083a5e --- /dev/null +++ b/docs/api/forward/interfaces/SessionBudget.md @@ -0,0 +1,27 @@ +[**qca-sdk**](../../README.md) + +*** + +[qca-sdk](../../README.md) / [forward](../README.md) / SessionBudget + +# Interface: SessionBudget + +Cumulative model and sandbox Credits limit. An active turn may finish after the limit. + +## Indexable + +> \[`key`: `string`\]: `unknown` + +## Properties + +### max\_credit\_cost + +> **max\_credit\_cost**: `string` + +Positive decimal string with at most 12 integer and 2 fractional digits. + +*** + +### type + +> **type**: `"limit"` diff --git a/docs/api/forward/interfaces/SessionConfig.md b/docs/api/forward/interfaces/SessionConfig.md index 3f24978..d68a816 100644 --- a/docs/api/forward/interfaces/SessionConfig.md +++ b/docs/api/forward/interfaces/SessionConfig.md @@ -17,3 +17,9 @@ Additional fields are preserved verbatim by the SDK. ### environment\_variables > **environment\_variables**: `Record`\<`string`, `string`\> + +*** + +### model? + +> `optional` **model?**: [`ModelConfig`](../type-aliases/ModelConfig.md) diff --git a/docs/api/forward/interfaces/SessionEvent.md b/docs/api/forward/interfaces/SessionEvent.md index c9c563c..477d700 100644 --- a/docs/api/forward/interfaces/SessionEvent.md +++ b/docs/api/forward/interfaces/SessionEvent.md @@ -14,81 +14,101 @@ Additional fields are preserved verbatim by the SDK. ## Properties -### agent +### agent? -> **agent**: `Record`\<`string`, `unknown`\> +> `optional` **agent?**: `Record`\<`string`, `unknown`\> *** -### content +### budget? -> **content**: `unknown` +> `optional` **budget?**: [`SessionBudget`](SessionBudget.md) \| `null` + +Absent means unchanged; null means unlimited. + +*** + +### content? + +> `optional` **content?**: `unknown` *** -### content\_block +### content\_block? -> **content\_block**: `unknown` +> `optional` **content\_block?**: `unknown` *** -### content\_type +### content\_type? -> **content\_type**: `string` +> `optional` **content\_type?**: `string` *** -### custom\_tool\_use\_id +### custom\_tool\_use\_id? -> **custom\_tool\_use\_id**: `string` +> `optional` **custom\_tool\_use\_id?**: `string` *** -### delta +### delta? -> **delta**: `unknown` +> `optional` **delta?**: `unknown` *** -### deny\_message +### deny\_message? -> **deny\_message**: `string` +> `optional` **deny\_message?**: `string` *** -### description +### description? -> **description**: `string` +> `optional` **description?**: `string` *** -### error +### error? -> **error**: `Record`\<`string`, `unknown`\> +> `optional` **error?**: `Record`\<`string`, `unknown`\> *** -### evaluated\_permission +### evaluated\_permission? -> **evaluated\_permission**: `Record`\<`string`, `unknown`\> +> `optional` **evaluated\_permission?**: `string` *** -### event +### evaluation? -> **event**: `unknown` +> `optional` **evaluation?**: [`ToolApprovalEvaluation`](ToolApprovalEvaluation.md) *** -### event\_id +### event? -> **event\_id**: `string` +> `optional` **event?**: `unknown` *** -### file\_id +### event\_id? -> **file\_id**: `string` +> `optional` **event\_id?**: `string` + +*** + +### explanation? + +> `optional` **explanation?**: `string` \| `null` + +*** + +### file\_id? + +> `optional` **file\_id?**: `string` *** @@ -98,87 +118,107 @@ Additional fields are preserved verbatim by the SDK. *** -### index +### index? + +> `optional` **index?**: `number` + +*** + +### input? + +> `optional` **input?**: `Record`\<`string`, `unknown`\> + +*** + +### is\_error? + +> `optional` **is\_error?**: `boolean` + +*** + +### iteration? -> **index**: `number` +> `optional` **iteration?**: `number` *** -### input +### max\_iterations? -> **input**: `Record`\<`string`, `unknown`\> +> `optional` **max\_iterations?**: `number` *** -### is\_error +### mcp\_server\_name? -> **is\_error**: `boolean` +> `optional` **mcp\_server\_name?**: `string` *** -### max\_iterations +### mcp\_tool\_use\_id? -> **max\_iterations**: `number` +> `optional` **mcp\_tool\_use\_id?**: `string` *** -### mcp\_server\_name +### message? -> **mcp\_server\_name**: `string` +> `optional` **message?**: `unknown` *** -### mcp\_tool\_use\_id +### message\_id? -> **mcp\_tool\_use\_id**: `string` +> `optional` **message\_id?**: `string` *** -### message +### metadata? -> **message**: `unknown` +> `optional` **metadata?**: `Record`\<`string`, `unknown`\> *** -### message\_id +### model\_credits? + +> `optional` **model\_credits?**: `number` -> **message\_id**: `string` +Cumulative Credits: replace with the latest values, never sum successive events. *** -### metadata +### model\_request\_start\_id? -> **metadata**: `Record`\<`string`, `unknown`\> +> `optional` **model\_request\_start\_id?**: `string` *** -### model\_request\_start\_id +### model\_usage? -> **model\_request\_start\_id**: `string` +> `optional` **model\_usage?**: `Record`\<`string`, `unknown`\> *** -### model\_usage +### name? -> **model\_usage**: `Record`\<`string`, `unknown`\> +> `optional` **name?**: `string` *** -### name +### original\_filename? -> **name**: `string` +> `optional` **original\_filename?**: `string` *** -### original\_filename +### outcome\_evaluation\_start\_id? -> **original\_filename**: `string` +> `optional` **outcome\_evaluation\_start\_id?**: `string` *** -### outcome\_id +### outcome\_id? -> **outcome\_id**: `string` +> `optional` **outcome\_id?**: `string` *** @@ -188,63 +228,81 @@ Additional fields are preserved verbatim by the SDK. *** -### result +### reason? + +> `optional` **reason?**: `string` + +*** + +### result? + +> `optional` **result?**: `string` + +*** + +### rubric? + +> `optional` **rubric?**: [`OutcomeRubric`](../type-aliases/OutcomeRubric.md) + +*** + +### sandbox\_runtime\_credits? -> **result**: `string` +> `optional` **sandbox\_runtime\_credits?**: `number` *** -### rubric +### session\_id? -> **rubric**: [`OutcomeRubric`](../type-aliases/OutcomeRubric.md) +> `optional` **session\_id?**: `string` *** -### session\_id +### session\_thread\_id? -> **session\_id**: `string` +> `optional` **session\_thread\_id?**: `string` *** -### session\_thread\_id +### size? -> **session\_thread\_id**: `string` +> `optional` **size?**: `number` *** -### size +### stop\_reason? -> **size**: `number` +> `optional` **stop\_reason?**: `Record`\<`string`, `unknown`\> *** -### stop\_reason +### text? -> **stop\_reason**: `Record`\<`string`, `unknown`\> +> `optional` **text?**: `string` *** -### text +### thinking? -> **text**: `string` +> `optional` **thinking?**: `string` *** -### thinking +### title? -> **thinking**: `string` +> `optional` **title?**: `string` *** -### title +### tool\_use\_id? -> **title**: `string` +> `optional` **tool\_use\_id?**: `string` *** -### tool\_use\_id +### total\_credits? -> **tool\_use\_id**: `string` +> `optional` **total\_credits?**: `number` *** @@ -254,6 +312,6 @@ Additional fields are preserved verbatim by the SDK. *** -### usage +### usage? -> **usage**: `Record`\<`string`, `unknown`\> +> `optional` **usage?**: `Record`\<`string`, `unknown`\> diff --git a/docs/api/forward/interfaces/SessionNewParams.md b/docs/api/forward/interfaces/SessionNewParams.md index d360c35..8efb393 100644 --- a/docs/api/forward/interfaces/SessionNewParams.md +++ b/docs/api/forward/interfaces/SessionNewParams.md @@ -14,6 +14,14 @@ Additional fields are preserved verbatim by the SDK. ## Properties +### budget? + +> `optional` **budget?**: [`SessionBudget`](SessionBudget.md) \| `null` + +Cumulative Credits limit; omit or null for unlimited. + +*** + ### config? > `optional` **config?**: [`SessionNewParamsConfigParam`](SessionNewParamsConfigParam.md) \| `null` diff --git a/docs/api/forward/interfaces/SessionNewParamsConfigParam.md b/docs/api/forward/interfaces/SessionNewParamsConfigParam.md index 45e6815..86d3f13 100644 --- a/docs/api/forward/interfaces/SessionNewParamsConfigParam.md +++ b/docs/api/forward/interfaces/SessionNewParamsConfigParam.md @@ -17,3 +17,11 @@ Additional fields are preserved verbatim by the SDK. ### environment\_variables? > `optional` **environment\_variables?**: `Record`\<`string`, `unknown`\> \| `null` + +*** + +### model? + +> `optional` **model?**: `string` \| [`ModelConfigParam`](ModelConfigParam.md) + +Omit to inherit. Null and an empty object are invalid on create. diff --git a/docs/api/forward/interfaces/SessionUpdateParams.md b/docs/api/forward/interfaces/SessionUpdateParams.md index 8d13921..755b90b 100644 --- a/docs/api/forward/interfaces/SessionUpdateParams.md +++ b/docs/api/forward/interfaces/SessionUpdateParams.md @@ -14,6 +14,14 @@ Additional fields are preserved verbatim by the SDK. ## Properties +### budget? + +> `optional` **budget?**: [`SessionBudget`](SessionBudget.md) \| `null` + +Omit to keep; null clears; an object replaces the entire budget. + +*** + ### config? > `optional` **config?**: [`SessionUpdateParamsConfigParam`](SessionUpdateParamsConfigParam.md) \| `null` diff --git a/docs/api/forward/interfaces/SessionUpdateParamsConfigParam.md b/docs/api/forward/interfaces/SessionUpdateParamsConfigParam.md index 43f24d2..97b08ea 100644 --- a/docs/api/forward/interfaces/SessionUpdateParamsConfigParam.md +++ b/docs/api/forward/interfaces/SessionUpdateParamsConfigParam.md @@ -17,3 +17,11 @@ Additional fields are preserved verbatim by the SDK. ### environment\_variables? > `optional` **environment\_variables?**: `Record`\<`string`, `unknown`\> \| `null` + +*** + +### model? + +> `optional` **model?**: `string` \| [`ModelConfigParam`](ModelConfigParam.md) \| `null` + +Omit to keep; null restores the inherited model. diff --git a/docs/api/forward/interfaces/ToolApprovalDecision.md b/docs/api/forward/interfaces/ToolApprovalDecision.md new file mode 100644 index 0000000..df8aa8b --- /dev/null +++ b/docs/api/forward/interfaces/ToolApprovalDecision.md @@ -0,0 +1,25 @@ +[**qca-sdk**](../../README.md) + +*** + +[qca-sdk](../../README.md) / [forward](../README.md) / ToolApprovalDecision + +# Interface: ToolApprovalDecision + +## Indexable + +> \[`key`: `string`\]: `unknown` + +## Properties + +### reason\_code? + +> `optional` **reason\_code?**: `string` + +indeterminate or high_risk, when provided by an automatic decision. + +*** + +### type + +> **type**: `string` diff --git a/docs/api/forward/interfaces/ToolApprovalEvaluation.md b/docs/api/forward/interfaces/ToolApprovalEvaluation.md new file mode 100644 index 0000000..215d28e --- /dev/null +++ b/docs/api/forward/interfaces/ToolApprovalEvaluation.md @@ -0,0 +1,25 @@ +[**qca-sdk**](../../README.md) + +*** + +[qca-sdk](../../README.md) / [forward](../README.md) / ToolApprovalEvaluation + +# Interface: ToolApprovalEvaluation + +Optional tool approval details; the event-level evaluated_permission is a string. + +## Indexable + +> \[`key`: `string`\]: `unknown` + +## Properties + +### evaluated\_permission? + +> `optional` **evaluated\_permission?**: [`ToolApprovalDecision`](ToolApprovalDecision.md) + +*** + +### type + +> **type**: `string` diff --git a/docs/api/managed/README.md b/docs/api/managed/README.md index 4b95165..cadfeab 100644 --- a/docs/api/managed/README.md +++ b/docs/api/managed/README.md @@ -629,6 +629,7 @@ - [HealthCheckWorkDataType](type-aliases/HealthCheckWorkDataType.md) - [ImageBlockParamSourceUnion](type-aliases/ImageBlockParamSourceUnion.md) - [ImageTransformationsParamOversizedImage](type-aliases/ImageTransformationsParamOversizedImage.md) +- [~~LegacyMemoryVersionOperation~~](type-aliases/LegacyMemoryVersionOperation.md) - [ManagedAgentsActorUnion](type-aliases/ManagedAgentsActorUnion.md) - [ManagedAgentsAdvisorParamsType](type-aliases/ManagedAgentsAdvisorParamsType.md) - [ManagedAgentsAdvisorType](type-aliases/ManagedAgentsAdvisorType.md) diff --git a/docs/api/managed/interfaces/CloudConfig.md b/docs/api/managed/interfaces/CloudConfig.md index 610f89e..29498de 100644 --- a/docs/api/managed/interfaces/CloudConfig.md +++ b/docs/api/managed/interfaces/CloudConfig.md @@ -32,6 +32,14 @@ Package manager configuration. *** +### startup\_script? + +> `optional` **startup\_script?**: `string` + +Runs on sandbox start/resume; self-hosted execution depends on the worker. + +*** + ### storage? > `optional` **storage?**: [`BucketStorage`](BucketStorage.md) diff --git a/docs/api/managed/interfaces/CloudConfigParams.md b/docs/api/managed/interfaces/CloudConfigParams.md index 252c9ba..a4585f3 100644 --- a/docs/api/managed/interfaces/CloudConfigParams.md +++ b/docs/api/managed/interfaces/CloudConfigParams.md @@ -41,6 +41,14 @@ Under `limited` networking, requires `networking.allow_package_managers` to be *** +### startup\_script? + +> `optional` **startup\_script?**: `string` \| `null` + +Runs on sandbox start/resume; self-hosted execution depends on the worker. + +*** + ### storage? > `optional` **storage?**: [`BucketStorageParam`](BucketStorageParam.md) diff --git a/docs/api/managed/interfaces/ManagedAgentsMemory.md b/docs/api/managed/interfaces/ManagedAgentsMemory.md index 9ea71d4..55c5c16 100644 --- a/docs/api/managed/interfaces/ManagedAgentsMemory.md +++ b/docs/api/managed/interfaces/ManagedAgentsMemory.md @@ -110,3 +110,11 @@ Any of "memory". > **updated\_at**: `string` A timestamp in RFC 3339 format + +*** + +### version? + +> `optional` **version?**: `number` + +Current memory version, starting at 1. diff --git a/docs/api/managed/interfaces/ManagedAgentsMemoryVersion.md b/docs/api/managed/interfaces/ManagedAgentsMemoryVersion.md index 8c2bbf4..17b6d8d 100644 --- a/docs/api/managed/interfaces/ManagedAgentsMemoryVersion.md +++ b/docs/api/managed/interfaces/ManagedAgentsMemoryVersion.md @@ -100,7 +100,7 @@ ID of the memory store this version belongs to (a `memstore_...` value). The kind of mutation a `memory_version` records. Every non-no-op mutation to a memory appends exactly one version row with one of these values. -Any of "created", "modified", "deleted". +Any of "created", "updated", "deleted". Legacy "modified" remains readable. *** @@ -113,6 +113,12 @@ is set. *** +### redacted? + +> `optional` **redacted?**: `boolean` + +*** + ### redacted\_at? > `optional` **redacted\_at?**: `string` \| `null` diff --git a/docs/api/managed/interfaces/ManagedAgentsVault.md b/docs/api/managed/interfaces/ManagedAgentsVault.md index 6a2d12a..38732b1 100644 --- a/docs/api/managed/interfaces/ManagedAgentsVault.md +++ b/docs/api/managed/interfaces/ManagedAgentsVault.md @@ -26,6 +26,14 @@ A timestamp in RFC 3339 format *** +### credentials? + +> `optional` **credentials?**: [`ManagedAgentsCredential`](ManagedAgentsCredential.md)[] + +Empty on creation; add credentials using the separate Credential API. + +*** + ### display\_name > **display\_name**: `string` diff --git a/docs/api/managed/interfaces/MemoryStoreMemoryVersionListParams.md b/docs/api/managed/interfaces/MemoryStoreMemoryVersionListParams.md index 2ead38b..d5a721d 100644 --- a/docs/api/managed/interfaces/MemoryStoreMemoryVersionListParams.md +++ b/docs/api/managed/interfaces/MemoryStoreMemoryVersionListParams.md @@ -62,7 +62,7 @@ Query parameter for memory_id Query parameter for operation -Any of "created", "modified", "deleted". +Any of "created", "updated", "deleted". Legacy "modified" remains readable. *** diff --git a/docs/api/managed/interfaces/SelfHostedConfig.md b/docs/api/managed/interfaces/SelfHostedConfig.md index f3e3b98..5e9663c 100644 --- a/docs/api/managed/interfaces/SelfHostedConfig.md +++ b/docs/api/managed/interfaces/SelfHostedConfig.md @@ -16,6 +16,14 @@ Configuration for self-hosted environments. *** +### startup\_script? + +> `optional` **startup\_script?**: `string` + +Runs on sandbox start/resume; self-hosted execution depends on the worker. + +*** + ### type? > `optional` **type?**: `"self_hosted"` diff --git a/docs/api/managed/interfaces/SelfHostedConfigParams.md b/docs/api/managed/interfaces/SelfHostedConfigParams.md index be571d0..3c36bcb 100644 --- a/docs/api/managed/interfaces/SelfHostedConfigParams.md +++ b/docs/api/managed/interfaces/SelfHostedConfigParams.md @@ -19,6 +19,14 @@ This struct has a constant value, construct it with *** +### startup\_script? + +> `optional` **startup\_script?**: `string` + +Runs on sandbox start/resume; self-hosted execution depends on the worker. + +*** + ### type? > `optional` **type?**: `"self_hosted"` \| `null` diff --git a/docs/api/managed/type-aliases/LegacyMemoryVersionOperation.md b/docs/api/managed/type-aliases/LegacyMemoryVersionOperation.md new file mode 100644 index 0000000..6fedfe2 --- /dev/null +++ b/docs/api/managed/type-aliases/LegacyMemoryVersionOperation.md @@ -0,0 +1,13 @@ +[**qca-sdk**](../../README.md) + +*** + +[qca-sdk](../../README.md) / [managed](../README.md) / LegacyMemoryVersionOperation + +# ~~Type Alias: LegacyMemoryVersionOperation~~ + +> **LegacyMemoryVersionOperation** = `"modified"` + +## Deprecated + +Current API responses use updated. diff --git a/docs/api/managed/type-aliases/ManagedAgentsMemoryVersionOperation.md b/docs/api/managed/type-aliases/ManagedAgentsMemoryVersionOperation.md index cb3aee7..c0dbd1a 100644 --- a/docs/api/managed/type-aliases/ManagedAgentsMemoryVersionOperation.md +++ b/docs/api/managed/type-aliases/ManagedAgentsMemoryVersionOperation.md @@ -6,7 +6,6 @@ # Type Alias: ManagedAgentsMemoryVersionOperation -> **ManagedAgentsMemoryVersionOperation** = `"created"` \| `"modified"` \| `"deleted"` +> **ManagedAgentsMemoryVersionOperation** = `"created"` \| `"updated"` \| `"deleted"` \| [`LegacyMemoryVersionOperation`](LegacyMemoryVersionOperation.md) -The kind of mutation a `memory_version` records. Every non-no-op mutation to a -memory appends exactly one version row with one of these values. +Current operations are created, updated and deleted; modified is legacy only. diff --git a/docs/api/managed/type-aliases/ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel.md b/docs/api/managed/type-aliases/ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel.md index 73d9860..1a4d706 100644 --- a/docs/api/managed/type-aliases/ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel.md +++ b/docs/api/managed/type-aliases/ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel.md @@ -6,7 +6,7 @@ # Type Alias: ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel -> **ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel** = `string` \| \{ `effort?`: [`ManagedAgentsModelConfigEffortUnion`](ManagedAgentsModelConfigEffortUnion.md); `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} +> **ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel** = `string` \| \{ `context_window?`: `number`; `effective_context_window?`: `number`; `effort?`: `string`; `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel is an implicit subunion of `ManagedAgentsSessionMultiagentCoordinatorAgentUnion`. @@ -21,11 +21,19 @@ access to the sub-properties of the union. ### Type Literal -\{ `effort?`: [`ManagedAgentsModelConfigEffortUnion`](ManagedAgentsModelConfigEffortUnion.md); `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} +\{ `context_window?`: `number`; `effective_context_window?`: `number`; `effort?`: `string`; `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} + +#### context\_window? + +> `optional` **context\_window?**: `number` + +#### effective\_context\_window? + +> `optional` **effective\_context\_window?**: `number` #### effort? -> `optional` **effort?**: [`ManagedAgentsModelConfigEffortUnion`](ManagedAgentsModelConfigEffortUnion.md) +> `optional` **effort?**: `string` This field is from variant `ManagedAgentsModelConfig`. @@ -41,8 +49,10 @@ This field is from variant `ManagedAgentsModelConfig`. This field is from variant `ManagedAgentsModelConfig`. -#### speed? +#### ~~speed?~~ > `optional` **speed?**: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md) -This field is from variant `ManagedAgentsModelConfig`. +##### Deprecated + +Managed model configuration no longer includes speed. diff --git a/docs/api/managed/type-aliases/ManagedAgentsSessionThreadAgentUnionModel.md b/docs/api/managed/type-aliases/ManagedAgentsSessionThreadAgentUnionModel.md index 2d92547..b7d96ac 100644 --- a/docs/api/managed/type-aliases/ManagedAgentsSessionThreadAgentUnionModel.md +++ b/docs/api/managed/type-aliases/ManagedAgentsSessionThreadAgentUnionModel.md @@ -6,7 +6,7 @@ # Type Alias: ManagedAgentsSessionThreadAgentUnionModel -> **ManagedAgentsSessionThreadAgentUnionModel** = `string` \| \{ `effort?`: [`ManagedAgentsModelConfigEffortUnion`](ManagedAgentsModelConfigEffortUnion.md); `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} +> **ManagedAgentsSessionThreadAgentUnionModel** = `string` \| \{ `context_window?`: `number`; `effective_context_window?`: `number`; `effort?`: `string`; `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} ## Union Members @@ -16,11 +16,19 @@ ### Type Literal -\{ `effort?`: [`ManagedAgentsModelConfigEffortUnion`](ManagedAgentsModelConfigEffortUnion.md); `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} +\{ `context_window?`: `number`; `effective_context_window?`: `number`; `effort?`: `string`; `id?`: [`ManagedAgentsModel`](ManagedAgentsModel.md); `inference_geo?`: `string`; `speed?`: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md); \} + +#### context\_window? + +> `optional` **context\_window?**: `number` + +#### effective\_context\_window? + +> `optional` **effective\_context\_window?**: `number` #### effort? -> `optional` **effort?**: [`ManagedAgentsModelConfigEffortUnion`](ManagedAgentsModelConfigEffortUnion.md) +> `optional` **effort?**: `string` This field is from variant `ManagedAgentsModelConfig`. @@ -36,8 +44,10 @@ This field is from variant `ManagedAgentsModelConfig`. This field is from variant `ManagedAgentsModelConfig`. -#### speed? +#### ~~speed?~~ > `optional` **speed?**: [`ManagedAgentsModelConfigSpeed`](ManagedAgentsModelConfigSpeed.md) -This field is from variant `ManagedAgentsModelConfig`. +##### Deprecated + +Managed model configuration no longer includes speed. diff --git a/src/forward/types.ts b/src/forward/types.ts index 58d31d3..c899067 100644 --- a/src/forward/types.ts +++ b/src/forward/types.ts @@ -986,6 +986,8 @@ export interface Environment { } export interface EnvironmentConfig { + /** Runs on sandbox start/resume; self-hosted execution depends on the worker. */ + startup_script?: string; setup_script?: string; type: string; packages: EnvironmentConfigPackages; @@ -1773,14 +1775,18 @@ export interface ModelListResponse { export type ModelConfig = string | ModelConfigObject; export interface ModelConfigObject { + /** Inference speed; consult the model capabilities. */ + speed?: string; id: string; - effort: string; - context_window: number; + effort?: string; + context_window?: number; /** Additional fields are preserved verbatim by the SDK. */ [key: string]: unknown; } export interface ModelConfigParam { + /** Inference speed: standard or high. */ + speed?: string | null; id: string; effort?: string | null; context_window?: number | null; @@ -2284,6 +2290,8 @@ export interface SessionListParams { } export interface SessionNewParams { + /** Cumulative Credits limit; omit or null for unlimited. */ + budget?: SessionBudget | null; /** * Forward Identity ID。 */ @@ -2311,12 +2319,16 @@ export interface SessionNewParams { } export interface SessionNewParamsConfigParam { + /** Omit to inherit. Null and an empty object are invalid on create. */ + model?: string | ModelConfigParam; environment_variables?: Record | null; /** Additional fields are preserved verbatim by the SDK. */ [key: string]: unknown; } export interface SessionUpdateParams { + /** Omit to keep; null clears; an object replaces the entire budget. */ + budget?: SessionBudget | null; /** * 新的 Session 标题。 */ @@ -2335,6 +2347,8 @@ export interface SessionUpdateParams { } export interface SessionUpdateParamsConfigParam { + /** Omit to keep; null restores the inherited model. */ + model?: string | ModelConfigParam | null; environment_variables?: Record | null; /** Additional fields are preserved verbatim by the SDK. */ [key: string]: unknown; @@ -2359,6 +2373,7 @@ export interface SessionCancelParams { } export interface Session { + budget?: SessionBudget | null; outcome_evaluations?: Array; /** * Session ID。 @@ -2413,6 +2428,7 @@ export interface SessionStats { } export interface SessionConfig { + model?: ModelConfig; environment_variables: Record; /** Additional fields are preserved verbatim by the SDK. */ [key: string]: unknown; @@ -2497,47 +2513,58 @@ export interface SessionEventStreamParams { } export interface SessionEvent { + evaluation?: ToolApprovalEvaluation; + /** Absent means unchanged; null means unlimited. */ + budget?: SessionBudget | null; + reason?: string; + iteration?: number; + explanation?: string | null; + outcome_evaluation_start_id?: string; + /** Cumulative Credits: replace with the latest values, never sum successive events. */ + model_credits?: number; + sandbox_runtime_credits?: number; + total_credits?: number; id: string; type: string; - session_id: string; - content: unknown; + session_id?: string; + content?: unknown; processed_at: string; - session_thread_id: string; - thinking: string; - text: string; - tool_use_id: string; - custom_tool_use_id: string; - mcp_tool_use_id: string; - name: string; - mcp_server_name: string; - input: Record; - is_error: boolean; - result: string; - deny_message: string; - description: string; - rubric: OutcomeRubric; - outcome_id: string; - max_iterations: number; - message_id: string; - message: unknown; - index: number; - content_block: unknown; - delta: unknown; - event: unknown; - event_id: string; - usage: Record; - stop_reason: Record; - error: Record; - evaluated_permission: Record; - file_id: string; - original_filename: string; - size: number; - content_type: string; - agent: Record; - metadata: Record; - title: string; - model_request_start_id: string; - model_usage: Record; + session_thread_id?: string; + thinking?: string; + text?: string; + tool_use_id?: string; + custom_tool_use_id?: string; + mcp_tool_use_id?: string; + name?: string; + mcp_server_name?: string; + input?: Record; + is_error?: boolean; + result?: string; + deny_message?: string; + description?: string; + rubric?: OutcomeRubric; + outcome_id?: string; + max_iterations?: number; + message_id?: string; + message?: unknown; + index?: number; + content_block?: unknown; + delta?: unknown; + event?: unknown; + event_id?: string; + usage?: Record; + stop_reason?: Record; + error?: Record; + evaluated_permission?: string; + file_id?: string; + original_filename?: string; + size?: number; + content_type?: string; + agent?: Record; + metadata?: Record; + title?: string; + model_request_start_id?: string; + model_usage?: Record; /** Additional fields are preserved verbatim by the SDK. */ [key: string]: unknown; } @@ -3632,3 +3659,25 @@ export interface ChannelPairingListParams { export type ChannelPairingUpdateParams = | { identity_id: string; template_id?: string } | { identity_id?: string; template_id: string }; + +/** Cumulative model and sandbox Credits limit. An active turn may finish after the limit. */ +export interface SessionBudget { + type: "limit"; + /** Positive decimal string with at most 12 integer and 2 fractional digits. */ + max_credit_cost: string; + [key: string]: unknown; +} + +/** Optional tool approval details; the event-level evaluated_permission is a string. */ +export interface ToolApprovalEvaluation { + type: string; + evaluated_permission?: ToolApprovalDecision; + [key: string]: unknown; +} + +export interface ToolApprovalDecision { + type: string; + /** indeterminate or high_risk, when provided by an automatic decision. */ + reason_code?: string; + [key: string]: unknown; +} diff --git a/src/managed/types.ts b/src/managed/types.ts index 665216f..aa933f0 100644 --- a/src/managed/types.ts +++ b/src/managed/types.ts @@ -3034,6 +3034,8 @@ export interface DreamCancelParams { * `cloud` environment configuration. */ export interface CloudConfig { + /** Runs on sandbox start/resume; self-hosted execution depends on the worker. */ + startup_script?: string; /** Requires betas: ["oss-bucket-2026-09-23"] when buckets remain configured. */ storage?: BucketStorage; setup_script?: string; @@ -3059,6 +3061,8 @@ export type CloudConfigNetworkingUnion = UnrestrictedNetwork | LimitedNetwork; * Fields default to null; on update, omitted fields preserve the existing value. */ export interface CloudConfigParams { + /** Runs on sandbox start/resume; self-hosted execution depends on the worker. */ + startup_script?: string | null; /** Requires betas: ["oss-bucket-2026-09-23"] when buckets remain configured. */ storage?: BucketStorageParam; setup_script?: string | null; @@ -3311,6 +3315,8 @@ export type PackagesParamsType = "packages"; * Configuration for self-hosted environments. */ export interface SelfHostedConfig { + /** Runs on sandbox start/resume; self-hosted execution depends on the worker. */ + startup_script?: string; setup_script?: string; /** * Environment type @@ -3325,6 +3331,8 @@ export interface SelfHostedConfig { * `NewSelfHostedConfigParams`. */ export interface SelfHostedConfigParams { + /** Runs on sandbox start/resume; self-hosted execution depends on the worker. */ + startup_script?: string; setup_script?: string; /** * Environment type @@ -4181,6 +4189,8 @@ export type ManagedAgentsDeletedMemoryType = "memory_deleted"; * via update. */ export interface ManagedAgentsMemory { + /** Current memory version, starting at 1. */ + version?: number; metadata?: Record; /** * Unique identifier for this memory (a `mem_...` value). Stable across renames; @@ -4462,6 +4472,7 @@ export type ManagedAgentsAPIActorType = "api_actor"; * `redacted_at`, not HTTP status. */ export interface ManagedAgentsMemoryVersion { + redacted?: boolean; /** * Unique identifier for this version (a `memver_...` value). */ @@ -4486,7 +4497,7 @@ export interface ManagedAgentsMemoryVersion { * The kind of mutation a `memory_version` records. Every non-no-op mutation to a * memory appends exactly one version row with one of these values. * - * Any of "created", "modified", "deleted". + * Any of "created", "updated", "deleted". Legacy "modified" remains readable. */ operation: ManagedAgentsMemoryVersionOperation; /** @@ -4542,7 +4553,10 @@ export type ManagedAgentsMemoryVersionType = "memory_version"; * The kind of mutation a `memory_version` records. Every non-no-op mutation to a * memory appends exactly one version row with one of these values. */ -export type ManagedAgentsMemoryVersionOperation = "created" | "modified" | "deleted"; +/** Current operations are created, updated and deleted; modified is legacy only. */ +export type ManagedAgentsMemoryVersionOperation = "created" | "updated" | "deleted" | LegacyMemoryVersionOperation; +/** @deprecated Current API responses use updated. */ +export type LegacyMemoryVersionOperation = "modified"; /** * Attribution for a write made by a workload authenticated as a service account, @@ -4643,7 +4657,7 @@ export interface MemoryStoreMemoryVersionListParams { /** * Query parameter for operation * - * Any of "created", "modified", "deleted". + * Any of "created", "updated", "deleted". Legacy "modified" remains readable. */ operation?: ManagedAgentsMemoryVersionOperation; /** @@ -6953,7 +6967,9 @@ export type ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel = string | /** * This field is from variant `ManagedAgentsModelConfig`. */ - effort?: ManagedAgentsModelConfigEffortUnion; + effort?: string; + context_window?: number; + effective_context_window?: number; /** * This field is from variant `ManagedAgentsModelConfig`. */ @@ -6961,6 +6977,7 @@ export type ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel = string | /** * This field is from variant `ManagedAgentsModelConfig`. */ + /** @deprecated Managed model configuration no longer includes speed. */ speed?: ManagedAgentsModelConfigSpeed; }; @@ -10112,7 +10129,9 @@ export type ManagedAgentsSessionThreadAgentUnionModel = string | { /** * This field is from variant `ManagedAgentsModelConfig`. */ - effort?: ManagedAgentsModelConfigEffortUnion; + effort?: string; + context_window?: number; + effective_context_window?: number; /** * This field is from variant `ManagedAgentsModelConfig`. */ @@ -10120,6 +10139,7 @@ export type ManagedAgentsSessionThreadAgentUnionModel = string | { /** * This field is from variant `ManagedAgentsModelConfig`. */ + /** @deprecated Managed model configuration no longer includes speed. */ speed?: ManagedAgentsModelConfigSpeed; }; @@ -10624,6 +10644,8 @@ export type ManagedAgentsDeletedVaultType = "vault_deleted"; * A vault that stores credentials for use by agents during sessions. */ export interface ManagedAgentsVault { + /** Empty on creation; add credentials using the separate Credential API. */ + credentials?: Array; /** * Unique identifier for the vault. */ diff --git a/tests/documentation-alignment.test.mjs b/tests/documentation-alignment.test.mjs new file mode 100644 index 0000000..a9a8f38 --- /dev/null +++ b/tests/documentation-alignment.test.mjs @@ -0,0 +1,71 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { testClient, response } from './helpers.mjs'; + +// Official Forward Session and Managed Memory/Environment/Vault schemas, 2026-11-03. +for (const body of [ + {}, + { budget: null, config: { model: null } }, + { budget: { type: 'limit', max_credit_cost: '100.00' }, config: { model: 'ultimate' } }, + { config: { model: { id: 'ultimate', speed: 'high', effort: 'none', context_window: 200000 } } }, +]) test(`Forward budget/model update: ${JSON.stringify(body)}`, async () => { + const client = testClient('forward', async req => { + assert.deepEqual(await req.json(), body); + return response({ id: 's', ...body }); + }); + const session = await client.sessions.update('s', body); + assert.equal(Object.hasOwn(session, 'budget'), Object.hasOwn(body, 'budget')); + assert.deepEqual(session.budget, body.budget); + assert.deepEqual(session.config, body.config); +}); + +for (const budget of [undefined, null, { type: 'limit', max_credit_cost: '100.00' }]) { + test(`Forward create budget and metadata: ${JSON.stringify(budget)}`, async () => { + const metadata = { business: 'kept' }; + const config = { model: { id: 'ultimate', speed: 'high' } }; + const client = testClient('forward', async req => { + const body = await req.json(); + assert.deepEqual(body.budget, budget); + assert.deepEqual(body.config, config); + assert.equal(body.metadata.business, 'kept'); + assert.equal(body.metadata.__qca_sdk_created, 'true'); + return response(body); + }); + await client.sessions.create({ identity_id: 'idn', template_id: 'tmpl', budget, config, metadata }); + assert.deepEqual(metadata, { business: 'kept' }); + }); +} + +test('Forward history and both SSE routes retain approval, cumulative usage and budget states', async () => { + const events = [ + ...[['allow', 'always_allow'], ['ask', 'always_ask'], ['allow', 'auto'], ['ask', 'auto', 'indeterminate'], ['deny', 'auto', 'high_risk']].map(([decision, policy, reason], i) => ({ + id: `approval-${i}`, type: 'agent.tool_use', evaluated_permission: decision, + evaluation: { type: policy, ...(policy === 'auto' ? { evaluated_permission: { type: decision, ...(reason ? { reason_code: reason } : {}) } } : {}) }, + })), + { id: 'zero', type: 'session.usage', model_credits: 0, sandbox_runtime_credits: 0, total_credits: 0 }, + { id: 'usage', type: 'session.usage', model_credits: 0.68, sandbox_runtime_credits: 0.04, total_credits: 0.72 }, + { id: 'idle', type: 'session.status_idle', reason: 'outcome_evaluation' }, + { id: 'end', type: 'span.outcome_evaluation_end', iteration: 2, explanation: 'done', outcome_evaluation_start_id: 'start' }, + { id: 'clear', type: 'session.updated', budget: null }, + { id: 'set', type: 'session.updated', budget: { type: 'limit', max_credit_cost: '0.01' } }, + ]; + const client = testClient('forward', req => req.url.endsWith('/stream') + ? new Response(events.map(e => `id: ${e.id}\ndata: ${JSON.stringify(e)}\n\n`).join(''), { headers: { 'content-type': 'text/event-stream' } }) + : response({ data: events, has_more: false })); + assert.deepEqual((await client.sessions.events.list('s')).data, events); + for (const stream of [await client.sessions.events.streamEvents('s'), await client.sessions.threads.events.streamEvents('s', 't')]) { + const actual = []; for await (const event of stream) actual.push(event); + assert.deepEqual(actual, events); + } +}); + +for (const mode of ['forward', 'managed']) test(`${mode} startup script reaches create/update and response`, async () => { + const config = { type: 'cloud', startup_script: '#!/bin/sh\necho ready\n' }; + const client = testClient(mode, async req => { + const body = await req.json(); + assert.deepEqual(body.config, config); + return response({ id: 'env', config }); + }); + assert.deepEqual((await client.environments.create({ name: 'test', config })).config, config); + assert.deepEqual((await client.environments.update('env', { config })).config, config); +}); diff --git a/tests/types-official-alignment.ts b/tests/types-official-alignment.ts index 7fe08b9..f211b1c 100644 --- a/tests/types-official-alignment.ts +++ b/tests/types-official-alignment.ts @@ -24,3 +24,31 @@ const read: M.OSSBucketCredential = {type:'access_key',access_key_id:'masked'}; // @ts-expect-error Secrets are not part of the credential read view. const leaked: M.OSSBucketCredential = {type:'access_key',access_key_secret:'secret'}; void [overrides,clear,multi,forwardDream,pairing,emptyPairing,bucket,read,leaked]; + +// Official schemas retrieved 2026-11-03. These checks require declared types, +// since unknown-field preservation alone cannot ensure usable typed responses. +const forwardBudget: F.SessionBudget = {type:'limit',max_credit_cost:'100.00'}; +const sessionCreate: F.SessionCreateParams = {identity_id:'idn',template_id:'tmpl',budget:forwardBudget,config:{model:{id:'ultimate',speed:'high'}}}; +const sessionClear: F.SessionUpdateParams = {budget:null,config:{model:null}}; +const modelRead: F.ModelConfigObject = {id:'ultimate',speed:'high'}; +const speedRead: string | undefined = modelRead.speed; +// @ts-expect-error Budget amounts must be decimal strings. +const badBudget: F.SessionBudget = {type:'limit',max_credit_cost:100}; +// @ts-expect-error Null is only allowed when updating the Session model. +const badCreateModel: F.SessionNewParamsConfigParam = {model:null}; +const approval: F.SessionEvent = {id:'e',type:'agent.tool_use',processed_at:'2026-11-03T00:00:00Z',evaluated_permission:'deny',evaluation:{type:'auto',evaluated_permission:{type:'deny',reason_code:'high_risk'}}}; +const permission: string | undefined = approval.evaluated_permission; +const approvalReason: string | undefined = approval.evaluation?.evaluated_permission?.reason_code; +const usageEvent: F.SessionEvent = {id:'e',type:'session.usage',processed_at:'2026-11-03T00:00:00Z',model_credits:0.68,sandbox_runtime_credits:0.04,total_credits:0.72}; +const credits: number | undefined = usageEvent.total_credits; +const outcomeIteration: number | undefined = usageEvent.iteration; +const budgetEvent: F.SessionEvent = {...usageEvent,budget:null}; +const startupForward: Pick = {startup_script:'echo ready'}; +const startupManaged: M.CloudConfigParams = {type:'cloud',startup_script:'echo ready'}; +const startupSelfHosted: M.SelfHostedConfigParams = {type:'self_hosted',startup_script:'echo ready'}; +const nestedThreadModel: M.ManagedAgentsSessionThreadAgentUnionModel = {id:'ultimate',effort:'none',context_window:200000,effective_context_window:180000}; +const nestedCoordinatorModel: M.ManagedAgentsSessionMultiagentCoordinatorAgentUnionModel = nestedThreadModel; +const memoryVersion: Pick = {version:2}; +const redactedVersion: Pick = {operation:'updated',redacted:true}; +const vaultCredentials: Pick = {credentials:[]}; +void [forwardBudget,sessionCreate,sessionClear,modelRead,speedRead,badBudget,badCreateModel,approval,permission,approvalReason,usageEvent,credits,outcomeIteration,budgetEvent,startupForward,startupManaged,startupSelfHosted,nestedThreadModel,nestedCoordinatorModel,memoryVersion,redactedVersion,vaultCredentials];