deepagentsdk 0.11.0 → 0.12.0

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 (103) hide show
  1. package/dist/adapters/elements/index.cjs +324 -0
  2. package/dist/adapters/elements/index.cjs.map +1 -0
  3. package/dist/adapters/elements/index.d.cts +212 -0
  4. package/dist/adapters/elements/index.d.mts +212 -0
  5. package/dist/adapters/elements/index.mjs +320 -0
  6. package/dist/adapters/elements/index.mjs.map +1 -0
  7. package/dist/agent-CrH-He58.mjs +2974 -0
  8. package/dist/agent-CrH-He58.mjs.map +1 -0
  9. package/dist/agent-Cuks-Idh.cjs +3396 -0
  10. package/dist/agent-Cuks-Idh.cjs.map +1 -0
  11. package/dist/chunk-CbDLau6x.cjs +34 -0
  12. package/dist/cli/index.cjs +3162 -0
  13. package/dist/cli/index.cjs.map +1 -0
  14. package/dist/cli/index.d.cts +1 -0
  15. package/dist/cli/index.d.mts +1 -0
  16. package/dist/cli/index.mjs +3120 -0
  17. package/dist/cli/index.mjs.map +1 -0
  18. package/dist/file-saver-BJCqMIb5.mjs +655 -0
  19. package/dist/file-saver-BJCqMIb5.mjs.map +1 -0
  20. package/dist/file-saver-C6O2LAvg.cjs +679 -0
  21. package/dist/file-saver-C6O2LAvg.cjs.map +1 -0
  22. package/dist/index.cjs +1471 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.cts +1581 -0
  25. package/dist/index.d.mts +1581 -0
  26. package/dist/index.mjs +1371 -0
  27. package/dist/index.mjs.map +1 -0
  28. package/dist/load-79a2H4m0.cjs +163 -0
  29. package/dist/load-79a2H4m0.cjs.map +1 -0
  30. package/dist/load-94gjHorc.mjs +3 -0
  31. package/dist/load-B6CA5js_.mjs +142 -0
  32. package/dist/load-B6CA5js_.mjs.map +1 -0
  33. package/dist/load-C2qVmZMp.cjs +3 -0
  34. package/dist/types-4g9UvXal.d.mts +1151 -0
  35. package/dist/types-IulnvhFg.d.cts +1151 -0
  36. package/package.json +26 -12
  37. package/src/adapters/elements/index.ts +0 -27
  38. package/src/adapters/elements/messageAdapter.ts +0 -165
  39. package/src/adapters/elements/statusAdapter.ts +0 -39
  40. package/src/adapters/elements/types.ts +0 -97
  41. package/src/adapters/elements/useElementsAdapter.ts +0 -261
  42. package/src/agent.ts +0 -1258
  43. package/src/backends/composite.ts +0 -273
  44. package/src/backends/filesystem.ts +0 -692
  45. package/src/backends/index.ts +0 -22
  46. package/src/backends/local-sandbox.ts +0 -175
  47. package/src/backends/persistent.ts +0 -593
  48. package/src/backends/sandbox.ts +0 -510
  49. package/src/backends/state.ts +0 -244
  50. package/src/backends/utils.ts +0 -287
  51. package/src/checkpointer/file-saver.ts +0 -98
  52. package/src/checkpointer/index.ts +0 -5
  53. package/src/checkpointer/kv-saver.ts +0 -82
  54. package/src/checkpointer/memory-saver.ts +0 -82
  55. package/src/checkpointer/types.ts +0 -125
  56. package/src/cli/components/ApiKeyInput.tsx +0 -300
  57. package/src/cli/components/FilePreview.tsx +0 -237
  58. package/src/cli/components/Input.tsx +0 -277
  59. package/src/cli/components/Message.tsx +0 -93
  60. package/src/cli/components/ModelSelection.tsx +0 -338
  61. package/src/cli/components/SlashMenu.tsx +0 -101
  62. package/src/cli/components/StatusBar.tsx +0 -89
  63. package/src/cli/components/Subagent.tsx +0 -91
  64. package/src/cli/components/TodoList.tsx +0 -133
  65. package/src/cli/components/ToolApproval.tsx +0 -70
  66. package/src/cli/components/ToolCall.tsx +0 -144
  67. package/src/cli/components/ToolCallSummary.tsx +0 -175
  68. package/src/cli/components/Welcome.tsx +0 -75
  69. package/src/cli/components/index.ts +0 -24
  70. package/src/cli/hooks/index.ts +0 -12
  71. package/src/cli/hooks/useAgent.ts +0 -933
  72. package/src/cli/index.tsx +0 -1066
  73. package/src/cli/theme.ts +0 -205
  74. package/src/cli/utils/model-list.ts +0 -365
  75. package/src/constants/errors.ts +0 -29
  76. package/src/constants/limits.ts +0 -195
  77. package/src/index.ts +0 -176
  78. package/src/middleware/agent-memory.ts +0 -330
  79. package/src/prompts.ts +0 -196
  80. package/src/skills/index.ts +0 -2
  81. package/src/skills/load.ts +0 -191
  82. package/src/skills/types.ts +0 -53
  83. package/src/tools/execute.ts +0 -167
  84. package/src/tools/filesystem.ts +0 -418
  85. package/src/tools/index.ts +0 -39
  86. package/src/tools/subagent.ts +0 -443
  87. package/src/tools/todos.ts +0 -101
  88. package/src/tools/web.ts +0 -567
  89. package/src/types/backend.ts +0 -177
  90. package/src/types/core.ts +0 -220
  91. package/src/types/events.ts +0 -430
  92. package/src/types/index.ts +0 -94
  93. package/src/types/structured-output.ts +0 -43
  94. package/src/types/subagent.ts +0 -96
  95. package/src/types.ts +0 -22
  96. package/src/utils/approval.ts +0 -213
  97. package/src/utils/events.ts +0 -416
  98. package/src/utils/eviction.ts +0 -181
  99. package/src/utils/index.ts +0 -34
  100. package/src/utils/model-parser.ts +0 -38
  101. package/src/utils/patch-tool-calls.ts +0 -233
  102. package/src/utils/project-detection.ts +0 -32
  103. package/src/utils/summarization.ts +0 -254
