@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Tanner Linsley
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ <div align="center">
2
+ <img src="./media/header_ai.png" >
3
+ </div>
4
+
5
+ <br />
6
+
7
+ <div align="center">
8
+ <a href="https://npmjs.com/package/@tanstack/ai" target="\_parent">
9
+ <img alt="" src="https://img.shields.io/npm/dm/@tanstack/ai.svg" />
10
+ </a>
11
+ <a href="https://github.com/TanStack/ai" target="\_parent">
12
+ <img alt="" src="https://img.shields.io/github/stars/TanStack/ai.svg?style=social&label=Star" alt="GitHub stars" />
13
+ </a>
14
+ <a href="https://bundlephobia.com/result?p=@tanstack/ai@latest" target="\_parent">
15
+ <img alt="" src="https://badgen.net/bundlephobia/minzip/@tanstack/ai@latest" />
16
+ </a>
17
+ </div>
18
+
19
+ <div align="center">
20
+ <a href="#badge">
21
+ <img alt="semantic-release" src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg">
22
+ </a>
23
+ <a href="#badge">
24
+ <img src="https://img.shields.io/github/v/release/tanstack/ai" alt="Release"/>
25
+ </a>
26
+ <a href="https://twitter.com/tan_stack">
27
+ <img src="https://img.shields.io/twitter/follow/tan_stack.svg?style=social" alt="Follow @TanStack"/>
28
+ </a>
29
+ </div>
30
+
31
+ <div align="center">
32
+
33
+ ### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/)
34
+ </div>
35
+
36
+ # TanStack AI
37
+
38
+ A powerful, type-safe AI SDK for building AI-powered applications.
39
+
40
+ - Provider-agnostic adapters (OpenAI, Anthropic, Gemini, Ollama, etc.)
41
+ - **Multimodal content support** - Send images, audio, video, and documents
42
+ - Chat completion, streaming, and agent loop strategies
43
+ - Headless chat state management with adapters (SSE, HTTP stream, custom)
44
+ - Isomorphic type-safe tools with server/client execution
45
+ - **Enhanced integration with TanStack Start** - Share implementations between AI tools and server functions
46
+
47
+ ### <a href="https://tanstack.com/ai">Read the docs →</b></a>
48
+
49
+ ## Bonus: TanStack Start Integration
50
+
51
+ TanStack AI works with **any** framework (Next.js, Express, Remix, etc.).
52
+
53
+ **With TanStack Start**, you get a bonus: share implementations between AI tools and server functions with `createServerFnTool`:
54
+
55
+ ```typescript
56
+ import { createServerFnTool } from '@tanstack/ai-react'
57
+
58
+ // Define once, get AI tool AND server function (TanStack Start only)
59
+ const getProducts = createServerFnTool({
60
+ name: 'getProducts',
61
+ inputSchema: z.object({ query: z.string() }),
62
+ execute: async ({ query }) => db.products.search(query),
63
+ })
64
+
65
+ // Use in AI chat
66
+ chat({ tools: [getProducts.server] })
67
+
68
+ // Call directly from components (no API endpoint needed!)
69
+ const products = await getProducts.serverFn({ query: 'laptop' })
70
+ ```
71
+
72
+ No duplicate logic, full type safety, automatic validation. The `serverFn` feature requires TanStack Start. See [docs](https://tanstack.com/ai) for details.
73
+
74
+ ## Get Involved
75
+
76
+ - We welcome issues and pull requests!
77
+ - Participate in [GitHub discussions](https://github.com/TanStack/ai/discussions)
78
+ - Chat with the community on [Discord](https://discord.com/invite/WrRKjPJ)
79
+ - See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions
80
+
81
+ ## Partners
82
+
83
+ <table align="center">
84
+ <tr>
85
+ <td>
86
+ <a href="https://www.coderabbit.ai/?via=tanstack&dub_id=aCcEEdAOqqutX6OS" >
87
+ <picture>
88
+ <source media="(prefers-color-scheme: dark)" srcset="https://tanstack.com/assets/coderabbit-dark-CMcuvjEy.svg" height="40" />
89
+ <source media="(prefers-color-scheme: light)" srcset="https://tanstack.com/assets/coderabbit-light-DVMJ2jHi.svg" height="40" />
90
+ <img src="https://tanstack.com/assets/coderabbit-light-DVMJ2jHi.svg" height="40" alt="CodeRabbit" />
91
+ </picture>
92
+ </a>
93
+ </td>
94
+ <td>
95
+ <a href="https://www.cloudflare.com?utm_source=tanstack">
96
+ <picture>
97
+ <source media="(prefers-color-scheme: dark)" srcset="https://tanstack.com/assets/cloudflare-white-DQDB7UaL.svg" height="60" />
98
+ <source media="(prefers-color-scheme: light)" srcset="https://tanstack.com/assets/cloudflare-black-CPufaW0B.svg" height="60" />
99
+ <img src="https://tanstack.com/assets/cloudflare-black-CPufaW0B.svg" height="60" alt="Cloudflare" />
100
+ </picture>
101
+ </a>
102
+ </td>
103
+ </tr>
104
+ </table>
105
+
106
+ <div align="center">
107
+ <img src="./media/partner_logo.svg" alt="AI & you?" height="65">
108
+ <p>
109
+ We're looking for TanStack AI Partners to join our mission! Partner with us to push the boundaries of TanStack AI and build amazing things together.
110
+ </p>
111
+ <a href="mailto:partners@tanstack.com?subject=TanStack AI Partnership"><b>LET'S CHAT</b></a>
112
+ </div>
113
+
114
+ ## Explore the TanStack Ecosystem
115
+
116
+ - <a href="https://github.com/tanstack/config"><b>TanStack Config</b></a> – Tooling for JS/TS packages
117
+ - <a href="https://github.com/tanstack/db"><b>TanStack DB</b></a> – Reactive sync client store
118
+ - <a href="https://github.com/tanstack/devtools">TanStack Devtools</a> – Unified devtools panel
119
+ - <a href="https://github.com/tanstack/form"><b>TanStack Form</b></a> – Type‑safe form state
120
+ - <a href="https://github.com/tanstack/pacer"><b>TanStack Pacer</b></a> – Debouncing, throttling, batching
121
+ - <a href="https://github.com/tanstack/query"><b>TanStack Query</b></a> – Async state & caching
122
+ - <a href="https://github.com/tanstack/ranger"><b>TanStack Ranger</b></a> – Range & slider primitives
123
+ - <a href="https://github.com/tanstack/router"><b>TanStack Router</b></a> – Type‑safe routing, caching & URL state
124
+ - <a href="https://github.com/tanstack/router"><b>TanStack Start</b></a> – Full‑stack SSR & streaming
125
+ - <a href="https://github.com/tanstack/store"><b>TanStack Store</b></a> – Reactive data store
126
+ - <a href="https://github.com/tanstack/table"><b>TanStack Table</b></a> – Headless datagrids
127
+ - <a href="https://github.com/tanstack/virtual"><b>TanStack Virtual</b></a> – Virtualized rendering
128
+
129
+ … and more at <a href="https://tanstack.com"><b>TanStack.com »</b></a>
130
+
131
+ <!-- USE THE FORCE LUKE -->
@@ -0,0 +1,2 @@
1
+ import { Component } from 'solid-js';
2
+ export declare const ConversationDetails: Component;
@@ -0,0 +1,134 @@
1
+ import { createComponent, template, insert, effect, className } from "solid-js/web";
2
+ import { createSignal, createEffect, Show } from "solid-js";
3
+ import { useStyles } from "../styles/use-styles.js";
4
+ import { useAIStore } from "../store/ai-context.js";
5
+ import { ConversationHeader } from "./conversation/ConversationHeader.js";
6
+ import { ConversationTabs } from "./conversation/ConversationTabs.js";
7
+ import { MessagesTab } from "./conversation/MessagesTab.js";
8
+ import { ChunksTab } from "./conversation/ChunksTab.js";
9
+ import { EmbeddingsTab } from "./conversation/EmbeddingsTab.js";
10
+ import { SummariesTab } from "./conversation/SummariesTab.js";
11
+ var _tmpl$ = /* @__PURE__ */ template(`<div>Select a conversation to view details`), _tmpl$2 = /* @__PURE__ */ template(`<div><div>`);
12
+ const ConversationDetails = () => {
13
+ const {
14
+ state
15
+ } = useAIStore();
16
+ const styles = useStyles();
17
+ const [activeTab, setActiveTab] = createSignal("messages");
18
+ const activeConversation = () => {
19
+ if (!state.activeConversationId) return void 0;
20
+ return state.conversations[state.activeConversationId];
21
+ };
22
+ createEffect(() => {
23
+ const conv = activeConversation();
24
+ if (conv) {
25
+ if (conv.type === "server") {
26
+ if (conv.chunks.length > 0) {
27
+ setActiveTab("chunks");
28
+ } else if (conv.hasEmbedding || conv.embeddings && conv.embeddings.length > 0) {
29
+ setActiveTab("embeddings");
30
+ } else if (conv.hasSummarize || conv.summaries && conv.summaries.length > 0) {
31
+ setActiveTab("summaries");
32
+ } else {
33
+ setActiveTab("chunks");
34
+ }
35
+ } else {
36
+ setActiveTab("messages");
37
+ }
38
+ }
39
+ });
40
+ return createComponent(Show, {
41
+ get when() {
42
+ return activeConversation();
43
+ },
44
+ get fallback() {
45
+ return (() => {
46
+ var _el$ = _tmpl$();
47
+ effect(() => className(_el$, styles().conversationDetails.emptyState));
48
+ return _el$;
49
+ })();
50
+ },
51
+ children: (conv) => (() => {
52
+ var _el$2 = _tmpl$2(), _el$3 = _el$2.firstChild;
53
+ insert(_el$2, createComponent(ConversationHeader, {
54
+ get conversation() {
55
+ return conv();
56
+ }
57
+ }), _el$3);
58
+ insert(_el$2, createComponent(ConversationTabs, {
59
+ get conversation() {
60
+ return conv();
61
+ },
62
+ get activeTab() {
63
+ return activeTab();
64
+ },
65
+ onTabChange: setActiveTab
66
+ }), _el$3);
67
+ insert(_el$3, createComponent(Show, {
68
+ get when() {
69
+ return activeTab() === "messages";
70
+ },
71
+ get children() {
72
+ return createComponent(MessagesTab, {
73
+ get messages() {
74
+ return conv().messages;
75
+ }
76
+ });
77
+ }
78
+ }), null);
79
+ insert(_el$3, createComponent(Show, {
80
+ get when() {
81
+ return activeTab() === "chunks";
82
+ },
83
+ get children() {
84
+ return createComponent(ChunksTab, {
85
+ get chunks() {
86
+ return conv().chunks;
87
+ },
88
+ get messages() {
89
+ return conv().messages;
90
+ }
91
+ });
92
+ }
93
+ }), null);
94
+ insert(_el$3, createComponent(Show, {
95
+ get when() {
96
+ return activeTab() === "embeddings";
97
+ },
98
+ get children() {
99
+ return createComponent(EmbeddingsTab, {
100
+ get embeddings() {
101
+ return conv().embeddings ?? [];
102
+ }
103
+ });
104
+ }
105
+ }), null);
106
+ insert(_el$3, createComponent(Show, {
107
+ get when() {
108
+ return activeTab() === "summaries";
109
+ },
110
+ get children() {
111
+ return createComponent(SummariesTab, {
112
+ get summaries() {
113
+ return conv().summaries ?? [];
114
+ }
115
+ });
116
+ }
117
+ }), null);
118
+ effect((_p$) => {
119
+ var _v$ = styles().conversationDetails.container, _v$2 = styles().conversationDetails.contentArea;
120
+ _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
121
+ _v$2 !== _p$.t && className(_el$3, _p$.t = _v$2);
122
+ return _p$;
123
+ }, {
124
+ e: void 0,
125
+ t: void 0
126
+ });
127
+ return _el$2;
128
+ })()
129
+ });
130
+ };
131
+ export {
132
+ ConversationDetails
133
+ };
134
+ //# sourceMappingURL=ConversationDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationDetails.js","sources":["../../../src/components/ConversationDetails.tsx"],"sourcesContent":["import { Show, createEffect, createSignal } from 'solid-js'\nimport { useStyles } from '../styles/use-styles'\nimport { useAIStore } from '../store/ai-context'\nimport {\n ChunksTab,\n ConversationHeader,\n ConversationTabs,\n EmbeddingsTab,\n MessagesTab,\n SummariesTab,\n} from './conversation'\nimport type { TabType } from './conversation'\nimport type { Conversation } from '../store/ai-context'\nimport type { Component } from 'solid-js'\n\nexport const ConversationDetails: Component = () => {\n const { state } = useAIStore()\n const styles = useStyles()\n const [activeTab, setActiveTab] = createSignal<TabType>('messages')\n\n const activeConversation = (): Conversation | undefined => {\n if (!state.activeConversationId) return undefined\n return state.conversations[state.activeConversationId]\n }\n\n // Update active tab when conversation changes\n createEffect(() => {\n const conv = activeConversation()\n if (conv) {\n // For server conversations, always use chunks (messages tab is hidden)\n if (conv.type === 'server') {\n if (conv.chunks.length > 0) {\n setActiveTab('chunks')\n } else if (\n conv.hasEmbedding ||\n (conv.embeddings && conv.embeddings.length > 0)\n ) {\n setActiveTab('embeddings')\n } else if (\n conv.hasSummarize ||\n (conv.summaries && conv.summaries.length > 0)\n ) {\n setActiveTab('summaries')\n } else {\n setActiveTab('chunks')\n }\n } else {\n // For client conversations, default to messages tab\n setActiveTab('messages')\n }\n }\n })\n\n return (\n <Show\n when={activeConversation()}\n fallback={\n <div class={styles().conversationDetails.emptyState}>\n Select a conversation to view details\n </div>\n }\n >\n {(conv) => (\n <div class={styles().conversationDetails.container}>\n <ConversationHeader conversation={conv()} />\n <ConversationTabs\n conversation={conv()}\n activeTab={activeTab()}\n onTabChange={setActiveTab}\n />\n <div class={styles().conversationDetails.contentArea}>\n <Show when={activeTab() === 'messages'}>\n <MessagesTab messages={conv().messages} />\n </Show>\n <Show when={activeTab() === 'chunks'}>\n <ChunksTab chunks={conv().chunks} messages={conv().messages} />\n </Show>\n <Show when={activeTab() === 'embeddings'}>\n <EmbeddingsTab embeddings={conv().embeddings ?? []} />\n </Show>\n <Show when={activeTab() === 'summaries'}>\n <SummariesTab summaries={conv().summaries ?? []} />\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["ConversationDetails","state","useAIStore","styles","useStyles","activeTab","setActiveTab","createSignal","activeConversation","activeConversationId","undefined","conversations","createEffect","conv","type","chunks","length","hasEmbedding","embeddings","hasSummarize","summaries","_$createComponent","Show","when","fallback","_el$","_tmpl$","_$effect","_$className","conversationDetails","emptyState","children","_el$2","_tmpl$2","_el$3","firstChild","_$insert","ConversationHeader","conversation","ConversationTabs","onTabChange","MessagesTab","messages","ChunksTab","EmbeddingsTab","SummariesTab","_p$","_v$","container","_v$2","contentArea","e","t"],"mappings":";;;;;;;;;;;AAeO,MAAMA,sBAAiCA,MAAM;AAClD,QAAM;AAAA,IAAEC;AAAAA,EAAAA,IAAUC,WAAAA;AAClB,QAAMC,SAASC,UAAAA;AACf,QAAM,CAACC,WAAWC,YAAY,IAAIC,aAAsB,UAAU;AAElE,QAAMC,qBAAqBA,MAAgC;AACzD,QAAI,CAACP,MAAMQ,qBAAsB,QAAOC;AACxC,WAAOT,MAAMU,cAAcV,MAAMQ,oBAAoB;AAAA,EACvD;AAGAG,eAAa,MAAM;AACjB,UAAMC,OAAOL,mBAAAA;AACb,QAAIK,MAAM;AAER,UAAIA,KAAKC,SAAS,UAAU;AAC1B,YAAID,KAAKE,OAAOC,SAAS,GAAG;AAC1BV,uBAAa,QAAQ;AAAA,QACvB,WACEO,KAAKI,gBACJJ,KAAKK,cAAcL,KAAKK,WAAWF,SAAS,GAC7C;AACAV,uBAAa,YAAY;AAAA,QAC3B,WACEO,KAAKM,gBACJN,KAAKO,aAAaP,KAAKO,UAAUJ,SAAS,GAC3C;AACAV,uBAAa,WAAW;AAAA,QAC1B,OAAO;AACLA,uBAAa,QAAQ;AAAA,QACvB;AAAA,MACF,OAAO;AAELA,qBAAa,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAAe,gBACGC,MAAI;AAAA,IAAA,IACHC,OAAI;AAAA,aAAEf,mBAAAA;AAAAA,IAAoB;AAAA,IAAA,IAC1BgB,WAAQ;AAAA,cAAA,MAAA;AAAA,YAAAC,OAAAC,OAAAA;AAAAC,eAAA,MAAAC,UAAAH,MACMtB,SAAS0B,oBAAoBC,UAAU,CAAA;AAAA,eAAAL;AAAAA,MAAA,GAAA;AAAA,IAAA;AAAA,IAAAM,UAKnDlB,WAAI,MAAA;AAAA,UAAAmB,QAAAC,QAAAA,GAAAC,QAAAF,MAAAG;AAAAC,aAAAJ,OAAAX,gBAEDgB,oBAAkB;AAAA,QAAA,IAACC,eAAY;AAAA,iBAAEzB,KAAAA;AAAAA,QAAM;AAAA,MAAA,CAAA,GAAAqB,KAAA;AAAAE,aAAAJ,OAAAX,gBACvCkB,kBAAgB;AAAA,QAAA,IACfD,eAAY;AAAA,iBAAEzB,KAAAA;AAAAA,QAAM;AAAA,QAAA,IACpBR,YAAS;AAAA,iBAAEA,UAAAA;AAAAA,QAAW;AAAA,QACtBmC,aAAalC;AAAAA,MAAAA,CAAY,GAAA4B,KAAA;AAAAE,aAAAF,OAAAb,gBAGxBC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAElB,gBAAgB;AAAA,QAAU;AAAA,QAAA,IAAA0B,WAAA;AAAA,iBAAAV,gBACnCoB,aAAW;AAAA,YAAA,IAACC,WAAQ;AAAA,qBAAE7B,OAAO6B;AAAAA,YAAQ;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,GAAA,IAAA;AAAAN,aAAAF,OAAAb,gBAEvCC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAElB,gBAAgB;AAAA,QAAQ;AAAA,QAAA,IAAA0B,WAAA;AAAA,iBAAAV,gBACjCsB,WAAS;AAAA,YAAA,IAAC5B,SAAM;AAAA,qBAAEF,OAAOE;AAAAA,YAAM;AAAA,YAAA,IAAE2B,WAAQ;AAAA,qBAAE7B,OAAO6B;AAAAA,YAAQ;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,GAAA,IAAA;AAAAN,aAAAF,OAAAb,gBAE5DC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAElB,gBAAgB;AAAA,QAAY;AAAA,QAAA,IAAA0B,WAAA;AAAA,iBAAAV,gBACrCuB,eAAa;AAAA,YAAA,IAAC1B,aAAU;AAAA,qBAAEL,KAAAA,EAAOK,cAAc,CAAA;AAAA,YAAE;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,GAAA,IAAA;AAAAkB,aAAAF,OAAAb,gBAEnDC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAElB,gBAAgB;AAAA,QAAW;AAAA,QAAA,IAAA0B,WAAA;AAAA,iBAAAV,gBACpCwB,cAAY;AAAA,YAAA,IAACzB,YAAS;AAAA,qBAAEP,KAAAA,EAAOO,aAAa,CAAA;AAAA,YAAE;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,GAAA,IAAA;AAAAO,aAAAmB,CAAAA,QAAA;AAAA,YAAAC,MAlBzC5C,SAAS0B,oBAAoBmB,WAASC,OAOpC9C,SAAS0B,oBAAoBqB;AAAWH,gBAAAD,IAAAK,KAAAvB,UAAAI,OAAAc,IAAAK,IAAAJ,GAAA;AAAAE,iBAAAH,IAAAM,KAAAxB,UAAAM,OAAAY,IAAAM,IAAAH,IAAA;AAAA,eAAAH;AAAAA,MAAA,GAAA;AAAA,QAAAK,GAAAzC;AAAAA,QAAA0C,GAAA1C;AAAAA,MAAAA,CAAA;AAAA,aAAAsB;AAAAA,IAAA,GAAA;AAAA,EAAA,CAevD;AAGP;"}
@@ -0,0 +1,2 @@
1
+ import { Component } from 'solid-js';
2
+ export declare const ConversationsList: Component;
@@ -0,0 +1,30 @@
1
+ import { template, insert, createComponent, effect, className } from "solid-js/web";
2
+ import { For } from "solid-js";
3
+ import { useStyles } from "../styles/use-styles.js";
4
+ import { useAIStore } from "../store/ai-context.js";
5
+ import { ConversationRow } from "./list/ConversationRow.js";
6
+ var _tmpl$ = /* @__PURE__ */ template(`<div>`);
7
+ const ConversationsList = () => {
8
+ const {
9
+ state
10
+ } = useAIStore();
11
+ const styles = useStyles();
12
+ const conversations = () => Object.values(state.conversations);
13
+ return (() => {
14
+ var _el$ = _tmpl$();
15
+ insert(_el$, createComponent(For, {
16
+ get each() {
17
+ return conversations();
18
+ },
19
+ children: (conv) => createComponent(ConversationRow, {
20
+ conversation: conv
21
+ })
22
+ }));
23
+ effect(() => className(_el$, styles().utilList));
24
+ return _el$;
25
+ })();
26
+ };
27
+ export {
28
+ ConversationsList
29
+ };
30
+ //# sourceMappingURL=ConversationsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationsList.js","sources":["../../../src/components/ConversationsList.tsx"],"sourcesContent":["import { For } from 'solid-js'\nimport { useStyles } from '../styles/use-styles'\nimport { useAIStore } from '../store/ai-context'\nimport { ConversationRow } from './list'\nimport type { Conversation } from '../store/ai-context'\nimport type { Component } from 'solid-js'\n\nexport const ConversationsList: Component = () => {\n const { state } = useAIStore()\n const styles = useStyles()\n\n const conversations = () => Object.values(state.conversations)\n\n return (\n <div class={styles().utilList}>\n <For each={conversations()}>\n {(conv: Conversation) => <ConversationRow conversation={conv} />}\n </For>\n </div>\n )\n}\n"],"names":["ConversationsList","state","useAIStore","styles","useStyles","conversations","Object","values","_el$","_tmpl$","_$insert","_$createComponent","For","each","children","conv","ConversationRow","conversation","_$effect","_$className","utilList"],"mappings":";;;;;;AAOO,MAAMA,oBAA+BA,MAAM;AAChD,QAAM;AAAA,IAAEC;AAAAA,EAAAA,IAAUC,WAAAA;AAClB,QAAMC,SAASC,UAAAA;AAEf,QAAMC,gBAAgBA,MAAMC,OAAOC,OAAON,MAAMI,aAAa;AAE7D,UAAA,MAAA;AAAA,QAAAG,OAAAC,OAAAA;AAAAC,WAAAF,MAAAG,gBAEKC,KAAG;AAAA,MAAA,IAACC,OAAI;AAAA,eAAER,cAAAA;AAAAA,MAAe;AAAA,MAAAS,UACvBA,CAACC,SAAkBJ,gBAAMK,iBAAe;AAAA,QAACC,cAAcF;AAAAA,MAAAA,CAAI;AAAA,IAAA,CAAI,CAAA;AAAAG,WAAA,MAAAC,UAAAX,MAFxDL,OAAAA,EAASiB,QAAQ,CAAA;AAAA,WAAAZ;AAAAA,EAAA,GAAA;AAMjC;"}
@@ -0,0 +1 @@
1
+ export default function Devtools(): import("solid-js").JSX.Element;
@@ -0,0 +1,94 @@
1
+ import { createComponent, template, insert, effect, className, setStyleProperty, delegateEvents } from "solid-js/web";
2
+ import { createSignal, onMount, onCleanup } from "solid-js";
3
+ import { MainPanel, Header, HeaderLogo } from "@tanstack/devtools-ui";
4
+ import { useStyles } from "../styles/use-styles.js";
5
+ import { AIProvider } from "../store/ai-context.js";
6
+ import { ConversationsList } from "./ConversationsList.js";
7
+ import { ConversationDetails } from "./ConversationDetails.js";
8
+ var _tmpl$ = /* @__PURE__ */ template(`<div><div style=min-width:150px;max-width:800px><div>Active Conversations</div></div><div></div><div style=flex:1>`);
9
+ function Devtools() {
10
+ return createComponent(AIProvider, {
11
+ get children() {
12
+ return createComponent(DevtoolsContent, {});
13
+ }
14
+ });
15
+ }
16
+ function DevtoolsContent() {
17
+ const styles = useStyles();
18
+ const [leftPanelWidth, setLeftPanelWidth] = createSignal(300);
19
+ const [isDragging, setIsDragging] = createSignal(false);
20
+ let dragStartX = 0;
21
+ let dragStartWidth = 0;
22
+ const handleMouseDown = (e) => {
23
+ e.preventDefault();
24
+ e.stopPropagation();
25
+ setIsDragging(true);
26
+ document.body.style.cursor = "col-resize";
27
+ document.body.style.userSelect = "none";
28
+ dragStartX = e.clientX;
29
+ dragStartWidth = leftPanelWidth();
30
+ };
31
+ const handleMouseMove = (e) => {
32
+ if (!isDragging()) return;
33
+ e.preventDefault();
34
+ const deltaX = e.clientX - dragStartX;
35
+ const newWidth = Math.max(150, Math.min(800, dragStartWidth + deltaX));
36
+ setLeftPanelWidth(newWidth);
37
+ };
38
+ const handleMouseUp = () => {
39
+ setIsDragging(false);
40
+ document.body.style.cursor = "";
41
+ document.body.style.userSelect = "";
42
+ };
43
+ onMount(() => {
44
+ document.addEventListener("mousemove", handleMouseMove);
45
+ document.addEventListener("mouseup", handleMouseUp);
46
+ });
47
+ onCleanup(() => {
48
+ document.removeEventListener("mousemove", handleMouseMove);
49
+ document.removeEventListener("mouseup", handleMouseUp);
50
+ });
51
+ return createComponent(MainPanel, {
52
+ get children() {
53
+ return [createComponent(Header, {
54
+ get children() {
55
+ return createComponent(HeaderLogo, {
56
+ flavor: {
57
+ light: "#ec4899",
58
+ dark: "#ec4899"
59
+ },
60
+ children: "TanStack AI"
61
+ });
62
+ }
63
+ }), (() => {
64
+ var _el$ = _tmpl$(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$2.nextSibling, _el$5 = _el$4.nextSibling;
65
+ insert(_el$2, createComponent(ConversationsList, {}), null);
66
+ _el$4.$$mousedown = handleMouseDown;
67
+ insert(_el$5, createComponent(ConversationDetails, {}));
68
+ effect((_p$) => {
69
+ var _v$ = styles().mainContainer, _v$2 = styles().leftPanel, _v$3 = `${leftPanelWidth()}px`, _v$4 = styles().shell.sectionHeader, _v$5 = `${styles().dragHandle} ${isDragging() ? "dragging" : ""}`, _v$6 = styles().rightPanel;
70
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
71
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
72
+ _v$3 !== _p$.a && setStyleProperty(_el$2, "width", _p$.a = _v$3);
73
+ _v$4 !== _p$.o && className(_el$3, _p$.o = _v$4);
74
+ _v$5 !== _p$.i && className(_el$4, _p$.i = _v$5);
75
+ _v$6 !== _p$.n && className(_el$5, _p$.n = _v$6);
76
+ return _p$;
77
+ }, {
78
+ e: void 0,
79
+ t: void 0,
80
+ a: void 0,
81
+ o: void 0,
82
+ i: void 0,
83
+ n: void 0
84
+ });
85
+ return _el$;
86
+ })()];
87
+ }
88
+ });
89
+ }
90
+ delegateEvents(["mousedown"]);
91
+ export {
92
+ Devtools as default
93
+ };
94
+ //# sourceMappingURL=Shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shell.js","sources":["../../../src/components/Shell.tsx"],"sourcesContent":["import { createSignal, onCleanup, onMount } from 'solid-js'\nimport { Header, HeaderLogo, MainPanel } from '@tanstack/devtools-ui'\nimport { useStyles } from '../styles/use-styles'\nimport { AIProvider } from '../store/ai-context'\nimport { ConversationsList } from './ConversationsList'\nimport { ConversationDetails } from './ConversationDetails'\n\nexport default function Devtools() {\n return (\n <AIProvider>\n <DevtoolsContent />\n </AIProvider>\n )\n}\n\nfunction DevtoolsContent() {\n const styles = useStyles()\n const [leftPanelWidth, setLeftPanelWidth] = createSignal(300)\n const [isDragging, setIsDragging] = createSignal(false)\n\n let dragStartX = 0\n let dragStartWidth = 0\n\n const handleMouseDown = (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(true)\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n dragStartX = e.clientX\n dragStartWidth = leftPanelWidth()\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging()) return\n\n e.preventDefault()\n const deltaX = e.clientX - dragStartX\n const newWidth = Math.max(150, Math.min(800, dragStartWidth + deltaX))\n setLeftPanelWidth(newWidth)\n }\n\n const handleMouseUp = () => {\n setIsDragging(false)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n onMount(() => {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n })\n\n onCleanup(() => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n })\n\n return (\n <MainPanel>\n <Header>\n <HeaderLogo flavor={{ light: '#ec4899', dark: '#ec4899' }}>\n TanStack AI\n </HeaderLogo>\n </Header>\n\n <div class={styles().mainContainer}>\n <div\n class={styles().leftPanel}\n style={{\n width: `${leftPanelWidth()}px`,\n 'min-width': '150px',\n 'max-width': '800px',\n }}\n >\n {/* Section header */}\n <div class={styles().shell.sectionHeader}>Active Conversations</div>\n\n <ConversationsList />\n </div>\n\n <div\n class={`${styles().dragHandle} ${isDragging() ? 'dragging' : ''}`}\n onMouseDown={handleMouseDown}\n />\n\n <div class={styles().rightPanel} style={{ flex: 1 }}>\n <ConversationDetails />\n </div>\n </div>\n </MainPanel>\n )\n}\n"],"names":["Devtools","_$createComponent","AIProvider","children","DevtoolsContent","styles","useStyles","leftPanelWidth","setLeftPanelWidth","createSignal","isDragging","setIsDragging","dragStartX","dragStartWidth","handleMouseDown","e","preventDefault","stopPropagation","document","body","style","cursor","userSelect","clientX","handleMouseMove","deltaX","newWidth","Math","max","min","handleMouseUp","onMount","addEventListener","onCleanup","removeEventListener","MainPanel","Header","HeaderLogo","flavor","light","dark","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_$insert","ConversationsList","$$mousedown","ConversationDetails","_$effect","_p$","_v$","mainContainer","_v$2","leftPanel","_v$3","_v$4","shell","sectionHeader","_v$5","dragHandle","_v$6","rightPanel","_$className","t","a","_$setStyleProperty","o","i","n","undefined","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Component } from 'solid-js';
2
+ import { Chunk } from '../../store/ai-store.js';
3
+ interface ChunkBadgesProps {
4
+ chunks: Array<Chunk>;
5
+ }
6
+ export declare const ChunkBadges: Component<ChunkBadgesProps>;
7
+ export {};
@@ -0,0 +1,54 @@
1
+ import { createComponent, template, effect, className, insert } from "solid-js/web";
2
+ import { Show } from "solid-js";
3
+ import { useStyles } from "../../styles/use-styles.js";
4
+ var _tmpl$ = /* @__PURE__ */ template(`<span>🔧 Tool Calls`), _tmpl$2 = /* @__PURE__ */ template(`<span>❌ Error`), _tmpl$3 = /* @__PURE__ */ template(`<span>⚠️ Approval`), _tmpl$4 = /* @__PURE__ */ template(`<span>✓ `);
5
+ const ChunkBadges = (props) => {
6
+ const styles = useStyles();
7
+ const hasToolCalls = () => props.chunks.some((c) => c.type === "tool_call");
8
+ const hasErrors = () => props.chunks.some((c) => c.type === "error");
9
+ const hasApproval = () => props.chunks.some((c) => c.type === "approval");
10
+ const finishReason = () => props.chunks.find((c) => c.type === "done")?.finishReason;
11
+ return [createComponent(Show, {
12
+ get when() {
13
+ return hasToolCalls();
14
+ },
15
+ get children() {
16
+ var _el$ = _tmpl$();
17
+ effect(() => className(_el$, `${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeTool}`));
18
+ return _el$;
19
+ }
20
+ }), createComponent(Show, {
21
+ get when() {
22
+ return hasErrors();
23
+ },
24
+ get children() {
25
+ var _el$2 = _tmpl$2();
26
+ effect(() => className(_el$2, `${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeError}`));
27
+ return _el$2;
28
+ }
29
+ }), createComponent(Show, {
30
+ get when() {
31
+ return hasApproval();
32
+ },
33
+ get children() {
34
+ var _el$3 = _tmpl$3();
35
+ effect(() => className(_el$3, `${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeApproval}`));
36
+ return _el$3;
37
+ }
38
+ }), createComponent(Show, {
39
+ get when() {
40
+ return finishReason();
41
+ },
42
+ get children() {
43
+ var _el$4 = _tmpl$4();
44
+ _el$4.firstChild;
45
+ insert(_el$4, finishReason, null);
46
+ effect(() => className(_el$4, `${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeSuccess}`));
47
+ return _el$4;
48
+ }
49
+ })];
50
+ };
51
+ export {
52
+ ChunkBadges
53
+ };
54
+ //# sourceMappingURL=ChunkBadges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkBadges.js","sources":["../../../../src/components/conversation/ChunkBadges.tsx"],"sourcesContent":["import { Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport type { Component } from 'solid-js'\nimport type { Chunk } from '../../store/ai-store'\n\ninterface ChunkBadgesProps {\n chunks: Array<Chunk>\n}\n\nexport const ChunkBadges: Component<ChunkBadgesProps> = (props) => {\n const styles = useStyles()\n\n const hasToolCalls = () => props.chunks.some((c) => c.type === 'tool_call')\n const hasErrors = () => props.chunks.some((c) => c.type === 'error')\n const hasApproval = () => props.chunks.some((c) => c.type === 'approval')\n const finishReason = () =>\n props.chunks.find((c) => c.type === 'done')?.finishReason\n\n return (\n <>\n <Show when={hasToolCalls()}>\n <span\n class={`${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeTool}`}\n >\n 🔧 Tool Calls\n </span>\n </Show>\n <Show when={hasErrors()}>\n <span\n class={`${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeError}`}\n >\n ❌ Error\n </span>\n </Show>\n <Show when={hasApproval()}>\n <span\n class={`${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeApproval}`}\n >\n ⚠️ Approval\n </span>\n </Show>\n <Show when={finishReason()}>\n <span\n class={`${styles().conversationDetails.chunkBadge} ${styles().conversationDetails.chunkBadgeSuccess}`}\n >\n ✓ {finishReason()}\n </span>\n </Show>\n </>\n )\n}\n"],"names":["ChunkBadges","props","styles","useStyles","hasToolCalls","chunks","some","c","type","hasErrors","hasApproval","finishReason","find","_$createComponent","Show","when","children","_el$","_tmpl$","_$effect","_$className","conversationDetails","chunkBadge","chunkBadgeTool","_el$2","_tmpl$2","chunkBadgeError","_el$3","_tmpl$3","chunkBadgeApproval","_el$4","_tmpl$4","firstChild","_$insert","chunkBadgeSuccess"],"mappings":";;;;AASO,MAAMA,cAA4CC,CAAAA,UAAU;AACjE,QAAMC,SAASC,UAAAA;AAEf,QAAMC,eAAeA,MAAMH,MAAMI,OAAOC,KAAMC,CAAAA,MAAMA,EAAEC,SAAS,WAAW;AAC1E,QAAMC,YAAYA,MAAMR,MAAMI,OAAOC,KAAMC,CAAAA,MAAMA,EAAEC,SAAS,OAAO;AACnE,QAAME,cAAcA,MAAMT,MAAMI,OAAOC,KAAMC,CAAAA,MAAMA,EAAEC,SAAS,UAAU;AACxE,QAAMG,eAAeA,MACnBV,MAAMI,OAAOO,KAAML,CAAAA,MAAMA,EAAEC,SAAS,MAAM,GAAGG;AAE/C,SAAA,CAAAE,gBAEKC,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAEX,aAAAA;AAAAA,IAAc;AAAA,IAAA,IAAAY,WAAA;AAAA,UAAAC,OAAAC,OAAAA;AAAAC,aAAA,MAAAC,UAAAH,MAEf,GAAGf,SAASmB,oBAAoBC,UAAU,IAAIpB,OAAAA,EAASmB,oBAAoBE,cAAc,EAAE,CAAA;AAAA,aAAAN;AAAAA,IAAA;AAAA,EAAA,CAAA,GAAAJ,gBAKrGC,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAEN,UAAAA;AAAAA,IAAW;AAAA,IAAA,IAAAO,WAAA;AAAA,UAAAQ,QAAAC,QAAAA;AAAAN,aAAA,MAAAC,UAAAI,OAEZ,GAAGtB,SAASmB,oBAAoBC,UAAU,IAAIpB,OAAAA,EAASmB,oBAAoBK,eAAe,EAAE,CAAA;AAAA,aAAAF;AAAAA,IAAA;AAAA,EAAA,CAAA,GAAAX,gBAKtGC,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAEL,YAAAA;AAAAA,IAAa;AAAA,IAAA,IAAAM,WAAA;AAAA,UAAAW,QAAAC,QAAAA;AAAAT,aAAA,MAAAC,UAAAO,OAEd,GAAGzB,SAASmB,oBAAoBC,UAAU,IAAIpB,OAAAA,EAASmB,oBAAoBQ,kBAAkB,EAAE,CAAA;AAAA,aAAAF;AAAAA,IAAA;AAAA,EAAA,CAAA,GAAAd,gBAKzGC,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAEJ,aAAAA;AAAAA,IAAc;AAAA,IAAA,IAAAK,WAAA;AAAA,UAAAc,QAAAC;AAAAD,YAAAE;AAAAC,aAAAH,OAInBnB,cAAY,IAAA;AAAAQ,aAAA,MAAAC,UAAAU,OAFR,GAAG5B,SAASmB,oBAAoBC,UAAU,IAAIpB,OAAAA,EAASmB,oBAAoBa,iBAAiB,EAAE,CAAA;AAAA,aAAAJ;AAAAA,IAAA;AAAA,EAAA,CAAA,CAAA;AAO/G;"}
@@ -0,0 +1,9 @@
1
+ import { Component } from 'solid-js';
2
+ import { Chunk } from '../../store/ai-store.js';
3
+ interface ChunkItemProps {
4
+ chunk: Chunk;
5
+ index: number;
6
+ variant?: 'small' | 'large';
7
+ }
8
+ export declare const ChunkItem: Component<ChunkItemProps>;
9
+ export {};