@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,429 @@
1
+ "use client";
2
+
3
+ import {
4
+ useCallback,
5
+ useEffect,
6
+ useId,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ type KeyboardEvent,
11
+ } from "react";
12
+ import { cn } from "@stigmer/theme";
13
+ import type { WorkspaceEntry } from "./useWorkspaceEntries.js";
14
+ import type { WorkspaceFileLister } from "./WorkspaceFileLister.js";
15
+ import type { SelectedWorkspaceFile } from "../internal/store/workspace-file-selection-store.js";
16
+ import {
17
+ useWorkspaceFileSearch,
18
+ type WorkspaceFileSearchGroup,
19
+ } from "./useWorkspaceFileSearch.js";
20
+ import type { WorkspaceFileMatch } from "./matchWorkspaceFiles.js";
21
+
22
+ /** Cap on rendered rows — keeps the DOM bounded on huge repositories. */
23
+ const MAX_RESULTS = 200;
24
+
25
+ /** Props for {@link WorkspaceFileSearch}. */
26
+ export interface WorkspaceFileSearchProps {
27
+ /** All workspace entries to search across. */
28
+ readonly entries: readonly WorkspaceEntry[];
29
+ /** Platform-injected file lister. `undefined` → search is unavailable. */
30
+ readonly lister: WorkspaceFileLister | undefined;
31
+ /** Opens a result in the viewer. */
32
+ readonly onOpenFile: (entryId: string, path: string) => void;
33
+ /** The file currently open in the viewer, highlighted in the results. */
34
+ readonly selectedFile?: SelectedWorkspaceFile | null;
35
+ /** Additional CSS classes for the root element. */
36
+ readonly className?: string;
37
+ }
38
+
39
+ /** A rendered result, carrying its owning entry and flat index for keyboard nav. */
40
+ interface FlatResult {
41
+ readonly entryId: string;
42
+ readonly entry: WorkspaceEntry;
43
+ readonly match: WorkspaceFileMatch;
44
+ }
45
+
46
+ /**
47
+ * Workspace-wide filename/path search surface.
48
+ *
49
+ * Searches the already-loaded listings across every workspace entry (via
50
+ * {@link useWorkspaceFileSearch}) and opens a hit in the viewer through
51
+ * `onOpenFile` — the same seam a file-tree click uses. Filename-first by design;
52
+ * content search is a separate substrate-specific capability (DD-09).
53
+ *
54
+ * Keyboard/a11y follows the platform's combobox+listbox pattern (see
55
+ * `mcp-server/McpServerPicker`): the input is a `role="combobox"` driving
56
+ * `aria-activedescendant`, results are a `role="listbox"` of `role="option"`
57
+ * rows, and ArrowUp/Down move a virtual focus with Enter to open — focus stays
58
+ * in the input. All visual properties flow through `--stgm-*` tokens (DD-005).
59
+ */
60
+ export function WorkspaceFileSearch({
61
+ entries,
62
+ lister,
63
+ onOpenFile,
64
+ selectedFile,
65
+ className,
66
+ }: WorkspaceFileSearchProps) {
67
+ const [query, setQuery] = useState("");
68
+ const [focusIndex, setFocusIndex] = useState(-1);
69
+
70
+ const inputRef = useRef<HTMLInputElement>(null);
71
+ const listboxId = useId();
72
+ const optionId = useCallback(
73
+ (index: number) => `${listboxId}-opt-${index}`,
74
+ [listboxId],
75
+ );
76
+
77
+ const { groups, totalMatches, isLoading, isUnsupported } =
78
+ useWorkspaceFileSearch({ entries, lister, query });
79
+
80
+ // Flat, capped view of every rendered match — the index space the keyboard
81
+ // and `aria-activedescendant` share with the grouped render below.
82
+ const flatResults = useMemo<readonly FlatResult[]>(() => {
83
+ const flat: FlatResult[] = [];
84
+ for (const group of groups) {
85
+ for (const match of group.matches) {
86
+ if (flat.length >= MAX_RESULTS) return flat;
87
+ flat.push({ entryId: group.entry.id, entry: group.entry, match });
88
+ }
89
+ }
90
+ return flat;
91
+ }, [groups]);
92
+
93
+ // A new query invalidates the previous virtual focus.
94
+ useEffect(() => {
95
+ setFocusIndex(-1);
96
+ }, [query]);
97
+
98
+ // Autofocus on mount — the user switched into Search intending to type.
99
+ useEffect(() => {
100
+ inputRef.current?.focus();
101
+ }, []);
102
+
103
+ // Keep the virtually-focused option in view (no-op where unsupported, e.g. tests).
104
+ useEffect(() => {
105
+ if (focusIndex < 0) return;
106
+ const el =
107
+ typeof document !== "undefined"
108
+ ? document.getElementById(optionId(focusIndex))
109
+ : null;
110
+ el?.scrollIntoView?.({ block: "nearest" });
111
+ }, [focusIndex, optionId]);
112
+
113
+ const handleKeyDown = useCallback(
114
+ (e: KeyboardEvent<HTMLInputElement>) => {
115
+ if (e.key === "ArrowDown") {
116
+ e.preventDefault();
117
+ setFocusIndex((prev) =>
118
+ prev < flatResults.length - 1 ? prev + 1 : prev,
119
+ );
120
+ } else if (e.key === "ArrowUp") {
121
+ e.preventDefault();
122
+ setFocusIndex((prev) => (prev > 0 ? prev - 1 : -1));
123
+ } else if (e.key === "Enter") {
124
+ e.preventDefault();
125
+ const target = flatResults[focusIndex];
126
+ if (target) onOpenFile(target.entryId, target.match.path);
127
+ }
128
+ },
129
+ [flatResults, focusIndex, onOpenFile],
130
+ );
131
+
132
+ const trimmed = query.trim();
133
+ const showGroupHeaders = groups.length > 1;
134
+
135
+ return (
136
+ <div className={cn("flex h-full flex-col", className)}>
137
+ <div className="flex items-center gap-1.5 border-b border-border px-2 py-1.5">
138
+ <SearchIcon />
139
+ <input
140
+ ref={inputRef}
141
+ type="text"
142
+ role="combobox"
143
+ aria-expanded
144
+ aria-controls={listboxId}
145
+ aria-activedescendant={
146
+ focusIndex >= 0 ? optionId(focusIndex) : undefined
147
+ }
148
+ value={query}
149
+ onChange={(e) => setQuery(e.target.value)}
150
+ onKeyDown={handleKeyDown}
151
+ placeholder="Search files by name…"
152
+ disabled={isUnsupported}
153
+ className={cn(
154
+ "min-w-0 flex-1 bg-transparent text-xs text-foreground",
155
+ "placeholder:text-muted-foreground",
156
+ "focus-visible:outline-none disabled:cursor-not-allowed",
157
+ )}
158
+ aria-label="Search workspace files by name"
159
+ />
160
+ {trimmed.length > 0 && (
161
+ <button
162
+ type="button"
163
+ onClick={() => {
164
+ setQuery("");
165
+ inputRef.current?.focus();
166
+ }}
167
+ className="shrink-0 text-muted-foreground transition-colors hover:text-foreground"
168
+ aria-label="Clear search"
169
+ >
170
+ <ClearIcon />
171
+ </button>
172
+ )}
173
+ </div>
174
+
175
+ <div className="min-h-0 flex-1 overflow-y-auto">
176
+ {isUnsupported ? (
177
+ <MessageState>File search isn&rsquo;t available here.</MessageState>
178
+ ) : trimmed.length === 0 ? (
179
+ <MessageState>
180
+ Search files by name across the whole workspace.
181
+ </MessageState>
182
+ ) : isLoading && totalMatches === 0 && groups.length === 0 ? (
183
+ <MessageState>Searching…</MessageState>
184
+ ) : groups.length === 0 ? (
185
+ <MessageState>
186
+ No files matching &ldquo;{trimmed}&rdquo;.
187
+ </MessageState>
188
+ ) : (
189
+ <>
190
+ <ul
191
+ id={listboxId}
192
+ role="listbox"
193
+ aria-label="Search results"
194
+ className="py-0.5"
195
+ >
196
+ {renderRows({
197
+ groups,
198
+ showGroupHeaders,
199
+ selectedFile: selectedFile ?? null,
200
+ focusIndex,
201
+ optionId,
202
+ onOpenFile,
203
+ })}
204
+ </ul>
205
+ {totalMatches > flatResults.length && (
206
+ <p className="border-t border-border px-3 py-1.5 text-[0.65rem] text-muted-foreground">
207
+ Showing the first {flatResults.length} of {totalMatches} matches
208
+ — refine your search to narrow the list.
209
+ </p>
210
+ )}
211
+ </>
212
+ )}
213
+ </div>
214
+ </div>
215
+ );
216
+ }
217
+
218
+ // ---------------------------------------------------------------------------
219
+ // Result rows — a single pass over groups that keeps the flat match index
220
+ // aligned with `flatResults` (and thus keyboard focus / aria-activedescendant).
221
+ // ---------------------------------------------------------------------------
222
+
223
+ function renderRows({
224
+ groups,
225
+ showGroupHeaders,
226
+ selectedFile,
227
+ focusIndex,
228
+ optionId,
229
+ onOpenFile,
230
+ }: {
231
+ readonly groups: readonly WorkspaceFileSearchGroup[];
232
+ readonly showGroupHeaders: boolean;
233
+ readonly selectedFile: SelectedWorkspaceFile | null;
234
+ readonly focusIndex: number;
235
+ readonly optionId: (index: number) => string;
236
+ readonly onOpenFile: (entryId: string, path: string) => void;
237
+ }) {
238
+ const rows: React.ReactNode[] = [];
239
+ let matchIndex = 0;
240
+
241
+ for (const group of groups) {
242
+ if (showGroupHeaders) {
243
+ rows.push(<GroupHeader key={`h:${group.entry.id}`} name={group.entry.name} />);
244
+ }
245
+
246
+ for (const match of group.matches) {
247
+ if (matchIndex >= MAX_RESULTS) break;
248
+ const index = matchIndex++;
249
+ const isOpen =
250
+ selectedFile?.entryId === group.entry.id &&
251
+ selectedFile.path === match.path;
252
+ rows.push(
253
+ <ResultRow
254
+ key={`${group.entry.id}:${match.path}`}
255
+ id={optionId(index)}
256
+ match={match}
257
+ isFocused={index === focusIndex}
258
+ isOpen={isOpen}
259
+ onOpen={() => onOpenFile(group.entry.id, match.path)}
260
+ />,
261
+ );
262
+ }
263
+
264
+ if (group.truncated) {
265
+ rows.push(
266
+ <GroupNotice key={`t:${group.entry.id}`}>
267
+ Partial listing — this repository has too many files to search in full.
268
+ </GroupNotice>,
269
+ );
270
+ }
271
+ if (group.error) {
272
+ rows.push(
273
+ <GroupNotice key={`e:${group.entry.id}`} isError>
274
+ Couldn&rsquo;t list files: {group.error.message}
275
+ </GroupNotice>,
276
+ );
277
+ }
278
+
279
+ if (matchIndex >= MAX_RESULTS) break;
280
+ }
281
+
282
+ return rows;
283
+ }
284
+
285
+ function ResultRow({
286
+ id,
287
+ match,
288
+ isFocused,
289
+ isOpen,
290
+ onOpen,
291
+ }: {
292
+ readonly id: string;
293
+ readonly match: WorkspaceFileMatch;
294
+ readonly isFocused: boolean;
295
+ readonly isOpen: boolean;
296
+ readonly onOpen: () => void;
297
+ }) {
298
+ const lastSlash = match.path.lastIndexOf("/");
299
+ const basename = match.path.slice(lastSlash + 1);
300
+ const dir = lastSlash >= 0 ? match.path.slice(0, lastSlash) : "";
301
+
302
+ return (
303
+ <li id={id} role="option" aria-selected={isFocused}>
304
+ <button
305
+ type="button"
306
+ onClick={onOpen}
307
+ tabIndex={-1}
308
+ aria-current={isOpen ? "true" : undefined}
309
+ className={cn(
310
+ "flex w-full items-baseline gap-1.5 px-3 py-1 text-left text-xs transition-colors",
311
+ isFocused && "bg-muted",
312
+ isOpen && "bg-muted font-medium text-foreground",
313
+ !isFocused && !isOpen && "hover:bg-muted",
314
+ )}
315
+ >
316
+ <span className="truncate text-foreground">
317
+ <HighlightedPath
318
+ text={basename}
319
+ offset={lastSlash + 1}
320
+ matchStart={match.matchStart}
321
+ matchEnd={match.matchEnd}
322
+ />
323
+ </span>
324
+ {dir && (
325
+ <span className="truncate text-[0.65rem] text-muted-foreground">
326
+ <HighlightedPath
327
+ text={dir}
328
+ offset={0}
329
+ matchStart={match.matchStart}
330
+ matchEnd={match.matchEnd}
331
+ />
332
+ </span>
333
+ )}
334
+ </button>
335
+ </li>
336
+ );
337
+ }
338
+
339
+ /**
340
+ * Renders a slice of the path (`text`, starting at `offset` within the full
341
+ * path), emphasizing the intersection with the match range `[matchStart,
342
+ * matchEnd)`. Non-overlapping slices render plain.
343
+ */
344
+ function HighlightedPath({
345
+ text,
346
+ offset,
347
+ matchStart,
348
+ matchEnd,
349
+ }: {
350
+ readonly text: string;
351
+ readonly offset: number;
352
+ readonly matchStart: number;
353
+ readonly matchEnd: number;
354
+ }) {
355
+ const localStart = Math.max(0, matchStart - offset);
356
+ const localEnd = Math.min(text.length, matchEnd - offset);
357
+
358
+ if (localStart >= localEnd) return <>{text}</>;
359
+
360
+ return (
361
+ <>
362
+ {text.slice(0, localStart)}
363
+ <span className="font-semibold text-foreground">
364
+ {text.slice(localStart, localEnd)}
365
+ </span>
366
+ {text.slice(localEnd)}
367
+ </>
368
+ );
369
+ }
370
+
371
+ function GroupHeader({ name }: { readonly name: string }) {
372
+ return (
373
+ <li
374
+ role="presentation"
375
+ className="truncate px-3 pb-0.5 pt-2 text-[0.6rem] font-medium uppercase tracking-wide text-muted-foreground"
376
+ >
377
+ {name}
378
+ </li>
379
+ );
380
+ }
381
+
382
+ function GroupNotice({
383
+ children,
384
+ isError,
385
+ }: {
386
+ readonly children: React.ReactNode;
387
+ readonly isError?: boolean;
388
+ }) {
389
+ return (
390
+ <li
391
+ role="presentation"
392
+ className={cn(
393
+ "px-3 py-1 text-[0.65rem]",
394
+ isError ? "text-destructive" : "text-muted-foreground",
395
+ )}
396
+ >
397
+ {children}
398
+ </li>
399
+ );
400
+ }
401
+
402
+ function MessageState({ children }: { readonly children: React.ReactNode }) {
403
+ return (
404
+ <div className="flex h-full items-center justify-center p-8 text-center text-xs text-muted-foreground">
405
+ {children}
406
+ </div>
407
+ );
408
+ }
409
+
410
+ // ---------------------------------------------------------------------------
411
+ // Inline SVG icons (SDK independence — no lucide dependency)
412
+ // ---------------------------------------------------------------------------
413
+
414
+ function SearchIcon() {
415
+ return (
416
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" className="shrink-0 text-muted-foreground" aria-hidden="true">
417
+ <circle cx="5.25" cy="5.25" r="3.5" />
418
+ <path d="M7.75 7.75L10.5 10.5" />
419
+ </svg>
420
+ );
421
+ }
422
+
423
+ function ClearIcon() {
424
+ return (
425
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
426
+ <path d="M3 3L9 9M9 3L3 9" />
427
+ </svg>
428
+ );
429
+ }