@assistant-ui/react-devtools 1.2.6 → 1.2.7

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 (533) hide show
  1. package/README.md +26 -8
  2. package/dist/DevToolsModal.d.ts +18 -2
  3. package/dist/DevToolsModal.d.ts.map +1 -1
  4. package/dist/DevToolsModal.js +25 -232
  5. package/dist/DevToolsModal.js.map +1 -1
  6. package/dist/DevToolsModalImpl.d.ts +11 -0
  7. package/dist/DevToolsModalImpl.d.ts.map +1 -0
  8. package/dist/DevToolsModalImpl.js +62 -0
  9. package/dist/DevToolsModalImpl.js.map +1 -0
  10. package/dist/data/createInProcessClient.d.ts +17 -0
  11. package/dist/data/createInProcessClient.d.ts.map +1 -0
  12. package/dist/data/createInProcessClient.js +54 -0
  13. package/dist/data/createInProcessClient.js.map +1 -0
  14. package/dist/data/projectApi.d.ts +22 -0
  15. package/dist/data/projectApi.d.ts.map +1 -0
  16. package/dist/data/projectApi.js +103 -0
  17. package/dist/data/projectApi.js.map +1 -0
  18. package/dist/data/types.d.ts +52 -0
  19. package/dist/data/types.d.ts.map +1 -0
  20. package/dist/data/types.js +10 -0
  21. package/dist/data/types.js.map +1 -0
  22. package/dist/data/useDevToolsClient.d.ts +19 -0
  23. package/dist/data/useDevToolsClient.d.ts.map +1 -0
  24. package/dist/data/useDevToolsClient.js +70 -0
  25. package/dist/data/useDevToolsClient.js.map +1 -0
  26. package/dist/index.d.ts +9 -10
  27. package/dist/index.js +7 -9
  28. package/dist/shell/DevToolsOverlay.d.ts +23 -0
  29. package/dist/shell/DevToolsOverlay.d.ts.map +1 -0
  30. package/dist/shell/DevToolsOverlay.js +106 -0
  31. package/dist/shell/DevToolsOverlay.js.map +1 -0
  32. package/dist/shell/DevToolsPanel.d.ts +23 -0
  33. package/dist/shell/DevToolsPanel.d.ts.map +1 -0
  34. package/dist/shell/DevToolsPanel.js +256 -0
  35. package/dist/shell/DevToolsPanel.js.map +1 -0
  36. package/dist/shell/ShadowRoot.d.ts +24 -0
  37. package/dist/shell/ShadowRoot.d.ts.map +1 -0
  38. package/dist/shell/ShadowRoot.js +107 -0
  39. package/dist/shell/ShadowRoot.js.map +1 -0
  40. package/dist/shell/SplitLayout.d.ts +28 -0
  41. package/dist/shell/SplitLayout.d.ts.map +1 -0
  42. package/dist/shell/SplitLayout.js +67 -0
  43. package/dist/shell/SplitLayout.js.map +1 -0
  44. package/dist/shell/registry.d.ts +41 -0
  45. package/dist/shell/registry.d.ts.map +1 -0
  46. package/dist/shell/registry.js +36 -0
  47. package/dist/shell/registry.js.map +1 -0
  48. package/dist/shell/tabs/ActivityTab.d.ts +13 -0
  49. package/dist/shell/tabs/ActivityTab.d.ts.map +1 -0
  50. package/dist/shell/tabs/ActivityTab.js +259 -0
  51. package/dist/shell/tabs/ActivityTab.js.map +1 -0
  52. package/dist/shell/tabs/ContextTab.d.ts +11 -0
  53. package/dist/shell/tabs/ContextTab.d.ts.map +1 -0
  54. package/dist/shell/tabs/ContextTab.js +210 -0
  55. package/dist/shell/tabs/ContextTab.js.map +1 -0
  56. package/dist/shell/tabs/RawTab.d.ts +11 -0
  57. package/dist/shell/tabs/RawTab.d.ts.map +1 -0
  58. package/dist/shell/tabs/RawTab.js +238 -0
  59. package/dist/shell/tabs/RawTab.js.map +1 -0
  60. package/dist/shell/tabs/ThreadTab.d.ts +12 -0
  61. package/dist/shell/tabs/ThreadTab.d.ts.map +1 -0
  62. package/dist/shell/tabs/ThreadTab.js +426 -0
  63. package/dist/shell/tabs/ThreadTab.js.map +1 -0
  64. package/dist/shell/tabs/navSelection.d.ts +10 -0
  65. package/dist/shell/tabs/navSelection.d.ts.map +1 -0
  66. package/dist/shell/tabs/navSelection.js +37 -0
  67. package/dist/shell/tabs/navSelection.js.map +1 -0
  68. package/dist/styles/panel.generated.d.ts +5 -0
  69. package/dist/styles/panel.generated.d.ts.map +1 -0
  70. package/dist/styles/panel.generated.js +6 -0
  71. package/dist/styles/panel.generated.js.map +1 -0
  72. package/dist/types.d.ts +1 -3
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/utils/common.d.ts +24 -0
  75. package/dist/utils/common.d.ts.map +1 -0
  76. package/dist/utils/common.js +64 -0
  77. package/dist/utils/common.js.map +1 -0
  78. package/dist/utils/diff.d.ts +16 -0
  79. package/dist/utils/diff.d.ts.map +1 -0
  80. package/dist/utils/diff.js +41 -0
  81. package/dist/utils/diff.js.map +1 -0
  82. package/dist/utils/serialization.d.ts.map +1 -1
  83. package/dist/utils/serialization.js +4 -1
  84. package/dist/utils/serialization.js.map +1 -1
  85. package/dist/views/activity/EventLogRow.d.ts +28 -0
  86. package/dist/views/activity/EventLogRow.d.ts.map +1 -0
  87. package/dist/views/activity/EventLogRow.js +185 -0
  88. package/dist/views/activity/EventLogRow.js.map +1 -0
  89. package/dist/views/activity/EventStreamPane.d.ts +11 -0
  90. package/dist/views/activity/EventStreamPane.d.ts.map +1 -0
  91. package/dist/views/activity/EventStreamPane.js +98 -0
  92. package/dist/views/activity/EventStreamPane.js.map +1 -0
  93. package/dist/views/activity/OrphansPane.d.ts +11 -0
  94. package/dist/views/activity/OrphansPane.d.ts.map +1 -0
  95. package/dist/views/activity/OrphansPane.js +39 -0
  96. package/dist/views/activity/OrphansPane.js.map +1 -0
  97. package/dist/views/activity/RunDetailPane.d.ts +11 -0
  98. package/dist/views/activity/RunDetailPane.d.ts.map +1 -0
  99. package/dist/views/activity/RunDetailPane.js +344 -0
  100. package/dist/views/activity/RunDetailPane.js.map +1 -0
  101. package/dist/views/activity/activityNodes.d.ts +39 -0
  102. package/dist/views/activity/activityNodes.d.ts.map +1 -0
  103. package/dist/views/activity/activityNodes.js +199 -0
  104. package/dist/views/activity/activityNodes.js.map +1 -0
  105. package/dist/views/activity/index.d.ts +6 -0
  106. package/dist/views/activity/index.js +6 -0
  107. package/dist/views/attachments/AttachmentList.d.ts +15 -0
  108. package/dist/views/attachments/AttachmentList.d.ts.map +1 -0
  109. package/dist/views/attachments/AttachmentList.js +279 -0
  110. package/dist/views/attachments/AttachmentList.js.map +1 -0
  111. package/dist/views/attachments/MediaPartView.d.ts +27 -0
  112. package/dist/views/attachments/MediaPartView.d.ts.map +1 -0
  113. package/dist/views/attachments/MediaPartView.js +180 -0
  114. package/dist/views/attachments/MediaPartView.js.map +1 -0
  115. package/dist/views/attachments/formatBytes.d.ts +8 -0
  116. package/dist/views/attachments/formatBytes.d.ts.map +1 -0
  117. package/dist/views/attachments/formatBytes.js +14 -0
  118. package/dist/views/attachments/formatBytes.js.map +1 -0
  119. package/dist/views/attachments/index.d.ts +5 -0
  120. package/dist/views/attachments/index.js +4 -0
  121. package/dist/views/attachments/parseAttachment.d.ts +8 -0
  122. package/dist/views/attachments/parseAttachment.d.ts.map +1 -0
  123. package/dist/views/attachments/parseAttachment.js +58 -0
  124. package/dist/views/attachments/parseAttachment.js.map +1 -0
  125. package/dist/views/attachments/types.d.ts +18 -0
  126. package/dist/views/attachments/types.d.ts.map +1 -0
  127. package/dist/views/attachments/types.js +0 -0
  128. package/dist/views/context/ContextDetail.d.ts +14 -0
  129. package/dist/views/context/ContextDetail.d.ts.map +1 -0
  130. package/dist/views/context/ContextDetail.js +87 -0
  131. package/dist/views/context/ContextDetail.js.map +1 -0
  132. package/dist/views/context/ToolUIsView.d.ts +9 -0
  133. package/dist/views/context/ToolUIsView.d.ts.map +1 -0
  134. package/dist/views/context/ToolUIsView.js +80 -0
  135. package/dist/views/context/ToolUIsView.js.map +1 -0
  136. package/dist/views/context/contextNodes.d.ts +32 -0
  137. package/dist/views/context/contextNodes.d.ts.map +1 -0
  138. package/dist/views/context/contextNodes.js +49 -0
  139. package/dist/views/context/contextNodes.js.map +1 -0
  140. package/dist/views/context/index.d.ts +4 -0
  141. package/dist/views/context/index.js +4 -0
  142. package/dist/views/mcp/McpView.d.ts +11 -0
  143. package/dist/views/mcp/McpView.d.ts.map +1 -0
  144. package/dist/views/mcp/McpView.js +239 -0
  145. package/dist/views/mcp/McpView.js.map +1 -0
  146. package/dist/views/mcp/index.d.ts +2 -0
  147. package/dist/views/mcp/index.js +2 -0
  148. package/dist/views/mcp/parse.d.ts +7 -0
  149. package/dist/views/mcp/parse.d.ts.map +1 -0
  150. package/dist/views/mcp/parse.js +43 -0
  151. package/dist/views/mcp/parse.js.map +1 -0
  152. package/dist/views/mcp/types.d.ts +22 -0
  153. package/dist/views/mcp/types.d.ts.map +1 -0
  154. package/dist/views/mcp/types.js +0 -0
  155. package/dist/views/message/ChainOfThought.d.ts +11 -0
  156. package/dist/views/message/ChainOfThought.d.ts.map +1 -0
  157. package/dist/views/message/ChainOfThought.js +132 -0
  158. package/dist/views/message/ChainOfThought.js.map +1 -0
  159. package/dist/views/message/MessageDetailPane.d.ts +12 -0
  160. package/dist/views/message/MessageDetailPane.d.ts.map +1 -0
  161. package/dist/views/message/MessageDetailPane.js +38 -0
  162. package/dist/views/message/MessageDetailPane.js.map +1 -0
  163. package/dist/views/message/MessageItem.d.ts +13 -0
  164. package/dist/views/message/MessageItem.d.ts.map +1 -0
  165. package/dist/views/message/MessageItem.js +136 -0
  166. package/dist/views/message/MessageItem.js.map +1 -0
  167. package/dist/views/message/MessageList.d.ts +13 -0
  168. package/dist/views/message/MessageList.d.ts.map +1 -0
  169. package/dist/views/message/MessageList.js +95 -0
  170. package/dist/views/message/MessageList.js.map +1 -0
  171. package/dist/views/message/MessageMetrics.d.ts +11 -0
  172. package/dist/views/message/MessageMetrics.d.ts.map +1 -0
  173. package/dist/views/message/MessageMetrics.js +93 -0
  174. package/dist/views/message/MessageMetrics.js.map +1 -0
  175. package/dist/views/message/MessageTimeline.d.ts +16 -0
  176. package/dist/views/message/MessageTimeline.d.ts.map +1 -0
  177. package/dist/views/message/MessageTimeline.js +100 -0
  178. package/dist/views/message/MessageTimeline.js.map +1 -0
  179. package/dist/views/message/PartDisclosure.d.ts +18 -0
  180. package/dist/views/message/PartDisclosure.d.ts.map +1 -0
  181. package/dist/views/message/PartDisclosure.js +79 -0
  182. package/dist/views/message/PartDisclosure.js.map +1 -0
  183. package/dist/views/message/PartView.d.ts +13 -0
  184. package/dist/views/message/PartView.d.ts.map +1 -0
  185. package/dist/views/message/PartView.js +416 -0
  186. package/dist/views/message/PartView.js.map +1 -0
  187. package/dist/views/message/RoleLabel.d.ts +11 -0
  188. package/dist/views/message/RoleLabel.d.ts.map +1 -0
  189. package/dist/views/message/RoleLabel.js +30 -0
  190. package/dist/views/message/RoleLabel.js.map +1 -0
  191. package/dist/views/message/StatusBadge.d.ts +17 -0
  192. package/dist/views/message/StatusBadge.d.ts.map +1 -0
  193. package/dist/views/message/StatusBadge.js +58 -0
  194. package/dist/views/message/StatusBadge.js.map +1 -0
  195. package/dist/views/message/ToolCallView.d.ts +13 -0
  196. package/dist/views/message/ToolCallView.d.ts.map +1 -0
  197. package/dist/views/message/ToolCallView.js +289 -0
  198. package/dist/views/message/ToolCallView.js.map +1 -0
  199. package/dist/views/message/TtftBar.d.ts +16 -0
  200. package/dist/views/message/TtftBar.d.ts.map +1 -0
  201. package/dist/views/message/TtftBar.js +128 -0
  202. package/dist/views/message/TtftBar.js.map +1 -0
  203. package/dist/views/message/index.d.ts +6 -0
  204. package/dist/views/message/index.js +5 -0
  205. package/dist/views/message/messagePlainText.d.ts +8 -0
  206. package/dist/views/message/messagePlainText.d.ts.map +1 -0
  207. package/dist/views/message/messagePlainText.js +39 -0
  208. package/dist/views/message/messagePlainText.js.map +1 -0
  209. package/dist/views/message/parse.d.ts +10 -0
  210. package/dist/views/message/parse.d.ts.map +1 -0
  211. package/dist/views/message/parse.js +235 -0
  212. package/dist/views/message/parse.js.map +1 -0
  213. package/dist/views/message/types.d.ts +114 -0
  214. package/dist/views/message/types.d.ts.map +1 -0
  215. package/dist/views/message/types.js +0 -0
  216. package/dist/views/model-context/ModelContextView.d.ts +26 -0
  217. package/dist/views/model-context/ModelContextView.d.ts.map +1 -0
  218. package/dist/views/model-context/ModelContextView.js +214 -0
  219. package/dist/views/model-context/ModelContextView.js.map +1 -0
  220. package/dist/views/nav.d.ts +19 -0
  221. package/dist/views/nav.d.ts.map +1 -0
  222. package/dist/views/nav.js +8 -0
  223. package/dist/views/nav.js.map +1 -0
  224. package/dist/views/raw/RawDetail.d.ts +15 -0
  225. package/dist/views/raw/RawDetail.d.ts.map +1 -0
  226. package/dist/views/raw/RawDetail.js +79 -0
  227. package/dist/views/raw/RawDetail.js.map +1 -0
  228. package/dist/views/raw/index.d.ts +3 -0
  229. package/dist/views/raw/index.js +3 -0
  230. package/dist/views/raw/rawNodes.d.ts +20 -0
  231. package/dist/views/raw/rawNodes.d.ts.map +1 -0
  232. package/dist/views/raw/rawNodes.js +78 -0
  233. package/dist/views/raw/rawNodes.js.map +1 -0
  234. package/dist/views/raw/statePreview.d.ts +5 -0
  235. package/dist/views/raw/statePreview.d.ts.map +1 -0
  236. package/dist/views/raw/statePreview.js +213 -0
  237. package/dist/views/raw/statePreview.js.map +1 -0
  238. package/dist/views/runs/PayloadDiff.d.ts +11 -0
  239. package/dist/views/runs/PayloadDiff.d.ts.map +1 -0
  240. package/dist/views/runs/PayloadDiff.js +92 -0
  241. package/dist/views/runs/PayloadDiff.js.map +1 -0
  242. package/dist/views/runs/parse.d.ts +8 -0
  243. package/dist/views/runs/parse.d.ts.map +1 -0
  244. package/dist/views/runs/parse.js +78 -0
  245. package/dist/views/runs/parse.js.map +1 -0
  246. package/dist/views/runs/types.d.ts +25 -0
  247. package/dist/views/runs/types.d.ts.map +1 -0
  248. package/dist/views/runs/types.js +0 -0
  249. package/dist/views/scopes/ScopesView.d.ts +9 -0
  250. package/dist/views/scopes/ScopesView.d.ts.map +1 -0
  251. package/dist/views/scopes/ScopesView.js +235 -0
  252. package/dist/views/scopes/ScopesView.js.map +1 -0
  253. package/dist/views/scopes/index.d.ts +2 -0
  254. package/dist/views/scopes/index.js +2 -0
  255. package/dist/views/scopes/parse.d.ts +7 -0
  256. package/dist/views/scopes/parse.d.ts.map +1 -0
  257. package/dist/views/scopes/parse.js +23 -0
  258. package/dist/views/scopes/parse.js.map +1 -0
  259. package/dist/views/scopes/types.d.ts +10 -0
  260. package/dist/views/scopes/types.d.ts.map +1 -0
  261. package/dist/views/scopes/types.js +0 -0
  262. package/dist/views/thread/ComposerAttachments.d.ts +11 -0
  263. package/dist/views/thread/ComposerAttachments.d.ts.map +1 -0
  264. package/dist/views/thread/ComposerAttachments.js +22 -0
  265. package/dist/views/thread/ComposerAttachments.js.map +1 -0
  266. package/dist/views/thread/ComposerFlags.d.ts +11 -0
  267. package/dist/views/thread/ComposerFlags.d.ts.map +1 -0
  268. package/dist/views/thread/ComposerFlags.js +54 -0
  269. package/dist/views/thread/ComposerFlags.js.map +1 -0
  270. package/dist/views/thread/ComposerQueue.d.ts +11 -0
  271. package/dist/views/thread/ComposerQueue.d.ts.map +1 -0
  272. package/dist/views/thread/ComposerQueue.js +55 -0
  273. package/dist/views/thread/ComposerQueue.js.map +1 -0
  274. package/dist/views/thread/ConversationList.d.ts +18 -0
  275. package/dist/views/thread/ConversationList.d.ts.map +1 -0
  276. package/dist/views/thread/ConversationList.js +228 -0
  277. package/dist/views/thread/ConversationList.js.map +1 -0
  278. package/dist/views/thread/ConversationStatusDot.d.ts +29 -0
  279. package/dist/views/thread/ConversationStatusDot.d.ts.map +1 -0
  280. package/dist/views/thread/ConversationStatusDot.js +91 -0
  281. package/dist/views/thread/ConversationStatusDot.js.map +1 -0
  282. package/dist/views/thread/ThreadDetails.d.ts +13 -0
  283. package/dist/views/thread/ThreadDetails.d.ts.map +1 -0
  284. package/dist/views/thread/ThreadDetails.js +170 -0
  285. package/dist/views/thread/ThreadDetails.js.map +1 -0
  286. package/dist/views/thread/Transcript.d.ts +21 -0
  287. package/dist/views/thread/Transcript.d.ts.map +1 -0
  288. package/dist/views/thread/Transcript.js +520 -0
  289. package/dist/views/thread/Transcript.js.map +1 -0
  290. package/dist/views/thread/index.d.ts +10 -0
  291. package/dist/views/thread/index.js +9 -0
  292. package/dist/views/thread/resolve.d.ts +13 -0
  293. package/dist/views/thread/resolve.d.ts.map +1 -0
  294. package/dist/views/thread/resolve.js +29 -0
  295. package/dist/views/thread/resolve.js.map +1 -0
  296. package/dist/views/thread/types.d.ts +50 -0
  297. package/dist/views/thread/types.d.ts.map +1 -0
  298. package/dist/views/thread/types.js +0 -0
  299. package/dist/views/thread/utils.d.ts +10 -0
  300. package/dist/views/thread/utils.d.ts.map +1 -0
  301. package/dist/views/thread/utils.js +77 -0
  302. package/dist/views/thread/utils.js.map +1 -0
  303. package/dist/views/ui/CenteredMessage.d.ts +11 -0
  304. package/dist/views/ui/CenteredMessage.d.ts.map +1 -0
  305. package/dist/views/ui/CenteredMessage.js +21 -0
  306. package/dist/views/ui/CenteredMessage.js.map +1 -0
  307. package/dist/views/ui/Chip.d.ts +13 -0
  308. package/dist/views/ui/Chip.d.ts.map +1 -0
  309. package/dist/views/ui/Chip.js +30 -0
  310. package/dist/views/ui/Chip.js.map +1 -0
  311. package/dist/views/ui/ControlButton.d.ts +10 -0
  312. package/dist/views/ui/ControlButton.d.ts.map +1 -0
  313. package/dist/views/ui/ControlButton.js +39 -0
  314. package/dist/views/ui/ControlButton.js.map +1 -0
  315. package/dist/views/ui/CopyButton.d.ts +19 -0
  316. package/dist/views/ui/CopyButton.d.ts.map +1 -0
  317. package/dist/views/ui/CopyButton.js +125 -0
  318. package/dist/views/ui/CopyButton.js.map +1 -0
  319. package/dist/views/ui/EmptyState.d.ts +11 -0
  320. package/dist/views/ui/EmptyState.d.ts.map +1 -0
  321. package/dist/views/ui/EmptyState.js +21 -0
  322. package/dist/views/ui/EmptyState.js.map +1 -0
  323. package/dist/views/ui/InfoCard.d.ts +22 -0
  324. package/dist/views/ui/InfoCard.d.ts.map +1 -0
  325. package/dist/views/ui/InfoCard.js +44 -0
  326. package/dist/views/ui/InfoCard.js.map +1 -0
  327. package/dist/views/ui/JSONTree.d.ts +16 -0
  328. package/dist/views/ui/JSONTree.d.ts.map +1 -0
  329. package/dist/views/ui/JSONTree.js +394 -0
  330. package/dist/views/ui/JSONTree.js.map +1 -0
  331. package/dist/views/ui/PaneHeader.d.ts +27 -0
  332. package/dist/views/ui/PaneHeader.d.ts.map +1 -0
  333. package/dist/views/ui/PaneHeader.js +71 -0
  334. package/dist/views/ui/PaneHeader.js.map +1 -0
  335. package/dist/views/ui/RailTime.d.ts +12 -0
  336. package/dist/views/ui/RailTime.d.ts.map +1 -0
  337. package/dist/views/ui/RailTime.js +49 -0
  338. package/dist/views/ui/RailTime.js.map +1 -0
  339. package/dist/views/ui/SectionLabel.d.ts +11 -0
  340. package/dist/views/ui/SectionLabel.d.ts.map +1 -0
  341. package/dist/views/ui/SectionLabel.js +21 -0
  342. package/dist/views/ui/SectionLabel.js.map +1 -0
  343. package/dist/views/ui/SelectableRow.d.ts +18 -0
  344. package/dist/views/ui/SelectableRow.d.ts.map +1 -0
  345. package/dist/views/ui/SelectableRow.js +49 -0
  346. package/dist/views/ui/SelectableRow.js.map +1 -0
  347. package/dist/views/ui/Sparkline.d.ts +17 -0
  348. package/dist/views/ui/Sparkline.d.ts.map +1 -0
  349. package/dist/views/ui/Sparkline.js +96 -0
  350. package/dist/views/ui/Sparkline.js.map +1 -0
  351. package/dist/views/ui/SummaryItem.d.ts +23 -0
  352. package/dist/views/ui/SummaryItem.d.ts.map +1 -0
  353. package/dist/views/ui/SummaryItem.js +59 -0
  354. package/dist/views/ui/SummaryItem.js.map +1 -0
  355. package/dist/views/ui/ToneBadge.d.ts +18 -0
  356. package/dist/views/ui/ToneBadge.d.ts.map +1 -0
  357. package/dist/views/ui/ToneBadge.js +34 -0
  358. package/dist/views/ui/ToneBadge.js.map +1 -0
  359. package/dist/views/ui/badgeTone.d.ts +21 -0
  360. package/dist/views/ui/badgeTone.d.ts.map +1 -0
  361. package/dist/views/ui/badgeTone.js +33 -0
  362. package/dist/views/ui/badgeTone.js.map +1 -0
  363. package/dist/views/ui/index.d.ts +16 -0
  364. package/dist/views/ui/index.js +16 -0
  365. package/dist/views/ui/useCopyToClipboard.d.ts +12 -0
  366. package/dist/views/ui/useCopyToClipboard.d.ts.map +1 -0
  367. package/dist/views/ui/useCopyToClipboard.js +44 -0
  368. package/dist/views/ui/useCopyToClipboard.js.map +1 -0
  369. package/package.json +9 -5
  370. package/src/DevToolsModal.tsx +26 -179
  371. package/src/DevToolsModalImpl.tsx +60 -0
  372. package/src/data/createInProcessClient.ts +66 -0
  373. package/src/data/projectApi.test.ts +100 -0
  374. package/src/data/projectApi.ts +169 -0
  375. package/src/data/types.ts +54 -0
  376. package/src/data/useDevToolsClient.ts +59 -0
  377. package/src/index.ts +16 -13
  378. package/src/shell/DevToolsOverlay.tsx +84 -0
  379. package/src/shell/DevToolsPanel.tsx +192 -0
  380. package/src/shell/ShadowRoot.tsx +85 -0
  381. package/src/shell/SplitLayout.tsx +46 -0
  382. package/src/shell/registry.ts +51 -0
  383. package/src/shell/tabs/ActivityTab.test.tsx +34 -0
  384. package/src/shell/tabs/ActivityTab.tsx +161 -0
  385. package/src/shell/tabs/ContextTab.test.tsx +37 -0
  386. package/src/shell/tabs/ContextTab.tsx +157 -0
  387. package/src/shell/tabs/RawTab.test.tsx +43 -0
  388. package/src/shell/tabs/RawTab.tsx +123 -0
  389. package/src/shell/tabs/ThreadTab.tsx +220 -0
  390. package/src/shell/tabs/navSelection.ts +17 -0
  391. package/src/styles/panel.css +153 -0
  392. package/src/styles/panel.generated.ts +2 -0
  393. package/src/types.ts +0 -5
  394. package/src/utils/common.test.ts +30 -0
  395. package/src/utils/common.ts +101 -0
  396. package/src/utils/diff.test.ts +37 -0
  397. package/src/utils/diff.ts +41 -0
  398. package/src/utils/serialization.test.ts +31 -0
  399. package/src/utils/serialization.ts +4 -1
  400. package/src/views/activity/EventLogRow.tsx +108 -0
  401. package/src/views/activity/EventStreamPane.tsx +86 -0
  402. package/src/views/activity/OrphansPane.tsx +23 -0
  403. package/src/views/activity/RunDetailPane.tsx +128 -0
  404. package/src/views/activity/activityNodes.test.ts +24 -0
  405. package/src/views/activity/activityNodes.ts +179 -0
  406. package/src/views/activity/index.ts +10 -0
  407. package/src/views/attachments/AttachmentList.tsx +122 -0
  408. package/src/views/attachments/MediaPartView.tsx +77 -0
  409. package/src/views/attachments/formatBytes.ts +15 -0
  410. package/src/views/attachments/index.ts +4 -0
  411. package/src/views/attachments/parseAttachment.test.ts +37 -0
  412. package/src/views/attachments/parseAttachment.ts +85 -0
  413. package/src/views/attachments/types.ts +15 -0
  414. package/src/views/context/ContextDetail.tsx +37 -0
  415. package/src/views/context/ToolUIsView.tsx +44 -0
  416. package/src/views/context/contextNodes.test.ts +31 -0
  417. package/src/views/context/contextNodes.ts +66 -0
  418. package/src/views/context/index.ts +4 -0
  419. package/src/views/mcp/McpView.tsx +125 -0
  420. package/src/views/mcp/index.ts +1 -0
  421. package/src/views/mcp/parse.test.ts +63 -0
  422. package/src/views/mcp/parse.ts +65 -0
  423. package/src/views/mcp/render.test.tsx +34 -0
  424. package/src/views/mcp/types.ts +20 -0
  425. package/src/views/message/ChainOfThought.tsx +74 -0
  426. package/src/views/message/MessageDetailPane.tsx +26 -0
  427. package/src/views/message/MessageItem.tsx +94 -0
  428. package/src/views/message/MessageList.tsx +48 -0
  429. package/src/views/message/MessageMetrics.tsx +68 -0
  430. package/src/views/message/MessageTimeline.test.tsx +78 -0
  431. package/src/views/message/MessageTimeline.tsx +51 -0
  432. package/src/views/message/PartDisclosure.tsx +32 -0
  433. package/src/views/message/PartView.tsx +197 -0
  434. package/src/views/message/RoleLabel.tsx +22 -0
  435. package/src/views/message/StatusBadge.tsx +28 -0
  436. package/src/views/message/ToolCallView.tsx +151 -0
  437. package/src/views/message/TtftBar.tsx +44 -0
  438. package/src/views/message/index.ts +5 -0
  439. package/src/views/message/messagePlainText.test.ts +48 -0
  440. package/src/views/message/messagePlainText.ts +65 -0
  441. package/src/views/message/parse.test.ts +269 -0
  442. package/src/views/message/parse.ts +282 -0
  443. package/src/views/message/render.test.tsx +128 -0
  444. package/src/views/message/types.ts +137 -0
  445. package/src/views/model-context/ModelContextView.tsx +71 -0
  446. package/src/views/model-context/render.test.tsx +24 -0
  447. package/src/views/nav.ts +18 -0
  448. package/src/views/raw/RawDetail.tsx +39 -0
  449. package/src/views/raw/index.ts +3 -0
  450. package/src/views/raw/rawNodes.test.ts +38 -0
  451. package/src/views/raw/rawNodes.ts +107 -0
  452. package/src/views/raw/statePreview.tsx +188 -0
  453. package/src/views/runs/PayloadDiff.tsx +49 -0
  454. package/src/views/runs/parse.test.ts +152 -0
  455. package/src/views/runs/parse.ts +110 -0
  456. package/src/views/runs/types.ts +23 -0
  457. package/src/views/scopes/ScopesView.tsx +105 -0
  458. package/src/views/scopes/index.ts +1 -0
  459. package/src/views/scopes/parse.test.ts +35 -0
  460. package/src/views/scopes/parse.ts +30 -0
  461. package/src/views/scopes/render.test.tsx +35 -0
  462. package/src/views/scopes/types.ts +6 -0
  463. package/src/views/thread/ComposerAttachments.test.tsx +36 -0
  464. package/src/views/thread/ComposerAttachments.tsx +8 -0
  465. package/src/views/thread/ComposerFlags.test.tsx +23 -0
  466. package/src/views/thread/ComposerFlags.tsx +19 -0
  467. package/src/views/thread/ComposerQueue.test.tsx +20 -0
  468. package/src/views/thread/ComposerQueue.tsx +26 -0
  469. package/src/views/thread/ConversationList.tsx +127 -0
  470. package/src/views/thread/ConversationStatusDot.test.ts +86 -0
  471. package/src/views/thread/ConversationStatusDot.tsx +126 -0
  472. package/src/views/thread/ThreadDetails.tsx +85 -0
  473. package/src/views/thread/Transcript.test.tsx +56 -0
  474. package/src/views/thread/Transcript.tsx +332 -0
  475. package/src/views/thread/index.ts +19 -0
  476. package/src/views/thread/render.test.tsx +41 -0
  477. package/src/views/thread/resolve.ts +36 -0
  478. package/src/views/thread/types.ts +53 -0
  479. package/src/views/thread/utils.test.ts +72 -0
  480. package/src/views/thread/utils.ts +149 -0
  481. package/src/views/ui/CenteredMessage.tsx +7 -0
  482. package/src/views/ui/Chip.tsx +17 -0
  483. package/src/views/ui/ControlButton.tsx +15 -0
  484. package/src/views/ui/CopyButton.tsx +73 -0
  485. package/src/views/ui/EmptyState.tsx +7 -0
  486. package/src/views/ui/InfoCard.tsx +35 -0
  487. package/src/views/ui/JSONTree.test.tsx +29 -0
  488. package/src/views/ui/JSONTree.tsx +240 -0
  489. package/src/views/ui/PaneHeader.tsx +46 -0
  490. package/src/views/ui/RailTime.tsx +27 -0
  491. package/src/views/ui/SectionLabel.tsx +7 -0
  492. package/src/views/ui/SelectableRow.tsx +41 -0
  493. package/src/views/ui/Sparkline.tsx +49 -0
  494. package/src/views/ui/SummaryItem.tsx +25 -0
  495. package/src/views/ui/ToneBadge.tsx +26 -0
  496. package/src/views/ui/badgeTone.ts +40 -0
  497. package/src/views/ui/index.ts +20 -0
  498. package/src/views/ui/useCopyToClipboard.ts +27 -0
  499. package/dist/DevToolsFrame.d.ts +0 -11
  500. package/dist/DevToolsFrame.d.ts.map +0 -1
  501. package/dist/DevToolsFrame.js +0 -66
  502. package/dist/DevToolsFrame.js.map +0 -1
  503. package/dist/DevToolsHost.d.ts +0 -38
  504. package/dist/DevToolsHost.d.ts.map +0 -1
  505. package/dist/DevToolsHost.js +0 -93
  506. package/dist/DevToolsHost.js.map +0 -1
  507. package/dist/ExtensionHost.d.ts +0 -10
  508. package/dist/ExtensionHost.d.ts.map +0 -1
  509. package/dist/ExtensionHost.js +0 -42
  510. package/dist/ExtensionHost.js.map +0 -1
  511. package/dist/FrameClient.d.ts +0 -38
  512. package/dist/FrameClient.d.ts.map +0 -1
  513. package/dist/FrameClient.js +0 -53
  514. package/dist/FrameClient.js.map +0 -1
  515. package/dist/FrameHost.d.ts +0 -11
  516. package/dist/FrameHost.d.ts.map +0 -1
  517. package/dist/FrameHost.js +0 -26
  518. package/dist/FrameHost.js.map +0 -1
  519. package/dist/constants.d.ts +0 -6
  520. package/dist/constants.d.ts.map +0 -1
  521. package/dist/constants.js +0 -7
  522. package/dist/constants.js.map +0 -1
  523. package/dist/styles/DevToolsModal.styles.d.ts +0 -18
  524. package/dist/styles/DevToolsModal.styles.d.ts.map +0 -1
  525. package/dist/styles/DevToolsModal.styles.js +0 -120
  526. package/dist/styles/DevToolsModal.styles.js.map +0 -1
  527. package/src/DevToolsFrame.tsx +0 -55
  528. package/src/DevToolsHost.ts +0 -178
  529. package/src/ExtensionHost.ts +0 -57
  530. package/src/FrameClient.ts +0 -99
  531. package/src/FrameHost.ts +0 -31
  532. package/src/constants.ts +0 -2
  533. package/src/styles/DevToolsModal.styles.ts +0 -137
