@stigmer/react 3.2.2 → 3.3.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 (513) hide show
  1. package/agent/AgentDetailView.d.ts.map +1 -1
  2. package/agent/AgentDetailView.js +6 -3
  3. package/agent/AgentDetailView.js.map +1 -1
  4. package/agent/steps/ReviewStep.d.ts.map +1 -1
  5. package/agent/steps/ReviewStep.js +2 -3
  6. package/agent/steps/ReviewStep.js.map +1 -1
  7. package/billing/BaselineEditor.d.ts +9 -0
  8. package/billing/BaselineEditor.d.ts.map +1 -0
  9. package/billing/BaselineEditor.js +253 -0
  10. package/billing/BaselineEditor.js.map +1 -0
  11. package/billing/ModelCatalogPanel.d.ts +28 -0
  12. package/billing/ModelCatalogPanel.d.ts.map +1 -0
  13. package/billing/ModelCatalogPanel.js +102 -0
  14. package/billing/ModelCatalogPanel.js.map +1 -0
  15. package/billing/ModelGovernanceDetail.d.ts +8 -0
  16. package/billing/ModelGovernanceDetail.d.ts.map +1 -0
  17. package/billing/ModelGovernanceDetail.js +64 -0
  18. package/billing/ModelGovernanceDetail.js.map +1 -0
  19. package/billing/OperatorAccessNotice.d.ts +12 -0
  20. package/billing/OperatorAccessNotice.d.ts.map +1 -0
  21. package/billing/OperatorAccessNotice.js +15 -0
  22. package/billing/OperatorAccessNotice.js.map +1 -0
  23. package/billing/PricingGovernanceConsole.d.ts +57 -0
  24. package/billing/PricingGovernanceConsole.d.ts.map +1 -0
  25. package/billing/PricingGovernanceConsole.js +164 -0
  26. package/billing/PricingGovernanceConsole.js.map +1 -0
  27. package/billing/PricingGovernancePanel.d.ts +26 -0
  28. package/billing/PricingGovernancePanel.d.ts.map +1 -0
  29. package/billing/PricingGovernancePanel.js +64 -0
  30. package/billing/PricingGovernancePanel.js.map +1 -0
  31. package/billing/RetireConfirm.d.ts +9 -0
  32. package/billing/RetireConfirm.d.ts.map +1 -0
  33. package/billing/RetireConfirm.js +19 -0
  34. package/billing/RetireConfirm.js.map +1 -0
  35. package/billing/form-primitives.d.ts +18 -0
  36. package/billing/form-primitives.d.ts.map +1 -0
  37. package/billing/form-primitives.js +19 -0
  38. package/billing/form-primitives.js.map +1 -0
  39. package/billing/governance-primitives.d.ts +33 -0
  40. package/billing/governance-primitives.d.ts.map +1 -0
  41. package/billing/governance-primitives.js +43 -0
  42. package/billing/governance-primitives.js.map +1 -0
  43. package/billing/index.d.ts +18 -0
  44. package/billing/index.d.ts.map +1 -1
  45. package/billing/index.js +9 -0
  46. package/billing/index.js.map +1 -1
  47. package/billing/pricing-format.d.ts +12 -0
  48. package/billing/pricing-format.d.ts.map +1 -0
  49. package/billing/pricing-format.js +50 -0
  50. package/billing/pricing-format.js.map +1 -0
  51. package/billing/useDecidePricingOverride.d.ts +46 -0
  52. package/billing/useDecidePricingOverride.d.ts.map +1 -0
  53. package/billing/useDecidePricingOverride.js +44 -0
  54. package/billing/useDecidePricingOverride.js.map +1 -0
  55. package/billing/useModelGovernanceView.d.ts +103 -0
  56. package/billing/useModelGovernanceView.d.ts.map +1 -0
  57. package/billing/useModelGovernanceView.js +144 -0
  58. package/billing/useModelGovernanceView.js.map +1 -0
  59. package/billing/useModelPricingBaselines.d.ts +40 -0
  60. package/billing/useModelPricingBaselines.d.ts.map +1 -0
  61. package/billing/useModelPricingBaselines.js +32 -0
  62. package/billing/useModelPricingBaselines.js.map +1 -0
  63. package/billing/usePricingGovernance.d.ts +39 -0
  64. package/billing/usePricingGovernance.d.ts.map +1 -0
  65. package/billing/usePricingGovernance.js +31 -0
  66. package/billing/usePricingGovernance.js.map +1 -0
  67. package/billing/useRetireModelPricingBaseline.d.ts +31 -0
  68. package/billing/useRetireModelPricingBaseline.d.ts.map +1 -0
  69. package/billing/useRetireModelPricingBaseline.js +36 -0
  70. package/billing/useRetireModelPricingBaseline.js.map +1 -0
  71. package/billing/useUpsertModelPricingBaseline.d.ts +38 -0
  72. package/billing/useUpsertModelPricingBaseline.d.ts.map +1 -0
  73. package/billing/useUpsertModelPricingBaseline.js +37 -0
  74. package/billing/useUpsertModelPricingBaseline.js.map +1 -0
  75. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  76. package/channel/AgentChannelsPanel.js +11 -5
  77. package/channel/AgentChannelsPanel.js.map +1 -1
  78. package/composer/SessionComposer.d.ts +1 -1
  79. package/cursor-accounts/CursorAccountEditor.d.ts +28 -0
  80. package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
  81. package/cursor-accounts/CursorAccountEditor.js +51 -0
  82. package/cursor-accounts/CursorAccountEditor.js.map +1 -0
  83. package/cursor-accounts/CursorAccountsAccessNotice.d.ts +11 -0
  84. package/cursor-accounts/CursorAccountsAccessNotice.d.ts.map +1 -0
  85. package/cursor-accounts/CursorAccountsAccessNotice.js +14 -0
  86. package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -0
  87. package/cursor-accounts/CursorAccountsConsole.d.ts +28 -0
  88. package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
  89. package/cursor-accounts/CursorAccountsConsole.js +275 -0
  90. package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
  91. package/cursor-accounts/cursor-account-format.d.ts +10 -0
  92. package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
  93. package/cursor-accounts/cursor-account-format.js +26 -0
  94. package/cursor-accounts/cursor-account-format.js.map +1 -0
  95. package/cursor-accounts/index.d.ts +18 -0
  96. package/cursor-accounts/index.d.ts.map +1 -0
  97. package/cursor-accounts/index.js +13 -0
  98. package/cursor-accounts/index.js.map +1 -0
  99. package/cursor-accounts/useCursorAccountView.d.ts +30 -0
  100. package/cursor-accounts/useCursorAccountView.d.ts.map +1 -0
  101. package/cursor-accounts/useCursorAccountView.js +25 -0
  102. package/cursor-accounts/useCursorAccountView.js.map +1 -0
  103. package/cursor-accounts/useCursorAccounts.d.ts +33 -0
  104. package/cursor-accounts/useCursorAccounts.d.ts.map +1 -0
  105. package/cursor-accounts/useCursorAccounts.js +25 -0
  106. package/cursor-accounts/useCursorAccounts.js.map +1 -0
  107. package/cursor-accounts/useCursorMemberKeyActions.d.ts +49 -0
  108. package/cursor-accounts/useCursorMemberKeyActions.d.ts.map +1 -0
  109. package/cursor-accounts/useCursorMemberKeyActions.js +38 -0
  110. package/cursor-accounts/useCursorMemberKeyActions.js.map +1 -0
  111. package/cursor-accounts/useDeleteCursorAccount.d.ts +30 -0
  112. package/cursor-accounts/useDeleteCursorAccount.d.ts.map +1 -0
  113. package/cursor-accounts/useDeleteCursorAccount.js +32 -0
  114. package/cursor-accounts/useDeleteCursorAccount.js.map +1 -0
  115. package/cursor-accounts/useSyncCursorAccount.d.ts +23 -0
  116. package/cursor-accounts/useSyncCursorAccount.d.ts.map +1 -0
  117. package/cursor-accounts/useSyncCursorAccount.js +31 -0
  118. package/cursor-accounts/useSyncCursorAccount.js.map +1 -0
  119. package/cursor-accounts/useUpsertCursorAccount.d.ts +26 -0
  120. package/cursor-accounts/useUpsertCursorAccount.d.ts.map +1 -0
  121. package/cursor-accounts/useUpsertCursorAccount.js +34 -0
  122. package/cursor-accounts/useUpsertCursorAccount.js.map +1 -0
  123. package/datastore/CollectionRecordsBrowser.d.ts +34 -0
  124. package/datastore/CollectionRecordsBrowser.d.ts.map +1 -0
  125. package/datastore/CollectionRecordsBrowser.js +209 -0
  126. package/datastore/CollectionRecordsBrowser.js.map +1 -0
  127. package/datastore/CollectionSchemaView.d.ts +29 -0
  128. package/datastore/CollectionSchemaView.d.ts.map +1 -0
  129. package/datastore/CollectionSchemaView.js +93 -0
  130. package/datastore/CollectionSchemaView.js.map +1 -0
  131. package/datastore/DatastoreDetailView.d.ts +44 -0
  132. package/datastore/DatastoreDetailView.d.ts.map +1 -0
  133. package/datastore/DatastoreDetailView.js +76 -0
  134. package/datastore/DatastoreDetailView.js.map +1 -0
  135. package/datastore/DatastoreSyncReport.d.ts +19 -0
  136. package/datastore/DatastoreSyncReport.d.ts.map +1 -0
  137. package/datastore/DatastoreSyncReport.js +45 -0
  138. package/datastore/DatastoreSyncReport.js.map +1 -0
  139. package/datastore/DeleteDatastoreDialog.d.ts +35 -0
  140. package/datastore/DeleteDatastoreDialog.d.ts.map +1 -0
  141. package/datastore/DeleteDatastoreDialog.js +90 -0
  142. package/datastore/DeleteDatastoreDialog.js.map +1 -0
  143. package/datastore/FieldValueControl.d.ts +55 -0
  144. package/datastore/FieldValueControl.d.ts.map +1 -0
  145. package/datastore/FieldValueControl.js +138 -0
  146. package/datastore/FieldValueControl.js.map +1 -0
  147. package/datastore/RecordFilterBuilder.d.ts +30 -0
  148. package/datastore/RecordFilterBuilder.d.ts.map +1 -0
  149. package/datastore/RecordFilterBuilder.js +122 -0
  150. package/datastore/RecordFilterBuilder.js.map +1 -0
  151. package/datastore/RecordFormPanel.d.ts +45 -0
  152. package/datastore/RecordFormPanel.d.ts.map +1 -0
  153. package/datastore/RecordFormPanel.js +215 -0
  154. package/datastore/RecordFormPanel.js.map +1 -0
  155. package/datastore/index.d.ts +43 -0
  156. package/datastore/index.d.ts.map +1 -0
  157. package/datastore/index.js +22 -0
  158. package/datastore/index.js.map +1 -0
  159. package/datastore/recordFilter.d.ts +54 -0
  160. package/datastore/recordFilter.d.ts.map +1 -0
  161. package/datastore/recordFilter.js +93 -0
  162. package/datastore/recordFilter.js.map +1 -0
  163. package/datastore/recordValues.d.ts +85 -0
  164. package/datastore/recordValues.d.ts.map +1 -0
  165. package/datastore/recordValues.js +282 -0
  166. package/datastore/recordValues.js.map +1 -0
  167. package/datastore/useDatastore.d.ts +39 -0
  168. package/datastore/useDatastore.d.ts.map +1 -0
  169. package/datastore/useDatastore.js +44 -0
  170. package/datastore/useDatastore.js.map +1 -0
  171. package/datastore/useDatastoreCount.d.ts +48 -0
  172. package/datastore/useDatastoreCount.d.ts.map +1 -0
  173. package/datastore/useDatastoreCount.js +27 -0
  174. package/datastore/useDatastoreCount.js.map +1 -0
  175. package/datastore/useDatastoreDescription.d.ts +54 -0
  176. package/datastore/useDatastoreDescription.d.ts.map +1 -0
  177. package/datastore/useDatastoreDescription.js +50 -0
  178. package/datastore/useDatastoreDescription.js.map +1 -0
  179. package/datastore/useDatastoreList.d.ts +57 -0
  180. package/datastore/useDatastoreList.d.ts.map +1 -0
  181. package/datastore/useDatastoreList.js +29 -0
  182. package/datastore/useDatastoreList.js.map +1 -0
  183. package/datastore/useDatastoreSearch.d.ts +19 -0
  184. package/datastore/useDatastoreSearch.d.ts.map +1 -0
  185. package/datastore/useDatastoreSearch.js +22 -0
  186. package/datastore/useDatastoreSearch.js.map +1 -0
  187. package/datastore/useDeleteDatastore.d.ts +53 -0
  188. package/datastore/useDeleteDatastore.d.ts.map +1 -0
  189. package/datastore/useDeleteDatastore.js +40 -0
  190. package/datastore/useDeleteDatastore.js.map +1 -0
  191. package/datastore/useDeleteRecord.d.ts +34 -0
  192. package/datastore/useDeleteRecord.d.ts.map +1 -0
  193. package/datastore/useDeleteRecord.js +43 -0
  194. package/datastore/useDeleteRecord.js.map +1 -0
  195. package/datastore/useInsertRecord.d.ts +50 -0
  196. package/datastore/useInsertRecord.d.ts.map +1 -0
  197. package/datastore/useInsertRecord.js +55 -0
  198. package/datastore/useInsertRecord.js.map +1 -0
  199. package/datastore/useRecordCollection.d.ts +104 -0
  200. package/datastore/useRecordCollection.d.ts.map +1 -0
  201. package/datastore/useRecordCollection.js +136 -0
  202. package/datastore/useRecordCollection.js.map +1 -0
  203. package/datastore/useRecordList.d.ts +66 -0
  204. package/datastore/useRecordList.d.ts.map +1 -0
  205. package/datastore/useRecordList.js +58 -0
  206. package/datastore/useRecordList.js.map +1 -0
  207. package/datastore/useUpdateRecord.d.ts +52 -0
  208. package/datastore/useUpdateRecord.d.ts.map +1 -0
  209. package/datastore/useUpdateRecord.js +55 -0
  210. package/datastore/useUpdateRecord.js.map +1 -0
  211. package/environment/EnvironmentListPanel.d.ts.map +1 -1
  212. package/environment/EnvironmentListPanel.js +12 -7
  213. package/environment/EnvironmentListPanel.js.map +1 -1
  214. package/execution/index.d.ts +1 -2
  215. package/execution/index.d.ts.map +1 -1
  216. package/execution/index.js +0 -1
  217. package/execution/index.js.map +1 -1
  218. package/execution/useLiveAgentExecution.d.ts +17 -1
  219. package/execution/useLiveAgentExecution.d.ts.map +1 -1
  220. package/execution/useLiveAgentExecution.js +19 -4
  221. package/execution/useLiveAgentExecution.js.map +1 -1
  222. package/iam-policy/index.d.ts +1 -1
  223. package/iam-policy/index.d.ts.map +1 -1
  224. package/iam-policy/index.js.map +1 -1
  225. package/iam-policy/useCheckPermission.d.ts +32 -11
  226. package/iam-policy/useCheckPermission.d.ts.map +1 -1
  227. package/iam-policy/useCheckPermission.js +24 -19
  228. package/iam-policy/useCheckPermission.js.map +1 -1
  229. package/index.d.ts +16 -10
  230. package/index.d.ts.map +1 -1
  231. package/index.js +16 -5
  232. package/index.js.map +1 -1
  233. package/internal/useInViewport.d.ts +24 -0
  234. package/internal/useInViewport.d.ts.map +1 -0
  235. package/internal/useInViewport.js +49 -0
  236. package/internal/useInViewport.js.map +1 -0
  237. package/library/VisibilitySelector.d.ts +22 -6
  238. package/library/VisibilitySelector.d.ts.map +1 -1
  239. package/library/VisibilitySelector.js +12 -4
  240. package/library/VisibilitySelector.js.map +1 -1
  241. package/library/index.d.ts +1 -8
  242. package/library/index.d.ts.map +1 -1
  243. package/library/index.js +0 -4
  244. package/library/index.js.map +1 -1
  245. package/library/useApplyResource.d.ts +12 -12
  246. package/library/useApplyResource.d.ts.map +1 -1
  247. package/library/useApplyResource.js +16 -25
  248. package/library/useApplyResource.js.map +1 -1
  249. package/library/useExportResource.d.ts +13 -9
  250. package/library/useExportResource.d.ts.map +1 -1
  251. package/library/useExportResource.js +18 -36
  252. package/library/useExportResource.js.map +1 -1
  253. package/manifest/ApplyManifestDialog.d.ts +48 -0
  254. package/manifest/ApplyManifestDialog.d.ts.map +1 -0
  255. package/manifest/ApplyManifestDialog.js +135 -0
  256. package/manifest/ApplyManifestDialog.js.map +1 -0
  257. package/manifest/EditResourceYamlDialog.d.ts +51 -0
  258. package/manifest/EditResourceYamlDialog.d.ts.map +1 -0
  259. package/manifest/EditResourceYamlDialog.js +104 -0
  260. package/manifest/EditResourceYamlDialog.js.map +1 -0
  261. package/manifest/RedactedSecretsNotice.d.ts +14 -0
  262. package/manifest/RedactedSecretsNotice.d.ts.map +1 -0
  263. package/manifest/RedactedSecretsNotice.js +14 -0
  264. package/manifest/RedactedSecretsNotice.js.map +1 -0
  265. package/manifest/YamlEditor.d.ts +44 -0
  266. package/manifest/YamlEditor.d.ts.map +1 -0
  267. package/manifest/YamlEditor.js +216 -0
  268. package/manifest/YamlEditor.js.map +1 -0
  269. package/manifest/index.d.ts +13 -0
  270. package/manifest/index.d.ts.map +1 -0
  271. package/manifest/index.js +13 -0
  272. package/manifest/index.js.map +1 -0
  273. package/manifest/useApplyManifest.d.ts +82 -0
  274. package/manifest/useApplyManifest.d.ts.map +1 -0
  275. package/manifest/useApplyManifest.js +180 -0
  276. package/manifest/useApplyManifest.js.map +1 -0
  277. package/manifest/useEditResourceYaml.d.ts +106 -0
  278. package/manifest/useEditResourceYaml.d.ts.map +1 -0
  279. package/manifest/useEditResourceYaml.js +168 -0
  280. package/manifest/useEditResourceYaml.js.map +1 -0
  281. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  282. package/mcp-server/McpServerDetailView.js +4 -3
  283. package/mcp-server/McpServerDetailView.js.map +1 -1
  284. package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
  285. package/mcp-server/steps/ReviewStep.js +2 -3
  286. package/mcp-server/steps/ReviewStep.js.map +1 -1
  287. package/package.json +4 -4
  288. package/resource-creation/templates/workflow-templates.js +4 -4
  289. package/session/SessionViewer.js +8 -1
  290. package/session/SessionViewer.js.map +1 -1
  291. package/session/audience.d.ts +6 -1
  292. package/session/audience.d.ts.map +1 -1
  293. package/session/useEditSessionPrep.js +3 -3
  294. package/session/useEditSessionPrep.js.map +1 -1
  295. package/settings/index.d.ts +2 -1
  296. package/settings/index.d.ts.map +1 -1
  297. package/settings/index.js +2 -1
  298. package/settings/index.js.map +1 -1
  299. package/settings/settings-nav.d.ts +22 -0
  300. package/settings/settings-nav.d.ts.map +1 -1
  301. package/settings/settings-nav.js +32 -1
  302. package/settings/settings-nav.js.map +1 -1
  303. package/settings/useSettingsNavGroups.d.ts +29 -0
  304. package/settings/useSettingsNavGroups.d.ts.map +1 -0
  305. package/settings/useSettingsNavGroups.js +61 -0
  306. package/settings/useSettingsNavGroups.js.map +1 -0
  307. package/skill/SkillDetailView.d.ts.map +1 -1
  308. package/skill/SkillDetailView.js +4 -3
  309. package/skill/SkillDetailView.js.map +1 -1
  310. package/src/access/__tests__/useManageAccess.test.tsx +104 -0
  311. package/src/agent/AgentDetailView.tsx +9 -3
  312. package/src/agent/steps/ReviewStep.tsx +2 -3
  313. package/src/billing/BaselineEditor.tsx +619 -0
  314. package/src/billing/ModelCatalogPanel.tsx +283 -0
  315. package/src/billing/ModelGovernanceDetail.tsx +289 -0
  316. package/src/billing/OperatorAccessNotice.tsx +32 -0
  317. package/src/billing/PricingGovernanceConsole.tsx +465 -0
  318. package/src/billing/PricingGovernancePanel.tsx +166 -0
  319. package/src/billing/RetireConfirm.tsx +82 -0
  320. package/src/billing/__tests__/ModelCatalogPanel.test.tsx +253 -0
  321. package/src/billing/__tests__/PricingGovernanceConsole.test.tsx +410 -0
  322. package/src/billing/__tests__/useModelGovernanceView.test.tsx +308 -0
  323. package/src/billing/form-primitives.tsx +68 -0
  324. package/src/billing/governance-primitives.tsx +133 -0
  325. package/src/billing/index.ts +37 -0
  326. package/src/billing/pricing-format.ts +53 -0
  327. package/src/billing/useDecidePricingOverride.ts +78 -0
  328. package/src/billing/useModelGovernanceView.ts +290 -0
  329. package/src/billing/useModelPricingBaselines.ts +69 -0
  330. package/src/billing/usePricingGovernance.ts +57 -0
  331. package/src/billing/useRetireModelPricingBaseline.ts +65 -0
  332. package/src/billing/useUpsertModelPricingBaseline.ts +72 -0
  333. package/src/channel/AgentChannelsPanel.tsx +27 -1
  334. package/src/composer/SessionComposer.tsx +1 -1
  335. package/src/cursor-accounts/CursorAccountEditor.tsx +181 -0
  336. package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
  337. package/src/cursor-accounts/CursorAccountsConsole.tsx +810 -0
  338. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +384 -0
  339. package/src/cursor-accounts/cursor-account-format.ts +29 -0
  340. package/src/cursor-accounts/index.ts +29 -0
  341. package/src/cursor-accounts/useCursorAccountView.ts +49 -0
  342. package/src/cursor-accounts/useCursorAccounts.ts +49 -0
  343. package/src/cursor-accounts/useCursorMemberKeyActions.ts +106 -0
  344. package/src/cursor-accounts/useDeleteCursorAccount.ts +62 -0
  345. package/src/cursor-accounts/useSyncCursorAccount.ts +54 -0
  346. package/src/cursor-accounts/useUpsertCursorAccount.ts +57 -0
  347. package/src/datastore/CollectionRecordsBrowser.tsx +544 -0
  348. package/src/datastore/CollectionSchemaView.tsx +247 -0
  349. package/src/datastore/DatastoreDetailView.tsx +201 -0
  350. package/src/datastore/DatastoreSyncReport.tsx +105 -0
  351. package/src/datastore/DeleteDatastoreDialog.tsx +202 -0
  352. package/src/datastore/FieldValueControl.tsx +289 -0
  353. package/src/datastore/RecordFilterBuilder.tsx +411 -0
  354. package/src/datastore/RecordFormPanel.tsx +432 -0
  355. package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +207 -0
  356. package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +133 -0
  357. package/src/datastore/__tests__/FieldValueControl.test.tsx +160 -0
  358. package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +141 -0
  359. package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
  360. package/src/datastore/__tests__/recordFilter.test.ts +156 -0
  361. package/src/datastore/__tests__/recordMutations.test.tsx +195 -0
  362. package/src/datastore/__tests__/recordValues.test.ts +359 -0
  363. package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +142 -0
  364. package/src/datastore/__tests__/useDatastoreDescription.test.tsx +143 -0
  365. package/src/datastore/__tests__/useRecordCollection.test.tsx +250 -0
  366. package/src/datastore/__tests__/useRecordList.test.tsx +85 -0
  367. package/src/datastore/index.ts +111 -0
  368. package/src/datastore/recordFilter.ts +140 -0
  369. package/src/datastore/recordValues.ts +327 -0
  370. package/src/datastore/useDatastore.ts +67 -0
  371. package/src/datastore/useDatastoreCount.ts +67 -0
  372. package/src/datastore/useDatastoreDescription.ts +90 -0
  373. package/src/datastore/useDatastoreList.ts +79 -0
  374. package/src/datastore/useDatastoreSearch.ts +39 -0
  375. package/src/datastore/useDeleteDatastore.ts +87 -0
  376. package/src/datastore/useDeleteRecord.ts +77 -0
  377. package/src/datastore/useInsertRecord.ts +92 -0
  378. package/src/datastore/useRecordCollection.ts +256 -0
  379. package/src/datastore/useRecordList.ts +131 -0
  380. package/src/datastore/useUpdateRecord.ts +95 -0
  381. package/src/environment/EnvironmentListPanel.tsx +24 -0
  382. package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
  383. package/src/execution/__tests__/useLiveAgentExecution.test.tsx +125 -0
  384. package/src/execution/index.ts +4 -7
  385. package/src/execution/useLiveAgentExecution.ts +41 -3
  386. package/src/iam-policy/__tests__/useCheckPermission.test.tsx +221 -0
  387. package/src/iam-policy/index.ts +1 -0
  388. package/src/iam-policy/useCheckPermission.ts +45 -19
  389. package/src/index.ts +167 -18
  390. package/src/internal/__tests__/useInViewport.test.tsx +115 -0
  391. package/src/internal/useInViewport.ts +63 -0
  392. package/src/library/VisibilitySelector.tsx +50 -9
  393. package/src/library/__tests__/VisibilitySelector.test.tsx +38 -0
  394. package/src/library/index.ts +4 -21
  395. package/src/library/useApplyResource.ts +27 -34
  396. package/src/library/useExportResource.ts +21 -40
  397. package/src/manifest/ApplyManifestDialog.tsx +315 -0
  398. package/src/manifest/EditResourceYamlDialog.tsx +265 -0
  399. package/src/manifest/RedactedSecretsNotice.tsx +30 -0
  400. package/src/manifest/YamlEditor.tsx +272 -0
  401. package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +118 -0
  402. package/src/manifest/__tests__/useApplyManifest.test.tsx +237 -0
  403. package/src/manifest/__tests__/useEditResourceYaml.test.tsx +252 -0
  404. package/src/manifest/index.ts +33 -0
  405. package/src/manifest/useApplyManifest.ts +270 -0
  406. package/src/manifest/useEditResourceYaml.ts +273 -0
  407. package/src/mcp-server/McpServerDetailView.tsx +7 -3
  408. package/src/mcp-server/steps/ReviewStep.tsx +2 -3
  409. package/src/resource-creation/templates/workflow-templates.ts +4 -4
  410. package/src/session/SessionViewer.tsx +7 -1
  411. package/src/session/__tests__/audienceWiring.test.tsx +31 -1
  412. package/src/session/audience.ts +6 -1
  413. package/src/session/useEditSessionPrep.ts +3 -3
  414. package/src/settings/__tests__/useSettingsNavGroups.test.tsx +138 -0
  415. package/src/settings/index.ts +5 -1
  416. package/src/settings/settings-nav.ts +43 -0
  417. package/src/settings/useSettingsNavGroups.ts +81 -0
  418. package/src/skill/SkillDetailView.tsx +7 -3
  419. package/src/workflow/WorkflowAgentCallTranscript.tsx +279 -0
  420. package/src/workflow/WorkflowDetailView.tsx +7 -3
  421. package/src/workflow/WorkflowExecutionViewer.tsx +20 -77
  422. package/src/workflow/WorkflowTaskApprovalSummary.tsx +45 -8
  423. package/src/workflow/WorkflowYamlEditor.tsx +6 -270
  424. package/src/workflow/__tests__/WorkflowAgentCallTranscript.liveregion.test.tsx +124 -0
  425. package/src/workflow/__tests__/{WorkflowAgentExecutionDocument.test.tsx → WorkflowAgentCallTranscript.test.tsx} +146 -121
  426. package/src/workflow/__tests__/WorkflowExecutionViewer.approvals.test.tsx +81 -220
  427. package/src/workflow/__tests__/WorkflowExecutionViewer.reconciliation.test.tsx +17 -16
  428. package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +52 -2
  429. package/src/workflow/__tests__/WorkflowTaskThread.test.tsx +168 -185
  430. package/src/workflow/__tests__/agent-call-live-experience.test.ts +4 -4
  431. package/src/workflow/__tests__/task-approval.test.ts +119 -0
  432. package/src/workflow/__tests__/task-presentation.test.ts +35 -1
  433. package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +0 -57
  434. package/src/workflow/index.ts +6 -3
  435. package/src/workflow/task-detail/index.ts +3 -0
  436. package/src/workflow/task-detail/task-approval.ts +95 -1
  437. package/src/workflow/thread/WorkflowTaskThread.tsx +96 -252
  438. package/src/workflow/thread/task-presentation.ts +8 -2
  439. package/src/workflow/useWorkflowExecutionPanel.ts +0 -47
  440. package/styles.css +1 -1
  441. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  442. package/workflow/WorkflowAgentCallTranscript.d.ts +87 -0
  443. package/workflow/WorkflowAgentCallTranscript.d.ts.map +1 -0
  444. package/workflow/WorkflowAgentCallTranscript.js +98 -0
  445. package/workflow/WorkflowAgentCallTranscript.js.map +1 -0
  446. package/workflow/WorkflowDetailView.d.ts.map +1 -1
  447. package/workflow/WorkflowDetailView.js +4 -3
  448. package/workflow/WorkflowDetailView.js.map +1 -1
  449. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  450. package/workflow/WorkflowExecutionViewer.js +23 -52
  451. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  452. package/workflow/WorkflowTaskApprovalSummary.d.ts +1 -1
  453. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  454. package/workflow/WorkflowTaskApprovalSummary.js +18 -1
  455. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  456. package/workflow/WorkflowYamlEditor.d.ts +2 -42
  457. package/workflow/WorkflowYamlEditor.d.ts.map +1 -1
  458. package/workflow/WorkflowYamlEditor.js +5 -214
  459. package/workflow/WorkflowYamlEditor.js.map +1 -1
  460. package/workflow/index.d.ts +2 -2
  461. package/workflow/index.d.ts.map +1 -1
  462. package/workflow/index.js +2 -2
  463. package/workflow/index.js.map +1 -1
  464. package/workflow/task-detail/index.d.ts +1 -1
  465. package/workflow/task-detail/index.d.ts.map +1 -1
  466. package/workflow/task-detail/index.js +1 -1
  467. package/workflow/task-detail/index.js.map +1 -1
  468. package/workflow/task-detail/task-approval.d.ts +44 -1
  469. package/workflow/task-detail/task-approval.d.ts.map +1 -1
  470. package/workflow/task-detail/task-approval.js +47 -0
  471. package/workflow/task-detail/task-approval.js.map +1 -1
  472. package/workflow/thread/WorkflowTaskThread.d.ts +17 -25
  473. package/workflow/thread/WorkflowTaskThread.d.ts.map +1 -1
  474. package/workflow/thread/WorkflowTaskThread.js +60 -105
  475. package/workflow/thread/WorkflowTaskThread.js.map +1 -1
  476. package/workflow/thread/task-presentation.d.ts.map +1 -1
  477. package/workflow/thread/task-presentation.js +7 -2
  478. package/workflow/thread/task-presentation.js.map +1 -1
  479. package/workflow/useWorkflowExecutionPanel.d.ts +0 -12
  480. package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
  481. package/workflow/useWorkflowExecutionPanel.js +0 -12
  482. package/workflow/useWorkflowExecutionPanel.js.map +1 -1
  483. package/execution/agent-execution-document.d.ts +0 -31
  484. package/execution/agent-execution-document.d.ts.map +0 -1
  485. package/execution/agent-execution-document.js +0 -48
  486. package/execution/agent-execution-document.js.map +0 -1
  487. package/library/ImportResourceDialog.d.ts +0 -43
  488. package/library/ImportResourceDialog.d.ts.map +0 -1
  489. package/library/ImportResourceDialog.js +0 -90
  490. package/library/ImportResourceDialog.js.map +0 -1
  491. package/library/parse-resource-yaml.d.ts +0 -63
  492. package/library/parse-resource-yaml.d.ts.map +0 -1
  493. package/library/parse-resource-yaml.js +0 -407
  494. package/library/parse-resource-yaml.js.map +0 -1
  495. package/library/serialize-resource-yaml.d.ts +0 -103
  496. package/library/serialize-resource-yaml.d.ts.map +0 -1
  497. package/library/serialize-resource-yaml.js +0 -565
  498. package/library/serialize-resource-yaml.js.map +0 -1
  499. package/library/useImportResource.d.ts +0 -84
  500. package/library/useImportResource.d.ts.map +0 -1
  501. package/library/useImportResource.js +0 -188
  502. package/library/useImportResource.js.map +0 -1
  503. package/src/execution/__tests__/agent-execution-document.test.ts +0 -45
  504. package/src/execution/agent-execution-document.ts +0 -54
  505. package/src/library/ImportResourceDialog.tsx +0 -227
  506. package/src/library/parse-resource-yaml.ts +0 -630
  507. package/src/library/serialize-resource-yaml.ts +0 -756
  508. package/src/library/useImportResource.ts +0 -253
  509. package/src/workflow/WorkflowAgentExecutionDocument.tsx +0 -283
  510. package/workflow/WorkflowAgentExecutionDocument.d.ts +0 -79
  511. package/workflow/WorkflowAgentExecutionDocument.d.ts.map +0 -1
  512. package/workflow/WorkflowAgentExecutionDocument.js +0 -87
  513. package/workflow/WorkflowAgentExecutionDocument.js.map +0 -1
