@datalayer/agent-runtimes 1.0.9 → 1.0.17

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 (462) 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 +468 -40
  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.d.ts +4 -4
  65. package/lib/client/AgentsMixin.js +35 -35
  66. package/lib/client/SdkAgentRuntimesClient.d.ts +1 -1
  67. package/lib/client/SdkAgentRuntimesClient.js +1 -1
  68. package/lib/client/mixins/RuntimesMixin.d.ts +93 -0
  69. package/lib/client/mixins/RuntimesMixin.js +229 -0
  70. package/lib/client/mixins/SpacerMixin.d.ts +210 -0
  71. package/lib/client/mixins/SpacerMixin.js +615 -0
  72. package/lib/client/utils/spacerUtils.d.ts +18 -0
  73. package/lib/client/utils/spacerUtils.js +32 -0
  74. package/lib/collaboration/DatalayerCollaboration.d.ts +13 -0
  75. package/lib/collaboration/DatalayerCollaboration.js +28 -0
  76. package/lib/collaboration/DatalayerCollaborationProvider.d.ts +58 -0
  77. package/lib/collaboration/DatalayerCollaborationProvider.js +148 -0
  78. package/lib/collaboration/index.d.ts +2 -0
  79. package/lib/collaboration/index.js +6 -0
  80. package/lib/components/AgentSummary.d.ts +19 -0
  81. package/lib/components/AgentSummary.js +89 -0
  82. package/lib/components/ToolApprovalCard.js +13 -3
  83. package/lib/components/a2ui/A2uiSurfaceComposed.d.ts +13 -0
  84. package/lib/components/a2ui/A2uiSurfaceComposed.js +110 -0
  85. package/lib/components/a2ui/index.d.ts +2 -0
  86. package/lib/components/a2ui/index.js +6 -0
  87. package/lib/components/a2ui/styles.d.ts +14 -0
  88. package/lib/components/a2ui/styles.js +142 -0
  89. package/lib/components/context/SpaceSelect.d.ts +2 -0
  90. package/lib/components/context/SpaceSelect.js +42 -0
  91. package/lib/components/flashes/FlashDisclaimer.d.ts +2 -0
  92. package/lib/components/flashes/FlashDisclaimer.js +17 -0
  93. package/lib/components/icons/ArtifactIcon.d.ts +10 -0
  94. package/lib/components/icons/ArtifactIcon.js +58 -0
  95. package/lib/components/icons/index.d.ts +1 -0
  96. package/lib/components/icons/index.js +5 -0
  97. package/lib/components/index.d.ts +5 -0
  98. package/lib/components/index.js +5 -0
  99. package/lib/components/nbgrader/NbGradesDetails.d.ts +5 -0
  100. package/lib/components/nbgrader/NbGradesDetails.js +19 -0
  101. package/lib/components/nbgrader/index.d.ts +1 -0
  102. package/lib/components/nbgrader/index.js +5 -0
  103. package/lib/components/progress/CreditsIndicator.d.ts +33 -0
  104. package/lib/components/progress/CreditsIndicator.js +23 -0
  105. package/lib/components/progress/index.d.ts +2 -0
  106. package/lib/components/progress/index.js +6 -0
  107. package/lib/components/runtimes/RuntimeCellVariables.d.ts +39 -0
  108. package/lib/components/runtimes/RuntimeCellVariables.js +172 -0
  109. package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +37 -0
  110. package/lib/components/runtimes/RuntimeCellVariablesDialog.js +101 -0
  111. package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +57 -0
  112. package/lib/components/runtimes/RuntimeLauncherDialog.js +275 -0
  113. package/lib/components/runtimes/RuntimePickerBase.d.ts +69 -0
  114. package/lib/components/runtimes/RuntimePickerBase.js +122 -0
  115. package/lib/components/runtimes/RuntimePickerCell.d.ts +34 -0
  116. package/lib/components/runtimes/RuntimePickerCell.js +104 -0
  117. package/lib/components/runtimes/RuntimePickerNotebook.d.ts +42 -0
  118. package/lib/components/runtimes/RuntimePickerNotebook.js +232 -0
  119. package/lib/components/runtimes/RuntimeReservationControl.d.ts +47 -0
  120. package/lib/components/runtimes/RuntimeReservationControl.js +42 -0
  121. package/lib/components/runtimes/RuntimeSimplePicker.d.ts +38 -0
  122. package/lib/components/runtimes/RuntimeSimplePicker.js +155 -0
  123. package/lib/components/runtimes/RuntimeTransfer.d.ts +16 -0
  124. package/lib/components/runtimes/RuntimeTransfer.js +5 -0
  125. package/lib/components/runtimes/RuntimeUtils.d.ts +17 -0
  126. package/lib/components/runtimes/RuntimeUtils.js +178 -0
  127. package/lib/components/runtimes/RuntimeVariables.d.ts +38 -0
  128. package/lib/components/runtimes/RuntimeVariables.js +75 -0
  129. package/lib/components/runtimes/index.d.ts +11 -0
  130. package/lib/components/runtimes/index.js +15 -0
  131. package/lib/components/scheduler/ScheduleMenu.d.ts +54 -0
  132. package/lib/components/scheduler/ScheduleMenu.js +154 -0
  133. package/lib/components/scheduler/index.d.ts +1 -0
  134. package/lib/components/scheduler/index.js +5 -0
  135. package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +33 -0
  136. package/lib/components/snapshots/SandboxSnapshotMenu.js +169 -0
  137. package/lib/components/snapshots/index.d.ts +1 -0
  138. package/lib/components/snapshots/index.js +5 -0
  139. package/lib/components/snippets/SnippetDialog.d.ts +42 -0
  140. package/lib/components/snippets/SnippetDialog.js +42 -0
  141. package/lib/components/students/StudentItemStatus.d.ts +7 -0
  142. package/lib/components/students/StudentItemStatus.js +68 -0
  143. package/lib/components/students/index.d.ts +1 -0
  144. package/lib/components/students/index.js +5 -0
  145. package/lib/components/tokens/SpaceVariantToken.d.ts +5 -0
  146. package/lib/components/tokens/SpaceVariantToken.js +23 -0
  147. package/lib/components/tokens/index.d.ts +1 -0
  148. package/lib/components/tokens/index.js +5 -0
  149. package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +4 -0
  150. package/lib/components/toolbars/AssignmentEditorToolbar.js +18 -0
  151. package/lib/components/toolbars/DocumentEditorToolbar.d.ts +2 -0
  152. package/lib/components/toolbars/DocumentEditorToolbar.js +12 -0
  153. package/lib/components/toolbars/NotebookEditorToolbar.d.ts +29 -0
  154. package/lib/components/toolbars/NotebookEditorToolbar.js +30 -0
  155. package/lib/config/AgentConfiguration.d.ts +2 -2
  156. package/lib/config/index.d.ts +1 -1
  157. package/lib/context/ContextInspector.d.ts +1 -14
  158. package/lib/context/ContextInspector.js +3 -73
  159. package/lib/context/CostUsageChart.d.ts +4 -3
  160. package/lib/context/CostUsageChart.js +236 -35
  161. package/lib/context/MessageHistory.d.ts +30 -0
  162. package/lib/context/MessageHistory.js +129 -0
  163. package/lib/context/TokenUsageChart.d.ts +4 -3
  164. package/lib/context/TokenUsageChart.js +180 -30
  165. package/lib/context/TurnGraphChart.d.ts +1 -1
  166. package/lib/context/TurnGraphChart.js +6 -6
  167. package/lib/examples/A2UiAgentExample.d.ts +22 -0
  168. package/lib/examples/A2UiAgentExample.js +442 -0
  169. package/lib/examples/A2UiComponentsGalleryExample.d.ts +3 -0
  170. package/lib/examples/A2UiComponentsGalleryExample.js +863 -0
  171. package/lib/examples/A2UiContactCardExample.js +9 -5
  172. package/lib/examples/A2UiRestaurantExample.js +23 -8
  173. package/lib/examples/A2UiViewerExample.js +75 -3
  174. package/lib/examples/AgUiAgenticExample.d.ts +1 -12
  175. package/lib/examples/AgUiAgenticExample.js +52 -8
  176. package/lib/examples/AgUiBackendToolRenderingExample.d.ts +1 -16
  177. package/lib/examples/AgUiBackendToolRenderingExample.js +32 -17
  178. package/lib/examples/AgUiHaikuGenUiExample.d.ts +1 -17
  179. package/lib/examples/AgUiHaikuGenUiExample.js +49 -33
  180. package/lib/examples/AgUiHumanInTheLoopExample.d.ts +1 -12
  181. package/lib/examples/AgUiHumanInTheLoopExample.js +21 -6
  182. package/lib/examples/AgUiSharedStateExample.d.ts +1 -14
  183. package/lib/examples/AgUiSharedStateExample.js +21 -6
  184. package/lib/examples/AgUiToolsBasedGenUiExample.d.ts +1 -14
  185. package/lib/examples/AgUiToolsBasedGenUiExample.js +21 -6
  186. package/lib/examples/AgentCheckpointsExample.d.ts +1 -1
  187. package/lib/examples/AgentCheckpointsExample.js +21 -22
  188. package/lib/examples/AgentCodemodeExample.js +3 -3
  189. package/lib/examples/AgentEvalsExample.js +8 -8
  190. package/lib/examples/AgentGuardrailsExample.js +22 -17
  191. package/lib/examples/AgentHooksExample.js +16 -57
  192. package/lib/examples/AgentInferenceProviderExample.js +8 -8
  193. package/lib/examples/AgentLoopExample.d.ts +10 -0
  194. package/lib/examples/AgentLoopExample.js +304 -0
  195. package/lib/examples/AgentMCPExample.js +9 -9
  196. package/lib/examples/AgentMemoryExample.js +6 -6
  197. package/lib/examples/AgentMonitoringExample.js +116 -46
  198. package/lib/examples/AgentNotificationsExample.js +6 -6
  199. package/lib/examples/AgentOtelExample.d.ts +3 -3
  200. package/lib/examples/AgentOtelExample.js +20 -15
  201. package/lib/examples/AgentOutputsExample.js +8 -8
  202. package/lib/examples/AgentParametersExample.js +24 -36
  203. package/lib/examples/AgentSandboxExample.js +7 -7
  204. package/lib/examples/AgentSkillsExample.js +9 -9
  205. package/lib/examples/AgentSubagentsExample.js +6 -6
  206. package/lib/examples/AgentToolApprovalsExample.js +37 -11
  207. package/lib/examples/AgentTriggersExample.js +12 -12
  208. package/lib/examples/AgentspecsExample.js +63 -41
  209. package/lib/examples/ChatCustomExample.js +23 -77
  210. package/lib/examples/ChatExample.js +15 -46
  211. package/lib/examples/LexicalAgentExample.js +43 -91
  212. package/lib/examples/LexicalAgentSidebarExample.js +45 -73
  213. package/lib/examples/NotebookAgentExample.js +52 -81
  214. package/lib/examples/NotebookAgentSidebarExample.js +43 -71
  215. package/lib/examples/NotebookCollaborationExample.js +11 -9
  216. package/lib/examples/NotebookExample.js +5 -2
  217. package/lib/examples/components/AuthRequiredView.js +1 -1
  218. package/lib/examples/components/ExampleErrorBoundary.d.ts +46 -0
  219. package/lib/examples/components/ExampleErrorBoundary.js +67 -0
  220. package/lib/examples/components/haiku/haiku-card.css +11 -0
  221. package/lib/examples/components/weather/weather-card.css +11 -0
  222. package/lib/examples/example-selector.js +3 -1
  223. package/lib/examples/hooks/useExampleAgentRuntime.d.ts +35 -0
  224. package/lib/examples/hooks/useExampleAgentRuntime.js +82 -0
  225. package/lib/examples/hooks/useSpecRenderToolResult.d.ts +30 -0
  226. package/lib/examples/hooks/useSpecRenderToolResult.js +61 -0
  227. package/lib/examples/index.d.ts +3 -1
  228. package/lib/examples/index.js +3 -1
  229. package/lib/examples/main.js +340 -93
  230. package/lib/examples/utils/a2ui.d.ts +2 -0
  231. package/lib/examples/utils/a2ui.js +97 -2
  232. package/lib/examples/utils/agentSummaryStore.d.ts +21 -0
  233. package/lib/examples/utils/agentSummaryStore.js +23 -0
  234. package/lib/examples/utils/notebooks/Empty.ipynb.json +30 -30
  235. package/lib/examples/utils/runtimeTargetStore.d.ts +9 -0
  236. package/lib/examples/utils/runtimeTargetStore.js +27 -0
  237. package/lib/examples/utils/teardownAgents.d.ts +13 -0
  238. package/lib/examples/utils/teardownAgents.js +78 -0
  239. package/lib/examples/utils/useExampleAgentRuntimesUrl.d.ts +2 -0
  240. package/lib/examples/utils/useExampleAgentRuntimesUrl.js +26 -7
  241. package/lib/examples2/CellExample.d.ts +6 -0
  242. package/lib/examples2/CellExample.js +20 -0
  243. package/lib/examples2/DatalayerNotebookExample.d.ts +16 -0
  244. package/lib/examples2/DatalayerNotebookExample.js +109 -0
  245. package/lib/examples2/NativeNavigationExample.d.ts +8 -0
  246. package/lib/examples2/NativeNavigationExample.js +97 -0
  247. package/lib/examples2/NotebookExample.d.ts +6 -0
  248. package/lib/examples2/NotebookExample.js +19 -0
  249. package/lib/examples2/NotebookMutationsKernel.d.ts +2 -0
  250. package/lib/examples2/NotebookMutationsKernel.js +105 -0
  251. package/lib/examples2/NotebookMutationsServiceManager.d.ts +2 -0
  252. package/lib/examples2/NotebookMutationsServiceManager.js +109 -0
  253. package/lib/examples2/ReactRouterExample.d.ts +6 -0
  254. package/lib/examples2/ReactRouterExample.js +175 -0
  255. package/lib/examples2/example-selector.d.ts +22 -0
  256. package/lib/examples2/example-selector.js +45 -0
  257. package/lib/examples2/index.d.ts +2 -0
  258. package/lib/examples2/index.js +6 -0
  259. package/lib/examples2/lexical-theme.css +436 -0
  260. package/lib/examples2/main.d.ts +2 -0
  261. package/lib/examples2/main.js +330 -0
  262. package/lib/examples2/notebooks/IPyWidgetsExample.ipynb.json +101 -0
  263. package/lib/examples2/notebooks/IPyWidgetsExampleWithState.ipynb.json +112 -0
  264. package/lib/examples2/notebooks/Lite.ipynb.json +128 -0
  265. package/lib/examples2/notebooks/Matplotlib.ipynb.json +137 -0
  266. package/lib/examples2/notebooks/NotebookExample1.ipynb.json +126 -0
  267. package/lib/examples2/notebooks/NotebookExample2.ipynb.json +48 -0
  268. package/lib/examples2/notebooks/NotebookOutputs.ipynb.json +49 -0
  269. package/lib/examples2/notebooks/NotebookToCExample.ipynb.json +102 -0
  270. package/lib/examples2/notebooks/OutputIPyWidgetsExample.d.ts +145 -0
  271. package/lib/examples2/notebooks/OutputIPyWidgetsExample.js +153 -0
  272. package/lib/examples2/notebooks/PyGWalker.ipynb.json +55 -0
  273. package/lib/hooks/index.d.ts +9 -1
  274. package/lib/hooks/index.js +13 -1
  275. package/lib/hooks/useAIAgentsWebSocket.d.ts +1 -1
  276. package/lib/hooks/useAIAgentsWebSocket.js +39 -3
  277. package/lib/hooks/useAgentRuntimes.d.ts +15 -3
  278. package/lib/hooks/useAgentRuntimes.js +188 -29
  279. package/lib/hooks/useAgentsCatalog.d.ts +3 -3
  280. package/lib/hooks/useAgentsCatalog.js +4 -4
  281. package/lib/hooks/useAgentsService.js +5 -5
  282. package/lib/hooks/useCellOutputshot.d.ts +4 -0
  283. package/lib/hooks/useCellOutputshot.js +25 -0
  284. package/lib/hooks/useCheckpoints.d.ts +8 -8
  285. package/lib/hooks/useCheckpoints.js +38 -28
  286. package/lib/hooks/useConfig.d.ts +1 -1
  287. package/lib/hooks/useMonitoring.d.ts +7 -5
  288. package/lib/hooks/useMonitoring.js +16 -10
  289. package/lib/hooks/useNotifications.d.ts +11 -11
  290. package/lib/hooks/useNotifications.js +1 -1
  291. package/lib/hooks/useProgressStore.d.ts +25 -0
  292. package/lib/hooks/useProgressStore.js +58 -0
  293. package/lib/hooks/useProgressTask.d.ts +9 -0
  294. package/lib/hooks/useProgressTask.js +41 -0
  295. package/lib/hooks/useProjects.d.ts +628 -0
  296. package/lib/hooks/useProjects.js +190 -0
  297. package/lib/hooks/useRuntimes.d.ts +5 -0
  298. package/lib/hooks/useRuntimes.js +34 -0
  299. package/lib/hooks/useToolApprovals.d.ts +14 -6
  300. package/lib/hooks/useToolApprovals.js +20 -1
  301. package/lib/index.d.ts +2 -1
  302. package/lib/index.js +1 -0
  303. package/lib/jupyter/exec/Python.d.ts +5 -0
  304. package/lib/jupyter/exec/Python.js +100 -0
  305. package/lib/jupyter/exec/Snippets.d.ts +105 -0
  306. package/lib/jupyter/exec/Snippets.js +101 -0
  307. package/lib/jupyter/exec/index.d.ts +2 -0
  308. package/lib/jupyter/exec/index.js +6 -0
  309. package/lib/jupyter/index.d.ts +2 -0
  310. package/lib/jupyter/index.js +6 -0
  311. package/lib/jupyter/kernelsHandler.d.ts +8 -0
  312. package/lib/jupyter/kernelsHandler.js +39 -0
  313. package/lib/mocks/models/CourseMock.d.ts +6 -0
  314. package/lib/mocks/models/CourseMock.js +29 -0
  315. package/lib/mocks/models/SpaceMock.d.ts +6 -0
  316. package/lib/mocks/models/SpaceMock.js +25 -0
  317. package/lib/models/Assignment.d.ts +7 -0
  318. package/lib/models/Assignment.js +5 -0
  319. package/lib/models/Cell.d.ts +8 -0
  320. package/lib/models/Cell.js +5 -0
  321. package/lib/models/CodeBlock.d.ts +10 -0
  322. package/lib/models/CodeBlock.js +5 -0
  323. package/lib/models/CodeSandboxSnapshot.d.ts +92 -0
  324. package/lib/models/CodeSandboxSnapshot.js +13 -0
  325. package/lib/models/CodeSandboxSnapshotDTO.d.ts +173 -0
  326. package/lib/models/CodeSandboxSnapshotDTO.js +139 -0
  327. package/lib/models/CodefeedBlocks.d.ts +7 -0
  328. package/lib/models/CodefeedBlocks.js +5 -0
  329. package/lib/models/Content.d.ts +5 -0
  330. package/lib/models/Content.js +5 -0
  331. package/lib/models/Course.d.ts +17 -0
  332. package/lib/models/Course.js +5 -0
  333. package/lib/models/Dataset.d.ts +16 -0
  334. package/lib/models/Dataset.js +5 -0
  335. package/lib/models/Document.d.ts +8 -0
  336. package/lib/models/Document.js +5 -0
  337. package/lib/models/Environment.d.ts +86 -0
  338. package/lib/models/Environment.js +5 -0
  339. package/lib/models/EnvironmentDTO.d.ts +125 -0
  340. package/lib/models/EnvironmentDTO.js +88 -0
  341. package/lib/models/Exercise.d.ts +16 -0
  342. package/lib/models/Exercise.js +5 -0
  343. package/lib/models/Item.d.ts +20 -0
  344. package/lib/models/Item.js +5 -0
  345. package/lib/models/ItemDTO.d.ts +74 -0
  346. package/lib/models/ItemDTO.js +186 -0
  347. package/lib/models/ItemType.d.ts +2 -0
  348. package/lib/models/ItemType.js +5 -0
  349. package/lib/models/Lesson.d.ts +5 -0
  350. package/lib/models/Lesson.js +5 -0
  351. package/lib/models/LexicalDTO.d.ts +155 -0
  352. package/lib/models/LexicalDTO.js +157 -0
  353. package/lib/models/Library.d.ts +10 -0
  354. package/lib/models/Library.js +5 -0
  355. package/lib/models/Notebook.d.ts +11 -0
  356. package/lib/models/Notebook.js +5 -0
  357. package/lib/models/NotebookDTO.d.ts +96 -0
  358. package/lib/models/NotebookDTO.js +153 -0
  359. package/lib/models/Page.d.ts +41 -0
  360. package/lib/models/Page.js +25 -0
  361. package/lib/models/PageTag.d.ts +19 -0
  362. package/lib/models/PageTag.js +94 -0
  363. package/lib/models/ProjectDTO.d.ts +89 -0
  364. package/lib/models/ProjectDTO.js +131 -0
  365. package/lib/models/Runtime.d.ts +160 -0
  366. package/lib/models/Runtime.js +18 -0
  367. package/lib/models/RuntimeDTO.d.ts +172 -0
  368. package/lib/models/RuntimeDTO.js +204 -0
  369. package/lib/models/Space.d.ts +35 -0
  370. package/lib/models/Space.js +66 -0
  371. package/lib/models/SpaceDTO.d.ts +334 -0
  372. package/lib/models/SpaceDTO.js +244 -0
  373. package/lib/models/SpaceItem.d.ts +10 -0
  374. package/lib/models/SpaceItem.js +5 -0
  375. package/lib/models/SpaceMember.d.ts +6 -0
  376. package/lib/models/SpaceMember.js +5 -0
  377. package/lib/models/StudentItem.d.ts +21 -0
  378. package/lib/models/StudentItem.js +5 -0
  379. package/lib/models/index.d.ts +32 -0
  380. package/lib/models/index.js +39 -0
  381. package/lib/protocols/AGUIAdapter.js +1 -1
  382. package/lib/runtimes/actions.d.ts +102 -0
  383. package/lib/runtimes/actions.js +249 -0
  384. package/lib/runtimes/apis.d.ts +273 -0
  385. package/lib/runtimes/apis.js +5 -0
  386. package/lib/runtimes/index.d.ts +5 -0
  387. package/lib/runtimes/index.js +9 -0
  388. package/lib/runtimes/settings.d.ts +15 -0
  389. package/lib/runtimes/settings.js +31 -0
  390. package/lib/runtimes/snapshots.d.ts +25 -0
  391. package/lib/runtimes/snapshots.js +150 -0
  392. package/lib/runtimes/utils.d.ts +7 -0
  393. package/lib/runtimes/utils.js +14 -0
  394. package/lib/services/DatalayerServiceManager.d.ts +23 -0
  395. package/lib/services/DatalayerServiceManager.js +90 -0
  396. package/lib/services/reconnectToRuntime.d.ts +32 -0
  397. package/lib/services/reconnectToRuntime.js +59 -0
  398. package/lib/services/sandboxServiceManagers.d.ts +31 -0
  399. package/lib/services/sandboxServiceManagers.js +57 -0
  400. package/lib/specs/agents/agents.d.ts +95 -50
  401. package/lib/specs/agents/agents.js +4037 -1669
  402. package/lib/specs/agents/index.d.ts +5 -5
  403. package/lib/specs/agents/index.js +9 -9
  404. package/lib/specs/index.d.ts +1 -0
  405. package/lib/specs/index.js +1 -0
  406. package/lib/specs/loops.d.ts +34 -0
  407. package/lib/specs/loops.js +188 -0
  408. package/lib/specs/mcpServers.d.ts +1 -0
  409. package/lib/specs/mcpServers.js +17 -0
  410. package/lib/specs/models.d.ts +4 -0
  411. package/lib/specs/models.js +30 -0
  412. package/lib/specs/skills.d.ts +1 -0
  413. package/lib/specs/skills.js +18 -0
  414. package/lib/specs/tools.d.ts +15 -0
  415. package/lib/specs/tools.js +285 -0
  416. package/lib/state/index.d.ts +4 -0
  417. package/lib/state/index.js +10 -0
  418. package/lib/state/substates/CellState.d.ts +12 -0
  419. package/lib/state/substates/CellState.js +22 -0
  420. package/lib/state/substates/DocumentState.d.ts +10 -0
  421. package/lib/state/substates/DocumentState.js +14 -0
  422. package/lib/state/substates/GradeState.d.ts +10 -0
  423. package/lib/state/substates/GradeState.js +14 -0
  424. package/lib/state/substates/JupyterLabState.d.ts +16 -0
  425. package/lib/state/substates/JupyterLabState.js +17 -0
  426. package/lib/state/substates/NbformatState.d.ts +13 -0
  427. package/lib/state/substates/NbformatState.js +16 -0
  428. package/lib/state/substates/RuntimesState.d.ts +87 -0
  429. package/lib/state/substates/RuntimesState.js +192 -0
  430. package/lib/state/substates/SpaceState.d.ts +11 -0
  431. package/lib/state/substates/SpaceState.js +16 -0
  432. package/lib/state/substates/index.d.ts +8 -0
  433. package/lib/state/substates/index.js +14 -0
  434. package/lib/stores/agentRuntimeStore.d.ts +25 -2
  435. package/lib/stores/agentRuntimeStore.js +114 -19
  436. package/lib/stories/Button.stories.d.ts +1 -1
  437. package/lib/stories/Header.stories.d.ts +3 -3
  438. package/lib/test-setup.js +10 -0
  439. package/lib/types/agents-lifecycle.d.ts +5 -5
  440. package/lib/types/agents.d.ts +6 -6
  441. package/lib/types/agentspecs.d.ts +8 -4
  442. package/lib/types/chat.d.ts +135 -3
  443. package/lib/types/config.d.ts +19 -1
  444. package/lib/types/index.d.ts +1 -0
  445. package/lib/types/index.js +1 -0
  446. package/lib/types/loops.d.ts +64 -0
  447. package/lib/types/loops.js +5 -0
  448. package/lib/types/teams.d.ts +2 -2
  449. package/lib/types/tools.d.ts +16 -0
  450. package/lib/utils/Cells.d.ts +2 -0
  451. package/lib/utils/Cells.js +28 -0
  452. package/package.json +24 -18
  453. package/scripts/codegen/generate_agents.py +96 -61
  454. package/scripts/codegen/generate_loops.py +443 -0
  455. package/scripts/codegen/generate_teams.py +4 -4
  456. package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -3
  457. package/lib/examples/A2UiComponentGalleryExample.js +0 -361
  458. package/scripts/codegen/__pycache__/generate_agents.cpython-313.pyc +0 -0
  459. package/scripts/codegen/__pycache__/generate_benchmarks.cpython-313.pyc +0 -0
  460. package/scripts/codegen/__pycache__/generate_evals.cpython-313.pyc +0 -0
  461. package/scripts/codegen/__pycache__/generate_events.cpython-313.pyc +0 -0
  462. /package/lib/{agent-lexical-main.d.ts → agent-document-main.d.ts} +0 -0
