92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
import { useEffect, useRef, useState, type Dispatch, type MutableRefObject, type SetStateAction } from 'react'
|
|
import type { AiAgentId } from '../lib/aiAgents'
|
|
import type { NoteReference } from '../utils/ai-context'
|
|
import {
|
|
type AiAgentMessage,
|
|
} from '../lib/aiAgentConversation'
|
|
import {
|
|
clearAgentConversation,
|
|
sendAgentMessage,
|
|
type AiAgentSessionRuntime,
|
|
} from '../lib/aiAgentSession'
|
|
import type { ToolInvocation } from '../lib/aiAgentMessageState'
|
|
import {
|
|
type AgentFileCallbacks,
|
|
type AgentStatus,
|
|
} from './useAiAgent'
|
|
|
|
export type { AgentFileCallbacks, AgentStatus } from './useAiAgent'
|
|
export type { AiAgentMessage } from '../lib/aiAgentConversation'
|
|
|
|
interface UseCliAiAgentOptions {
|
|
agent: AiAgentId
|
|
agentReady: boolean
|
|
}
|
|
|
|
interface UseCliAiAgentRuntime extends AiAgentSessionRuntime {
|
|
messages: AiAgentMessage[]
|
|
setMessages: Dispatch<SetStateAction<AiAgentMessage[]>>
|
|
status: AgentStatus
|
|
setStatus: Dispatch<SetStateAction<AgentStatus>>
|
|
messagesRef: MutableRefObject<AiAgentMessage[]>
|
|
statusRef: MutableRefObject<AgentStatus>
|
|
}
|
|
|
|
function useCliAiAgentRuntime(fileCallbacks: AgentFileCallbacks | undefined): UseCliAiAgentRuntime {
|
|
const [messages, setMessages] = useState<AiAgentMessage[]>([])
|
|
const [status, setStatus] = useState<AgentStatus>('idle')
|
|
const abortRef = useRef({ aborted: false })
|
|
const responseAccRef = useRef('')
|
|
const fileCallbacksRef = useRef(fileCallbacks)
|
|
const toolInputMapRef = useRef<Map<string, ToolInvocation>>(new Map())
|
|
const messagesRef = useRef<AiAgentMessage[]>([])
|
|
const statusRef = useRef<AgentStatus>('idle')
|
|
|
|
useEffect(() => { messagesRef.current = messages }, [messages])
|
|
useEffect(() => { statusRef.current = status }, [status])
|
|
useEffect(() => { fileCallbacksRef.current = fileCallbacks }, [fileCallbacks])
|
|
|
|
return {
|
|
messages,
|
|
setMessages,
|
|
status,
|
|
setStatus,
|
|
abortRef,
|
|
responseAccRef,
|
|
fileCallbacksRef,
|
|
toolInputMapRef,
|
|
messagesRef,
|
|
statusRef,
|
|
}
|
|
}
|
|
|
|
export function useCliAiAgent(
|
|
vaultPath: string,
|
|
contextPrompt: string | undefined,
|
|
fileCallbacks: AgentFileCallbacks | undefined,
|
|
options: UseCliAiAgentOptions,
|
|
) {
|
|
const { agent, agentReady } = options
|
|
const runtime = useCliAiAgentRuntime(fileCallbacks)
|
|
const { messages, status } = runtime
|
|
|
|
async function sendMessage(text: string, references?: NoteReference[]): Promise<void> {
|
|
await sendAgentMessage({
|
|
runtime,
|
|
context: {
|
|
agent,
|
|
ready: agentReady,
|
|
vaultPath,
|
|
systemPromptOverride: contextPrompt,
|
|
},
|
|
prompt: { text, references },
|
|
})
|
|
}
|
|
|
|
function clearConversation(): void {
|
|
clearAgentConversation(runtime)
|
|
}
|
|
|
|
return { messages, status, sendMessage, clearConversation }
|
|
}
|