diff --git a/packages/desktop/vite.config.ts b/packages/desktop/vite.config.ts index ce81a1c6..0a801158 100644 --- a/packages/desktop/vite.config.ts +++ b/packages/desktop/vite.config.ts @@ -12,12 +12,12 @@ export default defineConfig({ root: path.resolve(__dirname, '.'), plugins: [react(), themeStoragePlugin()], resolve: { - alias: { - '@desktop': path.resolve(__dirname, './src'), - '@openchamber/ui': path.resolve(__dirname, '../ui/src'), - '@': path.resolve(__dirname, '../ui/src'), - '@opencode-ai/sdk': path.resolve(__dirname, '../../node_modules/@opencode-ai/sdk/dist/client.js'), - }, + alias: [ + { find: '@opencode-ai/sdk/v2', replacement: path.resolve(__dirname, '../../node_modules/@opencode-ai/sdk/dist/v2/client.js') }, + { find: '@openchamber/ui', replacement: path.resolve(__dirname, '../ui/src') }, + { find: '@desktop', replacement: path.resolve(__dirname, './src') }, + { find: '@', replacement: path.resolve(__dirname, '../ui/src') }, + ], }, worker: { format: 'es', @@ -31,7 +31,7 @@ export default defineConfig({ __APP_VERSION__: JSON.stringify(packageJson.version), }, optimizeDeps: { - include: ['@opencode-ai/sdk'], + include: ['@opencode-ai/sdk/v2'], exclude: [ '@tauri-apps/plugin-dialog', '@tauri-apps/api/core', diff --git a/packages/ui/src/components/chat/ChatMessage.tsx b/packages/ui/src/components/chat/ChatMessage.tsx index ec253f20..7e2b9228 100644 --- a/packages/ui/src/components/chat/ChatMessage.tsx +++ b/packages/ui/src/components/chat/ChatMessage.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { Message, Part } from '@opencode-ai/sdk'; +import type { Message, Part } from '@opencode-ai/sdk/v2'; import { useShallow } from 'zustand/react/shallow'; import { defaultCodeDark, defaultCodeLight } from '@/lib/codeTheme'; diff --git a/packages/ui/src/components/chat/MarkdownRenderer.tsx b/packages/ui/src/components/chat/MarkdownRenderer.tsx index 07cfe643..fd1ab9c3 100644 --- a/packages/ui/src/components/chat/MarkdownRenderer.tsx +++ b/packages/ui/src/components/chat/MarkdownRenderer.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Streamdown } from 'streamdown'; import { FadeInOnReveal } from './message/FadeInOnReveal'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; import { cn } from '@/lib/utils'; import { RiFileCopyLine, RiCheckLine, RiDownloadLine } from '@remixicon/react'; diff --git a/packages/ui/src/components/chat/MessageList.tsx b/packages/ui/src/components/chat/MessageList.tsx index 8f1d71cc..6cbbebe1 100644 --- a/packages/ui/src/components/chat/MessageList.tsx +++ b/packages/ui/src/components/chat/MessageList.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { Message, Part } from '@opencode-ai/sdk'; +import type { Message, Part } from '@opencode-ai/sdk/v2'; import ChatMessage from './ChatMessage'; import { PermissionCard } from './PermissionCard'; diff --git a/packages/ui/src/components/chat/TimelineDialog.tsx b/packages/ui/src/components/chat/TimelineDialog.tsx index 5ea11915..03e2ded6 100644 --- a/packages/ui/src/components/chat/TimelineDialog.tsx +++ b/packages/ui/src/components/chat/TimelineDialog.tsx @@ -12,7 +12,7 @@ import { useSessionStore } from '@/stores/useSessionStore'; import { useMessageStore } from '@/stores/messageStore'; import { cn } from '@/lib/utils'; import { RiLoader4Line, RiSearchLine, RiTimeLine, RiGitBranchLine } from '@remixicon/react'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; interface TimelineDialogProps { open: boolean; diff --git a/packages/ui/src/components/chat/hooks/useTurnGrouping.ts b/packages/ui/src/components/chat/hooks/useTurnGrouping.ts index 17e21dd9..5088629f 100644 --- a/packages/ui/src/components/chat/hooks/useTurnGrouping.ts +++ b/packages/ui/src/components/chat/hooks/useTurnGrouping.ts @@ -1,5 +1,5 @@ import React from 'react'; -import type { Message, Part } from '@opencode-ai/sdk'; +import type { Message, Part } from '@opencode-ai/sdk/v2'; import { useCurrentSessionActivity } from '@/hooks/useSessionActivity'; import { useUIStore } from '@/stores/useUIStore'; diff --git a/packages/ui/src/components/chat/message/MessageBody.tsx b/packages/ui/src/components/chat/message/MessageBody.tsx index 571294da..d49609a5 100644 --- a/packages/ui/src/components/chat/message/MessageBody.tsx +++ b/packages/ui/src/components/chat/message/MessageBody.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; import AssistantTextPart from './parts/AssistantTextPart'; import UserTextPart from './parts/UserTextPart'; @@ -8,7 +8,7 @@ import ToolPart from './parts/ToolPart'; import ProgressiveGroup from './parts/ProgressiveGroup'; import MigratingPart from './parts/MigratingPart'; import { MessageFilesDisplay } from '../FileAttachment'; -import type { ToolPart as ToolPartType } from '@opencode-ai/sdk'; +import type { ToolPart as ToolPartType } from '@opencode-ai/sdk/v2'; import type { StreamPhase, ToolPopupContent, AgentMentionInfo } from './types'; import type { TurnGroupingContext } from '../hooks/useTurnGrouping'; import { cn } from '@/lib/utils'; diff --git a/packages/ui/src/components/chat/message/messageRole.ts b/packages/ui/src/components/chat/message/messageRole.ts index 8dc607eb..b0c42b92 100644 --- a/packages/ui/src/components/chat/message/messageRole.ts +++ b/packages/ui/src/components/chat/message/messageRole.ts @@ -1,4 +1,4 @@ -import type { Message } from '@opencode-ai/sdk'; +import type { Message } from '@opencode-ai/sdk/v2'; export interface MessageRoleInfo { role: string; diff --git a/packages/ui/src/components/chat/message/partUtils.ts b/packages/ui/src/components/chat/message/partUtils.ts index f1f7a299..2e1c7651 100644 --- a/packages/ui/src/components/chat/message/partUtils.ts +++ b/packages/ui/src/components/chat/message/partUtils.ts @@ -1,4 +1,4 @@ -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; type PartWithText = Part & { text?: string; content?: string; value?: string }; diff --git a/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx b/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx index 0cdc6d25..5eb7bfbb 100644 --- a/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx +++ b/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; import { MarkdownRenderer } from '../../MarkdownRenderer'; import type { StreamPhase } from '../types'; import type { ContentChangeReason } from '@/hooks/useChatScrollManager'; diff --git a/packages/ui/src/components/chat/message/parts/JustificationBlock.tsx b/packages/ui/src/components/chat/message/parts/JustificationBlock.tsx index 5a8d4324..228ff2eb 100644 --- a/packages/ui/src/components/chat/message/parts/JustificationBlock.tsx +++ b/packages/ui/src/components/chat/message/parts/JustificationBlock.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; import type { ContentChangeReason } from '@/hooks/useChatScrollManager'; import { ReasoningTimelineBlock } from './ReasoningPart'; diff --git a/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx b/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx index 6410d3bf..d84b6114 100644 --- a/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx +++ b/packages/ui/src/components/chat/message/parts/ProgressiveGroup.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { RiArrowDownSLine, RiArrowRightSLine, RiStackLine } from '@remixicon/react'; import { cn } from '@/lib/utils'; import type { TurnActivityPart } from '../../hooks/useTurnGrouping'; -import type { ToolPart as ToolPartType } from '@opencode-ai/sdk'; +import type { ToolPart as ToolPartType } from '@opencode-ai/sdk/v2'; import type { ContentChangeReason } from '@/hooks/useChatScrollManager'; import type { ToolPopupContent } from '../types'; import ToolPart from './ToolPart'; diff --git a/packages/ui/src/components/chat/message/parts/ReasoningPart.tsx b/packages/ui/src/components/chat/message/parts/ReasoningPart.tsx index 8ca5d282..ef7f7ad0 100644 --- a/packages/ui/src/components/chat/message/parts/ReasoningPart.tsx +++ b/packages/ui/src/components/chat/message/parts/ReasoningPart.tsx @@ -1,6 +1,6 @@ import React from 'react'; import type { ComponentType } from 'react'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; import { RiArrowDownSLine, RiArrowRightSLine, RiBrainAi3Line, RiChatAi3Line } from '@remixicon/react'; import { cn } from '@/lib/utils'; import type { ContentChangeReason } from '@/hooks/useChatScrollManager'; diff --git a/packages/ui/src/components/chat/message/parts/ToolPart.tsx b/packages/ui/src/components/chat/message/parts/ToolPart.tsx index f01415cb..a0d473e6 100644 --- a/packages/ui/src/components/chat/message/parts/ToolPart.tsx +++ b/packages/ui/src/components/chat/message/parts/ToolPart.tsx @@ -5,7 +5,7 @@ import { RiArrowDownSLine, RiArrowRightSLine, RiBookLine, RiFileEditLine, RiFile import { cn } from '@/lib/utils'; import { SimpleMarkdownRenderer } from '../../MarkdownRenderer'; import { getToolMetadata, getLanguageFromExtension, isImageFile, getImageMimeType } from '@/lib/toolHelpers'; -import type { ToolPart as ToolPartType, ToolState as ToolStateUnion } from '@opencode-ai/sdk'; +import type { ToolPart as ToolPartType, ToolState as ToolStateUnion } from '@opencode-ai/sdk/v2'; import { toolDisplayStyles } from '@/lib/typography'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; import { useDirectoryStore } from '@/stores/useDirectoryStore'; diff --git a/packages/ui/src/components/chat/message/parts/UserTextPart.tsx b/packages/ui/src/components/chat/message/parts/UserTextPart.tsx index 479dd56d..690443fd 100644 --- a/packages/ui/src/components/chat/message/parts/UserTextPart.tsx +++ b/packages/ui/src/components/chat/message/parts/UserTextPart.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { cn } from '@/lib/utils'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; import type { AgentMentionInfo } from '../types'; type PartWithText = Part & { text?: string; content?: string; value?: string }; diff --git a/packages/ui/src/components/sections/agents/AgentsSidebar.tsx b/packages/ui/src/components/sections/agents/AgentsSidebar.tsx index a7e6d457..42ad9c3a 100644 --- a/packages/ui/src/components/sections/agents/AgentsSidebar.tsx +++ b/packages/ui/src/components/sections/agents/AgentsSidebar.tsx @@ -23,7 +23,7 @@ import { useUIStore } from '@/stores/useUIStore'; import { useDeviceInfo } from '@/lib/device'; import { isVSCodeRuntime } from '@/lib/desktop'; import { cn } from '@/lib/utils'; -import type { Agent } from '@opencode-ai/sdk'; +import type { Agent } from '@opencode-ai/sdk/v2'; import { ScrollableOverlay } from '@/components/ui/ScrollableOverlay'; interface AgentsSidebarProps { diff --git a/packages/ui/src/components/session/DirectoryTree.tsx b/packages/ui/src/components/session/DirectoryTree.tsx index 5cd6837c..c839cc26 100644 --- a/packages/ui/src/components/session/DirectoryTree.tsx +++ b/packages/ui/src/components/session/DirectoryTree.tsx @@ -400,10 +400,8 @@ export const DirectoryTree: React.FC = ({ const tempClient = opencodeClient.getApiClient(); const response = await tempClient.file.list({ - query: { - path: '.', - directory: path - } + path: '.', + directory: path }); if (!response.data) { diff --git a/packages/ui/src/components/session/SessionDialogs.tsx b/packages/ui/src/components/session/SessionDialogs.tsx index 94eba4be..f7923e0a 100644 --- a/packages/ui/src/components/session/SessionDialogs.tsx +++ b/packages/ui/src/components/session/SessionDialogs.tsx @@ -25,7 +25,7 @@ import { RiCheckboxBlankLine, RiCheckboxLine, RiDeleteBinLine } from '@remixicon import { MobileOverlayPanel } from '@/components/ui/MobileOverlayPanel'; import { DirectoryExplorerDialog } from './DirectoryExplorerDialog'; import { cn, formatPathForDisplay } from '@/lib/utils'; -import type { Session } from '@opencode-ai/sdk'; +import type { Session } from '@opencode-ai/sdk/v2'; import type { WorktreeMetadata } from '@/types/worktree'; import { archiveWorktree, diff --git a/packages/ui/src/components/session/SessionSidebar.tsx b/packages/ui/src/components/session/SessionSidebar.tsx index 198865bd..068380ed 100644 --- a/packages/ui/src/components/session/SessionSidebar.tsx +++ b/packages/ui/src/components/session/SessionSidebar.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { Session } from '@opencode-ai/sdk'; +import type { Session } from '@opencode-ai/sdk/v2'; import { toast } from 'sonner'; import { DropdownMenu, diff --git a/packages/ui/src/components/views/GitView.tsx b/packages/ui/src/components/views/GitView.tsx index 49ce1d98..99f81219 100644 --- a/packages/ui/src/components/views/GitView.tsx +++ b/packages/ui/src/components/views/GitView.tsx @@ -15,7 +15,7 @@ import { import { ScrollableOverlay } from '@/components/ui/ScrollableOverlay'; import { RiGitBranchLine, RiLoader4Line } from '@remixicon/react'; import { toast } from 'sonner'; -import type { Session } from '@opencode-ai/sdk'; +import type { Session } from '@opencode-ai/sdk/v2'; import { useRuntimeAPIs } from '@/hooks/useRuntimeAPIs'; import { useUIStore } from '@/stores/useUIStore'; diff --git a/packages/ui/src/hooks/useAssistantStatus.ts b/packages/ui/src/hooks/useAssistantStatus.ts index 388e6d66..c817eb73 100644 --- a/packages/ui/src/hooks/useAssistantStatus.ts +++ b/packages/ui/src/hooks/useAssistantStatus.ts @@ -1,5 +1,5 @@ import React from 'react'; -import type { AssistantMessage, Message, Part, ReasoningPart, TextPart, ToolPart } from '@opencode-ai/sdk'; +import type { AssistantMessage, Message, Part, ReasoningPart, TextPart, ToolPart } from '@opencode-ai/sdk/v2'; import { useShallow } from 'zustand/react/shallow'; import type { MessageStreamPhase } from '@/stores/types/sessionTypes'; diff --git a/packages/ui/src/hooks/useChatScrollManager.ts b/packages/ui/src/hooks/useChatScrollManager.ts index e10a88e3..a31062ef 100644 --- a/packages/ui/src/hooks/useChatScrollManager.ts +++ b/packages/ui/src/hooks/useChatScrollManager.ts @@ -1,5 +1,5 @@ import React from 'react'; -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; import { MessageFreshnessDetector } from '@/lib/messageFreshness'; diff --git a/packages/ui/src/hooks/useEventStream.ts b/packages/ui/src/hooks/useEventStream.ts index 6ca4d7ac..e6d596fc 100644 --- a/packages/ui/src/hooks/useEventStream.ts +++ b/packages/ui/src/hooks/useEventStream.ts @@ -5,7 +5,7 @@ import { useSessionStore } from '@/stores/useSessionStore'; import { useConfigStore } from '@/stores/useConfigStore'; import { useUIStore, type EventStreamStatus } from '@/stores/useUIStore'; import { useDirectoryStore } from '@/stores/useDirectoryStore'; -import type { Part, Session, Message, Permission } from '@opencode-ai/sdk'; +import type { Part, Session, Message, Permission } from '@opencode-ai/sdk/v2'; import { streamDebugEnabled } from '@/stores/utils/streamDebug'; import { handleTodoUpdatedEvent } from '@/stores/useTodoStore'; diff --git a/packages/ui/src/hooks/useMessageSync.ts b/packages/ui/src/hooks/useMessageSync.ts index 4516d71b..86fe55c3 100644 --- a/packages/ui/src/hooks/useMessageSync.ts +++ b/packages/ui/src/hooks/useMessageSync.ts @@ -1,5 +1,5 @@ import React from 'react'; -import type { AssistantMessage, Message, Part } from '@opencode-ai/sdk'; +import type { AssistantMessage, Message, Part } from '@opencode-ai/sdk/v2'; import { useSessionStore, MEMORY_LIMITS } from '@/stores/useSessionStore'; import { opencodeClient } from '@/lib/opencode/client'; import { readSessionCursor } from '@/lib/messageCursorPersistence'; diff --git a/packages/ui/src/hooks/useModelLists.ts b/packages/ui/src/hooks/useModelLists.ts index 0e2f0ee9..aeb795b0 100644 --- a/packages/ui/src/hooks/useModelLists.ts +++ b/packages/ui/src/hooks/useModelLists.ts @@ -1,7 +1,7 @@ import React from 'react'; import { useConfigStore } from '@/stores/useConfigStore'; import { useUIStore } from '@/stores/useUIStore'; -import type { Provider } from '@opencode-ai/sdk'; +import type { Provider } from '@opencode-ai/sdk/v2'; type ProviderModel = Provider["models"][string]; type ProviderWithModelList = Omit & { models: ProviderModel[] }; diff --git a/packages/ui/src/hooks/useSessionAutoCleanup.ts b/packages/ui/src/hooks/useSessionAutoCleanup.ts index 4fdd8722..810df7e6 100644 --- a/packages/ui/src/hooks/useSessionAutoCleanup.ts +++ b/packages/ui/src/hooks/useSessionAutoCleanup.ts @@ -1,5 +1,5 @@ import React from 'react'; -import type { Session } from '@opencode-ai/sdk'; +import type { Session } from '@opencode-ai/sdk/v2'; import { useSessionStore } from '@/stores/useSessionStore'; import { useUIStore } from '@/stores/useUIStore'; diff --git a/packages/ui/src/lib/messageCompletion.ts b/packages/ui/src/lib/messageCompletion.ts index 00ff9b4c..1682d9f2 100644 --- a/packages/ui/src/lib/messageCompletion.ts +++ b/packages/ui/src/lib/messageCompletion.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import type { Part } from "@opencode-ai/sdk"; +import type { Part } from "@opencode-ai/sdk/v2"; import { isFullySyntheticMessage } from "@/lib/messages/synthetic"; export interface MessageInfo { diff --git a/packages/ui/src/lib/messageFreshness.ts b/packages/ui/src/lib/messageFreshness.ts index 031dd2e3..e32c5843 100644 --- a/packages/ui/src/lib/messageFreshness.ts +++ b/packages/ui/src/lib/messageFreshness.ts @@ -1,4 +1,4 @@ -import type { Message } from '@opencode-ai/sdk'; +import type { Message } from '@opencode-ai/sdk/v2'; export class MessageFreshnessDetector { private static instance: MessageFreshnessDetector; diff --git a/packages/ui/src/lib/messages/agentMentions.ts b/packages/ui/src/lib/messages/agentMentions.ts index 845d39b2..4ac38b41 100644 --- a/packages/ui/src/lib/messages/agentMentions.ts +++ b/packages/ui/src/lib/messages/agentMentions.ts @@ -1,4 +1,4 @@ -import type { Agent } from "@opencode-ai/sdk"; +import type { Agent } from "@opencode-ai/sdk/v2"; export interface AgentMentionSource { value: string; diff --git a/packages/ui/src/lib/messages/messageText.ts b/packages/ui/src/lib/messages/messageText.ts index a9bedb8d..b4173ebe 100644 --- a/packages/ui/src/lib/messages/messageText.ts +++ b/packages/ui/src/lib/messages/messageText.ts @@ -1,4 +1,4 @@ -import type { Part } from '@opencode-ai/sdk'; +import type { Part } from '@opencode-ai/sdk/v2'; type TextLikePart = Part & { text?: string; content?: string }; diff --git a/packages/ui/src/lib/messages/synthetic.ts b/packages/ui/src/lib/messages/synthetic.ts index 43dc2a67..8fbaf4aa 100644 --- a/packages/ui/src/lib/messages/synthetic.ts +++ b/packages/ui/src/lib/messages/synthetic.ts @@ -1,4 +1,4 @@ -import type { Part } from "@opencode-ai/sdk"; +import type { Part } from "@opencode-ai/sdk/v2"; export const isSyntheticPart = (part: Part | undefined): boolean => { if (!part || typeof part !== "object") { diff --git a/packages/ui/src/lib/opencode/client.ts b/packages/ui/src/lib/opencode/client.ts index b52e3cbe..7aa66f20 100644 --- a/packages/ui/src/lib/opencode/client.ts +++ b/packages/ui/src/lib/opencode/client.ts @@ -1,4 +1,4 @@ -import { createOpencodeClient, OpencodeClient } from "@opencode-ai/sdk"; +import { createOpencodeClient, OpencodeClient } from "@opencode-ai/sdk/v2"; import type { FilesAPI, RuntimeAPIs } from "../api/types"; import { getDesktopHomeDirectory } from "../desktop"; import type { @@ -12,7 +12,7 @@ import type { TextPartInput, FilePartInput, Event, -} from "@opencode-ai/sdk"; +} from "@opencode-ai/sdk/v2"; type StreamEvent = { data: TData; event?: string; @@ -238,9 +238,9 @@ class OpencodeService { }; try { - const response = await this.client.path.get({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const response = await this.client.path.get( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); const info = response.data; if (info) { addCandidate(info.directory); @@ -253,9 +253,9 @@ class OpencodeService { if (!candidates.size) { try { - const project = await this.client.project.current({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const project = await this.client.project.current( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); addCandidate(project.data?.worktree); } catch (error) { console.debug('Failed to load project info:', error); @@ -296,19 +296,17 @@ class OpencodeService { // Session Management async listSessions(): Promise { - const response = await this.client.session.list({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const response = await this.client.session.list( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); return Array.isArray(response.data) ? response.data : []; } async createSession(params?: { parentID?: string; title?: string }): Promise { const response = await this.client.session.create({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined, - body: { - parentID: params?.parentID, - title: params?.title - } + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}), + parentID: params?.parentID, + title: params?.title }); if (!response.data) throw new Error('Failed to create session'); return response.data; @@ -316,8 +314,8 @@ class OpencodeService { async getSession(id: string): Promise { const response = await this.client.session.get({ - path: { id }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined + sessionID: id, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}) }); if (!response.data) throw new Error('Session not found'); return response.data; @@ -325,17 +323,17 @@ class OpencodeService { async deleteSession(id: string): Promise { const response = await this.client.session.delete({ - path: { id }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined + sessionID: id, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}) }); return response.data || false; } async updateSession(id: string, title?: string): Promise { const response = await this.client.session.update({ - path: { id }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined, - body: { title } + sessionID: id, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}), + title }); if (!response.data) throw new Error('Failed to update session'); return response.data; @@ -343,8 +341,8 @@ class OpencodeService { async getSessionMessages(id: string): Promise<{ info: Message; parts: Part[] }[]> { const response = await this.client.session.messages({ - path: { id }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined + sessionID: id, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}) }); return response.data || []; } @@ -618,17 +616,15 @@ class OpencodeService { // Use SDK session.prompt() method // DON'T send messageID - let server generate it (fixes Claude empty response issue) await this.client.session.prompt({ - path: { id: params.id }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined, - body: { - // messageID intentionally omitted - server will generate - model: { - providerID: params.providerID, - modelID: params.modelID - }, - agent: params.agent, - parts - } + sessionID: params.id, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}), + // messageID intentionally omitted - server will generate + model: { + providerID: params.providerID, + modelID: params.modelID + }, + agent: params.agent, + parts }); // Return temporary ID for optimistic UI @@ -637,19 +633,22 @@ class OpencodeService { } async abortSession(id: string): Promise { - const response = await this.client.session.abort({ - path: { id }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined, - throwOnError: true, - }); + const response = await this.client.session.abort( + { + sessionID: id, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}) + }, + { throwOnError: true } + ); return Boolean(response.data); } async revertSession(sessionId: string, messageId: string, partId?: string): Promise { const response = await this.client.session.revert({ - path: { id: sessionId }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined, - body: { messageID: messageId, partID: partId } + sessionID: sessionId, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}), + messageID: messageId, + partID: partId }); if (!response.data) throw new Error('Failed to revert session'); return response.data; @@ -657,33 +656,25 @@ class OpencodeService { async unrevertSession(sessionId: string): Promise { const response = await this.client.session.unrevert({ - path: { id: sessionId }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined + sessionID: sessionId, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}) }); if (!response.data) throw new Error('Failed to unrevert session'); return response.data; } async forkSession(sessionId: string, messageId?: string): Promise { - const baseUrl = this.baseUrl.replace(/\/$/, ''); - const url = new URL(`/api/session/${sessionId}/fork`, baseUrl); - - if (this.currentDirectory) { - url.searchParams.set('directory', this.currentDirectory); - } - - const response = await fetch(url.toString(), { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(messageId ? { messageID: messageId } : {}), + const response = await this.client.session.fork({ + sessionID: sessionId, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}), + messageID: messageId }); - if (!response.ok) { - const text = await response.text(); - throw new Error(`Failed to fork session: ${text || response.statusText}`); + if (!response.data) { + throw new Error('Failed to fork session'); } - return response.json(); + return response.data; } async getSessionStatus(): Promise< @@ -741,10 +732,11 @@ class OpencodeService { permissionId: string, response: 'once' | 'always' | 'reject' ): Promise { - const result = await this.client.postSessionIdPermissionsPermissionId({ - path: { id: sessionId, permissionID: permissionId }, - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined, - body: { response } + const result = await this.client.permission.respond({ + sessionID: sessionId, + permissionID: permissionId, + ...(this.currentDirectory ? { directory: this.currentDirectory } : {}), + response }); return result.data || false; } @@ -800,9 +792,9 @@ class OpencodeService { providers: Provider[]; default: { [key: string]: string }; }> { - const response = await this.client.config.providers({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const response = await this.client.config.providers( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); if (!response.data) throw new Error('Failed to get providers'); return response.data; } @@ -829,9 +821,9 @@ class OpencodeService { // Agent Management async listAgents(): Promise { try { - const response = await this.client.app.agents({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const response = await this.client.app.agents( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); return response.data || []; } catch { return []; @@ -868,17 +860,15 @@ class OpencodeService { const connect = async (attempt: number): Promise => { try { + const subscribeParameters = resolvedDirectory ? { directory: resolvedDirectory } : undefined; const subscribeOptions: { - query?: { directory?: string }; signal: AbortSignal; sseDefaultRetryDelay: number; sseMaxRetryDelay: number; onSseError?: (error: unknown) => void; onSseEvent: (event: StreamEvent) => void; headers?: Record; - lastEventId?: string; } = { - query: resolvedDirectory ? { directory: resolvedDirectory } : undefined, signal: abortController.signal, sseDefaultRetryDelay: 3000, sseMaxRetryDelay: 30000, @@ -904,11 +894,10 @@ class OpencodeService { }; if (lastEventId) { - subscribeOptions.lastEventId = lastEventId; subscribeOptions.headers = { ...(subscribeOptions.headers || {}), 'Last-Event-ID': lastEventId }; } - const result = await this.client.event.subscribe(subscribeOptions); + const result = await this.client.event.subscribe(subscribeParameters, subscribeOptions); if (onOpen && !abortController.signal.aborted) { console.log('[OpencodeClient] SSE connection opened'); @@ -1019,9 +1008,9 @@ class OpencodeService { // Command Management async listCommands(): Promise> { try { - const response = await this.client.command.list({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const response = await this.client.command.list( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); // Return only lightweight info for autocomplete return (response.data || []).map((cmd: Record) => ({ name: cmd.name as string, @@ -1037,9 +1026,9 @@ class OpencodeService { async listCommandsWithDetails(): Promise> { try { - const response = await this.client.command.list({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const response = await this.client.command.list( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); // Return full command details including template return (response.data || []).map((cmd: Record) => ({ name: cmd.name as string, @@ -1056,9 +1045,9 @@ class OpencodeService { async getCommandDetails(name: string): Promise<{ name: string; template: string; description?: string; agent?: string; model?: string } | null> { try { - const response = await this.client.command.list({ - query: this.currentDirectory ? { directory: this.currentDirectory } : undefined - }); + const response = await this.client.command.list( + this.currentDirectory ? { directory: this.currentDirectory } : undefined + ); if (response.data) { const command = response.data.find((cmd: Record) => cmd.name === name); diff --git a/packages/ui/src/lib/sessionEvents.ts b/packages/ui/src/lib/sessionEvents.ts index 4b1fe20b..32c5fc56 100644 --- a/packages/ui/src/lib/sessionEvents.ts +++ b/packages/ui/src/lib/sessionEvents.ts @@ -1,4 +1,4 @@ -import type { Session } from '@opencode-ai/sdk'; +import type { Session } from '@opencode-ai/sdk/v2'; import type { WorktreeMetadata } from '@/types/worktree'; export type SessionDeleteRequest = { diff --git a/packages/ui/src/stores/fileStore.ts b/packages/ui/src/stores/fileStore.ts index 4e221d03..e1e37678 100644 --- a/packages/ui/src/stores/fileStore.ts +++ b/packages/ui/src/stores/fileStore.ts @@ -216,10 +216,8 @@ export const useFileStore = create()( const filename = lastSlashIndex > 0 ? path.substring(lastSlashIndex + 1) : path; const response = await tempClient.file.read({ - query: { - path: filename, - directory: directory, - }, + path: filename, + directory: directory, }); if (response.data && "content" in response.data) { diff --git a/packages/ui/src/stores/messageStore.ts b/packages/ui/src/stores/messageStore.ts index 0e63a5af..89f65556 100644 --- a/packages/ui/src/stores/messageStore.ts +++ b/packages/ui/src/stores/messageStore.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { create } from "zustand"; import { devtools, persist, createJSONStorage } from "zustand/middleware"; -import type { Message, Part } from "@opencode-ai/sdk"; +import type { Message, Part } from "@opencode-ai/sdk/v2"; import { opencodeClient } from "@/lib/opencode/client"; import { isExecutionForkMetaText } from "@/lib/messages/executionMeta"; import type { SessionMemoryState, MessageStreamLifecycle, AttachedFile } from "./types/sessionTypes"; @@ -586,13 +586,11 @@ export const useMessageStore = create()( const messageId = `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`; await apiClient.session.init({ - path: { id: sessionId }, - body: { - messageID: messageId, - providerID, - modelID, - }, - query: directory ? { directory } : undefined, + sessionID: sessionId, + ...(directory ? { directory } : {}), + messageID: messageId, + providerID, + modelID, }); return; @@ -600,12 +598,10 @@ export const useMessageStore = create()( if (command === "summarize") { await apiClient.session.summarize({ - path: { id: sessionId }, - body: { - providerID, - modelID, - }, - query: directory ? { directory } : undefined, + sessionID: sessionId, + ...(directory ? { directory } : {}), + providerID, + modelID, }); return; diff --git a/packages/ui/src/stores/sessionStore.ts b/packages/ui/src/stores/sessionStore.ts index 88e55a9a..a79eaf89 100644 --- a/packages/ui/src/stores/sessionStore.ts +++ b/packages/ui/src/stores/sessionStore.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; import { devtools, persist, createJSONStorage } from "zustand/middleware"; -import type { Session } from "@opencode-ai/sdk"; +import type { Session } from "@opencode-ai/sdk/v2"; import { opencodeClient } from "@/lib/opencode/client"; import { getSafeStorage } from "./utils/safeStorage"; import type { WorktreeMetadata } from "@/types/worktree"; @@ -254,9 +254,9 @@ export const useSessionStore = create()( const apiClient = opencodeClient.getApiClient(); const fetchSessions = async (directoryParam?: string | null): Promise => { - const response = await apiClient.session.list({ - query: directoryParam ? { directory: directoryParam } : undefined, - }); + const response = await apiClient.session.list( + directoryParam ? { directory: directoryParam } : undefined + ); return Array.isArray(response.data) ? response.data : []; }; @@ -536,9 +536,9 @@ export const useSessionStore = create()( const attempts = 20; for (let attempt = 0; attempt < attempts; attempt += 1) { try { - const response = await apiClient.session.list({ - query: targetDirectory ? { directory: targetDirectory } : undefined, - }); + const response = await apiClient.session.list( + targetDirectory ? { directory: targetDirectory } : undefined + ); const list = Array.isArray(response.data) ? response.data : []; const candidate = list.find((entry) => { if (existingIds.has(entry.id)) return false; @@ -817,8 +817,8 @@ export const useSessionStore = create()( const shareRequest = async () => { const directory = sessionDirectory ?? opencodeClient.getDirectory(); return apiClient.session.share({ - path: { id }, - query: directory ? { directory } : undefined, + sessionID: id, + ...(directory ? { directory } : {}) }); }; const response = overrideDirectory @@ -849,8 +849,8 @@ export const useSessionStore = create()( const unshareRequest = async () => { const directory = sessionDirectory ?? opencodeClient.getDirectory(); return apiClient.session.unshare({ - path: { id }, - query: directory ? { directory } : undefined, + sessionID: id, + ...(directory ? { directory } : {}) }); }; const response = overrideDirectory diff --git a/packages/ui/src/stores/types/sessionTypes.ts b/packages/ui/src/stores/types/sessionTypes.ts index 1852b402..e1e1affa 100644 --- a/packages/ui/src/stores/types/sessionTypes.ts +++ b/packages/ui/src/stores/types/sessionTypes.ts @@ -1,4 +1,4 @@ -import type { Session, Message, Part } from "@opencode-ai/sdk"; +import type { Session, Message, Part } from "@opencode-ai/sdk/v2"; import type { Permission, PermissionResponse } from "@/types/permission"; export interface AttachedFile { diff --git a/packages/ui/src/stores/useAgentsStore.ts b/packages/ui/src/stores/useAgentsStore.ts index a0a7e764..da44c193 100644 --- a/packages/ui/src/stores/useAgentsStore.ts +++ b/packages/ui/src/stores/useAgentsStore.ts @@ -1,7 +1,7 @@ import { create } from "zustand"; import type { StoreApi, UseBoundStore } from "zustand"; import { devtools, persist, createJSONStorage } from "zustand/middleware"; -import type { Agent } from "@opencode-ai/sdk"; +import type { Agent } from "@opencode-ai/sdk/v2"; import { opencodeClient } from "@/lib/opencode/client"; import { emitConfigChange, scopeMatches, subscribeToConfigChanges } from "@/lib/configSync"; import { @@ -62,8 +62,10 @@ export type AgentWithExtras = Agent & { }; // Helper to check if agent is built-in (handles both SDK 'builtIn' and API 'native') -export const isAgentBuiltIn = (agent: Agent): boolean => - agent.builtIn || (agent as AgentWithExtras).native === true; +export const isAgentBuiltIn = (agent: Agent): boolean => { + const extended = agent as AgentWithExtras & { builtIn?: boolean }; + return extended.native === true || extended.builtIn === true; +}; // Helper to check if agent is hidden (internal agents like title, compaction, summary) // Checks both top-level hidden and options.hidden (OpenCode API inconsistency workaround) diff --git a/packages/ui/src/stores/useConfigStore.ts b/packages/ui/src/stores/useConfigStore.ts index 8b2ddd48..3246e7e0 100644 --- a/packages/ui/src/stores/useConfigStore.ts +++ b/packages/ui/src/stores/useConfigStore.ts @@ -1,7 +1,7 @@ import { create } from "zustand"; import type { StoreApi, UseBoundStore } from "zustand"; import { devtools, persist, createJSONStorage } from "zustand/middleware"; -import type { Provider, Agent } from "@opencode-ai/sdk"; +import type { Provider, Agent } from "@opencode-ai/sdk/v2"; import { opencodeClient } from "@/lib/opencode/client"; import { scopeMatches, subscribeToConfigChanges } from "@/lib/configSync"; import type { ModelMetadata } from "@/types"; diff --git a/packages/ui/src/stores/useSessionStore.ts b/packages/ui/src/stores/useSessionStore.ts index c6266727..59102b1c 100644 --- a/packages/ui/src/stores/useSessionStore.ts +++ b/packages/ui/src/stores/useSessionStore.ts @@ -1,7 +1,7 @@ import { create } from "zustand"; import type { StoreApi, UseBoundStore } from "zustand"; import { devtools } from "zustand/middleware"; -import type { Session, Message, Part } from "@opencode-ai/sdk"; +import type { Session, Message, Part } from "@opencode-ai/sdk/v2"; import type { Permission, PermissionResponse } from "@/types/permission"; import type { SessionStore, AttachedFile, EditPermissionMode } from "./types/sessionTypes"; import { ACTIVE_SESSION_WINDOW, MEMORY_LIMITS } from "./types/sessionTypes"; diff --git a/packages/ui/src/stores/utils/messageUtils.ts b/packages/ui/src/stores/utils/messageUtils.ts index a635a84b..ebacb15d 100644 --- a/packages/ui/src/stores/utils/messageUtils.ts +++ b/packages/ui/src/stores/utils/messageUtils.ts @@ -1,4 +1,4 @@ -import type { Part } from "@opencode-ai/sdk"; +import type { Part } from "@opencode-ai/sdk/v2"; const extractTextFromDelta = (delta: unknown): string => { if (!delta) return ''; diff --git a/packages/ui/src/stores/utils/tokenUtils.ts b/packages/ui/src/stores/utils/tokenUtils.ts index 8a47f824..1562ffc2 100644 --- a/packages/ui/src/stores/utils/tokenUtils.ts +++ b/packages/ui/src/stores/utils/tokenUtils.ts @@ -1,4 +1,4 @@ -import type { Message, Part } from "@opencode-ai/sdk"; +import type { Message, Part } from "@opencode-ai/sdk/v2"; type TokenBreakdown = { input?: number; diff --git a/packages/ui/src/types/index.ts b/packages/ui/src/types/index.ts index 512074c2..72a6010f 100644 --- a/packages/ui/src/types/index.ts +++ b/packages/ui/src/types/index.ts @@ -1,4 +1,4 @@ -import type { Session, Message, Part, Provider } from "@opencode-ai/sdk"; +import type { Session, Message, Part, Provider } from "@opencode-ai/sdk/v2"; export type { Session, Message, Part, Provider }; diff --git a/packages/vscode/vite.config.ts b/packages/vscode/vite.config.ts index 2252c6d6..8ef4339c 100644 --- a/packages/vscode/vite.config.ts +++ b/packages/vscode/vite.config.ts @@ -10,12 +10,12 @@ export default defineConfig({ base: './', // Use relative paths for VS Code webview plugins: [react()], resolve: { - alias: { - '@': path.resolve(__dirname, '../ui/src'), - '@vscode': path.resolve(__dirname, './webview'), - '@openchamber/ui': path.resolve(__dirname, '../ui/src'), - '@opencode-ai/sdk': path.resolve(__dirname, '../../node_modules/@opencode-ai/sdk/dist/client.js'), - }, + alias: [ + { find: '@opencode-ai/sdk/v2', replacement: path.resolve(__dirname, '../../node_modules/@opencode-ai/sdk/dist/v2/client.js') }, + { find: '@openchamber/ui', replacement: path.resolve(__dirname, '../ui/src') }, + { find: '@vscode', replacement: path.resolve(__dirname, './webview') }, + { find: '@', replacement: path.resolve(__dirname, '../ui/src') }, + ], }, worker: { format: 'es', @@ -26,7 +26,7 @@ export default defineConfig({ }, envPrefix: ['VITE_'], optimizeDeps: { - include: ['@opencode-ai/sdk'], + include: ['@opencode-ai/sdk/v2'], }, build: { outDir: path.resolve(__dirname, 'dist/webview'), diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts index 36cabec0..4e949970 100644 --- a/packages/web/vite.config.ts +++ b/packages/web/vite.config.ts @@ -15,12 +15,12 @@ export default defineConfig({ themeStoragePlugin(), ], resolve: { - alias: { - '@': path.resolve(__dirname, '../ui/src'), - '@web': path.resolve(__dirname, './src'), - '@openchamber/ui': path.resolve(__dirname, '../ui/src'), - '@opencode-ai/sdk': path.resolve(__dirname, '../../node_modules/@opencode-ai/sdk/dist/client.js'), - }, + alias: [ + { find: '@opencode-ai/sdk/v2', replacement: path.resolve(__dirname, '../../node_modules/@opencode-ai/sdk/dist/v2/client.js') }, + { find: '@openchamber/ui', replacement: path.resolve(__dirname, '../ui/src') }, + { find: '@web', replacement: path.resolve(__dirname, './src') }, + { find: '@', replacement: path.resolve(__dirname, '../ui/src') }, + ], }, worker: { format: 'es', @@ -31,7 +31,7 @@ export default defineConfig({ __APP_VERSION__: JSON.stringify(packageJson.version), }, optimizeDeps: { - include: ['@opencode-ai/sdk'], + include: ['@opencode-ai/sdk/v2'], }, server: { port: 5173, diff --git a/vite.config.ts b/vite.config.ts index e53a16e4..5284e71d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -12,10 +12,10 @@ export default defineConfig({ themeStoragePlugin(), ], resolve: { - alias: { - '@': path.resolve(__dirname, './src'), - '@opencode-ai/sdk': path.resolve(__dirname, './node_modules/@opencode-ai/sdk/dist/client.js'), - }, + alias: [ + { find: '@opencode-ai/sdk/v2', replacement: path.resolve(__dirname, './node_modules/@opencode-ai/sdk/dist/v2/client.js') }, + { find: '@', replacement: path.resolve(__dirname, './src') }, + ], }, worker: { format: 'es', @@ -25,7 +25,7 @@ export default defineConfig({ global: 'globalThis', }, optimizeDeps: { - include: ['@opencode-ai/sdk'], + include: ['@opencode-ai/sdk/v2'], }, build: { chunkSizeWarningLimit: 1200,