@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
@@ -19,7 +19,12 @@
19
19
  * behavioral, not just cosmetic — the organisms also skip the
20
20
  * org-level reads a guest principal cannot make (default-agent
21
21
  * resolution, session→agent derivation, personal environments) and
22
- * never fall back to the org's default agent.
22
+ * never fall back to the org's default agent. Approval mechanics are
23
+ * also withheld (DD-014): the HITL gate protects the ORG's tools and
24
+ * an anonymous visitor is not its trustee — guest executions run in
25
+ * unattended approval mode server-side (gated tools auto-skip and the
26
+ * agent explains in plain language), so tool-approval vocabulary never
27
+ * reaches a guest.
23
28
  * - `"observer"` — a read-only transcript for someone watching a
24
29
  * conversation they cannot participate in, e.g. a channel connector
25
30
  * or org admin reviewing a Slack/WhatsApp conversation the channel
@@ -7,7 +7,7 @@ import { useStigmer } from "../hooks.js";
7
7
  import { useAgent } from "../agent/index.js";
8
8
  import { useMcpServer } from "../mcp-server/index.js";
9
9
  import { useSkill } from "../skill/index.js";
10
- import { serializeAgentYaml, serializeMcpServerYaml } from "../library/index.js";
10
+ import { serializeManifest } from "@stigmer/sdk";
11
11
  import type { DraftResourceType } from "./draft.js";
12
12
 
13
13
  /** Return value of {@link useEditSessionPrep}. */
