@datalayer/agent-runtimes 1.0.3 → 1.0.5

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 (275) hide show
  1. package/README.md +35 -119
  2. package/lib/App.js +1 -1
  3. package/lib/agents/AgentDetails.d.ts +22 -1
  4. package/lib/agents/AgentDetails.js +34 -47
  5. package/lib/api/index.d.ts +0 -1
  6. package/lib/api/index.js +4 -2
  7. package/lib/chat/Chat.d.ts +5 -104
  8. package/lib/chat/Chat.js +4 -4
  9. package/lib/chat/ChatFloating.d.ts +7 -140
  10. package/lib/chat/ChatFloating.js +2 -2
  11. package/lib/chat/ChatPopupStandalone.d.ts +8 -47
  12. package/lib/chat/ChatPopupStandalone.js +3 -3
  13. package/lib/chat/ChatSidebar.d.ts +4 -69
  14. package/lib/chat/ChatSidebar.js +2 -2
  15. package/lib/chat/ChatStandalone.d.ts +4 -54
  16. package/lib/chat/ChatStandalone.js +3 -3
  17. package/lib/chat/base/ChatBase.js +1118 -141
  18. package/lib/chat/header/ChatHeaderBase.d.ts +11 -6
  19. package/lib/chat/header/ChatHeaderBase.js +18 -16
  20. package/lib/chat/indicators/McpStatusIndicator.d.ts +7 -4
  21. package/lib/chat/indicators/McpStatusIndicator.js +7 -32
  22. package/lib/chat/indicators/SandboxStatusIndicator.d.ts +4 -1
  23. package/lib/chat/indicators/SandboxStatusIndicator.js +9 -9
  24. package/lib/chat/indicators/SkillsStatusIndicator.d.ts +7 -0
  25. package/lib/chat/indicators/SkillsStatusIndicator.js +88 -0
  26. package/lib/chat/indicators/index.d.ts +1 -0
  27. package/lib/chat/indicators/index.js +1 -0
  28. package/lib/chat/messages/ChatMessageList.d.ts +1 -1
  29. package/lib/chat/messages/ChatMessageList.js +110 -102
  30. package/lib/chat/prompt/InputFooter.d.ts +19 -6
  31. package/lib/chat/prompt/InputFooter.js +71 -18
  32. package/lib/chat/prompt/InputPrompt.d.ts +3 -1
  33. package/lib/chat/prompt/InputPrompt.js +4 -4
  34. package/lib/chat/prompt/InputPromptFooter.js +1 -1
  35. package/lib/chat/prompt/InputPromptLexical.d.ts +3 -1
  36. package/lib/chat/prompt/InputPromptLexical.js +12 -5
  37. package/lib/chat/prompt/InputPromptText.d.ts +3 -1
  38. package/lib/chat/prompt/InputPromptText.js +2 -2
  39. package/lib/chat/tools/ToolApprovalBanner.js +1 -1
  40. package/lib/chat/tools/ToolCallDisplay.d.ts +3 -1
  41. package/lib/chat/tools/ToolCallDisplay.js +2 -2
  42. package/lib/chat/usage/TokenUsageBar.js +20 -2
  43. package/lib/client/AgentRuntimesClientContext.d.ts +53 -0
  44. package/lib/client/AgentRuntimesClientContext.js +55 -0
  45. package/lib/client/AgentsMixin.d.ts +48 -19
  46. package/lib/client/AgentsMixin.js +115 -30
  47. package/lib/client/IAgentRuntimesClient.d.ts +215 -0
  48. package/lib/client/IAgentRuntimesClient.js +5 -0
  49. package/lib/client/SdkAgentRuntimesClient.d.ts +151 -0
  50. package/lib/client/SdkAgentRuntimesClient.js +134 -0
  51. package/lib/client/index.d.ts +4 -1
  52. package/lib/client/index.js +3 -1
  53. package/lib/components/NotificationEventCard.js +55 -26
  54. package/lib/components/OutputCard.js +21 -7
  55. package/lib/components/ToolApprovalCard.js +20 -2
  56. package/lib/config/AgentConfiguration.js +3 -3
  57. package/lib/context/ContextDistribution.d.ts +3 -1
  58. package/lib/context/ContextDistribution.js +8 -27
  59. package/lib/context/ContextInspector.d.ts +3 -1
  60. package/lib/context/ContextInspector.js +19 -67
  61. package/lib/context/ContextPanel.d.ts +3 -1
  62. package/lib/context/ContextPanel.js +104 -64
  63. package/lib/context/ContextUsage.d.ts +3 -1
  64. package/lib/context/ContextUsage.js +3 -3
  65. package/lib/context/CostTracker.d.ts +9 -3
  66. package/lib/context/CostTracker.js +26 -47
  67. package/lib/context/CostUsageChart.d.ts +12 -0
  68. package/lib/context/CostUsageChart.js +378 -0
  69. package/lib/context/GraphFlowChart.d.ts +16 -0
  70. package/lib/context/GraphFlowChart.js +182 -0
  71. package/lib/context/TokenUsageChart.d.ts +8 -1
  72. package/lib/context/TokenUsageChart.js +349 -211
  73. package/lib/context/TurnGraphChart.d.ts +39 -0
  74. package/lib/context/TurnGraphChart.js +538 -0
  75. package/lib/context/otelWsPool.d.ts +20 -0
  76. package/lib/context/otelWsPool.js +69 -0
  77. package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -17
  78. package/lib/examples/A2UiComponentGalleryExample.js +315 -522
  79. package/lib/examples/A2UiContactCardExample.d.ts +0 -18
  80. package/lib/examples/A2UiContactCardExample.js +154 -411
  81. package/lib/examples/A2UiRestaurantExample.d.ts +0 -30
  82. package/lib/examples/A2UiRestaurantExample.js +114 -212
  83. package/lib/examples/A2UiViewerExample.d.ts +0 -18
  84. package/lib/examples/A2UiViewerExample.js +283 -532
  85. package/lib/examples/AgUiBackendToolRenderingExample.js +1 -1
  86. package/lib/examples/AgUiHaikuGenUiExample.d.ts +1 -1
  87. package/lib/examples/AgUiHaikuGenUiExample.js +1 -1
  88. package/lib/examples/AgentCheckpointsExample.js +14 -34
  89. package/lib/examples/AgentCodemodeExample.d.ts +4 -6
  90. package/lib/examples/AgentCodemodeExample.js +591 -175
  91. package/lib/examples/AgentEvalsExample.js +13 -23
  92. package/lib/examples/AgentGuardrailsExample.js +371 -71
  93. package/lib/examples/AgentHooksExample.d.ts +3 -0
  94. package/lib/examples/AgentHooksExample.js +104 -0
  95. package/lib/examples/AgentMCPExample.d.ts +3 -0
  96. package/lib/examples/AgentMCPExample.js +480 -0
  97. package/lib/examples/AgentMemoryExample.js +14 -24
  98. package/lib/examples/AgentMonitoringExample.js +261 -206
  99. package/lib/examples/AgentNotificationsExample.js +50 -24
  100. package/lib/examples/AgentOtelExample.js +2 -3
  101. package/lib/examples/AgentOutputsExample.d.ts +11 -6
  102. package/lib/examples/AgentOutputsExample.js +383 -88
  103. package/lib/examples/AgentParametersExample.d.ts +3 -0
  104. package/lib/examples/AgentParametersExample.js +246 -0
  105. package/lib/examples/AgentSandboxExample.d.ts +2 -2
  106. package/lib/examples/AgentSandboxExample.js +69 -47
  107. package/lib/examples/AgentSkillsExample.js +92 -106
  108. package/lib/examples/{AgentspecExample.js → AgentSpecsExample.js} +10 -21
  109. package/lib/examples/AgentSubagentsExample.d.ts +14 -0
  110. package/lib/examples/AgentSubagentsExample.js +228 -0
  111. package/lib/examples/AgentToolApprovalsExample.js +30 -493
  112. package/lib/examples/AgentTriggersExample.js +1067 -246
  113. package/lib/examples/ChatCustomExample.js +11 -24
  114. package/lib/examples/ChatExample.js +9 -34
  115. package/lib/examples/CopilotKitLexicalExample.js +2 -1
  116. package/lib/examples/CopilotKitNotebookExample.js +2 -1
  117. package/lib/examples/HomeExample.d.ts +15 -0
  118. package/lib/examples/HomeExample.js +77 -0
  119. package/lib/examples/Lexical2Example.js +4 -2
  120. package/lib/examples/{LexicalExample.d.ts → LexicalAgentExample.d.ts} +4 -4
  121. package/lib/examples/{LexicalExample.js → LexicalAgentExample.js} +65 -16
  122. package/lib/examples/{LexicalSidebarExample.d.ts → LexicalAgentSidebarExample.d.ts} +5 -5
  123. package/lib/examples/LexicalAgentSidebarExample.js +261 -0
  124. package/lib/examples/NotebookAgentExample.d.ts +9 -0
  125. package/lib/examples/NotebookAgentExample.js +192 -0
  126. package/lib/examples/{NotebookSidebarExample.d.ts → NotebookAgentSidebarExample.d.ts} +2 -2
  127. package/lib/examples/NotebookAgentSidebarExample.js +221 -0
  128. package/lib/examples/{DatalayerNotebookExample.d.ts → NotebookCollaborationExample.d.ts} +4 -4
  129. package/lib/examples/{DatalayerNotebookExample.js → NotebookCollaborationExample.js} +3 -3
  130. package/lib/examples/NotebookExample.d.ts +4 -7
  131. package/lib/examples/NotebookExample.js +14 -146
  132. package/lib/examples/components/AuthRequiredView.d.ts +6 -0
  133. package/lib/examples/components/AuthRequiredView.js +33 -0
  134. package/lib/examples/components/ErrorView.d.ts +14 -0
  135. package/lib/examples/components/ErrorView.js +20 -0
  136. package/lib/examples/components/ExampleWrapper.d.ts +7 -0
  137. package/lib/examples/components/ExampleWrapper.js +25 -6
  138. package/lib/examples/{ag-ui → components}/haiku/HaikuDisplay.js +1 -1
  139. package/lib/examples/{ag-ui → components}/haiku/InlineHaikuCard.js +1 -1
  140. package/lib/examples/{ag-ui → components}/haiku/index.d.ts +1 -1
  141. package/lib/examples/{ag-ui → components}/haiku/index.js +1 -1
  142. package/lib/examples/components/index.d.ts +5 -0
  143. package/lib/examples/components/index.js +5 -0
  144. package/lib/examples/{ag-ui → components}/weather/index.d.ts +1 -1
  145. package/lib/examples/{ag-ui → components}/weather/index.js +1 -1
  146. package/lib/examples/example-selector.d.ts +17 -4
  147. package/lib/examples/example-selector.js +107 -41
  148. package/lib/examples/index.d.ts +9 -6
  149. package/lib/examples/index.js +9 -6
  150. package/lib/examples/main.d.ts +1 -0
  151. package/lib/examples/main.js +218 -27
  152. package/lib/examples/utils/a2ui.d.ts +18 -0
  153. package/lib/examples/utils/a2ui.js +69 -0
  154. package/lib/examples/utils/a2uiMarkdownProvider.d.ts +7 -0
  155. package/lib/examples/utils/a2uiMarkdownProvider.js +9 -0
  156. package/lib/examples/utils/agentId.d.ts +18 -0
  157. package/lib/examples/utils/agentId.js +54 -0
  158. package/lib/examples/utils/agents/earthquake-detector.json +11 -11
  159. package/lib/examples/utils/agents/sales-forecaster.json +11 -11
  160. package/lib/examples/utils/agents/social-post-generator.json +11 -11
  161. package/lib/examples/utils/agents/stock-market.json +11 -11
  162. package/lib/examples/utils/examplesStore.js +82 -27
  163. package/lib/hooks/index.d.ts +8 -8
  164. package/lib/hooks/index.js +7 -7
  165. package/lib/hooks/useA2A.d.ts +2 -3
  166. package/lib/hooks/useAIAgentsWebSocket.d.ts +43 -4
  167. package/lib/hooks/useAIAgentsWebSocket.js +118 -12
  168. package/lib/hooks/useAcp.d.ts +1 -2
  169. package/lib/hooks/useAgUi.d.ts +1 -1
  170. package/lib/hooks/{useAgents.d.ts → useAgentRuntimes.d.ts} +39 -2
  171. package/lib/hooks/{useAgents.js → useAgentRuntimes.js} +125 -15
  172. package/lib/hooks/useAgentsCatalog.js +1 -1
  173. package/lib/hooks/useAgentsService.d.ts +2 -2
  174. package/lib/hooks/useAgentsService.js +7 -7
  175. package/lib/hooks/useCheckpoints.js +1 -1
  176. package/lib/hooks/useConfig.d.ts +4 -1
  177. package/lib/hooks/useConfig.js +10 -3
  178. package/lib/hooks/useContextSnapshot.d.ts +9 -4
  179. package/lib/hooks/useContextSnapshot.js +9 -37
  180. package/lib/hooks/useMonitoring.js +3 -0
  181. package/lib/hooks/useSandbox.d.ts +20 -8
  182. package/lib/hooks/useSandbox.js +105 -40
  183. package/lib/hooks/useSkills.d.ts +23 -5
  184. package/lib/hooks/useSkills.js +94 -39
  185. package/lib/hooks/useToolApprovals.d.ts +60 -36
  186. package/lib/hooks/useToolApprovals.js +318 -69
  187. package/lib/hooks/useVercelAI.d.ts +1 -1
  188. package/lib/index.d.ts +2 -1
  189. package/lib/index.js +1 -0
  190. package/lib/inference/index.d.ts +0 -1
  191. package/lib/middleware/index.d.ts +0 -1
  192. package/lib/protocols/AGUIAdapter.js +6 -0
  193. package/lib/protocols/VercelAIAdapter.d.ts +9 -0
  194. package/lib/protocols/VercelAIAdapter.js +144 -26
  195. package/lib/shims/json5.d.ts +4 -0
  196. package/lib/shims/json5.js +8 -0
  197. package/lib/specs/agents/agents.d.ts +10 -0
  198. package/lib/specs/agents/agents.js +752 -24
  199. package/lib/specs/envvars.d.ts +1 -0
  200. package/lib/specs/envvars.js +11 -0
  201. package/lib/specs/events.d.ts +1 -0
  202. package/lib/specs/events.js +1 -0
  203. package/lib/specs/index.d.ts +1 -0
  204. package/lib/specs/index.js +1 -0
  205. package/lib/specs/personas.d.ts +41 -0
  206. package/lib/specs/personas.js +168 -0
  207. package/lib/specs/skills.d.ts +2 -1
  208. package/lib/specs/skills.js +23 -5
  209. package/lib/specs/tools.js +3 -0
  210. package/lib/stores/agentRuntimeStore.d.ts +204 -0
  211. package/lib/stores/agentRuntimeStore.js +636 -0
  212. package/lib/stores/index.d.ts +1 -1
  213. package/lib/stores/index.js +1 -1
  214. package/lib/tools/adapters/copilotkit/lexicalHooks.d.ts +1 -2
  215. package/lib/tools/adapters/copilotkit/lexicalHooks.js +1 -3
  216. package/lib/tools/adapters/copilotkit/notebookHooks.d.ts +1 -2
  217. package/lib/tools/adapters/copilotkit/notebookHooks.js +1 -3
  218. package/lib/tools/index.d.ts +0 -2
  219. package/lib/tools/index.js +0 -1
  220. package/lib/types/agentspecs.d.ts +50 -1
  221. package/lib/types/chat.d.ts +309 -8
  222. package/lib/types/context.d.ts +27 -0
  223. package/lib/types/cost.d.ts +2 -2
  224. package/lib/types/index.d.ts +2 -0
  225. package/lib/types/index.js +2 -0
  226. package/lib/types/mcp.d.ts +8 -0
  227. package/lib/types/models.d.ts +2 -2
  228. package/lib/types/personas.d.ts +25 -0
  229. package/lib/types/personas.js +5 -0
  230. package/lib/types/skills.d.ts +43 -1
  231. package/lib/types/stream.d.ts +110 -0
  232. package/lib/types/stream.js +36 -0
  233. package/lib/types/tools.d.ts +2 -0
  234. package/lib/utils/utils.d.ts +9 -5
  235. package/lib/utils/utils.js +9 -5
  236. package/package.json +13 -9
  237. package/scripts/codegen/__pycache__/generate_agents.cpython-313.pyc +0 -0
  238. package/scripts/codegen/__pycache__/generate_events.cpython-313.pyc +0 -0
  239. package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
  240. package/scripts/codegen/generate_agents.py +106 -7
  241. package/scripts/codegen/generate_events.py +47 -17
  242. package/scripts/codegen/generate_personas.py +319 -0
  243. package/scripts/codegen/generate_skills.py +9 -9
  244. package/scripts/codegen/generate_tools.py +20 -0
  245. package/scripts/sync-jupyter.sh +26 -7
  246. package/style/primer-primitives.css +1 -6
  247. package/lib/api/tool-approvals.d.ts +0 -62
  248. package/lib/api/tool-approvals.js +0 -145
  249. package/lib/examples/LexicalSidebarExample.js +0 -163
  250. package/lib/examples/NotebookSidebarExample.js +0 -119
  251. package/lib/examples/NotebookSimpleExample.d.ts +0 -6
  252. package/lib/examples/NotebookSimpleExample.js +0 -22
  253. package/lib/examples/ag-ui/index.d.ts +0 -10
  254. package/lib/examples/ag-ui/index.js +0 -16
  255. package/lib/hooks/useAgentsRegistry.d.ts +0 -10
  256. package/lib/hooks/useAgentsRegistry.js +0 -20
  257. package/lib/stores/agentsStore.d.ts +0 -123
  258. package/lib/stores/agentsStore.js +0 -270
  259. package/scripts/codegen/__pycache__/generate_envvars.cpython-313.pyc +0 -0
  260. package/scripts/codegen/__pycache__/generate_evals.cpython-313.pyc +0 -0
  261. package/scripts/codegen/__pycache__/generate_guardrails.cpython-313.pyc +0 -0
  262. package/scripts/codegen/__pycache__/generate_mcp_servers.cpython-313.pyc +0 -0
  263. package/scripts/codegen/__pycache__/generate_memory.cpython-313.pyc +0 -0
  264. package/scripts/codegen/__pycache__/generate_models.cpython-313.pyc +0 -0
  265. package/scripts/codegen/__pycache__/generate_notifications.cpython-313.pyc +0 -0
  266. package/scripts/codegen/__pycache__/generate_outputs.cpython-313.pyc +0 -0
  267. package/scripts/codegen/__pycache__/generate_skills.cpython-313.pyc +0 -0
  268. package/scripts/codegen/__pycache__/generate_teams.cpython-313.pyc +0 -0
  269. package/scripts/codegen/__pycache__/generate_tools.cpython-313.pyc +0 -0
  270. package/scripts/codegen/__pycache__/generate_triggers.cpython-313.pyc +0 -0
  271. /package/lib/examples/{AgentspecExample.d.ts → AgentSpecsExample.d.ts} +0 -0
  272. /package/lib/examples/{ag-ui → components}/haiku/HaikuDisplay.d.ts +0 -0
  273. /package/lib/examples/{ag-ui → components}/haiku/InlineHaikuCard.d.ts +0 -0
  274. /package/lib/examples/{ag-ui → components}/weather/InlineWeatherCard.d.ts +0 -0
  275. /package/lib/examples/{ag-ui → components}/weather/InlineWeatherCard.js +0 -0
