@datalayer/agent-runtimes 1.0.10 → 1.0.18

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 (452) hide show
  1. package/README.md +82 -1
  2. package/lib/{AgentLexical.d.ts → AgentDocument.d.ts} +5 -5
  3. package/lib/{AgentLexical.js → AgentDocument.js} +156 -26
  4. package/lib/AgentNode.js +32 -31
  5. package/lib/AgentNotebook.js +172 -17
  6. package/lib/AppExamples2.css +47 -0
  7. package/lib/AppExamples2.d.ts +3 -0
  8. package/lib/AppExamples2.js +21 -0
  9. package/lib/{agent-lexical-main.js → agent-document-main.js} +2 -2
  10. package/lib/agents/AgentRuntimeChat.d.ts +73 -0
  11. package/lib/agents/AgentRuntimeChat.js +198 -0
  12. package/lib/api/index.d.ts +12 -0
  13. package/lib/api/index.js +46 -0
  14. package/lib/api/runtimes/checkpoints.d.ts +122 -0
  15. package/lib/api/runtimes/checkpoints.js +118 -0
  16. package/lib/api/runtimes/environments.d.ts +9 -0
  17. package/lib/api/runtimes/environments.js +29 -0
  18. package/lib/api/runtimes/healthz.d.ts +15 -0
  19. package/lib/api/runtimes/healthz.js +44 -0
  20. package/lib/api/runtimes/index.d.ts +12 -0
  21. package/lib/api/runtimes/index.js +16 -0
  22. package/lib/api/runtimes/runtimes.d.ts +138 -0
  23. package/lib/api/runtimes/runtimes.js +230 -0
  24. package/lib/api/runtimes/snapshots.d.ts +38 -0
  25. package/lib/api/runtimes/snapshots.js +82 -0
  26. package/lib/api/scheduler/index.d.ts +6 -0
  27. package/lib/api/scheduler/index.js +10 -0
  28. package/lib/api/scheduler/schedules.d.ts +85 -0
  29. package/lib/api/scheduler/schedules.js +78 -0
  30. package/lib/api/spacer/documents.d.ts +12 -0
  31. package/lib/api/spacer/documents.js +43 -0
  32. package/lib/api/spacer/healthz.d.ts +15 -0
  33. package/lib/api/spacer/healthz.js +44 -0
  34. package/lib/api/spacer/index.d.ts +15 -0
  35. package/lib/api/spacer/index.js +19 -0
  36. package/lib/api/spacer/items.d.ts +25 -0
  37. package/lib/api/spacer/items.js +55 -0
  38. package/lib/api/spacer/lexicals.d.ts +34 -0
  39. package/lib/api/spacer/lexicals.js +89 -0
  40. package/lib/api/spacer/notebooks.d.ts +34 -0
  41. package/lib/api/spacer/notebooks.js +89 -0
  42. package/lib/api/spacer/spaces.d.ts +84 -0
  43. package/lib/api/spacer/spaces.js +170 -0
  44. package/lib/api/spacer/users.d.ts +9 -0
  45. package/lib/api/spacer/users.js +29 -0
  46. package/lib/chat/Chat.d.ts +1 -1
  47. package/lib/chat/Chat.js +54 -54
  48. package/lib/chat/ChatFloating.d.ts +2 -2
  49. package/lib/chat/ChatFloating.js +136 -25
  50. package/lib/chat/ChatSidebar.js +20 -22
  51. package/lib/chat/base/ChatBase.js +429 -39
  52. package/lib/chat/display/EmptyState.js +21 -21
  53. package/lib/chat/document/EphemeralDocument.d.ts +23 -0
  54. package/lib/chat/document/EphemeralDocument.js +270 -0
  55. package/lib/chat/header/ChatHeaderBase.d.ts +12 -2
  56. package/lib/chat/header/ChatHeaderBase.js +78 -23
  57. package/lib/chat/index.d.ts +1 -0
  58. package/lib/chat/index.js +2 -0
  59. package/lib/chat/notebook/EphemeralNotebook.d.ts +24 -0
  60. package/lib/chat/notebook/EphemeralNotebook.js +252 -0
  61. package/lib/chat/prompt/InputFooter.js +4 -1
  62. package/lib/client/AgentRuntimesClient.d.ts +127 -0
  63. package/lib/client/AgentRuntimesClient.js +36 -0
  64. package/lib/client/AgentsMixin.js +28 -28
  65. package/lib/client/SdkAgentRuntimesClient.d.ts +1 -1
  66. package/lib/client/SdkAgentRuntimesClient.js +1 -1
  67. package/lib/client/mixins/RuntimesMixin.d.ts +93 -0
  68. package/lib/client/mixins/RuntimesMixin.js +229 -0
  69. package/lib/client/mixins/SpacerMixin.d.ts +210 -0
  70. package/lib/client/mixins/SpacerMixin.js +615 -0
  71. package/lib/client/utils/spacerUtils.d.ts +18 -0
  72. package/lib/client/utils/spacerUtils.js +32 -0
  73. package/lib/collaboration/DatalayerCollaboration.d.ts +13 -0
  74. package/lib/collaboration/DatalayerCollaboration.js +28 -0
  75. package/lib/collaboration/DatalayerCollaborationProvider.d.ts +58 -0
  76. package/lib/collaboration/DatalayerCollaborationProvider.js +148 -0
  77. package/lib/collaboration/index.d.ts +2 -0
  78. package/lib/collaboration/index.js +6 -0
  79. package/lib/components/AgentSummary.d.ts +19 -0
  80. package/lib/components/AgentSummary.js +89 -0
  81. package/lib/components/a2ui/A2uiSurfaceComposed.d.ts +13 -0
  82. package/lib/components/a2ui/A2uiSurfaceComposed.js +110 -0
  83. package/lib/components/a2ui/index.d.ts +2 -0
  84. package/lib/components/a2ui/index.js +6 -0
  85. package/lib/components/a2ui/styles.d.ts +14 -0
  86. package/lib/components/a2ui/styles.js +142 -0
  87. package/lib/components/context/SpaceSelect.d.ts +2 -0
  88. package/lib/components/context/SpaceSelect.js +42 -0
  89. package/lib/components/flashes/FlashDisclaimer.d.ts +2 -0
  90. package/lib/components/flashes/FlashDisclaimer.js +17 -0
  91. package/lib/components/icons/ArtifactIcon.d.ts +10 -0
  92. package/lib/components/icons/ArtifactIcon.js +58 -0
  93. package/lib/components/icons/index.d.ts +1 -0
  94. package/lib/components/icons/index.js +5 -0
  95. package/lib/components/index.d.ts +5 -0
  96. package/lib/components/index.js +5 -0
  97. package/lib/components/nbgrader/NbGradesDetails.d.ts +5 -0
  98. package/lib/components/nbgrader/NbGradesDetails.js +19 -0
  99. package/lib/components/nbgrader/index.d.ts +1 -0
  100. package/lib/components/nbgrader/index.js +5 -0
  101. package/lib/components/progress/CreditsIndicator.d.ts +33 -0
  102. package/lib/components/progress/CreditsIndicator.js +23 -0
  103. package/lib/components/progress/index.d.ts +2 -0
  104. package/lib/components/progress/index.js +6 -0
  105. package/lib/components/runtimes/RuntimeCellVariables.d.ts +39 -0
  106. package/lib/components/runtimes/RuntimeCellVariables.js +172 -0
  107. package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +37 -0
  108. package/lib/components/runtimes/RuntimeCellVariablesDialog.js +101 -0
  109. package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +57 -0
  110. package/lib/components/runtimes/RuntimeLauncherDialog.js +275 -0
  111. package/lib/components/runtimes/RuntimePickerBase.d.ts +69 -0
  112. package/lib/components/runtimes/RuntimePickerBase.js +122 -0
  113. package/lib/components/runtimes/RuntimePickerCell.d.ts +34 -0
  114. package/lib/components/runtimes/RuntimePickerCell.js +104 -0
  115. package/lib/components/runtimes/RuntimePickerNotebook.d.ts +42 -0
  116. package/lib/components/runtimes/RuntimePickerNotebook.js +232 -0
  117. package/lib/components/runtimes/RuntimeReservationControl.d.ts +47 -0
  118. package/lib/components/runtimes/RuntimeReservationControl.js +42 -0
  119. package/lib/components/runtimes/RuntimeSimplePicker.d.ts +38 -0
  120. package/lib/components/runtimes/RuntimeSimplePicker.js +155 -0
  121. package/lib/components/runtimes/RuntimeTransfer.d.ts +16 -0
  122. package/lib/components/runtimes/RuntimeTransfer.js +5 -0
  123. package/lib/components/runtimes/RuntimeUtils.d.ts +17 -0
  124. package/lib/components/runtimes/RuntimeUtils.js +178 -0
  125. package/lib/components/runtimes/RuntimeVariables.d.ts +38 -0
  126. package/lib/components/runtimes/RuntimeVariables.js +75 -0
  127. package/lib/components/runtimes/index.d.ts +11 -0
  128. package/lib/components/runtimes/index.js +15 -0
  129. package/lib/components/scheduler/ScheduleMenu.d.ts +54 -0
  130. package/lib/components/scheduler/ScheduleMenu.js +154 -0
  131. package/lib/components/scheduler/index.d.ts +1 -0
  132. package/lib/components/scheduler/index.js +5 -0
  133. package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +33 -0
  134. package/lib/components/snapshots/SandboxSnapshotMenu.js +169 -0
  135. package/lib/components/snapshots/index.d.ts +1 -0
  136. package/lib/components/snapshots/index.js +5 -0
  137. package/lib/components/snippets/SnippetDialog.d.ts +42 -0
  138. package/lib/components/snippets/SnippetDialog.js +42 -0
  139. package/lib/components/students/StudentItemStatus.d.ts +7 -0
  140. package/lib/components/students/StudentItemStatus.js +68 -0
  141. package/lib/components/students/index.d.ts +1 -0
  142. package/lib/components/students/index.js +5 -0
  143. package/lib/components/tokens/SpaceVariantToken.d.ts +5 -0
  144. package/lib/components/tokens/SpaceVariantToken.js +23 -0
  145. package/lib/components/tokens/index.d.ts +1 -0
  146. package/lib/components/tokens/index.js +5 -0
  147. package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +4 -0
  148. package/lib/components/toolbars/AssignmentEditorToolbar.js +18 -0
  149. package/lib/components/toolbars/DocumentEditorToolbar.d.ts +2 -0
  150. package/lib/components/toolbars/DocumentEditorToolbar.js +12 -0
  151. package/lib/components/toolbars/NotebookEditorToolbar.d.ts +29 -0
  152. package/lib/components/toolbars/NotebookEditorToolbar.js +30 -0
  153. package/lib/context/ContextInspector.d.ts +1 -14
  154. package/lib/context/ContextInspector.js +3 -73
  155. package/lib/context/CostUsageChart.d.ts +4 -3
  156. package/lib/context/CostUsageChart.js +236 -35
  157. package/lib/context/MessageHistory.d.ts +30 -0
  158. package/lib/context/MessageHistory.js +129 -0
  159. package/lib/context/TokenUsageChart.d.ts +4 -3
  160. package/lib/context/TokenUsageChart.js +180 -30
  161. package/lib/context/TurnGraphChart.d.ts +1 -1
  162. package/lib/context/TurnGraphChart.js +6 -6
  163. package/lib/examples/A2UiAgentExample.d.ts +22 -0
  164. package/lib/examples/A2UiAgentExample.js +442 -0
  165. package/lib/examples/A2UiComponentsGalleryExample.d.ts +3 -0
  166. package/lib/examples/A2UiComponentsGalleryExample.js +863 -0
  167. package/lib/examples/A2UiContactCardExample.js +9 -5
  168. package/lib/examples/A2UiRestaurantExample.js +23 -8
  169. package/lib/examples/A2UiViewerExample.js +75 -3
  170. package/lib/examples/AgUiAgenticExample.d.ts +1 -12
  171. package/lib/examples/AgUiAgenticExample.js +52 -8
  172. package/lib/examples/AgUiBackendToolRenderingExample.d.ts +1 -16
  173. package/lib/examples/AgUiBackendToolRenderingExample.js +32 -17
  174. package/lib/examples/AgUiHaikuGenUiExample.d.ts +1 -17
  175. package/lib/examples/AgUiHaikuGenUiExample.js +49 -33
  176. package/lib/examples/AgUiHumanInTheLoopExample.d.ts +1 -12
  177. package/lib/examples/AgUiHumanInTheLoopExample.js +21 -6
  178. package/lib/examples/AgUiSharedStateExample.d.ts +1 -14
  179. package/lib/examples/AgUiSharedStateExample.js +21 -6
  180. package/lib/examples/AgUiToolsBasedGenUiExample.d.ts +1 -14
  181. package/lib/examples/AgUiToolsBasedGenUiExample.js +21 -6
  182. package/lib/examples/AgentCheckpointsExample.d.ts +1 -1
  183. package/lib/examples/AgentCheckpointsExample.js +9 -10
  184. package/lib/examples/AgentCodeSandboxesExample.d.ts +3 -0
  185. package/lib/examples/AgentCodeSandboxesExample.js +192 -0
  186. package/lib/examples/AgentCodemodeExample.js +3 -3
  187. package/lib/examples/AgentEvalsExample.js +5 -5
  188. package/lib/examples/AgentGuardrailsExample.js +17 -12
  189. package/lib/examples/AgentHooksExample.js +14 -55
  190. package/lib/examples/AgentInferenceProviderExample.js +4 -4
  191. package/lib/examples/AgentLoopExample.d.ts +10 -0
  192. package/lib/examples/AgentLoopExample.js +304 -0
  193. package/lib/examples/AgentMCPExample.js +7 -7
  194. package/lib/examples/AgentMemoryExample.js +4 -4
  195. package/lib/examples/AgentMonitoringExample.js +114 -44
  196. package/lib/examples/AgentNotificationsExample.js +4 -4
  197. package/lib/examples/AgentOtelExample.d.ts +3 -3
  198. package/lib/examples/AgentOtelExample.js +15 -10
  199. package/lib/examples/AgentOutputsExample.js +6 -6
  200. package/lib/examples/AgentParametersExample.js +21 -33
  201. package/lib/examples/AgentSandboxExample.js +5 -5
  202. package/lib/examples/AgentSkillsExample.js +7 -7
  203. package/lib/examples/AgentSubagentsExample.js +4 -4
  204. package/lib/examples/AgentToolApprovalsExample.js +5 -5
  205. package/lib/examples/AgentTriggersExample.js +9 -9
  206. package/lib/examples/AgentspecsExample.js +63 -41
  207. package/lib/examples/ChatCustomExample.js +23 -77
  208. package/lib/examples/ChatExample.js +13 -44
  209. package/lib/examples/LexicalAgentExample.js +43 -91
  210. package/lib/examples/LexicalAgentSidebarExample.js +45 -73
  211. package/lib/examples/NotebookAgentExample.js +52 -81
  212. package/lib/examples/NotebookAgentSidebarExample.js +43 -71
  213. package/lib/examples/NotebookCollaborationExample.js +11 -9
  214. package/lib/examples/NotebookExample.js +5 -2
  215. package/lib/examples/components/AuthRequiredView.js +1 -1
  216. package/lib/examples/components/ExampleErrorBoundary.d.ts +46 -0
  217. package/lib/examples/components/ExampleErrorBoundary.js +67 -0
  218. package/lib/examples/components/haiku/haiku-card.css +11 -0
  219. package/lib/examples/components/weather/weather-card.css +11 -0
  220. package/lib/examples/example-selector.js +4 -1
  221. package/lib/examples/hooks/useExampleAgentRuntime.d.ts +35 -0
  222. package/lib/examples/hooks/useExampleAgentRuntime.js +82 -0
  223. package/lib/examples/hooks/useSpecRenderToolResult.d.ts +30 -0
  224. package/lib/examples/hooks/useSpecRenderToolResult.js +61 -0
  225. package/lib/examples/index.d.ts +4 -1
  226. package/lib/examples/index.js +4 -1
  227. package/lib/examples/main.js +340 -93
  228. package/lib/examples/utils/a2ui.d.ts +2 -0
  229. package/lib/examples/utils/a2ui.js +97 -2
  230. package/lib/examples/utils/agentSummaryStore.d.ts +21 -0
  231. package/lib/examples/utils/agentSummaryStore.js +23 -0
  232. package/lib/examples/utils/notebooks/Empty.ipynb.json +30 -30
  233. package/lib/examples/utils/runtimeTargetStore.d.ts +9 -0
  234. package/lib/examples/utils/runtimeTargetStore.js +27 -0
  235. package/lib/examples/utils/teardownAgents.d.ts +13 -0
  236. package/lib/examples/utils/teardownAgents.js +78 -0
  237. package/lib/examples/utils/useExampleAgentRuntimesUrl.d.ts +2 -0
  238. package/lib/examples/utils/useExampleAgentRuntimesUrl.js +26 -7
  239. package/lib/examples2/CellExample.d.ts +6 -0
  240. package/lib/examples2/CellExample.js +20 -0
  241. package/lib/examples2/DatalayerNotebookExample.d.ts +16 -0
  242. package/lib/examples2/DatalayerNotebookExample.js +109 -0
  243. package/lib/examples2/NativeNavigationExample.d.ts +8 -0
  244. package/lib/examples2/NativeNavigationExample.js +97 -0
  245. package/lib/examples2/NotebookExample.d.ts +6 -0
  246. package/lib/examples2/NotebookExample.js +19 -0
  247. package/lib/examples2/NotebookMutationsKernel.d.ts +2 -0
  248. package/lib/examples2/NotebookMutationsKernel.js +105 -0
  249. package/lib/examples2/NotebookMutationsServiceManager.d.ts +2 -0
  250. package/lib/examples2/NotebookMutationsServiceManager.js +109 -0
  251. package/lib/examples2/ReactRouterExample.d.ts +6 -0
  252. package/lib/examples2/ReactRouterExample.js +175 -0
  253. package/lib/examples2/example-selector.d.ts +22 -0
  254. package/lib/examples2/example-selector.js +45 -0
  255. package/lib/examples2/index.d.ts +2 -0
  256. package/lib/examples2/index.js +6 -0
  257. package/lib/examples2/lexical-theme.css +436 -0
  258. package/lib/examples2/main.d.ts +2 -0
  259. package/lib/examples2/main.js +330 -0
  260. package/lib/examples2/notebooks/IPyWidgetsExample.ipynb.json +101 -0
  261. package/lib/examples2/notebooks/IPyWidgetsExampleWithState.ipynb.json +112 -0
  262. package/lib/examples2/notebooks/Lite.ipynb.json +128 -0
  263. package/lib/examples2/notebooks/Matplotlib.ipynb.json +137 -0
  264. package/lib/examples2/notebooks/NotebookExample1.ipynb.json +126 -0
  265. package/lib/examples2/notebooks/NotebookExample2.ipynb.json +48 -0
  266. package/lib/examples2/notebooks/NotebookOutputs.ipynb.json +49 -0
  267. package/lib/examples2/notebooks/NotebookToCExample.ipynb.json +102 -0
  268. package/lib/examples2/notebooks/OutputIPyWidgetsExample.d.ts +145 -0
  269. package/lib/examples2/notebooks/OutputIPyWidgetsExample.js +153 -0
  270. package/lib/examples2/notebooks/PyGWalker.ipynb.json +55 -0
  271. package/lib/hooks/index.d.ts +9 -1
  272. package/lib/hooks/index.js +13 -1
  273. package/lib/hooks/useAIAgentsWebSocket.d.ts +1 -1
  274. package/lib/hooks/useAIAgentsWebSocket.js +39 -3
  275. package/lib/hooks/useAgentRuntimes.d.ts +15 -3
  276. package/lib/hooks/useAgentRuntimes.js +186 -27
  277. package/lib/hooks/useAgentsService.js +5 -5
  278. package/lib/hooks/useCellOutputshot.d.ts +4 -0
  279. package/lib/hooks/useCellOutputshot.js +25 -0
  280. package/lib/hooks/useCheckpoints.d.ts +8 -8
  281. package/lib/hooks/useCheckpoints.js +36 -26
  282. package/lib/hooks/useConfig.d.ts +1 -1
  283. package/lib/hooks/useMonitoring.d.ts +7 -5
  284. package/lib/hooks/useMonitoring.js +16 -10
  285. package/lib/hooks/useNotifications.d.ts +11 -11
  286. package/lib/hooks/useNotifications.js +1 -1
  287. package/lib/hooks/useProgressStore.d.ts +25 -0
  288. package/lib/hooks/useProgressStore.js +58 -0
  289. package/lib/hooks/useProgressTask.d.ts +9 -0
  290. package/lib/hooks/useProgressTask.js +41 -0
  291. package/lib/hooks/useProjects.d.ts +628 -0
  292. package/lib/hooks/useProjects.js +190 -0
  293. package/lib/hooks/useRuntimes.d.ts +5 -0
  294. package/lib/hooks/useRuntimes.js +34 -0
  295. package/lib/hooks/useToolApprovals.d.ts +6 -6
  296. package/lib/index.d.ts +1 -0
  297. package/lib/index.js +1 -0
  298. package/lib/jupyter/exec/Python.d.ts +5 -0
  299. package/lib/jupyter/exec/Python.js +100 -0
  300. package/lib/jupyter/exec/Snippets.d.ts +105 -0
  301. package/lib/jupyter/exec/Snippets.js +101 -0
  302. package/lib/jupyter/exec/index.d.ts +2 -0
  303. package/lib/jupyter/exec/index.js +6 -0
  304. package/lib/jupyter/index.d.ts +2 -0
  305. package/lib/jupyter/index.js +6 -0
  306. package/lib/jupyter/kernelsHandler.d.ts +8 -0
  307. package/lib/jupyter/kernelsHandler.js +39 -0
  308. package/lib/mocks/models/CourseMock.d.ts +6 -0
  309. package/lib/mocks/models/CourseMock.js +29 -0
  310. package/lib/mocks/models/SpaceMock.d.ts +6 -0
  311. package/lib/mocks/models/SpaceMock.js +25 -0
  312. package/lib/models/Assignment.d.ts +7 -0
  313. package/lib/models/Assignment.js +5 -0
  314. package/lib/models/Cell.d.ts +8 -0
  315. package/lib/models/Cell.js +5 -0
  316. package/lib/models/CodeBlock.d.ts +10 -0
  317. package/lib/models/CodeBlock.js +5 -0
  318. package/lib/models/CodeSandboxSnapshot.d.ts +92 -0
  319. package/lib/models/CodeSandboxSnapshot.js +13 -0
  320. package/lib/models/CodeSandboxSnapshotDTO.d.ts +173 -0
  321. package/lib/models/CodeSandboxSnapshotDTO.js +139 -0
  322. package/lib/models/CodefeedBlocks.d.ts +7 -0
  323. package/lib/models/CodefeedBlocks.js +5 -0
  324. package/lib/models/Content.d.ts +5 -0
  325. package/lib/models/Content.js +5 -0
  326. package/lib/models/Course.d.ts +17 -0
  327. package/lib/models/Course.js +5 -0
  328. package/lib/models/Dataset.d.ts +16 -0
  329. package/lib/models/Dataset.js +5 -0
  330. package/lib/models/Document.d.ts +8 -0
  331. package/lib/models/Document.js +5 -0
  332. package/lib/models/Environment.d.ts +86 -0
  333. package/lib/models/Environment.js +5 -0
  334. package/lib/models/EnvironmentDTO.d.ts +125 -0
  335. package/lib/models/EnvironmentDTO.js +88 -0
  336. package/lib/models/Exercise.d.ts +16 -0
  337. package/lib/models/Exercise.js +5 -0
  338. package/lib/models/Item.d.ts +20 -0
  339. package/lib/models/Item.js +5 -0
  340. package/lib/models/ItemDTO.d.ts +74 -0
  341. package/lib/models/ItemDTO.js +186 -0
  342. package/lib/models/ItemType.d.ts +2 -0
  343. package/lib/models/ItemType.js +5 -0
  344. package/lib/models/Lesson.d.ts +5 -0
  345. package/lib/models/Lesson.js +5 -0
  346. package/lib/models/LexicalDTO.d.ts +155 -0
  347. package/lib/models/LexicalDTO.js +157 -0
  348. package/lib/models/Library.d.ts +10 -0
  349. package/lib/models/Library.js +5 -0
  350. package/lib/models/Notebook.d.ts +11 -0
  351. package/lib/models/Notebook.js +5 -0
  352. package/lib/models/NotebookDTO.d.ts +96 -0
  353. package/lib/models/NotebookDTO.js +153 -0
  354. package/lib/models/Page.d.ts +41 -0
  355. package/lib/models/Page.js +25 -0
  356. package/lib/models/PageTag.d.ts +19 -0
  357. package/lib/models/PageTag.js +94 -0
  358. package/lib/models/ProjectDTO.d.ts +89 -0
  359. package/lib/models/ProjectDTO.js +131 -0
  360. package/lib/models/Runtime.d.ts +160 -0
  361. package/lib/models/Runtime.js +18 -0
  362. package/lib/models/RuntimeDTO.d.ts +172 -0
  363. package/lib/models/RuntimeDTO.js +204 -0
  364. package/lib/models/Space.d.ts +35 -0
  365. package/lib/models/Space.js +66 -0
  366. package/lib/models/SpaceDTO.d.ts +334 -0
  367. package/lib/models/SpaceDTO.js +244 -0
  368. package/lib/models/SpaceItem.d.ts +10 -0
  369. package/lib/models/SpaceItem.js +5 -0
  370. package/lib/models/SpaceMember.d.ts +6 -0
  371. package/lib/models/SpaceMember.js +5 -0
  372. package/lib/models/StudentItem.d.ts +21 -0
  373. package/lib/models/StudentItem.js +5 -0
  374. package/lib/models/index.d.ts +32 -0
  375. package/lib/models/index.js +39 -0
  376. package/lib/protocols/AGUIAdapter.js +1 -1
  377. package/lib/runtimes/actions.d.ts +102 -0
  378. package/lib/runtimes/actions.js +249 -0
  379. package/lib/runtimes/apis.d.ts +273 -0
  380. package/lib/runtimes/apis.js +5 -0
  381. package/lib/runtimes/index.d.ts +5 -0
  382. package/lib/runtimes/index.js +9 -0
  383. package/lib/runtimes/settings.d.ts +15 -0
  384. package/lib/runtimes/settings.js +31 -0
  385. package/lib/runtimes/snapshots.d.ts +25 -0
  386. package/lib/runtimes/snapshots.js +150 -0
  387. package/lib/runtimes/utils.d.ts +7 -0
  388. package/lib/runtimes/utils.js +14 -0
  389. package/lib/services/DatalayerServiceManager.d.ts +23 -0
  390. package/lib/services/DatalayerServiceManager.js +90 -0
  391. package/lib/services/reconnectToRuntime.d.ts +32 -0
  392. package/lib/services/reconnectToRuntime.js +59 -0
  393. package/lib/services/sandboxServiceManagers.d.ts +31 -0
  394. package/lib/services/sandboxServiceManagers.js +57 -0
  395. package/lib/specs/agents/agents.d.ts +78 -26
  396. package/lib/specs/agents/agents.js +4434 -1639
  397. package/lib/specs/index.d.ts +1 -0
  398. package/lib/specs/index.js +1 -0
  399. package/lib/specs/loops.d.ts +34 -0
  400. package/lib/specs/loops.js +188 -0
  401. package/lib/specs/mcpServers.d.ts +1 -0
  402. package/lib/specs/mcpServers.js +17 -0
  403. package/lib/specs/models.d.ts +4 -0
  404. package/lib/specs/models.js +30 -0
  405. package/lib/specs/skills.d.ts +1 -0
  406. package/lib/specs/skills.js +18 -0
  407. package/lib/specs/tools.d.ts +15 -0
  408. package/lib/specs/tools.js +285 -0
  409. package/lib/state/index.d.ts +4 -0
  410. package/lib/state/index.js +10 -0
  411. package/lib/state/substates/CellState.d.ts +12 -0
  412. package/lib/state/substates/CellState.js +22 -0
  413. package/lib/state/substates/DocumentState.d.ts +10 -0
  414. package/lib/state/substates/DocumentState.js +14 -0
  415. package/lib/state/substates/GradeState.d.ts +10 -0
  416. package/lib/state/substates/GradeState.js +14 -0
  417. package/lib/state/substates/JupyterLabState.d.ts +16 -0
  418. package/lib/state/substates/JupyterLabState.js +17 -0
  419. package/lib/state/substates/NbformatState.d.ts +13 -0
  420. package/lib/state/substates/NbformatState.js +16 -0
  421. package/lib/state/substates/RuntimesState.d.ts +87 -0
  422. package/lib/state/substates/RuntimesState.js +192 -0
  423. package/lib/state/substates/SpaceState.d.ts +11 -0
  424. package/lib/state/substates/SpaceState.js +16 -0
  425. package/lib/state/substates/index.d.ts +8 -0
  426. package/lib/state/substates/index.js +14 -0
  427. package/lib/stores/agentRuntimeStore.d.ts +25 -2
  428. package/lib/stores/agentRuntimeStore.js +114 -19
  429. package/lib/stories/Button.stories.d.ts +1 -1
  430. package/lib/stories/Header.stories.d.ts +3 -3
  431. package/lib/test-setup.js +10 -0
  432. package/lib/types/agents-lifecycle.d.ts +5 -5
  433. package/lib/types/agents.d.ts +3 -3
  434. package/lib/types/agentspecs.d.ts +4 -2
  435. package/lib/types/chat.d.ts +135 -3
  436. package/lib/types/config.d.ts +19 -1
  437. package/lib/types/index.d.ts +1 -0
  438. package/lib/types/index.js +1 -0
  439. package/lib/types/loops.d.ts +64 -0
  440. package/lib/types/loops.js +5 -0
  441. package/lib/types/tools.d.ts +16 -0
  442. package/lib/utils/Cells.d.ts +2 -0
  443. package/lib/utils/Cells.js +28 -0
  444. package/package.json +24 -18
  445. package/scripts/codegen/__pycache__/generate_sandbox_agents.cpython-313.pyc +0 -0
  446. package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
  447. package/scripts/codegen/generate_agents.py +21 -4
  448. package/scripts/codegen/generate_loops.py +443 -0
  449. package/scripts/codegen/generate_sandbox_agents.py +145 -0
  450. package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -3
  451. package/lib/examples/A2UiComponentGalleryExample.js +0 -361
  452. /package/lib/{agent-lexical-main.d.ts → agent-document-main.d.ts} +0 -0
@@ -17,9 +17,11 @@ import { create } from 'zustand';
17
17
  import { persist, createJSONStorage } from 'zustand/middleware';
18
18
  import { useCoreStore, useDatalayer } from '@datalayer/core';
19
19
  import { useIAMStore } from '@datalayer/core/lib/state';
20
+ import { runtimesStore } from '../state';
20
21
  import { agentRuntimeStore, useAgentRuntimeStore, useAgentRuntimeConnection, useAgentRuntimeStatus, useAgentRuntimeError, useAgentRuntimeIsLaunching, } from '../stores/agentRuntimeStore';
21
22
  import { parseAgentStreamMessage, } from '../types/stream';
22
23
  import { DEFAULT_AGENT_CONFIG } from '../types/config';
24
+ import { disposeSandboxServiceManagers } from '../services/sandboxServiceManagers';
23
25
  // ═══════════════════════════════════════════════════════════════════════════
24
26
  // Constants
25
27
  // ═══════════════════════════════════════════════════════════════════════════
@@ -46,6 +48,60 @@ export const agentQueryKeys = {
46
48
  // ═══════════════════════════════════════════════════════════════════════════
47
49
  // Helpers
48
50
  // ═══════════════════════════════════════════════════════════════════════════
51
+ /**
52
+ * Session tombstones for runtime pods deleted from this client.
53
+ *
54
+ * After a DELETE succeeds, the control plane can keep returning the pod
55
+ * (status \"running\") for a few seconds. Without a tombstone, the immediate
56
+ * list refetch re-adds the dead pod to the query cache (and re-seeds the
57
+ * per-pod detail cache), so consumers rebuild Jupyter `ServiceManager`s
58
+ * against the dead ingress — producing endless CORS `/api/kernels` errors.
59
+ *
60
+ * Entries expire after a TTL so a pod that legitimately reappears later
61
+ * (e.g. resumed from a checkpoint under the same pod name) is not hidden
62
+ * forever; resume/create mutations also clear the tombstone eagerly.
63
+ */
64
+ const DELETED_POD_TOMBSTONE_TTL_MS = 5 * 60 * 1000;
65
+ const deletedRuntimePodTombstones = new Map();
66
+ /** Mark a runtime pod as deleted by this client (tombstone). */
67
+ export function markRuntimePodDeleted(podName) {
68
+ const normalized = String(podName || '').trim();
69
+ if (normalized) {
70
+ deletedRuntimePodTombstones.set(normalized, Date.now());
71
+ // Centralized teardown: dispose every ServiceManager any surface opened
72
+ // against this pod's sandbox so their kernelspecs/sessions/users pollers
73
+ // stop immediately instead of waiting for query-cache propagation.
74
+ disposeSandboxServiceManagers(normalized);
75
+ }
76
+ }
77
+ /** Clear a deleted-pod tombstone (pod legitimately exists again). */
78
+ export function clearRuntimePodDeleted(podName) {
79
+ deletedRuntimePodTombstones.delete(String(podName || '').trim());
80
+ }
81
+ /** Statuses that imply a live pod the client would connect to. */
82
+ const LIVE_RUNTIME_STATUSES = new Set([
83
+ 'running',
84
+ 'resumed',
85
+ 'starting',
86
+ 'resuming',
87
+ ]);
88
+ /**
89
+ * True when a runtime record is a stale control-plane echo of a pod this
90
+ * client already deleted: tombstoned, within TTL, and claiming a live status.
91
+ * Checkpoint-synthesised `paused` records pass through (no live pod to poll).
92
+ */
93
+ function isStaleDeletedRuntime(runtime) {
94
+ const podName = String(runtime?.pod_name || '').trim();
95
+ const deletedAt = deletedRuntimePodTombstones.get(podName);
96
+ if (deletedAt === undefined) {
97
+ return false;
98
+ }
99
+ if (Date.now() - deletedAt > DELETED_POD_TOMBSTONE_TTL_MS) {
100
+ deletedRuntimePodTombstones.delete(podName);
101
+ return false;
102
+ }
103
+ return LIVE_RUNTIME_STATUSES.has(runtime.status);
104
+ }
49
105
  const RUNTIME_STATUS_MAP = {
50
106
  resume: 'resumed',
51
107
  resumed: 'resumed',
@@ -148,11 +204,11 @@ export function useAgentRuntimes(options = {}) {
148
204
  import.meta.env.VITE_BASE_URL ||
149
205
  'http://localhost:8765');
150
206
  }
151
- return (configuration?.runtimesRunUrl ||
207
+ return (configuration?.runtimesUrl ||
152
208
  import.meta.env.VITE_DATALAYER_AGENT_RUNTIMES_URL ||
153
209
  'https://r1.datalayer.run');
154
210
  }, [
155
- configuration?.runtimesRunUrl,
211
+ configuration?.runtimesUrl,
156
212
  runtimeCreationBaseUrl,
157
213
  runtimeCreationTarget,
158
214
  ]);
