@tanstack/ai-devtools-core 0.0.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/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/esm/components/ConversationDetails.d.ts +2 -0
- package/dist/esm/components/ConversationDetails.js +134 -0
- package/dist/esm/components/ConversationDetails.js.map +1 -0
- package/dist/esm/components/ConversationsList.d.ts +2 -0
- package/dist/esm/components/ConversationsList.js +30 -0
- package/dist/esm/components/ConversationsList.js.map +1 -0
- package/dist/esm/components/Shell.d.ts +1 -0
- package/dist/esm/components/Shell.js +94 -0
- package/dist/esm/components/Shell.js.map +1 -0
- package/dist/esm/components/conversation/ChunkBadges.d.ts +7 -0
- package/dist/esm/components/conversation/ChunkBadges.js +54 -0
- package/dist/esm/components/conversation/ChunkBadges.js.map +1 -0
- package/dist/esm/components/conversation/ChunkItem.d.ts +9 -0
- package/dist/esm/components/conversation/ChunkItem.js +247 -0
- package/dist/esm/components/conversation/ChunkItem.js.map +1 -0
- package/dist/esm/components/conversation/ChunksCollapsible.d.ts +7 -0
- package/dist/esm/components/conversation/ChunksCollapsible.js +77 -0
- package/dist/esm/components/conversation/ChunksCollapsible.js.map +1 -0
- package/dist/esm/components/conversation/ChunksTab.d.ts +8 -0
- package/dist/esm/components/conversation/ChunksTab.js +87 -0
- package/dist/esm/components/conversation/ChunksTab.js.map +1 -0
- package/dist/esm/components/conversation/ConversationHeader.d.ts +7 -0
- package/dist/esm/components/conversation/ConversationHeader.js +187 -0
- package/dist/esm/components/conversation/ConversationHeader.js.map +1 -0
- package/dist/esm/components/conversation/ConversationTabs.d.ts +10 -0
- package/dist/esm/components/conversation/ConversationTabs.js +88 -0
- package/dist/esm/components/conversation/ConversationTabs.js.map +1 -0
- package/dist/esm/components/conversation/EmbeddingsTab.d.ts +7 -0
- package/dist/esm/components/conversation/EmbeddingsTab.js +90 -0
- package/dist/esm/components/conversation/EmbeddingsTab.js.map +1 -0
- package/dist/esm/components/conversation/MessageCard.d.ts +7 -0
- package/dist/esm/components/conversation/MessageCard.js +152 -0
- package/dist/esm/components/conversation/MessageCard.js.map +1 -0
- package/dist/esm/components/conversation/MessageGroup.d.ts +15 -0
- package/dist/esm/components/conversation/MessageGroup.js +119 -0
- package/dist/esm/components/conversation/MessageGroup.js.map +1 -0
- package/dist/esm/components/conversation/MessagesTab.d.ts +7 -0
- package/dist/esm/components/conversation/MessagesTab.js +37 -0
- package/dist/esm/components/conversation/MessagesTab.js.map +1 -0
- package/dist/esm/components/conversation/SummariesTab.d.ts +7 -0
- package/dist/esm/components/conversation/SummariesTab.js +110 -0
- package/dist/esm/components/conversation/SummariesTab.js.map +1 -0
- package/dist/esm/components/conversation/ToolCallDisplay.d.ts +7 -0
- package/dist/esm/components/conversation/ToolCallDisplay.js +123 -0
- package/dist/esm/components/conversation/ToolCallDisplay.js.map +1 -0
- package/dist/esm/components/conversation/index.d.ts +7 -0
- package/dist/esm/components/list/ConversationRow.d.ts +7 -0
- package/dist/esm/components/list/ConversationRow.js +122 -0
- package/dist/esm/components/list/ConversationRow.js.map +1 -0
- package/dist/esm/components/list/index.d.ts +1 -0
- package/dist/esm/components/utils/format.d.ts +6 -0
- package/dist/esm/components/utils/format.js +68 -0
- package/dist/esm/components/utils/format.js.map +1 -0
- package/dist/esm/components/utils/index.d.ts +1 -0
- package/dist/esm/core.d.ts +18 -0
- package/dist/esm/core.js +9 -0
- package/dist/esm/core.js.map +1 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/production.d.ts +2 -0
- package/dist/esm/production.js +5 -0
- package/dist/esm/production.js.map +1 -0
- package/dist/esm/store/ai-context.d.ts +126 -0
- package/dist/esm/store/ai-context.js +1081 -0
- package/dist/esm/store/ai-context.js.map +1 -0
- package/dist/esm/store/ai-store.d.ts +1 -0
- package/dist/esm/styles/tokens.d.ts +298 -0
- package/dist/esm/styles/tokens.js +107 -0
- package/dist/esm/styles/tokens.js.map +1 -0
- package/dist/esm/styles/use-styles.d.ts +226 -0
- package/dist/esm/styles/use-styles.js +1538 -0
- package/dist/esm/styles/use-styles.js.map +1 -0
- package/package.json +61 -0
- package/src/components/ConversationDetails.tsx +89 -0
- package/src/components/ConversationsList.tsx +21 -0
- package/src/components/Shell.tsx +93 -0
- package/src/components/conversation/ChunkBadges.tsx +51 -0
- package/src/components/conversation/ChunkItem.tsx +273 -0
- package/src/components/conversation/ChunksCollapsible.tsx +58 -0
- package/src/components/conversation/ChunksTab.tsx +85 -0
- package/src/components/conversation/ConversationHeader.tsx +130 -0
- package/src/components/conversation/ConversationTabs.tsx +104 -0
- package/src/components/conversation/EmbeddingsTab.tsx +80 -0
- package/src/components/conversation/MessageCard.tsx +137 -0
- package/src/components/conversation/MessageGroup.tsx +101 -0
- package/src/components/conversation/MessagesTab.tsx +30 -0
- package/src/components/conversation/SummariesTab.tsx +91 -0
- package/src/components/conversation/ToolCallDisplay.tsx +99 -0
- package/src/components/conversation/index.ts +8 -0
- package/src/components/list/ConversationRow.tsx +85 -0
- package/src/components/list/index.ts +1 -0
- package/src/components/utils/format.ts +61 -0
- package/src/components/utils/index.ts +1 -0
- package/src/core.tsx +10 -0
- package/src/index.ts +8 -0
- package/src/production.ts +3 -0
- package/src/store/ai-context.tsx +1784 -0
- package/src/store/ai-store.ts +2 -0
- package/src/styles/tokens.ts +305 -0
- package/src/styles/use-styles.ts +1537 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { template, insert, createComponent, effect, className, memo } from "solid-js/web";
|
|
2
|
+
import { Show, For } from "solid-js";
|
|
3
|
+
import { useStyles } from "../../styles/use-styles.js";
|
|
4
|
+
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
|
+
const ConversationHeader = (props) => {
|
|
7
|
+
const styles = useStyles();
|
|
8
|
+
const conv = () => props.conversation;
|
|
9
|
+
const toolNames = () => conv().toolNames ?? [];
|
|
10
|
+
const options = () => conv().options;
|
|
11
|
+
const providerOptions = () => conv().providerOptions;
|
|
12
|
+
const iterationCount = () => conv().iterationCount;
|
|
13
|
+
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;
|
|
15
|
+
insert(_el$4, () => conv().label);
|
|
16
|
+
insert(_el$5, () => conv().status);
|
|
17
|
+
insert(_el$3, createComponent(Show, {
|
|
18
|
+
get when() {
|
|
19
|
+
return memo(() => iterationCount() !== void 0)() && iterationCount() > 1;
|
|
20
|
+
},
|
|
21
|
+
get children() {
|
|
22
|
+
var _el$6 = _tmpl$(), _el$7 = _el$6.firstChild, _el$9 = _el$7.nextSibling;
|
|
23
|
+
_el$9.nextSibling;
|
|
24
|
+
insert(_el$6, iterationCount, _el$9);
|
|
25
|
+
effect(() => className(_el$6, styles().conversationDetails.iterationBadge));
|
|
26
|
+
return _el$6;
|
|
27
|
+
}
|
|
28
|
+
}), null);
|
|
29
|
+
insert(_el$0, (() => {
|
|
30
|
+
var _c$ = memo(() => !!conv().model);
|
|
31
|
+
return () => _c$() && `Model: ${conv().model}`;
|
|
32
|
+
})(), null);
|
|
33
|
+
insert(_el$0, (() => {
|
|
34
|
+
var _c$2 = memo(() => !!conv().provider);
|
|
35
|
+
return () => _c$2() && ` • Provider: ${conv().provider}`;
|
|
36
|
+
})(), null);
|
|
37
|
+
insert(_el$0, (() => {
|
|
38
|
+
var _c$3 = memo(() => !!conv().completedAt);
|
|
39
|
+
return () => _c$3() && ` • Duration: ${formatDuration(conv().completedAt - conv().startedAt)}`;
|
|
40
|
+
})(), null);
|
|
41
|
+
insert(_el$2, createComponent(Show, {
|
|
42
|
+
get when() {
|
|
43
|
+
return conv().usage;
|
|
44
|
+
},
|
|
45
|
+
get children() {
|
|
46
|
+
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);
|
|
55
|
+
effect((_p$) => {
|
|
56
|
+
var _v$ = styles().conversationDetails.usageInfo, _v$2 = styles().conversationDetails.usageLabel, _v$3 = styles().conversationDetails.usageBold;
|
|
57
|
+
_v$ !== _p$.e && className(_el$1, _p$.e = _v$);
|
|
58
|
+
_v$2 !== _p$.t && className(_el$10, _p$.t = _v$2);
|
|
59
|
+
_v$3 !== _p$.a && className(_el$17, _p$.a = _v$3);
|
|
60
|
+
return _p$;
|
|
61
|
+
}, {
|
|
62
|
+
e: void 0,
|
|
63
|
+
t: void 0,
|
|
64
|
+
a: void 0
|
|
65
|
+
});
|
|
66
|
+
return _el$1;
|
|
67
|
+
}
|
|
68
|
+
}), null);
|
|
69
|
+
insert(_el$2, createComponent(Show, {
|
|
70
|
+
get when() {
|
|
71
|
+
return toolNames().length > 0;
|
|
72
|
+
},
|
|
73
|
+
get children() {
|
|
74
|
+
var _el$19 = _tmpl$3(), _el$20 = _el$19.firstChild, _el$21 = _el$20.nextSibling;
|
|
75
|
+
insert(_el$21, createComponent(For, {
|
|
76
|
+
get each() {
|
|
77
|
+
return toolNames();
|
|
78
|
+
},
|
|
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
|
+
})()
|
|
85
|
+
}));
|
|
86
|
+
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);
|
|
91
|
+
return _p$;
|
|
92
|
+
}, {
|
|
93
|
+
e: void 0,
|
|
94
|
+
t: void 0,
|
|
95
|
+
a: void 0
|
|
96
|
+
});
|
|
97
|
+
return _el$19;
|
|
98
|
+
}
|
|
99
|
+
}), null);
|
|
100
|
+
insert(_el$2, createComponent(Show, {
|
|
101
|
+
get when() {
|
|
102
|
+
return memo(() => !!options())() && Object.keys(options()).length > 0;
|
|
103
|
+
},
|
|
104
|
+
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
|
+
}));
|
|
118
|
+
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);
|
|
123
|
+
return _p$;
|
|
124
|
+
}, {
|
|
125
|
+
e: void 0,
|
|
126
|
+
t: void 0,
|
|
127
|
+
a: void 0
|
|
128
|
+
});
|
|
129
|
+
return _el$22;
|
|
130
|
+
}
|
|
131
|
+
}), null);
|
|
132
|
+
insert(_el$2, createComponent(Show, {
|
|
133
|
+
get when() {
|
|
134
|
+
return memo(() => !!providerOptions())() && Object.keys(providerOptions()).length > 0;
|
|
135
|
+
},
|
|
136
|
+
get children() {
|
|
137
|
+
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());
|
|
141
|
+
},
|
|
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
|
+
})()
|
|
149
|
+
}));
|
|
150
|
+
effect((_p$) => {
|
|
151
|
+
var _v$0 = styles().conversationDetails.optionsRow, _v$1 = styles().conversationDetails.optionsLabel, _v$10 = styles().conversationDetails.optionsCompact;
|
|
152
|
+
_v$0 !== _p$.e && className(_el$25, _p$.e = _v$0);
|
|
153
|
+
_v$1 !== _p$.t && className(_el$26, _p$.t = _v$1);
|
|
154
|
+
_v$10 !== _p$.a && className(_el$27, _p$.a = _v$10);
|
|
155
|
+
return _p$;
|
|
156
|
+
}, {
|
|
157
|
+
e: void 0,
|
|
158
|
+
t: void 0,
|
|
159
|
+
a: void 0
|
|
160
|
+
});
|
|
161
|
+
return _el$25;
|
|
162
|
+
}
|
|
163
|
+
}), null);
|
|
164
|
+
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);
|
|
172
|
+
return _p$;
|
|
173
|
+
}, {
|
|
174
|
+
e: void 0,
|
|
175
|
+
t: void 0,
|
|
176
|
+
a: void 0,
|
|
177
|
+
o: void 0,
|
|
178
|
+
i: void 0,
|
|
179
|
+
n: void 0
|
|
180
|
+
});
|
|
181
|
+
return _el$;
|
|
182
|
+
})();
|
|
183
|
+
};
|
|
184
|
+
export {
|
|
185
|
+
ConversationHeader
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=ConversationHeader.js.map
|
|
@@ -0,0 +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":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Component } from 'solid-js';
|
|
2
|
+
import { Conversation } from '../../store/ai-context.js';
|
|
3
|
+
export type TabType = 'messages' | 'chunks' | 'embeddings' | 'summaries';
|
|
4
|
+
interface ConversationTabsProps {
|
|
5
|
+
conversation: Conversation;
|
|
6
|
+
activeTab: TabType;
|
|
7
|
+
onTabChange: (tab: TabType) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare const ConversationTabs: Component<ConversationTabsProps>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { template, insert, createComponent, effect, className, memo, delegateEvents } from "solid-js/web";
|
|
2
|
+
import { Show } from "solid-js";
|
|
3
|
+
import { useStyles } from "../../styles/use-styles.js";
|
|
4
|
+
var _tmpl$ = /* @__PURE__ */ template(`<button>💬 Messages (<!>)`), _tmpl$2 = /* @__PURE__ */ template(`<button>📦 Chunks (<!>)`), _tmpl$3 = /* @__PURE__ */ template(`<button>🔢 Embeddings (<!>)`), _tmpl$4 = /* @__PURE__ */ template(`<button>📝 Summaries (<!>)`), _tmpl$5 = /* @__PURE__ */ template(`<div>`);
|
|
5
|
+
const ConversationTabs = (props) => {
|
|
6
|
+
const styles = useStyles();
|
|
7
|
+
const conv = () => props.conversation;
|
|
8
|
+
const totalRawChunks = () => conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0);
|
|
9
|
+
const embeddingsCount = () => conv().embeddings?.length ?? 0;
|
|
10
|
+
const summariesCount = () => conv().summaries?.length ?? 0;
|
|
11
|
+
const hasMessages = () => conv().type === "client" && conv().messages.length > 0;
|
|
12
|
+
const hasChunks = () => conv().chunks.length > 0 || conv().type === "server";
|
|
13
|
+
const hasEmbeddings = () => conv().hasEmbedding || embeddingsCount() > 0;
|
|
14
|
+
const hasSummaries = () => conv().hasSummarize || summariesCount() > 0;
|
|
15
|
+
const visibleTabCount = () => {
|
|
16
|
+
let count = 0;
|
|
17
|
+
if (hasMessages()) count++;
|
|
18
|
+
if (hasChunks() && conv().type === "server") count++;
|
|
19
|
+
if (hasEmbeddings()) count++;
|
|
20
|
+
if (hasSummaries()) count++;
|
|
21
|
+
return count;
|
|
22
|
+
};
|
|
23
|
+
if (visibleTabCount() <= 1) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return (() => {
|
|
27
|
+
var _el$ = _tmpl$5();
|
|
28
|
+
insert(_el$, createComponent(Show, {
|
|
29
|
+
get when() {
|
|
30
|
+
return hasMessages();
|
|
31
|
+
},
|
|
32
|
+
get children() {
|
|
33
|
+
var _el$2 = _tmpl$(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling;
|
|
34
|
+
_el$5.nextSibling;
|
|
35
|
+
_el$2.$$click = () => props.onTabChange("messages");
|
|
36
|
+
insert(_el$2, () => conv().messages.length, _el$5);
|
|
37
|
+
effect(() => className(_el$2, `${styles().actionButton} ${props.activeTab === "messages" ? styles().conversationDetails.tabButtonActive : ""}`));
|
|
38
|
+
return _el$2;
|
|
39
|
+
}
|
|
40
|
+
}), null);
|
|
41
|
+
insert(_el$, createComponent(Show, {
|
|
42
|
+
get when() {
|
|
43
|
+
return memo(() => !!hasChunks())() && conv().type === "server";
|
|
44
|
+
},
|
|
45
|
+
get children() {
|
|
46
|
+
var _el$6 = _tmpl$2(), _el$7 = _el$6.firstChild, _el$9 = _el$7.nextSibling;
|
|
47
|
+
_el$9.nextSibling;
|
|
48
|
+
_el$6.$$click = () => props.onTabChange("chunks");
|
|
49
|
+
insert(_el$6, totalRawChunks, _el$9);
|
|
50
|
+
effect(() => className(_el$6, `${styles().actionButton} ${props.activeTab === "chunks" ? styles().conversationDetails.tabButtonActive : ""}`));
|
|
51
|
+
return _el$6;
|
|
52
|
+
}
|
|
53
|
+
}), null);
|
|
54
|
+
insert(_el$, createComponent(Show, {
|
|
55
|
+
get when() {
|
|
56
|
+
return hasEmbeddings();
|
|
57
|
+
},
|
|
58
|
+
get children() {
|
|
59
|
+
var _el$0 = _tmpl$3(), _el$1 = _el$0.firstChild, _el$11 = _el$1.nextSibling;
|
|
60
|
+
_el$11.nextSibling;
|
|
61
|
+
_el$0.$$click = () => props.onTabChange("embeddings");
|
|
62
|
+
insert(_el$0, embeddingsCount, _el$11);
|
|
63
|
+
effect(() => className(_el$0, `${styles().actionButton} ${props.activeTab === "embeddings" ? styles().conversationDetails.tabButtonActive : ""}`));
|
|
64
|
+
return _el$0;
|
|
65
|
+
}
|
|
66
|
+
}), null);
|
|
67
|
+
insert(_el$, createComponent(Show, {
|
|
68
|
+
get when() {
|
|
69
|
+
return hasSummaries();
|
|
70
|
+
},
|
|
71
|
+
get children() {
|
|
72
|
+
var _el$12 = _tmpl$4(), _el$13 = _el$12.firstChild, _el$15 = _el$13.nextSibling;
|
|
73
|
+
_el$15.nextSibling;
|
|
74
|
+
_el$12.$$click = () => props.onTabChange("summaries");
|
|
75
|
+
insert(_el$12, summariesCount, _el$15);
|
|
76
|
+
effect(() => className(_el$12, `${styles().actionButton} ${props.activeTab === "summaries" ? styles().conversationDetails.tabButtonActive : ""}`));
|
|
77
|
+
return _el$12;
|
|
78
|
+
}
|
|
79
|
+
}), null);
|
|
80
|
+
effect(() => className(_el$, styles().conversationDetails.tabsContainer));
|
|
81
|
+
return _el$;
|
|
82
|
+
})();
|
|
83
|
+
};
|
|
84
|
+
delegateEvents(["click"]);
|
|
85
|
+
export {
|
|
86
|
+
ConversationTabs
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=ConversationTabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationTabs.js","sources":["../../../../src/components/conversation/ConversationTabs.tsx"],"sourcesContent":["import { Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport type { Component } from 'solid-js'\nimport type { Conversation } from '../../store/ai-context'\n\nexport type TabType = 'messages' | 'chunks' | 'embeddings' | 'summaries'\n\ninterface ConversationTabsProps {\n conversation: Conversation\n activeTab: TabType\n onTabChange: (tab: TabType) => void\n}\n\nexport const ConversationTabs: Component<ConversationTabsProps> = (props) => {\n const styles = useStyles()\n const conv = () => props.conversation\n\n // Total raw chunks = sum of all chunkCounts\n const totalRawChunks = () =>\n conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0)\n\n const embeddingsCount = () => conv().embeddings?.length ?? 0\n const summariesCount = () => conv().summaries?.length ?? 0\n\n // Determine if we should show any chat-related tabs\n // For server conversations, don't show messages tab - only chunks\n const hasMessages = () =>\n conv().type === 'client' && conv().messages.length > 0\n const hasChunks = () => conv().chunks.length > 0 || conv().type === 'server'\n const hasEmbeddings = () => conv().hasEmbedding || embeddingsCount() > 0\n const hasSummaries = () => conv().hasSummarize || summariesCount() > 0\n\n // Count how many tabs would be visible\n const visibleTabCount = () => {\n let count = 0\n if (hasMessages()) count++\n if (hasChunks() && conv().type === 'server') count++\n if (hasEmbeddings()) count++\n if (hasSummaries()) count++\n return count\n }\n\n // Don't render tabs if only one tab would be visible\n if (visibleTabCount() <= 1) {\n return null\n }\n\n return (\n <div class={styles().conversationDetails.tabsContainer}>\n {/* Show messages tab for client conversations or when there are messages */}\n <Show when={hasMessages()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'messages'\n ? styles().conversationDetails.tabButtonActive\n : ''\n }`}\n onClick={() => props.onTabChange('messages')}\n >\n 💬 Messages ({conv().messages.length})\n </button>\n </Show>\n {/* Show chunks tab for server conversations or when there are chunks */}\n <Show when={hasChunks() && conv().type === 'server'}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'chunks'\n ? styles().conversationDetails.tabButtonActive\n : ''\n }`}\n onClick={() => props.onTabChange('chunks')}\n >\n 📦 Chunks ({totalRawChunks()})\n </button>\n </Show>\n {/* Show embeddings tab if there are embedding operations */}\n <Show when={hasEmbeddings()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'embeddings'\n ? styles().conversationDetails.tabButtonActive\n : ''\n }`}\n onClick={() => props.onTabChange('embeddings')}\n >\n 🔢 Embeddings ({embeddingsCount()})\n </button>\n </Show>\n {/* Show summaries tab if there are summarize operations */}\n <Show when={hasSummaries()}>\n <button\n class={`${styles().actionButton} ${\n props.activeTab === 'summaries'\n ? styles().conversationDetails.tabButtonActive\n : ''\n }`}\n onClick={() => props.onTabChange('summaries')}\n >\n 📝 Summaries ({summariesCount()})\n </button>\n </Show>\n </div>\n )\n}\n"],"names":["ConversationTabs","props","styles","useStyles","conv","conversation","totalRawChunks","chunks","reduce","sum","c","chunkCount","embeddingsCount","embeddings","length","summariesCount","summaries","hasMessages","type","messages","hasChunks","hasEmbeddings","hasEmbedding","hasSummaries","hasSummarize","visibleTabCount","count","_el$","_tmpl$5","_$insert","_$createComponent","Show","when","children","_el$2","_tmpl$","_el$3","firstChild","_el$5","nextSibling","$$click","onTabChange","_$effect","_$className","actionButton","activeTab","conversationDetails","tabButtonActive","_$memo","_el$6","_tmpl$2","_el$7","_el$9","_el$0","_tmpl$3","_el$1","_el$11","_el$12","_tmpl$4","_el$13","_el$15","tabsContainer","_$delegateEvents"],"mappings":";;;;AAaO,MAAMA,mBAAsDC,CAAAA,UAAU;AAC3E,QAAMC,SAASC,UAAAA;AACf,QAAMC,OAAOA,MAAMH,MAAMI;AAGzB,QAAMC,iBAAiBA,MACrBF,KAAAA,EAAOG,OAAOC,OAAO,CAACC,KAAKC,MAAMD,OAAOC,EAAEC,cAAc,IAAI,CAAC;AAE/D,QAAMC,kBAAkBA,MAAMR,KAAAA,EAAOS,YAAYC,UAAU;AAC3D,QAAMC,iBAAiBA,MAAMX,KAAAA,EAAOY,WAAWF,UAAU;AAIzD,QAAMG,cAAcA,MAClBb,KAAAA,EAAOc,SAAS,YAAYd,KAAAA,EAAOe,SAASL,SAAS;AACvD,QAAMM,YAAYA,MAAMhB,KAAAA,EAAOG,OAAOO,SAAS,KAAKV,OAAOc,SAAS;AACpE,QAAMG,gBAAgBA,MAAMjB,KAAAA,EAAOkB,gBAAgBV,oBAAoB;AACvE,QAAMW,eAAeA,MAAMnB,KAAAA,EAAOoB,gBAAgBT,mBAAmB;AAGrE,QAAMU,kBAAkBA,MAAM;AAC5B,QAAIC,QAAQ;AACZ,QAAIT,cAAeS;AACnB,QAAIN,UAAAA,KAAehB,KAAAA,EAAOc,SAAS,SAAUQ;AAC7C,QAAIL,gBAAiBK;AACrB,QAAIH,eAAgBG;AACpB,WAAOA;AAAAA,EACT;AAGA,MAAID,gBAAAA,KAAqB,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,UAAA,MAAA;AAAA,QAAAE,OAAAC,QAAAA;AAAAC,WAAAF,MAAAG,gBAGKC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEf,YAAAA;AAAAA,MAAa;AAAA,MAAA,IAAAgB,WAAA;AAAA,YAAAC,QAAAC,UAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAG;AAAAD,cAAAC;AAAAL,cAAAM,UAOZ,MAAMvC,MAAMwC,YAAY,UAAU;AAACZ,eAAAK,OAAA,MAE9B9B,KAAAA,EAAOe,SAASL,QAAMwB,KAAA;AAAAI,eAAA,MAAAC,UAAAT,OAP7B,GAAGhC,OAAAA,EAAS0C,YAAY,IAC7B3C,MAAM4C,cAAc,aAChB3C,OAAAA,EAAS4C,oBAAoBC,kBAC7B,EAAE,EACN,CAAA;AAAA,eAAAb;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAL,WAAAF,MAAAG,gBAOLC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEgB,KAAA,MAAA,CAAA,CAAA5B,UAAAA,CAAW,EAAA,KAAIhB,KAAAA,EAAOc,SAAS;AAAA,MAAQ;AAAA,MAAA,IAAAe,WAAA;AAAA,YAAAgB,QAAAC,WAAAC,QAAAF,MAAAZ,YAAAe,QAAAD,MAAAZ;AAAAa,cAAAb;AAAAU,cAAAT,UAOtC,MAAMvC,MAAMwC,YAAY,QAAQ;AAACZ,eAAAoB,OAE9B3C,gBAAc8C,KAAA;AAAAV,eAAA,MAAAC,UAAAM,OAPnB,GAAG/C,OAAAA,EAAS0C,YAAY,IAC7B3C,MAAM4C,cAAc,WAChB3C,OAAAA,EAAS4C,oBAAoBC,kBAC7B,EAAE,EACN,CAAA;AAAA,eAAAE;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAApB,WAAAF,MAAAG,gBAOLC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEX,cAAAA;AAAAA,MAAe;AAAA,MAAA,IAAAY,WAAA;AAAA,YAAAoB,QAAAC,WAAAC,QAAAF,MAAAhB,YAAAmB,SAAAD,MAAAhB;AAAAiB,eAAAjB;AAAAc,cAAAb,UAOd,MAAMvC,MAAMwC,YAAY,YAAY;AAACZ,eAAAwB,OAE9BzC,iBAAe4C,MAAA;AAAAd,eAAA,MAAAC,UAAAU,OAPxB,GAAGnD,OAAAA,EAAS0C,YAAY,IAC7B3C,MAAM4C,cAAc,eAChB3C,OAAAA,EAAS4C,oBAAoBC,kBAC7B,EAAE,EACN,CAAA;AAAA,eAAAM;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAxB,WAAAF,MAAAG,gBAOLC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAET,aAAAA;AAAAA,MAAc;AAAA,MAAA,IAAAU,WAAA;AAAA,YAAAwB,SAAAC,WAAAC,SAAAF,OAAApB,YAAAuB,SAAAD,OAAApB;AAAAqB,eAAArB;AAAAkB,eAAAjB,UAOb,MAAMvC,MAAMwC,YAAY,WAAW;AAACZ,eAAA4B,QAE9B1C,gBAAc6C,MAAA;AAAAlB,eAAA,MAAAC,UAAAc,QAPtB,GAAGvD,OAAAA,EAAS0C,YAAY,IAC7B3C,MAAM4C,cAAc,cAChB3C,OAAAA,EAAS4C,oBAAoBC,kBAC7B,EAAE,EACN,CAAA;AAAA,eAAAU;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAf,WAAA,MAAAC,UAAAhB,MA/CIzB,SAAS4C,oBAAoBe,aAAa,CAAA;AAAA,WAAAlC;AAAAA,EAAA,GAAA;AAuD1D;AAACmC,eAAA,CAAA,OAAA,CAAA;"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
import { formatDuration } from "../utils/format.js";
|
|
5
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<div>No embedding operations yet`), _tmpl$3 = /* @__PURE__ */ template(`<div>⏱️ `), _tmpl$4 = /* @__PURE__ */ template(`<div><div><div>🔢</div><div>Embedding</div><div></div></div><div><div><span>Model:</span><span></span></div><div><span>Inputs:</span><span> item</span></div><div><span>Started:</span><span>`);
|
|
6
|
+
const EmbeddingsTab = (props) => {
|
|
7
|
+
const styles = useStyles();
|
|
8
|
+
return createComponent(Show, {
|
|
9
|
+
get when() {
|
|
10
|
+
return props.embeddings.length > 0;
|
|
11
|
+
},
|
|
12
|
+
get fallback() {
|
|
13
|
+
return (() => {
|
|
14
|
+
var _el$2 = _tmpl$2();
|
|
15
|
+
effect(() => className(_el$2, styles().conversationDetails.emptyMessages));
|
|
16
|
+
return _el$2;
|
|
17
|
+
})();
|
|
18
|
+
},
|
|
19
|
+
get children() {
|
|
20
|
+
var _el$ = _tmpl$();
|
|
21
|
+
insert(_el$, createComponent(For, {
|
|
22
|
+
get each() {
|
|
23
|
+
return props.embeddings;
|
|
24
|
+
},
|
|
25
|
+
children: (embedding) => (() => {
|
|
26
|
+
var _el$3 = _tmpl$4(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling, _el$0 = _el$4.nextSibling, _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$1.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$12.nextSibling, _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling;
|
|
27
|
+
insert(_el$7, () => embedding.status);
|
|
28
|
+
insert(_el$4, createComponent(Show, {
|
|
29
|
+
get when() {
|
|
30
|
+
return embedding.duration > 0;
|
|
31
|
+
},
|
|
32
|
+
get children() {
|
|
33
|
+
var _el$8 = _tmpl$3();
|
|
34
|
+
_el$8.firstChild;
|
|
35
|
+
insert(_el$8, () => formatDuration(embedding.duration), null);
|
|
36
|
+
effect(() => className(_el$8, styles().conversationDetails.durationBadge));
|
|
37
|
+
return _el$8;
|
|
38
|
+
}
|
|
39
|
+
}), null);
|
|
40
|
+
insert(_el$11, () => embedding.model);
|
|
41
|
+
insert(_el$14, () => embedding.inputCount, _el$15);
|
|
42
|
+
insert(_el$14, () => embedding.inputCount !== 1 ? "s" : "", null);
|
|
43
|
+
insert(_el$18, () => new Date(embedding.timestamp).toLocaleTimeString());
|
|
44
|
+
effect((_p$) => {
|
|
45
|
+
var _v$ = styles().conversationDetails.operationCard, _v$2 = styles().conversationDetails.operationHeader, _v$3 = styles().conversationDetails.operationIcon, _v$4 = styles().conversationDetails.operationTitle, _v$5 = `${styles().conversationDetails.operationStatus} ${embedding.status === "completed" ? styles().conversationDetails.operationStatusCompleted : styles().conversationDetails.operationStatusPending}`, _v$6 = styles().conversationDetails.operationDetails, _v$7 = styles().conversationDetails.operationDetail, _v$8 = styles().conversationDetails.operationLabel, _v$9 = styles().conversationDetails.operationValue, _v$0 = styles().conversationDetails.operationDetail, _v$1 = styles().conversationDetails.operationLabel, _v$10 = styles().conversationDetails.operationValue, _v$11 = styles().conversationDetails.operationDetail, _v$12 = styles().conversationDetails.operationLabel, _v$13 = styles().conversationDetails.operationValue;
|
|
46
|
+
_v$ !== _p$.e && className(_el$3, _p$.e = _v$);
|
|
47
|
+
_v$2 !== _p$.t && className(_el$4, _p$.t = _v$2);
|
|
48
|
+
_v$3 !== _p$.a && className(_el$5, _p$.a = _v$3);
|
|
49
|
+
_v$4 !== _p$.o && className(_el$6, _p$.o = _v$4);
|
|
50
|
+
_v$5 !== _p$.i && className(_el$7, _p$.i = _v$5);
|
|
51
|
+
_v$6 !== _p$.n && className(_el$0, _p$.n = _v$6);
|
|
52
|
+
_v$7 !== _p$.s && className(_el$1, _p$.s = _v$7);
|
|
53
|
+
_v$8 !== _p$.h && className(_el$10, _p$.h = _v$8);
|
|
54
|
+
_v$9 !== _p$.r && className(_el$11, _p$.r = _v$9);
|
|
55
|
+
_v$0 !== _p$.d && className(_el$12, _p$.d = _v$0);
|
|
56
|
+
_v$1 !== _p$.l && className(_el$13, _p$.l = _v$1);
|
|
57
|
+
_v$10 !== _p$.u && className(_el$14, _p$.u = _v$10);
|
|
58
|
+
_v$11 !== _p$.c && className(_el$16, _p$.c = _v$11);
|
|
59
|
+
_v$12 !== _p$.w && className(_el$17, _p$.w = _v$12);
|
|
60
|
+
_v$13 !== _p$.m && className(_el$18, _p$.m = _v$13);
|
|
61
|
+
return _p$;
|
|
62
|
+
}, {
|
|
63
|
+
e: void 0,
|
|
64
|
+
t: void 0,
|
|
65
|
+
a: void 0,
|
|
66
|
+
o: void 0,
|
|
67
|
+
i: void 0,
|
|
68
|
+
n: void 0,
|
|
69
|
+
s: void 0,
|
|
70
|
+
h: void 0,
|
|
71
|
+
r: void 0,
|
|
72
|
+
d: void 0,
|
|
73
|
+
l: void 0,
|
|
74
|
+
u: void 0,
|
|
75
|
+
c: void 0,
|
|
76
|
+
w: void 0,
|
|
77
|
+
m: void 0
|
|
78
|
+
});
|
|
79
|
+
return _el$3;
|
|
80
|
+
})()
|
|
81
|
+
}));
|
|
82
|
+
effect(() => className(_el$, styles().conversationDetails.messagesList));
|
|
83
|
+
return _el$;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
export {
|
|
88
|
+
EmbeddingsTab
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=EmbeddingsTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingsTab.js","sources":["../../../../src/components/conversation/EmbeddingsTab.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 { EmbeddingOperation } from '../../store/ai-context'\n\ninterface EmbeddingsTabProps {\n embeddings: Array<EmbeddingOperation>\n}\n\nexport const EmbeddingsTab: Component<EmbeddingsTabProps> = (props) => {\n const styles = useStyles()\n\n return (\n <Show\n when={props.embeddings.length > 0}\n fallback={\n <div class={styles().conversationDetails.emptyMessages}>\n No embedding operations yet\n </div>\n }\n >\n <div class={styles().conversationDetails.messagesList}>\n <For each={props.embeddings}>\n {(embedding) => (\n <div class={styles().conversationDetails.operationCard}>\n <div class={styles().conversationDetails.operationHeader}>\n <div class={styles().conversationDetails.operationIcon}>🔢</div>\n <div class={styles().conversationDetails.operationTitle}>\n Embedding\n </div>\n <div\n class={`${styles().conversationDetails.operationStatus} ${\n embedding.status === 'completed'\n ? styles().conversationDetails.operationStatusCompleted\n : styles().conversationDetails.operationStatusPending\n }`}\n >\n {embedding.status}\n </div>\n <Show when={embedding.duration > 0}>\n <div class={styles().conversationDetails.durationBadge}>\n ⏱️ {formatDuration(embedding.duration)}\n </div>\n </Show>\n </div>\n <div class={styles().conversationDetails.operationDetails}>\n <div class={styles().conversationDetails.operationDetail}>\n <span class={styles().conversationDetails.operationLabel}>\n Model:\n </span>\n <span class={styles().conversationDetails.operationValue}>\n {embedding.model}\n </span>\n </div>\n <div class={styles().conversationDetails.operationDetail}>\n <span class={styles().conversationDetails.operationLabel}>\n Inputs:\n </span>\n <span class={styles().conversationDetails.operationValue}>\n {embedding.inputCount} item\n {embedding.inputCount !== 1 ? 's' : ''}\n </span>\n </div>\n <div class={styles().conversationDetails.operationDetail}>\n <span class={styles().conversationDetails.operationLabel}>\n Started:\n </span>\n <span class={styles().conversationDetails.operationValue}>\n {new Date(embedding.timestamp).toLocaleTimeString()}\n </span>\n </div>\n </div>\n </div>\n )}\n </For>\n </div>\n </Show>\n )\n}\n"],"names":["EmbeddingsTab","props","styles","useStyles","_$createComponent","Show","when","embeddings","length","fallback","_el$2","_tmpl$2","_$effect","_$className","conversationDetails","emptyMessages","children","_el$","_tmpl$","_$insert","For","each","embedding","_el$3","_tmpl$4","_el$4","firstChild","_el$5","_el$6","nextSibling","_el$7","_el$0","_el$1","_el$10","_el$11","_el$12","_el$13","_el$14","_el$15","_el$16","_el$17","_el$18","status","duration","_el$8","_tmpl$3","formatDuration","durationBadge","model","inputCount","Date","timestamp","toLocaleTimeString","_p$","_v$","operationCard","_v$2","operationHeader","_v$3","operationIcon","_v$4","operationTitle","_v$5","operationStatus","operationStatusCompleted","operationStatusPending","_v$6","operationDetails","_v$7","operationDetail","_v$8","operationLabel","_v$9","operationValue","_v$0","_v$1","_v$10","_v$11","_v$12","_v$13","e","t","a","o","i","n","s","h","r","d","l","u","c","w","m","undefined","messagesList"],"mappings":";;;;;AAUO,MAAMA,gBAAgDC,CAAAA,UAAU;AACrE,QAAMC,SAASC,UAAAA;AAEf,SAAAC,gBACGC,MAAI;AAAA,IAAA,IACHC,OAAI;AAAA,aAAEL,MAAMM,WAAWC,SAAS;AAAA,IAAC;AAAA,IAAA,IACjCC,WAAQ;AAAA,cAAA,MAAA;AAAA,YAAAC,QAAAC,QAAAA;AAAAC,eAAA,MAAAC,UAAAH,OACMR,SAASY,oBAAoBC,aAAa,CAAA;AAAA,eAAAL;AAAAA,MAAA,GAAA;AAAA,IAAA;AAAA,IAAA,IAAAM,WAAA;AAAA,UAAAC,OAAAC,OAAAA;AAAAC,aAAAF,MAAAb,gBAMrDgB,KAAG;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAEpB,MAAMM;AAAAA,QAAU;AAAA,QAAAS,UACvBM,gBAAS,MAAA;AAAA,cAAAC,QAAAC,WAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAN,MAAAI,aAAAG,QAAAD,MAAAL,YAAAO,SAAAD,MAAAN,YAAAQ,SAAAD,OAAAJ,aAAAM,SAAAH,MAAAH,aAAAO,SAAAD,OAAAT,YAAAW,SAAAD,OAAAP,aAAAS,SAAAD,OAAAX,YAAAa,SAAAJ,OAAAN,aAAAW,SAAAD,OAAAb,YAAAe,SAAAD,OAAAX;AAAAV,iBAAAW,OAAA,MAcFR,UAAUoB,MAAM;AAAAvB,iBAAAM,OAAArB,gBAElBC,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEgB,UAAUqB,WAAW;AAAA,YAAC;AAAA,YAAA,IAAA3B,WAAA;AAAA,kBAAA4B,QAAAC;AAAAD,oBAAAlB;AAAAP,qBAAAyB,OAAA,MAE1BE,eAAexB,UAAUqB,QAAQ,GAAC,IAAA;AAAA/B,qBAAA,MAAAC,UAAA+B,OAD5B1C,SAASY,oBAAoBiC,aAAa,CAAA;AAAA,qBAAAH;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAA,IAAA;AAAAzB,iBAAAe,QAAA,MAWnDZ,UAAU0B,KAAK;AAAA7B,iBAAAkB,QAAA,MAQff,UAAU2B,YAAUX,MAAA;AAAAnB,iBAAAkB,QAAA,MACpBf,UAAU2B,eAAe,IAAI,MAAM,IAAE,IAAA;AAAA9B,iBAAAsB,QAAA,MAQrC,IAAIS,KAAK5B,UAAU6B,SAAS,EAAEC,oBAAoB;AAAAxC,iBAAAyC,CAAAA,QAAA;AAAA,gBAAAC,MA5C/CpD,OAAAA,EAASY,oBAAoByC,eAAaC,OACxCtD,SAASY,oBAAoB2C,iBAAeC,OAC1CxD,SAASY,oBAAoB6C,eAAaC,OAC1C1D,OAAAA,EAASY,oBAAoB+C,gBAAcC,OAI9C,GAAG5D,SAASY,oBAAoBiD,eAAe,IACpDzC,UAAUoB,WAAW,cACjBxC,OAAAA,EAASY,oBAAoBkD,2BAC7B9D,SAASY,oBAAoBmD,sBAAsB,IACvDC,OAUMhE,SAASY,oBAAoBqD,kBAAgBC,OAC3ClE,SAASY,oBAAoBuD,iBAAeC,OACzCpE,OAAAA,EAASY,oBAAoByD,gBAAcC,OAG3CtE,SAASY,oBAAoB2D,gBAAcC,OAI9CxE,SAASY,oBAAoBuD,iBAAeM,OACzCzE,OAAAA,EAASY,oBAAoByD,gBAAcK,QAG3C1E,OAAAA,EAASY,oBAAoB2D,gBAAcI,QAK9C3E,SAASY,oBAAoBuD,iBAAeS,QACzC5E,SAASY,oBAAoByD,gBAAcQ,QAG3C7E,SAASY,oBAAoB2D;AAAcnB,oBAAAD,IAAA2B,KAAAnE,UAAAU,OAAA8B,IAAA2B,IAAA1B,GAAA;AAAAE,qBAAAH,IAAA4B,KAAApE,UAAAY,OAAA4B,IAAA4B,IAAAzB,IAAA;AAAAE,qBAAAL,IAAA6B,KAAArE,UAAAc,OAAA0B,IAAA6B,IAAAxB,IAAA;AAAAE,qBAAAP,IAAA8B,KAAAtE,UAAAe,OAAAyB,IAAA8B,IAAAvB,IAAA;AAAAE,qBAAAT,IAAA+B,KAAAvE,UAAAiB,OAAAuB,IAAA+B,IAAAtB,IAAA;AAAAI,qBAAAb,IAAAgC,KAAAxE,UAAAkB,OAAAsB,IAAAgC,IAAAnB,IAAA;AAAAE,qBAAAf,IAAAiC,KAAAzE,UAAAmB,OAAAqB,IAAAiC,IAAAlB,IAAA;AAAAE,qBAAAjB,IAAAkC,KAAA1E,UAAAoB,QAAAoB,IAAAkC,IAAAjB,IAAA;AAAAE,qBAAAnB,IAAAmC,KAAA3E,UAAAqB,QAAAmB,IAAAmC,IAAAhB,IAAA;AAAAE,qBAAArB,IAAAoC,KAAA5E,UAAAsB,QAAAkB,IAAAoC,IAAAf,IAAA;AAAAC,qBAAAtB,IAAAqC,KAAA7E,UAAAuB,QAAAiB,IAAAqC,IAAAf,IAAA;AAAAC,sBAAAvB,IAAAsC,KAAA9E,UAAAwB,QAAAgB,IAAAsC,IAAAf,KAAA;AAAAC,sBAAAxB,IAAAuC,KAAA/E,UAAA0B,QAAAc,IAAAuC,IAAAf,KAAA;AAAAC,sBAAAzB,IAAAwC,KAAAhF,UAAA2B,QAAAa,IAAAwC,IAAAf,KAAA;AAAAC,sBAAA1B,IAAAyC,KAAAjF,UAAA4B,QAAAY,IAAAyC,IAAAf,KAAA;AAAA,mBAAA1B;AAAAA,UAAA,GAAA;AAAA,YAAA2B,GAAAe;AAAAA,YAAAd,GAAAc;AAAAA,YAAAb,GAAAa;AAAAA,YAAAZ,GAAAY;AAAAA,YAAAX,GAAAW;AAAAA,YAAAV,GAAAU;AAAAA,YAAAT,GAAAS;AAAAA,YAAAR,GAAAQ;AAAAA,YAAAP,GAAAO;AAAAA,YAAAN,GAAAM;AAAAA,YAAAL,GAAAK;AAAAA,YAAAJ,GAAAI;AAAAA,YAAAH,GAAAG;AAAAA,YAAAF,GAAAE;AAAAA,YAAAD,GAAAC;AAAAA,UAAAA,CAAA;AAAA,iBAAAxE;AAAAA,QAAA,GAAA;AAAA,MAAA,CAM/D,CAAA;AAAAX,aAAA,MAAAC,UAAAI,MApDOf,SAASY,oBAAoBkF,YAAY,CAAA;AAAA,aAAA/E;AAAAA,IAAA;AAAA,EAAA,CAAA;AAyD3D;"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { template, insert, createComponent, effect, className, memo } from "solid-js/web";
|
|
2
|
+
import { Show, For } from "solid-js";
|
|
3
|
+
import { useStyles } from "../../styles/use-styles.js";
|
|
4
|
+
import { formatTimestamp } from "../utils/format.js";
|
|
5
|
+
import { ToolCallDisplay } from "./ToolCallDisplay.js";
|
|
6
|
+
import { ChunksCollapsible } from "./ChunksCollapsible.js";
|
|
7
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div><span></span><span>`), _tmpl$2 = /* @__PURE__ */ template(`<div><span>🎯</span><span> in</span><span>•</span><span> out`), _tmpl$3 = /* @__PURE__ */ template(`<details><summary>💭 Thinking...</summary><div>`), _tmpl$4 = /* @__PURE__ */ template(`<div>`), _tmpl$5 = /* @__PURE__ */ template(`<div><div><div><div></div><div><div></div></div><div></div></div><div>`);
|
|
8
|
+
const MessageCard = (props) => {
|
|
9
|
+
const styles = useStyles();
|
|
10
|
+
const msg = () => props.message;
|
|
11
|
+
const isClientMessage = () => msg().source === "client";
|
|
12
|
+
const getCardClass = () => {
|
|
13
|
+
const base = styles().conversationDetails.messageCard;
|
|
14
|
+
if (msg().role === "user") {
|
|
15
|
+
return `${base} ${styles().conversationDetails.messageCardUser}`;
|
|
16
|
+
}
|
|
17
|
+
if (isClientMessage()) {
|
|
18
|
+
return `${base} ${styles().conversationDetails.messageCardClient}`;
|
|
19
|
+
}
|
|
20
|
+
return `${base} ${styles().conversationDetails.messageCardServer}`;
|
|
21
|
+
};
|
|
22
|
+
const isSourcedMessage = () => msg().role !== "user";
|
|
23
|
+
return (() => {
|
|
24
|
+
var _el$ = _tmpl$5(), _el$5 = _el$.firstChild, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$8.nextSibling, _el$19 = _el$6.nextSibling;
|
|
25
|
+
insert(_el$, createComponent(Show, {
|
|
26
|
+
get when() {
|
|
27
|
+
return isSourcedMessage();
|
|
28
|
+
},
|
|
29
|
+
get children() {
|
|
30
|
+
var _el$2 = _tmpl$(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
31
|
+
insert(_el$3, () => isClientMessage() ? "📱" : "☁️");
|
|
32
|
+
insert(_el$4, () => isClientMessage() ? "Client Message" : "Server Message");
|
|
33
|
+
effect((_p$) => {
|
|
34
|
+
var _v$ = `${styles().conversationDetails.sourceBanner} ${isClientMessage() ? styles().conversationDetails.sourceBannerClient : styles().conversationDetails.sourceBannerServer}`, _v$2 = styles().conversationDetails.sourceBannerIcon, _v$3 = styles().conversationDetails.sourceBannerText;
|
|
35
|
+
_v$ !== _p$.e && className(_el$2, _p$.e = _v$);
|
|
36
|
+
_v$2 !== _p$.t && className(_el$3, _p$.t = _v$2);
|
|
37
|
+
_v$3 !== _p$.a && className(_el$4, _p$.a = _v$3);
|
|
38
|
+
return _p$;
|
|
39
|
+
}, {
|
|
40
|
+
e: void 0,
|
|
41
|
+
t: void 0,
|
|
42
|
+
a: void 0
|
|
43
|
+
});
|
|
44
|
+
return _el$2;
|
|
45
|
+
}
|
|
46
|
+
}), _el$5);
|
|
47
|
+
insert(_el$7, (() => {
|
|
48
|
+
var _c$ = memo(() => msg().role === "user");
|
|
49
|
+
return () => _c$() ? "U" : msg().role === "tool" ? "🔧" : "🤖";
|
|
50
|
+
})());
|
|
51
|
+
insert(_el$9, () => msg().role);
|
|
52
|
+
insert(_el$0, () => formatTimestamp(msg().timestamp));
|
|
53
|
+
insert(_el$6, createComponent(Show, {
|
|
54
|
+
get when() {
|
|
55
|
+
return msg().usage;
|
|
56
|
+
},
|
|
57
|
+
get children() {
|
|
58
|
+
var _el$1 = _tmpl$2(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$11.nextSibling, _el$14 = _el$13.nextSibling, _el$15 = _el$14.firstChild;
|
|
59
|
+
insert(_el$11, () => msg().usage?.promptTokens.toLocaleString(), _el$12);
|
|
60
|
+
insert(_el$14, () => msg().usage?.completionTokens.toLocaleString(), _el$15);
|
|
61
|
+
effect((_p$) => {
|
|
62
|
+
var _v$4 = styles().conversationDetails.messageUsage, _v$5 = styles().conversationDetails.messageUsageIcon;
|
|
63
|
+
_v$4 !== _p$.e && className(_el$1, _p$.e = _v$4);
|
|
64
|
+
_v$5 !== _p$.t && className(_el$10, _p$.t = _v$5);
|
|
65
|
+
return _p$;
|
|
66
|
+
}, {
|
|
67
|
+
e: void 0,
|
|
68
|
+
t: void 0
|
|
69
|
+
});
|
|
70
|
+
return _el$1;
|
|
71
|
+
}
|
|
72
|
+
}), null);
|
|
73
|
+
insert(_el$5, createComponent(Show, {
|
|
74
|
+
get when() {
|
|
75
|
+
return msg().thinkingContent;
|
|
76
|
+
},
|
|
77
|
+
get children() {
|
|
78
|
+
var _el$16 = _tmpl$3(), _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling;
|
|
79
|
+
insert(_el$18, () => msg().thinkingContent);
|
|
80
|
+
effect((_p$) => {
|
|
81
|
+
var _v$6 = styles().conversationDetails.thinkingDetails, _v$7 = styles().conversationDetails.thinkingSummary, _v$8 = styles().conversationDetails.thinkingContent;
|
|
82
|
+
_v$6 !== _p$.e && className(_el$16, _p$.e = _v$6);
|
|
83
|
+
_v$7 !== _p$.t && className(_el$17, _p$.t = _v$7);
|
|
84
|
+
_v$8 !== _p$.a && className(_el$18, _p$.a = _v$8);
|
|
85
|
+
return _p$;
|
|
86
|
+
}, {
|
|
87
|
+
e: void 0,
|
|
88
|
+
t: void 0,
|
|
89
|
+
a: void 0
|
|
90
|
+
});
|
|
91
|
+
return _el$16;
|
|
92
|
+
}
|
|
93
|
+
}), _el$19);
|
|
94
|
+
insert(_el$19, () => msg().content);
|
|
95
|
+
insert(_el$5, createComponent(Show, {
|
|
96
|
+
get when() {
|
|
97
|
+
return memo(() => !!msg().toolCalls)() && msg().toolCalls.length > 0;
|
|
98
|
+
},
|
|
99
|
+
get children() {
|
|
100
|
+
var _el$20 = _tmpl$4();
|
|
101
|
+
insert(_el$20, createComponent(For, {
|
|
102
|
+
get each() {
|
|
103
|
+
return msg().toolCalls;
|
|
104
|
+
},
|
|
105
|
+
children: (tool) => createComponent(ToolCallDisplay, {
|
|
106
|
+
tool
|
|
107
|
+
})
|
|
108
|
+
}));
|
|
109
|
+
effect(() => className(_el$20, styles().conversationDetails.toolCallsContainer));
|
|
110
|
+
return _el$20;
|
|
111
|
+
}
|
|
112
|
+
}), null);
|
|
113
|
+
insert(_el$5, createComponent(Show, {
|
|
114
|
+
get when() {
|
|
115
|
+
return memo(() => !!msg().chunks)() && msg().chunks.length > 0;
|
|
116
|
+
},
|
|
117
|
+
get children() {
|
|
118
|
+
return createComponent(ChunksCollapsible, {
|
|
119
|
+
get chunks() {
|
|
120
|
+
return msg().chunks;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}), null);
|
|
125
|
+
effect((_p$) => {
|
|
126
|
+
var _v$9 = getCardClass(), _v$0 = isSourcedMessage() ? styles().conversationDetails.messageCardContent : "", _v$1 = styles().conversationDetails.messageHeader, _v$10 = msg().role === "user" ? styles().conversationDetails.avatarUser : isClientMessage() ? styles().conversationDetails.avatarClient : styles().conversationDetails.avatarServer, _v$11 = styles().conversationDetails.roleLabel, _v$12 = msg().role === "user" ? styles().conversationDetails.roleLabelUser : isClientMessage() ? styles().conversationDetails.roleLabelClient : styles().conversationDetails.roleLabelServer, _v$13 = styles().conversationDetails.timestamp, _v$14 = styles().conversationDetails.messageContent;
|
|
127
|
+
_v$9 !== _p$.e && className(_el$, _p$.e = _v$9);
|
|
128
|
+
_v$0 !== _p$.t && className(_el$5, _p$.t = _v$0);
|
|
129
|
+
_v$1 !== _p$.a && className(_el$6, _p$.a = _v$1);
|
|
130
|
+
_v$10 !== _p$.o && className(_el$7, _p$.o = _v$10);
|
|
131
|
+
_v$11 !== _p$.i && className(_el$8, _p$.i = _v$11);
|
|
132
|
+
_v$12 !== _p$.n && className(_el$9, _p$.n = _v$12);
|
|
133
|
+
_v$13 !== _p$.s && className(_el$0, _p$.s = _v$13);
|
|
134
|
+
_v$14 !== _p$.h && className(_el$19, _p$.h = _v$14);
|
|
135
|
+
return _p$;
|
|
136
|
+
}, {
|
|
137
|
+
e: void 0,
|
|
138
|
+
t: void 0,
|
|
139
|
+
a: void 0,
|
|
140
|
+
o: void 0,
|
|
141
|
+
i: void 0,
|
|
142
|
+
n: void 0,
|
|
143
|
+
s: void 0,
|
|
144
|
+
h: void 0
|
|
145
|
+
});
|
|
146
|
+
return _el$;
|
|
147
|
+
})();
|
|
148
|
+
};
|
|
149
|
+
export {
|
|
150
|
+
MessageCard
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=MessageCard.js.map
|