@@ -0,0 +1,324 @@
1
+ const require_chunk = require('../../chunk-CbDLau6x.cjs');
2
+ const require_agent = require('../../agent-Cuks-Idh.cjs');
3
+ let react = require("react");
4
+
5
+ //#region src/adapters/elements/messageAdapter.ts
6
+ /**
7
+ * Converts agent event log to UIMessage format expected by Elements
8
+ *
9
+ * @param events - Array of agent events from useAgent hook
10
+ * @param streamingText - Current streaming text (if any)
11
+ * @param uiStatus - Current UI status
12
+ * @returns Array of UIMessage objects for Elements Message component
13
+ *
14
+ * Conversion logic:
15
+ * 1. Group events by role (user/assistant)
16
+ * 2. Convert each event type to appropriate UIMessagePart
17
+ * 3. Handle streaming text as in-progress message
18
+ * 4. Preserve event order and tool call/result pairing
19
+ */
20
+ function convertEventsToUIMessages(events, streamingText, uiStatus) {
21
+ const messages = [];
22
+ let currentAssistantParts = [];
23
+ let messageIdCounter = 0;
24
+ const generateMessageId = () => {
25
+ return `msg-${Date.now()}-${++messageIdCounter}`;
26
+ };
27
+ for (const eventLog of events) {
28
+ const event = eventLog.event;
29
+ switch (event.type) {
30
+ case "user-message":
31
+ if (currentAssistantParts.length > 0) {
32
+ messages.push({
33
+ id: generateMessageId(),
34
+ role: "assistant",
35
+ parts: currentAssistantParts,
36
+ status: "ready"
37
+ });
38
+ currentAssistantParts = [];
39
+ }
40
+ messages.push({
41
+ id: eventLog.id,
42
+ role: "user",
43
+ parts: [{
44
+ type: "text",
45
+ text: event.content
46
+ }],
47
+ status: "ready"
48
+ });
49
+ break;
50
+ case "text-segment":
51
+ currentAssistantParts.push({
52
+ type: "text",
53
+ text: event.text
54
+ });
55
+ break;
56
+ case "tool-call":
57
+ currentAssistantParts.push({
58
+ type: "tool-call",
59
+ toolCallId: event.toolCallId,
60
+ toolName: event.toolName,
61
+ args: event.args
62
+ });
63
+ break;
64
+ case "tool-result":
65
+ currentAssistantParts.push({
66
+ type: "tool-result",
67
+ toolCallId: event.toolCallId,
68
+ toolName: event.toolName,
69
+ result: event.result,
70
+ isError: event.isError
71
+ });
72
+ break;
73
+ default: break;
74
+ }
75
+ }
76
+ if (streamingText || currentAssistantParts.length > 0) {
77
+ if (streamingText) currentAssistantParts.push({
78
+ type: "text",
79
+ text: streamingText
80
+ });
81
+ let messageStatus = "ready";
82
+ if (uiStatus === "streaming") messageStatus = "streaming";
83
+ else if (uiStatus === "submitted") messageStatus = "submitted";
84
+ else if (uiStatus === "error") messageStatus = "error";
85
+ messages.push({
86
+ id: generateMessageId(),
87
+ role: "assistant",
88
+ parts: currentAssistantParts,
89
+ status: messageStatus
90
+ });
91
+ }
92
+ return messages;
93
+ }
94
+ /**
95
+ * Extracts tool parts from the most recent assistant message
96
+ *
97
+ * @param messages - UIMessage array
98
+ * @returns Array of tool parts (tool-call and tool-result)
99
+ */
100
+ function extractToolParts(messages) {
101
+ const lastAssistantMessage = [...messages].reverse().find((m) => m.role === "assistant");
102
+ if (!lastAssistantMessage) return [];
103
+ return lastAssistantMessage.parts.filter((part) => part.type === "tool-call" || part.type === "tool-result").map((part) => {
104
+ if (part.type === "tool-call") return {
105
+ type: "tool-call",
106
+ toolCallId: part.toolCallId,
107
+ toolName: part.toolName,
108
+ args: part.args
109
+ };
110
+ else return {
111
+ type: "tool-result",
112
+ toolCallId: part.toolCallId,
113
+ toolName: part.toolName,
114
+ result: part.result,
115
+ isError: part.isError
116
+ };
117
+ });
118
+ }
119
+
120
+ //#endregion
121
+ //#region src/adapters/elements/statusAdapter.ts
122
+ /**
123
+ * Maps deepagentsdk AgentStatus to Elements UIStatus
124
+ *
125
+ * @param agentStatus - The agent status from useAgent hook
126
+ * @returns The corresponding UI status for Elements components
127
+ *
128
+ * Mapping rules:
129
+ * - idle/done → ready (agent is waiting for input)
130
+ * - thinking/tool-call/subagent → submitted (agent is processing)
131
+ * - streaming → streaming (agent is generating text)
132
+ * - error → error (an error occurred)
133
+ */
134
+ function mapAgentStatusToUIStatus(agentStatus) {
135
+ switch (agentStatus) {
136
+ case "thinking":
137
+ case "tool-call":
138
+ case "subagent": return "submitted";
139
+ case "streaming": return "streaming";
140
+ case "error": return "error";
141
+ case "idle":
142
+ case "done":
143
+ default: return "ready";
144
+ }
145
+ }
146
+
147
+ //#endregion
148
+ //#region src/adapters/elements/useElementsAdapter.ts
149
+ /**
150
+ * React hook adapter for AI SDK Elements
151
+ *
152
+ * Provides Elements-compatible interface for deepagentsdk
153
+ */
154
+ let eventCounter = 0;
155
+ function createEventId() {
156
+ return `event-${++eventCounter}`;
157
+ }
158
+ /**
159
+ * Hook that adapts deepagentsdk to work with AI SDK Elements UI components
160
+ *
161
+ * @param options - Configuration options
162
+ * @returns Elements-compatible interface
163
+ *
164
+ * @example
165
+ * ```tsx
166
+ * import { useElementsAdapter } from 'deepagentsdk/elements';
167
+ * import { Conversation, Message, PromptInput } from '@/components/ai-elements';
168
+ *
169
+ * function Chat() {
170
+ * const { uiMessages, sendMessage } = useElementsAdapter({
171
+ * model,
172
+ * backend
173
+ * });
174
+ *
175
+ * return (
176
+ * <Conversation>
177
+ * {uiMessages.map(msg => <Message key={msg.id} from={msg.role} />)}
178
+ * <PromptInput onSubmit={sendMessage} />
179
+ * </Conversation>
180
+ * );
181
+ * }
182
+ * ```
183
+ */
184
+ function useElementsAdapter(options) {
185
+ const { model, backend, tools, maxSteps = 10, systemPrompt } = options;
186
+ const [status, setStatus] = (0, react.useState)("idle");
187
+ const [streamingText, setStreamingText] = (0, react.useState)("");
188
+ const [events, setEvents] = (0, react.useState)([]);
189
+ const [state, setState] = (0, react.useState)({
190
+ todos: [],
191
+ files: {}
192
+ });
193
+ const abortControllerRef = (0, react.useRef)(null);
194
+ const accumulatedTextRef = (0, react.useRef)("");
195
+ const agentRef = (0, react.useRef)(require_agent.createDeepAgent({
196
+ model,
197
+ maxSteps,
198
+ systemPrompt,
199
+ backend,
200
+ tools
201
+ }));
202
+ const addEvent = (0, react.useCallback)((event) => {
203
+ setEvents((prev) => [...prev, {
204
+ id: createEventId(),
205
+ type: event.type,
206
+ event,
207
+ timestamp: /* @__PURE__ */ new Date()
208
+ }]);
209
+ }, []);
210
+ const flushTextSegment = (0, react.useCallback)(() => {
211
+ if (accumulatedTextRef.current.trim()) {
212
+ addEvent({
213
+ type: "text-segment",
214
+ text: accumulatedTextRef.current
215
+ });
216
+ accumulatedTextRef.current = "";
217
+ setStreamingText("");
218
+ }
219
+ }, [addEvent]);
220
+ const sendMessage = async (message) => {
221
+ if (!message.text.trim()) return;
222
+ setStatus("thinking");
223
+ setStreamingText("");
224
+ accumulatedTextRef.current = "";
225
+ addEvent({
226
+ type: "user-message",
227
+ content: message.text
228
+ });
229
+ abortControllerRef.current = new AbortController();
230
+ try {
231
+ for await (const event of agentRef.current.streamWithEvents({
232
+ messages: [{
233
+ role: "user",
234
+ content: message.text
235
+ }],
236
+ state,
237
+ abortSignal: abortControllerRef.current.signal
238
+ })) switch (event.type) {
239
+ case "text":
240
+ setStatus("streaming");
241
+ accumulatedTextRef.current += event.text;
242
+ setStreamingText(accumulatedTextRef.current);
243
+ break;
244
+ case "step-start":
245
+ if (event.stepNumber > 1) addEvent(event);
246
+ break;
247
+ case "tool-call":
248
+ flushTextSegment();
249
+ setStatus("tool-call");
250
+ addEvent(event);
251
+ break;
252
+ case "tool-result":
253
+ addEvent(event);
254
+ break;
255
+ case "todos-changed":
256
+ flushTextSegment();
257
+ setStatus("tool-call");
258
+ setState((prev) => ({
259
+ ...prev,
260
+ todos: event.todos
261
+ }));
262
+ addEvent(event);
263
+ break;
264
+ case "done":
265
+ flushTextSegment();
266
+ setStatus("done");
267
+ setState(event.state);
268
+ addEvent(event);
269
+ break;
270
+ case "error":
271
+ flushTextSegment();
272
+ setStatus("error");
273
+ addEvent(event);
274
+ break;
275
+ default:
276
+ addEvent(event);
277
+ break;
278
+ }
279
+ setStatus("idle");
280
+ } catch (err) {
281
+ if (err.name === "AbortError") {
282
+ flushTextSegment();
283
+ setStatus("idle");
284
+ } else {
285
+ flushTextSegment();
286
+ setStatus("error");
287
+ }
288
+ } finally {
289
+ abortControllerRef.current = null;
290
+ }
291
+ };
292
+ const abort = (0, react.useCallback)(() => {
293
+ if (abortControllerRef.current) {
294
+ abortControllerRef.current.abort();
295
+ setStatus("idle");
296
+ }
297
+ }, []);
298
+ const clear = (0, react.useCallback)(() => {
299
+ setEvents([]);
300
+ setStreamingText("");
301
+ setStatus("idle");
302
+ }, []);
303
+ const uiStatus = (0, react.useMemo)(() => mapAgentStatusToUIStatus(status), [status]);
304
+ const uiMessages = (0, react.useMemo)(() => convertEventsToUIMessages(events, streamingText, uiStatus), [
305
+ events,
306
+ streamingText,
307
+ uiStatus
308
+ ]);
309
+ return {
310
+ uiMessages,
311
+ uiStatus,
312
+ toolParts: (0, react.useMemo)(() => extractToolParts(uiMessages), [uiMessages]),
313
+ sendMessage,
314
+ abort,
315
+ clear
316
+ };
317
+ }
318
+
319
+ //#endregion
320
+ exports.convertEventsToUIMessages = convertEventsToUIMessages;
321
+ exports.extractToolParts = extractToolParts;
322
+ exports.mapAgentStatusToUIStatus = mapAgentStatusToUIStatus;
323
+ exports.useElementsAdapter = useElementsAdapter;
324
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["createDeepAgent"],"sources":["../../../src/adapters/elements/messageAdapter.ts","../../../src/adapters/elements/statusAdapter.ts","../../../src/adapters/elements/useElementsAdapter.ts"],"sourcesContent":["/**\n * Message transformation adapter for AI SDK Elements\n *\n * Converts deepagentsdk events to Elements UIMessage format\n */\n\nimport type { AgentEventLog } from \"../../cli/hooks/useAgent\";\nimport type { UIMessage, UIMessagePart, UIStatus } from \"./types\";\n\n/**\n * Converts agent event log to UIMessage format expected by Elements\n *\n * @param events - Array of agent events from useAgent hook\n * @param streamingText - Current streaming text (if any)\n * @param uiStatus - Current UI status\n * @returns Array of UIMessage objects for Elements Message component\n *\n * Conversion logic:\n * 1. Group events by role (user/assistant)\n * 2. Convert each event type to appropriate UIMessagePart\n * 3. Handle streaming text as in-progress message\n * 4. Preserve event order and tool call/result pairing\n */\nexport function convertEventsToUIMessages(\n events: AgentEventLog[],\n streamingText: string,\n uiStatus: UIStatus\n): UIMessage[] {\n const messages: UIMessage[] = [];\n let currentAssistantParts: UIMessagePart[] = [];\n let messageIdCounter = 0;\n\n const generateMessageId = (): string => {\n return `msg-${Date.now()}-${++messageIdCounter}`;\n };\n\n for (const eventLog of events) {\n const event = eventLog.event;\n\n switch (event.type) {\n case \"user-message\":\n // Flush any pending assistant parts before user message\n if (currentAssistantParts.length > 0) {\n messages.push({\n id: generateMessageId(),\n role: \"assistant\",\n parts: currentAssistantParts,\n status: \"ready\",\n });\n currentAssistantParts = [];\n }\n\n // Add user message\n messages.push({\n id: eventLog.id,\n role: \"user\",\n parts: [{ type: \"text\", text: event.content }],\n status: \"ready\",\n });\n break;\n\n case \"text-segment\":\n // Add text segment as separate text part\n currentAssistantParts.push({\n type: \"text\",\n text: event.text,\n });\n break;\n\n case \"tool-call\":\n // Add tool call part\n currentAssistantParts.push({\n type: \"tool-call\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args,\n });\n break;\n\n case \"tool-result\":\n // Add tool result part\n currentAssistantParts.push({\n type: \"tool-result\",\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n result: event.result,\n isError: event.isError,\n });\n break;\n\n // Ignore other event types for message rendering\n // (they're handled separately by Elements components like Task, etc.)\n default:\n break;\n }\n }\n\n // Add streaming text as in-progress assistant message\n if (streamingText || currentAssistantParts.length > 0) {\n if (streamingText) {\n currentAssistantParts.push({ type: \"text\", text: streamingText });\n }\n\n // Determine status for current message\n let messageStatus: UIStatus = \"ready\";\n if (uiStatus === \"streaming\") {\n messageStatus = \"streaming\";\n } else if (uiStatus === \"submitted\") {\n messageStatus = \"submitted\";\n } else if (uiStatus === \"error\") {\n messageStatus = \"error\";\n }\n\n messages.push({\n id: generateMessageId(),\n role: \"assistant\",\n parts: currentAssistantParts,\n status: messageStatus,\n });\n }\n\n return messages;\n}\n\n/**\n * Extracts tool parts from the most recent assistant message\n *\n * @param messages - UIMessage array\n * @returns Array of tool parts (tool-call and tool-result)\n */\nexport function extractToolParts(messages: UIMessage[]) {\n // Get last assistant message\n const lastAssistantMessage = [...messages]\n .reverse()\n .find((m) => m.role === \"assistant\");\n\n if (!lastAssistantMessage) {\n return [];\n }\n\n // Extract only tool-related parts\n return lastAssistantMessage.parts\n .filter(\n (part): part is Extract<UIMessagePart, { type: \"tool-call\" | \"tool-result\" }> =>\n part.type === \"tool-call\" || part.type === \"tool-result\"\n )\n .map((part) => {\n if (part.type === \"tool-call\") {\n return {\n type: \"tool-call\" as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n };\n } else {\n return {\n type: \"tool-result\" as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n isError: part.isError,\n };\n }\n });\n}\n","/**\n * Status mapping adapter for AI SDK Elements\n *\n * Maps deepagentsdk AgentStatus to Elements UIStatus\n */\n\nimport type { AgentStatus } from \"../../cli/hooks/useAgent\";\nimport type { UIStatus } from \"./types\";\n\n/**\n * Maps deepagentsdk AgentStatus to Elements UIStatus\n *\n * @param agentStatus - The agent status from useAgent hook\n * @returns The corresponding UI status for Elements components\n *\n * Mapping rules:\n * - idle/done → ready (agent is waiting for input)\n * - thinking/tool-call/subagent → submitted (agent is processing)\n * - streaming → streaming (agent is generating text)\n * - error → error (an error occurred)\n */\nexport function mapAgentStatusToUIStatus(\n agentStatus: AgentStatus\n): UIStatus {\n switch (agentStatus) {\n case \"thinking\":\n case \"tool-call\":\n case \"subagent\":\n return \"submitted\";\n case \"streaming\":\n return \"streaming\";\n case \"error\":\n return \"error\";\n case \"idle\":\n case \"done\":\n default:\n return \"ready\";\n }\n}\n","/**\n * React hook adapter for AI SDK Elements\n *\n * Provides Elements-compatible interface for deepagentsdk\n */\n\nimport { useState, useCallback, useRef, useMemo } from \"react\";\nimport { createDeepAgent } from \"../../agent\";\nimport type { LanguageModel, ToolSet } from \"ai\";\nimport type {\n BackendProtocol,\n DeepAgentState,\n DeepAgentEvent,\n} from \"../../types\";\nimport {\n convertEventsToUIMessages,\n extractToolParts,\n} from \"./messageAdapter\";\nimport { mapAgentStatusToUIStatus } from \"./statusAdapter\";\nimport type { UseElementsAdapterReturn, PromptInputMessage } from \"./types\";\nimport type { AgentStatus, AgentEventLog } from \"../../cli/hooks/useAgent\";\n\n/**\n * Options for useElementsAdapter hook\n */\nexport interface UseElementsAdapterOptions {\n /**\n * Language model instance from AI SDK provider\n */\n model: LanguageModel;\n\n /**\n * Backend for state management\n */\n backend: BackendProtocol;\n\n /**\n * Optional tools to provide to the agent\n */\n tools?: ToolSet;\n\n /**\n * Maximum number of tool loop iterations\n * @default 10\n */\n maxSteps?: number;\n\n /**\n * System prompt for the agent\n */\n systemPrompt?: string;\n}\n\nlet eventCounter = 0;\n\nfunction createEventId(): string {\n return `event-${++eventCounter}`;\n}\n\n/**\n * Hook that adapts deepagentsdk to work with AI SDK Elements UI components\n *\n * @param options - Configuration options\n * @returns Elements-compatible interface\n *\n * @example\n * ```tsx\n * import { useElementsAdapter } from 'deepagentsdk/elements';\n * import { Conversation, Message, PromptInput } from '@/components/ai-elements';\n *\n * function Chat() {\n * const { uiMessages, sendMessage } = useElementsAdapter({\n * model,\n * backend\n * });\n *\n * return (\n * <Conversation>\n * {uiMessages.map(msg => <Message key={msg.id} from={msg.role} />)}\n * <PromptInput onSubmit={sendMessage} />\n * </Conversation>\n * );\n * }\n * ```\n */\nexport function useElementsAdapter(\n options: UseElementsAdapterOptions\n): UseElementsAdapterReturn {\n const { model, backend, tools, maxSteps = 10, systemPrompt } = options;\n\n const [status, setStatus] = useState<AgentStatus>(\"idle\");\n const [streamingText, setStreamingText] = useState(\"\");\n const [events, setEvents] = useState<AgentEventLog[]>([]);\n const [state, setState] = useState<DeepAgentState>({\n todos: [],\n files: {},\n });\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const accumulatedTextRef = useRef(\"\");\n\n // Create agent instance\n const agentRef = useRef(\n createDeepAgent({\n model,\n maxSteps,\n systemPrompt,\n backend,\n tools,\n })\n );\n\n const addEvent = useCallback(\n (event: DeepAgentEvent | { type: \"text-segment\"; text: string }) => {\n setEvents((prev) => [\n ...prev,\n {\n id: createEventId(),\n type: event.type,\n event,\n timestamp: new Date(),\n },\n ]);\n },\n []\n );\n\n // Flush accumulated text as a text-segment event\n const flushTextSegment = useCallback(() => {\n if (accumulatedTextRef.current.trim()) {\n addEvent({\n type: \"text-segment\",\n text: accumulatedTextRef.current,\n });\n accumulatedTextRef.current = \"\";\n setStreamingText(\"\");\n }\n }, [addEvent]);\n\n const sendMessage = async (message: PromptInputMessage): Promise<void> => {\n if (!message.text.trim()) {\n return; // Ignore empty messages\n }\n\n // Reset for new generation\n setStatus(\"thinking\");\n setStreamingText(\"\");\n accumulatedTextRef.current = \"\";\n\n // Add user message to events\n addEvent({ type: \"user-message\", content: message.text });\n\n // Create new abort controller\n abortControllerRef.current = new AbortController();\n\n try {\n for await (const event of agentRef.current.streamWithEvents({\n messages: [{ role: \"user\", content: message.text }],\n state,\n abortSignal: abortControllerRef.current.signal,\n })) {\n switch (event.type) {\n case \"text\":\n setStatus(\"streaming\");\n accumulatedTextRef.current += event.text;\n setStreamingText(accumulatedTextRef.current);\n break;\n\n case \"step-start\":\n if (event.stepNumber > 1) {\n addEvent(event);\n }\n break;\n\n case \"tool-call\":\n flushTextSegment();\n setStatus(\"tool-call\");\n addEvent(event);\n break;\n\n case \"tool-result\":\n addEvent(event);\n break;\n\n case \"todos-changed\":\n flushTextSegment();\n setStatus(\"tool-call\");\n setState((prev) => ({ ...prev, todos: event.todos }));\n addEvent(event);\n break;\n\n case \"done\":\n flushTextSegment();\n setStatus(\"done\");\n setState(event.state);\n addEvent(event);\n break;\n\n case \"error\":\n flushTextSegment();\n setStatus(\"error\");\n addEvent(event);\n break;\n\n default:\n addEvent(event);\n break;\n }\n }\n\n setStatus(\"idle\");\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n flushTextSegment();\n setStatus(\"idle\");\n } else {\n flushTextSegment();\n setStatus(\"error\");\n }\n } finally {\n abortControllerRef.current = null;\n }\n };\n\n const abort = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setStatus(\"idle\");\n }\n }, []);\n\n const clear = useCallback(() => {\n setEvents([]);\n setStreamingText(\"\");\n setStatus(\"idle\");\n }, []);\n\n // Convert agent status to UI status\n const uiStatus = useMemo(\n () => mapAgentStatusToUIStatus(status),\n [status]\n );\n\n // Convert events to UI messages\n const uiMessages = useMemo(\n () => convertEventsToUIMessages(events, streamingText, uiStatus),\n [events, streamingText, uiStatus]\n );\n\n // Extract tool parts from current message\n const toolParts = useMemo(() => extractToolParts(uiMessages), [uiMessages]);\n\n return {\n uiMessages,\n uiStatus,\n toolParts,\n sendMessage,\n abort,\n clear,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { _t as BackendProtocol, d as DeepAgentEvent } from "../../types-IulnvhFg.cjs";
2
+ import { LanguageModel, ToolSet } from "ai";
3
+ import "react";
4
+
5
+ //#region src/adapters/elements/types.d.ts
6
+
7
+ /**
8
+ * Types for AI SDK Elements adapter
9
+ *
10
+ * These types align with Vercel AI SDK Elements UI component expectations.
11
+ * @see https://ai-sdk.dev/elements
12
+ */
13
+ /**
14
+ * UI message part types that Elements components expect
15
+ */
16
+ type UIMessagePart = {
17
+ type: "text";
18
+ text: string;
19
+ } | {
20
+ type: "tool-call";
21
+ toolCallId: string;
22
+ toolName: string;
23
+ args: unknown;
24
+ } | {
25
+ type: "tool-result";
26
+ toolCallId: string;
27
+ toolName: string;
28
+ result: unknown;
29
+ isError?: boolean;
30
+ };
31
+ /**
32
+ * UI message format expected by Elements Message component
33
+ */
34
+ interface UIMessage {
35
+ id: string;
36
+ role: "user" | "assistant";
37
+ parts: UIMessagePart[];
38
+ status: "submitted" | "streaming" | "ready" | "error";
39
+ }
40
+ /**
41
+ * UI status that Elements components use
42
+ */
43
+ type UIStatus = "submitted" | "streaming" | "ready" | "error";
44
+ /**
45
+ * PromptInput component message format
46
+ */
47
+ interface PromptInputMessage {
48
+ text: string;
49
+ }
50
+ /**
51
+ * Tool parts extracted from current message for Tool component
52
+ */
53
+ interface ToolUIPart {
54
+ type: "tool-call" | "tool-result";
55
+ toolCallId: string;
56
+ toolName: string;
57
+ args?: unknown;
58
+ result?: unknown;
59
+ isError?: boolean;
60
+ }
61
+ /**
62
+ * Return type for useElementsAdapter hook
63
+ */
64
+ interface UseElementsAdapterReturn {
65
+ /**
66
+ * Messages formatted for Elements Message component
67
+ */
68
+ uiMessages: UIMessage[];
69
+ /**
70
+ * Current UI status for Elements components
71
+ */
72
+ uiStatus: UIStatus;
73
+ /**
74
+ * Tool parts from current message for Tool component
75
+ */
76
+ toolParts: ToolUIPart[];
77
+ /**
78
+ * Send a message (compatible with PromptInput onSubmit)
79
+ */
80
+ sendMessage: (message: PromptInputMessage) => Promise<void>;
81
+ /**
82
+ * Abort current streaming
83
+ */
84
+ abort: () => void;
85
+ /**
86
+ * Clear all messages
87
+ */
88
+ clear: () => void;
89
+ }
90
+ //#endregion
91
+ //#region src/adapters/elements/useElementsAdapter.d.ts
92
+ /**
93
+ * Options for useElementsAdapter hook
94
+ */
95
+ interface UseElementsAdapterOptions {
96
+ /**
97
+ * Language model instance from AI SDK provider
98
+ */
99
+ model: LanguageModel;
100
+ /**
101
+ * Backend for state management
102
+ */
103
+ backend: BackendProtocol;
104
+ /**
105
+ * Optional tools to provide to the agent
106
+ */
107
+ tools?: ToolSet;
108
+ /**
109
+ * Maximum number of tool loop iterations
110
+ * @default 10
111
+ */
112
+ maxSteps?: number;
113
+ /**
114
+ * System prompt for the agent
115
+ */
116
+ systemPrompt?: string;
117
+ }
118
+ /**
119
+ * Hook that adapts deepagentsdk to work with AI SDK Elements UI components
120
+ *
121
+ * @param options - Configuration options
122
+ * @returns Elements-compatible interface
123
+ *
124
+ * @example
125
+ * ```tsx
126
+ * import { useElementsAdapter } from 'deepagentsdk/elements';
127
+ * import { Conversation, Message, PromptInput } from '@/components/ai-elements';
128
+ *
129
+ * function Chat() {
130
+ * const { uiMessages, sendMessage } = useElementsAdapter({
131
+ * model,
132
+ * backend
133
+ * });
134
+ *
135
+ * return (
136
+ * <Conversation>
137
+ * {uiMessages.map(msg => <Message key={msg.id} from={msg.role} />)}
138
+ * <PromptInput onSubmit={sendMessage} />
139
+ * </Conversation>
140
+ * );
141
+ * }
142
+ * ```
143
+ */
144
+ declare function useElementsAdapter(options: UseElementsAdapterOptions): UseElementsAdapterReturn;
145
+ //#endregion
146
+ //#region src/cli/hooks/useAgent.d.ts
147
+ type AgentStatus = "idle" | "thinking" | "streaming" | "tool-call" | "subagent" | "done" | "error";
148
+ interface AgentEventLog {
149
+ id: string;
150
+ type: DeepAgentEvent["type"] | "text-segment";
151
+ event: DeepAgentEvent | {
152
+ type: "text-segment";
153
+ text: string;
154
+ };
155
+ timestamp: Date;
156
+ }
157
+ //#endregion
158
+ //#region src/adapters/elements/statusAdapter.d.ts
159
+ /**
160
+ * Maps deepagentsdk AgentStatus to Elements UIStatus
161
+ *
162
+ * @param agentStatus - The agent status from useAgent hook
163
+ * @returns The corresponding UI status for Elements components
164
+ *
165
+ * Mapping rules:
166
+ * - idle/done → ready (agent is waiting for input)
167
+ * - thinking/tool-call/subagent → submitted (agent is processing)
168
+ * - streaming → streaming (agent is generating text)
169
+ * - error → error (an error occurred)
170
+ */
171
+ declare function mapAgentStatusToUIStatus(agentStatus: AgentStatus): UIStatus;
172
+ //#endregion
173
+ //#region src/adapters/elements/messageAdapter.d.ts
174
+ /**
175
+ * Converts agent event log to UIMessage format expected by Elements
176
+ *
177
+ * @param events - Array of agent events from useAgent hook
178
+ * @param streamingText - Current streaming text (if any)
179
+ * @param uiStatus - Current UI status
180
+ * @returns Array of UIMessage objects for Elements Message component
181
+ *
182
+ * Conversion logic:
183
+ * 1. Group events by role (user/assistant)
184
+ * 2. Convert each event type to appropriate UIMessagePart
185
+ * 3. Handle streaming text as in-progress message
186
+ * 4. Preserve event order and tool call/result pairing
187
+ */
188
+ declare function convertEventsToUIMessages(events: AgentEventLog[], streamingText: string, uiStatus: UIStatus): UIMessage[];
189
+ /**
190
+ * Extracts tool parts from the most recent assistant message
191
+ *
192
+ * @param messages - UIMessage array
193
+ * @returns Array of tool parts (tool-call and tool-result)
194
+ */
195
+ declare function extractToolParts(messages: UIMessage[]): ({
196
+ type: "tool-call";
197
+ toolCallId: string;
198
+ toolName: string;
199
+ args: unknown;
200
+ result?: undefined;
201
+ isError?: undefined;
202
+ } | {
203
+ type: "tool-result";
204
+ toolCallId: string;
205
+ toolName: string;
206
+ result: unknown;
207
+ isError: boolean | undefined;
208
+ args?: undefined;
209
+ })[];
210
+ //#endregion
211
+ export { type PromptInputMessage, type ToolUIPart, type UIMessage, type UIMessagePart, type UIStatus, type UseElementsAdapterOptions, type UseElementsAdapterReturn, convertEventsToUIMessages, extractToolParts, mapAgentStatusToUIStatus, useElementsAdapter };
212
+ //# sourceMappingURL=index.d.cts.map