@agno-hq/chat-react 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- export { AgnoChat, AgnoMark, ArrowUp, BehindTheScenes, BookOpen, Box, Brain, ChatBubble, ChatInput, ChatLauncher, ChatProvider, ChatWindow, Check, ChevronDown, Citations, Close, Copy, EntityBadge, EntitySelector, EventLog, Favicon, FileAudio, FileIcon, FilePreview, FileVideo, Followups, Globe, GridLoader, HoverPreview, HumanInput, LinkPreviewCard, Markdown, MemberResponses, Memory, Message, MessageList, Multimedia, Paperclip, Plus, Pulse, QuickPrompts, Reasoning, Rerun, SessionList, SourceCard, SourcesProvider, Spinner, StatusIndicator, Stop, TeamGlyph, ToolCalls, Trash, WorkflowSteps, Wrench, behindTheScenesItems, behindTheScenesLabel, collectSources, cx, displayUrl, faviconUrl, getProviderIcon, hasBehindTheScenes, linkCitations, normalizeFollowups, quickPromptLabel, quickPromptText, sourceHost, sourcesFromMarkdown, useAgnoChat, useChatContext, useLinkPreview, useOptionalChatContext, useResolvedChat, useResolvedClassNames, useSources, withoutSourcesLine, writeClipboard } from './chunk-MUOMZG4V.js';
2
+ export { AgnoChat, AgnoMark, ArrowUp, BehindTheScenes, BookOpen, Box, Brain, ChatBubble, ChatInput, ChatLauncher, ChatProvider, ChatWindow, Check, ChevronDown, Citations, Close, Copy, EntityBadge, EntitySelector, EventLog, Favicon, FileAudio, FileIcon, FilePreview, FileType, FileVideo, Followups, Globe, GridLoader, HoverPreview, HumanInput, LinkIcon, LinkPreviewCard, Markdown, MemberResponses, Memory, Message, MessageList, Multimedia, Paperclip, Plus, Pulse, QuickPrompts, Reasoning, Rerun, SessionList, SourceCard, SourcesProvider, Spinner, StatusIndicator, Stop, TeamGlyph, ToolCalls, Trash, WorkflowSteps, Wrench, admitFiles, behindTheScenesItems, behindTheScenesLabel, collectSources, cx, displayUrl, faviconUrl, fileAccepted, getProviderIcon, hasBehindTheScenes, linkCitations, normalizeFollowups, quickPromptLabel, quickPromptText, sourceHost, sourcesFromMarkdown, useAgnoChat, useChatContext, useLinkComponent, useLinkPreview, useOptionalChatContext, useResolvedChat, useResolvedClassNames, useSources, withoutSourcesLine, writeClipboard } from './chunk-BZC2674Z.js';
3
3
  export { RunEvent, TeamRunEvent, WorkflowRunEvent } from './chunk-RE7ZT73K.js';
4
- export { AgnoClient, activityLabel, applyStepEvent, applySubRunEvent, isCompletedEvent, isContentEvent, isErrorEvent, isFollowupsCompletedEvent, isPausedEvent, isReasoningStepEvent, isStepEvent, isSubRunEvent, isToolEvent, mergeTool, normaliseBaseUrl, sessionRunsToMessages, streamRun, toolsFromEvent } from './chunk-62IEW2HM.js';
4
+ export { AgnoClient, activityLabel, applyStepEvent, applySubRunEvent, isCompletedEvent, isContentEvent, isErrorEvent, isFollowupsCompletedEvent, isPausedEvent, isReasoningStepEvent, isStepEvent, isSubRunEvent, isToolEvent, mergeTool, normaliseBaseUrl, sessionRunsToMessages, streamRun, toolsFromEvent } from './chunk-6V2YIPHF.js';
5
5
  //# sourceMappingURL=index.js.map
6
6
  //# sourceMappingURL=index.js.map
package/dist/styles.css CHANGED
@@ -126,7 +126,12 @@
126
126
  .agno-root,
127
127
  .agno-root *,
128
128
  .agno-launcher,
129
- .agno-launcher * {
129
+ .agno-launcher *,
130
+ /* Portalled to <body>, outside the embed. */
131
+ .agno-hovercard,
132
+ .agno-hovercard *,
133
+ .agno-sources__list,
134
+ .agno-sources__list * {
130
135
  box-sizing: border-box;
131
136
  }
132
137
 
@@ -854,7 +859,7 @@
854
859
  }
855
860
 
856
861
  /* ─────────────────────────────────────────────────────────────────────────
857
- Sources — the cards under an answer
862
+ Sources — the pills under an answer (Figma: Components Library › Sources found)
858
863
  ───────────────────────────────────────────────────────────────────────── */
859
864
 
860
865
  .agno-sources {
@@ -863,58 +868,161 @@
863
868
  gap: 8px;
864
869
  }
865
870
  .agno-sources__head {
866
- color: var(--agno-muted);
871
+ color: var(--agno-primary);
867
872
  font-family: var(--agno-font-mono);
868
873
  font-size: 0.75rem;
869
- letter-spacing: 0.02em;
870
- text-transform: uppercase;
874
+ line-height: 1rem;
875
+ letter-spacing: -0.02em;
871
876
  }
872
- /* Cards are sized by their title and wrap into as many per row as fit. */
877
+ /* A single row of fixed-width pills; wraps only when the column can't hold them. */
873
878
  .agno-sources__grid {
874
879
  display: flex;
875
880
  flex-wrap: wrap;
876
- gap: 8px;
877
- }
878
- .agno-sources__more {
879
- align-self: flex-start;
880
- padding: 0;
881
- background: none;
882
- border: none;
883
- color: var(--agno-muted);
884
- cursor: pointer;
885
- font: inherit;
886
- font-size: 0.75rem;
887
- }
888
- .agno-sources__more:hover {
889
- color: var(--agno-primary);
881
+ align-items: center;
882
+ gap: 12px;
890
883
  }
891
884
 
