@tanstack/ai-devtools-core 0.2.1 โ†’ 0.2.3

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.
Files changed (29) hide show
  1. package/README.md +1 -0
  2. package/dist/esm/components/ConversationDetails.js +74 -1
  3. package/dist/esm/components/ConversationDetails.js.map +1 -1
  4. package/dist/esm/components/conversation/ActivityEventsTab.d.ts +8 -0
  5. package/dist/esm/components/conversation/ActivityEventsTab.js +72 -0
  6. package/dist/esm/components/conversation/ActivityEventsTab.js.map +1 -0
  7. package/dist/esm/components/conversation/ConversationHeader.js +109 -66
  8. package/dist/esm/components/conversation/ConversationHeader.js.map +1 -1
  9. package/dist/esm/components/conversation/ConversationTabs.d.ts +1 -1
  10. package/dist/esm/components/conversation/ConversationTabs.js +107 -3
  11. package/dist/esm/components/conversation/ConversationTabs.js.map +1 -1
  12. package/dist/esm/components/conversation/MessageCard.js +83 -28
  13. package/dist/esm/components/conversation/MessageCard.js.map +1 -1
  14. package/dist/esm/components/conversation/index.d.ts +1 -0
  15. package/dist/esm/store/ai-context.d.ts +19 -2
  16. package/dist/esm/store/ai-context.js +528 -262
  17. package/dist/esm/store/ai-context.js.map +1 -1
  18. package/dist/esm/styles/use-styles.d.ts +7 -0
  19. package/dist/esm/styles/use-styles.js +65 -1
  20. package/dist/esm/styles/use-styles.js.map +1 -1
  21. package/package.json +2 -2
  22. package/src/components/ConversationDetails.tsx +70 -1
  23. package/src/components/conversation/ActivityEventsTab.tsx +57 -0
  24. package/src/components/conversation/ConversationHeader.tsx +52 -36
  25. package/src/components/conversation/ConversationTabs.tsx +121 -2
  26. package/src/components/conversation/MessageCard.tsx +45 -10
  27. package/src/components/conversation/index.ts +1 -0
  28. package/src/store/ai-context.tsx +783 -418
  29. package/src/styles/use-styles.ts +65 -1
package/README.md CHANGED
@@ -45,6 +45,7 @@ A powerful, type-safe AI SDK for building AI-powered applications.
45
45
  - Headless chat state management with adapters (SSE, HTTP stream, custom)
46
46
  - Isomorphic type-safe tools with server/client execution
47
47
  - **Enhanced integration with TanStack Start** - Share implementations between AI tools and server functions
48
+ - **Observability events** - Structured, typed events for text, tools, image, speech, transcription, and video ([docs](./docs/guides/observability.md))
48
49
 
49
50
  ### <a href="https://tanstack.com/ai">Read the docs โ†’</b></a>
50
51
 
@@ -7,6 +7,7 @@ import { ConversationTabs } from "./conversation/ConversationTabs.js";
7
7
  import { MessagesTab } from "./conversation/MessagesTab.js";
8
8
  import { ChunksTab } from "./conversation/ChunksTab.js";
9
9
  import { SummariesTab } from "./conversation/SummariesTab.js";
10
+ import { ActivityEventsTab } from "./conversation/ActivityEventsTab.js";
10
11
  var _tmpl$ = /* @__PURE__ */ template(`<div>Select a conversation to view details`), _tmpl$2 = /* @__PURE__ */ template(`<div><div>`);
11
12
  const ConversationDetails = () => {
12
13
  const {
@@ -26,11 +27,31 @@ const ConversationDetails = () => {
26
27
  setActiveTab("chunks");
27
28
  } else if (conv.hasSummarize || conv.summaries && conv.summaries.length > 0) {
28
29
  setActiveTab("summaries");
30
+ } else if (conv.hasImage || conv.imageEvents && conv.imageEvents.length > 0) {
31
+ setActiveTab("image");
32
+ } else if (conv.hasSpeech || conv.speechEvents && conv.speechEvents.length > 0) {
33
+ setActiveTab("speech");
34
+ } else if (conv.hasTranscription || conv.transcriptionEvents && conv.transcriptionEvents.length > 0) {
35
+ setActiveTab("transcription");
36
+ } else if (conv.hasVideo || conv.videoEvents && conv.videoEvents.length > 0) {
37
+ setActiveTab("video");
29
38
  } else {
30
39
  setActiveTab("chunks");
31
40
  }
32
41
  } else {
33
- setActiveTab("messages");
42
+ if (conv.messages.length > 0) {
43
+ setActiveTab("messages");
44
+ } else if (conv.hasImage || conv.imageEvents && conv.imageEvents.length > 0) {
45
+ setActiveTab("image");
46
+ } else if (conv.hasSpeech || conv.speechEvents && conv.speechEvents.length > 0) {
47
+ setActiveTab("speech");
48
+ } else if (conv.hasTranscription || conv.transcriptionEvents && conv.transcriptionEvents.length > 0) {
49
+ setActiveTab("transcription");
50
+ } else if (conv.hasVideo || conv.videoEvents && conv.videoEvents.length > 0) {
51
+ setActiveTab("video");
52
+ } else {
53
+ setActiveTab("messages");
54
+ }
34
55
  }
35
56
  }
36
57
  });
@@ -100,6 +121,58 @@ const ConversationDetails = () => {
100
121
  });
101
122
  }
102
123
  }), null);
