From 021fd3fcb54ae0df3849c47a4f3875d6b7d13669 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Mon, 9 Jun 2025 14:01:11 -0400 Subject: [PATCH] sync --- packages/opencode/src/lsp/server.ts | 2 + packages/opencode/src/provider/provider.ts | 110 ++++-- packages/opencode/src/server/server.ts | 33 +- packages/opencode/src/session/index.ts | 44 ++- packages/opencode/src/session/message.ts | 7 +- packages/opencode/src/util/error.ts | 53 +++ packages/tui/pkg/client/gen/openapi.json | 311 +++++++++++----- packages/tui/pkg/client/generated-client.go | 372 +++++++++++++++++--- 8 files changed, 734 insertions(+), 198 deletions(-) create mode 100644 packages/opencode/src/util/error.ts diff --git a/packages/opencode/src/lsp/server.ts b/packages/opencode/src/lsp/server.ts index 6e7d03ea..5b2db484 100644 --- a/packages/opencode/src/lsp/server.ts +++ b/packages/opencode/src/lsp/server.ts @@ -38,7 +38,9 @@ export namespace LSPServer { ? path.resolve(process.cwd(), process.argv0) : process.argv0 return spawn(root, ["x", "typescript-language-server", "--stdio"], { + argv0: "bun", env: { + ...process.env, BUN_BE_BUN: "1", }, }) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 71d3fbc5..de5c9457 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -23,6 +23,7 @@ import { WriteTool } from "../tool/write" import { TodoReadTool, TodoWriteTool } from "../tool/todo" import { AuthAnthropic } from "../auth/anthropic" import { ModelsDev } from "./models" +import { NamedError } from "../util/error" export namespace Provider { const log = Log.create({ service: "provider" }) @@ -75,9 +76,18 @@ export namespace Provider { string, (provider: Info) => Promise | false> > = { - anthropic: async () => { + async anthropic(provider) { const access = await AuthAnthropic.access() - if (access) + if (access) { + // claude sub doesn't have usage cost + for (const model of Object.values(provider.models)) { + model.cost = { + input: 0, + inputCached: 0, + output: 0, + outputCached: 0, + } + } return { apiKey: "", headers: { @@ -85,16 +95,15 @@ export namespace Provider { "anthropic-beta": "oauth-2025-04-20", }, } - return env("ANTHROPIC_API_KEY") + } + return env("ANTHROPIC_API_KEY")(provider) }, google: env("GOOGLE_GENERATIVE_AI_API_KEY"), openai: env("OPENAI_API_KEY"), } const state = App.state("provider", async () => { - log.info("loading config") const config = await Config.get() - log.info("loading providers") const database: Record = await ModelsDev.get() const providers: { @@ -134,6 +143,10 @@ export namespace Provider { } } + for (const providerID of Object.keys(providers)) { + log.info("loaded", { providerID }) + } + return { models, providers, @@ -148,28 +161,32 @@ export namespace Provider { } async function getSDK(providerID: string) { - const s = await state() - if (s.sdk.has(providerID)) return s.sdk.get(providerID)! - - const dir = path.join( - Global.Path.cache, - `node_modules`, - `@ai-sdk`, - providerID, - ) - if (!(await Bun.file(path.join(dir, "package.json")).exists())) { - log.info("installing", { + return (async () => { + const s = await state() + const existing = s.sdk.get(providerID) + if (existing) return existing + const dir = path.join( + Global.Path.cache, + `node_modules`, + `@ai-sdk`, providerID, - }) - await BunProc.run(["add", `@ai-sdk/${providerID}@alpha`], { - cwd: Global.Path.cache, - }) - } - const mod = await import(path.join(dir)) - const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!] - const loaded = fn(s.providers[providerID]?.options) - s.sdk.set(providerID, loaded) - return loaded as SDK + ) + if (!(await Bun.file(path.join(dir, "package.json")).exists())) { + log.info("installing", { + providerID, + }) + await BunProc.run(["add", `@ai-sdk/${providerID}@alpha`], { + cwd: Global.Path.cache, + }) + } + const mod = await import(path.join(dir)) + const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!] + const loaded = fn(s.providers[providerID]?.options) + s.sdk.set(providerID, loaded) + return loaded as SDK + })().catch((e) => { + throw new InitError({ providerID: providerID }, { cause: e }) + }) } export async function getModel(providerID: string, modelID: string) { @@ -183,12 +200,11 @@ export namespace Provider { }) const provider = s.providers[providerID] - if (!provider) throw new ModelNotFoundError(modelID) + if (!provider) throw new ModelNotFoundError({ providerID, modelID }) const info = provider.info.models[modelID] - if (!info) throw new ModelNotFoundError(modelID) + if (!info) throw new ModelNotFoundError({ providerID, modelID }) const sdk = await getSDK(providerID) - if (!sdk) throw new ModelNotFoundError(modelID) try { const language = sdk.languageModel(modelID) @@ -202,7 +218,14 @@ export namespace Provider { language, } } catch (e) { - if (e instanceof NoSuchModelError) throw new ModelNotFoundError(modelID) + if (e instanceof NoSuchModelError) + throw new ModelNotFoundError( + { + modelID: modelID, + providerID, + }, + { cause: e }, + ) throw e } } @@ -259,9 +282,26 @@ export namespace Provider { return TOOL_MAPPING[providerID] ?? TOOLS } - class ModelNotFoundError extends Error { - constructor(public readonly model: string) { - super() - } - } + export const ModelNotFoundError = NamedError.create( + "ProviderModelNotFoundError", + z.object({ + providerID: z.string(), + modelID: z.string(), + }), + ) + + export const InitError = NamedError.create( + "ProviderInitError", + z.object({ + providerID: z.string(), + }), + ) + + export const AuthError = NamedError.create( + "ProviderAuthError", + z.object({ + providerID: z.string(), + message: z.string(), + }), + ) } diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 5c7d1612..4bb9fb77 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -11,6 +11,26 @@ import { Provider } from "../provider/provider" import { App } from "../app/app" import { Global } from "../global" import { mapValues } from "remeda" +import { NamedError } from "../util/error" + +const ERRORS = { + 400: { + description: "Bad request", + content: { + "application/json": { + schema: resolver( + z + .object({ + data: z.record(z.string(), z.any()), + }) + .openapi({ + ref: "Error", + }), + ), + }, + }, + }, +} as const export namespace Server { const log = Log.create({ service: "server" }) @@ -22,13 +42,15 @@ export namespace Server { const result = app .onError((err, c) => { - log.error("error", err) + if (err instanceof NamedError) { + return c.json(err.toObject(), { + status: 400, + }) + } return c.json( + new NamedError.Unknown({ message: err.toString() }).toObject(), { - error: err.toString(), - }, - { - status: 500, + status: 400, }, ) }) @@ -197,6 +219,7 @@ export namespace Server { describeRoute({ description: "Create a new session", responses: { + ...ERRORS, 200: { description: "Successfully created session", content: { diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 7da160d2..46260bc1 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -6,6 +6,7 @@ import { Log } from "../util/log" import { convertToModelMessages, generateText, + LoadAPIKeyError, stepCountIs, streamText, tool, @@ -28,6 +29,7 @@ import { Provider } from "../provider/provider" import { SessionContext } from "./context" import { ListTool } from "../tool/ls" import { MCP } from "../mcp" +import { NamedError } from "../util/error" export namespace Session { const log = Log.create({ service: "session" }) @@ -59,6 +61,12 @@ export namespace Session { info: Info, }), ), + Error: Bus.event( + "session.error", + z.object({ + error: Message.Info.shape.metadata.shape.error, + }), + ), } const state = App.state("session", () => { @@ -296,11 +304,13 @@ export namespace Session { }, ]), model: model.language, - }).then((result) => { - return Session.update(input.sessionID, (draft) => { - draft.title = result.text - }) }) + .then((result) => { + return Session.update(input.sessionID, (draft) => { + draft.title = result.text + }) + }) + .catch(() => {}) await updateMessage(system) } const msg: Message.Info = { @@ -506,11 +516,27 @@ export namespace Session { assistant.cost = usage.cost await updateMessage(next) }, - onError(input) { - log.error("error", input) - if (input.error instanceof Error) { - next.metadata.error = input.error.toString() + onError(err) { + log.error("error", err) + switch (true) { + case LoadAPIKeyError.isInstance(err.error): + next.metadata.error = new Provider.AuthError( + { + providerID: input.providerID, + message: err.error.message, + }, + { cause: err.error }, + ).toObject() + break + case err.error instanceof Error: + next.metadata.error = new NamedError.Unknown( + { message: err.error.toString() }, + { cause: err.error }, + ).toObject() } + Bus.publish(Event.Error, { + error: next.metadata.error, + }) }, async prepareStep(step) { next.parts.push({ @@ -532,7 +558,7 @@ export namespace Session { }) await result.consumeStream({ onError: (err) => { - log.error("error", { + log.error("stream error", { err, }) }, diff --git a/packages/opencode/src/session/message.ts b/packages/opencode/src/session/message.ts index 7b893563..2336be77 100644 --- a/packages/opencode/src/session/message.ts +++ b/packages/opencode/src/session/message.ts @@ -1,5 +1,7 @@ import z from "zod" import { Bus } from "../bus" +import { Provider } from "../provider/provider" +import { NamedError } from "../util/error" export namespace Message { export const ToolCall = z @@ -138,7 +140,10 @@ export namespace Message { created: z.number(), completed: z.number().optional(), }), - error: z.string().optional(), + error: z.discriminatedUnion("name", [ + Provider.AuthError.Schema, + NamedError.Unknown.Schema, + ]), sessionID: z.string(), tool: z.record(z.string(), z.any()), assistant: z diff --git a/packages/opencode/src/util/error.ts b/packages/opencode/src/util/error.ts new file mode 100644 index 00000000..3e3cf421 --- /dev/null +++ b/packages/opencode/src/util/error.ts @@ -0,0 +1,53 @@ +import { z, type ZodSchema } from "zod" + +export abstract class NamedError extends Error { + abstract schema(): ZodSchema + abstract toObject(): { name: string; data: any } + + static create( + name: Name, + data: Data, + ) { + const result = class extends NamedError { + public static readonly Schema = z + .object({ + name: z.literal(name), + data: data, + }) + .openapi({ + ref: name, + }) + + constructor( + public readonly data: z.input, + options?: ErrorOptions, + ) { + super(name, options) + this.name = name + } + + static isInstance(input: any): input is InstanceType { + return "name" in input && input.name === name + } + + schema() { + return data + } + + toObject() { + return { + name: name, + data: this.data, + } + } + } + return result + } + + public static readonly Unknown = NamedError.create( + "UnknownError", + z.object({ + message: z.string(), + }), + ) +} diff --git a/packages/tui/pkg/client/gen/openapi.json b/packages/tui/pkg/client/gen/openapi.json index f329b48b..e8dfa9ee 100644 --- a/packages/tui/pkg/client/gen/openapi.json +++ b/packages/tui/pkg/client/gen/openapi.json @@ -158,6 +158,16 @@ } } } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } } }, "operationId": "postSession_create", @@ -438,31 +448,35 @@ { "$ref": "#/components/schemas/Event.storage.write" }, - { - "$ref": "#/components/schemas/Event.message.updated" - }, - { - "$ref": "#/components/schemas/Event.message.part.updated" - }, { "$ref": "#/components/schemas/Event.lsp.client.diagnostics" }, { "$ref": "#/components/schemas/Event.permission.updated" }, + { + "$ref": "#/components/schemas/Event.message.updated" + }, + { + "$ref": "#/components/schemas/Event.message.part.updated" + }, { "$ref": "#/components/schemas/Event.session.updated" + }, + { + "$ref": "#/components/schemas/Event.session.error" } ], "discriminator": { "propertyName": "type", "mapping": { "storage.write": "#/components/schemas/Event.storage.write", - "message.updated": "#/components/schemas/Event.message.updated", - "message.part.updated": "#/components/schemas/Event.message.part.updated", "lsp.client.diagnostics": "#/components/schemas/Event.lsp.client.diagnostics", "permission.updated": "#/components/schemas/Event.permission.updated", - "session.updated": "#/components/schemas/Event.session.updated" + "message.updated": "#/components/schemas/Event.message.updated", + "message.part.updated": "#/components/schemas/Event.message.part.updated", + "session.updated": "#/components/schemas/Event.session.updated", + "session.error": "#/components/schemas/Event.session.error" } } }, @@ -491,6 +505,86 @@ "properties" ] }, + "Event.lsp.client.diagnostics": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "lsp.client.diagnostics" + }, + "properties": { + "type": "object", + "properties": { + "serverID": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "serverID", + "path" + ] + } + }, + "required": [ + "type", + "properties" + ] + }, + "Event.permission.updated": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "permission.updated" + }, + "properties": { + "$ref": "#/components/schemas/permission.info" + } + }, + "required": [ + "type", + "properties" + ] + }, + "permission.info": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "sessionID": { + "type": "string" + }, + "title": { + "type": "string" + }, + "metadata": { + "type": "object", + "additionalProperties": {} + }, + "time": { + "type": "object", + "properties": { + "created": { + "type": "number" + } + }, + "required": [ + "created" + ] + } + }, + "required": [ + "id", + "sessionID", + "title", + "metadata", + "time" + ] + }, "Event.message.updated": { "type": "object", "properties": { @@ -553,7 +647,21 @@ ] }, "error": { - "type": "string" + "oneOf": [ + { + "$ref": "#/components/schemas/ProviderAuthError" + }, + { + "$ref": "#/components/schemas/UnknownError" + } + ], + "discriminator": { + "propertyName": "name", + "mapping": { + "ProviderAuthError": "#/components/schemas/ProviderAuthError", + "UnknownError": "#/components/schemas/UnknownError" + } + } }, "sessionID": { "type": "string" @@ -607,6 +715,7 @@ }, "required": [ "time", + "error", "sessionID", "tool" ] @@ -863,6 +972,58 @@ "type" ] }, + "ProviderAuthError": { + "type": "object", + "properties": { + "name": { + "type": "string", + "const": "ProviderAuthError" + }, + "data": { + "type": "object", + "properties": { + "providerID": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "providerID", + "message" + ] + } + }, + "required": [ + "name", + "data" + ] + }, + "UnknownError": { + "type": "object", + "properties": { + "name": { + "type": "string", + "const": "UnknownError" + }, + "data": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ] + } + }, + "required": [ + "name", + "data" + ] + }, "Event.message.part.updated": { "type": "object", "properties": { @@ -887,86 +1048,6 @@ "properties" ] }, - "Event.lsp.client.diagnostics": { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": "lsp.client.diagnostics" - }, - "properties": { - "type": "object", - "properties": { - "serverID": { - "type": "string" - }, - "path": { - "type": "string" - } - }, - "required": [ - "serverID", - "path" - ] - } - }, - "required": [ - "type", - "properties" - ] - }, - "Event.permission.updated": { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": "permission.updated" - }, - "properties": { - "$ref": "#/components/schemas/permission.info" - } - }, - "required": [ - "type", - "properties" - ] - }, - "permission.info": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "sessionID": { - "type": "string" - }, - "title": { - "type": "string" - }, - "metadata": { - "type": "object", - "additionalProperties": {} - }, - "time": { - "type": "object", - "properties": { - "created": { - "type": "number" - } - }, - "required": [ - "created" - ] - } - }, - "required": [ - "id", - "sessionID", - "title", - "metadata", - "time" - ] - }, "Event.session.updated": { "type": "object", "properties": { @@ -1038,6 +1119,44 @@ "time" ] }, + "Event.session.error": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "session.error" + }, + "properties": { + "type": "object", + "properties": { + "error": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProviderAuthError" + }, + { + "$ref": "#/components/schemas/UnknownError" + } + ], + "discriminator": { + "propertyName": "name", + "mapping": { + "ProviderAuthError": "#/components/schemas/ProviderAuthError", + "UnknownError": "#/components/schemas/UnknownError" + } + } + } + }, + "required": [ + "error" + ] + } + }, + "required": [ + "type", + "properties" + ] + }, "App.Info": { "type": "object", "properties": { @@ -1086,6 +1205,18 @@ "time" ] }, + "Error": { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "data" + ] + }, "Provider.Info": { "type": "object", "properties": { diff --git a/packages/tui/pkg/client/generated-client.go b/packages/tui/pkg/client/generated-client.go index 247af33a..5e5a3441 100644 --- a/packages/tui/pkg/client/generated-client.go +++ b/packages/tui/pkg/client/generated-client.go @@ -39,6 +39,11 @@ type AppInfo struct { User string `json:"user"` } +// Error defines model for Error. +type Error struct { + Data map[string]interface{} `json:"data"` +} + // Event defines model for Event. type Event struct { union json.RawMessage @@ -75,6 +80,19 @@ type EventPermissionUpdated struct { Type string `json:"type"` } +// EventSessionError defines model for Event.session.error. +type EventSessionError struct { + Properties struct { + Error EventSessionError_Properties_Error `json:"error"` + } `json:"properties"` + Type string `json:"type"` +} + +// EventSessionError_Properties_Error defines model for EventSessionError.Properties.Error. +type EventSessionError_Properties_Error struct { + union json.RawMessage +} + // EventSessionUpdated defines model for Event.session.updated. type EventSessionUpdated struct { Properties struct { @@ -107,8 +125,8 @@ type MessageInfo struct { Reasoning float32 `json:"reasoning"` } `json:"tokens"` } `json:"assistant,omitempty"` - Error *string `json:"error,omitempty"` - SessionID string `json:"sessionID"` + Error MessageInfo_Metadata_Error `json:"error"` + SessionID string `json:"sessionID"` Time struct { Completed *float32 `json:"completed,omitempty"` Created float32 `json:"created"` @@ -119,6 +137,11 @@ type MessageInfo struct { Role MessageInfoRole `json:"role"` } +// MessageInfo_Metadata_Error defines model for MessageInfo.Metadata.Error. +type MessageInfo_Metadata_Error struct { + union json.RawMessage +} + // MessageInfoRole defines model for MessageInfo.Role. type MessageInfoRole string @@ -226,6 +249,23 @@ type ProviderModel struct { Reasoning *bool `json:"reasoning,omitempty"` } +// ProviderAuthError defines model for ProviderAuthError. +type ProviderAuthError struct { + Data struct { + Message string `json:"message"` + ProviderID string `json:"providerID"` + } `json:"data"` + Name string `json:"name"` +} + +// UnknownError defines model for UnknownError. +type UnknownError struct { + Data struct { + Message string `json:"message"` + } `json:"data"` + Name string `json:"name"` +} + // PermissionInfo defines model for permission.info. type PermissionInfo struct { Id string `json:"id"` @@ -334,62 +374,6 @@ func (t *Event) MergeEventStorageWrite(v EventStorageWrite) error { return err } -// AsEventMessageUpdated returns the union data inside the Event as a EventMessageUpdated -func (t Event) AsEventMessageUpdated() (EventMessageUpdated, error) { - var body EventMessageUpdated - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromEventMessageUpdated overwrites any union data inside the Event as the provided EventMessageUpdated -func (t *Event) FromEventMessageUpdated(v EventMessageUpdated) error { - v.Type = "message.updated" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeEventMessageUpdated performs a merge with any union data inside the Event, using the provided EventMessageUpdated -func (t *Event) MergeEventMessageUpdated(v EventMessageUpdated) error { - v.Type = "message.updated" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - -// AsEventMessagePartUpdated returns the union data inside the Event as a EventMessagePartUpdated -func (t Event) AsEventMessagePartUpdated() (EventMessagePartUpdated, error) { - var body EventMessagePartUpdated - err := json.Unmarshal(t.union, &body) - return body, err -} - -// FromEventMessagePartUpdated overwrites any union data inside the Event as the provided EventMessagePartUpdated -func (t *Event) FromEventMessagePartUpdated(v EventMessagePartUpdated) error { - v.Type = "message.part.updated" - b, err := json.Marshal(v) - t.union = b - return err -} - -// MergeEventMessagePartUpdated performs a merge with any union data inside the Event, using the provided EventMessagePartUpdated -func (t *Event) MergeEventMessagePartUpdated(v EventMessagePartUpdated) error { - v.Type = "message.part.updated" - b, err := json.Marshal(v) - if err != nil { - return err - } - - merged, err := runtime.JSONMerge(t.union, b) - t.union = merged - return err -} - // AsEventLspClientDiagnostics returns the union data inside the Event as a EventLspClientDiagnostics func (t Event) AsEventLspClientDiagnostics() (EventLspClientDiagnostics, error) { var body EventLspClientDiagnostics @@ -446,6 +430,62 @@ func (t *Event) MergeEventPermissionUpdated(v EventPermissionUpdated) error { return err } +// AsEventMessageUpdated returns the union data inside the Event as a EventMessageUpdated +func (t Event) AsEventMessageUpdated() (EventMessageUpdated, error) { + var body EventMessageUpdated + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEventMessageUpdated overwrites any union data inside the Event as the provided EventMessageUpdated +func (t *Event) FromEventMessageUpdated(v EventMessageUpdated) error { + v.Type = "message.updated" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEventMessageUpdated performs a merge with any union data inside the Event, using the provided EventMessageUpdated +func (t *Event) MergeEventMessageUpdated(v EventMessageUpdated) error { + v.Type = "message.updated" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsEventMessagePartUpdated returns the union data inside the Event as a EventMessagePartUpdated +func (t Event) AsEventMessagePartUpdated() (EventMessagePartUpdated, error) { + var body EventMessagePartUpdated + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEventMessagePartUpdated overwrites any union data inside the Event as the provided EventMessagePartUpdated +func (t *Event) FromEventMessagePartUpdated(v EventMessagePartUpdated) error { + v.Type = "message.part.updated" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEventMessagePartUpdated performs a merge with any union data inside the Event, using the provided EventMessagePartUpdated +func (t *Event) MergeEventMessagePartUpdated(v EventMessagePartUpdated) error { + v.Type = "message.part.updated" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + // AsEventSessionUpdated returns the union data inside the Event as a EventSessionUpdated func (t Event) AsEventSessionUpdated() (EventSessionUpdated, error) { var body EventSessionUpdated @@ -474,6 +514,34 @@ func (t *Event) MergeEventSessionUpdated(v EventSessionUpdated) error { return err } +// AsEventSessionError returns the union data inside the Event as a EventSessionError +func (t Event) AsEventSessionError() (EventSessionError, error) { + var body EventSessionError + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromEventSessionError overwrites any union data inside the Event as the provided EventSessionError +func (t *Event) FromEventSessionError(v EventSessionError) error { + v.Type = "session.error" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeEventSessionError performs a merge with any union data inside the Event, using the provided EventSessionError +func (t *Event) MergeEventSessionError(v EventSessionError) error { + v.Type = "session.error" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + func (t Event) Discriminator() (string, error) { var discriminator struct { Discriminator string `json:"type"` @@ -496,6 +564,8 @@ func (t Event) ValueByDiscriminator() (interface{}, error) { return t.AsEventMessageUpdated() case "permission.updated": return t.AsEventPermissionUpdated() + case "session.error": + return t.AsEventSessionError() case "session.updated": return t.AsEventSessionUpdated() case "storage.write": @@ -515,6 +585,184 @@ func (t *Event) UnmarshalJSON(b []byte) error { return err } +// AsProviderAuthError returns the union data inside the EventSessionError_Properties_Error as a ProviderAuthError +func (t EventSessionError_Properties_Error) AsProviderAuthError() (ProviderAuthError, error) { + var body ProviderAuthError + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromProviderAuthError overwrites any union data inside the EventSessionError_Properties_Error as the provided ProviderAuthError +func (t *EventSessionError_Properties_Error) FromProviderAuthError(v ProviderAuthError) error { + v.Name = "ProviderAuthError" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeProviderAuthError performs a merge with any union data inside the EventSessionError_Properties_Error, using the provided ProviderAuthError +func (t *EventSessionError_Properties_Error) MergeProviderAuthError(v ProviderAuthError) error { + v.Name = "ProviderAuthError" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsUnknownError returns the union data inside the EventSessionError_Properties_Error as a UnknownError +func (t EventSessionError_Properties_Error) AsUnknownError() (UnknownError, error) { + var body UnknownError + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromUnknownError overwrites any union data inside the EventSessionError_Properties_Error as the provided UnknownError +func (t *EventSessionError_Properties_Error) FromUnknownError(v UnknownError) error { + v.Name = "UnknownError" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeUnknownError performs a merge with any union data inside the EventSessionError_Properties_Error, using the provided UnknownError +func (t *EventSessionError_Properties_Error) MergeUnknownError(v UnknownError) error { + v.Name = "UnknownError" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t EventSessionError_Properties_Error) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"name"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t EventSessionError_Properties_Error) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "ProviderAuthError": + return t.AsProviderAuthError() + case "UnknownError": + return t.AsUnknownError() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t EventSessionError_Properties_Error) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *EventSessionError_Properties_Error) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +// AsProviderAuthError returns the union data inside the MessageInfo_Metadata_Error as a ProviderAuthError +func (t MessageInfo_Metadata_Error) AsProviderAuthError() (ProviderAuthError, error) { + var body ProviderAuthError + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromProviderAuthError overwrites any union data inside the MessageInfo_Metadata_Error as the provided ProviderAuthError +func (t *MessageInfo_Metadata_Error) FromProviderAuthError(v ProviderAuthError) error { + v.Name = "ProviderAuthError" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeProviderAuthError performs a merge with any union data inside the MessageInfo_Metadata_Error, using the provided ProviderAuthError +func (t *MessageInfo_Metadata_Error) MergeProviderAuthError(v ProviderAuthError) error { + v.Name = "ProviderAuthError" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsUnknownError returns the union data inside the MessageInfo_Metadata_Error as a UnknownError +func (t MessageInfo_Metadata_Error) AsUnknownError() (UnknownError, error) { + var body UnknownError + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromUnknownError overwrites any union data inside the MessageInfo_Metadata_Error as the provided UnknownError +func (t *MessageInfo_Metadata_Error) FromUnknownError(v UnknownError) error { + v.Name = "UnknownError" + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeUnknownError performs a merge with any union data inside the MessageInfo_Metadata_Error, using the provided UnknownError +func (t *MessageInfo_Metadata_Error) MergeUnknownError(v UnknownError) error { + v.Name = "UnknownError" + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t MessageInfo_Metadata_Error) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"name"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t MessageInfo_Metadata_Error) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "ProviderAuthError": + return t.AsProviderAuthError() + case "UnknownError": + return t.AsUnknownError() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t MessageInfo_Metadata_Error) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *MessageInfo_Metadata_Error) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + // AsMessagePartText returns the union data inside the MessagePart as a MessagePartText func (t MessagePart) AsMessagePartText() (MessagePartText, error) { var body MessagePartText @@ -1886,6 +2134,7 @@ type PostSessionCreateResponse struct { Body []byte HTTPResponse *http.Response JSON200 *SessionInfo + JSON400 *Error } // Status returns HTTPResponse.Status @@ -2390,6 +2639,13 @@ func ParsePostSessionCreateResponse(rsp *http.Response) (*PostSessionCreateRespo } response.JSON200 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + } return response, nil