@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
@@ -0,0 +1,47 @@
1
+ import type { FileChangeProgress } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
2
+ /** Props for {@link FileChangeProgressBar}. */
3
+ export interface FileChangeProgressBarProps {
4
+ /**
5
+ * The transient mid-run progress snapshot for the active turn (DD-32). Feed
6
+ * this from `useSessionConversation().fileChangeProgress`. Renders nothing when
7
+ * undefined or when no files have changed yet — the server clears it once the
8
+ * turn's change set leaves CAPTURING, so the bar disappears exactly when the
9
+ * decision surface ({@link FileReviewDock}) takes over.
10
+ */
11
+ readonly progress: FileChangeProgress | undefined;
12
+ /** Additional CSS class names for the root container. */
13
+ readonly className?: string;
14
+ }
15
+ /**
16
+ * The live "N files changed so far" strip for a turn that is still running.
17
+ *
18
+ * WHY IT EXISTS. The transcript streams per-edit tool rows, but a change made by
19
+ * a shell command (a `sed`, a build step) has no tool row, and there is no
20
+ * running net-of-many-edits rollup until the turn ends. This bar fills that gap:
21
+ * a compact, NON-INTERACTIVE count of the workspace delta accumulating during
22
+ * the turn, pinned above the composer where the {@link FileReviewDock} will later
23
+ * appear. The two are mutually exclusive per turn (progress shows while CAPTURING;
24
+ * the dock shows once AWAITING_REVIEW), so the bar hands off cleanly to the dock.
25
+ *
26
+ * NEVER A DECISION SURFACE. Progress is non-authoritative and carries no file
27
+ * bodies — it is never reviewable or decidable. The reviewed diff is the
28
+ * turn-boundary candidate ({@link FileReviewDock} / the stamped transcript rows).
29
+ * A secret-like path is surfaced by name with its counts withheld (zeroed), so
30
+ * `FileLineStats` renders nothing for it.
31
+ *
32
+ * A11Y. Only the summary count is an `aria-live` region — the per-file list is
33
+ * not — so a screen reader hears "3 files changing" as the count moves, not a
34
+ * per-file barrage on every ~2s refresh.
35
+ *
36
+ * Purely presentational (headless-first, DD-003): the data lives in
37
+ * `useSessionConversation().fileChangeProgress`. `SessionViewer` mounts it above
38
+ * the dock by default.
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * const conv = useSessionConversation(sessionId);
43
+ * <FileChangeProgressBar progress={conv.fileChangeProgress} />
44
+ * ```
45
+ */
46
+ export declare const FileChangeProgressBar: import("react").NamedExoticComponent<FileChangeProgressBarProps>;
47
+ //# sourceMappingURL=FileChangeProgressBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileChangeProgressBar.d.ts","sourceRoot":"","sources":["../../src/execution/FileChangeProgressBar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAK7G,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAClD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,qBAAqB,kEAmEhC,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { memo, useState } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { FileKindBadge, FileLineStats } from "./FileReviewAtoms.js";
6
+ import { FilePathLink } from "./FilePathLink.js";
7
+ /**
8
+ * The live "N files changed so far" strip for a turn that is still running.
9
+ *
10
+ * WHY IT EXISTS. The transcript streams per-edit tool rows, but a change made by
11
+ * a shell command (a `sed`, a build step) has no tool row, and there is no
12
+ * running net-of-many-edits rollup until the turn ends. This bar fills that gap:
13
+ * a compact, NON-INTERACTIVE count of the workspace delta accumulating during
14
+ * the turn, pinned above the composer where the {@link FileReviewDock} will later
15
+ * appear. The two are mutually exclusive per turn (progress shows while CAPTURING;
16
+ * the dock shows once AWAITING_REVIEW), so the bar hands off cleanly to the dock.
17
+ *
18
+ * NEVER A DECISION SURFACE. Progress is non-authoritative and carries no file
19
+ * bodies — it is never reviewable or decidable. The reviewed diff is the
20
+ * turn-boundary candidate ({@link FileReviewDock} / the stamped transcript rows).
21
+ * A secret-like path is surfaced by name with its counts withheld (zeroed), so
22
+ * `FileLineStats` renders nothing for it.
23
+ *
24
+ * A11Y. Only the summary count is an `aria-live` region — the per-file list is
25
+ * not — so a screen reader hears "3 files changing" as the count moves, not a
26
+ * per-file barrage on every ~2s refresh.
27
+ *
28
+ * Purely presentational (headless-first, DD-003): the data lives in
29
+ * `useSessionConversation().fileChangeProgress`. `SessionViewer` mounts it above
30
+ * the dock by default.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * const conv = useSessionConversation(sessionId);
35
+ * <FileChangeProgressBar progress={conv.fileChangeProgress} />
36
+ * ```
37
+ */
38
+ export const FileChangeProgressBar = memo(function FileChangeProgressBar({ progress, className, }) {
39
+ const [expanded, setExpanded] = useState(false);
40
+ if (!progress || progress.filesChanged === 0)
41
+ return null;
42
+ const { filesChanged, linesAdded, linesRemoved, entries } = progress;
43
+ const hiddenCount = filesChanged - entries.length;
44
+ return (_jsxs("div", { role: "region", "aria-label": "File changes in progress", "data-cursor-target": "file-change-progress-bar", className: cn("border-t border-border-muted px-4 py-2", className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { type: "button", onClick: () => setExpanded((prev) => !prev), "aria-expanded": expanded, className: "flex min-w-0 flex-1 items-center gap-2 text-left text-xs text-muted-foreground hover:text-foreground", children: [_jsx("span", { "aria-hidden": "true", className: cn("shrink-0 transition-transform", expanded && "rotate-90"), children: "\u25B8" }), _jsxs("span", { "aria-live": "polite", className: "min-w-0 truncate", children: [filesChanged, " ", filesChanged === 1 ? "file" : "files", " changing\u2026"] })] }), _jsx(FileLineStats, { linesAdded: linesAdded, linesRemoved: linesRemoved })] }), expanded && (_jsxs("ul", { className: "mt-2 max-h-[30vh] space-y-1 overflow-y-auto", children: [entries.map((entry) => {
45
+ const path = entry.pathAfter || entry.pathBefore;
46
+ return (_jsxs("li", { className: "flex items-center gap-2", children: [_jsx(FileKindBadge, { kind: entry.kind }), _jsx(FilePathLink, { path: path, dirDisplay: "dim", className: "min-w-0 flex-1 text-xs" }), _jsx(FileLineStats, { linesAdded: entry.linesAdded, linesRemoved: entry.linesRemoved })] }, path));
47
+ }), hiddenCount > 0 && (_jsxs("li", { className: "text-xs text-muted-foreground-faint", children: ["\u2026 and ", hiddenCount, " more"] }))] }))] }));
48
+ });
49
+ //# sourceMappingURL=FileChangeProgressBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileChangeProgressBar.js","sourceRoot":"","sources":["../../src/execution/FileChangeProgressBar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgBjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,qBAAqB,CAAC,EACvE,QAAQ,EACR,SAAS,GACkB;IAC3B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IACrE,MAAM,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAElD,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,gBACF,0BAA0B,wBAClB,0BAA0B,EAC7C,SAAS,EAAE,EAAE,CAAC,wCAAwC,EAAE,SAAS,CAAC,aAElE,eAAK,SAAS,EAAC,yBAAyB,aACtC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,mBAC5B,QAAQ,EACvB,SAAS,EAAC,sGAAsG,aAEhH,8BACc,MAAM,EAClB,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,QAAQ,IAAI,WAAW,CAAC,uBAGlE,EAGP,6BAAgB,QAAQ,EAAC,SAAS,EAAC,kBAAkB,aAClD,YAAY,OAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,uBAChD,IACA,EACT,KAAC,aAAa,IAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,GAAI,IACjE,EACL,QAAQ,IAAI,CACX,cAAI,SAAS,EAAC,6CAA6C,aACxD,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACrB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC;wBACjD,OAAO,CACL,cAAe,SAAS,EAAC,yBAAyB,aAChD,KAAC,aAAa,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,EACnC,KAAC,YAAY,IACX,IAAI,EAAE,IAAI,EACV,UAAU,EAAC,KAAK,EAChB,SAAS,EAAC,wBAAwB,GAClC,EACF,KAAC,aAAa,IACZ,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,YAAY,EAAE,KAAK,CAAC,YAAY,GAChC,KAVK,IAAI,CAWR,CACN,CAAC;oBACJ,CAAC,CAAC,EACD,WAAW,GAAG,CAAC,IAAI,CAClB,cAAI,SAAS,EAAC,qCAAqC,4BAC1C,WAAW,aACf,CACN,IACE,CACN,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileChangesView.d.ts","sourceRoot":"","sources":["../../src/execution/FileChangesView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iEAAiE,CAAC;AAiBlG,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,oBAAoB,kDAgD3E;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAe,EACf,YAAmB,EACnB,SAAgB,GACjB,EAAE,mBAAmB,2CAyDrB"}
1
+ {"version":3,"file":"FileChangesView.d.ts","sourceRoot":"","sources":["../../src/execution/FileChangesView.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iEAAiE,CAAC;AAiBlG,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,oBAAoB,kDAgD3E;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAe,EACf,YAAmB,EACnB,SAAgB,GACjB,EAAE,mBAAmB,2CA+DrB"}
@@ -65,7 +65,14 @@ export function FileChangeDiff({ change, className, bodyClassName, bounded = fal
65
65
  if (change.captureLevel === FileChangeCaptureLevel.HUNK_ONLY) {
66
66
  return { additions: change.linesAdded, deletions: change.linesRemoved };
67
67
  }
68
- return countHunks(hunks);
68
+ // Whole-file: count the rendered hunks (what the user actually sees). When
69
+ // there are none to count — the body is offloaded/loading/truncated — fall
70
+ // back to the capture-time counts, which are computed with the same diff
71
+ // algorithm and so agree with the hunks whenever both exist.
72
+ const computed = countHunks(hunks);
73
+ if (computed.additions > 0 || computed.deletions > 0)
74
+ return computed;
75
+ return { additions: change.linesAdded, deletions: change.linesRemoved };
69
76
  }, [change.captureLevel, change.linesAdded, change.linesRemoved, hunks]);
70
77
  const showStatsRow = showStats && (stats.additions > 0 || stats.deletions > 0);
71
78
  return (_jsxs("div", { className: cn("flex flex-col gap-1.5", className), "data-cursor-target": "file-diff", children: [(showFileName || showStatsRow) && (_jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [showFileName &&
@@ -128,8 +135,11 @@ function countHunks(hunks) {
128
135
  * Projects a {@link FileChange} into a {@link FileDiffEntry} for the file list.
129
136
  *
130
137
  * Counts: hunk-only uses the runner's authoritative numbers; whole-file inline
131
- * is derived from the content; an offloaded whole-file side has no synchronous
132
- * content, so its count stays 0 until the file is opened and fetched.
138
+ * is derived from the content (identical to the runner's capture-time counts by
139
+ * construction same diff algorithm). A whole-file side with no synchronous
140
+ * content (offloaded / binary) falls back to the runner's capture-time
141
+ * `linesAdded`/`linesRemoved` — zero when no count exists, which the list
142
+ * renders as no stat.
133
143
  */
134
144
  function toFileDiffEntry(change) {
135
145
  const changeType = change.changeType === FileChangeType.CREATE
@@ -151,7 +161,12 @@ function toFileDiffEntry(change) {
151
161
  const { additions, deletions } = countHunks(computeDiff(before, after));
152
162
  return { path: change.path, changeType, additions, deletions };
153
163
  }
154
- return { path: change.path, changeType, additions: 0, deletions: 0 };
164
+ return {
165
+ path: change.path,
166
+ changeType,
167
+ additions: change.linesAdded,
168
+ deletions: change.linesRemoved,
169
+ };
155
170
  }
156
171
  /** Inline text of a side, or null when absent/offloaded/binary. */
157
172
  function inlineSide(side) {
@@ -1 +1 @@
1
- {"version":3,"file":"FileChangesView.js","sourceRoot":"","sources":["../../src/execution/FileChangesView.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileChangesView.js","sourceRoot":"","sources":["../../src/execution/FileChangesView.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAajE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,EAAwB;IAC1E,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAClC,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CACzB,CAAC;IAEF,MAAM,QAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAErE,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CACH,OAAO,CAAC,MAAM,CACZ,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS;QACtC,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS;KACvC,CAAC,EACF,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAC/B,EACH,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEnD,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,aAClD,KAAC,WAAW,IACV,SAAS,EAAE,OAAO,CAAC,MAAM,EACzB,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,GAC3B,EAED,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,cAAK,SAAS,EAAC,iDAAiD,YAC9D,KAAC,YAAY,IACX,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,QAAQ,CAAC,IAAI,EAC3B,QAAQ,EAAE,eAAe,GACzB,GACE,CACP,EAED,KAAC,cAAc,IAAqB,MAAM,EAAE,QAAQ,IAA/B,QAAQ,CAAC,IAAI,CAAsB,IACpD,CACP,CAAC;AACJ,CAAC;AAwCD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAO,GAAG,KAAK,EACf,YAAY,GAAG,IAAI,EACnB,SAAS,GAAG,IAAI,GACI;IACpB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,GACnF,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,OAAO,CAAsB,GAAG,EAAE;QAC9C,IAAI,UAAU,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QACzD,OAAO,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,IAAI,MAAM,CAAC,YAAY,KAAK,sBAAsB,CAAC,SAAS,EAAE,CAAC;YAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1E,CAAC;QACD,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;QACtE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;IAC1E,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAEzE,MAAM,YAAY,GAAG,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAE/E,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,wBAC9B,WAAW,aAE7B,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,CACjC,eAAK,SAAS,EAAC,uDAAuD,aACnE,YAAY;wBACX,MAAM,CAAC,UAAU,KAAK,cAAc,CAAC,MAAM;wBAC3C,MAAM,CAAC,UAAU,IAAI,CACnB,gBAAM,SAAS,EAAC,wDAAwD,aACrE,MAAM,CAAC,UAAU,eACb,CACR,EACF,YAAY,IAAI,CACf,KAAC,YAAY,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAC,KAAK,EAAC,SAAS,EAAC,SAAS,GAAG,CACzE,EACA,YAAY,IAAI,CACf,gBAAM,SAAS,EAAC,uBAAuB,aACrC,gBAAM,SAAS,EAAC,oBAAoB,kBAAG,KAAK,CAAC,SAAS,IAAQ,EAAC,GAAG,EAClE,gBAAM,SAAS,EAAC,sBAAsB,kBAAG,KAAK,CAAC,SAAS,IAAQ,IAC3D,CACR,IACG,CACP,EAED,KAAC,cAAc,IACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,GAChB,IACE,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAE9E,SAAS,cAAc,CAAC,EACtB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,SAAS,EACT,KAAK,EACL,WAAW,EACX,WAAW,EACX,aAAa,EACb,OAAO,GAWR;IACC,2EAA2E;IAC3E,4EAA4E;IAC5E,qDAAqD;IACrD,MAAM,SAAS,GACb,MAAM,CAAC,UAAU,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC;IAE9E,+EAA+E;IAC/E,2EAA2E;IAC3E,8EAA8E;IAC9E,MAAM,KAAK,GAAG,CAAC,IAAqB,EAAE,EAAE,CACtC,OAAO,CAAC,CAAC,CAAC,CACR,KAAC,cAAc,IAAC,YAAY,EAAC,kBAAkB,YAAE,IAAI,GAAkB,CACxE,CAAC,CAAC,CAAC,CACF,IAAI,CACL,CAAC;IAEJ,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,KAAC,MAAM,uCAA8B,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,KAAK,sBAAsB,CAAC,SAAS,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAC1B,KAAK,CAAC,KAAC,eAAe,IAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,GAAI,CAAC,CAChF,CAAC,CAAC,CAAC,CACF,KAAC,iBAAiB,IAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,GAAI,CACjE,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CACL,MAAC,MAAM,yDACkC,GAAG,EACzC,WAAW,IAAI,CACd,YACE,IAAI,EAAE,WAAW,EACjB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,SAAS,EAAC,qIAAqI,uCAG7I,CACL,IACM,CACV,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAC,MAAM,qCAAuB,CAAC;IACxC,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,qDAA8C,CAAC;IAC/E,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAC,iBAAiB,IAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,GAAI,CAAC;IAC1E,CAAC;IAED,OAAO,KAAK,CAAC,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,GAAI,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,MAAM,CAAC,EACd,QAAQ,EACR,OAAO,GAAG,OAAO,GAIlB;IACC,OAAO,CACL,cACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,uBAAuB,CACnE,YAEA,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,UAAU,CAAC,KAA0B;IAI5C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;gBAAE,SAAS,EAAE,CAAC;iBAClC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,MAAkB;IACzC,MAAM,UAAU,GACd,MAAM,CAAC,UAAU,KAAK,cAAc,CAAC,MAAM;QACzC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,cAAc,CAAC,MAAM;YAC3C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,UAAU,CAAC;IAEnB,IAAI,MAAM,CAAC,YAAY,KAAK,sBAAsB,CAAC,SAAS,EAAE,CAAC;QAC7D,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU;YACV,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,SAAS,EAAE,MAAM,CAAC,YAAY;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACtC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACjE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU;QACV,SAAS,EAAE,MAAM,CAAC,UAAU;QAC5B,SAAS,EAAE,MAAM,CAAC,YAAY;KAC/B,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,SAAS,UAAU,CACjB,IAA0B;IAE1B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"}
@@ -16,8 +16,15 @@ export interface FilePathContextValue {
16
16
  * `FilePathLink` delegates to this callback instead of opening
17
17
  * a URL or copying to clipboard. Platform builders use this to
18
18
  * integrate their own file viewer or navigation.
19
+ *
20
+ * Return `false` to **decline** a specific path — `FilePathLink` then falls
21
+ * back to its default action (open the GitHub link / copy the path), so a
22
+ * handler that can only open *some* paths (e.g. resolvable workspace files)
23
+ * leaves the rest behaving as before. Returning `true` or `void` means the
24
+ * click was fully handled and the default is suppressed — preserving the
25
+ * behavior of existing `void`-returning handlers.
19
26
  */
20
- readonly onFilePathClick?: (path: string, resolved: ResolvedPathAction) => void;
27
+ readonly onFilePathClick?: (path: string, resolved: ResolvedPathAction) => boolean | void;
21
28
  }
22
29
  /** Context that supplies workspace file-path metadata for display-time path resolution. */
23
30
  export declare const FilePathContext: import("react").Context<FilePathContextValue>;
@@ -1 +1 @@
1
- {"version":3,"file":"FilePathContext.d.ts","sourceRoot":"","sources":["../../src/execution/FilePathContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4DAA4D,CAAC;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,cAAc,EAAE,CAAC;IACrD;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kBAAkB,KACzB,IAAI,CAAC;CACX;AAMD,2FAA2F;AAC3F,eAAO,MAAM,eAAe,+CACwB,CAAC"}
1
+ {"version":3,"file":"FilePathContext.d.ts","sourceRoot":"","sources":["../../src/execution/FilePathContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4DAA4D,CAAC;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,cAAc,EAAE,CAAC;IACrD;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kBAAkB,KACzB,OAAO,GAAG,IAAI,CAAC;CACrB;AAMD,2FAA2F;AAC3F,eAAO,MAAM,eAAe,+CACwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FilePathContext.js","sourceRoot":"","sources":["../../src/execution/FilePathContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AA2BtC,MAAM,aAAa,GAAyB;IAC1C,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,2FAA2F;AAC3F,MAAM,CAAC,MAAM,eAAe,GAC1B,aAAa,CAAuB,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"FilePathContext.js","sourceRoot":"","sources":["../../src/execution/FilePathContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAkCtC,MAAM,aAAa,GAAyB;IAC1C,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,2FAA2F;AAC3F,MAAM,CAAC,MAAM,eAAe,GAC1B,aAAa,CAAuB,aAAa,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FilePathLink.d.ts","sourceRoot":"","sources":["../../src/execution/FilePathLink.tsx"],"names":[],"mappings":"AAOA,mEAAmE;AACnE,MAAM,MAAM,kBAAkB;AAC5B,8EAA8E;AAC5E,MAAM;AACR,2EAA2E;GACzE,KAAK,CAAC;AAEV,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IACzC,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,UAAmB,EACnB,SAAS,GACV,EAAE,iBAAiB,2CA+FnB"}
1
+ {"version":3,"file":"FilePathLink.d.ts","sourceRoot":"","sources":["../../src/execution/FilePathLink.tsx"],"names":[],"mappings":"AAOA,mEAAmE;AACnE,MAAM,MAAM,kBAAkB;AAC5B,8EAA8E;AAC5E,MAAM;AACR,2EAA2E;GACzE,KAAK,CAAC;AAEV,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IACzC,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,UAAmB,EACnB,SAAS,GACV,EAAE,iBAAiB,2CA+GnB"}
@@ -55,22 +55,37 @@ export function FilePathLink({ path, dirDisplay = "hide", className, }) {
55
55
  // (ToolCallItem's role=button header); copying/opening a path must not
56
56
  // also expand the row.
57
57
  e.stopPropagation();
58
+ // Offer the click to the injected handler first. It returns `false` to
59
+ // DECLINE (e.g. an in-app viewer that can't open this particular path),
60
+ // in which case we fall through to the default action below. A `true`/
61
+ // `void` return means it fully handled the click.
58
62
  if (onFilePathClick) {
59
- e.preventDefault();
60
- onFilePathClick(path, resolved);
61
- return;
63
+ const handled = onFilePathClick(path, resolved);
64
+ if (handled !== false) {
65
+ // For a link, also stop the browser from navigating (the file opened
66
+ // in-app instead). A modifier/middle-click bypasses this onClick, so
67
+ // the real <a href> still opens the target in a new tab.
68
+ if (resolved.action === "link")
69
+ e.preventDefault();
70
+ return;
71
+ }
62
72
  }
63
73
  if (resolved.action === "copy") {
64
74
  handleCopy();
65
75
  }
66
- // For "link" action the <a> default navigation handles it.
76
+ // For a declined/un-handled "link", the <a>'s native navigation runs.
67
77
  }, [onFilePathClick, path, resolved, handleCopy]);
68
78
  const sharedClasses = cn("inline-flex min-w-0 items-center gap-1 font-mono text-foreground", "transition-colors hover:text-primary hover:underline", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:rounded-sm", className);
69
79
  // The directory truncates (it is context); the base never shrinks (it is
70
80
  // identity). Together they keep the file name legible at any width.
71
81
  const label = copied ? (_jsx("span", { className: "min-w-0 truncate", children: "Copied" })) : (_jsxs(_Fragment, { children: [dirDisplay === "dim" && dir && (_jsx("span", { className: "min-w-0 truncate text-muted-foreground-faint", children: dir })), _jsx("span", { className: "shrink-0", children: base })] }));
72
- if (resolved.action === "link" && !onFilePathClick) {
73
- return (_jsxs("a", { href: resolved.url, target: "_blank", rel: "noopener noreferrer", onClick: (e) => e.stopPropagation(), "aria-label": ariaLabel, title: title, className: cn(sharedClasses, "group/fpl"), children: [label, _jsx(ExternalLinkIcon, {})] }));
82
+ // A link-action path always renders a real anchor — even when an
83
+ // `onFilePathClick` handler is present so native link affordances
84
+ // (middle-click, open-in-new-tab, copy-link-address) survive. `handleClick`
85
+ // intercepts a plain left-click to route it through the handler (e.g. into an
86
+ // in-app viewer) and only calls `preventDefault` when the handler took it.
87
+ if (resolved.action === "link") {
88
+ return (_jsxs("a", { href: resolved.url, target: "_blank", rel: "noopener noreferrer", onClick: handleClick, "aria-label": ariaLabel, title: title, className: cn(sharedClasses, "group/fpl"), children: [label, _jsx(ExternalLinkIcon, {})] }));
74
89
  }
75
90
  return (_jsxs("button", { type: "button", onClick: handleClick, "aria-label": ariaLabel, title: title, className: cn(sharedClasses, "group/fpl cursor-pointer"), children: [label, !copied && _jsx(CopyIcon, {})] }));
76
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FilePathLink.js","sourceRoot":"","sources":["../../src/execution/FilePathLink.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FilePathLink.js","sourceRoot":"","sources":["../../src/execution/FilePathLink.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { FileChangeKind } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
2
+ /**
3
+ * Shared presentational atoms for the file-review surfaces — the single source
4
+ * for the `+N −M` stat and the change-kind marker, so the review card, the
5
+ * compact list, and the mid-run progress bar can never drift in how they render
6
+ * a file's magnitude or kind.
7
+ */
8
+ /**
9
+ * The `+N −M` stat for one file (or a whole set), in the same visual vocabulary
10
+ * as the tool-row diff stats. Renders nothing when both counts are zero — the
11
+ * honest signal that no count exists (binary or secret-withheld changes, records
12
+ * captured before counts were stamped) — rather than a misleading `+0 −0`.
13
+ */
14
+ export declare function FileLineStats({ linesAdded, linesRemoved, }: {
15
+ readonly linesAdded: number;
16
+ readonly linesRemoved: number;
17
+ }): import("react/jsx-runtime").JSX.Element | null;
18
+ /**
19
+ * The single-letter change-kind marker — the same M/A/D visual vocabulary as
20
+ * the version-history `DiffFileList`, extended with R for captured renames.
21
+ * The letter itself is the non-color channel; the full word is exposed to
22
+ * assistive tech. An UNSPECIFIED kind renders nothing rather than guessing.
23
+ */
24
+ export declare function FileKindBadge({ kind }: {
25
+ kind: FileChangeKind;
26
+ }): import("react/jsx-runtime").JSX.Element | null;
27
+ //# sourceMappingURL=FileReviewAtoms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileReviewAtoms.d.ts","sourceRoot":"","sources":["../../src/execution/FileReviewAtoms.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAG9F;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,YAAY,GACb,EAAE;IACD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,kDAYA;AAmCD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,kDAW/D"}
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { FileChangeKind } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
4
+ import { cn } from "@stigmer/theme";
5
+ /**
6
+ * Shared presentational atoms for the file-review surfaces — the single source
7
+ * for the `+N −M` stat and the change-kind marker, so the review card, the
8
+ * compact list, and the mid-run progress bar can never drift in how they render
9
+ * a file's magnitude or kind.
10
+ */
11
+ /**
12
+ * The `+N −M` stat for one file (or a whole set), in the same visual vocabulary
13
+ * as the tool-row diff stats. Renders nothing when both counts are zero — the
14
+ * honest signal that no count exists (binary or secret-withheld changes, records
15
+ * captured before counts were stamped) — rather than a misleading `+0 −0`.
16
+ */
17
+ export function FileLineStats({ linesAdded, linesRemoved, }) {
18
+ if (linesAdded === 0 && linesRemoved === 0)
19
+ return null;
20
+ return (_jsxs("span", { className: "shrink-0 text-xs tabular-nums", "aria-label": `${linesAdded} added, ${linesRemoved} removed`, "data-cursor-target": "file-review-line-stats", children: [_jsxs("span", { className: "text-diff-added-fg", children: ["+", linesAdded] }), " ", _jsxs("span", { className: "text-diff-removed-fg", children: ["-", linesRemoved] })] }));
21
+ }
22
+ /** The kind letter, tone, and a11y name for each wire {@link FileChangeKind}. */
23
+ const KIND_BADGE = {
24
+ [FileChangeKind.ADD]: {
25
+ letter: "A",
26
+ colorClass: "text-diff-added-fg",
27
+ label: "added",
28
+ },
29
+ [FileChangeKind.MODIFY]: {
30
+ letter: "M",
31
+ colorClass: "text-diff-hunk-header-fg",
32
+ label: "modified",
33
+ },
34
+ [FileChangeKind.DELETE]: {
35
+ letter: "D",
36
+ colorClass: "text-diff-removed-fg",
37
+ label: "deleted",
38
+ },
39
+ [FileChangeKind.RENAME]: {
40
+ letter: "R",
41
+ colorClass: "text-diff-hunk-header-fg",
42
+ label: "renamed",
43
+ },
44
+ // A binary change is a modification whose diff is not text; the letter stays
45
+ // M and the binary-ness is told by the row's "Keep anyway" + reason note.
46
+ [FileChangeKind.BINARY_CHANGE]: {
47
+ letter: "M",
48
+ colorClass: "text-diff-hunk-header-fg",
49
+ label: "modified (binary)",
50
+ },
51
+ };
52
+ /**
53
+ * The single-letter change-kind marker — the same M/A/D visual vocabulary as
54
+ * the version-history `DiffFileList`, extended with R for captured renames.
55
+ * The letter itself is the non-color channel; the full word is exposed to
56
+ * assistive tech. An UNSPECIFIED kind renders nothing rather than guessing.
57
+ */
58
+ export function FileKindBadge({ kind }) {
59
+ const badge = KIND_BADGE[kind];
60
+ if (!badge)
61
+ return null;
62
+ return (_jsx("span", { className: cn("shrink-0 font-mono text-[10px] font-bold", badge.colorClass), "aria-label": badge.label, children: badge.letter }));
63
+ }
64
+ //# sourceMappingURL=FileReviewAtoms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileReviewAtoms.js","sourceRoot":"","sources":["../../src/execution/FileReviewAtoms.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAC9F,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,UAAU,EACV,YAAY,GAIb;IACC,IAAI,UAAU,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,CACL,gBACE,SAAS,EAAC,+BAA+B,gBAC7B,GAAG,UAAU,WAAW,YAAY,UAAU,wBACvC,wBAAwB,aAE3C,gBAAM,SAAS,EAAC,oBAAoB,kBAAG,UAAU,IAAQ,EAAC,GAAG,EAC7D,gBAAM,SAAS,EAAC,sBAAsB,kBAAG,YAAY,IAAQ,IACxD,CACR,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,GAEZ;IACF,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,oBAAoB;QAChC,KAAK,EAAE,OAAO;KACf;IACD,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,0BAA0B;QACtC,KAAK,EAAE,UAAU;KAClB;IACD,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,sBAAsB;QAClC,KAAK,EAAE,SAAS;KACjB;IACD,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,0BAA0B;QACtC,KAAK,EAAE,SAAS;KACjB;IACD,6EAA6E;IAC7E,0EAA0E;IAC1E,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE;QAC9B,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,0BAA0B;QACtC,KAAK,EAAE,mBAAmB;KAC3B;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAA4B;IAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,KAAK,CAAC,UAAU,CAAC,gBAC/D,KAAK,CAAC,KAAK,YAEtB,KAAK,CAAC,MAAM,GACR,CACR,CAAC;AACJ,CAAC"}
@@ -29,8 +29,8 @@ export interface FileReviewCardProps {
29
29
  *
30
30
  * `MessageThread` passes `false`: the transcript's stamped edit rows already
31
31
  * show every diff in place, so the expanded body collapses to a compact file
32
- * list (kind letter + path + per-file controls) and the card stays purely
33
- * the decision surface. Decision semantics — digests, scopes,
32
+ * list (kind letter + linked path + `+N −M` + per-file controls) and the card
33
+ * stays purely the decision surface. Decision semantics — digests, scopes,
34
34
  * acknowledgments — are identical in both modes; this is presentation only
35
35
  * (opt-in with a backward-compatible default, DD-011).
36
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"FileReviewCard.d.ts","sourceRoot":"","sources":["../../src/execution/FileReviewCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,oEAAoE,CAAC;AAC5E,OAAO,EAGL,kBAAkB,EAGnB,MAAM,8DAA8D,CAAC;AAQtE,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAc/E,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxF;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,sBAAsB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtD;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,eAAO,MAAM,cAAc,2DAmTzB,CAAC"}
1
+ {"version":3,"file":"FileReviewCard.d.ts","sourceRoot":"","sources":["../../src/execution/FileReviewCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,oEAAoE,CAAC;AAC5E,OAAO,EAGL,kBAAkB,EAGnB,MAAM,8DAA8D,CAAC;AAStE,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAc/E,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxF;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,sBAAsB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtD;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,eAAO,MAAM,cAAc,2DA0UzB,CAAC"}
@@ -1,14 +1,15 @@
1
1
  "use client";
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { memo, useCallback, useEffect, useId, useMemo, useState } from "react";
4
4
  import { FileCaptureClass, FileChangeKind, FileDecisionAction, FileDecisionOrigin, FileDecisionScope, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
5
5
  import { toDisplayFileChange } from "@stigmer/sdk";
6
6
  import { cn } from "@stigmer/theme";
7
7
  import { FileChangeDiff } from "./FileChangesView.js";
8
+ import { FileKindBadge, FileLineStats } from "./FileReviewAtoms.js";
9
+ import { FilePathLink } from "./FilePathLink.js";
8
10
  import { DiffSummary } from "../version-history/DiffSummary.js";
9
11
  import { DecisionButton } from "../internal/DecisionButton.js";
10
12
  import { InCardDecisionError } from "../internal/InCardDecisionError.js";
11
- import { splitDisplayPath } from "./file-path-resolver.js";
12
13
  import { fileDecisionKey } from "./useFileReview.js";
13
14
  import { changeSetReviewability, deriveEffectiveVerdicts, fileReviewability, } from "./file-review-status.js";
14
15
  /** A stable empty set so the default `submittingDecisionKeys` keeps a constant ref. */
@@ -101,10 +102,16 @@ export const FileReviewCard = memo(function FileReviewCard({ fileChangeSet, onSu
101
102
  const showBulkControls = total > 1 || !incomplete;
102
103
  // The bar starts expanded exactly when the collapsed bar cannot honestly carry
103
104
  // the decision: an incomplete set (binary acknowledgment / blocked files need
104
- // their per-file context) or a review already in progress. A complete set and
105
- // a settled record start collapsed the transcript's stamped rows already
106
- // show what changed, and the expander reveals the per-file detail on demand.
107
- const [expanded, setExpanded] = useState(() => interactive && (incomplete || decidedCount > 0));
105
+ // their per-file context), a review already in progress, or a multi-file set
106
+ // in compact-list mode its honest decision surface includes the per-file
107
+ // Keep/Discard controls, which must be visible without hunting behind the
108
+ // expander (the docked strip bounds the height, so expanding is cheap there).
109
+ // Diff-rich mode (`showDiffs`) deliberately stays collapsed for a complete
110
+ // multi-file set: its expanded body is every full diff with no height cap
111
+ // (the workflow file-review list), where "Review" is the act of opening it.
112
+ // A settled record always starts collapsed — the transcript's stamped rows
113
+ // already show what changed, and the expander reveals detail on demand.
114
+ const [expanded, setExpanded] = useState(() => interactive && (incomplete || decidedCount > 0 || (total > 1 && !showDiffs)));
108
115
  const bodyId = useId();
109
116
  const wholeSetSubmitting = submittingDecisionKeys.has(setId);
110
117
  const wholeSetError = decisionErrors.get(setId) ?? null;
@@ -145,14 +152,18 @@ export const FileReviewCard = memo(function FileReviewCard({ fileChangeSet, onSu
145
152
  fileReviewability(change).kind === "binary",
146
153
  });
147
154
  }, [onSubmit]);
155
+ // The set's aggregate `+N −M`, summed from the capture-time per-file counts
156
+ // (linesAdded/linesRemoved are stamped by the runner with the same diff
157
+ // algorithm the renderers use — see CapturedFileChange). A file with no
158
+ // counts (binary, secret-withheld, or a record predating the fields)
159
+ // contributes zero; when NO file has counts the aggregate is hidden rather
160
+ // than shown as a dishonest "+0 −0".
148
161
  const totals = useMemo(() => {
149
162
  let additions = 0;
150
163
  let deletions = 0;
151
164
  for (const c of changes) {
152
- if (c.kind === FileChangeKind.ADD)
153
- additions += 1;
154
- else if (c.kind === FileChangeKind.DELETE)
155
- deletions += 1;
165
+ additions += c.linesAdded;
166
+ deletions += c.linesRemoved;
156
167
  }
157
168
  return { additions, deletions };
158
169
  }, [changes]);
@@ -189,7 +200,7 @@ export const FileReviewCard = memo(function FileReviewCard({ fileChangeSet, onSu
189
200
  // historical record, so a neutral group without the warning accent.
190
201
  role: interactive ? "alert" : "group", "aria-label": interactive
191
202
  ? `Review ${total} file change${total === 1 ? "" : "s"}`
192
- : `${total} file change${total === 1 ? "" : "s"}`, className: cn("rounded-lg border border-border-prominent", interactive && "border-l-2 border-l-warning", className), children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 px-2.5 py-1.5 text-xs", children: [_jsx("span", { className: "shrink-0 font-medium text-foreground", children: interactive ? "Review file changes" : "File changes" }), _jsx("span", { className: "min-w-0 flex-1 truncate text-muted-foreground", children: summary }), interactive && showBulkControls && (_jsxs(_Fragment, { children: [_jsx(DecisionButton, { label: labels.approve, variant: "primary", onClick: () => handleBulk(FileDecisionAction.APPROVE), isActive: activeAction === FileDecisionAction.APPROVE, isSubmitting: wholeSetSubmitting, disabled: incomplete && !binaryOnly, ariaDescribedby: incomplete ? incompleteNoticeId : undefined, cursorTarget: "file-review-approve" }), _jsx(DecisionButton, { label: labels.reject, variant: "danger", onClick: () => handleBulk(FileDecisionAction.REJECT), isActive: activeAction === FileDecisionAction.REJECT, isSubmitting: wholeSetSubmitting, cursorTarget: "file-review-reject" })] })), _jsxs("button", { type: "button", "aria-expanded": expanded, "aria-controls": bodyId, onClick: () => setExpanded((v) => !v), "data-cursor-target": "file-review-expander", className: cn("inline-flex shrink-0 items-center gap-1 rounded-md border border-border px-2 py-1", "text-xs font-medium text-muted-foreground transition-colors", "hover:bg-accent-hover hover:text-foreground", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: [expanded ? "Hide" : !interactive ? "Show" : showDiffs ? "Review" : "Files", _jsx(ExpanderChevron, { expanded: expanded })] })] }), interactive && incomplete && showBulkControls && (_jsx("p", { id: incompleteNoticeId, className: "px-2.5 pb-1.5 text-[11px] italic text-muted-foreground", children: incompleteNotice(showPerFile, blockSummary, binaryOnly) })), interactive && wholeSetError && (_jsx("div", { className: "px-2.5 pb-1.5", children: _jsx(InCardDecisionError, { error: wholeSetError, leadIn: "submit decision", cursorTarget: "file-review-error" }) })), expanded && (_jsxs("div", { id: bodyId, className: "space-y-2 border-t border-border-muted px-3 py-2.5", children: [showDiffs && (_jsx(DiffSummary, { fileCount: total, additions: totals.additions, deletions: totals.deletions })), !interactive
203
+ : `${total} file change${total === 1 ? "" : "s"}`, className: cn("rounded-lg border border-border-prominent", interactive && "border-l-2 border-l-warning", className), children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 px-2.5 py-1.5 text-xs", children: [_jsx("span", { className: "shrink-0 font-medium text-foreground", children: interactive ? "Review file changes" : "File changes" }), _jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [_jsx("span", { className: "min-w-0 truncate text-muted-foreground", children: summary }), _jsx(FileLineStats, { linesAdded: totals.additions, linesRemoved: totals.deletions })] }), interactive && showBulkControls && (_jsxs(_Fragment, { children: [_jsx(DecisionButton, { label: labels.approve, variant: "primary", onClick: () => handleBulk(FileDecisionAction.APPROVE), isActive: activeAction === FileDecisionAction.APPROVE, isSubmitting: wholeSetSubmitting, disabled: incomplete && !binaryOnly, ariaDescribedby: incomplete ? incompleteNoticeId : undefined, cursorTarget: "file-review-approve" }), _jsx(DecisionButton, { label: labels.reject, variant: "danger", onClick: () => handleBulk(FileDecisionAction.REJECT), isActive: activeAction === FileDecisionAction.REJECT, isSubmitting: wholeSetSubmitting, cursorTarget: "file-review-reject" })] })), _jsxs("button", { type: "button", "aria-expanded": expanded, "aria-controls": bodyId, onClick: () => setExpanded((v) => !v), "data-cursor-target": "file-review-expander", className: cn("inline-flex shrink-0 items-center gap-1 rounded-md border border-border px-2 py-1", "text-xs font-medium text-muted-foreground transition-colors", "hover:bg-accent-hover hover:text-foreground", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: [expanded ? "Hide" : !interactive ? "Show" : showDiffs ? "Review" : "Files", _jsx(ExpanderChevron, { expanded: expanded })] })] }), interactive && incomplete && showBulkControls && (_jsx("p", { id: incompleteNoticeId, className: "px-2.5 pb-1.5 text-[11px] italic text-muted-foreground", children: incompleteNotice(showPerFile, blockSummary, binaryOnly) })), interactive && wholeSetError && (_jsx("div", { className: "px-2.5 pb-1.5", children: _jsx(InCardDecisionError, { error: wholeSetError, leadIn: "submit decision", cursorTarget: "file-review-error" }) })), expanded && (_jsxs("div", { id: bodyId, className: "space-y-2 border-t border-border-muted px-3 py-2.5", children: [showDiffs && (_jsx(DiffSummary, { fileCount: total, additions: totals.additions, deletions: totals.deletions })), !interactive
193
204
  ? // Settled: every file paired with its committed EFFECTIVE
194
205
  // verdict (a bulk decision covers files without their own), no
195
206
  // controls — a record of what changed and how it was decided.
@@ -287,65 +298,24 @@ function CapturedChangeDiff({ change }) {
287
298
  // FileListRow — one file as a compact list line (list mode)
288
299
  // ---------------------------------------------------------------------------
289
300
  /**
290
- * One file of the change set as a compact, deliberately inert list line: kind
291
- * letter, path, provenance badge, and an optional trailing slot (the verdict
301
+ * One file of the change set as a compact list line: kind letter, linked path,
302
+ * `+N −M` stats, provenance badge, and an optional trailing slot (the verdict
292
303
  * control while reviewing; the committed verdict once settled).
293
304
  *
294
- * The path is plain text — not `FilePathLink` — because the list is an
295
- * inventory of what the decision covers, not a navigation surface: the diffs
296
- * live on the transcript's stamped edit rows. The full path stays available on
297
- * hover via `title`. A rename shows its source path so the move reads in one
298
- * line.
305
+ * The path renders through `FilePathLink` — the platform-wide path idiom — so
306
+ * a reviewer can jump from the list to the file itself (the session viewer
307
+ * routes the click into the panel's diff-first viewer; GitHub/copy is the
308
+ * fallback) without leaving the decision surface. Deciding and navigating
309
+ * coexist: the link stops click propagation, so opening a file never fights
310
+ * the row's Keep/Discard controls. A rename shows its source path so the move
311
+ * reads in one line.
299
312
  */
300
313
  function FileListRow({ change, trailing, }) {
301
314
  const path = change.pathAfter || change.pathBefore;
302
- const { dir, base } = splitDisplayPath(path);
303
315
  const renamedFrom = change.kind === FileChangeKind.RENAME && change.pathBefore !== change.pathAfter
304
316
  ? change.pathBefore
305
317
  : "";
306
- return (_jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", "data-cursor-target": "file-review-list-row", children: [_jsx(FileKindBadge, { kind: change.kind }), _jsxs("span", { className: "flex min-w-0 flex-1 items-center font-mono text-xs text-foreground", title: path, children: [renamedFrom && (_jsxs("span", { className: "min-w-0 truncate text-muted-foreground-faint", children: [renamedFrom, "\u00A0\u2192\u00A0"] })), dir && (_jsx("span", { className: "min-w-0 truncate text-muted-foreground-faint", children: dir })), _jsx("span", { className: "shrink-0", children: base })] }), _jsx(CaptureBadge, { change: change }), trailing] }));
307
- }
308
- /** The kind letter, tone, and a11y name for each wire {@link FileChangeKind}. */
309
- const KIND_BADGE = {
310
- [FileChangeKind.ADD]: {
311
- letter: "A",
312
- colorClass: "text-diff-added-fg",
313
- label: "added",
314
- },
315
- [FileChangeKind.MODIFY]: {
316
- letter: "M",
317
- colorClass: "text-diff-hunk-header-fg",
318
- label: "modified",
319
- },
320
- [FileChangeKind.DELETE]: {
321
- letter: "D",
322
- colorClass: "text-diff-removed-fg",
323
- label: "deleted",
324
- },
325
- [FileChangeKind.RENAME]: {
326
- letter: "R",
327
- colorClass: "text-diff-hunk-header-fg",
328
- label: "renamed",
329
- },
330
- // A binary change is a modification whose diff is not text; the letter stays
331
- // M and the binary-ness is told by the row's "Keep anyway" + reason note.
332
- [FileChangeKind.BINARY_CHANGE]: {
333
- letter: "M",
334
- colorClass: "text-diff-hunk-header-fg",
335
- label: "modified (binary)",
336
- },
337
- };
338
- /**
339
- * The single-letter change-kind marker — the same M/A/D visual vocabulary as
340
- * the version-history `DiffFileList`, extended with R for captured renames.
341
- * The letter itself is the non-color channel; the full word is exposed to
342
- * assistive tech. An UNSPECIFIED kind renders nothing rather than guessing.
343
- */
344
- function FileKindBadge({ kind }) {
345
- const badge = KIND_BADGE[kind];
346
- if (!badge)
347
- return null;
348
- return (_jsx("span", { className: cn("shrink-0 font-mono text-[10px] font-bold", badge.colorClass), "aria-label": badge.label, children: badge.letter }));
318
+ return (_jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", "data-cursor-target": "file-review-list-row", children: [_jsx(FileKindBadge, { kind: change.kind }), renamedFrom && (_jsxs("span", { className: "min-w-0 truncate font-mono text-xs text-muted-foreground-faint", children: [renamedFrom, "\u00A0\u2192\u00A0"] })), _jsx(FilePathLink, { path: path, dirDisplay: "dim", className: "min-w-0 flex-1 text-xs" }), _jsx(FileLineStats, { linesAdded: change.linesAdded, linesRemoved: change.linesRemoved }), _jsx(CaptureBadge, { change: change }), trailing] }));
349
319
  }
350
320
  /**
351
321
  * A change's committed verdict as a static badge: APPROVE reads "Kept" (the