@@ -42,15 +42,15 @@ import { ChatInlinePlugin } from '../lexical/ChatInlinePlugin';
42
42
  import { useChatInlineToolbarItems } from '../lexical/useChatInlineToolbarItems';
43
43
  import { useLexicalTools } from '../tools/adapters/agent-runtimes/lexicalHooks';
44
44
  import { editorConfig } from './lexical/editorConfig';
45
+ import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
46
+ import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
45
47
  import { DEFAULT_MODEL } from '../specs';
46
48
  import '@datalayer/jupyter-lexical/style/index.css';
47
49
  import './lexical/lexical-theme.css';
48
50
  // Fixed lexical document ID
49
51
  const LEXICAL_ID = 'chat-lexical-example';
50
52
  // Default configuration
51
- const DEFAULT_BASE_URL = import.meta.env.VITE_BASE_URL || 'http://localhost:8765';
52
53
  const DEFAULT_AGENT_ID = import.meta.env.VITE_AGENT_ID || 'lexical-sidebar-agent-runtime-example';
53
- const VERCEL_AI_ENDPOINT = `${DEFAULT_BASE_URL}/api/v1/vercel-ai/${DEFAULT_AGENT_ID}`;
54
54
  function getJupyterSandboxUrl(serviceManager) {
55
55
  const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
56
56
  if (envUrl) {
@@ -70,70 +70,6 @@ function getJupyterSandboxUrl(serviceManager) {
70
70
  const separator = baseUrl.includes('?') ? '&' : '?';
71
71
  return `${baseUrl}${separator}token=${encodeURIComponent(token)}`;
72
72
  }
73
- function useEnsureAgent(agentId, baseUrl, jupyterSandboxUrl) {
74
- const [isReady, setIsReady] = useState(false);
75
- const [error, setError] = useState(null);
76
- useEffect(() => {
77
- let mounted = true;
78
- async function ensureAgent() {
79
- try {
80
- if (!jupyterSandboxUrl) {
81
- if (mounted) {
82
- setError('Could not detect Jupyter server URL from Lexical service manager.');
83
- setIsReady(false);
84
- }
85
- return;
86
- }
87
- const response = await fetch(`${baseUrl}/api/v1/agents`, {
88
- method: 'POST',
89
- headers: {
90
- 'Content-Type': 'application/json',
91
- },
92
- body: JSON.stringify({
93
- name: agentId,
94
- description: 'Demo agent for lexical sidebar example',
95
- agent_library: 'pydantic-ai',
96
- transport: 'vercel-ai',
97
- model: DEFAULT_MODEL,
98
- system_prompt: 'You are a helpful AI assistant that helps users work with lexical documents. For document operations, always use the lexical frontend tools so actions happen in the live document UI. Use executeCode only for temporary inspection code that should not modify persisted document content.',
99
- enable_codemode: false,
100
- sandbox_variant: 'jupyter',
101
- jupyter_sandbox: jupyterSandboxUrl,
102
- }),
103
- });
104
- if (mounted) {
105
- if (response.ok) {
106
- console.warn(`[LexicalAgentSidebarExample] Created agent: ${agentId}`);
107
- setError(null);
108
- setIsReady(true);
109
- }
110
- else if (response.status === 409 || response.status === 400) {
111
- console.warn(`[LexicalAgentSidebarExample] Reusing existing agent: ${agentId}`);
112
- setError(null);
113
- setIsReady(true);
114
- }
115
- else {
116
- const errorData = await response.json().catch(() => ({}));
117
- setError(errorData.detail || `Failed to create agent: ${response.status}`);
118
- setIsReady(false);
119
- }
120
- }
121
- }
122
- catch (err) {
123
- if (mounted) {
124
- console.error('[LexicalAgentSidebarExample] Error creating agent:', err);
125
- setError(err instanceof Error ? err.message : 'Failed to connect to server');
126
- setIsReady(false);
127
- }
128
- }
129
- }
130
- void ensureAgent();
131
- return () => {
132
- mounted = false;
133
- };
134
- }, [agentId, baseUrl, jupyterSandboxUrl]);
135
- return { isReady, error };
136
- }
137
73
  /**
138
74
  * Lexical plugin for code highlighting
139
75
  */
@@ -144,7 +80,7 @@ function CodeHighlightingPlugin() {
144
80
  }, [editor]);
145
81
  return null;
146
82
  }
