File size: 1,832 Bytes
abcf568
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import type {
  StudioMessagePart,
  StudioToolPart
} from '../../domain/types'

export function getToolInput(part: StudioMessagePart | null): Record<string, unknown> {
  if (!part || part.type !== 'tool') {
    return {}
  }

  return part.state.input
}

export function getToolTimeStart(part: StudioMessagePart | null): number {
  if (!part || part.type !== 'tool' || !('time' in part.state) || !part.state.time?.start) {
    return Date.now()
  }

  return part.state.time.start
}

export function mergeToolMetadata(
  part: StudioMessagePart | null,
  metadata?: Record<string, unknown>
): Record<string, unknown> | undefined {
  if (!metadata || !Object.keys(metadata).length) {
    return part?.type === 'tool' ? part.metadata ?? ('metadata' in part.state ? part.state.metadata : undefined) : undefined
  }

  const current = part?.type === 'tool'
    ? {
        ...(part.metadata ?? {}),
        ...(('metadata' in part.state && part.state.metadata) ? part.state.metadata : {})
      }
    : {}

  return {
    ...current,
    ...metadata
  }
}

export function mergeToolStateMetadata(
  state: StudioToolPart['state'],
  title?: string,
  metadata?: Record<string, unknown>
): StudioToolPart['state'] {
  switch (state.status) {
    case 'pending':
      return state
    case 'running':
      return {
        ...state,
        title: title ?? state.title,
        metadata: {
          ...(state.metadata ?? {}),
          ...(metadata ?? {})
        }
      }
    case 'completed':
      return {
        ...state,
        title: title ?? state.title,
        metadata: {
          ...(state.metadata ?? {}),
          ...(metadata ?? {})
        }
      }
    case 'error':
      return {
        ...state,
        metadata: {
          ...(state.metadata ?? {}),
          ...(metadata ?? {})
        }
      }
  }
}