124
+ insert(_el$3, createComponent(Show, {
125
+ get when() {
126
+ return activeTab() === "image";
127
+ },
128
+ get children() {
129
+ return createComponent(ActivityEventsTab, {
130
+ title: "Image Activity",
131
+ get events() {
132
+ return conv().imageEvents ?? [];
133
+ }
134
+ });
135
+ }
136
+ }), null);
137
+ insert(_el$3, createComponent(Show, {
138
+ get when() {
139
+ return activeTab() === "speech";
140
+ },
141
+ get children() {
142
+ return createComponent(ActivityEventsTab, {
143
+ title: "Speech Activity",
144
+ get events() {
145
+ return conv().speechEvents ?? [];
146
+ }
147
+ });
148
+ }
149
+ }), null);
150
+ insert(_el$3, createComponent(Show, {
151
+ get when() {
152
+ return activeTab() === "transcription";
153
+ },
154
+ get children() {
155
+ return createComponent(ActivityEventsTab, {
156
+ title: "Transcription Activity",
157
+ get events() {
158
+ return conv().transcriptionEvents ?? [];
159
+ }
160
+ });
161
+ }
162
+ }), null);
163
+ insert(_el$3, createComponent(Show, {
164
+ get when() {
165
+ return activeTab() === "video";
166
+ },
167
+ get children() {
168
+ return createComponent(ActivityEventsTab, {
169
+ title: "Video Activity",
170
+ get events() {
171
+ return conv().videoEvents ?? [];
172
+ }
173
+ });
174
+ }
175
+ }), null);
103
176
  effect((_p$) => {
104
177
  var _v$ = styles().conversationDetails.container, _v$2 = styles().conversationDetails.contentArea;
105
178
  _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationDetails.js","sources":["../../../src/components/ConversationDetails.tsx"],"sourcesContent":["import { Show, createEffect, createSignal } from 'solid-js'\nimport { useStyles } from '../styles/use-styles'\nimport { useAIStore } from '../store/ai-context'\nimport {\n ChunksTab,\n ConversationHeader,\n ConversationTabs,\n MessagesTab,\n SummariesTab,\n} from './conversation'\nimport type { TabType } from './conversation'\nimport type { Conversation } from '../store/ai-context'\nimport type { Component } from 'solid-js'\n\nexport const ConversationDetails: Component = () => {\n const { state } = useAIStore()\n const styles = useStyles()\n const [activeTab, setActiveTab] = createSignal<TabType>('messages')\n\n const activeConversation = (): Conversation | undefined => {\n if (!state.activeConversationId) return undefined\n return state.conversations[state.activeConversationId]\n }\n\n // Update active tab when conversation changes\n createEffect(() => {\n const conv = activeConversation()\n if (conv) {\n // For server conversations, always use chunks (messages tab is hidden)\n if (conv.type === 'server') {\n if (conv.chunks.length > 0) {\n setActiveTab('chunks')\n } else if (\n conv.hasSummarize ||\n (conv.summaries && conv.summaries.length > 0)\n ) {\n setActiveTab('summaries')\n } else {\n setActiveTab('chunks')\n }\n } else {\n // For client conversations, default to messages tab\n setActiveTab('messages')\n }\n }\n })\n\n return (\n <Show\n when={activeConversation()}\n fallback={\n <div class={styles().conversationDetails.emptyState}>\n Select a conversation to view details\n </div>\n }\n >\n {(conv) => (\n <div class={styles().conversationDetails.container}>\n <ConversationHeader conversation={conv()} />\n <ConversationTabs\n conversation={conv()}\n activeTab={activeTab()}\n onTabChange={setActiveTab}\n />\n <div class={styles().conversationDetails.contentArea}>\n <Show when={activeTab() === 'messages'}>\n <MessagesTab messages={conv().messages} />\n </Show>\n <Show when={activeTab() === 'chunks'}>\n <ChunksTab chunks={conv().chunks} messages={conv().messages} />\n </Show>\n <Show when={activeTab() === 'summaries'}>\n <SummariesTab summaries={conv().summaries ?? []} />\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["ConversationDetails","state","useAIStore","styles","useStyles","activeTab","setActiveTab","createSignal","activeConversation","activeConversationId","undefined","conversations","createEffect","conv","type","chunks","length","hasSummarize","summaries","_$createComponent","Show","when","fallback","_el$","_tmpl$","_$effect","_$className","conversationDetails","emptyState","children","_el$2","_tmpl$2","_el$3","firstChild","_$insert","ConversationHeader","conversation","ConversationTabs","onTabChange","MessagesTab","messages","ChunksTab","SummariesTab","_p$","_v$","container","_v$2","contentArea","e","t"],"mappings":"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"}
1
+ {"version":3,"file":"ConversationDetails.js","sources":["../../../src/components/ConversationDetails.tsx"],"sourcesContent":["import { Show, createEffect, createSignal } from 'solid-js'\nimport { useStyles } from '../styles/use-styles'\nimport { useAIStore } from '../store/ai-context'\nimport {\n ActivityEventsTab,\n ChunksTab,\n ConversationHeader,\n ConversationTabs,\n MessagesTab,\n SummariesTab,\n} from './conversation'\nimport type { TabType } from './conversation'\nimport type { Conversation } from '../store/ai-context'\nimport type { Component } from 'solid-js'\n\nexport const ConversationDetails: Component = () => {\n const { state } = useAIStore()\n const styles = useStyles()\n const [activeTab, setActiveTab] = createSignal<TabType>('messages')\n\n const activeConversation = (): Conversation | undefined => {\n if (!state.activeConversationId) return undefined\n return state.conversations[state.activeConversationId]\n }\n\n // Update active tab when conversation changes\n createEffect(() => {\n const conv = activeConversation()\n if (conv) {\n // For server conversations, always use chunks (messages tab is hidden)\n if (conv.type === 'server') {\n if (conv.chunks.length > 0) {\n setActiveTab('chunks')\n } else if (\n conv.hasSummarize ||\n (conv.summaries && conv.summaries.length > 0)\n ) {\n setActiveTab('summaries')\n } else if (\n conv.hasImage ||\n (conv.imageEvents && conv.imageEvents.length > 0)\n ) {\n setActiveTab('image')\n } else if (\n conv.hasSpeech ||\n (conv.speechEvents && conv.speechEvents.length > 0)\n ) {\n setActiveTab('speech')\n } else if (\n conv.hasTranscription ||\n (conv.transcriptionEvents && conv.transcriptionEvents.length > 0)\n ) {\n setActiveTab('transcription')\n } else if (\n conv.hasVideo ||\n (conv.videoEvents && conv.videoEvents.length > 0)\n ) {\n setActiveTab('video')\n } else {\n setActiveTab('chunks')\n }\n } else {\n // For client conversations, default to messages tab\n if (conv.messages.length > 0) {\n setActiveTab('messages')\n } else if (\n conv.hasImage ||\n (conv.imageEvents && conv.imageEvents.length > 0)\n ) {\n setActiveTab('image')\n } else if (\n conv.hasSpeech ||\n (conv.speechEvents && conv.speechEvents.length > 0)\n ) {\n setActiveTab('speech')\n } else if (\n conv.hasTranscription ||\n (conv.transcriptionEvents && conv.transcriptionEvents.length > 0)\n ) {\n setActiveTab('transcription')\n } else if (\n conv.hasVideo ||\n (conv.videoEvents && conv.videoEvents.length > 0)\n ) {\n setActiveTab('video')\n } else {\n setActiveTab('messages')\n }\n }\n }\n })\n\n return (\n <Show\n when={activeConversation()}\n fallback={\n <div class={styles().conversationDetails.emptyState}>\n Select a conversation to view details\n </div>\n }\n >\n {(conv) => (\n <div class={styles().conversationDetails.container}>\n <ConversationHeader conversation={conv()} />\n <ConversationTabs\n conversation={conv()}\n activeTab={activeTab()}\n onTabChange={setActiveTab}\n />\n <div class={styles().conversationDetails.contentArea}>\n <Show when={activeTab() === 'messages'}>\n <MessagesTab messages={conv().messages} />\n </Show>\n <Show when={activeTab() === 'chunks'}>\n <ChunksTab chunks={conv().chunks} messages={conv().messages} />\n </Show>\n <Show when={activeTab() === 'summaries'}>\n <SummariesTab summaries={conv().summaries ?? []} />\n </Show>\n <Show when={activeTab() === 'image'}>\n <ActivityEventsTab\n title=\"Image Activity\"\n events={conv().imageEvents ?? []}\n />\n </Show>\n <Show when={activeTab() === 'speech'}>\n <ActivityEventsTab\n title=\"Speech Activity\"\n events={conv().speechEvents ?? []}\n />\n </Show>\n <Show when={activeTab() === 'transcription'}>\n <ActivityEventsTab\n title=\"Transcription Activity\"\n events={conv().transcriptionEvents ?? []}\n />\n </Show>\n <Show when={activeTab() === 'video'}>\n <ActivityEventsTab\n title=\"Video Activity\"\n events={conv().videoEvents ?? []}\n />\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["ConversationDetails","state","useAIStore","styles","useStyles","activeTab","setActiveTab","createSignal","activeConversation","activeConversationId","undefined","conversations","createEffect","conv","type","chunks","length","hasSummarize","summaries","hasImage","imageEvents","hasSpeech","speechEvents","hasTranscription","transcriptionEvents","hasVideo","videoEvents","messages","_$createComponent","Show","when","fallback","_el$","_tmpl$","_$effect","_$className","conversationDetails","emptyState","children","_el$2","_tmpl$2","_el$3","firstChild","_$insert","ConversationHeader","conversation","ConversationTabs","onTabChange","MessagesTab","ChunksTab","SummariesTab","ActivityEventsTab","title","events","_p$","_v$","container","_v$2","contentArea","e","t"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Component } from 'solid-js';
2
+ import { ActivityEvent } from '../../store/ai-context.js';
3
+ interface ActivityEventsTabProps {
4
+ title: string;
5
+ events: Array<ActivityEvent>;
6
+ }
7
+ export declare const ActivityEventsTab: Component<ActivityEventsTabProps>;
8
+ export {};
@@ -0,0 +1,72 @@
1
+ import { createComponent, template, insert, effect, className } from "solid-js/web";
2
+ import { Show, For } from "solid-js";
3
+ import { useStyles } from "../../styles/use-styles.js";
4
+ var _tmpl$ = /* @__PURE__ */ template(`<div><div><div><div></div><div> events</div></div><div>Activity event log</div></div><div>`), _tmpl$2 = /* @__PURE__ */ template(`<div>No events yet`), _tmpl$3 = /* @__PURE__ */ template(`<div><div> ยท </div><pre>`);
5
+ const ActivityEventsTab = (props) => {
6
+ const styles = useStyles();
7
+ const formattedTimestamp = (timestamp) => new Date(timestamp).toLocaleTimeString();
8
+ return createComponent(Show, {
9
+ get when() {
10
+ return props.events.length > 0;
11
+ },
12
+ get fallback() {
13
+ return (() => {
14
+ var _el$9 = _tmpl$2();
15
+ effect(() => className(_el$9, styles().conversationDetails.noChunks));
16
+ return _el$9;
17
+ })();
18
+ },
19
+ get children() {
20
+ var _el$ = _tmpl$(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$3.nextSibling, _el$8 = _el$2.nextSibling;
21
+ insert(_el$4, () => props.title);
22
+ insert(_el$5, () => props.events.length, _el$6);
23
+ insert(_el$8, createComponent(For, {
24
+ get each() {
25
+ return props.events;
26
+ },
27
+ children: (event) => (() => {
28
+ var _el$0 = _tmpl$3(), _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$1.nextSibling;
29
+ insert(_el$1, () => event.name, _el$10);
30
+ insert(_el$1, () => formattedTimestamp(event.timestamp), null);
31
+ insert(_el$11, () => JSON.stringify(event.payload, null, 2));
32
+ effect((_p$) => {
33
+ var _v$8 = styles().detailSection, _v$9 = styles().detailSectionHeader, _v$0 = styles().conversationDetails.jsonPreview;
34
+ _v$8 !== _p$.e && className(_el$0, _p$.e = _v$8);
35
+ _v$9 !== _p$.t && className(_el$1, _p$.t = _v$9);
36
+ _v$0 !== _p$.a && className(_el$11, _p$.a = _v$0);
37
+ return _p$;
38
+ }, {
39
+ e: void 0,
40
+ t: void 0,
41
+ a: void 0
42
+ });
43
+ return _el$0;
44
+ })()
45
+ }));
46
+ effect((_p$) => {
47
+ var _v$ = styles().conversationDetails.streamContainer, _v$2 = styles().conversationDetails.streamHeader, _v$3 = styles().conversationDetails.streamHeaderRow, _v$4 = styles().conversationDetails.streamTitle, _v$5 = `${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeCount}`, _v$6 = styles().conversationDetails.streamSubtitle, _v$7 = styles().conversationDetails.messageGroups;
48
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
49
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
50
+ _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
51
+ _v$4 !== _p$.o && className(_el$4, _p$.o = _v$4);
52
+ _v$5 !== _p$.i && className(_el$5, _p$.i = _v$5);
53
+ _v$6 !== _p$.n && className(_el$7, _p$.n = _v$6);
54
+ _v$7 !== _p$.s && className(_el$8, _p$.s = _v$7);
55
+ return _p$;
56
+ }, {
57
+ e: void 0,
58
+ t: void 0,
59
+ a: void 0,
60
+ o: void 0,
61
+ i: void 0,
62
+ n: void 0,
63
+ s: void 0
64
+ });
65
+ return _el$;
66
+ }
67
+ });
68
+ };
69
+ export {
70
+ ActivityEventsTab
71
+ };
72
+ //# sourceMappingURL=ActivityEventsTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityEventsTab.js","sources":["../../../../src/components/conversation/ActivityEventsTab.tsx"],"sourcesContent":["import { For, Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport type { Component } from 'solid-js'\nimport type { ActivityEvent } from '../../store/ai-context'\n\ninterface ActivityEventsTabProps {\n title: string\n events: Array<ActivityEvent>\n}\n\nexport const ActivityEventsTab: Component<ActivityEventsTabProps> = (props) => {\n const styles = useStyles()\n\n const formattedTimestamp = (timestamp: number) =>\n new Date(timestamp).toLocaleTimeString()\n\n return (\n <Show\n when={props.events.length > 0}\n fallback={\n <div class={styles().conversationDetails.noChunks}>No events yet</div>\n }\n >\n <div class={styles().conversationDetails.streamContainer}>\n <div class={styles().conversationDetails.streamHeader}>\n <div class={styles().conversationDetails.streamHeaderRow}>\n <div class={styles().conversationDetails.streamTitle}>\n {props.title}\n </div>\n <div\n class={`${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeCount}`}\n >\n {props.events.length} events\n </div>\n </div>\n <div class={styles().conversationDetails.streamSubtitle}>\n Activity event log\n </div>\n </div>\n <div class={styles().conversationDetails.messageGroups}>\n <For each={props.events}>\n {(event) => (\n <div class={styles().detailSection}>\n <div class={styles().detailSectionHeader}>\n {event.name} ยท {formattedTimestamp(event.timestamp)}\n </div>\n <pre class={styles().conversationDetails.jsonPreview}>\n {JSON.stringify(event.payload, null, 2)}\n </pre>\n </div>\n )}\n </For>\n </div>\n </div>\n </Show>\n )\n}\n"],"names":["ActivityEventsTab","props","styles","useStyles","formattedTimestamp","timestamp","Date","toLocaleTimeString","_$createComponent","Show","when","events","length","fallback","_el$9","_tmpl$2","_$effect","_$className","conversationDetails","noChunks","children","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","_el$5","nextSibling","_el$6","_el$7","_el$8","_$insert","title","For","each","event","_el$0","_tmpl$3","_el$1","_el$10","_el$11","name","JSON","stringify","payload","_p$","_v$8","detailSection","_v$9","detailSectionHeader","_v$0","jsonPreview","e","t","a","undefined","_v$","streamContainer","_v$2","streamHeader","_v$3","streamHeaderRow","_v$4","streamTitle","_v$5","chunkBadge","chunkBadgeCount","_v$6","streamSubtitle","_v$7","messageGroups","o","i","n","s"],"mappings":"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"}
@@ -1,17 +1,19 @@
1
1
  import { template, insert, createComponent, effect, className, memo } from "solid-js/web";
2
2
  import { Show, For } from "solid-js";
3
+ import { JsonTree } from "@tanstack/devtools-ui";
3
4
  import { useStyles } from "../../styles/use-styles.js";
4
5
  import { formatDuration } from "../utils/format.js";
5
- var _tmpl$ = /* @__PURE__ */ template(`<div>๐Ÿ”„ <!> iterations`), _tmpl$2 = /* @__PURE__ */ template(`<div><span>๐ŸŽฏ Tokens:</span><span>Prompt: </span><span>โ€ข</span><span>Completion: </span><span>โ€ข</span><span>Total: `), _tmpl$3 = /* @__PURE__ */ template(`<div><span>๐Ÿ”ง</span><div>`), _tmpl$4 = /* @__PURE__ */ template(`<div><span>โš™๏ธ Options:</span><div>`), _tmpl$5 = /* @__PURE__ */ template(`<div><span>๐Ÿท๏ธ Provider:</span><div>`), _tmpl$6 = /* @__PURE__ */ template(`<div><div><div><div></div><div></div></div><div>`), _tmpl$7 = /* @__PURE__ */ template(`<span>`), _tmpl$8 = /* @__PURE__ */ template(`<span>: `);
6
+ var _tmpl$ = /* @__PURE__ */ template(`<div>๐Ÿ”„ <!> iterations`), _tmpl$2 = /* @__PURE__ */ template(`<div><span>๐Ÿ”ง</span><div>`), _tmpl$3 = /* @__PURE__ */ template(`<div><span>โš™๏ธ Options:</span><div>`), _tmpl$4 = /* @__PURE__ */ template(`<div><span>๐ŸŽฏ Tokens:</span><span>Prompt: </span><span>โ€ข</span><span>Completion: </span><span>โ€ข</span><span>Total: `), _tmpl$5 = /* @__PURE__ */ template(`<details><summary>๐Ÿงช Model options</summary><div>`), _tmpl$6 = /* @__PURE__ */ template(`<details><summary>๐Ÿงฉ System prompts (<!>)</summary><div>`), _tmpl$7 = /* @__PURE__ */ template(`<div><div><div><div></div><div></div></div><div>`), _tmpl$8 = /* @__PURE__ */ template(`<span>`), _tmpl$9 = /* @__PURE__ */ template(`<span>: `), _tmpl$0 = /* @__PURE__ */ template(`<div><div>#</div><div>`);
6
7
  const ConversationHeader = (props) => {
7
8
  const styles = useStyles();
8
9
  const conv = () => props.conversation;
9
10
  const toolNames = () => conv().toolNames ?? [];
10
11
  const options = () => conv().options;
11
- const providerOptions = () => conv().providerOptions;
12
+ const modelOptions = () => conv().modelOptions;
12
13
  const iterationCount = () => conv().iterationCount;
14
+ const systemPrompts = () => conv().systemPrompts ?? [];
13
15
  return (() => {
14
- var _el$ = _tmpl$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$0 = _el$3.nextSibling;
16
+ var _el$ = _tmpl$7(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$0 = _el$3.nextSibling;
15
17
  insert(_el$4, () => conv().label);
16
18
  insert(_el$5, () => conv().status);
17
19
  insert(_el$3, createComponent(Show, {
@@ -40,23 +42,26 @@ const ConversationHeader = (props) => {
40
42
  })(), null);
41
43
  insert(_el$2, createComponent(Show, {
42
44
  get when() {
43
- return conv().usage;
45
+ return toolNames().length > 0;
44
46
  },
45
47
  get children() {
46
48
  var _el$1 = _tmpl$2(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
47
- _el$11.firstChild;
48
- var _el$13 = _el$11.nextSibling, _el$14 = _el$13.nextSibling;
49
- _el$14.firstChild;
50
- var _el$16 = _el$14.nextSibling, _el$17 = _el$16.nextSibling;
51
- _el$17.firstChild;
52
- insert(_el$11, () => conv().usage?.promptTokens.toLocaleString() || 0, null);
53
- insert(_el$14, () => conv().usage?.completionTokens.toLocaleString() || 0, null);
54
- insert(_el$17, () => conv().usage?.totalTokens.toLocaleString() || 0, null);
49
+ insert(_el$11, createComponent(For, {
50
+ get each() {
51
+ return toolNames();
52
+ },
53
+ children: (toolName) => (() => {
54
+ var _el$34 = _tmpl$8();
55
+ insert(_el$34, toolName);
56
+ effect(() => className(_el$34, styles().conversationDetails.toolBadge));
57
+ return _el$34;
58
+ })()
59
+ }));
55
60
  effect((_p$) => {
56
- var _v$ = styles().conversationDetails.usageInfo, _v$2 = styles().conversationDetails.usageLabel, _v$3 = styles().conversationDetails.usageBold;
61
+ var _v$ = styles().conversationDetails.toolsRow, _v$2 = styles().conversationDetails.toolsLabel, _v$3 = styles().conversationDetails.toolsList;
57
62
  _v$ !== _p$.e && className(_el$1, _p$.e = _v$);
58
63
  _v$2 !== _p$.t && className(_el$10, _p$.t = _v$2);
59
- _v$3 !== _p$.a && className(_el$17, _p$.a = _v$3);
64
+ _v$3 !== _p$.a && className(_el$11, _p$.a = _v$3);
60
65
  return _p$;
61
66
  }, {
62
67
  e: void 0,
@@ -68,87 +73,78 @@ const ConversationHeader = (props) => {
68
73
  }), null);
69
74
  insert(_el$2, createComponent(Show, {
70
75
  get when() {
71
- return toolNames().length > 0;
76
+ return memo(() => !!options())() && Object.keys(options()).length > 0;
72
77
  },
73
78
  get children() {
74
- var _el$19 = _tmpl$3(), _el$20 = _el$19.firstChild, _el$21 = _el$20.nextSibling;
75
- insert(_el$21, createComponent(For, {
79
+ var _el$12 = _tmpl$3(), _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
80
+ insert(_el$14, createComponent(For, {
76
81
  get each() {
77
- return toolNames();
82
+ return Object.entries(options());
78
83
  },
79
- children: (toolName) => (() => {
80
- var _el$28 = _tmpl$7();
81
- insert(_el$28, toolName);
82
- effect(() => className(_el$28, styles().conversationDetails.toolBadge));
83
- return _el$28;
84
+ children: ([key, value]) => (() => {
85
+ var _el$35 = _tmpl$9(), _el$36 = _el$35.firstChild;
86
+ insert(_el$35, key, _el$36);
87
+ insert(_el$35, () => typeof value === "object" ? JSON.stringify(value) : String(value), null);
88
+ effect(() => className(_el$35, styles().conversationDetails.optionBadge));
89
+ return _el$35;
84
90
  })()
85
91
  }));
86
92
  effect((_p$) => {
87
- var _v$4 = styles().conversationDetails.toolsRow, _v$5 = styles().conversationDetails.toolsLabel, _v$6 = styles().conversationDetails.toolsList;
88
- _v$4 !== _p$.e && className(_el$19, _p$.e = _v$4);
89
- _v$5 !== _p$.t && className(_el$20, _p$.t = _v$5);
90
- _v$6 !== _p$.a && className(_el$21, _p$.a = _v$6);
93
+ var _v$4 = styles().conversationDetails.optionsRow, _v$5 = styles().conversationDetails.optionsLabel, _v$6 = styles().conversationDetails.optionsCompact;
94
+ _v$4 !== _p$.e && className(_el$12, _p$.e = _v$4);
95
+ _v$5 !== _p$.t && className(_el$13, _p$.t = _v$5);
96
+ _v$6 !== _p$.a && className(_el$14, _p$.a = _v$6);
91
97
  return _p$;
92
98
  }, {
93
99
  e: void 0,
94
100
  t: void 0,
95
101
  a: void 0
96
102
  });
97
- return _el$19;
103
+ return _el$12;
98
104
  }
99
105
  }), null);
100
106
  insert(_el$2, createComponent(Show, {
101
107
  get when() {
102
- return memo(() => !!options())() && Object.keys(options()).length > 0;
108
+ return conv().usage;
103
109
  },
104
110
  get children() {
105
- var _el$22 = _tmpl$4(), _el$23 = _el$22.firstChild, _el$24 = _el$23.nextSibling;
106
- insert(_el$24, createComponent(For, {
107
- get each() {
108
- return Object.entries(options());
109
- },
110
- children: ([key, value]) => (() => {
111
- var _el$29 = _tmpl$8(), _el$30 = _el$29.firstChild;
112
- insert(_el$29, key, _el$30);
113
- insert(_el$29, () => typeof value === "object" ? JSON.stringify(value) : String(value), null);
114
- effect(() => className(_el$29, styles().conversationDetails.optionBadge));
115
- return _el$29;
116
- })()
117
- }));
111
+ var _el$15 = _tmpl$4(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
112
+ _el$17.firstChild;
113
+ var _el$19 = _el$17.nextSibling, _el$20 = _el$19.nextSibling;
114
+ _el$20.firstChild;
115
+ var _el$22 = _el$20.nextSibling, _el$23 = _el$22.nextSibling;
116
+ _el$23.firstChild;
117
+ insert(_el$17, () => conv().usage?.promptTokens.toLocaleString() || 0, null);
118
+ insert(_el$20, () => conv().usage?.completionTokens.toLocaleString() || 0, null);
119
+ insert(_el$23, () => conv().usage?.totalTokens.toLocaleString() || 0, null);
118
120
  effect((_p$) => {
119
- var _v$7 = styles().conversationDetails.optionsRow, _v$8 = styles().conversationDetails.optionsLabel, _v$9 = styles().conversationDetails.optionsCompact;
120
- _v$7 !== _p$.e && className(_el$22, _p$.e = _v$7);
121
- _v$8 !== _p$.t && className(_el$23, _p$.t = _v$8);
122
- _v$9 !== _p$.a && className(_el$24, _p$.a = _v$9);
121
+ var _v$7 = styles().conversationDetails.usageInfo, _v$8 = styles().conversationDetails.usageLabel, _v$9 = styles().conversationDetails.usageBold;
122
+ _v$7 !== _p$.e && className(_el$15, _p$.e = _v$7);
123
+ _v$8 !== _p$.t && className(_el$16, _p$.t = _v$8);
124
+ _v$9 !== _p$.a && className(_el$23, _p$.a = _v$9);
123
125
  return _p$;
124
126
  }, {
125
127
  e: void 0,
126
128
  t: void 0,
127
129
  a: void 0
128
130
  });
129
- return _el$22;
131
+ return _el$15;
130
132
  }
131
133
  }), null);
132
134
  insert(_el$2, createComponent(Show, {
133
135
  get when() {
134
- return memo(() => !!providerOptions())() && Object.keys(providerOptions()).length > 0;
136
+ return memo(() => !!modelOptions())() && Object.keys(modelOptions()).length > 0;
135
137
  },
136
138
  get children() {
137
139
  var _el$25 = _tmpl$5(), _el$26 = _el$25.firstChild, _el$27 = _el$26.nextSibling;
138
- insert(_el$27, createComponent(For, {
139
- get each() {
140
- return Object.entries(providerOptions());
140
+ insert(_el$27, createComponent(JsonTree, {
141
+ get value() {
142
+ return modelOptions();
141
143
  },
142
- children: ([key, value]) => (() => {
143
- var _el$32 = _tmpl$8(), _el$33 = _el$32.firstChild;
144
- insert(_el$32, key, _el$33);
145
- insert(_el$32, () => typeof value === "object" ? JSON.stringify(value) : String(value), null);
146
- effect(() => className(_el$32, styles().conversationDetails.optionBadge));
147
- return _el$32;
148
- })()
144
+ defaultExpansionDepth: 2
149
145
  }));
150
146
  effect((_p$) => {
151
- var _v$0 = styles().conversationDetails.optionsRow, _v$1 = styles().conversationDetails.optionsLabel, _v$10 = styles().conversationDetails.optionsCompact;
147
+ var _v$0 = styles().conversationDetails.collapsibleSection, _v$1 = styles().conversationDetails.collapsibleSummary, _v$10 = styles().conversationDetails.collapsibleContent;
152
148
  _v$0 !== _p$.e && className(_el$25, _p$.e = _v$0);
153
149
  _v$1 !== _p$.t && className(_el$26, _p$.t = _v$1);
154
150
  _v$10 !== _p$.a && className(_el$27, _p$.a = _v$10);
@@ -161,14 +157,61 @@ const ConversationHeader = (props) => {
161
157
  return _el$25;
162
158
  }
163
159
  }), null);
160
+ insert(_el$2, createComponent(Show, {
161
+ get when() {
162
+ return systemPrompts().length > 0;
163
+ },
164
+ get children() {
165
+ var _el$28 = _tmpl$6(), _el$29 = _el$28.firstChild, _el$30 = _el$29.firstChild, _el$32 = _el$30.nextSibling;
166
+ _el$32.nextSibling;
167
+ var _el$33 = _el$29.nextSibling;
168
+ insert(_el$29, () => systemPrompts().length, _el$32);
169
+ insert(_el$33, createComponent(For, {
170
+ get each() {
171
+ return systemPrompts();
172
+ },
173
+ children: (prompt, index) => (() => {
174
+ var _el$38 = _tmpl$0(), _el$39 = _el$38.firstChild;
175
+ _el$39.firstChild;
176
+ var _el$41 = _el$39.nextSibling;
177
+ insert(_el$39, () => index() + 1, null);
178
+ insert(_el$41, prompt);
179
+ effect((_p$) => {
180
+ var _v$20 = styles().conversationDetails.systemPromptItem, _v$21 = styles().conversationDetails.systemPromptIndex, _v$22 = styles().conversationDetails.systemPromptText;
181
+ _v$20 !== _p$.e && className(_el$38, _p$.e = _v$20);
182
+ _v$21 !== _p$.t && className(_el$39, _p$.t = _v$21);
183
+ _v$22 !== _p$.a && className(_el$41, _p$.a = _v$22);
184
+ return _p$;
185
+ }, {
186
+ e: void 0,
187
+ t: void 0,
188
+ a: void 0
189
+ });
190
+ return _el$38;
191
+ })()
192
+ }));
193
+ effect((_p$) => {
194
+ var _v$11 = styles().conversationDetails.collapsibleSection, _v$12 = styles().conversationDetails.collapsibleSummary, _v$13 = styles().conversationDetails.collapsibleContent;
195
+ _v$11 !== _p$.e && className(_el$28, _p$.e = _v$11);
196
+ _v$12 !== _p$.t && className(_el$29, _p$.t = _v$12);
197
+ _v$13 !== _p$.a && className(_el$33, _p$.a = _v$13);
198
+ return _p$;
199
+ }, {
200
+ e: void 0,
201
+ t: void 0,
202
+ a: void 0
203
+ });
204
+ return _el$28;
205
+ }
206
+ }), null);
164
207
  effect((_p$) => {
165
- var _v$11 = styles().panelHeader, _v$12 = styles().conversationDetails.headerContent, _v$13 = styles().conversationDetails.headerRow, _v$14 = styles().conversationDetails.headerLabel, _v$15 = `${styles().conversationDetails.statusBadge} ${conv().status === "active" ? styles().conversationDetails.statusActive : conv().status === "completed" ? styles().conversationDetails.statusCompleted : styles().conversationDetails.statusError}`, _v$16 = styles().conversationDetails.metaInfo;
166
- _v$11 !== _p$.e && className(_el$, _p$.e = _v$11);
167
- _v$12 !== _p$.t && className(_el$2, _p$.t = _v$12);
168
- _v$13 !== _p$.a && className(_el$3, _p$.a = _v$13);
169
- _v$14 !== _p$.o && className(_el$4, _p$.o = _v$14);
170
- _v$15 !== _p$.i && className(_el$5, _p$.i = _v$15);
171
- _v$16 !== _p$.n && className(_el$0, _p$.n = _v$16);
208
+ var _v$14 = styles().panelHeader, _v$15 = styles().conversationDetails.headerContent, _v$16 = styles().conversationDetails.headerRow, _v$17 = styles().conversationDetails.headerLabel, _v$18 = `${styles().conversationDetails.statusBadge} ${conv().status === "active" ? styles().conversationDetails.statusActive : conv().status === "completed" ? styles().conversationDetails.statusCompleted : styles().conversationDetails.statusError}`, _v$19 = styles().conversationDetails.metaInfo;
209
+ _v$14 !== _p$.e && className(_el$, _p$.e = _v$14);
210
+ _v$15 !== _p$.t && className(_el$2, _p$.t = _v$15);
211
+ _v$16 !== _p$.a && className(_el$3, _p$.a = _v$16);
212
+ _v$17 !== _p$.o && className(_el$4, _p$.o = _v$17);
213
+ _v$18 !== _p$.i && className(_el$5, _p$.i = _v$18);
214
+ _v$19 !== _p$.n && className(_el$0, _p$.n = _v$19);
172
215
  return _p$;
173
216
  }, {
174
217
  e: void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationHeader.js","sources":["../../../../src/components/conversation/ConversationHeader.tsx"],"sourcesContent":["import { For, Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport { formatDuration } from '../utils'\nimport type { Component } from 'solid-js'\nimport type { Conversation } from '../../store/ai-context'\n\ninterface ConversationHeaderProps {\n conversation: Conversation\n}\n\nexport const ConversationHeader: Component<ConversationHeaderProps> = (\n props,\n) => {\n const styles = useStyles()\n const conv = () => props.conversation\n\n const toolNames = () => conv().toolNames ?? []\n const options = () => conv().options\n const providerOptions = () => conv().providerOptions\n const iterationCount = () => conv().iterationCount\n\n return (\n <div class={styles().panelHeader}>\n <div class={styles().conversationDetails.headerContent}>\n <div class={styles().conversationDetails.headerRow}>\n <div class={styles().conversationDetails.headerLabel}>\n {conv().label}\n </div>\n <div\n class={`${styles().conversationDetails.statusBadge} ${\n conv().status === 'active'\n ? styles().conversationDetails.statusActive\n : conv().status === 'completed'\n ? styles().conversationDetails.statusCompleted\n : styles().conversationDetails.statusError\n }`}\n >\n {conv().status}\n </div>\n <Show when={iterationCount() !== undefined && iterationCount()! > 1}>\n <div class={styles().conversationDetails.iterationBadge}>\n ๐Ÿ”„ {iterationCount()} iterations\n </div>\n </Show>\n </div>\n <div class={styles().conversationDetails.metaInfo}>\n {conv().model && `Model: ${conv().model}`}\n {conv().provider && ` โ€ข Provider: ${conv().provider}`}\n {conv().completedAt &&\n ` โ€ข Duration: ${formatDuration(conv().completedAt! - conv().startedAt)}`}\n </div>\n <Show when={conv().usage}>\n <div class={styles().conversationDetails.usageInfo}>\n <span class={styles().conversationDetails.usageLabel}>\n ๐ŸŽฏ Tokens:\n </span>\n <span>\n Prompt: {conv().usage?.promptTokens.toLocaleString() || 0}\n </span>\n <span>โ€ข</span>\n <span>\n Completion: {conv().usage?.completionTokens.toLocaleString() || 0}\n </span>\n <span>โ€ข</span>\n <span class={styles().conversationDetails.usageBold}>\n Total: {conv().usage?.totalTokens.toLocaleString() || 0}\n </span>\n </div>\n </Show>\n {/* Tools list - always visible */}\n <Show when={toolNames().length > 0}>\n <div class={styles().conversationDetails.toolsRow}>\n <span class={styles().conversationDetails.toolsLabel}>๐Ÿ”ง</span>\n <div class={styles().conversationDetails.toolsList}>\n <For each={toolNames()}>\n {(toolName) => (\n <span class={styles().conversationDetails.toolBadge}>\n {toolName}\n </span>\n )}\n </For>\n </div>\n </div>\n </Show>\n {/* Options - always visible in compact form */}\n <Show when={options() && Object.keys(options()!).length > 0}>\n <div class={styles().conversationDetails.optionsRow}>\n <span class={styles().conversationDetails.optionsLabel}>\n โš™๏ธ Options:\n </span>\n <div class={styles().conversationDetails.optionsCompact}>\n <For each={Object.entries(options()!)}>\n {([key, value]) => (\n <span class={styles().conversationDetails.optionBadge}>\n {key}:{' '}\n {typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)}\n </span>\n )}\n </For>\n </div>\n </div>\n </Show>\n {/* Provider Options - always visible in compact form */}\n <Show\n when={providerOptions() && Object.keys(providerOptions()!).length > 0}\n >\n <div class={styles().conversationDetails.optionsRow}>\n <span class={styles().conversationDetails.optionsLabel}>\n ๐Ÿท๏ธ Provider:\n </span>\n <div class={styles().conversationDetails.optionsCompact}>\n <For each={Object.entries(providerOptions()!)}>\n {([key, value]) => (\n <span class={styles().conversationDetails.optionBadge}>\n {key}:{' '}\n {typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)}\n </span>\n )}\n </For>\n </div>\n </div>\n </Show>\n </div>\n </div>\n )\n}\n"],"names":["ConversationHeader","props","styles","useStyles","conv","conversation","toolNames","options","providerOptions","iterationCount","_el$","_tmpl$6","_el$2","firstChild","_el$3","_el$4","_el$5","nextSibling","_el$0","_$insert","label","status","_$createComponent","Show","when","_$memo","undefined","children","_el$6","_tmpl$","_el$7","_el$9","_$effect","_$className","conversationDetails","iterationBadge","_c$","model","_c$2","provider","_c$3","completedAt","formatDuration","startedAt","usage","_el$1","_tmpl$2","_el$10","_el$11","_el$13","_el$14","_el$16","_el$17","promptTokens","toLocaleString","completionTokens","totalTokens","_p$","_v$","usageInfo","_v$2","usageLabel","_v$3","usageBold","e","t","a","length","_el$19","_tmpl$3","_el$20","_el$21","For","each","toolName","_el$28","_tmpl$7","toolBadge","_v$4","toolsRow","_v$5","toolsLabel","_v$6","toolsList","Object","keys","_el$22","_tmpl$4","_el$23","_el$24","entries","key","value","_el$29","_tmpl$8","_el$30","JSON","stringify","String","optionBadge","_v$7","optionsRow","_v$8","optionsLabel","_v$9","optionsCompact","_el$25","_tmpl$5","_el$26","_el$27","_el$32","_el$33","_v$0","_v$1","_v$10","_v$11","panelHeader","_v$12","headerContent","_v$13","headerRow","_v$14","headerLabel","_v$15","statusBadge","statusActive","statusCompleted","statusError","_v$16","metaInfo","o","i","n"],"mappings":";;;;;AAUO,MAAMA,qBACXC,CAAAA,UACG;AACH,QAAMC,SAASC,UAAAA;AACf,QAAMC,OAAOA,MAAMH,MAAMI;AAEzB,QAAMC,YAAYA,MAAMF,KAAAA,EAAOE,aAAa,CAAA;AAC5C,QAAMC,UAAUA,MAAMH,KAAAA,EAAOG;AAC7B,QAAMC,kBAAkBA,MAAMJ,KAAAA,EAAOI;AACrC,QAAMC,iBAAiBA,MAAML,KAAAA,EAAOK;AAEpC,UAAA,MAAA;AAAA,QAAAC,OAAAC,WAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAD,YAAAG,QAAAD,MAAAE,aAAAC,QAAAJ,MAAAG;AAAAE,WAAAJ,OAAA,MAKWX,KAAAA,EAAOgB,KAAK;AAAAD,WAAAH,OAAA,MAWZZ,KAAAA,EAAOiB,MAAM;AAAAF,WAAAL,OAAAQ,gBAEfC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEC,KAAA,MAAAhB,eAAAA,MAAqBiB,MAAS,EAAA,KAAIjB,mBAAoB;AAAA,MAAC;AAAA,MAAA,IAAAkB,WAAA;AAAA,YAAAC,QAAAC,UAAAC,QAAAF,MAAAf,YAAAkB,QAAAD,MAAAb;AAAAc,cAAAd;AAAAE,eAAAS,OAE3DnB,gBAAcsB,KAAA;AAAAC,eAAA,MAAAC,UAAAL,OADR1B,SAASgC,oBAAoBC,cAAc,CAAA;AAAA,eAAAP;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAT,WAAAD,QAAA,MAAA;AAAA,UAAAkB,MAAAX,KAAA,MAAA,CAAA,CAMxDrB,KAAAA,EAAOiC,KAAK;AAAA,aAAA,MAAZD,IAAAA,KAAgB,UAAUhC,KAAAA,EAAOiC,KAAK;AAAA,IAAE,GAAA,GAAA,IAAA;AAAAlB,WAAAD,QAAA,MAAA;AAAA,UAAAoB,OAAAb,KAAA,MAAA,CAAA,CACxCrB,KAAAA,EAAOmC,QAAQ;AAAA,aAAA,MAAfD,KAAAA,KAAmB,gBAAgBlC,KAAAA,EAAOmC,QAAQ;AAAA,IAAE,GAAA,GAAA,IAAA;AAAApB,WAAAD,QAAA,MAAA;AAAA,UAAAsB,OAAAf,KAAA,MAAA,CAAA,CACpDrB,KAAAA,EAAOqC,WAAW;AAAA,aAAA,MAAlBD,KAAAA,KACC,gBAAgBE,eAAetC,KAAAA,EAAOqC,cAAerC,OAAOuC,SAAS,CAAC;AAAA,IAAE,GAAA,GAAA,IAAA;AAAAxB,WAAAP,OAAAU,gBAE3EC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEpB,OAAOwC;AAAAA,MAAK;AAAA,MAAA,IAAAjB,WAAA;AAAA,YAAAkB,QAAAC,QAAAA,GAAAC,SAAAF,MAAAhC,YAAAmC,SAAAD,OAAA9B;AAAA+B,eAAAnC;AAAAA,YAAAoC,SAAAD,OAAA/B,aAAAiC,SAAAD,OAAAhC;AAAAiC,eAAArC;AAAAA,YAAAsC,SAAAD,OAAAjC,aAAAmC,SAAAD,OAAAlC;AAAAmC,eAAAvC;AAAAM,eAAA6B,QAAA,MAMT5C,OAAOwC,OAAOS,aAAaC,eAAAA,KAAoB,GAAC,IAAA;AAAAnC,eAAA+B,QAAA,MAI5C9C,OAAOwC,OAAOW,iBAAiBD,eAAAA,KAAoB,GAAC,IAAA;AAAAnC,eAAAiC,QAAA,MAIzDhD,OAAOwC,OAAOY,YAAYF,eAAAA,KAAoB,GAAC,IAAA;AAAAtB,eAAAyB,CAAAA,QAAA;AAAA,cAAAC,MAb/CxD,OAAAA,EAASgC,oBAAoByB,WAASC,OACnC1D,SAASgC,oBAAoB2B,YAAUC,OAWvC5D,OAAAA,EAASgC,oBAAoB6B;AAASL,kBAAAD,IAAAO,KAAA/B,UAAAY,OAAAY,IAAAO,IAAAN,GAAA;AAAAE,mBAAAH,IAAAQ,KAAAhC,UAAAc,QAAAU,IAAAQ,IAAAL,IAAA;AAAAE,mBAAAL,IAAAS,KAAAjC,UAAAmB,QAAAK,IAAAS,IAAAJ,IAAA;AAAA,iBAAAL;AAAAA,QAAA,GAAA;AAAA,UAAAO,GAAAtC;AAAAA,UAAAuC,GAAAvC;AAAAA,UAAAwC,GAAAxC;AAAAA,QAAAA,CAAA;AAAA,eAAAmB;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAA1B,WAAAP,OAAAU,gBAMtDC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAElB,UAAAA,EAAY6D,SAAS;AAAA,MAAC;AAAA,MAAA,IAAAxC,WAAA;AAAA,YAAAyC,SAAAC,QAAAA,GAAAC,SAAAF,OAAAvD,YAAA0D,SAAAD,OAAArD;AAAAE,eAAAoD,QAAAjD,gBAI3BkD,KAAG;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEnE,UAAAA;AAAAA,UAAW;AAAA,UAAAqB,UAClB+C,eAAQ,MAAA;AAAA,gBAAAC,SAAAC,QAAAA;AAAAzD,mBAAAwD,QAELD,QAAQ;AAAA1C,mBAAA,MAAAC,UAAA0C,QADEzE,SAASgC,oBAAoB2C,SAAS,CAAA;AAAA,mBAAAF;AAAAA,UAAA,GAAA;AAAA,QAAA,CAGpD,CAAA;AAAA3C,eAAAyB,CAAAA,QAAA;AAAA,cAAAqB,OARK5E,OAAAA,EAASgC,oBAAoB6C,UAAQC,OAClC9E,SAASgC,oBAAoB+C,YAAUC,OACxChF,OAAAA,EAASgC,oBAAoBiD;AAASL,mBAAArB,IAAAO,KAAA/B,UAAAmC,QAAAX,IAAAO,IAAAc,IAAA;AAAAE,mBAAAvB,IAAAQ,KAAAhC,UAAAqC,QAAAb,IAAAQ,IAAAe,IAAA;AAAAE,mBAAAzB,IAAAS,KAAAjC,UAAAsC,QAAAd,IAAAS,IAAAgB,IAAA;AAAA,iBAAAzB;AAAAA,QAAA,GAAA;AAAA,UAAAO,GAAAtC;AAAAA,UAAAuC,GAAAvC;AAAAA,UAAAwC,GAAAxC;AAAAA,QAAAA,CAAA;AAAA,eAAA0C;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAjD,WAAAP,OAAAU,gBAYrDC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEC,KAAA,MAAA,CAAA,CAAAlB,SAAS,EAAA,KAAI6E,OAAOC,KAAK9E,SAAU,EAAE4D,SAAS;AAAA,MAAC;AAAA,MAAA,IAAAxC,WAAA;AAAA,YAAA2D,SAAAC,QAAAA,GAAAC,SAAAF,OAAAzE,YAAA4E,SAAAD,OAAAvE;AAAAE,eAAAsE,QAAAnE,gBAMpDkD,KAAG;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEW,OAAOM,QAAQnF,SAAU;AAAA,UAAC;AAAA,UAAAoB,UAClCA,CAAC,CAACgE,KAAKC,KAAK,OAAC,MAAA;AAAA,gBAAAC,SAAAC,QAAAA,GAAAC,SAAAF,OAAAhF;AAAAM,mBAAA0E,QAETF,KAAGI,MAAA;AAAA5E,mBAAA0E,QAAA,MACH,OAAOD,UAAU,WACdI,KAAKC,UAAUL,KAAK,IACpBM,OAAON,KAAK,GAAC,IAAA;AAAA5D,mBAAA,MAAAC,UAAA4D,QAJN3F,SAASgC,oBAAoBiE,WAAW,CAAA;AAAA,mBAAAN;AAAAA,UAAA,GAAA;AAAA,QAAA,CAMtD,CAAA;AAAA7D,eAAAyB,CAAAA,QAAA;AAAA,cAAA2C,OAbKlG,OAAAA,EAASgC,oBAAoBmE,YAAUC,OACpCpG,SAASgC,oBAAoBqE,cAAYC,OAG1CtG,OAAAA,EAASgC,oBAAoBuE;AAAcL,mBAAA3C,IAAAO,KAAA/B,UAAAqD,QAAA7B,IAAAO,IAAAoC,IAAA;AAAAE,mBAAA7C,IAAAQ,KAAAhC,UAAAuD,QAAA/B,IAAAQ,IAAAqC,IAAA;AAAAE,mBAAA/C,IAAAS,KAAAjC,UAAAwD,QAAAhC,IAAAS,IAAAsC,IAAA;AAAA,iBAAA/C;AAAAA,QAAA,GAAA;AAAA,UAAAO,GAAAtC;AAAAA,UAAAuC,GAAAvC;AAAAA,UAAAwC,GAAAxC;AAAAA,QAAAA,CAAA;AAAA,eAAA4D;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAnE,WAAAP,OAAAU,gBAe1DC,MAAI;AAAA,MAAA,IACHC,OAAI;AAAA,eAAEC,KAAA,MAAA,CAAA,CAAAjB,iBAAiB,EAAA,KAAI4E,OAAOC,KAAK7E,iBAAkB,EAAE2D,SAAS;AAAA,MAAC;AAAA,MAAA,IAAAxC,WAAA;AAAA,YAAA+E,SAAAC,QAAAA,GAAAC,SAAAF,OAAA7F,YAAAgG,SAAAD,OAAA3F;AAAAE,eAAA0F,QAAAvF,gBAOhEkD,KAAG;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEW,OAAOM,QAAQlF,iBAAkB;AAAA,UAAC;AAAA,UAAAmB,UAC1CA,CAAC,CAACgE,KAAKC,KAAK,OAAC,MAAA;AAAA,gBAAAkB,SAAAhB,QAAAA,GAAAiB,SAAAD,OAAAjG;AAAAM,mBAAA2F,QAETnB,KAAGoB,MAAA;AAAA5F,mBAAA2F,QAAA,MACH,OAAOlB,UAAU,WACdI,KAAKC,UAAUL,KAAK,IACpBM,OAAON,KAAK,GAAC,IAAA;AAAA5D,mBAAA,MAAAC,UAAA6E,QAJN5G,SAASgC,oBAAoBiE,WAAW,CAAA;AAAA,mBAAAW;AAAAA,UAAA,GAAA;AAAA,QAAA,CAMtD,CAAA;AAAA9E,eAAAyB,CAAAA,QAAA;AAAA,cAAAuD,OAbK9G,OAAAA,EAASgC,oBAAoBmE,YAAUY,OACpC/G,SAASgC,oBAAoBqE,cAAYW,QAG1ChH,OAAAA,EAASgC,oBAAoBuE;AAAcO,mBAAAvD,IAAAO,KAAA/B,UAAAyE,QAAAjD,IAAAO,IAAAgD,IAAA;AAAAC,mBAAAxD,IAAAQ,KAAAhC,UAAA2E,QAAAnD,IAAAQ,IAAAgD,IAAA;AAAAC,oBAAAzD,IAAAS,KAAAjC,UAAA4E,QAAApD,IAAAS,IAAAgD,KAAA;AAAA,iBAAAzD;AAAAA,QAAA,GAAA;AAAA,UAAAO,GAAAtC;AAAAA,UAAAuC,GAAAvC;AAAAA,UAAAwC,GAAAxC;AAAAA,QAAAA,CAAA;AAAA,eAAAgF;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAA1E,WAAAyB,CAAAA,QAAA;AAAA,UAAA0D,QA1FnDjH,SAASkH,aAAWC,QAClBnH,OAAAA,EAASgC,oBAAoBoF,eAAaC,QACxCrH,OAAAA,EAASgC,oBAAoBsF,WAASC,QACpCvH,OAAAA,EAASgC,oBAAoBwF,aAAWC,QAI3C,GAAGzH,SAASgC,oBAAoB0F,WAAW,IAChDxH,OAAOiB,WAAW,WACdnB,OAAAA,EAASgC,oBAAoB2F,eAC7BzH,KAAAA,EAAOiB,WAAW,cAChBnB,SAASgC,oBAAoB4F,kBAC7B5H,OAAAA,EAASgC,oBAAoB6F,WAAW,IAC9CC,QAUM9H,SAASgC,oBAAoB+F;AAAQd,gBAAA1D,IAAAO,KAAA/B,UAAAvB,MAAA+C,IAAAO,IAAAmD,KAAA;AAAAE,gBAAA5D,IAAAQ,KAAAhC,UAAArB,OAAA6C,IAAAQ,IAAAoD,KAAA;AAAAE,gBAAA9D,IAAAS,KAAAjC,UAAAnB,OAAA2C,IAAAS,IAAAqD,KAAA;AAAAE,gBAAAhE,IAAAyE,KAAAjG,UAAAlB,OAAA0C,IAAAyE,IAAAT,KAAA;AAAAE,gBAAAlE,IAAA0E,KAAAlG,UAAAjB,OAAAyC,IAAA0E,IAAAR,KAAA;AAAAK,gBAAAvE,IAAA2E,KAAAnG,UAAAf,OAAAuC,IAAA2E,IAAAJ,KAAA;AAAA,aAAAvE;AAAAA,IAAA,GAAA;AAAA,MAAAO,GAAAtC;AAAAA,MAAAuC,GAAAvC;AAAAA,MAAAwC,GAAAxC;AAAAA,MAAAwG,GAAAxG;AAAAA,MAAAyG,GAAAzG;AAAAA,MAAA0G,GAAA1G;AAAAA,IAAAA,CAAA;AAAA,WAAAhB;AAAAA,EAAA,GAAA;AAoFzD;"}
1
+ {"version":3,"file":"ConversationHeader.js","sources":["../../../../src/components/conversation/ConversationHeader.tsx"],"sourcesContent":["import { For, Show } from 'solid-js'\nimport { JsonTree } from '@tanstack/devtools-ui'\nimport { useStyles } from '../../styles/use-styles'\nimport { formatDuration } from '../utils'\nimport type { Component } from 'solid-js'\nimport type { Conversation } from '../../store/ai-context'\n\ninterface ConversationHeaderProps {\n conversation: Conversation\n}\n\nexport const ConversationHeader: Component<ConversationHeaderProps> = (\n props,\n) => {\n const styles = useStyles()\n const conv = () => props.conversation\n\n const toolNames = () => conv().toolNames ?? []\n const options = () => conv().options\n const modelOptions = () => conv().modelOptions\n const iterationCount = () => conv().iterationCount\n const systemPrompts = () => conv().systemPrompts ?? []\n\n return (\n <div class={styles().panelHeader}>\n <div class={styles().conversationDetails.headerContent}>\n <div class={styles().conversationDetails.headerRow}>\n <div class={styles().conversationDetails.headerLabel}>\n {conv().label}\n </div>\n <div\n class={`${styles().conversationDetails.statusBadge} ${\n conv().status === 'active'\n ? styles().conversationDetails.statusActive\n : conv().status === 'completed'\n ? styles().conversationDetails.statusCompleted\n : styles().conversationDetails.statusError\n }`}\n >\n {conv().status}\n </div>\n <Show when={iterationCount() !== undefined && iterationCount()! > 1}>\n <div class={styles().conversationDetails.iterationBadge}>\n ๐Ÿ”„ {iterationCount()} iterations\n </div>\n </Show>\n </div>\n <div class={styles().conversationDetails.metaInfo}>\n {conv().model && `Model: ${conv().model}`}\n {conv().provider && ` โ€ข Provider: ${conv().provider}`}\n {conv().completedAt &&\n ` โ€ข Duration: ${formatDuration(conv().completedAt! - conv().startedAt)}`}\n </div>\n {/* Tools list - always visible */}\n <Show when={toolNames().length > 0}>\n <div class={styles().conversationDetails.toolsRow}>\n <span class={styles().conversationDetails.toolsLabel}>๐Ÿ”ง</span>\n <div class={styles().conversationDetails.toolsList}>\n <For each={toolNames()}>\n {(toolName) => (\n <span class={styles().conversationDetails.toolBadge}>\n {toolName}\n </span>\n )}\n </For>\n </div>\n </div>\n </Show>\n {/* Options - always visible in compact form */}\n <Show when={options() && Object.keys(options()!).length > 0}>\n <div class={styles().conversationDetails.optionsRow}>\n <span class={styles().conversationDetails.optionsLabel}>\n โš™๏ธ Options:\n </span>\n <div class={styles().conversationDetails.optionsCompact}>\n <For each={Object.entries(options()!)}>\n {([key, value]) => (\n <span class={styles().conversationDetails.optionBadge}>\n {key}:{' '}\n {typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)}\n </span>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={conv().usage}>\n <div class={styles().conversationDetails.usageInfo}>\n <span class={styles().conversationDetails.usageLabel}>\n ๐ŸŽฏ Tokens:\n </span>\n <span>\n Prompt: {conv().usage?.promptTokens.toLocaleString() || 0}\n </span>\n <span>โ€ข</span>\n <span>\n Completion: {conv().usage?.completionTokens.toLocaleString() || 0}\n </span>\n <span>โ€ข</span>\n <span class={styles().conversationDetails.usageBold}>\n Total: {conv().usage?.totalTokens.toLocaleString() || 0}\n </span>\n </div>\n </Show>\n {/* Model options - collapsible */}\n <Show when={modelOptions() && Object.keys(modelOptions()!).length > 0}>\n <details class={styles().conversationDetails.collapsibleSection}>\n <summary class={styles().conversationDetails.collapsibleSummary}>\n ๐Ÿงช Model options\n </summary>\n <div class={styles().conversationDetails.collapsibleContent}>\n <JsonTree\n value={modelOptions() as Record<string, unknown>}\n defaultExpansionDepth={2}\n />\n </div>\n </details>\n </Show>\n {/* System prompts - collapsible */}\n <Show when={systemPrompts().length > 0}>\n <details class={styles().conversationDetails.collapsibleSection}>\n <summary class={styles().conversationDetails.collapsibleSummary}>\n ๐Ÿงฉ System prompts ({systemPrompts().length})\n </summary>\n <div class={styles().conversationDetails.collapsibleContent}>\n <For each={systemPrompts()}>\n {(prompt, index) => (\n <div class={styles().conversationDetails.systemPromptItem}>\n <div class={styles().conversationDetails.systemPromptIndex}>\n #{index() + 1}\n </div>\n <div class={styles().conversationDetails.systemPromptText}>\n {prompt}\n </div>\n </div>\n )}\n </For>\n </div>\n </details>\n </Show>\n </div>\n </div>\n )\n}\n"],"names":["ConversationHeader","props","styles","useStyles","conv","conversation","toolNames","options","modelOptions","iterationCount","systemPrompts","_el$","_tmpl$7","_el$2","firstChild","_el$3","_el$4","_el$5","nextSibling","_el$0","_$insert","label","status","_$createComponent","Show","when","_$memo","undefined","children","_el$6","_tmpl$","_el$7","_el$9","_$effect","_$className","conversationDetails","iterationBadge","_c$","model","_c$2","provider","_c$3","completedAt","formatDuration","startedAt","length","_el$1","_tmpl$2","_el$10","_el$11","For","each","toolName","_el$34","_tmpl$8","toolBadge","_p$","_v$","toolsRow","_v$2","toolsLabel","_v$3","toolsList","e","t","a","Object","keys","_el$12","_tmpl$3","_el$13","_el$14","entries","key","value","_el$35","_tmpl$9","_el$36","JSON","stringify","String","optionBadge","_v$4","optionsRow","_v$5","optionsLabel","_v$6","optionsCompact","usage","_el$15","_tmpl$4","_el$16","_el$17","_el$19","_el$20","_el$22","_el$23","promptTokens","toLocaleString","completionTokens","totalTokens","_v$7","usageInfo","_v$8","usageLabel","_v$9","usageBold","_el$25","_tmpl$5","_el$26","_el$27","JsonTree","defaultExpansionDepth","_v$0","collapsibleSection","_v$1","collapsibleSummary","_v$10","collapsibleContent","_el$28","_tmpl$6","_el$29","_el$30","_el$32","_el$33","prompt","index","_el$38","_tmpl$0","_el$39","_el$41","_v$20","systemPromptItem","_v$21","systemPromptIndex","_v$22","systemPromptText","_v$11","_v$12","_v$13","_v$14","panelHeader","_v$15","headerContent","_v$16","headerRow","_v$17","headerLabel","_v$18","statusBadge","statusActive","statusCompleted","statusError","_v$19","metaInfo","o","i","n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Component } from 'solid-js';
2
2
  import { Conversation } from '../../store/ai-context.js';
3
- export type TabType = 'messages' | 'chunks' | 'summaries';
3
+ export type TabType = 'messages' | 'chunks' | 'summaries' | 'image' | 'speech' | 'transcription' | 'video';
4
4
  interface ConversationTabsProps {
5
5
  conversation: Conversation;
6
6
  activeTab: TabType;