147
- function LexicalEditor({ serviceManager }) {
83
+ function LexicalEditor({ serviceManager, endpoint }) {
148
84
  const [floatingAnchorElem, setFloatingAnchorElem] = useState(null);
149
85
  const [_isLinkEditMode, setIsLinkEditMode] = useState(false);
150
86
  // AI actions registered as toolbar items
@@ -177,24 +113,60 @@ function LexicalEditor({ serviceManager }) {
177
113
  pointerEvents: 'none',
178
114
  }, children: "Start typing or use the chat to create content..." }), ErrorBoundary: LexicalErrorBoundary }), _jsx(HistoryPlugin, {}), _jsx(AutoFocusPlugin, {}), _jsx(OnChangePlugin, { onChange: onChange }), _jsx(MarkdownShortcutPlugin, { transformers: TRANSFORMERS }), _jsx(CodeHighlightingPlugin, {}), _jsx(ListPlugin, {}), _jsx(CheckListPlugin, {}), _jsx(LinkPlugin, {}), _jsx(TablePlugin, {}), _jsx(TableCellResizerPlugin, {}), _jsx(JupyterCellPlugin, {}), _jsx(JupyterInputOutputPlugin, {}), _jsx(ImagesPlugin, {}), _jsx(HorizontalRulePlugin, {}), _jsx(EquationsPlugin, {}), _jsx(YouTubePlugin, {}), _jsx(ExcalidrawPlugin, {}), _jsx(CollapsiblePlugin, {}), _jsx(AutoLinkPlugin, {}), _jsx(AutoEmbedPlugin, {}), _jsx(ListMaxIndentLevelPlugin, { maxDepth: 7 }), floatingAnchorElem && (_jsxs(_Fragment, { children: [_jsx(ComponentPickerMenuPlugin, {}), _jsx(DraggableBlockPlugin, { anchorElem: floatingAnchorElem }), _jsx(FloatingTextFormatToolbarPlugin, { anchorElem: floatingAnchorElem, setIsLinkEditMode: setIsLinkEditMode, extraItems: toolbarItems }), _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem })] })), _jsx(ChatInlinePlugin, { protocol: {
179
115
  type: 'vercel-ai',
180
- endpoint: VERCEL_AI_ENDPOINT,
116
+ endpoint,
181
117
  }, isOpen: isAiOpen, onClose: closeAi, pendingPrompt: pendingPrompt, onPendingPromptConsumed: clearPendingPrompt })] })] }) }));
