@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/esm/components/ConversationDetails.d.ts +2 -0
  4. package/dist/esm/components/ConversationDetails.js +134 -0
  5. package/dist/esm/components/ConversationDetails.js.map +1 -0
  6. package/dist/esm/components/ConversationsList.d.ts +2 -0
  7. package/dist/esm/components/ConversationsList.js +30 -0
  8. package/dist/esm/components/ConversationsList.js.map +1 -0
  9. package/dist/esm/components/Shell.d.ts +1 -0
  10. package/dist/esm/components/Shell.js +94 -0
  11. package/dist/esm/components/Shell.js.map +1 -0
  12. package/dist/esm/components/conversation/ChunkBadges.d.ts +7 -0
  13. package/dist/esm/components/conversation/ChunkBadges.js +54 -0
  14. package/dist/esm/components/conversation/ChunkBadges.js.map +1 -0
  15. package/dist/esm/components/conversation/ChunkItem.d.ts +9 -0
  16. package/dist/esm/components/conversation/ChunkItem.js +247 -0
  17. package/dist/esm/components/conversation/ChunkItem.js.map +1 -0
  18. package/dist/esm/components/conversation/ChunksCollapsible.d.ts +7 -0
  19. package/dist/esm/components/conversation/ChunksCollapsible.js +77 -0
  20. package/dist/esm/components/conversation/ChunksCollapsible.js.map +1 -0
  21. package/dist/esm/components/conversation/ChunksTab.d.ts +8 -0
  22. package/dist/esm/components/conversation/ChunksTab.js +87 -0
  23. package/dist/esm/components/conversation/ChunksTab.js.map +1 -0
  24. package/dist/esm/components/conversation/ConversationHeader.d.ts +7 -0
  25. package/dist/esm/components/conversation/ConversationHeader.js +187 -0
  26. package/dist/esm/components/conversation/ConversationHeader.js.map +1 -0
  27. package/dist/esm/components/conversation/ConversationTabs.d.ts +10 -0
  28. package/dist/esm/components/conversation/ConversationTabs.js +88 -0
  29. package/dist/esm/components/conversation/ConversationTabs.js.map +1 -0
  30. package/dist/esm/components/conversation/EmbeddingsTab.d.ts +7 -0
  31. package/dist/esm/components/conversation/EmbeddingsTab.js +90 -0
  32. package/dist/esm/components/conversation/EmbeddingsTab.js.map +1 -0
  33. package/dist/esm/components/conversation/MessageCard.d.ts +7 -0
  34. package/dist/esm/components/conversation/MessageCard.js +152 -0
  35. package/dist/esm/components/conversation/MessageCard.js.map +1 -0
  36. package/dist/esm/components/conversation/MessageGroup.d.ts +15 -0
  37. package/dist/esm/components/conversation/MessageGroup.js +119 -0
  38. package/dist/esm/components/conversation/MessageGroup.js.map +1 -0
  39. package/dist/esm/components/conversation/MessagesTab.d.ts +7 -0
  40. package/dist/esm/components/conversation/MessagesTab.js +37 -0
  41. package/dist/esm/components/conversation/MessagesTab.js.map +1 -0
  42. package/dist/esm/components/conversation/SummariesTab.d.ts +7 -0
  43. package/dist/esm/components/conversation/SummariesTab.js +110 -0
  44. package/dist/esm/components/conversation/SummariesTab.js.map +1 -0
  45. package/dist/esm/components/conversation/ToolCallDisplay.d.ts +7 -0
  46. package/dist/esm/components/conversation/ToolCallDisplay.js +123 -0
  47. package/dist/esm/components/conversation/ToolCallDisplay.js.map +1 -0
  48. package/dist/esm/components/conversation/index.d.ts +7 -0
  49. package/dist/esm/components/list/ConversationRow.d.ts +7 -0
  50. package/dist/esm/components/list/ConversationRow.js +122 -0
  51. package/dist/esm/components/list/ConversationRow.js.map +1 -0
  52. package/dist/esm/components/list/index.d.ts +1 -0
  53. package/dist/esm/components/utils/format.d.ts +6 -0
  54. package/dist/esm/components/utils/format.js +68 -0
  55. package/dist/esm/components/utils/format.js.map +1 -0
  56. package/dist/esm/components/utils/index.d.ts +1 -0
  57. package/dist/esm/core.d.ts +18 -0
  58. package/dist/esm/core.js +9 -0
  59. package/dist/esm/core.js.map +1 -0
  60. package/dist/esm/index.d.ts +9 -0
  61. package/dist/esm/index.js +6 -0
  62. package/dist/esm/index.js.map +1 -0
  63. package/dist/esm/production.d.ts +2 -0
  64. package/dist/esm/production.js +5 -0
  65. package/dist/esm/production.js.map +1 -0
  66. package/dist/esm/store/ai-context.d.ts +126 -0
  67. package/dist/esm/store/ai-context.js +1081 -0
  68. package/dist/esm/store/ai-context.js.map +1 -0
  69. package/dist/esm/store/ai-store.d.ts +1 -0
  70. package/dist/esm/styles/tokens.d.ts +298 -0
  71. package/dist/esm/styles/tokens.js +107 -0
  72. package/dist/esm/styles/tokens.js.map +1 -0
  73. package/dist/esm/styles/use-styles.d.ts +226 -0
  74. package/dist/esm/styles/use-styles.js +1538 -0
  75. package/dist/esm/styles/use-styles.js.map +1 -0
  76. package/package.json +61 -0
  77. package/src/components/ConversationDetails.tsx +89 -0
  78. package/src/components/ConversationsList.tsx +21 -0
  79. package/src/components/Shell.tsx +93 -0
  80. package/src/components/conversation/ChunkBadges.tsx +51 -0
  81. package/src/components/conversation/ChunkItem.tsx +273 -0
  82. package/src/components/conversation/ChunksCollapsible.tsx +58 -0
  83. package/src/components/conversation/ChunksTab.tsx +85 -0
  84. package/src/components/conversation/ConversationHeader.tsx +130 -0
  85. package/src/components/conversation/ConversationTabs.tsx +104 -0
  86. package/src/components/conversation/EmbeddingsTab.tsx +80 -0
  87. package/src/components/conversation/MessageCard.tsx +137 -0
  88. package/src/components/conversation/MessageGroup.tsx +101 -0
  89. package/src/components/conversation/MessagesTab.tsx +30 -0
  90. package/src/components/conversation/SummariesTab.tsx +91 -0
  91. package/src/components/conversation/ToolCallDisplay.tsx +99 -0
  92. package/src/components/conversation/index.ts +8 -0
  93. package/src/components/list/ConversationRow.tsx +85 -0
  94. package/src/components/list/index.ts +1 -0
  95. package/src/components/utils/format.ts +61 -0
  96. package/src/components/utils/index.ts +1 -0
  97. package/src/core.tsx +10 -0
  98. package/src/index.ts +8 -0
  99. package/src/production.ts +3 -0
  100. package/src/store/ai-context.tsx +1784 -0
  101. package/src/store/ai-store.ts +2 -0
  102. package/src/styles/tokens.ts +305 -0
  103. package/src/styles/use-styles.ts +1537 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageCard.js","sources":["../../../../src/components/conversation/MessageCard.tsx"],"sourcesContent":["import { For, Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport { formatTimestamp } from '../utils'\nimport { ToolCallDisplay } from './ToolCallDisplay'\nimport { ChunksCollapsible } from './ChunksCollapsible'\nimport type { Message } from '../../store/ai-store'\nimport type { Component } from 'solid-js'\n\ninterface MessageCardProps {\n message: Message\n}\n\nexport const MessageCard: Component<MessageCardProps> = (props) => {\n const styles = useStyles()\n // Access message through props directly for proper SolidJS reactivity\n const msg = () => props.message\n\n // Check if message is from client (explicitly marked) or server (default)\n const isClientMessage = () => msg().source === 'client'\n\n // Determine card class based on role and source\n const getCardClass = () => {\n const base = styles().conversationDetails.messageCard\n if (msg().role === 'user') {\n return `${base} ${styles().conversationDetails.messageCardUser}`\n }\n // For assistant messages: client if explicitly marked, otherwise server\n if (isClientMessage()) {\n return `${base} ${styles().conversationDetails.messageCardClient}`\n }\n return `${base} ${styles().conversationDetails.messageCardServer}`\n }\n\n // Check if this is a non-user message (needs source banner and content wrapper)\n const isSourcedMessage = () => msg().role !== 'user'\n\n return (\n <div class={getCardClass()}>\n {/* Source indicator banner at top of card */}\n <Show when={isSourcedMessage()}>\n <div\n class={`${styles().conversationDetails.sourceBanner} ${\n isClientMessage()\n ? styles().conversationDetails.sourceBannerClient\n : styles().conversationDetails.sourceBannerServer\n }`}\n >\n <span class={styles().conversationDetails.sourceBannerIcon}>\n {isClientMessage() ? '📱' : '☁️'}\n </span>\n <span class={styles().conversationDetails.sourceBannerText}>\n {isClientMessage() ? 'Client Message' : 'Server Message'}\n </span>\n </div>\n </Show>\n {/* Content wrapper with padding */}\n <div\n class={\n isSourcedMessage()\n ? styles().conversationDetails.messageCardContent\n : ''\n }\n >\n <div class={styles().conversationDetails.messageHeader}>\n <div\n class={\n msg().role === 'user'\n ? styles().conversationDetails.avatarUser\n : isClientMessage()\n ? styles().conversationDetails.avatarClient\n : styles().conversationDetails.avatarServer\n }\n >\n {msg().role === 'user' ? 'U' : msg().role === 'tool' ? '🔧' : '🤖'}\n </div>\n <div class={styles().conversationDetails.roleLabel}>\n <div\n class={\n msg().role === 'user'\n ? styles().conversationDetails.roleLabelUser\n : isClientMessage()\n ? styles().conversationDetails.roleLabelClient\n : styles().conversationDetails.roleLabelServer\n }\n >\n {msg().role}\n </div>\n </div>\n <div class={styles().conversationDetails.timestamp}>\n {formatTimestamp(msg().timestamp)}\n </div>\n {/* Per-message token usage */}\n <Show when={msg().usage}>\n <div class={styles().conversationDetails.messageUsage}>\n <span class={styles().conversationDetails.messageUsageIcon}>\n 🎯\n </span>\n <span>{msg().usage?.promptTokens.toLocaleString()} in</span>\n <span>•</span>\n <span>{msg().usage?.completionTokens.toLocaleString()} out</span>\n </div>\n </Show>\n </div>\n\n {/* Thinking content (for extended thinking models) */}\n <Show when={msg().thinkingContent}>\n <details class={styles().conversationDetails.thinkingDetails}>\n <summary class={styles().conversationDetails.thinkingSummary}>\n 💭 Thinking...\n </summary>\n <div class={styles().conversationDetails.thinkingContent}>\n {msg().thinkingContent}\n </div>\n </details>\n </Show>\n\n <div class={styles().conversationDetails.messageContent}>\n {msg().content}\n </div>\n\n {/* Tool Calls Display */}\n <Show when={msg().toolCalls && msg().toolCalls!.length > 0}>\n <div class={styles().conversationDetails.toolCallsContainer}>\n <For each={msg().toolCalls}>\n {(tool) => <ToolCallDisplay tool={tool} />}\n </For>\n </div>\n </Show>\n\n {/* Chunks Display (for client conversations with server chunks) */}\n <Show when={msg().chunks && msg().chunks!.length > 0}>\n <ChunksCollapsible chunks={msg().chunks!} />\n </Show>\n </div>\n </div>\n )\n}\n"],"names":["MessageCard","props","styles","useStyles","msg","message","isClientMessage","source","getCardClass","base","conversationDetails","messageCard","role","messageCardUser","messageCardClient","messageCardServer","isSourcedMessage","_el$","_tmpl$5","_el$5","firstChild","_el$6","_el$7","_el$8","nextSibling","_el$9","_el$0","_el$19","_$insert","_$createComponent","Show","when","children","_el$2","_tmpl$","_el$3","_el$4","_$effect","_p$","_v$","sourceBanner","sourceBannerClient","sourceBannerServer","_v$2","sourceBannerIcon","_v$3","sourceBannerText","e","_$className","t","a","undefined","_c$","_$memo","formatTimestamp","timestamp","usage","_el$1","_tmpl$2","_el$10","_el$11","_el$12","_el$13","_el$14","_el$15","promptTokens","toLocaleString","completionTokens","_v$4","messageUsage","_v$5","messageUsageIcon","thinkingContent","_el$16","_tmpl$3","_el$17","_el$18","_v$6","thinkingDetails","_v$7","thinkingSummary","_v$8","content","toolCalls","length","_el$20","_tmpl$4","For","each","tool","ToolCallDisplay","toolCallsContainer","chunks","ChunksCollapsible","_v$9","_v$0","messageCardContent","_v$1","messageHeader","_v$10","avatarUser","avatarClient","avatarServer","_v$11","roleLabel","_v$12","roleLabelUser","roleLabelClient","roleLabelServer","_v$13","_v$14","messageContent","o","i","n","s","h"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Component } from 'solid-js';
2
+ import { Chunk } from '../../store/ai-store.js';
3
+ interface TokenUsage {
4
+ promptTokens: number;
5
+ completionTokens: number;
6
+ totalTokens: number;
7
+ }
8
+ interface MessageGroupProps {
9
+ messageId: string;
10
+ chunks: Array<Chunk>;
11
+ groupIndex: number;
12
+ usage?: TokenUsage;
13
+ }
14
+ export declare const MessageGroup: Component<MessageGroupProps>;
15
+ export {};
@@ -0,0 +1,119 @@
1
+ import { template, insert, createComponent, effect, className, setAttribute } from "solid-js/web";
2
+ import { Show, For } from "solid-js";
3
+ import { useStyles } from "../../styles/use-styles.js";
4
+ import { ChunkItem } from "./ChunkItem.js";
5
+ import { ChunkBadges } from "./ChunkBadges.js";
6
+ var _tmpl$ = /* @__PURE__ */ template(`<span style=opacity:0.7;margin-left:4px>(<!> entries)`), _tmpl$2 = /* @__PURE__ */ template(`<div><span>🎯</span><span> in</span><span>•</span><span> out`), _tmpl$3 = /* @__PURE__ */ template(`<div>`), _tmpl$4 = /* @__PURE__ */ template(`<details><summary><div><div><span>Message #</span><div>📦 <!> chunks</div></div><div>ID: </div></div></summary><div><div>`);
7
+ const MessageGroup = (props) => {
8
+ const styles = useStyles();
9
+ const accumulatedContent = () => props.chunks.filter((c) => c.type === "content" && (c.content || c.delta)).map((c) => c.content).join("");
10
+ const totalRawChunks = () => props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0);
11
+ const consolidatedEntries = () => props.chunks.length;
12
+ return (() => {
13
+ var _el$ = _tmpl$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
14
+ _el$5.firstChild;
15
+ var _el$7 = _el$5.nextSibling, _el$8 = _el$7.firstChild, _el$12 = _el$8.nextSibling;
16
+ _el$12.nextSibling;
17
+ var _el$20 = _el$4.nextSibling;
18
+ _el$20.firstChild;
19
+ var _el$23 = _el$2.nextSibling, _el$24 = _el$23.firstChild;
20
+ insert(_el$5, () => props.groupIndex + 1, null);
21
+ insert(_el$7, totalRawChunks, _el$12);
22
+ insert(_el$7, createComponent(Show, {
23
+ get when() {
24
+ return consolidatedEntries() !== totalRawChunks();
25
+ },
26
+ get children() {
27
+ var _el$0 = _tmpl$(), _el$1 = _el$0.firstChild, _el$11 = _el$1.nextSibling;
28
+ _el$11.nextSibling;
29
+ insert(_el$0, consolidatedEntries, _el$11);
30
+ return _el$0;
31
+ }
32
+ }), null);
33
+ insert(_el$4, createComponent(ChunkBadges, {
34
+ get chunks() {
35
+ return props.chunks;
36
+ }
37
+ }), null);
38
+ insert(_el$4, createComponent(Show, {
39
+ get when() {
40
+ return props.usage;
41
+ },
42
+ get children() {
43
+ var _el$13 = _tmpl$2(), _el$14 = _el$13.firstChild, _el$15 = _el$14.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$15.nextSibling, _el$18 = _el$17.nextSibling, _el$19 = _el$18.firstChild;
44
+ insert(_el$15, () => props.usage?.promptTokens.toLocaleString(), _el$16);
45
+ insert(_el$18, () => props.usage?.completionTokens.toLocaleString(), _el$19);
46
+ effect((_p$) => {
47
+ var _v$ = styles().conversationDetails.messageUsage, _v$2 = styles().conversationDetails.messageUsageIcon;
48
+ _v$ !== _p$.e && className(_el$13, _p$.e = _v$);
49
+ _v$2 !== _p$.t && className(_el$14, _p$.t = _v$2);
50
+ return _p$;
51
+ }, {
52
+ e: void 0,
53
+ t: void 0
54
+ });
55
+ return _el$13;
56
+ }
57
+ }), null);
58
+ insert(_el$20, () => props.messageId, null);
59
+ insert(_el$3, createComponent(Show, {
60
+ get when() {
61
+ return accumulatedContent();
62
+ },
63
+ get children() {
64
+ var _el$22 = _tmpl$3();
65
+ insert(_el$22, accumulatedContent);
66
+ effect((_p$) => {
67
+ var _v$3 = styles().conversationDetails.contentPreview, _v$4 = accumulatedContent();
68
+ _v$3 !== _p$.e && className(_el$22, _p$.e = _v$3);
69
+ _v$4 !== _p$.t && setAttribute(_el$22, "title", _p$.t = _v$4);
70
+ return _p$;
71
+ }, {
72
+ e: void 0,
73
+ t: void 0
74
+ });
75
+ return _el$22;
76
+ }
77
+ }), null);
78
+ insert(_el$24, createComponent(For, {
79
+ get each() {
80
+ return props.chunks;
81
+ },
82
+ children: (chunk, chunkIndex) => createComponent(ChunkItem, {
83
+ chunk,
84
+ get index() {
85
+ return chunkIndex();
86
+ },
87
+ variant: "large"
88
+ })
89
+ }));
90
+ effect((_p$) => {
91
+ var _v$5 = styles().conversationDetails.messageGroupDetails, _v$6 = styles().conversationDetails.messageGroupSummary, _v$7 = styles().conversationDetails.messageGroupContent, _v$8 = styles().conversationDetails.messageGroupHeader, _v$9 = `${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeCount}`, _v$0 = styles().conversationDetails.messageId, _v$1 = props.messageId, _v$10 = styles().conversationDetails.chunksContainer, _v$11 = styles().conversationDetails.chunksList;
92
+ _v$5 !== _p$.e && className(_el$, _p$.e = _v$5);
93
+ _v$6 !== _p$.t && className(_el$2, _p$.t = _v$6);
94
+ _v$7 !== _p$.a && className(_el$3, _p$.a = _v$7);
95
+ _v$8 !== _p$.o && className(_el$4, _p$.o = _v$8);
96
+ _v$9 !== _p$.i && className(_el$7, _p$.i = _v$9);
97
+ _v$0 !== _p$.n && className(_el$20, _p$.n = _v$0);
98
+ _v$1 !== _p$.s && setAttribute(_el$20, "title", _p$.s = _v$1);
99
+ _v$10 !== _p$.h && className(_el$23, _p$.h = _v$10);
100
+ _v$11 !== _p$.r && className(_el$24, _p$.r = _v$11);
101
+ return _p$;
102
+ }, {
103
+ e: void 0,
104
+ t: void 0,
105
+ a: void 0,
106
+ o: void 0,
107
+ i: void 0,
108
+ n: void 0,
109
+ s: void 0,
110
+ h: void 0,
111
+ r: void 0
112
+ });
113
+ return _el$;
114
+ })();
115
+ };
116
+ export {
117
+ MessageGroup
118
+ };
119
+ //# sourceMappingURL=MessageGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageGroup.js","sources":["../../../../src/components/conversation/MessageGroup.tsx"],"sourcesContent":["import { For, Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport { ChunkItem } from './ChunkItem'\nimport { ChunkBadges } from './ChunkBadges'\nimport type { Component } from 'solid-js'\nimport type { Chunk } from '../../store/ai-store'\n\ninterface TokenUsage {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n}\n\ninterface MessageGroupProps {\n messageId: string\n chunks: Array<Chunk>\n groupIndex: number\n usage?: TokenUsage\n}\n\nexport const MessageGroup: Component<MessageGroupProps> = (props) => {\n const styles = useStyles()\n\n const accumulatedContent = () =>\n props.chunks\n .filter((c) => c.type === 'content' && (c.content || c.delta))\n .map((c) => c.content)\n .join('')\n\n // Total raw chunks = sum of all chunkCounts\n const totalRawChunks = () =>\n props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0)\n // Consolidated entries = number of entries in the chunks array\n const consolidatedEntries = () => props.chunks.length\n\n return (\n <details class={styles().conversationDetails.messageGroupDetails}>\n <summary class={styles().conversationDetails.messageGroupSummary}>\n <div class={styles().conversationDetails.messageGroupContent}>\n {/* Header */}\n <div class={styles().conversationDetails.messageGroupHeader}>\n <span>Message #{props.groupIndex + 1}</span>\n <div\n class={`${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeCount}`}\n >\n 📦 {totalRawChunks()} chunks\n <Show when={consolidatedEntries() !== totalRawChunks()}>\n <span style={{ opacity: 0.7, 'margin-left': '4px' }}>\n ({consolidatedEntries()} entries)\n </span>\n </Show>\n </div>\n <ChunkBadges chunks={props.chunks} />\n {/* Usage info */}\n <Show when={props.usage}>\n <div class={styles().conversationDetails.messageUsage}>\n <span class={styles().conversationDetails.messageUsageIcon}>\n 🎯\n </span>\n <span>{props.usage?.promptTokens.toLocaleString()} in</span>\n <span>•</span>\n <span>\n {props.usage?.completionTokens.toLocaleString()} out\n </span>\n </div>\n </Show>\n </div>\n\n {/* Message ID */}\n <div\n class={styles().conversationDetails.messageId}\n title={props.messageId}\n >\n ID: {props.messageId}\n </div>\n\n {/* Accumulated Content Preview */}\n <Show when={accumulatedContent()}>\n <div\n class={styles().conversationDetails.contentPreview}\n title={accumulatedContent()}\n >\n {accumulatedContent()}\n </div>\n </Show>\n </div>\n </summary>\n\n {/* Chunks in this group */}\n <div class={styles().conversationDetails.chunksContainer}>\n <div class={styles().conversationDetails.chunksList}>\n <For each={props.chunks}>\n {(chunk, chunkIndex) => (\n <ChunkItem chunk={chunk} index={chunkIndex()} variant=\"large\" />\n )}\n </For>\n </div>\n </div>\n </details>\n )\n}\n"],"names":["MessageGroup","props","styles","useStyles","accumulatedContent","chunks","filter","c","type","content","delta","map","join","totalRawChunks","reduce","sum","chunkCount","consolidatedEntries","length","_el$","_tmpl$4","_el$2","firstChild","_el$3","_el$4","_el$5","_el$7","nextSibling","_el$8","_el$12","_el$20","_el$23","_el$24","_$insert","groupIndex","_$createComponent","Show","when","children","_el$0","_tmpl$","_el$1","_el$11","ChunkBadges","usage","_el$13","_tmpl$2","_el$14","_el$15","_el$16","_el$17","_el$18","_el$19","promptTokens","toLocaleString","completionTokens","_$effect","_p$","_v$","conversationDetails","messageUsage","_v$2","messageUsageIcon","e","_$className","t","undefined","messageId","_el$22","_tmpl$3","_v$3","contentPreview","_v$4","_$setAttribute","For","each","chunk","chunkIndex","ChunkItem","index","variant","_v$5","messageGroupDetails","_v$6","messageGroupSummary","_v$7","messageGroupContent","_v$8","messageGroupHeader","_v$9","chunkBadge","chunkBadgeCount","_v$0","_v$1","_v$10","chunksContainer","_v$11","chunksList","a","o","i","n","s","h","r"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Component } from 'solid-js';
2
+ import { Message } from '../../store/ai-store.js';
3
+ interface MessagesTabProps {
4
+ messages: Array<Message>;
5
+ }
6
+ export declare const MessagesTab: Component<MessagesTabProps>;
7
+ export {};
@@ -0,0 +1,37 @@
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 { MessageCard } from "./MessageCard.js";
5
+ var _tmpl$ = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<div>No messages yet. Start a conversation to see messages here.`);
6
+ const MessagesTab = (props) => {
7
+ const styles = useStyles();
8
+ return createComponent(Show, {
9
+ get when() {
10
+ return props.messages.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.messages;
24
+ },
25
+ children: (msg) => createComponent(MessageCard, {
26
+ message: msg
27
+ })
28
+ }));
29
+ effect(() => className(_el$, styles().conversationDetails.messagesList));
30
+ return _el$;
31
+ }
32
+ });
33
+ };
34
+ export {
35
+ MessagesTab
36
+ };
37
+ //# sourceMappingURL=MessagesTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessagesTab.js","sources":["../../../../src/components/conversation/MessagesTab.tsx"],"sourcesContent":["import { For, Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport { MessageCard } from './MessageCard'\nimport type { Component } from 'solid-js'\nimport type { Message } from '../../store/ai-store'\n\ninterface MessagesTabProps {\n messages: Array<Message>\n}\n\nexport const MessagesTab: Component<MessagesTabProps> = (props) => {\n const styles = useStyles()\n\n return (\n <Show\n when={props.messages.length > 0}\n fallback={\n <div class={styles().conversationDetails.emptyMessages}>\n No messages yet. Start a conversation to see messages here.\n </div>\n }\n >\n <div class={styles().conversationDetails.messagesList}>\n <For each={props.messages}>\n {(msg) => <MessageCard message={msg} />}\n </For>\n </div>\n </Show>\n )\n}\n"],"names":["MessagesTab","props","styles","useStyles","_$createComponent","Show","when","messages","length","fallback","_el$2","_tmpl$2","_$effect","_$className","conversationDetails","emptyMessages","children","_el$","_tmpl$","_$insert","For","each","msg","MessageCard","message","messagesList"],"mappings":";;;;;AAUO,MAAMA,cAA4CC,CAAAA,UAAU;AACjE,QAAMC,SAASC,UAAAA;AAEf,SAAAC,gBACGC,MAAI;AAAA,IAAA,IACHC,OAAI;AAAA,aAAEL,MAAMM,SAASC,SAAS;AAAA,IAAC;AAAA,IAAA,IAC/BC,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,QAAQ;AAAA,QAAAS,UACrBM,CAAAA,QAAGlB,gBAAMmB,aAAW;AAAA,UAACC,SAASF;AAAAA,QAAAA,CAAG;AAAA,MAAA,CAAI,CAAA;AAAAV,aAAA,MAAAC,UAAAI,MAF/Bf,SAASY,oBAAoBW,YAAY,CAAA;AAAA,aAAAR;AAAAA,IAAA;AAAA,EAAA,CAAA;AAO3D;"}
@@ -0,0 +1,7 @@
1
+ import { Component } from 'solid-js';
2
+ import { SummarizeOperation } from '../../store/ai-context.js';
3
+ interface SummariesTabProps {
4
+ summaries: Array<SummarizeOperation>;
5
+ }
6
+ export declare const SummariesTab: Component<SummariesTabProps>;
7
+ export {};
@@ -0,0 +1,110 @@
1
+ import { createComponent, template, insert, 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>`), _tmpl$2 = /* @__PURE__ */ template(`<div>No summarize operations yet`), _tmpl$3 = /* @__PURE__ */ template(`<div>⏱️ `), _tmpl$4 = /* @__PURE__ */ template(`<div><span>Output:</span><span> chars`), _tmpl$5 = /* @__PURE__ */ template(`<div><div><div>📝</div><div>Summarize</div><div></div></div><div><div><span>Model:</span><span></span></div><div><span>Input:</span><span> chars</span></div><div><span>Started:</span><span>`);
6
+ const SummariesTab = (props) => {
7
+ const styles = useStyles();
8
+ return createComponent(Show, {
9
+ get when() {
10
+ return props.summaries.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.summaries;
24
+ },
25
+ children: (summary) => (() => {
26
+ var _el$3 = _tmpl$5(), _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$20 = _el$12.nextSibling, _el$21 = _el$20.firstChild, _el$22 = _el$21.nextSibling;
27
+ insert(_el$7, () => summary.status);
28
+ insert(_el$4, createComponent(Show, {
29
+ get when() {
30
+ return memo(() => summary.duration !== void 0)() && summary.duration > 0;
31
+ },
32
+ get children() {
33
+ var _el$8 = _tmpl$3();
34
+ _el$8.firstChild;
35
+ insert(_el$8, () => formatDuration(summary.duration), null);
36
+ effect(() => className(_el$8, styles().conversationDetails.durationBadge));
37
+ return _el$8;
38
+ }
39
+ }), null);
40
+ insert(_el$11, () => summary.model);
41
+ insert(_el$14, () => summary.inputLength.toLocaleString(), _el$15);
42
+ insert(_el$0, createComponent(Show, {
43
+ get when() {
44
+ return summary.outputLength !== void 0;
45
+ },
46
+ get children() {
47
+ var _el$16 = _tmpl$4(), _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling, _el$19 = _el$18.firstChild;
48
+ insert(_el$18, () => summary.outputLength?.toLocaleString(), _el$19);
49
+ effect((_p$) => {
50
+ var _v$ = styles().conversationDetails.operationDetail, _v$2 = styles().conversationDetails.operationLabel, _v$3 = styles().conversationDetails.operationValue;
51
+ _v$ !== _p$.e && className(_el$16, _p$.e = _v$);
52
+ _v$2 !== _p$.t && className(_el$17, _p$.t = _v$2);
53
+ _v$3 !== _p$.a && className(_el$18, _p$.a = _v$3);
54
+ return _p$;
55
+ }, {
56
+ e: void 0,
57
+ t: void 0,
58
+ a: void 0
59
+ });
60
+ return _el$16;
61
+ }
62
+ }), _el$20);
63
+ insert(_el$22, () => new Date(summary.timestamp).toLocaleTimeString());
64
+ effect((_p$) => {
65
+ var _v$4 = styles().conversationDetails.operationCard, _v$5 = styles().conversationDetails.operationHeader, _v$6 = styles().conversationDetails.operationIcon, _v$7 = styles().conversationDetails.operationTitle, _v$8 = `${styles().conversationDetails.operationStatus} ${summary.status === "completed" ? styles().conversationDetails.operationStatusCompleted : styles().conversationDetails.operationStatusPending}`, _v$9 = styles().conversationDetails.operationDetails, _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, _v$14 = styles().conversationDetails.operationDetail, _v$15 = styles().conversationDetails.operationLabel, _v$16 = styles().conversationDetails.operationValue;
66
+ _v$4 !== _p$.e && className(_el$3, _p$.e = _v$4);
67
+ _v$5 !== _p$.t && className(_el$4, _p$.t = _v$5);
68
+ _v$6 !== _p$.a && className(_el$5, _p$.a = _v$6);
69
+ _v$7 !== _p$.o && className(_el$6, _p$.o = _v$7);
70
+ _v$8 !== _p$.i && className(_el$7, _p$.i = _v$8);
71
+ _v$9 !== _p$.n && className(_el$0, _p$.n = _v$9);
72
+ _v$0 !== _p$.s && className(_el$1, _p$.s = _v$0);
73
+ _v$1 !== _p$.h && className(_el$10, _p$.h = _v$1);
74
+ _v$10 !== _p$.r && className(_el$11, _p$.r = _v$10);
75
+ _v$11 !== _p$.d && className(_el$12, _p$.d = _v$11);
76
+ _v$12 !== _p$.l && className(_el$13, _p$.l = _v$12);
77
+ _v$13 !== _p$.u && className(_el$14, _p$.u = _v$13);
78
+ _v$14 !== _p$.c && className(_el$20, _p$.c = _v$14);
79
+ _v$15 !== _p$.w && className(_el$21, _p$.w = _v$15);
80
+ _v$16 !== _p$.m && className(_el$22, _p$.m = _v$16);
81
+ return _p$;
82
+ }, {
83
+ e: void 0,
84
+ t: void 0,
85
+ a: void 0,
86
+ o: void 0,
87
+ i: void 0,
88
+ n: void 0,
89
+ s: void 0,
90
+ h: void 0,
91
+ r: void 0,
92
+ d: void 0,
93
+ l: void 0,
94
+ u: void 0,
95
+ c: void 0,
96
+ w: void 0,
97
+ m: void 0
98
+ });
99
+ return _el$3;
100
+ })()
101
+ }));
102
+ effect(() => className(_el$, styles().conversationDetails.messagesList));
103
+ return _el$;
104
+ }
105
+ });
106
+ };
107
+ export {
108
+ SummariesTab
109
+ };
110
+ //# sourceMappingURL=SummariesTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SummariesTab.js","sources":["../../../../src/components/conversation/SummariesTab.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 { SummarizeOperation } from '../../store/ai-context'\n\ninterface SummariesTabProps {\n summaries: Array<SummarizeOperation>\n}\n\nexport const SummariesTab: Component<SummariesTabProps> = (props) => {\n const styles = useStyles()\n\n return (\n <Show\n when={props.summaries.length > 0}\n fallback={\n <div class={styles().conversationDetails.emptyMessages}>\n No summarize operations yet\n </div>\n }\n >\n <div class={styles().conversationDetails.messagesList}>\n <For each={props.summaries}>\n {(summary) => (\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 Summarize\n </div>\n <div\n class={`${styles().conversationDetails.operationStatus} ${\n summary.status === 'completed'\n ? styles().conversationDetails.operationStatusCompleted\n : styles().conversationDetails.operationStatusPending\n }`}\n >\n {summary.status}\n </div>\n <Show\n when={summary.duration !== undefined && summary.duration > 0}\n >\n <div class={styles().conversationDetails.durationBadge}>\n ⏱️ {formatDuration(summary.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 {summary.model}\n </span>\n </div>\n <div class={styles().conversationDetails.operationDetail}>\n <span class={styles().conversationDetails.operationLabel}>\n Input:\n </span>\n <span class={styles().conversationDetails.operationValue}>\n {summary.inputLength.toLocaleString()} chars\n </span>\n </div>\n <Show when={summary.outputLength !== undefined}>\n <div class={styles().conversationDetails.operationDetail}>\n <span class={styles().conversationDetails.operationLabel}>\n Output:\n </span>\n <span class={styles().conversationDetails.operationValue}>\n {summary.outputLength?.toLocaleString()} chars\n </span>\n </div>\n </Show>\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(summary.timestamp).toLocaleTimeString()}\n </span>\n </div>\n </div>\n </div>\n )}\n </For>\n </div>\n </Show>\n )\n}\n"],"names":["SummariesTab","props","styles","useStyles","_$createComponent","Show","when","summaries","length","fallback","_el$2","_tmpl$2","_$effect","_$className","conversationDetails","emptyMessages","children","_el$","_tmpl$","_$insert","For","each","summary","_el$3","_tmpl$5","_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$20","_el$21","_el$22","status","_$memo","duration","undefined","_el$8","_tmpl$3","formatDuration","durationBadge","model","inputLength","toLocaleString","outputLength","_el$16","_tmpl$4","_el$17","_el$18","_el$19","_p$","_v$","operationDetail","_v$2","operationLabel","_v$3","operationValue","e","t","a","Date","timestamp","toLocaleTimeString","_v$4","operationCard","_v$5","operationHeader","_v$6","operationIcon","_v$7","operationTitle","_v$8","operationStatus","operationStatusCompleted","operationStatusPending","_v$9","operationDetails","_v$0","_v$1","_v$10","_v$11","_v$12","_v$13","_v$14","_v$15","_v$16","o","i","n","s","h","r","d","l","u","c","w","m","messagesList"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Component } from 'solid-js';
2
+ import { ToolCall } from '../../store/ai-context.js';
3
+ interface ToolCallDisplayProps {
4
+ tool: ToolCall;
5
+ }
6
+ export declare const ToolCallDisplay: Component<ToolCallDisplayProps>;
7
+ export {};
@@ -0,0 +1,123 @@
1
+ import { template, insert, createComponent, effect, className, memo } from "solid-js/web";
2
+ import { Show } from "solid-js";
3
+ import { JsonTree } from "@tanstack/devtools-ui";
4
+ import { useStyles } from "../../styles/use-styles.js";
5
+ import { formatDuration } from "../utils/format.js";
6
+ var _tmpl$ = /* @__PURE__ */ template(`<div>⏱️ `), _tmpl$2 = /* @__PURE__ */ template(`<div>APPROVAL REQUIRED`), _tmpl$3 = /* @__PURE__ */ template(`<div><div>Arguments</div><div>`), _tmpl$4 = /* @__PURE__ */ template(`<div><div>Result</div><div>`), _tmpl$5 = /* @__PURE__ */ template(`<details><summary><div> </div><div></div></summary><div>`);
7
+ const ToolCallDisplay = (props) => {
8
+ const styles = useStyles();
9
+ const tool = () => props.tool;
10
+ const parsedArguments = () => {
11
+ const args = tool().arguments;
12
+ if (typeof args === "string") {
13
+ try {
14
+ return JSON.parse(args);
15
+ } catch {
16
+ return args;
17
+ }
18
+ }
19
+ return args;
20
+ };
21
+ return (() => {
22
+ var _el$ = _tmpl$5(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$9 = _el$2.nextSibling;
23
+ insert(_el$3, () => tool().approvalRequired ? "⚠️" : "🔧", _el$4);
24
+ insert(_el$3, () => tool().name, null);
25
+ insert(_el$5, () => tool().state);
26
+ insert(_el$2, createComponent(Show, {
27
+ get when() {
28
+ return memo(() => tool().duration !== void 0)() && tool().duration > 0;
29
+ },
30
+ get children() {
31
+ var _el$6 = _tmpl$();
32
+ _el$6.firstChild;
33
+ insert(_el$6, () => formatDuration(tool().duration), null);
34
+ effect(() => className(_el$6, styles().conversationDetails.durationBadge));
35
+ return _el$6;
36
+ }
37
+ }), null);
38
+ insert(_el$2, createComponent(Show, {
39
+ get when() {
40
+ return tool().approvalRequired;
41
+ },
42
+ get children() {
43
+ var _el$8 = _tmpl$2();
44
+ effect(() => className(_el$8, styles().conversationDetails.approvalRequiredBadge));
45
+ return _el$8;
46
+ }
47
+ }), null);
48
+ insert(_el$9, createComponent(Show, {
49
+ get when() {
50
+ return tool().arguments;
51
+ },
52
+ get children() {
53
+ var _el$0 = _tmpl$3(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling;
54
+ insert(_el$10, createComponent(JsonTree, {
55
+ get value() {
56
+ return parsedArguments();
57
+ },
58
+ defaultExpansionDepth: 2,
59
+ copyable: true
60
+ }));
61
+ effect((_p$) => {
62
+ var _v$ = styles().conversationDetails.toolSection, _v$2 = styles().conversationDetails.toolSectionLabel, _v$3 = styles().conversationDetails.toolJsonContainer;
63
+ _v$ !== _p$.e && className(_el$0, _p$.e = _v$);
64
+ _v$2 !== _p$.t && className(_el$1, _p$.t = _v$2);
65
+ _v$3 !== _p$.a && className(_el$10, _p$.a = _v$3);
66
+ return _p$;
67
+ }, {
68
+ e: void 0,
69
+ t: void 0,
70
+ a: void 0
71
+ });
72
+ return _el$0;
73
+ }
74
+ }), null);
75
+ insert(_el$9, createComponent(Show, {
76
+ get when() {
77
+ return tool().result !== void 0;
78
+ },
79
+ get children() {
80
+ var _el$11 = _tmpl$4(), _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling;
81
+ insert(_el$13, createComponent(JsonTree, {
82
+ get value() {
83
+ return tool().result;
84
+ },
85
+ defaultExpansionDepth: 2,
86
+ copyable: true
87
+ }));
88
+ effect((_p$) => {
89
+ var _v$4 = styles().conversationDetails.toolSection, _v$5 = styles().conversationDetails.toolSectionLabel, _v$6 = styles().conversationDetails.toolJsonContainer;
90
+ _v$4 !== _p$.e && className(_el$11, _p$.e = _v$4);
91
+ _v$5 !== _p$.t && className(_el$12, _p$.t = _v$5);
92
+ _v$6 !== _p$.a && className(_el$13, _p$.a = _v$6);
93
+ return _p$;
94
+ }, {
95
+ e: void 0,
96
+ t: void 0,
97
+ a: void 0
98
+ });
99
+ return _el$11;
100
+ }
101
+ }), null);
102
+ effect((_p$) => {
103
+ var _v$7 = `${styles().conversationDetails.toolCall} ${tool().approvalRequired ? styles().conversationDetails.toolCallApproval : styles().conversationDetails.toolCallNormal}`, _v$8 = styles().conversationDetails.toolCallHeader, _v$9 = `${styles().conversationDetails.toolCallName} ${tool().approvalRequired ? styles().conversationDetails.toolCallNameApproval : styles().conversationDetails.toolCallNameNormal}`, _v$0 = `${styles().conversationDetails.toolStateBadge} ${tool().approvalRequired ? styles().conversationDetails.toolStateBadgeApproval : styles().conversationDetails.toolStateBadgeNormal}`, _v$1 = styles().conversationDetails.toolCallContent;
104
+ _v$7 !== _p$.e && className(_el$, _p$.e = _v$7);
105
+ _v$8 !== _p$.t && className(_el$2, _p$.t = _v$8);
106
+ _v$9 !== _p$.a && className(_el$3, _p$.a = _v$9);
107
+ _v$0 !== _p$.o && className(_el$5, _p$.o = _v$0);
108
+ _v$1 !== _p$.i && className(_el$9, _p$.i = _v$1);
109
+ return _p$;
110
+ }, {
111
+ e: void 0,
112
+ t: void 0,
113
+ a: void 0,
114
+ o: void 0,
115
+ i: void 0
116
+ });
117
+ return _el$;
118
+ })();
119
+ };
120
+ export {
121
+ ToolCallDisplay
122
+ };
123
+ //# sourceMappingURL=ToolCallDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCallDisplay.js","sources":["../../../../src/components/conversation/ToolCallDisplay.tsx"],"sourcesContent":["import { 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 { ToolCall } from '../../store/ai-context'\n\ninterface ToolCallDisplayProps {\n tool: ToolCall\n}\n\nexport const ToolCallDisplay: Component<ToolCallDisplayProps> = (props) => {\n const styles = useStyles()\n const tool = () => props.tool\n\n // Parse arguments if they're a string\n const parsedArguments = () => {\n const args = tool().arguments\n if (typeof args === 'string') {\n try {\n return JSON.parse(args)\n } catch {\n return args\n }\n }\n return args\n }\n\n return (\n <details\n class={`${styles().conversationDetails.toolCall} ${\n tool().approvalRequired\n ? styles().conversationDetails.toolCallApproval\n : styles().conversationDetails.toolCallNormal\n }`}\n >\n <summary class={styles().conversationDetails.toolCallHeader}>\n <div\n class={`${styles().conversationDetails.toolCallName} ${\n tool().approvalRequired\n ? styles().conversationDetails.toolCallNameApproval\n : styles().conversationDetails.toolCallNameNormal\n }`}\n >\n {tool().approvalRequired ? '⚠️' : '🔧'} {tool().name}\n </div>\n <div\n class={`${styles().conversationDetails.toolStateBadge} ${\n tool().approvalRequired\n ? styles().conversationDetails.toolStateBadgeApproval\n : styles().conversationDetails.toolStateBadgeNormal\n }`}\n >\n {tool().state}\n </div>\n <Show when={tool().duration !== undefined && tool().duration! > 0}>\n <div class={styles().conversationDetails.durationBadge}>\n ⏱️ {formatDuration(tool().duration)}\n </div>\n </Show>\n <Show when={tool().approvalRequired}>\n <div class={styles().conversationDetails.approvalRequiredBadge}>\n APPROVAL REQUIRED\n </div>\n </Show>\n </summary>\n <div class={styles().conversationDetails.toolCallContent}>\n <Show when={tool().arguments}>\n <div class={styles().conversationDetails.toolSection}>\n <div class={styles().conversationDetails.toolSectionLabel}>\n Arguments\n </div>\n <div class={styles().conversationDetails.toolJsonContainer}>\n <JsonTree\n value={parsedArguments() as Record<string, unknown>}\n defaultExpansionDepth={2}\n copyable\n />\n </div>\n </div>\n </Show>\n <Show when={tool().result !== undefined}>\n <div class={styles().conversationDetails.toolSection}>\n <div class={styles().conversationDetails.toolSectionLabel}>\n Result\n </div>\n <div class={styles().conversationDetails.toolJsonContainer}>\n <JsonTree\n value={tool().result as Record<string, unknown>}\n defaultExpansionDepth={2}\n copyable\n />\n </div>\n </div>\n </Show>\n </div>\n </details>\n )\n}\n"],"names":["ToolCallDisplay","props","styles","useStyles","tool","parsedArguments","args","arguments","JSON","parse","_el$","_tmpl$5","_el$2","firstChild","_el$3","_el$4","_el$5","nextSibling","_el$9","_$insert","approvalRequired","name","state","_$createComponent","Show","when","_$memo","duration","undefined","children","_el$6","_tmpl$","formatDuration","_$effect","_$className","conversationDetails","durationBadge","_el$8","_tmpl$2","approvalRequiredBadge","_el$0","_tmpl$3","_el$1","_el$10","JsonTree","value","defaultExpansionDepth","copyable","_p$","_v$","toolSection","_v$2","toolSectionLabel","_v$3","toolJsonContainer","e","t","a","result","_el$11","_tmpl$4","_el$12","_el$13","_v$4","_v$5","_v$6","_v$7","toolCall","toolCallApproval","toolCallNormal","_v$8","toolCallHeader","_v$9","toolCallName","toolCallNameApproval","toolCallNameNormal","_v$0","toolStateBadge","toolStateBadgeApproval","toolStateBadgeNormal","_v$1","toolCallContent","o","i"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { ConversationHeader } from './ConversationHeader.js';
2
+ export { ConversationTabs } from './ConversationTabs.js';
3
+ export type { TabType } from './ConversationTabs.js';
4
+ export { MessagesTab } from './MessagesTab.js';
5
+ export { ChunksTab } from './ChunksTab.js';
6
+ export { EmbeddingsTab } from './EmbeddingsTab.js';
7
+ export { SummariesTab } from './SummariesTab.js';
@@ -0,0 +1,7 @@
1
+ import { Conversation } from '../../store/ai-context.js';
2
+ import { Component } from 'solid-js';
3
+ interface ConversationRowProps {
4
+ conversation: Conversation;
5
+ }
6
+ export declare const ConversationRow: Component<ConversationRowProps>;
7
+ export {};