@stigmer/react 3.2.3 → 3.4.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 (460) hide show
  1. package/agent/steps/ReviewStep.d.ts.map +1 -1
  2. package/agent/steps/ReviewStep.js +2 -3
  3. package/agent/steps/ReviewStep.js.map +1 -1
  4. package/billing/index.d.ts.map +1 -1
  5. package/billing/index.js +4 -0
  6. package/billing/index.js.map +1 -1
  7. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  8. package/channel/AgentChannelsPanel.js +11 -5
  9. package/channel/AgentChannelsPanel.js.map +1 -1
  10. package/composer/SessionComposer.d.ts +1 -1
  11. package/cursor-accounts/CursorAccountEditor.d.ts +34 -0
  12. package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
  13. package/cursor-accounts/CursorAccountEditor.js +67 -0
  14. package/cursor-accounts/CursorAccountEditor.js.map +1 -0
  15. package/cursor-accounts/CursorAccountsAccessNotice.d.ts +11 -0
  16. package/cursor-accounts/CursorAccountsAccessNotice.d.ts.map +1 -0
  17. package/cursor-accounts/CursorAccountsAccessNotice.js +14 -0
  18. package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -0
  19. package/cursor-accounts/CursorAccountsConsole.d.ts +32 -0
  20. package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
  21. package/cursor-accounts/CursorAccountsConsole.js +169 -0
  22. package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
  23. package/cursor-accounts/MemberCoverageTable.d.ts +29 -0
  24. package/cursor-accounts/MemberCoverageTable.d.ts.map +1 -0
  25. package/cursor-accounts/MemberCoverageTable.js +150 -0
  26. package/cursor-accounts/MemberCoverageTable.js.map +1 -0
  27. package/cursor-accounts/MemberKeysPanel.d.ts +25 -0
  28. package/cursor-accounts/MemberKeysPanel.d.ts.map +1 -0
  29. package/cursor-accounts/MemberKeysPanel.js +115 -0
  30. package/cursor-accounts/MemberKeysPanel.js.map +1 -0
  31. package/cursor-accounts/badges.d.ts +9 -0
  32. package/cursor-accounts/badges.d.ts.map +1 -0
  33. package/cursor-accounts/badges.js +10 -0
  34. package/cursor-accounts/badges.js.map +1 -0
  35. package/cursor-accounts/cursor-account-coverage.d.ts +41 -0
  36. package/cursor-accounts/cursor-account-coverage.d.ts.map +1 -0
  37. package/cursor-accounts/cursor-account-coverage.js +26 -0
  38. package/cursor-accounts/cursor-account-coverage.js.map +1 -0
  39. package/cursor-accounts/cursor-account-format.d.ts +23 -0
  40. package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
  41. package/cursor-accounts/cursor-account-format.js +41 -0
  42. package/cursor-accounts/cursor-account-format.js.map +1 -0
  43. package/cursor-accounts/index.d.ts +18 -0
  44. package/cursor-accounts/index.d.ts.map +1 -0
  45. package/cursor-accounts/index.js +13 -0
  46. package/cursor-accounts/index.js.map +1 -0
  47. package/cursor-accounts/useCursorAccountView.d.ts +30 -0
  48. package/cursor-accounts/useCursorAccountView.d.ts.map +1 -0
  49. package/cursor-accounts/useCursorAccountView.js +25 -0
  50. package/cursor-accounts/useCursorAccountView.js.map +1 -0
  51. package/cursor-accounts/useCursorAccounts.d.ts +33 -0
  52. package/cursor-accounts/useCursorAccounts.d.ts.map +1 -0
  53. package/cursor-accounts/useCursorAccounts.js +25 -0
  54. package/cursor-accounts/useCursorAccounts.js.map +1 -0
  55. package/cursor-accounts/useCursorMemberKeyActions.d.ts +49 -0
  56. package/cursor-accounts/useCursorMemberKeyActions.d.ts.map +1 -0
  57. package/cursor-accounts/useCursorMemberKeyActions.js +38 -0
  58. package/cursor-accounts/useCursorMemberKeyActions.js.map +1 -0
  59. package/cursor-accounts/useDeleteCursorAccount.d.ts +30 -0
  60. package/cursor-accounts/useDeleteCursorAccount.d.ts.map +1 -0
  61. package/cursor-accounts/useDeleteCursorAccount.js +32 -0
  62. package/cursor-accounts/useDeleteCursorAccount.js.map +1 -0
  63. package/cursor-accounts/useSyncCursorAccount.d.ts +23 -0
  64. package/cursor-accounts/useSyncCursorAccount.d.ts.map +1 -0
  65. package/cursor-accounts/useSyncCursorAccount.js +31 -0
  66. package/cursor-accounts/useSyncCursorAccount.js.map +1 -0
  67. package/cursor-accounts/useUpsertCursorAccount.d.ts +26 -0
  68. package/cursor-accounts/useUpsertCursorAccount.d.ts.map +1 -0
  69. package/cursor-accounts/useUpsertCursorAccount.js +34 -0
  70. package/cursor-accounts/useUpsertCursorAccount.js.map +1 -0
  71. package/datastore/CollectionRecordsBrowser.d.ts +34 -0
  72. package/datastore/CollectionRecordsBrowser.d.ts.map +1 -0
  73. package/datastore/CollectionRecordsBrowser.js +223 -0
  74. package/datastore/CollectionRecordsBrowser.js.map +1 -0
  75. package/datastore/CollectionSchemaView.d.ts +29 -0
  76. package/datastore/CollectionSchemaView.d.ts.map +1 -0
  77. package/datastore/CollectionSchemaView.js +93 -0
  78. package/datastore/CollectionSchemaView.js.map +1 -0
  79. package/datastore/DatastoreDetailView.d.ts +44 -0
  80. package/datastore/DatastoreDetailView.d.ts.map +1 -0
  81. package/datastore/DatastoreDetailView.js +76 -0
  82. package/datastore/DatastoreDetailView.js.map +1 -0
  83. package/datastore/DatastoreSyncReport.d.ts +19 -0
  84. package/datastore/DatastoreSyncReport.d.ts.map +1 -0
  85. package/datastore/DatastoreSyncReport.js +45 -0
  86. package/datastore/DatastoreSyncReport.js.map +1 -0
  87. package/datastore/DeleteDatastoreDialog.d.ts +35 -0
  88. package/datastore/DeleteDatastoreDialog.d.ts.map +1 -0
  89. package/datastore/DeleteDatastoreDialog.js +90 -0
  90. package/datastore/DeleteDatastoreDialog.js.map +1 -0
  91. package/datastore/FieldValueControl.d.ts +55 -0
  92. package/datastore/FieldValueControl.d.ts.map +1 -0
  93. package/datastore/FieldValueControl.js +138 -0
  94. package/datastore/FieldValueControl.js.map +1 -0
  95. package/datastore/RecordFilterBuilder.d.ts +37 -0
  96. package/datastore/RecordFilterBuilder.d.ts.map +1 -0
  97. package/datastore/RecordFilterBuilder.js +122 -0
  98. package/datastore/RecordFilterBuilder.js.map +1 -0
  99. package/datastore/RecordFormPanel.d.ts +45 -0
  100. package/datastore/RecordFormPanel.d.ts.map +1 -0
  101. package/datastore/RecordFormPanel.js +215 -0
  102. package/datastore/RecordFormPanel.js.map +1 -0
  103. package/datastore/index.d.ts +43 -0
  104. package/datastore/index.d.ts.map +1 -0
  105. package/datastore/index.js +22 -0
  106. package/datastore/index.js.map +1 -0
  107. package/datastore/recordFilter.d.ts +62 -0
  108. package/datastore/recordFilter.d.ts.map +1 -0
  109. package/datastore/recordFilter.js +104 -0
  110. package/datastore/recordFilter.js.map +1 -0
  111. package/datastore/recordValues.d.ts +85 -0
  112. package/datastore/recordValues.d.ts.map +1 -0
  113. package/datastore/recordValues.js +282 -0
  114. package/datastore/recordValues.js.map +1 -0
  115. package/datastore/useDatastore.d.ts +39 -0
  116. package/datastore/useDatastore.d.ts.map +1 -0
  117. package/datastore/useDatastore.js +44 -0
  118. package/datastore/useDatastore.js.map +1 -0
  119. package/datastore/useDatastoreCount.d.ts +48 -0
  120. package/datastore/useDatastoreCount.d.ts.map +1 -0
  121. package/datastore/useDatastoreCount.js +27 -0
  122. package/datastore/useDatastoreCount.js.map +1 -0
  123. package/datastore/useDatastoreDescription.d.ts +54 -0
  124. package/datastore/useDatastoreDescription.d.ts.map +1 -0
  125. package/datastore/useDatastoreDescription.js +50 -0
  126. package/datastore/useDatastoreDescription.js.map +1 -0
  127. package/datastore/useDatastoreList.d.ts +57 -0
  128. package/datastore/useDatastoreList.d.ts.map +1 -0
  129. package/datastore/useDatastoreList.js +29 -0
  130. package/datastore/useDatastoreList.js.map +1 -0
  131. package/datastore/useDatastoreSearch.d.ts +19 -0
  132. package/datastore/useDatastoreSearch.d.ts.map +1 -0
  133. package/datastore/useDatastoreSearch.js +22 -0
  134. package/datastore/useDatastoreSearch.js.map +1 -0
  135. package/datastore/useDeleteDatastore.d.ts +53 -0
  136. package/datastore/useDeleteDatastore.d.ts.map +1 -0
  137. package/datastore/useDeleteDatastore.js +40 -0
  138. package/datastore/useDeleteDatastore.js.map +1 -0
  139. package/datastore/useDeleteRecord.d.ts +34 -0
  140. package/datastore/useDeleteRecord.d.ts.map +1 -0
  141. package/datastore/useDeleteRecord.js +43 -0
  142. package/datastore/useDeleteRecord.js.map +1 -0
  143. package/datastore/useInsertRecord.d.ts +50 -0
  144. package/datastore/useInsertRecord.d.ts.map +1 -0
  145. package/datastore/useInsertRecord.js +55 -0
  146. package/datastore/useInsertRecord.js.map +1 -0
  147. package/datastore/useRecordCollection.d.ts +104 -0
  148. package/datastore/useRecordCollection.d.ts.map +1 -0
  149. package/datastore/useRecordCollection.js +136 -0
  150. package/datastore/useRecordCollection.js.map +1 -0
  151. package/datastore/useRecordList.d.ts +66 -0
  152. package/datastore/useRecordList.d.ts.map +1 -0
  153. package/datastore/useRecordList.js +58 -0
  154. package/datastore/useRecordList.js.map +1 -0
  155. package/datastore/useUpdateRecord.d.ts +52 -0
  156. package/datastore/useUpdateRecord.d.ts.map +1 -0
  157. package/datastore/useUpdateRecord.js +55 -0
  158. package/datastore/useUpdateRecord.js.map +1 -0
  159. package/environment/EnvironmentListPanel.d.ts.map +1 -1
  160. package/environment/EnvironmentListPanel.js +12 -7
  161. package/environment/EnvironmentListPanel.js.map +1 -1
  162. package/execution/ExecutionProgress.d.ts.map +1 -1
  163. package/execution/ExecutionProgress.js +13 -4
  164. package/execution/ExecutionProgress.js.map +1 -1
  165. package/execution/MessageThread.d.ts.map +1 -1
  166. package/execution/MessageThread.js +10 -2
  167. package/execution/MessageThread.js.map +1 -1
  168. package/execution/useCreateAgentExecution.d.ts +31 -1
  169. package/execution/useCreateAgentExecution.d.ts.map +1 -1
  170. package/execution/useCreateAgentExecution.js +2 -0
  171. package/execution/useCreateAgentExecution.js.map +1 -1
  172. package/iam-policy/index.d.ts +1 -1
  173. package/iam-policy/index.d.ts.map +1 -1
  174. package/iam-policy/index.js.map +1 -1
  175. package/iam-policy/useCheckPermission.d.ts +32 -11
  176. package/iam-policy/useCheckPermission.d.ts.map +1 -1
  177. package/iam-policy/useCheckPermission.js +24 -19
  178. package/iam-policy/useCheckPermission.js.map +1 -1
  179. package/index.d.ts +12 -4
  180. package/index.d.ts.map +1 -1
  181. package/index.js +18 -3
  182. package/index.js.map +1 -1
  183. package/internal/form-primitives.d.ts +10 -0
  184. package/internal/form-primitives.d.ts.map +1 -0
  185. package/internal/form-primitives.js +15 -0
  186. package/internal/form-primitives.js.map +1 -0
  187. package/library/index.d.ts +0 -7
  188. package/library/index.d.ts.map +1 -1
  189. package/library/index.js +0 -4
  190. package/library/index.js.map +1 -1
  191. package/library/useApplyResource.d.ts +12 -12
  192. package/library/useApplyResource.d.ts.map +1 -1
  193. package/library/useApplyResource.js +16 -25
  194. package/library/useApplyResource.js.map +1 -1
  195. package/library/useExportResource.d.ts +13 -9
  196. package/library/useExportResource.d.ts.map +1 -1
  197. package/library/useExportResource.js +18 -36
  198. package/library/useExportResource.js.map +1 -1
  199. package/manifest/ApplyManifestDialog.d.ts +48 -0
  200. package/manifest/ApplyManifestDialog.d.ts.map +1 -0
  201. package/manifest/ApplyManifestDialog.js +135 -0
  202. package/manifest/ApplyManifestDialog.js.map +1 -0
  203. package/manifest/EditResourceYamlDialog.d.ts +51 -0
  204. package/manifest/EditResourceYamlDialog.d.ts.map +1 -0
  205. package/manifest/EditResourceYamlDialog.js +104 -0
  206. package/manifest/EditResourceYamlDialog.js.map +1 -0
  207. package/manifest/RedactedSecretsNotice.d.ts +14 -0
  208. package/manifest/RedactedSecretsNotice.d.ts.map +1 -0
  209. package/manifest/RedactedSecretsNotice.js +14 -0
  210. package/manifest/RedactedSecretsNotice.js.map +1 -0
  211. package/manifest/YamlEditor.d.ts +44 -0
  212. package/manifest/YamlEditor.d.ts.map +1 -0
  213. package/manifest/YamlEditor.js +216 -0
  214. package/manifest/YamlEditor.js.map +1 -0
  215. package/manifest/index.d.ts +13 -0
  216. package/manifest/index.d.ts.map +1 -0
  217. package/manifest/index.js +13 -0
  218. package/manifest/index.js.map +1 -0
  219. package/manifest/useApplyManifest.d.ts +82 -0
  220. package/manifest/useApplyManifest.d.ts.map +1 -0
  221. package/manifest/useApplyManifest.js +180 -0
  222. package/manifest/useApplyManifest.js.map +1 -0
  223. package/manifest/useEditResourceYaml.d.ts +106 -0
  224. package/manifest/useEditResourceYaml.d.ts.map +1 -0
  225. package/manifest/useEditResourceYaml.js +168 -0
  226. package/manifest/useEditResourceYaml.js.map +1 -0
  227. package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
  228. package/mcp-server/steps/ReviewStep.js +2 -3
  229. package/mcp-server/steps/ReviewStep.js.map +1 -1
  230. package/package.json +4 -4
  231. package/pricing-governance/BaselineEditor.d.ts +9 -0
  232. package/pricing-governance/BaselineEditor.d.ts.map +1 -0
  233. package/pricing-governance/BaselineEditor.js +270 -0
  234. package/pricing-governance/BaselineEditor.js.map +1 -0
  235. package/pricing-governance/ModelCatalogPanel.d.ts +28 -0
  236. package/pricing-governance/ModelCatalogPanel.d.ts.map +1 -0
  237. package/pricing-governance/ModelCatalogPanel.js +102 -0
  238. package/pricing-governance/ModelCatalogPanel.js.map +1 -0
  239. package/pricing-governance/ModelGovernanceDetail.d.ts +8 -0
  240. package/pricing-governance/ModelGovernanceDetail.d.ts.map +1 -0
  241. package/pricing-governance/ModelGovernanceDetail.js +64 -0
  242. package/pricing-governance/ModelGovernanceDetail.js.map +1 -0
  243. package/pricing-governance/OperatorAccessNotice.d.ts +12 -0
  244. package/pricing-governance/OperatorAccessNotice.d.ts.map +1 -0
  245. package/pricing-governance/OperatorAccessNotice.js +15 -0
  246. package/pricing-governance/OperatorAccessNotice.js.map +1 -0
  247. package/pricing-governance/PricingGovernanceConsole.d.ts +57 -0
  248. package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -0
  249. package/pricing-governance/PricingGovernanceConsole.js +164 -0
  250. package/pricing-governance/PricingGovernanceConsole.js.map +1 -0
  251. package/pricing-governance/PricingGovernancePanel.d.ts +26 -0
  252. package/pricing-governance/PricingGovernancePanel.d.ts.map +1 -0
  253. package/pricing-governance/PricingGovernancePanel.js +64 -0
  254. package/pricing-governance/PricingGovernancePanel.js.map +1 -0
  255. package/pricing-governance/RetireConfirm.d.ts +9 -0
  256. package/pricing-governance/RetireConfirm.d.ts.map +1 -0
  257. package/pricing-governance/RetireConfirm.js +19 -0
  258. package/pricing-governance/RetireConfirm.js.map +1 -0
  259. package/pricing-governance/governance-primitives.d.ts +33 -0
  260. package/pricing-governance/governance-primitives.d.ts.map +1 -0
  261. package/pricing-governance/governance-primitives.js +43 -0
  262. package/pricing-governance/governance-primitives.js.map +1 -0
  263. package/pricing-governance/index.d.ts +19 -0
  264. package/pricing-governance/index.d.ts.map +1 -0
  265. package/pricing-governance/index.js +20 -0
  266. package/pricing-governance/index.js.map +1 -0
  267. package/pricing-governance/pricing-format.d.ts +12 -0
  268. package/pricing-governance/pricing-format.d.ts.map +1 -0
  269. package/pricing-governance/pricing-format.js +50 -0
  270. package/pricing-governance/pricing-format.js.map +1 -0
  271. package/pricing-governance/useDecidePricingOverride.d.ts +46 -0
  272. package/pricing-governance/useDecidePricingOverride.d.ts.map +1 -0
  273. package/pricing-governance/useDecidePricingOverride.js +44 -0
  274. package/pricing-governance/useDecidePricingOverride.js.map +1 -0
  275. package/pricing-governance/useModelGovernanceView.d.ts +103 -0
  276. package/pricing-governance/useModelGovernanceView.d.ts.map +1 -0
  277. package/pricing-governance/useModelGovernanceView.js +144 -0
  278. package/pricing-governance/useModelGovernanceView.js.map +1 -0
  279. package/pricing-governance/useModelPricingBaselines.d.ts +40 -0
  280. package/pricing-governance/useModelPricingBaselines.d.ts.map +1 -0
  281. package/pricing-governance/useModelPricingBaselines.js +32 -0
  282. package/pricing-governance/useModelPricingBaselines.js.map +1 -0
  283. package/pricing-governance/usePricingGovernance.d.ts +39 -0
  284. package/pricing-governance/usePricingGovernance.d.ts.map +1 -0
  285. package/pricing-governance/usePricingGovernance.js +31 -0
  286. package/pricing-governance/usePricingGovernance.js.map +1 -0
  287. package/pricing-governance/useRetireModelPricingBaseline.d.ts +31 -0
  288. package/pricing-governance/useRetireModelPricingBaseline.d.ts.map +1 -0
  289. package/pricing-governance/useRetireModelPricingBaseline.js +36 -0
  290. package/pricing-governance/useRetireModelPricingBaseline.js.map +1 -0
  291. package/pricing-governance/useUpsertModelPricingBaseline.d.ts +38 -0
  292. package/pricing-governance/useUpsertModelPricingBaseline.d.ts.map +1 -0
  293. package/pricing-governance/useUpsertModelPricingBaseline.js +37 -0
  294. package/pricing-governance/useUpsertModelPricingBaseline.js.map +1 -0
  295. package/resource-creation/templates/workflow-templates.js +4 -4
  296. package/session/useCreateSession.d.ts +28 -0
  297. package/session/useCreateSession.d.ts.map +1 -1
  298. package/session/useCreateSession.js +2 -1
  299. package/session/useCreateSession.js.map +1 -1
  300. package/session/useEditSessionPrep.js +3 -3
  301. package/session/useEditSessionPrep.js.map +1 -1
  302. package/session/useNewSessionFlow.d.ts +30 -0
  303. package/session/useNewSessionFlow.d.ts.map +1 -1
  304. package/session/useNewSessionFlow.js +7 -1
  305. package/session/useNewSessionFlow.js.map +1 -1
  306. package/session/useUpdateSession.d.ts +29 -10
  307. package/session/useUpdateSession.d.ts.map +1 -1
  308. package/session/useUpdateSession.js +29 -10
  309. package/session/useUpdateSession.js.map +1 -1
  310. package/settings/index.d.ts +2 -1
  311. package/settings/index.d.ts.map +1 -1
  312. package/settings/index.js +2 -1
  313. package/settings/index.js.map +1 -1
  314. package/settings/settings-nav.d.ts +22 -0
  315. package/settings/settings-nav.d.ts.map +1 -1
  316. package/settings/settings-nav.js +32 -1
  317. package/settings/settings-nav.js.map +1 -1
  318. package/settings/useSettingsNavGroups.d.ts +29 -0
  319. package/settings/useSettingsNavGroups.d.ts.map +1 -0
  320. package/settings/useSettingsNavGroups.js +61 -0
  321. package/settings/useSettingsNavGroups.js.map +1 -0
  322. package/src/agent/steps/ReviewStep.tsx +2 -3
  323. package/src/billing/index.ts +5 -0
  324. package/src/channel/AgentChannelsPanel.tsx +27 -1
  325. package/src/composer/SessionComposer.tsx +1 -1
  326. package/src/cursor-accounts/CursorAccountEditor.tsx +229 -0
  327. package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
  328. package/src/cursor-accounts/CursorAccountsConsole.tsx +454 -0
  329. package/src/cursor-accounts/MemberCoverageTable.tsx +439 -0
  330. package/src/cursor-accounts/MemberKeysPanel.tsx +278 -0
  331. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +680 -0
  332. package/src/cursor-accounts/__tests__/cursor-account-coverage.test.ts +73 -0
  333. package/src/cursor-accounts/badges.tsx +26 -0
  334. package/src/cursor-accounts/cursor-account-coverage.ts +71 -0
  335. package/src/cursor-accounts/cursor-account-format.ts +45 -0
  336. package/src/cursor-accounts/index.ts +29 -0
  337. package/src/cursor-accounts/useCursorAccountView.ts +49 -0
  338. package/src/cursor-accounts/useCursorAccounts.ts +49 -0
  339. package/src/cursor-accounts/useCursorMemberKeyActions.ts +106 -0
  340. package/src/cursor-accounts/useDeleteCursorAccount.ts +62 -0
  341. package/src/cursor-accounts/useSyncCursorAccount.ts +54 -0
  342. package/src/cursor-accounts/useUpsertCursorAccount.ts +57 -0
  343. package/src/datastore/CollectionRecordsBrowser.tsx +570 -0
  344. package/src/datastore/CollectionSchemaView.tsx +247 -0
  345. package/src/datastore/DatastoreDetailView.tsx +201 -0
  346. package/src/datastore/DatastoreSyncReport.tsx +105 -0
  347. package/src/datastore/DeleteDatastoreDialog.tsx +202 -0
  348. package/src/datastore/FieldValueControl.tsx +289 -0
  349. package/src/datastore/RecordFilterBuilder.tsx +422 -0
  350. package/src/datastore/RecordFormPanel.tsx +432 -0
  351. package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +245 -0
  352. package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +133 -0
  353. package/src/datastore/__tests__/FieldValueControl.test.tsx +160 -0
  354. package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +155 -0
  355. package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
  356. package/src/datastore/__tests__/recordFilter.test.ts +169 -0
  357. package/src/datastore/__tests__/recordMutations.test.tsx +195 -0
  358. package/src/datastore/__tests__/recordValues.test.ts +359 -0
  359. package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +142 -0
  360. package/src/datastore/__tests__/useDatastoreDescription.test.tsx +143 -0
  361. package/src/datastore/__tests__/useRecordCollection.test.tsx +250 -0
  362. package/src/datastore/__tests__/useRecordList.test.tsx +85 -0
  363. package/src/datastore/index.ts +111 -0
  364. package/src/datastore/recordFilter.ts +154 -0
  365. package/src/datastore/recordValues.ts +327 -0
  366. package/src/datastore/useDatastore.ts +67 -0
  367. package/src/datastore/useDatastoreCount.ts +67 -0
  368. package/src/datastore/useDatastoreDescription.ts +90 -0
  369. package/src/datastore/useDatastoreList.ts +79 -0
  370. package/src/datastore/useDatastoreSearch.ts +39 -0
  371. package/src/datastore/useDeleteDatastore.ts +87 -0
  372. package/src/datastore/useDeleteRecord.ts +77 -0
  373. package/src/datastore/useInsertRecord.ts +92 -0
  374. package/src/datastore/useRecordCollection.ts +256 -0
  375. package/src/datastore/useRecordList.ts +131 -0
  376. package/src/datastore/useUpdateRecord.ts +95 -0
  377. package/src/environment/EnvironmentListPanel.tsx +24 -0
  378. package/src/execution/ExecutionProgress.tsx +14 -4
  379. package/src/execution/MessageThread.tsx +10 -2
  380. package/src/execution/__tests__/ExecutionProgress.test.tsx +67 -0
  381. package/src/execution/__tests__/MessageThread.test.tsx +44 -0
  382. package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
  383. package/src/execution/__tests__/useCreateAgentExecution.test.tsx +86 -0
  384. package/src/execution/useCreateAgentExecution.ts +41 -6
  385. package/src/iam-policy/__tests__/useCheckPermission.test.tsx +221 -0
  386. package/src/iam-policy/index.ts +1 -0
  387. package/src/iam-policy/useCheckPermission.ts +45 -19
  388. package/src/index.ts +172 -14
  389. package/src/internal/form-primitives.tsx +40 -0
  390. package/src/library/index.ts +0 -20
  391. package/src/library/useApplyResource.ts +27 -34
  392. package/src/library/useExportResource.ts +21 -40
  393. package/src/manifest/ApplyManifestDialog.tsx +315 -0
  394. package/src/manifest/EditResourceYamlDialog.tsx +265 -0
  395. package/src/manifest/RedactedSecretsNotice.tsx +30 -0
  396. package/src/manifest/YamlEditor.tsx +272 -0
  397. package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +118 -0
  398. package/src/manifest/__tests__/useApplyManifest.test.tsx +237 -0
  399. package/src/manifest/__tests__/useEditResourceYaml.test.tsx +252 -0
  400. package/src/manifest/index.ts +33 -0
  401. package/src/manifest/useApplyManifest.ts +270 -0
  402. package/src/manifest/useEditResourceYaml.ts +273 -0
  403. package/src/mcp-server/steps/ReviewStep.tsx +2 -3
  404. package/src/pricing-governance/BaselineEditor.tsx +652 -0
  405. package/src/pricing-governance/ModelCatalogPanel.tsx +283 -0
  406. package/src/pricing-governance/ModelGovernanceDetail.tsx +289 -0
  407. package/src/pricing-governance/OperatorAccessNotice.tsx +32 -0
  408. package/src/pricing-governance/PricingGovernanceConsole.tsx +465 -0
  409. package/src/pricing-governance/PricingGovernancePanel.tsx +166 -0
  410. package/src/pricing-governance/RetireConfirm.tsx +82 -0
  411. package/src/pricing-governance/__tests__/ModelCatalogPanel.test.tsx +253 -0
  412. package/src/pricing-governance/__tests__/PricingGovernanceConsole.test.tsx +410 -0
  413. package/src/pricing-governance/__tests__/useModelGovernanceView.test.tsx +308 -0
  414. package/src/pricing-governance/governance-primitives.tsx +133 -0
  415. package/src/pricing-governance/index.ts +50 -0
  416. package/src/pricing-governance/pricing-format.ts +53 -0
  417. package/src/pricing-governance/useDecidePricingOverride.ts +78 -0
  418. package/src/pricing-governance/useModelGovernanceView.ts +290 -0
  419. package/src/pricing-governance/useModelPricingBaselines.ts +69 -0
  420. package/src/pricing-governance/usePricingGovernance.ts +57 -0
  421. package/src/pricing-governance/useRetireModelPricingBaseline.ts +65 -0
  422. package/src/pricing-governance/useUpsertModelPricingBaseline.ts +72 -0
  423. package/src/resource-creation/templates/workflow-templates.ts +4 -4
  424. package/src/session/__tests__/useCreateSession.test.tsx +94 -0
  425. package/src/session/__tests__/useNewSessionFlow.test.tsx +33 -0
  426. package/src/session/useCreateSession.ts +30 -0
  427. package/src/session/useEditSessionPrep.ts +3 -3
  428. package/src/session/useNewSessionFlow.ts +45 -1
  429. package/src/session/useUpdateSession.ts +29 -10
  430. package/src/settings/__tests__/useSettingsNavGroups.test.tsx +138 -0
  431. package/src/settings/index.ts +5 -1
  432. package/src/settings/settings-nav.ts +43 -0
  433. package/src/settings/useSettingsNavGroups.ts +81 -0
  434. package/src/workflow/WorkflowYamlEditor.tsx +6 -270
  435. package/styles.css +1 -1
  436. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  437. package/workflow/WorkflowYamlEditor.d.ts +2 -42
  438. package/workflow/WorkflowYamlEditor.d.ts.map +1 -1
  439. package/workflow/WorkflowYamlEditor.js +5 -214
  440. package/workflow/WorkflowYamlEditor.js.map +1 -1
  441. package/library/ImportResourceDialog.d.ts +0 -43
  442. package/library/ImportResourceDialog.d.ts.map +0 -1
  443. package/library/ImportResourceDialog.js +0 -90
  444. package/library/ImportResourceDialog.js.map +0 -1
  445. package/library/parse-resource-yaml.d.ts +0 -63
  446. package/library/parse-resource-yaml.d.ts.map +0 -1
  447. package/library/parse-resource-yaml.js +0 -407
  448. package/library/parse-resource-yaml.js.map +0 -1
  449. package/library/serialize-resource-yaml.d.ts +0 -103
  450. package/library/serialize-resource-yaml.d.ts.map +0 -1
  451. package/library/serialize-resource-yaml.js +0 -565
  452. package/library/serialize-resource-yaml.js.map +0 -1
  453. package/library/useImportResource.d.ts +0 -84
  454. package/library/useImportResource.d.ts.map +0 -1
  455. package/library/useImportResource.js +0 -188
  456. package/library/useImportResource.js.map +0 -1
  457. package/src/library/ImportResourceDialog.tsx +0 -227
  458. package/src/library/parse-resource-yaml.ts +0 -630
  459. package/src/library/serialize-resource-yaml.ts +0 -756
  460. package/src/library/useImportResource.ts +0 -253
