@stigmer/react 0.0.71 → 0.0.73

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 (440) hide show
  1. package/agent/AgentEnvForm.d.ts +2 -0
  2. package/agent/AgentEnvForm.d.ts.map +1 -1
  3. package/agent/AgentEnvForm.js.map +1 -1
  4. package/agent/AgentPicker.d.ts +2 -0
  5. package/agent/AgentPicker.d.ts.map +1 -1
  6. package/agent/AgentPicker.js.map +1 -1
  7. package/agent/agentSetupReducer.d.ts +69 -7
  8. package/agent/agentSetupReducer.d.ts.map +1 -1
  9. package/agent/agentSetupReducer.js.map +1 -1
  10. package/agent/useAgentCount.d.ts +2 -0
  11. package/agent/useAgentCount.d.ts.map +1 -1
  12. package/agent/useAgentCount.js.map +1 -1
  13. package/attachment/AttachmentChipList.d.ts +15 -0
  14. package/attachment/AttachmentChipList.d.ts.map +1 -1
  15. package/attachment/AttachmentChipList.js +15 -0
  16. package/attachment/AttachmentChipList.js.map +1 -1
  17. package/attachment/useAttachments.d.ts +14 -0
  18. package/attachment/useAttachments.d.ts.map +1 -1
  19. package/attachment/useAttachments.js.map +1 -1
  20. package/composer/useComposer.d.ts +5 -0
  21. package/composer/useComposer.d.ts.map +1 -1
  22. package/composer/useComposer.js.map +1 -1
  23. package/execution/ExecutionPhaseBadge.d.ts +1 -1
  24. package/execution/ExecutionPhaseBadge.js +1 -1
  25. package/execution/McpToolDetail.d.ts +16 -8
  26. package/execution/McpToolDetail.d.ts.map +1 -1
  27. package/execution/McpToolDetail.js +0 -6
  28. package/execution/McpToolDetail.js.map +1 -1
  29. package/execution/TodoList.d.ts +8 -0
  30. package/execution/TodoList.d.ts.map +1 -1
  31. package/execution/TodoList.js +8 -0
  32. package/execution/TodoList.js.map +1 -1
  33. package/execution/ToolArgsView.d.ts +1 -0
  34. package/execution/ToolArgsView.d.ts.map +1 -1
  35. package/execution/ToolArgsView.js.map +1 -1
  36. package/execution/UsageWidget.d.ts +1 -1
  37. package/execution/UsageWidget.js +1 -1
  38. package/execution/file-path-resolver.d.ts +10 -0
  39. package/execution/file-path-resolver.d.ts.map +1 -1
  40. package/execution/file-path-resolver.js.map +1 -1
  41. package/execution/index.d.ts +1 -1
  42. package/execution/index.d.ts.map +1 -1
  43. package/execution/index.js.map +1 -1
  44. package/execution/useArtifactContent.d.ts +33 -0
  45. package/execution/useArtifactContent.d.ts.map +1 -1
  46. package/execution/useArtifactContent.js +33 -0
  47. package/execution/useArtifactContent.js.map +1 -1
  48. package/execution/useSubmitApproval.d.ts +2 -0
  49. package/execution/useSubmitApproval.d.ts.map +1 -1
  50. package/execution/useSubmitApproval.js.map +1 -1
  51. package/github/GitHubRepoPicker.d.ts +13 -0
  52. package/github/GitHubRepoPicker.d.ts.map +1 -1
  53. package/github/GitHubRepoPicker.js +13 -0
  54. package/github/GitHubRepoPicker.js.map +1 -1
  55. package/github/useGitHubConnection.d.ts +29 -1
  56. package/github/useGitHubConnection.d.ts.map +1 -1
  57. package/github/useGitHubConnection.js +29 -1
  58. package/github/useGitHubConnection.js.map +1 -1
  59. package/github/useGitHubRepos.d.ts +31 -0
  60. package/github/useGitHubRepos.d.ts.map +1 -1
  61. package/github/useGitHubRepos.js +31 -0
  62. package/github/useGitHubRepos.js.map +1 -1
  63. package/github/useGitHubSearch.d.ts +25 -0
  64. package/github/useGitHubSearch.d.ts.map +1 -1
  65. package/github/useGitHubSearch.js +25 -0
  66. package/github/useGitHubSearch.js.map +1 -1
  67. package/iam-policy/GrantAccessForm.d.ts +39 -0
  68. package/iam-policy/GrantAccessForm.d.ts.map +1 -0
  69. package/iam-policy/GrantAccessForm.js +75 -0
  70. package/iam-policy/GrantAccessForm.js.map +1 -0
  71. package/iam-policy/OrgMembersPanel.d.ts +28 -0
  72. package/iam-policy/OrgMembersPanel.d.ts.map +1 -0
  73. package/iam-policy/OrgMembersPanel.js +192 -0
  74. package/iam-policy/OrgMembersPanel.js.map +1 -0
  75. package/iam-policy/RoleSelector.d.ts +37 -0
  76. package/iam-policy/RoleSelector.d.ts.map +1 -0
  77. package/iam-policy/RoleSelector.js +42 -0
  78. package/iam-policy/RoleSelector.js.map +1 -0
  79. package/iam-policy/index.d.ts +12 -0
  80. package/iam-policy/index.d.ts.map +1 -0
  81. package/iam-policy/index.js +12 -0
  82. package/iam-policy/index.js.map +1 -0
  83. package/iam-policy/useCreateIamPolicy.d.ts +35 -0
  84. package/iam-policy/useCreateIamPolicy.d.ts.map +1 -0
  85. package/iam-policy/useCreateIamPolicy.js +46 -0
  86. package/iam-policy/useCreateIamPolicy.js.map +1 -0
  87. package/iam-policy/useDeleteIamPolicy.d.ts +34 -0
  88. package/iam-policy/useDeleteIamPolicy.d.ts.map +1 -0
  89. package/iam-policy/useDeleteIamPolicy.js +45 -0
  90. package/iam-policy/useDeleteIamPolicy.js.map +1 -0
  91. package/iam-policy/useGrantableRoles.d.ts +28 -0
  92. package/iam-policy/useGrantableRoles.d.ts.map +1 -0
  93. package/iam-policy/useGrantableRoles.js +32 -0
  94. package/iam-policy/useGrantableRoles.js.map +1 -0
  95. package/iam-policy/usePrincipalsCount.d.ts +31 -0
  96. package/iam-policy/usePrincipalsCount.d.ts.map +1 -0
  97. package/iam-policy/usePrincipalsCount.js +72 -0
  98. package/iam-policy/usePrincipalsCount.js.map +1 -0
  99. package/iam-policy/useResourceAccess.d.ts +51 -0
  100. package/iam-policy/useResourceAccess.d.ts.map +1 -0
  101. package/iam-policy/useResourceAccess.js +85 -0
  102. package/iam-policy/useResourceAccess.js.map +1 -0
  103. package/iam-policy/useRevokeOrgAccess.d.ts +36 -0
  104. package/iam-policy/useRevokeOrgAccess.d.ts.map +1 -0
  105. package/iam-policy/useRevokeOrgAccess.js +48 -0
  106. package/iam-policy/useRevokeOrgAccess.js.map +1 -0
  107. package/iam-policy/useRoleSelector.d.ts +52 -0
  108. package/iam-policy/useRoleSelector.d.ts.map +1 -0
  109. package/iam-policy/useRoleSelector.js +50 -0
  110. package/iam-policy/useRoleSelector.js.map +1 -0
  111. package/iam-policy/useWhoAmI.d.ts +30 -0
  112. package/iam-policy/useWhoAmI.d.ts.map +1 -0
  113. package/iam-policy/useWhoAmI.js +56 -0
  114. package/iam-policy/useWhoAmI.js.map +1 -0
  115. package/identity-provider/CreateIdentityProviderForm.d.ts +39 -0
  116. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -0
  117. package/identity-provider/CreateIdentityProviderForm.js +102 -0
  118. package/identity-provider/CreateIdentityProviderForm.js.map +1 -0
  119. package/identity-provider/IdentityProviderDetailPanel.d.ts +42 -0
  120. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -0
  121. package/identity-provider/IdentityProviderDetailPanel.js +156 -0
  122. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -0
  123. package/identity-provider/IdentityProviderListPanel.d.ts +41 -0
  124. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -0
  125. package/identity-provider/IdentityProviderListPanel.js +110 -0
  126. package/identity-provider/IdentityProviderListPanel.js.map +1 -0
  127. package/identity-provider/IdentityProviderWizard.d.ts +40 -0
  128. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -0
  129. package/identity-provider/IdentityProviderWizard.js +180 -0
  130. package/identity-provider/IdentityProviderWizard.js.map +1 -0
  131. package/identity-provider/ProviderPicker.d.ts +28 -0
  132. package/identity-provider/ProviderPicker.d.ts.map +1 -0
  133. package/identity-provider/ProviderPicker.js +64 -0
  134. package/identity-provider/ProviderPicker.js.map +1 -0
  135. package/identity-provider/SsoLoginPrompt.d.ts +51 -0
  136. package/identity-provider/SsoLoginPrompt.d.ts.map +1 -0
  137. package/identity-provider/SsoLoginPrompt.js +119 -0
  138. package/identity-provider/SsoLoginPrompt.js.map +1 -0
  139. package/identity-provider/index.d.ts +14 -0
  140. package/identity-provider/index.d.ts.map +1 -0
  141. package/identity-provider/index.js +14 -0
  142. package/identity-provider/index.js.map +1 -0
  143. package/identity-provider/presets.d.ts +65 -0
  144. package/identity-provider/presets.d.ts.map +1 -0
  145. package/identity-provider/presets.js +200 -0
  146. package/identity-provider/presets.js.map +1 -0
  147. package/identity-provider/useCreateIdentityProvider.d.ts +37 -0
  148. package/identity-provider/useCreateIdentityProvider.d.ts.map +1 -0
  149. package/identity-provider/useCreateIdentityProvider.js +48 -0
  150. package/identity-provider/useCreateIdentityProvider.js.map +1 -0
  151. package/identity-provider/useDeleteIdentityProvider.d.ts +34 -0
  152. package/identity-provider/useDeleteIdentityProvider.d.ts.map +1 -0
  153. package/identity-provider/useDeleteIdentityProvider.js +45 -0
  154. package/identity-provider/useDeleteIdentityProvider.js.map +1 -0
  155. package/identity-provider/useIdentityProvider.d.ts +37 -0
  156. package/identity-provider/useIdentityProvider.d.ts.map +1 -0
  157. package/identity-provider/useIdentityProvider.js +62 -0
  158. package/identity-provider/useIdentityProvider.js.map +1 -0
  159. package/identity-provider/useIdentityProviderList.d.ts +48 -0
  160. package/identity-provider/useIdentityProviderList.d.ts.map +1 -0
  161. package/identity-provider/useIdentityProviderList.js +75 -0
  162. package/identity-provider/useIdentityProviderList.js.map +1 -0
  163. package/identity-provider/useOidcDiscovery.d.ts +39 -0
  164. package/identity-provider/useOidcDiscovery.d.ts.map +1 -0
  165. package/identity-provider/useOidcDiscovery.js +76 -0
  166. package/identity-provider/useOidcDiscovery.js.map +1 -0
  167. package/identity-provider/useSsoProvider.d.ts +50 -0
  168. package/identity-provider/useSsoProvider.d.ts.map +1 -0
  169. package/identity-provider/useSsoProvider.js +83 -0
  170. package/identity-provider/useSsoProvider.js.map +1 -0
  171. package/identity-provider/useUpdateIdentityProvider.d.ts +38 -0
  172. package/identity-provider/useUpdateIdentityProvider.d.ts.map +1 -0
  173. package/identity-provider/useUpdateIdentityProvider.js +49 -0
  174. package/identity-provider/useUpdateIdentityProvider.js.map +1 -0
  175. package/index.d.ts +14 -5
  176. package/index.d.ts.map +1 -1
  177. package/index.js +10 -2
  178. package/index.js.map +1 -1
  179. package/internal/CloudFeatureNotice.d.ts +12 -0
  180. package/internal/CloudFeatureNotice.d.ts.map +1 -1
  181. package/internal/CloudFeatureNotice.js +12 -0
  182. package/internal/CloudFeatureNotice.js.map +1 -1
  183. package/invitation/InvitationCreatedAlert.d.ts +35 -0
  184. package/invitation/InvitationCreatedAlert.d.ts.map +1 -0
  185. package/invitation/InvitationCreatedAlert.js +60 -0
  186. package/invitation/InvitationCreatedAlert.js.map +1 -0
  187. package/invitation/InvitationManager.d.ts +44 -0
  188. package/invitation/InvitationManager.d.ts.map +1 -0
  189. package/invitation/InvitationManager.js +248 -0
  190. package/invitation/InvitationManager.js.map +1 -0
  191. package/invitation/InvitationRedemption.d.ts +69 -0
  192. package/invitation/InvitationRedemption.d.ts.map +1 -0
  193. package/invitation/InvitationRedemption.js +140 -0
  194. package/invitation/InvitationRedemption.js.map +1 -0
  195. package/invitation/index.d.ts +17 -0
  196. package/invitation/index.d.ts.map +1 -0
  197. package/invitation/index.js +9 -0
  198. package/invitation/index.js.map +1 -0
  199. package/invitation/useCreateInvitation.d.ts +52 -0
  200. package/invitation/useCreateInvitation.d.ts.map +1 -0
  201. package/invitation/useCreateInvitation.js +55 -0
  202. package/invitation/useCreateInvitation.js.map +1 -0
  203. package/invitation/useInvitationPreview.d.ts +51 -0
  204. package/invitation/useInvitationPreview.d.ts.map +1 -0
  205. package/invitation/useInvitationPreview.js +80 -0
  206. package/invitation/useInvitationPreview.js.map +1 -0
  207. package/invitation/useOrgInvitations.d.ts +36 -0
  208. package/invitation/useOrgInvitations.d.ts.map +1 -0
  209. package/invitation/useOrgInvitations.js +65 -0
  210. package/invitation/useOrgInvitations.js.map +1 -0
  211. package/invitation/useRedeemInvitation.d.ts +47 -0
  212. package/invitation/useRedeemInvitation.d.ts.map +1 -0
  213. package/invitation/useRedeemInvitation.js +53 -0
  214. package/invitation/useRedeemInvitation.js.map +1 -0
  215. package/invitation/useRevokeInvitation.d.ts +35 -0
  216. package/invitation/useRevokeInvitation.d.ts.map +1 -0
  217. package/invitation/useRevokeInvitation.js +47 -0
  218. package/invitation/useRevokeInvitation.js.map +1 -0
  219. package/library/detect-skill-package.d.ts +1 -0
  220. package/library/detect-skill-package.d.ts.map +1 -1
  221. package/library/detect-skill-package.js.map +1 -1
  222. package/library/detect-stigmer-resource.d.ts +1 -0
  223. package/library/detect-stigmer-resource.d.ts.map +1 -1
  224. package/library/detect-stigmer-resource.js.map +1 -1
  225. package/library/parse-resource-yaml.d.ts +4 -0
  226. package/library/parse-resource-yaml.d.ts.map +1 -1
  227. package/library/parse-resource-yaml.js.map +1 -1
  228. package/mcp-server/McpServerDetailView.d.ts +2 -2
  229. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  230. package/mcp-server/McpServerDetailView.js.map +1 -1
  231. package/mcp-server/index.d.ts +1 -1
  232. package/mcp-server/index.d.ts.map +1 -1
  233. package/mcp-server/index.js.map +1 -1
  234. package/mcp-server/mcpServerSetupReducer.d.ts +54 -0
  235. package/mcp-server/mcpServerSetupReducer.d.ts.map +1 -1
  236. package/mcp-server/mcpServerSetupReducer.js.map +1 -1
  237. package/models/ModelSelector.d.ts +9 -0
  238. package/models/ModelSelector.d.ts.map +1 -1
  239. package/models/ModelSelector.js +9 -0
  240. package/models/ModelSelector.js.map +1 -1
  241. package/models/registry.d.ts +11 -1
  242. package/models/registry.d.ts.map +1 -1
  243. package/models/registry.js.map +1 -1
  244. package/models/useModelRegistry.d.ts +20 -0
  245. package/models/useModelRegistry.d.ts.map +1 -1
  246. package/models/useModelRegistry.js +20 -0
  247. package/models/useModelRegistry.js.map +1 -1
  248. package/organization/OrgProfilePanel.d.ts +31 -0
  249. package/organization/OrgProfilePanel.d.ts.map +1 -0
  250. package/organization/OrgProfilePanel.js +147 -0
  251. package/organization/OrgProfilePanel.js.map +1 -0
  252. package/organization/index.d.ts +6 -0
  253. package/organization/index.d.ts.map +1 -1
  254. package/organization/index.js +3 -0
  255. package/organization/index.js.map +1 -1
  256. package/organization/useOrganization.d.ts +31 -0
  257. package/organization/useOrganization.d.ts.map +1 -0
  258. package/organization/useOrganization.js +56 -0
  259. package/organization/useOrganization.js.map +1 -0
  260. package/organization/useUpdateOrganization.d.ts +40 -0
  261. package/organization/useUpdateOrganization.d.ts.map +1 -0
  262. package/organization/useUpdateOrganization.js +51 -0
  263. package/organization/useUpdateOrganization.js.map +1 -0
  264. package/package.json +4 -4
  265. package/provider.d.ts +1 -0
  266. package/provider.d.ts.map +1 -1
  267. package/provider.js.map +1 -1
  268. package/search/useResourceList.d.ts +4 -2
  269. package/search/useResourceList.d.ts.map +1 -1
  270. package/search/useResourceList.js +2 -1
  271. package/search/useResourceList.js.map +1 -1
  272. package/search/useResourceSearch.d.ts +10 -2
  273. package/search/useResourceSearch.d.ts.map +1 -1
  274. package/search/useResourceSearch.js +2 -1
  275. package/search/useResourceSearch.js.map +1 -1
  276. package/session/group-sessions.d.ts +23 -0
  277. package/session/group-sessions.d.ts.map +1 -1
  278. package/session/group-sessions.js +23 -0
  279. package/session/group-sessions.js.map +1 -1
  280. package/session/index.d.ts +1 -1
  281. package/session/index.d.ts.map +1 -1
  282. package/session/index.js.map +1 -1
  283. package/session/useCreateSession.d.ts +11 -2
  284. package/session/useCreateSession.d.ts.map +1 -1
  285. package/session/useCreateSession.js.map +1 -1
  286. package/session/useSession.d.ts +24 -0
  287. package/session/useSession.d.ts.map +1 -1
  288. package/session/useSession.js +24 -0
  289. package/session/useSession.js.map +1 -1
  290. package/session/useSessionArtifacts.d.ts +1 -0
  291. package/session/useSessionArtifacts.d.ts.map +1 -1
  292. package/session/useSessionArtifacts.js.map +1 -1
  293. package/session/useSessionConversation.d.ts +7 -0
  294. package/session/useSessionConversation.d.ts.map +1 -1
  295. package/session/useSessionConversation.js.map +1 -1
  296. package/session/useSessionExecutions.d.ts +23 -0
  297. package/session/useSessionExecutions.d.ts.map +1 -1
  298. package/session/useSessionExecutions.js +23 -0
  299. package/session/useSessionExecutions.js.map +1 -1
  300. package/session/useSessionList.d.ts +19 -0
  301. package/session/useSessionList.d.ts.map +1 -1
  302. package/session/useSessionList.js +19 -0
  303. package/session/useSessionList.js.map +1 -1
  304. package/session/useSessionWriteBacks.d.ts +1 -0
  305. package/session/useSessionWriteBacks.d.ts.map +1 -1
  306. package/session/useSessionWriteBacks.js.map +1 -1
  307. package/session/useUpdateSession.d.ts +22 -0
  308. package/session/useUpdateSession.d.ts.map +1 -1
  309. package/session/useUpdateSession.js +22 -0
  310. package/session/useUpdateSession.js.map +1 -1
  311. package/skill/SkillPicker.d.ts +15 -0
  312. package/skill/SkillPicker.d.ts.map +1 -1
  313. package/skill/SkillPicker.js +15 -0
  314. package/skill/SkillPicker.js.map +1 -1
  315. package/src/agent/AgentEnvForm.tsx +2 -0
  316. package/src/agent/AgentPicker.tsx +2 -0
  317. package/src/agent/agentSetupReducer.ts +109 -20
  318. package/src/agent/useAgentCount.ts +2 -0
  319. package/src/attachment/AttachmentChipList.tsx +15 -0
  320. package/src/attachment/useAttachments.ts +14 -0
  321. package/src/composer/useComposer.ts +5 -0
  322. package/src/execution/ExecutionPhaseBadge.tsx +1 -1
  323. package/src/execution/McpToolDetail.tsx +18 -6
  324. package/src/execution/TodoList.tsx +8 -0
  325. package/src/execution/ToolArgsView.tsx +1 -0
  326. package/src/execution/UsageWidget.tsx +1 -1
  327. package/src/execution/file-path-resolver.ts +28 -4
  328. package/src/execution/index.ts +5 -1
  329. package/src/execution/useArtifactContent.ts +33 -0
  330. package/src/execution/useSubmitApproval.ts +2 -0
  331. package/src/github/GitHubRepoPicker.tsx +13 -0
  332. package/src/github/useGitHubConnection.ts +29 -1
  333. package/src/github/useGitHubRepos.ts +31 -0
  334. package/src/github/useGitHubSearch.ts +25 -0
  335. package/src/iam-policy/GrantAccessForm.tsx +198 -0
  336. package/src/iam-policy/OrgMembersPanel.tsx +572 -0
  337. package/src/iam-policy/RoleSelector.tsx +105 -0
  338. package/src/iam-policy/index.ts +51 -0
  339. package/src/iam-policy/useCreateIamPolicy.ts +66 -0
  340. package/src/iam-policy/useDeleteIamPolicy.ts +65 -0
  341. package/src/iam-policy/useGrantableRoles.ts +45 -0
  342. package/src/iam-policy/usePrincipalsCount.ts +96 -0
  343. package/src/iam-policy/useResourceAccess.ts +128 -0
  344. package/src/iam-policy/useRevokeOrgAccess.ts +74 -0
  345. package/src/iam-policy/useRoleSelector.ts +97 -0
  346. package/src/iam-policy/useWhoAmI.ts +78 -0
  347. package/src/identity-provider/CreateIdentityProviderForm.tsx +308 -0
  348. package/src/identity-provider/IdentityProviderDetailPanel.tsx +583 -0
  349. package/src/identity-provider/IdentityProviderListPanel.tsx +370 -0
  350. package/src/identity-provider/IdentityProviderWizard.tsx +684 -0
  351. package/src/identity-provider/ProviderPicker.tsx +152 -0
  352. package/src/identity-provider/SsoLoginPrompt.tsx +404 -0
  353. package/src/identity-provider/index.ts +67 -0
  354. package/src/identity-provider/presets.ts +262 -0
  355. package/src/identity-provider/useCreateIdentityProvider.ts +68 -0
  356. package/src/identity-provider/useDeleteIdentityProvider.ts +65 -0
  357. package/src/identity-provider/useIdentityProvider.ts +86 -0
  358. package/src/identity-provider/useIdentityProviderList.ts +100 -0
  359. package/src/identity-provider/useOidcDiscovery.ts +124 -0
  360. package/src/identity-provider/useSsoProvider.ts +99 -0
  361. package/src/identity-provider/useUpdateIdentityProvider.ts +69 -0
  362. package/src/index.ts +121 -1
  363. package/src/internal/CloudFeatureNotice.tsx +12 -0
  364. package/src/invitation/InvitationCreatedAlert.tsx +185 -0
  365. package/src/invitation/InvitationManager.tsx +842 -0
  366. package/src/invitation/InvitationRedemption.tsx +434 -0
  367. package/src/invitation/index.ts +16 -0
  368. package/src/invitation/useCreateInvitation.ts +83 -0
  369. package/src/invitation/useInvitationPreview.ts +103 -0
  370. package/src/invitation/useOrgInvitations.ts +88 -0
  371. package/src/invitation/useRedeemInvitation.ts +82 -0
  372. package/src/invitation/useRevokeInvitation.ts +66 -0
  373. package/src/library/detect-skill-package.ts +4 -1
  374. package/src/library/detect-stigmer-resource.ts +4 -1
  375. package/src/library/parse-resource-yaml.ts +12 -2
  376. package/src/mcp-server/McpServerDetailView.tsx +2 -1
  377. package/src/mcp-server/index.ts +4 -1
  378. package/src/mcp-server/mcpServerSetupReducer.ts +86 -8
  379. package/src/models/ModelSelector.tsx +9 -0
  380. package/src/models/registry.ts +11 -1
  381. package/src/models/useModelRegistry.ts +20 -0
  382. package/src/organization/OrgProfilePanel.tsx +451 -0
  383. package/src/organization/index.ts +6 -0
  384. package/src/organization/useOrganization.ts +79 -0
  385. package/src/organization/useUpdateOrganization.ts +71 -0
  386. package/src/provider.tsx +1 -0
  387. package/src/search/useResourceList.ts +6 -3
  388. package/src/search/useResourceSearch.ts +12 -3
  389. package/src/session/group-sessions.ts +23 -0
  390. package/src/session/index.ts +1 -0
  391. package/src/session/useCreateSession.ts +19 -3
  392. package/src/session/useSession.ts +24 -0
  393. package/src/session/useSessionArtifacts.ts +1 -0
  394. package/src/session/useSessionConversation.ts +7 -0
  395. package/src/session/useSessionExecutions.ts +23 -0
  396. package/src/session/useSessionList.ts +19 -0
  397. package/src/session/useSessionWriteBacks.ts +1 -0
  398. package/src/session/useUpdateSession.ts +22 -0
  399. package/src/skill/SkillPicker.tsx +15 -0
  400. package/src/usage/OrgUsagePanel.tsx +465 -0
  401. package/src/usage/date-range.ts +86 -0
  402. package/src/usage/index.ts +13 -0
  403. package/src/usage/useOrgUsageReport.ts +110 -0
  404. package/src/workspace/FolderBrowser.tsx +9 -0
  405. package/src/workspace/WorkspaceEditor.tsx +17 -0
  406. package/src/workspace/useFolderListing.ts +24 -0
  407. package/src/workspace/useWorkspaceEntries.ts +38 -0
  408. package/styles.css +1 -1
  409. package/usage/OrgUsagePanel.d.ts +24 -0
  410. package/usage/OrgUsagePanel.d.ts.map +1 -0
  411. package/usage/OrgUsagePanel.js +134 -0
  412. package/usage/OrgUsagePanel.js.map +1 -0
  413. package/usage/date-range.d.ts +36 -0
  414. package/usage/date-range.d.ts.map +1 -0
  415. package/usage/date-range.js +69 -0
  416. package/usage/date-range.js.map +1 -0
  417. package/usage/index.d.ts +7 -0
  418. package/usage/index.d.ts.map +1 -0
  419. package/usage/index.js +4 -0
  420. package/usage/index.js.map +1 -0
  421. package/usage/useOrgUsageReport.d.ts +48 -0
  422. package/usage/useOrgUsageReport.d.ts.map +1 -0
  423. package/usage/useOrgUsageReport.js +72 -0
  424. package/usage/useOrgUsageReport.js.map +1 -0
  425. package/workspace/FolderBrowser.d.ts +9 -0
  426. package/workspace/FolderBrowser.d.ts.map +1 -1
  427. package/workspace/FolderBrowser.js +9 -0
  428. package/workspace/FolderBrowser.js.map +1 -1
  429. package/workspace/WorkspaceEditor.d.ts +17 -0
  430. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  431. package/workspace/WorkspaceEditor.js +17 -0
  432. package/workspace/WorkspaceEditor.js.map +1 -1
  433. package/workspace/useFolderListing.d.ts +24 -0
  434. package/workspace/useFolderListing.d.ts.map +1 -1
  435. package/workspace/useFolderListing.js +24 -0
  436. package/workspace/useFolderListing.js.map +1 -1
  437. package/workspace/useWorkspaceEntries.d.ts +38 -0
  438. package/workspace/useWorkspaceEntries.d.ts.map +1 -1
  439. package/workspace/useWorkspaceEntries.js +25 -0
  440. package/workspace/useWorkspaceEntries.js.map +1 -1
