@stigmer/react 3.1.1 → 3.1.2

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 (426) hide show
  1. package/composer/SessionComposer.d.ts +24 -1
  2. package/composer/SessionComposer.d.ts.map +1 -1
  3. package/composer/SessionComposer.js +19 -8
  4. package/composer/SessionComposer.js.map +1 -1
  5. package/execution/ArtifactContentRenderer.d.ts +11 -1
  6. package/execution/ArtifactContentRenderer.d.ts.map +1 -1
  7. package/execution/ArtifactContentRenderer.js +39 -15
  8. package/execution/ArtifactContentRenderer.js.map +1 -1
  9. package/execution/FilePathContext.d.ts +8 -1
  10. package/execution/FilePathContext.d.ts.map +1 -1
  11. package/execution/FilePathContext.js.map +1 -1
  12. package/execution/FilePathLink.d.ts.map +1 -1
  13. package/execution/FilePathLink.js +21 -6
  14. package/execution/FilePathLink.js.map +1 -1
  15. package/execution/MessageEntry.d.ts +29 -0
  16. package/execution/MessageEntry.d.ts.map +1 -1
  17. package/execution/MessageEntry.js +29 -5
  18. package/execution/MessageEntry.js.map +1 -1
  19. package/execution/MessageThread.d.ts +76 -13
  20. package/execution/MessageThread.d.ts.map +1 -1
  21. package/execution/MessageThread.js +178 -24
  22. package/execution/MessageThread.js.map +1 -1
  23. package/execution/PlanArtifactCard.d.ts +27 -18
  24. package/execution/PlanArtifactCard.d.ts.map +1 -1
  25. package/execution/PlanArtifactCard.js +13 -23
  26. package/execution/PlanArtifactCard.js.map +1 -1
  27. package/execution/PlanDocumentMessage.d.ts +32 -0
  28. package/execution/PlanDocumentMessage.d.ts.map +1 -0
  29. package/execution/PlanDocumentMessage.js +37 -0
  30. package/execution/PlanDocumentMessage.js.map +1 -0
  31. package/execution/PlanStreamingCard.d.ts +45 -0
  32. package/execution/PlanStreamingCard.d.ts.map +1 -0
  33. package/execution/PlanStreamingCard.js +35 -0
  34. package/execution/PlanStreamingCard.js.map +1 -0
  35. package/execution/index.d.ts +5 -1
  36. package/execution/index.d.ts.map +1 -1
  37. package/execution/index.js +2 -0
  38. package/execution/index.js.map +1 -1
  39. package/execution/useCreateAgentExecution.d.ts +10 -0
  40. package/execution/useCreateAgentExecution.d.ts.map +1 -1
  41. package/execution/useCreateAgentExecution.js +5 -1
  42. package/execution/useCreateAgentExecution.js.map +1 -1
  43. package/github/decodeGitHubContent.d.ts +29 -0
  44. package/github/decodeGitHubContent.d.ts.map +1 -0
  45. package/github/decodeGitHubContent.js +72 -0
  46. package/github/decodeGitHubContent.js.map +1 -0
  47. package/github/index.d.ts +1 -0
  48. package/github/index.d.ts.map +1 -1
  49. package/github/index.js +1 -0
  50. package/github/index.js.map +1 -1
  51. package/github/useGitHubFileReader.d.ts +26 -0
  52. package/github/useGitHubFileReader.d.ts.map +1 -0
  53. package/github/useGitHubFileReader.js +106 -0
  54. package/github/useGitHubFileReader.js.map +1 -0
  55. package/github/useGitHubTreeLister.d.ts.map +1 -1
  56. package/github/useGitHubTreeLister.js +6 -2
  57. package/github/useGitHubTreeLister.js.map +1 -1
  58. package/index.d.ts +9 -9
  59. package/index.d.ts.map +1 -1
  60. package/index.js +5 -5
  61. package/index.js.map +1 -1
  62. package/internal/ResizableSplit.d.ts +72 -22
  63. package/internal/ResizableSplit.d.ts.map +1 -1
  64. package/internal/ResizableSplit.js +96 -38
  65. package/internal/ResizableSplit.js.map +1 -1
  66. package/internal/VirtualizedThread.d.ts +5 -3
  67. package/internal/VirtualizedThread.d.ts.map +1 -1
  68. package/internal/VirtualizedThread.js +6 -4
  69. package/internal/VirtualizedThread.js.map +1 -1
  70. package/internal/file-icons/index.d.ts +17 -0
  71. package/internal/file-icons/index.d.ts.map +1 -0
  72. package/internal/file-icons/index.js +60 -0
  73. package/internal/file-icons/index.js.map +1 -0
  74. package/internal/file-tree/FileTreeNode.d.ts +18 -1
  75. package/internal/file-tree/FileTreeNode.d.ts.map +1 -1
  76. package/internal/file-tree/FileTreeNode.js +11 -2
  77. package/internal/file-tree/FileTreeNode.js.map +1 -1
  78. package/internal/markdown-components.d.ts +38 -1
  79. package/internal/markdown-components.d.ts.map +1 -1
  80. package/internal/markdown-components.js +86 -11
  81. package/internal/markdown-components.js.map +1 -1
  82. package/{workflow → internal}/motion-preference.d.ts +7 -4
  83. package/internal/motion-preference.d.ts.map +1 -0
  84. package/{workflow → internal}/motion-preference.js +7 -4
  85. package/internal/motion-preference.js.map +1 -0
  86. package/internal/store/index.d.ts +33 -0
  87. package/internal/store/index.d.ts.map +1 -1
  88. package/internal/store/index.js +59 -0
  89. package/internal/store/index.js.map +1 -1
  90. package/internal/store/workspace-editors-store.d.ts +145 -0
  91. package/internal/store/workspace-editors-store.d.ts.map +1 -0
  92. package/internal/store/workspace-editors-store.js +208 -0
  93. package/internal/store/workspace-editors-store.js.map +1 -0
  94. package/internal/store/workspace-file-selection-store.d.ts +38 -0
  95. package/internal/store/workspace-file-selection-store.d.ts.map +1 -0
  96. package/internal/store/workspace-file-selection-store.js +62 -0
  97. package/internal/store/workspace-file-selection-store.js.map +1 -0
  98. package/internal/useRevealLine.d.ts +49 -0
  99. package/internal/useRevealLine.d.ts.map +1 -0
  100. package/internal/useRevealLine.js +43 -0
  101. package/internal/useRevealLine.js.map +1 -0
  102. package/library/detect-plan-artifact.d.ts +21 -0
  103. package/library/detect-plan-artifact.d.ts.map +1 -1
  104. package/library/detect-plan-artifact.js +20 -0
  105. package/library/detect-plan-artifact.js.map +1 -1
  106. package/library/detect-streaming-plan.d.ts +45 -0
  107. package/library/detect-streaming-plan.d.ts.map +1 -0
  108. package/library/detect-streaming-plan.js +83 -0
  109. package/library/detect-streaming-plan.js.map +1 -0
  110. package/library/index.d.ts +4 -1
  111. package/library/index.d.ts.map +1 -1
  112. package/library/index.js +2 -1
  113. package/library/index.js.map +1 -1
  114. package/package.json +4 -4
  115. package/session/NewSessionViewer.d.ts +19 -4
  116. package/session/NewSessionViewer.d.ts.map +1 -1
  117. package/session/NewSessionViewer.js +52 -25
  118. package/session/NewSessionViewer.js.map +1 -1
  119. package/session/PlanEditor.d.ts +55 -0
  120. package/session/PlanEditor.d.ts.map +1 -0
  121. package/session/PlanEditor.js +88 -0
  122. package/session/PlanEditor.js.map +1 -0
  123. package/session/PlanStreamingDocument.d.ts +30 -0
  124. package/session/PlanStreamingDocument.d.ts.map +1 -0
  125. package/session/PlanStreamingDocument.js +37 -0
  126. package/session/PlanStreamingDocument.js.map +1 -0
  127. package/session/SessionPanelChip.d.ts +26 -0
  128. package/session/SessionPanelChip.d.ts.map +1 -0
  129. package/session/SessionPanelChip.js +40 -0
  130. package/session/SessionPanelChip.js.map +1 -0
  131. package/session/SessionViewer.d.ts +34 -7
  132. package/session/SessionViewer.d.ts.map +1 -1
  133. package/session/SessionViewer.js +315 -33
  134. package/session/SessionViewer.js.map +1 -1
  135. package/session/{inspector → facets}/ArtifactsTab.d.ts +10 -2
  136. package/session/facets/ArtifactsTab.d.ts.map +1 -0
  137. package/session/{inspector → facets}/ArtifactsTab.js +8 -3
  138. package/session/facets/ArtifactsTab.js.map +1 -0
  139. package/session/{inspector → facets}/ChangesTab.d.ts +3 -3
  140. package/session/facets/ChangesTab.d.ts.map +1 -0
  141. package/session/{inspector → facets}/ChangesTab.js +3 -3
  142. package/session/facets/ChangesTab.js.map +1 -0
  143. package/session/facets/InspectTab.d.ts.map +1 -0
  144. package/session/facets/InspectTab.js.map +1 -0
  145. package/session/{inspector → facets}/SetupTab.d.ts +11 -2
  146. package/session/facets/SetupTab.d.ts.map +1 -0
  147. package/session/{inspector → facets}/SetupTab.js +4 -3
  148. package/session/facets/SetupTab.js.map +1 -0
  149. package/session/{inspector → facets}/UsageTab.d.ts +1 -1
  150. package/session/facets/UsageTab.d.ts.map +1 -0
  151. package/session/{inspector → facets}/UsageTab.js +1 -1
  152. package/session/facets/UsageTab.js.map +1 -0
  153. package/session/{inspector → facets}/index.d.ts +0 -6
  154. package/session/facets/index.d.ts.map +1 -0
  155. package/session/{inspector → facets}/index.js +0 -3
  156. package/session/facets/index.js.map +1 -0
  157. package/session/index.d.ts +11 -2
  158. package/session/index.d.ts.map +1 -1
  159. package/session/index.js +15 -2
  160. package/session/index.js.map +1 -1
  161. package/session/plan-document.d.ts +9 -0
  162. package/session/plan-document.d.ts.map +1 -0
  163. package/session/plan-document.js +17 -0
  164. package/session/plan-document.js.map +1 -0
  165. package/session/useOpenFileChange.d.ts +20 -0
  166. package/session/useOpenFileChange.d.ts.map +1 -0
  167. package/session/useOpenFileChange.js +31 -0
  168. package/session/useOpenFileChange.js.map +1 -0
  169. package/session/usePlanDraft.d.ts +52 -0
  170. package/session/usePlanDraft.d.ts.map +1 -0
  171. package/session/usePlanDraft.js +63 -0
  172. package/session/usePlanDraft.js.map +1 -0
  173. package/session/useSessionConversation.d.ts +6 -0
  174. package/session/useSessionConversation.d.ts.map +1 -1
  175. package/session/useSessionConversation.js +1 -0
  176. package/session/useSessionConversation.js.map +1 -1
  177. package/session/useSessionPageFlow.d.ts.map +1 -1
  178. package/session/useSessionPageFlow.js +1 -0
  179. package/session/useSessionPageFlow.js.map +1 -1
  180. package/session/useSessionPanel.d.ts +120 -0
  181. package/session/useSessionPanel.d.ts.map +1 -0
  182. package/session/useSessionPanel.js +130 -0
  183. package/session/useSessionPanel.js.map +1 -0
  184. package/session/useSessionRailViews.d.ts +45 -0
  185. package/session/useSessionRailViews.d.ts.map +1 -0
  186. package/session/useSessionRailViews.js +105 -0
  187. package/session/useSessionRailViews.js.map +1 -0
  188. package/src/composer/SessionComposer.tsx +52 -10
  189. package/src/composer/__tests__/SessionComposer-contract.test.tsx +58 -4
  190. package/src/execution/ArtifactContentRenderer.tsx +101 -24
  191. package/src/execution/FilePathContext.tsx +8 -1
  192. package/src/execution/FilePathLink.tsx +22 -6
  193. package/src/execution/MessageEntry.tsx +111 -1
  194. package/src/execution/MessageThread.tsx +291 -36
  195. package/src/execution/PlanArtifactCard.tsx +63 -31
  196. package/src/execution/PlanDocumentMessage.tsx +96 -0
  197. package/src/execution/PlanStreamingCard.tsx +137 -0
  198. package/src/execution/__tests__/ArtifactContentRenderer.test.tsx +80 -1
  199. package/src/execution/__tests__/FilePathLink.test.tsx +87 -0
  200. package/src/execution/__tests__/MessageThread.test.tsx +101 -0
  201. package/src/execution/__tests__/PlanArtifactCard.test.tsx +66 -12
  202. package/src/execution/__tests__/PlanDocumentMessage.test.tsx +55 -0
  203. package/src/execution/__tests__/PlanStreamingCard.test.tsx +49 -0
  204. package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +504 -22
  205. package/src/execution/__tests__/message-entry.test.tsx +48 -0
  206. package/src/execution/__tests__/useCreateAgentExecution.test.tsx +85 -0
  207. package/src/execution/index.ts +7 -1
  208. package/src/execution/useCreateAgentExecution.ts +16 -1
  209. package/src/github/__tests__/decodeGitHubContent.test.ts +102 -0
  210. package/src/github/__tests__/useGitHubFileReader.test.ts +183 -0
  211. package/src/github/decodeGitHubContent.ts +83 -0
  212. package/src/github/index.ts +1 -0
  213. package/src/github/useGitHubFileReader.ts +152 -0
  214. package/src/github/useGitHubTreeLister.ts +6 -2
  215. package/src/index.ts +63 -9
  216. package/src/internal/ResizableSplit.tsx +184 -51
  217. package/src/internal/VirtualizedThread.tsx +12 -4
  218. package/src/internal/__tests__/ResizableSplit.test.tsx +125 -3
  219. package/src/internal/__tests__/markdown-components.test.tsx +68 -0
  220. package/src/internal/__tests__/useRevealLine.test.tsx +97 -0
  221. package/src/internal/file-icons/__tests__/file-icons.test.tsx +35 -0
  222. package/src/internal/file-icons/index.tsx +137 -0
  223. package/src/internal/file-tree/FileTreeNode.tsx +43 -3
  224. package/src/internal/file-tree/__tests__/FileTreeNode-explorer.test.tsx +86 -0
  225. package/src/internal/markdown-components.tsx +116 -11
  226. package/src/{workflow → internal}/motion-preference.ts +7 -4
  227. package/src/internal/store/__tests__/workspace-editors-store.test.ts +216 -0
  228. package/src/internal/store/__tests__/workspace-file-selection-store.test.ts +118 -0
  229. package/src/internal/store/index.ts +94 -0
  230. package/src/internal/store/workspace-editors-store.ts +315 -0
  231. package/src/internal/store/workspace-file-selection-store.ts +88 -0
  232. package/src/internal/useRevealLine.ts +81 -0
  233. package/src/library/__tests__/detect-plan-artifact.test.ts +48 -0
  234. package/src/library/__tests__/detect-streaming-plan.test.ts +234 -0
  235. package/src/library/detect-plan-artifact.ts +35 -0
  236. package/src/library/detect-streaming-plan.ts +108 -0
  237. package/src/library/index.ts +5 -0
  238. package/src/session/NewSessionViewer.tsx +123 -55
  239. package/src/session/PlanEditor.tsx +361 -0
  240. package/src/session/PlanStreamingDocument.tsx +97 -0
  241. package/src/session/SessionPanelChip.tsx +103 -0
  242. package/src/session/SessionViewer.tsx +617 -90
  243. package/src/session/__tests__/NewSessionViewer.test.tsx +148 -0
  244. package/src/session/__tests__/PlanEditor.test.tsx +217 -0
  245. package/src/session/__tests__/PlanStreamingDocument.test.tsx +50 -0
  246. package/src/session/__tests__/SessionPanelChip.test.tsx +42 -0
  247. package/src/session/__tests__/SessionViewer-fileReviewDock.test.tsx +9 -4
  248. package/src/session/__tests__/SessionViewer-transcriptFileOpen.test.tsx +205 -0
  249. package/src/session/__tests__/audienceWiring.test.tsx +55 -19
  250. package/src/session/__tests__/useOpenFileChange.test.tsx +82 -0
  251. package/src/session/__tests__/usePlanDraft.test.ts +102 -0
  252. package/src/session/__tests__/useSessionPanel.test.ts +298 -0
  253. package/src/session/__tests__/useSessionRailViews.test.tsx +124 -0
  254. package/src/session/{inspector → facets}/ArtifactsTab.tsx +27 -5
  255. package/src/session/{inspector → facets}/ChangesTab.tsx +3 -3
  256. package/src/session/{inspector → facets}/SetupTab.tsx +13 -1
  257. package/src/session/{inspector → facets}/UsageTab.tsx +1 -1
  258. package/src/session/{inspector → facets}/__tests__/ArtifactsTab.test.tsx +35 -1
  259. package/src/session/facets/__tests__/SetupTab.test.tsx +44 -0
  260. package/src/session/{inspector → facets}/index.ts +0 -16
  261. package/src/session/index.ts +30 -13
  262. package/src/session/plan-document.ts +19 -0
  263. package/src/session/useOpenFileChange.ts +53 -0
  264. package/src/session/usePlanDraft.ts +109 -0
  265. package/src/session/useSessionConversation.ts +7 -0
  266. package/src/session/useSessionPageFlow.ts +1 -0
  267. package/src/session/useSessionPanel.ts +288 -0
  268. package/src/session/useSessionRailViews.tsx +200 -0
  269. package/src/workflow/WorkflowExecutionGraph.tsx +1 -1
  270. package/src/workflow/index.ts +1 -1
  271. package/src/workflow/useFollowExecution.ts +1 -1
  272. package/src/workspace/EditorTabs.tsx +145 -0
  273. package/src/workspace/ExplorerTree.tsx +247 -0
  274. package/src/workspace/FileViewer.tsx +516 -0
  275. package/src/workspace/WorkspaceContentSearch.tsx +478 -0
  276. package/src/workspace/WorkspaceContentSearcher.ts +70 -0
  277. package/src/workspace/WorkspaceFileLister.ts +11 -0
  278. package/src/workspace/WorkspaceFileReader.ts +57 -0
  279. package/src/workspace/WorkspaceFileSearch.tsx +429 -0
  280. package/src/workspace/WorkspaceSurface.tsx +781 -0
  281. package/src/workspace/__tests__/EditorTabs.test.tsx +100 -0
  282. package/src/workspace/__tests__/ExplorerTree.test.tsx +152 -0
  283. package/src/workspace/__tests__/FileViewer.test.tsx +421 -0
  284. package/src/workspace/__tests__/WorkspaceContentSearch.test.tsx +196 -0
  285. package/src/workspace/__tests__/WorkspaceFileSearch.test.tsx +206 -0
  286. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +348 -0
  287. package/src/workspace/__tests__/findChangeForSelection.test.ts +132 -0
  288. package/src/workspace/__tests__/matchContentPreview.test.ts +55 -0
  289. package/src/workspace/__tests__/matchWorkspaceFiles.test.ts +104 -0
  290. package/src/workspace/__tests__/resolveWorkspaceFileSelection.test.ts +135 -0
  291. package/src/workspace/__tests__/useWorkspaceContentSearch.test.tsx +196 -0
  292. package/src/workspace/__tests__/useWorkspaceFileContent.test.tsx +190 -0
  293. package/src/workspace/__tests__/useWorkspaceFileSearch.test.tsx +162 -0
  294. package/src/workspace/findChangeForSelection.ts +61 -0
  295. package/src/workspace/index.ts +56 -2
  296. package/src/workspace/matchContentPreview.ts +51 -0
  297. package/src/workspace/matchWorkspaceFiles.ts +86 -0
  298. package/src/workspace/resolveWorkspaceFileSelection.ts +119 -0
  299. package/src/workspace/useWorkspaceContentSearch.ts +228 -0
  300. package/src/workspace/useWorkspaceFileContent.ts +129 -0
  301. package/src/workspace/useWorkspaceFileSearch.ts +184 -0
  302. package/src/workspace/useWorkspaceFiles.ts +27 -27
  303. package/src/workspace/workspaceListingCache.ts +93 -0
  304. package/styles.css +1 -1
  305. package/workflow/WorkflowExecutionGraph.js +1 -1
  306. package/workflow/WorkflowExecutionGraph.js.map +1 -1
  307. package/workflow/index.d.ts +1 -1
  308. package/workflow/index.d.ts.map +1 -1
  309. package/workflow/index.js +1 -1
  310. package/workflow/index.js.map +1 -1
  311. package/workflow/useFollowExecution.js +1 -1
  312. package/workflow/useFollowExecution.js.map +1 -1
  313. package/workspace/EditorTabs.d.ts +29 -0
  314. package/workspace/EditorTabs.d.ts.map +1 -0
  315. package/workspace/EditorTabs.js +66 -0
  316. package/workspace/EditorTabs.js.map +1 -0
  317. package/workspace/ExplorerTree.d.ts +32 -0
  318. package/workspace/ExplorerTree.d.ts.map +1 -0
  319. package/workspace/ExplorerTree.js +45 -0
  320. package/workspace/ExplorerTree.js.map +1 -0
  321. package/workspace/FileViewer.d.ts +93 -0
  322. package/workspace/FileViewer.d.ts.map +1 -0
  323. package/workspace/FileViewer.js +182 -0
  324. package/workspace/FileViewer.js.map +1 -0
  325. package/workspace/WorkspaceContentSearch.d.ts +41 -0
  326. package/workspace/WorkspaceContentSearch.d.ts.map +1 -0
  327. package/workspace/WorkspaceContentSearch.js +195 -0
  328. package/workspace/WorkspaceContentSearch.js.map +1 -0
  329. package/workspace/WorkspaceContentSearcher.d.ts +59 -0
  330. package/workspace/WorkspaceContentSearcher.d.ts.map +1 -0
  331. package/workspace/WorkspaceContentSearcher.js +7 -0
  332. package/workspace/WorkspaceContentSearcher.js.map +1 -0
  333. package/workspace/WorkspaceFileLister.d.ts +11 -0
  334. package/workspace/WorkspaceFileLister.d.ts.map +1 -1
  335. package/workspace/WorkspaceFileReader.d.ts +48 -0
  336. package/workspace/WorkspaceFileReader.d.ts.map +1 -0
  337. package/workspace/WorkspaceFileReader.js +11 -0
  338. package/workspace/WorkspaceFileReader.js.map +1 -0
  339. package/workspace/WorkspaceFileSearch.d.ts +32 -0
  340. package/workspace/WorkspaceFileSearch.d.ts.map +1 -0
  341. package/workspace/WorkspaceFileSearch.js +155 -0
  342. package/workspace/WorkspaceFileSearch.js.map +1 -0
  343. package/workspace/WorkspaceSurface.d.ts +151 -0
  344. package/workspace/WorkspaceSurface.d.ts.map +1 -0
  345. package/workspace/WorkspaceSurface.js +184 -0
  346. package/workspace/WorkspaceSurface.js.map +1 -0
  347. package/workspace/findChangeForSelection.d.ts +19 -0
  348. package/workspace/findChangeForSelection.d.ts.map +1 -0
  349. package/workspace/findChangeForSelection.js +46 -0
  350. package/workspace/findChangeForSelection.js.map +1 -0
  351. package/workspace/index.d.ts +24 -2
  352. package/workspace/index.d.ts.map +1 -1
  353. package/workspace/index.js +13 -1
  354. package/workspace/index.js.map +1 -1
  355. package/workspace/matchContentPreview.d.ts +21 -0
  356. package/workspace/matchContentPreview.d.ts.map +1 -0
  357. package/workspace/matchContentPreview.js +36 -0
  358. package/workspace/matchContentPreview.js.map +1 -0
  359. package/workspace/matchWorkspaceFiles.d.ts +30 -0
  360. package/workspace/matchWorkspaceFiles.d.ts.map +1 -0
  361. package/workspace/matchWorkspaceFiles.js +58 -0
  362. package/workspace/matchWorkspaceFiles.js.map +1 -0
  363. package/workspace/resolveWorkspaceFileSelection.d.ts +19 -0
  364. package/workspace/resolveWorkspaceFileSelection.d.ts.map +1 -0
  365. package/workspace/resolveWorkspaceFileSelection.js +115 -0
  366. package/workspace/resolveWorkspaceFileSelection.js.map +1 -0
  367. package/workspace/useWorkspaceContentSearch.d.ts +69 -0
  368. package/workspace/useWorkspaceContentSearch.d.ts.map +1 -0
  369. package/workspace/useWorkspaceContentSearch.js +154 -0
  370. package/workspace/useWorkspaceContentSearch.js.map +1 -0
  371. package/workspace/useWorkspaceFileContent.d.ts +73 -0
  372. package/workspace/useWorkspaceFileContent.d.ts.map +1 -0
  373. package/workspace/useWorkspaceFileContent.js +57 -0
  374. package/workspace/useWorkspaceFileContent.js.map +1 -0
  375. package/workspace/useWorkspaceFileSearch.d.ts +61 -0
  376. package/workspace/useWorkspaceFileSearch.d.ts.map +1 -0
  377. package/workspace/useWorkspaceFileSearch.js +119 -0
  378. package/workspace/useWorkspaceFileSearch.js.map +1 -0
  379. package/workspace/useWorkspaceFiles.d.ts +13 -5
  380. package/workspace/useWorkspaceFiles.d.ts.map +1 -1
  381. package/workspace/useWorkspaceFiles.js +18 -19
  382. package/workspace/useWorkspaceFiles.js.map +1 -1
  383. package/workspace/workspaceListingCache.d.ts +47 -0
  384. package/workspace/workspaceListingCache.d.ts.map +1 -0
  385. package/workspace/workspaceListingCache.js +55 -0
  386. package/workspace/workspaceListingCache.js.map +1 -0
  387. package/session/inspector/ArtifactsTab.d.ts.map +0 -1
  388. package/session/inspector/ArtifactsTab.js.map +0 -1
  389. package/session/inspector/ChangesTab.d.ts.map +0 -1
  390. package/session/inspector/ChangesTab.js.map +0 -1
  391. package/session/inspector/InspectTab.d.ts.map +0 -1
  392. package/session/inspector/InspectTab.js.map +0 -1
  393. package/session/inspector/SessionInspector.d.ts +0 -64
  394. package/session/inspector/SessionInspector.d.ts.map +0 -1
  395. package/session/inspector/SessionInspector.js +0 -53
  396. package/session/inspector/SessionInspector.js.map +0 -1
  397. package/session/inspector/SetupTab.d.ts.map +0 -1
  398. package/session/inspector/SetupTab.js.map +0 -1
  399. package/session/inspector/UsageTab.d.ts.map +0 -1
  400. package/session/inspector/UsageTab.js.map +0 -1
  401. package/session/inspector/WorkspaceTab.d.ts +0 -35
  402. package/session/inspector/WorkspaceTab.d.ts.map +0 -1
  403. package/session/inspector/WorkspaceTab.js +0 -75
  404. package/session/inspector/WorkspaceTab.js.map +0 -1
  405. package/session/inspector/index.d.ts.map +0 -1
  406. package/session/inspector/index.js.map +0 -1
  407. package/session/inspector/useSessionInspector.d.ts +0 -49
  408. package/session/inspector/useSessionInspector.d.ts.map +0 -1
  409. package/session/inspector/useSessionInspector.js +0 -122
  410. package/session/inspector/useSessionInspector.js.map +0 -1
  411. package/src/session/inspector/SessionInspector.tsx +0 -162
  412. package/src/session/inspector/WorkspaceTab.tsx +0 -245
  413. package/src/session/inspector/__tests__/useSessionInspector.test.ts +0 -251
  414. package/src/session/inspector/useSessionInspector.ts +0 -178
  415. package/src/workspace/WorkspaceEntryFiles.tsx +0 -196
  416. package/workflow/motion-preference.d.ts.map +0 -1
  417. package/workflow/motion-preference.js.map +0 -1
  418. package/workspace/WorkspaceEntryFiles.d.ts +0 -22
  419. package/workspace/WorkspaceEntryFiles.d.ts.map +0 -1
  420. package/workspace/WorkspaceEntryFiles.js +0 -58
  421. package/workspace/WorkspaceEntryFiles.js.map +0 -1
  422. /package/session/{inspector → facets}/InspectTab.d.ts +0 -0
  423. /package/session/{inspector → facets}/InspectTab.js +0 -0
  424. /package/src/{workflow → internal}/__tests__/motion-preference.test.ts +0 -0
  425. /package/src/session/{inspector → facets}/InspectTab.tsx +0 -0
  426. /package/src/session/{inspector → facets}/__tests__/ChangesTab.test.tsx +0 -0