892
885
  .agno-source {
893
886
  display: flex;
894
887
  align-items: center;
895
888
  gap: 8px;
889
+ width: 160px;
890
+ max-width: 100%;
896
891
  min-width: 0;
897
- max-width: min(100%, 320px);
898
- padding: 8px 12px;
899
- border: 1px solid transparent;
900
- border-radius: var(--agno-radius-md);
892
+ padding: 4px 8px 4px 4px;
893
+ border-radius: var(--agno-radius-sm);
901
894
  background: var(--agno-secondary-soft);
902
895
  color: inherit;
903
896
  text-decoration: none;
904
- transition: border-color 0.15s ease, background 0.15s ease;
897
+ transition: background 0.15s ease;
905
898
  }
906
899
  a.agno-source:hover {
907
- border-color: var(--agno-border);
908
900
  background: var(--agno-secondary);
909
901
  }
902
+ /* 24px avatar box; the icon fills it. Doubled up to outrank `.agno-favicon`. */
903
+ .agno-favicon.agno-source__icon {
904
+ flex: 0 0 24px;
905
+ width: 24px;
906
+ height: 24px;
907
+ border-radius: 6px;
908
+ }
909
+ .agno-source__icon.agno-favicon--glyph svg {
910
+ width: 14px;
911
+ height: 14px;
912
+ }
910
913
  .agno-source__title {
914
+ flex: 1;
911
915
  min-width: 0;
912
916
  overflow: hidden;
913
917
  text-overflow: ellipsis;
914
918
  white-space: nowrap;
915
- font-size: 0.8125rem;
916
- font-weight: 500;
917
- line-height: 1.125rem;
919
+ color: var(--agno-muted);
920
+ font-size: 0.75rem;
921
+ font-weight: 400;
922
+ line-height: 1.25rem;
923
+ letter-spacing: -0.02em;
924
+ text-decoration: underline;
925
+ text-underline-position: from-font;
926
+ }
927
+ .agno-source__link {
928
+ flex: 0 0 16px;
929
+ color: var(--agno-primary);
930
+ }
931
+
932
+ /* "+N more": the next few favicons fanned out, then the count. */
933
+ .agno-sources__more {
934
+ display: flex;
935
+ align-items: center;
936
+ gap: 4px;
937
+ padding: 4px 8px;
938
+ border: none;
939
+ border-radius: var(--agno-radius-sm);
940
+ background: var(--agno-secondary);
941
+ color: var(--agno-muted);
942
+ cursor: pointer;
943
+ font: inherit;
944
+ font-size: 0.75rem;
945
+ line-height: 1.0625rem;
946
+ letter-spacing: -0.02em;
947
+ transition: color 0.15s ease;
948
+ }
949
+ .agno-sources__more:hover {
950
+ color: var(--agno-primary);
951
+ }
952
+ .agno-sources__stack {
953
+ display: flex;
954
+ align-items: center;
955
+ }
956
+ .agno-favicon.agno-sources__stack-icon {
957
+ flex: 0 0 24px;
958
+ width: 24px;
959
+ height: 24px;
960
+ border-radius: 6px;
961
+ /* Opaque, so the icon beneath doesn't show through; a ring in the pill
962
+ colour then separates each from the one under it. */
963
+ background: var(--agno-bg);
964
+ box-shadow: 0 0 0 1px var(--agno-secondary);
965
+ }
966
+ .agno-sources__stack-icon + .agno-sources__stack-icon {
967
+ margin-left: -16px;
968
+ }
969
+ .agno-sources__stack-icon.agno-favicon--glyph svg {
970
+ width: 14px;
971
+ height: 14px;
972
+ }
973
+ .agno-sources__more-label {
974
+ display: flex;
975
+ align-items: center;
976
+ height: 24px;
977
+ white-space: nowrap;
978
+ }
979
+ .agno-sources__overflow {
980
+ display: inline-flex;
981
+ }
982
+ .agno-sources__more[aria-expanded='true'] {
983
+ color: var(--agno-primary);
984
+ }
985
+
986
+ /* The rest of the sources, listed above the "+N more" pill. Portalled to
987
+ <body> like the hover card, so the transcript can't clip it. */
988
+ .agno-sources__list {
989
+ position: fixed;
990
+ z-index: 2147483000;
991
+ display: flex;
992
+ flex-direction: column;
993
+ overflow: hidden;
994
+ border: 1px solid var(--agno-border);
995
+ border-radius: var(--agno-radius-sm);
996
+ background: var(--agno-secondary-soft);
997
+ -webkit-backdrop-filter: blur(4px);
998
+ backdrop-filter: blur(4px);
999
+ color: var(--agno-primary);
1000
+ font-family: var(--agno-font);
1001
+ animation: agno-hovercard-in 0.12s ease-out;
1002
+ }
1003
+ /* Positioned by its top edge either way; anchoring above means lifting the
1004
+ list by its own height, which only CSS knows. */
1005
+ .agno-sources__list--top {
1006
+ transform: translateY(-100%);
1007
+ }
1008
+ @media (prefers-reduced-motion: reduce) {
1009
+ .agno-sources__list {
1010
+ animation: none;
1011
+ }
1012
+ }
1013
+ /* A source as a row of the list: full width, flat, divided by hairlines. */
1014
+ .agno-source--row {
1015
+ width: 100%;
1016
+ max-width: none;
1017
+ padding: 8px;
1018
+ border-radius: 0;
1019
+ background: transparent;
1020
+ }
1021
+ .agno-source--row + .agno-source--row {
1022
+ border-top: 1px solid var(--agno-border);
1023
+ }
1024
+ a.agno-source--row:hover {
1025
+ background: var(--agno-tint);
918
1026
  }
919
1027
 
920
1028
  /* ─────────────────────────────────────────────────────────────────────────
@@ -1815,6 +1923,7 @@ a.agno-source:hover {
1815
1923
  padding: 8px 24px 12px;
1816
1924
  }
1817
1925
  .agno-input__dock {
1926
+ position: relative;
1818
1927
  width: 100%;
1819
1928
  max-width: 800px;
1820
1929
  margin: 0 auto;
@@ -1826,14 +1935,40 @@ a.agno-source:hover {
1826
1935
  border-radius: var(--agno-radius-xl);
1827
1936
  background: var(--agno-accent);
1828
1937
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
1938
+ transition: border-color 0.15s ease;
1939
+ }
1940
+ .agno-input[data-dragging='true'] .agno-input__dock {
1941
+ border-color: var(--agno-brand);
1942
+ }
1943
+ /* Covers the dock while files are dragged over it. */
1944
+ .agno-input__drop {
1945
+ position: absolute;
1946
+ inset: 0;
1947
+ z-index: 1;
1948
+ display: flex;
1949
+ align-items: center;
1950
+ justify-content: center;
1951
+ gap: 8px;
1952
+ border-radius: inherit;
1953
+ background: var(--agno-accent);
1954
+ color: var(--agno-muted);
1955
+ font-size: 0.8125rem;
1956
+ pointer-events: none;
1957
+ }
1958
+ .agno-input__error {
1959
+ margin: 0;
1960
+ padding: 0 4px;
1961
+ color: var(--agno-error);
1962
+ font-size: 0.75rem;
1963
+ line-height: 1.25rem;
1829
1964
  }
