diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 4e24fa517..614e7e5a8 100644
--- a/packages/opencode/src/session/index.ts
+++ b/packages/opencode/src/session/index.ts
@@ -552,167 +552,196 @@ export namespace Session {
],
}),
})
- for await (const value of result.fullStream) {
- l.info("part", {
- type: value.type,
- })
- switch (value.type) {
- case "start":
- break
+ try {
+ for await (const value of result.fullStream) {
+ l.info("part", {
+ type: value.type,
+ })
+ switch (value.type) {
+ case "start":
+ break
- case "tool-input-start":
- next.parts.push({
- type: "tool",
- tool: value.toolName,
- id: value.id,
- state: {
- status: "pending",
- },
- })
- Bus.publish(MessageV2.Event.PartUpdated, {
- part: next.parts[next.parts.length - 1],
- sessionID: next.sessionID,
- messageID: next.id,
- })
- break
-
- case "tool-input-delta":
- break
-
- case "tool-call": {
- const match = next.parts.find((p): p is MessageV2.ToolPart => p.type === "tool" && p.id === value.toolCallId)
- if (match) {
- match.state = {
- status: "running",
- input: value.input,
- time: {
- start: Date.now(),
+ case "tool-input-start":
+ next.parts.push({
+ type: "tool",
+ tool: value.toolName,
+ id: value.id,
+ state: {
+ status: "pending",
},
- }
+ })
Bus.publish(MessageV2.Event.PartUpdated, {
- part: match,
+ part: next.parts[next.parts.length - 1],
sessionID: next.sessionID,
messageID: next.id,
})
- }
- break
- }
- case "tool-result": {
- const match = next.parts.find((p): p is MessageV2.ToolPart => p.type === "tool" && p.id === value.toolCallId)
- if (match && match.state.status === "running") {
- match.state = {
- status: "completed",
- input: value.input,
- output: value.output.output,
- metadata: value.output.metadata,
- title: value.output.title,
- time: {
- start: match.state.time.start,
- end: Date.now(),
- },
- }
- Bus.publish(MessageV2.Event.PartUpdated, {
- part: match,
- sessionID: next.sessionID,
- messageID: next.id,
- })
- }
- break
- }
+ break
- case "tool-error": {
- const match = next.parts.find((p): p is MessageV2.ToolPart => p.type === "tool" && p.id === value.toolCallId)
- if (match && match.state.status === "running") {
- match.state = {
- status: "error",
- input: value.input,
- error: (value.error as any).toString(),
- time: {
- start: match.state.time.start,
- end: Date.now(),
- },
- }
- Bus.publish(MessageV2.Event.PartUpdated, {
- part: match,
- sessionID: next.sessionID,
- messageID: next.id,
- })
- }
- break
- }
+ case "tool-input-delta":
+ break
- case "error":
- const e = value.error
- log.error("", {
- error: e,
- })
- switch (true) {
- case MessageV2.OutputLengthError.isInstance(e):
- next.error = e
- break
- case LoadAPIKeyError.isInstance(e):
- next.error = new Provider.AuthError(
- {
- providerID: input.providerID,
- message: e.message,
+ case "tool-call": {
+ const match = next.parts.find(
+ (p): p is MessageV2.ToolPart => p.type === "tool" && p.id === value.toolCallId,
+ )
+ if (match) {
+ match.state = {
+ status: "running",
+ input: value.input,
+ time: {
+ start: Date.now(),
},
- { cause: e },
- ).toObject()
- break
- case e instanceof Error:
- next.error = new NamedError.Unknown({ message: e.toString() }, { cause: e }).toObject()
- break
- default:
- next.error = new NamedError.Unknown({ message: JSON.stringify(e) }, { cause: e })
+ }
+ Bus.publish(MessageV2.Event.PartUpdated, {
+ part: match,
+ sessionID: next.sessionID,
+ messageID: next.id,
+ })
+ }
+ break
}
- Bus.publish(Event.Error, {
- error: next.error,
- })
- break
-
- case "start-step":
- next.parts.push({
- type: "step-start",
- })
- break
-
- case "finish-step":
- const usage = getUsage(model.info, value.usage, value.providerMetadata)
- next.cost += usage.cost
- next.tokens = usage.tokens
- break
-
- case "text-start":
- text = {
- type: "text",
- text: "",
+ case "tool-result": {
+ const match = next.parts.find(
+ (p): p is MessageV2.ToolPart => p.type === "tool" && p.id === value.toolCallId,
+ )
+ if (match && match.state.status === "running") {
+ match.state = {
+ status: "completed",
+ input: value.input,
+ output: value.output.output,
+ metadata: value.output.metadata,
+ title: value.output.title,
+ time: {
+ start: match.state.time.start,
+ end: Date.now(),
+ },
+ }
+ Bus.publish(MessageV2.Event.PartUpdated, {
+ part: match,
+ sessionID: next.sessionID,
+ messageID: next.id,
+ })
+ }
+ break
}
- break
- case "text":
- if (text.text === "") next.parts.push(text)
- text.text += value.text
- break
+ case "tool-error": {
+ const match = next.parts.find(
+ (p): p is MessageV2.ToolPart => p.type === "tool" && p.id === value.toolCallId,
+ )
+ if (match && match.state.status === "running") {
+ match.state = {
+ status: "error",
+ input: value.input,
+ error: (value.error as any).toString(),
+ time: {
+ start: match.state.time.start,
+ end: Date.now(),
+ },
+ }
+ Bus.publish(MessageV2.Event.PartUpdated, {
+ part: match,
+ sessionID: next.sessionID,
+ messageID: next.id,
+ })
+ }
+ break
+ }
- case "text-end":
- Bus.publish(MessageV2.Event.PartUpdated, {
- part: text,
- sessionID: next.sessionID,
- messageID: next.id,
- })
- break
+ case "error":
+ throw value.error
- case "finish":
- next.time.completed = Date.now()
- break
+ case "start-step":
+ next.parts.push({
+ type: "step-start",
+ })
+ break
- default:
- l.info("unhandled", {
- ...value,
- })
- continue
+ case "finish-step":
+ const usage = getUsage(model.info, value.usage, value.providerMetadata)
+ next.cost += usage.cost
+ next.tokens = usage.tokens
+ break
+
+ case "text-start":
+ text = {
+ type: "text",
+ text: "",
+ }
+ break
+
+ case "text":
+ if (text.text === "") next.parts.push(text)
+ text.text += value.text
+ break
+
+ case "text-end":
+ Bus.publish(MessageV2.Event.PartUpdated, {
+ part: text,
+ sessionID: next.sessionID,
+ messageID: next.id,
+ })
+ break
+
+ case "finish":
+ next.time.completed = Date.now()
+ break
+
+ default:
+ l.info("unhandled", {
+ ...value,
+ })
+ continue
+ }
+ await updateMessage(next)
+ }
+ } catch (e) {
+ log.error("", {
+ error: e,
+ })
+ switch (true) {
+ case e instanceof DOMException && e.name === "AbortError":
+ next.error = new MessageV2.AbortedError(
+ { message: e.message },
+ {
+ cause: e,
+ },
+ ).toObject()
+ break
+ case MessageV2.OutputLengthError.isInstance(e):
+ next.error = e
+ break
+ case LoadAPIKeyError.isInstance(e):
+ next.error = new Provider.AuthError(
+ {
+ providerID: input.providerID,
+ message: e.message,
+ },
+ { cause: e },
+ ).toObject()
+ break
+ case e instanceof Error:
+ next.error = new NamedError.Unknown({ message: e.toString() }, { cause: e }).toObject()
+ break
+ default:
+ next.error = new NamedError.Unknown({ message: JSON.stringify(e) }, { cause: e })
+ }
+ Bus.publish(Event.Error, {
+ error: next.error,
+ })
+ }
+ for (const part of next.parts) {
+ if (part.type === "tool" && part.state.status !== "completed") {
+ part.state = {
+ status: "error",
+ error: "Tool execution aborted",
+ time: {
+ start: Date.now(),
+ end: Date.now(),
+ },
+ input: {},
+ }
}
- await updateMessage(next)
}
next.time.completed = Date.now()
await updateMessage(next)
diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts
index 2b93775ab..8b09e68e6 100644
--- a/packages/opencode/src/session/message-v2.ts
+++ b/packages/opencode/src/session/message-v2.ts
@@ -7,6 +7,7 @@ import { convertToModelMessages, type ModelMessage, type UIMessage } from "ai"
export namespace MessageV2 {
export const OutputLengthError = NamedError.create("MessageOutputLengthError", z.object({}))
+ export const AbortedError = NamedError.create("MessageAbortedError", z.object({}))
export const ToolStatePending = z
.object({
@@ -148,7 +149,12 @@ export namespace MessageV2 {
completed: z.number().optional(),
}),
error: z
- .discriminatedUnion("name", [Provider.AuthError.Schema, NamedError.Unknown.Schema, OutputLengthError.Schema])
+ .discriminatedUnion("name", [
+ Provider.AuthError.Schema,
+ NamedError.Unknown.Schema,
+ OutputLengthError.Schema,
+ AbortedError.Schema,
+ ])
.optional(),
system: z.string().array(),
modelID: z.string(),
diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go
index 26bee8714..6e9c26dfa 100644
--- a/packages/tui/internal/components/chat/messages.go
+++ b/packages/tui/internal/components/chat/messages.go
@@ -320,6 +320,8 @@ func (m *messagesComponent) renderView(width int) {
error = "Message output length exceeded"
case opencode.ProviderAuthError:
error = err.Data.Message
+ case opencode.MessageAbortedError:
+ error = "Request was aborted"
case opencode.UnknownError:
error = err.Data.Message
}
diff --git a/packages/tui/sdk/.github/workflows/ci.yml b/packages/tui/sdk/.github/workflows/ci.yml
index 0f5d45dc2..4bf1e907c 100644
--- a/packages/tui/sdk/.github/workflows/ci.yml
+++ b/packages/tui/sdk/.github/workflows/ci.yml
@@ -2,15 +2,15 @@ name: CI
on:
push:
branches-ignore:
- - "generated"
- - "codegen/**"
- - "integrated/**"
- - "stl-preview-head/**"
- - "stl-preview-base/**"
+ - 'generated'
+ - 'codegen/**'
+ - 'integrated/**'
+ - 'stl-preview-head/**'
+ - 'stl-preview-base/**'
pull_request:
branches-ignore:
- - "stl-preview-head/**"
- - "stl-preview-base/**"
+ - 'stl-preview-head/**'
+ - 'stl-preview-base/**'
jobs:
lint:
diff --git a/packages/tui/sdk/.release-please-manifest.json b/packages/tui/sdk/.release-please-manifest.json
index 332798e1b..c373724dc 100644
--- a/packages/tui/sdk/.release-please-manifest.json
+++ b/packages/tui/sdk/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
".": "0.1.0-alpha.8"
-}
+}
\ No newline at end of file
diff --git a/packages/tui/sdk/.stats.yml b/packages/tui/sdk/.stats.yml
index 068170cae..c8411903c 100644
--- a/packages/tui/sdk/.stats.yml
+++ b/packages/tui/sdk/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 20
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-15eeb028f79b9a065b4e54a6ea6a58631e9bd5004f97820f0c79d18e3f8bac84.yml
-openapi_spec_hash: 38c8bacb6c8e4c46852a3e81e3fb9fda
-config_hash: e03e9d1aad76081fa1163086e89f201b
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-4955370de3d0a21bb41c4e51257210b3284deb5bc3dbace6e7572de0d1635c9e.yml
+openapi_spec_hash: b7591d636977423cd7455aa02caa718f
+config_hash: de53ecf98e1038f2cc2fd273b582f082
diff --git a/packages/tui/sdk/CHANGELOG.md b/packages/tui/sdk/CHANGELOG.md
index fe25e6e8b..bc407fad9 100644
--- a/packages/tui/sdk/CHANGELOG.md
+++ b/packages/tui/sdk/CHANGELOG.md
@@ -6,7 +6,7 @@ Full Changelog: [v0.1.0-alpha.7...v0.1.0-alpha.8](https://github.com/sst/opencod
### Features
-- **api:** update via SDK Studio ([651e937](https://github.com/sst/opencode-sdk-go/commit/651e937c334e1caba3b968e6cac865c219879519))
+* **api:** update via SDK Studio ([651e937](https://github.com/sst/opencode-sdk-go/commit/651e937c334e1caba3b968e6cac865c219879519))
## 0.1.0-alpha.7 (2025-06-30)
@@ -14,12 +14,13 @@ Full Changelog: [v0.1.0-alpha.6...v0.1.0-alpha.7](https://github.com/sst/opencod
### Features
-- **api:** update via SDK Studio ([13550a5](https://github.com/sst/opencode-sdk-go/commit/13550a5c65d77325e945ed99fe0799cd1107b775))
-- **api:** update via SDK Studio ([7b73730](https://github.com/sst/opencode-sdk-go/commit/7b73730c7fa62ba966dda3541c3e97b49be8d2bf))
+* **api:** update via SDK Studio ([13550a5](https://github.com/sst/opencode-sdk-go/commit/13550a5c65d77325e945ed99fe0799cd1107b775))
+* **api:** update via SDK Studio ([7b73730](https://github.com/sst/opencode-sdk-go/commit/7b73730c7fa62ba966dda3541c3e97b49be8d2bf))
+
### Chores
-- **ci:** only run for pushes and fork pull requests ([bea59b8](https://github.com/sst/opencode-sdk-go/commit/bea59b886800ef555f89c47a9256d6392ed2e53d))
+* **ci:** only run for pushes and fork pull requests ([bea59b8](https://github.com/sst/opencode-sdk-go/commit/bea59b886800ef555f89c47a9256d6392ed2e53d))
## 0.1.0-alpha.6 (2025-06-28)
@@ -27,7 +28,7 @@ Full Changelog: [v0.1.0-alpha.5...v0.1.0-alpha.6](https://github.com/sst/opencod
### Bug Fixes
-- don't try to deserialize as json when ResponseBodyInto is []byte ([5988d04](https://github.com/sst/opencode-sdk-go/commit/5988d04839cb78b6613057280b91b72a60fef33d))
+* don't try to deserialize as json when ResponseBodyInto is []byte ([5988d04](https://github.com/sst/opencode-sdk-go/commit/5988d04839cb78b6613057280b91b72a60fef33d))
## 0.1.0-alpha.5 (2025-06-27)
@@ -35,7 +36,7 @@ Full Changelog: [v0.1.0-alpha.4...v0.1.0-alpha.5](https://github.com/sst/opencod
### Features
-- **api:** update via SDK Studio ([9e39a59](https://github.com/sst/opencode-sdk-go/commit/9e39a59b3d5d1bd5e64633732521fb28362cc70e))
+* **api:** update via SDK Studio ([9e39a59](https://github.com/sst/opencode-sdk-go/commit/9e39a59b3d5d1bd5e64633732521fb28362cc70e))
## 0.1.0-alpha.4 (2025-06-27)
@@ -43,7 +44,7 @@ Full Changelog: [v0.1.0-alpha.3...v0.1.0-alpha.4](https://github.com/sst/opencod
### Features
-- **api:** update via SDK Studio ([9609d1b](https://github.com/sst/opencode-sdk-go/commit/9609d1b1db7806d00cb846c9914cb4935cdedf52))
+* **api:** update via SDK Studio ([9609d1b](https://github.com/sst/opencode-sdk-go/commit/9609d1b1db7806d00cb846c9914cb4935cdedf52))
## 0.1.0-alpha.3 (2025-06-27)
@@ -51,7 +52,7 @@ Full Changelog: [v0.1.0-alpha.2...v0.1.0-alpha.3](https://github.com/sst/opencod
### Features
-- **api:** update via SDK Studio ([57f3230](https://github.com/sst/opencode-sdk-go/commit/57f32309023cc1f0f20c20d02a3907e390a71f61))
+* **api:** update via SDK Studio ([57f3230](https://github.com/sst/opencode-sdk-go/commit/57f32309023cc1f0f20c20d02a3907e390a71f61))
## 0.1.0-alpha.2 (2025-06-27)
@@ -59,7 +60,7 @@ Full Changelog: [v0.1.0-alpha.1...v0.1.0-alpha.2](https://github.com/sst/opencod
### Features
-- **api:** update via SDK Studio ([a766f1c](https://github.com/sst/opencode-sdk-go/commit/a766f1c54f02bbc1380151b0e22d97cc2c5892e6))
+* **api:** update via SDK Studio ([a766f1c](https://github.com/sst/opencode-sdk-go/commit/a766f1c54f02bbc1380151b0e22d97cc2c5892e6))
## 0.1.0-alpha.1 (2025-06-27)
@@ -67,6 +68,6 @@ Full Changelog: [v0.0.1-alpha.0...v0.1.0-alpha.1](https://github.com/sst/opencod
### Features
-- **api:** update via SDK Studio ([27b7376](https://github.com/sst/opencode-sdk-go/commit/27b7376310466ee17a63f2104f546b53a2b8361a))
-- **api:** update via SDK Studio ([0a73e04](https://github.com/sst/opencode-sdk-go/commit/0a73e04c23c90b2061611edaa8fd6282dc0ce397))
-- **api:** update via SDK Studio ([9b7883a](https://github.com/sst/opencode-sdk-go/commit/9b7883a144eeac526d9d04538e0876a9d18bb844))
+* **api:** update via SDK Studio ([27b7376](https://github.com/sst/opencode-sdk-go/commit/27b7376310466ee17a63f2104f546b53a2b8361a))
+* **api:** update via SDK Studio ([0a73e04](https://github.com/sst/opencode-sdk-go/commit/0a73e04c23c90b2061611edaa8fd6282dc0ce397))
+* **api:** update via SDK Studio ([9b7883a](https://github.com/sst/opencode-sdk-go/commit/9b7883a144eeac526d9d04538e0876a9d18bb844))
diff --git a/packages/tui/sdk/aliases.go b/packages/tui/sdk/aliases.go
index 84dd614a7..6ab36d04c 100644
--- a/packages/tui/sdk/aliases.go
+++ b/packages/tui/sdk/aliases.go
@@ -9,6 +9,15 @@ import (
type Error = apierror.Error
+// This is an alias to an internal type.
+type MessageAbortedError = shared.MessageAbortedError
+
+// This is an alias to an internal type.
+type MessageAbortedErrorName = shared.MessageAbortedErrorName
+
+// This is an alias to an internal value.
+const MessageAbortedErrorNameMessageAbortedError = shared.MessageAbortedErrorNameMessageAbortedError
+
// This is an alias to an internal type.
type ProviderAuthError = shared.ProviderAuthError
diff --git a/packages/tui/sdk/api.md b/packages/tui/sdk/api.md
index b8f3769df..967b8afe3 100644
--- a/packages/tui/sdk/api.md
+++ b/packages/tui/sdk/api.md
@@ -1,5 +1,6 @@
# Shared Response Types
+- shared.MessageAbortedError
- shared.ProviderAuthError
- shared.UnknownError
diff --git a/packages/tui/sdk/event.go b/packages/tui/sdk/event.go
index 48eb129f5..89da8a078 100644
--- a/packages/tui/sdk/event.go
+++ b/packages/tui/sdk/event.go
@@ -52,10 +52,10 @@ type EventListResponse struct {
// [EventListResponseEventPermissionUpdatedProperties],
// [EventListResponseEventFileEditedProperties],
// [EventListResponseEventInstallationUpdatedProperties],
- // [EventListResponseEventStorageWriteProperties],
// [EventListResponseEventMessageUpdatedProperties],
// [EventListResponseEventMessageRemovedProperties],
// [EventListResponseEventMessagePartUpdatedProperties],
+ // [EventListResponseEventStorageWriteProperties],
// [EventListResponseEventSessionUpdatedProperties],
// [EventListResponseEventSessionDeletedProperties],
// [EventListResponseEventSessionIdleProperties],
@@ -96,11 +96,11 @@ func (r *EventListResponse) UnmarshalJSON(data []byte) (err error) {
// [EventListResponseEventLspClientDiagnostics],
// [EventListResponseEventPermissionUpdated], [EventListResponseEventFileEdited],
// [EventListResponseEventInstallationUpdated],
-// [EventListResponseEventStorageWrite], [EventListResponseEventMessageUpdated],
-// [EventListResponseEventMessageRemoved],
+// [EventListResponseEventMessageUpdated], [EventListResponseEventMessageRemoved],
// [EventListResponseEventMessagePartUpdated],
-// [EventListResponseEventSessionUpdated], [EventListResponseEventSessionDeleted],
-// [EventListResponseEventSessionIdle], [EventListResponseEventSessionError],
+// [EventListResponseEventStorageWrite], [EventListResponseEventSessionUpdated],
+// [EventListResponseEventSessionDeleted], [EventListResponseEventSessionIdle],
+// [EventListResponseEventSessionError],
// [EventListResponseEventFileWatcherUpdated].
func (r EventListResponse) AsUnion() EventListResponseUnion {
return r.union
@@ -109,11 +109,11 @@ func (r EventListResponse) AsUnion() EventListResponseUnion {
// Union satisfied by [EventListResponseEventLspClientDiagnostics],
// [EventListResponseEventPermissionUpdated], [EventListResponseEventFileEdited],
// [EventListResponseEventInstallationUpdated],
-// [EventListResponseEventStorageWrite], [EventListResponseEventMessageUpdated],
-// [EventListResponseEventMessageRemoved],
+// [EventListResponseEventMessageUpdated], [EventListResponseEventMessageRemoved],
// [EventListResponseEventMessagePartUpdated],
-// [EventListResponseEventSessionUpdated], [EventListResponseEventSessionDeleted],
-// [EventListResponseEventSessionIdle], [EventListResponseEventSessionError] or
+// [EventListResponseEventStorageWrite], [EventListResponseEventSessionUpdated],
+// [EventListResponseEventSessionDeleted], [EventListResponseEventSessionIdle],
+// [EventListResponseEventSessionError] or
// [EventListResponseEventFileWatcherUpdated].
type EventListResponseUnion interface {
implementsEventListResponse()
@@ -143,11 +143,6 @@ func init() {
Type: reflect.TypeOf(EventListResponseEventInstallationUpdated{}),
DiscriminatorValue: "installation.updated",
},
- apijson.UnionVariant{
- TypeFilter: gjson.JSON,
- Type: reflect.TypeOf(EventListResponseEventStorageWrite{}),
- DiscriminatorValue: "storage.write",
- },
apijson.UnionVariant{
TypeFilter: gjson.JSON,
Type: reflect.TypeOf(EventListResponseEventMessageUpdated{}),
@@ -163,6 +158,11 @@ func init() {
Type: reflect.TypeOf(EventListResponseEventMessagePartUpdated{}),
DiscriminatorValue: "message.part.updated",
},
+ apijson.UnionVariant{
+ TypeFilter: gjson.JSON,
+ Type: reflect.TypeOf(EventListResponseEventStorageWrite{}),
+ DiscriminatorValue: "storage.write",
+ },
apijson.UnionVariant{
TypeFilter: gjson.JSON,
Type: reflect.TypeOf(EventListResponseEventSessionUpdated{}),
@@ -462,68 +462,6 @@ func (r EventListResponseEventInstallationUpdatedType) IsKnown() bool {
return false
}
-type EventListResponseEventStorageWrite struct {
- Properties EventListResponseEventStorageWriteProperties `json:"properties,required"`
- Type EventListResponseEventStorageWriteType `json:"type,required"`
- JSON eventListResponseEventStorageWriteJSON `json:"-"`
-}
-
-// eventListResponseEventStorageWriteJSON contains the JSON metadata for the struct
-// [EventListResponseEventStorageWrite]
-type eventListResponseEventStorageWriteJSON struct {
- Properties apijson.Field
- Type apijson.Field
- raw string
- ExtraFields map[string]apijson.Field
-}
-
-func (r *EventListResponseEventStorageWrite) UnmarshalJSON(data []byte) (err error) {
- return apijson.UnmarshalRoot(data, r)
-}
-
-func (r eventListResponseEventStorageWriteJSON) RawJSON() string {
- return r.raw
-}
-
-func (r EventListResponseEventStorageWrite) implementsEventListResponse() {}
-
-type EventListResponseEventStorageWriteProperties struct {
- Key string `json:"key,required"`
- Content interface{} `json:"content"`
- JSON eventListResponseEventStorageWritePropertiesJSON `json:"-"`
-}
-
-// eventListResponseEventStorageWritePropertiesJSON contains the JSON metadata for
-// the struct [EventListResponseEventStorageWriteProperties]
-type eventListResponseEventStorageWritePropertiesJSON struct {
- Key apijson.Field
- Content apijson.Field
- raw string
- ExtraFields map[string]apijson.Field
-}
-
-func (r *EventListResponseEventStorageWriteProperties) UnmarshalJSON(data []byte) (err error) {
- return apijson.UnmarshalRoot(data, r)
-}
-
-func (r eventListResponseEventStorageWritePropertiesJSON) RawJSON() string {
- return r.raw
-}
-
-type EventListResponseEventStorageWriteType string
-
-const (
- EventListResponseEventStorageWriteTypeStorageWrite EventListResponseEventStorageWriteType = "storage.write"
-)
-
-func (r EventListResponseEventStorageWriteType) IsKnown() bool {
- switch r {
- case EventListResponseEventStorageWriteTypeStorageWrite:
- return true
- }
- return false
-}
-
type EventListResponseEventMessageUpdated struct {
Properties EventListResponseEventMessageUpdatedProperties `json:"properties,required"`
Type EventListResponseEventMessageUpdatedType `json:"type,required"`
@@ -710,6 +648,68 @@ func (r EventListResponseEventMessagePartUpdatedType) IsKnown() bool {
return false
}
+type EventListResponseEventStorageWrite struct {
+ Properties EventListResponseEventStorageWriteProperties `json:"properties,required"`
+ Type EventListResponseEventStorageWriteType `json:"type,required"`
+ JSON eventListResponseEventStorageWriteJSON `json:"-"`
+}
+
+// eventListResponseEventStorageWriteJSON contains the JSON metadata for the struct
+// [EventListResponseEventStorageWrite]
+type eventListResponseEventStorageWriteJSON struct {
+ Properties apijson.Field
+ Type apijson.Field
+ raw string
+ ExtraFields map[string]apijson.Field
+}
+
+func (r *EventListResponseEventStorageWrite) UnmarshalJSON(data []byte) (err error) {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func (r eventListResponseEventStorageWriteJSON) RawJSON() string {
+ return r.raw
+}
+
+func (r EventListResponseEventStorageWrite) implementsEventListResponse() {}
+
+type EventListResponseEventStorageWriteProperties struct {
+ Key string `json:"key,required"`
+ Content interface{} `json:"content"`
+ JSON eventListResponseEventStorageWritePropertiesJSON `json:"-"`
+}
+
+// eventListResponseEventStorageWritePropertiesJSON contains the JSON metadata for
+// the struct [EventListResponseEventStorageWriteProperties]
+type eventListResponseEventStorageWritePropertiesJSON struct {
+ Key apijson.Field
+ Content apijson.Field
+ raw string
+ ExtraFields map[string]apijson.Field
+}
+
+func (r *EventListResponseEventStorageWriteProperties) UnmarshalJSON(data []byte) (err error) {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func (r eventListResponseEventStorageWritePropertiesJSON) RawJSON() string {
+ return r.raw
+}
+
+type EventListResponseEventStorageWriteType string
+
+const (
+ EventListResponseEventStorageWriteTypeStorageWrite EventListResponseEventStorageWriteType = "storage.write"
+)
+
+func (r EventListResponseEventStorageWriteType) IsKnown() bool {
+ switch r {
+ case EventListResponseEventStorageWriteTypeStorageWrite:
+ return true
+ }
+ return false
+}
+
type EventListResponseEventSessionUpdated struct {
Properties EventListResponseEventSessionUpdatedProperties `json:"properties,required"`
Type EventListResponseEventSessionUpdatedType `json:"type,required"`
@@ -972,13 +972,15 @@ func (r *EventListResponseEventSessionErrorPropertiesError) UnmarshalJSON(data [
//
// Possible runtime types of the union are [shared.ProviderAuthError],
// [shared.UnknownError],
-// [EventListResponseEventSessionErrorPropertiesErrorMessageOutputLengthError].
+// [EventListResponseEventSessionErrorPropertiesErrorMessageOutputLengthError],
+// [shared.MessageAbortedError].
func (r EventListResponseEventSessionErrorPropertiesError) AsUnion() EventListResponseEventSessionErrorPropertiesErrorUnion {
return r.union
}
-// Union satisfied by [shared.ProviderAuthError], [shared.UnknownError] or
-// [EventListResponseEventSessionErrorPropertiesErrorMessageOutputLengthError].
+// Union satisfied by [shared.ProviderAuthError], [shared.UnknownError],
+// [EventListResponseEventSessionErrorPropertiesErrorMessageOutputLengthError] or
+// [shared.MessageAbortedError].
type EventListResponseEventSessionErrorPropertiesErrorUnion interface {
ImplementsEventListResponseEventSessionErrorPropertiesError()
}
@@ -1002,6 +1004,11 @@ func init() {
Type: reflect.TypeOf(EventListResponseEventSessionErrorPropertiesErrorMessageOutputLengthError{}),
DiscriminatorValue: "MessageOutputLengthError",
},
+ apijson.UnionVariant{
+ TypeFilter: gjson.JSON,
+ Type: reflect.TypeOf(shared.MessageAbortedError{}),
+ DiscriminatorValue: "MessageAbortedError",
+ },
)
}
@@ -1052,11 +1059,12 @@ const (
EventListResponseEventSessionErrorPropertiesErrorNameProviderAuthError EventListResponseEventSessionErrorPropertiesErrorName = "ProviderAuthError"
EventListResponseEventSessionErrorPropertiesErrorNameUnknownError EventListResponseEventSessionErrorPropertiesErrorName = "UnknownError"
EventListResponseEventSessionErrorPropertiesErrorNameMessageOutputLengthError EventListResponseEventSessionErrorPropertiesErrorName = "MessageOutputLengthError"
+ EventListResponseEventSessionErrorPropertiesErrorNameMessageAbortedError EventListResponseEventSessionErrorPropertiesErrorName = "MessageAbortedError"
)
func (r EventListResponseEventSessionErrorPropertiesErrorName) IsKnown() bool {
switch r {
- case EventListResponseEventSessionErrorPropertiesErrorNameProviderAuthError, EventListResponseEventSessionErrorPropertiesErrorNameUnknownError, EventListResponseEventSessionErrorPropertiesErrorNameMessageOutputLengthError:
+ case EventListResponseEventSessionErrorPropertiesErrorNameProviderAuthError, EventListResponseEventSessionErrorPropertiesErrorNameUnknownError, EventListResponseEventSessionErrorPropertiesErrorNameMessageOutputLengthError, EventListResponseEventSessionErrorPropertiesErrorNameMessageAbortedError:
return true
}
return false
@@ -1160,10 +1168,10 @@ const (
EventListResponseTypePermissionUpdated EventListResponseType = "permission.updated"
EventListResponseTypeFileEdited EventListResponseType = "file.edited"
EventListResponseTypeInstallationUpdated EventListResponseType = "installation.updated"
- EventListResponseTypeStorageWrite EventListResponseType = "storage.write"
EventListResponseTypeMessageUpdated EventListResponseType = "message.updated"
EventListResponseTypeMessageRemoved EventListResponseType = "message.removed"
EventListResponseTypeMessagePartUpdated EventListResponseType = "message.part.updated"
+ EventListResponseTypeStorageWrite EventListResponseType = "storage.write"
EventListResponseTypeSessionUpdated EventListResponseType = "session.updated"
EventListResponseTypeSessionDeleted EventListResponseType = "session.deleted"
EventListResponseTypeSessionIdle EventListResponseType = "session.idle"
@@ -1173,7 +1181,7 @@ const (
func (r EventListResponseType) IsKnown() bool {
switch r {
- case EventListResponseTypeLspClientDiagnostics, EventListResponseTypePermissionUpdated, EventListResponseTypeFileEdited, EventListResponseTypeInstallationUpdated, EventListResponseTypeStorageWrite, EventListResponseTypeMessageUpdated, EventListResponseTypeMessageRemoved, EventListResponseTypeMessagePartUpdated, EventListResponseTypeSessionUpdated, EventListResponseTypeSessionDeleted, EventListResponseTypeSessionIdle, EventListResponseTypeSessionError, EventListResponseTypeFileWatcherUpdated:
+ case EventListResponseTypeLspClientDiagnostics, EventListResponseTypePermissionUpdated, EventListResponseTypeFileEdited, EventListResponseTypeInstallationUpdated, EventListResponseTypeMessageUpdated, EventListResponseTypeMessageRemoved, EventListResponseTypeMessagePartUpdated, EventListResponseTypeStorageWrite, EventListResponseTypeSessionUpdated, EventListResponseTypeSessionDeleted, EventListResponseTypeSessionIdle, EventListResponseTypeSessionError, EventListResponseTypeFileWatcherUpdated:
return true
}
return false
diff --git a/packages/tui/sdk/release-please-config.json b/packages/tui/sdk/release-please-config.json
index 32960ce27..a38198eca 100644
--- a/packages/tui/sdk/release-please-config.json
+++ b/packages/tui/sdk/release-please-config.json
@@ -60,5 +60,8 @@
}
],
"release-type": "go",
- "extra-files": ["internal/version.go", "README.md"]
-}
+ "extra-files": [
+ "internal/version.go",
+ "README.md"
+ ]
+}
\ No newline at end of file
diff --git a/packages/tui/sdk/session.go b/packages/tui/sdk/session.go
index 816ee7e31..fc55c6912 100644
--- a/packages/tui/sdk/session.go
+++ b/packages/tui/sdk/session.go
@@ -340,13 +340,14 @@ func (r *AssistantMessageError) UnmarshalJSON(data []byte) (err error) {
// the specific types for more type safety.
//
// Possible runtime types of the union are [shared.ProviderAuthError],
-// [shared.UnknownError], [AssistantMessageErrorMessageOutputLengthError].
+// [shared.UnknownError], [AssistantMessageErrorMessageOutputLengthError],
+// [shared.MessageAbortedError].
func (r AssistantMessageError) AsUnion() AssistantMessageErrorUnion {
return r.union
}
-// Union satisfied by [shared.ProviderAuthError], [shared.UnknownError] or
-// [AssistantMessageErrorMessageOutputLengthError].
+// Union satisfied by [shared.ProviderAuthError], [shared.UnknownError],
+// [AssistantMessageErrorMessageOutputLengthError] or [shared.MessageAbortedError].
type AssistantMessageErrorUnion interface {
ImplementsAssistantMessageError()
}
@@ -370,6 +371,11 @@ func init() {
Type: reflect.TypeOf(AssistantMessageErrorMessageOutputLengthError{}),
DiscriminatorValue: "MessageOutputLengthError",
},
+ apijson.UnionVariant{
+ TypeFilter: gjson.JSON,
+ Type: reflect.TypeOf(shared.MessageAbortedError{}),
+ DiscriminatorValue: "MessageAbortedError",
+ },
)
}
@@ -418,11 +424,12 @@ const (
AssistantMessageErrorNameProviderAuthError AssistantMessageErrorName = "ProviderAuthError"
AssistantMessageErrorNameUnknownError AssistantMessageErrorName = "UnknownError"
AssistantMessageErrorNameMessageOutputLengthError AssistantMessageErrorName = "MessageOutputLengthError"
+ AssistantMessageErrorNameMessageAbortedError AssistantMessageErrorName = "MessageAbortedError"
)
func (r AssistantMessageErrorName) IsKnown() bool {
switch r {
- case AssistantMessageErrorNameProviderAuthError, AssistantMessageErrorNameUnknownError, AssistantMessageErrorNameMessageOutputLengthError:
+ case AssistantMessageErrorNameProviderAuthError, AssistantMessageErrorNameUnknownError, AssistantMessageErrorNameMessageOutputLengthError, AssistantMessageErrorNameMessageAbortedError:
return true
}
return false
@@ -889,7 +896,7 @@ func (r ToolPart) implementsAssistantMessagePart() {}
type ToolPartState struct {
Status ToolPartStateStatus `json:"status,required"`
Error string `json:"error"`
- // This field can have the runtime type of [interface{}].
+ // This field can have the runtime type of [interface{}], [map[string]interface{}].
Input interface{} `json:"input"`
// This field can have the runtime type of [map[string]interface{}].
Metadata interface{} `json:"metadata"`
@@ -1002,24 +1009,24 @@ func (r ToolPartType) IsKnown() bool {
}
type ToolStateCompleted struct {
+ Input map[string]interface{} `json:"input,required"`
Metadata map[string]interface{} `json:"metadata,required"`
Output string `json:"output,required"`
Status ToolStateCompletedStatus `json:"status,required"`
Time ToolStateCompletedTime `json:"time,required"`
Title string `json:"title,required"`
- Input interface{} `json:"input"`
JSON toolStateCompletedJSON `json:"-"`
}
// toolStateCompletedJSON contains the JSON metadata for the struct
// [ToolStateCompleted]
type toolStateCompletedJSON struct {
+ Input apijson.Field
Metadata apijson.Field
Output apijson.Field
Status apijson.Field
Time apijson.Field
Title apijson.Field
- Input apijson.Field
raw string
ExtraFields map[string]apijson.Field
}
@@ -1072,19 +1079,19 @@ func (r toolStateCompletedTimeJSON) RawJSON() string {
}
type ToolStateError struct {
- Error string `json:"error,required"`
- Status ToolStateErrorStatus `json:"status,required"`
- Time ToolStateErrorTime `json:"time,required"`
- Input interface{} `json:"input"`
- JSON toolStateErrorJSON `json:"-"`
+ Error string `json:"error,required"`
+ Input map[string]interface{} `json:"input,required"`
+ Status ToolStateErrorStatus `json:"status,required"`
+ Time ToolStateErrorTime `json:"time,required"`
+ JSON toolStateErrorJSON `json:"-"`
}
// toolStateErrorJSON contains the JSON metadata for the struct [ToolStateError]
type toolStateErrorJSON struct {
Error apijson.Field
+ Input apijson.Field
Status apijson.Field
Time apijson.Field
- Input apijson.Field
raw string
ExtraFields map[string]apijson.Field
}
diff --git a/packages/tui/sdk/shared/shared.go b/packages/tui/sdk/shared/shared.go
index 1ab53b6fa..58baf3d9c 100644
--- a/packages/tui/sdk/shared/shared.go
+++ b/packages/tui/sdk/shared/shared.go
@@ -6,6 +6,47 @@ import (
"github.com/sst/opencode-sdk-go/internal/apijson"
)
+type MessageAbortedError struct {
+ Data interface{} `json:"data,required"`
+ Name MessageAbortedErrorName `json:"name,required"`
+ JSON messageAbortedErrorJSON `json:"-"`
+}
+
+// messageAbortedErrorJSON contains the JSON metadata for the struct
+// [MessageAbortedError]
+type messageAbortedErrorJSON struct {
+ Data apijson.Field
+ Name apijson.Field
+ raw string
+ ExtraFields map[string]apijson.Field
+}
+
+func (r *MessageAbortedError) UnmarshalJSON(data []byte) (err error) {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func (r messageAbortedErrorJSON) RawJSON() string {
+ return r.raw
+}
+
+func (r MessageAbortedError) ImplementsEventListResponseEventSessionErrorPropertiesError() {}
+
+func (r MessageAbortedError) ImplementsAssistantMessageError() {}
+
+type MessageAbortedErrorName string
+
+const (
+ MessageAbortedErrorNameMessageAbortedError MessageAbortedErrorName = "MessageAbortedError"
+)
+
+func (r MessageAbortedErrorName) IsKnown() bool {
+ switch r {
+ case MessageAbortedErrorNameMessageAbortedError:
+ return true
+ }
+ return false
+}
+
type ProviderAuthError struct {
Data ProviderAuthErrorData `json:"data,required"`
Name ProviderAuthErrorName `json:"name,required"`
diff --git a/stainless.yml b/stainless.yml
index 941c4f387..2e262b749 100644
--- a/stainless.yml
+++ b/stainless.yml
@@ -34,6 +34,7 @@ resources:
models:
unknownError: UnknownError
providerAuthError: ProviderAuthError
+ messageAbortedError: MessageAbortedError
event:
methods: