@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
@@ -42,16 +42,14 @@ 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 = 'agui-lexical-example';
50
- // Base URL for agent-runtimes server
51
- const BASE_URL = 'http://localhost:8765';
52
52
  const AGENT_ID = 'lexical-agent-runtime-example';
53
- // Vercel AI endpoint for lexical operations
54
- const VERCEL_AI_ENDPOINT = `${BASE_URL}/api/v1/vercel-ai/${AGENT_ID}`;
55
53
  function getJupyterSandboxUrl(serviceManager) {
56
54
  const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
57
55
  if (envUrl) {
@@ -75,87 +73,6 @@ function getJupyterSandboxUrl(serviceManager) {
75
73
  * Hook to ensure the example-agent exists on the server.
76
74
  * Creates it if it doesn't exist.
77
75
  */
78
- function useEnsureAgent(agentId, baseUrl, jupyterSandboxUrl) {
79
- const [isReady, setIsReady] = useState(false);
80
- const [error, setError] = useState(null);
81
- useEffect(() => {
82
- let mounted = true;
83
- async function ensureAgent() {
84
- try {
85
- if (!jupyterSandboxUrl) {
86
- if (mounted) {
87
- setError('Could not detect Jupyter server URL from Lexical service manager.');
88
- setIsReady(false);
89
- }
90
- return;
91
- }
92
- // Try to create the agent (will fail if already exists, which is fine)
93
- const response = await fetch(`${baseUrl}/api/v1/agents`, {
94
- method: 'POST',
95
- headers: {
96
- 'Content-Type': 'application/json',
97
- },
98
- body: JSON.stringify({
99
- name: agentId,
100
- description: 'Demo agent for lexical example',
101
- agent_library: 'pydantic-ai',
102
- transport: 'vercel-ai',
103
- model: DEFAULT_MODEL,
104
- system_prompt: 'You are a helpful AI assistant that helps users work with documents. You can help with writing, editing, and formatting content.',
105
- enable_codemode: false,
106
- sandbox_variant: 'jupyter',
107
- jupyter_sandbox: jupyterSandboxUrl,
108
- }),
109
- });
110
- if (mounted) {
111
- if (response.ok) {
112
- console.log(`[AgentRuntimeLexicalAgentExample] Created agent: ${agentId}`);
113
- setError(null);
114
- setIsReady(true);
115
- }
116
- else {
117
- const rawBody = await response.text().catch(() => '');
118
- let detail = rawBody;
119
- try {
120
- const parsed = rawBody ? JSON.parse(rawBody) : {};
121
- if (typeof parsed.detail === 'string' &&
122
- parsed.detail.length > 0) {
123
- detail = parsed.detail;
124
- }
125
- }
126
- catch {
127
- // Keep raw body as fallback detail.
128
- }
129
- const alreadyExists = response.status === 409 ||
130
- response.status === 400 ||
131
- /already exists/i.test(detail || '');
132
- if (alreadyExists) {
133
- console.log(`[AgentRuntimeLexicalAgentExample] Reusing existing agent: ${agentId}`);
134
- setError(null);
135
- setIsReady(true);
136
- }
137
- else {
138
- setError(detail || `Failed to create agent: ${response.status}`);
139
- setIsReady(false);
140
- }
141
- }
142
- }
143
- }
144
- catch (err) {
145
- if (mounted) {
146
- console.error('[AgentRuntimeLexicalAgentExample] Error creating agent:', err);
147
- setError(err instanceof Error ? err.message : 'Failed to connect to server');
148
- setIsReady(false);
149
- }
150
- }
151
- }
152
- ensureAgent();
153
- return () => {
154
- mounted = false;
155
- };
156
- }, [agentId, baseUrl, jupyterSandboxUrl]);
157
- return { isReady, error };
158
- }
159
76
  // import contentLexical from './lexicals/vscode.lexical';
160
77
  // const INITIAL_CONTENT = JSON.stringify(contentLexical);
161
78
  const INITIAL_CONTENT = undefined; // Use default empty document
@@ -228,7 +145,7 @@ function LexicalToolsPlugin({ onToolsReady, }) {
228
145
  }, [tools, onToolsReady]);
229
146
  return null;
230
147
  }
231
- const LexicalUI = React.memo(function LexicalUI({ content = INITIAL_CONTENT, serviceManager, onToolsReady, }) {
148
+ const LexicalUI = React.memo(function LexicalUI({ content = INITIAL_CONTENT, serviceManager, endpoint, onToolsReady, }) {
232
149
  const [floatingAnchorElem, setFloatingAnchorElem] = useState(null);
233
150
  const [_isLinkEditMode, setIsLinkEditMode] = useState(false);
234
151
  // AI actions registered as toolbar items via the primer-addons toolbar extensibility
@@ -261,13 +178,48 @@ const LexicalUI = React.memo(function LexicalUI({ content = INITIAL_CONTENT, ser
261
178
  minHeight: '600px',
262
179
  }, children: _jsxs(LexicalConfigProvider, { lexicalId: LEXICAL_ID, serviceManager: serviceManager, children: [_jsx(LexicalToolsPlugin, { onToolsReady: onToolsReady }), _jsx(LexicalComposer, { initialConfig: editorConfig, children: _jsxs("div", { className: "lexical-editor-inner", ref: onRef, children: [_jsx(LexicalStatePlugin, {}), _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: "lexical-editor-content", "aria-label": "Lexical Editor" }), ErrorBoundary: LexicalErrorBoundary }), _jsx(OnChangePlugin, { onChange: handleChange }), _jsx(HistoryPlugin, {}), _jsx(AutoFocusPlugin, {}), _jsx(ListPlugin, {}), _jsx(CheckListPlugin, {}), _jsx(LinkPlugin, {}), _jsx(AutoLinkPlugin, {}), _jsx(ListMaxIndentLevelPlugin, { maxDepth: 7 }), _jsx(MarkdownShortcutPlugin, { transformers: TRANSFORMERS }), _jsx(LoadContentPlugin, { content: content }), _jsx(CodeHighlightPlugin, {}), _jsx(ImagesPlugin, { captionsEnabled: false }), _jsx(HorizontalRulePlugin, {}), _jsx(EquationsPlugin, {}), _jsx(YouTubePlugin, {}), _jsx(ExcalidrawPlugin, {}), _jsx(CollapsiblePlugin, {}), _jsx(AutoEmbedPlugin, {}), _jsx(TablePlugin, {}), _jsx(TableCellResizerPlugin, {}), _jsx(JupyterCellPlugin, {}), _jsx(ThemedJupyterProvider, { children: _jsx(SimpleKernelPluginsInner, { serviceManager: serviceManager }) }), floatingAnchorElem && (_jsxs(_Fragment, { children: [_jsx(DraggableBlockPlugin, { anchorElem: floatingAnchorElem }), _jsx(FloatingTextFormatToolbarPlugin, { anchorElem: floatingAnchorElem, setIsLinkEditMode: setIsLinkEditMode, extraItems: toolbarItems }), _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem })] })), _jsx(ChatInlinePlugin, { protocol: {
263
180
  type: 'vercel-ai',
264
- endpoint: VERCEL_AI_ENDPOINT,
181
+ endpoint,
265
182
  }, isOpen: isAiOpen, onClose: closeAi, pendingPrompt: pendingPrompt, onPendingPromptConsumed: clearPendingPrompt })] }) })] }) })] }));