1830
1965
  /* Attachment previews — the AgentOS upload banner: a count with "clear all",
1831
- then a scrolling row of thumbnails and typed file cards. */
1966
+ then a scrolling row of bordered thumbnails and typed file cards, fading out
1967
+ at the dock's right edge. */
1832
1968
  .agno-files {
1833
1969
  display: flex;
1834
1970
  flex-direction: column;
1835
- gap: 10px;
1836
- padding: 4px 4px 2px;
1971
+ gap: 8px;
1837
1972
  }
1838
1973
  .agno-files__head {
1839
1974
  display: flex;
@@ -1848,23 +1983,39 @@ a.agno-source:hover {
1848
1983
  line-height: 1rem;
1849
1984
  letter-spacing: 0.02em;
1850
1985
  text-transform: uppercase;
1986
+ white-space: nowrap;
1851
1987
  }
1852
1988
  .agno-files__count {
1853
- color: var(--agno-muted);
1989
+ color: rgba(var(--color-primary), 0.5);
1854
1990
  }
1855
1991
  .agno-files__clear {
1856
1992
  display: inline-flex;
1857
1993
  align-items: center;
1858
- gap: 4px;
1994
+ gap: 8px;
1859
1995
  border: none;
1860
1996
  background: none;
1861
1997
  padding: 0;
1862
1998
  color: var(--agno-primary);
1863
1999
  cursor: pointer;
1864
2000
  }
2001
+ .agno-files__strip {
2002
+ position: relative;
2003
+ }
2004
+ /* Pinned to the strip's edge, above the row, so it holds still while the row
2005
+ scrolls beneath it. */
2006
+ .agno-files__strip::after {
2007
+ content: '';
2008
+ position: absolute;
2009
+ top: 0;
2010
+ right: 0;
2011
+ bottom: 0;
2012
+ width: 32px;
2013
+ pointer-events: none;
2014
+ background: linear-gradient(to right, rgba(var(--color-primary-accent), 0.1), var(--agno-accent));
2015
+ }
1865
2016
  .agno-files__row {
1866
2017
  display: flex;
1867
- align-items: flex-start;
2018
+ align-items: center;
1868
2019
  gap: 8px;
1869
2020
  overflow-x: auto;
1870
2021
  scrollbar-width: none;
@@ -1872,75 +2023,89 @@ a.agno-source:hover {
1872
2023
  .agno-files__row::-webkit-scrollbar {
1873
2024
  display: none;
1874
2025
  }
2026
+ /* Every item is a 54px-tall bordered tile; the remove control is a tab folded
2027
+ into its top-right corner, sharing the tile's border. */
1875
2028
  .agno-file {
1876
2029
  position: relative;
1877
2030
  flex: none;
2031
+ display: flex;
2032
+ align-items: center;
2033
+ gap: 8px;
2034
+ height: 54px;
2035
+ overflow: hidden;
2036
+ border: 1px solid var(--agno-border);
2037
+ border-radius: 4px;
2038
+ }
2039
+ .agno-file--image {
2040
+ width: 69px;
2041
+ justify-content: center;
2042
+ }
2043
+ .agno-file--card {
2044
+ width: 166px;
2045
+ padding: 4px 8px;
2046
+ background: var(--agno-bg);
1878
2047
  }
1879
2048
  .agno-file__remove {
1880
2049
  position: absolute;
1881
- top: -5px;
1882
- right: -6px;
1883
- z-index: 1;
2050
+ top: -1px;
2051
+ right: -1px;
1884
2052
  display: grid;
1885
2053
  place-items: center;
1886
- padding: 2px;
1887
- border: none;
1888
- border-radius: var(--agno-radius-full);
1889
- background: rgba(var(--color-muted), 0.9);
1890
- color: var(--agno-accent);
2054
+ padding: 3px 3px 4px 4px;
2055
+ border: 1px solid var(--agno-border);
2056
+ border-top: none;
2057
+ border-right: none;
2058
+ border-radius: 0 0 0 8px;
2059
+ background: var(--agno-secondary);
2060
+ color: var(--agno-primary);
1891
2061
  cursor: pointer;
2062
+ filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.05));
1892
2063
  }
1893
2064
  .agno-file__thumb {
1894
2065
  display: block;
1895
- width: 69px;
1896
- height: 54px;
2066
+ width: 100%;
2067
+ height: 100%;
1897
2068
  object-fit: cover;
1898
- border-radius: var(--agno-radius-sm);
1899
- }
1900
- .agno-file__card {
1901
- display: flex;
1902
- align-items: center;
1903
- gap: 8px;
1904
- height: 54px;
1905
- padding: 0 12px;
1906
- border: 1px solid var(--agno-border);
1907
- border-radius: var(--agno-radius-sm);
1908
- background: var(--agno-bg);
1909
2069
  }
1910
2070
  .agno-file__mark {
1911
2071
  display: grid;
1912
2072
  place-items: center;
1913
2073
  flex: none;
1914
- padding: 6px;
1915
- border-radius: var(--agno-radius-sm);
1916
- background: var(--agno-tint);
2074
+ width: 24px;
2075
+ height: 24px;
2076
+ padding: 4px;
2077
+ border-radius: 6px;
2078
+ background: var(--agno-secondary);
1917
2079
  color: var(--agno-primary);
1918
2080
  }
1919
2081
  .agno-file__meta {
1920
2082
  display: flex;
2083
+ flex: 1 1 0;
1921
2084
  flex-direction: column;
2085
+ justify-content: center;
2086
+ gap: 2px;
2087
+ height: 40px;
1922
2088
  min-width: 0;
1923
2089
  }
1924
2090
  .agno-file__name {
1925
- max-width: 8rem;
1926
2091
  overflow: hidden;
1927
2092
  text-overflow: ellipsis;
1928
2093
  white-space: nowrap;
1929
- font-size: 0.875rem;
1930
- line-height: 1.25rem;
2094
+ font-size: 0.75rem;
2095
+ line-height: 1.0625rem;
2096
+ letter-spacing: -0.02em;
1931
2097
  color: var(--agno-primary);
1932
2098
  }
1933
2099
  .agno-file__type {
1934
- max-width: 8rem;
1935
2100
  overflow: hidden;
1936
2101
  text-overflow: ellipsis;
1937
2102
  white-space: nowrap;
1938
2103
  font-family: var(--agno-font-mono);
1939
- font-size: 0.6875rem;
2104
+ font-size: 0.75rem;
1940
2105
  line-height: 1rem;
1941
2106
  letter-spacing: 0.02em;
1942
2107
  text-transform: uppercase;
1943
- color: rgba(var(--color-primary), 0.5);
2108
+ color: var(--agno-muted);
1944
2109
  }
1945
2110
  .agno-input__field {
1946
2111
  display: flex;
@@ -1984,6 +2149,48 @@ a.agno-source:hover {
1984
2149
  gap: 8px;
1985
2150
  }
1986
2151
 
2152
+ /* Compact: one row, the field with the controls beside it — the Figma
2153
+ "Textarea" component (8px padding, 12px gap, 24px field and buttons). */
2154
+ .agno-input--compact .agno-input__dock {
2155
+ gap: 8px;
2156
+ border-radius: var(--agno-radius-lg);
2157
+ box-shadow: none;
2158
+ }
2159
+ .agno-input--compact .agno-input__row {
2160
+ align-items: flex-end;
2161
+ gap: 12px;
2162
+ }
2163
+ .agno-input--compact .agno-input__field {
2164
+ flex: 1;
2165
+ min-width: 0;
2166
+ background: none;
2167
+ border-radius: 0;
2168
+ }
2169
+ .agno-input--compact .agno-input__textarea {
2170
+ min-height: 24px;
2171
+ max-height: 120px;
2172
+ padding: 1.5px 8px;
2173
+ line-height: 21px;
2174
+ }
2175
+ .agno-input--compact .agno-input__actions {
2176
+ gap: 8px;
2177
+ padding-bottom: 0;
2178
+ }
2179
+ .agno-input--compact .agno-btn--icon {
2180
+ width: 24px;
2181
+ height: 24px;
2182
+ border-radius: var(--agno-radius-sm);
2183
+ }
2184
+ .agno-input--compact .agno-btn--ghost {
2185
+ color: var(--agno-muted);
2186
+ }
2187
+ .agno-input--compact .agno-btn--ghost:hover:not(:disabled) {
2188
+ color: var(--agno-primary);
2189
+ }
2190
+ .agno-input--compact .agno-btn--icon:not(.agno-btn--ghost) {
2191
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
2192
+ }
2193
+
1987
2194
  /* ─────────────────────────────────────────────────────────────────────────
1988
2195
  Buttons — Agno OS `Button` (DM Mono, uppercase, rounded-md)
1989
2196
  ───────────────────────────────────────────────────────────────────────── */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agno-hq/chat-react",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Composable, embeddable React components for AgentOS — a headless chat hook, a provider for building your own layout, and drop-in chat embeds.",
5
5
  "license": "MIT",
6
6
  "author": "Agno",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/stream.ts","../src/core/client.ts","../src/core/session.ts","../src/core/events.ts"],"names":["id"],"mappings":"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","file":"chunk-62IEW2HM.js","sourcesContent":["/**\n * Streaming parser for AgentOS run endpoints.\n *\n * AgentOS streams a run as a sequence of JSON objects concatenated on the wire\n * (not strictly newline-delimited). Each object is one \"run event\". This module\n * reads the response body incrementally, extracts complete JSON objects as they\n * arrive, and hands each one to a callback.\n *\n * It supports both the legacy shape (the event object sent directly) and the\n * newer envelope shape ({ event: string, data: string | object }), normalising\n * both into a flat event object with an `event` discriminator field.\n */\n\nimport type { RunEvent } from './types'\n\n/** A parsed, normalised run event. Shape varies by `event` type — see types.ts. */\nexport interface StreamEvent {\n event: RunEvent | string\n [key: string]: unknown\n}\n\ninterface Envelope {\n event: string\n data: string | Record<string, unknown>\n}\n\nfunction isEnvelope(data: unknown): data is Envelope {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'event' in data &&\n 'data' in data &&\n typeof (data as Envelope).event === 'string'\n )\n}\n\nfunction isFlatEvent(data: unknown): data is StreamEvent {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'event' in data &&\n !('data' in data) &&\n typeof (data as StreamEvent).event === 'string'\n )\n}\n\nfunction normaliseEnvelope(env: Envelope): StreamEvent {\n let parsed: Record<string, unknown> = {}\n if (typeof env.data === 'string') {\n try {\n parsed = JSON.parse(env.data)\n } catch {\n parsed = {}\n }\n } else if (env.data && typeof env.data === 'object') {\n parsed = env.data\n }\n return { event: env.event, ...parsed }\n}\n\n/**\n * Pulls every complete JSON object out of `buffer`, emitting each via `onEvent`.\n * Returns the unconsumed tail (a partial object awaiting more bytes).\n */\nfunction drainBuffer(buffer: string, onEvent: (e: StreamEvent) => void): string {\n let start = buffer.indexOf('{')\n\n while (start !== -1 && start < buffer.length) {\n let depth = 0\n let inString = false\n let escape = false\n let end = -1\n\n for (let i = start; i < buffer.length; i++) {\n const ch = buffer[i]\n if (inString) {\n if (escape) escape = false\n else if (ch === '\\\\') escape = true\n else if (ch === '\"') inString = false\n } else if (ch === '\"') {\n inString = true\n } else if (ch === '{') {\n depth++\n } else if (ch === '}') {\n depth--\n if (depth === 0) {\n end = i\n break\n }\n }\n }\n\n if (end === -1) break // incomplete object; wait for more data\n\n const slice = buffer.slice(start, end + 1)\n try {\n const parsed = JSON.parse(slice)\n if (isEnvelope(parsed)) onEvent(normaliseEnvelope(parsed))\n else if (isFlatEvent(parsed)) onEvent(parsed)\n } catch {\n // Not valid JSON despite balanced braces — skip this opening brace.\n start = buffer.indexOf('{', start + 1)\n continue\n }\n\n buffer = buffer.slice(end + 1).trim()\n start = buffer.indexOf('{')\n }\n\n return buffer\n}\n\nexport interface StreamRunOptions {\n url: string\n body: FormData | Record<string, unknown>\n headers?: Record<string, string>\n signal?: AbortSignal\n onEvent: (event: StreamEvent) => void\n onError: (error: Error) => void\n onComplete: () => void\n}\n\n/**\n * POSTs a run request and streams the response, calling `onEvent` for every\n * run event as it arrives. Resolves when the stream ends.\n */\nexport async function streamRun(options: StreamRunOptions): Promise<void> {\n const { url, body, headers = {}, signal, onEvent, onError, onComplete } = options\n let buffer = ''\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...(!(body instanceof FormData) && { 'Content-Type': 'application/json' }),\n ...headers,\n },\n body: body instanceof FormData ? body : JSON.stringify(body),\n signal,\n })\n\n if (!response.ok) {\n let detail: string\n try {\n const err = await response.json()\n detail = err?.detail ? String(err.detail) : `${response.status} ${response.statusText}`\n } catch {\n detail = `${response.status} ${response.statusText}`\n }\n throw new Error(detail)\n }\n if (!response.body) throw new Error('No response body')\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n for (;;) {\n const { done, value } = await reader.read()\n if (done) {\n buffer = drainBuffer(buffer, onEvent)\n onComplete()\n return\n }\n buffer += decoder.decode(value, { stream: true })\n buffer = drainBuffer(buffer, onEvent)\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n onComplete()\n return\n }\n onError(error instanceof Error ? error : new Error(String(error)))\n }\n}\n","/**\n * Thin client for an AgentOS HTTP backend.\n *\n * Wraps the discovery, run, continue, cancel and session endpoints. Streaming\n * runs are handled by `streamRun` from ./stream; everything else is plain JSON.\n */\n\nimport { streamRun, type StreamEvent } from './stream'\nimport type {\n Entity,\n EntityType,\n RunEventData,\n SessionsResponse,\n ToolExecution,\n} from './types'\n\n/** Normalise a base URL: add a scheme for bare hosts, strip trailing slash. */\nexport function normaliseBaseUrl(value: string | null | undefined): string {\n if (!value) return ''\n let url = value.trim()\n if (!/^https?:\\/\\//.test(url)) {\n const isLocal = url.startsWith('localhost') || /^\\d{1,3}(\\.\\d{1,3}){3}/.test(url)\n url = `${isLocal ? 'http' : 'https'}://${url}`\n }\n return url.replace(/\\/+$/, '')\n}\n\nexport interface AgnoClientOptions {\n /** AgentOS base URL, e.g. \"http://localhost:7777\". */\n baseUrl: string\n /** Optional headers (e.g. Authorization) added to every request. */\n headers?: Record<string, string>\n /** Default db_id used for session listing where the backend requires it. */\n dbId?: string\n}\n\ninterface RunArgs {\n type: EntityType\n id: string\n message?: string\n sessionId?: string\n userId?: string\n files?: File[]\n /** Extra form fields appended verbatim. */\n extra?: Record<string, string>\n signal?: AbortSignal\n onEvent: (event: RunEventData) => void\n onError: (error: Error) => void\n onComplete: () => void\n}\n\ninterface ContinueArgs {\n type: EntityType\n id: string\n runId: string\n sessionId?: string\n userId?: string\n /** Resolved tool executions (agents/teams human-in-the-loop). */\n tools?: ToolExecution[]\n /** Resolved step requirements (workflow human-in-the-loop). */\n stepRequirements?: unknown[]\n signal?: AbortSignal\n onEvent: (event: RunEventData) => void\n onError: (error: Error) => void\n onComplete: () => void\n}\n\nconst RUN_PATH: Record<EntityType, string> = {\n agent: 'agents',\n team: 'teams',\n workflow: 'workflows',\n}\n\nexport class AgnoClient {\n readonly baseUrl: string\n readonly headers: Record<string, string>\n readonly dbId?: string\n\n constructor(options: AgnoClientOptions) {\n this.baseUrl = normaliseBaseUrl(options.baseUrl)\n this.headers = options.headers ?? {}\n this.dbId = options.dbId\n }\n\n private async getJson<T>(path: string): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, { headers: this.headers })\n if (!res.ok) throw new Error(`GET ${path} failed: ${res.status} ${res.statusText}`)\n return res.json() as Promise<T>\n }\n\n /** Liveness check against /health. Returns the HTTP status code. */\n async health(): Promise<number> {\n try {\n const res = await fetch(`${this.baseUrl}/health`, { headers: this.headers })\n return res.status\n } catch {\n return 0\n }\n }\n\n /* ----------------------------- discovery ----------------------------- */\n\n async getAgents(): Promise<Entity[]> {\n const data = await this.getJson<any[]>('/agents').catch(() => [])\n return data.map((a) => ({\n type: 'agent' as const,\n id: a.agent_id ?? a.id,\n name: a.name ?? a.agent_id ?? a.id,\n description: a.description,\n model: a.model,\n db_id: a.db_id,\n }))\n }\n\n async getTeams(): Promise<Entity[]> {\n const data = await this.getJson<any[]>('/teams').catch(() => [])\n return data.map((t) => ({\n type: 'team' as const,\n id: t.team_id ?? t.id,\n name: t.name ?? t.team_id ?? t.id,\n description: t.description,\n model: t.model,\n db_id: t.db_id,\n }))\n }\n\n async getWorkflows(): Promise<Entity[]> {\n const data = await this.getJson<any[]>('/workflows').catch(() => [])\n return data.map((w) => ({\n type: 'workflow' as const,\n id: w.workflow_id ?? w.id,\n name: w.name ?? w.workflow_id ?? w.id,\n description: w.description,\n model: w.model,\n db_id: w.db_id,\n }))\n }\n\n /** All runnable entities (agents, teams, workflows) in one list. */\n async getEntities(): Promise<Entity[]> {\n const [agents, teams, workflows] = await Promise.all([\n this.getAgents(),\n this.getTeams(),\n this.getWorkflows(),\n ])\n return [...agents, ...teams, ...workflows]\n }\n\n /* ------------------------------ sessions ----------------------------- */\n\n async getSessions(type: EntityType, componentId: string, dbId?: string): Promise<SessionsResponse> {\n const url = new URL(`${this.baseUrl}/sessions`)\n url.searchParams.set('type', type)\n url.searchParams.set('component_id', componentId)\n const db = dbId ?? this.dbId\n if (db) url.searchParams.set('db_id', db)\n try {\n const res = await fetch(url.toString(), { headers: this.headers })\n if (!res.ok) return { data: [] }\n return (await res.json()) as SessionsResponse\n } catch {\n return { data: [] }\n }\n }\n\n /** Runs (with messages/tools/events) for a session — used to rehydrate chat history. */\n async getSessionRuns(type: EntityType, sessionId: string, dbId?: string): Promise<any[]> {\n const url = new URL(`${this.baseUrl}/sessions/${sessionId}/runs`)\n url.searchParams.set('type', type)\n const db = dbId ?? this.dbId\n if (db) url.searchParams.set('db_id', db)\n const res = await fetch(url.toString(), { headers: this.headers })\n if (!res.ok) throw new Error(`Failed to load session: ${res.statusText}`)\n return res.json()\n }\n\n async deleteSession(sessionId: string, dbId?: string): Promise<boolean> {\n const url = new URL(`${this.baseUrl}/sessions/${sessionId}`)\n const db = dbId ?? this.dbId\n if (db) url.searchParams.set('db_id', db)\n const res = await fetch(url.toString(), { method: 'DELETE', headers: this.headers })\n return res.ok\n }\n\n /* -------------------------------- runs ------------------------------- */\n\n /** Start a streaming run for an agent, team or workflow. */\n async run(args: RunArgs): Promise<void> {\n const form = new FormData()\n if (args.message != null) form.append('message', args.message)\n form.append('stream', 'true')\n if (args.sessionId) form.append('session_id', args.sessionId)\n if (args.userId) form.append('user_id', args.userId)\n for (const file of args.files ?? []) form.append('files', file)\n for (const [k, v] of Object.entries(args.extra ?? {})) form.append(k, v)\n\n const url = `${this.baseUrl}/${RUN_PATH[args.type]}/${args.id}/runs`\n return streamRun({\n url,\n body: form,\n headers: this.headers,\n signal: args.signal,\n onEvent: (e) => args.onEvent(e as RunEventData),\n onError: args.onError,\n onComplete: args.onComplete,\n })\n }\n\n /** Continue a paused run (resolving a human-in-the-loop requirement). */\n async continueRun(args: ContinueArgs): Promise<void> {\n const form = new FormData()\n form.append('stream', 'true')\n if (args.sessionId) form.append('session_id', args.sessionId)\n if (args.userId) form.append('user_id', args.userId)\n\n if (args.type === 'workflow') {\n if (args.stepRequirements) form.append('step_requirements', JSON.stringify(args.stepRequirements))\n } else if (args.tools) {\n form.append('tools', JSON.stringify(args.tools))\n }\n\n const url = `${this.baseUrl}/${RUN_PATH[args.type]}/${args.id}/runs/${args.runId}/continue`\n return streamRun({\n url,\n body: form,\n headers: this.headers,\n signal: args.signal,\n onEvent: (e) => args.onEvent(e as RunEventData),\n onError: args.onError,\n onComplete: args.onComplete,\n })\n }\n\n /** Cancel an in-flight run. */\n async cancelRun(type: EntityType, id: string, runId: string, sessionId?: string): Promise<boolean> {\n const url = new URL(`${this.baseUrl}/${RUN_PATH[type]}/${id}/runs/${runId}/cancel`)\n if (sessionId) url.searchParams.set('session_id', sessionId)\n try {\n const res = await fetch(url.toString(), { method: 'POST', headers: this.headers })\n return res.ok\n } catch {\n return false\n }\n }\n}\n\nexport type { StreamEvent }\n","/**\n * Helpers for turning AgentOS session history into render-ready chat messages.\n *\n * `GET /sessions/{id}/runs` returns an array of run records. Each run carries\n * the user input plus the agent's content, tools, reasoning, references and\n * media — enough to reconstruct the transcript for a past session.\n */\n\nimport type { ChatMessage, ReasoningStep, ReferenceData, RunEventData, ToolExecution } from './types'\n\ninterface SessionRun {\n run_id?: string\n session_id?: string\n run_input?: unknown\n content?: unknown\n created_at?: number\n status?: string\n /** Present when the agent was configured with `store_events`. */\n events?: RunEventData[]\n tools?: ToolExecution[]\n images?: ChatMessage['images']\n videos?: ChatMessage['videos']\n audio?: ChatMessage['audio']\n response_audio?: ChatMessage['response_audio']\n extra_data?: {\n reasoning_steps?: ReasoningStep[]\n references?: ReferenceData[]\n }\n reasoning_steps?: ReasoningStep[]\n references?: ReferenceData[]\n followups?: string[]\n}\n\nfunction toText(value: unknown): string {\n if (value == null) return ''\n if (typeof value === 'string') return value\n // Some inputs/outputs arrive as content-part arrays or objects.\n if (Array.isArray(value)) {\n return value\n .map((part) =>\n part && typeof part === 'object' && 'text' in part ? String((part as { text: unknown }).text) : '',\n )\n .filter(Boolean)\n .join(' ')\n }\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>\n if (typeof obj.input_content === 'string') return obj.input_content\n if (typeof obj.message === 'string') return obj.message\n if (typeof obj.content === 'string') return obj.content\n return '```json\\n' + JSON.stringify(value, null, 2) + '\\n```'\n }\n return String(value)\n}\n\nlet seq = 0\nconst id = (prefix: string) => `${prefix}-${seq++}`\n\n/** Convert the runs of a session into an ordered list of chat messages. */\nexport function sessionRunsToMessages(runs: SessionRun[]): ChatMessage[] {\n if (!Array.isArray(runs)) return []\n const messages: ChatMessage[] = []\n\n for (const run of runs) {\n const created = run.created_at ?? Math.floor(Date.now() / 1000)\n\n const userContent = toText(run.run_input)\n if (userContent) {\n messages.push({\n id: id('hist-u'),\n role: 'user',\n content: userContent,\n created_at: created,\n })\n }\n\n messages.push({\n id: id('hist-a'),\n role: 'agent',\n content: toText(run.content),\n created_at: created,\n status: 'completed',\n run_id: run.run_id,\n session_id: run.session_id,\n tool_calls: run.tools && run.tools.length ? run.tools : undefined,\n // Stored events let the behind-the-scenes panel look the same in history\n // as it does live.\n events: run.events && run.events.length ? run.events : undefined,\n reasoning_steps: run.reasoning_steps ?? run.extra_data?.reasoning_steps,\n references: run.references ?? run.extra_data?.references,\n followups: run.followups && run.followups.length ? run.followups : undefined,\n images: run.images,\n videos: run.videos,\n audio: run.audio,\n response_audio: run.response_audio,\n })\n }\n\n return messages\n}\n","/**\n * Helpers for classifying run events and turning them into UI labels.\n *\n * Agent, team and workflow events share shapes but use different name prefixes\n * (e.g. `RunContent` vs `TeamRunContent`). These helpers let the rest of the\n * library treat them uniformly.\n */\n\nimport type { ChatMessage, RunEventData, SubRun, ToolExecution, WorkflowStep } from './types'\n\nconst name = (e: RunEventData): string => String(e.event ?? '')\n\nexport const isStartedEvent = (e: RunEventData): boolean =>\n name(e) === 'RunStarted' ||\n name(e) === 'TeamRunStarted' ||\n name(e) === 'WorkflowStarted' ||\n name(e) === 'ReasoningStarted' ||\n name(e) === 'TeamReasoningStarted'\n\nexport const isContentEvent = (e: RunEventData): boolean =>\n name(e) === 'RunContent' || name(e) === 'TeamRunContent' || name(e) === 'WorkflowAgentCompleted'\n\nexport const isContentCompletedEvent = (e: RunEventData): boolean =>\n name(e) === 'RunContentCompleted' || name(e) === 'TeamRunContentCompleted'\n\nexport const isCompletedEvent = (e: RunEventData): boolean =>\n name(e) === 'RunCompleted' ||\n name(e) === 'TeamRunCompleted' ||\n name(e) === 'WorkflowCompleted'\n\nexport const isErrorEvent = (e: RunEventData): boolean =>\n name(e) === 'RunError' ||\n name(e) === 'TeamRunError' ||\n name(e) === 'WorkflowError' ||\n name(e) === 'StepError' ||\n name(e) === 'ToolCallError' ||\n name(e) === 'TeamToolCallError'\n\nexport const isCancelledEvent = (e: RunEventData): boolean =>\n name(e) === 'RunCancelled' ||\n name(e) === 'TeamRunCancelled' ||\n name(e) === 'WorkflowCancelled'\n\nexport const isPausedEvent = (e: RunEventData): boolean =>\n name(e) === 'RunPaused' ||\n name(e) === 'TeamRunPaused' ||\n name(e) === 'WorkflowPaused' ||\n name(e) === 'StepPaused' ||\n name(e) === 'RouterPaused' ||\n name(e) === 'ConditionPaused'\n\nexport const isToolStartedEvent = (e: RunEventData): boolean =>\n name(e) === 'ToolCallStarted' || name(e) === 'TeamToolCallStarted'\n\nexport const isToolCompletedEvent = (e: RunEventData): boolean =>\n name(e) === 'ToolCallCompleted' || name(e) === 'TeamToolCallCompleted'\n\nexport const isToolEvent = (e: RunEventData): boolean =>\n isToolStartedEvent(e) || isToolCompletedEvent(e) || name(e) === 'ToolCallError' || name(e) === 'TeamToolCallError'\n\nexport const isReasoningStepEvent = (e: RunEventData): boolean =>\n name(e) === 'ReasoningStep' || name(e) === 'TeamReasoningStep'\n\nexport const isReasoningCompletedEvent = (e: RunEventData): boolean =>\n name(e) === 'ReasoningCompleted' || name(e) === 'TeamReasoningCompleted'\n\n/** The follow-up prompts an agent built with `followups=True` suggests. */\nexport const isFollowupsCompletedEvent = (e: RunEventData): boolean =>\n name(e) === 'FollowupsCompleted' || name(e) === 'TeamFollowupsCompleted'\n\n/**\n * A nested-run event — a team member's turn or a workflow step executor.\n * Identified by a `parent_run_id` on an agent/team content/tool/run event.\n */\nexport function isSubRunEvent(e: RunEventData): boolean {\n if (!e.parent_run_id) return false\n const ev = name(e)\n return (\n isContentEvent(e) ||\n isToolEvent(e) ||\n isCompletedEvent(e) ||\n isErrorEvent(e) ||\n ev === 'RunStarted' ||\n ev === 'TeamRunStarted'\n )\n}\n\n/** A workflow step lifecycle event (start / output / complete / error). */\nexport function isStepEvent(e: RunEventData): boolean {\n const ev = name(e)\n return ev === 'StepStarted' || ev === 'StepCompleted' || ev === 'StepOutput' || ev === 'StepError'\n}\n\n/** Tool executions carried by an event, from either the single or array field. */\nexport function toolsFromEvent(e: RunEventData): ToolExecution[] {\n const out: ToolExecution[] = []\n if (e.tool) out.push(e.tool)\n if (Array.isArray(e.tools)) out.push(...e.tools)\n return out\n}\n\n/** Apply a content chunk and its related metadata to a message. */\nexport function applyContentEvent(message: ChatMessage, e: RunEventData): ChatMessage {\n const next: ChatMessage = { ...message }\n\n if (typeof e.content === 'string' && e.content) {\n next.content = message.content + e.content\n } else if (e.content && typeof e.content === 'object') {\n next.content = message.content + '\\n```json\\n' + JSON.stringify(e.content, null, 2) + '\\n```\\n'\n }\n\n if (e.reasoning_steps?.length) next.reasoning_steps = e.reasoning_steps\n if (e.extra_data?.reasoning_steps?.length) next.reasoning_steps = e.extra_data.reasoning_steps\n if (e.references?.length) next.references = e.references\n if (e.extra_data?.references?.length) next.references = e.extra_data.references\n if (e.citations) next.citations = e.citations\n\n const tools = toolsFromEvent(e)\n if (tools.length) {\n let toolCalls = message.tool_calls ?? []\n for (const tool of tools) toolCalls = mergeTool(toolCalls, tool)\n next.tool_calls = toolCalls\n }\n\n if (e.images?.length) next.images = e.images\n if (e.videos?.length) next.videos = e.videos\n if (e.audio?.length) next.audio = e.audio\n if (e.response_audio?.transcript) {\n next.response_audio = {\n ...message.response_audio,\n transcript: (message.response_audio?.transcript ?? '') + e.response_audio.transcript,\n }\n }\n\n return next\n}\n\n/**\n * A short human-readable label describing what a run is doing at the moment of\n * this event — for a live status line (\"Calling get_weather\", \"Reasoning…\").\n * Returns null for events that don't warrant a status change.\n */\nexport function activityLabel(e: RunEventData): string | null {\n const ev = name(e)\n switch (ev) {\n case 'RunStarted':\n case 'TeamRunStarted':\n case 'WorkflowStarted':\n return 'Thinking'\n case 'ModelRequestStarted':\n case 'TeamModelRequestStarted':\n return 'Generating'\n case 'ReasoningStarted':\n case 'TeamReasoningStarted':\n case 'ReasoningStep':\n case 'TeamReasoningStep':\n case 'ReasoningContentDelta':\n case 'TeamReasoningContentDelta':\n return 'Reasoning'\n case 'MemoryUpdateStarted':\n case 'TeamMemoryUpdateStarted':\n return 'Updating memory'\n case 'SessionSummaryStarted':\n case 'TeamSessionSummaryStarted':\n return 'Summarising session'\n case 'CompressionStarted':\n return 'Compressing context'\n case 'FollowupsStarted':\n case 'TeamFollowupsStarted':\n return 'Suggesting follow-ups'\n case 'ToolCallStarted':\n case 'TeamToolCallStarted': {\n const tool = e.tool?.tool_name\n return tool ? `Calling ${tool}` : 'Calling tool'\n }\n case 'ToolCallCompleted':\n case 'TeamToolCallCompleted':\n return 'Generating'\n case 'StepStarted':\n return e.step_name ? `Running step: ${e.step_name}` : 'Running step'\n case 'LoopIterationStarted':\n return `Loop iteration ${e.iteration ?? ''}`.trim()\n case 'ParallelExecutionStarted':\n return 'Running parallel steps'\n case 'RouterExecutionStarted':\n return 'Routing'\n case 'ConditionExecutionStarted':\n return 'Evaluating condition'\n default:\n return null\n }\n}\n\nfunction textOf(value: unknown): string | undefined {\n if (typeof value === 'string') return value\n if (value && typeof value === 'object') return '```json\\n' + JSON.stringify(value, null, 2) + '\\n```'\n return undefined\n}\n\n/** Apply a nested member/executor run event into a message's `members`. */\nexport function applySubRunEvent(\n message: ChatMessage,\n e: RunEventData,\n kind: SubRun['kind'],\n): ChatMessage {\n const rid = e.run_id || e.parent_run_id || 'sub'\n const members = message.members ? [...message.members] : []\n const idx = members.findIndex((s) => s.run_id === rid)\n const base: SubRun = idx >= 0 ? { ...members[idx] } : { run_id: rid, kind, content: '', status: 'running' }\n\n base.name = base.name || (e.agent_name as string) || (e.team_name as string) || (e.agent_id as string)\n\n const tools = toolsFromEvent(e)\n if (tools.length) {\n let tc = base.tool_calls ?? []\n for (const t of tools) tc = mergeTool(tc, t)\n base.tool_calls = tc\n }\n\n if (isErrorEvent(e)) {\n base.status = 'error'\n } else if (isCompletedEvent(e)) {\n base.status = 'completed'\n const final = textOf(e.content)\n if (final) base.content = final\n } else if (isContentEvent(e)) {\n const delta = typeof e.content === 'string' ? e.content : ''\n if (delta) base.content += delta\n }\n\n if (idx >= 0) members[idx] = base\n else members.push(base)\n return { ...message, members }\n}\n\n/** Apply a workflow `Step*` event into a message's `steps`. */\nexport function applyStepEvent(message: ChatMessage, e: RunEventData): ChatMessage {\n const ev = name(e)\n const key = (e.step_name as string) || `step-${JSON.stringify(e.step_index ?? '')}`\n const steps = message.steps ? [...message.steps] : []\n const idx = steps.findIndex((s) => s.key === key)\n const step: WorkflowStep =\n idx >= 0\n ? { ...steps[idx] }\n : { key, name: e.step_name, index: e.step_index, status: 'running' }\n\n if (ev === 'StepStarted') {\n step.status = 'running'\n } else if (ev === 'StepError') {\n step.status = 'error'\n step.error = e.error || (typeof e.content === 'string' ? e.content : undefined)\n } else {\n // StepCompleted / StepOutput\n step.status = 'completed'\n const stepResponse = (e.step_response ?? e.step_output) as { content?: unknown } | undefined\n const content = textOf(e.content) ?? textOf(stepResponse?.content)\n if (content) step.content = content\n }\n\n if (idx >= 0) steps[idx] = step\n else steps.push(step)\n return { ...message, steps }\n}\n\n/** Merge a tool execution into a list, updating an existing entry by id/name. */\nexport function mergeTool(list: ToolExecution[], tool: ToolExecution): ToolExecution[] {\n const key = tool.tool_call_id || `${tool.tool_name}-${tool.created_at}`\n const idx = list.findIndex((t) => {\n if (t.tool_call_id && tool.tool_call_id) return t.tool_call_id === tool.tool_call_id\n return `${t.tool_name}-${t.created_at}` === key\n })\n if (idx >= 0) {\n const next = [...list]\n next[idx] = { ...next[idx], ...tool }\n return next\n }\n return [...list, tool]\n}\n"]}