@@ -162,12 +218,12 @@ export function useAgentRuntimes(options = {}) {
162
218
  const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
163
219
  const token = iamStore.getState().token || '';
164
220
  const config = coreStore.getState().configuration;
165
- const runUrl = config?.aiagentsRunUrl || '';
166
- const runtimesRunUrl = resolvedRuntimeCreationBaseUrl;
167
- return { token, runUrl, runtimesRunUrl };
221
+ const datalayerUrl = config?.aiAgentsUrl || '';
222
+ const runtimesUrl = resolvedRuntimeCreationBaseUrl;
223
+ return { token, datalayerUrl, runtimesUrl };
168
224
  }
169
225
  catch {
170
- return { token: '', runUrl: '', runtimesRunUrl: '' };
226
+ return { token: '', datalayerUrl: '', runtimesUrl: '' };
171
227
  }
172
228
  }, [resolvedRuntimeCreationBaseUrl]);
173
229
  // ─── Launch Runtime ─────────────────────────────────────────────────
@@ -188,13 +244,13 @@ export function useAgentRuntimes(options = {}) {
188
244
  const conn = await storeLaunchAgent(runtimeOptions
189
245
  ? {
190
246
  ...runtimeOptions,
191
- runtimesRunUrl: resolvedRuntimeCreationBaseUrl,
247
+ runtimesUrl: resolvedRuntimeCreationBaseUrl,
192
248
  }
193
249
  : {
194
250
  environmentName: 'ai-agents-env',
195
251
  creditsLimit: 10,
196
252
  givenName: safeName,
197
- runtimesRunUrl: resolvedRuntimeCreationBaseUrl,
253
+ runtimesUrl: resolvedRuntimeCreationBaseUrl,
198
254
  });
199
255
  setLifecycleStatus('ready');
200
256
  return conn;
@@ -212,7 +268,7 @@ export function useAgentRuntimes(options = {}) {
212
268
  }
213
269
  return storeLaunchAgent({
214
270
  ...runtimeOptions,
215
- runtimesRunUrl: resolvedRuntimeCreationBaseUrl,
271
+ runtimesUrl: resolvedRuntimeCreationBaseUrl,
216
272
  });
217
273
  }
