@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
@@ -0,0 +1,67 @@
1
+ /** Return value of {@link useArtifactDownloadUrl}. */
2
+ export interface UseArtifactDownloadUrlReturn {
3
+ /**
4
+ * A freshly minted presigned download URL for the artifact, or `null` when:
5
+ * - Fetching is skipped (`enabled` is `false`, or `executionId`/`storageKey` is `null`)
6
+ * - The request is in-flight
7
+ * - The request failed
8
+ */
9
+ readonly url: string | null;
10
+ /** `true` while the URL request is in-flight (first load). */
11
+ readonly isLoading: boolean;
12
+ /** `true` while a background refetch is in flight. */
13
+ readonly isRefetching: boolean;
14
+ /** Error from the last failed attempt, or `null` when healthy. */
15
+ readonly error: Error | null;
16
+ /** Re-fetch the URL (e.g. to mint a fresh one after the previous expired). */
17
+ readonly refetch: () => void;
18
+ }
19
+ /** Options for {@link useArtifactDownloadUrl}. */
20
+ export interface UseArtifactDownloadUrlOptions {
21
+ /**
22
+ * Gate the request. When `false`, the hook stays idle and returns `null` —
23
+ * use this to defer minting a URL until it is actually needed (e.g. only
24
+ * when an image becomes visible, or after a truncation is detected).
25
+ * Defaults to `true`.
26
+ */
27
+ readonly enabled?: boolean;
28
+ }
29
+ /**
30
+ * Data hook that resolves a **fresh** presigned download URL for an execution
31
+ * artifact on demand via `stigmer.agentExecution.getArtifactDownloadUrl()`.
32
+ *
33
+ * This exists because presigned URLs expire. The runner once baked a
34
+ * short-lived URL into the persisted execution status and the UI rendered it
35
+ * verbatim — so any link opened after the URL's lifetime failed with
36
+ * `ExpiredRequest`. Minting the URL at view time from the stable `storageKey`
37
+ * guarantees it is always valid, and works for every historical execution
38
+ * (the `storageKey` never expires).
39
+ *
40
+ * Use this for surfaces that genuinely need a URL — an `<img src>` for an
41
+ * offloaded screenshot, or a direct browser download of a large/binary
42
+ * artifact. For text that should render in-app, prefer {@link useArtifactContent}
43
+ * (CORS-safe, no presign).
44
+ *
45
+ * The URL is cached cross-mount by `storageKey` (DD-014), so repeated renders
46
+ * and remounts reuse the same minted URL instead of re-hitting the API.
47
+ *
48
+ * Pass `enabled: false` (or `null` for either id) to skip fetching — consistent
49
+ * with the `useArtifactContent(null, null)` convention.
50
+ *
51
+ * @param executionId - Execution that produced the artifact, or `null` to skip.
52
+ * @param storageKey - Storage key from the artifact/output ref, or `null` to skip.
53
+ * @param options - Optional gating (`enabled`).
54
+ *
55
+ * @example
56
+ * ```tsx
57
+ * // Render an offloaded screenshot with an always-fresh URL.
58
+ * const { url, isLoading } = useArtifactDownloadUrl(executionId, storageKey);
59
+ * if (isLoading) return <Skeleton />;
60
+ * return url ? <img src={url} alt="Tool output" /> : null;
61
+ * ```
62
+ *
63
+ * @see useArtifactContent — reads artifact bytes through the API (text preview)
64
+ * @see useArtifactDownload — imperative click-to-download counterpart
65
+ */
66
+ export declare function useArtifactDownloadUrl(executionId: string | null, storageKey: string | null, options?: UseArtifactDownloadUrlOptions): UseArtifactDownloadUrlReturn;
67
+ //# sourceMappingURL=useArtifactDownloadUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useArtifactDownloadUrl.d.ts","sourceRoot":"","sources":["../../src/execution/useArtifactDownloadUrl.ts"],"names":[],"mappings":"AAQA,sDAAsD;AACtD,MAAM,WAAW,4BAA4B;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B,sDAAsD;IACtD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAE/B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAE7B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAQD,kDAAkD;AAClD,MAAM,WAAW,6BAA6B;IAC5C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,CAAC,EAAE,6BAA6B,GACtC,4BAA4B,CA0B9B"}
@@ -0,0 +1,59 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { create } from "@bufbuild/protobuf";
4
+ import { GetArtifactDownloadUrlRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/io_pb";
5
+ import { useStigmer } from "../hooks";
6
+ import { useFetch } from "../internal/useFetch";
7
+ const EMPTY = { url: null };
8
+ /**
9
+ * Data hook that resolves a **fresh** presigned download URL for an execution
10
+ * artifact on demand via `stigmer.agentExecution.getArtifactDownloadUrl()`.
11
+ *
12
+ * This exists because presigned URLs expire. The runner once baked a
13
+ * short-lived URL into the persisted execution status and the UI rendered it
14
+ * verbatim — so any link opened after the URL's lifetime failed with
15
+ * `ExpiredRequest`. Minting the URL at view time from the stable `storageKey`
16
+ * guarantees it is always valid, and works for every historical execution
17
+ * (the `storageKey` never expires).
18
+ *
19
+ * Use this for surfaces that genuinely need a URL — an `<img src>` for an
20
+ * offloaded screenshot, or a direct browser download of a large/binary
21
+ * artifact. For text that should render in-app, prefer {@link useArtifactContent}
22
+ * (CORS-safe, no presign).
23
+ *
24
+ * The URL is cached cross-mount by `storageKey` (DD-014), so repeated renders
25
+ * and remounts reuse the same minted URL instead of re-hitting the API.
26
+ *
27
+ * Pass `enabled: false` (or `null` for either id) to skip fetching — consistent
28
+ * with the `useArtifactContent(null, null)` convention.
29
+ *
30
+ * @param executionId - Execution that produced the artifact, or `null` to skip.
31
+ * @param storageKey - Storage key from the artifact/output ref, or `null` to skip.
32
+ * @param options - Optional gating (`enabled`).
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * // Render an offloaded screenshot with an always-fresh URL.
37
+ * const { url, isLoading } = useArtifactDownloadUrl(executionId, storageKey);
38
+ * if (isLoading) return <Skeleton />;
39
+ * return url ? <img src={url} alt="Tool output" /> : null;
40
+ * ```
41
+ *
42
+ * @see useArtifactContent — reads artifact bytes through the API (text preview)
43
+ * @see useArtifactDownload — imperative click-to-download counterpart
44
+ */
45
+ export function useArtifactDownloadUrl(executionId, storageKey, options) {
46
+ const stigmer = useStigmer();
47
+ const enabled = options?.enabled ?? true;
48
+ const active = enabled && !!executionId && !!storageKey;
49
+ const { data, isLoading, isRefetching, error, refetch } = useFetch(active
50
+ ? () => stigmer.agentExecution
51
+ .getArtifactDownloadUrl(create(GetArtifactDownloadUrlRequestSchema, {
52
+ executionId: executionId,
53
+ storageKey: storageKey,
54
+ }))
55
+ .then((result) => ({ url: result.downloadUrl || null }))
56
+ : null, [executionId, storageKey, active, stigmer], EMPTY, { cacheKey: storageKey ? `artifact-url:${storageKey}` : undefined });
57
+ return useMemo(() => ({ url: data.url, isLoading, isRefetching, error, refetch }), [data.url, isLoading, isRefetching, error, refetch]);
58
+ }
59
+ //# sourceMappingURL=useArtifactDownloadUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useArtifactDownloadUrl.js","sourceRoot":"","sources":["../../src/execution/useArtifactDownloadUrl.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,mCAAmC,EAAE,MAAM,4DAA4D,CAAC;AACjH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AA6BhD,MAAM,KAAK,GAAY,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAarC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAA0B,EAC1B,UAAyB,EACzB,OAAuC;IAEvC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC;IAExD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,CAChE,MAAM;QACJ,CAAC,CAAC,GAAG,EAAE,CACH,OAAO,CAAC,cAAc;aACnB,sBAAsB,CACrB,MAAM,CAAC,mCAAmC,EAAE;YAC1C,WAAW,EAAE,WAAY;YACzB,UAAU,EAAE,UAAW;SACxB,CAAC,CACH;aACA,IAAI,CAAC,CAAC,MAAM,EAAW,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,IAAI,EACR,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAC1C,KAAK,EACL,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CACpE,CAAC;IAEF,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAClE,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,CACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { FileChange } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
2
+ /** Return value of {@link useFileChangeContent}. */
3
+ export interface UseFileChangeContentReturn {
4
+ /**
5
+ * Before-side text for diffing. `""` for an absent side (e.g. CREATE has no
6
+ * before). `null` while an offloaded side is in-flight or failed to load.
7
+ */
8
+ readonly beforeText: string | null;
9
+ /**
10
+ * After-side text for diffing. `""` for an absent side (e.g. DELETE has no
11
+ * after). `null` while an offloaded side is in-flight or failed to load.
12
+ */
13
+ readonly afterText: string | null;
14
+ /** `true` when either side is binary — render "binary file changed", not a diff. */
15
+ readonly isBinary: boolean;
16
+ /** `true` while an offloaded side's content request is in flight. */
17
+ readonly isLoading: boolean;
18
+ /** Error from a failed offloaded-side fetch, or `null`. */
19
+ readonly error: Error | null;
20
+ /**
21
+ * `true` when an offloaded side exceeded the server's content-size limit and
22
+ * was truncated — the inline diff would be incomplete; offer {@link downloadUrl}.
23
+ */
24
+ readonly isTruncated: boolean;
25
+ /**
26
+ * Direct download URL for an offloaded side (the after side preferred), used
27
+ * as the fallback when content is truncated. `null` when neither side is offloaded.
28
+ */
29
+ readonly downloadUrl: string | null;
30
+ }
31
+ /**
32
+ * Behavior hook that resolves a {@link FileChange}'s before/after sides to the
33
+ * text the diff renderer needs.
34
+ *
35
+ * Small bodies are carried inline on the proto and returned with zero cost.
36
+ * Large bodies were offloaded to artifact storage by the runner
37
+ * (`FileContent.ref`); this hook lazily fetches them via
38
+ * {@link useArtifactContent} through the server proxy (CORS-safe). The fetch's
39
+ * `executionId` is derived from the ref's own `storageKey`
40
+ * (`artifacts/{executionId}/...`), so a net diff whose two sides originated in
41
+ * different executions still resolves each side correctly.
42
+ *
43
+ * This is the single place offload refs are dereferenced — the SDK's
44
+ * `tool-view` deliberately stays fetch-free, deferring all ref handling here.
45
+ *
46
+ * Rules-of-hooks safe: both sides always issue a (possibly skipped)
47
+ * `useArtifactContent` call; inline/absent sides pass `null` and never fetch.
48
+ *
49
+ * @param change - The file change whose content to resolve.
50
+ *
51
+ * @see useSessionFileChanges — produces the changes this resolves
52
+ * @see FileChangeDiff — renders the resolved content
53
+ */
54
+ export declare function useFileChangeContent(change: FileChange): UseFileChangeContentReturn;
55
+ /**
56
+ * Extracts the execution id from an artifact storage key of the form
57
+ * `artifacts/{executionId}/...`. Returns `null` for an unexpected shape so the
58
+ * caller skips the fetch rather than issuing a request the server would reject.
59
+ */
60
+ export declare function execIdFromStorageKey(storageKey: string): string | null;
61
+ //# sourceMappingURL=useFileChangeContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileChangeContent.d.ts","sourceRoot":"","sources":["../../src/execution/useFileChangeContent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,iEAAiE,CAAC;AAIzE,oDAAoD;AACpD,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,GACjB,0BAA0B,CAmD5B;AAqBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMtE"}
@@ -0,0 +1,89 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { useArtifactContent } from "./useArtifactContent";
4
+ import { useArtifactDownloadUrl } from "./useArtifactDownloadUrl";
5
+ /**
6
+ * Behavior hook that resolves a {@link FileChange}'s before/after sides to the
7
+ * text the diff renderer needs.
8
+ *
9
+ * Small bodies are carried inline on the proto and returned with zero cost.
10
+ * Large bodies were offloaded to artifact storage by the runner
11
+ * (`FileContent.ref`); this hook lazily fetches them via
12
+ * {@link useArtifactContent} through the server proxy (CORS-safe). The fetch's
13
+ * `executionId` is derived from the ref's own `storageKey`
14
+ * (`artifacts/{executionId}/...`), so a net diff whose two sides originated in
15
+ * different executions still resolves each side correctly.
16
+ *
17
+ * This is the single place offload refs are dereferenced — the SDK's
18
+ * `tool-view` deliberately stays fetch-free, deferring all ref handling here.
19
+ *
20
+ * Rules-of-hooks safe: both sides always issue a (possibly skipped)
21
+ * `useArtifactContent` call; inline/absent sides pass `null` and never fetch.
22
+ *
23
+ * @param change - The file change whose content to resolve.
24
+ *
25
+ * @see useSessionFileChanges — produces the changes this resolves
26
+ * @see FileChangeDiff — renders the resolved content
27
+ */
28
+ export function useFileChangeContent(change) {
29
+ const beforeRef = refOf(change.before);
30
+ const afterRef = refOf(change.after);
31
+ const beforeFetch = useArtifactContent(beforeRef ? execIdFromStorageKey(beforeRef.storageKey) : null, beforeRef ? beforeRef.storageKey : null, null, beforeRef?.contentHash);
32
+ const afterFetch = useArtifactContent(afterRef ? execIdFromStorageKey(afterRef.storageKey) : null, afterRef ? afterRef.storageKey : null, null, afterRef?.contentHash);
33
+ // The download fallback is needed only when an offloaded side was truncated.
34
+ // Resolve a fresh URL on demand from the stable storageKey (after side
35
+ // preferred), gated on truncation so we don't mint a URL we won't use.
36
+ const isTruncated = beforeFetch.isTruncated || afterFetch.isTruncated;
37
+ const downloadRef = afterRef ?? beforeRef;
38
+ const { url: downloadUrl } = useArtifactDownloadUrl(downloadRef ? execIdFromStorageKey(downloadRef.storageKey) : null, downloadRef ? downloadRef.storageKey : null, { enabled: isTruncated });
39
+ return useMemo(() => ({
40
+ beforeText: sideText(change.before, beforeFetch.content),
41
+ afterText: sideText(change.after, afterFetch.content),
42
+ isBinary: Boolean(change.before?.isBinary || change.after?.isBinary),
43
+ isLoading: beforeFetch.isLoading || afterFetch.isLoading,
44
+ error: beforeFetch.error ?? afterFetch.error,
45
+ isTruncated,
46
+ downloadUrl,
47
+ }), [
48
+ change.before,
49
+ change.after,
50
+ beforeFetch.content,
51
+ afterFetch.content,
52
+ beforeFetch.isLoading,
53
+ afterFetch.isLoading,
54
+ beforeFetch.error,
55
+ afterFetch.error,
56
+ isTruncated,
57
+ downloadUrl,
58
+ ]);
59
+ }
60
+ /** The offload pointer of a side, or null when the side is absent/inline/binary. */
61
+ function refOf(side) {
62
+ if (!side || side.isBinary)
63
+ return null;
64
+ return side.body.case === "ref" ? side.body.value : null;
65
+ }
66
+ /**
67
+ * Resolves one side to text: absent → "" (empty file), inline → its value,
68
+ * offloaded → the fetched content (`null` until it loads).
69
+ */
70
+ function sideText(side, fetched) {
71
+ if (!side || side.isBinary)
72
+ return "";
73
+ if (side.body.case === "inline")
74
+ return side.body.value;
75
+ return fetched;
76
+ }
77
+ /**
78
+ * Extracts the execution id from an artifact storage key of the form
79
+ * `artifacts/{executionId}/...`. Returns `null` for an unexpected shape so the
80
+ * caller skips the fetch rather than issuing a request the server would reject.
81
+ */
82
+ export function execIdFromStorageKey(storageKey) {
83
+ const parts = storageKey.split("/");
84
+ if (parts.length >= 3 && parts[0] === "artifacts" && parts[1]) {
85
+ return parts[1];
86
+ }
87
+ return null;
88
+ }
89
+ //# sourceMappingURL=useFileChangeContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileChangeContent.js","sourceRoot":"","sources":["../../src/execution/useFileChangeContent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { FileDecisionAction, FileDecisionScope } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
2
+ /** Options narrowing a file decision to a single file and binding its digest. */
3
+ export interface FileDecisionOptions {
4
+ /**
5
+ * Decision scope. Defaults to `FILE` when {@link fileChangeId} is set, else
6
+ * `CHANGE_SET` (the whole-set decision that covers every file).
7
+ */
8
+ readonly scope?: FileDecisionScope;
9
+ /** The captured file this decision targets; required for `FILE` scope. */
10
+ readonly fileChangeId?: string;
11
+ /**
12
+ * The digest the reviewer saw (`aggregate_digest` for CHANGE_SET,
13
+ * `file_digest` for FILE). The server enforces it at decision time and the
14
+ * runner re-verifies it at reconcile — "what you approve is what gets applied".
15
+ */
16
+ readonly expectedDigest?: string;
17
+ /** Optional free-text comment recorded on the decision (audit trail). */
18
+ readonly reason?: string;
19
+ /**
20
+ * Set on an APPROVE to consciously KEEP a change whose diff could not be fully
21
+ * reviewed. Honored only for a binary file at `FILE` scope (a binary has no
22
+ * text diff, but its exact bytes are captured and reconcilable). It never
23
+ * relaxes the digest gate, and is ignored for other incompleteness. See DD-16.
24
+ */
25
+ readonly acknowledgeUnreviewable?: boolean;
26
+ }
27
+ /** Return value of {@link useFileReview}. */
28
+ export interface UseFileReviewReturn {
29
+ /**
30
+ * Submit an approve/reject decision for a change set (or one file within it).
31
+ * Resolves when the backend accepts the decision; the execution stream will
32
+ * deliver the updated `file_change_sets` projection.
33
+ */
34
+ readonly submitFileDecision: (executionId: string, changeSetId: string, action: FileDecisionAction, options?: FileDecisionOptions) => Promise<void>;
35
+ /**
36
+ * Keys (`changeSetId` for a whole-set decision, `changeSetId:fileChangeId` for
37
+ * a per-file one) currently being submitted — drives per-button loading state
38
+ * when a reviewer decides files independently. Build a key with
39
+ * {@link fileDecisionKey}.
40
+ */
41
+ readonly submittingDecisionKeys: ReadonlySet<string>;
42
+ /**
43
+ * Per-decision failures, keyed exactly like {@link submittingDecisionKeys}
44
+ * (via {@link fileDecisionKey}). This is the per-target parallel of the
45
+ * in-flight Set: a review card has many decision targets (the whole set plus
46
+ * each file), so a failure must be attributable to the *one* control that
47
+ * failed — a single scalar cannot say which file. {@link FileReviewCard}
48
+ * consumes this map to render the error in-card, beside the failed control.
49
+ */
50
+ readonly decisionErrors: ReadonlyMap<string, Error>;
51
+ /** Clear the error for one decision key (e.g. before a retry of that target). */
52
+ readonly clearDecisionError: (key: string) => void;
53
+ /**
54
+ * The most-recent decision failure, or `null` when healthy — a convenience
55
+ * mirror of {@link decisionErrors} for a headless consumer that wants a single
56
+ * error value (a banner). The map is authoritative for per-control surfacing.
57
+ */
58
+ readonly error: Error | null;
59
+ /** Reset every decision error (both {@link decisionErrors} and {@link error}). */
60
+ readonly clearError: () => void;
61
+ }
62
+ /**
63
+ * The loading-state key for a file decision: the change set id for a whole-set
64
+ * (CHANGE_SET) decision, or `changeSetId:fileChangeId` for a per-file one.
65
+ */
66
+ export declare function fileDecisionKey(changeSetId: string, fileChangeId?: string): string;
67
+ /**
68
+ * Behavior hook that wraps `agentExecution.submitFileDecision()` with per-decision
69
+ * loading state and error management — the file-review sibling of
70
+ * {@link useSubmitApproval}.
71
+ *
72
+ * File edits are reviewed as a captured change set (the `file_change_sets`
73
+ * projection), NOT as tool-call approvals. Platform builders who want full
74
+ * control over the review UI use this hook directly; those who prefer a drop-in
75
+ * surface use {@link FileReviewCard}, which accepts the callback shape this
76
+ * hook produces.
77
+ *
78
+ * @example
79
+ * ```tsx
80
+ * const { submitFileDecision, submittingDecisionKeys } = useFileReview();
81
+ *
82
+ * // Approve the whole change set:
83
+ * await submitFileDecision(executionId, changeSet.id, FileDecisionAction.APPROVE, {
84
+ * expectedDigest: changeSet.aggregateDigest,
85
+ * });
86
+ * ```
87
+ */
88
+ export declare function useFileReview(): UseFileReviewReturn;
89
+ //# sourceMappingURL=useFileReview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileReview.d.ts","sourceRoot":"","sources":["../../src/execution/useFileReview.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,8DAA8D,CAAC;AAKtE,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC5C;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,EAAE,CAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,mBAAmB,KAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrD;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,iFAAiF;IACjF,QAAQ,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAElF;AAKD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CAqFnD"}
@@ -0,0 +1,106 @@
1
+ "use client";
2
+ import { useCallback, useMemo, useState } from "react";
3
+ import { create } from "@bufbuild/protobuf";
4
+ import { FileDecisionScope, } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
5
+ import { SubmitFileDecisionInputSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/io_pb";
6
+ import { useStigmer } from "../hooks";
7
+ import { toError } from "../internal/toError";
8
+ /**
9
+ * The loading-state key for a file decision: the change set id for a whole-set
10
+ * (CHANGE_SET) decision, or `changeSetId:fileChangeId` for a per-file one.
11
+ */
12
+ export function fileDecisionKey(changeSetId, fileChangeId) {
13
+ return fileChangeId ? `${changeSetId}:${fileChangeId}` : changeSetId;
14
+ }
15
+ /** A stable empty map so an error-free hook keeps a constant `decisionErrors` ref. */
16
+ const NO_DECISION_ERRORS = new Map();
17
+ /**
18
+ * Behavior hook that wraps `agentExecution.submitFileDecision()` with per-decision
19
+ * loading state and error management — the file-review sibling of
20
+ * {@link useSubmitApproval}.
21
+ *
22
+ * File edits are reviewed as a captured change set (the `file_change_sets`
23
+ * projection), NOT as tool-call approvals. Platform builders who want full
24
+ * control over the review UI use this hook directly; those who prefer a drop-in
25
+ * surface use {@link FileReviewCard}, which accepts the callback shape this
26
+ * hook produces.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * const { submitFileDecision, submittingDecisionKeys } = useFileReview();
31
+ *
32
+ * // Approve the whole change set:
33
+ * await submitFileDecision(executionId, changeSet.id, FileDecisionAction.APPROVE, {
34
+ * expectedDigest: changeSet.aggregateDigest,
35
+ * });
36
+ * ```
37
+ */
38
+ export function useFileReview() {
39
+ const stigmer = useStigmer();
40
+ const [submittingKeys, setSubmittingKeys] = useState(new Set());
41
+ const [decisionErrors, setDecisionErrors] = useState(NO_DECISION_ERRORS);
42
+ const [error, setError] = useState(null);
43
+ const clearDecisionError = useCallback((key) => {
44
+ setDecisionErrors((prev) => {
45
+ if (!prev.has(key))
46
+ return prev;
47
+ const next = new Map(prev);
48
+ next.delete(key);
49
+ return next;
50
+ });
51
+ }, []);
52
+ const clearError = useCallback(() => {
53
+ setDecisionErrors(NO_DECISION_ERRORS);
54
+ setError(null);
55
+ }, []);
56
+ const submitFileDecision = useCallback(async (executionId, changeSetId, action, options) => {
57
+ const fileChangeId = options?.fileChangeId ?? "";
58
+ const scope = options?.scope ??
59
+ (fileChangeId ? FileDecisionScope.FILE : FileDecisionScope.CHANGE_SET);
60
+ const key = fileDecisionKey(changeSetId, fileChangeId || undefined);
61
+ setSubmittingKeys((prev) => {
62
+ const next = new Set(prev);
63
+ next.add(key);
64
+ return next;
65
+ });
66
+ // Clear this target's prior failure (and the scalar mirror) so a retry
67
+ // starts clean — the map and `error` are updated together, never drift.
68
+ clearDecisionError(key);
69
+ setError(null);
70
+ try {
71
+ const input = create(SubmitFileDecisionInputSchema, {
72
+ agentExecutionId: executionId,
73
+ changeSetId,
74
+ scope,
75
+ fileChangeId,
76
+ action,
77
+ expectedDigest: options?.expectedDigest ?? "",
78
+ reason: options?.reason ?? "",
79
+ acknowledgeUnreviewable: options?.acknowledgeUnreviewable ?? false,
80
+ });
81
+ await stigmer.agentExecution.submitFileDecision(input);
82
+ }
83
+ catch (err) {
84
+ const e = toError(err);
85
+ setDecisionErrors((prev) => new Map(prev).set(key, e));
86
+ setError(e);
87
+ throw err;
88
+ }
89
+ finally {
90
+ setSubmittingKeys((prev) => {
91
+ const next = new Set(prev);
92
+ next.delete(key);
93
+ return next;
94
+ });
95
+ }
96
+ }, [stigmer, clearDecisionError]);
97
+ return useMemo(() => ({
98
+ submitFileDecision,
99
+ submittingDecisionKeys: submittingKeys,
100
+ decisionErrors,
101
+ clearDecisionError,
102
+ error,
103
+ clearError,
104
+ }), [submitFileDecision, submittingKeys, decisionErrors, clearDecisionError, error, clearError]);
105
+ }
106
+ //# sourceMappingURL=useFileReview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileReview.js","sourceRoot":"","sources":["../../src/execution/useFileReview.ts"],"names":[],"mappings":"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"}
@@ -13,9 +13,24 @@ export interface UseSubmitApprovalReturn {
13
13
  * approve one tool while another decision is still in flight.
14
14
  */
15
15
  readonly submittingToolCallIds: ReadonlySet<string>;
16
- /** Error from the last failed approval submission, or `null` when healthy. */
16
+ /**
17
+ * Per-tool-call failures, keyed by `toolCallId` exactly like
18
+ * {@link submittingToolCallIds}. This is the per-target parallel of the
19
+ * in-flight Set: a thread can hold many simultaneous gates (one per inline
20
+ * tool row, plus the bottom backstop), so a failure must be attributable to
21
+ * the *one* gate that failed — a single scalar cannot say which. {@link
22
+ * ApprovalCard} / {@link ApprovalCardBody} consume this (threaded via
23
+ * {@link ApprovalContext}) to render the error in-card, beside the failed gate.
24
+ */
25
+ readonly errorsByToolCallId: ReadonlyMap<string, Error>;
26
+ /**
27
+ * Error from the last failed approval submission, or `null` when healthy — a
28
+ * convenience mirror of {@link errorsByToolCallId} for a headless consumer
29
+ * that wants a single error value (e.g. a banner, or the `ink` surface). The
30
+ * map is authoritative for per-gate surfacing.
31
+ */
17
32
  readonly error: Error | null;
18
- /** Reset `error` to `null`. */
33
+ /** Reset every approval error (both {@link errorsByToolCallId} and {@link error}). */
19
34
  readonly clearError: () => void;
20
35
  }
21
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useSubmitApproval.d.ts","sourceRoot":"","sources":["../../src/execution/useSubmitApproval.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAK9F,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,CACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpD,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,IAAI,uBAAuB,CA8C3D"}
1
+ {"version":3,"file":"useSubmitApproval.d.ts","sourceRoot":"","sources":["../../src/execution/useSubmitApproval.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAM9F,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,CACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpD;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxD;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,IAAI,uBAAuB,CAoD3D"}
@@ -1,9 +1,10 @@
1
1
  "use client";
2
- import { useCallback, useState } from "react";
2
+ import { useCallback, useMemo, useState } from "react";
3
3
  import { create } from "@bufbuild/protobuf";
4
4
  import { SubmitApprovalInputSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/io_pb";
5
5
  import { useStigmer } from "../hooks";
6
6
  import { toError } from "../internal/toError";
7
+ import { useKeyedSubmission } from "../internal/useKeyedSubmission";
7
8
  /**
8
9
  * Behavior hook that wraps `agentExecution.submitApproval()` with
9
10
  * per-tool-call loading state and error management.
@@ -26,37 +27,40 @@ import { toError } from "../internal/toError";
26
27
  */
27
28
  export function useSubmitApproval() {
28
29
  const stigmer = useStigmer();
29
- const [submittingIds, setSubmittingIds] = useState(new Set());
30
+ // Per-gate in-flight + error state, keyed by tool-call id, lives in the
31
+ // shared keyed-submission primitive. The scalar `error` below is a thin
32
+ // mirror kept in lockstep for headless / ink consumers.
33
+ const keyed = useKeyedSubmission();
30
34
  const [error, setError] = useState(null);
31
- const clearError = useCallback(() => setError(null), []);
35
+ const clearError = useCallback(() => {
36
+ keyed.clearErrors();
37
+ setError(null);
38
+ }, [keyed.clearErrors]);
32
39
  const submitApproval = useCallback(async (executionId, toolCallId, action, comment) => {
33
- setSubmittingIds((prev) => {
34
- const next = new Set(prev);
35
- next.add(toolCallId);
36
- return next;
37
- });
40
+ // Clear the scalar mirror at submit-start; `keyed.run` clears this gate's
41
+ // keyed entry, so the map and `error` are updated together and never drift.
38
42
  setError(null);
39
43
  try {
40
- const input = create(SubmitApprovalInputSchema, {
41
- agentExecutionId: executionId,
42
- toolCallId,
43
- action,
44
- comment: comment ?? "",
44
+ await keyed.run(toolCallId, async () => {
45
+ await stigmer.agentExecution.submitApproval(create(SubmitApprovalInputSchema, {
46
+ agentExecutionId: executionId,
47
+ toolCallId,
48
+ action,
49
+ comment: comment ?? "",
50
+ }));
45
51
  });
46
- await stigmer.agentExecution.submitApproval(input);
47
52
  }
48
53
  catch (err) {
49
54
  setError(toError(err));
50
55
  throw err;
51
56
  }
52
- finally {
53
- setSubmittingIds((prev) => {
54
- const next = new Set(prev);
55
- next.delete(toolCallId);
56
- return next;
57
- });
58
- }
59
- }, [stigmer]);
60
- return { submitApproval, submittingToolCallIds: submittingIds, error, clearError };
57
+ }, [stigmer, keyed.run]);
58
+ return useMemo(() => ({
59
+ submitApproval,
60
+ submittingToolCallIds: keyed.submittingKeys,
61
+ errorsByToolCallId: keyed.errorsByKey,
62
+ error,
63
+ clearError,
64
+ }), [submitApproval, keyed.submittingKeys, keyed.errorsByKey, error, clearError]);
61
65
  }
62
66
  //# sourceMappingURL=useSubmitApproval.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSubmitApproval.js","sourceRoot":"","sources":["../../src/execution/useSubmitApproval.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4DAA4D,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA2B9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,IAAI,GAAG,EAAE,CACV,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,EACH,WAAmB,EACnB,UAAkB,EAClB,MAAsB,EACtB,OAAgB,EACD,EAAE;QACjB,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,yBAAyB,EAAE;gBAC9C,gBAAgB,EAAE,WAAW;gBAC7B,UAAU;gBACV,MAAM;gBACN,OAAO,EAAE,OAAO,IAAI,EAAE;aACvB,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACrF,CAAC"}
1
+ {"version":3,"file":"useSubmitApproval.js","sourceRoot":"","sources":["../../src/execution/useSubmitApproval.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4DAA4D,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AA0CpE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,wEAAwE;IACxE,wEAAwE;IACxE,wDAAwD;IACxD,MAAM,KAAK,GAAG,kBAAkB,EAAQ,CAAC;IACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAExB,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,EACH,WAAmB,EACnB,UAAkB,EAClB,MAAsB,EACtB,OAAgB,EACD,EAAE;QACjB,0EAA0E;QAC1E,4EAA4E;QAC5E,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrC,MAAM,OAAO,CAAC,cAAc,CAAC,cAAc,CACzC,MAAM,CAAC,yBAAyB,EAAE;oBAChC,gBAAgB,EAAE,WAAW;oBAC7B,UAAU;oBACV,MAAM;oBACN,OAAO,EAAE,OAAO,IAAI,EAAE;iBACvB,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CACrB,CAAC;IAEF,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,cAAc;QACd,qBAAqB,EAAE,KAAK,CAAC,cAAc;QAC3C,kBAAkB,EAAE,KAAK,CAAC,WAAW;QACrC,KAAK;QACL,UAAU;KACX,CAAC,EACF,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAC7E,CAAC;AACJ,CAAC"}