180 lines
4.7 KiB
TypeScript
180 lines
4.7 KiB
TypeScript
"use client"
|
|
|
|
import { useCallback, useMemo, useSyncExternalStore } from "react"
|
|
import {
|
|
useAcpActions,
|
|
useConnectionStore,
|
|
type ConnectionState,
|
|
type ConnectOptions,
|
|
type LiveMessage,
|
|
type PendingPermission,
|
|
type PendingQuestion,
|
|
} from "@/contexts/acp-connections-context"
|
|
import type {
|
|
AgentType,
|
|
AvailableCommandInfo,
|
|
ConnectionStatus,
|
|
PromptCapabilitiesInfo,
|
|
SessionConfigOptionInfo,
|
|
SessionModeStateInfo,
|
|
PromptInputBlock,
|
|
} from "@/lib/types"
|
|
|
|
const DEFAULT_PROMPT_CAPABILITIES: PromptCapabilitiesInfo = {
|
|
image: false,
|
|
audio: false,
|
|
embedded_context: false,
|
|
}
|
|
|
|
export interface UseConnectionReturn {
|
|
connectionId: string | null
|
|
status: ConnectionStatus | null
|
|
promptCapabilities: PromptCapabilitiesInfo
|
|
supportsFork: boolean
|
|
selectorsReady: boolean
|
|
sessionId: string | null
|
|
modes: SessionModeStateInfo | null
|
|
configOptions: SessionConfigOptionInfo[] | null
|
|
availableCommands: AvailableCommandInfo[] | null
|
|
liveMessage: LiveMessage | null
|
|
pendingPermission: PendingPermission | null
|
|
pendingQuestion: PendingQuestion | null
|
|
error: string | null
|
|
connect: (
|
|
agentType: AgentType,
|
|
workingDir?: string,
|
|
sessionId?: string,
|
|
options?: ConnectOptions
|
|
) => Promise<void>
|
|
disconnect: () => Promise<void>
|
|
sendPrompt: (blocks: PromptInputBlock[]) => Promise<void>
|
|
setMode: (modeId: string) => Promise<void>
|
|
setConfigOption: (configId: string, valueId: string) => Promise<void>
|
|
cancel: () => Promise<void>
|
|
respondPermission: (requestId: string, optionId: string) => Promise<void>
|
|
}
|
|
|
|
function derive(conn: ConnectionState | undefined) {
|
|
if (!conn) return null
|
|
return conn
|
|
}
|
|
|
|
export function useConnection(contextKey: string): UseConnectionReturn {
|
|
const store = useConnectionStore()
|
|
const actions = useAcpActions()
|
|
|
|
const subscribe = useCallback(
|
|
(cb: () => void) => store.subscribeKey(contextKey, cb),
|
|
[store, contextKey]
|
|
)
|
|
const getSnapshot = useCallback(
|
|
() => derive(store.getConnection(contextKey)),
|
|
[store, contextKey]
|
|
)
|
|
const connection = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)
|
|
|
|
const connectionId = connection?.connectionId ?? null
|
|
const status = connection?.status ?? null
|
|
const promptCapabilities =
|
|
connection?.promptCapabilities ?? DEFAULT_PROMPT_CAPABILITIES
|
|
const supportsFork = connection?.supportsFork ?? false
|
|
const selectorsReady = connection?.selectorsReady ?? false
|
|
const sessionId = connection?.sessionId ?? null
|
|
const modes = connection?.modes ?? null
|
|
const configOptions = connection?.configOptions ?? null
|
|
const availableCommands = connection?.availableCommands ?? null
|
|
const liveMessage = connection?.liveMessage ?? null
|
|
const pendingPermission = connection?.pendingPermission ?? null
|
|
const pendingQuestion = connection?.pendingQuestion ?? null
|
|
const error = connection?.error ?? null
|
|
|
|
const connect = useCallback(
|
|
(
|
|
agentType: AgentType,
|
|
workingDir?: string,
|
|
sessionId?: string,
|
|
options?: ConnectOptions
|
|
) => actions.connect(contextKey, agentType, workingDir, sessionId, options),
|
|
[actions, contextKey]
|
|
)
|
|
|
|
const disconnect = useCallback(
|
|
() => actions.disconnect(contextKey),
|
|
[actions, contextKey]
|
|
)
|
|
|
|
const sendPrompt = useCallback(
|
|
(blocks: PromptInputBlock[]) => actions.sendPrompt(contextKey, blocks),
|
|
[actions, contextKey]
|
|
)
|
|
|
|
const setMode = useCallback(
|
|
(modeId: string) => actions.setMode(contextKey, modeId),
|
|
[actions, contextKey]
|
|
)
|
|
|
|
const setConfigOption = useCallback(
|
|
(configId: string, valueId: string) =>
|
|
actions.setConfigOption(contextKey, configId, valueId),
|
|
[actions, contextKey]
|
|
)
|
|
|
|
const cancel = useCallback(
|
|
() => actions.cancel(contextKey),
|
|
[actions, contextKey]
|
|
)
|
|
|
|
const respondPermission = useCallback(
|
|
(requestId: string, optionId: string) =>
|
|
actions.respondPermission(contextKey, requestId, optionId),
|
|
[actions, contextKey]
|
|
)
|
|
|
|
return useMemo(
|
|
() => ({
|
|
connectionId,
|
|
status,
|
|
promptCapabilities,
|
|
supportsFork,
|
|
selectorsReady,
|
|
sessionId,
|
|
modes,
|
|
configOptions,
|
|
availableCommands,
|
|
liveMessage,
|
|
pendingPermission,
|
|
pendingQuestion,
|
|
error,
|
|
connect,
|
|
disconnect,
|
|
sendPrompt,
|
|
setMode,
|
|
setConfigOption,
|
|
cancel,
|
|
respondPermission,
|
|
}),
|
|
[
|
|
connectionId,
|
|
status,
|
|
promptCapabilities,
|
|
supportsFork,
|
|
selectorsReady,
|
|
sessionId,
|
|
modes,
|
|
configOptions,
|
|
availableCommands,
|
|
liveMessage,
|
|
pendingPermission,
|
|
pendingQuestion,
|
|
error,
|
|
connect,
|
|
disconnect,
|
|
sendPrompt,
|
|
setMode,
|
|
setConfigOption,
|
|
cancel,
|
|
respondPermission,
|
|
]
|
|
)
|
|
}
|