218
274
  }, [
@@ -271,6 +327,29 @@ export function useAgentRuntimes(options = {}) {
271
327
  setIsCreating(false);
272
328
  }
273
329
  }, [agentSpecId, agentConfig, agentSpec, hasSpec, runtime, storeCreateAgent]);
330
+ // ─── Teardown ───────────────────────────────────────────────────────
331
+ const teardown = useCallback(async () => {
332
+ const agentId = runtime?.agentId;
333
+ const agentBaseUrl = runtime?.agentBaseUrl;
334
+ if (agentId && agentBaseUrl) {
335
+ try {
336
+ const { token } = await getAuthHeaders();
337
+ await fetch(`${agentBaseUrl}/api/v1/agents/${encodeURIComponent(agentId)}`, {
338
+ method: 'DELETE',
339
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
340
+ });
341
+ }
342
+ catch {
343
+ // Best-effort teardown: ignore network / 404 errors.
344
+ }
345
+ }
346
+ // Reset in-process runtime state so a fresh agent can be launched.
347
+ hasCreatedAgentRef.current = false;
348
+ hasAutoStarted.current = false;
349
+ setLifecycleStatus('idle');
350
+ setLifecycleError(null);
351
+ agentRuntimeStore.getState().reset();
352
+ }, [runtime?.agentId, runtime?.agentBaseUrl, getAuthHeaders]);
274
353
  // ─── Auto-create agent when runtime is ready (connect mode) ───────