182
118
  }
183
119
  export function ChatLexicalAgentExampleInner({ serviceManager, }) {
120
+ const baseUrl = useExampleAgentRuntimesUrl();
121
+ const vercelAiEndpoint = `${baseUrl}/api/v1/vercel-ai/${DEFAULT_AGENT_ID}`;
122
+ const [createRequested, setCreateRequested] = useState(false);
184
123
  const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
185
- const { isReady, error } = useEnsureAgent(DEFAULT_AGENT_ID, DEFAULT_BASE_URL, jupyterSandboxUrl);
124
+ const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
125
+ exampleId: 'LexicalAgentSidebarExample',
126
+ agentName: DEFAULT_AGENT_ID,
127
+ autoCreateAgent: false,
128
+ agentConfig: {
129
+ name: DEFAULT_AGENT_ID,
130
+ description: 'Demo agent for lexical sidebar example',
131
+ protocol: 'vercel-ai',
132
+ model: DEFAULT_MODEL,
133
+ systemPrompt: 'You are a helpful AI assistant that helps users work with lexical documents. For document operations, always use the lexical frontend tools so actions happen in the live document UI. Use executeCode only for temporary inspection code that should not modify persisted document content.',
134
+ enableCodemode: false,
135
+ sandboxVariant: 'jupyter',
136
+ jupyterSandbox: jupyterSandboxUrl,
137
+ },
138
+ });
139
+ useEffect(() => {
140
+ if (!jupyterSandboxUrl || createRequested || agentId) {
141
+ return;
142
+ }
143
+ setCreateRequested(true);
144
+ void createAgent({
145
+ name: DEFAULT_AGENT_ID,
146
+ description: 'Demo agent for lexical sidebar example',
147
+ protocol: 'vercel-ai',
148
+ model: DEFAULT_MODEL,
149
+ systemPrompt: 'You are a helpful AI assistant that helps users work with lexical documents. For document operations, always use the lexical frontend tools so actions happen in the live document UI. Use executeCode only for temporary inspection code that should not modify persisted document content.',
150
+ enableCodemode: false,
151
+ sandboxVariant: 'jupyter',
152
+ jupyterSandbox: jupyterSandboxUrl,
153
+ }).catch(() => {
154
+ setCreateRequested(false);
155
+ });
156
+ }, [jupyterSandboxUrl, createRequested, agentId, createAgent]);
157
+ const effectiveReady = isReady || status === 'ready';
186
158
  // Get lexical tools for ChatSidebar
