@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
@@ -21,24 +21,27 @@ import { Text, Button, Spinner, Heading, Label, Flash, ProgressBar, } from '@pri
21
21
  import { ShieldCheckIcon, CheckIcon, XIcon, DotFillIcon, } from '@primer/octicons-react';
22
22
  import { Box } from '@datalayer/primer-addons';
23
23
  import { buildOtelWebSocketUrl } from '@datalayer/core/lib/otel';
24
- import { useCoreStore } from '@datalayer/core/lib/state';
24
+ import { useCoreStore } from '../state/substates';
25
25
  import { AuthRequiredView, ErrorView } from './components';
26
26
  import { ThemedProvider } from './utils/themedProvider';
27
27
  import { uniqueAgentId } from './utils/agentId';
28
28
  import { parseAgentStreamMessage } from '../types/stream';
29
- import { getAgentSpecs } from '../specs/agents';
29
+ import { getAgentspecs } from '../specs/agents';
30
30
  import { subscribeOtelWs } from '../context/otelWsPool';
31
31
  import { toMetricValue } from '../hooks/useMonitoring';
32
32
  import { useAIAgentsWebSocket } from '../hooks';
33
+ import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
33
34
  const queryClient = new QueryClient();
34
35
  import { useSimpleAuthStore } from '@datalayer/core/lib/views/otel';
35
36
  import { Chat } from '../chat';
36
37
  // ─── Constants ─────────────────────────────────────────────────────────────
37
38
  const AGENT_NAME = 'guardrails-example-agent';
38
- const AGENT_SPEC_ID = 'example-guardrails';
39
- const DEFAULT_LOCAL_BASE_URL = import.meta.env.VITE_BASE_URL || 'http://localhost:8765';
39
+ const AGENTSPEC_ID = 'example-guardrails';
40
40
  const OTEL_BASE_URL_ENV = import.meta.env.VITE_OTEL_BASE_URL;
41
- const DATALAYER_RUN_URL_ENV = import.meta.env.DATALAYER_RUN_URL;
41
+ // Consume-side OTEL override (DATALAYER_OTEL_IN_URL). When set, telemetry is
42
+ // read from here instead of VITE_OTEL_BASE_URL (e.g. prod during local dev).
43
+ const OTEL_IN_BASE_URL_ENV = import.meta.env.VITE_OTEL_IN_BASE_URL;
44
+ const DATALAYER_URL_ENV = import.meta.env.VITE_DATALAYER_URL;
42
45
  const OTEL_SERVICE_NAME = 'agent-runtimes';
43
46
  const COST_RUN_METRIC = 'agent_runtimes.capability.cost.run.usd';
44
47
  const COST_CUMULATIVE_METRIC = 'agent_runtimes.capability.cost.cumulative.usd';
@@ -55,7 +58,7 @@ const toNumberOrNull = (value) => {
55
58
  return null;
56
59
  };
57
60
  const resolvePerRunBudgetFromSpec = (agentSpecId) => {
58
- const spec = getAgentSpecs(agentSpecId);
61
+ const spec = getAgentspecs(agentSpecId);
59
62
  if (!spec?.guardrails?.length) {
60
63
  return null;
61
64
  }
@@ -74,7 +77,7 @@ const resolvePerRunBudgetFromSpec = (agentSpecId) => {
74
77
  }
75
78
  return null;
76
79
  };
77
- const DEFAULT_RUN_BUDGET_USD = resolvePerRunBudgetFromSpec(AGENT_SPEC_ID);
80
+ const DEFAULT_RUN_BUDGET_USD = resolvePerRunBudgetFromSpec(AGENTSPEC_ID);
78
81
  const toApprovalRequest = (payload) => ({
79
82
  id: payload.id,
80
83
  tool_name: payload.tool_name,
@@ -217,11 +220,13 @@ const AgentGuardrailsInner = ({ onLogout, }) => {
217
220
  // Tool approval queue
218
221
  const [approvals, setApprovals] = useState([]);
219
222
  const [approvalLoading, setApprovalLoading] = useState(null);
220
- const agentBaseUrl = DEFAULT_LOCAL_BASE_URL;
221
- const otelBaseUrl = configuration?.otelRunUrl ||
222
- configuration?.runUrl ||
223
+ const agentBaseUrl = useExampleAgentRuntimesUrl();
224
+ const otelBaseUrl = configuration?.otelInUrl ||
225
+ OTEL_IN_BASE_URL_ENV ||
226
+ configuration?.otelUrl ||
227
+ configuration?.datalayerUrl ||
223
228
  OTEL_BASE_URL_ENV ||
224
- DATALAYER_RUN_URL_ENV ||
229
+ DATALAYER_URL_ENV ||
225
230
  'https://prod1.datalayer.run';
226
231
  const podName = agentId;
227
232
  const chatAuthToken = token === null ? undefined : token;
@@ -249,7 +254,7 @@ const AgentGuardrailsInner = ({ onLogout, }) => {
249
254
  description: 'Agent with cost budget and tool approval guardrails',
250
255
  agent_library: 'pydantic-ai',
251
256
  transport: 'vercel-ai',
252
- agent_spec_id: AGENT_SPEC_ID,
257
+ agent_spec_id: AGENTSPEC_ID,
253
258
  enable_skills: true,
254
259
  tools: [],
255
260
  }),
@@ -420,7 +425,7 @@ const AgentGuardrailsInner = ({ onLogout, }) => {
420
425
  flexDirection: 'column',
421
426
  alignItems: 'center',
422
427
  justifyContent: 'center',
423
- height: '100vh',
428
+ height: '100%',
424
429
  gap: 3,
425
430
  }, children: [_jsx(Spinner, { size: "large" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: "Launching guardrails example agent..." })] }));