@@ -0,0 +1,59 @@
1
+ import { useCallback, useMemo, useSyncExternalStore } from "react";
2
+ import { inProcessClient } from "./createInProcessClient";
3
+ import { EMPTY_SNAPSHOT, type ApiInfo, type DevToolsClient } from "./types";
4
+
5
+ export interface DevToolsClientResult {
6
+ apiIds: number[];
7
+ selected: ApiInfo | undefined;
8
+ clearEvents: (apiId: number) => void;
9
+ switchToThread: (apiId: number, threadId: string) => void | Promise<void>;
10
+ }
11
+
12
+ /**
13
+ * Reads a DevToolsClient snapshot and resolves the selected instance. The panel
14
+ * depends only on this, so swapping the client swaps the data source without
15
+ * touching the UI. Pass a stable client reference (the default in-process client
16
+ * is a module singleton; memoize custom clients).
17
+ */
18
+ export const useDevToolsClient = (
19
+ selectedApiId: number | null,
20
+ client: DevToolsClient = inProcessClient,
21
+ ): DevToolsClientResult => {
22
+ // Bind the client methods so class-based or relay clients that rely on `this`
23
+ // work, and keep the references stable so useSyncExternalStore does not
24
+ // resubscribe on every render.
25
+ const store = useMemo(
26
+ () => ({
27
+ subscribe: (listener: () => void) => client.subscribe(listener),
28
+ getSnapshot: () => client.getSnapshot(),
29
+ getServerSnapshot: () =>
30
+ client.getServerSnapshot ? client.getServerSnapshot() : EMPTY_SNAPSHOT,
31
+ }),
32
+ [client],
33
+ );
34
+
35
+ const snapshot = useSyncExternalStore(
36
+ store.subscribe,
37
+ store.getSnapshot,
38
+ store.getServerSnapshot,
39
+ );
40
+
41
+ const selected =
42
+ selectedApiId !== null ? snapshot.byId.get(selectedApiId) : undefined;
43
+
44
+ const clearEvents = useCallback(
45
+ (apiId: number) => client.clearEvents(apiId),
46
+ [client],
47
+ );
48
+
49
+ const switchToThread = useCallback(
50
+ (apiId: number, threadId: string) => {
51
+ if (client.switchToThread) {
52
+ return client.switchToThread(apiId, threadId);
53
+ }
54
+ },
55
+ [client],
56
+ );
57
+
58
+ return { apiIds: snapshot.apiIds, selected, clearEvents, switchToThread };
59
+ };
package/src/index.ts CHANGED
@@ -1,17 +1,20 @@
1
- export { DevToolsModal } from "./DevToolsModal";
2
- export { DevToolsFrame } from "./DevToolsFrame";
3
- export { FrameHost } from "./FrameHost";
4
- export { DevToolsHost } from "./DevToolsHost";
5
- export { ExtensionHost } from "./ExtensionHost";
6
- export { FrameClient } from "./FrameClient";
1
+ export { DevToolsModal, type DevToolsModalProps } from "./DevToolsModal";
2
+ export { DevToolsPanel, type DevToolsPanelProps } from "./shell/DevToolsPanel";
3
+ export { ShadowRoot } from "./shell/ShadowRoot";
4
+ export {
5
+ builtinPlugins,
6
+ createDevToolsPlugin,
7
+ type DevToolsPanelPlugin,
8
+ type DevToolsTabContext,
9
+ } from "./shell/registry";
10
+ export type { ApiInfo, DevToolsClient, DevToolsSnapshot } from "./data/types";
11
+ export {
12
+ createInProcessClient,
13
+ inProcessClient,
14
+ } from "./data/createInProcessClient";
7
15
  export {
8
16
  normalizeToolList,
9
17
  type NormalizedTool,
10
18
  } from "./utils/toolNormalization";