187
159
  const tools = useLexicalTools(LEXICAL_ID);
188
160
  // Build Vercel AI protocol config
189
161
  const protocolConfig = useMemo(() => {
190
162
  return {
191
163
  type: 'vercel-ai',
192
- endpoint: VERCEL_AI_ENDPOINT,
164
+ endpoint: vercelAiEndpoint,
193
165
  agentId: DEFAULT_AGENT_ID,
194
166
  enableConfigQuery: true,
195
- configEndpoint: `${DEFAULT_BASE_URL}/api/v1/configure`,
167
+ configEndpoint: `${baseUrl}/api/v1/configure`,
196
168
  };
197
- }, []);
169
+ }, [baseUrl, vercelAiEndpoint]);
198
170
  return (_jsxs(_Fragment, { children: [_jsxs(Box, { sx: {
199
171
  height: 'calc(100vh - 70px)',
200
172
  width: '100vw',
@@ -215,7 +187,7 @@ export function ChatLexicalAgentExampleInner({ serviceManager, }) {
215
187
  display: 'flex',
216
188
  overflow: 'hidden',
217
189
  bg: 'canvas.default',
218
- }, children: _jsx(LexicalEditor, { serviceManager: serviceManager }) })] }), isReady && (_jsx(ChatSidebar, { title: "AI Assistant", protocol: protocolConfig, position: "right", width: 400, showNewChatButton: true, showClearButton: true, showSettingsButton: true, defaultOpen: true, panelProps: {
190
+ }, children: _jsx(LexicalEditor, { serviceManager: serviceManager, endpoint: vercelAiEndpoint }) })] }), effectiveReady && (_jsx(ChatSidebar, { title: "AI Assistant", protocol: protocolConfig, position: "right", width: 400, showNewChatButton: true, showClearButton: true, showSettingsButton: true, defaultOpen: true, panelProps: {
219
191
  protocol: protocolConfig,
220
192
  frontendTools: tools,
221
193
  useStore: true,
@@ -15,13 +15,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
15
  *
16
16
  * @module examples/NotebookAgentExample
17
17
  */
18
- import React, { useEffect, useMemo, useState } from 'react';
18
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
19
19
  import { Box } from '@datalayer/primer-addons';
20
20
  import { Notebook } from '@datalayer/jupyter-react';
21
21
  import { ThemedJupyterProvider } from './utils/themedProvider';
22
22
  // Agent-runtimes imports
23
23
  import { ChatFloating } from '../chat';
24
24
  import { useNotebookTools } from '../tools/adapters/agent-runtimes/notebookHooks';
25
+ import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
26
+ import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
25
27
  // Import Matplotlib notebook
26
28
  import MatplotlibNotebook from './utils/notebooks/Matplotlib.ipynb.json';
27
29
  import { DEFAULT_MODEL } from '../specs';
@@ -29,11 +31,7 @@ import { DEFAULT_MODEL } from '../specs';
29
31
  const NOTEBOOK_ID = 'agui-notebook-example';
30
32
  // Use the imported Matplotlib notebook
31
33
  const NOTEBOOK_CONTENT = MatplotlibNotebook;
32
- // Base URL for agent-runtimes server
33
- const BASE_URL = 'http://localhost:8765';
34
34
  const AGENT_ID = 'notebook-agent-runtime-example';
35
- // Vercel AI endpoint
36
- const VERCEL_AI_ENDPOINT = `${BASE_URL}/api/v1/vercel-ai/${AGENT_ID}`;
37
35
  function getJupyterSandboxUrl(serviceManager) {
38
36
  const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
39
37
  if (envUrl) {
@@ -53,74 +51,7 @@ function getJupyterSandboxUrl(serviceManager) {
53
51
  const separator = baseUrl.includes('?') ? '&' : '?';
54
52
  return `${baseUrl}${separator}token=${encodeURIComponent(token)}`;
55
53
  }
56
- /**
57
- * Hook to ensure the example-agent is aligned with the active notebook runtime.
58
- * Recreates the agent with jupyter sandbox settings from the Notebook UI.
59
- */
60
- function useEnsureAgent(agentId, baseUrl, jupyterSandboxUrl) {
61
- const [isReady, setIsReady] = useState(false);
62
- const [error, setError] = useState(null);
63
- useEffect(() => {
64
- let mounted = true;
65
- async function ensureAgent() {
66
- try {
67
- if (!jupyterSandboxUrl) {
68
- if (mounted) {
69
- setError('Could not detect Jupyter server URL from Notebook service manager.');
70
- setIsReady(false);
71
- }
72
- return;
73
- }
74
- const response = await fetch(`${baseUrl}/api/v1/agents`, {
75
- method: 'POST',
76
- headers: {
77
- 'Content-Type': 'application/json',
78
- },
79
- body: JSON.stringify({
80
- name: agentId,
81
- description: 'Demo agent for notebook example',
82
- agent_library: 'pydantic-ai',
83
- transport: 'vercel-ai',
84
- model: DEFAULT_MODEL,
85
- system_prompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
86
- enable_codemode: false,
87
- sandbox_variant: 'jupyter',
88
- jupyter_sandbox: jupyterSandboxUrl,
89
- }),
90
- });
91
- if (mounted) {
92
- if (response.ok) {
93
- console.warn(`[AgentRuntimeExample] Created agent: ${agentId}`);
94
- setError(null);
95
- setIsReady(true);
96
- }
97
- else if (response.status === 409 || response.status === 400) {
98
- // Agent already exists; reuse it and continue.
99
- console.warn(`[AgentRuntimeExample] Reusing existing agent: ${agentId}`);
100
- setError(null);
101
- setIsReady(true);
102
- }
103
- else {
104
- const errorData = await response.json().catch(() => ({}));
105
- setError(errorData.detail || `Failed to create agent: ${response.status}`);
106
- }
107
- }
108
- }
109
- catch (err) {
110
- if (mounted) {
111
- console.error('[AgentRuntimeExample] Error creating agent:', err);
112
- setError(err instanceof Error ? err.message : 'Failed to connect to server');
113
- }
114
- }
115
- }
116
- ensureAgent();
117
- return () => {
118
- mounted = false;
119
- };
120
- }, [agentId, baseUrl, jupyterSandboxUrl]);
121
- return { isReady, error };
122
- }
123
- const NotebookUI = React.memo(function NotebookUI({ serviceManager, }) {
54
+ const NotebookUI = React.memo(function NotebookUI({ serviceManager, onSessionConnection, }) {
124
55
  return (_jsxs(Box, { sx: {
125
56
  flex: 1,
126
57
  display: 'flex',
@@ -138,19 +69,57 @@ const NotebookUI = React.memo(function NotebookUI({ serviceManager, }) {
138
69
  borderRadius: 2,
139
70
  padding: 3,
140
71
  backgroundColor: 'canvas.default',
141
- }, children: serviceManager ? (_jsx(ThemedJupyterProvider, { children: _jsx(Notebook, { nbformat: NOTEBOOK_CONTENT, id: NOTEBOOK_ID, serviceManager: serviceManager, height: "calc(100vh - 300px)", cellSidebarMargin: 120, startDefaultKernel: true }) })) : (_jsx(Box, { sx: { padding: 3 }, children: _jsx("p", { children: "Loading service manager..." }) })) })] }));
72
+ }, children: serviceManager ? (_jsx(ThemedJupyterProvider, { children: _jsx(Notebook, { nbformat: NOTEBOOK_CONTENT, id: NOTEBOOK_ID, serviceManager: serviceManager, onSessionConnection: onSessionConnection, height: "calc(100vh - 300px)", cellSidebarMargin: 120, startDefaultKernel: true }) })) : (_jsx(Box, { sx: { padding: 3 }, children: _jsx("p", { children: "Loading service manager..." }) })) })] }));
142
73
  });