426
431
  }
@@ -453,7 +458,7 @@ const AgentGuardrailsInner = ({ onLogout, }) => {
453
458
  ? 'attention.fg'
454
459
  : 'success.fg';
455
460
  return (_jsxs(Box, { sx: {
456
- height: 'calc(100vh - 60px)',
461
+ height: '100%',
457
462
  display: 'flex',
458
463
  flexDirection: 'column',
459
464
  }, children: [_jsxs(Box, { sx: {
@@ -482,7 +487,7 @@ const AgentGuardrailsInner = ({ onLogout, }) => {
482
487
  ? ` (over by $${overBudgetAmountUsd.toFixed(4)}).`
483
488
  : '.', ' ', "Start a new run or increase the run budget before continuing."] }) })), approvals.map(req => (_jsx(Flash, { variant: "warning", sx: { mx: 3, mt: 2 }, children: _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2 }, children: [_jsxs(Text, { sx: { flex: 1, fontSize: 1 }, children: [_jsx("strong", { children: req.tool_name }), " requests approval", req.tool_args
484
489
  ? ` — ${JSON.stringify(req.tool_args).slice(0, 120)}`
485
- : ''] }), _jsx(Button, { size: "small", variant: "primary", leadingVisual: CheckIcon, onClick: () => handleApprove(req.id), disabled: approvalLoading === req.id, children: "Approve" }), _jsx(Button, { size: "small", variant: "danger", leadingVisual: XIcon, onClick: () => handleReject(req.id), disabled: approvalLoading === req.id, children: "Reject" })] }) }, req.id))), _jsx(Box, { sx: { flex: 1, minHeight: 0 }, children: _jsx(Chat, { protocol: "vercel-ai", baseUrl: agentBaseUrl, agentId: agentId, authToken: chatAuthToken, title: "Guardrails Agent", brandIcon: _jsx(ShieldCheckIcon, { size: 16 }), placeholder: "Ask something that triggers tools\u2026", description: "Cost guardrail with OTEL-backed gauge and hook-aware approvals (before_tool_execute, after_tool_execute, on_tool_execute_error, deferred_tool_calls)", showHeader: false, showTokenUsage: true, errorBanner: overBudgetBanner, disableInputPrompt: isOverRunBudget, autoFocus: true, height: "100%", runtimeId: agentId, historyEndpoint: `${agentBaseUrl}/api/v1/history`, suggestions: [
490
+ : ''] }), _jsx(Button, { size: "small", variant: "primary", leadingVisual: CheckIcon, onClick: () => handleApprove(req.id), disabled: approvalLoading === req.id, children: "Approve" }), _jsx(Button, { size: "small", variant: "danger", leadingVisual: XIcon, onClick: () => handleReject(req.id), disabled: approvalLoading === req.id, children: "Reject" })] }) }, req.id))), _jsx(Box, { sx: { flex: 1, minHeight: 0 }, children: _jsx(Chat, { protocol: "vercel-ai", baseUrl: agentBaseUrl, agentId: agentId, authToken: chatAuthToken, title: "Guardrails Agent", brandIcon: _jsx(ShieldCheckIcon, { size: 16 }), placeholder: "Ask something that triggers tools\u2026", description: "Cost guardrail with OTEL-backed gauge and hook-aware approvals (before_tool_execute, after_tool_execute, on_tool_execute_error, deferred_tool_calls)", showHeader: true, showTokenUsage: true, errorBanner: overBudgetBanner, disableInputPrompt: isOverRunBudget, autoFocus: true, height: "100%", runtimeId: agentId, historyEndpoint: `${agentBaseUrl}/api/v1/history`, suggestions: [
486
491
  { title: 'Update CRM', message: 'Update the CRM records for Q3' },
487
492
  {
488
493
  title: 'Trigger before_tool_execute',
@@ -500,7 +505,7 @@ const AgentGuardrailsInner = ({ onLogout, }) => {
500
505
  };
501
506
  // ─── Sync token to core IAM store ──────────────────────────────────────────
502
507
  const syncTokenToIamStore = (token) => {
503
- import('@datalayer/core/lib/state').then(({ iamStore }) => {
508
+ import('../state/substates').then(({ iamStore }) => {
504
509
  iamStore.setState({ token });
505
510
  });
506
511
  };
@@ -517,7 +522,7 @@ const AgentGuardrailsExample = () => {
517
522
  const handleLogout = useCallback(() => {
518
523
  clearAuth();
519
524
  hasSynced.current = false;
520
- import('@datalayer/core/lib/state').then(({ iamStore }) => {
525
+ import('../state/substates').then(({ iamStore }) => {
521
526
  iamStore.setState({ token: undefined });
522
527
  });
523
528
  }, [clearAuth]);
@@ -3,83 +3,42 @@ 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 { useEffect, useState } from 'react';
6
+ import { useMemo } from 'react';
7
7
  import { Text, Spinner } from '@primer/react';
8
8
  import { SyncIcon } from '@primer/octicons-react';
9
9
  import { Box, setupPrimerPortals } from '@datalayer/primer-addons';
10
10
  import { ThemedProvider } from './utils/themedProvider';
11
11
  import { uniqueAgentId } from './utils/agentId';
12
12
  import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
13
+ import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
13
14
  import { ErrorView } from './components';
14
15
  import { Chat } from '../chat';
15
16
  setupPrimerPortals();
16
- const AGENT_SPEC_ID = 'example-hooks';
17
+ const AGENTSPEC_ID = 'example-hooks';
17
18
  const AGENT_NAME = 'hooks-example-agent';
18
19
  const AgentHooksExample = () => {
19
20
  const baseUrl = useExampleAgentRuntimesUrl();
20
- const [agentId, setAgentId] = useState(null);
21
- const [error, setError] = useState(null);
22
- const [isCreating, setIsCreating] = useState(true);
23
- useEffect(() => {
24
- let cancelled = false;
25
- const name = uniqueAgentId(AGENT_NAME);
26
- const createAgent = async () => {
27
- try {
28
- const response = await fetch(`${baseUrl}/api/v1/agents`, {
29
- method: 'POST',
30
- headers: { 'Content-Type': 'application/json' },
31
- body: JSON.stringify({
32
- name,
33
- agent_spec_id: AGENT_SPEC_ID,
34
- transport: 'vercel-ai',
35
- }),
36
- });
37
- if (!response.ok) {
38
- const data = await response
39
- .json()
40
- .catch(() => ({ detail: 'Unknown error' }));
41
- throw new Error(data.detail || `Failed to create agent: ${response.status}`);
42
- }
43
- const data = await response.json();
44
- if (!cancelled) {
45
- setAgentId(data.id);
46
- setIsCreating(false);
47
- }
48
- }
49
- catch (err) {
50
- if (!cancelled) {
51
- setError(err instanceof Error ? err.message : 'Failed to create agent');
52
- setIsCreating(false);
53
- }
54
- }
55
- };
56
- createAgent();
57
- return () => {
58
- cancelled = true;
59
- };
60
- }, [baseUrl]);
61
- useEffect(() => {
62
- return () => {
63
- if (!agentId) {
64
- return;
65
- }
66
- void fetch(`${baseUrl}/api/v1/agents/${encodeURIComponent(agentId)}`, {
67
- method: 'DELETE',
68
- }).catch(() => {
69
- // Ignore teardown failures in example mode.
70
- });
71
- };
72
- }, [agentId, baseUrl]);
21
+ const agentName = useMemo(() => uniqueAgentId(AGENT_NAME), []);
22
+ const { agentId, error, status, isReady } = useExampleAgentRuntime({
23
+ exampleId: 'AgentHooksExample',
24
+ agentName,
25
+ specId: AGENTSPEC_ID,
26
+ agentConfig: {
27
+ protocol: 'vercel-ai',
28
+ agentSpecId: AGENTSPEC_ID,
29
+ },
30
+ });
31
+ const isCreating = !isReady && status !== 'error';
73
32
  if (isCreating) {
74
33
  return (_jsx(ThemedProvider, { children: _jsxs(Box, { sx: {
75
34
  display: 'flex',
76
35
  flexDirection: 'column',
77
36
  alignItems: 'center',
78
37
  justifyContent: 'center',
79
- height: '100vh',
38
+ height: '100%',
80
39
  gap: 3,
81
40
  bg: 'canvas.default',
82
- }, children: [_jsx(Spinner, { size: "large" }), _jsxs(Text, { sx: { color: 'fg.muted' }, children: ["Creating agent from ", AGENT_SPEC_ID, "..."] })] }) }));
41
+ }, children: [_jsx(Spinner, { size: "large" }), _jsxs(Text, { sx: { color: 'fg.muted' }, children: ["Creating agent from ", AGENTSPEC_ID, "..."] })] }) }));
83
42
  }
84
43
  if (error || !agentId) {
85
44
  return (_jsx(ThemedProvider, { children: _jsx(ErrorView, { error: "Failed to start hooks agent", detail: error || 'No agent ID returned' }) }));
@@ -9,12 +9,12 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
9
9
  import { Button, Box, Heading, SegmentedControl, Spinner, Text, } from '@primer/react';
10
10
  import { ThemedProvider } from './utils/themedProvider';
11
11
  import { uniqueAgentId } from './utils/agentId';
12
+ import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
12
13
  import { useSimpleAuthStore } from '@datalayer/core/lib/views/otel';
13
14
  import { Chat } from '../chat';
14
15
  import { useAIAgentsWebSocket } from '../hooks';
15
- const AGENT_SPEC_ID = 'example-inference';
16
+ const AGENTSPEC_ID = 'example-inference';
16
17
  const AGENT_NAME = 'inference-provider-example-agent';
17
- const DEFAULT_LOCAL_BASE_URL = import.meta.env.VITE_BASE_URL || 'http://localhost:8765';
18
18
  const queryClient = new QueryClient();
19
19
  const nowIso = () => new Date().toISOString();
20
20
  const toErrorMessage = (error) => error instanceof Error ? error.message : String(error);
@@ -51,14 +51,14 @@ const AgentInferenceProviderExampleInner = () => {
51
51
  const [expandedEventIds, setExpandedEventIds] = useState(() => new Set());
52
52
  const currentAgentRef = useRef(null);
53
53
  const requestEpochRef = useRef(0);
54
- const baseUrl = DEFAULT_LOCAL_BASE_URL;
54
+ const baseUrl = useExampleAgentRuntimesUrl();
55
55
  const inferenceUrl = useMemo(() => {
56
56
  if (provider === 'local') {
57
57
  return 'local inference';
58
58
  }
59
59
  const env = import.meta.env ?? {};
60
60
  return (env.VITE_DATALAYER_AI_INFERENCE_URL ||
61
- env.VITE_DATALAYER_RUN_URL ||
61
+ env.VITE_DATALAYER_URL ||
62
62
  'https://prod1.datalayer.run');
63
63
  }, [provider]);
64
64
  const authFetch = useCallback((url, init = {}) => {
@@ -114,7 +114,7 @@ const AgentInferenceProviderExampleInner = () => {
114
114
  body: JSON.stringify({
115
115
  name,
116
116
  transport: 'vercel-ai',
117
- agent_spec_id: AGENT_SPEC_ID,
117
+ agent_spec_id: AGENTSPEC_ID,
118
118
  inferenceProvider: nextProvider,
119
119
  }),
120
120
  });
@@ -131,7 +131,7 @@ const AgentInferenceProviderExampleInner = () => {
131
131
  setAgentId(nextAgentId);
132
132
  appendProviderEvent('agent.created', 'Launched local agent runtime', {
133
133
  agentId: nextAgentId,
134
- agentSpecId: AGENT_SPEC_ID,
134
+ agentSpecId: AGENTSPEC_ID,
135
135
  inferenceProvider: nextProvider,
136
136
  baseUrl,
137
137
  });
@@ -225,7 +225,7 @@ const AgentInferenceProviderExampleInner = () => {
225
225
  alignItems: 'center',
226
226
  flexWrap: 'wrap',
227
227
  gap: 2,
228
- }, children: [_jsxs(Box, { children: [_jsx(Heading, { as: "h2", sx: { fontSize: 4, mb: 1 }, children: "Agent Inference Provider Example" }), _jsxs(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: ["Launches a local agent runtime from ", AGENT_SPEC_ID, " and lets you switch between local and datalayer inference."] })] }), _jsx(ProviderBadge, { provider: provider })] }), _jsxs(SegmentedControl, { "aria-label": "Inference provider", fullWidth: true, children: [_jsx(SegmentedControl.Button, { selected: provider === 'local', onClick: () => onProviderChange('local'), children: "local" }), _jsx(SegmentedControl.Button, { selected: provider === 'datalayer', onClick: () => onProviderChange('datalayer'), children: "datalayer" })] }), _jsxs(Box, { sx: {
228
+ }, children: [_jsxs(Box, { children: [_jsx(Heading, { as: "h2", sx: { fontSize: 4, mb: 1 }, children: "Agent Inference Provider Example" }), _jsxs(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: ["Launches a local agent runtime from ", AGENTSPEC_ID, " and lets you switch between local and datalayer inference."] })] }), _jsx(ProviderBadge, { provider: provider })] }), _jsxs(SegmentedControl, { "aria-label": "Inference provider", fullWidth: true, children: [_jsx(SegmentedControl.Button, { selected: provider === 'local', onClick: () => onProviderChange('local'), children: "local" }), _jsx(SegmentedControl.Button, { selected: provider === 'datalayer', onClick: () => onProviderChange('datalayer'), children: "datalayer" })] }), _jsxs(Box, { sx: {
229
229
  display: 'flex',
230
230
  gap: 2,
231
231
  alignItems: 'center',
@@ -248,7 +248,7 @@ const AgentInferenceProviderExampleInner = () => {
248
248
  borderRadius: 2,
249
249
  overflow: 'hidden',
250
250
  bg: 'canvas.default',
251
- }, children: agentId && !isLaunching ? (_jsx(Chat, { protocol: "vercel-ai", baseUrl: baseUrl, agentId: agentId, authToken: token ?? undefined, title: "Agent Inference Provider Example", subtitle: `Spec: ${AGENT_SPEC_ID}`, placeholder: "Ask the inference provider something...", showHeader: true, showNewChatButton: true, showClearButton: false, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, showTokenUsage: true, autoFocus: true, height: "100%", runtimeId: agentId, historyEndpoint: `${baseUrl}/api/v1/history`, onMessageSent: content => {
251
+ }, children: agentId && !isLaunching ? (_jsx(Chat, { protocol: "vercel-ai", baseUrl: baseUrl, agentId: agentId, authToken: token ?? undefined, title: "Agent Inference Provider Example", subtitle: `Spec: ${AGENTSPEC_ID}`, placeholder: "Ask the inference provider something...", showHeader: true, showNewChatButton: true, showClearButton: true, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, showTokenUsage: true, autoFocus: true, height: "100%", runtimeId: agentId, historyEndpoint: `${baseUrl}/api/v1/history`, onMessageSent: content => {
252
252
  appendProviderEvent('provider.request', `Sent message via ${provider}`, {
253
253
  provider,
254
254
  agentId,
@@ -0,0 +1,10 @@
1
+ import { ServiceManager } from '@jupyterlab/services';
2
+ interface AgentLoopExampleInnerProps {
3
+ serviceManager?: ServiceManager.IManager;
4
+ }
5
+ export declare function AgentLoopExampleInner({ serviceManager, }: AgentLoopExampleInnerProps): import("react/jsx-runtime").JSX.Element;
6
+ /**
7
+ * Main example component with Jupyter provider wrapper.
8
+ */
9
+ export declare function AgentLoopExample(): import("react/jsx-runtime").JSX.Element;
10
+ export default AgentLoopExample;
@@ -0,0 +1,304 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2025-2026 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ /**
7
+ * AgentLoopExample - Define and launch an agent execution *loop*.
8
+ *
9
+ * This example demonstrates the "loop" paradigm (observe → think → act →
10
+ * evaluate) instead of one-shot prompting. It is fully driven by the generic
11
+ * loop specifications defined in agentspecs (`src/specs/loops.ts`):
12
+ *
13
+ * - Pick any loop spec (Data Analysis, Plan/Execute/Critic, OODA,
14
+ * Human-in-the-Loop). The list is read from the loop catalogue, so adding a
15
+ * new YAML loop spec automatically makes it available here.
16
+ * - The agent's system prompt is composed generically from the selected loop's
17
+ * objective, phases, constraints, termination policy and human settings — no
18
+ * loop-specific code.
19
+ * - The agent then runs the loop against a live Jupyter notebook, where the
20
+ * loop state (dataframes, charts, intermediate results) lives outside the
21
+ * model so each iteration stays small and focused.
22
+ *
23
+ * To run this example:
24
+ * 1. Start the agent-runtimes server.
25
+ * 2. Select this example from the header dropdown (Agent group).
26
+ *
27
+ * @module examples/AgentLoopExample
28
+ */
29
+ import { useEffect, useMemo, useState } from 'react';
30
+ import { Box } from '@datalayer/primer-addons';
31
+ import { Notebook, useJupyter } from '@datalayer/jupyter-react';
32
+ import { useNotebookTools } from '../tools/adapters/agent-runtimes/notebookHooks';
33
+ import { ThemedJupyterProvider } from './utils/themedProvider';
34
+ import { ChatSidebar } from '../chat';
35
+ import { DEFAULT_MODEL, listLoops, getLoop, DEFAULT_LOOP } from '../specs';
36
+ import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
37
+ import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
38
+ import MatplotlibNotebook from './utils/notebooks/Matplotlib.ipynb.json';
39
+ // Fixed notebook ID
40
+ const NOTEBOOK_ID = 'agent-loop-example';
41
+ // Use the imported Matplotlib notebook as the working surface for the loop.
42
+ const NOTEBOOK_CONTENT = MatplotlibNotebook;
43
+ // Default configuration
44
+ const DEFAULT_AGENT_ID = import.meta.env.VITE_AGENT_ID || 'loop-agent-runtime-example';
45
+ /**
46
+ * Compose an agent system prompt generically from a loop specification.
47
+ *
48
+ * This is intentionally spec-driven: every field comes from the loop YAML, so
49
+ * the same code drives any loop (data analysis, plan/execute/critic, OODA, ...).
50
+ */
51
+ function buildLoopSystemPrompt(loop) {
52
+ const lines = [];
53
+ lines.push(`You are an agent that operates as a control LOOP rather than answering in a single prompt.`);
54
+ lines.push(`Loop: ${loop.name} (${loop.strategy}).`);
55
+ if (loop.objective) {
56
+ lines.push(`Objective: ${loop.objective}`);
57
+ }
58
+ if (loop.phases?.length) {
59
+ lines.push(`Each iteration, execute these phases in order: ${loop.phases.join(' → ')}. ` +
60
+ `Decide the single best next action each iteration; do not try to solve everything at once.`);
61
+ }
62
+ if (loop.constraints?.length) {
63
+ lines.push(`Constraints you must respect:\n${loop.constraints
64
+ .map(c => `- ${c}`)
65
+ .join('\n')}`);
66
+ }
67
+ if (loop.termination) {
68
+ const t = loop.termination;
69
+ lines.push(`Termination: stop after at most ${t.maxIterations} iterations, or when the goal is reached.`);
70
+ if (t.successCriteria?.length) {
71
+ lines.push(`Success criteria:\n${t.successCriteria.map(s => `- ${s}`).join('\n')}`);
72
+ }
73
+ if (t.onBlocked) {
74
+ lines.push(`If blocked: ${t.onBlocked}.`);
75
+ }
76
+ }
77
+ if (loop.human && loop.human.mode !== 'none') {
78
+ lines.push(`Human-in-the-loop: mode "${loop.human.mode}"` +
79
+ (loop.human.approvalRequired
80
+ ? `; request explicit approval before: ${loop.human.approvalFor.join(', ') || 'sensitive actions'}.`
81
+ : '.'));
82
+ }
83
+ lines.push(`Keep loop state (dataframes, charts, intermediate results) in the notebook/runtime, not in the prompt. ` +
84
+ `For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. ` +
85
+ `Use executeCode only for temporary inspection code that should not modify notebook cells.`);
86
+ return lines.join('\n\n');
87
+ }
88
+ function getJupyterSandboxUrl(serviceManager) {
89
+ const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
90
+ if (envUrl) {
91
+ return envUrl;
92
+ }
93
+ const baseUrl = serviceManager?.serverSettings?.baseUrl?.replace(/\/$/, '');
94
+ if (!baseUrl) {
95
+ return undefined;
96
+ }
97
+ if (baseUrl.includes('token=')) {
98
+ return baseUrl;
99
+ }
100
+ const token = serviceManager?.serverSettings?.token;
101
+ if (!token) {
102
+ return baseUrl;
103
+ }
104
+ const separator = baseUrl.includes('?') ? '&' : '?';
105
+ return `${baseUrl}${separator}token=${encodeURIComponent(token)}`;
106
+ }
107
+ function NotebookUI({ serviceManager }) {
108
+ if (!serviceManager) {
109
+ return (_jsx(Box, { sx: {
110
+ display: 'flex',
111
+ alignItems: 'center',
112
+ justifyContent: 'center',
113
+ height: '100%',
114
+ color: 'fg.muted',
115
+ }, children: "Loading Simple services..." }));
116
+ }
117
+ return (_jsx(Notebook, { nbformat: NOTEBOOK_CONTENT, id: NOTEBOOK_ID, serviceManager: serviceManager, height: "100%", cellSidebarMargin: 120, startDefaultKernel: true }));
118
+ }
119
+ /**
120
+ * A compact, read-only summary of the selected loop specification.
121
+ */
122
+ function LoopSummary({ loop }) {
123
+ return (_jsxs(Box, { sx: {
124
+ mt: 2,
125
+ p: 2,
126
+ border: '1px solid',
127
+ borderColor: 'border.default',
128
+ borderRadius: 2,
129
+ bg: 'canvas.default',
130
+ fontSize: 0,
131
+ }, children: [_jsx(Box, { sx: { display: 'flex', flexWrap: 'wrap', gap: 2, mb: 1 }, children: loop.phases.map((phase, index) => (_jsxs(Box, { sx: {
132
+ display: 'flex',
133
+ alignItems: 'center',
134
+ gap: 1,
135
+ px: 2,
136
+ py: '2px',
137
+ borderRadius: 6,
138
+ bg: 'accent.subtle',
139
+ color: 'accent.fg',
140
+ fontWeight: 'bold',
141
+ }, children: [index + 1, ". ", phase] }, phase))) }), loop.objective && (_jsxs(Box, { sx: { color: 'fg.muted' }, children: [_jsx("strong", { children: "Objective:" }), " ", loop.objective] })), loop.termination && (_jsxs(Box, { sx: { color: 'fg.muted', mt: 1 }, children: [_jsx("strong", { children: "Max iterations:" }), " ", loop.termination.maxIterations, " \u00B7", ' ', _jsx("strong", { children: "On blocked:" }), " ", loop.termination.onBlocked] }))] }));
142
+ }
143
+ export function AgentLoopExampleInner({ serviceManager, }) {
144
+ const baseUrl = useExampleAgentRuntimesUrl();
145
+ const vercelAiEndpoint = `${baseUrl}/api/v1/vercel-ai/${DEFAULT_AGENT_ID}`;
146
+ const [createRequested, setCreateRequested] = useState(false);
147
+ // All available loops come from the generated loop catalogue.
148
+ const loops = useMemo(() => listLoops(), []);
149
+ const [selectedLoopId, setSelectedLoopId] = useState(DEFAULT_LOOP);
150
+ const selectedLoop = useMemo(() => getLoop(selectedLoopId) ?? loops[0], [selectedLoopId, loops]);
151
+ const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
152
+ const systemPrompt = useMemo(() => buildLoopSystemPrompt(selectedLoop), [selectedLoop]);
153
+ const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
154
+ exampleId: 'AgentLoopExample',
155
+ agentName: DEFAULT_AGENT_ID,
156
+ autoCreateAgent: false,
157
+ agentConfig: {
158
+ name: DEFAULT_AGENT_ID,
159
+ description: `Loop agent (${selectedLoop.name}) for AgentLoopExample`,
160
+ protocol: 'vercel-ai',
161
+ model: DEFAULT_MODEL,
162
+ systemPrompt,
163
+ enableCodemode: false,
164
+ sandboxVariant: 'jupyter',
165
+ jupyterSandbox: jupyterSandboxUrl,
166
+ },
167
+ });
168
+ // Launch the loop agent once the sandbox is ready, using the loop that was
169
+ // selected at launch time.
170
+ useEffect(() => {
171
+ if (!jupyterSandboxUrl || createRequested || agentId) {
172
+ return;
173
+ }
174
+ setCreateRequested(true);
175
+ void createAgent({
176
+ name: DEFAULT_AGENT_ID,
177
+ description: `Loop agent (${selectedLoop.name}) for AgentLoopExample`,
178
+ protocol: 'vercel-ai',
179
+ model: DEFAULT_MODEL,
180
+ systemPrompt,
181
+ enableCodemode: false,
182
+ sandboxVariant: 'jupyter',
183
+ jupyterSandbox: jupyterSandboxUrl,
184
+ }).catch(() => {
185
+ setCreateRequested(false);
186
+ });
187
+ }, [
188
+ jupyterSandboxUrl,
189
+ createRequested,
190
+ agentId,
191
+ createAgent,
192
+ selectedLoop.name,
193
+ systemPrompt,
194
+ ]);
195
+ const effectiveReady = isReady || status === 'ready';
196
+ const isLoopSelectorDisabled = createRequested;
197
+ // Get notebook tools for ChatSidebar
198
+ const tools = useNotebookTools(NOTEBOOK_ID);
199
+ // Build Vercel AI protocol config
200
+ const protocolConfig = useMemo(() => {
201
+ return {
202
+ type: 'vercel-ai',
203
+ endpoint: vercelAiEndpoint,
204
+ agentId: DEFAULT_AGENT_ID,
205
+ enableConfigQuery: true,
206
+ configEndpoint: `${baseUrl}/api/v1/configure`,
207
+ };
208
+ }, [baseUrl, vercelAiEndpoint]);
209
+ // Chat suggestions derived from the selected loop.
210
+ const suggestions = useMemo(() => [
211
+ {
212
+ title: `${selectedLoop.emoji} Run the loop`,
213
+ message: selectedLoop.objective
214
+ ? `Run the ${selectedLoop.name}. ${selectedLoop.objective}`
215
+ : `Run the ${selectedLoop.name} against the data in this notebook.`,
216
+ },
217
+ {
218
+ title: '🔁 Next iteration',
219
+ message: 'Observe the current notebook state, then decide and execute the single best next step.',
220
+ },
221
+ {
222
+ title: '🎯 Check the goal',
223
+ message: 'Evaluate the latest result against the objective and success criteria. Are we done? If not, what is missing?',
224
+ },
225
+ {
226
+ title: '📊 Summarize findings',
227
+ message: 'Summarize the key findings and produce a final, decision-oriented report.',
228
+ },
229
+ ], [selectedLoop]);
230
+ return (_jsx(_Fragment, { children: _jsxs(Box, { sx: {
231
+ height: 'calc(100vh - 70px)',
232
+ width: '100vw',
233
+ display: 'flex',
234
+ overflow: 'hidden',
235
+ }, children: [_jsxs(Box, { sx: {
236
+ flex: 1,
237
+ display: 'flex',
238
+ flexDirection: 'column',
239
+ overflow: 'hidden',
240
+ }, children: [_jsxs(Box, { sx: {
241
+ p: 3,
242
+ borderBottom: '1px solid',
243
+ borderColor: 'border.default',
244
+ bg: 'canvas.subtle',
245
+ }, children: [_jsxs(Box, { sx: {
246
+ display: 'flex',
247
+ alignItems: 'center',
248
+ justifyContent: 'space-between',
249
+ gap: 3,
250
+ flexWrap: 'wrap',
251
+ }, children: [_jsxs(Box, { children: [_jsxs("h1", { style: { margin: 0, fontSize: '1.5rem' }, children: [selectedLoop.emoji, " Agent Loop Example"] }), _jsx("p", { style: { margin: '8px 0 0', color: 'var(--fgColor-muted)' }, children: "Define and launch an agent execution loop \u2014 observe, think, act, evaluate \u2014 over a live notebook." })] }), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2 }, title: isLoopSelectorDisabled
252
+ ? 'Loop selector is temporarily disabled while launching the agent'
253
+ : 'Choose a loop', children: [_jsx(Box, { as: "label", sx: { fontSize: 1, fontWeight: 'bold' }, children: "Loop" }), _jsx(Box, { as: "select", value: selectedLoopId, onChange: (e) => setSelectedLoopId(e.target.value), disabled: isLoopSelectorDisabled, "aria-label": "Loop specification", sx: {
254
+ px: 2,
255
+ py: '6px',
256
+ fontSize: 1,
257
+ borderRadius: 2,
258
+ border: '1px solid',
259
+ borderColor: 'border.default',
260
+ bg: 'canvas.default',
261
+ color: 'fg.default',
262
+ }, children: loops.map(loop => (_jsxs("option", { value: loop.id, children: [loop.emoji, " ", loop.name] }, loop.id))) })] })] }), _jsx(LoopSummary, { loop: selectedLoop })] }), _jsx(Box, { sx: {
263
+ flex: 1,
264
+ display: 'flex',
265
+ overflow: 'hidden',
266
+ bg: 'canvas.default',
267
+ p: 3,
268
+ }, children: _jsx(Box, { sx: {
269
+ flex: 1,
270
+ border: '1px solid',
271
+ borderColor: 'border.default',
272
+ borderRadius: 2,
273
+ overflow: 'hidden',
274
+ }, children: _jsx(NotebookUI, { serviceManager: serviceManager }) }) })] }), effectiveReady && (_jsx(ChatSidebar, { title: `${selectedLoop.emoji} ${selectedLoop.name}`, protocol: protocolConfig, position: "right", width: 400, clickOutsideToClose: false, showNewChatButton: true, showClearButton: true, showSettingsButton: true, defaultOpen: true, panelProps: {
275
+ protocol: protocolConfig,
276
+ frontendTools: tools,
277
+ useStore: false,
278
+ showModelSelector: true,
279
+ showToolsMenu: true,
280
+ showSkillsMenu: true,
281
+ suggestions,
282
+ } })), error && (_jsxs(Box, { sx: {
283
+ position: 'fixed',
284
+ bottom: 20,
285
+ right: 20,
286
+ padding: 3,
287
+ backgroundColor: 'danger.subtle',
288
+ color: 'danger.fg',
289
+ borderRadius: 2,
290
+ maxWidth: 320,
291
+ zIndex: 999,
292
+ }, children: [_jsx("strong", { children: "Error:" }), " ", error] }))] }) }));
293
+ }
294
+ /**
295
+ * Main example component with Jupyter provider wrapper.
296
+ */
297
+ export function AgentLoopExample() {
298
+ return (_jsx(ThemedJupyterProvider, { children: _jsx(SimpleWrapper, {}) }));
299
+ }
300
+ function SimpleWrapper() {
301
+ const { serviceManager } = useJupyter();
302
+ return _jsx(AgentLoopExampleInner, { serviceManager: serviceManager });
303
+ }
304
+ export default AgentLoopExample;