@@ -1,73 +1,65 @@
1
1
  // Behavior tests for the WorkflowTaskThread organism: progress header,
2
2
  // per-variant card previews, the expand gesture (T06: headers expand or are
3
- // plain rows — selection died with the Inspect drill-down), the AGENT_CALL
4
- // transcript affordance (D-T02-2), empty states (DD-006), and the in-thread
5
- // HITL section (S10/T06 — including the in-card human_input review gate).
3
+ // plain rows — selection died with the Inspect drill-down), the inline
4
+ // AGENT_CALL transcript body (T07), empty states (DD-006), and the
5
+ // in-thread HITL section (S10/T06 — the in-card human_input review gate).
6
6
  //
7
7
  // GUARDRAIL (S5 rationale): the entire file renders WITHOUT a StigmerProvider.
8
8
  // Any component reaching for a client hook (the child's agentExecution.*
9
9
  // submit path) would throw — so a passing render plus the hitl spies
10
10
  // receiving decisions proves in-card gates route through the WORKFLOW-level
11
- // wiring only. (WorkflowFileReviewList streams its child itself and therefore
12
- // NEEDS the provider — it is stubbed at the module seam here; its own suite
13
- // covers the real child-derived rendering. The review gate's inline-payload
14
- // path is provider-free by design — useReviewPayload touches the client only
15
- // for artifact-backed payloads — so the human_input tests exercise the REAL
16
- // gate.)
11
+ // wiring only. (WorkflowAgentCallTranscript streams its child itself and
12
+ // therefore NEEDS the provider — it is stubbed at the module seam here; its
13
+ // own suite covers the real transcript rendering, viewport gating, and RPC
14
+ // routing. The review gate's inline-payload path is provider-free by design
15
+ // — useReviewPayload touches the client only for artifact-backed payloads —
16
+ // so the human_input tests exercise the REAL gate.)
17
17
 