11
- export {
12
- sanitizeForMessage,
13
- serializeModelContext,
14
- } from "./utils/serialization";
15
- // Export types
16
- export type { SerializedModelContext, TabType, ViewMode } from "./types";
17
- export * from "./constants";
19
+ export { serializeModelContext } from "./utils/serialization";
20
+ export type { SerializedModelContext } from "./types";
@@ -0,0 +1,84 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { DevToolsPanel } from "./DevToolsPanel";
5
+ import type { DevToolsPanelPlugin } from "./registry";
6
+ import type { DevToolsClient } from "../data/types";
7
+
8
+ export interface DevToolsOverlayProps {
9
+ plugins?: DevToolsPanelPlugin[] | undefined;
10
+ theme: "light" | "dark";
11
+ client?: DevToolsClient | undefined;
12
+ }
13
+
14
+ /**
15
+ * The full devtools surface (floating launcher + window), rendered inside the
16
+ * shadow root so every element is styled with the package's own Tailwind tokens
17
+ * and isolated from the host page. The window floats over the live app with no
18
+ * backdrop; close with the × or Escape.
19
+ */
20
+ export const DevToolsOverlay = ({
21
+ plugins,
22
+ theme,
23
+ client,
24
+ }: DevToolsOverlayProps) => {
25
+ const [isOpen, setIsOpen] = useState(false);
26
+
27
+ useEffect(() => {
28
+ if (!isOpen) return;
29
+ const handleEscape = (event: KeyboardEvent) => {
30
+ if (event.key === "Escape") setIsOpen(false);
31
+ };
32
+ document.addEventListener("keydown", handleEscape);
33
+ return () => document.removeEventListener("keydown", handleEscape);
34
+ }, [isOpen]);
35
+
36
+ if (!isOpen) {
37
+ return (
38
+ <button
39
+ type="button"
40
+ onClick={() => setIsOpen(true)}
41
+ aria-label="Open assistant-ui DevTools"
42
+ title="Open assistant-ui DevTools"
43
+ className="bg-foreground text-background fixed end-5 bottom-5 z-[2147483646] flex size-9 [animation:aui-dt-launcher-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] items-center justify-center rounded-full shadow-[var(--shadow-launcher)] backdrop-blur-2xl transition-transform duration-150 ease-out hover:scale-105 active:scale-95"
44
+ >
45
+ <svg
46
+ width="18"
47
+ height="18"
48
+ viewBox="0 0 24 24"
49
+ fill="none"
50
+ aria-hidden="true"
51
+ >
52
+ <path
53
+ d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
54
+ stroke="currentColor"
55
+ strokeWidth="1.75"
56
+ strokeLinecap="round"
57
+ strokeLinejoin="round"
58
+ />
59
+ </svg>
60
+ </button>
61
+ );
62
+ }
63
+
64
+ return (
65
+ <>
66
+ <div
67
+ onClick={() => setIsOpen(false)}
68
+ className="fixed inset-0 z-[2147483646] [animation:aui-dt-fade-in_150ms_ease-out] bg-black/20 backdrop-blur-[3px]"
69
+ />
70
+ <div
71
+ role="dialog"
72
+ aria-label="assistant-ui DevTools"
73
+ className="bg-background text-foreground border-border fixed top-1/2 left-1/2 z-[2147483647] flex h-[min(560px,80vh)] w-[min(960px,92vw)] -translate-x-1/2 -translate-y-1/2 [animation:aui-dt-window-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] flex-col overflow-hidden rounded-xl border shadow-[var(--shadow-window)]"
74
+ >
75
+ <DevToolsPanel
76
+ theme={theme}
77
+ plugins={plugins}
78
+ client={client}
79
+ onClose={() => setIsOpen(false)}
80
+ />
81
+ </div>
82
+ </>
83
+ );
84
+ };
@@ -0,0 +1,192 @@
1
+ "use client";
2
+
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import clsx from "clsx";
5
+ import { useDevToolsClient } from "../data/useDevToolsClient";
6
+ import { inProcessClient } from "../data/createInProcessClient";
7
+ import type { DevToolsClient } from "../data/types";
8
+ import { CenteredMessage } from "../views/ui";
9
+ import {
10
+ builtinPlugins,
11
+ type DevToolsPanelPlugin,
12
+ type DevToolsTabContext,
13
+ } from "./registry";
14
+
15
+ export interface DevToolsPanelProps {
16
+ /** Additional inspector tabs appended after the builtins. */
17
+ plugins?: DevToolsPanelPlugin[] | undefined;
18
+ /** Resolved theme, used to style plugin content and the dark variant. */
19
+ theme?: "light" | "dark";
20
+ /** When provided, a close control is rendered at the end of the tab bar. */
21
+ onClose?: (() => void) | undefined;
22
+ /** Data source. Defaults to the in-process DevToolsHooks client. */
23
+ client?: DevToolsClient | undefined;
24
+ }
25
+
26
+ export const DevToolsPanel = ({
27
+ plugins,
28
+ theme = "light",
29
+ onClose,
30
+ client,
31
+ }: DevToolsPanelProps) => {
32
+ const resolvedClient = client ?? inProcessClient;
33
+ const [selectedApiId, setSelectedApiId] = useState<number | null>(null);
34
+ const [activeTabId, setActiveTabId] = useState<string>("thread");
35
+ const [selectionByApi, setSelectionByApi] = useState<
36
+ Record<number, Record<string, string | null>>
37
+ >({});
38
+ const { apiIds, selected, clearEvents, switchToThread } = useDevToolsClient(
39
+ selectedApiId,
40
+ resolvedClient,
41
+ );
42
+
43
+ useEffect(() => {
44
+ if (selectedApiId !== null && apiIds.includes(selectedApiId)) return;
45
+ setSelectedApiId(apiIds[0] ?? null);
46
+ }, [apiIds, selectedApiId]);
47
+
48
+ const allPlugins = useMemo(
49
+ () =>
50
+ [...builtinPlugins, ...(plugins ?? [])].sort(
51
+ (a, b) => (a.order ?? 0) - (b.order ?? 0),
52
+ ),
53
+ [plugins],
54
+ );
55
+
56
+ const setSelectionFor = useCallback(
57
+ (apiId: number, tabId: string, nodeId: string | null) => {
58
+ setSelectionByApi((prev) => ({
59
+ ...prev,
60
+ [apiId]: { ...prev[apiId], [tabId]: nodeId },
61
+ }));
62
+ },
63
+ [],
64
+ );
65
+
66
+ const visiblePlugins =
67
+ selected && selectedApiId !== null
68
+ ? allPlugins.filter((plugin) =>
69
+ plugin.isAvailable
70
+ ? plugin.isAvailable({
71
+ apiId: selectedApiId,
72
+ data: selected,
73
+ clearEvents,
74
+ theme,
75
+ selection: null,
76
+ setSelection: () => {},
77
+ })
78
+ : true,
79
+ )
80
+ : allPlugins;
81
+
82
+ const activePlugin =
83
+ visiblePlugins.find((plugin) => plugin.id === activeTabId) ??
84
+ visiblePlugins[0];
85
+
86
+ const ctx: DevToolsTabContext | null =
87
+ selected && selectedApiId !== null && activePlugin
88
+ ? {
89
+ apiId: selectedApiId,
90
+ data: selected,
91
+ clearEvents,
92
+ theme,
93
+ selection: selectionByApi[selectedApiId]?.[activePlugin.id] ?? null,
94
+ setSelection: (nodeId) =>
95
+ setSelectionFor(selectedApiId, activePlugin.id, nodeId),
96
+ switchToThread: resolvedClient.switchToThread
97
+ ? (threadId) => switchToThread(selectedApiId, threadId)
98
+ : undefined,
99
+ }
100
+ : null;
101
+
102
+ return (
103
+ <div className="text-foreground flex h-full flex-col text-[13px]">
104
+ <nav className="border-border flex h-10 shrink-0 items-center justify-between gap-2 border-b px-2 select-none">
105
+ <div className="flex h-full items-center">
106
+ {visiblePlugins.map((plugin) => {
107
+ const active = activePlugin?.id === plugin.id;
108
+ return (
109
+ <button
110
+ type="button"
111
+ key={plugin.id}
112
+ onClick={() => setActiveTabId(plugin.id)}
113
+ className={clsx(
114
+ "relative flex h-full items-center px-3 font-medium transition-colors",
115
+ active
116
+ ? "text-foreground"
117
+ : "text-muted-foreground hover:text-foreground",
118
+ )}
119
+ >
120
+ {plugin.label}
121
+ {active ? (
122
+ <span className="bg-foreground absolute inset-x-2 -bottom-px h-0.5 rounded-full" />
123
+ ) : null}
124
+ </button>
125
+ );
126
+ })}
127
+ </div>
128
+
129
+ <div className="flex items-center gap-2 pe-1">
130
+ {apiIds.length > 1 ? (
131
+ <select
132
+ value={selectedApiId ?? ""}
133
+ onChange={(event) => {
134
+ const value = Number(event.target.value);
135
+ setSelectedApiId(Number.isNaN(value) ? null : value);
136
+ }}
137
+ className="border-border text-muted-foreground hover:text-foreground h-7 rounded-md border bg-transparent px-2 text-[12px] transition-colors"
138
+ >
139
+ {apiIds.map((id) => (
140
+ <option key={id} value={id}>
141
+ API #{id}
142
+ </option>
143
+ ))}
144
+ </select>
145
+ ) : null}
146
+
147
+ <span className="text-muted-foreground flex items-center gap-1.5 text-[11px]">
148
+ <span className="size-1.5 rounded-full bg-emerald-500" />
149
+ {apiIds.length > 0
150
+ ? `${apiIds.length} instance${apiIds.length > 1 ? "s" : ""}`
151
+ : "Waiting"}
152
+ </span>
153
+
154
+ {onClose ? (
155
+ <button
156
+ type="button"
157
+ onClick={onClose}
158
+ aria-label="Close DevTools"
159
+ className="text-muted-foreground hover:bg-accent hover:text-foreground flex size-7 items-center justify-center rounded-md transition-colors"
160
+ >
161
+ <svg
162
+ width="14"
163
+ height="14"
164
+ viewBox="0 0 24 24"
165
+ fill="none"
166
+ aria-hidden="true"
167
+ >
168
+ <path
169
+ d="M18 6 6 18M6 6l12 12"
170
+ stroke="currentColor"
171
+ strokeWidth="1.75"
172
+ strokeLinecap="round"
173
+ strokeLinejoin="round"
174
+ />
175
+ </svg>
176
+ </button>
177
+ ) : null}
178
+ </div>
179
+ </nav>
180
+
181
+ <section className="bg-background min-h-0 flex-1 overflow-hidden">
182
+ {ctx && activePlugin ? (
183
+ <activePlugin.Component {...ctx} />
184
+ ) : (
185
+ <CenteredMessage>
186
+ Waiting for assistant-ui instance...
187
+ </CenteredMessage>
188
+ )}
189
+ </section>
190
+ </div>
191
+ );
192
+ };
@@ -0,0 +1,85 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, type CSSProperties, type ReactNode } from "react";
4
+ import { createRoot, type Root } from "react-dom/client";
5
+ import { panelCss } from "../styles/panel.generated";
6
+
7
+ const PROPERTY_STYLE_ID = "assistant-ui-devtools-properties";
8
+
9
+ /**
10
+ * Tailwind registers typed `@property --tw-*` custom properties. These register
11
+ * globally and are unreliable when declared only inside a shadow root, so a copy
12
+ * is hoisted to the document head once. The rest of the sheet stays scoped to
13
+ * the shadow root.
14
+ */
15
+ const hoistAtProperties = () => {
16
+ if (document.getElementById(PROPERTY_STYLE_ID)) return;
17
+ const rules = panelCss.match(/@property\s+--[^{]+\{[^}]*\}/g);
18
+ if (!rules?.length) return;
19
+ const style = document.createElement("style");
20
+ style.id = PROPERTY_STYLE_ID;
21
+ style.textContent = rules.join("");
22
+ document.head.appendChild(style);
23
+ };
24
+
25
+ export interface ShadowRootProps {
26
+ theme: "light" | "dark";
27
+ className?: string;
28
+ style?: CSSProperties;
29
+ children: ReactNode;
30
+ }
31
+
32
+ /**
33
+ * Renders its children into an isolated shadow root with the compiled panel
34
+ * stylesheet. A dedicated React root is mounted inside the shadow root so
35
+ * React's event delegation works (a portal from the outer root would leave the
36
+ * listeners in the light DOM, where shadow retargeting breaks them).
37
+ */
38
+ export const ShadowRoot = ({
39
+ theme,
40
+ className,
41
+ style,
42
+ children,
43
+ }: ShadowRootProps) => {
44
+ const hostRef = useRef<HTMLDivElement | null>(null);
45
+ const rootRef = useRef<Root | null>(null);
46
+ const mountRef = useRef<HTMLDivElement | null>(null);
47
+
48
+ useEffect(() => {
49
+ const host = hostRef.current;
50
+ if (!host) return;
51
+
52
+ const shadow = host.shadowRoot ?? host.attachShadow({ mode: "open" });
53
+ if (!shadow.querySelector("style[data-aui-devtools]")) {
54
+ const styleEl = document.createElement("style");
55
+ styleEl.setAttribute("data-aui-devtools", "");
56
+ styleEl.textContent = panelCss;
57
+ shadow.appendChild(styleEl);
58
+ }
59
+ hoistAtProperties();
60
+
61
+ const mount = document.createElement("div");
62
+ mount.style.display = "contents";
63
+ shadow.appendChild(mount);
64
+ mountRef.current = mount;
65
+ rootRef.current = createRoot(mount);
66
+
67
+ return () => {
68
+ const root = rootRef.current;
69
+ rootRef.current = null;
70
+ mountRef.current = null;
71
+ queueMicrotask(() => {
72
+ root?.unmount();
73
+ mount.remove();
74
+ });
75
+ };
76
+ }, []);
77
+
78
+ useEffect(() => {
79
+ const mount = mountRef.current;
80
+ if (mount) mount.className = theme === "dark" ? "dark" : "";
81
+ rootRef.current?.render(children);
82
+ }, [children, theme]);
83
+
84
+ return <div ref={hostRef} className={className} style={style} />;
85
+ };
@@ -0,0 +1,46 @@
1
+ import clsx from "clsx";
2
+ import type { ReactNode } from "react";
3
+
4
+ /** Shared nav rail + detail track sizing for the master/detail tabs. */
5
+ export const NAV_COL = "clamp(14rem,28%,18rem)_minmax(0,1fr)";
6
+
7
+ export interface SplitColumn {
8
+ key: string;
9
+ /** Fixed rail header; stays aligned across columns. */
10
+ header?: ReactNode | undefined;
11
+ /** Scrollable pane body. */
12
+ children: ReactNode;
13
+ }
14
+
15
+ /**
16
+ * Multi-column split surface. Each column keeps its header fixed and only the
17
+ * body scrolls, so rail titles and divider lines stay aligned across columns.
18
+ */
19
+ export const SplitLayout = ({
20
+ sizes,
21
+ columns,
22
+ className,
23
+ }: {
24
+ /** Underscore-separated CSS grid track list, e.g. `12rem_minmax(0,1fr)`. */
25
+ sizes: string;
26
+ columns: SplitColumn[];
27
+ className?: string | undefined;
28
+ }) => (
29
+ <div
30
+ className={clsx("grid h-full min-h-0", className)}
31
+ style={{ gridTemplateColumns: sizes.split("_").join(" ") }}
32
+ >
33
+ {columns.map((column, index) => (
34
+ <div
35
+ key={column.key}
36
+ className={clsx(
37
+ "flex min-h-0 flex-col overflow-hidden",
38
+ index < columns.length - 1 && "border-border border-e",
39
+ )}
40
+ >
41
+ {column.header}
42
+ <div className="min-h-0 flex-1 overflow-y-auto">{column.children}</div>
43
+ </div>
44
+ ))}
45
+ </div>
46
+ );
@@ -0,0 +1,51 @@
1
+ import type { ComponentType } from "react";
2
+ import type { ApiInfo } from "../data/types";
3
+ import { ActivityTab } from "./tabs/ActivityTab";
4
+ import { ContextTab } from "./tabs/ContextTab";
5
+ import { RawTab } from "./tabs/RawTab";
6
+ import { ThreadTab } from "./tabs/ThreadTab";
7
+
8
+ export interface DevToolsTabContext {
9
+ /** The id of the assistant instance the panel is currently inspecting. */
10
+ apiId: number;
11
+ /** Projected, render-ready data for the inspected instance. */
12
+ data: ApiInfo;
13
+ /** Clears the buffered event log for an instance. */
14
+ clearEvents: (apiId: number) => void;
15
+ /** The resolved theme of the panel. */
16
+ theme: "light" | "dark";
17
+ /**
18
+ * The selected node id for this tab and instance, or null. Always a stable id
19
+ * (message id, run id, slice key, …), never an array index, so the detail
20
+ * pane does not jump as data streams in.
21
+ */
22
+ selection: string | null;
23
+ /** Selects a node in this tab. Pass null to clear. Persisted per instance. */
24
+ setSelection: (nodeId: string | null) => void;
25
+ /** Switches the live app to a thread, when the runtime supports thread lists. */
26
+ switchToThread?: ((threadId: string) => void | Promise<void>) | undefined;
27
+ }
28
+
29
+ export interface DevToolsPanelPlugin {
30
+ /** Stable identifier used as the tab key. */
31
+ id: string;
32
+ /** Tab label shown in the navigation bar. */
33
+ label: string;
34
+ /** Lower numbers sort earlier; builtins occupy 10, 20, 30, 40. */
35
+ order?: number;
36
+ /** When provided and it returns false, the tab is hidden for the current instance. */
37
+ isAvailable?: (ctx: DevToolsTabContext) => boolean;
38
+ /** The tab body. Receives the tab context as props. */
39
+ Component: ComponentType<DevToolsTabContext>;
40
+ }
41
+
42
+ export const createDevToolsPlugin = (
43
+ plugin: DevToolsPanelPlugin,
44
+ ): DevToolsPanelPlugin => plugin;
45
+
46
+ export const builtinPlugins: DevToolsPanelPlugin[] = [
47
+ { id: "thread", label: "Thread", order: 10, Component: ThreadTab },
48
+ { id: "context", label: "Context", order: 20, Component: ContextTab },
49
+ { id: "activity", label: "Activity", order: 30, Component: ActivityTab },
50
+ { id: "raw", label: "Raw", order: 40, Component: RawTab },
51
+ ];
@@ -0,0 +1,34 @@
1
+ import { renderToStaticMarkup } from "react-dom/server";
2
+ import { describe, expect, it } from "vitest";
3
+ import { ActivityTab } from "./ActivityTab";
4
+
5
+ const base = 2_000_000_000_000;
6
+ const t = (ms: number) => new Date(base + ms);
7
+
8
+ describe("ActivityTab", () => {
9
+ it("renders a split layout with runs and an event stream", () => {
10
+ const html = renderToStaticMarkup(
11
+ <ActivityTab
12
+ apiId={1}
13
+ data={{
14
+ id: 1,
15
+ logs: [
16
+ { time: t(0), event: "thread.runStart", data: { threadId: "T1" } },
17
+ { time: t(150), event: "composer.send", data: { threadId: "T1" } },
18
+ { time: t(900), event: "thread.runEnd", data: { threadId: "T1" } },
19
+ ],
20
+ state: {},
21
+ }}
22
+ clearEvents={() => {}}
23
+ theme="light"
24
+ selection={null}
25
+ setSelection={() => {}}
26
+ />,
27
+ );
28
+
29
+ expect(html).toContain("All events");
30
+ expect(html).toContain("Run #0");
31
+ expect(html).toContain("900ms");
32
+ expect(html).toContain("send");
33
+ });
34
+ });