@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
@@ -0,0 +1,265 @@
1
+ "use client";
2
+
3
+ import { lazy, Suspense, useCallback, useEffect, useRef } from "react";
4
+ import type { Message } from "@bufbuild/protobuf";
5
+ import { cn } from "@stigmer/theme";
6
+ import { getUserMessage, type AppliedManifest } from "@stigmer/sdk";
7
+ import { toast } from "../feedback/toast.js";
8
+ import { RedactedSecretsNotice } from "./RedactedSecretsNotice.js";
9
+ import { useEditResourceYaml } from "./useEditResourceYaml.js";
10
+
11
+ // CodeMirror loads only when an editor dialog actually opens (DD-013).
12
+ const LazyYamlEditor = lazy(() =>
13
+ import("./YamlEditor.js").then((m) => ({ default: m.YamlEditor })),
14
+ );
15
+
16
+ /** Props for {@link EditResourceYamlDialog}. */
17
+ export interface EditResourceYamlDialogProps {
18
+ /** Whether the dialog is open. */
19
+ readonly open: boolean;
20
+ /** Called when the dialog should open or close. */
21
+ readonly onOpenChange: (open: boolean) => void;
22
+ /**
23
+ * The resource to edit, as returned by the server. `null` while loading —
24
+ * the dialog shows the editor as soon as the resource arrives.
25
+ */
26
+ readonly resource: Message | null;
27
+ /** Called after a successful apply. Use for refetching or navigation. */
28
+ readonly onApplied?: (result: AppliedManifest) => void;
29
+ }
30
+
31
+ /**
32
+ * Modal dialog for editing a resource as YAML and applying the changes —
33
+ * the kind-agnostic "Edit YAML" experience for detail pages and panels.
34
+ *
35
+ * Workflow:
36
+ * 1. The resource is serialized to canonical YAML (system-managed state
37
+ * stripped) and seeded into a CodeMirror editor
38
+ * 2. Every edit is validated against the kind's generated proto schema;
39
+ * errors render inline with the exact schema complaint
40
+ * 3. A live summary states what applying will do ("update X" / "create Y"),
41
+ * resolved against server state — so a rename reads as a create
42
+ * 4. Apply calls the kind's `apply` RPC (create-or-update by slug)
43
+ *
44
+ * Redacted secret values (`***REDACTED***`) are explained inline: applying
45
+ * them preserves the stored secrets (the server's marker contract).
46
+ *
47
+ * Uses the native `<dialog>` element for built-in focus trapping, Escape
48
+ * key handling, and backdrop — consistent with {@link ConfirmDialog}.
49
+ *
50
+ * Zero Console dependencies — safe for platform builder embedding.
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * const { agent, refetch } = useAgent(org, slug);
55
+ *
56
+ * <EditResourceYamlDialog
57
+ * open={editOpen}
58
+ * onOpenChange={setEditOpen}
59
+ * resource={agent}
60
+ * onApplied={() => refetch()}
61
+ * />
62
+ * ```
63
+ */
64
+ export function EditResourceYamlDialog({
65
+ open,
66
+ onOpenChange,
67
+ resource,
68
+ onApplied,
69
+ }: EditResourceYamlDialogProps) {
70
+ const dialogRef = useRef<HTMLDialogElement>(null);
71
+ const edit = useEditResourceYaml({ resource });
72
+ const { reset } = edit;
73
+
74
+ // Sync dialog open state with the native <dialog> element.
75
+ useEffect(() => {
76
+ const dialog = dialogRef.current;
77
+ if (!dialog) return;
78
+ if (open && !dialog.open) {
79
+ dialog.showModal();
80
+ } else if (!open && dialog.open) {
81
+ dialog.close();
82
+ }
83
+ }, [open]);
84
+
85
+ // Discard stale edits from a previous session when the dialog opens.
86
+ useEffect(() => {
87
+ if (open) reset();
88
+ }, [open, reset]);
89
+
90
+ const handleCancel = useCallback(
91
+ (e: React.SyntheticEvent) => {
92
+ e.preventDefault();
93
+ onOpenChange(false);
94
+ },
95
+ [onOpenChange],
96
+ );
97
+
98
+ const handleApply = useCallback(async () => {
99
+ try {
100
+ const result = await edit.apply();
101
+ if (!result) return;
102
+ toast.success(`${result.displayName} "${result.name}" applied`);
103
+ onOpenChange(false);
104
+ onApplied?.(result);
105
+ } catch {
106
+ // error state is set by the hook and rendered inline
107
+ }
108
+ }, [edit, onOpenChange, onApplied]);
109
+
110
+ const canApply =
111
+ edit.validation.status === "valid" && edit.isDirty && !edit.isApplying;
112
+
113
+ return (
114
+ <dialog
115
+ ref={dialogRef}
116
+ onCancel={handleCancel}
117
+ className={cn(
118
+ "fixed inset-0 z-50 m-auto w-full max-w-3xl rounded-lg border border-border bg-popover p-0 text-popover-foreground shadow-lg",
119
+ "backdrop:bg-black/50",
120
+ "open:animate-in open:fade-in-0 open:zoom-in-95",
121
+ )}
122
+ >
123
+ <div className="flex flex-col gap-4 p-6">
124
+ {/* Header */}
125
+ <div className="flex flex-col gap-1">
126
+ <h3 className="text-base font-semibold text-foreground">Edit YAML</h3>
127
+ <p className="text-sm text-muted-foreground">
128
+ Edit the resource definition and apply. Changes are validated
129
+ against the resource schema as you type.
130
+ </p>
131
+ </div>
132
+
133
+ {/* Editor */}
134
+ {resource ? (
135
+ <Suspense fallback={<EditorLoading />}>
136
+ <LazyYamlEditor
137
+ value={edit.yaml}
138
+ onChange={edit.setYaml}
139
+ className="h-80"
140
+ />
141
+ </Suspense>
142
+ ) : (
143
+ <EditorLoading label="Loading resource…" />
144
+ )}
145
+
146
+ {edit.hasRedactedSecrets && <RedactedSecretsNotice />}
147
+
148
+ {/* Validation error */}
149
+ {edit.validation.status === "invalid" && (
150
+ <div
151
+ role="alert"
152
+ className="rounded-md border border-destructive bg-card px-3 py-2.5 text-sm text-destructive"
153
+ >
154
+ {edit.validation.message}
155
+ </div>
156
+ )}
157
+
158
+ {/* Apply error — the server's refusal (e.g. a datastore
159
+ collection-removal rejection) rendered verbatim, with an
160
+ acknowledge-and-retry affordance: the operator reads the
161
+ guard, edits or decides, and re-applies without reopening
162
+ the dialog. */}
163
+ {edit.error && (
164
+ <div
165
+ role="alert"
166
+ className="flex items-start gap-3 rounded-md border border-destructive bg-card px-3 py-2.5"
167
+ >
168
+ <p className="flex-1 text-sm text-destructive">
169
+ {getUserMessage(edit.error)}
170
+ </p>
171
+ <div className="flex shrink-0 items-center gap-2">
172
+ <button
173
+ type="button"
174
+ onClick={handleApply}
175
+ disabled={edit.validation.status !== "valid" || edit.isApplying}
176
+ className={cn(
177
+ "rounded-md border border-input bg-background px-2 py-1 text-xs font-medium text-foreground",
178
+ "hover:bg-accent hover:text-accent-foreground",
179
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
180
+ "disabled:pointer-events-none disabled:opacity-50",
181
+ )}
182
+ >
183
+ Try again
184
+ </button>
185
+ <button
186
+ type="button"
187
+ onClick={edit.clearError}
188
+ aria-label="Dismiss error"
189
+ className={cn(
190
+ "rounded-md px-2 py-1 text-xs font-medium text-muted-foreground",
191
+ "hover:bg-accent hover:text-foreground",
192
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
193
+ )}
194
+ >
195
+ Dismiss
196
+ </button>
197
+ </div>
198
+ </div>
199
+ )}
200
+
201
+ {/* Footer: target summary + actions */}
202
+ <div className="flex items-center justify-between gap-3">
203
+ <p className="text-xs text-muted-foreground" aria-live="polite">
204
+ {targetSummary(edit.validation.status, edit.isDirty, edit.target)}
205
+ </p>
206
+ <div className="flex gap-2">
207
+ <button
208
+ type="button"
209
+ onClick={() => onOpenChange(false)}
210
+ disabled={edit.isApplying}
211
+ className={cn(
212
+ "rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
213
+ "border border-input bg-background text-foreground",
214
+ "hover:bg-accent hover:text-accent-foreground",
215
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
216
+ "disabled:pointer-events-none disabled:opacity-50",
217
+ )}
218
+ >
219
+ Cancel
220
+ </button>
221
+ <button
222
+ type="button"
223
+ onClick={handleApply}
224
+ disabled={!canApply}
225
+ className={cn(
226
+ "rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
227
+ "bg-primary text-primary-foreground hover:bg-primary-hover",
228
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
229
+ "disabled:pointer-events-none disabled:opacity-50",
230
+ )}
231
+ >
232
+ {edit.isApplying ? "Applying…" : "Apply changes"}
233
+ </button>
234
+ </div>
235
+ </div>
236
+ </div>
237
+ </dialog>
238
+ );
239
+ }
240
+
241
+ function targetSummary(
242
+ validationStatus: "empty" | "invalid" | "valid",
243
+ isDirty: boolean,
244
+ target: ReturnType<typeof useEditResourceYaml>["target"],
245
+ ): string {
246
+ if (validationStatus !== "valid") return "";
247
+ if (!isDirty) return "No changes yet.";
248
+ if (target === null) return "Checking what applying will do…";
249
+ switch (target.action) {
250
+ case "update":
251
+ return `Applying will update ${target.slug}.`;
252
+ case "create":
253
+ return `Applying will create ${target.slug} — the name or slug changed.`;
254
+ case "unknown":
255
+ return `Applying will create or update ${target.slug}.`;
256
+ }
257
+ }
258
+
259
+ function EditorLoading({ label = "Loading editor…" }: { readonly label?: string }) {
260
+ return (
261
+ <div className="flex h-80 items-center justify-center rounded-md border border-border bg-muted text-sm text-muted-foreground">
262
+ {label}
263
+ </div>
264
+ );
265
+ }
@@ -0,0 +1,30 @@
1
+ "use client";
2
+
3
+ import { cn } from "@stigmer/theme";
4
+
5
+ /** Props for {@link RedactedSecretsNotice}. */
6
+ export interface RedactedSecretsNoticeProps {
7
+ /** Additional CSS classes for the root container. */
8
+ readonly className?: string;
9
+ }
10
+
11
+ /**
12
+ * Inline explanation shown when manifest content contains `***REDACTED***`
13
+ * secret markers, so the marker reads as a contract rather than a bug:
14
+ * applying it preserves the stored secret; replacing it sets a new value.
15
+ *
16
+ * Shared by {@link EditResourceYamlDialog} and {@link ApplyManifestDialog}.
17
+ */
18
+ export function RedactedSecretsNotice({ className }: RedactedSecretsNoticeProps) {
19
+ return (
20
+ <p
21
+ className={cn(
22
+ "rounded-md border border-border bg-muted px-3 py-2 text-xs text-muted-foreground",
23
+ className,
24
+ )}
25
+ >
26
+ Secret values are shown as <code className="font-mono">***REDACTED***</code>.
27
+ Applying keeps the stored secrets; replace a marker to set a new value.
28
+ </p>
29
+ );
30
+ }
@@ -0,0 +1,272 @@
1
+ "use client";
2
+
3
+ import {
4
+ useRef,
5
+ useEffect,
6
+ memo,
7
+ type CSSProperties,
8
+ } from "react";
9
+ import { cn } from "@stigmer/theme";
10
+ import { EditorState, Compartment } from "@codemirror/state";
11
+ import { EditorView, keymap, lineNumbers, highlightActiveLine, drawSelection, highlightSpecialChars } from "@codemirror/view";
12
+ import { yaml } from "@codemirror/lang-yaml";
13
+ import { syntaxHighlighting, HighlightStyle, bracketMatching, indentOnInput, foldGutter } from "@codemirror/language";
14
+ import { tags } from "@lezer/highlight";
15
+ import { lintGutter, type Diagnostic, setDiagnostics } from "@codemirror/lint";
16
+ import { defaultKeymap, indentWithTab, history, historyKeymap } from "@codemirror/commands";
17
+ import { autocompletion } from "@codemirror/autocomplete";
18
+
19
+ /** Props for {@link YamlEditor}. */
20
+ export interface YamlEditorProps {
21
+ /** Current YAML content. */
22
+ readonly value: string;
23
+ /** Called when the editor content changes. */
24
+ readonly onChange?: (value: string) => void;
25
+ /** Validation diagnostics to display as inline markers. */
26
+ readonly diagnostics?: readonly Diagnostic[];
27
+ /** Whether the editor is read-only. @default false */
28
+ readonly readOnly?: boolean;
29
+ /** Additional CSS class names for the root container. */
30
+ readonly className?: string;
31
+ /** Additional inline styles for the root container. */
32
+ readonly style?: CSSProperties;
33
+ }
34
+
35
+ /**
36
+ * YAML editor built on CodeMirror 6, shared by every YAML surface in the
37
+ * SDK (workflow editor tab, resource manifest dialogs).
38
+ *
39
+ * Provides syntax highlighting, line numbers, bracket matching,
40
+ * code folding, undo/redo, and inline diagnostic markers driven by
41
+ * external validation (via the `diagnostics` prop).
42
+ *
43
+ * Themed via `--stgm-*` CSS custom properties to respect the host
44
+ * application's design tokens.
45
+ *
46
+ * This is an optional SDK component — it requires CodeMirror peer
47
+ * dependencies. Consumers that render it conditionally should load it
48
+ * via `React.lazy` so the CodeMirror bundle stays out of paths that
49
+ * never open an editor (DD-013).
50
+ *
51
+ * @example
52
+ * ```tsx
53
+ * <YamlEditor
54
+ * value={yaml}
55
+ * onChange={setYaml}
56
+ * diagnostics={diagnostics}
57
+ * />
58
+ * ```
59
+ */
60
+ export const YamlEditor = memo(function YamlEditor({
61
+ value,
62
+ onChange,
63
+ diagnostics,
64
+ readOnly = false,
65
+ className,
66
+ style,
67
+ }: YamlEditorProps) {
68
+ const containerRef = useRef<HTMLDivElement>(null);
69
+ const viewRef = useRef<EditorView | null>(null);
70
+ const readOnlyCompartment = useRef(new Compartment());
71
+ const onChangeRef = useRef(onChange);
72
+ onChangeRef.current = onChange;
73
+
74
+ const isInternalUpdate = useRef(false);
75
+
76
+ useEffect(() => {
77
+ if (!containerRef.current) return;
78
+
79
+ const updateListener = EditorView.updateListener.of((update) => {
80
+ if (update.docChanged) {
81
+ isInternalUpdate.current = true;
82
+ onChangeRef.current?.(update.state.doc.toString());
83
+ }
84
+ });
85
+
86
+ const state = EditorState.create({
87
+ doc: value,
88
+ extensions: [
89
+ lineNumbers(),
90
+ highlightActiveLine(),
91
+ highlightSpecialChars(),
92
+ drawSelection(),
93
+ bracketMatching(),
94
+ indentOnInput(),
95
+ foldGutter(),
96
+ history(),
97
+ yaml(),
98
+ syntaxHighlighting(stigmerHighlightStyle, { fallback: true }),
99
+ autocompletion(),
100
+ lintGutter(),
101
+ keymap.of([...defaultKeymap, ...historyKeymap, indentWithTab]),
102
+ readOnlyCompartment.current.of(EditorState.readOnly.of(readOnly)),
103
+ stigmerTheme,
104
+ updateListener,
105
+ ],
106
+ });
107
+
108
+ const view = new EditorView({
109
+ state,
110
+ parent: containerRef.current,
111
+ });
112
+
113
+ viewRef.current = view;
114
+
115
+ return () => {
116
+ view.destroy();
117
+ viewRef.current = null;
118
+ };
119
+ }, []);
120
+
121
+ // Sync external value changes into the editor
122
+ useEffect(() => {
123
+ const view = viewRef.current;
124
+ if (!view) return;
125
+
126
+ if (isInternalUpdate.current) {
127
+ isInternalUpdate.current = false;
128
+ return;
129
+ }
130
+
131
+ const currentDoc = view.state.doc.toString();
132
+ if (currentDoc !== value) {
133
+ view.dispatch({
134
+ changes: {
135
+ from: 0,
136
+ to: currentDoc.length,
137
+ insert: value,
138
+ },
139
+ });
140
+ }
141
+ }, [value]);
142
+
143
+ useEffect(() => {
144
+ const view = viewRef.current;
145
+ if (!view) return;
146
+
147
+ view.dispatch({
148
+ effects: readOnlyCompartment.current.reconfigure(
149
+ EditorState.readOnly.of(readOnly),
150
+ ),
151
+ });
152
+ }, [readOnly]);
153
+
154
+ // Sync diagnostics into CodeMirror's lint system
155
+ useEffect(() => {
156
+ const view = viewRef.current;
157
+ if (!view) return;
158
+
159
+ const cmDiags: Diagnostic[] = diagnostics
160
+ ? diagnostics.map((d) => ({
161
+ ...d,
162
+ from: Math.min(d.from, view.state.doc.length),
163
+ to: Math.min(d.to, view.state.doc.length),
164
+ }))
165
+ : [];
166
+
167
+ view.dispatch(setDiagnostics(view.state, cmDiags));
168
+ }, [diagnostics]);
169
+
170
+ return (
171
+ <div
172
+ ref={containerRef}
173
+ className={cn(
174
+ "stgm-yaml-editor overflow-auto rounded-md border border-border bg-background font-mono text-sm",
175
+ className,
176
+ )}
177
+ style={style}
178
+ />
179
+ );
180
+ });
181
+
182
+ // ---------------------------------------------------------------------------
183
+ // Syntax highlighting: maps lezer tags to --stgm-syntax-* CSS variables
184
+ // ---------------------------------------------------------------------------
185
+
186
+ const stigmerHighlightStyle = HighlightStyle.define([
187
+ { tag: tags.propertyName, color: "var(--stgm-syntax-property, #0550ae)" },
188
+ { tag: tags.tagName, color: "var(--stgm-syntax-tag, #cf222e)" },
189
+ { tag: tags.keyword, color: "var(--stgm-syntax-keyword, #8250df)", fontWeight: "bold" },
190
+ { tag: tags.string, color: "var(--stgm-syntax-string, #0a3069)" },
191
+ { tag: tags.number, color: "var(--stgm-syntax-number, #953800)" },
192
+ { tag: [tags.bool, tags.null], color: "var(--stgm-syntax-bool, #8250df)" },
193
+ { tag: tags.atom, color: "var(--stgm-syntax-atom, #cf222e)" },
194
+ { tag: tags.comment, color: "var(--stgm-syntax-comment, #6e7781)", fontStyle: "italic" },
195
+ { tag: tags.meta, color: "var(--stgm-syntax-meta, #8250df)" },
196
+ { tag: tags.name, color: "var(--stgm-foreground, #1a1a2e)" },
197
+ { tag: tags.definition(tags.name), color: "var(--stgm-syntax-property, #0550ae)" },
198
+ { tag: tags.separator, color: "var(--stgm-muted-foreground, #737373)" },
199
+ { tag: tags.punctuation, color: "var(--stgm-muted-foreground, #737373)" },
200
+ ]);
201
+
202
+ // ---------------------------------------------------------------------------
203
+ // CodeMirror theme bridge: maps --stgm-* tokens to editor styles
204
+ // ---------------------------------------------------------------------------
205
+
206
+ const stigmerTheme = EditorView.theme({
207
+ "&": {
208
+ height: "100%",
209
+ backgroundColor: "var(--stgm-background, #fff)",
210
+ color: "var(--stgm-foreground, #1a1a2e)",
211
+ fontSize: "13px",
212
+ },
213
+ ".cm-content": {
214
+ caretColor: "var(--stgm-foreground, #1a1a2e)",
215
+ fontFamily: "var(--stgm-font-mono, ui-monospace, monospace)",
216
+ padding: "8px 0",
217
+ },
218
+ ".cm-cursor, .cm-dropCursor": {
219
+ borderLeftColor: "var(--stgm-foreground, #1a1a2e)",
220
+ },
221
+ "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":
222
+ {
223
+ backgroundColor: "var(--stgm-accent, #e0e7ff)",
224
+ },
225
+ ".cm-gutters": {
226
+ backgroundColor: "var(--stgm-muted, #f5f5f5)",
227
+ color: "var(--stgm-muted-foreground, #737373)",
228
+ border: "none",
229
+ borderRight: "1px solid var(--stgm-border, #e5e5e5)",
230
+ },
231
+ ".cm-activeLineGutter": {
232
+ backgroundColor: "var(--stgm-accent, #e0e7ff)",
233
+ },
234
+ ".cm-activeLine": {
235
+ backgroundColor: "color-mix(in srgb, var(--stgm-accent, #e0e7ff) 30%, transparent)",
236
+ },
237
+ ".cm-foldPlaceholder": {
238
+ backgroundColor: "var(--stgm-muted, #f5f5f5)",
239
+ border: "1px solid var(--stgm-border, #e5e5e5)",
240
+ color: "var(--stgm-muted-foreground, #737373)",
241
+ },
242
+ ".cm-tooltip": {
243
+ backgroundColor: "var(--stgm-popover, #fff)",
244
+ color: "var(--stgm-popover-foreground, #1a1a2e)",
245
+ border: "1px solid var(--stgm-border, #e5e5e5)",
246
+ borderRadius: "6px",
247
+ boxShadow: "0 2px 8px rgba(0,0,0,0.08)",
248
+ },
249
+ ".cm-tooltip-autocomplete": {
250
+ "& > ul > li[aria-selected]": {
251
+ backgroundColor: "var(--stgm-accent, #e0e7ff)",
252
+ color: "var(--stgm-accent-foreground, #1a1a2e)",
253
+ },
254
+ },
255
+ ".cm-diagnostic-error": {
256
+ borderLeft: "3px solid var(--stgm-destructive, #ef4444)",
257
+ },
258
+ ".cm-diagnostic-warning": {
259
+ borderLeft: "3px solid var(--stgm-warning, #f59e0b)",
260
+ },
261
+ ".cm-diagnostic-info": {
262
+ borderLeft: "3px solid var(--stgm-primary, #6366f1)",
263
+ },
264
+ ".cm-lint-marker-error": {
265
+ content: "'●'",
266
+ color: "var(--stgm-destructive, #ef4444)",
267
+ },
268
+ ".cm-lint-marker-warning": {
269
+ content: "'●'",
270
+ color: "var(--stgm-warning, #f59e0b)",
271
+ },
272
+ });
@@ -0,0 +1,118 @@
1
+ // Tests for the shared Edit-YAML dialog's apply-error affordance
2
+ // (DD-008 SD-6): the server's refusal renders verbatim with
3
+ // Try-again/Dismiss — shared by every kind (McpServer, Agent, Skill,
4
+ // Datastore), so the datastore collection-removal rejection and any
5
+ // other apply-time guard get the same acknowledge-and-retry treatment.
6
+
7
+ import { describe, it, expect, vi, beforeAll, afterEach } from "vitest";
8
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
9
+ import { create } from "@bufbuild/protobuf";
10
+ import { DatastoreSchema } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
11
+ import { EditResourceYamlDialog } from "../EditResourceYamlDialog";
12
+ import type { useEditResourceYaml } from "../useEditResourceYaml";
13
+
14
+ beforeAll(() => {
15
+ HTMLDialogElement.prototype.showModal = function showModal() {
16
+ this.open = true;
17
+ };
18
+ HTMLDialogElement.prototype.close = function close() {
19
+ this.open = false;
20
+ };
21
+ });
22
+
23
+ afterEach(() => {
24
+ cleanup();
25
+ vi.restoreAllMocks();
26
+ });
27
+
28
+ type EditState = ReturnType<typeof useEditResourceYaml>;
29
+
30
+ const applyMock = vi.fn();
31
+ const clearErrorMock = vi.fn();
32
+
33
+ let editState: Partial<EditState>;
34
+
35
+ vi.mock("../useEditResourceYaml", () => ({
36
+ useEditResourceYaml: () => ({
37
+ yaml: "kind: Datastore",
38
+ setYaml: vi.fn(),
39
+ validation: { status: "valid" as const },
40
+ target: { action: "update" as const, slug: "clinic" },
41
+ isDirty: true,
42
+ isApplying: false,
43
+ error: null,
44
+ clearError: clearErrorMock,
45
+ apply: applyMock,
46
+ reset: vi.fn(),
47
+ hasRedactedSecrets: false,
48
+ ...editState,
49
+ }),
50
+ }));
51
+
52
+ // CodeMirror stays out of the test environment.
53
+ vi.mock("../YamlEditor", () => ({
54
+ YamlEditor: () => <div data-testid="yaml-editor" />,
55
+ }));
56
+
57
+ const RESOURCE = create(DatastoreSchema, {
58
+ metadata: { id: "dst_1", slug: "clinic", org: "acme", name: "Clinic" },
59
+ });
60
+
61
+ function renderDialog() {
62
+ return render(
63
+ <EditResourceYamlDialog
64
+ open
65
+ onOpenChange={vi.fn()}
66
+ resource={RESOURCE}
67
+ onApplied={vi.fn()}
68
+ />,
69
+ );
70
+ }
71
+
72
+ describe("EditResourceYamlDialog — apply-error affordance", () => {
73
+ it("renders the server's refusal verbatim with Try again and Dismiss", () => {
74
+ editState = {
75
+ error: new Error(
76
+ 'collection "old_notes" was removed from the spec; re-apply with the removal acknowledged',
77
+ ),
78
+ };
79
+ renderDialog();
80
+
81
+ const alert = screen.getByRole("alert");
82
+ expect(alert.textContent).toContain(
83
+ 'collection "old_notes" was removed from the spec',
84
+ );
85
+ expect(screen.getByRole("button", { name: "Try again" })).toBeTruthy();
86
+ expect(screen.getByRole("button", { name: "Dismiss error" })).toBeTruthy();
87
+ });
88
+
89
+ it("Try again re-invokes apply without reopening the dialog", () => {
90
+ editState = { error: new Error("guard refused") };
91
+ renderDialog();
92
+
93
+ fireEvent.click(screen.getByRole("button", { name: "Try again" }));
94
+ expect(applyMock).toHaveBeenCalled();
95
+ });
96
+
97
+ it("Dismiss clears the error state", () => {
98
+ editState = { error: new Error("guard refused") };
99
+ renderDialog();
100
+
101
+ fireEvent.click(screen.getByRole("button", { name: "Dismiss error" }));
102
+ expect(clearErrorMock).toHaveBeenCalled();
103
+ });
104
+
105
+ it("Try again is disabled while a retry is already in flight", () => {
106
+ editState = { error: new Error("guard refused"), isApplying: true };
107
+ renderDialog();
108
+
109
+ const retry = screen.getByRole("button", { name: "Try again" }) as HTMLButtonElement;
110
+ expect(retry.disabled).toBe(true);
111
+ });
112
+
113
+ it("renders no error affordances when healthy", () => {
114
+ editState = {};
115
+ renderDialog();
116
+ expect(screen.queryByRole("button", { name: "Try again" })).toBeNull();
117
+ });
118
+ });