@stigmer/react 3.1.1 → 3.1.3

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 (483) hide show
  1. package/composer/SessionComposer.d.ts +25 -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/ArtifactPreviewModal.d.ts +5 -5
  10. package/execution/ArtifactPreviewModal.js +4 -4
  11. package/execution/ArtifactPreviewModal.js.map +1 -1
  12. package/execution/FileChangeProgressBar.d.ts +47 -0
  13. package/execution/FileChangeProgressBar.d.ts.map +1 -0
  14. package/execution/FileChangeProgressBar.js +49 -0
  15. package/execution/FileChangeProgressBar.js.map +1 -0
  16. package/execution/FileChangesView.d.ts.map +1 -1
  17. package/execution/FileChangesView.js +19 -4
  18. package/execution/FileChangesView.js.map +1 -1
  19. package/execution/FilePathContext.d.ts +8 -1
  20. package/execution/FilePathContext.d.ts.map +1 -1
  21. package/execution/FilePathContext.js.map +1 -1
  22. package/execution/FilePathLink.d.ts.map +1 -1
  23. package/execution/FilePathLink.js +21 -6
  24. package/execution/FilePathLink.js.map +1 -1
  25. package/execution/FileReviewAtoms.d.ts +27 -0
  26. package/execution/FileReviewAtoms.d.ts.map +1 -0
  27. package/execution/FileReviewAtoms.js +64 -0
  28. package/execution/FileReviewAtoms.js.map +1 -0
  29. package/execution/FileReviewCard.d.ts +2 -2
  30. package/execution/FileReviewCard.d.ts.map +1 -1
  31. package/execution/FileReviewCard.js +32 -62
  32. package/execution/FileReviewCard.js.map +1 -1
  33. package/execution/MessageEntry.d.ts +20 -0
  34. package/execution/MessageEntry.d.ts.map +1 -1
  35. package/execution/MessageEntry.js +19 -5
  36. package/execution/MessageEntry.js.map +1 -1
  37. package/execution/MessageThread.d.ts +75 -13
  38. package/execution/MessageThread.d.ts.map +1 -1
  39. package/execution/MessageThread.js +195 -27
  40. package/execution/MessageThread.js.map +1 -1
  41. package/execution/PlanArtifactCard.d.ts +36 -21
  42. package/execution/PlanArtifactCard.d.ts.map +1 -1
  43. package/execution/PlanArtifactCard.js +39 -25
  44. package/execution/PlanArtifactCard.js.map +1 -1
  45. package/execution/PlanCompletionCard.d.ts +4 -4
  46. package/execution/PlanCompletionCard.d.ts.map +1 -1
  47. package/execution/PlanCompletionCard.js +4 -4
  48. package/execution/PlanCompletionCard.js.map +1 -1
  49. package/execution/PlanDocumentMessage.d.ts +32 -0
  50. package/execution/PlanDocumentMessage.d.ts.map +1 -0
  51. package/execution/PlanDocumentMessage.js +37 -0
  52. package/execution/PlanDocumentMessage.js.map +1 -0
  53. package/execution/PlanStreamingCard.d.ts +50 -0
  54. package/execution/PlanStreamingCard.d.ts.map +1 -0
  55. package/execution/PlanStreamingCard.js +40 -0
  56. package/execution/PlanStreamingCard.js.map +1 -0
  57. package/execution/index.d.ts +9 -1
  58. package/execution/index.d.ts.map +1 -1
  59. package/execution/index.js +4 -0
  60. package/execution/index.js.map +1 -1
  61. package/execution/use-build-from-plan-hotkey.d.ts +1 -1
  62. package/execution/use-build-from-plan-hotkey.js +1 -1
  63. package/execution/useArtifactCopy.d.ts +51 -0
  64. package/execution/useArtifactCopy.d.ts.map +1 -0
  65. package/execution/useArtifactCopy.js +75 -0
  66. package/execution/useArtifactCopy.js.map +1 -0
  67. package/execution/useArtifactDownload.d.ts.map +1 -1
  68. package/execution/useArtifactDownload.js +17 -5
  69. package/execution/useArtifactDownload.js.map +1 -1
  70. package/execution/useCreateAgentExecution.d.ts +12 -0
  71. package/execution/useCreateAgentExecution.d.ts.map +1 -1
  72. package/execution/useCreateAgentExecution.js +5 -1
  73. package/execution/useCreateAgentExecution.js.map +1 -1
  74. package/github/decodeGitHubContent.d.ts +29 -0
  75. package/github/decodeGitHubContent.d.ts.map +1 -0
  76. package/github/decodeGitHubContent.js +72 -0
  77. package/github/decodeGitHubContent.js.map +1 -0
  78. package/github/index.d.ts +1 -0
  79. package/github/index.d.ts.map +1 -1
  80. package/github/index.js +1 -0
  81. package/github/index.js.map +1 -1
  82. package/github/useGitHubFileReader.d.ts +26 -0
  83. package/github/useGitHubFileReader.d.ts.map +1 -0
  84. package/github/useGitHubFileReader.js +106 -0
  85. package/github/useGitHubFileReader.js.map +1 -0
  86. package/github/useGitHubTreeLister.d.ts.map +1 -1
  87. package/github/useGitHubTreeLister.js +6 -2
  88. package/github/useGitHubTreeLister.js.map +1 -1
  89. package/index.d.ts +9 -9
  90. package/index.d.ts.map +1 -1
  91. package/index.js +5 -5
  92. package/index.js.map +1 -1
  93. package/internal/ResizableSplit.d.ts +72 -22
  94. package/internal/ResizableSplit.d.ts.map +1 -1
  95. package/internal/ResizableSplit.js +96 -38
  96. package/internal/ResizableSplit.js.map +1 -1
  97. package/internal/VirtualizedThread.d.ts +5 -3
  98. package/internal/VirtualizedThread.d.ts.map +1 -1
  99. package/internal/VirtualizedThread.js +6 -4
  100. package/internal/VirtualizedThread.js.map +1 -1
  101. package/internal/file-icons/index.d.ts +17 -0
  102. package/internal/file-icons/index.d.ts.map +1 -0
  103. package/internal/file-icons/index.js +60 -0
  104. package/internal/file-icons/index.js.map +1 -0
  105. package/internal/file-tree/FileTreeNode.d.ts +18 -1
  106. package/internal/file-tree/FileTreeNode.d.ts.map +1 -1
  107. package/internal/file-tree/FileTreeNode.js +11 -2
  108. package/internal/file-tree/FileTreeNode.js.map +1 -1
  109. package/internal/markdown-components.d.ts +38 -1
  110. package/internal/markdown-components.d.ts.map +1 -1
  111. package/internal/markdown-components.js +86 -11
  112. package/internal/markdown-components.js.map +1 -1
  113. package/{workflow → internal}/motion-preference.d.ts +7 -4
  114. package/internal/motion-preference.d.ts.map +1 -0
  115. package/{workflow → internal}/motion-preference.js +7 -4
  116. package/internal/motion-preference.js.map +1 -0
  117. package/internal/store/index.d.ts +33 -0
  118. package/internal/store/index.d.ts.map +1 -1
  119. package/internal/store/index.js +59 -0
  120. package/internal/store/index.js.map +1 -1
  121. package/internal/store/workspace-editors-store.d.ts +145 -0
  122. package/internal/store/workspace-editors-store.d.ts.map +1 -0
  123. package/internal/store/workspace-editors-store.js +208 -0
  124. package/internal/store/workspace-editors-store.js.map +1 -0
  125. package/internal/store/workspace-file-selection-store.d.ts +38 -0
  126. package/internal/store/workspace-file-selection-store.d.ts.map +1 -0
  127. package/internal/store/workspace-file-selection-store.js +62 -0
  128. package/internal/store/workspace-file-selection-store.js.map +1 -0
  129. package/internal/useRevealLine.d.ts +49 -0
  130. package/internal/useRevealLine.d.ts.map +1 -0
  131. package/internal/useRevealLine.js +43 -0
  132. package/internal/useRevealLine.js.map +1 -0
  133. package/library/detect-plan-artifact.d.ts +43 -4
  134. package/library/detect-plan-artifact.d.ts.map +1 -1
  135. package/library/detect-plan-artifact.js +45 -5
  136. package/library/detect-plan-artifact.js.map +1 -1
  137. package/library/detect-streaming-plan.d.ts +45 -0
  138. package/library/detect-streaming-plan.d.ts.map +1 -0
  139. package/library/detect-streaming-plan.js +83 -0
  140. package/library/detect-streaming-plan.js.map +1 -0
  141. package/library/index.d.ts +4 -1
  142. package/library/index.d.ts.map +1 -1
  143. package/library/index.js +2 -1
  144. package/library/index.js.map +1 -1
  145. package/package.json +4 -4
  146. package/session/NewSessionViewer.d.ts +19 -4
  147. package/session/NewSessionViewer.d.ts.map +1 -1
  148. package/session/NewSessionViewer.js +52 -25
  149. package/session/NewSessionViewer.js.map +1 -1
  150. package/session/PlanEditor.d.ts +55 -0
  151. package/session/PlanEditor.d.ts.map +1 -0
  152. package/session/PlanEditor.js +88 -0
  153. package/session/PlanEditor.js.map +1 -0
  154. package/session/PlanStreamingDocument.d.ts +30 -0
  155. package/session/PlanStreamingDocument.d.ts.map +1 -0
  156. package/session/PlanStreamingDocument.js +37 -0
  157. package/session/PlanStreamingDocument.js.map +1 -0
  158. package/session/SessionPanelChip.d.ts +26 -0
  159. package/session/SessionPanelChip.d.ts.map +1 -0
  160. package/session/SessionPanelChip.js +40 -0
  161. package/session/SessionPanelChip.js.map +1 -0
  162. package/session/SessionViewer.d.ts +34 -7
  163. package/session/SessionViewer.d.ts.map +1 -1
  164. package/session/SessionViewer.js +334 -33
  165. package/session/SessionViewer.js.map +1 -1
  166. package/session/{inspector → facets}/ArtifactsTab.d.ts +10 -2
  167. package/session/facets/ArtifactsTab.d.ts.map +1 -0
  168. package/session/{inspector → facets}/ArtifactsTab.js +8 -3
  169. package/session/facets/ArtifactsTab.js.map +1 -0
  170. package/session/{inspector → facets}/ChangesTab.d.ts +3 -3
  171. package/session/facets/ChangesTab.d.ts.map +1 -0
  172. package/session/{inspector → facets}/ChangesTab.js +3 -3
  173. package/session/facets/ChangesTab.js.map +1 -0
  174. package/session/facets/InspectTab.d.ts.map +1 -0
  175. package/session/facets/InspectTab.js.map +1 -0
  176. package/session/{inspector → facets}/SetupTab.d.ts +11 -2
  177. package/session/facets/SetupTab.d.ts.map +1 -0
  178. package/session/{inspector → facets}/SetupTab.js +4 -3
  179. package/session/facets/SetupTab.js.map +1 -0
  180. package/session/{inspector → facets}/UsageTab.d.ts +1 -1
  181. package/session/facets/UsageTab.d.ts.map +1 -0
  182. package/session/{inspector → facets}/UsageTab.js +1 -1
  183. package/session/facets/UsageTab.js.map +1 -0
  184. package/session/{inspector → facets}/index.d.ts +0 -6
  185. package/session/facets/index.d.ts.map +1 -0
  186. package/session/{inspector → facets}/index.js +0 -3
  187. package/session/facets/index.js.map +1 -0
  188. package/session/index.d.ts +11 -2
  189. package/session/index.d.ts.map +1 -1
  190. package/session/index.js +15 -2
  191. package/session/index.js.map +1 -1
  192. package/session/plan-document.d.ts +21 -0
  193. package/session/plan-document.d.ts.map +1 -0
  194. package/session/plan-document.js +28 -0
  195. package/session/plan-document.js.map +1 -0
  196. package/session/useOpenFileChange.d.ts +20 -0
  197. package/session/useOpenFileChange.d.ts.map +1 -0
  198. package/session/useOpenFileChange.js +31 -0
  199. package/session/useOpenFileChange.js.map +1 -0
  200. package/session/usePlanDraft.d.ts +52 -0
  201. package/session/usePlanDraft.d.ts.map +1 -0
  202. package/session/usePlanDraft.js +63 -0
  203. package/session/usePlanDraft.js.map +1 -0
  204. package/session/useSessionConversation.d.ts +14 -1
  205. package/session/useSessionConversation.d.ts.map +1 -1
  206. package/session/useSessionConversation.js +20 -2
  207. package/session/useSessionConversation.js.map +1 -1
  208. package/session/useSessionPageFlow.d.ts.map +1 -1
  209. package/session/useSessionPageFlow.js +1 -0
  210. package/session/useSessionPageFlow.js.map +1 -1
  211. package/session/useSessionPanel.d.ts +120 -0
  212. package/session/useSessionPanel.d.ts.map +1 -0
  213. package/session/useSessionPanel.js +130 -0
  214. package/session/useSessionPanel.js.map +1 -0
  215. package/session/useSessionRailViews.d.ts +45 -0
  216. package/session/useSessionRailViews.d.ts.map +1 -0
  217. package/session/useSessionRailViews.js +105 -0
  218. package/session/useSessionRailViews.js.map +1 -0
  219. package/src/composer/SessionComposer.tsx +53 -10
  220. package/src/composer/__tests__/SessionComposer-contract.test.tsx +58 -4
  221. package/src/execution/ArtifactContentRenderer.tsx +101 -24
  222. package/src/execution/ArtifactPreviewModal.tsx +9 -9
  223. package/src/execution/FileChangeProgressBar.tsx +121 -0
  224. package/src/execution/FileChangesView.tsx +18 -4
  225. package/src/execution/FilePathContext.tsx +8 -1
  226. package/src/execution/FilePathLink.tsx +22 -6
  227. package/src/execution/FileReviewAtoms.tsx +89 -0
  228. package/src/execution/FileReviewCard.tsx +57 -90
  229. package/src/execution/MessageEntry.tsx +49 -1
  230. package/src/execution/MessageThread.tsx +308 -39
  231. package/src/execution/PlanArtifactCard.tsx +174 -64
  232. package/src/execution/PlanCompletionCard.tsx +5 -5
  233. package/src/execution/PlanDocumentMessage.tsx +96 -0
  234. package/src/execution/PlanStreamingCard.tsx +141 -0
  235. package/src/execution/__tests__/ArtifactContentRenderer.test.tsx +80 -1
  236. package/src/execution/__tests__/ArtifactPreviewModal.test.tsx +6 -6
  237. package/src/execution/__tests__/FileChangeProgressBar.test.tsx +125 -0
  238. package/src/execution/__tests__/FilePathLink.test.tsx +87 -0
  239. package/src/execution/__tests__/FileReviewCard.test.tsx +66 -7
  240. package/src/execution/__tests__/MessageThread.test.tsx +102 -1
  241. package/src/execution/__tests__/PlanArtifactCard.test.tsx +114 -26
  242. package/src/execution/__tests__/PlanCompletionCard.test.tsx +2 -2
  243. package/src/execution/__tests__/PlanDocumentMessage.test.tsx +55 -0
  244. package/src/execution/__tests__/PlanStreamingCard.test.tsx +56 -0
  245. package/src/execution/__tests__/buildThreadItems-plan-completion.test.ts +600 -22
  246. package/src/execution/__tests__/message-entry.test.tsx +17 -0
  247. package/src/execution/__tests__/useArtifactCopy.test.tsx +90 -0
  248. package/src/execution/__tests__/useArtifactDownload.test.tsx +2 -0
  249. package/src/execution/__tests__/useCreateAgentExecution.test.tsx +85 -0
  250. package/src/execution/index.ts +13 -1
  251. package/src/execution/use-build-from-plan-hotkey.ts +1 -1
  252. package/src/execution/useArtifactCopy.ts +109 -0
  253. package/src/execution/useArtifactDownload.ts +17 -5
  254. package/src/execution/useCreateAgentExecution.ts +18 -1
  255. package/src/github/__tests__/decodeGitHubContent.test.ts +102 -0
  256. package/src/github/__tests__/useGitHubFileReader.test.ts +183 -0
  257. package/src/github/decodeGitHubContent.ts +83 -0
  258. package/src/github/index.ts +1 -0
  259. package/src/github/useGitHubFileReader.ts +152 -0
  260. package/src/github/useGitHubTreeLister.ts +6 -2
  261. package/src/index.ts +69 -9
  262. package/src/internal/ResizableSplit.tsx +184 -51
  263. package/src/internal/VirtualizedThread.tsx +12 -4
  264. package/src/internal/__tests__/ResizableSplit.test.tsx +125 -3
  265. package/src/internal/__tests__/markdown-components.test.tsx +68 -0
  266. package/src/internal/__tests__/useRevealLine.test.tsx +97 -0
  267. package/src/internal/file-icons/__tests__/file-icons.test.tsx +35 -0
  268. package/src/internal/file-icons/index.tsx +137 -0
  269. package/src/internal/file-tree/FileTreeNode.tsx +56 -5
  270. package/src/internal/file-tree/__tests__/FileTreeNode-explorer.test.tsx +86 -0
  271. package/src/internal/markdown-components.tsx +116 -11
  272. package/src/{workflow → internal}/motion-preference.ts +7 -4
  273. package/src/internal/store/__tests__/workspace-editors-store.test.ts +216 -0
  274. package/src/internal/store/__tests__/workspace-file-selection-store.test.ts +118 -0
  275. package/src/internal/store/index.ts +94 -0
  276. package/src/internal/store/workspace-editors-store.ts +315 -0
  277. package/src/internal/store/workspace-file-selection-store.ts +88 -0
  278. package/src/internal/useRevealLine.ts +81 -0
  279. package/src/library/__tests__/detect-plan-artifact.test.ts +69 -0
  280. package/src/library/__tests__/detect-streaming-plan.test.ts +234 -0
  281. package/src/library/detect-plan-artifact.ts +62 -5
  282. package/src/library/detect-streaming-plan.ts +108 -0
  283. package/src/library/index.ts +7 -0
  284. package/src/session/NewSessionViewer.tsx +123 -55
  285. package/src/session/PlanEditor.tsx +361 -0
  286. package/src/session/PlanStreamingDocument.tsx +97 -0
  287. package/src/session/SessionPanelChip.tsx +103 -0
  288. package/src/session/SessionViewer.tsx +655 -96
  289. package/src/session/__tests__/NewSessionViewer.test.tsx +148 -0
  290. package/src/session/__tests__/PlanEditor.test.tsx +217 -0
  291. package/src/session/__tests__/PlanStreamingDocument.test.tsx +50 -0
  292. package/src/session/__tests__/SessionPanelChip.test.tsx +42 -0
  293. package/src/session/__tests__/SessionViewer-fileReviewDock.test.tsx +66 -4
  294. package/src/session/__tests__/SessionViewer-transcriptFileOpen.test.tsx +205 -0
  295. package/src/session/__tests__/audienceWiring.test.tsx +55 -19
  296. package/src/session/__tests__/useOpenFileChange.test.tsx +82 -0
  297. package/src/session/__tests__/usePlanDraft.test.ts +102 -0
  298. package/src/session/__tests__/useSessionConversation.test.tsx +44 -0
  299. package/src/session/__tests__/useSessionPanel.test.ts +298 -0
  300. package/src/session/__tests__/useSessionRailViews.test.tsx +124 -0
  301. package/src/session/{inspector → facets}/ArtifactsTab.tsx +27 -5
  302. package/src/session/{inspector → facets}/ChangesTab.tsx +3 -3
  303. package/src/session/{inspector → facets}/SetupTab.tsx +13 -1
  304. package/src/session/{inspector → facets}/UsageTab.tsx +1 -1
  305. package/src/session/{inspector → facets}/__tests__/ArtifactsTab.test.tsx +42 -8
  306. package/src/session/facets/__tests__/SetupTab.test.tsx +44 -0
  307. package/src/session/{inspector → facets}/index.ts +0 -16
  308. package/src/session/index.ts +30 -13
  309. package/src/session/plan-document.ts +30 -0
  310. package/src/session/useOpenFileChange.ts +53 -0
  311. package/src/session/usePlanDraft.ts +109 -0
  312. package/src/session/useSessionConversation.ts +38 -3
  313. package/src/session/useSessionPageFlow.ts +1 -0
  314. package/src/session/useSessionPanel.ts +288 -0
  315. package/src/session/useSessionRailViews.tsx +200 -0
  316. package/src/workflow/WorkflowExecutionGraph.tsx +1 -1
  317. package/src/workflow/index.ts +1 -1
  318. package/src/workflow/useFollowExecution.ts +1 -1
  319. package/src/workspace/EditorTabs.tsx +174 -0
  320. package/src/workspace/ExplorerTree.tsx +253 -0
  321. package/src/workspace/FileViewer.tsx +537 -0
  322. package/src/workspace/WorkspaceContentSearch.tsx +502 -0
  323. package/src/workspace/WorkspaceContentSearcher.ts +70 -0
  324. package/src/workspace/WorkspaceEditor.tsx +19 -16
  325. package/src/workspace/WorkspaceFileLister.ts +11 -0
  326. package/src/workspace/WorkspaceFileReader.ts +57 -0
  327. package/src/workspace/WorkspaceFileSearch.tsx +452 -0
  328. package/src/workspace/WorkspaceSurface.tsx +839 -0
  329. package/src/workspace/__tests__/EditorTabs.test.tsx +102 -0
  330. package/src/workspace/__tests__/ExplorerTree.test.tsx +204 -0
  331. package/src/workspace/__tests__/FileViewer.test.tsx +439 -0
  332. package/src/workspace/__tests__/WorkspaceContentSearch.test.tsx +229 -0
  333. package/src/workspace/__tests__/WorkspaceEditor-initialPanel.test.tsx +19 -0
  334. package/src/workspace/__tests__/WorkspaceFileSearch.test.tsx +227 -0
  335. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +418 -0
  336. package/src/workspace/__tests__/a11y/harness.tsx +140 -0
  337. package/src/workspace/__tests__/a11y/mock-capabilities.ts +138 -0
  338. package/src/workspace/__tests__/a11y/workspace-editor.a11y.test.tsx +65 -0
  339. package/src/workspace/__tests__/a11y/workspace-explorer-search.a11y.test.tsx +112 -0
  340. package/src/workspace/__tests__/a11y/workspace-viewer-tabs.a11y.test.tsx +69 -0
  341. package/src/workspace/__tests__/findChangeForSelection.test.ts +132 -0
  342. package/src/workspace/__tests__/matchContentPreview.test.ts +55 -0
  343. package/src/workspace/__tests__/matchWorkspaceFiles.test.ts +104 -0
  344. package/src/workspace/__tests__/resolveWorkspaceFileSelection.test.ts +135 -0
  345. package/src/workspace/__tests__/useWorkspaceContentSearch.test.tsx +196 -0
  346. package/src/workspace/__tests__/useWorkspaceFileContent.test.tsx +190 -0
  347. package/src/workspace/__tests__/useWorkspaceFileSearch.test.tsx +162 -0
  348. package/src/workspace/findChangeForSelection.ts +61 -0
  349. package/src/workspace/index.ts +56 -2
  350. package/src/workspace/matchContentPreview.ts +51 -0
  351. package/src/workspace/matchWorkspaceFiles.ts +86 -0
  352. package/src/workspace/resolveWorkspaceFileSelection.ts +119 -0
  353. package/src/workspace/useWorkspaceContentSearch.ts +228 -0
  354. package/src/workspace/useWorkspaceFileContent.ts +129 -0
  355. package/src/workspace/useWorkspaceFileSearch.ts +184 -0
  356. package/src/workspace/useWorkspaceFiles.ts +27 -27
  357. package/src/workspace/workspaceListingCache.ts +93 -0
  358. package/styles.css +1 -1
  359. package/workflow/WorkflowExecutionGraph.js +1 -1
  360. package/workflow/WorkflowExecutionGraph.js.map +1 -1
  361. package/workflow/index.d.ts +1 -1
  362. package/workflow/index.d.ts.map +1 -1
  363. package/workflow/index.js +1 -1
  364. package/workflow/index.js.map +1 -1
  365. package/workflow/useFollowExecution.js +1 -1
  366. package/workflow/useFollowExecution.js.map +1 -1
  367. package/workspace/EditorTabs.d.ts +47 -0
  368. package/workspace/EditorTabs.d.ts.map +1 -0
  369. package/workspace/EditorTabs.js +78 -0
  370. package/workspace/EditorTabs.js.map +1 -0
  371. package/workspace/ExplorerTree.d.ts +32 -0
  372. package/workspace/ExplorerTree.d.ts.map +1 -0
  373. package/workspace/ExplorerTree.js +49 -0
  374. package/workspace/ExplorerTree.js.map +1 -0
  375. package/workspace/FileViewer.d.ts +93 -0
  376. package/workspace/FileViewer.d.ts.map +1 -0
  377. package/workspace/FileViewer.js +193 -0
  378. package/workspace/FileViewer.js.map +1 -0
  379. package/workspace/WorkspaceContentSearch.d.ts +41 -0
  380. package/workspace/WorkspaceContentSearch.d.ts.map +1 -0
  381. package/workspace/WorkspaceContentSearch.js +216 -0
  382. package/workspace/WorkspaceContentSearch.js.map +1 -0
  383. package/workspace/WorkspaceContentSearcher.d.ts +59 -0
  384. package/workspace/WorkspaceContentSearcher.d.ts.map +1 -0
  385. package/workspace/WorkspaceContentSearcher.js +7 -0
  386. package/workspace/WorkspaceContentSearcher.js.map +1 -0
  387. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  388. package/workspace/WorkspaceEditor.js +8 -10
  389. package/workspace/WorkspaceEditor.js.map +1 -1
  390. package/workspace/WorkspaceFileLister.d.ts +11 -0
  391. package/workspace/WorkspaceFileLister.d.ts.map +1 -1
  392. package/workspace/WorkspaceFileReader.d.ts +48 -0
  393. package/workspace/WorkspaceFileReader.d.ts.map +1 -0
  394. package/workspace/WorkspaceFileReader.js +11 -0
  395. package/workspace/WorkspaceFileReader.js.map +1 -0
  396. package/workspace/WorkspaceFileSearch.d.ts +32 -0
  397. package/workspace/WorkspaceFileSearch.d.ts.map +1 -0
  398. package/workspace/WorkspaceFileSearch.js +175 -0
  399. package/workspace/WorkspaceFileSearch.js.map +1 -0
  400. package/workspace/WorkspaceSurface.d.ts +151 -0
  401. package/workspace/WorkspaceSurface.d.ts.map +1 -0
  402. package/workspace/WorkspaceSurface.js +220 -0
  403. package/workspace/WorkspaceSurface.js.map +1 -0
  404. package/workspace/findChangeForSelection.d.ts +19 -0
  405. package/workspace/findChangeForSelection.d.ts.map +1 -0
  406. package/workspace/findChangeForSelection.js +46 -0
  407. package/workspace/findChangeForSelection.js.map +1 -0
  408. package/workspace/index.d.ts +24 -2
  409. package/workspace/index.d.ts.map +1 -1
  410. package/workspace/index.js +13 -1
  411. package/workspace/index.js.map +1 -1
  412. package/workspace/matchContentPreview.d.ts +21 -0
  413. package/workspace/matchContentPreview.d.ts.map +1 -0
  414. package/workspace/matchContentPreview.js +36 -0
  415. package/workspace/matchContentPreview.js.map +1 -0
  416. package/workspace/matchWorkspaceFiles.d.ts +30 -0
  417. package/workspace/matchWorkspaceFiles.d.ts.map +1 -0
  418. package/workspace/matchWorkspaceFiles.js +58 -0
  419. package/workspace/matchWorkspaceFiles.js.map +1 -0
  420. package/workspace/resolveWorkspaceFileSelection.d.ts +19 -0
  421. package/workspace/resolveWorkspaceFileSelection.d.ts.map +1 -0
  422. package/workspace/resolveWorkspaceFileSelection.js +115 -0
  423. package/workspace/resolveWorkspaceFileSelection.js.map +1 -0
  424. package/workspace/useWorkspaceContentSearch.d.ts +69 -0
  425. package/workspace/useWorkspaceContentSearch.d.ts.map +1 -0
  426. package/workspace/useWorkspaceContentSearch.js +154 -0
  427. package/workspace/useWorkspaceContentSearch.js.map +1 -0
  428. package/workspace/useWorkspaceFileContent.d.ts +73 -0
  429. package/workspace/useWorkspaceFileContent.d.ts.map +1 -0
  430. package/workspace/useWorkspaceFileContent.js +57 -0
  431. package/workspace/useWorkspaceFileContent.js.map +1 -0
  432. package/workspace/useWorkspaceFileSearch.d.ts +61 -0
  433. package/workspace/useWorkspaceFileSearch.d.ts.map +1 -0
  434. package/workspace/useWorkspaceFileSearch.js +119 -0
  435. package/workspace/useWorkspaceFileSearch.js.map +1 -0
  436. package/workspace/useWorkspaceFiles.d.ts +13 -5
  437. package/workspace/useWorkspaceFiles.d.ts.map +1 -1
  438. package/workspace/useWorkspaceFiles.js +18 -19
  439. package/workspace/useWorkspaceFiles.js.map +1 -1
  440. package/workspace/workspaceListingCache.d.ts +47 -0
  441. package/workspace/workspaceListingCache.d.ts.map +1 -0
  442. package/workspace/workspaceListingCache.js +55 -0
  443. package/workspace/workspaceListingCache.js.map +1 -0
  444. package/session/inspector/ArtifactsTab.d.ts.map +0 -1
  445. package/session/inspector/ArtifactsTab.js.map +0 -1
  446. package/session/inspector/ChangesTab.d.ts.map +0 -1
  447. package/session/inspector/ChangesTab.js.map +0 -1
  448. package/session/inspector/InspectTab.d.ts.map +0 -1
  449. package/session/inspector/InspectTab.js.map +0 -1
  450. package/session/inspector/SessionInspector.d.ts +0 -64
  451. package/session/inspector/SessionInspector.d.ts.map +0 -1
  452. package/session/inspector/SessionInspector.js +0 -53
  453. package/session/inspector/SessionInspector.js.map +0 -1
  454. package/session/inspector/SetupTab.d.ts.map +0 -1
  455. package/session/inspector/SetupTab.js.map +0 -1
  456. package/session/inspector/UsageTab.d.ts.map +0 -1
  457. package/session/inspector/UsageTab.js.map +0 -1
  458. package/session/inspector/WorkspaceTab.d.ts +0 -35
  459. package/session/inspector/WorkspaceTab.d.ts.map +0 -1
  460. package/session/inspector/WorkspaceTab.js +0 -75
  461. package/session/inspector/WorkspaceTab.js.map +0 -1
  462. package/session/inspector/index.d.ts.map +0 -1
  463. package/session/inspector/index.js.map +0 -1
  464. package/session/inspector/useSessionInspector.d.ts +0 -49
  465. package/session/inspector/useSessionInspector.d.ts.map +0 -1
  466. package/session/inspector/useSessionInspector.js +0 -122
  467. package/session/inspector/useSessionInspector.js.map +0 -1
  468. package/src/session/inspector/SessionInspector.tsx +0 -162
  469. package/src/session/inspector/WorkspaceTab.tsx +0 -245
  470. package/src/session/inspector/__tests__/useSessionInspector.test.ts +0 -251
  471. package/src/session/inspector/useSessionInspector.ts +0 -178
  472. package/src/workspace/WorkspaceEntryFiles.tsx +0 -196
  473. package/workflow/motion-preference.d.ts.map +0 -1
  474. package/workflow/motion-preference.js.map +0 -1
  475. package/workspace/WorkspaceEntryFiles.d.ts +0 -22
  476. package/workspace/WorkspaceEntryFiles.d.ts.map +0 -1
  477. package/workspace/WorkspaceEntryFiles.js +0 -58
  478. package/workspace/WorkspaceEntryFiles.js.map +0 -1
  479. /package/session/{inspector → facets}/InspectTab.d.ts +0 -0
  480. /package/session/{inspector → facets}/InspectTab.js +0 -0
  481. /package/src/{workflow → internal}/__tests__/motion-preference.test.ts +0 -0
  482. /package/src/session/{inspector → facets}/InspectTab.tsx +0 -0
  483. /package/src/session/{inspector → facets}/__tests__/ChangesTab.test.tsx +0 -0