143
74
  function NotebookWithChat({ serviceManager, }) {
75
+ const baseUrl = useExampleAgentRuntimesUrl();
144
76
  const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
145
- // Ensure the agent exists before rendering chat
146
- const { isReady, error } = useEnsureAgent(AGENT_ID, BASE_URL, jupyterSandboxUrl);
77
+ const [createRequested, setCreateRequested] = useState(false);
78
+ const [notebookKernel, setNotebookKernel] = useState(null);
79
+ const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
80
+ exampleId: 'NotebookAgentExample',
81
+ agentName: AGENT_ID,
82
+ autoCreateAgent: false,
83
+ agentConfig: {
84
+ name: AGENT_ID,
85
+ description: 'Demo agent for notebook example',
86
+ protocol: 'vercel-ai',
87
+ model: DEFAULT_MODEL,
88
+ systemPrompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
89
+ enableCodemode: false,
90
+ sandboxVariant: 'jupyter',
91
+ jupyterSandbox: jupyterSandboxUrl,
92
+ },
93
+ });
94
+ useEffect(() => {
95
+ if (!jupyterSandboxUrl || createRequested || agentId) {
96
+ return;
97
+ }
98
+ setCreateRequested(true);
99
+ void createAgent({
100
+ name: AGENT_ID,
101
+ description: 'Demo agent for notebook example',
102
+ protocol: 'vercel-ai',
103
+ model: DEFAULT_MODEL,
104
+ systemPrompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
105
+ enableCodemode: false,
106
+ sandboxVariant: 'jupyter',
107
+ jupyterSandbox: jupyterSandboxUrl,
108
+ }).catch(() => {
109
+ setCreateRequested(false);
110
+ });
111
+ }, [jupyterSandboxUrl, createRequested, agentId, createAgent]);
112
+ const effectiveReady = isReady || status === 'ready';
113
+ const handleSessionConnection = useCallback((session) => {
114
+ setNotebookKernel(session?.kernel ?? null);
115
+ }, []);
147
116
  const protocolConfig = useMemo(() => ({
148
117
  type: 'vercel-ai',
149
- endpoint: VERCEL_AI_ENDPOINT,
118
+ endpoint: `${baseUrl}/api/v1/vercel-ai/${AGENT_ID}`,
150
119
  agentId: AGENT_ID,
151
120
  enableConfigQuery: true,
152
- configEndpoint: `${BASE_URL}/api/v1/configure`,
153
- }), []);
121
+ configEndpoint: `${baseUrl}/api/v1/configure`,
122
+ }), [baseUrl]);
154
123
  // Get notebook tools for ChatFloating
155
124
  const frontendTools = useNotebookTools(NOTEBOOK_ID);
