@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
package/src/index.ts CHANGED
@@ -66,23 +66,58 @@ export type {
66
66
  export {
67
67
  useWorkspaceEntries,
68
68
  useWorkspaceFiles,
69
+ useWorkspaceFileContent,
70
+ useWorkspaceFileSearch,
71
+ useWorkspaceContentSearch,
69
72
  useWorkspaceSources,
73
+ MAX_WORKSPACE_FILE_READ_BYTES,
70
74
  WorkspaceEditor,
71
- WorkspaceEntryFiles,
75
+ WorkspaceFileSearch,
76
+ WorkspaceContentSearch,
72
77
  WorkspaceSummary,
78
+ FileViewer,
79
+ WorkspaceSurface,
80
+ ExplorerTree,
81
+ virtualEntryId,
82
+ isVirtualEntryId,
73
83
  } from "./workspace/index.js";
74
84
  export type {
75
85
  WorkspaceEntry,
76
86
  WorkspaceFileEntry,
77
87
  WorkspaceFileLister,
88
+ WorkspaceFileContent,
89
+ WorkspaceFileReader,
78
90
  UseWorkspaceEntriesReturn,
79
91
  UseWorkspaceFilesOptions,
80
92
  UseWorkspaceFilesReturn,
81
- WorkspaceEntryFilesProps,
93
+ UseWorkspaceFileContentOptions,
94
+ UseWorkspaceFileContentReturn,
95
+ UseWorkspaceFileSearchOptions,
96
+ UseWorkspaceFileSearchReturn,
97
+ WorkspaceFileSearchGroup,
98
+ WorkspaceFileMatch,
99
+ WorkspaceFileSearchProps,
100
+ WorkspaceContentMatch,
101
+ WorkspaceContentSearchResult,
102
+ WorkspaceContentSearcher,
103
+ UseWorkspaceContentSearchOptions,
104
+ UseWorkspaceContentSearchReturn,
105
+ WorkspaceContentSearchGroup,
106
+ WorkspaceContentSearchProps,
107
+ FileViewerProps,
108
+ FileViewerHandle,
109
+ SelectedWorkspaceFile,
82
110
  UseWorkspaceSourcesOptions,
83
111
  UseWorkspaceSourcesReturn,
84
112
  WorkspaceEditorProps,
85
113
  WorkspaceSummaryProps,
114
+ WorkspaceSurfaceProps,
115
+ SurfaceRailView,
116
+ SurfaceVirtualDocument,
117
+ ExplorerTreeProps,
118
+ OpenEditor,
119
+ OpenFileOptions,
120
+ RevealTarget,
86
121
  } from "./workspace/index.js";
87
122
 
88
123
  // Session — data hooks, behavior hooks, utilities (Session aggregate + conversation lifecycle)
@@ -112,9 +147,13 @@ export {
112
147
  resolvedSubject,
113
148
  SessionViewer,
114
149
  NewSessionViewer,
115
- SessionInspector,
116
- useSessionInspector,
117
- buildVisibleTabs,
150
+ useSessionPanel,
151
+ usePlanDraft,
152
+ planDraftKey,
153
+ PlanEditor,
154
+ PlanStreamingDocument,
155
+ PLAN_DOCUMENT_ENTRY_ID,
156
+ PLAN_DOCUMENT_PATH,
118
157
  SetupTab,
119
158
  } from "./session/index.js";
120
159
  export type {
@@ -152,13 +191,14 @@ export type {
152
191
  SearchResultGroup,
153
192
  SessionViewerProps,
154
193
  NewSessionViewerProps,
194
+ SessionPanelController,
195
+ UseSessionPanelOptions,
196
+ PlanDraftController,
197
+ PlanEditorProps,
198
+ PlanStreamingDocumentProps,
155
199
  ExecutionTargetOption,
156
200
  RuntimeEnvProvider,
157
201
  SessionAudience,
158
- SessionInspectorProps,
159
- SessionInspectorTabId,
160
- UseSessionInspectorOptions,
161
- UseSessionInspectorReturn,
162
202
  SetupTabProps,
163
203
  SetupTabMutationCallbacks,
164
204
  SelectedThreadItem,
@@ -208,6 +248,9 @@ export {
208
248
  SummarizationBadge,
209
249
  SummarizationCard,
210
250
  PlanCompletionCard,
251
+ PlanArtifactCard,
252
+ PlanStreamingCard,
253
+ PlanDocumentMessage,
211
254
  useContextWindow,
212
255
  formatCost,
213
256
  formatTokenCount,
@@ -224,6 +267,7 @@ export {
224
267
  resolveToolCategoryFromKind,
225
268
  toolKindToCategoryInfo,
226
269
  defaultDisclosureForCategory,
270
+ extractPrimaryArg,
227
271
  McpToolDetail,
228
272
  parseMcpResult,
229
273
  formatDuration,
@@ -302,6 +346,9 @@ export type {
302
346
  SummarizationBadgeProps,
303
347
  SummarizationCardProps,
304
348
  PlanCompletionCardProps,
349
+ PlanArtifactCardProps,
350
+ PlanStreamingCardProps,
351
+ PlanDocumentMessageProps,
305
352
  ContextHealth,
306
353
  SummarizationEventView,
307
354
  UseContextWindowReturn,
@@ -320,6 +367,7 @@ export type {
320
367
  SubAgentSectionProps,
321
368
  MessageEntryProps,
322
369
  MessageThreadProps,
370
+ ThreadContentColumn,
323
371
  ThreadSkeletonProps,
324
372
  FollowUpInputProps,
325
373
  ApprovalCardProps,
@@ -519,6 +567,7 @@ export {
519
567
  useGitHubRepos,
520
568
  useGitHubSearch,
521
569
  useGitHubTreeLister,
570
+ useGitHubFileReader,
522
571
  parseGitUrl,
523
572
  GitHubRepoPicker,
524
573
  GITHUB_CALLBACK_MESSAGE_TYPE,
@@ -932,6 +981,9 @@ export {
932
981
  useDetectSkillPackage,
933
982
  isPlanArtifact,
934
983
  findPlanArtifact,
984
+ findLatestSessionPlan,
985
+ findStreamingPlan,
986
+ PLAN_ARTIFACT_NAME,
935
987
  parseResourceYaml,
936
988
  serializeAgentYaml,
937
989
  serializeMcpServerYaml,
@@ -954,6 +1006,8 @@ export type {
954
1006
  StigmerResourceKind,
955
1007
  StigmerResourceDetection,
956
1008
  SkillPackageDetection,
1009
+ SessionPlan,
1010
+ StreamingPlan,
957
1011
  UseDetectSkillPackageReturn,
958
1012
  ParsedResource,
959
1013
  UseApplyResourceReturn,
@@ -9,29 +9,67 @@ import {
9
9
  } from "react";
10
10
  import { cn } from "@stigmer/theme";
11
11
 
12
+ /** Which pane carries the drag-controlled pixel width; its sibling flexes. */
13
+ export type ResizablePane = "primary" | "secondary";
14
+
15
+ /**
16
+ * Which pane (if any) collapses below the `lg` breakpoint, leaving its sibling
17
+ * full-width. Use this to hide the pixel-sized pane on narrow screens — always
18
+ * pair it with {@link ResizableSplitProps.resizablePane} (hide the fixed pane so
19
+ * the visible sibling is the flexing one and fills the row). `"none"` keeps both
20
+ * panes at every width.
21
+ */
22
+ export type ResizableCollapse = "primary" | "secondary" | "none";
23
+
12
24
  /** Props for {@link ResizableSplit}. */
13
25
  export interface ResizableSplitProps {
14
- /** Content rendered in the flexible (left) region. */
26
+ /** Content rendered in the first (left) region. */
15
27
  readonly primary: ReactNode;
16
- /** Content rendered in the resizable (right) panel. */
28
+ /** Content rendered in the second (right) region. */
17
29
  readonly secondary: ReactNode;
18
30
  /**
19
- * Default width of the secondary panel in pixels.
31
+ * Which pane is pixel-sized and drag-resizable; the other flexes to fill.
32
+ * Child render order is fixed (`primary` then `secondary`) regardless of this
33
+ * value, so flipping it re-flows the layout without remounting either child.
34
+ * @default "secondary"
35
+ */
36
+ readonly resizablePane?: ResizablePane;
37
+ /**
38
+ * Default width of the resizable pane in pixels.
20
39
  * Overridden by a persisted value when `storageKey` is set.
21
40
  * @default 384
22
41
  */
23
42
  readonly defaultSize?: number;
24
- /** Minimum width of the secondary panel in pixels. @default 280 */
43
+ /** Minimum width of the resizable pane in pixels. @default 280 */
25
44
  readonly minSize?: number;
26
- /** Maximum width of the secondary panel in pixels. @default 800 */
45
+ /** Maximum width of the resizable pane in pixels. @default 800 */
27
46
  readonly maxSize?: number;
28
47
  /**
29
- * `localStorage` key for persisting the panel width across sessions.
30
- * When omitted, the panel width resets to `defaultSize` on remount.
48
+ * `localStorage` key for persisting the pane width across sessions.
49
+ * When omitted, the pane width resets to `defaultSize` on remount.
50
+ * Changing this key (or `resizablePane`) re-initializes the width from the
51
+ * new key without remounting — the mechanism the session layout uses to keep
52
+ * a distinct persisted width per mode.
31
53
  */
32
54
  readonly storageKey?: string;
55
+ /** Which pane collapses below the `lg` breakpoint. @default "none" */
56
+ readonly responsiveCollapse?: ResizableCollapse;
57
+ /**
58
+ * Which pane (if any) is collapsed at every width, hiding the drag handle and
59
+ * letting the sibling fill the row. Unlike conditional rendering at the call
60
+ * site, collapsing through this prop keeps both children mounted at stable
61
+ * tree positions — the session panel uses it so opening/closing the panel
62
+ * never remounts the conversation. The persisted width survives a collapse
63
+ * and applies again on expand.
64
+ * @default "none"
65
+ */
66
+ readonly collapsedPane?: ResizableCollapse;
67
+ /**
68
+ * Accessible label for the drag separator. @default "Resize panel"
69
+ */
70
+ readonly ariaLabel?: string;
33
71
  /**
34
- * Called whenever the secondary panel width changes (during drag
72
+ * Called whenever the resizable pane width changes (during drag
35
73
  * and on initial mount from persisted state). Consumers use this
36
74
  * to thread the width into layout-dependent calculations like
37
75
  * `WorkflowExecutionGraph.panelOffsetPx`.
@@ -44,62 +82,111 @@ export interface ResizableSplitProps {
44
82
  const KEYBOARD_STEP_PX = 20;
45
83
 
46
84
  /**
47
- * Horizontal split layout with a drag-resizable right panel.
85
+ * Read the initial pane width for a given storage key, falling back to
86
+ * `defaultSize` when there is no valid persisted value. Pure of React state so
87
+ * it can seed `useState` and re-seed on a key/pane change.
88
+ */
89
+ function readInitialWidth(
90
+ storageKey: string | undefined,
91
+ defaultSize: number,
92
+ minSize: number,
93
+ maxSize: number,
94
+ ): number {
95
+ if (storageKey) {
96
+ try {
97
+ const stored = localStorage.getItem(storageKey);
98
+ if (stored) {
99
+ const parsed = Number(stored);
100
+ if (Number.isFinite(parsed) && parsed >= minSize && parsed <= maxSize) {
101
+ return parsed;
102
+ }
103
+ }
104
+ } catch {
105
+ /* localStorage may be unavailable */
106
+ }
107
+ }
108
+ return defaultSize;
109
+ }
110
+
111
+ /**
112
+ * Horizontal split layout with one drag-resizable pixel-sized pane and one
113
+ * flexible pane.
48
114
  *
49
- * The left region (`primary`) fills remaining space via `flex: 1`.
50
- * The right region (`secondary`) has a pixel-based width controlled
51
- * by a draggable divider.
115
+ * By default the right region (`secondary`) is pixel-sized and the left
116
+ * (`primary`) flexes. Set `resizablePane="primary"` to flip which side carries
117
+ * the width — the session layout uses this to invert between a chat-dominant
118
+ * layout (inspector on the right, fixed) and a workspace-dominant layout (chat
119
+ * on the left, fixed). Render order never changes, so flipping re-flows the row
120
+ * without remounting either child (preserving streaming/scroll state).
52
121
  *
53
122
  * Design:
54
123
  * - Pointer-based drag with `setPointerCapture` for reliable tracking
55
124
  * - `requestAnimationFrame` coalescing during drag (DD-009 pattern)
56
- * - Keyboard accessible: Left/Right arrows nudge by {@link KEYBOARD_STEP_PX}
57
- * - Optional `localStorage` persistence via `storageKey`
125
+ * - Keyboard accessible: arrow keys nudge by {@link KEYBOARD_STEP_PX}, oriented
126
+ * so the pane always grows toward its own side
127
+ * - Optional `localStorage` persistence via `storageKey`, re-initialized when
128
+ * the key or resizable side changes (no remount required)
129
+ * - Optional responsive collapse of the pixel pane below `lg`
58
130
  * - Styled with `--stgm-*` tokens; no hardcoded colors
59
131
  *
60
132
  * @example
61
133
  * ```tsx
134
+ * // Chat-dominant: inspector fixed on the right (default)
135
+ * <ResizableSplit
136
+ * primary={<Conversation />}
137
+ * secondary={<Inspector />}
138
+ * storageKey="stgm-session-inspector-width"
139
+ * responsiveCollapse="secondary"
140
+ * />
141
+ *
142
+ * // Workspace-dominant: chat fixed on the left
62
143
  * <ResizableSplit
63
- * primary={<WorkflowGraph />}
64
- * secondary={<InspectorPanel />}
65
- * defaultSize={384}
66
- * minSize={280}
67
- * maxSize={800}
68
- * storageKey="wf-exec-inspector-width"
69
- * onResize={setPanelWidth}
144
+ * resizablePane="primary"
145
+ * primary={<Conversation />}
146
+ * secondary={<WorkspaceSurface />}
147
+ * storageKey="stgm-session-chat-width"
148
+ * responsiveCollapse="primary"
70
149
  * />
71
150
  * ```
72
151
  */
73
152
  export function ResizableSplit({
74
153
  primary,
75
154
  secondary,
155
+ resizablePane = "secondary",
76
156
  defaultSize = 384,
77
157
  minSize = 280,
78
158
  maxSize = 800,
79
159
  storageKey,
160
+ responsiveCollapse = "none",
161
+ collapsedPane = "none",
162
+ ariaLabel = "Resize panel",
80
163
  onResize,
81
164
  className,
82
165
  }: ResizableSplitProps) {
83
- const [panelWidth, setPanelWidth] = useState(() => {
84
- if (storageKey) {
85
- try {
86
- const stored = localStorage.getItem(storageKey);
87
- if (stored) {
88
- const parsed = Number(stored);
89
- if (Number.isFinite(parsed) && parsed >= minSize && parsed <= maxSize) {
90
- return parsed;
91
- }
92
- }
93
- } catch { /* localStorage may be unavailable */ }
94
- }
95
- return defaultSize;
96
- });
166
+ const isPrimaryResizable = resizablePane === "primary";
167
+ const isCollapsed = collapsedPane !== "none";
168
+
169
+ const [panelWidth, setPanelWidth] = useState(() =>
170
+ readInitialWidth(storageKey, defaultSize, minSize, maxSize),
171
+ );
172
+
173
+ // Re-initialize the width when the storage key or resizable side changes —
174
+ // the session layout swaps both together on a mode flip and expects the width
175
+ // to come from the new key, not carry over. Adjust-state-during-render
176
+ // (matching `useSessionPanel`) so it lands before paint without a remount.
177
+ const [prevStorageKey, setPrevStorageKey] = useState(storageKey);
178
+ const [prevResizablePane, setPrevResizablePane] = useState(resizablePane);
179
+ if (storageKey !== prevStorageKey || resizablePane !== prevResizablePane) {
180
+ setPrevStorageKey(storageKey);
181
+ setPrevResizablePane(resizablePane);
182
+ setPanelWidth(readInitialWidth(storageKey, defaultSize, minSize, maxSize));
183
+ }
97
184
 
98
185
  const containerRef = useRef<HTMLDivElement>(null);
99
186
  const rafRef = useRef(0);
100
187
  const isDraggingRef = useRef(false);
101
188
 
102
- // Notify consumer of initial width on mount
189
+ // Notify consumer of the current width whenever it changes (incl. on re-init).
103
190
  const onResizeRef = useRef(onResize);
104
191
  onResizeRef.current = onResize;
105
192
  useEffect(() => {
@@ -116,7 +203,9 @@ export function ResizableSplit({
116
203
  if (!storageKey) return;
117
204
  try {
118
205
  localStorage.setItem(storageKey, String(width));
119
- } catch { /* quota or security error */ }
206
+ } catch {
207
+ /* quota or security error */
208
+ }
120
209
  },
121
210
  [storageKey],
122
211
  );
@@ -140,11 +229,15 @@ export function ResizableSplit({
140
229
  const container = containerRef.current;
141
230
  if (!container) return;
142
231
  const rect = container.getBoundingClientRect();
143
- const newWidth = clampWidth(rect.right - clientX);
144
- setPanelWidth(newWidth);
232
+ // The resizable pane's width is the distance from its own edge to the
233
+ // pointer: left edge for a primary pane, right edge for a secondary one.
234
+ const raw = isPrimaryResizable
235
+ ? clientX - rect.left
236
+ : rect.right - clientX;
237
+ setPanelWidth(clampWidth(raw));
145
238
  });
146
239
  },
147
- [clampWidth],
240
+ [clampWidth, isPrimaryResizable],
148
241
  );
149
242
 
150
243
  const handlePointerUp = useCallback(
@@ -160,9 +253,11 @@ export function ResizableSplit({
160
253
 
161
254
  const handleKeyDown = useCallback(
162
255
  (e: React.KeyboardEvent) => {
256
+ // Arrow keys grow the pane toward its own side: a primary (left) pane
257
+ // grows on ArrowRight, a secondary (right) pane grows on ArrowLeft.
163
258
  let delta = 0;
164
- if (e.key === "ArrowLeft") delta = KEYBOARD_STEP_PX;
165
- else if (e.key === "ArrowRight") delta = -KEYBOARD_STEP_PX;
259
+ if (e.key === "ArrowLeft") delta = isPrimaryResizable ? -KEYBOARD_STEP_PX : KEYBOARD_STEP_PX;
260
+ else if (e.key === "ArrowRight") delta = isPrimaryResizable ? KEYBOARD_STEP_PX : -KEYBOARD_STEP_PX;
166
261
  if (delta === 0) return;
167
262
 
168
263
  e.preventDefault();
@@ -172,26 +267,57 @@ export function ResizableSplit({
172
267
  return next;
173
268
  });
174
269
  },
175
- [clampWidth, persist],
270
+ [clampWidth, persist, isPrimaryResizable],
176
271
  );
177
272
 
178
273
  // Cleanup rAF on unmount
179
274
  useEffect(() => () => cancelAnimationFrame(rafRef.current), []);
180
275
 
276
+ const fixedPaneClass = "shrink-0 overflow-hidden";
277
+ const flexPaneClass = "min-w-0 flex-1";
278
+
279
+ // A collapsed pane hides entirely and its sibling flexes to fill the row,
280
+ // overriding the fixed/flex split. Width state is untouched, so expanding
281
+ // restores the previous size.
282
+ const primaryPaneClass =
283
+ collapsedPane === "primary"
284
+ ? "hidden"
285
+ : collapsedPane === "secondary" || !isPrimaryResizable
286
+ ? flexPaneClass
287
+ : fixedPaneClass;
288
+ const secondaryPaneClass =
289
+ collapsedPane === "secondary"
290
+ ? "hidden"
291
+ : collapsedPane === "primary" || isPrimaryResizable
292
+ ? flexPaneClass
293
+ : fixedPaneClass;
294
+
181
295
  return (
182
296
  <div ref={containerRef} className={cn("flex min-h-0 flex-1", className)}>
183
- {/* Primary region (flexible) */}
184
- <div className="min-w-0 flex-1">{primary}</div>
297
+ {/* Primary region (first child, order-stable across flips/collapses) */}
298
+ <div
299
+ className={cn(
300
+ primaryPaneClass,
301
+ responsiveCollapse === "primary" && "max-lg:hidden",
302
+ )}
303
+ style={
304
+ isPrimaryResizable && !isCollapsed ? { width: panelWidth } : undefined
305
+ }
306
+ >
307
+ {primary}
308
+ </div>
185
309
 
186
- {/* Drag handle */}
310
+ {/* Drag handle — CSS-hidden (not unmounted) while collapsed so all three
311
+ children keep stable tree positions across a collapse toggle. */}
187
312
  <div
188
313
  role="separator"
189
314
  aria-orientation="vertical"
190
315
  aria-valuenow={panelWidth}
191
316
  aria-valuemin={minSize}
192
317
  aria-valuemax={maxSize}
193
- aria-label="Resize inspector panel"
194
- tabIndex={0}
318
+ aria-label={ariaLabel}
319
+ aria-hidden={isCollapsed || undefined}
320
+ tabIndex={isCollapsed ? -1 : 0}
195
321
  onPointerDown={handlePointerDown}
196
322
  onPointerMove={handlePointerMove}
197
323
  onPointerUp={handlePointerUp}
@@ -203,16 +329,23 @@ export function ResizableSplit({
203
329
  "focus-visible:bg-[var(--stgm-primary,#6366f1)] focus-visible:outline-none",
204
330
  "active:bg-[var(--stgm-primary,#6366f1)]",
205
331
  "transition-colors duration-100",
332
+ responsiveCollapse !== "none" && "max-lg:hidden",
333
+ isCollapsed && "hidden",
206
334
  )}
207
335
  >
208
336
  {/* Wider invisible hit target (12px) for easier grabbing */}
209
337
  <div className="absolute inset-y-0 -left-1.5 -right-1.5" />
210
338
  </div>
211
339
 
212
- {/* Secondary region (resizable, fixed width) */}
340
+ {/* Secondary region (second child, order-stable across flips/collapses) */}
213
341
  <div
214
- className="shrink-0 overflow-hidden"
215
- style={{ width: panelWidth }}
342
+ className={cn(
343
+ secondaryPaneClass,
344
+ responsiveCollapse === "secondary" && "max-lg:hidden",
345
+ )}
346
+ style={
347
+ !isPrimaryResizable && !isCollapsed ? { width: panelWidth } : undefined
348
+ }
216
349
  >
217
350
  {secondary}
218
351
  </div>
@@ -14,7 +14,9 @@ import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution
14
14
  import { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
15
15
  import {
16
16
  ThreadItemRenderer,
17
+ threadContentColumnClass,
17
18
  type ThreadItem,
19
+ type ThreadContentColumn,
18
20
  } from "../execution/MessageThread.js";
19
21
  import { FilePathContext, type FilePathContextValue } from "../execution/FilePathContext.js";
20
22
  import { SandboxContext, type SandboxContextValue } from "../execution/SandboxContext.js";
@@ -45,9 +47,11 @@ export interface VirtualizedThreadProps {
45
47
  readonly fileReviewCtx: FileReviewContextValue;
46
48
  readonly unresolvedApprovalCount: number;
47
49
  readonly onBuildFromPlan?: () => void;
50
+ readonly onOpenPlan?: (executionId: string) => void;
48
51
  readonly org?: string;
49
52
  readonly planActionsDisabled?: boolean;
50
- readonly centerContent?: boolean;
53
+ readonly planBuildPending?: boolean;
54
+ readonly contentColumn?: ThreadContentColumn;
51
55
  readonly onRetrySend?: () => void;
52
56
  readonly onRetryExecution?: (message: string) => void;
53
57
  readonly onEditMessage?: (text: string) => void;
@@ -112,9 +116,11 @@ export function VirtualizedThread({
112
116
  fileReviewCtx,
113
117
  unresolvedApprovalCount,
114
118
  onBuildFromPlan,
119
+ onOpenPlan,
115
120
  org,
116
121
  planActionsDisabled,
117
- centerContent,
122
+ planBuildPending,
123
+ contentColumn,
118
124
  onRetrySend,
119
125
  onRetryExecution,
120
126
  onEditMessage,
@@ -148,13 +154,15 @@ export function VirtualizedThread({
148
154
  submittingApprovalIds,
149
155
  approvalErrors,
150
156
  onBuildFromPlan,
157
+ onOpenPlan,
151
158
  org,
152
159
  planActionsDisabled,
160
+ planBuildPending,
153
161
  onRetrySend,
154
162
  onRetryExecution,
155
163
  onEditMessage,
156
164
  }),
157
- [formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, onBuildFromPlan, org, planActionsDisabled, onRetrySend, onRetryExecution, onEditMessage],
165
+ [formatToolCallSummary, onApprovalSubmit, submittingApprovalIds, approvalErrors, onBuildFromPlan, onOpenPlan, org, planActionsDisabled, planBuildPending, onRetrySend, onRetryExecution, onEditMessage],
158
166
  );
159
167
 
160
168
  return (
@@ -177,7 +185,7 @@ export function VirtualizedThread({
177
185
  className="h-full"
178
186
  components={{ Scroller: ScrollerWithA11y }}
179
187
  itemContent={(index, item) => (
180
- <div className={cn("pb-4 pt-0 first:pt-6", centerContent && "mx-auto w-full max-w-3xl px-4")}>
188
+ <div className={cn("pb-4 pt-0 first:pt-6", threadContentColumnClass(contentColumn))}>
181
189
  <ThreadItemWrapper animate={index >= items.length - 2}>
182
190
  <ThreadItemRenderer
183
191
  item={item}