@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,122 @@
1
+ import { template, insert, createComponent, effect, className, setAttribute, setStyleProperty, delegateEvents } from "solid-js/web";
2
+ import { Show } from "solid-js";
3
+ import { useStyles } from "../../styles/use-styles.js";
4
+ import { useAIStore } from "../../store/ai-context.js";
5
+ import { getTypeColor, getStatusColor } from "../utils/format.js";
6
+ var _tmpl$ = /* @__PURE__ */ template(`<div>🔧 `), _tmpl$2 = /* @__PURE__ */ template(`<div>⟳`), _tmpl$3 = /* @__PURE__ */ template(`<div>🎯 `), _tmpl$4 = /* @__PURE__ */ template(`<div><div><div><div><div></div><div></div></div><div><div></div></div></div><div><div>💬 </div><div>📦 `);
7
+ const ConversationRow = (props) => {
8
+ const {
9
+ state,
10
+ selectConversation
11
+ } = useAIStore();
12
+ const styles = useStyles();
13
+ const conv = () => props.conversation;
14
+ const hasToolCalls = () => {
15
+ return conv().messages.some((msg) => msg.toolCalls && msg.toolCalls.length > 0);
16
+ };
17
+ const countToolCalls = () => {
18
+ return conv().messages.reduce((total, msg) => {
19
+ return total + (msg.toolCalls?.length || 0);
20
+ }, 0);
21
+ };
22
+ const totalRawChunks = () => {
23
+ return conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0);
24
+ };
25
+ return (() => {
26
+ var _el$ = _tmpl$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$9 = _el$4.nextSibling, _el$1 = _el$9.firstChild, _el$10 = _el$3.nextSibling, _el$11 = _el$10.firstChild;
27
+ _el$11.firstChild;
28
+ var _el$13 = _el$11.nextSibling;
29
+ _el$13.firstChild;
30
+ _el$.$$click = () => selectConversation(conv().id);
31
+ insert(_el$6, () => conv().label);
32
+ insert(_el$4, createComponent(Show, {
33
+ get when() {
34
+ return hasToolCalls();
35
+ },
36
+ get children() {
37
+ var _el$7 = _tmpl$();
38
+ _el$7.firstChild;
39
+ insert(_el$7, countToolCalls, null);
40
+ effect((_p$) => {
41
+ var _v$ = styles().conversationsList.toolCallsBadge, _v$2 = `${countToolCalls()} tool call${countToolCalls() !== 1 ? "s" : ""}`;
42
+ _v$ !== _p$.e && className(_el$7, _p$.e = _v$);
43
+ _v$2 !== _p$.t && setAttribute(_el$7, "title", _p$.t = _v$2);
44
+ return _p$;
45
+ }, {
46
+ e: void 0,
47
+ t: void 0
48
+ });
49
+ return _el$7;
50
+ }
51
+ }), null);
52
+ insert(_el$9, createComponent(Show, {
53
+ get when() {
54
+ return conv().status === "active";
55
+ },
56
+ get children() {
57
+ var _el$0 = _tmpl$2();
58
+ effect(() => className(_el$0, styles().conversationsList.loadingIndicator));
59
+ return _el$0;
60
+ }
61
+ }), _el$1);
62
+ insert(_el$11, () => conv().messages.length, null);
63
+ insert(_el$13, totalRawChunks, null);
64
+ insert(_el$10, createComponent(Show, {
65
+ get when() {
66
+ return conv().usage;
67
+ },
68
+ get children() {
69
+ var _el$15 = _tmpl$3();
70
+ _el$15.firstChild;
71
+ insert(_el$15, () => conv().usage?.totalTokens.toLocaleString() || 0, null);
72
+ effect((_p$) => {
73
+ var _v$3 = styles().conversationsList.tokensBadge, _v$4 = `Prompt: ${conv().usage?.promptTokens || 0} | Completion: ${conv().usage?.completionTokens || 0}`;
74
+ _v$3 !== _p$.e && className(_el$15, _p$.e = _v$3);
75
+ _v$4 !== _p$.t && setAttribute(_el$15, "title", _p$.t = _v$4);
76
+ return _p$;
77
+ }, {
78
+ e: void 0,
79
+ t: void 0
80
+ });
81
+ return _el$15;
82
+ }
83
+ }), null);
84
+ effect((_p$) => {
85
+ var _v$5 = `${styles().utilRow} ${state.activeConversationId === conv().id ? styles().utilRowSelected : ""}`, _v$6 = styles().conversationsList.rowMain, _v$7 = styles().conversationsList.rowTop, _v$8 = styles().conversationsList.rowInfo, _v$9 = styles().conversationsList.typeDot, _v$0 = getTypeColor(conv().type), _v$1 = styles().conversationsList.label, _v$10 = styles().conversationsList.rowRight, _v$11 = styles().conversationsList.statusDot, _v$12 = getStatusColor(conv().status), _v$13 = styles().conversationsList.stats, _v$14 = styles().conversationsList.statItem, _v$15 = styles().conversationsList.statItem;
86
+ _v$5 !== _p$.e && className(_el$, _p$.e = _v$5);
87
+ _v$6 !== _p$.t && className(_el$2, _p$.t = _v$6);
88
+ _v$7 !== _p$.a && className(_el$3, _p$.a = _v$7);
89
+ _v$8 !== _p$.o && className(_el$4, _p$.o = _v$8);
90
+ _v$9 !== _p$.i && className(_el$5, _p$.i = _v$9);
91
+ _v$0 !== _p$.n && setStyleProperty(_el$5, "background", _p$.n = _v$0);
92
+ _v$1 !== _p$.s && className(_el$6, _p$.s = _v$1);
93
+ _v$10 !== _p$.h && className(_el$9, _p$.h = _v$10);
94
+ _v$11 !== _p$.r && className(_el$1, _p$.r = _v$11);
95
+ _v$12 !== _p$.d && setStyleProperty(_el$1, "background", _p$.d = _v$12);
96
+ _v$13 !== _p$.l && className(_el$10, _p$.l = _v$13);
97
+ _v$14 !== _p$.u && className(_el$11, _p$.u = _v$14);
98
+ _v$15 !== _p$.c && className(_el$13, _p$.c = _v$15);
99
+ return _p$;
100
+ }, {
101
+ e: void 0,
102
+ t: void 0,
103
+ a: void 0,
104
+ o: void 0,
105
+ i: void 0,
106
+ n: void 0,
107
+ s: void 0,
108
+ h: void 0,
109
+ r: void 0,
110
+ d: void 0,
111
+ l: void 0,
112
+ u: void 0,
113
+ c: void 0
114
+ });
115
+ return _el$;
116
+ })();
117
+ };
118
+ delegateEvents(["click"]);
119
+ export {
120
+ ConversationRow
121
+ };
122
+ //# sourceMappingURL=ConversationRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationRow.js","sources":["../../../../src/components/list/ConversationRow.tsx"],"sourcesContent":["import { Show } from 'solid-js'\nimport { useStyles } from '../../styles/use-styles'\nimport { useAIStore } from '../../store/ai-context'\nimport { getStatusColor, getTypeColor } from '../utils'\nimport type { Conversation } from '../../store/ai-context'\nimport type { Component } from 'solid-js'\n\ninterface ConversationRowProps {\n conversation: Conversation\n}\n\nexport const ConversationRow: Component<ConversationRowProps> = (props) => {\n const { state, selectConversation } = useAIStore()\n const styles = useStyles()\n const conv = () => props.conversation\n\n const hasToolCalls = () => {\n return conv().messages.some(\n (msg) => msg.toolCalls && msg.toolCalls.length > 0,\n )\n }\n\n const countToolCalls = () => {\n return conv().messages.reduce((total, msg) => {\n return total + (msg.toolCalls?.length || 0)\n }, 0)\n }\n\n // Total raw chunks = sum of all chunkCounts from all chunks\n const totalRawChunks = () => {\n return conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0)\n }\n\n return (\n <div\n class={`${styles().utilRow} ${state.activeConversationId === conv().id ? styles().utilRowSelected : ''}`}\n onClick={() => selectConversation(conv().id)}\n >\n <div class={styles().conversationsList.rowMain}>\n <div class={styles().conversationsList.rowTop}>\n <div class={styles().conversationsList.rowInfo}>\n <div\n class={styles().conversationsList.typeDot}\n style={{ background: getTypeColor(conv().type) }}\n />\n <div class={styles().conversationsList.label}>{conv().label}</div>\n <Show when={hasToolCalls()}>\n <div\n class={styles().conversationsList.toolCallsBadge}\n title={`${countToolCalls()} tool call${countToolCalls() !== 1 ? 's' : ''}`}\n >\n 🔧 {countToolCalls()}\n </div>\n </Show>\n </div>\n <div class={styles().conversationsList.rowRight}>\n <Show when={conv().status === 'active'}>\n <div class={styles().conversationsList.loadingIndicator}>⟳</div>\n </Show>\n <div\n class={styles().conversationsList.statusDot}\n style={{ background: getStatusColor(conv().status) }}\n />\n </div>\n </div>\n <div class={styles().conversationsList.stats}>\n <div class={styles().conversationsList.statItem}>\n 💬 {conv().messages.length}\n </div>\n <div class={styles().conversationsList.statItem}>\n 📦 {totalRawChunks()}\n </div>\n <Show when={conv().usage}>\n <div\n class={styles().conversationsList.tokensBadge}\n title={`Prompt: ${conv().usage?.promptTokens || 0} | Completion: ${conv().usage?.completionTokens || 0}`}\n >\n 🎯 {conv().usage?.totalTokens.toLocaleString() || 0}\n </div>\n </Show>\n </div>\n </div>\n </div>\n )\n}\n"],"names":["ConversationRow","props","state","selectConversation","useAIStore","styles","useStyles","conv","conversation","hasToolCalls","messages","some","msg","toolCalls","length","countToolCalls","reduce","total","totalRawChunks","chunks","sum","c","chunkCount","_el$","_tmpl$4","_el$2","firstChild","_el$3","_el$4","_el$5","_el$6","nextSibling","_el$9","_el$1","_el$10","_el$11","_el$13","$$click","id","_$insert","label","_$createComponent","Show","when","children","_el$7","_tmpl$","_$effect","_p$","_v$","conversationsList","toolCallsBadge","_v$2","e","_$className","t","_$setAttribute","undefined","status","_el$0","_tmpl$2","loadingIndicator","usage","_el$15","_tmpl$3","totalTokens","toLocaleString","_v$3","tokensBadge","_v$4","promptTokens","completionTokens","_v$5","utilRow","activeConversationId","utilRowSelected","_v$6","rowMain","_v$7","rowTop","_v$8","rowInfo","_v$9","typeDot","_v$0","getTypeColor","type","_v$1","_v$10","rowRight","_v$11","statusDot","_v$12","getStatusColor","_v$13","stats","_v$14","statItem","_v$15","a","o","i","n","_$setStyleProperty","s","h","r","d","l","u","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { ConversationRow } from './ConversationRow.js';
@@ -0,0 +1,6 @@
1
+ import { Chunk } from '../../store/ai-store.js';
2
+ export declare const formatTimestamp: (timestamp: number) => string;
3
+ export declare const formatDuration: (ms?: number) => string;
4
+ export declare const getChunkTypeColor: (type: Chunk["type"]) => string;
5
+ export declare const getStatusColor: (status: "active" | "completed" | "error") => string;
6
+ export declare const getTypeColor: (type: "client" | "server") => string;
@@ -0,0 +1,68 @@
1
+ const formatTimestamp = (timestamp) => {
2
+ const date = new Date(timestamp);
3
+ return date.toLocaleTimeString() + "." + date.getMilliseconds().toString().padStart(3, "0");
4
+ };
5
+ const formatDuration = (ms) => {
6
+ if (!ms) return "-";
7
+ if (ms < 1e3) return `${ms}ms`;
8
+ return `${(ms / 1e3).toFixed(2)}s`;
9
+ };
10
+ const getChunkTypeColor = (type) => {
11
+ switch (type) {
12
+ case "content":
13
+ return "#10b981";
14
+ // green
15
+ case "tool_call":
16
+ return "#8b5cf6";
17
+ // purple
18
+ case "tool_result":
19
+ return "#3b82f6";
20
+ // blue
21
+ case "done":
22
+ return "#6b7280";
23
+ // gray
24
+ case "error":
25
+ return "#ef4444";
26
+ // red
27
+ case "approval":
28
+ return "#f59e0b";
29
+ // orange/amber
30
+ default:
31
+ return "#6b7280";
32
+ }
33
+ };
34
+ const getStatusColor = (status) => {
35
+ switch (status) {
36
+ case "active":
37
+ return "oklch(0.7 0.17 142)";
38
+ // green
39
+ case "completed":
40
+ return "oklch(0.65 0.1 260)";
41
+ // blue
42
+ case "error":
43
+ return "oklch(0.65 0.2 25)";
44
+ // red
45
+ default:
46
+ return "oklch(0.6 0.05 200)";
47
+ }
48
+ };
49
+ const getTypeColor = (type) => {
50
+ switch (type) {
51
+ case "client":
52
+ return "oklch(0.68 0.16 330)";
53
+ // pink
54
+ case "server":
55
+ return "oklch(0.68 0.15 280)";
56
+ // purple
57
+ default:
58
+ return "oklch(0.6 0.05 200)";
59
+ }
60
+ };
61
+ export {
62
+ formatDuration,
63
+ formatTimestamp,
64
+ getChunkTypeColor,
65
+ getStatusColor,
66
+ getTypeColor
67
+ };
68
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sources":["../../../../src/components/utils/format.ts"],"sourcesContent":["import type { Chunk } from '../../store/ai-store'\n\nexport const formatTimestamp = (timestamp: number): string => {\n const date = new Date(timestamp)\n return (\n date.toLocaleTimeString() +\n '.' +\n date.getMilliseconds().toString().padStart(3, '0')\n )\n}\n\nexport const formatDuration = (ms?: number): string => {\n if (!ms) return '-'\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nexport const getChunkTypeColor = (type: Chunk['type']): string => {\n switch (type) {\n case 'content':\n return '#10b981' // green\n case 'tool_call':\n return '#8b5cf6' // purple\n case 'tool_result':\n return '#3b82f6' // blue\n case 'done':\n return '#6b7280' // gray\n case 'error':\n return '#ef4444' // red\n case 'approval':\n return '#f59e0b' // orange/amber\n default:\n return '#6b7280' // gray\n }\n}\n\nexport const getStatusColor = (\n status: 'active' | 'completed' | 'error',\n): string => {\n switch (status) {\n case 'active':\n return 'oklch(0.7 0.17 142)' // green\n case 'completed':\n return 'oklch(0.65 0.1 260)' // blue\n case 'error':\n return 'oklch(0.65 0.2 25)' // red\n default:\n return 'oklch(0.6 0.05 200)'\n }\n}\n\nexport const getTypeColor = (type: 'client' | 'server'): string => {\n switch (type) {\n case 'client':\n return 'oklch(0.68 0.16 330)' // pink\n case 'server':\n return 'oklch(0.68 0.15 280)' // purple\n default:\n return 'oklch(0.6 0.05 200)'\n }\n}\n"],"names":[],"mappings":"AAEO,MAAM,kBAAkB,CAAC,cAA8B;AAC5D,QAAM,OAAO,IAAI,KAAK,SAAS;AAC/B,SACE,KAAK,uBACL,MACA,KAAK,gBAAA,EAAkB,SAAA,EAAW,SAAS,GAAG,GAAG;AAErD;AAEO,MAAM,iBAAiB,CAAC,OAAwB;AACrD,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,KAAK,IAAM,QAAO,GAAG,EAAE;AAC3B,SAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAClC;AAEO,MAAM,oBAAoB,CAAC,SAAgC;AAChE,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEO,MAAM,iBAAiB,CAC5B,WACW;AACX,UAAQ,QAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEO,MAAM,eAAe,CAAC,SAAsC;AACjE,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;"}
@@ -0,0 +1 @@
1
+ export * from './format.js';
@@ -0,0 +1,18 @@
1
+ export interface AiDevtoolsInit {
2
+ }
3
+ declare const AiDevtoolsCore: new () => {
4
+ "__#private@#isMounted": boolean;
5
+ "__#private@#dispose"?: () => void;
6
+ "__#private@#Component": any;
7
+ "__#private@#ThemeProvider": any;
8
+ mount<T extends HTMLElement>(el: T, theme: "light" | "dark"): Promise<void>;
9
+ unmount(): void;
10
+ }, AiDevtoolsCoreNoOp: new () => {
11
+ mount<T extends HTMLElement>(_el: T, _theme: "light" | "dark"): Promise<void>;
12
+ unmount(): void;
13
+ "__#private@#isMounted": boolean;
14
+ "__#private@#dispose"?: () => void;
15
+ "__#private@#Component": any;
16
+ "__#private@#ThemeProvider": any;
17
+ };
18
+ export { AiDevtoolsCore, AiDevtoolsCoreNoOp };
@@ -0,0 +1,9 @@
1
+ import { lazy } from "solid-js";
2
+ import { constructCoreClass } from "@tanstack/devtools-utils/solid";
3
+ const Component = lazy(() => import("./components/Shell.js"));
4
+ const [AiDevtoolsCore, AiDevtoolsCoreNoOp] = constructCoreClass(Component);
5
+ export {
6
+ AiDevtoolsCore,
7
+ AiDevtoolsCoreNoOp
8
+ };
9
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sources":["../../src/core.tsx"],"sourcesContent":["import { lazy } from 'solid-js'\nimport { constructCoreClass } from '@tanstack/devtools-utils/solid'\n\nconst Component = lazy(() => import('./components/Shell'))\n\nexport interface AiDevtoolsInit {}\n\nconst [AiDevtoolsCore, AiDevtoolsCoreNoOp] = constructCoreClass(Component)\n\nexport { AiDevtoolsCore, AiDevtoolsCoreNoOp }\n"],"names":["Component","lazy","AiDevtoolsCore","AiDevtoolsCoreNoOp","constructCoreClass"],"mappings":";;AAGA,MAAMA,YAAYC,KAAK,MAAM,OAAO,uBAAoB,CAAC;AAIzD,MAAM,CAACC,gBAAgBC,kBAAkB,IAAIC,mBAAmBJ,SAAS;"}
@@ -0,0 +1,9 @@
1
+ export declare const AiDevtoolsCore: new () => {
2
+ "__#private@#isMounted": boolean;
3
+ "__#private@#dispose"?: () => void;
4
+ "__#private@#Component": any;
5
+ "__#private@#ThemeProvider": any;
6
+ mount<T extends HTMLElement>(el: T, theme: "light" | "dark"): Promise<void>;
7
+ unmount(): void;
8
+ };
9
+ export type { AiDevtoolsInit } from './core.js';
@@ -0,0 +1,6 @@
1
+ import { AiDevtoolsCoreNoOp, AiDevtoolsCore as AiDevtoolsCore$1 } from "./core.js";
2
+ const AiDevtoolsCore = process.env.NODE_ENV !== "development" ? AiDevtoolsCoreNoOp : AiDevtoolsCore$1;
3
+ export {
4
+ AiDevtoolsCore
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import * as Devtools from './core'\n\nexport const AiDevtoolsCore =\n process.env.NODE_ENV !== 'development'\n ? Devtools.AiDevtoolsCoreNoOp\n : Devtools.AiDevtoolsCore\n\nexport type { AiDevtoolsInit } from './core'\n"],"names":["Devtools.AiDevtoolsCoreNoOp","Devtools.AiDevtoolsCore"],"mappings":";AAEO,MAAM,iBACX,QAAQ,IAAI,aAAa,gBACrBA,qBACAC;"}
@@ -0,0 +1,2 @@
1
+ export { AiDevtoolsCore } from './core.js';
2
+ export type { AiDevtoolsInit } from './core.js';
@@ -0,0 +1,5 @@
1
+ import { AiDevtoolsCore } from "./core.js";
2
+ export {
3
+ AiDevtoolsCore
4
+ };
5
+ //# sourceMappingURL=production.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,126 @@
1
+ import { ParentComponent } from 'solid-js';
2
+ interface MessagePart {
3
+ type: 'text' | 'tool-call' | 'tool-result';
4
+ content?: string;
5
+ toolCallId?: string;
6
+ toolName?: string;
7
+ arguments?: string;
8
+ state?: string;
9
+ output?: unknown;
10
+ error?: string;
11
+ }
12
+ export interface ToolCall {
13
+ id: string;
14
+ name: string;
15
+ arguments: string;
16
+ state: string;
17
+ result?: unknown;
18
+ approvalRequired?: boolean;
19
+ approvalId?: string;
20
+ /** Duration of tool execution in milliseconds */
21
+ duration?: number;
22
+ }
23
+ interface TokenUsage {
24
+ promptTokens: number;
25
+ completionTokens: number;
26
+ totalTokens: number;
27
+ }
28
+ export interface Message {
29
+ id: string;
30
+ role: 'user' | 'assistant' | 'system' | 'tool';
31
+ content: string;
32
+ timestamp: number;
33
+ parts?: Array<MessagePart>;
34
+ toolCalls?: Array<ToolCall>;
35
+ /** Consolidated chunks - consecutive same-type chunks are merged into one entry */
36
+ chunks?: Array<Chunk>;
37
+ /** Total number of raw chunks received (before consolidation) */
38
+ totalChunkCount?: number;
39
+ model?: string;
40
+ usage?: TokenUsage;
41
+ thinkingContent?: string;
42
+ /** Source of the message: 'client' for aggregated client-side data, 'server' for individual server chunks */
43
+ source?: 'client' | 'server';
44
+ }
45
+ /**
46
+ * Consolidated chunk - represents one or more raw chunks of the same type.
47
+ * Consecutive content/thinking chunks are merged into a single entry with accumulated content.
48
+ */
49
+ export interface Chunk {
50
+ id: string;
51
+ type: 'content' | 'tool_call' | 'tool_result' | 'done' | 'error' | 'approval' | 'thinking';
52
+ timestamp: number;
53
+ messageId?: string;
54
+ /** Accumulated content from all merged chunks */
55
+ content?: string;
56
+ /** The last delta received (kept for debugging) */
57
+ delta?: string;
58
+ toolName?: string;
59
+ toolCallId?: string;
60
+ finishReason?: string;
61
+ error?: string;
62
+ approvalId?: string;
63
+ input?: unknown;
64
+ /** Tool arguments for tool_call chunks */
65
+ arguments?: string;
66
+ /** Tool result data for tool_result chunks */
67
+ result?: unknown;
68
+ /** Duration in ms for tool execution */
69
+ duration?: number;
70
+ /** Number of raw chunks that were merged into this consolidated chunk */
71
+ chunkCount: number;
72
+ }
73
+ export interface EmbeddingOperation {
74
+ id: string;
75
+ model: string;
76
+ inputCount: number;
77
+ duration: number;
78
+ timestamp: number;
79
+ status: 'started' | 'completed';
80
+ }
81
+ export interface SummarizeOperation {
82
+ id: string;
83
+ model: string;
84
+ inputLength: number;
85
+ outputLength?: number;
86
+ duration?: number;
87
+ timestamp: number;
88
+ status: 'started' | 'completed';
89
+ }
90
+ export interface Conversation {
91
+ id: string;
92
+ type: 'client' | 'server';
93
+ label: string;
94
+ messages: Array<Message>;
95
+ chunks: Array<Chunk>;
96
+ model?: string;
97
+ provider?: string;
98
+ status: 'active' | 'completed' | 'error';
99
+ startedAt: number;
100
+ completedAt?: number;
101
+ usage?: TokenUsage;
102
+ iterationCount?: number;
103
+ toolNames?: Array<string>;
104
+ options?: Record<string, unknown>;
105
+ providerOptions?: Record<string, unknown>;
106
+ /** Flags for which operation types this conversation has */
107
+ hasChat?: boolean;
108
+ hasEmbedding?: boolean;
109
+ hasSummarize?: boolean;
110
+ /** Embedding operations in this conversation */
111
+ embeddings?: Array<EmbeddingOperation>;
112
+ /** Summarize operations in this conversation */
113
+ summaries?: Array<SummarizeOperation>;
114
+ }
115
+ interface AIStoreState {
116
+ conversations: Record<string, Conversation>;
117
+ activeConversationId: string | null;
118
+ }
119
+ interface AIContextValue {
120
+ state: AIStoreState;
121
+ clearAllConversations: () => void;
122
+ selectConversation: (id: string) => void;
123
+ }
124
+ export declare function useAIStore(): AIContextValue;
125
+ export declare const AIProvider: ParentComponent;
126
+ export {};