@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,196 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ import { render, screen, fireEvent, cleanup, within } from "@testing-library/react";
3
+ import { WorkspaceContentSearch } from "../WorkspaceContentSearch";
4
+ import type { WorkspaceEntry } from "../useWorkspaceEntries";
5
+ import type {
6
+ WorkspaceContentMatch,
7
+ WorkspaceContentSearchResult,
8
+ WorkspaceContentSearcher,
9
+ } from "../WorkspaceContentSearcher";
10
+
11
+ let entryIdCounter = 0;
12
+
13
+ function makeEntry(overrides?: Partial<WorkspaceEntry>): WorkspaceEntry {
14
+ return {
15
+ id: `ws-${++entryIdCounter}`,
16
+ name: "acme/api",
17
+ type: "local",
18
+ localPath: "/repo",
19
+ ...overrides,
20
+ };
21
+ }
22
+
23
+ function match(path: string, line: number, preview: string): WorkspaceContentMatch {
24
+ return { path, line, preview };
25
+ }
26
+
27
+ function ok(
28
+ matches: WorkspaceContentMatch[],
29
+ truncated = false,
30
+ ): WorkspaceContentSearchResult {
31
+ return { matches, truncated };
32
+ }
33
+
34
+ function searcherReturning(result: WorkspaceContentSearchResult): WorkspaceContentSearcher {
35
+ return vi.fn(async () => result);
36
+ }
37
+
38
+ function typeQuery(value: string) {
39
+ const input = screen.getByRole("combobox");
40
+ fireEvent.change(input, { target: { value } });
41
+ return input;
42
+ }
43
+
44
+ afterEach(cleanup);
45
+
46
+ describe("WorkspaceContentSearch", () => {
47
+ it("shows an unavailable state and disables input when no searcher is injected", () => {
48
+ render(
49
+ <WorkspaceContentSearch entries={[makeEntry()]} searcher={undefined} onOpenFile={vi.fn()} />,
50
+ );
51
+ expect(screen.getByText(/text search isn.t available here/i)).toBeTruthy();
52
+ expect(screen.getByRole("combobox")).toHaveProperty("disabled", true);
53
+ });
54
+
55
+ it("shows a hint when the query is empty", () => {
56
+ render(
57
+ <WorkspaceContentSearch
58
+ entries={[makeEntry()]}
59
+ searcher={searcherReturning(ok([]))}
60
+ onOpenFile={vi.fn()}
61
+ />,
62
+ );
63
+ expect(screen.getByText(/search file contents across the whole workspace/i)).toBeTruthy();
64
+ });
65
+
66
+ it("shows a min-length hint below the threshold and does not search", () => {
67
+ const searcher = searcherReturning(ok([match("a.ts", 1, "x")]));
68
+ render(
69
+ <WorkspaceContentSearch entries={[makeEntry()]} searcher={searcher} onOpenFile={vi.fn()} />,
70
+ );
71
+ typeQuery("a");
72
+ expect(screen.getByText(/type at least 2 characters/i)).toBeTruthy();
73
+ expect(searcher).not.toHaveBeenCalled();
74
+ });
75
+
76
+ it("renders a file header with line rows and opens the file on click (single entry)", async () => {
77
+ const entry = makeEntry();
78
+ const onOpenFile = vi.fn();
79
+ render(
80
+ <WorkspaceContentSearch
81
+ entries={[entry]}
82
+ searcher={searcherReturning(
83
+ ok([match("src/app.ts", 3, "const foo = 1"), match("src/app.ts", 7, "return foo")]),
84
+ )}
85
+ onOpenFile={onOpenFile}
86
+ />,
87
+ );
88
+
89
+ typeQuery("foo");
90
+ const options = await screen.findAllByRole("option");
91
+ expect(options).toHaveLength(2);
92
+ // File header (basename) present; single entry → no entry header.
93
+ expect(screen.getByText("app.ts")).toBeTruthy();
94
+ expect(screen.queryByText("acme/api")).toBeNull();
95
+
96
+ // Clicking a line hit opens via the shared onOpenFile seam (the same path a
97
+ // tree/filename click uses — this is what makes a changed file honor the
98
+ // FileViewer diff-default; see FileViewer diff-mode suite).
99
+ fireEvent.click(within(options[0]).getByRole("button"));
100
+ // The hit's line rides along so the viewer jumps to it (DR-1/DR-2).
101
+ expect(onOpenFile).toHaveBeenCalledWith(entry.id, "src/app.ts", { line: 3 });
102
+ });
103
+
104
+ it("shows an entry header when more than one entry has hits", async () => {
105
+ const a = makeEntry({ name: "acme/api" });
106
+ const b = makeEntry({ name: "acme/web" });
107
+ const searcher: WorkspaceContentSearcher = vi.fn(async (e) =>
108
+ e.id === a.id ? ok([match("a.ts", 1, "foo")]) : ok([match("b.ts", 2, "foo")]),
109
+ );
110
+ render(<WorkspaceContentSearch entries={[a, b]} searcher={searcher} onOpenFile={vi.fn()} />);
111
+
112
+ typeQuery("foo");
113
+ await screen.findAllByRole("option");
114
+ expect(screen.getByText("acme/api")).toBeTruthy();
115
+ expect(screen.getByText("acme/web")).toBeTruthy();
116
+ });
117
+
118
+ it("highlights every occurrence of the query in the preview", async () => {
119
+ const { container } = render(
120
+ <WorkspaceContentSearch
121
+ entries={[makeEntry()]}
122
+ searcher={searcherReturning(ok([match("a.ts", 1, "foo and foo")]))}
123
+ onOpenFile={vi.fn()}
124
+ />,
125
+ );
126
+ typeQuery("foo");
127
+ await screen.findByRole("option");
128
+ const highlights = container.querySelectorAll(".font-semibold");
129
+ expect(Array.from(highlights).map((el) => el.textContent)).toEqual(["foo", "foo"]);
130
+ });
131
+
132
+ it("shows a no-match state", async () => {
133
+ render(
134
+ <WorkspaceContentSearch
135
+ entries={[makeEntry()]}
136
+ searcher={searcherReturning(ok([]))}
137
+ onOpenFile={vi.fn()}
138
+ />,
139
+ );
140
+ typeQuery("zzz");
141
+ expect(await screen.findByText(/no files containing/i)).toBeTruthy();
142
+ });
143
+
144
+ it("moves virtual focus with ArrowDown and opens on Enter", async () => {
145
+ const entry = makeEntry();
146
+ const onOpenFile = vi.fn();
147
+ render(
148
+ <WorkspaceContentSearch
149
+ entries={[entry]}
150
+ searcher={searcherReturning(
151
+ ok([match("a.ts", 1, "foo"), match("a.ts", 2, "foo")]),
152
+ )}
153
+ onOpenFile={onOpenFile}
154
+ />,
155
+ );
156
+
157
+ const input = typeQuery("foo");
158
+ await screen.findAllByRole("option");
159
+
160
+ fireEvent.keyDown(input, { key: "ArrowDown" });
161
+ const active = input.getAttribute("aria-activedescendant");
162
+ expect(active).toBeTruthy();
163
+ expect(document.getElementById(active!)?.getAttribute("aria-selected")).toBe("true");
164
+
165
+ fireEvent.keyDown(input, { key: "Enter" });
166
+ expect(onOpenFile).toHaveBeenCalledWith(entry.id, "a.ts", { line: 1 });
167
+ });
168
+
169
+ it("caps rendered rows and reports the total", async () => {
170
+ const many = Array.from({ length: 250 }, (_, i) => match("a.ts", i + 1, "foo"));
171
+ render(
172
+ <WorkspaceContentSearch
173
+ entries={[makeEntry()]}
174
+ searcher={searcherReturning(ok(many))}
175
+ onOpenFile={vi.fn()}
176
+ />,
177
+ );
178
+ typeQuery("foo");
179
+ await screen.findAllByRole("option");
180
+ expect(screen.getAllByRole("option")).toHaveLength(200);
181
+ expect(screen.getByText(/showing the first 200 of 250 matches/i)).toBeTruthy();
182
+ });
183
+
184
+ it("renders a truncation notice when a search was capped", async () => {
185
+ render(
186
+ <WorkspaceContentSearch
187
+ entries={[makeEntry()]}
188
+ searcher={searcherReturning(ok([match("a.ts", 1, "foo")], true))}
189
+ onOpenFile={vi.fn()}
190
+ />,
191
+ );
192
+ typeQuery("foo");
193
+ await screen.findByRole("option");
194
+ expect(screen.getByText(/more matches exist than shown/i)).toBeTruthy();
195
+ });
196
+ });
@@ -0,0 +1,206 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { render, screen, fireEvent, cleanup, within } from "@testing-library/react";
3
+ import { WorkspaceFileSearch } from "../WorkspaceFileSearch";
4
+ import { __clearWorkspaceListingCache } from "../workspaceListingCache";
5
+ import type { WorkspaceEntry } from "../useWorkspaceEntries";
6
+ import type { WorkspaceFileEntry, WorkspaceFileLister } from "../WorkspaceFileLister";
7
+
8
+ let entryIdCounter = 0;
9
+
10
+ function makeEntry(overrides?: Partial<WorkspaceEntry>): WorkspaceEntry {
11
+ return {
12
+ id: `ws-${++entryIdCounter}`,
13
+ name: "acme/api",
14
+ type: "git",
15
+ gitUrl: "https://github.com/acme/api",
16
+ gitBranch: "main",
17
+ ...overrides,
18
+ };
19
+ }
20
+
21
+ const FILES: WorkspaceFileEntry[] = [
22
+ { path: "src/index.ts", isDirectory: false },
23
+ { path: "src/button.tsx", isDirectory: false },
24
+ { path: "README.md", isDirectory: false },
25
+ ];
26
+
27
+ function typeQuery(value: string) {
28
+ const input = screen.getByRole("combobox");
29
+ fireEvent.change(input, { target: { value } });
30
+ return input;
31
+ }
32
+
33
+ describe("WorkspaceFileSearch", () => {
34
+ beforeEach(() => {
35
+ __clearWorkspaceListingCache();
36
+ });
37
+ afterEach(cleanup);
38
+
39
+ it("shows an unavailable state and disables input when no lister is injected", () => {
40
+ render(
41
+ <WorkspaceFileSearch
42
+ entries={[makeEntry()]}
43
+ lister={undefined}
44
+ onOpenFile={vi.fn()}
45
+ />,
46
+ );
47
+ expect(screen.getByText(/search isn.t available here/i)).toBeTruthy();
48
+ expect(screen.getByRole("combobox")).toHaveProperty("disabled", true);
49
+ });
50
+
51
+ it("shows a hint when the query is empty", () => {
52
+ render(
53
+ <WorkspaceFileSearch
54
+ entries={[makeEntry()]}
55
+ lister={vi.fn(async () => FILES)}
56
+ onOpenFile={vi.fn()}
57
+ />,
58
+ );
59
+ expect(
60
+ screen.getByText(/search files by name across the whole workspace/i),
61
+ ).toBeTruthy();
62
+ });
63
+
64
+ it("renders a flat result list and opens a file on click (single entry)", async () => {
65
+ const entry = makeEntry();
66
+ const onOpenFile = vi.fn();
67
+ render(
68
+ <WorkspaceFileSearch
69
+ entries={[entry]}
70
+ lister={vi.fn(async () => FILES)}
71
+ onOpenFile={onOpenFile}
72
+ />,
73
+ );
74
+
75
+ typeQuery("button");
76
+ const option = await screen.findByRole("option");
77
+ fireEvent.click(within(option).getByRole("button"));
78
+
79
+ expect(onOpenFile).toHaveBeenCalledWith(entry.id, "src/button.tsx");
80
+ // Single entry → no group header.
81
+ expect(screen.queryByText("acme/api")).toBeNull();
82
+ });
83
+
84
+ it("groups results by entry when more than one entry matches", async () => {
85
+ const a = makeEntry({ name: "acme/api" });
86
+ const b = makeEntry({ name: "acme/web" });
87
+ const lister: WorkspaceFileLister = vi.fn(async (e) =>
88
+ e.id === a.id
89
+ ? [{ path: "src/button.tsx", isDirectory: false }]
90
+ : [{ path: "lib/button.ts", isDirectory: false }],
91
+ );
92
+ render(
93
+ <WorkspaceFileSearch entries={[a, b]} lister={lister} onOpenFile={vi.fn()} />,
94
+ );
95
+
96
+ typeQuery("button");
97
+ const options = await screen.findAllByRole("option");
98
+ expect(options).toHaveLength(2);
99
+ expect(screen.getByText("acme/api")).toBeTruthy();
100
+ expect(screen.getByText("acme/web")).toBeTruthy();
101
+ });
102
+
103
+ it("highlights the matched substring", async () => {
104
+ const { container } = render(
105
+ <WorkspaceFileSearch
106
+ entries={[makeEntry()]}
107
+ lister={vi.fn(async () => FILES)}
108
+ onOpenFile={vi.fn()}
109
+ />,
110
+ );
111
+ typeQuery("button");
112
+ await screen.findByRole("option");
113
+ const highlight = container.querySelector(".font-semibold");
114
+ expect(highlight?.textContent).toBe("button");
115
+ });
116
+
117
+ it("marks the currently open file with aria-current", async () => {
118
+ const entry = makeEntry();
119
+ render(
120
+ <WorkspaceFileSearch
121
+ entries={[entry]}
122
+ lister={vi.fn(async () => FILES)}
123
+ onOpenFile={vi.fn()}
124
+ selectedFile={{ entryId: entry.id, path: "src/button.tsx" }}
125
+ />,
126
+ );
127
+ typeQuery("button");
128
+ const option = await screen.findByRole("option");
129
+ expect(within(option).getByRole("button").getAttribute("aria-current")).toBe(
130
+ "true",
131
+ );
132
+ });
133
+
134
+ it("shows a no-match state", async () => {
135
+ render(
136
+ <WorkspaceFileSearch
137
+ entries={[makeEntry()]}
138
+ lister={vi.fn(async () => FILES)}
139
+ onOpenFile={vi.fn()}
140
+ />,
141
+ );
142
+ typeQuery("zzzzz");
143
+ expect(await screen.findByText(/no files matching/i)).toBeTruthy();
144
+ });
145
+
146
+ it("renders a truncation notice from a notice entry", async () => {
147
+ render(
148
+ <WorkspaceFileSearch
149
+ entries={[makeEntry()]}
150
+ lister={vi.fn(async () => [
151
+ { path: "src/button.tsx", isDirectory: false },
152
+ { path: "... truncated", isDirectory: false, notice: true as const },
153
+ ])}
154
+ onOpenFile={vi.fn()}
155
+ />,
156
+ );
157
+ typeQuery("button");
158
+ await screen.findByRole("option");
159
+ expect(screen.getByText(/too many files to search in full/i)).toBeTruthy();
160
+ });
161
+
162
+ it("moves virtual focus with ArrowDown and opens on Enter", async () => {
163
+ const entry = makeEntry();
164
+ const onOpenFile = vi.fn();
165
+ render(
166
+ <WorkspaceFileSearch
167
+ entries={[entry]}
168
+ lister={vi.fn(async () => FILES)}
169
+ onOpenFile={onOpenFile}
170
+ />,
171
+ );
172
+
173
+ const input = typeQuery("src"); // matches src/index.ts and src/button.tsx
174
+ await screen.findAllByRole("option");
175
+
176
+ fireEvent.keyDown(input, { key: "ArrowDown" });
177
+ const active = input.getAttribute("aria-activedescendant");
178
+ expect(active).toBeTruthy();
179
+ const focusedOption = document.getElementById(active!);
180
+ expect(focusedOption?.getAttribute("aria-selected")).toBe("true");
181
+
182
+ fireEvent.keyDown(input, { key: "Enter" });
183
+ expect(onOpenFile).toHaveBeenCalledTimes(1);
184
+ expect(onOpenFile.mock.calls[0][0]).toBe(entry.id);
185
+ });
186
+
187
+ it("caps rendered results and reports the total", async () => {
188
+ const entry = makeEntry();
189
+ const many: WorkspaceFileEntry[] = Array.from({ length: 250 }, (_, i) => ({
190
+ path: `src/match-${i}.ts`,
191
+ isDirectory: false,
192
+ }));
193
+ render(
194
+ <WorkspaceFileSearch
195
+ entries={[entry]}
196
+ lister={vi.fn(async () => many)}
197
+ onOpenFile={vi.fn()}
198
+ />,
199
+ );
200
+
201
+ typeQuery("match");
202
+ await screen.findAllByRole("option");
203
+ expect(screen.getAllByRole("option")).toHaveLength(200);
204
+ expect(screen.getByText(/showing the first 200 of 250 matches/i)).toBeTruthy();
205
+ });
206
+ });