@@ -1,10 +1,14 @@
1
1
  "use client";
2
2
  import { createContext, useContext, useRef, useSyncExternalStore } from "react";
3
3
  import { ConversationStore } from "./conversation-store.js";
4
+ import { WorkspaceFileSelectionStore, } from "./workspace-file-selection-store.js";
5
+ import { WorkspaceEditorsStore, } from "./workspace-editors-store.js";
4
6
  export { ConversationStore } from "./conversation-store.js";
5
7
  export { structuralShare } from "./structural-share.js";
6
8
  export { WorkflowExecutionEventStore, } from "./workflow-execution-event-store.js";
7
9
  export { SelectionStore } from "./selection-store.js";
10
+ export { WorkspaceFileSelectionStore } from "./workspace-file-selection-store.js";
11
+ export { WorkspaceEditorsStore, editorKey, virtualEntryId, isVirtualEntryId, } from "./workspace-editors-store.js";
8
12
  // ---------------------------------------------------------------------------
9
13
  // Context
10
14
  // ---------------------------------------------------------------------------
@@ -53,4 +57,59 @@ export function useStoreExecution(store) {
53
57
  export function useStoreStreamState(store) {
54
58
  return useSyncExternalStore(store.subscribe, store.getStreamState);
55
59
  }
60
+ // ---------------------------------------------------------------------------
61
+ // Workspace file selection — the DD-07 shared "which file is open" store
62
+ // ---------------------------------------------------------------------------
63
+ /**
64
+ * Internal context carrying the {@link WorkspaceFileSelectionStore} instance
65
+ * (stable ref) to both columns of the session viewer. Not exported from the
66
+ * public SDK barrel — consumed only within SDK components and `SessionViewer`.
67
+ */
68
+ export const WorkspaceFileSelectionContext = createContext(null);
69
+ /**
70
+ * Access the workspace-file selection store from context.
71
+ * Throws if called outside a `WorkspaceFileSelectionContext.Provider`.
72
+ */
73
+ export function useWorkspaceFileSelectionStore() {
74
+ const store = useContext(WorkspaceFileSelectionContext);
75
+ if (!store) {
76
+ throw new Error("useWorkspaceFileSelectionStore must be used within a WorkspaceFileSelectionContext.Provider");
77
+ }
78
+ return store;
79
+ }
80
+ /**
81
+ * Create or reuse a `WorkspaceFileSelectionStore` instance, preserved across
82
+ * re-renders via ref. `SessionViewer` calls this and provides the result
83
+ * through {@link WorkspaceFileSelectionContext} (DD-07).
84
+ */
85
+ export function useWorkspaceFileSelectionStoreRef() {
86
+ const ref = useRef(null);
87
+ if (!ref.current) {
88
+ ref.current = new WorkspaceFileSelectionStore();
89
+ }
90
+ return ref.current;
91
+ }
92
+ /** Subscribe to the currently-selected workspace file. */
93
+ export function useWorkspaceFileSelection(store) {
94
+ return useSyncExternalStore(store.subscribe, store.getSelection);
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Workspace editors — the surface's open-editor group (Slice B)
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Create or reuse a `WorkspaceEditorsStore` instance, preserved across
101
+ * re-renders via ref. Owned by `SessionViewer` alongside the selection store;
102
+ * the surface subscribes to it for its tab group.
103
+ */
104
+ export function useWorkspaceEditorsStoreRef() {
105
+ const ref = useRef(null);
106
+ if (!ref.current) {
107
+ ref.current = new WorkspaceEditorsStore();
108
+ }
109
+ return ref.current;
110
+ }
111
+ /** Subscribe to the open-editor group snapshot. */
112
+ export function useWorkspaceEditors(store) {
113
+ return useSyncExternalStore(store.subscribe, store.getSnapshot);
114
+ }
56
115
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/store/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAE9E,OAAO,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,2BAA2B,GAI5B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GACnC,aAAa,CAA2B,IAAI,CAAC,CAAC;AAEhD,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAwB;IAExB,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/store/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import type { RevealTarget } from "../useRevealLine.js";
2
+ import type { SelectedWorkspaceFile } from "./workspace-file-selection-store.js";
3
+ /**
4
+ * Options for opening a file in the surface (via `openPreview` / the surface's
5
+ * `onOpenFile` seam). `line` requests a jump-to-line reveal: the file opens in
6
+ * a line-faithful view scrolled to and highlighting that 1-based line. Absent,
7
+ * the file opens normally (top of file / diff-default). Deliberately an options
8
+ * object so future open-intents (e.g. a column) extend it without churning the
9
+ * callback signature.
10
+ */
11
+ export interface OpenFileOptions {
12
+ /** 1-based line to reveal after opening. */
13
+ readonly line?: number;
14
+ }
15
+ /**
16
+ * A pending reveal request scoped to a specific editor. Extends the viewer-side
17
+ * {@link RevealTarget} with the `key` of the editor it targets, so a consumer
18
+ * applies the reveal only while that editor is the active one. Transient
19
+ * navigation, never editor identity (the line does not key the tab).
20
+ */
21
+ export interface EditorReveal extends RevealTarget {
22
+ /** {@link editorKey} of the editor this reveal targets. */
23
+ readonly key: string;
24
+ }
25
+ /**
26
+ * One open editor tab.
27
+ *
28
+ * `preview` marks the single reusable "preview" tab (shown in italics): a
29
+ * single click opens or replaces it in place, so casual browsing never
30
+ * accumulates tabs. Pinning it (double-click, or opening the file explicitly)
31
+ * clears the flag and the tab becomes persistent. At most one editor is a
32
+ * preview at any time.
33
+ */
34
+ export interface OpenEditor {
35
+ /** Stable-within-page id of the owning workspace entry. */
36
+ readonly entryId: string;
37
+ /** Repo-relative (git) or root-relative (local) file path. */
38
+ readonly path: string;
39
+ /** Whether this is the reusable preview tab (italic, single per group). */
40
+ readonly preview: boolean;
41
+ }
42
+ /** Immutable snapshot for the `useSyncExternalStore` contract. */
43
+ export interface WorkspaceEditorsSnapshot {
44
+ /** Open editors in tab order. */
45
+ readonly editors: readonly OpenEditor[];
46
+ /** Key of the active editor, or `null` when the group is empty. */
47
+ readonly activeKey: string | null;
48
+ /**
49
+ * The active editor as a {@link SelectedWorkspaceFile} (stable ref between
50
+ * mutations), or `null`. This is what the viewer, diff correlation, and tree
51
+ * highlight consume — the editors store's projection into the selection shape.
52
+ */
53
+ readonly activeFile: SelectedWorkspaceFile | null;
54
+ /**
55
+ * A pending jump-to-line reveal, or `null`. Set only by an open-with-line
56
+ * (`openPreview` with a `line`); cleared by any other active-editor change so
57
+ * returning to a tab never re-scrolls to a stale line. Consumers honor it only
58
+ * while `reveal.key` matches {@link activeKey}. Transient — not part of any
59
+ * editor's identity.
60
+ */
61
+ readonly reveal: EditorReveal | null;
62
+ }
63
+ type Listener = () => void;
64
+ /**
65
+ * Stable key for an editor. Uses NUL as the separator — legal in neither an
66
+ * entry id nor a file path — so `entryId`/`path` can never collide.
67
+ */
68
+ export declare function editorKey(entryId: string, path: string): string;
69
+ /**
70
+ * Entry id for a virtual document — an editor tab whose content is not a
71
+ * workspace file (e.g. the session's `plan.md`, an execution artifact).
72
+ * Virtual documents share the editor group with file tabs (same open / pin /
73
+ * close / activate semantics); only their *content rendering* differs, via the
74
+ * surface's `virtualDocuments` seam. `kind` names the document family
75
+ * (`"plan"` today) so future virtual documents get distinct identities.
76
+ */
77
+ export declare function virtualEntryId(kind: string): string;
78
+ /**
79
+ * True when an entry id names a virtual document rather than a workspace
80
+ * entry. Used by file-only consumers (diff correlation, tree highlight,
81
+ * reveal) to skip work that can only apply to real files.
82
+ */
83
+ export declare function isVirtualEntryId(entryId: string): boolean;
84
+ /**
85
+ * Framework-agnostic store for the surface's open-editor group.
86
+ *
87
+ * Implements the `useSyncExternalStore` contract like the sibling selection and
88
+ * conversation stores: the context/ref carries the instance, and `getSnapshot`
89
+ * returns a snapshot object that is replaced only inside a mutation — so it is a
90
+ * stable reference between mutations and never triggers a render loop.
91
+ *
92
+ * VS Code preview-tab semantics:
93
+ * - {@link openPreview} — single click: reuse the one preview slot (or focus an
94
+ * already-open editor); casual browsing stays at one tab.
95
+ * - {@link openPinned} / {@link pin} — double-click or explicit open: the tab
96
+ * becomes persistent.
97
+ * - {@link close} — remove a tab, activating a neighbor.
98
+ * - {@link activate} — focus an already-open tab.
99
+ */
100
+ export declare class WorkspaceEditorsStore {
101
+ private _snapshot;
102
+ private _listeners;
103
+ /** Monotonic reveal token — bumped on every open-with-line (see `openPreview`). */
104
+ private _revealSeq;
105
+ /**
106
+ * Single-click open: reuse the preview slot, or focus if already open.
107
+ *
108
+ * When `options.line` is set, this also records a jump-to-line reveal for the
109
+ * opened editor. The reveal nonce is bumped **every** time — even when the
110
+ * file is already open and active — so a second search hit in the same file
111
+ * re-scrolls the already-mounted viewer. An open without a `line` clears any
112
+ * pending reveal.
113
+ */
114
+ openPreview(entryId: string, path: string, options?: OpenFileOptions): void;
115
+ /** Explicit open (double-click / open-to-keep): a persistent tab. */
116
+ openPinned(entryId: string, path: string): void;
117
+ /** Pin an open editor (clear its preview flag), keeping it active. */
118
+ pin(entryId: string, path: string): void;
119
+ /** Focus an already-open editor. No-op if it is not open. */
120
+ activate(entryId: string, path: string): void;
121
+ /**
122
+ * Close an editor. When the closed tab was active, the neighbor to its right
123
+ * (or, failing that, its left) becomes active — matching editor conventions.
124
+ */
125
+ close(entryId: string, path: string): void;
126
+ /** Close every editor. */
127
+ closeAll(): void;
128
+ subscribe: (listener: Listener) => (() => void);
129
+ /** Returns the current snapshot (stable ref between mutations). */
130
+ getSnapshot: () => WorkspaceEditorsSnapshot;
131
+ private _setActive;
132
+ /** Build a reveal for `key` from open options, or `null` when no line given. */
133
+ private _makeReveal;
134
+ /**
135
+ * Replace the snapshot. `reveal` defaults to `null`, so any mutation that does
136
+ * not explicitly carry one clears a pending reveal (invariant: returning to a
137
+ * tab must not re-scroll to a stale line). The `activeFile` object reference
138
+ * is preserved when the active editor is unchanged, so a reveal-only update
139
+ * doesn't churn downstream memoization (diff correlation, tree highlight).
140
+ */
141
+ private _commit;
142
+ private _notify;
143
+ }
144
+ export {};
145
+ //# sourceMappingURL=workspace-editors-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-editors-store.d.ts","sourceRoot":"","sources":["../../../src/internal/store/workspace-editors-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,wBAAwB;IACvC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAClD;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAS3B;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AASD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,UAAU,CAAuB;IACzC,mFAAmF;IACnF,OAAO,CAAC,UAAU,CAAK;IAIvB;;;;;;;;OAQG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAsB3E,qEAAqE;IACrE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAoB/C,sEAAsE;IACtE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWxC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ7C;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAkB1C,0BAA0B;IAC1B,QAAQ,IAAI,IAAI;IAQhB,SAAS,GAAI,UAAU,QAAQ,KAAG,CAAC,MAAM,IAAI,CAAC,CAK5C;IAEF,mEAAmE;IACnE,WAAW,QAAO,wBAAwB,CAAmB;IAI7D,OAAO,CAAC,UAAU;IAKlB,gFAAgF;IAChF,OAAO,CAAC,WAAW;IASnB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,OAAO;CAKhB"}
@@ -0,0 +1,208 @@
1
+ // The set of workspace files open in the surface's editor group, plus which is
2
+ // active — the VS Code "open editors" model. Sibling to
3
+ // WorkspaceFileSelectionStore (which stays the single-file selection used by the
4
+ // launcher's Viewer tab); this store owns the multi-tab surface. Its active
5
+ // editor derives the same SelectedWorkspaceFile shape, so downstream diff
6
+ // correlation and tree highlight consume one selection regardless of source.
7
+ const EMPTY_SNAPSHOT = {
8
+ editors: [],
9
+ activeKey: null,
10
+ activeFile: null,
11
+ reveal: null,
12
+ };
13
+ /**
14
+ * Stable key for an editor. Uses NUL as the separator — legal in neither an
15
+ * entry id nor a file path — so `entryId`/`path` can never collide.
16
+ */
17
+ export function editorKey(entryId, path) {
18
+ return `${entryId}\u0000${path}`;
19
+ }
20
+ /**
21
+ * NUL-prefixed namespace for virtual-document entry ids — the same
22
+ * collision-proofing trick as {@link editorKey}: no real workspace entry id
23
+ * can contain NUL, so a virtual document can never alias a workspace file.
24
+ */
25
+ const VIRTUAL_ENTRY_PREFIX = "\u0000virtual:";
26
+ /**
27
+ * Entry id for a virtual document — an editor tab whose content is not a
28
+ * workspace file (e.g. the session's `plan.md`, an execution artifact).
29
+ * Virtual documents share the editor group with file tabs (same open / pin /
30
+ * close / activate semantics); only their *content rendering* differs, via the
31
+ * surface's `virtualDocuments` seam. `kind` names the document family
32
+ * (`"plan"` today) so future virtual documents get distinct identities.
33
+ */
34
+ export function virtualEntryId(kind) {
35
+ return `${VIRTUAL_ENTRY_PREFIX}${kind}`;
36
+ }
37
+ /**
38
+ * True when an entry id names a virtual document rather than a workspace
39
+ * entry. Used by file-only consumers (diff correlation, tree highlight,
40
+ * reveal) to skip work that can only apply to real files.
41
+ */
42
+ export function isVirtualEntryId(entryId) {
43
+ return entryId.startsWith(VIRTUAL_ENTRY_PREFIX);
44
+ }
45
+ /**
46
+ * Framework-agnostic store for the surface's open-editor group.
47
+ *
48
+ * Implements the `useSyncExternalStore` contract like the sibling selection and
49
+ * conversation stores: the context/ref carries the instance, and `getSnapshot`
50
+ * returns a snapshot object that is replaced only inside a mutation — so it is a
51
+ * stable reference between mutations and never triggers a render loop.
52
+ *
53
+ * VS Code preview-tab semantics:
54
+ * - {@link openPreview} — single click: reuse the one preview slot (or focus an
55
+ * already-open editor); casual browsing stays at one tab.
56
+ * - {@link openPinned} / {@link pin} — double-click or explicit open: the tab
57
+ * becomes persistent.
58
+ * - {@link close} — remove a tab, activating a neighbor.
59
+ * - {@link activate} — focus an already-open tab.
60
+ */
61
+ export class WorkspaceEditorsStore {
62
+ _snapshot = EMPTY_SNAPSHOT;
63
+ _listeners = new Set();
64
+ /** Monotonic reveal token — bumped on every open-with-line (see `openPreview`). */
65
+ _revealSeq = 0;
66
+ // -- Mutations -----------------------------------------------------------
67
+ /**
68
+ * Single-click open: reuse the preview slot, or focus if already open.
69
+ *
70
+ * When `options.line` is set, this also records a jump-to-line reveal for the
71
+ * opened editor. The reveal nonce is bumped **every** time — even when the
72
+ * file is already open and active — so a second search hit in the same file
73
+ * re-scrolls the already-mounted viewer. An open without a `line` clears any
74
+ * pending reveal.
75
+ */
76
+ openPreview(entryId, path, options) {
77
+ const key = editorKey(entryId, path);
78
+ const { editors } = this._snapshot;
79
+ const reveal = this._makeReveal(key, options);
80
+ if (editors.some((e) => editorKey(e.entryId, e.path) === key)) {
81
+ // Already open — focus it (preserving pinned/preview state) and apply the
82
+ // reveal (or clear it). Reuse the same editors array ref so a reveal-only
83
+ // update doesn't churn the tab list.
84
+ this._commit(editors, key, reveal);
85
+ return;
86
+ }
87
+ const next = { entryId, path, preview: true };
88
+ const previewIndex = editors.findIndex((e) => e.preview);
89
+ const editorsNext = previewIndex >= 0
90
+ ? editors.map((e, i) => (i === previewIndex ? next : e))
91
+ : [...editors, next];
92
+ this._commit(editorsNext, key, reveal);
93
+ }
94
+ /** Explicit open (double-click / open-to-keep): a persistent tab. */
95
+ openPinned(entryId, path) {
96
+ const key = editorKey(entryId, path);
97
+ const { editors } = this._snapshot;
98
+ const index = editors.findIndex((e) => editorKey(e.entryId, e.path) === key);
99
+ if (index >= 0) {
100
+ if (editors[index].preview) {
101
+ this._commit(editors.map((e, i) => (i === index ? { ...e, preview: false } : e)), key);
102
+ }
103
+ else {
104
+ this._setActive(key);
105
+ }
106
+ return;
107
+ }
108
+ this._commit([...editors, { entryId, path, preview: false }], key);
109
+ }
110
+ /** Pin an open editor (clear its preview flag), keeping it active. */
111
+ pin(entryId, path) {
112
+ const key = editorKey(entryId, path);
113
+ const { editors } = this._snapshot;
114
+ const index = editors.findIndex((e) => editorKey(e.entryId, e.path) === key);
115
+ if (index < 0 || !editors[index].preview)
116
+ return;
117
+ this._commit(editors.map((e, i) => (i === index ? { ...e, preview: false } : e)), key);
118
+ }
119
+ /** Focus an already-open editor. No-op if it is not open. */
120
+ activate(entryId, path) {
121
+ const key = editorKey(entryId, path);
122
+ if (!this._snapshot.editors.some((e) => editorKey(e.entryId, e.path) === key)) {
123
+ return;
124
+ }
125
+ this._setActive(key);
126
+ }
127
+ /**
128
+ * Close an editor. When the closed tab was active, the neighbor to its right
129
+ * (or, failing that, its left) becomes active — matching editor conventions.
130
+ */
131
+ close(entryId, path) {
132
+ const key = editorKey(entryId, path);
133
+ const { editors, activeKey } = this._snapshot;
134
+ const index = editors.findIndex((e) => editorKey(e.entryId, e.path) === key);
135
+ if (index < 0)
136
+ return;
137
+ const editorsNext = editors.filter((_, i) => i !== index);
138
+ let nextActiveKey = activeKey;
139
+ if (activeKey === key) {
140
+ const neighbor = editorsNext[index] ?? editorsNext[index - 1] ?? null;
141
+ nextActiveKey = neighbor
142
+ ? editorKey(neighbor.entryId, neighbor.path)
143
+ : null;
144
+ }
145
+ this._commit(editorsNext, nextActiveKey);
146
+ }
147
+ /** Close every editor. */
148
+ closeAll() {
149
+ if (this._snapshot.editors.length === 0)
150
+ return;
151
+ this._snapshot = EMPTY_SNAPSHOT;
152
+ this._notify();
153
+ }
154
+ // -- useSyncExternalStore contract ---------------------------------------
155
+ subscribe = (listener) => {
156
+ this._listeners.add(listener);
157
+ return () => {
158
+ this._listeners.delete(listener);
159
+ };
160
+ };
161
+ /** Returns the current snapshot (stable ref between mutations). */
162
+ getSnapshot = () => this._snapshot;
163
+ // -- Internal ------------------------------------------------------------
164
+ _setActive(key) {
165
+ if (this._snapshot.activeKey === key)
166
+ return;
167
+ this._commit(this._snapshot.editors, key);
168
+ }
169
+ /** Build a reveal for `key` from open options, or `null` when no line given. */
170
+ _makeReveal(key, options) {
171
+ const line = options?.line;
172
+ if (line == null)
173
+ return null;
174
+ return { key, line, nonce: ++this._revealSeq };
175
+ }
176
+ /**
177
+ * Replace the snapshot. `reveal` defaults to `null`, so any mutation that does
178
+ * not explicitly carry one clears a pending reveal (invariant: returning to a
179
+ * tab must not re-scroll to a stale line). The `activeFile` object reference
180
+ * is preserved when the active editor is unchanged, so a reveal-only update
181
+ * doesn't churn downstream memoization (diff correlation, tree highlight).
182
+ */
183
+ _commit(editors, activeKey, reveal = null) {
184
+ const active = activeKey != null
185
+ ? editors.find((e) => editorKey(e.entryId, e.path) === activeKey) ?? null
186
+ : null;
187
+ const resolvedActiveKey = active ? activeKey : null;
188
+ const prev = this._snapshot;
189
+ const activeFile = active && prev.activeKey === resolvedActiveKey && prev.activeFile
190
+ ? prev.activeFile
191
+ : active
192
+ ? { entryId: active.entryId, path: active.path }
193
+ : null;
194
+ this._snapshot = {
195
+ editors,
196
+ activeKey: resolvedActiveKey,
197
+ activeFile,
198
+ reveal,
199
+ };
200
+ this._notify();
201
+ }
202
+ _notify() {
203
+ for (const listener of this._listeners) {
204
+ listener();
205
+ }
206
+ }
207
+ }
208
+ //# sourceMappingURL=workspace-editors-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-editors-store.js","sourceRoot":"","sources":["../../../src/internal/store/workspace-editors-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * A file selected for viewing.
3
+ *
4
+ * Keyed by `entryId` (not the entry value): the workspace entry id is stable
5
+ * within a page load but regenerated on reload, and selection is transient UI
6
+ * state anyway (reset on reload). Consumers must resolve the live entry via
7
+ * `workspace.entries.find(e => e.id === sel.entryId)` so a removed entry
8
+ * deselects naturally instead of holding a stale value.
9
+ */
10
+ export interface SelectedWorkspaceFile {
11
+ /** Stable-within-page id of the owning workspace entry. */
12
+ readonly entryId: string;
13
+ /** Repo-relative (git) or root-relative (local) file path. */
14
+ readonly path: string;
15
+ }
16
+ type Listener = () => void;
17
+ /**
18
+ * Framework-agnostic store for the currently-open workspace file.
19
+ *
20
+ * Implements the `useSyncExternalStore` contract identical to
21
+ * {@link import("./selection-store.js").SelectionStore}: the context carries the
22
+ * store instance (stable ref), and `getSelection` returns the stored object
23
+ * reference — a new object is allocated only inside `select` — so `getSnapshot`
24
+ * never triggers a re-render loop.
25
+ */
26
+ export declare class WorkspaceFileSelectionStore {
27
+ private _selected;
28
+ private _listeners;
29
+ select(file: SelectedWorkspaceFile): void;
30
+ deselect(): void;
31
+ toggle(file: SelectedWorkspaceFile): void;
32
+ subscribe: (listener: Listener) => (() => void);
33
+ /** Returns the current selection (stable ref between mutations). */
34
+ getSelection: () => SelectedWorkspaceFile | null;
35
+ private _notify;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=workspace-file-selection-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-file-selection-store.d.ts","sourceRoot":"","sources":["../../../src/internal/store/workspace-file-selection-store.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B;;;;;;;;GAQG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,UAAU,CAAuB;IAIzC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAMzC,QAAQ,IAAI,IAAI;IAMhB,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAUzC,SAAS,GAAI,UAAU,QAAQ,KAAG,CAAC,MAAM,IAAI,CAAC,CAK5C;IAEF,oEAAoE;IACpE,YAAY,QAAO,qBAAqB,GAAG,IAAI,CAE7C;IAIF,OAAO,CAAC,OAAO;CAKhB"}
@@ -0,0 +1,62 @@
1
+ // Which workspace file is open in the viewer. Sibling to SelectionStore (which
2
+ // owns thread-item inspect selection) — the two are orthogonal domains with
3
+ // different lifecycles, so they stay separate stores rather than one fused FSM.
4
+ /**
5
+ * Framework-agnostic store for the currently-open workspace file.
6
+ *
7
+ * Implements the `useSyncExternalStore` contract identical to
8
+ * {@link import("./selection-store.js").SelectionStore}: the context carries the
9
+ * store instance (stable ref), and `getSelection` returns the stored object
10
+ * reference — a new object is allocated only inside `select` — so `getSnapshot`
11
+ * never triggers a re-render loop.
12
+ */
13
+ export class WorkspaceFileSelectionStore {
14
+ _selected = null;
15
+ _listeners = new Set();
16
+ // -- Mutations -----------------------------------------------------------
17
+ select(file) {
18
+ if (selectedEqual(this._selected, file))
19
+ return;
20
+ this._selected = file;
21
+ this._notify();
22
+ }
23
+ deselect() {
24
+ if (this._selected === null)
25
+ return;
26
+ this._selected = null;
27
+ this._notify();
28
+ }
29
+ toggle(file) {
30
+ if (selectedEqual(this._selected, file)) {
31
+ this.deselect();
32
+ }
33
+ else {
34
+ this.select(file);
35
+ }
36
+ }
37
+ // -- useSyncExternalStore contract ---------------------------------------
38
+ subscribe = (listener) => {
39
+ this._listeners.add(listener);
40
+ return () => {
41
+ this._listeners.delete(listener);
42
+ };
43
+ };
44
+ /** Returns the current selection (stable ref between mutations). */
45
+ getSelection = () => {
46
+ return this._selected;
47
+ };
48
+ // -- Internal ------------------------------------------------------------
49
+ _notify() {
50
+ for (const listener of this._listeners) {
51
+ listener();
52
+ }
53
+ }
54
+ }
55
+ function selectedEqual(a, b) {
56
+ if (a === b)
57
+ return true;
58
+ if (a === null || b === null)
59
+ return false;
60
+ return a.entryId === b.entryId && a.path === b.path;
61
+ }
62
+ //# sourceMappingURL=workspace-file-selection-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-file-selection-store.js","sourceRoot":"","sources":["../../../src/internal/store/workspace-file-selection-store.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4EAA4E;AAC5E,gFAAgF;AAoBhF;;;;;;;;GAQG;AACH,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAAiC,IAAI,CAAC;IAC/C,UAAU,GAAG,IAAI,GAAG,EAAY,CAAC;IAEzC,2EAA2E;IAE3E,MAAM,CAAC,IAA2B;QAChC,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;YAAE,OAAO;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,IAA2B;QAChC,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,2EAA2E;IAE3E,SAAS,GAAG,CAAC,QAAkB,EAAgB,EAAE;QAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,oEAAoE;IACpE,YAAY,GAAG,GAAiC,EAAE;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC,CAAC;IAEF,2EAA2E;IAEnE,OAAO;QACb,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF;AAED,SAAS,aAAa,CACpB,CAA+B,EAC/B,CAA+B;IAE/B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type RefObject } from "react";
2
+ /**
3
+ * A transient request to scroll a line-faithful code view to a specific line
4
+ * and emphasize it — the "reveal" seam behind jump-to-line navigation (e.g. a
5
+ * content-search hit opening its file at the matched line).
6
+ *
7
+ * `line` is 1-based, matching the gutter and the grep's line numbers. `nonce`
8
+ * is a monotonic token bumped by the producer on every navigation — including a
9
+ * repeat navigation to the same `line` — so an already-mounted view re-scrolls
10
+ * even when the target line is unchanged. The line is deliberately NOT part of
11
+ * an editor's identity (see `WorkspaceEditorsStore`): it is navigation, not
12
+ * state, so it must not key a remount.
13
+ */
14
+ export interface RevealTarget {
15
+ /** 1-based line to scroll to and highlight. */
16
+ readonly line: number;
17
+ /** Monotonic token; a change re-triggers the scroll (even for the same line). */
18
+ readonly nonce: number;
19
+ }
20
+ /** Return value of {@link useRevealLine}. */
21
+ export interface UseRevealLineResult<T extends HTMLElement = HTMLElement> {
22
+ /**
23
+ * Attach to the element that wraps the addressable line rows. The hook scopes
24
+ * its `[data-line]` query to this subtree, so multiple viewers never collide.
25
+ */
26
+ readonly containerRef: RefObject<T | null>;
27
+ /** Whether a given 1-based line is the current reveal target (for the highlight). */
28
+ readonly isRevealed: (line: number) => boolean;
29
+ }
30
+ /**
31
+ * Scrolls a line-faithful code view to `reveal.line` and reports which line to
32
+ * highlight.
33
+ *
34
+ * The mechanics are centralized here (rather than duplicated into each line
35
+ * renderer) and mirror the established `data-attribute` scroll pattern used by
36
+ * the workflow waterfall: the consumer renders each row with `data-line="N"`
37
+ * and this hook, on every `reveal.nonce` change, finds the target row within
38
+ * `containerRef` and scrolls it into view. Smooth scroll yields to
39
+ * `prefers-reduced-motion` (a JS animation the CSS rule does not cover), and
40
+ * the scroll is an optional call so it is a no-op under jsdom, which has no
41
+ * `scrollIntoView`.
42
+ *
43
+ * Placement matters: mount this inside the line renderer, which exists only
44
+ * after the file content has loaded — never above the async content gate — so
45
+ * the `[data-line]` rows are present when the effect runs and a fresh open does
46
+ * not race the load. A missing or out-of-range line is a silent no-op.
47
+ */
48
+ export declare function useRevealLine<T extends HTMLElement = HTMLElement>(reveal: RevealTarget | undefined): UseRevealLineResult<T>;
49
+ //# sourceMappingURL=useRevealLine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRevealLine.d.ts","sourceRoot":"","sources":["../../src/internal/useRevealLine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACtE;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,qFAAqF;IACrF,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC/D,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,mBAAmB,CAAC,CAAC,CAAC,CAyBxB"}