18
18
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
19
19
  import { render, screen, fireEvent, cleanup, within } from "@testing-library/react";
20
20
  import { create } from "@bufbuild/protobuf";
21
21
  import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
22
- import {
23
- WorkflowPendingApprovalSchema,
24
- WorkflowPendingFileReviewSchema,
25
- } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
26
- import type {
27
- WorkflowPendingApproval,
28
- WorkflowPendingFileReview,
29
- WorkflowTask,
30
- } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
22
+ import type { WorkflowTask } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
31
23
  import {
32
24
  ApprovalRequestedPayloadSchema,
33
25
  ApprovalResolvedPayloadSchema,
34
26
  } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/event_pb";
35
- import { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
36
27
  import type { DerivedTaskState } from "../../internal/store/workflow-execution-event-store";
37
- import type { WorkflowFileDecisionSubmit } from "../WorkflowFileReviewList";
28
+ import type { WorkflowAgentCallTranscriptProps } from "../WorkflowAgentCallTranscript";
38
29
  import { formatMetaChips } from "../format-utils";
39
30
  import { WorkflowTaskThread, type WorkflowThreadHitl } from "../thread/WorkflowTaskThread";
40
31
 
41
32
  // Streams its child (needs the provider this guardrail file deliberately
42
- // omits) — stubbed to prove the seam: the gating card hands it the
43
- // task-scoped references and the workflow-level decision submit.
44
- vi.mock("../WorkflowFileReviewList", () => ({
45
- WorkflowFileReviewList: ({
46
- pendingFileReviews,
47
- onSubmitFileDecision,
48
- }: {
49
- pendingFileReviews: readonly WorkflowPendingFileReview[];
50
- onSubmitFileDecision: WorkflowFileDecisionSubmit;
51
- }) => (
52
- <div data-testid="file-review-list-stub">
53
- {pendingFileReviews.map((ref) => (
54
- <button
55
- key={ref.childAgentExecutionId}
56
- type="button"
57
- onClick={() =>
58
- onSubmitFileDecision(
59
- ref.childAgentExecutionId,
60
- ref.changeSetId[0] ?? "",
61
- 1 as never,
62
- )
63
- }
64
- >
65
- decide-files-{ref.childAgentExecutionId}
66
- </button>
67
- ))}
68
- </div>
33
+ // omits) — stubbed to prove the card-side seam: which child it is bound
34
+ // to, whether the hitl bundle reached it, and the pop-out wiring. The real
35
+ // component's behavior lives in WorkflowAgentCallTranscript.test.tsx.
36
+ vi.mock("../WorkflowAgentCallTranscript", () => ({
37
+ WorkflowAgentCallTranscript: vi.fn(
38
+ ({
39
+ childExecutionId,
40
+ agentSlug,
41
+ hitl,
42
+ onNavigateToAgentExecution,
43
+ }: WorkflowAgentCallTranscriptProps) => (
44
+ <div
45
+ data-testid="agent-call-transcript-probe"
46
+ data-child-id={childExecutionId}
47
+ data-agent-slug={agentSlug ?? ""}
48
+ data-interactive={hitl ? "true" : "false"}
49
+ >
50
+ {onNavigateToAgentExecution && (
51
+ <button
52
+ type="button"
53
+ onClick={() => onNavigateToAgentExecution(childExecutionId)}
54
+ >
55
+ probe-pop-out-{childExecutionId}
56
+ </button>
57
+ )}
58
+ </div>
59
+ ),
69
60
  ),
70
61
  }));
62
+ import { WorkflowAgentCallTranscript } from "../WorkflowAgentCallTranscript";
71
63
 
72
64
  // Spy-wrapped passthrough: every card render calls formatMetaChips with the
73
65
  // item's own metric fields, so its call log is a per-card render probe (the
@@ -280,8 +272,8 @@ describe("WorkflowTaskThread", () => {
280
272
  expect(container.querySelector("[aria-pressed]")).toBeNull();
281
273
  });
282
274
 
283
- it("renders an always-visible preview body for an AGENT_CALL (no chevron, T04) and opens the transcript", () => {
284
- const onOpenAgentExecution = vi.fn();
275
+ it("renders the child's inline transcript as an AGENT_CALL card's body — no button, no I/O summary (T07)", () => {
276
+ const onNavigateToAgentExecution = vi.fn();
285
277
  render(
286
278
  <WorkflowTaskThread
287
279
  taskStates={statesOf(
@@ -297,16 +289,61 @@ describe("WorkflowTaskThread", () => {
297
289
  )}
298
290
  totalTasks={1}
299
291
  isRunning={false}
300
- onOpenAgentExecution={onOpenAgentExecution}
292
+ onNavigateToAgentExecution={onNavigateToAgentExecution}
293
+ taskSnapshotsByName={
294
+ new Map([
295
+ [
296
+ "call-writer",
297
+ {
298
+ taskName: "call-writer",
299
+ // The old summary body's source — must NOT render (T07):
300
+ // the transcript IS the body.
301
+ output: { agent_execution_id: "aex_child_1", final_text: "done" },
302
+ artifactIds: [],
303
+ } as unknown as WorkflowTask,
304
+ ],
305
+ ])
306
+ }
301
307
  />,
302
308
  );
303
309
 
304
- // Preview-kind cards carry no expand chevron the body is always
305
- // visible (the session preview-card model).
310
+ // The card body IS the child transcript, bound to the right child…
311
+ const probe = screen.getByTestId("agent-call-transcript-probe");
312
+ expect(probe.getAttribute("data-child-id")).toBe("aex_child_1");
313
+ expect(probe.getAttribute("data-agent-slug")).toBe("blog-writer");
314
+ // …with no expand chevron, no launcher button, and none of the old
315
+ // id/final_text summary Struct.
306
316
  expect(screen.queryByRole("button", { name: "Expand call-writer" })).toBeNull();
317
+ expect(screen.queryByRole("button", { name: "Open transcript" })).toBeNull();
318
+ expect(screen.queryByText("Output")).toBeNull();
319
+ expect(screen.queryByText(/final_text|done/)).toBeNull();
320
+
321
+ // The deep-dive pop-out routes through the host's navigation.
322
+ fireEvent.click(screen.getByText("probe-pop-out-aex_child_1"));
323
+ expect(onNavigateToAgentExecution).toHaveBeenCalledWith("aex_child_1");
324
+ });
325
+
326
+ it("falls back to the generic error body for an AGENT_CALL that failed before spawning a child (T07)", () => {
327
+ render(
328
+ <WorkflowTaskThread
329
+ taskStates={statesOf(
330
+ taskState({
331
+ taskName: "call-broken",
332
+ taskKind: WorkflowTaskKind.agent_call,
333
+ status: "failed",
334
+ childExecutionId: "", // never spawned — agent resolution failed
335
+ error: "agent not found: org/missing-agent\nresolution trace",
336
+ }),
337
+ )}
338
+ totalTasks={1}
339
+ isRunning={false}
340
+ />,
341
+ );
307
342
 
308
- fireEvent.click(screen.getByRole("button", { name: "Open transcript" }));
309
- expect(onOpenAgentExecution).toHaveBeenCalledWith("aex_child_1", "call-writer");
343
+ // No child no transcript to render…
344
+ expect(screen.queryByTestId("agent-call-transcript-probe")).toBeNull();
345
+ // …but the failure must still surface in full (the correctness case).
346
+ expect(screen.getByText(/resolution trace/)).toBeTruthy();
310
347
  });
311
348
 
312
349
  it("renders the task's output in the always-visible body from the snapshot (T04)", () => {
@@ -604,33 +641,6 @@ function makeHitl(overrides: Partial<WorkflowThreadHitl> = {}): WorkflowThreadHi
604
641
  };
605
642
  }
606
643
 
607
- function pendingApproval(
608
- childId: string,
609
- toolCallId: string,
610
- toolName = "delete_repository",
611
- ): WorkflowPendingApproval {
612
- return create(WorkflowPendingApprovalSchema, {
613
- childAgentExecutionId: childId,
614
- approval: {
615
- toolCallId,
616
- toolName,
617
- message: `Run ${toolName}?`,
618
- argsPreview: '{"target": "acme/repo"}',
619
- requestedAt: "2026-07-16T00:00:00Z",
620
- },
621
- });
622
- }
623
-
624
- function pendingFileReview(
625
- childId: string,
626
- changeSetIds: string[] = ["cs-1"],
627
- ): WorkflowPendingFileReview {
628
- return create(WorkflowPendingFileReviewSchema, {
629
- childAgentExecutionId: childId,
630
- changeSetId: changeSetIds,
631
- });
632
- }
633
-
634
644
  /** A gating AGENT_CALL task bound to its child execution. */
635
645
  function gatedAgentCall(taskName: string, childId: string): DerivedTaskState {
636
646
  return taskState({
@@ -667,93 +677,73 @@ function gatedHumanInput(
667
677
  });
668
678
  }
669
679
 
670
- describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
671
- it("renders the canonical ApprovalCard on the gating card, visible WITHOUT expanding, and routes the decision through the workflow-level submit", () => {
672
- const hitl = makeHitl();
680
+ describe("WorkflowTaskThread — in-thread HITL (S10/T07)", () => {
681
+ it("hands the hitl bundle to a GATING agent-call card's transcript the child's gates decide inside it (T07)", () => {
673
682
  render(
674
683
  <WorkflowTaskThread
675
684
  taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
676
685
  totalTasks={1}
677
686
  isRunning
678
- hitl={hitl}
679
- pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
687
+ hitl={makeHitl()}
680
688
  />,
681
689
  );
682
690
 
683
- // The decision surface is present with no expand gesture at all
684
- // agent_call is a preview-kind card and carries no chevron (T04).
691
+ // No separate HITL section, no "waiting for approval" interstitial
692
+ // the transcript IS the decision surface, and it became interactive.
693
+ const probe = screen.getByTestId("agent-call-transcript-probe");
694
+ expect(probe.getAttribute("data-child-id")).toBe("aex_1");
695
+ expect(probe.getAttribute("data-interactive")).toBe("true");
696
+ expect(screen.queryByText(/waiting for an approval/)).toBeNull();
685
697
  expect(
686
698
  screen.queryByRole("button", { name: "Expand call-helper" }),
687
699
  ).toBeNull();
688
- const card = screen.getByRole("alert", {
689
- name: "Approval required for delete_repository",
690
- });
691
- expect(card).toBeTruthy();
692
-
693
- fireEvent.click(within(card).getByRole("button", { name: "Approve" }));
694
- expect(hitl.submitApproval).toHaveBeenCalledWith(
695
- "tc-1",
696
- ApprovalAction.APPROVE,
697
- undefined,
698
- );
699
700
  });
700
701
 
701
- it("scopes each gate to its owning card when parallel children gate at once", () => {
702
- const { container } = render(
702
+ it("keeps a NON-gating agent-call transcript read-only (the hitl scoping)", () => {
703
+ render(
703
704
  <WorkflowTaskThread
704
705
  taskStates={statesOf(
705
- gatedAgentCall("call-a", "aex_a"),
706
- gatedAgentCall("call-b", "aex_b"),
706
+ taskState({
707
+ taskName: "call-writer",
708
+ taskKind: WorkflowTaskKind.agent_call,
709
+ status: "running",
710
+ childExecutionId: "aex_2",
711
+ }),
707
712
  )}
708
- totalTasks={2}
713
+ totalTasks={1}
709
714
  isRunning
710
715
  hitl={makeHitl()}
711
- pendingApprovals={[
712
- pendingApproval("aex_a", "tc-a", "tool_for_a"),
713
- pendingApproval("aex_b", "tc-b", "tool_for_b"),
714
- ]}
715
716
  />,
716
717
  );
717
718
 
719
+ // The thread scopes the bundle to waiting_approval cards only (DD-010),
720
+ // so a merely-running child's transcript stays read-only.
718
721
  expect(
719
- within(cardRootOf(container, "call-a")).getByRole("alert", {
720
- name: "Approval required for tool_for_a",
721
- }),
722
- ).toBeTruthy();
723
- expect(
724
- within(cardRootOf(container, "call-b")).getByRole("alert", {
725
- name: "Approval required for tool_for_b",
726
- }),
727
- ).toBeTruthy();
728
- expect(
729
- within(cardRootOf(container, "call-a")).queryByRole("alert", {
730
- name: "Approval required for tool_for_b",
731
- }),
732
- ).toBeNull();
722
+ screen
723
+ .getByTestId("agent-call-transcript-probe")
724
+ .getAttribute("data-interactive"),
725
+ ).toBe("false");
733
726
  });
734
727
 
735
- it("hands the card's file-review references to WorkflowFileReviewList filtered to its child, decisions on the workflow path", () => {
736
- const hitl = makeHitl();
737
- render(
728
+ it("binds each parallel gating child to its own card's transcript", () => {
729
+ const { container } = render(
738
730
  <WorkflowTaskThread
739
- taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
740
- totalTasks={1}
731
+ taskStates={statesOf(
732
+ gatedAgentCall("call-a", "aex_a"),
733
+ gatedAgentCall("call-b", "aex_b"),
734
+ )}
735
+ totalTasks={2}
741
736
  isRunning
742
- hitl={hitl}
743
- pendingFileReviews={[
744
- pendingFileReview("aex_1", ["cs-1"]),
745
- // Another child's reference must NOT reach this card's list.
746
- pendingFileReview("aex_other", ["cs-9"]),
747
- ]}
737
+ hitl={makeHitl()}
748
738
  />,
749
739
  );
750
740
 
751
- const stub = screen.getByTestId("file-review-list-stub");
752
- expect(within(stub).getByText("decide-files-aex_1")).toBeTruthy();
753
- expect(within(stub).queryByText("decide-files-aex_other")).toBeNull();
754
-
755
- fireEvent.click(within(stub).getByText("decide-files-aex_1"));
756
- expect(hitl.submitFileDecision).toHaveBeenCalledWith("aex_1", "cs-1", 1);
741
+ const probeIn = (taskName: string) =>
742
+ within(cardRootOf(container, taskName)).getByTestId(
743
+ "agent-call-transcript-probe",
744
+ );
745
+ expect(probeIn("call-a").getAttribute("data-child-id")).toBe("aex_a");
746
+ expect(probeIn("call-b").getAttribute("data-child-id")).toBe("aex_b");
757
747
  });
758
748
 
759
749
  it("renders the FULL review gate on a pending human_input card and routes the decision through the workflow-level submit (T06)", () => {
@@ -847,28 +837,7 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
847
837
  expect(screen.queryByRole("form")).toBeNull();
848
838
  });
849
839
 
850
- it("offers the child transcript when an agent-call gates with no surfaced snapshot gates (the cloud refetch window / the OSS steady state)", () => {
851
- const onOpenAgentExecution = vi.fn();
852
- render(
853
- <WorkflowTaskThread
854
- taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
855
- totalTasks={1}
856
- isRunning
857
- onOpenAgentExecution={onOpenAgentExecution}
858
- hitl={makeHitl()}
859
- pendingApprovals={[]}
860
- pendingFileReviews={[]}
861
- />,
862
- );
863
-
864
- expect(
865
- screen.getByText(/The called agent is waiting for an approval/),
866
- ).toBeTruthy();
867
- fireEvent.click(screen.getByRole("button", { name: "Open transcript" }));
868
- expect(onOpenAgentExecution).toHaveBeenCalledWith("aex_1", "call-helper");
869
- });
870
-
871
- it("stays read-only when hitl is omitted (DD-011), even with gates surfaced", () => {
840
+ it("stays read-only when hitl is omitted (DD-011), even while gating", () => {
872
841
  render(
873
842
  <WorkflowTaskThread
874
843
  taskStates={statesOf(
@@ -877,31 +846,15 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
877
846
  )}
878
847
  totalTasks={2}
879
848
  isRunning
880
- pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
881
849
  />,
882
850
  );
883
851
 
884
- expect(screen.queryByRole("alert")).toBeNull();
852
+ expect(
853
+ screen
854
+ .getByTestId("agent-call-transcript-probe")
855
+ .getAttribute("data-interactive"),
856
+ ).toBe("false");
885
857
  expect(screen.queryByRole("form")).toBeNull();
886
- expect(screen.queryByText(/waiting for an approval/)).toBeNull();
887
- });
888
-
889
- it("surfaces a gate's failed decision in-card, keyed to its toolCallId", () => {
890
- render(
891
- <WorkflowTaskThread
892
- taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
893
- totalTasks={1}
894
- isRunning
895
- hitl={makeHitl({
896
- approvalErrorsByToolCallId: new Map([
897
- ["tc-1", new Error("boom-42: gate submit failed")],
898
- ]),
899
- })}
900
- pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
901
- />,
902
- );
903
-
904
- expect(screen.getByText(/boom-42: gate submit failed/)).toBeTruthy();
905
858
  });
906
859
 
907
860
  it("re-renders only the gating card when gate state churns (sibling memo probe)", () => {
@@ -911,7 +864,6 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
911
864
  taskState({ taskName: "settled", durationMs: 7_777 }),
912
865
  gatedAgentCall("call-helper", "aex_1"),
913
866
  );
914
- const approvals = [pendingApproval("aex_1", "tc-1")];
915
867
 
916
868
  const { rerender } = render(
917
869
  <WorkflowTaskThread
@@ -919,7 +871,6 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
919
871
  totalTasks={2}
920
872
  isRunning
921
873
  hitl={makeHitl()}
922
- pendingApprovals={approvals}
923
874
  />,
924
875
  );
925
876
 
@@ -934,7 +885,6 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
934
885
  totalTasks={2}
935
886
  isRunning
936
887
  hitl={makeHitl({ approvalSubmittingToolCallIds: new Set(["tc-1"]) })}
937
- pendingApprovals={approvals}
938
888
  />,
939
889
  );
940
890
 
@@ -944,4 +894,37 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
944
894
  // …but the settled sibling bailed (DD-009/DD-010).
945
895
  expect(renderedDurations).not.toContain(7_777);
946
896
  });
897
+
898
+ it("hands the churned hitl bundle through to the gating transcript (T07)", () => {
899
+ const taskStates = statesOf(gatedAgentCall("call-helper", "aex_1"));
900
+ const { rerender } = render(
901
+ <WorkflowTaskThread
902
+ taskStates={taskStates}
903
+ totalTasks={1}
904
+ isRunning
905
+ hitl={makeHitl()}
906
+ />,
907
+ );
908
+
909
+ const transcriptProbe = vi.mocked(WorkflowAgentCallTranscript);
910
+ transcriptProbe.mockClear();
911
+ const churned = makeHitl({
912
+ approvalSubmittingToolCallIds: new Set(["tc-1"]),
913
+ });
914
+ rerender(
915
+ <WorkflowTaskThread
916
+ taskStates={taskStates}
917
+ totalTasks={1}
918
+ isRunning
919
+ hitl={churned}
920
+ />,
921
+ );
922
+
923
+ // The in-flight Set must reach the transcript so the gate's spinner
924
+ // shows inside it — the bundle is passed through by reference.
925
+ const latest = transcriptProbe.mock.calls.at(-1)![0];
926
+ expect(latest.hitl?.approvalSubmittingToolCallIds).toBe(
927
+ churned.approvalSubmittingToolCallIds,
928
+ );
929
+ });
947
930
  });
@@ -370,10 +370,10 @@ describe("ExecutionBadge agent activity", () => {
370
370
 
371
371
  // NOTE: the "AgentCallTab view switching" suite that lived here tested the
372
372
  // tab's embedded-thumbnail subscription gating. S4 replaced the thumbnail
373
- // with a launcher (no subscription in the inspector at all); the launcher's
374
- // behavior is covered by component tests in agent-call-tab.test.tsx, and the
375
- // transcript's fetch/stream lifecycle by useLiveAgentExecution.test.tsx +
376
- // WorkflowAgentExecutionDocument.test.tsx.
373
+ // with a launcher, and T07 replaced the launcher's document tab with the
374
+ // inline in-card transcript; the transcript's fetch/stream lifecycle is
375
+ // covered by useLiveAgentExecution.test.tsx +
376
+ // WorkflowAgentCallTranscript.test.tsx.
377
377
 
378
378
  // ---------------------------------------------------------------------------
379
379
  // Inspector Approval tab visibility
@@ -10,6 +10,7 @@ import {
10
10
  import {
11
11
  deriveTaskApprovalRequest,
12
12
  deriveTaskApprovalDecision,
13
+ deriveTaskReviewer,
13
14
  } from "../task-detail/task-approval";
14
15
 
15
16
  // ---------------------------------------------------------------------------
@@ -146,4 +147,122 @@ describe("deriveTaskApprovalDecision", () => {
146
147
  expect(decision!.outcome).toBe("approve");
147
148
  expect(decision!.autoResolved).toBe(true);
148
149
  });
150
+
151
+ it("reads the reviewer_actor display snapshot from the task output", () => {
152
+ const decision = deriveTaskApprovalDecision(null, {
153
+ outcome: "approve",
154
+ reviewer: "ida_01abc",
155
+ reviewer_actor: {
156
+ id: "ida_01abc",
157
+ display_name: "Ada Lovelace",
158
+ email: "ada@example.com",
159
+ avatar: "https://example.com/ada.png",
160
+ },
161
+ } as JsonObject);
162
+ expect(decision!.reviewerActor).toEqual({
163
+ id: "ida_01abc",
164
+ displayName: "Ada Lovelace",
165
+ email: "ada@example.com",
166
+ avatar: "https://example.com/ada.png",
167
+ });
168
+ });
169
+
170
+ it("falls back to the event's resolvedByActor during the finalizing window", () => {
171
+ const decision = deriveTaskApprovalDecision(
172
+ makeResolution({
173
+ resolvedBy: "ida_01abc",
174
+ resolvedByActor: {
175
+ id: "ida_01abc",
176
+ displayName: "Ada Lovelace",
177
+ email: "ada@example.com",
178
+ avatar: "",
179
+ } as never,
180
+ }),
181
+ undefined,
182
+ );
183
+ expect(decision!.reviewerActor).toEqual({
184
+ id: "ida_01abc",
185
+ displayName: "Ada Lovelace",
186
+ email: "ada@example.com",
187
+ avatar: "",
188
+ });
189
+ });
190
+
191
+ it("leaves reviewerActor null for unenriched records", () => {
192
+ const decision = deriveTaskApprovalDecision(null, {
193
+ outcome: "approve",
194
+ reviewer: "ida_01abc",
195
+ } as JsonObject);
196
+ expect(decision!.reviewerActor).toBeNull();
197
+ });
198
+ });
199
+
200
+ describe("deriveTaskReviewer", () => {
201
+ const base = {
202
+ outcome: "approve",
203
+ respondedAt: null,
204
+ comment: "",
205
+ formData: null,
206
+ waitDurationMs: 0,
207
+ autoResolved: false,
208
+ };
209
+
210
+ it("prefers the display name, carrying email and avatar for the chip", () => {
211
+ const view = deriveTaskReviewer({
212
+ ...base,
213
+ reviewer: "ida_01abc",
214
+ reviewerActor: {
215
+ id: "ida_01abc",
216
+ displayName: "Ada Lovelace",
217
+ email: "ada@example.com",
218
+ avatar: "https://example.com/ada.png",
219
+ },
220
+ });
221
+ expect(view).toEqual({
222
+ label: "Ada Lovelace",
223
+ email: "ada@example.com",
224
+ avatar: "https://example.com/ada.png",
225
+ isRawId: false,
226
+ });
227
+ });
228
+
229
+ it("falls back to email when no display name exists", () => {
230
+ const view = deriveTaskReviewer({
231
+ ...base,
232
+ reviewer: "ida_01abc",
233
+ reviewerActor: {
234
+ id: "ida_01abc",
235
+ displayName: "",
236
+ email: "ada@example.com",
237
+ avatar: "",
238
+ },
239
+ });
240
+ expect(view!.label).toBe("ada@example.com");
241
+ // Email equals the label — no redundant secondary display.
242
+ expect(view!.email).toBe("");
243
+ expect(view!.isRawId).toBe(false);
244
+ });
245
+
246
+ it("falls back to the raw id for legacy records, flagged for de-emphasis", () => {
247
+ const view = deriveTaskReviewer({
248
+ ...base,
249
+ reviewer: "ida_01abc",
250
+ reviewerActor: null,
251
+ });
252
+ expect(view).toEqual({
253
+ label: "ida_01abc",
254
+ email: "",
255
+ avatar: "",
256
+ isRawId: true,
257
+ });
258
+ });
259
+
260
+ it("returns null for unattributed decisions so the 'by' segment is omitted", () => {
261
+ const view = deriveTaskReviewer({
262
+ ...base,
263
+ reviewer: "",
264
+ reviewerActor: null,
265
+ });
266
+ expect(view).toBeNull();
267
+ });
149
268
  });