156
125
  return (_jsxs(Box, { sx: {
@@ -158,7 +127,7 @@ function NotebookWithChat({ serviceManager, }) {
158
127
  width: '100%',
159
128
  display: 'flex',
160
129
  overflow: 'hidden',
161
- }, children: [_jsx(NotebookUI, { serviceManager: serviceManager }), error && (_jsxs(Box, { sx: {
130
+ }, children: [_jsx(NotebookUI, { serviceManager: serviceManager, onSessionConnection: handleSessionConnection }), error && (_jsxs(Box, { sx: {
162
131
  position: 'fixed',
163
132
  bottom: 20,
164
133
  right: 20,
@@ -167,7 +136,9 @@ function NotebookWithChat({ serviceManager, }) {
167
136
  color: 'danger.fg',
168
137
  borderRadius: 2,
169
138
  maxWidth: 300,
170
- }, children: [_jsx("strong", { children: "Error:" }), " ", error] })), isReady && (_jsx(ChatFloating, { protocol: protocolConfig, title: "Notebook AI Agent Runtime", description: "Hi! I can help you edit notebook cells. Try: 'Add a new code cell', 'Run cell 1', or 'Delete the last cell'", defaultOpen: true, defaultViewMode: "panel", position: "bottom-right", frontendTools: frontendTools, useStore: false, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, suggestions: [
139
+ }, children: [_jsx("strong", { children: "Error:" }), " ", error] })), effectiveReady && (_jsx(ChatFloating, { protocol: protocolConfig, title: "Notebook AI Agent Runtime", description: "Hi! I can help you edit notebook cells. Try: 'Add a new code cell', 'Run cell 1', or 'Delete the last cell'", defaultOpen: true, defaultViewMode: "panel", position: "bottom-right", frontendTools: frontendTools, useStore: false, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, panelProps: {
140
+ kernel: notebookKernel,
141
+ }, suggestions: [
171
142
  {
172
143
  title: 'Add a cell',
173
144
  message: 'Insert a random cell to the notebook',
@@ -25,15 +25,15 @@ import { useNotebookTools } from '../tools/adapters/agent-runtimes/notebookHooks
25
25
  import { ThemedJupyterProvider } from './utils/themedProvider';
26
26
  import { ChatSidebar } from '../chat';
27
27
  import { DEFAULT_MODEL } from '../specs';
28
+ import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
29
+ import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
28
30
  import MatplotlibNotebook from './utils/notebooks/Matplotlib.ipynb.json';
29
31
  // Fixed notebook ID
30
32
  const NOTEBOOK_ID = 'chat-notebook-example';
31
33
  // Use the imported Matplotlib notebook
32
34
  const NOTEBOOK_CONTENT = MatplotlibNotebook;
33
35
  // Default configuration
34
- const DEFAULT_BASE_URL = import.meta.env.VITE_BASE_URL || 'http://localhost:8765';
35
36
  const DEFAULT_AGENT_ID = import.meta.env.VITE_AGENT_ID || 'notebook-sidebar-agent-runtime-example';
36
- const VERCEL_AI_ENDPOINT = `${DEFAULT_BASE_URL}/api/v1/vercel-ai/${DEFAULT_AGENT_ID}`;
37
37
  function getJupyterSandboxUrl(serviceManager) {
38
38
  const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
39
39
  if (envUrl) {
@@ -53,70 +53,6 @@ function getJupyterSandboxUrl(serviceManager) {
53
53
  const separator = baseUrl.includes('?') ? '&' : '?';
54
54
  return `${baseUrl}${separator}token=${encodeURIComponent(token)}`;
55
55
  }
56
- function useEnsureAgent(agentId, baseUrl, jupyterSandboxUrl) {
57
- const [isReady, setIsReady] = useState(false);
58
- const [error, setError] = useState(null);
59
- useEffect(() => {
60
- let mounted = true;
61
- async function ensureAgent() {
62
- try {
63
- if (!jupyterSandboxUrl) {
64
- if (mounted) {
65
- setError('Could not detect Jupyter server URL from Notebook service manager.');
66
- setIsReady(false);
67
- }
68
- return;
69
- }
70
- const response = await fetch(`${baseUrl}/api/v1/agents`, {
71
- method: 'POST',
72
- headers: {
73
- 'Content-Type': 'application/json',
74
- },
75
- body: JSON.stringify({
76
- name: agentId,
77
- description: 'Demo agent for notebook sidebar example',
78
- agent_library: 'pydantic-ai',
79
- transport: 'vercel-ai',
80
- model: DEFAULT_MODEL,
81
- system_prompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
82
- enable_codemode: false,
83
- sandbox_variant: 'jupyter',
84
- jupyter_sandbox: jupyterSandboxUrl,
85
- }),
86
- });
87
- if (mounted) {
88
- if (response.ok) {
89
- console.warn(`[NotebookAgentSidebarExample] Created agent: ${agentId}`);
90
- setError(null);
91
- setIsReady(true);
92
- }
93
- else if (response.status === 409 || response.status === 400) {
94
- console.warn(`[NotebookAgentSidebarExample] Reusing existing agent: ${agentId}`);
95
- setError(null);
96
- setIsReady(true);
97
- }
98
- else {
99
- const errorData = await response.json().catch(() => ({}));
100
- setError(errorData.detail || `Failed to create agent: ${response.status}`);
101
- setIsReady(false);
102
- }
103
- }
104
- }
105
- catch (err) {
106
- if (mounted) {
107
- console.error('[NotebookAgentSidebarExample] Error creating agent:', err);
108
- setError(err instanceof Error ? err.message : 'Failed to connect to server');
109
- setIsReady(false);
110
- }
111
- }
112
- }
113
- void ensureAgent();
114
- return () => {
115
- mounted = false;
116
- };
117
- }, [agentId, baseUrl, jupyterSandboxUrl]);
118
- return { isReady, error };
119
- }
120
56
  function NotebookUI({ serviceManager }) {
121
57
  if (!serviceManager) {
122
58
  return (_jsx(Box, { sx: {
@@ -130,20 +66,56 @@ function NotebookUI({ serviceManager }) {
130
66
  return (_jsx(Notebook, { nbformat: NOTEBOOK_CONTENT, id: NOTEBOOK_ID, serviceManager: serviceManager, height: "100%", cellSidebarMargin: 120, startDefaultKernel: true }));
131
67
  }
132
68
  export function AgentRuntimeNotebookExampleInner({ serviceManager, }) {
69
+ const baseUrl = useExampleAgentRuntimesUrl();
70
+ const vercelAiEndpoint = `${baseUrl}/api/v1/vercel-ai/${DEFAULT_AGENT_ID}`;
71
+ const [createRequested, setCreateRequested] = useState(false);
133
72
  const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
134
- const { isReady, error } = useEnsureAgent(DEFAULT_AGENT_ID, DEFAULT_BASE_URL, jupyterSandboxUrl);
73
+ const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
74
+ exampleId: 'NotebookAgentSidebarExample',
75
+ agentName: DEFAULT_AGENT_ID,
76
+ autoCreateAgent: false,
77
+ agentConfig: {
78
+ name: DEFAULT_AGENT_ID,
79
+ description: 'Demo agent for notebook sidebar example',
80
+ protocol: 'vercel-ai',
81
+ model: DEFAULT_MODEL,
82
+ systemPrompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
83
+ enableCodemode: false,
84
+ sandboxVariant: 'jupyter',
85
+ jupyterSandbox: jupyterSandboxUrl,
86
+ },
87
+ });
88
+ useEffect(() => {
89
+ if (!jupyterSandboxUrl || createRequested || agentId) {
90
+ return;
91
+ }
92
+ setCreateRequested(true);
93
+ void createAgent({
94
+ name: DEFAULT_AGENT_ID,
95
+ description: 'Demo agent for notebook sidebar example',
96
+ protocol: 'vercel-ai',
97
+ model: DEFAULT_MODEL,
98
+ systemPrompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
99
+ enableCodemode: false,
100
+ sandboxVariant: 'jupyter',
101
+ jupyterSandbox: jupyterSandboxUrl,
102
+ }).catch(() => {
103
+ setCreateRequested(false);
104
+ });
105
+ }, [jupyterSandboxUrl, createRequested, agentId, createAgent]);
106
+ const effectiveReady = isReady || status === 'ready';
135
107
  // Get notebook tools for ChatSidebar
136
108
  const tools = useNotebookTools(NOTEBOOK_ID);
137
109
  // Build Vercel AI protocol config
138
110
  const protocolConfig = useMemo(() => {
139
111
  return {
140
112
  type: 'vercel-ai',
141
- endpoint: VERCEL_AI_ENDPOINT,
113
+ endpoint: vercelAiEndpoint,
142
114
  agentId: DEFAULT_AGENT_ID,
143
115
  enableConfigQuery: true,
144
- configEndpoint: `${DEFAULT_BASE_URL}/api/v1/configure`,
116
+ configEndpoint: `${baseUrl}/api/v1/configure`,
145
117
  };
146
- }, []);
118
+ }, [baseUrl, vercelAiEndpoint]);
147
119
  return (_jsx(_Fragment, { children: _jsxs(Box, { sx: {
148
120
  height: 'calc(100vh - 70px)',
149
121
  width: '100vw',
@@ -171,7 +143,7 @@ export function AgentRuntimeNotebookExampleInner({ serviceManager, }) {
171
143
  borderColor: 'border.default',
172
144
  borderRadius: 2,
173
145
  overflow: 'hidden',
174
- }, children: _jsx(NotebookUI, { serviceManager: serviceManager }) }) })] }), isReady && (_jsx(ChatSidebar, { title: "AI Assistant", protocol: protocolConfig, position: "right", width: 400, showNewChatButton: true, showClearButton: true, showSettingsButton: true, defaultOpen: true, panelProps: {
146
+ }, children: _jsx(NotebookUI, { serviceManager: serviceManager }) }) })] }), effectiveReady && (_jsx(ChatSidebar, { title: "AI Assistant", protocol: protocolConfig, position: "right", width: 400, showNewChatButton: true, showClearButton: true, showSettingsButton: true, defaultOpen: true, panelProps: {
175
147
  protocol: protocolConfig,
176
148
  frontendTools: tools,
177
149
  useStore: false,
@@ -3,11 +3,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  * Copyright (c) 2025-2026 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
+ import { createDatalayerServiceManager } from '../services/DatalayerServiceManager';
6
7
  import { useState, useEffect, useMemo } from 'react';
7
8
  import { Checkbox, FormControl, Heading } from '@primer/react';
8
9
  import { Box } from '@datalayer/primer-addons';
9
- import { useCoreStore, createDatalayerServiceManager, DatalayerCollaborationProvider, } from '@datalayer/core';
10
10
  import { loadJupyterConfig, Notebook } from '@datalayer/jupyter-react';
11
+ import { DatalayerCollaborationProvider } from '../collaboration';
12
+ import { useCoreStore } from '../state';
11
13
  import { ThemedJupyterProvider } from './utils/themedProvider';
12
14
  import nbformatExample from './utils/notebooks/NotebookExample1.ipynb.json';
13
15
  // This corresponds to the notebook ID in the URL when you open an existing notbook in your library
@@ -30,7 +32,7 @@ const NotebookCollaborationExample = (props) => {
30
32
  return;
31
33
  }
32
34
  // Create DatalayerServiceManager if we have credentials
33
- if (configuration?.token && configuration?.runUrl) {
35
+ if (configuration?.token && configuration?.datalayerUrl) {
34
36
  try {
35
37
  // Now we can pass undefined to use config/defaults
36
38
  const manager = await createDatalayerServiceManager(configuration?.cpuEnvironment, configuration?.credits);
@@ -42,7 +44,7 @@ const NotebookCollaborationExample = (props) => {
42
44
  }
43
45
  }
44
46
  else {
45
- console.warn('Datalayer credentials not configured. Please set runUrl and token.');
47
+ console.warn('Datalayer credentials not configured. Please set datalayerUrl and token.');
46
48
  }
47
49
  };
48
50
  createManager();
@@ -52,20 +54,20 @@ const NotebookCollaborationExample = (props) => {
52
54
  if (!enableCollaboration) {
53
55
  return undefined;
54
56
  }
55
- const runUrl = configuration?.runUrl;
57
+ const datalayerUrl = configuration?.datalayerUrl;
56
58
  const token = configuration?.token;
57
- if (!runUrl || !token) {
58
- console.warn('Datalayer collaboration enabled but runUrl or token not configured. ' +
59
+ if (!datalayerUrl || !token) {
60
+ console.warn('Datalayer collaboration enabled but datalayerUrl or token not configured. ' +
59
61
  'Please configure them in the Datalayer store or environment.');
60
62
  return undefined;
61
63
  }
62
64
  // Create and return the Datalayer collaboration provider
63
65
  return new DatalayerCollaborationProvider({
64
- runUrl,
66
+ datalayerUrl,
65
67
  token,
66
68
  });
67
69
  }, [enableCollaboration, configuration]);
68
- return (_jsx(ThemedJupyterProvider, { children: _jsxs(Box, { p: 3, children: [_jsx(Heading, { as: "h2", sx: { mb: 3 }, children: "Notebook Collaboration Example" }), _jsx(Box, { sx: { mb: 3 }, children: _jsxs(FormControl, { children: [_jsx(Checkbox, { checked: enableCollaboration, onChange: e => setEnableCollaboration(e.target.checked) }), _jsx(FormControl.Label, { children: "Enable Datalayer Collaboration" })] }) }), (!configuration?.runUrl || !configuration?.token) && (_jsx(Box, { sx: { mb: 2, p: 2, bg: 'danger.subtle' }, children: "Warning: Datalayer configuration is missing. Please configure runUrl and token to use DatalayerServiceManager and collaboration features." })), !serviceManager && (_jsx(Box, { sx: { mb: 2, p: 2, bg: 'attention.subtle' }, children: "Note: DatalayerServiceManager is not available. Notebook functionality will be limited." })), enableCollaboration ? (_jsxs(Box, { sx: {
70
+ return (_jsx(ThemedJupyterProvider, { children: _jsxs(Box, { p: 3, children: [_jsx(Heading, { as: "h2", sx: { mb: 3 }, children: "Notebook Collaboration Example" }), _jsx(Box, { sx: { mb: 3 }, children: _jsxs(FormControl, { children: [_jsx(Checkbox, { checked: enableCollaboration, onChange: e => setEnableCollaboration(e.target.checked) }), _jsx(FormControl.Label, { children: "Enable Datalayer Collaboration" })] }) }), (!configuration?.datalayerUrl || !configuration?.token) && (_jsx(Box, { sx: { mb: 2, p: 2, bg: 'danger.subtle' }, children: "Warning: Datalayer configuration is missing. Please configure datalayerUrl and token to use DatalayerServiceManager and collaboration features." })), !serviceManager && (_jsx(Box, { sx: { mb: 2, p: 2, bg: 'attention.subtle' }, children: "Note: DatalayerServiceManager is not available. Notebook functionality will be limited." })), enableCollaboration ? (_jsxs(Box, { sx: {
69
71
  display: 'flex',
70
72
  gap: 2,
71
73
  flexDirection: 'row',
@@ -95,6 +97,6 @@ const NotebookCollaborationExample = (props) => {
95
97
  border: '1px solid',
96
98
  borderColor: 'border.default',
97
99
  borderRadius: 2,
98
- }, children: serviceManager ? (_jsx(Notebook, { id: NOTEBOOK_ID, height: "calc(100vh - 200px)", nbformat: nbformat, readonly: readonly, serviceManager: serviceManager, startDefaultKernel: true, collaborationProvider: collaborationProvider })) : (_jsx(Box, { sx: { p: 4, textAlign: 'center' }, children: "Loading ServiceManager..." })) })), _jsxs(Box, { sx: { mt: 2, fontSize: 1, color: 'fg.subtle' }, children: [_jsx("p", { children: "This example demonstrates how to use Datalayer services with Notebook:" }), _jsxs("ul", { children: [_jsxs("li", { children: [_jsx("strong", { children: "DatalayerServiceManager:" }), " Connects to Datalayer infrastructure for kernel management"] }), _jsxs("li", { children: [_jsx("strong", { children: "DatalayerCollaborationProvider:" }), " Enables real-time collaboration"] }), _jsx("li", { children: "Both require Datalayer credentials (runUrl and token)" }), _jsx("li", { children: "Pass them directly to the base Notebook component" }), _jsx("li", { children: "No wrapper components needed - just create the services and pass them as props" }), _jsx("li", { children: "This shows the explicit, composable pattern for Datalayer integration" })] })] })] }) }));
100
+ }, children: serviceManager ? (_jsx(Notebook, { id: NOTEBOOK_ID, height: "calc(100vh - 200px)", nbformat: nbformat, readonly: readonly, serviceManager: serviceManager, startDefaultKernel: true, collaborationProvider: collaborationProvider })) : (_jsx(Box, { sx: { p: 4, textAlign: 'center' }, children: "Loading ServiceManager..." })) })), _jsxs(Box, { sx: { mt: 2, fontSize: 1, color: 'fg.subtle' }, children: [_jsx("p", { children: "This example demonstrates how to use Datalayer services with Notebook:" }), _jsxs("ul", { children: [_jsxs("li", { children: [_jsx("strong", { children: "DatalayerServiceManager:" }), " Connects to Datalayer infrastructure for kernel management"] }), _jsxs("li", { children: [_jsx("strong", { children: "DatalayerCollaborationProvider:" }), " Enables real-time collaboration"] }), _jsx("li", { children: "Both require Datalayer credentials (datalayerUrl and token)" }), _jsx("li", { children: "Pass them directly to the base Notebook component" }), _jsx("li", { children: "No wrapper components needed - just create the services and pass them as props" }), _jsx("li", { children: "This shows the explicit, composable pattern for Datalayer integration" })] })] })] }) }));
99
101
  };
100
102
  export default NotebookCollaborationExample;
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /*
3
3
  * Copyright (c) 2025-2026 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
@@ -17,6 +17,9 @@ const NOTEBOOK_ID = 'notebook-example-1';
17
17
  export const JupyterNotebookExample = (props) => {
18
18
  const { serviceManager } = props;
19
19
  const extensions = useMemo(() => [new CellSidebarExtension({ factory: CellSidebarButton })], []);
20
- return (_jsxs(_Fragment, { children: [_jsx(Box, { as: "h1", children: "Jupyter Notebook Example" }), serviceManager && (_jsx(ThemedJupyterProvider, { children: _jsx(Notebook, { id: NOTEBOOK_ID, nbformat: nbformatExample, serviceManager: serviceManager, startDefaultKernel: true, extensions: extensions, Toolbar: NotebookToolbar }) }))] }));
20
+ if (!serviceManager) {
21
+ return (_jsxs(Box, { as: "h1", children: ["A Jupyter Notebook", _jsx("div", { children: "Loading..." })] }));
22
+ }
23
+ return (_jsxs(ThemedJupyterProvider, { children: [_jsx(Box, { as: "h1", children: "A Jupyter Notebook" }), _jsx(Notebook, { id: NOTEBOOK_ID, nbformat: nbformatExample, serviceManager: serviceManager, startDefaultKernel: true, extensions: extensions, Toolbar: NotebookToolbar })] }));
21
24
  };
22
25
  export default JupyterNotebookExample;
@@ -14,7 +14,7 @@ import { useSimpleAuthStore } from '@datalayer/core/lib/views/otel';
14
14
  export const AuthRequiredView = () => {
15
15
  const setAuth = useSimpleAuthStore(s => s.setAuth);
16
16
  const syncTokenToIamStore = useCallback((token) => {
17
- import('@datalayer/core/lib/state').then(({ iamStore }) => {
17
+ import('../../state/substates').then(({ iamStore }) => {
18
18
  iamStore.setState({ token });
19
19
  });
20
20
  }, []);