@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
@@ -0,0 +1,95 @@
1
+ "use client";
2
+
3
+ import { useCallback, useState } from "react";
4
+ import { create, type JsonObject } from "@bufbuild/protobuf";
5
+ import {
6
+ UpdateRecordRequestSchema,
7
+ type RecordEnvelope,
8
+ } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
9
+ import { useStigmer } from "../hooks.js";
10
+ import { toError } from "../internal/toError.js";
11
+ import type { RecordScope } from "./useRecordList.js";
12
+
13
+ /** Arguments for a single record update. */
14
+ export interface UpdateRecordArgs extends RecordScope {
15
+ /** Record id (`dsr_…`). */
16
+ readonly id: string;
17
+ /**
18
+ * Partial merge (DD-005): only the supplied fields change; an
19
+ * explicit `null` clears a field; absent fields keep their stored
20
+ * values. Constraints evaluate on the merged result. Build this from
21
+ * per-field edits with `buildUpdateFields`.
22
+ */
23
+ readonly fields: JsonObject;
24
+ }
25
+
26
+ /** Return value of {@link useUpdateRecord}. */
27
+ export interface UseUpdateRecordReturn {
28
+ /**
29
+ * Update one record by id. Resolves with the merged envelope. Rejects
30
+ * — and sets `error` — on denial or constraint violation; the error's
31
+ * message is the server's relayable text, byte-for-byte.
32
+ */
33
+ readonly updateRecord: (args: UpdateRecordArgs) => Promise<RecordEnvelope>;
34
+ /** `true` while the update is in flight. */
35
+ readonly isUpdating: boolean;
36
+ /** Error from the last failed update, or `null` when healthy. */
37
+ readonly error: Error | null;
38
+ /** Reset `error` to `null`. */
39
+ readonly clearError: () => void;
40
+ }
41
+
42
+ /**
43
+ * Behavior hook that wraps `datastore.updateRecord()` with loading and
44
+ * error state.
45
+ *
46
+ * The RPC is an honest tri-state partial merge — the hook adds no
47
+ * merge semantics of its own. A record in another partition is
48
+ * NOT_FOUND (DD-010: partition scoping is structural).
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * const { updateRecord } = useUpdateRecord();
53
+ * await updateRecord({
54
+ * org: "acme",
55
+ * datastore: "clinic",
56
+ * collection: "bookings",
57
+ * id: "dsr_01j9...",
58
+ * fields: { patient_phone: "+15550100", notes: null }, // notes cleared
59
+ * });
60
+ * ```
61
+ */
62
+ export function useUpdateRecord(): UseUpdateRecordReturn {
63
+ const stigmer = useStigmer();
64
+ const [isUpdating, setIsUpdating] = useState(false);
65
+ const [error, setError] = useState<Error | null>(null);
66
+
67
+ const clearError = useCallback(() => setError(null), []);
68
+
69
+ const updateRecord = useCallback(
70
+ async (args: UpdateRecordArgs): Promise<RecordEnvelope> => {
71
+ setIsUpdating(true);
72
+ setError(null);
73
+ try {
74
+ return await stigmer.datastore.updateRecord(
75
+ create(UpdateRecordRequestSchema, {
76
+ org: args.org,
77
+ datastore: args.datastore,
78
+ collection: args.collection,
79
+ partition: args.partition ?? "",
80
+ id: args.id,
81
+ fields: args.fields,
82
+ }),
83
+ );
84
+ } catch (err) {
85
+ setError(toError(err));
86
+ throw err;
87
+ } finally {
88
+ setIsUpdating(false);
89
+ }
90
+ },
91
+ [stigmer],
92
+ );
93
+
94
+ return { updateRecord, isUpdating, error, clearError };
95
+ }
@@ -6,6 +6,7 @@ import { getUserMessage } from "@stigmer/sdk";
6
6
  import type { Environment } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
7
7
  import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