@@ -1,270 +0,0 @@
1
- /*
2
- * Copyright (c) 2025-2026 Datalayer, Inc.
3
- * Distributed under the terms of the Modified BSD License.
4
- */
5
- /**
6
- * Zustand store for agent runtime connection state.
7
- *
8
- * Manages two distinct concepts:
9
- *
10
- * 1. **Agent Runtime** — a single currently-connected pod (launch, connect,
11
- * create agent, disconnect). Runtime pods are ephemeral; they have a
12
- * `podName` and a lifecycle (idle → launching → ready → disconnected).
13
- *
14
- * 2. **Agents Registry** — a persisted registry of URL-addressable agents
15
- * that were previously connected. Each entry has a `baseUrl` + transport
16
- * pair and can be from any source (agent runtimes OR the stable agents
17
- * service at `/api/v1/ai-agents/`).
18
- *
19
- * @module store/agentsStore
20
- */
21
- import { createStore } from 'zustand/vanilla';
22
- import { useStore } from 'zustand';
23
- import { persist, createJSONStorage } from 'zustand/middleware';
24
- // ─── Helper: build the transport-specific endpoint URL ────────────────────
25
- function getTransportEndpoint(baseUrl, transport, agentId) {
26
- switch (transport) {
27
- case 'vercel-ai':
28
- return `${baseUrl}/api/v1/vercel-ai/${agentId}`;
29
- case 'a2a':
30
- return `${baseUrl}/api/v1/a2a/agents/${agentId}/`;
31
- case 'acp':
32
- return `${baseUrl}/api/v1/acp/ws/${agentId}`;
33
- case 'ag-ui':
34
- default:
35
- return `${baseUrl}/api/v1/ag-ui/${agentId}/`;
36
- }
37
- }
38
- // ─── Helper: register agent on the runtime ────────────────────────────────
39
- async function createAgentOnRuntime(agentBaseUrl, agentId, config = {}) {
40
- const transport = config.protocol || 'ag-ui';
41
- const response = await fetch(`${agentBaseUrl}/api/v1/agents`, {
42
- method: 'POST',
43
- headers: { 'Content-Type': 'application/json' },
44
- body: JSON.stringify({
45
- name: config.name || agentId,
46
- description: config.description || 'AI assistant',
47
- agent_library: config.agentLibrary || 'pydantic-ai',
48
- transport,
49
- model: config.model || 'bedrock:us.anthropic.claude-sonnet-4-5-20250929-v1:0',
50
- system_prompt: config.systemPrompt || 'You are a helpful AI assistant.',
51
- }),
52
- });
53
- if (response.ok || response.status === 400) {
54
- // 400 means agent already exists, which is fine
55
- const endpoint = getTransportEndpoint(agentBaseUrl, transport, agentId);
56
- return { agentId, endpoint, isReady: true };
57
- }
58
- const errorData = await response.json().catch(() => ({}));
59
- throw new Error(errorData.detail || `Failed to create agent: ${response.status}`);
60
- }
61
- // ─── Initial runtime state ────────────────────────────────────────────────
62
- const initialRuntimeState = {
63
- runtime: null,
64
- status: 'idle',
65
- error: null,
66
- isLaunching: false,
67
- };
68
- // ─── Combined Zustand store ───────────────────────────────────────────────
69
- export const agentStore = createStore()(persist((set, get) => ({
70
- // ── Agent registry ────────────────────────────────────────────────
71
- agents: [],
72
- upsertAgent: agentData => {
73
- set(state => {
74
- const existingIndex = state.agents.findIndex(a => a.id === agentData.id);
75
- const now = Date.now();
76
- if (existingIndex >= 0) {
77
- const updatedAgents = [...state.agents];
78
- updatedAgents[existingIndex] = {
79
- ...updatedAgents[existingIndex],
80
- ...agentData,
81
- lastUpdated: now,
82
- };
83
- return { agents: updatedAgents };
84
- }
85
- const newAgent = {
86
- name: agentData.name || agentData.id,
87
- description: agentData.description || '',
88
- status: agentData.status || 'initializing',
89
- lastUpdated: now,
90
- ...agentData,
91
- };
92
- return { agents: [...state.agents, newAgent] };
93
- });
94
- },
95
- getAgentById: (id) => {
96
- return get().agents.find(agent => agent.id === id);
97
- },
98
- getAgentByUrl: (baseUrl, protocol) => {
99
- return get().agents.find(agent => agent.baseUrl === baseUrl && agent.protocol === protocol);
100
- },
101
- updateAgentStatus: (id, status, error = null) => {
102
- set(state => {
103
- const index = state.agents.findIndex(a => a.id === id);
104
- if (index >= 0) {
105
- const updatedAgents = [...state.agents];
106
- updatedAgents[index] = {
107
- ...updatedAgents[index],
108
- status,
109
- error,
110
- lastUpdated: Date.now(),
111
- };
112
- return { agents: updatedAgents };
113
- }
114
- return {};
115
- });
116
- },
117
- toggleAgentStatus: (id) => {
118
- set(state => {
119
- const index = state.agents.findIndex(a => a.id === id);
120
- if (index >= 0) {
121
- const updatedAgents = [...state.agents];
122
- const currentStatus = updatedAgents[index].status;
123
- updatedAgents[index] = {
124
- ...updatedAgents[index],
125
- status: currentStatus === 'running' ? 'paused' : 'running',
126
- lastUpdated: Date.now(),
127
- };
128
- return { agents: updatedAgents };
129
- }
130
- return {};
131
- });
132
- },
133
- deleteAgent: (id) => {
134
- set(state => ({
135
- agents: state.agents.filter(a => a.id !== id),
136
- }));
137
- },
138
- clearAgents: () => {
139
- set({ agents: [] });
140
- },
141
- // ── Agent runtime pod ───────────────────────────────────────────
142
- ...initialRuntimeState,
143
- connectAgent: connection => {
144
- const baseUrl = connection.jupyterBaseUrl ||
145
- connection.serviceManager?.serverSettings.baseUrl;
146
- if (!baseUrl) {
147
- throw new Error('connectAgent requires either jupyterBaseUrl or serviceManager');
148
- }
149
- const agentBaseUrl = baseUrl.replace('/jupyter/server/', '/agent-runtimes/');
150
- set({
151
- runtime: {
152
- podName: connection.podName,
153
- environmentName: connection.environmentName,
154
- jupyterBaseUrl: baseUrl,
155
- agentBaseUrl,
156
- serviceManager: connection.serviceManager,
157
- status: 'ready',
158
- kernelId: connection.kernelId,
159
- },
160
- status: 'ready',
161
- error: null,
162
- });
163
- },
164
- launchAgent: async (config) => {
165
- set({ status: 'launching', error: null, isLaunching: true });
166
- try {
167
- const { createRuntime } = await import('@datalayer/core/lib/api');
168
- const runtimePod = await createRuntime({
169
- environmentName: config.environmentName,
170
- creditsLimit: config.creditsLimit,
171
- type: config.type || 'notebook',
172
- givenName: config.givenName,
173
- capabilities: config.capabilities,
174
- snapshot: config.snapshot,
175
- });
176
- set({ status: 'connecting' });
177
- const jupyterBaseUrl = runtimePod.ingress;
178
- const agentBaseUrl = jupyterBaseUrl.replace('/jupyter/server/', '/agent-runtimes/');
179
- const connection = {
180
- podName: runtimePod.pod_name,
181
- environmentName: runtimePod.environment_name,
182
- jupyterBaseUrl,
183
- agentBaseUrl,
184
- status: 'ready',
185
- };
186
- set({ runtime: connection, status: 'ready', isLaunching: false });
187
- return connection;
188
- }
189
- catch (err) {
190
- const errorMessage = err instanceof Error ? err.message : 'Failed to launch runtime';
191
- set({ status: 'error', error: errorMessage, isLaunching: false });
192
- throw err;
193
- }
194
- },
195
- createAgent: async (config = {}) => {
196
- const { runtime } = get();
197
- if (!runtime) {
198
- throw new Error('No runtime connected. Launch or connect to a runtime first.');
199
- }
200
- try {
201
- const agentId = config.name || runtime.podName;
202
- const agentConnection = await createAgentOnRuntime(runtime.agentBaseUrl, agentId, config);
203
- set({
204
- runtime: {
205
- ...runtime,
206
- agentId: agentConnection.agentId,
207
- endpoint: agentConnection.endpoint,
208
- isReady: agentConnection.isReady,
209
- },
210
- });
211
- return agentConnection;
212
- }
213
- catch (err) {
214
- const errorMessage = err instanceof Error ? err.message : 'Failed to create agent';
215
- set({ error: errorMessage });
216
- throw err;
217
- }
218
- },
219
- disconnect: () => {
220
- set({ runtime: null, status: 'disconnected', error: null });
221
- },
222
- clearError: () => set({ error: null }),
223
- setError: error => set({ error, status: 'error' }),
224
- reset: () => set(initialRuntimeState),
225
- }), {
226
- name: 'agent-runtimes-storage',
227
- storage: createJSONStorage(() => localStorage),
228
- // Only persist the agent registry; runtime connection state is ephemeral.
229
- partialize: state => ({
230
- agents: state.agents.map(agent => ({
231
- id: agent.id,
232
- name: agent.name,
233
- description: agent.description,
234
- baseUrl: agent.baseUrl,
235
- transport: agent.protocol,
236
- status: agent.status,
237
- lastUpdated: agent.lastUpdated,
238
- documentId: agent.documentId,
239
- runtimeId: agent.runtimeId,
240
- })),
241
- }),
242
- }));
243
- export function useAgentStore(selector) {
244
- return useStore(agentStore, selector);
245
- }
246
- // Attach getState / subscribe for non-React consumers
247
- useAgentStore.getState = agentStore.getState;
248
- useAgentStore.subscribe = agentStore.subscribe;
249
- // ─── Focused selector hooks ────────────────────────────────────────────────
250
- /** Currently-connected agent runtime pod connection. */
251
- export const useAgentRuntime = () => useAgentStore(state => state.runtime);
252
- /**
253
- * @deprecated Use useAgentRuntime() — agent fields are merged onto the runtime connection.
254
- */
255
- export const useAgentFromStore = () => useAgentStore(state => state.runtime
256
- ? {
257
- agentId: state.runtime.agentId,
258
- endpoint: state.runtime.endpoint,
259
- isReady: state.runtime.isReady,
260
- }
261
- : null);
262
- export const useAgentStatus = () => useAgentStore(state => state.status);
263
- export const useAgentError = () => useAgentStore(state => state.error);
264
- export const useIsLaunching = () => useAgentStore(state => state.isLaunching);
265
- // ─── Non-React access ──────────────────────────────────────────────────────
266
- /** Get agent runtime store state outside React. */
267
- export const getAgentState = () => agentStore.getState();
268
- /** Subscribe to agent runtime store outside React. */
269
- export const subscribeToAgent = agentStore.subscribe;
270
- export default useAgentStore;