266
183
  });
267
184
  function LexicalWithChat({ content, serviceManager, }) {
185
+ const baseUrl = useExampleAgentRuntimesUrl();
186
+ const vercelAiEndpoint = `${baseUrl}/api/v1/vercel-ai/${AGENT_ID}`;
187
+ const [createRequested, setCreateRequested] = useState(false);
268
188
  const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
269
- // Ensure the agent exists before rendering chat
270
- const { isReady, error } = useEnsureAgent(AGENT_ID, BASE_URL, jupyterSandboxUrl);
189
+ const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
190
+ exampleId: 'LexicalAgentExample',
191
+ agentName: AGENT_ID,
192
+ autoCreateAgent: false,
193
+ agentConfig: {
194
+ name: AGENT_ID,
195
+ description: 'Demo agent for lexical example',
196
+ protocol: 'vercel-ai',
197
+ model: DEFAULT_MODEL,
198
+ systemPrompt: 'You are a helpful AI assistant that helps users work with documents. You can help with writing, editing, and formatting content.',
199
+ enableCodemode: false,
200
+ sandboxVariant: 'jupyter',
201
+ jupyterSandbox: jupyterSandboxUrl,
202
+ },
203
+ });
204
+ useEffect(() => {
205
+ if (!jupyterSandboxUrl || createRequested || agentId) {
206
+ return;
207
+ }
208
+ setCreateRequested(true);
209
+ void createAgent({
210
+ name: AGENT_ID,
211
+ description: 'Demo agent for lexical example',
212
+ protocol: 'vercel-ai',
213
+ model: DEFAULT_MODEL,
214
+ systemPrompt: 'You are a helpful AI assistant that helps users work with documents. You can help with writing, editing, and formatting content.',
215
+ enableCodemode: false,
216
+ sandboxVariant: 'jupyter',
217
+ jupyterSandbox: jupyterSandboxUrl,
218
+ }).catch(() => {
219
+ setCreateRequested(false);
220
+ });
221
+ }, [jupyterSandboxUrl, createRequested, agentId, createAgent]);
222
+ const effectiveReady = isReady || status === 'ready';
271
223
  // State to hold tools - populated by LexicalToolsPlugin inside the context