@@ -0,0 +1,156 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useState } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { getUserMessage } from "@stigmer/sdk";
6
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
7
+ import { useUpdateIdentityProvider } from "./useUpdateIdentityProvider";
8
+ /**
9
+ * View and edit panel for an existing identity provider.
10
+ *
11
+ * In **view mode**, displays all OIDC configuration fields in a
12
+ * structured label/value layout with an "Edit" button.
13
+ *
14
+ * In **edit mode**, fields become editable inputs. The SSO toggle and
15
+ * OIDC client ID are editable. "Save" submits the update via
16
+ * {@link useUpdateIdentityProvider}; "Cancel" discards changes and
17
+ * returns to view mode.
18
+ *
19
+ * All visual properties flow through `--stgm-*` design tokens.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * <IdentityProviderDetailPanel
24
+ * identityProvider={idp}
25
+ * onUpdated={(updated) => refetch()}
26
+ * onBack={() => setFlow({ phase: "idle" })}
27
+ * />
28
+ * ```
29
+ */
30
+ export function IdentityProviderDetailPanel({ identityProvider, onUpdated, onBack, ssoLoginUrl, className, }) {
31
+ const spec = identityProvider.spec;
32
+ const meta = identityProvider.metadata;
33
+ const { update, isUpdating, error, clearError } = useUpdateIdentityProvider();
34
+ const [mode, setMode] = useState("view");
35
+ // Edit form state — initialized from current resource
36
+ const [displayName, setDisplayName] = useState(spec?.displayName ?? "");
37
+ const [jwksUri, setJwksUri] = useState(spec?.jwksUri ?? "");
38
+ const [issuers, setIssuers] = useState(spec?.allowedIssuers.join(", ") ?? "");
39
+ const [audience, setAudience] = useState(spec?.expectedAudience ?? "");
40
+ const [userinfoEndpoint, setUserinfoEndpoint] = useState(spec?.userinfoEndpoint ?? "");
41
+ const [isSso, setIsSso] = useState(spec?.isSsoProvider ?? false);
42
+ const [oidcClientId, setOidcClientId] = useState(spec?.oidcClientId ?? "");
43
+ const enterEdit = useCallback(() => {
44
+ setDisplayName(spec?.displayName ?? "");
45
+ setJwksUri(spec?.jwksUri ?? "");
46
+ setIssuers(spec?.allowedIssuers.join(", ") ?? "");
47
+ setAudience(spec?.expectedAudience ?? "");
48
+ setUserinfoEndpoint(spec?.userinfoEndpoint ?? "");
49
+ setIsSso(spec?.isSsoProvider ?? false);
50
+ setOidcClientId(spec?.oidcClientId ?? "");
51
+ clearError();
52
+ setMode("edit");
53
+ }, [spec, clearError]);
54
+ const cancelEdit = useCallback(() => {
55
+ clearError();
56
+ setMode("view");
57
+ }, [clearError]);
58
+ const handleSave = useCallback(async (e) => {
59
+ e.preventDefault();
60
+ clearError();
61
+ try {
62
+ const updated = await update({
63
+ name: meta?.name ?? "",
64
+ slug: meta?.slug,
65
+ org: meta?.org ?? "",
66
+ displayName: displayName.trim(),
67
+ jwksUri: jwksUri.trim(),
68
+ allowedIssuers: issuers
69
+ .split(",")
70
+ .map((s) => s.trim())
71
+ .filter(Boolean),
72
+ expectedAudience: audience.trim(),
73
+ userinfoEndpoint: userinfoEndpoint.trim() || undefined,
74
+ isSsoProvider: isSso,
75
+ oidcClientId: isSso ? oidcClientId.trim() : undefined,
76
+ });
77
+ setMode("view");
78
+ onUpdated?.(updated);
79
+ }
80
+ catch {
81
+ // error state is managed by useUpdateIdentityProvider
82
+ }
83
+ }, [
84
+ meta, displayName, jwksUri, issuers, audience,
85
+ userinfoEndpoint, isSso, oidcClientId, update, clearError, onUpdated,
86
+ ]);
87
+ const canSave = displayName.trim() !== "" &&
88
+ jwksUri.trim() !== "" &&
89
+ issuers.trim() !== "" &&
90
+ audience.trim() !== "" &&
91
+ (!isSso || oidcClientId.trim() !== "") &&
92
+ !isUpdating;
93
+ const createdAt = identityProvider.status?.audit?.specAudit?.createdAt;
94
+ const updatedAt = identityProvider.status?.audit?.specAudit?.updatedAt;
95
+ return (_jsxs("div", { className: cn("space-y-4", className), children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [onBack && (_jsxs("button", { type: "button", onClick: onBack, className: "text-muted-foreground hover:text-foreground mb-1 flex items-center gap-1 text-xs transition-colors", children: [_jsx(ArrowLeftIcon, {}), "Back to list"] })), _jsx("h3", { className: "text-foreground truncate text-sm font-semibold", children: spec?.displayName || meta?.name || "Identity Provider" }), _jsxs("div", { className: "flex items-center gap-2", children: [meta?.slug && (_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: meta.slug })), spec?.isSsoProvider && (_jsx("span", { className: "inline-flex items-center rounded-full border border-primary/30 bg-primary-subtle px-2 py-0.5 text-[0.65rem] font-medium text-primary", children: "SSO" }))] })] }), mode === "view" && (_jsx("button", { type: "button", onClick: enterEdit, className: cn("shrink-0 rounded-md px-2.5 py-1.5 text-xs font-medium", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "transition-colors"), children: "Edit" }))] }), mode === "view" ? (_jsx(ViewMode, { spec: spec, ssoLoginUrl: ssoLoginUrl, createdAt: createdAt, updatedAt: updatedAt })) : (_jsxs("form", { onSubmit: handleSave, className: "space-y-3", children: [_jsx(FieldInput, { id: "stgm-idp-edit-name", label: "Display name", value: displayName, onChange: setDisplayName, placeholder: "e.g., Acme Corp SSO", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-jwks", label: "JWKS URI", value: jwksUri, onChange: setJwksUri, placeholder: "https://example.com/.well-known/jwks.json", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-issuers", label: "Allowed issuers", value: issuers, onChange: setIssuers, placeholder: "https://issuer.example.com/", hint: "Comma-separated list of trusted JWT issuer values", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-audience", label: "Expected audience", value: audience, onChange: setAudience, placeholder: "stigmer-api", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-userinfo", label: "Userinfo endpoint", value: userinfoEndpoint, onChange: setUserinfoEndpoint, placeholder: "https://example.com/userinfo", hint: "Optional \u2014 used to fetch user profile data", disabled: isUpdating }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", role: "switch", "aria-checked": isSso, onClick: () => setIsSso((v) => !v), disabled: isUpdating, className: cn("relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors", isSso ? "bg-primary" : "bg-muted", "disabled:pointer-events-none disabled:opacity-50"), children: _jsx("span", { className: cn("pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow-sm ring-0 transition-transform", isSso ? "translate-x-4" : "translate-x-0") }) }), _jsx("span", { className: "text-xs font-medium text-foreground", children: "SSO provider" })] }), isSso && (_jsx(FieldInput, { id: "stgm-idp-edit-client-id", label: "OIDC client ID", value: oidcClientId, onChange: setOidcClientId, placeholder: "public-client-id", hint: "Client ID for the PKCE-based Authorization Code flow", disabled: isUpdating, required: true })), error && (_jsx("p", { className: "text-destructive text-[0.65rem]", role: "alert", children: getUserMessage(error) })), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsxs("button", { type: "submit", disabled: !canSave, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-40"), children: [isUpdating && _jsx(SpinnerIcon, {}), "Save changes"] }), _jsx("button", { type: "button", onClick: cancelEdit, disabled: isUpdating, className: cn("rounded-md px-2.5 py-1.5 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" })] })] }))] }));
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // View mode
99
+ // ---------------------------------------------------------------------------
100
+ function ViewMode({ spec, ssoLoginUrl, createdAt, updatedAt, }) {
101
+ return (_jsxs("dl", { className: "space-y-2.5", children: [_jsx(Field, { label: "JWKS URI", value: spec?.jwksUri, mono: true }), _jsx(Field, { label: "Allowed issuers", value: spec?.allowedIssuers.join(", "), mono: true }), _jsx(Field, { label: "Expected audience", value: spec?.expectedAudience, mono: true }), spec?.userinfoEndpoint && (_jsx(Field, { label: "Userinfo endpoint", value: spec.userinfoEndpoint, mono: true })), spec?.isSsoProvider && (_jsx(Field, { label: "OIDC client ID", value: spec.oidcClientId, mono: true })), spec?.isSsoProvider && ssoLoginUrl && (_jsx(CopyableField, { label: "SSO login URL", value: ssoLoginUrl, hint: "Share this URL with your team members to sign in via SSO" })), (spec?.rateLimitBudget ?? 0) > 0 && (_jsx(Field, { label: "Rate limit", value: `${spec.rateLimitBudget} req/min` })), _jsxs("div", { className: "flex gap-6", children: [createdAt && (_jsx(Field, { label: "Created", value: formatDate(timestampDate(createdAt)) })), updatedAt && (_jsx(Field, { label: "Updated", value: formatDate(timestampDate(updatedAt)) }))] })] }));
102
+ }
103
+ function Field({ label, value, mono, }) {
104
+ if (!value)
105
+ return null;
106
+ return (_jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground text-[0.65rem] font-medium", children: label }), _jsx("dd", { className: cn("text-foreground mt-0.5 break-all text-xs", mono && "font-mono"), children: value })] }));
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // View mode — copyable field
110
+ // ---------------------------------------------------------------------------
111
+ const COPIED_FEEDBACK_MS = 2000;
112
+ function CopyableField({ label, value, hint, }) {
113
+ const [copied, setCopied] = useState(false);
114
+ const valueId = "stgm-idp-sso-login-url";
115
+ const handleCopy = useCallback(async () => {
116
+ try {
117
+ await navigator.clipboard.writeText(value);
118
+ setCopied(true);
119
+ setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
120
+ }
121
+ catch {
122
+ const el = document.getElementById(valueId);
123
+ if (el) {
124
+ const selection = window.getSelection();
125
+ const range = document.createRange();
126
+ range.selectNodeContents(el);
127
+ selection?.removeAllRanges();
128
+ selection?.addRange(range);
129
+ }
130
+ }
131
+ }, [value]);
132
+ return (_jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground text-[0.65rem] font-medium", children: label }), _jsxs("dd", { className: "mt-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { id: valueId, className: "text-foreground break-all font-mono text-xs select-all", children: value }), _jsx("button", { type: "button", onClick: handleCopy, className: cn("shrink-0 rounded px-1.5 py-0.5 text-[0.6rem]", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "transition-colors"), "aria-label": `Copy ${label}`, children: copied ? "Copied" : "Copy" })] }), hint && (_jsx("p", { className: "text-muted-foreground mt-0.5 text-[0.65rem]", children: hint })), _jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: "sr-only", children: copied && "SSO login URL copied to clipboard" })] })] }));
133
+ }
134
+ // ---------------------------------------------------------------------------
135
+ // Shared primitives
136
+ // ---------------------------------------------------------------------------
137
+ function FieldInput({ id, label, value, onChange, placeholder, hint, disabled, required, }) {
138
+ return (_jsxs("div", { className: "space-y-1", children: [_jsx("label", { htmlFor: id, className: "text-xs font-medium text-foreground", children: label }), _jsx("input", { id: id, type: "text", value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, disabled: disabled, required: required, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50") }), hint && (_jsx("p", { className: "text-[0.65rem] text-muted-foreground", children: hint }))] }));
139
+ }
140
+ function formatDate(date) {
141
+ return date.toLocaleDateString(undefined, {
142
+ month: "short",
143
+ day: "numeric",
144
+ year: "numeric",
145
+ });
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // Icons
149
+ // ---------------------------------------------------------------------------
150
+ function ArrowLeftIcon() {
151
+ return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M10 3L5 8l5 5" }) }));
152
+ }
153
+ function SpinnerIcon() {
154
+ return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
155
+ }
156
+ //# sourceMappingURL=IdentityProviderDetailPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProviderDetailPanel.js","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderDetailPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
2
+ /** Props for {@link IdentityProviderListPanel}. */
3
+ export interface IdentityProviderListPanelProps {
4
+ /** Organization slug whose identity providers should be listed. */
5
+ readonly org: string;
6
+ /** Fired when the user wants to edit an identity provider. */
7
+ readonly onEdit?: (idp: IdentityProvider) => void;
8
+ /** Expose the refetch function so parents can trigger a list refresh. */
9
+ readonly onRefetchRef?: (refetch: () => void) => void;
10
+ /** Additional CSS class names for the root container. */
11
+ readonly className?: string;
12
+ }
13
+ /**
14
+ * Displays a list of {@link IdentityProvider} resources for an
15
+ * organization with inline delete confirmation.
16
+ *
17
+ * Each provider is rendered as a row showing name, slug, SSO badge
18
+ * (when `is_sso_provider` is true), and creation date. A delete
19
+ * button triggers an inline confirmation flow.
20
+ *
21
+ * Identity providers are admin-level resources with small cardinality
22
+ * (typically 1–3 per org), so the list is rendered without pagination.
23
+ *
24
+ * All visual properties flow through `--stgm-*` design tokens.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <IdentityProviderListPanel org="acme" />
29
+ * ```
30
+ *
31
+ * @example
32
+ * ```tsx
33
+ * <IdentityProviderListPanel
34
+ * org="acme"
35
+ * onEdit={(idp) => navigate(`/settings/idp/${idp.metadata?.id}`)}
36
+ * onRefetchRef={(refetch) => { listRefetchRef.current = refetch; }}
37
+ * />
38
+ * ```
39
+ */
40
+ export declare function IdentityProviderListPanel({ org, onEdit, onRefetchRef, className, }: IdentityProviderListPanelProps): import("react/jsx-runtime").JSX.Element;
41
+ //# sourceMappingURL=IdentityProviderListPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProviderListPanel.d.ts","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderListPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAIlG,mDAAmD;AACnD,MAAM,WAAW,8BAA8B;IAC7C,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACtD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,GAAG,EACH,MAAM,EACN,YAAY,EACZ,SAAS,GACV,EAAE,8BAA8B,2CAwEhC"}
@@ -0,0 +1,110 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useState } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { getUserMessage } from "@stigmer/sdk";
6
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
7
+ import { useIdentityProviderList } from "./useIdentityProviderList";
8
+ import { useDeleteIdentityProvider } from "./useDeleteIdentityProvider";
9
+ /**
10
+ * Displays a list of {@link IdentityProvider} resources for an
11
+ * organization with inline delete confirmation.
12
+ *
13
+ * Each provider is rendered as a row showing name, slug, SSO badge
14
+ * (when `is_sso_provider` is true), and creation date. A delete
15
+ * button triggers an inline confirmation flow.
16
+ *
17
+ * Identity providers are admin-level resources with small cardinality
18
+ * (typically 1–3 per org), so the list is rendered without pagination.
19
+ *
20
+ * All visual properties flow through `--stgm-*` design tokens.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * <IdentityProviderListPanel org="acme" />
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * <IdentityProviderListPanel
30
+ * org="acme"
31
+ * onEdit={(idp) => navigate(`/settings/idp/${idp.metadata?.id}`)}
32
+ * onRefetchRef={(refetch) => { listRefetchRef.current = refetch; }}
33
+ * />
34
+ * ```
35
+ */
36
+ export function IdentityProviderListPanel({ org, onEdit, onRefetchRef, className, }) {
37
+ const { identityProviders, isLoading, error, refetch } = useIdentityProviderList(org);
38
+ const [confirmingId, setConfirmingId] = useState(null);
39
+ if (onRefetchRef) {
40
+ onRefetchRef(refetch);
41
+ }
42
+ if (isLoading) {
43
+ return (_jsx("div", { className: cn("space-y-2", className), "aria-busy": "true", "aria-label": "Loading identity providers", children: Array.from({ length: 2 }, (_, i) => (_jsx("div", { className: "bg-muted/40 h-14 animate-pulse rounded-lg" }, i))) }));
44
+ }
45
+ if (error) {
46
+ return (_jsx("p", { className: cn("text-destructive text-xs", className), role: "alert", children: getUserMessage(error) }));
47
+ }
48
+ if (identityProviders.length === 0) {
49
+ return (_jsx("p", { className: cn("text-muted-foreground py-4 text-center text-xs", className), children: "No identity providers configured." }));
50
+ }
51
+ return (_jsx("div", { className: cn("space-y-2", className), role: "list", "aria-label": "Identity providers", children: identityProviders.map((idp) => {
52
+ const id = idp.metadata?.id ?? "";
53
+ return (_jsx(IdpRow, { identityProvider: idp, isConfirming: confirmingId === id, onEdit: onEdit ? () => onEdit(idp) : undefined, onConfirmDelete: () => setConfirmingId(id), onCancelDelete: () => setConfirmingId(null), onDeleted: () => {
54
+ setConfirmingId(null);
55
+ refetch();
56
+ } }, id));
57
+ }) }));
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // IdpRow (internal)
61
+ // ---------------------------------------------------------------------------
62
+ function IdpRow({ identityProvider, isConfirming, onEdit, onConfirmDelete, onCancelDelete, onDeleted, }) {
63
+ const { deleteProvider, isDeleting, error } = useDeleteIdentityProvider();
64
+ const id = identityProvider.metadata?.id ?? "";
65
+ const name = identityProvider.spec?.displayName ||
66
+ identityProvider.metadata?.name ||
67
+ "Unnamed provider";
68
+ const slug = identityProvider.metadata?.slug;
69
+ const isSso = identityProvider.spec?.isSsoProvider;
70
+ const createdAt = identityProvider.status?.audit?.specAudit?.createdAt;
71
+ const handleDelete = useCallback(async () => {
72
+ try {
73
+ await deleteProvider({ resourceId: id });
74
+ onDeleted();
75
+ }
76
+ catch {
77
+ // error state is surfaced via the hook
78
+ }
79
+ }, [id, deleteProvider, onDeleted]);
80
+ if (isConfirming) {
81
+ return (_jsxs("div", { role: "listitem", className: "flex items-center justify-between rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "text-xs text-foreground", children: ["Delete ", _jsx("span", { className: "font-medium", children: name }), "?"] }), error && (_jsx("p", { className: "mt-0.5 text-[0.65rem] text-destructive", children: getUserMessage(error) }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleDelete, disabled: isDeleting, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium", "bg-destructive text-destructive-foreground hover:bg-destructive/90", "disabled:pointer-events-none disabled:opacity-50"), children: [isDeleting && _jsx(SpinnerIcon, {}), "Delete"] }), _jsx("button", { type: "button", onClick: onCancelDelete, disabled: isDeleting, className: cn("rounded-md px-2.5 py-1 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" })] })] }));
82
+ }
83
+ return (_jsxs("div", { role: "listitem", className: "flex items-center gap-3 rounded-lg border border-border/60 px-3 py-2.5 hover:border-border transition-colors", children: [_jsx(ShieldIcon, {}), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm font-medium text-foreground", children: name }), slug && (_jsx("span", { className: "block text-xs text-muted-foreground font-mono", children: slug }))] }), _jsxs("div", { className: "hidden sm:flex shrink-0 items-center gap-3 text-xs text-muted-foreground", children: [isSso && (_jsx("span", { className: "inline-flex items-center rounded-full border border-primary/30 bg-primary-subtle px-2 py-0.5 text-[0.65rem] font-medium text-primary", children: "SSO" })), createdAt && (_jsx("span", { title: `Created ${timestampDate(createdAt).toISOString()}`, children: formatShortDate(timestampDate(createdAt)) }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [onEdit && (_jsx("button", { type: "button", onClick: onEdit, "aria-label": `Edit ${name}`, className: cn("shrink-0 rounded p-1", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "transition-colors"), children: _jsx(PencilIcon, {}) })), _jsx("button", { type: "button", onClick: onConfirmDelete, "aria-label": `Delete ${name}`, className: cn("shrink-0 rounded p-1", "text-muted-foreground hover:text-destructive hover:bg-destructive/10", "transition-colors"), children: _jsx(TrashIcon, {}) })] })] }));
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Formatting helpers
87
+ // ---------------------------------------------------------------------------
88
+ function formatShortDate(date) {
89
+ return date.toLocaleDateString(undefined, {
90
+ month: "short",
91
+ day: "numeric",
92
+ year: "numeric",
93
+ });
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Icons
97
+ // ---------------------------------------------------------------------------
98
+ function ShieldIcon() {
99
+ return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", className: "shrink-0 text-muted-foreground", children: _jsx("path", { d: "M8 1.5L2 4v4c0 3.5 2.5 5.5 6 7 3.5-1.5 6-3.5 6-7V4L8 1.5z" }) }));
100
+ }
101
+ function PencilIcon() {
102
+ return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M11 2.5l2.5 2.5L5 13.5H2.5V11L11 2.5z" }) }));
103
+ }
104
+ function TrashIcon() {
105
+ return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M2.5 4h11M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4" }), _jsx("path", { d: "M12.5 4v9a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1V4" }), _jsx("line", { x1: "6.5", y1: "7", x2: "6.5", y2: "11" }), _jsx("line", { x1: "9.5", y1: "7", x2: "9.5", y2: "11" })] }));
106
+ }
107
+ function SpinnerIcon() {
108
+ return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
109
+ }
110
+ //# sourceMappingURL=IdentityProviderListPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProviderListPanel.js","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderListPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
2
+ /** Props for {@link IdentityProviderWizard}. */
3
+ export interface IdentityProviderWizardProps {
4
+ /** Organization slug — the IdP will be created in this org. */
5
+ readonly org: string;
6
+ /** Fired with the newly created identity provider on success. */
7
+ readonly onCreated?: (idp: IdentityProvider) => void;
8
+ /** Fired when the user cancels the wizard. */
9
+ readonly onCancel?: () => void;
10
+ /** Additional CSS class names for the root container. */
11
+ readonly className?: string;
12
+ }
13
+ /**
14
+ * Multi-step wizard for creating a new identity provider.
15
+ *
16
+ * Guides the user through three steps:
17
+ *
18
+ * 1. **Pick** — select a well-known provider preset or "Custom OIDC"
19
+ * 2. **Configure** — fill in provider-specific variables (e.g., Auth0
20
+ * tenant name) plus the IdP display name and expected audience
21
+ * 3. **Review** — verify auto-populated OIDC configuration, optionally
22
+ * enable SSO, and submit
23
+ *
24
+ * For known presets, URLs are constructed from deterministic templates
25
+ * (no network call). For "Custom OIDC", the wizard attempts OIDC
26
+ * Discovery and falls back to manual entry if the fetch fails.
27
+ *
28
+ * All visual properties flow through `--stgm-*` design tokens.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * <IdentityProviderWizard
33
+ * org="acme"
34
+ * onCreated={(idp) => { refetch(); setShowWizard(false); }}
35
+ * onCancel={() => setShowWizard(false)}
36
+ * />
37
+ * ```
38
+ */
39
+ export declare function IdentityProviderWizard({ org, onCreated, onCancel, className, }: IdentityProviderWizardProps): import("react/jsx-runtime").JSX.Element;
40
+ //# sourceMappingURL=IdentityProviderWizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProviderWizard.d.ts","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderWizard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAMlG,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,2BAA2B,2CAuK7B"}
@@ -0,0 +1,180 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useState, } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { getUserMessage } from "@stigmer/sdk";
6
+ import { ProviderPicker } from "./ProviderPicker";
7
+ import { useCreateIdentityProvider } from "./useCreateIdentityProvider";
8
+ import { useOidcDiscovery } from "./useOidcDiscovery";
9
+ /**
10
+ * Multi-step wizard for creating a new identity provider.
11
+ *
12
+ * Guides the user through three steps:
13
+ *
14
+ * 1. **Pick** — select a well-known provider preset or "Custom OIDC"
15
+ * 2. **Configure** — fill in provider-specific variables (e.g., Auth0
16
+ * tenant name) plus the IdP display name and expected audience
17
+ * 3. **Review** — verify auto-populated OIDC configuration, optionally
18
+ * enable SSO, and submit
19
+ *
20
+ * For known presets, URLs are constructed from deterministic templates
21
+ * (no network call). For "Custom OIDC", the wizard attempts OIDC
22
+ * Discovery and falls back to manual entry if the fetch fails.
23
+ *
24
+ * All visual properties flow through `--stgm-*` design tokens.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <IdentityProviderWizard
29
+ * org="acme"
30
+ * onCreated={(idp) => { refetch(); setShowWizard(false); }}
31
+ * onCancel={() => setShowWizard(false)}
32
+ * />
33
+ * ```
34
+ */
35
+ export function IdentityProviderWizard({ org, onCreated, onCancel, className, }) {
36
+ const { create, isCreating, error: createError, clearError } = useCreateIdentityProvider();
37
+ const { discover, isDiscovering, error: discoveryError } = useOidcDiscovery();
38
+ // Step state
39
+ const [step, setStep] = useState("pick");
40
+ const [preset, setPreset] = useState(null);
41
+ // Configure step
42
+ const [vars, setVars] = useState({});
43
+ const [name, setName] = useState("");
44
+ const [audience, setAudience] = useState("");
45
+ // Review step
46
+ const [jwksUri, setJwksUri] = useState("");
47
+ const [issuers, setIssuers] = useState("");
48
+ const [userinfoEndpoint, setUserinfoEndpoint] = useState("");
49
+ const [isSso, setIsSso] = useState(false);
50
+ const [oidcClientId, setOidcClientId] = useState("");
51
+ const [discoveryFailed, setDiscoveryFailed] = useState(false);
52
+ // -- Step transitions ------------------------------------------------
53
+ const handlePickProvider = useCallback((selected) => {
54
+ setPreset(selected);
55
+ setVars(Object.fromEntries(selected.variables.map((v) => [v.key, v.options?.[0]?.value ?? ""])));
56
+ setName("");
57
+ setAudience("");
58
+ setStep("configure");
59
+ }, []);
60
+ const handleBackToPick = useCallback(() => {
61
+ setStep("pick");
62
+ setPreset(null);
63
+ }, []);
64
+ const populateReview = useCallback((config) => {
65
+ setJwksUri(config?.jwksUri ?? "");
66
+ setIssuers(config?.allowedIssuers.join(", ") ?? "");
67
+ setUserinfoEndpoint(config?.userinfoEndpoint ?? "");
68
+ setIsSso(false);
69
+ setOidcClientId("");
70
+ setDiscoveryFailed(!config);
71
+ }, []);
72
+ const handleContinueToReview = useCallback(async () => {
73
+ if (!preset)
74
+ return;
75
+ if (preset.id === "custom") {
76
+ const result = await discover(vars.issuerUrl ?? "");
77
+ populateReview(result
78
+ ? { ...result, allowedIssuers: [result.issuer] }
79
+ : null);
80
+ }
81
+ else {
82
+ populateReview(preset.buildConfig(vars));
83
+ }
84
+ setStep("review");
85
+ }, [preset, vars, discover, populateReview]);
86
+ const handleBackToConfigure = useCallback(() => {
87
+ setStep("configure");
88
+ clearError();
89
+ }, [clearError]);
90
+ // -- Submit ----------------------------------------------------------
91
+ const handleSubmit = useCallback(async (e) => {
92
+ e.preventDefault();
93
+ clearError();
94
+ try {
95
+ const idp = await create({
96
+ name: name.trim(),
97
+ org,
98
+ displayName: name.trim(),
99
+ jwksUri: jwksUri.trim(),
100
+ allowedIssuers: issuers
101
+ .split(",")
102
+ .map((s) => s.trim())
103
+ .filter(Boolean),
104
+ expectedAudience: audience.trim(),
105
+ userinfoEndpoint: userinfoEndpoint.trim() || undefined,
106
+ ...(isSso && {
107
+ isSsoProvider: true,
108
+ oidcClientId: oidcClientId.trim(),
109
+ }),
110
+ });
111
+ onCreated?.(idp);
112
+ }
113
+ catch {
114
+ // error state is managed by useCreateIdentityProvider
115
+ }
116
+ }, [
117
+ name, org, jwksUri, issuers, audience, userinfoEndpoint,
118
+ isSso, oidcClientId, create, clearError, onCreated,
119
+ ]);
120
+ // -- Render ----------------------------------------------------------
121
+ return (_jsxs("div", { className: cn("space-y-4", className), children: [_jsx(StepIndicator, { current: step }), step === "pick" && (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-muted-foreground text-xs", children: "Choose your identity provider to get started. Known providers will have their OIDC configuration auto-populated." }), _jsx(ProviderPicker, { onSelect: handlePickProvider }), onCancel && (_jsx("div", { className: "pt-1", children: _jsx(CancelButton, { onClick: onCancel }) }))] })), step === "configure" && preset && (_jsx(ConfigureStep, { preset: preset, vars: vars, onVarChange: (key, value) => setVars((prev) => ({ ...prev, [key]: value })), name: name, onNameChange: setName, audience: audience, onAudienceChange: setAudience, isLoading: isDiscovering, discoveryError: discoveryError, onBack: handleBackToPick, onContinue: handleContinueToReview, onCancel: onCancel })), step === "review" && (_jsx(ReviewStep, { discoveryFailed: discoveryFailed, jwksUri: jwksUri, onJwksUriChange: setJwksUri, issuers: issuers, onIssuersChange: setIssuers, userinfoEndpoint: userinfoEndpoint, onUserinfoEndpointChange: setUserinfoEndpoint, isSso: isSso, onIsSsoChange: setIsSso, oidcClientId: oidcClientId, onOidcClientIdChange: setOidcClientId, isCreating: isCreating, createError: createError, onBack: handleBackToConfigure, onSubmit: handleSubmit, onCancel: onCancel }))] }));
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // Step indicator
125
+ // ---------------------------------------------------------------------------
126
+ const STEPS = [
127
+ { key: "pick", label: "Provider" },
128
+ { key: "configure", label: "Configure" },
129
+ { key: "review", label: "Review" },
130
+ ];
131
+ function StepIndicator({ current }) {
132
+ const currentIdx = STEPS.findIndex((s) => s.key === current);
133
+ return (_jsx("nav", { "aria-label": "Wizard progress", className: "flex items-center gap-1.5", children: STEPS.map((s, i) => {
134
+ const state = i < currentIdx ? "done" : i === currentIdx ? "active" : "upcoming";
135
+ return (_jsxs("span", { className: "flex items-center gap-1.5", children: [i > 0 && (_jsx("span", { className: cn("h-px w-4", state === "upcoming" ? "bg-border" : "bg-primary/40") })), _jsx("span", { className: cn("text-[0.65rem] font-medium", state === "active"
136
+ ? "text-primary"
137
+ : state === "done"
138
+ ? "text-muted-foreground"
139
+ : "text-muted-foreground/50"), children: s.label })] }, s.key));
140
+ }) }));
141
+ }
142
+ // ---------------------------------------------------------------------------
143
+ // Configure step (step 2)
144
+ // ---------------------------------------------------------------------------
145
+ function ConfigureStep({ preset, vars, onVarChange, name, onNameChange, audience, onAudienceChange, isLoading, discoveryError, onBack, onContinue, onCancel, }) {
146
+ const allVarsFilled = preset.variables.every((v) => (vars[v.key] ?? "").trim() !== "");
147
+ const canContinue = allVarsFilled &&
148
+ name.trim() !== "" &&
149
+ audience.trim() !== "" &&
150
+ !isLoading;
151
+ return (_jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-muted-foreground text-xs", children: preset.variables.length > 0
152
+ ? `Enter your ${preset.label} details to auto-populate the OIDC configuration.`
153
+ : `${preset.label} configuration is fully automatic — just provide a name and audience.` }), preset.variables.map((v) => (_jsx(FieldInput, { id: `stgm-idp-var-${v.key}`, label: v.label, value: vars[v.key] ?? "", onChange: (val) => onVarChange(v.key, val), placeholder: v.placeholder, hint: v.hint, disabled: isLoading, type: v.type, options: v.options }, v.key))), _jsx("hr", { className: "border-border/40" }), _jsx(FieldInput, { id: "stgm-idp-wiz-name", label: "Display name", value: name, onChange: onNameChange, placeholder: "e.g., Acme Corp SSO", hint: "Human-readable name shown in the UI", disabled: isLoading }), _jsx(FieldInput, { id: "stgm-idp-wiz-audience", label: "Expected audience", value: audience, onChange: onAudienceChange, placeholder: "stigmer-api", hint: "The aud claim value expected in JWTs from this provider", disabled: isLoading }), discoveryError && (_jsx("p", { className: "text-destructive text-[0.65rem]", role: "alert", children: getUserMessage(discoveryError) })), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsxs("button", { type: "button", onClick: onContinue, disabled: !canContinue, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-40"), children: [isLoading && _jsx(SpinnerIcon, {}), "Continue"] }), _jsx(TextButton, { onClick: onBack, disabled: isLoading, children: "Back" }), onCancel && (_jsx(CancelButton, { onClick: onCancel, disabled: isLoading }))] })] }));
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Review step (step 3)
157
+ // ---------------------------------------------------------------------------
158
+ function ReviewStep({ discoveryFailed, jwksUri, onJwksUriChange, issuers, onIssuersChange, userinfoEndpoint, onUserinfoEndpointChange, isSso, onIsSsoChange, oidcClientId, onOidcClientIdChange, isCreating, createError, onBack, onSubmit, onCancel, }) {
159
+ const canSubmit = jwksUri.trim() !== "" &&
160
+ issuers.trim() !== "" &&
161
+ (!isSso || oidcClientId.trim() !== "") &&
162
+ !isCreating;
163
+ return (_jsxs("form", { onSubmit: onSubmit, className: "space-y-3", children: [discoveryFailed && (_jsx("div", { className: "rounded-md border border-warning/30 bg-warning/5 px-3 py-2 text-xs text-warning-foreground", role: "alert", children: "Auto-discovery could not reach the provider. Enter the configuration manually below." })), _jsx("p", { className: "text-muted-foreground text-xs", children: "Review the OIDC configuration. All fields are editable." }), _jsx(FieldInput, { id: "stgm-idp-wiz-jwks", label: "JWKS URI", value: jwksUri, onChange: onJwksUriChange, placeholder: "https://example.com/.well-known/jwks.json", disabled: isCreating, required: true }), _jsx(FieldInput, { id: "stgm-idp-wiz-issuers", label: "Allowed issuers", value: issuers, onChange: onIssuersChange, placeholder: "https://issuer.example.com/", hint: "Comma-separated list of trusted JWT issuer values", disabled: isCreating, required: true }), _jsx(FieldInput, { id: "stgm-idp-wiz-userinfo", label: "Userinfo endpoint", value: userinfoEndpoint, onChange: onUserinfoEndpointChange, placeholder: "https://example.com/userinfo", hint: "Optional \u2014 used to fetch user profile data during token exchange", disabled: isCreating }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", role: "switch", "aria-checked": isSso, onClick: () => onIsSsoChange(!isSso), disabled: isCreating, className: cn("relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors", isSso ? "bg-primary" : "bg-muted", "disabled:pointer-events-none disabled:opacity-50"), children: _jsx("span", { className: cn("pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow-sm ring-0 transition-transform", isSso ? "translate-x-4" : "translate-x-0") }) }), _jsx("span", { className: "text-xs font-medium text-foreground", children: "SSO provider" })] }), isSso && (_jsx(FieldInput, { id: "stgm-idp-wiz-client-id", label: "OIDC client ID", value: oidcClientId, onChange: onOidcClientIdChange, placeholder: "public-client-id", hint: "Client ID for the PKCE-based Authorization Code flow", disabled: isCreating, required: true })), createError && (_jsx("p", { className: "text-destructive text-[0.65rem]", role: "alert", children: getUserMessage(createError) })), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsxs("button", { type: "submit", disabled: !canSubmit, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-40"), children: [isCreating && _jsx(SpinnerIcon, {}), "Create identity provider"] }), _jsx(TextButton, { onClick: onBack, disabled: isCreating, children: "Back" }), onCancel && (_jsx(CancelButton, { onClick: onCancel, disabled: isCreating }))] })] }));
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Shared primitives
167
+ // ---------------------------------------------------------------------------
168
+ function FieldInput({ id, label, value, onChange, placeholder, hint, disabled, required, type = "text", options, }) {
169
+ return (_jsxs("div", { className: "space-y-1", children: [_jsx("label", { htmlFor: id, className: "text-xs font-medium text-foreground", children: label }), type === "select" && options ? (_jsx("select", { id: id, value: value, onChange: (e) => onChange(e.target.value), disabled: disabled, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50"), children: options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value))) })) : (_jsx("input", { id: id, type: "text", value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, disabled: disabled, required: required, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50") })), hint && (_jsx("p", { className: "text-[0.65rem] text-muted-foreground", children: hint }))] }));
170
+ }
171
+ function TextButton({ onClick, disabled, children, }) {
172
+ return (_jsx("button", { type: "button", onClick: onClick, disabled: disabled, className: cn("rounded-md px-2.5 py-1.5 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: children }));
173
+ }
174
+ function CancelButton({ onClick, disabled, }) {
175
+ return (_jsx(TextButton, { onClick: onClick, disabled: disabled, children: "Cancel" }));
176
+ }
177
+ function SpinnerIcon() {
178
+ return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
179
+ }
180
+ //# sourceMappingURL=IdentityProviderWizard.js.map