@assistant-ui/react-devtools 1.2.17 → 1.2.18

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.
@@ -4,12 +4,12 @@ import { useDevToolsClient } from "../data/useDevToolsClient.js";
4
4
  import { CenteredMessage } from "../views/ui/CenteredMessage.js";
5
5
  import { builtinPlugins } from "./registry.js";
6
6
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
7
- import { useEffect, useState } from "@assistant-ui/tap/react-shim";
7
+ import { useState } from "@assistant-ui/tap/react-shim";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import clsx from "clsx";
10
10
  //#region src/shell/DevToolsPanel.tsx
11
11
  const DevToolsPanel = (t0) => {
12
- const $ = c(54);
12
+ const $ = c(50);
13
13
  const { plugins, theme: t1, onClose, client } = t0;
14
14
  const theme = t1 === void 0 ? "light" : t1;
15
15
  const resolvedClient = client ?? inProcessClient;
@@ -22,33 +22,18 @@ const DevToolsPanel = (t0) => {
22
22
  } else t2 = $[0];
23
23
  const [selectionByApi, setSelectionByApi] = useState(t2);
24
24
  const { apiIds, selected, clearEvents, switchToThread } = useDevToolsClient(selectedApiId, resolvedClient);
25
+ const resolvedApiId = selectedApiId !== null && apiIds.includes(selectedApiId) ? selectedApiId : apiIds[0] ?? null;
26
+ if (resolvedApiId !== selectedApiId) setSelectedApiId(resolvedApiId);
25
27
  let t3;
28
+ if ($[1] !== plugins) {
29
+ t3 = [...builtinPlugins, ...plugins ?? []].sort(_temp);
30
+ $[1] = plugins;
31
+ $[2] = t3;
32
+ } else t3 = $[2];
33
+ const allPlugins = t3;
26
34
  let t4;
27
- if ($[1] !== apiIds || $[2] !== selectedApiId) {
28
- t3 = () => {
29
- if (selectedApiId !== null && apiIds.includes(selectedApiId)) return;
30
- setSelectedApiId(apiIds[0] ?? null);
31
- };
32
- t4 = [apiIds, selectedApiId];
33
- $[1] = apiIds;
34
- $[2] = selectedApiId;
35
- $[3] = t3;
36
- $[4] = t4;
37
- } else {
38
- t3 = $[3];
39
- t4 = $[4];
40
- }
41
- useEffect(t3, t4);
42
- let t5;
43
- if ($[5] !== plugins) {
44
- t5 = [...builtinPlugins, ...plugins ?? []].sort(_temp);
45
- $[5] = plugins;
46
- $[6] = t5;
47
- } else t5 = $[6];
48
- const allPlugins = t5;
49
- let t6;
50
- if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
51
- t6 = (apiId, tabId, nodeId) => {
35
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
36
+ t4 = (apiId, tabId, nodeId) => {
52
37
  setSelectionByApi((prev) => ({
53
38
  ...prev,
54
39
  [apiId]: {
@@ -57,12 +42,12 @@ const DevToolsPanel = (t0) => {
57
42
  }
58
43
  }));
59
44
  };
60
- $[7] = t6;
61
- } else t6 = $[7];
62
- const setSelectionFor = t6;
63
- let t7;
64
- if ($[8] !== allPlugins || $[9] !== clearEvents || $[10] !== selected || $[11] !== selectedApiId || $[12] !== theme) {
65
- t7 = selected && selectedApiId !== null ? allPlugins.filter((plugin) => plugin.isAvailable ? plugin.isAvailable({
45
+ $[3] = t4;
46
+ } else t4 = $[3];
47
+ const setSelectionFor = t4;
48
+ let t5;
49
+ if ($[4] !== allPlugins || $[5] !== clearEvents || $[6] !== selected || $[7] !== selectedApiId || $[8] !== theme) {
50
+ t5 = selected && selectedApiId !== null ? allPlugins.filter((plugin) => plugin.isAvailable ? plugin.isAvailable({
66
51
  apiId: selectedApiId,
67
52
  data: selected,
68
53
  clearEvents,
@@ -70,25 +55,25 @@ const DevToolsPanel = (t0) => {
70
55
  selection: null,
71
56
  setSelection: _temp2
72
57
  }) : true) : allPlugins;
73
- $[8] = allPlugins;
74
- $[9] = clearEvents;
75
- $[10] = selected;
76
- $[11] = selectedApiId;
77
- $[12] = theme;
78
- $[13] = t7;
79
- } else t7 = $[13];
80
- const visiblePlugins = t7;
81
- let t8;
82
- if ($[14] !== activeTabId || $[15] !== visiblePlugins) {
83
- t8 = visiblePlugins.find((plugin_0) => plugin_0.id === activeTabId) ?? visiblePlugins[0];
84
- $[14] = activeTabId;
85
- $[15] = visiblePlugins;
86
- $[16] = t8;
87
- } else t8 = $[16];
88
- const activePlugin = t8;
89
- let t9;
90
- if ($[17] !== activePlugin || $[18] !== clearEvents || $[19] !== resolvedClient || $[20] !== selected || $[21] !== selectedApiId || $[22] !== selectionByApi || $[23] !== switchToThread || $[24] !== theme) {
91
- t9 = selected && selectedApiId !== null && activePlugin ? {
58
+ $[4] = allPlugins;
59
+ $[5] = clearEvents;
60
+ $[6] = selected;
61
+ $[7] = selectedApiId;
62
+ $[8] = theme;
63
+ $[9] = t5;
64
+ } else t5 = $[9];
65
+ const visiblePlugins = t5;
66
+ let t6;
67
+ if ($[10] !== activeTabId || $[11] !== visiblePlugins) {
68
+ t6 = visiblePlugins.find((plugin_0) => plugin_0.id === activeTabId) ?? visiblePlugins[0];
69
+ $[10] = activeTabId;
70
+ $[11] = visiblePlugins;
71
+ $[12] = t6;
72
+ } else t6 = $[12];
73
+ const activePlugin = t6;
74
+ let t7;
75
+ if ($[13] !== activePlugin || $[14] !== clearEvents || $[15] !== resolvedClient || $[16] !== selected || $[17] !== selectedApiId || $[18] !== selectionByApi || $[19] !== switchToThread || $[20] !== theme) {
76
+ t7 = selected && selectedApiId !== null && activePlugin ? {
92
77
  apiId: selectedApiId,
93
78
  data: selected,
94
79
  clearEvents,
@@ -97,22 +82,22 @@ const DevToolsPanel = (t0) => {
97
82
  setSelection: (nodeId_0) => setSelectionFor(selectedApiId, activePlugin.id, nodeId_0),
98
83
  switchToThread: resolvedClient.switchToThread ? (threadId) => switchToThread(selectedApiId, threadId) : void 0
99
84
  } : null;
100
- $[17] = activePlugin;
101
- $[18] = clearEvents;
102
- $[19] = resolvedClient;
103
- $[20] = selected;
104
- $[21] = selectedApiId;
105
- $[22] = selectionByApi;
106
- $[23] = switchToThread;
107
- $[24] = theme;
108
- $[25] = t9;
109
- } else t9 = $[25];
110
- const ctx = t9;
111
- let t10;
112
- if ($[26] !== activePlugin?.id || $[27] !== visiblePlugins) {
113
- let t11;
114
- if ($[29] !== activePlugin?.id) {
115
- t11 = (plugin_1) => {
85
+ $[13] = activePlugin;
86
+ $[14] = clearEvents;
87
+ $[15] = resolvedClient;
88
+ $[16] = selected;
89
+ $[17] = selectedApiId;
90
+ $[18] = selectionByApi;
91
+ $[19] = switchToThread;
92
+ $[20] = theme;
93
+ $[21] = t7;
94
+ } else t7 = $[21];
95
+ const ctx = t7;
96
+ let t8;
97
+ if ($[22] !== activePlugin?.id || $[23] !== visiblePlugins) {
98
+ let t9;
99
+ if ($[25] !== activePlugin?.id) {
100
+ t9 = (plugin_1) => {
116
101
  const active = activePlugin?.id === plugin_1.id;
117
102
  return /* @__PURE__ */ jsxs("button", {
118
103
  type: "button",
@@ -121,26 +106,26 @@ const DevToolsPanel = (t0) => {
121
106
  children: [plugin_1.label, active ? /* @__PURE__ */ jsx("span", { className: "bg-foreground absolute inset-x-2 -bottom-px h-0.5 rounded-full" }) : null]
122
107
  }, plugin_1.id);
123
108
  };
124
- $[29] = activePlugin?.id;
125
- $[30] = t11;
126
- } else t11 = $[30];
127
- t10 = visiblePlugins.map(t11);
128
- $[26] = activePlugin?.id;
129
- $[27] = visiblePlugins;
130
- $[28] = t10;
131
- } else t10 = $[28];
132
- let t11;
133
- if ($[31] !== t10) {
134
- t11 = /* @__PURE__ */ jsx("div", {
109
+ $[25] = activePlugin?.id;
110
+ $[26] = t9;
111
+ } else t9 = $[26];
112
+ t8 = visiblePlugins.map(t9);
113
+ $[22] = activePlugin?.id;
114
+ $[23] = visiblePlugins;
115
+ $[24] = t8;
116
+ } else t8 = $[24];
117
+ let t9;
118
+ if ($[27] !== t8) {
119
+ t9 = /* @__PURE__ */ jsx("div", {
135
120
  className: "flex h-full items-center",
136
- children: t10
121
+ children: t8
137
122
  });
138
- $[31] = t10;
139
- $[32] = t11;
140
- } else t11 = $[32];
141
- let t12;
142
- if ($[33] !== apiIds || $[34] !== selectedApiId) {
143
- t12 = apiIds.length > 1 ? /* @__PURE__ */ jsx("select", {
123
+ $[27] = t8;
124
+ $[28] = t9;
125
+ } else t9 = $[28];
126
+ let t10;
127
+ if ($[29] !== apiIds || $[30] !== selectedApiId) {
128
+ t10 = apiIds.length > 1 ? /* @__PURE__ */ jsx("select", {
144
129
  value: selectedApiId ?? "",
145
130
  onChange: (event) => {
146
131
  const value = Number(event.target.value);
@@ -149,28 +134,28 @@ const DevToolsPanel = (t0) => {
149
134
  className: "border-border text-muted-foreground hover:text-foreground h-7 rounded-md border bg-transparent px-2 text-[12px] transition-colors",
150
135
  children: apiIds.map(_temp3)
151
136
  }) : null;
152
- $[33] = apiIds;
153
- $[34] = selectedApiId;
154
- $[35] = t12;
155
- } else t12 = $[35];
137
+ $[29] = apiIds;
138
+ $[30] = selectedApiId;
139
+ $[31] = t10;
140
+ } else t10 = $[31];
141
+ let t11;
142
+ if ($[32] === Symbol.for("react.memo_cache_sentinel")) {
143
+ t11 = /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-emerald-500" });
144
+ $[32] = t11;
145
+ } else t11 = $[32];
146
+ const t12 = apiIds.length > 0 ? `${apiIds.length} instance${apiIds.length > 1 ? "s" : ""}` : "Waiting";
156
147
  let t13;
157
- if ($[36] === Symbol.for("react.memo_cache_sentinel")) {
158
- t13 = /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-emerald-500" });
159
- $[36] = t13;
160
- } else t13 = $[36];
161
- const t14 = apiIds.length > 0 ? `${apiIds.length} instance${apiIds.length > 1 ? "s" : ""}` : "Waiting";
162
- let t15;
163
- if ($[37] !== t14) {
164
- t15 = /* @__PURE__ */ jsxs("span", {
148
+ if ($[33] !== t12) {
149
+ t13 = /* @__PURE__ */ jsxs("span", {
165
150
  className: "text-muted-foreground flex items-center gap-1.5 text-[11px]",
166
- children: [t13, t14]
151
+ children: [t11, t12]
167
152
  });
168
- $[37] = t14;
169
- $[38] = t15;
170
- } else t15 = $[38];
171
- let t16;
172
- if ($[39] !== onClose) {
173
- t16 = onClose ? /* @__PURE__ */ jsx("button", {
153
+ $[33] = t12;
154
+ $[34] = t13;
155
+ } else t13 = $[34];
156
+ let t14;
157
+ if ($[35] !== onClose) {
158
+ t14 = onClose ? /* @__PURE__ */ jsx("button", {
174
159
  type: "button",
175
160
  onClick: onClose,
176
161
  "aria-label": "Close DevTools",
@@ -190,55 +175,55 @@ const DevToolsPanel = (t0) => {
190
175
  })
191
176
  })
192
177
  }) : null;
193
- $[39] = onClose;
194
- $[40] = t16;
195
- } else t16 = $[40];
196
- let t17;
197
- if ($[41] !== t12 || $[42] !== t15 || $[43] !== t16) {
198
- t17 = /* @__PURE__ */ jsxs("div", {
178
+ $[35] = onClose;
179
+ $[36] = t14;
180
+ } else t14 = $[36];
181
+ let t15;
182
+ if ($[37] !== t10 || $[38] !== t13 || $[39] !== t14) {
183
+ t15 = /* @__PURE__ */ jsxs("div", {
199
184
  className: "flex items-center gap-2 pe-1",
200
185
  children: [
201
- t12,
202
- t15,
203
- t16
186
+ t10,
187
+ t13,
188
+ t14
204
189
  ]
205
190
  });
206
- $[41] = t12;
207
- $[42] = t15;
208
- $[43] = t16;
209
- $[44] = t17;
210
- } else t17 = $[44];
211
- let t18;
212
- if ($[45] !== t11 || $[46] !== t17) {
213
- t18 = /* @__PURE__ */ jsxs("nav", {
191
+ $[37] = t10;
192
+ $[38] = t13;
193
+ $[39] = t14;
194
+ $[40] = t15;
195
+ } else t15 = $[40];
196
+ let t16;
197
+ if ($[41] !== t15 || $[42] !== t9) {
198
+ t16 = /* @__PURE__ */ jsxs("nav", {
214
199
  className: "border-border flex h-10 shrink-0 items-center justify-between gap-2 border-b px-2 select-none",
215
- children: [t11, t17]
200
+ children: [t9, t15]
216
201
  });
217
- $[45] = t11;
218
- $[46] = t17;
219
- $[47] = t18;
220
- } else t18 = $[47];
221
- let t19;
222
- if ($[48] !== activePlugin || $[49] !== ctx) {
223
- t19 = /* @__PURE__ */ jsx("section", {
202
+ $[41] = t15;
203
+ $[42] = t9;
204
+ $[43] = t16;
205
+ } else t16 = $[43];
206
+ let t17;
207
+ if ($[44] !== activePlugin || $[45] !== ctx) {
208
+ t17 = /* @__PURE__ */ jsx("section", {
224
209
  className: "bg-background min-h-0 flex-1 overflow-hidden",
225
210
  children: ctx && activePlugin ? /* @__PURE__ */ jsx(activePlugin.Component, { ...ctx }) : /* @__PURE__ */ jsx(CenteredMessage, { children: "Waiting for assistant-ui instance..." })
226
211
  });
227
- $[48] = activePlugin;
228
- $[49] = ctx;
229
- $[50] = t19;
230
- } else t19 = $[50];
231
- let t20;
232
- if ($[51] !== t18 || $[52] !== t19) {
233
- t20 = /* @__PURE__ */ jsxs("div", {
212
+ $[44] = activePlugin;
213
+ $[45] = ctx;
214
+ $[46] = t17;
215
+ } else t17 = $[46];
216
+ let t18;
217
+ if ($[47] !== t16 || $[48] !== t17) {
218
+ t18 = /* @__PURE__ */ jsxs("div", {
234
219
  className: "text-foreground flex h-full flex-col text-[13px]",
235
- children: [t18, t19]
220
+ children: [t16, t17]
236
221
  });
237
- $[51] = t18;
238
- $[52] = t19;
239
- $[53] = t20;
240
- } else t20 = $[53];
241
- return t20;
222
+ $[47] = t16;
223
+ $[48] = t17;
224
+ $[49] = t18;
225
+ } else t18 = $[49];
226
+ return t18;
242
227
  };
243
228
  function _temp(a, b) {
244
229
  return (a.order ?? 0) - (b.order ?? 0);
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsPanel.js","names":["c","_c","useCallback","useEffect","useMemo","useState","clsx","useDevToolsClient","inProcessClient","DevToolsClient","CenteredMessage","builtinPlugins","DevToolsPanelPlugin","DevToolsTabContext","DevToolsPanelProps","plugins","theme","onClose","client","DevToolsPanel","t0","$","t1","undefined","resolvedClient","selectedApiId","setSelectedApiId","activeTabId","setActiveTabId","t2","Symbol","for","selectionByApi","setSelectionByApi","apiIds","selected","clearEvents","switchToThread","t3","t4","includes","t5","sort","_temp","allPlugins","t6","apiId","tabId","nodeId","prev","setSelectionFor","t7","filter","plugin","isAvailable","data","selection","setSelection","_temp2","visiblePlugins","t8","find","plugin_0","id","activePlugin","t9","nodeId_0","threadId","ctx","t10","t11","plugin_1","active","label","map","t12","length","event","value","Number","target","isNaN","_temp3","t13","t14","t15","t16","t17","t18","t19","t20","a","b","order"],"sources":["../../src/shell/DevToolsPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { useDevToolsClient } from \"../data/useDevToolsClient\";\nimport { inProcessClient } from \"../data/createInProcessClient\";\nimport type { DevToolsClient } from \"../data/types\";\nimport { CenteredMessage } from \"../views/ui\";\nimport {\n builtinPlugins,\n type DevToolsPanelPlugin,\n type DevToolsTabContext,\n} from \"./registry\";\n\nexport interface DevToolsPanelProps {\n /** Additional inspector tabs appended after the builtins. */\n plugins?: DevToolsPanelPlugin[] | undefined;\n /** Resolved theme, used to style plugin content and the dark variant. */\n theme?: \"light\" | \"dark\";\n /** When provided, a close control is rendered at the end of the tab bar. */\n onClose?: (() => void) | undefined;\n /** Data source. Defaults to the in-process DevToolsHooks client. */\n client?: DevToolsClient | undefined;\n}\n\nexport const DevToolsPanel = ({\n plugins,\n theme = \"light\",\n onClose,\n client,\n}: DevToolsPanelProps) => {\n const resolvedClient = client ?? inProcessClient;\n const [selectedApiId, setSelectedApiId] = useState<number | null>(null);\n const [activeTabId, setActiveTabId] = useState<string>(\"thread\");\n const [selectionByApi, setSelectionByApi] = useState<\n Record<number, Record<string, string | null>>\n >({});\n const { apiIds, selected, clearEvents, switchToThread } = useDevToolsClient(\n selectedApiId,\n resolvedClient,\n );\n\n useEffect(() => {\n if (selectedApiId !== null && apiIds.includes(selectedApiId)) return;\n setSelectedApiId(apiIds[0] ?? null);\n }, [apiIds, selectedApiId]);\n\n const allPlugins = useMemo(\n () =>\n [...builtinPlugins, ...(plugins ?? [])].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0),\n ),\n [plugins],\n );\n\n const setSelectionFor = useCallback(\n (apiId: number, tabId: string, nodeId: string | null) => {\n setSelectionByApi((prev) => ({\n ...prev,\n [apiId]: { ...prev[apiId], [tabId]: nodeId },\n }));\n },\n [],\n );\n\n const visiblePlugins =\n selected && selectedApiId !== null\n ? allPlugins.filter((plugin) =>\n plugin.isAvailable\n ? plugin.isAvailable({\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: null,\n setSelection: () => {},\n })\n : true,\n )\n : allPlugins;\n\n const activePlugin =\n visiblePlugins.find((plugin) => plugin.id === activeTabId) ??\n visiblePlugins[0];\n\n const ctx: DevToolsTabContext | null =\n selected && selectedApiId !== null && activePlugin\n ? {\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: selectionByApi[selectedApiId]?.[activePlugin.id] ?? null,\n setSelection: (nodeId) =>\n setSelectionFor(selectedApiId, activePlugin.id, nodeId),\n switchToThread: resolvedClient.switchToThread\n ? (threadId) => switchToThread(selectedApiId, threadId)\n : undefined,\n }\n : null;\n\n return (\n <div className=\"text-foreground flex h-full flex-col text-[13px]\">\n <nav className=\"border-border flex h-10 shrink-0 items-center justify-between gap-2 border-b px-2 select-none\">\n <div className=\"flex h-full items-center\">\n {visiblePlugins.map((plugin) => {\n const active = activePlugin?.id === plugin.id;\n return (\n <button\n type=\"button\"\n key={plugin.id}\n onClick={() => setActiveTabId(plugin.id)}\n className={clsx(\n \"relative flex h-full items-center px-3 font-medium transition-colors\",\n active\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {plugin.label}\n {active ? (\n <span className=\"bg-foreground absolute inset-x-2 -bottom-px h-0.5 rounded-full\" />\n ) : null}\n </button>\n );\n })}\n </div>\n\n <div className=\"flex items-center gap-2 pe-1\">\n {apiIds.length > 1 ? (\n <select\n value={selectedApiId ?? \"\"}\n onChange={(event) => {\n const value = Number(event.target.value);\n setSelectedApiId(Number.isNaN(value) ? null : value);\n }}\n className=\"border-border text-muted-foreground hover:text-foreground h-7 rounded-md border bg-transparent px-2 text-[12px] transition-colors\"\n >\n {apiIds.map((id) => (\n <option key={id} value={id}>\n API #{id}\n </option>\n ))}\n </select>\n ) : null}\n\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-[11px]\">\n <span className=\"size-1.5 rounded-full bg-emerald-500\" />\n {apiIds.length > 0\n ? `${apiIds.length} instance${apiIds.length > 1 ? \"s\" : \"\"}`\n : \"Waiting\"}\n </span>\n\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close DevTools\"\n className=\"text-muted-foreground hover:bg-accent hover:text-foreground flex size-7 items-center justify-center rounded-md transition-colors\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M18 6 6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </div>\n </nav>\n\n <section className=\"bg-background min-h-0 flex-1 overflow-hidden\">\n {ctx && activePlugin ? (\n <activePlugin.Component {...ctx} />\n ) : (\n <CenteredMessage>\n Waiting for assistant-ui instance...\n </CenteredMessage>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DevToolsPanel.js","names":["c","_c","useCallback","useMemo","useState","clsx","useDevToolsClient","inProcessClient","DevToolsClient","CenteredMessage","builtinPlugins","DevToolsPanelPlugin","DevToolsTabContext","DevToolsPanelProps","plugins","theme","onClose","client","DevToolsPanel","t0","$","t1","undefined","resolvedClient","selectedApiId","setSelectedApiId","activeTabId","setActiveTabId","t2","Symbol","for","selectionByApi","setSelectionByApi","apiIds","selected","clearEvents","switchToThread","resolvedApiId","includes","t3","sort","_temp","allPlugins","t4","apiId","tabId","nodeId","prev","setSelectionFor","t5","filter","plugin","isAvailable","data","selection","setSelection","_temp2","visiblePlugins","t6","find","plugin_0","id","activePlugin","t7","nodeId_0","threadId","ctx","t8","t9","plugin_1","active","label","map","t10","length","event","value","Number","target","isNaN","_temp3","t11","t12","t13","t14","t15","t16","t17","t18","a","b","order"],"sources":["../../src/shell/DevToolsPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { useDevToolsClient } from \"../data/useDevToolsClient\";\nimport { inProcessClient } from \"../data/createInProcessClient\";\nimport type { DevToolsClient } from \"../data/types\";\nimport { CenteredMessage } from \"../views/ui\";\nimport {\n builtinPlugins,\n type DevToolsPanelPlugin,\n type DevToolsTabContext,\n} from \"./registry\";\n\nexport interface DevToolsPanelProps {\n /** Additional inspector tabs appended after the builtins. */\n plugins?: DevToolsPanelPlugin[] | undefined;\n /** Resolved theme, used to style plugin content and the dark variant. */\n theme?: \"light\" | \"dark\";\n /** When provided, a close control is rendered at the end of the tab bar. */\n onClose?: (() => void) | undefined;\n /** Data source. Defaults to the in-process DevToolsHooks client. */\n client?: DevToolsClient | undefined;\n}\n\nexport const DevToolsPanel = ({\n plugins,\n theme = \"light\",\n onClose,\n client,\n}: DevToolsPanelProps) => {\n const resolvedClient = client ?? inProcessClient;\n const [selectedApiId, setSelectedApiId] = useState<number | null>(null);\n const [activeTabId, setActiveTabId] = useState<string>(\"thread\");\n const [selectionByApi, setSelectionByApi] = useState<\n Record<number, Record<string, string | null>>\n >({});\n const { apiIds, selected, clearEvents, switchToThread } = useDevToolsClient(\n selectedApiId,\n resolvedClient,\n );\n\n const resolvedApiId =\n selectedApiId !== null && apiIds.includes(selectedApiId)\n ? selectedApiId\n : (apiIds[0] ?? null);\n\n if (resolvedApiId !== selectedApiId) setSelectedApiId(resolvedApiId);\n\n const allPlugins = useMemo(\n () =>\n [...builtinPlugins, ...(plugins ?? [])].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0),\n ),\n [plugins],\n );\n\n const setSelectionFor = useCallback(\n (apiId: number, tabId: string, nodeId: string | null) => {\n setSelectionByApi((prev) => ({\n ...prev,\n [apiId]: { ...prev[apiId], [tabId]: nodeId },\n }));\n },\n [],\n );\n\n const visiblePlugins =\n selected && selectedApiId !== null\n ? allPlugins.filter((plugin) =>\n plugin.isAvailable\n ? plugin.isAvailable({\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: null,\n setSelection: () => {},\n })\n : true,\n )\n : allPlugins;\n\n const activePlugin =\n visiblePlugins.find((plugin) => plugin.id === activeTabId) ??\n visiblePlugins[0];\n\n const ctx: DevToolsTabContext | null =\n selected && selectedApiId !== null && activePlugin\n ? {\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: selectionByApi[selectedApiId]?.[activePlugin.id] ?? null,\n setSelection: (nodeId) =>\n setSelectionFor(selectedApiId, activePlugin.id, nodeId),\n switchToThread: resolvedClient.switchToThread\n ? (threadId) => switchToThread(selectedApiId, threadId)\n : undefined,\n }\n : null;\n\n return (\n <div className=\"text-foreground flex h-full flex-col text-[13px]\">\n <nav className=\"border-border flex h-10 shrink-0 items-center justify-between gap-2 border-b px-2 select-none\">\n <div className=\"flex h-full items-center\">\n {visiblePlugins.map((plugin) => {\n const active = activePlugin?.id === plugin.id;\n return (\n <button\n type=\"button\"\n key={plugin.id}\n onClick={() => setActiveTabId(plugin.id)}\n className={clsx(\n \"relative flex h-full items-center px-3 font-medium transition-colors\",\n active\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {plugin.label}\n {active ? (\n <span className=\"bg-foreground absolute inset-x-2 -bottom-px h-0.5 rounded-full\" />\n ) : null}\n </button>\n );\n })}\n </div>\n\n <div className=\"flex items-center gap-2 pe-1\">\n {apiIds.length > 1 ? (\n <select\n value={selectedApiId ?? \"\"}\n onChange={(event) => {\n const value = Number(event.target.value);\n setSelectedApiId(Number.isNaN(value) ? null : value);\n }}\n className=\"border-border text-muted-foreground hover:text-foreground h-7 rounded-md border bg-transparent px-2 text-[12px] transition-colors\"\n >\n {apiIds.map((id) => (\n <option key={id} value={id}>\n API #{id}\n </option>\n ))}\n </select>\n ) : null}\n\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-[11px]\">\n <span className=\"size-1.5 rounded-full bg-emerald-500\" />\n {apiIds.length > 0\n ? `${apiIds.length} instance${apiIds.length > 1 ? \"s\" : \"\"}`\n : \"Waiting\"}\n </span>\n\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close DevTools\"\n className=\"text-muted-foreground hover:bg-accent hover:text-foreground flex size-7 items-center justify-center rounded-md transition-colors\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M18 6 6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </div>\n </nav>\n\n <section className=\"bg-background min-h-0 flex-1 overflow-hidden\">\n {ctx && activePlugin ? (\n <activePlugin.Component {...ctx} />\n ) : (\n <CenteredMessage>\n Waiting for assistant-ui instance...\n </CenteredMessage>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -92,7 +92,7 @@ const UnloadedConversation = (t0) => {
92
92
  return t3;
93
93
  };
94
94
  const ThreadTab = (t0) => {
95
- const $ = c(89);
95
+ const $ = c(84);
96
96
  const { data, selection, setSelection, switchToThread } = t0;
97
97
  let t1;
98
98
  if ($[0] !== data.state.threads) {
@@ -111,314 +111,293 @@ const ThreadTab = (t0) => {
111
111
  $[4] = t2;
112
112
  } else t2 = $[4];
113
113
  const [activeThreadId, setActiveThreadId] = useState(t2);
114
+ const resolvedThreadId = hasConversationList && threadList ? [...threadList.threadIds, ...threadList.archivedThreadIds].includes(activeThreadId) ? activeThreadId : threadList.mainThreadId ?? threadList.threadIds[0] ?? "" : activeThreadId;
115
+ if (resolvedThreadId !== activeThreadId) setActiveThreadId(resolvedThreadId);
116
+ const prevThreadIdRef = useRef(activeThreadId);
114
117
  let t3;
115
118
  let t4;
116
- if ($[5] !== activeThreadId || $[6] !== hasConversationList || $[7] !== threadList) {
119
+ if ($[5] !== activeThreadId || $[6] !== setSelection) {
117
120
  t3 = () => {
118
- if (!hasConversationList || !threadList) return;
119
- if ([...threadList.threadIds, ...threadList.archivedThreadIds].includes(activeThreadId)) return;
120
- setActiveThreadId(threadList.mainThreadId ?? threadList.threadIds[0] ?? "");
121
- };
122
- t4 = [
123
- hasConversationList,
124
- threadList,
125
- activeThreadId
126
- ];
127
- $[5] = activeThreadId;
128
- $[6] = hasConversationList;
129
- $[7] = threadList;
130
- $[8] = t3;
131
- $[9] = t4;
132
- } else {
133
- t3 = $[8];
134
- t4 = $[9];
135
- }
136
- useEffect(t3, t4);
137
- const prevThreadIdRef = useRef(activeThreadId);
138
- let t5;
139
- let t6;
140
- if ($[10] !== activeThreadId || $[11] !== setSelection) {
141
- t5 = () => {
142
121
  if (prevThreadIdRef.current === activeThreadId) return;
143
122
  prevThreadIdRef.current = activeThreadId;
144
123
  setSelection(null);
145
124
  };
146
- t6 = [activeThreadId, setSelection];
147
- $[10] = activeThreadId;
148
- $[11] = setSelection;
149
- $[12] = t5;
150
- $[13] = t6;
125
+ t4 = [activeThreadId, setSelection];
126
+ $[5] = activeThreadId;
127
+ $[6] = setSelection;
128
+ $[7] = t3;
129
+ $[8] = t4;
151
130
  } else {
152
- t5 = $[12];
153
- t6 = $[13];
131
+ t3 = $[7];
132
+ t4 = $[8];
154
133
  }
155
- useEffect(t5, t6);
156
- let t7;
134
+ useEffect(t3, t4);
135
+ let t5;
157
136
  bb0: {
158
137
  if (!hasConversationList) {
159
- let t8;
160
- if ($[14] !== data.state) {
161
- t8 = resolveSingleThread(data.state);
162
- $[14] = data.state;
163
- $[15] = t8;
164
- } else t8 = $[15];
165
- t7 = t8;
138
+ let t6;
139
+ if ($[9] !== data.state) {
140
+ t6 = resolveSingleThread(data.state);
141
+ $[9] = data.state;
142
+ $[10] = t6;
143
+ } else t6 = $[10];
144
+ t5 = t6;
166
145
  break bb0;
167
146
  }
168
- let t8;
169
- if ($[16] !== activeThreadId || $[17] !== data.state || $[18] !== snapshots || $[19] !== threadList) {
170
- t8 = resolveThreadForId(data.state, snapshots, activeThreadId, threadList);
171
- $[16] = activeThreadId;
172
- $[17] = data.state;
173
- $[18] = snapshots;
174
- $[19] = threadList;
175
- $[20] = t8;
176
- } else t8 = $[20];
177
- t7 = t8;
147
+ let t6;
148
+ if ($[11] !== activeThreadId || $[12] !== data.state || $[13] !== snapshots || $[14] !== threadList) {
149
+ t6 = resolveThreadForId(data.state, snapshots, activeThreadId, threadList);
150
+ $[11] = activeThreadId;
151
+ $[12] = data.state;
152
+ $[13] = snapshots;
153
+ $[14] = threadList;
154
+ $[15] = t6;
155
+ } else t6 = $[15];
156
+ t5 = t6;
178
157
  }
179
- const activeThread = t7;
158
+ const activeThread = t5;
180
159
  const selectedMessage = useSelectedMessage(activeThread, selection, setSelection);
181
160
  if (!hasConversationList) {
182
161
  if (!activeThread || activeThread.messages.length === 0) {
183
- let t8;
184
- if ($[21] === Symbol.for("react.memo_cache_sentinel")) {
185
- t8 = /* @__PURE__ */ jsx(CenteredMessage, { children: "No thread messages for this assistant instance." });
186
- $[21] = t8;
187
- } else t8 = $[21];
188
- return t8;
162
+ let t6;
163
+ if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
164
+ t6 = /* @__PURE__ */ jsx(CenteredMessage, { children: "No thread messages for this assistant instance." });
165
+ $[16] = t6;
166
+ } else t6 = $[16];
167
+ return t6;
189
168
  }
169
+ let t6;
170
+ if ($[17] !== selectedMessage.id) {
171
+ t6 = messageNodeId(selectedMessage.id);
172
+ $[17] = selectedMessage.id;
173
+ $[18] = t6;
174
+ } else t6 = $[18];
175
+ const activeNodeId = t6;
176
+ let t7;
177
+ if ($[19] !== activeThread) {
178
+ t7 = /* @__PURE__ */ jsx(TranscriptHeader, { thread: activeThread });
179
+ $[19] = activeThread;
180
+ $[20] = t7;
181
+ } else t7 = $[20];
190
182
  let t8;
191
- if ($[22] !== selectedMessage.id) {
192
- t8 = messageNodeId(selectedMessage.id);
193
- $[22] = selectedMessage.id;
194
- $[23] = t8;
195
- } else t8 = $[23];
196
- const activeNodeId = t8;
197
- let t9;
198
- if ($[24] !== activeThread) {
199
- t9 = /* @__PURE__ */ jsx(TranscriptHeader, { thread: activeThread });
200
- $[24] = activeThread;
201
- $[25] = t9;
202
- } else t9 = $[25];
203
- let t10;
204
- if ($[26] !== activeNodeId || $[27] !== activeThread || $[28] !== setSelection) {
205
- t10 = /* @__PURE__ */ jsx(Transcript, {
183
+ if ($[21] !== activeNodeId || $[22] !== activeThread || $[23] !== setSelection) {
184
+ t8 = /* @__PURE__ */ jsx(Transcript, {
206
185
  thread: activeThread,
207
186
  selection: activeNodeId,
208
187
  onSelect: setSelection
209
188
  });
210
- $[26] = activeNodeId;
211
- $[27] = activeThread;
212
- $[28] = setSelection;
189
+ $[21] = activeNodeId;
190
+ $[22] = activeThread;
191
+ $[23] = setSelection;
192
+ $[24] = t8;
193
+ } else t8 = $[24];
194
+ let t9;
195
+ if ($[25] !== t7 || $[26] !== t8) {
196
+ t9 = {
197
+ key: "transcript",
198
+ header: t7,
199
+ children: t8
200
+ };
201
+ $[25] = t7;
202
+ $[26] = t8;
203
+ $[27] = t9;
204
+ } else t9 = $[27];
205
+ let t10;
206
+ if ($[28] !== selectedMessage) {
207
+ t10 = messageDetailHeader(selectedMessage);
208
+ $[28] = selectedMessage;
213
209
  $[29] = t10;
214
210
  } else t10 = $[29];
215
211
  let t11;
216
- if ($[30] !== t10 || $[31] !== t9) {
217
- t11 = {
218
- key: "transcript",
219
- header: t9,
220
- children: t10
221
- };
222
- $[30] = t10;
223
- $[31] = t9;
224
- $[32] = t11;
225
- } else t11 = $[32];
212
+ if ($[30] !== selectedMessage) {
213
+ t11 = /* @__PURE__ */ jsx(MessageDetailBody, { message: selectedMessage });
214
+ $[30] = selectedMessage;
215
+ $[31] = t11;
216
+ } else t11 = $[31];
226
217
  let t12;
227
- if ($[33] !== selectedMessage) {
228
- t12 = messageDetailHeader(selectedMessage);
229
- $[33] = selectedMessage;
218
+ if ($[32] !== t10 || $[33] !== t11) {
219
+ t12 = {
220
+ key: "detail",
221
+ header: t10,
222
+ children: t11
223
+ };
224
+ $[32] = t10;
225
+ $[33] = t11;
230
226
  $[34] = t12;
231
227
  } else t12 = $[34];
232
228
  let t13;
233
- if ($[35] !== selectedMessage) {
234
- t13 = /* @__PURE__ */ jsx(MessageDetailBody, { message: selectedMessage });
235
- $[35] = selectedMessage;
236
- $[36] = t13;
237
- } else t13 = $[36];
238
- let t14;
239
- if ($[37] !== t12 || $[38] !== t13) {
240
- t14 = {
241
- key: "detail",
242
- header: t12,
243
- children: t13
244
- };
245
- $[37] = t12;
246
- $[38] = t13;
247
- $[39] = t14;
248
- } else t14 = $[39];
249
- let t15;
250
- if ($[40] !== t11 || $[41] !== t14) {
251
- t15 = /* @__PURE__ */ jsx(SplitLayout, {
229
+ if ($[35] !== t12 || $[36] !== t9) {
230
+ t13 = /* @__PURE__ */ jsx(SplitLayout, {
252
231
  sizes: TWO_COL,
253
- columns: [t11, t14]
232
+ columns: [t9, t12]
254
233
  });
255
- $[40] = t11;
256
- $[41] = t14;
257
- $[42] = t15;
258
- } else t15 = $[42];
259
- return t15;
234
+ $[35] = t12;
235
+ $[36] = t9;
236
+ $[37] = t13;
237
+ } else t13 = $[37];
238
+ return t13;
260
239
  }
261
240
  if (!(activeThread !== null && activeThread.messages.length > 0)) {
262
- let t8;
263
- if ($[43] !== threadList) {
264
- t8 = conversationListHeader(threadList);
265
- $[43] = threadList;
266
- $[44] = t8;
267
- } else t8 = $[44];
268
- let t9;
269
- if ($[45] !== activeThreadId || $[46] !== snapshots || $[47] !== threadList) {
270
- t9 = /* @__PURE__ */ jsx(ConversationList, {
241
+ let t6;
242
+ if ($[38] !== threadList) {
243
+ t6 = conversationListHeader(threadList);
244
+ $[38] = threadList;
245
+ $[39] = t6;
246
+ } else t6 = $[39];
247
+ let t7;
248
+ if ($[40] !== activeThreadId || $[41] !== snapshots || $[42] !== threadList) {
249
+ t7 = /* @__PURE__ */ jsx(ConversationList, {
271
250
  threadList,
272
251
  snapshots,
273
252
  selectedId: activeThreadId,
274
253
  onSelect: setActiveThreadId
275
254
  });
276
- $[45] = activeThreadId;
277
- $[46] = snapshots;
278
- $[47] = threadList;
279
- $[48] = t9;
280
- } else t9 = $[48];
281
- let t10;
282
- if ($[49] !== t8 || $[50] !== t9) {
283
- t10 = {
255
+ $[40] = activeThreadId;
256
+ $[41] = snapshots;
257
+ $[42] = threadList;
258
+ $[43] = t7;
259
+ } else t7 = $[43];
260
+ let t8;
261
+ if ($[44] !== t6 || $[45] !== t7) {
262
+ t8 = {
284
263
  key: "conversations",
285
- header: t8,
286
- children: t9
264
+ header: t6,
265
+ children: t7
287
266
  };
288
- $[49] = t8;
289
- $[50] = t9;
290
- $[51] = t10;
291
- } else t10 = $[51];
292
- let t11;
293
- if ($[52] !== activeThreadId || $[53] !== switchToThread) {
294
- t11 = {
267
+ $[44] = t6;
268
+ $[45] = t7;
269
+ $[46] = t8;
270
+ } else t8 = $[46];
271
+ let t9;
272
+ if ($[47] !== activeThreadId || $[48] !== switchToThread) {
273
+ t9 = {
295
274
  key: "empty",
296
275
  children: /* @__PURE__ */ jsx(UnloadedConversation, {
297
276
  threadId: activeThreadId,
298
277
  switchToThread
299
278
  })
300
279
  };
301
- $[52] = activeThreadId;
302
- $[53] = switchToThread;
303
- $[54] = t11;
304
- } else t11 = $[54];
305
- let t12;
306
- if ($[55] !== t10 || $[56] !== t11) {
307
- t12 = /* @__PURE__ */ jsx(SplitLayout, {
280
+ $[47] = activeThreadId;
281
+ $[48] = switchToThread;
282
+ $[49] = t9;
283
+ } else t9 = $[49];
284
+ let t10;
285
+ if ($[50] !== t8 || $[51] !== t9) {
286
+ t10 = /* @__PURE__ */ jsx(SplitLayout, {
308
287
  sizes: "clamp(12rem,26%,15rem)_minmax(0,1fr)",
309
- columns: [t10, t11]
288
+ columns: [t8, t9]
310
289
  });
311
- $[55] = t10;
312
- $[56] = t11;
313
- $[57] = t12;
314
- } else t12 = $[57];
315
- return t12;
290
+ $[50] = t8;
291
+ $[51] = t9;
292
+ $[52] = t10;
293
+ } else t10 = $[52];
294
+ return t10;
316
295
  }
296
+ let t6;
297
+ if ($[53] !== selectedMessage.id) {
298
+ t6 = messageNodeId(selectedMessage.id);
299
+ $[53] = selectedMessage.id;
300
+ $[54] = t6;
301
+ } else t6 = $[54];
302
+ const activeNodeId_0 = t6;
303
+ let t7;
304
+ if ($[55] !== threadList) {
305
+ t7 = conversationListHeader(threadList);
306
+ $[55] = threadList;
307
+ $[56] = t7;
308
+ } else t7 = $[56];
317
309
  let t8;
318
- if ($[58] !== selectedMessage.id) {
319
- t8 = messageNodeId(selectedMessage.id);
320
- $[58] = selectedMessage.id;
321
- $[59] = t8;
322
- } else t8 = $[59];
323
- const activeNodeId_0 = t8;
324
- let t9;
325
- if ($[60] !== threadList) {
326
- t9 = conversationListHeader(threadList);
327
- $[60] = threadList;
328
- $[61] = t9;
329
- } else t9 = $[61];
330
- let t10;
331
- if ($[62] !== activeThreadId || $[63] !== snapshots || $[64] !== threadList) {
332
- t10 = /* @__PURE__ */ jsx(ConversationList, {
310
+ if ($[57] !== activeThreadId || $[58] !== snapshots || $[59] !== threadList) {
311
+ t8 = /* @__PURE__ */ jsx(ConversationList, {
333
312
  threadList,
334
313
  snapshots,
335
314
  selectedId: activeThreadId,
336
315
  onSelect: setActiveThreadId
337
316
  });
338
- $[62] = activeThreadId;
339
- $[63] = snapshots;
340
- $[64] = threadList;
317
+ $[57] = activeThreadId;
318
+ $[58] = snapshots;
319
+ $[59] = threadList;
320
+ $[60] = t8;
321
+ } else t8 = $[60];
322
+ let t9;
323
+ if ($[61] !== t7 || $[62] !== t8) {
324
+ t9 = {
325
+ key: "conversations",
326
+ header: t7,
327
+ children: t8
328
+ };
329
+ $[61] = t7;
330
+ $[62] = t8;
331
+ $[63] = t9;
332
+ } else t9 = $[63];
333
+ let t10;
334
+ if ($[64] !== activeThread) {
335
+ t10 = /* @__PURE__ */ jsx(TranscriptHeader, { thread: activeThread });
336
+ $[64] = activeThread;
341
337
  $[65] = t10;
342
338
  } else t10 = $[65];
343
339
  let t11;
344
- if ($[66] !== t10 || $[67] !== t9) {
345
- t11 = {
346
- key: "conversations",
347
- header: t9,
348
- children: t10
349
- };
350
- $[66] = t10;
351
- $[67] = t9;
352
- $[68] = t11;
353
- } else t11 = $[68];
354
- let t12;
355
- if ($[69] !== activeThread) {
356
- t12 = /* @__PURE__ */ jsx(TranscriptHeader, { thread: activeThread });
357
- $[69] = activeThread;
358
- $[70] = t12;
359
- } else t12 = $[70];
360
- let t13;
361
- if ($[71] !== activeNodeId_0 || $[72] !== activeThread || $[73] !== setSelection) {
362
- t13 = /* @__PURE__ */ jsx(Transcript, {
340
+ if ($[66] !== activeNodeId_0 || $[67] !== activeThread || $[68] !== setSelection) {
341
+ t11 = /* @__PURE__ */ jsx(Transcript, {
363
342
  thread: activeThread,
364
343
  selection: activeNodeId_0,
365
344
  onSelect: setSelection
366
345
  });
367
- $[71] = activeNodeId_0;
368
- $[72] = activeThread;
369
- $[73] = setSelection;
346
+ $[66] = activeNodeId_0;
347
+ $[67] = activeThread;
348
+ $[68] = setSelection;
349
+ $[69] = t11;
350
+ } else t11 = $[69];
351
+ let t12;
352
+ if ($[70] !== t10 || $[71] !== t11) {
353
+ t12 = {
354
+ key: "transcript",
355
+ header: t10,
356
+ children: t11
357
+ };
358
+ $[70] = t10;
359
+ $[71] = t11;
360
+ $[72] = t12;
361
+ } else t12 = $[72];
362
+ let t13;
363
+ if ($[73] !== selectedMessage) {
364
+ t13 = messageDetailHeader(selectedMessage);
365
+ $[73] = selectedMessage;
370
366
  $[74] = t13;
371
367
  } else t13 = $[74];
372
368
  let t14;
373
- if ($[75] !== t12 || $[76] !== t13) {
374
- t14 = {
375
- key: "transcript",
376
- header: t12,
377
- children: t13
378
- };
379
- $[75] = t12;
380
- $[76] = t13;
381
- $[77] = t14;
382
- } else t14 = $[77];
369
+ if ($[75] !== selectedMessage) {
370
+ t14 = /* @__PURE__ */ jsx(MessageDetailBody, { message: selectedMessage });
371
+ $[75] = selectedMessage;
372
+ $[76] = t14;
373
+ } else t14 = $[76];
383
374
  let t15;
384
- if ($[78] !== selectedMessage) {
385
- t15 = messageDetailHeader(selectedMessage);
386
- $[78] = selectedMessage;
375
+ if ($[77] !== t13 || $[78] !== t14) {
376
+ t15 = {
377
+ key: "detail",
378
+ header: t13,
379
+ children: t14
380
+ };
381
+ $[77] = t13;
382
+ $[78] = t14;
387
383
  $[79] = t15;
388
384
  } else t15 = $[79];
389
385
  let t16;
390
- if ($[80] !== selectedMessage) {
391
- t16 = /* @__PURE__ */ jsx(MessageDetailBody, { message: selectedMessage });
392
- $[80] = selectedMessage;
393
- $[81] = t16;
394
- } else t16 = $[81];
395
- let t17;
396
- if ($[82] !== t15 || $[83] !== t16) {
397
- t17 = {
398
- key: "detail",
399
- header: t15,
400
- children: t16
401
- };
402
- $[82] = t15;
403
- $[83] = t16;
404
- $[84] = t17;
405
- } else t17 = $[84];
406
- let t18;
407
- if ($[85] !== t11 || $[86] !== t14 || $[87] !== t17) {
408
- t18 = /* @__PURE__ */ jsx(SplitLayout, {
386
+ if ($[80] !== t12 || $[81] !== t15 || $[82] !== t9) {
387
+ t16 = /* @__PURE__ */ jsx(SplitLayout, {
409
388
  sizes: THREE_COL,
410
389
  columns: [
411
- t11,
412
- t14,
413
- t17
390
+ t9,
391
+ t12,
392
+ t15
414
393
  ]
415
394
  });
416
- $[85] = t11;
417
- $[86] = t14;
418
- $[87] = t17;
419
- $[88] = t18;
420
- } else t18 = $[88];
421
- return t18;
395
+ $[80] = t12;
396
+ $[81] = t15;
397
+ $[82] = t9;
398
+ $[83] = t16;
399
+ } else t16 = $[83];
400
+ return t16;
422
401
  };
423
402
  //#endregion
424
403
  export { ThreadTab };
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadTab.js","names":["useEffect","useMemo","useRef","useState","MessageDetailBody","messageDetailHeader","ConversationList","Transcript","TranscriptHeader","conversationListHeader","messageNodeId","parseThreadListPreview","resolveSingleThread","resolveThreadForId","ThreadPreview","CenteredMessage","ControlButton","EmptyState","SplitLayout","DevToolsTabContext","TWO_COL","THREE_COL","useSelectedMessage","thread","selection","setSelection","$","_c","t0","bb0","messages","length","t1","t2","message","id","find","match","selectedMessage","last","UnloadedConversation","switchToThread","threadId","Symbol","for","t3","ThreadTab","data","state","threads","threadList","snapshots","threadSnapshots","hasConversationList","threadIds","mainThreadId","activeThreadId","setActiveThreadId","t4","ids","archivedThreadIds","includes","prevThreadIdRef","t5","t6","current","t7","t8","activeThread","activeNodeId","t9","t10","t11","key","header","children","t12","t13","t14","t15","loaded","activeNodeId_0","t16","t17","t18"],"sources":["../../../src/shell/tabs/ThreadTab.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { MessageDetailBody, messageDetailHeader } from \"../../views/message\";\nimport {\n ConversationList,\n Transcript,\n TranscriptHeader,\n conversationListHeader,\n messageNodeId,\n parseThreadListPreview,\n resolveSingleThread,\n resolveThreadForId,\n} from \"../../views/thread\";\nimport type { ThreadPreview } from \"../../views/thread\";\nimport { CenteredMessage, ControlButton, EmptyState } from \"../../views/ui\";\nimport { SplitLayout } from \"../SplitLayout\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst TWO_COL = \"clamp(16rem,32%,22rem)_minmax(0,1fr)\";\nconst THREE_COL = \"clamp(12rem,26%,15rem)_clamp(14rem,32%,20rem)_minmax(0,1fr)\";\n\nconst useSelectedMessage = (\n thread: ThreadPreview | null,\n selection: string | null,\n setSelection: (nodeId: string | null) => void,\n) => {\n const selectedMessage = useMemo(() => {\n if (!thread || thread.messages.length === 0) return null;\n const match = thread.messages.find(\n (message) => messageNodeId(message.id) === selection,\n );\n return match ?? thread.messages[thread.messages.length - 1]!;\n }, [thread, selection]);\n\n useEffect(() => {\n if (!thread || thread.messages.length === 0 || selection !== null) return;\n const last = thread.messages[thread.messages.length - 1]!;\n setSelection(messageNodeId(last.id));\n }, [thread, selection, setSelection]);\n\n return selectedMessage;\n};\n\nconst UnloadedConversation = ({\n switchToThread,\n threadId,\n}: {\n switchToThread?: ((threadId: string) => void | Promise<void>) | undefined;\n threadId: string;\n}) => (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-6\">\n <EmptyState>\n This conversation has not been opened in the app yet, so its messages are\n not cached in DevTools.\n </EmptyState>\n {switchToThread ? (\n <ControlButton onClick={() => switchToThread(threadId)}>\n Load conversation\n </ControlButton>\n ) : null}\n </div>\n);\n\nexport const ThreadTab = ({\n data,\n selection,\n setSelection,\n switchToThread,\n}: DevToolsTabContext) => {\n const threadList = useMemo(\n () => parseThreadListPreview(data.state.threads),\n [data.state.threads],\n );\n const snapshots = data.threadSnapshots;\n\n const hasConversationList =\n threadList !== null && threadList.threadIds.length > 0;\n\n const [activeThreadId, setActiveThreadId] = useState<string>(\n () => threadList?.mainThreadId ?? threadList?.threadIds[0] ?? \"\",\n );\n\n useEffect(() => {\n if (!hasConversationList || !threadList) return;\n const ids = [...threadList.threadIds, ...threadList.archivedThreadIds];\n if (ids.includes(activeThreadId)) return;\n setActiveThreadId(threadList.mainThreadId ?? threadList.threadIds[0] ?? \"\");\n }, [hasConversationList, threadList, activeThreadId]);\n\n const prevThreadIdRef = useRef(activeThreadId);\n useEffect(() => {\n if (prevThreadIdRef.current === activeThreadId) return;\n prevThreadIdRef.current = activeThreadId;\n setSelection(null);\n }, [activeThreadId, setSelection]);\n\n const activeThread = useMemo(() => {\n if (!hasConversationList) {\n return resolveSingleThread(data.state);\n }\n return resolveThreadForId(\n data.state,\n snapshots,\n activeThreadId,\n threadList,\n );\n }, [hasConversationList, data.state, snapshots, activeThreadId, threadList]);\n\n const selectedMessage = useSelectedMessage(\n activeThread,\n selection,\n setSelection,\n );\n\n if (!hasConversationList) {\n if (!activeThread || activeThread.messages.length === 0) {\n return (\n <CenteredMessage>\n No thread messages for this assistant instance.\n </CenteredMessage>\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={TWO_COL}\n columns={[\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread} />,\n children: (\n <Transcript\n thread={activeThread}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n }\n\n const loaded = activeThread !== null && activeThread.messages.length > 0;\n\n if (!loaded) {\n return (\n <SplitLayout\n sizes=\"clamp(12rem,26%,15rem)_minmax(0,1fr)\"\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"empty\",\n children: (\n <UnloadedConversation\n threadId={activeThreadId}\n switchToThread={switchToThread}\n />\n ),\n },\n ]}\n />\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={THREE_COL}\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread!} />,\n children: (\n <Transcript\n thread={activeThread!}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadTab.js","names":["useEffect","useMemo","useRef","useState","MessageDetailBody","messageDetailHeader","ConversationList","Transcript","TranscriptHeader","conversationListHeader","messageNodeId","parseThreadListPreview","resolveSingleThread","resolveThreadForId","ThreadPreview","CenteredMessage","ControlButton","EmptyState","SplitLayout","DevToolsTabContext","TWO_COL","THREE_COL","useSelectedMessage","thread","selection","setSelection","$","_c","t0","bb0","messages","length","t1","t2","message","id","find","match","selectedMessage","last","UnloadedConversation","switchToThread","threadId","Symbol","for","t3","ThreadTab","data","state","threads","threadList","snapshots","threadSnapshots","hasConversationList","threadIds","mainThreadId","activeThreadId","setActiveThreadId","resolvedThreadId","archivedThreadIds","includes","prevThreadIdRef","t4","current","t5","t6","activeThread","activeNodeId","t7","t8","t9","key","header","children","t10","t11","t12","t13","loaded","activeNodeId_0","t14","t15","t16"],"sources":["../../../src/shell/tabs/ThreadTab.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { MessageDetailBody, messageDetailHeader } from \"../../views/message\";\nimport {\n ConversationList,\n Transcript,\n TranscriptHeader,\n conversationListHeader,\n messageNodeId,\n parseThreadListPreview,\n resolveSingleThread,\n resolveThreadForId,\n} from \"../../views/thread\";\nimport type { ThreadPreview } from \"../../views/thread\";\nimport { CenteredMessage, ControlButton, EmptyState } from \"../../views/ui\";\nimport { SplitLayout } from \"../SplitLayout\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst TWO_COL = \"clamp(16rem,32%,22rem)_minmax(0,1fr)\";\nconst THREE_COL = \"clamp(12rem,26%,15rem)_clamp(14rem,32%,20rem)_minmax(0,1fr)\";\n\nconst useSelectedMessage = (\n thread: ThreadPreview | null,\n selection: string | null,\n setSelection: (nodeId: string | null) => void,\n) => {\n const selectedMessage = useMemo(() => {\n if (!thread || thread.messages.length === 0) return null;\n const match = thread.messages.find(\n (message) => messageNodeId(message.id) === selection,\n );\n return match ?? thread.messages[thread.messages.length - 1]!;\n }, [thread, selection]);\n\n useEffect(() => {\n if (!thread || thread.messages.length === 0 || selection !== null) return;\n const last = thread.messages[thread.messages.length - 1]!;\n setSelection(messageNodeId(last.id));\n }, [thread, selection, setSelection]);\n\n return selectedMessage;\n};\n\nconst UnloadedConversation = ({\n switchToThread,\n threadId,\n}: {\n switchToThread?: ((threadId: string) => void | Promise<void>) | undefined;\n threadId: string;\n}) => (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-6\">\n <EmptyState>\n This conversation has not been opened in the app yet, so its messages are\n not cached in DevTools.\n </EmptyState>\n {switchToThread ? (\n <ControlButton onClick={() => switchToThread(threadId)}>\n Load conversation\n </ControlButton>\n ) : null}\n </div>\n);\n\nexport const ThreadTab = ({\n data,\n selection,\n setSelection,\n switchToThread,\n}: DevToolsTabContext) => {\n const threadList = useMemo(\n () => parseThreadListPreview(data.state.threads),\n [data.state.threads],\n );\n const snapshots = data.threadSnapshots;\n\n const hasConversationList =\n threadList !== null && threadList.threadIds.length > 0;\n\n const [activeThreadId, setActiveThreadId] = useState<string>(\n () => threadList?.mainThreadId ?? threadList?.threadIds[0] ?? \"\",\n );\n\n const resolvedThreadId =\n hasConversationList && threadList\n ? [...threadList.threadIds, ...threadList.archivedThreadIds].includes(\n activeThreadId,\n )\n ? activeThreadId\n : (threadList.mainThreadId ?? threadList.threadIds[0] ?? \"\")\n : activeThreadId;\n\n if (resolvedThreadId !== activeThreadId) setActiveThreadId(resolvedThreadId);\n\n const prevThreadIdRef = useRef(activeThreadId);\n useEffect(() => {\n if (prevThreadIdRef.current === activeThreadId) return;\n prevThreadIdRef.current = activeThreadId;\n setSelection(null);\n }, [activeThreadId, setSelection]);\n\n const activeThread = useMemo(() => {\n if (!hasConversationList) {\n return resolveSingleThread(data.state);\n }\n return resolveThreadForId(\n data.state,\n snapshots,\n activeThreadId,\n threadList,\n );\n }, [hasConversationList, data.state, snapshots, activeThreadId, threadList]);\n\n const selectedMessage = useSelectedMessage(\n activeThread,\n selection,\n setSelection,\n );\n\n if (!hasConversationList) {\n if (!activeThread || activeThread.messages.length === 0) {\n return (\n <CenteredMessage>\n No thread messages for this assistant instance.\n </CenteredMessage>\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={TWO_COL}\n columns={[\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread} />,\n children: (\n <Transcript\n thread={activeThread}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n }\n\n const loaded = activeThread !== null && activeThread.messages.length > 0;\n\n if (!loaded) {\n return (\n <SplitLayout\n sizes=\"clamp(12rem,26%,15rem)_minmax(0,1fr)\"\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"empty\",\n children: (\n <UnloadedConversation\n threadId={activeThreadId}\n switchToThread={switchToThread}\n />\n ),\n },\n ]}\n />\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={THREE_COL}\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread!} />,\n children: (\n <Transcript\n thread={activeThread!}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react-devtools",
3
- "version": "1.2.17",
3
+ "version": "1.2.18",
4
4
  "description": "React development tools for assistant-ui components",
5
5
  "keywords": [
6
6
  "assistant-ui",
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "peerDependencies": {
34
34
  "@assistant-ui/react": "^0.15.0",
35
- "@assistant-ui/tap": "^0.9.16",
35
+ "@assistant-ui/tap": "^0.9.17",
36
36
  "@types/react": "*",
37
37
  "@types/react-dom": "*",
38
38
  "react": "^18 || ^19",
@@ -47,13 +47,13 @@
47
47
  }
48
48
  },
49
49
  "devDependencies": {
50
- "@assistant-ui/react": "0.15.18",
51
- "@assistant-ui/tap": "0.9.16",
52
- "@assistant-ui/x-buildutils": "0.0.25",
50
+ "@assistant-ui/react": "0.15.19",
51
+ "@assistant-ui/tap": "0.9.17",
52
+ "@assistant-ui/x-buildutils": "0.0.26",
53
53
  "@tailwindcss/cli": "^4.3.3",
54
- "@types/node": "^26.4.0",
54
+ "@types/node": "^26.4.1",
55
55
  "@types/react": "^19.2.18",
56
- "@types/react-dom": "^19.2.5",
56
+ "@types/react-dom": "^19.2.7",
57
57
  "react": "^19.2.8",
58
58
  "react-dom": "^19.2.8",
59
59
  "tailwindcss": "^4.3.3",
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useEffect, useMemo, useState } from "react";
3
+ import { useCallback, useMemo, useState } from "react";
4
4
  import clsx from "clsx";
5
5
  import { useDevToolsClient } from "../data/useDevToolsClient";
6
6
  import { inProcessClient } from "../data/createInProcessClient";
@@ -40,10 +40,12 @@ export const DevToolsPanel = ({
40
40
  resolvedClient,
41
41
  );
42
42
 
43
- useEffect(() => {
44
- if (selectedApiId !== null && apiIds.includes(selectedApiId)) return;
45
- setSelectedApiId(apiIds[0] ?? null);
46
- }, [apiIds, selectedApiId]);
43
+ const resolvedApiId =
44
+ selectedApiId !== null && apiIds.includes(selectedApiId)
45
+ ? selectedApiId
46
+ : (apiIds[0] ?? null);
47
+
48
+ if (resolvedApiId !== selectedApiId) setSelectedApiId(resolvedApiId);
47
49
 
48
50
  const allPlugins = useMemo(
49
51
  () =>
@@ -79,12 +79,16 @@ export const ThreadTab = ({
79
79
  () => threadList?.mainThreadId ?? threadList?.threadIds[0] ?? "",
80
80
  );
81
81
 
82
- useEffect(() => {
83
- if (!hasConversationList || !threadList) return;
84
- const ids = [...threadList.threadIds, ...threadList.archivedThreadIds];
85
- if (ids.includes(activeThreadId)) return;
86
- setActiveThreadId(threadList.mainThreadId ?? threadList.threadIds[0] ?? "");
87
- }, [hasConversationList, threadList, activeThreadId]);
82
+ const resolvedThreadId =
83
+ hasConversationList && threadList
84
+ ? [...threadList.threadIds, ...threadList.archivedThreadIds].includes(
85
+ activeThreadId,
86
+ )
87
+ ? activeThreadId
88
+ : (threadList.mainThreadId ?? threadList.threadIds[0] ?? "")
89
+ : activeThreadId;
90
+
91
+ if (resolvedThreadId !== activeThreadId) setActiveThreadId(resolvedThreadId);
88
92
 
89
93
  const prevThreadIdRef = useRef(activeThreadId);
90
94
  useEffect(() => {