8
8
  import { ResourceVisibilityControl } from "../library/ResourceVisibilityControl.js";
9
+ import { EditResourceYamlDialog } from "../manifest/EditResourceYamlDialog.js";
9
10
  import { useEnvironmentList } from "./useEnvironmentList.js";
10
11
  import { EnvironmentVariableEditor } from "./EnvironmentVariableEditor.js";
11
12
  import { isShareRestrictedEnvironment } from "./shareRestriction.js";
@@ -94,6 +95,7 @@ export function EnvironmentListPanel({
94
95
  labels,
95
96
  );
96
97
  const [expandedId, setExpandedId] = useState<string | null>(null);
98
+ const [yamlEnvironment, setYamlEnvironment] = useState<Environment | null>(null);
97
99
 
98
100
  if (onRefetchRef) {
99
101
  onRefetchRef(refetch);
@@ -179,9 +181,18 @@ export function EnvironmentListPanel({
179
181
  onToggle={() => handleToggle(env)}
180
182
  readOnly={readOnly}
181
183
  onVisibilityChanged={refetch}
184
+ onEditYaml={() => setYamlEnvironment(env)}
182
185
  />
183
186
  );
184
187
  })}
188
+ <EditResourceYamlDialog
189
+ open={yamlEnvironment !== null}
190
+ onOpenChange={(open) => {
191
+ if (!open) setYamlEnvironment(null);
192
+ }}
193
+ resource={yamlEnvironment}
194
+ onApplied={refetch}
195
+ />
185
196
  </div>
186
197
  );
187
198
  }