272
224
  const [tools, setTools] = useState([]);
273
225
  // Stable callback for receiving tools from LexicalToolsPlugin
@@ -284,7 +236,7 @@ function LexicalWithChat({ content, serviceManager, }) {
284
236
  width: '100vw',
285
237
  display: 'flex',
286
238
  overflow: 'hidden',
287
- }, children: [_jsx(LexicalUI, { content: content, serviceManager: serviceManager, onToolsReady: handleToolsReady }), error && (_jsxs(Box, { sx: {
239
+ }, children: [_jsx(LexicalUI, { content: content, serviceManager: serviceManager, endpoint: vercelAiEndpoint, onToolsReady: handleToolsReady }), error && (_jsxs(Box, { sx: {
288
240
  position: 'fixed',
289
241
  bottom: 20,
290
242
  right: 20,
@@ -293,7 +245,7 @@ function LexicalWithChat({ content, serviceManager, }) {
293
245
  color: 'danger.fg',
294
246
  borderRadius: 2,
295
247
  maxWidth: 300,
296
- }, children: [_jsx("strong", { children: "Error:" }), " ", error] })), isReady && (_jsx(ChatFloating, { protocol: "vercel-ai", endpoint: VERCEL_AI_ENDPOINT, title: "Lexical AI Agent Runtime", description: "Hi! I can help you edit documents. Try: 'Insert a heading', 'Add a code block', or 'Create a list'", defaultOpen: true, defaultViewMode: "panel", position: "bottom-right", frontendTools: tools, useStore: false, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, suggestions: [
248
+ }, children: [_jsx("strong", { children: "Error:" }), " ", error] })), effectiveReady && (_jsx(ChatFloating, { protocol: "vercel-ai", endpoint: vercelAiEndpoint, title: "Lexical AI Agent Runtime", description: "Hi! I can help you edit documents. Try: 'Insert a heading', 'Add a code block', or 'Create a list'", defaultOpen: true, defaultViewMode: "panel", position: "bottom-right", frontendTools: tools, useStore: false, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, suggestions: [
297
249
  {
298
250
  title: 'Insert heading',
299
251
  message: 'Insert a heading that says "Welcome"',
@@ -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',