@@ -0,0 +1,516 @@
1
+ "use client";
2
+
3
+ import {
4
+ forwardRef,
5
+ useCallback,
6
+ useEffect,
7
+ useImperativeHandle,
8
+ useState,
9
+ type KeyboardEvent,
10
+ } from "react";
11
+ import { cn } from "@stigmer/theme";
12
+ import type { FileChange } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
13
+ import { FileChangeType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
14
+ import { ArtifactContentRenderer } from "../execution/ArtifactContentRenderer.js";
15
+ import { FileChangeDiff } from "../execution/FileChangesView.js";
16
+ import type { RevealTarget } from "../internal/useRevealLine.js";
17
+ import type { SelectedWorkspaceFile } from "../internal/store/workspace-file-selection-store.js";
18
+ import { useWorkspaceFileContent } from "./useWorkspaceFileContent.js";
19
+ import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
20
+ import type { WorkspaceFileReader } from "./WorkspaceFileReader.js";
21
+
22
+ /** Line-skeleton widths, mirroring `FileContentStateView` in `ArtifactPreviewModal`. */
23
+ const SKELETON_LINE_WIDTHS = [85, 72, 90, 65, 78, 88, 70, 82] as const;
24
+
25
+ /** Props for {@link FileViewer}. */
26
+ export interface FileViewerProps {
27
+ /** The file to display, keyed by owning entry id + path. */
28
+ readonly selectedFile: SelectedWorkspaceFile;
29
+ /**
30
+ * Live workspace entries. The viewer resolves `selectedFile.entryId` against
31
+ * this list, so a removed entry deselects into a gentle empty state rather
32
+ * than reading a stale value.
33
+ */
34
+ readonly entries: readonly WorkspaceEntry[];
35
+ /**
36
+ * Platform-injected content reader. `undefined` means the host injects no
37
+ * reader — the viewer shows an honest "not available here" state.
38
+ */
39
+ readonly reader: WorkspaceFileReader | undefined;
40
+ /**
41
+ * The session {@link FileChange} that touched this file, when it was changed
42
+ * this session. When present the viewer defaults to the authoritative
43
+ * `baseline→candidate` diff (DD-06) and — for a non-DELETE change with a
44
+ * `reader` — offers a labeled toggle to the live "File" view. `undefined`
45
+ * (the default) keeps the viewer a pure read-only browser (backward
46
+ * compatible). Callers correlate the open file to its change with
47
+ * `findChangeForSelection`; a platform builder can pass any `FileChange`.
48
+ */
49
+ readonly change?: FileChange;
50
+ /**
51
+ * Optional jump-to-line request (e.g. a content-search hit). When present the
52
+ * viewer opens in the live **File** view — a line number refers to current
53
+ * source, not the diff (DR-1) — with the `Diff | File` toggle still available,
54
+ * and the matched line is scrolled into view and highlighted. A new `nonce`
55
+ * re-forces File view and re-scrolls even on an already-open file. No-op when
56
+ * the file is not live-browsable (a DELETE, or no `reader`).
57
+ */
58
+ readonly reveal?: RevealTarget;
59
+ /** Called when the user closes the viewer (close button or Escape). */
60
+ readonly onClose?: () => void;
61
+ /**
62
+ * Whether to render the built-in header (file name, refresh, close). Defaults
63
+ * to `true` for standalone use. Set `false` when an outer chrome owns the file
64
+ * identity and controls — e.g. the workspace surface, whose editor toolbar
65
+ * (and, from Slice B, its tabs) show the name and collapse control, and where
66
+ * a duplicate header would also collide with the floating `headerActions`
67
+ * overlay. `onClose` still drives Escape-to-close even when the header (and
68
+ * its close button) is hidden.
69
+ */
70
+ readonly showHeader?: boolean;
71
+ /** Additional CSS classes for the root element. */
72
+ readonly className?: string;
73
+ }
74
+
75
+ /**
76
+ * Imperative handle for {@link FileViewer}. Lets an outer chrome (e.g. the
77
+ * workspace surface's toolbar, which hides the built-in header) trigger a
78
+ * re-fetch of the live file content without lifting the viewer's fetch state.
79
+ */
80
+ export interface FileViewerHandle {
81
+ /** Re-fetch the current file's live content. */
82
+ readonly refresh: () => void;
83
+ }
84
+
85
+ /**
86
+ * Read-only viewer for a single workspace file.
87
+ *
88
+ * A thin shell (no new rendering): it resolves the open file, drives
89
+ * {@link useWorkspaceFileContent}, and — for displayable text — delegates to
90
+ * the shared {@link ArtifactContentRenderer} (markdown / YAML / JSON /
91
+ * line-numbered text). Its state body deliberately mirrors
92
+ * `FileContentStateView` in `ArtifactPreviewModal` (same skeleton, error, and
93
+ * delegation), extended with the three states an execution artifact never
94
+ * has — binary, too-large, and unsupported-substrate. The two are **not**
95
+ * merged into one shared component: their surrounding chrome (an artifact's
96
+ * copy/download/apply bar vs. this viewer's header) differs enough that a
97
+ * shared shell would need context-flag props. Keep them as sibling shells that
98
+ * share the one renderer.
99
+ *
100
+ * Framework-agnostic and themed via `--stgm-*` tokens (DD-004/DD-005): a
101
+ * platform builder can mount it directly given a `reader` and a selection.
102
+ *
103
+ * @example
104
+ * ```tsx
105
+ * <FileViewer
106
+ * selectedFile={{ entryId: entry.id, path: "src/index.ts" }}
107
+ * entries={workspace.entries}
108
+ * reader={workspaceFileReader}
109
+ * onClose={() => setSelected(null)}
110
+ * />
111
+ * ```
112
+ */
113
+ export const FileViewer = forwardRef<FileViewerHandle, FileViewerProps>(
114
+ function FileViewer(
115
+ { selectedFile, entries, reader, change, reveal, onClose, showHeader = true, className },
116
+ ref,
117
+ ) {
118
+ const entry = entries.find((e) => e.id === selectedFile.entryId) ?? null;
119
+ const path = selectedFile.path;
120
+
121
+ // The hook is called unconditionally — a missing entry passes `null` and the
122
+ // hook stays idle, so hook order is stable across the not-found branch.
123
+ const { content, isLoading, error, isUnsupported, refetch } =
124
+ useWorkspaceFileContent({ entry, path, reader });
125
+
126
+ useImperativeHandle(ref, () => ({ refresh: refetch }), [refetch]);
127
+
128
+ // View mode is meaningful only for a changed file. A deleted file has no live
129
+ // bytes to browse, and browsing needs a reader, so the live "File" view is
130
+ // gated on both; otherwise a changed file shows the diff alone (no lone
131
+ // control). The default is the authoritative diff (DD-06). The mount site
132
+ // remounts the viewer per file (`key`), so this initializes correctly for
133
+ // each opened file without deriving during render.
134
+ const canBrowseLive = reader !== undefined && change?.changeType !== FileChangeType.DELETE;
135
+ const showViewToggle = change !== undefined && canBrowseLive;
136
+ // A reveal (jump-to-line) opens in File view even for a changed file — the
137
+ // line number refers to current source, not the diff (DR-1). Absent a reveal,
138
+ // a changed file still defaults to the authoritative diff (DD-06).
139
+ const [viewMode, setViewMode] = useState<"diff" | "file">(
140
+ reveal ? "file" : change !== undefined ? "diff" : "file",
141
+ );
142
+ // A new reveal on an already-mounted viewer (a second search hit in the same
143
+ // file, so no remount) must return to File view to honor the line.
144
+ useEffect(() => {
145
+ if (reveal) setViewMode("file");
146
+ // Keyed on the reveal nonce: only a fresh jump-to-line request re-forces
147
+ // File view, so a manual switch to Diff afterward sticks.
148
+ }, [reveal?.nonce]);
149
+ const effectiveView: "diff" | "file" = change
150
+ ? canBrowseLive
151
+ ? viewMode
152
+ : "diff"
153
+ : "file";
154
+
155
+ const handleKeyDown = useCallback(
156
+ (e: KeyboardEvent<HTMLDivElement>) => {
157
+ if (e.key === "Escape" && onClose) {
158
+ e.stopPropagation();
159
+ onClose();
160
+ }
161
+ },
162
+ [onClose],
163
+ );
164
+
165
+ const lastSlash = path.lastIndexOf("/");
166
+ const basename = lastSlash >= 0 ? path.slice(lastSlash + 1) : path;
167
+ const dir = lastSlash >= 0 ? path.slice(0, lastSlash) : "";
168
+
169
+ // The owning entry is gone (removed while its file was open).
170
+ if (!entry) {
171
+ return (
172
+ <div
173
+ role="region"
174
+ aria-label="File viewer"
175
+ className={cn("flex h-full flex-col", className)}
176
+ onKeyDown={handleKeyDown}
177
+ >
178
+ {showHeader && (
179
+ <ViewerHeader
180
+ basename={basename}
181
+ dir={dir}
182
+ onRefresh={undefined}
183
+ onClose={onClose}
184
+ />
185
+ )}
186
+ <div className="flex flex-1 items-center justify-center p-8 text-center text-xs text-muted-foreground">
187
+ This file is no longer in the workspace.
188
+ </div>
189
+ </div>
190
+ );
191
+ }
192
+
193
+ return (
194
+ <div
195
+ role="region"
196
+ aria-label="File viewer"
197
+ className={cn("flex h-full flex-col", className)}
198
+ onKeyDown={handleKeyDown}
199
+ >
200
+ {showHeader && (
201
+ <ViewerHeader
202
+ basename={basename}
203
+ dir={dir}
204
+ onRefresh={effectiveView === "file" && !isUnsupported ? refetch : undefined}
205
+ onClose={onClose}
206
+ />
207
+ )}
208
+ {showViewToggle && (
209
+ <ViewerModeToggle value={viewMode} onChange={setViewMode} />
210
+ )}
211
+ <div className="min-h-0 flex-1 overflow-y-auto">
212
+ {effectiveView === "diff" && change ? (
213
+ <div className="p-3">
214
+ <FileChangeDiff change={change} showFileName={false} showStats />
215
+ </div>
216
+ ) : (
217
+ <>
218
+ {change && (
219
+ <p className="border-b border-border-muted px-4 py-1.5 text-[0.65rem] text-muted-foreground">
220
+ Live — may differ from the reviewed change.
221
+ </p>
222
+ )}
223
+ <FileViewerBody
224
+ basename={basename}
225
+ content={content}
226
+ isLoading={isLoading}
227
+ isUnsupported={isUnsupported}
228
+ error={error}
229
+ onRetry={refetch}
230
+ reveal={reveal}
231
+ />
232
+ </>
233
+ )}
234
+ </div>
235
+ </div>
236
+ );
237
+ },
238
+ );
239
+
240
+ // ---------------------------------------------------------------------------
241
+ // View toggle — Diff vs live File
242
+ // ---------------------------------------------------------------------------
243
+
244
+ /**
245
+ * Segmented control for a changed file's two views: the authoritative reviewed
246
+ * **Diff** and the live **File**. A mutually-exclusive choice, so it follows
247
+ * the platform's radiogroup segmented-control pattern (see `library/ScopeToggle`)
248
+ * rather than a tablist — it must not nest a second tablist inside the
249
+ * inspector's own tabs.
250
+ */
251
+ function ViewerModeToggle({
252
+ value,
253
+ onChange,
254
+ }: {
255
+ readonly value: "diff" | "file";
256
+ readonly onChange: (next: "diff" | "file") => void;
257
+ }) {
258
+ const options: readonly { readonly value: "diff" | "file"; readonly label: string }[] = [
259
+ { value: "diff", label: "Diff" },
260
+ { value: "file", label: "File" },
261
+ ];
262
+
263
+ const handleKeyDown = useCallback(
264
+ (e: KeyboardEvent<HTMLButtonElement>) => {
265
+ if (e.key === "ArrowRight" || e.key === "ArrowDown") {
266
+ e.preventDefault();
267
+ onChange("file");
268
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
269
+ e.preventDefault();
270
+ onChange("diff");
271
+ }
272
+ },
273
+ [onChange],
274
+ );
275
+
276
+ return (
277
+ <div className="border-b border-border px-3 py-1.5">
278
+ <div
279
+ role="radiogroup"
280
+ aria-label="File view"
281
+ className="inline-flex rounded-md bg-muted p-0.5"
282
+ >
283
+ {options.map((option) => {
284
+ const isSelected = value === option.value;
285
+ return (
286
+ <button
287
+ key={option.value}
288
+ type="button"
289
+ role="radio"
290
+ aria-checked={isSelected}
291
+ tabIndex={isSelected ? 0 : -1}
292
+ onClick={() => onChange(option.value)}
293
+ onKeyDown={handleKeyDown}
294
+ className={cn(
295
+ "inline-flex cursor-pointer items-center rounded-sm px-2 py-0.5 text-xs font-medium transition-colors",
296
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
297
+ isSelected
298
+ ? "bg-background text-foreground shadow-sm"
299
+ : "text-muted-foreground hover:text-foreground",
300
+ )}
301
+ >
302
+ {option.label}
303
+ </button>
304
+ );
305
+ })}
306
+ </div>
307
+ </div>
308
+ );
309
+ }
310
+
311
+ // ---------------------------------------------------------------------------
312
+ // Body — exactly one state, mirroring FileContentStateView + workspace extras
313
+ // ---------------------------------------------------------------------------
314
+
315
+ function FileViewerBody({
316
+ basename,
317
+ content,
318
+ isLoading,
319
+ isUnsupported,
320
+ error,
321
+ onRetry,
322
+ reveal,
323
+ }: {
324
+ readonly basename: string;
325
+ readonly content: ReturnType<typeof useWorkspaceFileContent>["content"];
326
+ readonly isLoading: boolean;
327
+ readonly isUnsupported: boolean;
328
+ readonly error: Error | null;
329
+ readonly onRetry: () => void;
330
+ readonly reveal?: RevealTarget;
331
+ }) {
332
+ // Unsupported comes first: a missing reader means there is nothing to load.
333
+ if (isUnsupported) {
334
+ return (
335
+ <MessageState>
336
+ Preview isn&rsquo;t available for this file here.
337
+ </MessageState>
338
+ );
339
+ }
340
+
341
+ if (isLoading) {
342
+ return (
343
+ <div className="space-y-2 p-4" aria-busy="true" aria-label="Loading file">
344
+ {SKELETON_LINE_WIDTHS.map((width, i) => (
345
+ <div
346
+ key={i}
347
+ className="h-4 animate-pulse rounded bg-muted"
348
+ style={{ width: `${width}%` }}
349
+ aria-hidden="true"
350
+ />
351
+ ))}
352
+ </div>
353
+ );
354
+ }
355
+
356
+ if (error) {
357
+ return (
358
+ <div className="flex flex-col items-center justify-center gap-2 p-8 text-center">
359
+ <ErrorAlertIcon />
360
+ <p className="text-sm text-destructive">{error.message}</p>
361
+ <button
362
+ type="button"
363
+ onClick={onRetry}
364
+ className="text-xs font-medium text-foreground underline underline-offset-2 hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm"
365
+ >
366
+ Retry
367
+ </button>
368
+ </div>
369
+ );
370
+ }
371
+
372
+ if (!content) {
373
+ // Not loading, not unsupported, no error, yet no content — defensive.
374
+ return <MessageState>Content not available for preview.</MessageState>;
375
+ }
376
+
377
+ if (content.isBinary) {
378
+ return (
379
+ <MessageState>
380
+ Binary file — not shown{content.size ? ` (${formatBytes(content.size)})` : ""}.
381
+ </MessageState>
382
+ );
383
+ }
384
+
385
+ if (content.text === null && content.truncated) {
386
+ return (
387
+ <MessageState>
388
+ This file is too large to preview
389
+ {content.size ? ` (${formatBytes(content.size)})` : ""}.
390
+ </MessageState>
391
+ );
392
+ }
393
+
394
+ if (content.text === null) {
395
+ return <MessageState>This file can&rsquo;t be displayed as text.</MessageState>;
396
+ }
397
+
398
+ return (
399
+ <ArtifactContentRenderer
400
+ content={content.text}
401
+ fileName={basename}
402
+ isTruncated={content.truncated}
403
+ reveal={reveal}
404
+ />
405
+ );
406
+ }
407
+
408
+ // ---------------------------------------------------------------------------
409
+ // Header
410
+ // ---------------------------------------------------------------------------
411
+
412
+ function ViewerHeader({
413
+ basename,
414
+ dir,
415
+ onRefresh,
416
+ onClose,
417
+ }: {
418
+ readonly basename: string;
419
+ readonly dir: string;
420
+ readonly onRefresh?: () => void;
421
+ readonly onClose?: () => void;
422
+ }) {
423
+ return (
424
+ <div className="flex items-center gap-2 border-b border-border px-3 py-2">
425
+ <FileIcon />
426
+ <div className="flex min-w-0 flex-1 items-baseline gap-1.5">
427
+ <span className="truncate text-xs font-semibold text-foreground" title={dir ? `${dir}/${basename}` : basename}>
428
+ {basename}
429
+ </span>
430
+ {dir && (
431
+ <span className="truncate text-[0.65rem] text-muted-foreground">{dir}</span>
432
+ )}
433
+ </div>
434
+ {onRefresh && (
435
+ <button
436
+ type="button"
437
+ onClick={onRefresh}
438
+ aria-label={`Reload ${basename}`}
439
+ className="shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
440
+ >
441
+ <RefreshIcon />
442
+ </button>
443
+ )}
444
+ {onClose && (
445
+ <button
446
+ type="button"
447
+ onClick={onClose}
448
+ aria-label="Close file viewer"
449
+ className="shrink-0 rounded p-0.5 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
450
+ >
451
+ <CloseIcon />
452
+ </button>
453
+ )}
454
+ </div>
455
+ );
456
+ }
457
+
458
+ function MessageState({ children }: { readonly children: React.ReactNode }) {
459
+ return (
460
+ <div className="flex h-full items-center justify-center p-8 text-center text-xs text-muted-foreground">
461
+ {children}
462
+ </div>
463
+ );
464
+ }
465
+
466
+ // ---------------------------------------------------------------------------
467
+ // Helpers
468
+ // ---------------------------------------------------------------------------
469
+
470
+ /** Human-readable byte size for the too-large / binary states. */
471
+ function formatBytes(n: number): string {
472
+ if (n < 1024) return `${n} B`;
473
+ if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;
474
+ return `${(n / (1024 * 1024)).toFixed(1)} MB`;
475
+ }
476
+
477
+ // ---------------------------------------------------------------------------
478
+ // Inline SVG icons (SDK independence — no lucide dependency)
479
+ // ---------------------------------------------------------------------------
480
+
481
+ function FileIcon() {
482
+ return (
483
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" className="shrink-0 text-muted-foreground" aria-hidden="true">
484
+ <path d="M9.5 1.5H5C4.17 1.5 3.5 2.17 3.5 3V13C3.5 13.83 4.17 14.5 5 14.5H11C11.83 14.5 12.5 13.83 12.5 13V4.5L9.5 1.5Z" />
485
+ <path d="M9.5 1.5V4.5H12.5" />
486
+ </svg>
487
+ );
488
+ }
489
+
490
+ function CloseIcon() {
491
+ return (
492
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
493
+ <path d="M3 3L11 11" />
494
+ <path d="M11 3L3 11" />
495
+ </svg>
496
+ );
497
+ }
498
+
499
+ function RefreshIcon() {
500
+ return (
501
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
502
+ <path d="M1.5 6a4.5 4.5 0 017.794-3.073M10.5 6a4.5 4.5 0 01-7.794 3.073" />
503
+ <path d="M9.5 1v2.5H7M2.5 11V8.5H5" />
504
+ </svg>
505
+ );
506
+ }
507
+
508
+ function ErrorAlertIcon() {
509
+ return (
510
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" className="text-destructive" aria-hidden="true">
511
+ <circle cx="8" cy="8" r="6.5" />
512
+ <path d="M8 5.5V8.5" />
513
+ <circle cx="8" cy="11" r="0.5" fill="currentColor" stroke="none" />
514
+ </svg>
515
+ );
516
+ }