Skip to content

Commit 06ef05f

Browse files
authored
Fix agent tool maps recomputing too much (#962)
1 parent 6c740d5 commit 06ef05f

File tree

3 files changed

+33
-32
lines changed

3 files changed

+33
-32
lines changed

apps/web/src/hooks/useMetadata.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,36 @@
11
'use client'
22

3-
import { useEffect, useRef, useState } from 'react'
3+
import { useEffect, useState } from 'react'
44

55
import type { ConversationMetadata } from 'promptl-ai'
66
import { useDebouncedCallback } from 'use-debounce'
77

88
import type { ReadMetadataWorkerProps } from '../workers/readMetadata'
99

10+
const worker =
11+
typeof window === 'undefined'
12+
? undefined
13+
: new Worker(new URL('public/workers/readMetadata', import.meta.url))
14+
1015
export function useMetadata({
1116
onMetadataProcessed,
1217
}: {
1318
onMetadataProcessed?: (metadata: ConversationMetadata) => void
1419
} = {}) {
1520
const [metadata, setMetadata] = useState<ConversationMetadata>()
16-
const workerRef = useRef<Worker | null>(null)
1721

1822
useEffect(() => {
19-
if (typeof window === 'undefined') return
20-
21-
// Dynamic import for the worker
22-
const createWorker = async () => {
23-
const worker = new Worker(
24-
new URL('public/workers/readMetadata', import.meta.url),
25-
)
26-
workerRef.current = worker
27-
28-
worker.onmessage = (event: { data: ConversationMetadata }) => {
29-
setMetadata(event.data)
30-
onMetadataProcessed?.(event.data)
31-
}
32-
}
33-
34-
createWorker()
23+
if (typeof window === 'undefined' || !worker) return
3524

36-
return () => {
37-
workerRef.current?.terminate()
25+
worker.onmessage = (event: { data: ConversationMetadata }) => {
26+
setMetadata(event.data)
27+
onMetadataProcessed?.(event.data)
3828
}
3929
}, [onMetadataProcessed])
4030

4131
const runReadMetadata = useDebouncedCallback(
4232
async (props: ReadMetadataWorkerProps) => {
43-
workerRef.current?.postMessage(props)
33+
worker?.postMessage(props)
4434
},
4535
500,
4636
{ trailing: true },

apps/web/src/stores/agentToolsMap.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1-
import { HEAD_COMMIT } from '@latitude-data/core/browser'
1+
import { isEqual } from 'lodash-es'
2+
import { useEffect, useState } from 'react'
3+
import { type DocumentVersion, HEAD_COMMIT } from '@latitude-data/core/browser'
24
import { SWRConfiguration } from 'swr'
35
import useDocumentVersions from './documentVersions'
4-
import { useMemo } from 'react'
56
import { getAgentToolName } from '@latitude-data/core/services/agents/helpers'
67
import { AgentToolsMap } from '@latitude-data/constants'
78

9+
function buildAgentsToolMap(data: DocumentVersion[] = []) {
10+
if (!data) return {}
11+
return data.reduce((acc: AgentToolsMap, document) => {
12+
if (document.documentType === 'agent') {
13+
acc[getAgentToolName(document.path)] = document.path
14+
}
15+
return acc
16+
}, {})
17+
}
818
export function useAgentToolsMap(
919
{
1020
commitUuid = HEAD_COMMIT,
@@ -17,14 +27,14 @@ export function useAgentToolsMap(
1727
opts,
1828
)
1929

20-
const agentToolsMap: AgentToolsMap = useMemo(() => {
21-
if (!data) return {}
22-
return data.reduce((acc: AgentToolsMap, document) => {
23-
if (document.documentType === 'agent') {
24-
acc[getAgentToolName(document.path)] = document.path
25-
}
26-
return acc
27-
}, {})
30+
const [agentToolsMap, setAgentToolsMap] = useState<AgentToolsMap>({})
31+
32+
useEffect(() => {
33+
setAgentToolsMap((prev) => {
34+
const newAgentToolMaps = buildAgentsToolMap(data)
35+
36+
return isEqual(prev, newAgentToolMaps) ? prev : newAgentToolMaps
37+
})
2838
}, [data])
2939

3040
return { data: agentToolsMap, isLoading, error }

apps/web/src/stores/documentVersions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { useRouter } from 'next/navigation'
2424
import useSWR, { SWRConfiguration } from 'swr'
2525
import { useServerAction } from 'zsa-react'
2626

27+
const EMPTY_DATA = [] as DocumentVersion[]
2728
export default function useDocumentVersions(
2829
{
2930
commitUuid = HEAD_COMMIT,
@@ -62,7 +63,7 @@ export default function useDocumentVersions(
6263

6364
const {
6465
mutate,
65-
data = [],
66+
data = EMPTY_DATA,
6667
isValidating,
6768
isLoading,
6869
error: swrError,

0 commit comments

Comments
 (0)