@@ -196,12 +207,14 @@ function EnvironmentCard({
196
207
  onToggle,
197
208
  readOnly,
198
209
  onVisibilityChanged,
210
+ onEditYaml,
199
211
  }: {
200
212
  environment: Environment;
201
213
  isExpanded: boolean;
202
214
  onToggle: () => void;
203
215
  readOnly: boolean;
204
216
  onVisibilityChanged: () => void;
217
+ onEditYaml: () => void;
205
218
  }) {
206
219
  const name =
207
220
  environment.metadata?.name || environment.metadata?.slug || "Unnamed";
@@ -249,6 +262,17 @@ function EnvironmentCard({
249
262
  </div>
250
263
  </button>
251
264
 
265
+ {!readOnly && (
266
+ <button
267
+ type="button"
268
+ onClick={onEditYaml}
269
+ aria-label={`Edit ${name} as YAML`}
270
+ className="shrink-0 rounded px-1.5 py-0.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
271
+ >
272
+ Edit YAML
273
+ </button>
274
+ )}
275
+
252
276
  {showVisibilityControl && (
253
277
  <ResourceVisibilityControl
254
278
  kind="environment"
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
4
+ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
4
5
  import { cn } from "@stigmer/theme";
5
6
  import { ExecutionPhaseBadge } from "./ExecutionPhaseBadge.js";
6
7
  import { TodoList } from "./TodoList.js";
@@ -47,10 +48,19 @@ export function ExecutionProgress({
47
48
  if (phase === undefined) return null;
48
49
 
49
50
  const todos = execution.status?.todos;
50
- // Populated by the server only on EXECUTION_FAILED surface it next to the
51
- // badge so this widget explains a failure rather than showing a bare phase
52
- // (consistent with the failure reason in the message thread).
53
- const error = execution.status?.error;
51
+ // Populated by the server on EXECUTION_FAILED and EXECUTION_TERMINATED
52
+ // surface it next to the badge so this widget explains a failure rather
53
+ // than showing a bare phase (consistent with the message thread).
54
+ //
55
+ // CANCELLED is carved out: cancel is a quiet terminal state, not a failure
56
+ // (stigmer#282). A CANCELLED execution can still carry a non-empty error —
57
+ // cancel preserves a preexisting error by design, and an older server may
58
+ // have written a cancellation sentinel — so the phase, not the error field,
59
+ // decides whether to render the alert. The muted Cancelled badge suffices.
60
+ const error =
61
+ phase === ExecutionPhase.EXECUTION_CANCELLED
62
+ ? undefined
63
+ : execution.status?.error;
54
64
 
55
65
  return (
56
66
  <div
@@ -941,12 +941,20 @@ export function buildThreadItems(
941
941
  key: `phase-${lastPhase}`,
942
942
  });
943
943
 
944
- // The server populates `status.error` only on EXECUTION_FAILED. Surface it
944
+ // The server populates `status.error` on EXECUTION_FAILED and
945
+ // EXECUTION_TERMINATED — never on a user-initiated cancel. Surface it
945
946
  // beside the badge so a failure that produced no messages still explains
946
947
  // itself (the CLI shows this reason; the chat previously showed nothing).
947
948
  // Kept as its own item so the badge component stays presentational.
949
+ //
950
+ // CANCELLED is carved out: cancel is a quiet terminal state, not a failure
951
+ // (stigmer#282). A CANCELLED execution can still carry a non-empty error —
952
+ // cancel preserves a preexisting error by design (merge semantics), and an
953
+ // older server may have written a "Execution cancelled" sentinel — so the
954
+ // phase, not the error field, decides whether to render the loud banner.
955
+ // The muted Cancelled phase badge above remains the visible state.
948
956
  const reason = lastExec?.status?.error;
949
- if (reason) {
957
+ if (reason && lastPhase !== ExecutionPhase.EXECUTION_CANCELLED) {
950
958
  const specMessage = lastExec?.spec?.message;
951
959
  // A failed build turn offers no inline Retry: resending its label as an
952
960
  // ordinary message would drop the buildFromPlan flag (no runner
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect, afterEach } from "vitest";
2
+ import { render, screen, cleanup } from "@testing-library/react";
3
+ import { create } from "@bufbuild/protobuf";
4
+ import {
5
+ AgentExecutionSchema,
6
+ AgentExecutionStatusSchema,
7
+ type AgentExecution,
8
+ } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
9
+ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
10
+
11
+ import { ExecutionProgress } from "../ExecutionProgress";
12
+
13
+ afterEach(() => {
14
+ cleanup();
15
+ });
16
+
17
+ function makeExecution(phase: ExecutionPhase, error?: string): AgentExecution {
18
+ const exec = create(AgentExecutionSchema);
19
+ const status = create(AgentExecutionStatusSchema);
20
+ status.phase = phase;
21
+ if (error !== undefined) {
22
+ status.error = error;
23
+ }
24
+ exec.status = status;
25
+ return exec;
26
+ }
27
+
28
+ describe("ExecutionProgress", () => {
29
+ it("renders nothing without an execution", () => {
30
+ const { container } = render(<ExecutionProgress execution={null} />);
31
+ expect(container.innerHTML).toBe("");
32
+ });
33
+
34
+ it("surfaces the server error as an alert for a FAILED execution", () => {
35
+ render(
36
+ <ExecutionProgress
37
+ execution={makeExecution(
38
+ ExecutionPhase.EXECUTION_FAILED,
39
+ "Activity task timed out",
40
+ )}
41
+ />,
42
+ );
43
+
44
+ expect(screen.getByRole("alert").textContent).toContain(
45
+ "Activity task timed out",
46
+ );
47
+ });
48
+
49
+ // Cancelled is a quiet terminal state (stigmer#282): a CANCELLED execution
50
+ // can legitimately carry a non-empty status.error (preserved prior error, or
51
+ // a pre-fix server's "Execution cancelled" sentinel), so the phase — not the
52
+ // error field — decides whether the alert renders.
53
+ it("renders a CANCELLED execution quietly even when it carries an error", () => {
54
+ render(
55
+ <ExecutionProgress
56
+ execution={makeExecution(
57
+ ExecutionPhase.EXECUTION_CANCELLED,
58
+ "Execution cancelled",
59
+ )}
60
+ />,
61
+ );
62
+
63
+ expect(screen.getByText(/cancelled/i)).toBeTruthy();
64
+ expect(screen.queryByRole("alert")).toBeNull();
65
+ expect(screen.queryByText("Execution cancelled")).toBeNull();
66
+ });
67
+ });
@@ -604,6 +604,50 @@ describe("MessageThread", () => {
604
604
  expect(screen.queryByText(/stale error/i)).toBeNull();
605
605
  });
606
606
 
607
+ // Cancelled is a quiet terminal state (stigmer#282): a user-initiated Stop
608
+ // must never render as a failure. A CANCELLED execution can legitimately
609
+ // carry a non-empty status.error — cancel preserves a preexisting error by
610
+ // design, and pre-fix servers wrote an "Execution cancelled" sentinel — so
611
+ // the phase, not the error field, decides whether the loud banner renders.
612
+ it("renders a CANCELLED execution quietly even when it carries a legacy error sentinel", () => {
613
+ const exec = makeExecution({
614
+ id: "exec-cancelled",
615
+ specMessage: "do the thing",
616
+ phase: ExecutionPhase.EXECUTION_CANCELLED,
617
+ error: "Execution cancelled",
618
+ });
619
+ const onRetryExecution = vi.fn();
620
+
621
+ render(
622
+ <MessageThread executions={[exec]} onRetryExecution={onRetryExecution} />,
623
+ );
624
+
625
+ // The muted phase badge is the visible cancelled state.
626
+ expect(screen.getByText(/cancelled/i)).toBeTruthy();
627
+
628
+ // No destructive banner, no error text, no Retry.
629
+ expect(screen.queryByRole("alert")).toBeNull();
630
+ expect(screen.queryByText("Execution cancelled")).toBeNull();
631
+ expect(screen.queryByRole("button", { name: /retry/i })).toBeNull();
632
+ });
633
+
634
+ it("renders a CANCELLED execution with a preserved prior error quietly", () => {
635
+ const exec = makeExecution({
636
+ id: "exec-cancelled-preserved",
637
+ phase: ExecutionPhase.EXECUTION_CANCELLED,
638
+ error: "Execution interrupted: agent was unresponsive. Retry or resume.",
639
+ });
640
+
641
+ render(<MessageThread executions={[exec]} />);
642
+
643
+ expect(screen.getByText(/cancelled/i)).toBeTruthy();
644
+ // Neither the loud alert framing nor the neutral interrupted/Resume
645
+ // framing may appear — the preserved error stays out of the transcript.
646
+ expect(screen.queryByText(/Execution interrupted/i)).toBeNull();
647
+ expect(screen.queryByRole("alert")).toBeNull();
648
+ expect(screen.queryByRole("button", { name: /resume/i })).toBeNull();
649
+ });
650
+
607
651
  it("offers a Retry that resends the originating message on failure", () => {
608
652
  const exec = makeExecution({
609
653
  id: "exec-retry",
@@ -119,12 +119,20 @@ describe("useArtifactInspection — detection + apply", () => {
119
119
 
120
120
  it("applies a detected Agent and fires onApplied with the result", async () => {
121
121
  const getArtifactContent = vi.fn().mockResolvedValue(contentResult(AGENT_YAML));
122
+ // The apply path routes through the kind-agnostic manifest engine:
123
+ // the hook parses the YAML into a ManifestDocument and hands it to
124
+ // stigmer.manifest.apply.
122
125
  const apply = vi.fn().mockResolvedValue({
123
- metadata: { name: "my-agent", org: "acme", slug: "my-agent" },
126
+ yamlKind: "Agent",
127
+ displayName: "Agent",
128
+ name: "my-agent",
129
+ org: "acme",
130
+ slug: "my-agent",
131
+ id: "agt_01",
124
132
  });
125
133
  const stigmer = {
126
134
  agentExecution: { getArtifactContent },
127
- agent: { apply },
135
+ manifest: { apply },
128
136
  } as unknown as Stigmer;
129
137
  const onApplied = vi.fn();
130
138
 
@@ -144,6 +152,8 @@ describe("useArtifactInspection — detection + apply", () => {
144
152
 
145
153
  expect(apply).toHaveBeenCalledTimes(1);
146
154
  expect(apply.mock.calls[0][0].name).toBe("my-agent");
155
+ expect(apply.mock.calls[0][0].handler.yamlKind).toBe("Agent");
156
+ expect(apply.mock.calls[0][0].org).toBe("acme");
147
157
  await waitFor(() => expect(result.current.applyResult?.kind).toBe("Agent"));
148
158
  expect(onApplied).toHaveBeenCalledTimes(1);
149
159
  expect(onApplied.mock.calls[0][0].name).toBe("my-agent");
@@ -137,6 +137,92 @@ describe("useCreateAgentExecution — one-call session bootstrap (sessionSpec)",
137
137
  expect(input.sessionSpec.executionTarget).toBeUndefined();
138
138
  });
139
139
 
140
+ it("passes the metadata map through on the bootstrap spec", async () => {
141
+ const { result } = renderHook(() => useCreateAgentExecution(), {
142
+ wrapper: createWrapper(makeMockClient()),
143
+ });
144
+
145
+ await act(async () => {
146
+ await result.current.create({
147
+ org: "acme",
148
+ message: "Hello",
149
+ sessionSpec: {
150
+ agentInstanceId: "ain-1",
151
+ metadata: { "acme/tenant": "t-1" },
152
+ },
153
+ });
154
+ });
155
+
156
+ const input = mockCreate.mock.calls[0][0];
157
+ expect(input.sessionSpec.metadata).toEqual({ "acme/tenant": "t-1" });
158
+ });
159
+
160
+ it("maps the typed sessionContext onto the reserved metadata key", async () => {
161
+ const { result } = renderHook(() => useCreateAgentExecution(), {
162
+ wrapper: createWrapper(makeMockClient()),
163
+ });
164
+
165
+ await act(async () => {
166
+ await result.current.create({
167
+ org: "acme",
168
+ message: "Hello",
169
+ sessionSpec: {
170
+ agentInstanceId: "ain-1",
171
+ sessionContext: "Role: platform admin",
172
+ },
173
+ });
174
+ });
175
+
176
+ const input = mockCreate.mock.calls[0][0];
177
+ expect(input.sessionSpec.metadata).toEqual({
178
+ "stigmer.ai/session-context": "Role: platform admin",
179
+ });
180
+ });
181
+
182
+ it("lets the typed sessionContext win over a raw entry under the reserved key", async () => {
183
+ const { result } = renderHook(() => useCreateAgentExecution(), {
184
+ wrapper: createWrapper(makeMockClient()),
185
+ });
186
+
187
+ await act(async () => {
188
+ await result.current.create({
189
+ org: "acme",
190
+ message: "Hello",
191
+ sessionSpec: {
192
+ agentInstanceId: "ain-1",
193
+ metadata: {
194
+ "acme/tenant": "t-1",
195
+ "stigmer.ai/session-context": "stale raw value",
196
+ },
197
+ sessionContext: "typed value",
198
+ },
199
+ });
200
+ });
201
+
202
+ const input = mockCreate.mock.calls[0][0];
203
+ expect(input.sessionSpec.metadata).toEqual({
204
+ "acme/tenant": "t-1",
205
+ "stigmer.ai/session-context": "typed value",
206
+ });
207
+ });
208
+
209
+ it("omits metadata entirely when neither field is provided", async () => {
210
+ const { result } = renderHook(() => useCreateAgentExecution(), {
211
+ wrapper: createWrapper(makeMockClient()),
212
+ });
213
+
214
+ await act(async () => {
215
+ await result.current.create({
216
+ org: "acme",
217
+ message: "Hello",
218
+ sessionSpec: { agentInstanceId: "ain-1" },
219
+ });
220
+ });
221
+
222
+ const input = mockCreate.mock.calls[0][0];
223
+ expect(input.sessionSpec.metadata).toBeUndefined();
224
+ });
225
+
140
226
  it("returns the server-assigned session id from the bootstrap response", async () => {
141
227
  mockCreate.mockResolvedValueOnce({
142
228
  metadata: { id: "aex-1" },
@@ -2,12 +2,13 @@
2
2
 
3
3
  import { useCallback, useState } from "react";
4
4
  import type { JsonObject } from "@bufbuild/protobuf";
5
- import type {
6
- AttachmentInput,
7
- EnvVarInput,
8
- McpServerUsageInput,
9
- ResourceRef,
10
- WorkspaceEntryInput,
5
+ import {
6
+ mergeSessionContext,
7
+ type AttachmentInput,
8
+ type EnvVarInput,
9
+ type McpServerUsageInput,
10
+ type ResourceRef,
11
+ type WorkspaceEntryInput,
11
12
  } from "@stigmer/sdk";
12
13
  import { useStigmer } from "../hooks.js";
13
14
  import { toError } from "../internal/toError.js";
@@ -41,6 +42,36 @@ export interface BootstrapSessionSpec {
41
42
  readonly mcpServerUsages?: McpServerUsageInput[];
42
43
  /** Skill references to enable for executions in this session. */
43
44
  readonly skillRefs?: ResourceRef[];
45
+ /**
46
+ * Custom key-value pairs stored on the created session's
47
+ * `SessionSpec.metadata`.
48
+ *
49
+ * A passthrough for embedder-owned keys (correlation IDs, tenant tags)
50
+ * and for platform-reserved `stigmer.ai/*` keys set explicitly. For the
51
+ * common case — standing user context injected into the agent's prompt —
52
+ * prefer the typed {@link sessionContext} field, which maps onto the
53
+ * reserved `stigmer.ai/session-context` key and wins over a raw entry
54
+ * under that key when both are provided.
55
+ */
56
+ readonly metadata?: Record<string, string>;
57
+ /**
58
+ * Standing, per-user context the agent receives on every turn but the
59
+ * conversation UI never renders — who the caller is, their experience
60
+ * level, their standing instructions (stigmer/stigmer#286).
61
+ *
62
+ * Stored on the created session's `SessionSpec.metadata` under
63
+ * `stigmer.ai/session-context`; the agent runner injects it into the
64
+ * system prompt as already-known background, so agents can greet the
65
+ * user by name and calibrate depth/defaults from the first turn without
66
+ * a visible context preamble.
67
+ *
68
+ * Personalization, not authorization: anyone who can create the session
69
+ * can set this (the same trust level as authoring the first message).
70
+ * Hidden from the conversation thread, not from the API — `session.get`
71
+ * returns it, so never put secrets here; secrets belong in `runtimeEnv`
72
+ * or Environment resources. Large values bloat every prompt.
73
+ */
74
+ readonly sessionContext?: string;
44
75
  /** Execution harness. Immutable after the first execution runs. */
45
76
  readonly harness?: HarnessOption;
46
77
  /** Where session activities execute. Immutable after the first execution runs. */
@@ -293,6 +324,10 @@ export function useCreateAgentExecution(): UseCreateAgentExecutionReturn {
293
324
  workspaceEntries: input.sessionSpec.workspaceEntries,
294
325
  mcpServerUsages: input.sessionSpec.mcpServerUsages,
295
326
  skillRefs: input.sessionSpec.skillRefs,
327
+ metadata: mergeSessionContext(
328
+ input.sessionSpec.metadata,
329
+ input.sessionSpec.sessionContext,
330
+ ),
296
331
  harness: input.sessionSpec.harness
297
332
  ? toProtoHarness(input.sessionSpec.harness)
298
333
  : undefined,