@stigmer/react 3.0.9-dev.20260616060535 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/execution/ApprovalCard.d.ts +47 -3
  2. package/execution/ApprovalCard.d.ts.map +1 -1
  3. package/execution/ApprovalCard.js +138 -70
  4. package/execution/ApprovalCard.js.map +1 -1
  5. package/execution/ApprovalContext.d.ts +72 -0
  6. package/execution/ApprovalContext.d.ts.map +1 -0
  7. package/execution/ApprovalContext.js +41 -0
  8. package/execution/ApprovalContext.js.map +1 -0
  9. package/execution/ArtifactCard.d.ts.map +1 -1
  10. package/execution/ArtifactCard.js +3 -1
  11. package/execution/ArtifactCard.js.map +1 -1
  12. package/execution/ArtifactPreviewModal.d.ts.map +1 -1
  13. package/execution/ArtifactPreviewModal.js +5 -3
  14. package/execution/ArtifactPreviewModal.js.map +1 -1
  15. package/execution/EmptyChangeNotice.d.ts +38 -0
  16. package/execution/EmptyChangeNotice.d.ts.map +1 -0
  17. package/execution/EmptyChangeNotice.js +27 -0
  18. package/execution/EmptyChangeNotice.js.map +1 -0
  19. package/execution/FileChangesView.d.ts +81 -0
  20. package/execution/FileChangesView.d.ts.map +1 -0
  21. package/execution/FileChangesView.js +164 -0
  22. package/execution/FileChangesView.js.map +1 -0
  23. package/execution/FilePathLink.d.ts +24 -4
  24. package/execution/FilePathLink.d.ts.map +1 -1
  25. package/execution/FilePathLink.js +31 -9
  26. package/execution/FilePathLink.js.map +1 -1
  27. package/execution/FileReviewCard.d.ts +111 -0
  28. package/execution/FileReviewCard.d.ts.map +1 -0
  29. package/execution/FileReviewCard.js +558 -0
  30. package/execution/FileReviewCard.js.map +1 -0
  31. package/execution/FileReviewContext.d.ts +35 -0
  32. package/execution/FileReviewContext.d.ts.map +1 -0
  33. package/execution/FileReviewContext.js +23 -0
  34. package/execution/FileReviewContext.js.map +1 -0
  35. package/execution/FileReviewDock.d.ts +73 -0
  36. package/execution/FileReviewDock.d.ts.map +1 -0
  37. package/execution/FileReviewDock.js +65 -0
  38. package/execution/FileReviewDock.js.map +1 -0
  39. package/execution/McpToolDetail.d.ts.map +1 -1
  40. package/execution/McpToolDetail.js +38 -5
  41. package/execution/McpToolDetail.js.map +1 -1
  42. package/execution/MessageThread.d.ts +42 -3
  43. package/execution/MessageThread.d.ts.map +1 -1
  44. package/execution/MessageThread.js +263 -18
  45. package/execution/MessageThread.js.map +1 -1
  46. package/execution/PlanArtifactCard.d.ts.map +1 -1
  47. package/execution/PlanArtifactCard.js +3 -1
  48. package/execution/PlanArtifactCard.js.map +1 -1
  49. package/execution/PlanCompletionCard.d.ts +1 -1
  50. package/execution/PlanCompletionCard.js +1 -1
  51. package/execution/ResultView.d.ts +19 -1
  52. package/execution/ResultView.d.ts.map +1 -1
  53. package/execution/ResultView.js +141 -40
  54. package/execution/ResultView.js.map +1 -1
  55. package/execution/SubAgentSection.d.ts.map +1 -1
  56. package/execution/SubAgentSection.js +45 -6
  57. package/execution/SubAgentSection.js.map +1 -1
  58. package/execution/TerminalSession.d.ts +34 -0
  59. package/execution/TerminalSession.d.ts.map +1 -0
  60. package/execution/TerminalSession.js +34 -0
  61. package/execution/TerminalSession.js.map +1 -0
  62. package/execution/TodoCard.d.ts +53 -0
  63. package/execution/TodoCard.d.ts.map +1 -0
  64. package/execution/TodoCard.js +77 -0
  65. package/execution/TodoCard.js.map +1 -0
  66. package/execution/ToolArgsView.d.ts +7 -1
  67. package/execution/ToolArgsView.d.ts.map +1 -1
  68. package/execution/ToolArgsView.js +10 -9
  69. package/execution/ToolArgsView.js.map +1 -1
  70. package/execution/ToolCallDetail.d.ts +10 -1
  71. package/execution/ToolCallDetail.d.ts.map +1 -1
  72. package/execution/ToolCallDetail.js +66 -19
  73. package/execution/ToolCallDetail.js.map +1 -1
  74. package/execution/ToolCallGroup.d.ts +28 -18
  75. package/execution/ToolCallGroup.d.ts.map +1 -1
  76. package/execution/ToolCallGroup.js +39 -148
  77. package/execution/ToolCallGroup.js.map +1 -1
  78. package/execution/ToolCallItem.d.ts +36 -8
  79. package/execution/ToolCallItem.d.ts.map +1 -1
  80. package/execution/ToolCallItem.js +140 -21
  81. package/execution/ToolCallItem.js.map +1 -1
  82. package/execution/ToolRunGroup.d.ts +48 -0
  83. package/execution/ToolRunGroup.d.ts.map +1 -0
  84. package/execution/ToolRunGroup.js +168 -0
  85. package/execution/ToolRunGroup.js.map +1 -0
  86. package/execution/approval-provenance.d.ts +2 -0
  87. package/execution/approval-provenance.d.ts.map +1 -0
  88. package/execution/approval-provenance.js +6 -0
  89. package/execution/approval-provenance.js.map +1 -0
  90. package/execution/artifact-utils.d.ts +0 -10
  91. package/execution/artifact-utils.d.ts.map +1 -1
  92. package/execution/artifact-utils.js +0 -17
  93. package/execution/artifact-utils.js.map +1 -1
  94. package/execution/execution-phases.d.ts +1 -6
  95. package/execution/execution-phases.d.ts.map +1 -1
  96. package/execution/execution-phases.js +4 -14
  97. package/execution/execution-phases.js.map +1 -1
  98. package/execution/file-path-resolver.d.ts +28 -0
  99. package/execution/file-path-resolver.d.ts.map +1 -1
  100. package/execution/file-path-resolver.js +24 -0
  101. package/execution/file-path-resolver.js.map +1 -1
  102. package/execution/file-review-status.d.ts +127 -0
  103. package/execution/file-review-status.d.ts.map +1 -0
  104. package/execution/file-review-status.js +135 -0
  105. package/execution/file-review-status.js.map +1 -0
  106. package/execution/index.d.ts +39 -5
  107. package/execution/index.d.ts.map +1 -1
  108. package/execution/index.js +23 -3
  109. package/execution/index.js.map +1 -1
  110. package/execution/segment-tool-calls.d.ts +46 -0
  111. package/execution/segment-tool-calls.d.ts.map +1 -0
  112. package/execution/segment-tool-calls.js +71 -0
  113. package/execution/segment-tool-calls.js.map +1 -0
  114. package/execution/tool-categories.d.ts +62 -1
  115. package/execution/tool-categories.d.ts.map +1 -1
  116. package/execution/tool-categories.js +96 -2
  117. package/execution/tool-categories.js.map +1 -1
  118. package/execution/tool-presenter.d.ts +38 -2
  119. package/execution/tool-presenter.d.ts.map +1 -1
  120. package/execution/tool-presenter.js +23 -1
  121. package/execution/tool-presenter.js.map +1 -1
  122. package/execution/tool-rendering-primitives.d.ts.map +1 -1
  123. package/execution/tool-rendering-primitives.js +3 -2
  124. package/execution/tool-rendering-primitives.js.map +1 -1
  125. package/execution/useArtifactDownload.d.ts +44 -0
  126. package/execution/useArtifactDownload.d.ts.map +1 -0
  127. package/execution/useArtifactDownload.js +80 -0
  128. package/execution/useArtifactDownload.js.map +1 -0
  129. package/execution/useArtifactDownloadUrl.d.ts +67 -0
  130. package/execution/useArtifactDownloadUrl.d.ts.map +1 -0
  131. package/execution/useArtifactDownloadUrl.js +59 -0
  132. package/execution/useArtifactDownloadUrl.js.map +1 -0
  133. package/execution/useFileChangeContent.d.ts +61 -0
  134. package/execution/useFileChangeContent.d.ts.map +1 -0
  135. package/execution/useFileChangeContent.js +89 -0
  136. package/execution/useFileChangeContent.js.map +1 -0
  137. package/execution/useFileReview.d.ts +89 -0
  138. package/execution/useFileReview.d.ts.map +1 -0
  139. package/execution/useFileReview.js +106 -0
  140. package/execution/useFileReview.js.map +1 -0
  141. package/execution/useSubmitApproval.d.ts +17 -2
  142. package/execution/useSubmitApproval.d.ts.map +1 -1
  143. package/execution/useSubmitApproval.js +27 -23
  144. package/execution/useSubmitApproval.js.map +1 -1
  145. package/execution/useToolOutputContent.d.ts +44 -0
  146. package/execution/useToolOutputContent.d.ts.map +1 -0
  147. package/execution/useToolOutputContent.js +31 -0
  148. package/execution/useToolOutputContent.js.map +1 -0
  149. package/index.d.ts +6 -6
  150. package/index.d.ts.map +1 -1
  151. package/index.js +3 -3
  152. package/index.js.map +1 -1
  153. package/internal/ApprovalPeekBar.d.ts +23 -0
  154. package/internal/ApprovalPeekBar.d.ts.map +1 -0
  155. package/internal/ApprovalPeekBar.js +25 -0
  156. package/internal/ApprovalPeekBar.js.map +1 -0
  157. package/internal/BoundedContent.d.ts +49 -0
  158. package/internal/BoundedContent.d.ts.map +1 -0
  159. package/internal/BoundedContent.js +50 -0
  160. package/internal/BoundedContent.js.map +1 -0
  161. package/internal/DecisionButton.d.ts +47 -0
  162. package/internal/DecisionButton.d.ts.map +1 -0
  163. package/internal/DecisionButton.js +42 -0
  164. package/internal/DecisionButton.js.map +1 -0
  165. package/internal/InCardDecisionError.d.ts +31 -0
  166. package/internal/InCardDecisionError.d.ts.map +1 -0
  167. package/internal/InCardDecisionError.js +23 -0
  168. package/internal/InCardDecisionError.js.map +1 -0
  169. package/internal/RevealToggle.d.ts +36 -0
  170. package/internal/RevealToggle.d.ts.map +1 -0
  171. package/internal/RevealToggle.js +32 -0
  172. package/internal/RevealToggle.js.map +1 -0
  173. package/internal/VirtualizedThread.d.ts +7 -1
  174. package/internal/VirtualizedThread.d.ts.map +1 -1
  175. package/internal/VirtualizedThread.js +7 -3
  176. package/internal/VirtualizedThread.js.map +1 -1
  177. package/internal/useAutoDisclosure.d.ts +34 -0
  178. package/internal/useAutoDisclosure.d.ts.map +1 -0
  179. package/internal/useAutoDisclosure.js +53 -0
  180. package/internal/useAutoDisclosure.js.map +1 -0
  181. package/internal/useElapsedSince.d.ts +30 -0
  182. package/internal/useElapsedSince.d.ts.map +1 -0
  183. package/internal/useElapsedSince.js +70 -0
  184. package/internal/useElapsedSince.js.map +1 -0
  185. package/internal/useIsOverflowing.d.ts +30 -0
  186. package/internal/useIsOverflowing.d.ts.map +1 -0
  187. package/internal/useIsOverflowing.js +47 -0
  188. package/internal/useIsOverflowing.js.map +1 -0
  189. package/internal/useIsTextTruncated.d.ts +24 -0
  190. package/internal/useIsTextTruncated.d.ts.map +1 -0
  191. package/internal/useIsTextTruncated.js +41 -0
  192. package/internal/useIsTextTruncated.js.map +1 -0
  193. package/internal/useKeyedSubmission.d.ts +49 -0
  194. package/internal/useKeyedSubmission.d.ts.map +1 -0
  195. package/internal/useKeyedSubmission.js +67 -0
  196. package/internal/useKeyedSubmission.js.map +1 -0
  197. package/package.json +4 -4
  198. package/session/SessionViewer.d.ts +2 -2
  199. package/session/SessionViewer.d.ts.map +1 -1
  200. package/session/SessionViewer.js +10 -4
  201. package/session/SessionViewer.js.map +1 -1
  202. package/session/index.d.ts +2 -0
  203. package/session/index.d.ts.map +1 -1
  204. package/session/index.js +1 -0
  205. package/session/index.js.map +1 -1
  206. package/session/inspector/ChangesTab.d.ts +8 -5
  207. package/session/inspector/ChangesTab.d.ts.map +1 -1
  208. package/session/inspector/ChangesTab.js +11 -8
  209. package/session/inspector/ChangesTab.js.map +1 -1
  210. package/session/inspector/SessionInspector.d.ts +4 -4
  211. package/session/inspector/SessionInspector.d.ts.map +1 -1
  212. package/session/inspector/SessionInspector.js +4 -4
  213. package/session/inspector/SessionInspector.js.map +1 -1
  214. package/session/inspector/index.d.ts +0 -2
  215. package/session/inspector/index.d.ts.map +1 -1
  216. package/session/inspector/index.js +0 -1
  217. package/session/inspector/index.js.map +1 -1
  218. package/session/inspector/useSessionInspector.d.ts +8 -4
  219. package/session/inspector/useSessionInspector.d.ts.map +1 -1
  220. package/session/inspector/useSessionInspector.js +27 -20
  221. package/session/inspector/useSessionInspector.js.map +1 -1
  222. package/session/useSessionConversation.d.ts +37 -3
  223. package/session/useSessionConversation.d.ts.map +1 -1
  224. package/session/useSessionConversation.js +18 -2
  225. package/session/useSessionConversation.js.map +1 -1
  226. package/session/useSessionFileChanges.d.ts +74 -0
  227. package/session/useSessionFileChanges.d.ts.map +1 -0
  228. package/session/useSessionFileChanges.js +178 -0
  229. package/session/useSessionFileChanges.js.map +1 -0
  230. package/src/__tests__/styles-border-layer-invariant.test.ts +105 -0
  231. package/src/execution/ApprovalCard.tsx +368 -230
  232. package/src/execution/ApprovalContext.ts +109 -0
  233. package/src/execution/ArtifactCard.tsx +10 -6
  234. package/src/execution/ArtifactPreviewModal.tsx +12 -6
  235. package/src/execution/EmptyChangeNotice.tsx +62 -0
  236. package/src/execution/FileChangesView.tsx +383 -0
  237. package/src/execution/FilePathLink.tsx +65 -12
  238. package/src/execution/FileReviewCard.tsx +1118 -0
  239. package/src/execution/FileReviewContext.ts +53 -0
  240. package/src/execution/FileReviewDock.tsx +157 -0
  241. package/src/execution/McpToolDetail.tsx +98 -32
  242. package/src/execution/MessageThread.tsx +374 -9
  243. package/src/execution/PlanArtifactCard.tsx +9 -6
  244. package/src/execution/PlanCompletionCard.tsx +1 -1
  245. package/src/execution/ResultView.tsx +333 -162
  246. package/src/execution/SubAgentSection.tsx +58 -11
  247. package/src/execution/TerminalSession.tsx +91 -0
  248. package/src/execution/TodoCard.tsx +186 -0
  249. package/src/execution/ToolArgsView.tsx +28 -17
  250. package/src/execution/ToolCallDetail.tsx +137 -26
  251. package/src/execution/ToolCallGroup.tsx +68 -296
  252. package/src/execution/ToolCallItem.tsx +265 -67
  253. package/src/execution/ToolRunGroup.tsx +302 -0
  254. package/src/execution/__tests__/ApprovalCard.test.tsx +395 -5
  255. package/src/execution/__tests__/ArtifactPreviewModal.test.tsx +0 -1
  256. package/src/execution/__tests__/EmptyChangeNotice.test.tsx +24 -0
  257. package/src/execution/__tests__/FileChangesView.test.tsx +296 -0
  258. package/src/execution/__tests__/FilePathLink.test.tsx +92 -0
  259. package/src/execution/__tests__/FileReviewCard.test.tsx +1044 -0
  260. package/src/execution/__tests__/FileReviewDock.test.tsx +134 -0
  261. package/src/execution/__tests__/McpToolDetail.test.tsx +79 -0
  262. package/src/execution/__tests__/MessageThread.test.tsx +324 -0
  263. package/src/execution/__tests__/PlanArtifactCard.test.tsx +37 -16
  264. package/src/execution/__tests__/ResultView.test.tsx +280 -2
  265. package/src/execution/__tests__/SubAgentSection.test.tsx +180 -0
  266. package/src/execution/__tests__/TerminalSession.test.tsx +72 -0
  267. package/src/execution/__tests__/TodoCard.test.tsx +102 -0
  268. package/src/execution/__tests__/ToolArgsView.test.tsx +48 -0
  269. package/src/execution/__tests__/ToolCallDetail.test.tsx +195 -0
  270. package/src/execution/__tests__/ToolCallGroup.test.tsx +132 -0
  271. package/src/execution/__tests__/ToolCallItem.test.tsx +521 -0
  272. package/src/execution/__tests__/ToolRunGroup.test.tsx +137 -0
  273. package/src/execution/__tests__/blanked-narration.test.tsx +149 -0
  274. package/src/execution/__tests__/buildThreadItems-approvals.test.ts +304 -0
  275. package/src/execution/__tests__/buildThreadItems-file-review.test.ts +331 -0
  276. package/src/execution/__tests__/file-path-resolver.test.ts +44 -0
  277. package/src/execution/__tests__/file-review-status.test.ts +343 -0
  278. package/src/execution/__tests__/segment-tool-calls.test.ts +124 -0
  279. package/src/execution/__tests__/subagent-file-review-badge.test.tsx +273 -0
  280. package/src/execution/__tests__/thread-keys.test.ts +195 -0
  281. package/src/execution/__tests__/tool-presenter.test.tsx +95 -0
  282. package/src/execution/__tests__/useArtifactDownload.test.tsx +67 -0
  283. package/src/execution/__tests__/useArtifactDownloadUrl.test.tsx +51 -0
  284. package/src/execution/__tests__/useFileChangeContent.test.tsx +240 -0
  285. package/src/execution/__tests__/useFileReview.test.tsx +236 -0
  286. package/src/execution/__tests__/useSubmitApproval.test.tsx +165 -0
  287. package/src/execution/__tests__/useToolOutputContent.test.tsx +82 -0
  288. package/src/execution/approval-provenance.ts +8 -0
  289. package/src/execution/artifact-utils.ts +0 -18
  290. package/src/execution/execution-phases.ts +4 -16
  291. package/src/execution/file-path-resolver.ts +38 -0
  292. package/src/execution/file-review-status.ts +219 -0
  293. package/src/execution/index.ts +84 -4
  294. package/src/execution/segment-tool-calls.ts +101 -0
  295. package/src/execution/tool-categories.ts +128 -1
  296. package/src/execution/tool-presenter.ts +58 -3
  297. package/src/execution/tool-rendering-primitives.tsx +11 -14
  298. package/src/execution/useArtifactDownload.ts +109 -0
  299. package/src/execution/useArtifactDownloadUrl.ts +116 -0
  300. package/src/execution/useFileChangeContent.ts +149 -0
  301. package/src/execution/useFileReview.ts +197 -0
  302. package/src/execution/useSubmitApproval.ts +49 -27
  303. package/src/execution/useToolOutputContent.ts +70 -0
  304. package/src/index.ts +60 -1
  305. package/src/internal/ApprovalPeekBar.tsx +73 -0
  306. package/src/internal/BoundedContent.tsx +97 -0
  307. package/src/internal/DecisionButton.tsx +127 -0
  308. package/src/internal/InCardDecisionError.tsx +47 -0
  309. package/src/internal/RevealToggle.tsx +91 -0
  310. package/src/internal/VirtualizedThread.tsx +28 -2
  311. package/src/internal/__tests__/ApprovalPeekBar.test.tsx +34 -0
  312. package/src/internal/__tests__/BoundedContent.test.tsx +92 -0
  313. package/src/internal/__tests__/DecisionButton.test.tsx +107 -0
  314. package/src/internal/__tests__/RevealToggle.test.tsx +61 -0
  315. package/src/internal/__tests__/useAutoDisclosure.test.ts +74 -0
  316. package/src/internal/__tests__/useElapsedSince.test.tsx +68 -0
  317. package/src/internal/__tests__/useIsOverflowing.test.ts +36 -0
  318. package/src/internal/__tests__/useKeyedSubmission.test.tsx +126 -0
  319. package/src/internal/useAutoDisclosure.ts +58 -0
  320. package/src/internal/useElapsedSince.ts +72 -0
  321. package/src/internal/useIsOverflowing.ts +61 -0
  322. package/src/internal/useIsTextTruncated.ts +55 -0
  323. package/src/internal/useKeyedSubmission.ts +101 -0
  324. package/src/session/SessionViewer.tsx +21 -4
  325. package/src/session/__tests__/SessionViewer-fileReviewDock.test.tsx +198 -0
  326. package/src/session/__tests__/audienceWiring.test.tsx +4 -0
  327. package/src/session/__tests__/useSessionFileChanges.test.ts +303 -0
  328. package/src/session/index.ts +3 -0
  329. package/src/session/inspector/ChangesTab.tsx +20 -17
  330. package/src/session/inspector/SessionInspector.tsx +12 -10
  331. package/src/session/inspector/__tests__/ArtifactsTab.test.tsx +0 -1
  332. package/src/session/inspector/__tests__/ChangesTab.test.tsx +38 -0
  333. package/src/session/inspector/__tests__/useSessionInspector.test.ts +46 -61
  334. package/src/session/inspector/index.ts +0 -3
  335. package/src/session/inspector/useSessionInspector.ts +27 -20
  336. package/src/session/useSessionConversation.ts +80 -3
  337. package/src/session/useSessionFileChanges.ts +207 -0
  338. package/src/styles.css +35 -10
  339. package/src/version-history/DiffViewer.tsx +10 -7
  340. package/src/version-history/UnifiedDiffView.tsx +66 -0
  341. package/src/version-history/__tests__/DiffViewer.test.tsx +57 -0
  342. package/src/version-history/__tests__/UnifiedDiffView.test.tsx +50 -0
  343. package/src/version-history/__tests__/computeDiff.test.ts +35 -0
  344. package/src/version-history/__tests__/parseUnifiedDiff.test.ts +82 -0
  345. package/src/version-history/computeDiff.ts +6 -37
  346. package/src/version-history/diff-hunks.ts +63 -0
  347. package/src/version-history/index.ts +1 -0
  348. package/src/version-history/parseUnifiedDiff.ts +34 -0
  349. package/src/workflow/WorkflowExecutionApprovalCard.tsx +49 -24
  350. package/src/workflow/WorkflowExecutionTimeline.tsx +15 -4
  351. package/src/workflow/WorkflowExecutionTimelineEvent.tsx +8 -3
  352. package/src/workflow/WorkflowExecutionViewer.tsx +72 -28
  353. package/src/workflow/WorkflowFileReviewList.tsx +152 -0
  354. package/src/workflow/WorkflowTaskApprovalCard.tsx +37 -85
  355. package/src/workflow/__tests__/ExecutionInspector.test.tsx +30 -2
  356. package/src/workflow/__tests__/WorkflowExecutionApprovalCard.test.tsx +129 -0
  357. package/src/workflow/__tests__/WorkflowFileReviewList.test.tsx +129 -0
  358. package/src/workflow/__tests__/WorkflowTaskApprovalCard.test.tsx +43 -11
  359. package/src/workflow/__tests__/useWorkflowExecutionActions.test.tsx +276 -0
  360. package/src/workflow/execution-inspector/ExecutionInspector.tsx +42 -18
  361. package/src/workflow/index.ts +5 -0
  362. package/src/workflow/useWorkflowExecutionActions.ts +177 -29
  363. package/styles.css +1 -1
  364. package/version-history/DiffViewer.d.ts.map +1 -1
  365. package/version-history/DiffViewer.js +9 -3
  366. package/version-history/DiffViewer.js.map +1 -1
  367. package/version-history/UnifiedDiffView.d.ts +29 -0
  368. package/version-history/UnifiedDiffView.d.ts.map +1 -0
  369. package/version-history/UnifiedDiffView.js +36 -0
  370. package/version-history/UnifiedDiffView.js.map +1 -0
  371. package/version-history/computeDiff.d.ts +3 -1
  372. package/version-history/computeDiff.d.ts.map +1 -1
  373. package/version-history/computeDiff.js +5 -35
  374. package/version-history/computeDiff.js.map +1 -1
  375. package/version-history/diff-hunks.d.ts +21 -0
  376. package/version-history/diff-hunks.d.ts.map +1 -0
  377. package/version-history/diff-hunks.js +58 -0
  378. package/version-history/diff-hunks.js.map +1 -0
  379. package/version-history/index.d.ts +1 -0
  380. package/version-history/index.d.ts.map +1 -1
  381. package/version-history/index.js +1 -0
  382. package/version-history/index.js.map +1 -1
  383. package/version-history/parseUnifiedDiff.d.ts +22 -0
  384. package/version-history/parseUnifiedDiff.d.ts.map +1 -0
  385. package/version-history/parseUnifiedDiff.js +34 -0
  386. package/version-history/parseUnifiedDiff.js.map +1 -0
  387. package/workflow/WorkflowExecutionApprovalCard.d.ts +8 -1
  388. package/workflow/WorkflowExecutionApprovalCard.d.ts.map +1 -1
  389. package/workflow/WorkflowExecutionApprovalCard.js +17 -3
  390. package/workflow/WorkflowExecutionApprovalCard.js.map +1 -1
  391. package/workflow/WorkflowExecutionTimeline.d.ts +11 -2
  392. package/workflow/WorkflowExecutionTimeline.d.ts.map +1 -1
  393. package/workflow/WorkflowExecutionTimeline.js +2 -2
  394. package/workflow/WorkflowExecutionTimeline.js.map +1 -1
  395. package/workflow/WorkflowExecutionTimelineEvent.d.ts +4 -1
  396. package/workflow/WorkflowExecutionTimelineEvent.d.ts.map +1 -1
  397. package/workflow/WorkflowExecutionTimelineEvent.js +2 -2
  398. package/workflow/WorkflowExecutionTimelineEvent.js.map +1 -1
  399. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  400. package/workflow/WorkflowExecutionViewer.js +18 -10
  401. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  402. package/workflow/WorkflowFileReviewList.d.ts +46 -0
  403. package/workflow/WorkflowFileReviewList.d.ts.map +1 -0
  404. package/workflow/WorkflowFileReviewList.js +48 -0
  405. package/workflow/WorkflowFileReviewList.js.map +1 -0
  406. package/workflow/WorkflowTaskApprovalCard.d.ts +8 -1
  407. package/workflow/WorkflowTaskApprovalCard.d.ts.map +1 -1
  408. package/workflow/WorkflowTaskApprovalCard.js +12 -19
  409. package/workflow/WorkflowTaskApprovalCard.js.map +1 -1
  410. package/workflow/execution-inspector/ExecutionInspector.d.ts +21 -4
  411. package/workflow/execution-inspector/ExecutionInspector.d.ts.map +1 -1
  412. package/workflow/execution-inspector/ExecutionInspector.js +6 -3
  413. package/workflow/execution-inspector/ExecutionInspector.js.map +1 -1
  414. package/workflow/index.d.ts +1 -0
  415. package/workflow/index.d.ts.map +1 -1
  416. package/workflow/index.js +1 -0
  417. package/workflow/index.js.map +1 -1
  418. package/workflow/useWorkflowExecutionActions.d.ts +62 -4
  419. package/workflow/useWorkflowExecutionActions.d.ts.map +1 -1
  420. package/workflow/useWorkflowExecutionActions.js +94 -18
  421. package/workflow/useWorkflowExecutionActions.js.map +1 -1
  422. package/session/inspector/PlanTab.d.ts +0 -15
  423. package/session/inspector/PlanTab.d.ts.map +0 -1
  424. package/session/inspector/PlanTab.js +0 -19
  425. package/session/inspector/PlanTab.js.map +0 -1
  426. package/src/session/inspector/PlanTab.tsx +0 -31
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { memo, useMemo, useState } from "react";
3
+ import { memo, useContext, useMemo } from "react";
4
4
  import type { SubAgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/subagent_pb";
5
5
  import type { TodoItem } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/todo_pb";
6
6
  import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
@@ -9,10 +9,13 @@ import {
9
9
  SubAgentStatus,
10
10
  } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
11
11
  import { useRenderTracer } from "../internal/dev";
12
+ import { useAutoDisclosure } from "../internal/useAutoDisclosure";
13
+ import { useElapsedSince, formatElapsed } from "../internal/useElapsedSince";
12
14
  import { cn } from "@stigmer/theme";
13
15
  import { formatDuration } from "./ToolCallDetail";
14
16
  import { MessageEntry } from "./MessageEntry";
15
17
  import { ToolCallGroup } from "./ToolCallGroup";
18
+ import { ApprovalContext } from "./ApprovalContext";
16
19
  import { isInternalTool } from "./tool-categories";
17
20
  import { useThreadSelection } from "./useThreadSelection";
18
21
  import {
@@ -144,17 +147,33 @@ function CollapsibleCard({
144
147
  selection,
145
148
  className,
146
149
  }: CollapsibleCardProps) {
147
- const [expanded, setExpanded] = useState(false);
148
-
149
- const handleToggle = () => {
150
- setExpanded((v) => !v);
151
- };
152
-
153
150
  const hasTodos =
154
151
  sub.todos != null && Object.keys(sub.todos).length > 0;
155
152
  const isRunning = sub.status === SubAgentStatus.SUB_AGENT_IN_PROGRESS;
156
153
  const isCompleted = sub.status === SubAgentStatus.SUB_AGENT_COMPLETED;
157
154
 
155
+ // A gate raised inside this sub-agent must be reachable: a delegated tool
156
+ // can stop the run just like a top-level one. We detect one of this
157
+ // sub-agent's tool calls awaiting approval and auto-open so its inline
158
+ // approval (rendered by the nested ToolCallItem) is visible without a click.
159
+ const { approvalsByToolCallId } = useContext(ApprovalContext);
160
+ const hasPendingApprovalInside = useMemo(() => {
161
+ if (approvalsByToolCallId.size === 0) return false;
162
+ for (const msg of sub.messages) {
163
+ if (msg.type !== MessageType.MESSAGE_AI) continue;
164
+ for (const tc of msg.toolCalls) {
165
+ if (tc.id && approvalsByToolCallId.has(tc.id)) return true;
166
+ }
167
+ }
168
+ return false;
169
+ }, [sub.messages, approvalsByToolCallId]);
170
+
171
+ // Open while running or while a nested gate waits; settle closed (keeping the
172
+ // todo/summary preview) when done — unless the user takes manual control.
173
+ const [expanded, handleToggle] = useAutoDisclosure(
174
+ isRunning || hasPendingApprovalInside,
175
+ );
176
+
158
177
  const activeTodo = useMemo(() => findActiveTodo(sub.todos), [sub.todos]);
159
178
  const completionLabel = useMemo(
160
179
  () => (isCompleted && hasTodos ? todoCompletionSummary(sub.todos) : null),
@@ -207,10 +226,14 @@ function CollapsibleCard({
207
226
  >
208
227
  {statusInfo.label}
209
228
  </span>
210
- {duration && (
211
- <span className="shrink-0 tabular-nums text-muted-foreground">
212
- {duration}
213
- </span>
229
+ {isRunning ? (
230
+ <RunningDuration startedAt={sub.startedAt} />
231
+ ) : (
232
+ duration && (
233
+ <span className="shrink-0 tabular-nums text-muted-foreground">
234
+ {duration}
235
+ </span>
236
+ )
214
237
  )}
215
238
  {selection && (
216
239
  <button
@@ -271,6 +294,30 @@ function CollapsibleCard({
271
294
  );
272
295
  }
273
296
 
297
+ /**
298
+ * Ticking elapsed time for an IN_PROGRESS sub-agent's header, where the
299
+ * static duration (which needs `completedAt`) is still null.
300
+ *
301
+ * This is the honest live affordance for a running sub-agent: the Cursor
302
+ * SDK returns sub-agent internals only as a blob when the task tool
303
+ * completes (verified against SDK 1.0.13 and 1.0.22 — zero events reach the
304
+ * parent stream while the sub-agent runs), so there are no nested tool calls
305
+ * to stream here. A counter that visibly advances tells the user work is
306
+ * progressing without fabricating intermediate state. The native harness
307
+ * streams nested messages as they happen; this counter simply accompanies
308
+ * them.
309
+ */
310
+ function RunningDuration({ startedAt }: { readonly startedAt: string }) {
311
+ const elapsed = useElapsedSince(startedAt);
312
+ if (elapsed === null) return null;
313
+
314
+ return (
315
+ <span className="shrink-0 tabular-nums text-muted-foreground">
316
+ {formatElapsed(elapsed)}
317
+ </span>
318
+ );
319
+ }
320
+
274
321
  // ---------------------------------------------------------------------------
275
322
  // Flat content — no toggle (used inside ToolCallItem detail panel)
276
323
  // ---------------------------------------------------------------------------
@@ -0,0 +1,91 @@
1
+ "use client";
2
+
3
+ // One rendered terminal session: the `$ command` prompt line followed by its
4
+ // output, as a single block. Rendered on the same `bg-muted-subtle` surface as
5
+ // every other code/output block (CollapsibleCode, search, list) — not a
6
+ // bespoke dark box — so it tracks the host theme, preset, and color mode.
7
+
8
+ import { cn } from "@stigmer/theme";
9
+ import { CollapsiblePre } from "./tool-rendering-primitives";
10
+ import { useSandboxNormalize } from "./SandboxContext";
11
+
12
+ /** Props for {@link TerminalSession}. */
13
+ export interface TerminalSessionProps {
14
+ /**
15
+ * The command that was run, shown as the `$ <command>` prompt line. Omit for
16
+ * a pure-output render; the pre-execution approval gate passes only this
17
+ * (no output exists yet).
18
+ */
19
+ readonly command?: string;
20
+ /** Standard output. */
21
+ readonly stdout?: string;
22
+ /** Standard error, rendered in the destructive color. */
23
+ readonly stderr?: string;
24
+ /** Process exit code. A non-zero code renders a trailing `exit N` badge. */
25
+ readonly exitCode?: number;
26
+ /** Additional CSS class names for the root container. */
27
+ readonly className?: string;
28
+ }
29
+
30
+ /**
31
+ * Renders a shell tool call as a single, cohesive terminal session — the
32
+ * command prompt line immediately followed by its output — instead of a
33
+ * separate command box and output box.
34
+ *
35
+ * Used by {@link ResultView} (full session) and the approval gate's
36
+ * {@link ToolArgsView} (command-only, pre-execution). Importable on its own by
37
+ * platform builders composing custom tool UIs.
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * <TerminalSession command="ls -la" stdout="total 8\n..." exitCode={0} />
42
+ * <TerminalSession command="npm test" /> // gate: command only
43
+ * ```
44
+ */
45
+ export function TerminalSession({
46
+ command,
47
+ stdout,
48
+ stderr,
49
+ exitCode,
50
+ className,
51
+ }: TerminalSessionProps) {
52
+ const normalize = useSandboxNormalize();
53
+ const failed = exitCode !== undefined && exitCode !== 0;
54
+
55
+ return (
56
+ <div
57
+ data-cursor-target="terminal-session"
58
+ className={cn(
59
+ "space-y-1 rounded-md border border-border bg-muted-subtle p-2.5 font-mono text-xs",
60
+ className,
61
+ )}
62
+ >
63
+ {command && (
64
+ // A plain <pre> (not CollapsiblePre): the command is the user's intent
65
+ // and renders in full — even a multi-line heredoc — without a second
66
+ // truncation toggle competing with stdout's.
67
+ <pre className="whitespace-pre-wrap break-words text-foreground">
68
+ <span className="select-none text-muted-foreground">$ </span>
69
+ {normalize(command)}
70
+ </pre>
71
+ )}
72
+ {stdout && (
73
+ <CollapsiblePre content={normalize(stdout)} className="text-foreground" />
74
+ )}
75
+ {stderr && (
76
+ <CollapsiblePre content={normalize(stderr)} className="text-destructive" />
77
+ )}
78
+ {failed && (
79
+ <div>
80
+ <span className="sr-only">Command exited with code {exitCode}</span>
81
+ <span
82
+ aria-hidden="true"
83
+ className="inline-block rounded bg-destructive-subtle px-1 py-0.5 text-[10px] font-medium leading-none tabular-nums text-destructive"
84
+ >
85
+ exit {exitCode}
86
+ </span>
87
+ </div>
88
+ )}
89
+ </div>
90
+ );
91
+ }
@@ -0,0 +1,186 @@
1
+ "use client";
2
+
3
+ import { memo, useMemo } from "react";
4
+ import type { TodoItem } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/todo_pb";
5
+ import { TodoStatus } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
6
+ import { cn } from "@stigmer/theme";
7
+ import { useRenderTracer } from "../internal/dev";
8
+ import { useAutoDisclosure } from "../internal/useAutoDisclosure";
9
+ import { TodoList, findActiveTodo, todoCompletionSummary } from "./TodoList";
10
+
11
+ /** Props for {@link TodoCard}. */
12
+ export interface TodoCardProps {
13
+ /**
14
+ * The agent's todo map for one execution — the proto map shape
15
+ * (`execution.status.todos`) passed through by reference so a settled
16
+ * card skips re-renders while siblings stream (DD-009/010).
17
+ */
18
+ readonly todos: { readonly [key: string]: TodoItem };
19
+ /** Additional CSS class names for the root container. */
20
+ readonly className?: string;
21
+ }
22
+
23
+ /**
24
+ * The agent's plan, rendered inline in the message thread as a collapsible
25
+ * card — the Cursor-style "what I'm going to do, and how far I've got"
26
+ * surface. It is the in-thread home of the todo list that previously lived
27
+ * in the right-side Plan tab.
28
+ *
29
+ * The card chrome matches the rest of the thread's tool cards (a single
30
+ * neutral {@link https://tailwindcss.com `border-border-prominent`} line) and
31
+ * wraps the chrome-less {@link TodoList} primitive — the same list the
32
+ * sub-agent section renders bare, so there is exactly one todo renderer and no
33
+ * card-in-a-card.
34
+ *
35
+ * Disclosure follows the thread's {@link useAutoDisclosure} convention: open
36
+ * while the plan is active (any item in progress), settling closed once the
37
+ * plan is fully resolved, with a user's manual toggle always winning. This
38
+ * keeps an in-flight plan visible and a finished one tidy, mirroring
39
+ * `ToolRunGroup`/{@link SubAgentSection}.
40
+ *
41
+ * `React.memo`'d on the by-reference `todos` map: structural sharing
42
+ * (`shareTodos`) keeps the reference stable across stream frames, so the card
43
+ * re-renders only when the plan actually changes — never per frame.
44
+ *
45
+ * All visual properties flow through `--stgm-*` tokens.
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * <TodoCard todos={execution.status?.todos ?? {}} />
50
+ * ```
51
+ */
52
+ export const TodoCard = memo(function TodoCard({
53
+ todos,
54
+ className,
55
+ }: TodoCardProps) {
56
+ useRenderTracer("TodoCard", { todos });
57
+
58
+ const count = Object.keys(todos).length;
59
+ const isActive = findActiveTodo(todos) != null;
60
+ const summary = todoCompletionSummary(todos);
61
+ const allDone = useMemo(
62
+ () =>
63
+ count > 0 &&
64
+ Object.values(todos).every(
65
+ (t) =>
66
+ t.status === TodoStatus.TODO_COMPLETED ||
67
+ t.status === TodoStatus.TODO_CANCELLED,
68
+ ),
69
+ [todos, count],
70
+ );
71
+
72
+ // Open while the plan is being worked, tidy once it is fully resolved; a
73
+ // manual toggle wins for the card's lifetime. A completed plan in session
74
+ // history therefore renders collapsed.
75
+ const [expanded, handleToggle] = useAutoDisclosure(isActive);
76
+
77
+ // buildThreadItems only emits this item when todos exist, but guard anyway
78
+ // so the component is safe to use standalone.
79
+ if (count === 0) return null;
80
+
81
+ return (
82
+ <div
83
+ role="region"
84
+ aria-label="Agent to-dos"
85
+ data-cursor-target="todo-card"
86
+ className={cn(
87
+ "rounded-lg border border-border-prominent overflow-hidden",
88
+ className,
89
+ )}
90
+ >
91
+ <button
92
+ type="button"
93
+ aria-expanded={expanded}
94
+ onClick={handleToggle}
95
+ className={cn(
96
+ "flex w-full cursor-pointer items-center gap-2 px-2.5 py-1.5 text-left text-xs text-muted-foreground transition-colors",
97
+ "hover:bg-muted-subtle",
98
+ // ring-inset so the card's overflow-hidden does not clip the focus ring.
99
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",
100
+ )}
101
+ >
102
+ <span
103
+ className={cn(
104
+ "shrink-0",
105
+ allDone ? "text-success" : "text-muted-foreground",
106
+ )}
107
+ aria-hidden="true"
108
+ >
109
+ <PlanIcon />
110
+ </span>
111
+ <span className="min-w-0 flex-1 truncate font-medium text-foreground">
112
+ To-dos
113
+ </span>
114
+ {summary && (
115
+ <span className="shrink-0 tabular-nums text-muted-foreground">
116
+ {summary}
117
+ </span>
118
+ )}
119
+ <ChevronIcon expanded={expanded} />
120
+ </button>
121
+
122
+ {expanded && (
123
+ <div className="border-t border-border-muted px-2.5 py-2">
124
+ <TodoList todos={todos} />
125
+ </div>
126
+ )}
127
+ </div>
128
+ );
129
+ }, todoCardPropsEqual);
130
+
131
+ /**
132
+ * Shallow comparator for {@link TodoCardProps}. The `todos` map is kept
133
+ * referentially stable by `shareTodos`, so an identity check is exactly the
134
+ * right (and cheapest) "did the plan change?" test.
135
+ *
136
+ * @internal Exported for testing — not part of the public API.
137
+ */
138
+ export function todoCardPropsEqual(
139
+ prev: Readonly<TodoCardProps>,
140
+ next: Readonly<TodoCardProps>,
141
+ ): boolean {
142
+ return prev.todos === next.todos && prev.className === next.className;
143
+ }
144
+
145
+ // ---------------------------------------------------------------------------
146
+ // Inline SVG icons — kept inline for SDK independence (codebase pattern)
147
+ // ---------------------------------------------------------------------------
148
+
149
+ function PlanIcon() {
150
+ return (
151
+ <svg
152
+ width="12"
153
+ height="12"
154
+ viewBox="0 0 12 12"
155
+ fill="none"
156
+ stroke="currentColor"
157
+ strokeWidth="1.5"
158
+ strokeLinecap="round"
159
+ strokeLinejoin="round"
160
+ >
161
+ <path d="M2 3h8M2 6h6M2 9h7" />
162
+ </svg>
163
+ );
164
+ }
165
+
166
+ function ChevronIcon({ expanded }: { expanded: boolean }) {
167
+ return (
168
+ <svg
169
+ width="10"
170
+ height="10"
171
+ viewBox="0 0 10 10"
172
+ fill="none"
173
+ stroke="currentColor"
174
+ strokeWidth="1.5"
175
+ strokeLinecap="round"
176
+ strokeLinejoin="round"
177
+ className={cn(
178
+ "shrink-0 text-muted-foreground transition-transform duration-150",
179
+ expanded && "rotate-90",
180
+ )}
181
+ aria-hidden="true"
182
+ >
183
+ <path d="M3.5 2L6.5 5L3.5 8" />
184
+ </svg>
185
+ );
186
+ }
@@ -9,7 +9,7 @@ import {
9
9
  import type { ToolCategory, ToolCategoryInfo } from "./tool-categories";
10
10
  import { FilePathLink } from "./FilePathLink";
11
11
  import { McpArgsView, McpMetadataRow } from "./McpToolDetail";
12
- import { useSandboxNormalize } from "./SandboxContext";
12
+ import { TerminalSession } from "./TerminalSession";
13
13
  import {
14
14
  CollapsibleCode,
15
15
  FilePathIcon,
@@ -34,6 +34,12 @@ export interface ToolArgsViewProps {
34
34
  readonly args: Record<string, unknown> | null;
35
35
  /** MCP server slug for MCP tool classification and metadata. */
36
36
  readonly mcpServerSlug?: string;
37
+ /**
38
+ * Whether the file-tool view renders the path row. Defaults to `true`. Set to
39
+ * `false` where an ancestor already names the file (the approval gate header),
40
+ * so the write/edit content shows without restating the path.
41
+ */
42
+ readonly showFileName?: boolean;
37
43
  /** Additional CSS class names for the root container. */
38
44
  readonly className?: string;
39
45
  }
@@ -66,6 +72,7 @@ export function ToolArgsView({
66
72
  toolName,
67
73
  args,
68
74
  mcpServerSlug,
75
+ showFileName = true,
69
76
  className,
70
77
  }: ToolArgsViewProps) {
71
78
  const categoryInfo = useMemo(
@@ -86,6 +93,7 @@ export function ToolArgsView({
86
93
  args={args}
87
94
  primaryArg={primaryArg}
88
95
  mcpServerSlug={mcpServerSlug}
96
+ showFileName={showFileName}
89
97
  />
90
98
  </div>
91
99
  );
@@ -101,12 +109,14 @@ function CategoryArgsDispatch({
101
109
  args,
102
110
  primaryArg,
103
111
  mcpServerSlug,
112
+ showFileName,
104
113
  }: {
105
114
  category: ToolCategory;
106
115
  toolName: string;
107
116
  args: Record<string, unknown> | null;
108
117
  primaryArg: string | null;
109
118
  mcpServerSlug?: string;
119
+ showFileName: boolean;
110
120
  }) {
111
121
  switch (category) {
112
122
  case "shell":
@@ -117,7 +127,12 @@ function CategoryArgsDispatch({
117
127
  case "edit":
118
128
  case "delete":
119
129
  return primaryArg ? (
120
- <FileArgsView path={primaryArg} category={category} args={args} />
130
+ <FileArgsView
131
+ path={primaryArg}
132
+ category={category}
133
+ args={args}
134
+ showFileName={showFileName}
135
+ />
121
136
  ) : null;
122
137
 
123
138
  case "search":
@@ -144,28 +159,22 @@ function CategoryArgsDispatch({
144
159
  // Category-specific views
145
160
  // ---------------------------------------------------------------------------
146
161
 
162
+ // Pre-execution (approval gate) shell view: the command only, in the same
163
+ // terminal chrome the completed call uses — there is no output yet.
147
164
  function ShellArgsView({ command }: { command: string }) {
148
- const normalize = useSandboxNormalize();
149
- return (
150
- <div className="rounded-md border border-border bg-[var(--stgm-terminal-bg,#1a1a2e)] p-2.5">
151
- <pre className="whitespace-pre-wrap break-words font-mono text-xs text-[var(--stgm-terminal-fg,#e0e0e0)]">
152
- <span className="select-none text-[var(--stgm-terminal-prompt,#6b7280)]">
153
- ${" "}
154
- </span>
155
- {normalize(command)}
156
- </pre>
157
- </div>
158
- );
165
+ return <TerminalSession command={command} />;
159
166
  }
160
167
 
161
168
  function FileArgsView({
162
169
  path,
163
170
  category,
164
171
  args,
172
+ showFileName = true,
165
173
  }: {
166
174
  path: string;
167
175
  category: string;
168
176
  args: Record<string, unknown> | null;
177
+ showFileName?: boolean;
169
178
  }) {
170
179
  const writeContent = useMemo(() => {
171
180
  if (category !== "write" && category !== "edit") return null;
@@ -175,10 +184,12 @@ function FileArgsView({
175
184
 
176
185
  return (
177
186
  <div className="space-y-1.5">
178
- <div className="flex items-center gap-1.5 text-xs">
179
- <FilePathIcon />
180
- <FilePathLink path={path} className="text-xs" />
181
- </div>
187
+ {showFileName && (
188
+ <div className="flex items-center gap-1.5 text-xs">
189
+ <FilePathIcon />
190
+ <FilePathLink path={path} className="text-xs" />
191
+ </div>
192
+ )}
182
193
  {writeContent && (
183
194
  <CollapsibleCode label="Content" content={writeContent} />
184
195
  )}