summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-11-14 12:32:43 -0500
committerDax Raad <[email protected]>2025-11-14 12:32:43 -0500
commit5fc26c958ad53e444967e075a77a47015e4fd0ad (patch)
tree453b3dcae237a3475b784b5949ae7a2113756bb2
parentc1cf9cda6a8b20c7320d60fdb6ccc9b44a0f29a6 (diff)
downloadopencode-5fc26c958ad53e444967e075a77a47015e4fd0ad.tar.gz
opencode-5fc26c958ad53e444967e075a77a47015e4fd0ad.zip
add global.event.subscribe() to sdk
-rw-r--r--packages/opencode/src/bus/global.ts10
-rw-r--r--packages/opencode/src/bus/index.ts5
-rw-r--r--packages/opencode/src/server/server.ts46
-rw-r--r--packages/sdk/js/src/gen/sdk.gen.ts41
-rw-r--r--packages/sdk/js/src/gen/types.gen.ts1238
5 files changed, 717 insertions, 623 deletions
diff --git a/packages/opencode/src/bus/global.ts b/packages/opencode/src/bus/global.ts
new file mode 100644
index 000000000..b592cd398
--- /dev/null
+++ b/packages/opencode/src/bus/global.ts
@@ -0,0 +1,10 @@
+import { EventEmitter } from "events"
+
+export const GlobalBus = new EventEmitter<{
+ event: [
+ {
+ directory: string
+ payload: any
+ },
+ ]
+}>()
diff --git a/packages/opencode/src/bus/index.ts b/packages/opencode/src/bus/index.ts
index f4dd3ed2c..22e145199 100644
--- a/packages/opencode/src/bus/index.ts
+++ b/packages/opencode/src/bus/index.ts
@@ -2,6 +2,7 @@ import z from "zod"
import type { ZodType } from "zod"
import { Log } from "../util/log"
import { Instance } from "../project/instance"
+import { GlobalBus } from "./global"
export namespace Bus {
const log = Log.create({ service: "bus" })
@@ -65,6 +66,10 @@ export namespace Bus {
pending.push(sub(payload))
}
}
+ GlobalBus.emit("event", {
+ directory: Instance.directory,
+ payload,
+ })
return Promise.all(pending)
}
diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts
index 2dee6c915..034efa84a 100644
--- a/packages/opencode/src/server/server.ts
+++ b/packages/opencode/src/server/server.ts
@@ -40,6 +40,7 @@ import type { ContentfulStatusCode } from "hono/utils/http-status"
import { TuiEvent } from "@/cli/cmd/tui/event"
import { Snapshot } from "@/snapshot"
import { SessionSummary } from "@/session/summary"
+import { GlobalBus } from "@/bus/global"
const ERRORS = {
400: {
@@ -117,6 +118,51 @@ export namespace Server {
timer.stop()
}
})
+ .get(
+ "/global/event",
+ describeRoute({
+ description: "Get events",
+ operationId: "global.event.subscribe",
+ responses: {
+ 200: {
+ description: "Event stream",
+ content: {
+ "text/event-stream": {
+ schema: resolver(
+ Bus.payloads().meta({
+ ref: "Event",
+ }),
+ ),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ log.info("global event connected")
+ return streamSSE(c, async (stream) => {
+ stream.writeSSE({
+ data: JSON.stringify({
+ type: "server.connected",
+ properties: {},
+ }),
+ })
+ async function handler(event: any) {
+ await stream.writeSSE({
+ data: JSON.stringify(event),
+ })
+ }
+ GlobalBus.on("event", handler)
+ await new Promise<void>((resolve) => {
+ stream.onAbort(() => {
+ GlobalBus.off("event", handler)
+ resolve()
+ log.info("global event disconnected")
+ })
+ })
+ })
+ },
+ )
.use(async (c, next) => {
const directory = c.req.query("directory") ?? process.cwd()
return Instance.provide({
diff --git a/packages/sdk/js/src/gen/sdk.gen.ts b/packages/sdk/js/src/gen/sdk.gen.ts
index 6987eb471..c41815624 100644
--- a/packages/sdk/js/src/gen/sdk.gen.ts
+++ b/packages/sdk/js/src/gen/sdk.gen.ts
@@ -2,6 +2,8 @@
import type { Options as ClientOptions, TDataShape, Client } from "./client/index.js"
import type {
+ GlobalEventButtData,
+ GlobalEventButtResponses,
ProjectListData,
ProjectListResponses,
ProjectCurrentData,
@@ -175,6 +177,32 @@ class _HeyApiClient {
}
}
+class Event extends _HeyApiClient {
+ /**
+ * Get events
+ */
+ public butt<ThrowOnError extends boolean = false>(options?: Options<GlobalEventButtData, ThrowOnError>) {
+ return (options?.client ?? this._client).get.sse<GlobalEventButtResponses, unknown, ThrowOnError>({
+ url: "/global/event",
+ ...options,
+ })
+ }
+
+ /**
+ * Get events
+ */
+ public subscribe<ThrowOnError extends boolean = false>(options?: Options<EventSubscribeData, ThrowOnError>) {
+ return (options?.client ?? this._client).get.sse<EventSubscribeResponses, unknown, ThrowOnError>({
+ url: "/event",
+ ...options,
+ })
+ }
+}
+
+class Global extends _HeyApiClient {
+ event = new Event({ client: this._client })
+}
+
class Project extends _HeyApiClient {
/**
* List all projects
@@ -828,18 +856,6 @@ class Auth extends _HeyApiClient {
}
}
-class Event extends _HeyApiClient {
- /**
- * Get events
- */
- public subscribe<ThrowOnError extends boolean = false>(options?: Options<EventSubscribeData, ThrowOnError>) {
- return (options?.client ?? this._client).get.sse<EventSubscribeResponses, unknown, ThrowOnError>({
- url: "/event",
- ...options,
- })
- }
-}
-
export class OpencodeClient extends _HeyApiClient {
/**
* Respond to a permission request
@@ -860,6 +876,7 @@ export class OpencodeClient extends _HeyApiClient {
},
})
}
+ global = new Global({ client: this._client })
project = new Project({ client: this._client })
config = new Config({ client: this._client })
tool = new Tool({ client: this._client })
diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts
index 1d90fe106..8a04af8c6 100644
--- a/packages/sdk/js/src/gen/types.gen.ts
+++ b/packages/sdk/js/src/gen/types.gen.ts
@@ -1,5 +1,621 @@
// This file is auto-generated by @hey-api/openapi-ts
+export type EventInstallationUpdated = {
+ type: "installation.updated"
+ properties: {
+ version: string
+ }
+}
+
+export type EventLspClientDiagnostics = {
+ type: "lsp.client.diagnostics"
+ properties: {
+ serverID: string
+ path: string
+ }
+}
+
+export type EventLspUpdated = {
+ type: "lsp.updated"
+ properties: {
+ [key: string]: unknown
+ }
+}
+
+export type FileDiff = {
+ file: string
+ before: string
+ after: string
+ additions: number
+ deletions: number
+}
+
+export type UserMessage = {
+ id: string
+ sessionID: string
+ role: "user"
+ time: {
+ created: number
+ }
+ summary?: {
+ title?: string
+ body?: string
+ diffs: Array<FileDiff>
+ }
+}
+
+export type ProviderAuthError = {
+ name: "ProviderAuthError"
+ data: {
+ providerID: string
+ message: string
+ }
+}
+
+export type UnknownError = {
+ name: "UnknownError"
+ data: {
+ message: string
+ }
+}
+
+export type MessageOutputLengthError = {
+ name: "MessageOutputLengthError"
+ data: {
+ [key: string]: unknown
+ }
+}
+
+export type MessageAbortedError = {
+ name: "MessageAbortedError"
+ data: {
+ message: string
+ }
+}
+
+export type ApiError = {
+ name: "APIError"
+ data: {
+ message: string
+ statusCode?: number
+ isRetryable: boolean
+ responseHeaders?: {
+ [key: string]: string
+ }
+ responseBody?: string
+ }
+}
+
+export type AssistantMessage = {
+ id: string
+ sessionID: string
+ role: "assistant"
+ time: {
+ created: number
+ completed?: number
+ }
+ error?: ProviderAuthError | UnknownError | MessageOutputLengthError | MessageAbortedError | ApiError
+ parentID: string
+ modelID: string
+ providerID: string
+ mode: string
+ path: {
+ cwd: string
+ root: string
+ }
+ summary?: boolean
+ cost: number
+ tokens: {
+ input: number
+ output: number
+ reasoning: number
+ cache: {
+ read: number
+ write: number
+ }
+ }
+}
+
+export type Message = UserMessage | AssistantMessage
+
+export type EventMessageUpdated = {
+ type: "message.updated"
+ properties: {
+ info: Message
+ }
+}
+
+export type EventMessageRemoved = {
+ type: "message.removed"
+ properties: {
+ sessionID: string
+ messageID: string
+ }
+}
+
+export type TextPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "text"
+ text: string
+ synthetic?: boolean
+ time?: {
+ start: number
+ end?: number
+ }
+ metadata?: {
+ [key: string]: unknown
+ }
+}
+
+export type ReasoningPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "reasoning"
+ text: string
+ metadata?: {
+ [key: string]: unknown
+ }
+ time: {
+ start: number
+ end?: number
+ }
+}
+
+export type FilePartSourceText = {
+ value: string
+ start: number
+ end: number
+}
+
+export type FileSource = {
+ text: FilePartSourceText
+ type: "file"
+ path: string
+}
+
+export type Range = {
+ start: {
+ line: number
+ character: number
+ }
+ end: {
+ line: number
+ character: number
+ }
+}
+
+export type SymbolSource = {
+ text: FilePartSourceText
+ type: "symbol"
+ path: string
+ range: Range
+ name: string
+ kind: number
+}
+
+export type FilePartSource = FileSource | SymbolSource
+
+export type FilePart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "file"
+ mime: string
+ filename?: string
+ url: string
+ source?: FilePartSource
+}
+
+export type ToolStatePending = {
+ status: "pending"
+ input: {
+ [key: string]: unknown
+ }
+ raw: string
+}
+
+export type ToolStateRunning = {
+ status: "running"
+ input: {
+ [key: string]: unknown
+ }
+ title?: string
+ metadata?: {
+ [key: string]: unknown
+ }
+ time: {
+ start: number
+ }
+}
+
+export type ToolStateCompleted = {
+ status: "completed"
+ input: {
+ [key: string]: unknown
+ }
+ output: string
+ title: string
+ metadata: {
+ [key: string]: unknown
+ }
+ time: {
+ start: number
+ end: number
+ compacted?: number
+ }
+ attachments?: Array<FilePart>
+}
+
+export type ToolStateError = {
+ status: "error"
+ input: {
+ [key: string]: unknown
+ }
+ error: string
+ metadata?: {
+ [key: string]: unknown
+ }
+ time: {
+ start: number
+ end: number
+ }
+}
+
+export type ToolState = ToolStatePending | ToolStateRunning | ToolStateCompleted | ToolStateError
+
+export type ToolPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "tool"
+ callID: string
+ tool: string
+ state: ToolState
+ metadata?: {
+ [key: string]: unknown
+ }
+}
+
+export type StepStartPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "step-start"
+ snapshot?: string
+}
+
+export type StepFinishPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "step-finish"
+ reason: string
+ snapshot?: string
+ cost: number
+ tokens: {
+ input: number
+ output: number
+ reasoning: number
+ cache: {
+ read: number
+ write: number
+ }
+ }
+}
+
+export type SnapshotPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "snapshot"
+ snapshot: string
+}
+
+export type PatchPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "patch"
+ hash: string
+ files: Array<string>
+}
+
+export type AgentPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "agent"
+ name: string
+ source?: {
+ value: string
+ start: number
+ end: number
+ }
+}
+
+export type RetryPart = {
+ id: string
+ sessionID: string
+ messageID: string
+ type: "retry"
+ attempt: number
+ error: ApiError
+ time: {
+ created: number
+ }
+}
+
+export type Part =
+ | TextPart
+ | ReasoningPart
+ | FilePart
+ | ToolPart
+ | StepStartPart
+ | StepFinishPart
+ | SnapshotPart
+ | PatchPart
+ | AgentPart
+ | RetryPart
+
+export type EventMessagePartUpdated = {
+ type: "message.part.updated"
+ properties: {
+ part: Part
+ delta?: string
+ }
+}
+
+export type EventMessagePartRemoved = {
+ type: "message.part.removed"
+ properties: {
+ sessionID: string
+ messageID: string
+ partID: string
+ }
+}
+
+export type EventSessionCompacted = {
+ type: "session.compacted"
+ properties: {
+ sessionID: string
+ }
+}
+
+export type Permission = {
+ id: string
+ type: string
+ pattern?: string | Array<string>
+ sessionID: string
+ messageID: string
+ callID?: string
+ title: string
+ metadata: {
+ [key: string]: unknown
+ }
+ time: {
+ created: number
+ }
+}
+
+export type EventPermissionUpdated = {
+ type: "permission.updated"
+ properties: Permission
+}
+
+export type EventPermissionReplied = {
+ type: "permission.replied"
+ properties: {
+ sessionID: string
+ permissionID: string
+ response: string
+ }
+}
+
+export type EventFileEdited = {
+ type: "file.edited"
+ properties: {
+ file: string
+ }
+}
+
+export type Todo = {
+ /**
+ * Brief description of the task
+ */
+ content: string
+ /**
+ * Current status of the task: pending, in_progress, completed, cancelled
+ */
+ status: string
+ /**
+ * Priority level of the task: high, medium, low
+ */
+ priority: string
+ /**
+ * Unique identifier for the todo item
+ */
+ id: string
+}
+
+export type EventTodoUpdated = {
+ type: "todo.updated"
+ properties: {
+ sessionID: string
+ todos: Array<Todo>
+ }
+}
+
+export type EventCommandExecuted = {
+ type: "command.executed"
+ properties: {
+ name: string
+ sessionID: string
+ arguments: string
+ messageID: string
+ }
+}
+
+export type EventSessionIdle = {
+ type: "session.idle"
+ properties: {
+ sessionID: string
+ }
+}
+
+export type Session = {
+ id: string
+ projectID: string
+ directory: string
+ parentID?: string
+ summary?: {
+ additions: number
+ deletions: number
+ files: number
+ diffs?: Array<FileDiff>
+ }
+ share?: {
+ url: string
+ }
+ title: string
+ version: string
+ time: {
+ created: number
+ updated: number
+ compacting?: number
+ }
+ revert?: {
+ messageID: string
+ partID?: string
+ snapshot?: string
+ diff?: string
+ }
+}
+
+export type EventSessionCreated = {
+ type: "session.created"
+ properties: {
+ info: Session
+ }
+}
+
+export type EventSessionUpdated = {
+ type: "session.updated"
+ properties: {
+ info: Session
+ }
+}
+
+export type EventSessionDeleted = {
+ type: "session.deleted"
+ properties: {
+ info: Session
+ }
+}
+
+export type EventSessionDiff = {
+ type: "session.diff"
+ properties: {
+ sessionID: string
+ diff: Array<FileDiff>
+ }
+}
+
+export type EventSessionError = {
+ type: "session.error"
+ properties: {
+ sessionID?: string
+ error?: ProviderAuthError | UnknownError | MessageOutputLengthError | MessageAbortedError | ApiError
+ }
+}
+
+export type EventTuiPromptAppend = {
+ type: "tui.prompt.append"
+ properties: {
+ text: string
+ }
+}
+
+export type EventTuiCommandExecute = {
+ type: "tui.command.execute"
+ properties: {
+ command:
+ | (
+ | "session.list"
+ | "session.new"
+ | "session.share"
+ | "session.interrupt"
+ | "session.compact"
+ | "session.page.up"
+ | "session.page.down"
+ | "session.half.page.up"
+ | "session.half.page.down"
+ | "session.first"
+ | "session.last"
+ | "prompt.clear"
+ | "prompt.submit"
+ | "agent.cycle"
+ )
+ | string
+ }
+}
+
+export type EventTuiToastShow = {
+ type: "tui.toast.show"
+ properties: {
+ title?: string
+ message: string
+ variant: "info" | "success" | "warning" | "error"
+ /**
+ * Duration in milliseconds
+ */
+ duration?: number
+ }
+}
+
+export type EventServerConnected = {
+ type: "server.connected"
+ properties: {
+ [key: string]: unknown
+ }
+}
+
+export type EventFileWatcherUpdated = {
+ type: "file.watcher.updated"
+ properties: {
+ file: string
+ event: "add" | "change" | "unlink"
+ }
+}
+
+export type Event =
+ | EventInstallationUpdated
+ | EventLspClientDiagnostics
+ | EventLspUpdated
+ | EventMessageUpdated
+ | EventMessageRemoved
+ | EventMessagePartUpdated
+ | EventMessagePartRemoved
+ | EventSessionCompacted
+ | EventPermissionUpdated
+ | EventPermissionReplied
+ | EventFileEdited
+ | EventTodoUpdated
+ | EventCommandExecuted
+ | EventSessionIdle
+ | EventSessionCreated
+ | EventSessionUpdated
+ | EventSessionDeleted
+ | EventSessionDiff
+ | EventSessionError
+ | EventTuiPromptAppend
+ | EventTuiCommandExecute
+ | EventTuiToastShow
+ | EventServerConnected
+ | EventFileWatcherUpdated
+
export type Project = {
id: string
worktree: string
@@ -536,43 +1152,6 @@ export type Path = {
directory: string
}
-export type FileDiff = {
- file: string
- before: string
- after: string
- additions: number
- deletions: number
-}
-
-export type Session = {
- id: string
- projectID: string
- directory: string
- parentID?: string
- summary?: {
- additions: number
- deletions: number
- files: number
- diffs?: Array<FileDiff>
- }
- share?: {
- url: string
- }
- title: string
- version: string
- time: {
- created: number
- updated: number
- compacting?: number
- }
- revert?: {
- messageID: string
- partID?: string
- snapshot?: string
- diff?: string
- }
-}
-
export type NotFoundError = {
name: "NotFoundError"
data: {
@@ -580,340 +1159,6 @@ export type NotFoundError = {
}
}
-export type Todo = {
- /**
- * Brief description of the task
- */
- content: string
- /**
- * Current status of the task: pending, in_progress, completed, cancelled
- */
- status: string
- /**
- * Priority level of the task: high, medium, low
- */
- priority: string
- /**
- * Unique identifier for the todo item
- */
- id: string
-}
-
-export type UserMessage = {
- id: string
- sessionID: string
- role: "user"
- time: {
- created: number
- }
- summary?: {
- title?: string
- body?: string
- diffs: Array<FileDiff>
- }
-}
-
-export type ProviderAuthError = {
- name: "ProviderAuthError"
- data: {
- providerID: string
- message: string
- }
-}
-
-export type UnknownError = {
- name: "UnknownError"
- data: {
- message: string
- }
-}
-
-export type MessageOutputLengthError = {
- name: "MessageOutputLengthError"
- data: {
- [key: string]: unknown
- }
-}
-
-export type MessageAbortedError = {
- name: "MessageAbortedError"
- data: {
- message: string
- }
-}
-
-export type ApiError = {
- name: "APIError"
- data: {
- message: string
- statusCode?: number
- isRetryable: boolean
- responseHeaders?: {
- [key: string]: string
- }
- responseBody?: string
- }
-}
-
-export type AssistantMessage = {
- id: string
- sessionID: string
- role: "assistant"
- time: {
- created: number
- completed?: number
- }
- error?: ProviderAuthError | UnknownError | MessageOutputLengthError | MessageAbortedError | ApiError
- parentID: string
- modelID: string
- providerID: string
- mode: string
- path: {
- cwd: string
- root: string
- }
- summary?: boolean
- cost: number
- tokens: {
- input: number
- output: number
- reasoning: number
- cache: {
- read: number
- write: number
- }
- }
-}
-
-export type Message = UserMessage | AssistantMessage
-
-export type TextPart = {
- id: string
- sessionID: string
- messageID: string
- type: "text"
- text: string
- synthetic?: boolean
- time?: {
- start: number
- end?: number
- }
- metadata?: {
- [key: string]: unknown
- }
-}
-
-export type ReasoningPart = {
- id: string
- sessionID: string
- messageID: string
- type: "reasoning"
- text: string
- metadata?: {
- [key: string]: unknown
- }
- time: {
- start: number
- end?: number
- }
-}
-
-export type FilePartSourceText = {
- value: string
- start: number
- end: number
-}
-
-export type FileSource = {
- text: FilePartSourceText
- type: "file"
- path: string
-}
-
-export type Range = {
- start: {
- line: number
- character: number
- }
- end: {
- line: number
- character: number
- }
-}
-
-export type SymbolSource = {
- text: FilePartSourceText
- type: "symbol"
- path: string
- range: Range
- name: string
- kind: number
-}
-
-export type FilePartSource = FileSource | SymbolSource
-
-export type FilePart = {
- id: string
- sessionID: string
- messageID: string
- type: "file"
- mime: string
- filename?: string
- url: string
- source?: FilePartSource
-}
-
-export type ToolStatePending = {
- status: "pending"
- input: {
- [key: string]: unknown
- }
- raw: string
-}
-
-export type ToolStateRunning = {
- status: "running"
- input: {
- [key: string]: unknown
- }
- title?: string
- metadata?: {
- [key: string]: unknown
- }
- time: {
- start: number
- }
-}
-
-export type ToolStateCompleted = {
- status: "completed"
- input: {
- [key: string]: unknown
- }
- output: string
- title: string
- metadata: {
- [key: string]: unknown
- }
- time: {
- start: number
- end: number
- compacted?: number
- }
- attachments?: Array<FilePart>
-}
-
-export type ToolStateError = {
- status: "error"
- input: {
- [key: string]: unknown
- }
- error: string
- metadata?: {
- [key: string]: unknown
- }
- time: {
- start: number
- end: number
- }
-}
-
-export type ToolState = ToolStatePending | ToolStateRunning | ToolStateCompleted | ToolStateError
-
-export type ToolPart = {
- id: string
- sessionID: string
- messageID: string
- type: "tool"
- callID: string
- tool: string
- state: ToolState
- metadata?: {
- [key: string]: unknown
- }
-}
-
-export type StepStartPart = {
- id: string
- sessionID: string
- messageID: string
- type: "step-start"
- snapshot?: string
-}
-
-export type StepFinishPart = {
- id: string
- sessionID: string
- messageID: string
- type: "step-finish"
- reason: string
- snapshot?: string
- cost: number
- tokens: {
- input: number
- output: number
- reasoning: number
- cache: {
- read: number
- write: number
- }
- }
-}
-
-export type SnapshotPart = {
- id: string
- sessionID: string
- messageID: string
- type: "snapshot"
- snapshot: string
-}
-
-export type PatchPart = {
- id: string
- sessionID: string
- messageID: string
- type: "patch"
- hash: string
- files: Array<string>
-}
-
-export type AgentPart = {
- id: string
- sessionID: string
- messageID: string
- type: "agent"
- name: string
- source?: {
- value: string
- start: number
- end: number
- }
-}
-
-export type RetryPart = {
- id: string
- sessionID: string
- messageID: string
- type: "retry"
- attempt: number
- error: ApiError
- time: {
- created: number
- }
-}
-
-export type Part =
- | TextPart
- | ReasoningPart
- | FilePart
- | ToolPart
- | StepStartPart
- | StepFinishPart
- | SnapshotPart
- | PatchPart
- | AgentPart
- | RetryPart
-
export type TextPartInput = {
id?: string
type: "text"
@@ -1107,50 +1352,6 @@ export type FormatterStatus = {
enabled: boolean
}
-export type EventTuiPromptAppend = {
- type: "tui.prompt.append"
- properties: {
- text: string
- }
-}
-
-export type EventTuiCommandExecute = {
- type: "tui.command.execute"
- properties: {
- command:
- | (
- | "session.list"
- | "session.new"
- | "session.share"
- | "session.interrupt"
- | "session.compact"
- | "session.page.up"
- | "session.page.down"
- | "session.half.page.up"
- | "session.half.page.down"
- | "session.first"
- | "session.last"
- | "prompt.clear"
- | "prompt.submit"
- | "agent.cycle"
- )
- | string
- }
-}
-
-export type EventTuiToastShow = {
- type: "tui.toast.show"
- properties: {
- title?: string
- message: string
- variant: "info" | "success" | "warning" | "error"
- /**
- * Duration in milliseconds
- */
- duration?: number
- }
-}
-
export type OAuth = {
type: "oauth"
refresh: string
@@ -1172,206 +1373,21 @@ export type WellKnownAuth = {
export type Auth = OAuth | ApiAuth | WellKnownAuth
-export type EventInstallationUpdated = {
- type: "installation.updated"
- properties: {
- version: string
- }
-}
-
-export type EventLspClientDiagnostics = {
- type: "lsp.client.diagnostics"
- properties: {
- serverID: string
- path: string
- }
-}
-
-export type EventLspUpdated = {
- type: "lsp.updated"
- properties: {
- [key: string]: unknown
- }
-}
-
-export type EventMessageUpdated = {
- type: "message.updated"
- properties: {
- info: Message
- }
-}
-
-export type EventMessageRemoved = {
- type: "message.removed"
- properties: {
- sessionID: string
- messageID: string
- }
-}
-
-export type EventMessagePartUpdated = {
- type: "message.part.updated"
- properties: {
- part: Part
- delta?: string
- }
-}
-
-export type EventMessagePartRemoved = {
- type: "message.part.removed"
- properties: {
- sessionID: string
- messageID: string
- partID: string
- }
-}
-
-export type EventSessionCompacted = {
- type: "session.compacted"
- properties: {
- sessionID: string
- }
-}
-
-export type Permission = {
- id: string
- type: string
- pattern?: string | Array<string>
- sessionID: string
- messageID: string
- callID?: string
- title: string
- metadata: {
- [key: string]: unknown
- }
- time: {
- created: number
- }
-}
-
-export type EventPermissionUpdated = {
- type: "permission.updated"
- properties: Permission
-}
-
-export type EventPermissionReplied = {
- type: "permission.replied"
- properties: {
- sessionID: string
- permissionID: string
- response: string
- }
-}
-
-export type EventFileEdited = {
- type: "file.edited"
- properties: {
- file: string
- }
-}
-
-export type EventTodoUpdated = {
- type: "todo.updated"
- properties: {
- sessionID: string
- todos: Array<Todo>
- }
-}
-
-export type EventCommandExecuted = {
- type: "command.executed"
- properties: {
- name: string
- sessionID: string
- arguments: string
- messageID: string
- }
-}
-
-export type EventSessionIdle = {
- type: "session.idle"
- properties: {
- sessionID: string
- }
-}
-
-export type EventSessionCreated = {
- type: "session.created"
- properties: {
- info: Session
- }
-}
-
-export type EventSessionUpdated = {
- type: "session.updated"
- properties: {
- info: Session
- }
-}
-
-export type EventSessionDeleted = {
- type: "session.deleted"
- properties: {
- info: Session
- }
-}
-
-export type EventSessionDiff = {
- type: "session.diff"
- properties: {
- sessionID: string
- diff: Array<FileDiff>
- }
-}
-
-export type EventSessionError = {
- type: "session.error"
- properties: {
- sessionID?: string
- error?: ProviderAuthError | UnknownError | MessageOutputLengthError | MessageAbortedError | ApiError
- }
-}
-
-export type EventServerConnected = {
- type: "server.connected"
- properties: {
- [key: string]: unknown
- }
+export type GlobalEventButtData = {
+ body?: never
+ path?: never
+ query?: never
+ url: "/global/event"
}
-export type EventFileWatcherUpdated = {
- type: "file.watcher.updated"
- properties: {
- file: string
- event: "add" | "change" | "unlink"
- }
+export type GlobalEventButtResponses = {
+ /**
+ * Event stream
+ */
+ 200: Event
}
-export type Event =
- | EventInstallationUpdated
- | EventLspClientDiagnostics
- | EventLspUpdated
- | EventMessageUpdated
- | EventMessageRemoved
- | EventMessagePartUpdated
- | EventMessagePartRemoved
- | EventSessionCompacted
- | EventPermissionUpdated
- | EventPermissionReplied
- | EventFileEdited
- | EventTodoUpdated
- | EventCommandExecuted
- | EventSessionIdle
- | EventSessionCreated
- | EventSessionUpdated
- | EventSessionDeleted
- | EventSessionDiff
- | EventSessionError
- | EventTuiPromptAppend
- | EventTuiCommandExecute
- | EventTuiToastShow
- | EventServerConnected
- | EventFileWatcherUpdated
+export type GlobalEventButtResponse = GlobalEventButtResponses[keyof GlobalEventButtResponses]
export type ProjectListData = {
body?: never