@datalayer/core 1.1.60 → 1.2.10

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 (496) hide show
  1. package/README.md +41 -18
  2. package/lib/api/DatalayerApi.d.ts +42 -1
  3. package/lib/api/DatalayerApi.js +90 -3
  4. package/lib/api/constants.d.ts +19 -1
  5. package/lib/api/constants.js +19 -1
  6. package/lib/api/contents/attachments.d.ts +9 -0
  7. package/lib/api/contents/attachments.js +39 -0
  8. package/lib/api/contents/bridges.d.ts +22 -0
  9. package/lib/api/contents/bridges.js +79 -0
  10. package/lib/api/contents/capabilities.d.ts +11 -0
  11. package/lib/api/contents/capabilities.js +21 -0
  12. package/lib/api/contents/cloudStorage.d.ts +31 -0
  13. package/lib/api/contents/cloudStorage.js +89 -0
  14. package/lib/api/contents/dataservers.d.ts +37 -0
  15. package/lib/api/contents/dataservers.js +121 -0
  16. package/lib/api/contents/datasets.d.ts +63 -0
  17. package/lib/api/contents/datasets.js +82 -0
  18. package/lib/api/contents/datasources.d.ts +70 -0
  19. package/lib/api/contents/datasources.js +149 -0
  20. package/lib/api/contents/generated.d.ts +1070 -0
  21. package/lib/api/contents/index.d.ts +16 -0
  22. package/lib/api/contents/index.js +20 -0
  23. package/lib/api/contents/mcp.d.ts +46 -0
  24. package/lib/api/contents/mcp.js +157 -0
  25. package/lib/api/contents/objects.d.ts +31 -0
  26. package/lib/api/contents/objects.js +88 -0
  27. package/lib/api/contents/operations.d.ts +3 -0
  28. package/lib/api/contents/operations.js +19 -0
  29. package/lib/api/contents/runtimeMounts.d.ts +40 -0
  30. package/lib/api/contents/runtimeMounts.js +59 -0
  31. package/lib/api/contents/sandboxUid.d.ts +21 -0
  32. package/lib/api/contents/sandboxUid.js +27 -0
  33. package/lib/api/contents/sources.d.ts +19 -0
  34. package/lib/api/contents/sources.js +119 -0
  35. package/lib/api/contents/sync.d.ts +18 -0
  36. package/lib/api/contents/sync.js +69 -0
  37. package/lib/api/contents/transfers.d.ts +38 -0
  38. package/lib/api/contents/transfers.js +123 -0
  39. package/lib/api/evals/client.d.ts +402 -0
  40. package/lib/api/evals/client.js +359 -0
  41. package/lib/api/evals/index.d.ts +10 -0
  42. package/lib/api/evals/index.js +18 -0
  43. package/lib/api/evals/request.d.ts +43 -0
  44. package/lib/api/evals/request.js +67 -0
  45. package/lib/api/evals/status.d.ts +27 -0
  46. package/lib/api/evals/status.js +122 -0
  47. package/lib/api/evals/types.d.ts +1335 -0
  48. package/lib/api/evals/types.js +5 -0
  49. package/lib/api/iam/connectedAgents.d.ts +68 -0
  50. package/lib/api/iam/connectedAgents.js +87 -0
  51. package/lib/api/iam/identityProviders.d.ts +76 -0
  52. package/lib/api/iam/identityProviders.js +187 -0
  53. package/lib/api/iam/index.d.ts +3 -1
  54. package/lib/api/iam/index.js +3 -1
  55. package/lib/api/iam/mcpAlertRules.d.ts +51 -0
  56. package/lib/api/iam/mcpAlertRules.js +198 -0
  57. package/lib/api/iam/mcpAuditSettings.d.ts +46 -0
  58. package/lib/api/iam/mcpAuditSettings.js +120 -0
  59. package/lib/api/iam/mcpPolicy.d.ts +181 -0
  60. package/lib/api/iam/mcpPolicy.js +168 -0
  61. package/lib/api/iam/organizationTeams.d.ts +13 -0
  62. package/lib/api/iam/organizationTeams.js +43 -0
  63. package/lib/api/iam/profile.d.ts +17 -1
  64. package/lib/api/iam/profile.js +27 -0
  65. package/lib/api/iam/scimTokens.d.ts +79 -0
  66. package/lib/api/iam/scimTokens.js +141 -0
  67. package/lib/api/iam/secrets.js +9 -21
  68. package/lib/api/iam/serviceAgents.d.ts +68 -0
  69. package/lib/api/iam/serviceAgents.js +119 -0
  70. package/lib/api/iam/trials.d.ts +38 -0
  71. package/lib/api/iam/trials.js +66 -0
  72. package/lib/api/index.d.ts +8 -1
  73. package/lib/api/index.js +7 -1
  74. package/lib/api/mcp/activity.d.ts +37 -0
  75. package/lib/api/mcp/activity.js +26 -0
  76. package/lib/api/mcp/alerts.d.ts +25 -0
  77. package/lib/api/mcp/alerts.js +51 -0
  78. package/lib/api/mcp/audit.d.ts +29 -0
  79. package/lib/api/mcp/audit.js +55 -0
  80. package/lib/api/mcp/bindings.d.ts +18 -0
  81. package/lib/api/mcp/bindings.js +42 -0
  82. package/lib/api/mcp/forwarding.d.ts +25 -0
  83. package/lib/api/mcp/forwarding.js +46 -0
  84. package/lib/api/mcp/gateway.d.ts +16 -0
  85. package/lib/api/mcp/gateway.js +70 -0
  86. package/lib/api/mcp/generated.d.ts +22 -0
  87. package/lib/api/mcp/generated.js +213 -0
  88. package/lib/api/mcp/index.d.ts +17 -0
  89. package/lib/api/mcp/index.js +25 -0
  90. package/lib/api/mcp/observability.d.ts +141 -0
  91. package/lib/api/mcp/observability.js +267 -0
  92. package/lib/api/mcp/operations.d.ts +83 -0
  93. package/lib/api/mcp/operations.js +50 -0
  94. package/lib/api/mcp/organizations.d.ts +102 -0
  95. package/lib/api/mcp/organizations.js +46 -0
  96. package/lib/api/mcp/policy.d.ts +9 -0
  97. package/lib/api/mcp/policy.js +23 -0
  98. package/lib/api/mcp/tasks.d.ts +49 -0
  99. package/lib/api/mcp/tasks.js +147 -0
  100. package/lib/api/orchestration/client.d.ts +53 -0
  101. package/lib/api/orchestration/client.js +105 -0
  102. package/lib/api/orchestration/events.d.ts +88 -0
  103. package/lib/api/orchestration/events.js +245 -0
  104. package/lib/api/orchestration/generated.d.ts +693 -0
  105. package/lib/api/orchestration/generated.js +687 -0
  106. package/lib/api/orchestration/index.d.ts +30 -0
  107. package/lib/api/orchestration/index.js +34 -0
  108. package/lib/api/orchestration/lifecycle.d.ts +39 -0
  109. package/lib/api/orchestration/lifecycle.js +57 -0
  110. package/lib/api/orchestration/measures.d.ts +55 -0
  111. package/lib/api/orchestration/measures.js +99 -0
  112. package/lib/api/otel/dashboards.d.ts +56 -0
  113. package/lib/api/otel/dashboards.js +50 -0
  114. package/lib/api/otel/index.d.ts +1 -0
  115. package/lib/api/otel/index.js +1 -0
  116. package/lib/api/otel/metrics.d.ts +16 -0
  117. package/lib/api/otel/metrics.js +15 -0
  118. package/lib/api/scheduler/client.d.ts +32 -0
  119. package/lib/api/scheduler/client.js +42 -0
  120. package/lib/api/scheduler/index.d.ts +8 -0
  121. package/lib/api/scheduler/index.js +16 -0
  122. package/lib/api/scheduler/request.d.ts +28 -0
  123. package/lib/api/scheduler/request.js +50 -0
  124. package/lib/api/scheduler/types.d.ts +88 -0
  125. package/lib/api/scheduler/types.js +5 -0
  126. package/lib/api/spacer/comments.d.ts +97 -0
  127. package/lib/api/spacer/comments.js +45 -0
  128. package/lib/api/spacer/index.d.ts +9 -0
  129. package/lib/api/spacer/index.js +17 -0
  130. package/lib/api/spacer/notebooks.d.ts +33 -0
  131. package/lib/api/spacer/notebooks.js +39 -0
  132. package/lib/api/spacer/request.d.ts +25 -0
  133. package/lib/api/spacer/request.js +46 -0
  134. package/lib/api/spacer/spaces.d.ts +68 -0
  135. package/lib/api/spacer/spaces.js +45 -0
  136. package/lib/api/utils/validation.d.ts +4 -4
  137. package/lib/api/utils/validation.js +10 -7
  138. package/lib/client/auth/index.js +0 -5
  139. package/lib/client/auth/storage.js +0 -5
  140. package/lib/client/auth/strategies.js +0 -5
  141. package/lib/client/base.d.ts +6 -0
  142. package/lib/client/base.js +8 -0
  143. package/lib/client/constants.d.ts +1 -0
  144. package/lib/client/constants.js +1 -0
  145. package/lib/client/index.d.ts +0 -10
  146. package/lib/client/index.js +2 -2
  147. package/lib/client/mixins/ContentsMixin.d.ts +71 -0
  148. package/lib/client/mixins/ContentsMixin.js +157 -0
  149. package/lib/client/mixins/IAMMixin.d.ts +0 -31
  150. package/lib/client/mixins/IAMMixin.js +0 -58
  151. package/lib/components/animation/AnimatedText.d.ts +2 -44
  152. package/lib/components/animation/AnimatedText.js +6 -126
  153. package/lib/components/anonymous/AnonymousKeyExpired.d.ts +56 -0
  154. package/lib/components/anonymous/AnonymousKeyExpired.js +96 -0
  155. package/lib/components/anonymous/AnonymousKeyTimer.d.ts +63 -0
  156. package/lib/components/anonymous/AnonymousKeyTimer.js +140 -0
  157. package/lib/components/anonymous/index.d.ts +7 -0
  158. package/lib/components/anonymous/index.js +15 -0
  159. package/lib/components/auth/SigInAPIKey.d.ts +1 -0
  160. package/lib/components/auth/SigInAPIKey.js +0 -6
  161. package/lib/components/auth/SignIn.d.ts +1 -0
  162. package/lib/components/auth/SignIn.js +0 -4
  163. package/lib/components/auth/SignIn.stories.d.ts +2 -2
  164. package/lib/components/avatars/BoringAvatar.d.ts +1 -1
  165. package/lib/components/avatars/BoringAvatar.stories.d.ts +1 -1
  166. package/lib/components/avatars/DLAvatar.d.ts +1 -1
  167. package/lib/components/avatars/DLAvatar.js +0 -4
  168. package/lib/components/avatars/UserAvatar.d.ts +16 -1
  169. package/lib/components/avatars/UserAvatar.js +15 -13
  170. package/lib/components/avatars/UserProfileAvatar.d.ts +1 -1
  171. package/lib/components/banners/NoAutomationBanner.d.ts +1 -1
  172. package/lib/components/billing/BillingEntitySelect.d.ts +16 -0
  173. package/lib/components/billing/BillingEntitySelect.js +49 -27
  174. package/lib/components/billing/eligibility.d.ts +22 -0
  175. package/lib/components/billing/eligibility.js +27 -0
  176. package/lib/components/billing/index.d.ts +1 -0
  177. package/lib/components/billing/index.js +1 -4
  178. package/lib/components/buttons/DownloadCSVButton.d.ts +1 -1
  179. package/lib/components/buttons/DownloadJsonButton.d.ts +1 -1
  180. package/lib/components/buttons/LongActionButton.d.ts +1 -0
  181. package/lib/components/buttons/LongActionButton.js +0 -4
  182. package/lib/components/buttons/UploadButton.d.ts +1 -0
  183. package/lib/components/buttons/UploadButton.js +0 -4
  184. package/lib/components/checkout/StripeCheckout.d.ts +1 -1
  185. package/lib/components/collaboration/LiveEditorCollaborators.d.ts +36 -0
  186. package/lib/components/collaboration/LiveEditorCollaborators.js +88 -53
  187. package/lib/components/collaboration/index.js +0 -4
  188. package/lib/components/confetti/ConfettiSuccess.d.ts +1 -1
  189. package/lib/components/contents/ContentSourceCard.d.ts +8 -0
  190. package/lib/components/contents/ContentSourceCard.js +23 -0
  191. package/lib/components/contents/HomeFolderObjectsBrowser.d.ts +10 -0
  192. package/lib/components/contents/HomeFolderObjectsBrowser.js +148 -0
  193. package/lib/components/contents/index.d.ts +2 -0
  194. package/lib/components/contents/index.js +6 -0
  195. package/lib/components/context/OrganizationSelect.d.ts +1 -1
  196. package/lib/components/display/AvatarSkeleton.d.ts +1 -1
  197. package/lib/components/display/BusyDots.d.ts +1 -1
  198. package/lib/components/display/CenteredSpinner.d.ts +1 -1
  199. package/lib/components/display/CodePreview.d.ts +1 -1
  200. package/lib/components/display/DatalayerBox.d.ts +7 -3
  201. package/lib/components/display/DatalayerBox.js +7 -7
  202. package/lib/components/display/HorizontalCenter.d.ts +1 -1
  203. package/lib/components/display/JupyterDialog.d.ts +1 -0
  204. package/lib/components/display/JupyterDialog.js +1 -7
  205. package/lib/components/display/Markdown.d.ts +1 -0
  206. package/lib/components/display/NavLink.js +3 -2
  207. package/lib/components/display/NotebookSkeleton.d.ts +1 -1
  208. package/lib/components/display/Placeholder.d.ts +1 -1
  209. package/lib/components/display/ToTopBranded.d.ts +1 -1
  210. package/lib/components/echarts/EChartsReact.d.ts +1 -1
  211. package/lib/components/flashes/FlashClosable.d.ts +1 -0
  212. package/lib/components/flashes/FlashClosable.js +0 -4
  213. package/lib/components/flashes/FlashGuest.d.ts +1 -1
  214. package/lib/components/flashes/FlashSurveys.d.ts +1 -1
  215. package/lib/components/flashes/FlashUnauthorized.d.ts +1 -0
  216. package/lib/components/flashes/FlashUnauthorized.js +0 -6
  217. package/lib/components/flashes/surveys/Survey2025_1.d.ts +1 -1
  218. package/lib/components/iam/ExternalTokenSilentLogin.d.ts +1 -1
  219. package/lib/components/index.d.ts +2 -0
  220. package/lib/components/index.js +2 -0
  221. package/lib/components/labels/StatusLabels.d.ts +2 -9
  222. package/lib/components/labels/StatusLabels.js +2 -26
  223. package/lib/components/labels/VisibilityLabel.d.ts +1 -1
  224. package/lib/components/landings/StepBlock.d.ts +1 -1
  225. package/lib/components/mcp/ClientBadge.d.ts +41 -0
  226. package/lib/components/mcp/ClientBadge.js +33 -0
  227. package/lib/components/mcp/McpErrorBlankslate.d.ts +21 -0
  228. package/lib/components/mcp/McpErrorBlankslate.js +17 -0
  229. package/lib/components/mcp/ScopeList.d.ts +28 -0
  230. package/lib/components/mcp/ScopeList.js +14 -0
  231. package/lib/components/mcp/index.d.ts +10 -0
  232. package/lib/components/mcp/index.js +18 -0
  233. package/lib/components/navbar/NavigationVisbilityObserver.d.ts +2 -1
  234. package/lib/components/navbar/SubdomainNavBar.d.ts +10 -5
  235. package/lib/components/navbar/SubdomainNavBar.js +2 -1
  236. package/lib/components/notebooks/JupyterNotebook.d.ts +1 -1
  237. package/lib/components/notebooks/JupyterNotebookToolbar.d.ts +1 -1
  238. package/lib/components/principal/PrincipalAppearance.d.ts +22 -42
  239. package/lib/components/principal/PrincipalAppearance.js +232 -182
  240. package/lib/components/principal/PrincipalAvatar.d.ts +9 -1
  241. package/lib/components/principal/PrincipalAvatar.js +18 -10
  242. package/lib/components/principal/PrincipalBadge.d.ts +1 -1
  243. package/lib/components/principal/PrincipalBanner.d.ts +1 -1
  244. package/lib/components/principal/PrincipalDetailsOverlay.d.ts +38 -1
  245. package/lib/components/principal/PrincipalDetailsOverlay.js +64 -33
  246. package/lib/components/principal/PrincipalHoverCard.d.ts +31 -0
  247. package/lib/components/principal/PrincipalHoverCard.js +52 -0
  248. package/lib/components/principal/PrincipalSwitcherMenu.d.ts +1 -0
  249. package/lib/components/principal/PrincipalSwitcherMenu.js +5 -14
  250. package/lib/components/principal/index.d.ts +2 -1
  251. package/lib/components/principal/index.js +2 -1
  252. package/lib/components/progress/ConsumptionBar.d.ts +1 -0
  253. package/lib/components/progress/ConsumptionBar.js +0 -4
  254. package/lib/components/progress/ProgressRing.d.ts +1 -0
  255. package/lib/components/progress/SpinnerBar.d.ts +1 -1
  256. package/lib/components/progress/Timer.d.ts +1 -0
  257. package/lib/components/progress/Timer.js +0 -4
  258. package/lib/components/screencapture/Screencapture.js +46 -3
  259. package/lib/components/screencapture/ScreencaptureButton.d.ts +1 -1
  260. package/lib/components/sharing/ShareAccessComponent.d.ts +58 -3
  261. package/lib/components/sharing/ShareAccessComponent.js +143 -98
  262. package/lib/components/sharing/SharingEditor.d.ts +21 -0
  263. package/lib/components/sharing/SharingEditor.js +9 -28
  264. package/lib/components/sharing/index.d.ts +1 -0
  265. package/lib/components/sharing/index.js +1 -0
  266. package/lib/components/sharing/sandboxSharing.d.ts +26 -0
  267. package/lib/components/sharing/sandboxSharing.js +41 -0
  268. package/lib/components/spaces/SpaceDetailsOverlay.d.ts +39 -0
  269. package/lib/components/spaces/SpaceDetailsOverlay.js +80 -0
  270. package/lib/components/spaces/SpaceDisplay.d.ts +38 -0
  271. package/lib/components/spaces/SpaceDisplay.js +92 -0
  272. package/lib/components/spaces/index.d.ts +4 -0
  273. package/lib/components/spaces/index.js +7 -0
  274. package/lib/components/spaces/spaceDisplayModel.d.ts +93 -0
  275. package/lib/components/spaces/spaceDisplayModel.js +170 -0
  276. package/lib/components/sparklines/Sparklines.js +3 -4
  277. package/lib/components/sparklines/index.js +0 -4
  278. package/lib/components/storage/ContentsBrowser.d.ts +25 -1
  279. package/lib/components/storage/ContentsBrowser.js +145 -52
  280. package/lib/components/storage/ContentsBrowserMock.d.ts +3 -0
  281. package/lib/components/storage/ContentsBrowserMock.js +75 -0
  282. package/lib/components/storage/ContentsItems.d.ts +2 -1
  283. package/lib/components/storage/ContentsItems.js +0 -4
  284. package/lib/components/storage/ContentsTable.d.ts +50 -0
  285. package/lib/components/storage/ContentsTable.js +134 -0
  286. package/lib/components/storage/HomeFolderDrive.d.ts +71 -0
  287. package/lib/components/storage/HomeFolderDrive.js +248 -0
  288. package/lib/components/storage/index.d.ts +2 -0
  289. package/lib/components/storage/index.js +2 -0
  290. package/lib/components/students/StudentItemStatus.d.ts +1 -1
  291. package/lib/components/students/StudentResultCircle.d.ts +1 -1
  292. package/lib/components/subnav/SubNav.d.ts +5 -5
  293. package/lib/components/subnav/SubNav.js +11 -9
  294. package/lib/components/tables/DataTable.d.ts +1 -1
  295. package/lib/components/text-reveal/TextRevealAnimation.d.ts +2 -2
  296. package/lib/components/text-reveal/useTextRevealAnimationLines.d.ts +1 -1
  297. package/lib/components/time/LiveRelativeTime.d.ts +1 -0
  298. package/lib/components/time/LiveRelativeTime.js +0 -8
  299. package/lib/components/time/index.js +0 -4
  300. package/lib/components/timeline/Timeline.d.ts +1 -1
  301. package/lib/components/timeline/index.js +0 -4
  302. package/lib/components/users/PeerIndicator.d.ts +1 -0
  303. package/lib/components/users/PeerIndicator.js +0 -4
  304. package/lib/config/Configuration.d.ts +15 -17
  305. package/lib/config/Configuration.js +7 -0
  306. package/lib/hooks/cacheConverters.d.ts +0 -7
  307. package/lib/hooks/cacheConverters.js +0 -25
  308. package/lib/hooks/index.d.ts +3 -0
  309. package/lib/hooks/index.js +3 -0
  310. package/lib/hooks/layouts/LayoutBackdrop.d.ts +1 -1
  311. package/lib/hooks/layouts/LayoutScreencapture.d.ts +1 -1
  312. package/lib/hooks/useBackdrop.d.ts +1 -1
  313. package/lib/hooks/useBackdropJupyterLab.d.ts +3 -2
  314. package/lib/hooks/useBackdropJupyterLab.js +0 -4
  315. package/lib/hooks/useBillingEntityStore.js +3 -0
  316. package/lib/hooks/useCache.d.ts +478 -130
  317. package/lib/hooks/useCache.js +1580 -676
  318. package/lib/hooks/useContainsFocus.d.ts +1 -1
  319. package/lib/hooks/useContents.d.ts +334 -0
  320. package/lib/hooks/useContents.js +1033 -0
  321. package/lib/hooks/useFocusTrap.d.ts +4 -4
  322. package/lib/hooks/useFocusTrap.js +1 -1
  323. package/lib/hooks/useMcp.d.ts +315 -0
  324. package/lib/hooks/useMcp.js +891 -0
  325. package/lib/hooks/useMobile.js +0 -5
  326. package/lib/hooks/useNavigate.d.ts +41 -3
  327. package/lib/hooks/useNavigate.js +106 -52
  328. package/lib/hooks/usePrincipalCacheStore.js +3 -0
  329. package/lib/hooks/usePrincipalStore.js +3 -0
  330. package/lib/hooks/useProjectStore.d.ts +3 -3
  331. package/lib/hooks/useProjectStore.js +4 -4
  332. package/lib/hooks/useRef.d.ts +1 -1
  333. package/lib/hooks/useRef.js +3 -0
  334. package/lib/hooks/useScreencapture.d.ts +2 -1
  335. package/lib/hooks/useScreencapture.js +0 -4
  336. package/lib/hooks/useSpaceCacheStore.d.ts +50 -0
  337. package/lib/hooks/useSpaceCacheStore.js +85 -0
  338. package/lib/hooks/useToast.js +0 -4
  339. package/lib/hooks/useVisibilityObserver.d.ts +1 -1
  340. package/lib/index.d.ts +4 -1
  341. package/lib/index.js +3 -1
  342. package/lib/mocks/components/FlashMock.d.ts +1 -1
  343. package/lib/mocks/views/ActionMenuMock.d.ts +1 -1
  344. package/lib/mocks/views/ChartMock.d.ts +1 -1
  345. package/lib/mocks/views/DashboardMock.d.ts +1 -1
  346. package/lib/mocks/views/FormMock.d.ts +1 -1
  347. package/lib/mocks/views/TableMock.d.ts +1 -1
  348. package/lib/mocks/views/WipMock.d.ts +1 -1
  349. package/lib/models/Credits.d.ts +16 -0
  350. package/lib/models/Credits.js +22 -0
  351. package/lib/models/CreditsDTO.d.ts +6 -5
  352. package/lib/models/CreditsDTO.js +7 -5
  353. package/lib/models/McpAuditEvent.d.ts +52 -0
  354. package/lib/models/McpAuditEvent.js +5 -0
  355. package/lib/models/McpBinding.d.ts +57 -0
  356. package/lib/models/McpBinding.js +5 -0
  357. package/lib/models/McpPolicy.d.ts +77 -0
  358. package/lib/models/McpPolicy.js +5 -0
  359. package/lib/models/McpTask.d.ts +94 -0
  360. package/lib/models/McpTask.js +7 -0
  361. package/lib/models/Organization.d.ts +69 -0
  362. package/lib/models/Organization.js +96 -0
  363. package/lib/models/Secret.d.ts +1 -2
  364. package/lib/models/Secret.js +2 -18
  365. package/lib/models/StartedBy.d.ts +91 -0
  366. package/lib/models/StartedBy.js +117 -0
  367. package/lib/models/Team.d.ts +2 -0
  368. package/lib/models/Team.js +2 -0
  369. package/lib/models/User.d.ts +4 -0
  370. package/lib/models/User.js +3 -0
  371. package/lib/models/UserDTO.js +4 -2
  372. package/lib/models/UserSettings.d.ts +13 -0
  373. package/lib/models/UserSettings.js +9 -0
  374. package/lib/models/contents/__fixtures__/solr-codec.json +57 -0
  375. package/lib/models/contents/__fixtures__/v1-contracts.json +194 -0
  376. package/lib/models/contents/fieldCase.d.ts +8 -0
  377. package/lib/models/contents/fieldCase.js +37 -0
  378. package/lib/models/contents/index.d.ts +2 -0
  379. package/lib/models/contents/index.js +6 -0
  380. package/lib/models/contents/permissions.d.ts +16 -0
  381. package/lib/models/contents/permissions.js +34 -0
  382. package/lib/models/index.d.ts +5 -1
  383. package/lib/models/index.js +5 -1
  384. package/lib/navigation/components.js +2 -3
  385. package/lib/routes/publicPaths.js +4 -0
  386. package/lib/state/index.d.ts +1 -0
  387. package/lib/state/index.js +1 -0
  388. package/lib/state/sessionEnd.d.ts +55 -0
  389. package/lib/state/sessionEnd.js +162 -0
  390. package/lib/state/substates/CoreState.d.ts +15 -7
  391. package/lib/state/substates/CoreState.js +21 -17
  392. package/lib/state/substates/IAMState.d.ts +1 -1
  393. package/lib/state/substates/IAMState.js +12 -5
  394. package/lib/state/substates/LayoutState.js +12 -0
  395. package/lib/state/substates/ProfileState.d.ts +1 -0
  396. package/lib/state/substates/ProfileState.js +1 -4
  397. package/lib/state/substates/index.d.ts +0 -1
  398. package/lib/state/substates/index.js +0 -1
  399. package/lib/utils/Jwt.d.ts +26 -0
  400. package/lib/utils/Jwt.js +37 -0
  401. package/lib/utils/Lazy.d.ts +20 -0
  402. package/lib/utils/Lazy.js +32 -6
  403. package/lib/utils/Screencapture.js +3 -0
  404. package/lib/utils/WithSuspense.d.ts +11 -1
  405. package/lib/utils/WithSuspense.js +11 -1
  406. package/lib/views/api-keys/APIKeyEdit.d.ts +1 -1
  407. package/lib/views/api-keys/APIKeyNew.d.ts +1 -1
  408. package/lib/views/api-keys/APIKeys.d.ts +1 -1
  409. package/lib/views/api-keys/APIKeys.js +30 -4
  410. package/lib/views/api-keys/APIKeysStandalone.d.ts +5 -1
  411. package/lib/views/api-keys/APIKeysStandalone.js +2 -2
  412. package/lib/views/datasources/DatasourceDetail.d.ts +12 -5
  413. package/lib/views/datasources/DatasourceDetail.js +80 -110
  414. package/lib/views/datasources/DatasourceNew.d.ts +14 -8
  415. package/lib/views/datasources/DatasourceNew.js +129 -118
  416. package/lib/views/datasources/Datasources.d.ts +39 -7
  417. package/lib/views/datasources/Datasources.js +95 -40
  418. package/lib/views/datasources/DatasourcesMock.d.ts +3 -0
  419. package/lib/views/datasources/DatasourcesMock.js +57 -0
  420. package/lib/views/iam/SignInSimple.d.ts +12 -0
  421. package/lib/views/iam/SignInSimple.js +4 -4
  422. package/lib/views/index.d.ts +1 -0
  423. package/lib/views/index.js +1 -0
  424. package/lib/views/mcp/AdmittedClients.d.ts +44 -0
  425. package/lib/views/mcp/AdmittedClients.js +59 -0
  426. package/lib/views/mcp/AlertDestinations.d.ts +34 -0
  427. package/lib/views/mcp/AlertDestinations.js +75 -0
  428. package/lib/views/mcp/AlertRules.d.ts +32 -0
  429. package/lib/views/mcp/AlertRules.js +245 -0
  430. package/lib/views/mcp/ApprovalQueue.d.ts +66 -0
  431. package/lib/views/mcp/ApprovalQueue.js +95 -0
  432. package/lib/views/mcp/AuditLog.d.ts +42 -0
  433. package/lib/views/mcp/AuditLog.js +144 -0
  434. package/lib/views/mcp/ConnectedAgents.d.ts +34 -0
  435. package/lib/views/mcp/ConnectedAgents.js +135 -0
  436. package/lib/views/mcp/EnterpriseConsole.d.ts +74 -0
  437. package/lib/views/mcp/EnterpriseConsole.js +195 -0
  438. package/lib/views/mcp/IdentityProviders.d.ts +33 -0
  439. package/lib/views/mcp/IdentityProviders.js +299 -0
  440. package/lib/views/mcp/McpDashboard.d.ts +50 -0
  441. package/lib/views/mcp/McpDashboard.js +430 -0
  442. package/lib/views/mcp/McpHome.d.ts +92 -0
  443. package/lib/views/mcp/McpHome.js +153 -0
  444. package/lib/views/mcp/McpObservability.d.ts +79 -0
  445. package/lib/views/mcp/McpObservability.js +236 -0
  446. package/lib/views/mcp/NotebookRuns.d.ts +39 -0
  447. package/lib/views/mcp/NotebookRuns.js +44 -0
  448. package/lib/views/mcp/OrganizationPolicy.d.ts +45 -0
  449. package/lib/views/mcp/OrganizationPolicy.js +108 -0
  450. package/lib/views/mcp/OrganizationUsage.d.ts +69 -0
  451. package/lib/views/mcp/OrganizationUsage.js +113 -0
  452. package/lib/views/mcp/PersonalPolicy.d.ts +54 -0
  453. package/lib/views/mcp/PersonalPolicy.js +126 -0
  454. package/lib/views/mcp/Policies.d.ts +53 -0
  455. package/lib/views/mcp/Policies.js +210 -0
  456. package/lib/views/mcp/PolicyForm.d.ts +83 -0
  457. package/lib/views/mcp/PolicyForm.js +113 -0
  458. package/lib/views/mcp/PolicyHistory.d.ts +58 -0
  459. package/lib/views/mcp/PolicyHistory.js +75 -0
  460. package/lib/views/mcp/RunDetail.d.ts +87 -0
  461. package/lib/views/mcp/RunDetail.js +186 -0
  462. package/lib/views/mcp/ScimProvisioning.d.ts +54 -0
  463. package/lib/views/mcp/ScimProvisioning.js +173 -0
  464. package/lib/views/mcp/ServiceAgents.d.ts +46 -0
  465. package/lib/views/mcp/ServiceAgents.js +194 -0
  466. package/lib/views/mcp/TeamPolicies.d.ts +33 -0
  467. package/lib/views/mcp/TeamPolicies.js +159 -0
  468. package/lib/views/mcp/ToolAccess.d.ts +60 -0
  469. package/lib/views/mcp/ToolAccess.js +101 -0
  470. package/lib/views/mcp/TraceTimeline.d.ts +81 -0
  471. package/lib/views/mcp/TraceTimeline.js +132 -0
  472. package/lib/views/mcp/format.d.ts +25 -0
  473. package/lib/views/mcp/format.js +77 -0
  474. package/lib/views/mcp/index.d.ts +34 -0
  475. package/lib/views/mcp/index.js +42 -0
  476. package/lib/views/mcp/types.d.ts +66 -0
  477. package/lib/views/mcp/types.js +5 -0
  478. package/lib/views/otel/simpleAuthStore.js +3 -0
  479. package/lib/views/secrets/SecretEdit.d.ts +5 -1
  480. package/lib/views/secrets/SecretEdit.js +5 -4
  481. package/lib/views/secrets/SecretNew.d.ts +11 -1
  482. package/lib/views/secrets/SecretNew.js +7 -3
  483. package/lib/views/secrets/Secrets.d.ts +12 -1
  484. package/lib/views/secrets/Secrets.js +2 -2
  485. package/package.json +269 -260
  486. package/scripts/generate-contents-types.py +169 -0
  487. package/scripts/generate-mcp-types.py +233 -0
  488. package/scripts/generate-orchestration-types.py +920 -0
  489. package/lib/api/iam/datasources.d.ts +0 -86
  490. package/lib/api/iam/datasources.js +0 -185
  491. package/lib/components/toolbars/index.d.ts +0 -1
  492. package/lib/models/Datasource.d.ts +0 -181
  493. package/lib/models/Datasource.js +0 -154
  494. package/lib/state/substates/DatasourceState.d.ts +0 -11
  495. package/lib/state/substates/DatasourceState.js +0 -16
  496. /package/lib/{components/toolbars/index.js → api/contents/generated.js} +0 -0
