Compare commits

...

2 Commits

Author SHA1 Message Date
Aiden Cline 6097c143af fix(app): include current server events 2026-07-26 17:26:44 -05:00
Aiden Cline 5bb0fb580f fix(sdk): use local v2 type owners 2026-07-26 17:23:22 -05:00
32 changed files with 81 additions and 83 deletions
+1
View File
@@ -499,6 +499,7 @@
"version": "1.18.4",
"dependencies": {
"@hono/standard-validator": "catalog:",
"@opencode-ai/client": "workspace:*",
"@opencode-ai/core": "workspace:*",
"@opencode-ai/session-ui": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -8,8 +8,8 @@ import type {
QuestionRequest,
Session,
SessionStatus,
FileDiffInfo,
} from "@opencode-ai/sdk/v2/client"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { State, VcsCache } from "./types"
import { trimSessions } from "./session-trim"
import { dropSessionCaches } from "./session-cache"
@@ -5,8 +5,8 @@ import type {
PermissionRequest,
QuestionRequest,
SessionStatus,
FileDiffInfo,
} from "@opencode-ai/sdk/v2/client"
import type { FileDiffInfo } from "@opencode-ai/client"
import { dropSessionCaches, pickSessionCacheEvictions } from "./session-cache"
const msg = (id: string, sessionID: string) =>
@@ -4,8 +4,8 @@ import type {
PermissionRequest,
QuestionRequest,
SessionStatus,
FileDiffInfo,
} from "@opencode-ai/sdk/v2/client"
import type { FileDiffInfo } from "@opencode-ai/client"
export const SESSION_CACHE_LIMIT = 40
@@ -13,9 +13,9 @@ import type {
ReferenceInfo,
Session,
SessionStatus,
FileDiffInfo,
VcsInfo,
} from "@opencode-ai/sdk/v2/client"
import type { FileDiffInfo } from "@opencode-ai/client"
import { NormalizedProviderListResponse } from "@opencode-ai/session-ui/context"
import type { Accessor } from "solid-js"
import type { SetStoreFunction, Store } from "solid-js/store"
+4 -1
View File
@@ -18,7 +18,10 @@ const isAbortError = (error: unknown) =>
error !== null && typeof error === "object" && "name" in error && error.name === "AbortError"
const isStreamClosed = (error: unknown, signal?: AbortSignal) => isAbortError(error) || signal?.aborted === true
export type ServerEvent = Event & { current?: OpenCodeEvent }
type CurrentServerEvent<T extends OpenCodeEvent = OpenCodeEvent> = T extends OpenCodeEvent
? { id: string; type: T["type"]; properties: T["data"]; current: T }
: never
export type ServerEvent = (Event & { current?: OpenCodeEvent }) | CurrentServerEvent
type QueuedServerEvent = { directory: string; payload: ServerEvent }
type CurrentDelta = Extract<
OpenCodeEvent,
+1 -1
View File
@@ -8,8 +8,8 @@ import type {
QuestionRequest,
Session,
SessionStatus,
FileDiffInfo,
} from "@opencode-ai/sdk/v2/client"
import type { FileDiffInfo } from "@opencode-ai/client"
import { batch } from "solid-js"
import { createStore, produce, reconcile } from "solid-js/store"
import { diffs as cleanDiffs, message as cleanMessage } from "@/utils/diffs"
@@ -1,6 +1,7 @@
import { createEffect, onCleanup, type JSX } from "solid-js"
import { makeEventListener } from "@solid-primitives/event-listener"
import type { FileDiffInfo, VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { VcsFileDiff } from "@opencode-ai/sdk/v2"
import { SessionReview } from "@opencode-ai/session-ui/session-review"
import type {
SessionReviewCommentActions,
@@ -23,7 +23,8 @@ import { Mark } from "@opencode-ai/ui/logo"
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
import { KeybindV2 } from "@opencode-ai/ui/v2/keybind-v2"
import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2"
import type { FileDiffInfo, VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { VcsFileDiff } from "@opencode-ai/sdk/v2"
import { ConstrainDragYAxis, getDraggableId } from "@/utils/solid-dnd"
import { useDialog } from "@opencode-ai/ui/context/dialog"
@@ -1,4 +1,5 @@
import type { FileDiffInfo, VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { Kind } from "@/components/file-tree-v2"
import { normalizeFileTreeV2Path } from "@/components/file-tree-v2-model"
@@ -1,5 +1,6 @@
import { createMemo, createResource, createSignal, Show, type JSX } from "solid-js"
import type { FileDiffInfo, VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { VcsFileDiff } from "@opencode-ai/sdk/v2"
import {
SESSION_REVIEW_V2_SIDEBAR_WIDTH_MAX,
SESSION_REVIEW_V2_SIDEBAR_WIDTH_MIN,
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, test } from "bun:test"
import type { FileDiffInfo } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { Message } from "@opencode-ai/sdk/v2/client"
import { diffs, message } from "./diffs"
+1 -1
View File
@@ -1,4 +1,4 @@
import type { FileDiffInfo } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { Message } from "@opencode-ai/sdk/v2/client"
type Diff = FileDiffInfo
+2 -2
View File
@@ -2,7 +2,7 @@ export * as PluginHost from "./host"
import { Plugin } from "@opencode-ai/plugin/v2/effect"
import type { IntegrationMethodRegistration } from "@opencode-ai/plugin/v2/effect/integration"
import type { CredentialOAuth } from "@opencode-ai/sdk/v2/types"
import type { Credential } from "@opencode-ai/schema/credential"
import { EventManifest } from "@opencode-ai/schema/event-manifest"
import { App } from "../app"
import { Effect, Schema, Stream } from "effect"
@@ -451,6 +451,6 @@ function methodImplementation(input: IntegrationMethodRegistration): Integration
}
}
function credential(value: CredentialOAuth) {
function credential(value: Credential.OAuth) {
return Credential.OAuth.make({ ...value, methodID: Integration.MethodID.make(value.methodID) })
}
@@ -2,7 +2,7 @@ import { Duration, Effect, Schema, Semaphore, Stream } from "effect"
import type { Scope } from "effect"
import type { IntegrationOAuthMethodRegistration } from "@opencode-ai/plugin/v2/effect/integration"
import { define } from "@opencode-ai/plugin/v2/effect/plugin"
import type { CredentialValue } from "@opencode-ai/sdk/v2/types"
import type { Credential } from "@opencode-ai/schema/credential"
import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http"
import { EventV2 } from "../../event"
import { Credential } from "../../credential"
@@ -198,7 +198,7 @@ export const OpencodePlugin = define<HttpClient.HttpClient | EventV2.Service | S
}),
})
function fetchProviders(http: HttpClient.HttpClient, value: CredentialValue) {
function fetchProviders(http: HttpClient.HttpClient, value: Credential.Value) {
const metadata = value.metadata
const server = typeof metadata?.server === "string" ? metadata.server : defaultServer
const orgID = typeof metadata?.orgID === "string" ? metadata.orgID : undefined
+8 -8
View File
@@ -10,12 +10,12 @@ import { ProviderV2 } from "@opencode-ai/core/provider"
import { AbsolutePath } from "@opencode-ai/core/schema"
import { WebSearch } from "@opencode-ai/core/websearch"
import type {
CredentialOAuth,
IntegrationCommandMethod,
IntegrationEnvMethod,
IntegrationKeyMethod,
IntegrationOAuthMethod,
} from "@opencode-ai/sdk/v2/types"
CommandMethod,
EnvMethod,
KeyMethod,
OAuthMethod,
} from "@opencode-ai/schema/integration"
import type { OAuth } from "@opencode-ai/schema/credential"
import { Effect, Stream } from "effect"
type Overrides = Partial<Omit<Plugin.Context, "options" | "session">> & {
@@ -370,7 +370,7 @@ export function webSearchHost(websearch: WebSearch.Interface): Plugin.Context["w
}
}
function oauthCredential(value: CredentialOAuth) {
function oauthCredential(value: OAuth) {
return Credential.OAuth.make({ ...value, methodID: Integration.MethodID.make(value.methodID) })
}
@@ -390,7 +390,7 @@ function method(value: Integration.Method) {
}
function internalMethod(
value: IntegrationOAuthMethod | IntegrationCommandMethod | IntegrationKeyMethod | IntegrationEnvMethod,
value: OAuthMethod | CommandMethod | KeyMethod | EnvMethod,
): Integration.Method {
if (value.type === "env") return value
if (value.type === "key") return value
+1
View File
@@ -13,6 +13,7 @@
"shell-prod": "sst shell --target Teams --stage production"
},
"dependencies": {
"@opencode-ai/client": "workspace:*",
"@opencode-ai/core": "workspace:*",
"@opencode-ai/session-ui": "workspace:*",
"@opencode-ai/ui": "workspace:*",
+2 -1
View File
@@ -1,4 +1,5 @@
import { FileDiffInfo, Message, Model, Part, Session } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import { Message, Model, Part, Session } from "@opencode-ai/sdk/v2"
import { iife } from "@opencode-ai/core/util/iife"
import z from "zod"
import { Storage } from "./storage"
@@ -1,4 +1,5 @@
import { FileDiffInfo, Message, Model, Part, Session, SessionStatus, UserMessage } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import { Message, Model, Part, Session, SessionStatus, UserMessage } from "@opencode-ai/sdk/v2"
import { SessionTurn } from "@opencode-ai/session-ui/session-turn"
import { SessionReview } from "@opencode-ai/session-ui/session-review"
import { DataProvider } from "@opencode-ai/session-ui/context"
+1 -1
View File
@@ -1,5 +1,5 @@
import type { AgentApi } from "@opencode-ai/client/effect/api"
import type { AgentInfo } from "@opencode-ai/sdk/v2/types"
import type { AgentInfo } from "@opencode-ai/client/effect"
import type { Effect } from "effect"
import type { Transform } from "./registration.js"
+1 -1
View File
@@ -1,4 +1,4 @@
import type { ModelInfo, ProviderV2Info } from "@opencode-ai/sdk/v2/types"
import type { ModelInfo, ProviderV2Info } from "@opencode-ai/client/effect"
import type { CatalogApi } from "@opencode-ai/client/effect/api"
import type { Model } from "@opencode-ai/schema/model"
import type { Effect } from "effect"
+1 -1
View File
@@ -1,4 +1,4 @@
import type { CommandInfo } from "@opencode-ai/sdk/v2/types"
import type { CommandInfo } from "@opencode-ai/client/effect"
import type { CommandApi } from "@opencode-ai/client/effect/api"
import type { Effect } from "effect"
import type { Transform } from "./registration.js"
+1 -1
View File
@@ -1,4 +1,4 @@
import type { FileSystemEntry } from "@opencode-ai/sdk/v2/types"
import type { FileSystemEntry } from "@opencode-ai/client/effect"
import type { Effect } from "effect"
export interface FileSystem {
+19 -28
View File
@@ -1,15 +1,6 @@
import type {
ConnectionInfo,
CredentialOAuth,
CredentialValue,
IntegrationCommandMethod,
IntegrationEnvMethod,
IntegrationInputs,
IntegrationKeyMethod,
IntegrationMethod,
IntegrationOAuthMethod,
IntegrationRef,
} from "@opencode-ai/sdk/v2/types"
import type { Connection } from "@opencode-ai/schema/connection"
import type { Credential } from "@opencode-ai/schema/credential"
import type { Integration } from "@opencode-ai/schema/integration"
import type { IntegrationApi } from "@opencode-ai/client/effect/api"
import type { Effect, Scope } from "effect"
import type { Transform } from "./registration.js"
@@ -21,44 +12,44 @@ export type IntegrationOAuthAuthorization = {
} & (
| {
readonly mode: "auto"
readonly callback: Effect.Effect<CredentialOAuth, unknown>
readonly callback: Effect.Effect<Credential.OAuth, unknown>
}
| {
readonly mode: "code"
readonly callback: (code: string) => Effect.Effect<CredentialOAuth, unknown>
readonly callback: (code: string) => Effect.Effect<Credential.OAuth, unknown>
}
)
export type IntegrationOAuthMethodRegistration = {
readonly integrationID: string
readonly method: IntegrationOAuthMethod
readonly authorize: (inputs: IntegrationInputs) => Effect.Effect<IntegrationOAuthAuthorization, unknown, Scope.Scope>
readonly refresh?: (credential: CredentialOAuth) => Effect.Effect<CredentialOAuth, unknown>
readonly label?: (credential: CredentialOAuth) => string | undefined
readonly method: Integration.OAuthMethod
readonly authorize: (inputs: Integration.Inputs) => Effect.Effect<IntegrationOAuthAuthorization, unknown, Scope.Scope>
readonly refresh?: (credential: Credential.OAuth) => Effect.Effect<Credential.OAuth, unknown>
readonly label?: (credential: Credential.OAuth) => string | undefined
}
export type IntegrationMethodRegistration =
| IntegrationOAuthMethodRegistration
| {
readonly integrationID: string
readonly method: IntegrationCommandMethod
readonly method: Integration.CommandMethod
}
| {
readonly integrationID: string
readonly method: IntegrationKeyMethod
readonly method: Integration.KeyMethod
}
| {
readonly integrationID: string
readonly method: IntegrationEnvMethod
readonly method: Integration.EnvMethod
}
export interface IntegrationDraft {
list(): readonly IntegrationRef[]
get(id: string): IntegrationRef | undefined
update(id: string, update: (integration: IntegrationRef) => void): void
list(): readonly Integration.Ref[]
get(id: string): Integration.Ref | undefined
update(id: string, update: (integration: Integration.Ref) => void): void
remove(id: string): void
readonly method: {
list(integrationID: string): readonly IntegrationMethod[]
list(integrationID: string): readonly Integration.Method[]
update(input: IntegrationMethodRegistration): void
remove(integrationID: string, method: IntegrationMethod): void
remove(integrationID: string, method: Integration.Method): void
}
}
@@ -66,7 +57,7 @@ export interface IntegrationDomain extends Omit<IntegrationApi<unknown>, "wellkn
readonly transform: Transform<IntegrationDraft>
readonly reload: () => Effect.Effect<void>
readonly connection: {
readonly active: (integrationID: string) => Effect.Effect<ConnectionInfo | undefined>
readonly resolve: (connection: ConnectionInfo) => Effect.Effect<CredentialValue | undefined, unknown>
readonly active: (integrationID: string) => Effect.Effect<Connection.Info | undefined>
readonly resolve: (connection: Connection.Info) => Effect.Effect<Credential.Value | undefined, unknown>
}
}
+3 -3
View File
@@ -1,12 +1,12 @@
import type { ReferenceGitSource, ReferenceLocalSource } from "@opencode-ai/sdk/v2/types"
import type { Reference } from "@opencode-ai/schema/reference"
import type { ReferenceApi } from "@opencode-ai/client/effect/api"
import type { Effect } from "effect"
import type { Transform } from "./registration.js"
export interface ReferenceDraft {
add(name: string, source: ReferenceLocalSource | ReferenceGitSource): void
add(name: string, source: Reference.LocalSource | Reference.GitSource): void
remove(name: string): void
list(): readonly (readonly [string, ReferenceLocalSource | ReferenceGitSource])[]
list(): readonly (readonly [string, Reference.LocalSource | Reference.GitSource])[]
}
export interface ReferenceDomain extends ReferenceApi<unknown> {
+3 -3
View File
@@ -1,11 +1,11 @@
import type { SkillSource } from "@opencode-ai/sdk/v2/types"
import type { Skill } from "@opencode-ai/schema/skill"
import type { SkillApi } from "@opencode-ai/client/effect/api"
import type { Effect } from "effect"
import type { Transform } from "./registration.js"
export interface SkillDraft {
source(source: SkillSource): void
list(): readonly SkillSource[]
source(source: Skill.Source): void
list(): readonly Skill.Source[]
}
export interface SkillDomain extends SkillApi<unknown> {
+6 -14
View File
@@ -1,13 +1,7 @@
import type { IntegrationApi } from "@opencode-ai/client/promise/api"
import type { IntegrationDraft, IntegrationMethodRegistration } from "../effect/integration.js"
import type {
CredentialOAuth,
CredentialValue,
IntegrationEnvMethod,
IntegrationInputs,
IntegrationKeyMethod,
IntegrationOAuthMethod,
} from "@opencode-ai/sdk/v2/types"
import type { Connection } from "@opencode-ai/schema/connection"
import type { Credential } from "@opencode-ai/schema/credential"
import type { Transform } from "./registration.js"
export type { IntegrationDraft, IntegrationMethodRegistration }
@@ -19,11 +13,11 @@ export type IntegrationOAuthAuthorization = {
} & (
| {
readonly mode: "auto"
readonly callback: Promise<CredentialOAuth>
readonly callback: Promise<Credential.OAuth>
}
| {
readonly mode: "code"
readonly callback: (code: string) => Promise<CredentialOAuth>
readonly callback: (code: string) => Promise<Credential.OAuth>
}
)
@@ -31,9 +25,7 @@ export interface IntegrationDomain extends Omit<IntegrationApi, "wellknown"> {
readonly transform: Transform<IntegrationDraft>
readonly reload: () => Promise<void>
readonly connection: {
readonly active: (integrationID: string) => Promise<import("@opencode-ai/sdk/v2/types").ConnectionInfo | undefined>
readonly resolve: (
connection: import("@opencode-ai/sdk/v2/types").ConnectionInfo,
) => Promise<CredentialValue | undefined>
readonly active: (integrationID: string) => Promise<Connection.Info | undefined>
readonly resolve: (connection: Connection.Info) => Promise<Credential.Value | undefined>
}
}
@@ -1,6 +1,7 @@
import { parseDiffFromFile, parsePatchFiles, type FileDiffMetadata } from "@pierre/diffs"
import { parsePatch } from "diff"
import type { FileDiffInfo, VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { VcsFileDiff } from "@opencode-ai/sdk/v2"
type LegacyDiff = {
file: string
@@ -15,7 +15,8 @@ import { getDirectory, getFilename } from "@opencode-ai/core/util/path"
import { checksum } from "@opencode-ai/core/util/encode"
import { createEffect, createMemo, For, Match, onCleanup, Show, Switch, untrack, type JSX } from "solid-js"
import { createStore } from "solid-js/store"
import { type FileContent, type FileDiffInfo, type VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import { type FileContent, type VcsFileDiff } from "@opencode-ai/sdk/v2"
import { PreloadMultiFileDiffResult } from "@pierre/diffs/ssr"
import { type SelectedLineRange } from "@pierre/diffs"
import { Dynamic } from "solid-js/web"
@@ -1,10 +1,10 @@
import {
AssistantMessage,
type FileDiffInfo,
Message as MessageType,
Part as PartType,
type UserMessage,
} from "@opencode-ai/sdk/v2/client"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { SessionStatus } from "@opencode-ai/sdk/v2"
import { useData } from "../context"
import { useFileComponent } from "@opencode-ai/ui/context/file"
+2 -1
View File
@@ -1,4 +1,5 @@
import type { FileDiffInfo, Message, Part, Provider, Session, SessionStatus } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { Message, Part, Provider, Session, SessionStatus } from "@opencode-ai/sdk/v2"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { PreloadMultiFileDiffResult } from "@pierre/diffs/ssr"
@@ -6,7 +6,8 @@ import { useFileComponent } from "@opencode-ai/ui/context/file"
import { useI18n } from "@opencode-ai/ui/context/i18n"
import { mediaKindFromPath } from "../../pierre/media"
import { cloneSelectedLineRange, previewSelectedLines } from "../../pierre/selection-bridge"
import type { FileContent, FileDiffInfo, VcsFileDiff } from "@opencode-ai/sdk/v2"
import type { FileDiffInfo } from "@opencode-ai/client"
import type { FileContent, VcsFileDiff } from "@opencode-ai/sdk/v2"
import { createEffect, createMemo, onCleanup, Show, untrack } from "solid-js"
import { createStore } from "solid-js/store"
import { Dynamic } from "solid-js/web"