@@ -3,9 +3,9 @@
3
3
  import { useCallback, useState } from "react";
4
4
  import { create } from "@bufbuild/protobuf";
5
5
  import { PushSkillFromExecutionArtifactRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/io_pb";
6
+ import { parseManifest } from "@stigmer/sdk";
6
7
  import { useStigmer } from "../hooks.js";
7
8
  import { toError } from "../internal/toError.js";
8
- import { parseResourceYaml } from "./parse-resource-yaml.js";
9
9
 
10
10
  /**
11
11
  * Result returned after successfully applying a resource to an organization.
@@ -14,8 +14,8 @@ import { parseResourceYaml } from "./parse-resource-yaml.js";
14
14
  * link to the resource in the Library (e.g., `/library/agents`).
15
15
  */
16
16
  export interface ApplyResourceResult {
17
- /** The resource kind that was applied. */
18
- readonly kind: "Agent" | "McpServer" | "Skill";
17
+ /** The resource kind that was applied (`"Agent"`, `"McpServer"`, `"Skill"`, …). */
18
+ readonly kind: string;
19
19
  /** The resource name (from response metadata). */
20
20
  readonly name: string;
21
21
  /** The organization the resource was applied to. */
@@ -44,14 +44,14 @@ export interface PushSkillParams {
44
44
  /** Return value of {@link useApplyResource}. */
45
45
  export interface UseApplyResourceReturn {
46
46
  /**
47
- * Apply a Stigmer resource YAML (Agent or McpServer) to an organization.
47
+ * Apply a Stigmer resource YAML to an organization.
48
48
  *
49
- * Parses the YAML content, converts it to the appropriate SDK input type,
50
- * and calls `stigmer.agent.apply()` or `stigmer.mcpServer.apply()` based
51
- * on the detected `kind`.
49
+ * Parses the YAML against the kind's generated proto schema via the SDK
50
+ * manifest engine and applies it through `stigmer.manifest.apply()`
51
+ * any registry-supported kind, full fidelity.
52
52
  *
53
- * The `org` parameter overrides `metadata.org` in the YAML — matching
54
- * the "Apply to [my-org]" UX intent.
53
+ * The `org` parameter fills in `metadata.org` when the YAML omits it
54
+ * matching the "Apply to [my-org]" UX intent.
55
55
  *
56
56
  * @throws Re-throws the original error after setting `error` state, so
57
57
  * callers can optionally catch for flow control.
@@ -93,9 +93,9 @@ export interface UseApplyResourceReturn {
93
93
  *
94
94
  * Handles two parallel apply paths:
95
95
  *
96
- * 1. **YAML resources** (Agent, McpServer): `applyYamlResource(content, org)`
97
- * parses the YAML, converts snake_case fields to SDK input types, and
98
- * calls the appropriate `apply()` method.
96
+ * 1. **YAML resources**: `applyYamlResource(content, org)` parses the YAML
97
+ * against the generated proto schema (SDK manifest engine) and applies
98
+ * it through the kind's `apply` RPC.
99
99
  *
100
100
  * 2. **Skill packages** (directory artifacts): `pushSkillPackage(params)`
101
101
  * delegates to the server-side `pushFromExecutionArtifact` RPC.
@@ -129,7 +129,7 @@ export interface UseApplyResourceReturn {
129
129
  * };
130
130
  * ```
131
131
  *
132
- * @see {@link parseResourceYaml} for the pure YAML-to-input conversion
132
+ * @see {@link parseManifest} for the YAML-to-proto conversion
133
133
  * @see {@link detectStigmerResource} for YAML resource detection
134
134
  * @see {@link useDetectSkillPackage} for skill package detection
135
135
  */
@@ -146,28 +146,21 @@ export function useApplyResource(): UseApplyResourceReturn {
146
146
  setError(null);
147
147
 
148
148
  try {
149
- const parsed = parseResourceYaml(content, org);
150
-
151
- switch (parsed.kind) {
152
- case "Agent": {
153
- const agent = await stigmer.agent.apply(parsed.input);
154
- return {
155
- kind: "Agent",
156
- name: agent.metadata?.name ?? parsed.input.name,
157
- org: agent.metadata?.org ?? org,
158
- slug: agent.metadata?.slug ?? parsed.input.name,
159
- };
160
- }
161
- case "McpServer": {
162
- const mcpServer = await stigmer.mcpServer.apply(parsed.input);
163
- return {
164
- kind: "McpServer",
165
- name: mcpServer.metadata?.name ?? parsed.input.name,
166
- org: mcpServer.metadata?.org ?? org,
167
- slug: mcpServer.metadata?.slug ?? parsed.input.name,
168
- };
169
- }
149
+ const documents = parseManifest(content, { org });
150
+ if (documents.length > 1) {
151
+ throw new Error(
152
+ "This artifact contains multiple resource documents. " +
153
+ "Use Apply YAML in the Library to apply multi-document manifests.",
154
+ );
170
155
  }
156
+
157
+ const applied = await stigmer.manifest.apply(documents[0]);
158
+ return {
159
+ kind: applied.yamlKind,
160
+ name: applied.name,
161
+ org: applied.org,
162
+ slug: applied.slug,
163
+ };
171
164
  } catch (err) {
172
165
  setError(toError(err));
173
166
  throw err;
@@ -3,10 +3,11 @@
3
3
  import { useCallback, useMemo } from "react";
4
4
  import { parse as parseYaml } from "yaml";
5
5
  import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
6
+ import type { Datastore } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
6
7
  import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
7
8
  import type { Workflow } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
9
+ import { serializeManifest } from "@stigmer/sdk";
8
10
  import { toast } from "../feedback/toast.js";
9
- import { serializeAgentYaml, serializeMcpServerYaml } from "./serialize-resource-yaml.js";
10
11
  import { serializeWorkflowYaml } from "../workflow/serialize-workflow-yaml.js";
11
12
 
12
13
  // ---------------------------------------------------------------------------
@@ -16,9 +17,9 @@ import { serializeWorkflowYaml } from "../workflow/serialize-workflow-yaml.js";
16
17
  /** Options for {@link useExportResource}. */
17
18
  export interface UseExportResourceOptions {
18
19
  /** The resource kind — determines which serializer is used. */
19
- readonly kind: "Agent" | "McpServer" | "Workflow";
20
+ readonly kind: "Agent" | "McpServer" | "Workflow" | "Datastore";
20
21
  /** The proto resource to export, or `null` when not yet loaded. */
21
- readonly resource: Agent | McpServer | Workflow | null;
22
+ readonly resource: Agent | McpServer | Workflow | Datastore | null;
22
23
  }
23
24
 
24
25
  /** Return value of {@link useExportResource}. */
@@ -42,16 +43,19 @@ export interface UseExportResourceReturn {
42
43
  // ---------------------------------------------------------------------------
43
44
 
44
45
  /**
45
- * Headless export hook for Stigmer resources (Agent, McpServer).
46
+ * Headless export hook for Stigmer resources (Agent, McpServer,
47
+ * Workflow, Datastore).
46
48
  *
47
49
  * Serializes the resource into YAML and JSON formats and provides
48
50
  * stable callbacks for copying to clipboard or triggering a file
49
51
  * download. All operations are client-side — no additional API calls.
50
52
  *
51
- * The serialized output uses the canonical Stigmer resource format
52
- * (`apiVersion`, `kind`, `metadata`, `spec`) with snake_case field
53
- * names, identical to what the CLI produces and what `parseResourceYaml`
54
- * accepts ensuring full round-trip compatibility.
53
+ * Non-workflow kinds serialize through the SDK manifest engine
54
+ * ({@link serializeManifest}) the canonical Stigmer resource format
55
+ * (`apiVersion`, `kind`, `metadata`, `spec`, snake_case fields) that
56
+ * round-trips through `parseManifest` and `stigmer apply -f`. Workflows
57
+ * use their own canonical serializer, shared with the workflow Editor
58
+ * tab, so one workflow has exactly one YAML shape across the product.
55
59
  *
56
60
  * @param options - Resource kind and the proto resource object.
57
61
  * @returns Stable callbacks and memoized serialized strings.
@@ -68,8 +72,8 @@ export interface UseExportResourceReturn {
68
72
  * <ActionMenu.Item onSelect={downloadYaml}>Download YAML</ActionMenu.Item>
69
73
  * ```
70
74
  *
71
- * @see {@link serializeAgentYaml} for the underlying Agent serializer
72
- * @see {@link serializeMcpServerYaml} for the underlying McpServer serializer
75
+ * @see {@link serializeManifest} for the underlying Agent/McpServer serializer
76
+ * @see {@link serializeWorkflowYaml} for the workflow-canonical serializer
73
77
  */
74
78
  export function useExportResource({
75
79
  kind,
@@ -77,15 +81,17 @@ export function useExportResource({
77
81
  }: UseExportResourceOptions): UseExportResourceReturn {
78
82
  const yaml = useMemo<string | null>(() => {
79
83
  if (!resource) return null;
80
- if (kind === "Agent") return serializeAgentYaml(resource as Agent);
81
84
  if (kind === "Workflow") return serializeWorkflowYaml(resource as Workflow);
82
- return serializeMcpServerYaml(resource as McpServer);
85
+ return serializeManifest(resource);
83
86
  }, [kind, resource]);
84
87
 
85
88
  const json = useMemo<string | null>(() => {
86
- if (!resource) return null;
87
- return serializeResourceJson(resource, kind);
88
- }, [kind, resource]);
89
+ if (!yaml) return null;
90
+ // Parse the YAML output to re-stringify as JSON — this guarantees the
91
+ // JSON structure is identical to the YAML structure (snake_case
92
+ // fields, no status).
93
+ return JSON.stringify(parseYaml(yaml), null, 2);
94
+ }, [yaml]);
89
95
 
90
96
  const slug = useMemo<string>(() => {
91
97
  if (!resource) return "resource";
@@ -120,31 +126,6 @@ export function useExportResource({
120
126
  );
121
127
  }
122
128
 
123
- // ---------------------------------------------------------------------------
124
- // JSON serialization
125
- // ---------------------------------------------------------------------------
126
-
127
- /**
128
- * Produces a JSON representation of the resource using the same canonical
129
- * structure as the YAML export (apiVersion, kind, metadata, spec).
130
- *
131
- * Internally parses the YAML output to get a clean plain object, then
132
- * re-stringifies as JSON. This guarantees the JSON structure is identical
133
- * to the YAML structure (snake_case fields, no status).
134
- */
135
- function serializeResourceJson(
136
- resource: Agent | McpServer | Workflow,
137
- kind: "Agent" | "McpServer" | "Workflow",
138
- ): string {
139
- let yamlStr: string;
140
- if (kind === "Agent") yamlStr = serializeAgentYaml(resource as Agent);
141
- else if (kind === "Workflow") yamlStr = serializeWorkflowYaml(resource as Workflow);
142
- else yamlStr = serializeMcpServerYaml(resource as McpServer);
143
-
144
- const doc = parseYaml(yamlStr);
145
- return JSON.stringify(doc, null, 2);
146
- }
147
-
148
129
  // ---------------------------------------------------------------------------
149
130
  // Clipboard
150
131
  // ---------------------------------------------------------------------------
@@ -0,0 +1,315 @@
1
+ "use client";
2
+
3
+ import { lazy, Suspense, useCallback, useEffect, useRef } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { toast } from "../feedback/toast.js";
6
+ import { RedactedSecretsNotice } from "./RedactedSecretsNotice.js";
7
+ import {
8
+ useApplyManifest,
9
+ type ManifestPreviewEntry,
10
+ } from "./useApplyManifest.js";
11
+
12
+ // CodeMirror loads only when the dialog actually opens (DD-013).
13
+ const LazyYamlEditor = lazy(() =>
14
+ import("./YamlEditor.js").then((m) => ({ default: m.YamlEditor })),
15
+ );
16
+
17
+ /** Props for {@link ApplyManifestDialog}. */
18
+ export interface ApplyManifestDialogProps {
19
+ /** Whether the dialog is open. */
20
+ readonly open: boolean;
21
+ /** Called when the dialog should open or close. */
22
+ readonly onOpenChange: (open: boolean) => void;
23
+ /** Target organization slug for documents that omit `metadata.org`. */
24
+ readonly org: string;
25
+ /**
26
+ * Called after every document applied successfully, with the per-document
27
+ * results in apply order. Use for navigation or list refresh.
28
+ */
29
+ readonly onSuccess?: (entries: readonly ManifestPreviewEntry[]) => void;
30
+ }
31
+
32
+ /**
33
+ * Modal dialog for applying a Stigmer resource manifest — paste YAML or
34
+ * upload a file, review what will change, and apply. The console
35
+ * counterpart of `stigmer apply -f`, for every supported resource kind.
36
+ *
37
+ * Workflow:
38
+ * 1. Paste manifest YAML (or JSON) into the editor, or pick a file
39
+ * 2. Each document is validated against its kind's generated proto schema
40
+ * and previewed with a create-or-update badge resolved from server state
41
+ * 3. Apply runs the documents sequentially in dependency order with live
42
+ * per-document status; a failure stops the run and renders inline
43
+ *
44
+ * Multi-document manifests (`---` separators) are supported. Documents
45
+ * that omit `metadata.org` are applied to the active org; documents naming
46
+ * a different org are honored with a warning (matching `stigmer apply`).
47
+ *
48
+ * Uses the native `<dialog>` element for built-in focus trapping, Escape
49
+ * key handling, and backdrop — consistent with {@link ConfirmDialog}.
50
+ *
51
+ * Zero Console dependencies — safe for platform builder embedding.
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * <ApplyManifestDialog
56
+ * open={open}
57
+ * onOpenChange={setOpen}
58
+ * org={activeOrg}
59
+ * onSuccess={() => refetchList()}
60
+ * />
61
+ * ```
62
+ */
63
+ export function ApplyManifestDialog({
64
+ open,
65
+ onOpenChange,
66
+ org,
67
+ onSuccess,
68
+ }: ApplyManifestDialogProps) {
69
+ const dialogRef = useRef<HTMLDialogElement>(null);
70
+ const fileInputRef = useRef<HTMLInputElement>(null);
71
+ const manifest = useApplyManifest(org);
72
+ const { reset } = manifest;
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
+ // Start each session clean.
86
+ useEffect(() => {
87
+ if (open) {
88
+ reset();
89
+ if (fileInputRef.current) fileInputRef.current.value = "";
90
+ }
91
+ }, [open, reset]);
92
+
93
+ const handleCancel = useCallback(
94
+ (e: React.SyntheticEvent) => {
95
+ e.preventDefault();
96
+ onOpenChange(false);
97
+ },
98
+ [onOpenChange],
99
+ );
100
+
101
+ const handleFileChange = useCallback(
102
+ (e: React.ChangeEvent<HTMLInputElement>) => {
103
+ const file = e.target.files?.[0];
104
+ if (file) manifest.readFile(file);
105
+ },
106
+ [manifest],
107
+ );
108
+
109
+ const handleApply = useCallback(async () => {
110
+ const allApplied = await manifest.applyAll();
111
+ if (allApplied && manifest.entries) {
112
+ const count = manifest.entries.length;
113
+ toast.success(
114
+ count === 1 ? "Resource applied" : `${count} resources applied`,
115
+ );
116
+ onOpenChange(false);
117
+ onSuccess?.(manifest.entries);
118
+ }
119
+ // On failure the dialog stays open — per-entry status shows what
120
+ // applied and what failed.
121
+ }, [manifest, onOpenChange, onSuccess]);
122
+
123
+ const canApply =
124
+ manifest.entries !== null &&
125
+ manifest.entries.length > 0 &&
126
+ !manifest.isValidating &&
127
+ !manifest.isApplying;
128
+
129
+ return (
130
+ <dialog
131
+ ref={dialogRef}
132
+ onCancel={handleCancel}
133
+ className={cn(
134
+ "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",
135
+ "backdrop:bg-black/50",
136
+ "open:animate-in open:fade-in-0 open:zoom-in-95",
137
+ )}
138
+ >
139
+ <div className="flex flex-col gap-4 p-6">
140
+ {/* Header */}
141
+ <div className="flex flex-col gap-1">
142
+ <h3 className="text-base font-semibold text-foreground">Apply YAML</h3>
143
+ <p className="text-sm text-muted-foreground">
144
+ Paste a resource manifest or upload a file. Resources are created
145
+ when new and updated when they already exist.
146
+ </p>
147
+ </div>
148
+
149
+ {/* File picker */}
150
+ <input
151
+ ref={fileInputRef}
152
+ type="file"
153
+ accept=".yaml,.yml,.json"
154
+ onChange={handleFileChange}
155
+ className={cn(
156
+ "w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground",
157
+ "file:mr-3 file:rounded-md file:border-0 file:bg-primary file:px-2.5 file:py-1 file:text-xs file:font-medium file:text-primary-foreground",
158
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
159
+ )}
160
+ aria-label="Select manifest file"
161
+ />
162
+
163
+ {/* Manifest editor */}
164
+ <Suspense fallback={<EditorLoading />}>
165
+ <LazyYamlEditor
166
+ value={manifest.content}
167
+ onChange={manifest.setContent}
168
+ className="h-56"
169
+ />
170
+ </Suspense>
171
+
172
+ {manifest.hasRedactedSecrets && <RedactedSecretsNotice />}
173
+
174
+ {/* Validation error */}
175
+ {manifest.validationError && (
176
+ <div
177
+ role="alert"
178
+ className="rounded-md border border-destructive bg-card px-3 py-2.5 text-sm text-destructive"
179
+ >
180
+ {manifest.validationError}
181
+ </div>
182
+ )}
183
+
184
+ {/* Per-document preview */}
185
+ {manifest.entries && manifest.entries.length > 0 && (
186
+ <ul className="flex max-h-48 flex-col gap-2 overflow-y-auto" aria-label="Resources to apply">
187
+ {manifest.entries.map((entry, index) => (
188
+ <PreviewRow key={`${entry.document.handler.yamlKind}/${entry.document.org}/${entry.document.slug}/${index}`} entry={entry} />
189
+ ))}
190
+ </ul>
191
+ )}
192
+
193
+ {/* Actions */}
194
+ <div className="flex items-center justify-between gap-3">
195
+ <p className="text-xs text-muted-foreground" aria-live="polite">
196
+ {manifest.isValidating ? "Validating…" : ""}
197
+ </p>
198
+ <div className="flex gap-2">
199
+ <button
200
+ type="button"
201
+ onClick={() => onOpenChange(false)}
202
+ disabled={manifest.isApplying}
203
+ className={cn(
204
+ "rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
205
+ "border border-input bg-background text-foreground",
206
+ "hover:bg-accent hover:text-accent-foreground",
207
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
208
+ "disabled:pointer-events-none disabled:opacity-50",
209
+ )}
210
+ >
211
+ Cancel
212
+ </button>
213
+ <button
214
+ type="button"
215
+ onClick={handleApply}
216
+ disabled={!canApply}
217
+ className={cn(
218
+ "rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
219
+ "bg-primary text-primary-foreground hover:bg-primary-hover",
220
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
221
+ "disabled:pointer-events-none disabled:opacity-50",
222
+ )}
223
+ >
224
+ {manifest.isApplying
225
+ ? "Applying…"
226
+ : applyLabel(manifest.entries?.length ?? 0)}
227
+ </button>
228
+ </div>
229
+ </div>
230
+ </div>
231
+ </dialog>
232
+ );
233
+ }
234
+
235
+ function applyLabel(count: number): string {
236
+ if (count <= 1) return "Apply";
237
+ return `Apply ${count} resources`;
238
+ }
239
+
240
+ function EditorLoading() {
241
+ return (
242
+ <div className="flex h-56 items-center justify-center rounded-md border border-border bg-muted text-sm text-muted-foreground">
243
+ Loading editor…
244
+ </div>
245
+ );
246
+ }
247
+
248
+ // ---------------------------------------------------------------------------
249
+ // Per-document preview row
250
+ // ---------------------------------------------------------------------------
251
+
252
+ function PreviewRow({ entry }: { readonly entry: ManifestPreviewEntry }) {
253
+ return (
254
+ <li className="rounded-md border border-border bg-card px-3 py-2">
255
+ <div className="flex items-center gap-2">
256
+ <span className="inline-flex rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-muted-foreground">
257
+ {entry.document.handler.displayName}
258
+ </span>
259
+ <span className="text-sm font-medium text-foreground">
260
+ {entry.document.name}
261
+ </span>
262
+ <ActionBadge entry={entry} />
263
+ <span className="ml-auto text-xs text-muted-foreground">
264
+ {entry.document.org}
265
+ </span>
266
+ </div>
267
+ {entry.document.warning && (
268
+ <p className="mt-1 text-xs text-muted-foreground">{entry.document.warning}</p>
269
+ )}
270
+ {entry.status === "failed" && entry.errorMessage && (
271
+ <p role="alert" className="mt-1 text-xs text-destructive">
272
+ {entry.errorMessage}
273
+ </p>
274
+ )}
275
+ </li>
276
+ );
277
+ }
278
+
279
+ function ActionBadge({ entry }: { readonly entry: ManifestPreviewEntry }) {
280
+ const label = badgeLabel(entry);
281
+ return (
282
+ <span
283
+ className={cn(
284
+ "inline-flex rounded px-1.5 py-0.5 text-xs font-medium",
285
+ entry.status === "failed"
286
+ ? "bg-card text-destructive border border-destructive"
287
+ : "bg-muted text-muted-foreground",
288
+ )}
289
+ >
290
+ {label}
291
+ </span>
292
+ );
293
+ }
294
+
295
+ function badgeLabel(entry: ManifestPreviewEntry): string {
296
+ switch (entry.status) {
297
+ case "applying":
298
+ return "Applying…";
299
+ case "applied":
300
+ return "Applied";
301
+ case "failed":
302
+ return "Failed";
303
+ case "skipped":
304
+ return "Skipped";
305
+ case "pending":
306
+ switch (entry.action) {
307
+ case "create":
308
+ return "Will create";
309
+ case "update":
310
+ return "Will update";
311
+ case "unknown":
312
+ return "Create or update";
313
+ }
314
+ }
315
+ }