@@ -0,0 +1,108 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from 'react';
3
+ import { Button, Flash, Heading, Spinner, Text } from '@primer/react';
4
+ import { Dialog } from '@primer/react/experimental';
5
+ import { Box } from '@datalayer/primer-addons';
6
+ import { McpErrorBlankslate } from '../../components/mcp/index.js';
7
+ import { useDeleteMcpPolicyLayer, useMcpPolicyLayer, useSetMcpPolicyLayer, } from '../../hooks/useMcp.js';
8
+ import { useToast } from '../../hooks/index.js';
9
+ import { McpPolicyConflict } from '../../api/iam/mcpPolicy.js';
10
+ import { AdmittedClients } from './AdmittedClients.js';
11
+ import { PolicyHistory } from './PolicyHistory.js';
12
+ import { EMPTY_POLICY_DRAFT, PolicyForm, draftOf, policyChanged, rulesFrom, } from './PolicyForm.js';
13
+ export const OrganizationPolicy = ({ errorState, orgUid, readOnly = false, showTitle = true, }) => {
14
+ const { enqueueToast } = useToast();
15
+ const layer = useMcpPolicyLayer('organization', orgUid);
16
+ const save = useSetMcpPolicyLayer('organization', orgUid);
17
+ const remove = useDeleteMcpPolicyLayer('organization', orgUid);
18
+ const [draft, setDraft] = useState(EMPTY_POLICY_DRAFT);
19
+ const [removing, setRemoving] = useState(false);
20
+ const [conflict, setConflict] = useState('');
21
+ const [refusal, setRefusal] = useState('');
22
+ /**
23
+ * The version that was read, sent back with the write.
24
+ *
25
+ * `undefined` when nobody has written this layer: inventing a version
26
+ * would make the first write of every policy a conflict.
27
+ */
28
+ const version = layer.data?.version;
29
+ const stored = useMemo(() => draftOf(layer.data), [layer.data]);
30
+ // The form follows what was read, including after a conflict has been
31
+ // resolved by re-reading: an editor still showing the losing draft is how
32
+ // somebody reapplies the change that was already refused.
33
+ useEffect(() => setDraft(stored), [stored]);
34
+ const changed = useMemo(() => policyChanged(draft, stored), [draft, stored]);
35
+ const set = (key, value) => setDraft(current => ({ ...current, [key]: value }));
36
+ const apply = () => {
37
+ const rules = rulesFrom(draft);
38
+ if (typeof rules === 'string') {
39
+ setRefusal(rules);
40
+ return;
41
+ }
42
+ setRefusal('');
43
+ setConflict('');
44
+ save.mutate({ rules, expectedVersion: version }, {
45
+ onSuccess: () => {
46
+ enqueueToast('Policy saved. It applies to the next call.', {
47
+ variant: 'success',
48
+ });
49
+ },
50
+ onError: error => {
51
+ if (error instanceof McpPolicyConflict) {
52
+ // Not a toast. A toast disappears, and this needs an action —
53
+ // the draft in front of them is the one that lost.
54
+ setConflict(error.message);
55
+ return;
56
+ }
57
+ enqueueToast(`Could not save: ${error.message}`, {
58
+ variant: 'error',
59
+ });
60
+ },
61
+ });
62
+ };
63
+ const confirmRemove = () => {
64
+ remove.mutate(undefined, {
65
+ onSuccess: () => {
66
+ setRemoving(false);
67
+ enqueueToast('Policy removed. This layer narrows nothing.', {
68
+ variant: 'success',
69
+ });
70
+ },
71
+ onError: error => {
72
+ setRemoving(false);
73
+ enqueueToast(`Could not remove: ${error.message}`, {
74
+ variant: 'error',
75
+ });
76
+ },
77
+ });
78
+ };
79
+ if (layer.isError) {
80
+ return (_jsx(McpErrorBlankslate, { state: errorState(layer.error, "The organization's MCP policy"), onRetry: () => layer.refetch() }));
81
+ }
82
+ if (layer.isPending && layer.data === undefined) {
83
+ return (_jsx(Box, { sx: { display: 'flex', justifyContent: 'center', py: 5 }, children: _jsx(Spinner, {}) }));
84
+ }
85
+ return (_jsxs(Box, { sx: { display: 'grid', gap: 3, minWidth: 0, maxWidth: '52rem' }, children: [showTitle && (_jsxs(Box, { children: [_jsx(Heading, { as: "h2", sx: { fontSize: 3, mb: 1 }, children: "Organization Policy" }), _jsx(Text, { as: "p", sx: { color: 'fg.muted', fontSize: 1, m: 0 }, children: "What this organization narrows for every agent acting in it. Each layer only narrows \u2014 a team, or a person, can be stricter than this and never looser." })] })), conflict && (_jsxs(Flash, { variant: "warning", children: [_jsx(Text, { sx: { fontSize: 1 }, children: conflict }), _jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { size: "small", onClick: () => {
86
+ setConflict('');
87
+ layer.refetch();
88
+ }, children: "Read it again" }) })] })), refusal && (_jsx(Flash, { variant: "danger", children: _jsx(Text, { sx: { fontSize: 1 }, children: refusal }) })), _jsx(PolicyForm, { draft: draft, onChange: set, disabled: readOnly, belowAllowedClients: _jsx(AdmittedClients, { scope: "organization", subjectUid: orgUid, edited: draft.allowedClients !== stored.allowedClients }) }), !readOnly && (_jsxs(Box, { sx: { display: 'flex', gap: 2, alignItems: 'center' }, children: [_jsx(Button, { variant: "primary", onClick: apply, disabled: !changed || save.isPending, children: "Save policy" }), changed && (_jsx(Button, { variant: "invisible", onClick: () => setDraft(stored), children: "Discard changes" })), layer.data && (_jsx(Box, { sx: { marginLeft: 'auto' }, children: _jsx(Button, { variant: "danger", onClick: () => setRemoving(true), children: "Remove policy" }) }))] })), _jsxs(Box, { sx: {
89
+ borderTop: '1px solid',
90
+ borderColor: 'border.muted',
91
+ pt: 3,
92
+ display: 'grid',
93
+ gap: 2,
94
+ }, children: [_jsx(Text, { as: "h3", sx: { fontSize: 1, fontWeight: 'semibold', m: 0 }, children: "History" }), _jsx(PolicyHistory, { orgUid: orgUid, subjectUid: orgUid })] }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.subtle' }, children: "Only these rules can be stored. A rule the gateway does not enforce is refused rather than kept, so this page cannot promise something that never happens." }), removing && (_jsx(Dialog, { title: "Remove this policy?", onClose: () => setRemoving(false), footerButtons: [
95
+ {
96
+ buttonType: 'default',
97
+ content: 'Keep it',
98
+ onClick: () => setRemoving(false),
99
+ },
100
+ {
101
+ buttonType: 'danger',
102
+ content: 'Remove',
103
+ onClick: confirmRemove,
104
+ disabled: remove.isPending,
105
+ },
106
+ ], children: _jsxs(Text, { sx: { fontSize: 1 }, children: ["This organization stops narrowing anything. Its agents fall back to the platform defaults and to whatever each team and person has set \u2014 which may be ", _jsx("strong", { children: "wider" }), " than what you have now. Nothing already done is undone."] }) }))] }));
107
+ };
108
+ export default OrganizationPolicy;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * What the organization used, against what it may — and which agent used it.
3
+ *
4
+ * The console had a role called `organization_usage_reviewer` and no page of
5
+ * usage: the reviewer was sent to the Overview, which counts runs and
6
+ * refusals and says nothing about a limit. A budget with no spend against it
7
+ * is a number somebody set once.
8
+ *
9
+ * The breakdown underneath is the half that decides anything. A quota bar at
10
+ * ninety percent tells an administrator to act; it does not say what to turn
11
+ * off. The rows name the agents, biggest spender first, because that is the
12
+ * order the question is asked in.
13
+ *
14
+ * **Unreadable is not zero.** A figure the gateway could not read is drawn
15
+ * as "not available" with the reason, never as a blank or a 0 — they look
16
+ * the same in a dashboard and mean opposite things. For the same reason the
17
+ * breakdown is hidden entirely when the total could not be read: the parts
18
+ * under an unreadable whole make every agent look cheap, and a reader
19
+ * concludes the budget is fine.
20
+ *
21
+ * Limits are **changed in IAM**, not here. The page says where.
22
+ *
23
+ * @module views/mcp/OrganizationUsage
24
+ */
25
+ import type { JSX } from 'react';
26
+ import type { McpAgentSpend, McpOrganizationUsage } from '../../api/mcp/organizations';
27
+ import { type McpErrorStateFn } from './types';
28
+ export interface OrganizationUsageProps {
29
+ /** The application's words for a failed request. */
30
+ errorState: McpErrorStateFn;
31
+ /** The organization whose use this is. */
32
+ orgUid: string;
33
+ /** One team of it, rather than all of them. */
34
+ teamUid?: string;
35
+ /** Drawn without its heading, when the page around it carries one. */
36
+ showTitle?: boolean;
37
+ }
38
+ export type SpendRow = McpAgentSpend & {
39
+ id: string;
40
+ };
41
+ /** Two decimals for credits, none for counts. */
42
+ export declare const amount: (value: number) => string;
43
+ /**
44
+ * How close to the limit, said in colour.
45
+ *
46
+ * Three bands rather than a gradient: a reader acts at "nearly there" and
47
+ * not at eighty-one percent, and a bar that reddens smoothly gives them no
48
+ * moment to act on.
49
+ */
50
+ export declare const quotaTone: (fraction: number) => "success" | "attention" | "danger";
51
+ /**
52
+ * What the breakdown should show: the rows, nothing, or a refusal to guess.
53
+ *
54
+ * `unreadable` is not `empty`. The gateway sends no rows in both cases —
55
+ * because nobody spent anything, or because it could not read the ledger —
56
+ * and drawing them the same way tells a reader "your agents were quiet"
57
+ * when the truth is "we cannot tell you". They act on that differently.
58
+ */
59
+ export declare const breakdownState: (usage: McpOrganizationUsage | undefined) => "unreadable" | "empty" | "rows";
60
+ /**
61
+ * The rows, keyed the way the gateway grouped them.
62
+ *
63
+ * The agent uid first: service agents reach Runtimes through the gateway and
64
+ * carry *its* client id, so keying on that would collapse an organization's
65
+ * pipelines into one row costing the sum of several.
66
+ */
67
+ export declare const spendRowsOf: (byAgent: McpAgentSpend[]) => SpendRow[];
68
+ export declare const OrganizationUsage: ({ errorState, orgUid, teamUid, showTitle, }: OrganizationUsageProps) => JSX.Element;
69
+ export default OrganizationUsage;
@@ -0,0 +1,113 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { Heading, Label, ProgressBar, Spinner, Text } from '@primer/react';
4
+ import { Blankslate, DataTable, Table } from '@primer/react/experimental';
5
+ import { Box } from '@datalayer/primer-addons';
6
+ import { GraphIcon } from '@primer/octicons-react';
7
+ import { ClientBadge, McpErrorBlankslate } from '../../components/mcp/index.js';
8
+ import { useOrgMcpUsage } from '../../hooks/useMcp.js';
9
+ /** The quotas, in the order they are read. */
10
+ const QUOTAS = [
11
+ {
12
+ key: 'creditsPerDay',
13
+ label: 'Credits today',
14
+ // Named so the reader knows the window without reading the number: a
15
+ // daily budget and a monthly one differ by thirty, and the mistake is
16
+ // silent.
17
+ hint: 'Against the daily budget',
18
+ },
19
+ {
20
+ key: 'concurrentSandboxes',
21
+ label: 'Sandboxes running',
22
+ hint: 'Against the concurrency limit',
23
+ },
24
+ {
25
+ key: 'callsPerMinute',
26
+ label: 'Calls per minute',
27
+ // The gateway reports this limit without a use, and says why: the
28
+ // windows are per subject, so an organization's "calls this minute" is
29
+ // a sum over subjects that changes while it is being read.
30
+ hint: 'The cap; refusals are where you meet it',
31
+ },
32
+ ];
33
+ /** Two decimals for credits, none for counts. */
34
+ export const amount = (value) => Number.isInteger(value) ? String(value) : value.toFixed(2);
35
+ /**
36
+ * How close to the limit, said in colour.
37
+ *
38
+ * Three bands rather than a gradient: a reader acts at "nearly there" and
39
+ * not at eighty-one percent, and a bar that reddens smoothly gives them no
40
+ * moment to act on.
41
+ */
42
+ export const quotaTone = (fraction) => fraction >= 0.9 ? 'danger' : fraction >= 0.75 ? 'attention' : 'success';
43
+ /**
44
+ * What the breakdown should show: the rows, nothing, or a refusal to guess.
45
+ *
46
+ * `unreadable` is not `empty`. The gateway sends no rows in both cases —
47
+ * because nobody spent anything, or because it could not read the ledger —
48
+ * and drawing them the same way tells a reader "your agents were quiet"
49
+ * when the truth is "we cannot tell you". They act on that differently.
50
+ */
51
+ export const breakdownState = (usage) => {
52
+ if (!usage || usage.quotas?.creditsPerDay?.unknown) {
53
+ return 'unreadable';
54
+ }
55
+ return (usage.byAgent ?? []).length > 0 ? 'rows' : 'empty';
56
+ };
57
+ /**
58
+ * The rows, keyed the way the gateway grouped them.
59
+ *
60
+ * The agent uid first: service agents reach Runtimes through the gateway and
61
+ * carry *its* client id, so keying on that would collapse an organization's
62
+ * pipelines into one row costing the sum of several.
63
+ */
64
+ export const spendRowsOf = (byAgent) => byAgent.map((entry, index) => ({
65
+ ...entry,
66
+ id: entry.agentUid || entry.clientId || String(index),
67
+ }));
68
+ const QuotaCard = ({ label, hint, quota, }) => {
69
+ const limit = quota?.limit;
70
+ const used = quota?.used;
71
+ const fraction = quota?.fraction;
72
+ return (_jsxs(Box, { sx: {
73
+ border: '1px solid',
74
+ borderColor: 'border.default',
75
+ borderRadius: 2,
76
+ p: 3,
77
+ flex: '1 1 220px',
78
+ minWidth: 0,
79
+ }, children: [_jsx(Text, { sx: { fontWeight: 'bold', fontSize: 1 }, children: label }), _jsx(Box, { sx: { mt: 2, display: 'flex', alignItems: 'baseline', gap: 2 }, children: quota?.unknown ? (_jsx(Text, { sx: { fontSize: 2, color: 'fg.muted' }, children: "Not available" })) : (_jsxs(_Fragment, { children: [_jsx(Text, { sx: { fontSize: 4, fontWeight: 'bold' }, children: typeof used === 'number' ? amount(used) : '—' }), _jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: typeof limit === 'number'
80
+ ? `of ${amount(limit)}`
81
+ : 'no limit set' })] })) }), typeof fraction === 'number' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(ProgressBar, { progress: Math.min(100, fraction * 100), barSize: "small", bg: `${quotaTone(fraction)}.emphasis`, "aria-label": `${label}: ${Math.round(fraction * 100)}% of the limit` }) })), _jsx(Text, { as: "p", sx: { mt: 2, mb: 0, fontSize: 0, color: 'fg.muted' }, children: quota?.unknown ? quota.unknown : hint })] }));
82
+ };
83
+ export const OrganizationUsage = ({ errorState, orgUid, teamUid, showTitle = true, }) => {
84
+ const usage = useOrgMcpUsage(orgUid, teamUid ? { team: teamUid } : {});
85
+ const rows = useMemo(() => spendRowsOf(usage.data?.byAgent ?? []), [usage.data]);
86
+ if (usage.isLoading) {
87
+ return (_jsx(Box, { sx: { display: 'flex', justifyContent: 'center', p: 6 }, children: _jsx(Spinner, {}) }));
88
+ }
89
+ if (usage.isError) {
90
+ return (_jsx(McpErrorBlankslate, { state: errorState(usage.error, 'The usage'), onRetry: () => void usage.refetch() }));
91
+ }
92
+ const quotas = usage.data?.quotas ?? {};
93
+ const breakdown = breakdownState(usage.data);
94
+ return (_jsxs(Box, { children: [showTitle && (_jsx(Heading, { as: "h2", sx: { fontSize: 3, mb: 1 }, children: "Usage" })), _jsx(Text, { as: "p", sx: { color: 'fg.muted', mt: 0, mb: 3 }, children: "What this organization's agents used over the last day, against what they may use. Limits are set in the organization's MCP policy, not here." }), _jsx(Box, { sx: { display: 'flex', flexWrap: 'wrap', gap: 3 }, children: QUOTAS.map(quota => (_jsx(QuotaCard, { label: quota.label, hint: quota.hint, quota: quotas[quota.key] }, quota.key))) }), _jsx(Heading, { as: "h3", sx: { fontSize: 2, mt: 4, mb: 2 }, children: "Credits by agent" }), breakdown === 'unreadable' ? (_jsxs(Blankslate, { border: true, children: [_jsx(Blankslate.Visual, { children: _jsx(GraphIcon, { size: "medium" }) }), _jsx(Blankslate.Heading, { children: "The day's spend could not be read" }), _jsx(Blankslate.Description, { children: _jsx(Text, { as: "p", sx: { textAlign: 'center' }, children: "A breakdown of a total nobody could read would make every agent look cheap. Try again in a moment." }) })] })) : breakdown === 'empty' ? (_jsxs(Blankslate, { border: true, children: [_jsx(Blankslate.Visual, { children: _jsx(GraphIcon, { size: "medium" }) }), _jsx(Blankslate.Heading, { children: "No agent spent credits today" }), _jsx(Blankslate.Description, { children: _jsx(Text, { as: "p", sx: { textAlign: 'center' }, children: "Work a person ran themselves is in the total above, and is not an agent's." }) })] })) : (_jsx(Table.Container, { children: _jsx(DataTable, { "aria-labelledby": "usage-by-agent", data: rows, columns: [
95
+ {
96
+ header: 'Agent',
97
+ field: 'clientId',
98
+ rowHeader: true,
99
+ renderCell: row => row.clientId ? (_jsx(ClientBadge, { clientId: row.clientId })) : (_jsx(Label, { variant: "secondary", children: row.agentUid })),
100
+ },
101
+ {
102
+ header: 'Credits',
103
+ field: 'credits',
104
+ renderCell: row => amount(row.credits),
105
+ },
106
+ {
107
+ header: 'Records',
108
+ field: 'records',
109
+ renderCell: row => String(row.records),
110
+ },
111
+ ] }) }))] }));
112
+ };
113
+ export default OrganizationUsage;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The rules a person sets for their own agents.
3
+ *
4
+ * The same six rules as an organization's layer, over the same
5
+ * `PolicyForm` — but they mean something narrower here, and the difference
6
+ * is the whole reason this page needs saying anything at all.
7
+ *
8
+ * **A personal layer only narrows.** Every layer intersects: the platform's
9
+ * defaults, then the organization's, then the team's, then this. Denying a
10
+ * tool here denies it. *Permitting* one an organization denies does nothing
11
+ * — the denial unions across layers and cannot be lifted from below. A cap
12
+ * of 60 under an organization's 30 leaves the effective cap at 30.
13
+ *
14
+ * So the page compares what is typed against the organizations the person
15
+ * belongs to and says, **beside the field while their hands are on it**,
16
+ * where a value will have no effect and why.
17
+ *
18
+ * It does not *refuse* those values, and that is deliberate. The same
19
+ * personal layer applies to personal-scope work, where no organization
20
+ * narrows anything — a rule that is wider than one employer's is still the
21
+ * rule that governs an agent acting for the person alone. Refusing it would
22
+ * make somebody's own policy unwritable because of a place they happen to
23
+ * work.
24
+ *
25
+ * @module views/mcp/PersonalPolicy
26
+ */
27
+ import type { JSX } from 'react';
28
+ import { type McpPolicyRules } from '../../api/iam/mcpPolicy';
29
+ import type { McpErrorStateFn } from './types';
30
+ /** One organization the person belongs to, and what it narrows. */
31
+ export interface NarrowingOrganization {
32
+ uid: string;
33
+ name: string;
34
+ rules: McpPolicyRules | null;
35
+ }
36
+ export interface PersonalPolicyProps {
37
+ errorState: McpErrorStateFn;
38
+ /** The person whose layer this is. */
39
+ userUid: string;
40
+ /**
41
+ * The organizations they belong to, with each one's layer.
42
+ *
43
+ * Empty is the ordinary case for somebody with no organization, and the
44
+ * page simply says nothing about narrowing.
45
+ */
46
+ organizations?: NarrowingOrganization[];
47
+ showTitle?: boolean;
48
+ }
49
+ /** A list rule already denied elsewhere, as a sentence naming who. */
50
+ export declare const deniedElsewhere: (typed: string, organizations: NarrowingOrganization[]) => string[];
51
+ /** A number rule already capped lower elsewhere. */
52
+ export declare const cappedLower: (typed: string, organizations: NarrowingOrganization[], rule: "maxCallsPerMinute" | "maxCreditsPerDay" | "maxConcurrentSandboxes") => string[];
53
+ export declare const PersonalPolicy: ({ errorState, userUid, organizations, showTitle, }: PersonalPolicyProps) => JSX.Element;
54
+ export default PersonalPolicy;
@@ -0,0 +1,126 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from 'react';
3
+ import { Button, Flash, Heading, Spinner, Text } from '@primer/react';
4
+ import { Box } from '@datalayer/primer-addons';
5
+ import { McpErrorBlankslate } from '../../components/mcp/index.js';
6
+ import { useDeleteMcpPolicyLayer, useMcpPolicyLayer, useSetMcpPolicyLayer, } from '../../hooks/useMcp.js';
7
+ import { useToast } from '../../hooks/index.js';
8
+ import { McpPolicyConflict, } from '../../api/iam/mcpPolicy.js';
9
+ import { AdmittedClients } from './AdmittedClients.js';
10
+ import { EMPTY_POLICY_DRAFT, PolicyForm, draftOf, policyChanged, rulesFrom, } from './PolicyForm.js';
11
+ /** A list rule already denied elsewhere, as a sentence naming who. */
12
+ export const deniedElsewhere = (typed, organizations) => {
13
+ const wanted = typed
14
+ .split('\n')
15
+ .map(entry => entry.trim())
16
+ .filter(Boolean);
17
+ const said = [];
18
+ for (const organization of organizations) {
19
+ const denied = (organization.rules?.toolDenylist ?? []).filter(tool => wanted.includes(tool));
20
+ if (denied.length > 0) {
21
+ said.push(`${organization.name} denies ${denied.join(', ')}`);
22
+ }
23
+ }
24
+ return said;
25
+ };
26
+ /** A number rule already capped lower elsewhere. */
27
+ export const cappedLower = (typed, organizations, rule) => {
28
+ const value = Number(typed.trim());
29
+ // The blank check is belt-and-braces rather than load-bearing: `Number('')`
30
+ // is 0, and no positive organization cap is below 0, so a blank field says
31
+ // nothing either way today. It is kept because that depends on the
32
+ // `theirs > 0` guard below, and a reader changing one should not have to
33
+ // notice it was holding up the other.
34
+ if (!typed.trim() || !Number.isFinite(value)) {
35
+ return [];
36
+ }
37
+ const said = [];
38
+ for (const organization of organizations) {
39
+ const theirs = organization.rules?.[rule];
40
+ if (typeof theirs === 'number' && theirs > 0 && theirs < value) {
41
+ said.push(`${organization.name} caps it at ${theirs}`);
42
+ }
43
+ }
44
+ return said;
45
+ };
46
+ export const PersonalPolicy = ({ errorState, userUid, organizations = [], showTitle = true, }) => {
47
+ const { enqueueToast } = useToast();
48
+ const layer = useMcpPolicyLayer('personal', userUid);
49
+ const save = useSetMcpPolicyLayer('personal', userUid);
50
+ const remove = useDeleteMcpPolicyLayer('personal', userUid);
51
+ const [draft, setDraft] = useState(EMPTY_POLICY_DRAFT);
52
+ const [conflict, setConflict] = useState('');
53
+ const [refusal, setRefusal] = useState('');
54
+ const stored = useMemo(() => draftOf(layer.data), [layer.data]);
55
+ useEffect(() => setDraft(stored), [stored]);
56
+ const changed = useMemo(() => policyChanged(draft, stored), [draft, stored]);
57
+ const set = (key, value) => setDraft(current => ({ ...current, [key]: value }));
58
+ /**
59
+ * What to say beside each field, and nothing where there is nothing to
60
+ * say. Recomputed as they type, because the point is to be read while
61
+ * the value is still being chosen.
62
+ */
63
+ const notes = useMemo(() => {
64
+ if (organizations.length === 0) {
65
+ return {};
66
+ }
67
+ const built = {};
68
+ const permitted = deniedElsewhere(draft.toolAllowlist, organizations);
69
+ if (permitted.length > 0) {
70
+ built.toolAllowlist = `Permitting a tool here does not lift a denial: ${permitted.join('; ')}. Your agents still cannot use those when acting for them.`;
71
+ }
72
+ for (const key of [
73
+ 'maxCallsPerMinute',
74
+ 'maxCreditsPerDay',
75
+ 'maxConcurrentSandboxes',
76
+ ]) {
77
+ const lower = cappedLower(draft[key], organizations, key);
78
+ if (lower.length > 0) {
79
+ built[key] =
80
+ `Wider than an organization you belong to allows — ${lower.join('; ')}. When you act for them, theirs applies; this still governs your own work.`;
81
+ }
82
+ }
83
+ return built;
84
+ }, [draft, organizations]);
85
+ const apply = () => {
86
+ const rules = rulesFrom(draft);
87
+ if (typeof rules === 'string') {
88
+ setRefusal(rules);
89
+ return;
90
+ }
91
+ setRefusal('');
92
+ setConflict('');
93
+ save.mutate({ rules, expectedVersion: layer.data?.version }, {
94
+ onSuccess: () => enqueueToast('Saved. It applies to your next call.', {
95
+ variant: 'success',
96
+ }),
97
+ onError: error => {
98
+ if (error instanceof McpPolicyConflict) {
99
+ setConflict(error.message);
100
+ return;
101
+ }
102
+ enqueueToast(`Could not save: ${error.message}`, {
103
+ variant: 'error',
104
+ });
105
+ },
106
+ });
107
+ };
108
+ if (layer.isError) {
109
+ return (_jsx(McpErrorBlankslate, { state: errorState(layer.error, 'Your MCP policy'), onRetry: () => layer.refetch() }));
110
+ }
111
+ if (layer.isPending && layer.data === undefined) {
112
+ return (_jsx(Box, { sx: { display: 'flex', justifyContent: 'center', py: 5 }, children: _jsx(Spinner, {}) }));
113
+ }
114
+ return (_jsxs(Box, { sx: { display: 'grid', gap: 3, minWidth: 0, maxWidth: '52rem' }, children: [showTitle && (_jsxs(Box, { children: [_jsx(Heading, { as: "h2", sx: { fontSize: 3, mb: 1 }, children: "Your MCP policy" }), _jsxs(Text, { as: "p", sx: { color: 'fg.muted', fontSize: 1, m: 0 }, children: ["Rules for your own agents. These can only make things", ' ', _jsx("strong", { children: "stricter" }), " \u2014 where you belong to an organization, its rules apply underneath and nothing here can loosen them."] })] })), conflict && (_jsxs(Flash, { variant: "warning", children: [_jsx(Text, { sx: { fontSize: 1 }, children: conflict }), _jsx(Box, { sx: { mt: 2 }, children: _jsx(Button, { size: "small", onClick: () => {
115
+ setConflict('');
116
+ layer.refetch();
117
+ }, children: "Read it again" }) })] })), refusal && (_jsx(Flash, { variant: "danger", children: _jsx(Text, { sx: { fontSize: 1 }, children: refusal }) })), _jsx(PolicyForm, { draft: draft, onChange: set, notes: notes, belowAllowedClients: _jsx(AdmittedClients, { scope: "personal", subjectUid: userUid, edited: draft.allowedClients !== stored.allowedClients }) }), _jsxs(Box, { sx: { display: 'flex', gap: 2, alignItems: 'center' }, children: [_jsx(Button, { variant: "primary", onClick: apply, disabled: !changed || save.isPending, children: "Save" }), changed && (_jsx(Button, { variant: "invisible", onClick: () => setDraft(stored), children: "Discard changes" })), layer.data && (_jsx(Box, { sx: { marginLeft: 'auto' }, children: _jsx(Button, { variant: "danger", disabled: remove.isPending, onClick: () => remove.mutate(undefined, {
118
+ onSuccess: () => enqueueToast('Removed. You narrow nothing of your own.', {
119
+ variant: 'success',
120
+ }),
121
+ onError: error => enqueueToast(`Could not remove: ${error.message}`, {
122
+ variant: 'error',
123
+ }),
124
+ }), children: "Remove my policy" }) }))] }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.subtle' }, children: "Removing yours does not widen anything your organization set. It only stops your own rules from narrowing further." })] }));
125
+ };
126
+ export default PersonalPolicy;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * What the Jupyter MCP Server lets a person's agents do — and who decided.
3
+ *
4
+ * Policy is layered and each layer only narrows: the platform's defaults,
5
+ * then the organization's rules for an organization-scope token, then the
6
+ * person's own. The gateway answers the **effective** policy for a token
7
+ * with, per rule, the layer that decided it, which is what turns "why was
8
+ * my agent refused" from a support question into a line on this page.
9
+ *
10
+ * Read-only, always: this table is the answer, not the form. The personal
11
+ * rules a person may narrow for themselves, and the forms for the
12
+ * organizations they own, are the two sections beneath it and arrive with
13
+ * the policy layers in milestone 3 — until then the gateway answers the
14
+ * platform defaults and the token's scopes, and every row says so.
15
+ *
16
+ * @module views/mcp/Policies
17
+ */
18
+ import type { JSX } from 'react';
19
+ import type { McpPolicyLayer } from '../../models/McpPolicy';
20
+ import { type McpErrorStateFn, type McpRoutes } from './types';
21
+ export interface PoliciesProps {
22
+ /** The application's words for a failed request. */
23
+ errorState: McpErrorStateFn;
24
+ /** Where this application puts the surfaces this view links to. */
25
+ routes: McpRoutes;
26
+ /** The organization whose name a row can carry, when the token has one. */
27
+ organizationName?: string;
28
+ showTitle?: boolean;
29
+ }
30
+ /**
31
+ * The agent a preview is taken as, or nothing for the reader's own token.
32
+ *
33
+ * Empty is the reader's own, which is the default and the honest one: the
34
+ * table answers "what applies to me" until somebody asks otherwise.
35
+ */
36
+ export type PolicyPreviewAgent = string;
37
+ /**
38
+ * The filter for a preview choice.
39
+ *
40
+ * A blank choice is *nobody*, not an agent whose client id is the empty
41
+ * string: sent as a filter that matches nothing, and a table that renders
42
+ * empty looks like a policy that grants nothing rather than a query that
43
+ * asked for no one.
44
+ */
45
+ export declare const policyFiltersOf: (previewAs: PolicyPreviewAgent) => {
46
+ agent: string | undefined;
47
+ };
48
+ /** How each layer is named on a row, in the reader's terms. */
49
+ export declare const layerLabel: (layer: McpPolicyLayer, organizationName?: string) => string;
50
+ /** A rule's value in the words of the page, whatever shape it arrived in. */
51
+ export declare const ruleValueLabel: (value: unknown) => string;
52
+ export declare const Policies: ({ errorState, routes, organizationName, showTitle, }: PoliciesProps) => JSX.Element;
53
+ export default Policies;