275
354
  useEffect(() => {
276
355
  if (!hasSpec &&
@@ -324,12 +403,12 @@ export function useAgentRuntimes(options = {}) {
324
403
  let cancelled = false;
325
404
  const bootstrap = async () => {
326
405
  try {
327
- const { token, runtimesRunUrl } = await getAuthHeaders();
406
+ const { token, runtimesUrl } = await getAuthHeaders();
328
407
  if (!token) {
329
408
  return;
330
409
  }
331
- const { listRuntimes } = await import('@datalayer/core/lib/api/runtimes/runtimes');
332
- const runtimesResponse = await listRuntimes(token, runtimesRunUrl);
410
+ const { listRuntimes } = await import('../api/runtimes/runtimes');
411
+ const runtimesResponse = await listRuntimes(token, runtimesUrl);
333
412
  const runtimes = runtimesResponse.runtimes || [];
334
413
  const aiAgentRuntimes = runtimes.filter(rt => {
335
414
  if (rt.environment_name !== 'ai-agents-env') {
@@ -441,6 +520,7 @@ export function useAgentRuntimes(options = {}) {
441
520
  endpoint,
442
521
  serviceManager,
443
522
  createAgent,
523
+ teardown,
444
524
  isCreating,
445
525
  // Status
446
526
  isReady,
@@ -487,13 +567,16 @@ export function useAgentRuntimesQuery(scope, queryOptions) {
487
567
  }
488
568
  const query = params.toString();
489
569
  const resp = await requestDatalayer({
490
- url: `${configuration.runtimesRunUrl}/api/runtimes/v1/runtimes${query ? `?${query}` : ''}`,
570
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes${query ? `?${query}` : ''}`,
491
571
  method: 'GET',
492
572
  });
493
573
  if (resp.success && resp.runtimes) {
494
574
  const agentRuntimes = resp.runtimes
495
575
  .filter(rt => rt.environment_name === 'ai-agents-env')
496
- .map(toAgentRuntimeData);
576
+ .map(toAgentRuntimeData)
577
+ // Drop stale echoes of pods deleted from this client so consumers
578
+ // never reconnect a ServiceManager to a dead ingress (CORS spam).
579
+ .filter(runtime => !isStaleDeletedRuntime(runtime));
497
580
  agentRuntimes.forEach((runtime) => {
498
581
  queryClient.setQueryData(agentQueryKeys.agentRuntimes.detail(runtime.pod_name), runtime);
499
582
  });
@@ -518,11 +601,17 @@ export function useAgentRuntimeByPodName(podName) {
518
601
  queryKey: agentQueryKeys.agentRuntimes.detail(podName ?? ''),
519
602
  queryFn: async () => {
520
603
  const resp = await requestDatalayer({
521
- url: `${configuration.runtimesRunUrl}/api/runtimes/v1/runtimes/${podName}`,
604
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}`,
522
605
  method: 'GET',
523
606
  });
524
607
  if (resp.runtime) {
525
- return toAgentRuntimeData(resp.runtime);
608
+ const runtime = toAgentRuntimeData(resp.runtime);
609
+ if (isStaleDeletedRuntime(runtime)) {
610
+ // Stale echo of a pod deleted from this client — surface as an
611
+ // error so the poll stops and consumers tear the connection down.
612
+ throw new Error('Agent runtime deleted');
613
+ }
614
+ return runtime;
526
615
  }
527
616
  throw new Error('Failed to fetch agent runtime');
528
617
  },
@@ -551,7 +640,7 @@ export function useCreateAgentRuntime() {
551
640
  ? [String(data.volumeUid).trim()]
552
641
  : [];
553
642
  return requestDatalayer({
554
- url: `${configuration.runtimesRunUrl}/api/runtimes/v1/runtimes`,
643
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes`,
555
644
  method: 'POST',
556
645
  body: {
557
646
  environment_name: data.environmentName || 'ai-agents-env',
@@ -563,11 +652,11 @@ export function useCreateAgentRuntime() {
563
652
  agent_spec_id: data.agentSpecId || undefined,
564
653
  agent_spec: data.agentSpec || undefined,
565
654
  user_account_handle: data.userAccountHandle || undefined,
566
- billable_account_uid: data.billableAccountUid || undefined,
567
- billable_account_type: data.billableAccountType || undefined,
568
- billable_account_handle: data.billableAccountHandle || undefined,
569
- billable_source_organization_uid: data.billableSourceOrganizationUid || undefined,
570
- billable_source_organization_handle: data.billableSourceOrganizationHandle || undefined,
655
+ billing_entity_uid: data.billingEntityUid || undefined,
656
+ billing_entity_type: data.billingEntityType || undefined,
657
+ billing_entity_handle: data.billingEntityHandle || undefined,
658
+ billing_source_organization_uid: data.billingSourceOrganizationUid || undefined,
659
+ billing_source_organization_handle: data.billingSourceOrganizationHandle || undefined,
571
660
  mount_home_folder: data.mountHomeFolder ?? false,
572
661
  volume_uids: normalizedVolumeUids.length > 0 ? normalizedVolumeUids : undefined,
573
662
  volume_uid: normalizedVolumeUids[0] || data.volumeUid || undefined,
@@ -577,6 +666,8 @@ export function useCreateAgentRuntime() {
577
666
  onSuccess: resp => {
578
667
  if (resp.success && resp.runtime) {
579
668
  const mapped = toAgentRuntimeData(resp.runtime);
669
+ // A fresh runtime legitimately exists — drop any stale tombstone.
670
+ clearRuntimePodDeleted(mapped.pod_name);
580
671
  queryClient.setQueryData(agentQueryKeys.agentRuntimes.detail(mapped.pod_name), mapped);
581
672
  queryClient.invalidateQueries({
582
673
  queryKey: agentQueryKeys.agentRuntimes.all(),
@@ -592,14 +683,70 @@ export function useDeleteAgentRuntime() {
592
683
  const { configuration } = useCoreStore();
593
684
  const { requestDatalayer } = useDatalayer({ notifyOnError: false });
594
685
  const queryClient = useQueryClient();
686
+ const getErrorStatus = (error) => {
687
+ if (!error || typeof error !== 'object') {
688
+ return undefined;
689
+ }
690
+ const response = error.response;
691
+ return typeof response?.status === 'number' ? response.status : undefined;
692
+ };
693
+ const getErrorText = (error) => {
694
+ if (!error || typeof error !== 'object') {
695
+ return '';
696
+ }
697
+ const responseData = error.response?.data;
698
+ return String(responseData?.detail ||
699
+ responseData?.message ||
700
+ error.message ||
701
+ '').toLowerCase();
702
+ };
595
703
  return useMutation({
596
704
  mutationFn: async (podName) => {
597
- return requestDatalayer({
598
- url: `${configuration.runtimesRunUrl}/api/runtimes/v1/runtimes/${podName}`,
599
- method: 'DELETE',
600
- });
705
+ try {
706
+ return await requestDatalayer({
707
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}`,
708
+ method: 'DELETE',
709
+ });
710
+ }
711
+ catch (error) {
712
+ const status = getErrorStatus(error);
713
+ const message = getErrorText(error);
714
+ const maybeAlreadyDeleted = status === 404 ||
715
+ message.includes('no reservation') ||
716
+ message.includes('unknown reservation') ||
717
+ message.includes('not found');
718
+ if (!maybeAlreadyDeleted) {
719
+ throw error;
720
+ }
721
+ // The backend can return an IAM reservation error even after the pod
722
+ // has already been deleted successfully. Confirm state by checking if
723
+ // the runtime detail endpoint still exists.
724
+ try {
725
+ await requestDatalayer({
726
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}`,
727
+ method: 'GET',
728
+ });
729
+ // Runtime still exists: propagate original DELETE failure.
730
+ throw error;
731
+ }
732
+ catch (checkError) {
733
+ const checkStatus = getErrorStatus(checkError);
734
+ if (checkStatus === 404) {
735
+ return { success: true, recovered: true };
736
+ }
737
+ throw error;
738
+ }
739
+ }
601
740
  },
602
741
  onSuccess: (_data, podName) => {
742
+ // Tombstone the pod so refetches that still echo it from the control
743
+ // plane (deletion lag) do not re-add it to the caches below.
744
+ markRuntimePodDeleted(podName);
745
+ // Prune the pod from the runtimes store immediately so the remote service
746
+ // managers dispose right away and stop polling the now-dead pod ingress
747
+ // (otherwise `/api/kernels` requests keep firing until the next
748
+ // `refreshRuntimePods()` poll tick, producing CORS errors).
749
+ runtimesStore.getState().removeRuntimePod(podName);
603
750
  queryClient.setQueriesData({ queryKey: agentQueryKeys.agentRuntimes.lists() }, (current) => {
604
751
  if (!Array.isArray(current)) {
605
752
  return current;
@@ -707,6 +854,16 @@ export function useAgentsRuntimes(scope, queryOptions) {
707
854
  const createRuntimeMutation = useCreateAgentRuntime();
708
855
  const deleteRuntimeMutation = useDeleteAgentRuntime();
709
856
  const refreshRuntimes = useRefreshAgentRuntimes();
857
+ const terminateRuntimeByPod = useCallback(async (podName, options) => {
858
+ const normalizedPodName = String(podName || '').trim();
859
+ if (!normalizedPodName) {
860
+ return;
861
+ }
862
+ if (options?.beforeTerminate) {
863
+ await options.beforeTerminate();
864
+ }
865
+ return deleteRuntimeMutation.mutateAsync(normalizedPodName);
866
+ }, [deleteRuntimeMutation]);
710
867
  return useMemo(() => ({
711
868
  runtimes: runtimesQuery.data ?? EMPTY_RUNTIMES,
712
869
  isRuntimesLoading: runtimesQuery.isLoading,
@@ -714,7 +871,8 @@ export function useAgentsRuntimes(scope, queryOptions) {
714
871
  runtimesError: runtimesQuery.error,
715
872
  refetchRuntimes: () => runtimesQuery.refetch(),
716
873
  refreshRuntimes,
717
- deleteRuntimeByPod: async (podName) => deleteRuntimeMutation.mutateAsync(podName),
874
+ terminateRuntimeByPod,
875
+ deleteRuntimeByPod: async (podName) => terminateRuntimeByPod(podName),
718
876
  createRuntime: async (data) => createRuntimeMutation.mutateAsync(data),
719
877
  }), [
720
878
  runtimesQuery.data,
@@ -723,6 +881,7 @@ export function useAgentsRuntimes(scope, queryOptions) {
723
881
  runtimesQuery.error,
724
882
  runtimesQuery.refetch,
725
883
  refreshRuntimes,
884
+ terminateRuntimeByPod,
726
885
  createRuntimeMutation,
727
886
  deleteRuntimeMutation,
728
887
  ]);
@@ -23,7 +23,7 @@ export const useAgentsService = (baseUrlOverride = 'api/ai-agents/v1') => {
23
23
  const { requestDatalayer } = useDatalayer({ notifyOnError: false });
24
24
  const createAgent = (documentId, documentType, ingress, token, kernelId, { signal, baseUrl = baseUrlOverride } = {}) => {
25
25
  return requestDatalayer({
26
- url: URLExt.join(configuration.aiagentsRunUrl, baseUrl, 'agents'),
26
+ url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents'),
27
27
  method: 'POST',
28
28
  body: {
29
29
  document_id: documentId,
@@ -39,28 +39,28 @@ export const useAgentsService = (baseUrlOverride = 'api/ai-agents/v1') => {
39
39
  };
40
40
  const getAgents = ({ signal, baseUrl = baseUrlOverride, } = {}) => {
41
41
  return requestDatalayer({
42
- url: URLExt.join(configuration.aiagentsRunUrl, baseUrl, 'agents'),
42
+ url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents'),
43
43
  method: 'GET',
44
44
  signal,
45
45
  });
46
46
  };
47
47
  const deleteAgent = (documentId, { signal, baseUrl = baseUrlOverride } = {}) => {
48
48
  return requestDatalayer({
49
- url: URLExt.join(configuration.aiagentsRunUrl, baseUrl, 'agents', documentId),
49
+ url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents', documentId),
50
50
  method: 'DELETE',
51
51
  signal,
52
52
  });
53
53
  };
54
54
  const getAgent = (documentId, { signal, baseUrl = baseUrlOverride } = {}) => {
55
55
  return requestDatalayer({
56
- url: URLExt.join(configuration.aiagentsRunUrl, baseUrl, 'agents', documentId),
56
+ url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents', documentId),
57
57
  method: 'GET',
58
58
  signal,
59
59
  });
60
60
  };
61
61
  const patchAgent = (documentId, ingress, token, kernelId, { signal, baseUrl = baseUrlOverride } = {}) => {
62
62
  return requestDatalayer({
63
- url: URLExt.join(configuration.aiagentsRunUrl, baseUrl, 'agents', documentId),
63
+ url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents', documentId),
64
64
  method: 'PATCH',
65
65
  body: {
66
66
  runtime: ingress && token && kernelId
@@ -0,0 +1,4 @@
1
+ declare const useCellOutputshot: () => (string | ((node: HTMLDivElement) => void) | {
2
+ error: undefined;
3
+ })[];
4
+ export default useCellOutputshot;
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ import { useState } from 'react';
6
+ import { useCellStore } from '../state/substates';
7
+ import { takeHTMLNodeScreencapture } from '@datalayer/core/lib/utils/Screencapture';
8
+ const useCellOutputshot = () => {
9
+ const [outputshot, setOutputshot] = useState('');
10
+ const [error, setError] = useState();
11
+ const { update } = useCellStore();
12
+ const takeOutputshot = (node) => {
13
+ takeHTMLNodeScreencapture(node)
14
+ .then(outputshotData => {
15
+ setOutputshot(outputshotData);
16
+ update({
17
+ outputshotData,
18
+ });
19
+ return outputshotData;
20
+ })
21
+ .catch(reason => setError(reason));
22
+ };
23
+ return [outputshot, takeOutputshot, { error }];
24
+ };
25
+ export default useCellOutputshot;
@@ -48,7 +48,7 @@ export type TerminateAgentParams = {
48
48
  * Calls ``GET /api/runtimes/v1/runtime-checkpoints`` and returns
49
49
  * the list of checkpoint records in visible states.
50
50
  */
51
- export declare function useCheckpointsQuery(): import("@tanstack/react-query").UseQueryResult<CheckpointData[], Error>;
51
+ export declare function useCheckpointsQuery(): import("@tanstack/react-query").UseQueryResult<NoInfer<CheckpointData[]>, Error>;
52
52
  /**
53
53
  * Hook to refresh the checkpoints list.
54
54
  */
@@ -73,14 +73,14 @@ export declare function useResumePausedAgentRuntime(): import("@tanstack/react-q
73
73
  * until the checkpoint reaches ``paused`` or ``failed``.
74
74
  * On success, both runtimes and checkpoints queries are invalidated.
75
75
  */
76
- export declare function usePauseAgent(): import("@tanstack/react-query").UseMutationResult<import("@datalayer/core/lib/api/runtimes/runtimes").PauseResumeResponse, Error, PauseAgentParams, unknown>;
76
+ export declare function usePauseAgent(): import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, PauseAgentParams, unknown>;
77
77
  /**
78
78
  * Hook to resume a paused agent runtime from a checkpoint.
79
79
  *
80
80
  * Calls ``POST .../resume`` then invalidates both runtimes and
81
81
  * checkpoints queries so the UI reflects the new state.
82
82
  */
83
- export declare function useResumeAgent(): import("@tanstack/react-query").UseMutationResult<import("@datalayer/core/lib/api/runtimes/runtimes").PauseResumeResponse, Error, ResumeAgentParams, unknown>;
83
+ export declare function useResumeAgent(): import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, ResumeAgentParams, unknown>;
84
84
  /**
85
85
  * Hook to create a named checkpoint (pause → wait → stay paused).
86
86
  *
@@ -88,7 +88,7 @@ export declare function useResumeAgent(): import("@tanstack/react-query").UseMut
88
88
  * this hook creates a named checkpoint record for later restore.
89
89
  */
90
90
  export declare function useCheckpointAgent(): import("@tanstack/react-query").UseMutationResult<{
91
- checkpoint: import("@datalayer/core/lib/api/runtimes/checkpoints").RuntimeCheckpointData;
91
+ checkpoint: import("../api/runtimes/checkpoints").RuntimeCheckpointData;
92
92
  success: boolean;
93
93
  message: string;
94
94
  checkpoint_id: string | null;
@@ -163,12 +163,12 @@ export declare function useAgentLifecycle(options: AgentLifecycleOptions): Agent
163
163
  * for pause, resume, and checkpoint lifecycle.
164
164
  */
165
165
  export declare function useCheckpoints(): {
166
- checkpointsQuery: import("@tanstack/react-query").UseQueryResult<CheckpointData[], Error>;
166
+ checkpointsQuery: import("@tanstack/react-query").UseQueryResult<NoInfer<CheckpointData[]>, Error>;
167
167
  refresh: () => void;
168
- pauseAgent: import("@tanstack/react-query").UseMutationResult<import("@datalayer/core/lib/api/runtimes/runtimes").PauseResumeResponse, Error, PauseAgentParams, unknown>;
169
- resumeAgent: import("@tanstack/react-query").UseMutationResult<import("@datalayer/core/lib/api/runtimes/runtimes").PauseResumeResponse, Error, ResumeAgentParams, unknown>;
168
+ pauseAgent: import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, PauseAgentParams, unknown>;
169
+ resumeAgent: import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, ResumeAgentParams, unknown>;
170
170
  checkpointAgent: import("@tanstack/react-query").UseMutationResult<{
171
- checkpoint: import("@datalayer/core/lib/api/runtimes/checkpoints").RuntimeCheckpointData;
171
+ checkpoint: import("../api/runtimes/checkpoints").RuntimeCheckpointData;
172
172
  success: boolean;
173
173
  message: string;
174
174
  checkpoint_id: string | null;
@@ -14,7 +14,8 @@ import { useMemo, useState, useCallback } from 'react';
14
14
  import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
15
15
  import { useIAMStore } from '@datalayer/core/lib/state';
16
16
  import { useCoreStore, useDatalayer } from '@datalayer/core';
17
- import { agentQueryKeys, AGENT_QUERY_OPTIONS } from './useAgentRuntimes';
17
+ import { agentQueryKeys, AGENT_QUERY_OPTIONS, clearRuntimePodDeleted, } from './useAgentRuntimes';
18
+ import { disposeSandboxServiceManagers } from '../services/sandboxServiceManagers';
18
19
  // ═══════════════════════════════════════════════════════════════════════════
19
20
  // Query hooks
20
21
  // ═══════════════════════════════════════════════════════════════════════════
@@ -32,7 +33,7 @@ export function useCheckpointsQuery() {
32
33
  queryKey: agentQueryKeys.checkpoints.lists(),
33
34
  queryFn: async () => {
34
35
  const resp = await requestDatalayer({
35
- url: `${configuration.runtimesRunUrl}/api/runtimes/v1/runtime-checkpoints`,
36
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtime-checkpoints`,
36
37
  method: 'GET',
37
38
  });
38
39
  if (resp.success && resp.checkpoints) {
@@ -71,7 +72,7 @@ export function useDeletePausedAgentRuntime() {
71
72
  return useMutation({
72
73
  mutationFn: async (podName) => {
73
74
  return requestDatalayer({
74
- url: `${configuration.runtimesRunUrl}/api/runtimes/v1/runtimes/${podName}/paused`,
75
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}/paused`,
75
76
  method: 'DELETE',
76
77
  });
77
78
  },
@@ -101,11 +102,14 @@ export function useResumePausedAgentRuntime() {
101
102
  return useMutation({
102
103
  mutationFn: async (podName) => {
103
104
  return requestDatalayer({
104
- url: `${configuration.runtimesRunUrl}/api/runtimes/v1/runtimes/${podName}/resume`,
105
+ url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}/resume`,
105
106
  method: 'POST',
106
107
  });
107
108
  },
108
- onSuccess: () => {
109
+ onSuccess: (_data, podName) => {
110
+ // The pod can come back under the same name — drop any delete tombstone
111
+ // so the runtimes queries do not filter the resumed runtime out.
112
+ clearRuntimePodDeleted(podName);
109
113
  queryClient.invalidateQueries({
110
114
  queryKey: agentQueryKeys.agentRuntimes.all(),
111
115
  });
@@ -131,10 +135,10 @@ export function usePauseAgent() {
131
135
  mutationFn: async (params) => {
132
136
  const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
133
137
  const token = iamStore.getState().token || '';
134
- const runtimesRunUrl = coreStore.getState().configuration?.runtimesRunUrl || '';
135
- const { pauseRuntime } = await import('@datalayer/core/lib/api/runtimes/runtimes');
138
+ const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
139
+ const { pauseRuntime } = await import('../api/runtimes/runtimes');
136
140
  const mode = params.mode || 'light';
137
- const resp = await pauseRuntime(token, params.podName, runtimesRunUrl, {
141
+ const resp = await pauseRuntime(token, params.podName, runtimesUrl, {
138
142
  agent_spec_id: params.agentSpecId,
139
143
  checkpoint_mode: mode,
140
144
  ...(params.messages && mode === 'light'
@@ -143,15 +147,18 @@ export function usePauseAgent() {
143
147
  ...(params.agentSpec ? { agentspec: params.agentSpec } : {}),
144
148
  });
145
149
  if (resp.checkpoint_id) {
146
- const { waitForCheckpointStatus } = await import('@datalayer/core/lib/api/runtimes/checkpoints');
147
- const ckpt = await waitForCheckpointStatus(token, params.podName, resp.checkpoint_id, ['paused', 'failed'], runtimesRunUrl);
150
+ const { waitForCheckpointStatus } = await import('../api/runtimes/checkpoints');
151
+ const ckpt = await waitForCheckpointStatus(token, params.podName, resp.checkpoint_id, ['paused', 'failed'], runtimesUrl);
148
152
  if (ckpt.status === 'failed') {
149
153
  throw new Error(`Checkpoint ${resp.checkpoint_id} failed during ${mode.toUpperCase()} pause`);
150
154
  }
151
155
  }
152
156
  return resp;
153
157
  },
154
- onSuccess: () => {
158
+ onSuccess: (_data, params) => {
159
+ // Pausing tears the pod down: dispose every ServiceManager any surface
160
+ // opened against the sandbox so their pollers stop immediately.
161
+ disposeSandboxServiceManagers(params.podName);
155
162
  queryClient.invalidateQueries({
156
163
  queryKey: agentQueryKeys.agentRuntimes.all(),
157
164
  });
@@ -173,15 +180,18 @@ export function useResumeAgent() {
173
180
  mutationFn: async (params) => {
174
181
  const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
175
182
  const token = iamStore.getState().token || '';
176
- const runtimesRunUrl = coreStore.getState().configuration?.runtimesRunUrl || '';
177
- const { resumeRuntime } = await import('@datalayer/core/lib/api/runtimes/runtimes');
178
- return resumeRuntime(token, params.podName, runtimesRunUrl, {
183
+ const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
184
+ const { resumeRuntime } = await import('../api/runtimes/runtimes');
185
+ return resumeRuntime(token, params.podName, runtimesUrl, {
179
186
  agent_spec_id: params.agentSpecId,
180
187
  ...(params.mode ? { checkpoint_mode: params.mode } : {}),
181
188
  ...(params.checkpointId ? { checkpoint_id: params.checkpointId } : {}),
182
189
  });
183
190
  },
184
- onSuccess: () => {
191
+ onSuccess: (_data, params) => {
192
+ // The pod can come back under the same name — drop any delete tombstone
193
+ // so the runtimes queries do not filter the resumed runtime out.
194
+ clearRuntimePodDeleted(params.podName);
185
195
  queryClient.invalidateQueries({
186
196
  queryKey: agentQueryKeys.agentRuntimes.all(),
187
197
  });
@@ -203,11 +213,11 @@ export function useCheckpointAgent() {
203
213
  mutationFn: async (params) => {
204
214
  const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
205
215
  const token = iamStore.getState().token || '';
206
- const runtimesRunUrl = coreStore.getState().configuration?.runtimesRunUrl || '';
207
- const { pauseRuntime } = await import('@datalayer/core/lib/api/runtimes/runtimes');
208
- const { waitForCheckpointStatus } = await import('@datalayer/core/lib/api/runtimes/checkpoints');
216
+ const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
217
+ const { pauseRuntime } = await import('../api/runtimes/runtimes');
218
+ const { waitForCheckpointStatus } = await import('../api/runtimes/checkpoints');
209
219
  const mode = params.mode || 'criu';
210
- const pauseResp = await pauseRuntime(token, params.podName, runtimesRunUrl, {
220
+ const pauseResp = await pauseRuntime(token, params.podName, runtimesUrl, {
211
221
  name: params.name || `checkpoint-${Date.now()}`,
212
222
  description: `${mode.toUpperCase()} checkpoint for ${params.agentSpecId}`,
213
223
  checkpoint_mode: mode,
@@ -221,7 +231,7 @@ export function useCheckpointAgent() {
221
231
  if (!checkpointId) {
222
232
  throw new Error('Pause did not return a checkpoint_id');
223
233
  }
224
- const ckpt = await waitForCheckpointStatus(token, params.podName, checkpointId, ['paused', 'failed'], runtimesRunUrl);
234
+ const ckpt = await waitForCheckpointStatus(token, params.podName, checkpointId, ['paused', 'failed'], runtimesUrl);
225
235
  if (ckpt.status === 'failed') {
226
236
  throw new Error(`Checkpoint ${checkpointId} failed during ${mode.toUpperCase()} pause`);
227
237
  }
@@ -249,9 +259,9 @@ export function useTerminateAgent() {
249
259
  mutationFn: async (params) => {
250
260
  const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
251
261
  const token = iamStore.getState().token || '';
252
- const runtimesRunUrl = coreStore.getState().configuration?.runtimesRunUrl || '';
253
- const { deleteRuntime } = await import('@datalayer/core/lib/api/runtimes/runtimes');
254
- return deleteRuntime(token, params.podName, runtimesRunUrl);
262
+ const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
263
+ const { deleteRuntime } = await import('../api/runtimes/runtimes');
264
+ return deleteRuntime(token, params.podName, runtimesUrl);
255
265
  },
256
266
  onSuccess: () => {
257
267
  queryClient.invalidateQueries({
@@ -330,9 +340,9 @@ export function useAgentLifecycle(options) {
330
340
  try {
331
341
  const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
332
342
  const token = iamStore.getState().token || '';
333
- const runtimesRunUrl = coreStore.getState().configuration?.runtimesRunUrl || '';
334
- const { listRuntimes } = await import('@datalayer/core/lib/api/runtimes/runtimes');
335
- const runtimesResponse = await listRuntimes(token, runtimesRunUrl);
343
+ const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
344
+ const { listRuntimes } = await import('../api/runtimes/runtimes');
345
+ const runtimesResponse = await listRuntimes(token, runtimesUrl);
336
346
  const runtimes = runtimesResponse.runtimes || [];
337
347
  const aiAgentRuntimes = runtimes.filter(rt => {
338
348
  if (rt.environment_name !== 'ai-agents-env') {