@@ -64,7 +64,7 @@ export function useEditSessionPrep(
64
64
  if (draftType === "agent" && editAgent) {
65
65
  built.current = true;
66
66
  try {
67
- const yaml = serializeAgentYaml(editAgent);
67
+ const yaml = serializeManifest(editAgent);
68
68
  const slug = editAgent.metadata?.slug ?? "agent";
69
69
  setFiles([new File([yaml], `${slug}.yaml`, { type: "text/yaml" })]);
70
70
  } catch {
@@ -75,7 +75,7 @@ export function useEditSessionPrep(
75
75
  if (draftType === "mcp-server" && editMcpServer) {
76
76
  built.current = true;
77
77
  try {
78
- const yaml = serializeMcpServerYaml(editMcpServer);
78
+ const yaml = serializeManifest(editMcpServer);
79
79
  const slug = editMcpServer.metadata?.slug ?? "mcp-server";
80
80
  setFiles([new File([yaml], `${slug}.yaml`, { type: "text/yaml" })]);
81
81
  } catch {
@@ -0,0 +1,138 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ import { cleanup, fireEvent, render, screen } from "@testing-library/react";
3
+ import { useRef, useState } from "react";
4
+ import { SETTINGS_NAV_GROUPS, PLATFORM_SETTINGS_NAV_GROUP } from "../settings-nav";
5
+ import { useSettingsNavGroups } from "../useSettingsNavGroups";
6
+
7
+ // Drive the nav gate through the permission hook. The fail-closed
8
+ // semantics themselves are covered by useCheckPermission's own suite —
9
+ // here we assert the nav hook's per-item composition of the verdicts.
10
+ // Verdicts are keyed by relation so each platform permission can be
11
+ // granted independently.
12
+ let verdicts: Record<string, boolean> = {};
13
+ let checkedRelations: string[] = [];
14
+ let lastCheckArgs: readonly unknown[] = [];
15
+
16
+ vi.mock("../../iam-policy/useCheckPermission", () => ({
17
+ useCheckPermission: (
18
+ ...args: [unknown, string, { fail?: string } | undefined]
19
+ ) => {
20
+ lastCheckArgs = args;
21
+ checkedRelations.push(args[1]);
22
+ return { allowed: verdicts[args[1]] === true, isLoading: false, error: null };
23
+ },
24
+ }));
25
+
26
+ afterEach(() => {
27
+ cleanup();
28
+ verdicts = {};
29
+ checkedRelations = [];
30
+ });
31
+
32
+ function GroupsProbe() {
33
+ const groups = useSettingsNavGroups();
34
+ const platform = groups.find((g) => g.label === PLATFORM_SETTINGS_NAV_GROUP.label);
35
+ return (
36
+ <div
37
+ data-testid="groups"
38
+ data-labels={groups.map((g) => g.label).join(",")}
39
+ data-platform-items={platform?.items.map((i) => i.label).join(",") ?? ""}
40
+ />
41
+ );
42
+ }
43
+
44
+ const BASE_LABELS = SETTINGS_NAV_GROUPS.map((g) => g.label).join(",");
45
+
46
+ describe("useSettingsNavGroups", () => {
47
+ it("appends the full Platform group when the operator holds every platform permission", () => {
48
+ verdicts = {
49
+ can_manage_model_pricing: true,
50
+ can_manage_cursor_accounts: true,
51
+ };
52
+ render(<GroupsProbe />);
53
+
54
+ const el = screen.getByTestId("groups");
55
+ expect(el.getAttribute("data-labels")).toBe(
56
+ `${BASE_LABELS},${PLATFORM_SETTINGS_NAV_GROUP.label}`,
57
+ );
58
+ expect(el.getAttribute("data-platform-items")).toBe(
59
+ "Pricing Governance,Cursor Accounts",
60
+ );
61
+ });
62
+
63
+ it("filters per item: pricing-only operator sees only Pricing Governance", () => {
64
+ verdicts = { can_manage_model_pricing: true };
65
+ render(<GroupsProbe />);
66
+
67
+ expect(screen.getByTestId("groups").getAttribute("data-platform-items")).toBe(
68
+ "Pricing Governance",
69
+ );
70
+ });
71
+
72
+ it("filters per item: cursor-accounts-only operator sees only Cursor Accounts", () => {
73
+ verdicts = { can_manage_cursor_accounts: true };
74
+ render(<GroupsProbe />);
75
+
76
+ expect(screen.getByTestId("groups").getAttribute("data-platform-items")).toBe(
77
+ "Cursor Accounts",
78
+ );
79
+ });
80
+
81
+ it("returns exactly the base groups when not authorized", () => {
82
+ function IdentityProbe() {
83
+ const groups = useSettingsNavGroups();
84
+ return (
85
+ <div
86
+ data-testid="identity"
87
+ data-is-base={String(groups === SETTINGS_NAV_GROUPS)}
88
+ />
89
+ );
90
+ }
91
+ render(<IdentityProbe />);
92
+
93
+ // Not just equivalent — the same array, no needless copy.
94
+ expect(screen.getByTestId("identity").getAttribute("data-is-base")).toBe("true");
95
+ });
96
+
97
+ it("checks every declared platform permission on platform:stigmer, fail-closed", () => {
98
+ render(<GroupsProbe />);
99
+
100
+ // Exhaustiveness guard: every requiredPermission declared on the
101
+ // platform group must have a corresponding hook check — a new
102
+ // platform surface that forgets to add its check fails here.
103
+ const declared = PLATFORM_SETTINGS_NAV_GROUP.items.map(
104
+ (item) => item.requiredPermission,
105
+ );
106
+ for (const permission of declared) {
107
+ expect(permission, "platform items must declare requiredPermission").toBeDefined();
108
+ expect(checkedRelations).toContain(permission);
109
+ }
110
+ expect(lastCheckArgs[0]).toEqual({ kind: "platform", id: "stigmer" });
111
+ expect(lastCheckArgs[2]).toEqual({ fail: "closed" });
112
+ });
113
+
114
+ it("keeps the array reference stable across re-renders", () => {
115
+ verdicts = {
116
+ can_manage_model_pricing: true,
117
+ can_manage_cursor_accounts: true,
118
+ };
119
+
120
+ function StabilityProbe() {
121
+ const groups = useSettingsNavGroups();
122
+ const first = useRef(groups);
123
+ const [, force] = useState(0);
124
+ return (
125
+ <button
126
+ data-testid="stability"
127
+ data-stable={String(first.current === groups)}
128
+ onClick={() => force((n) => n + 1)}
129
+ />
130
+ );
131
+ }
132
+
133
+ render(<StabilityProbe />);
134
+ const el = screen.getByTestId("stability");
135
+ fireEvent.click(el);
136
+ expect(el.getAttribute("data-stable")).toBe("true");
137
+ });
138
+ });
@@ -1,5 +1,9 @@
1
- export { SETTINGS_NAV_GROUPS } from "./settings-nav.js";
1
+ export {
2
+ SETTINGS_NAV_GROUPS,
3
+ PLATFORM_SETTINGS_NAV_GROUP,
4
+ } from "./settings-nav.js";
2
5
  export type { SettingsNavItem, SettingsNavGroup } from "./settings-nav.js";
6
+ export { useSettingsNavGroups } from "./useSettingsNavGroups.js";
3
7
 
4
8
  export { ApiKeysSection } from "./ApiKeysSection.js";
5
9
  export { BillingSection } from "./BillingSection.js";
@@ -8,7 +8,9 @@ import {
8
8
  KeyRound,
9
9
  Link,
10
10
  MessageSquare,
11
+ MousePointerClick,
11
12
  Plug,
13
+ Scale,
12
14
  ShieldCheck,
13
15
  Users,
14
16
  } from "lucide-react";
@@ -24,6 +26,14 @@ export interface SettingsNavItem {
24
26
  /** Optional CSS class name applied to the icon. */
25
27
  className?: string;
26
28
  }>;
29
+ /**
30
+ * Platform-level permission (on `platform:stigmer`) required for this
31
+ * entry to appear. Only meaningful inside
32
+ * {@link PLATFORM_SETTINGS_NAV_GROUP} — items in the base groups are
33
+ * visible to every signed-in user and leave this unset.
34
+ * {@link useSettingsNavGroups} checks it fail-closed.
35
+ */
36
+ readonly requiredPermission?: string;
27
37
  }
28
38
 
29
39
  /** Grouping model used to render settings navigation sections. */
@@ -82,3 +92,36 @@ export const SETTINGS_NAV_GROUPS: readonly SettingsNavGroup[] = [
82
92
  ],
83
93
  },
84
94
  ];
95
+
96
+ /**
97
+ * Stigmer-internal platform-operator navigation group.
98
+ *
99
+ * Deliberately NOT part of {@link SETTINGS_NAV_GROUPS}: that constant
100
+ * means "groups every signed-in user sees", and its members must never
101
+ * change based on who is looking. This group is appended for platform
102
+ * operators only — use {@link useSettingsNavGroups} to get the
103
+ * permission-aware list instead of composing the two by hand.
104
+ *
105
+ * Every item here declares its `requiredPermission`; the hook filters
106
+ * per item (fail-closed), so an operator holding one platform permission
107
+ * but not another sees exactly their slice of this group.
108
+ */
109
+ export const PLATFORM_SETTINGS_NAV_GROUP: SettingsNavGroup = {
110
+ label: "Platform",
111
+ description:
112
+ "Stigmer-internal operations. Visible to platform operators only.",
113
+ items: [
114
+ {
115
+ href: "/settings/pricing-governance",
116
+ label: "Pricing Governance",
117
+ icon: Scale,
118
+ requiredPermission: "can_manage_model_pricing",
119
+ },
120
+ {
121
+ href: "/settings/cursor-accounts",
122
+ label: "Cursor Accounts",
123
+ icon: MousePointerClick,
124
+ requiredPermission: "can_manage_cursor_accounts",
125
+ },
126
+ ],
127
+ };
@@ -0,0 +1,81 @@
1
+ "use client";
2
+
3
+ import { useMemo } from "react";
4
+ import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
5
+ import {
6
+ PLATFORM_SETTINGS_NAV_GROUP,
7
+ SETTINGS_NAV_GROUPS,
8
+ type SettingsNavGroup,
9
+ } from "./settings-nav.js";
10
+
11
+ /**
12
+ * The `platform` singleton — platform-level permissions are always
13
+ * checked against this one resource (mirrors the server-side
14
+ * `resource_id = "stigmer"` RPC config).
15
+ */
16
+ const PLATFORM_RESOURCE = { kind: "platform", id: "stigmer" } as const;
17
+
18
+ /**
19
+ * Permission-aware settings navigation: {@link SETTINGS_NAV_GROUPS}
20
+ * for everyone, plus the {@link PLATFORM_SETTINGS_NAV_GROUP} items the
21
+ * caller's platform permissions unlock (per-item `requiredPermission`,
22
+ * checked against `platform:stigmer`). The group appears when at least
23
+ * one of its items is visible.
24
+ *
25
+ * The checks run fail-closed — the opposite of the `useCheckPermission`
26
+ * default — because navigation is *discoverability*, not *capability*:
27
+ * an action gate can safely fail open (the server re-checks every
28
+ * request), but an operator-only nav entry must not appear while the
29
+ * check is loading, when it errors, or on deployments where the IAM
30
+ * service (and the surface it points to) does not exist.
31
+ *
32
+ * Implementation note: hooks must be called unconditionally, so each
33
+ * distinct platform permission gets its own static check below. When a
34
+ * new platform surface adds a new permission, add its check to
35
+ * PLATFORM_PERMISSION_CHECKS' shape here — the exhaustiveness guard in
36
+ * the tests catches a forgotten one.
37
+ *
38
+ * @example
39
+ * ```tsx
40
+ * const groups = useSettingsNavGroups();
41
+ * return groups.map((group) => <NavGroup key={group.label} group={group} />);
42
+ * ```
43
+ */
44
+ export function useSettingsNavGroups(): readonly SettingsNavGroup[] {
45
+ const pricing = useCheckPermission(
46
+ PLATFORM_RESOURCE,
47
+ "can_manage_model_pricing",
48
+ { fail: "closed" },
49
+ );
50
+ const cursorAccounts = useCheckPermission(
51
+ PLATFORM_RESOURCE,
52
+ "can_manage_cursor_accounts",
53
+ { fail: "closed" },
54
+ );
55
+
56
+ const pricingAllowed = pricing.allowed;
57
+ const cursorAccountsAllowed = cursorAccounts.allowed;
58
+
59
+ return useMemo(() => {
60
+ const verdicts: Record<string, boolean> = {
61
+ can_manage_model_pricing: pricingAllowed,
62
+ can_manage_cursor_accounts: cursorAccountsAllowed,
63
+ };
64
+
65
+ const visibleItems = PLATFORM_SETTINGS_NAV_GROUP.items.filter(
66
+ // Fail closed on both axes: an item with no declared permission or
67
+ // with a permission this hook does not check yet stays hidden.
68
+ (item) =>
69
+ item.requiredPermission !== undefined &&
70
+ verdicts[item.requiredPermission] === true,
71
+ );
72
+
73
+ if (visibleItems.length === 0) {
74
+ return SETTINGS_NAV_GROUPS;
75
+ }
76
+ return [
77
+ ...SETTINGS_NAV_GROUPS,
78
+ { ...PLATFORM_SETTINGS_NAV_GROUP, items: visibleItems },
79
+ ];
80
+ }, [pricingAllowed, cursorAccountsAllowed]);
81
+ }
@@ -254,10 +254,14 @@ export function SkillDetailView({
254
254
  statusLabel: status ? skillStateLabel(status.state) : undefined,
255
255
  };
256
256
 
257
- // Inline visibility is read-only (at-a-glance); editing lives in the
258
- // Manage access dialog, the single writer for both access axes.
257
+ // Inline visibility is at-a-glance AND a shortcut into the Manage access
258
+ // dialog the single writer for both access axes. The chip is navigation
259
+ // only; it stays a static badge for users who cannot view access.
259
260
  const visibilityControl = meta ? (
260
- <VisibilityBadge visibility={meta.visibility} />
261
+ <VisibilityBadge
262
+ visibility={meta.visibility}
263
+ onClick={access.action ? access.open : undefined}
264
+ />
261
265
  ) : undefined;
262
266
 
263
267
  const mergedActions = access.action
@@ -0,0 +1,279 @@
1
+ "use client";
2
+
3
+ // The inline child-transcript body of an AGENT_CALL task card (T07): the
4
+ // card IS the session experience — live while running, full history when
5
+ // settled — replacing the S4 "Open transcript" document tab.
6
+
7
+ import { memo, useCallback, useMemo } from "react";
8
+ import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
9
+ import {
10
+ FileChangeSetStatus,
11
+ type FileDecisionAction,
12
+ } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
13
+ import type { FileChangeSet } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
14
+ import { displayFileChangeSets } from "@stigmer/sdk";
15
+ import { cn } from "@stigmer/theme";
16
+ import { useLiveAgentExecution } from "../execution/useLiveAgentExecution.js";
17
+ import { MessageThread } from "../execution/MessageThread.js";
18
+ import { ThreadSkeleton } from "../execution/ThreadSkeleton.js";
19
+ import { FileReviewDock } from "../execution/FileReviewDock.js";
20
+ import type { FileDecisionOptions } from "../execution/useFileReview.js";
21
+ import { isTerminalPhase } from "../execution/execution-phases.js";
22
+ import { useInViewport } from "../internal/useInViewport.js";
23
+ import type { UseWorkflowExecutionActionsReturn } from "./useWorkflowExecutionActions.js";
24
+
25
+ /** Stable empty list so the thread's memoized rows keep identity (DD-010). */
26
+ const EMPTY_EXECUTIONS: readonly AgentExecution[] = [];
27
+
28
+ /**
29
+ * The HITL wiring for an inline child transcript: the slice of
30
+ * {@link UseWorkflowExecutionActionsReturn} needed to submit child-gate
31
+ * decisions at the WORKFLOW level.
32
+ *
33
+ * A `Pick` (not a new shape) so the bundle can never drift from the actions
34
+ * hook — the viewer builds it from its single `useWorkflowExecutionActions`
35
+ * instance, so a gate's in-flight spinner or failure is identical wherever
36
+ * that gate is shown.
37
+ */
38
+ export type WorkflowAgentExecutionHitl = Pick<
39
+ UseWorkflowExecutionActionsReturn,
40
+ | "submitApproval"
41
+ | "approvalSubmittingToolCallIds"
42
+ | "approvalErrorsByToolCallId"
43
+ | "submitFileDecision"
44
+ | "fileDecisionSubmittingKeys"
45
+ | "fileDecisionErrorsByKey"
46
+ >;
47
+
48
+ /** Props for {@link WorkflowAgentCallTranscript}. */
49
+ export interface WorkflowAgentCallTranscriptProps {
50
+ /** ID of the child AgentExecution whose transcript to render. */
51
+ readonly childExecutionId: string;
52
+ /** Slug of the agent the task called, when known (labels the region). */
53
+ readonly agentSlug?: string;
54
+ /**
55
+ * Workflow-level HITL handlers. When provided, the transcript is
56
+ * interactive: tool-approval gates render their decision cards inline on
57
+ * the gated rows, and pending file reviews dock at the bottom. When
58
+ * omitted, the transcript is read-only — gates show status only
59
+ * (backward compatible, DD-011).
60
+ */
61
+ readonly hitl?: WorkflowAgentExecutionHitl;
62
+ /**
63
+ * Open the child execution as a standalone page — the deep-dive escape
64
+ * hatch now that the card is the transcript's single home. Host-routed
65
+ * (DD-004).
66
+ */
67
+ readonly onNavigateToAgentExecution?: (agentExecutionId: string) => void;
68
+ /** Additional CSS classes for the root element. */
69
+ readonly className?: string;
70
+ }
71
+
72
+ /**
73
+ * A child AgentExecution's full transcript rendered inline in the
74
+ * AGENT_CALL task card — the session-grade `MessageThread` (tool calls,
75
+ * sub-agents, plan cards, and — with {@link
76
+ * WorkflowAgentCallTranscriptProps.hitl | hitl} — in-place HITL), streaming
77
+ * live while the child runs and serving the full history once settled.
78
+ *
79
+ * BOUNDED, NOT FULL-HEIGHT. The transcript caps at a generous viewport
80
+ * fraction and owns its own scroll + auto-follow inside that box
81
+ * (`MessageThread`'s scroll machine is reused unchanged). Once a transcript
82
+ * hits its cap it stops growing, so the card height stabilizes and the
83
+ * OUTER thread's auto-follow stops chasing it — the bound fixes both the
84
+ * inner and the outer scroll ergonomics at once.
85
+ *
86
+ * VIEWPORT-GATED STREAMING. Every mounted card fetches its (DD-014-cached)
87
+ * snapshot so the body renders immediately, but the live subscription opens
88
+ * only while the card is on-screen (`useInViewport` → the hook's `live`
89
+ * gate). Off-screen running children pause their stream and keep the
90
+ * last-streamed snapshot visible (never a rewind); scrolling back — or
91
+ * toggling back from the CSS-hidden Graph view — re-attaches in place. This
92
+ * preserves the bounded-concurrency intent of the S4 single-active-tab
93
+ * design (DD-LIVE-006) for fan-out workflows: N concurrent children cost at
94
+ * most the streams the user can actually see.
95
+ *
96
+ * MINIMAL CHROME. The card header already owns the task's identity and
97
+ * metrics (the `agentCallLine` preview: slug, current tool, message/tool
98
+ * counts, plus duration/cost chips and the running/settled status glyph).
99
+ * The transcript adds only what the header cannot express: a
100
+ * `Reconnecting…` notice for the CHILD stream and the "Open standalone"
101
+ * pop-out. Body = purely the conversation.
102
+ *
103
+ * HITL ROUTING. Child gates are decided through the WORKFLOW-level RPCs
104
+ * (`WorkflowExecution.submitApproval` / `submitFileDecision`), never the
105
+ * child's own `agentExecution.*` submit path. The two paths are
106
+ * server-equivalent (the workflow RPC forwards to the child), but they
107
+ * differ in authorization: the workflow RPC checks `can_edit` on the
108
+ * workflow execution — the resource the operator owns — while the child
109
+ * path checks the runner-spawned AgentExecution, which the operator may
110
+ * not (the S5 rationale).
111
+ *
112
+ * FILE-REVIEW DOCK. Pending (AWAITING_REVIEW) sets derive from the CHILD's
113
+ * own live stream — the freshest source this component already holds — not
114
+ * from the parent's `status.pending_file_reviews`, which is fetched once
115
+ * and may lag a mid-run gate. Docked below the thread so a decision the
116
+ * child is blocked on can never scroll out of view; settled sets render as
117
+ * read-only records in-thread (`showFileReviewRecords`) — the two surfaces
118
+ * partition by the same pending test `MessageThread` uses.
119
+ *
120
+ * All visual properties flow through `--stgm-*` tokens (DD-005).
121
+ */
122
+ export const WorkflowAgentCallTranscript = memo(
123
+ function WorkflowAgentCallTranscript({
124
+ childExecutionId,
125
+ agentSlug,
126
+ hitl,
127
+ onNavigateToAgentExecution,
128
+ className,
129
+ }: WorkflowAgentCallTranscriptProps) {
130
+ const { ref: viewportRef, isVisible } = useInViewport();
131
+ const {
132
+ execution,
133
+ phase,
134
+ isLoading,
135
+ isReconnecting,
136
+ error,
137
+ reconnect,
138
+ } = useLiveAgentExecution(childExecutionId, { live: isVisible });
139
+
140
+ // Pending file reviews from the child's own (streamed) status — see the
141
+ // component doc for why the parent's pending_file_reviews is not the
142
+ // source. Terminal executions never dock: their AWAITING_REVIEW sets
143
+ // are settled history and render as in-thread records instead.
144
+ const terminal = isTerminalPhase(phase);
145
+ const pendingReviewSets = useMemo<readonly FileChangeSet[]>(() => {
146
+ if (terminal) return [];
147
+ return displayFileChangeSets(execution?.status).filter(
148
+ (cs) =>
149
+ cs.status === FileChangeSetStatus.AWAITING_REVIEW &&
150
+ cs.changes.length > 0,
151
+ );
152
+ }, [execution?.status, terminal]);
153
+
154
+ // Bind the child id into the dock's card-level submit signature. Deps
155
+ // are the specific method (DD-010), so the callback survives unrelated
156
+ // in-flight churn on the actions instance.
157
+ const submitFileDecision = hitl?.submitFileDecision;
158
+ const handleFileDecision = useCallback(
159
+ (changeSetId: string, action: FileDecisionAction, options?: FileDecisionOptions) => {
160
+ submitFileDecision?.(childExecutionId, changeSetId, action, options);
161
+ },
162
+ [submitFileDecision, childExecutionId],
163
+ );
164
+
165
+ const showBar = isReconnecting || !!onNavigateToAgentExecution;
166
+
167
+ return (
168
+ <div
169
+ ref={viewportRef}
170
+ role="group"
171
+ aria-label={
172
+ agentSlug ? `Transcript of agent ${agentSlug}` : "Agent transcript"
173
+ }
174
+ className={cn("flex max-h-[60vh] min-w-0 flex-col", className)}
175
+ >
176
+ {/* Only what the card header cannot express: the child stream's
177
+ reconnecting state and the standalone pop-out. */}
178
+ {showBar && (
179
+ <div className="flex min-w-0 shrink-0 items-center gap-3 pb-1.5">
180
+ {isReconnecting && (
181
+ <span className="text-xs text-muted-foreground">Reconnecting…</span>
182
+ )}
183
+ {onNavigateToAgentExecution && (
184
+ <button
185
+ type="button"
186
+ onClick={() => onNavigateToAgentExecution(childExecutionId)}
187
+ className="ml-auto inline-flex shrink-0 items-center gap-1.5 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm"
188
+ >
189
+ <PopOutIcon />
190
+ Open standalone
191
+ </button>
192
+ )}
193
+ </div>
194
+ )}
195
+
196
+ {/* The thread owns the scrolling inside the bounded box (its
197
+ auto-scroll machine + jump-to-latest need the scroll container);
198
+ min-h-0 lets the flex slot shrink to the cap. */}
199
+ <div className="min-h-0 min-w-0 flex-1">
200
+ {execution ? (
201
+ <MessageThread
202
+ executions={EMPTY_EXECUTIONS}
203
+ activeStreamExecution={execution}
204
+ onApprovalSubmit={hitl?.submitApproval}
205
+ submittingApprovalIds={hitl?.approvalSubmittingToolCallIds}
206
+ approvalErrors={hitl?.approvalErrorsByToolCallId}
207
+ showFileReviewRecords={hitl != null}
208
+ className="h-full"
209
+ />
210
+ ) : isLoading ? (
211
+ <ThreadSkeleton className="py-2" />
212
+ ) : error ? (
213
+ <div
214
+ role="alert"
215
+ className="flex flex-col items-start gap-2 py-2"
216
+ >
217
+ <p className="text-xs text-destructive">{error.message}</p>
218
+ <button
219
+ type="button"
220
+ onClick={reconnect}
221
+ className="rounded border border-border px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
222
+ >
223
+ Retry
224
+ </button>
225
+ </div>
226
+ ) : (
227
+ <div role="status" className="flex flex-col gap-1 py-2">
228
+ <p className="text-xs font-medium text-foreground">
229
+ This agent execution is no longer available.
230
+ </p>
231
+ <p className="text-xs text-muted-foreground">
232
+ It may have been removed, or the workflow run predates
233
+ transcript retention.
234
+ </p>
235
+ </div>
236
+ )}
237
+ </div>
238
+
239
+ {/* Pending file reviews dock below the thread, inside the bounded
240
+ box — the decision the child is blocked on can never scroll out
241
+ of view. Same shape as the session's composer dock. */}
242
+ {hitl && pendingReviewSets.length > 0 && (
243
+ <FileReviewDock
244
+ changeSets={pendingReviewSets}
245
+ onSubmit={handleFileDecision}
246
+ submittingDecisionKeys={hitl.fileDecisionSubmittingKeys}
247
+ decisionErrors={hitl.fileDecisionErrorsByKey}
248
+ className="shrink-0"
249
+ />
250
+ )}
251
+ </div>
252
+ );
253
+ },
254
+ );
255
+
256
+ // ---------------------------------------------------------------------------
257
+ // Inline SVG icons (SDK independence — no lucide dependency)
258
+ // ---------------------------------------------------------------------------
259
+
260
+ function PopOutIcon() {
261
+ return (
262
+ <svg
263
+ width="12"
264
+ height="12"
265
+ viewBox="0 0 12 12"
266
+ fill="none"
267
+ stroke="currentColor"
268
+ strokeWidth="1.3"
269
+ strokeLinecap="round"
270
+ strokeLinejoin="round"
271
+ className="shrink-0"
272
+ aria-hidden="true"
273
+ >
274
+ <path d="M10.5 4.5V1.5H7.5" />
275
+ <path d="M10.5 1.5L6 6" />
276
+ <path d="M8.5 7v3a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h3" />
277
+ </svg>
278
+ );
279
+ }
@@ -289,10 +289,14 @@ export function WorkflowDetailView({
289
289
  <ValidationIndicator state={validationState} />
290
290
  ) : undefined;
291
291
 
292
- // Inline visibility is read-only (at-a-glance); editing lives in the
293
- // Manage access dialog, the single writer for both access axes.
292
+ // Inline visibility is at-a-glance AND a shortcut into the Manage access
293
+ // dialog the single writer for both access axes. The chip is navigation
294
+ // only; it stays a static badge for users who cannot view access.
294
295
  const visibilityControl = meta ? (
295
- <VisibilityBadge visibility={meta.visibility} />
296
+ <VisibilityBadge
297
+ visibility={meta.visibility}
298
+ onClick={access.action ? access.open : undefined}
299
+ />
296
300
  ) : undefined;
297
301
 
298
302
  const mergedActions = access.action