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,212 @@
1
+ import { _t as BackendProtocol, d as DeepAgentEvent } from "../../types-4g9UvXal.mjs";
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.mts.map
@@ -0,0 +1,320 @@
1
+ import { n as createDeepAgent } from "../../agent-CrH-He58.mjs";
2
+ import { useCallback, useMemo, useRef, useState } from "react";
3
+
4
+ //#region src/adapters/elements/messageAdapter.ts
5
+ /**
6
+ * Converts agent event log to UIMessage format expected by Elements
7
+ *
8
+ * @param events - Array of agent events from useAgent hook
9
+ * @param streamingText - Current streaming text (if any)
10
+ * @param uiStatus - Current UI status
11
+ * @returns Array of UIMessage objects for Elements Message component
12
+ *
13
+ * Conversion logic:
14
+ * 1. Group events by role (user/assistant)
15
+ * 2. Convert each event type to appropriate UIMessagePart
16
+ * 3. Handle streaming text as in-progress message
17
+ * 4. Preserve event order and tool call/result pairing
18
+ */
19
+ function convertEventsToUIMessages(events, streamingText, uiStatus) {
20
+ const messages = [];
21
+ let currentAssistantParts = [];
22
+ let messageIdCounter = 0;
23
+ const generateMessageId = () => {
24
+ return `msg-${Date.now()}-${++messageIdCounter}`;
25
+ };
26
+ for (const eventLog of events) {
27
+ const event = eventLog.event;
28
+ switch (event.type) {
29
+ case "user-message":
30
+ if (currentAssistantParts.length > 0) {
31
+ messages.push({
32
+ id: generateMessageId(),
33
+ role: "assistant",
34
+ parts: currentAssistantParts,
35
+ status: "ready"
36
+ });
37
+ currentAssistantParts = [];
38
+ }
39
+ messages.push({
40
+ id: eventLog.id,
41
+ role: "user",
42
+ parts: [{
43
+ type: "text",
44
+ text: event.content
45
+ }],
46
+ status: "ready"
47
+ });
48
+ break;
49
+ case "text-segment":
50
+ currentAssistantParts.push({
51
+ type: "text",
52
+ text: event.text
53
+ });
54
+ break;
55
+ case "tool-call":
56
+ currentAssistantParts.push({
57
+ type: "tool-call",
58
+ toolCallId: event.toolCallId,
59
+ toolName: event.toolName,
60
+ args: event.args
61
+ });
62
+ break;
63
+ case "tool-result":
64
+ currentAssistantParts.push({
65
+ type: "tool-result",
66
+ toolCallId: event.toolCallId,
67
+ toolName: event.toolName,
68
+ result: event.result,
69
+ isError: event.isError
70
+ });
71
+ break;
72
+ default: break;
73
+ }
74
+ }
75
+ if (streamingText || currentAssistantParts.length > 0) {
76
+ if (streamingText) currentAssistantParts.push({
77
+ type: "text",
78
+ text: streamingText
79
+ });
80
+ let messageStatus = "ready";
81
+ if (uiStatus === "streaming") messageStatus = "streaming";
82
+ else if (uiStatus === "submitted") messageStatus = "submitted";
83
+ else if (uiStatus === "error") messageStatus = "error";
84
+ messages.push({
85
+ id: generateMessageId(),
86
+ role: "assistant",
87
+ parts: currentAssistantParts,
88
+ status: messageStatus
89
+ });
90
+ }
91
+ return messages;
92
+ }
93
+ /**
94
+ * Extracts tool parts from the most recent assistant message
95
+ *
96
+ * @param messages - UIMessage array
97
+ * @returns Array of tool parts (tool-call and tool-result)
98
+ */
99
+ function extractToolParts(messages) {
100
+ const lastAssistantMessage = [...messages].reverse().find((m) => m.role === "assistant");
101
+ if (!lastAssistantMessage) return [];
102
+ return lastAssistantMessage.parts.filter((part) => part.type === "tool-call" || part.type === "tool-result").map((part) => {
103
+ if (part.type === "tool-call") return {
104
+ type: "tool-call",
105
+ toolCallId: part.toolCallId,
106
+ toolName: part.toolName,
107
+ args: part.args
108
+ };
109
+ else return {
110
+ type: "tool-result",
111
+ toolCallId: part.toolCallId,
112
+ toolName: part.toolName,
113
+ result: part.result,
114
+ isError: part.isError
115
+ };
116
+ });
117
+ }
118
+
119
+ //#endregion
120
+ //#region src/adapters/elements/statusAdapter.ts
121
+ /**
122
+ * Maps deepagentsdk AgentStatus to Elements UIStatus
123
+ *
124
+ * @param agentStatus - The agent status from useAgent hook
125
+ * @returns The corresponding UI status for Elements components
126
+ *
127
+ * Mapping rules:
128
+ * - idle/done → ready (agent is waiting for input)
129
+ * - thinking/tool-call/subagent → submitted (agent is processing)
130
+ * - streaming → streaming (agent is generating text)
131
+ * - error → error (an error occurred)
132
+ */
133
+ function mapAgentStatusToUIStatus(agentStatus) {
134
+ switch (agentStatus) {
135
+ case "thinking":
136
+ case "tool-call":
137
+ case "subagent": return "submitted";
138
+ case "streaming": return "streaming";
139
+ case "error": return "error";
140
+ case "idle":
141
+ case "done":
142
+ default: return "ready";
143
+ }
144
+ }
145
+
146
+ //#endregion
147
+ //#region src/adapters/elements/useElementsAdapter.ts
148
+ /**
149
+ * React hook adapter for AI SDK Elements
150
+ *
151
+ * Provides Elements-compatible interface for deepagentsdk
152
+ */
153
+ let eventCounter = 0;
154
+ function createEventId() {
155
+ return `event-${++eventCounter}`;
156
+ }
157
+ /**
158
+ * Hook that adapts deepagentsdk to work with AI SDK Elements UI components
159
+ *
160
+ * @param options - Configuration options
161
+ * @returns Elements-compatible interface
162
+ *
163
+ * @example
164
+ * ```tsx
165
+ * import { useElementsAdapter } from 'deepagentsdk/elements';
166
+ * import { Conversation, Message, PromptInput } from '@/components/ai-elements';
167
+ *
168
+ * function Chat() {
169
+ * const { uiMessages, sendMessage } = useElementsAdapter({
170
+ * model,
171
+ * backend
172
+ * });
173
+ *
174
+ * return (
175
+ * <Conversation>
176
+ * {uiMessages.map(msg => <Message key={msg.id} from={msg.role} />)}
177
+ * <PromptInput onSubmit={sendMessage} />
178
+ * </Conversation>
179
+ * );
180
+ * }
181
+ * ```
182
+ */
183
+ function useElementsAdapter(options) {
184
+ const { model, backend, tools, maxSteps = 10, systemPrompt } = options;
185
+ const [status, setStatus] = useState("idle");
186
+ const [streamingText, setStreamingText] = useState("");
187
+ const [events, setEvents] = useState([]);
188
+ const [state, setState] = useState({
189
+ todos: [],
190
+ files: {}
191
+ });
192
+ const abortControllerRef = useRef(null);
193
+ const accumulatedTextRef = useRef("");
194
+ const agentRef = useRef(createDeepAgent({
195
+ model,
196
+ maxSteps,
197
+ systemPrompt,
198
+ backend,
199
+ tools
200
+ }));
201
+ const addEvent = useCallback((event) => {
202
+ setEvents((prev) => [...prev, {
203
+ id: createEventId(),
204
+ type: event.type,
205
+ event,
206
+ timestamp: /* @__PURE__ */ new Date()
207
+ }]);
208
+ }, []);
209
+ const flushTextSegment = useCallback(() => {
210
+ if (accumulatedTextRef.current.trim()) {
211
+ addEvent({
212
+ type: "text-segment",
213
+ text: accumulatedTextRef.current
214
+ });
215
+ accumulatedTextRef.current = "";
216
+ setStreamingText("");
217
+ }
218
+ }, [addEvent]);
219
+ const sendMessage = async (message) => {
220
+ if (!message.text.trim()) return;
221
+ setStatus("thinking");
222
+ setStreamingText("");
223
+ accumulatedTextRef.current = "";
224
+ addEvent({
225
+ type: "user-message",
226
+ content: message.text
227
+ });
228
+ abortControllerRef.current = new AbortController();
229
+ try {
230
+ for await (const event of agentRef.current.streamWithEvents({
231
+ messages: [{
232
+ role: "user",
233
+ content: message.text
234
+ }],
235
+ state,
236
+ abortSignal: abortControllerRef.current.signal
237
+ })) switch (event.type) {
238
+ case "text":
239
+ setStatus("streaming");
240
+ accumulatedTextRef.current += event.text;
241
+ setStreamingText(accumulatedTextRef.current);
242
+ break;
243
+ case "step-start":
244
+ if (event.stepNumber > 1) addEvent(event);
245
+ break;
246
+ case "tool-call":
247
+ flushTextSegment();
248
+ setStatus("tool-call");
249
+ addEvent(event);
250
+ break;
251
+ case "tool-result":
252
+ addEvent(event);
253
+ break;
254
+ case "todos-changed":
255
+ flushTextSegment();
256
+ setStatus("tool-call");
257
+ setState((prev) => ({
258
+ ...prev,
259
+ todos: event.todos
260
+ }));
261
+ addEvent(event);
262
+ break;
263
+ case "done":
264
+ flushTextSegment();
265
+ setStatus("done");
266
+ setState(event.state);
267
+ addEvent(event);
268
+ break;
269
+ case "error":
270
+ flushTextSegment();
271
+ setStatus("error");
272
+ addEvent(event);
273
+ break;
274
+ default:
275
+ addEvent(event);
276
+ break;
277
+ }
278
+ setStatus("idle");
279
+ } catch (err) {
280
+ if (err.name === "AbortError") {
281
+ flushTextSegment();
282
+ setStatus("idle");
283
+ } else {
284
+ flushTextSegment();
285
+ setStatus("error");
286
+ }
287
+ } finally {
288
+ abortControllerRef.current = null;
289
+ }
290
+ };
291
+ const abort = useCallback(() => {
292
+ if (abortControllerRef.current) {
293
+ abortControllerRef.current.abort();
294
+ setStatus("idle");
295
+ }
296
+ }, []);
297
+ const clear = useCallback(() => {
298
+ setEvents([]);
299
+ setStreamingText("");
300
+ setStatus("idle");
301
+ }, []);
302
+ const uiStatus = useMemo(() => mapAgentStatusToUIStatus(status), [status]);
303
+ const uiMessages = useMemo(() => convertEventsToUIMessages(events, streamingText, uiStatus), [
304
+ events,
305
+ streamingText,
306
+ uiStatus
307
+ ]);
308
+ return {
309
+ uiMessages,
310
+ uiStatus,
311
+ toolParts: useMemo(() => extractToolParts(uiMessages), [uiMessages]),
312
+ sendMessage,
313
+ abort,
314
+ clear
315
+ };
316
+ }
317
+
318
+ //#endregion
319
+ export { convertEventsToUIMessages, extractToolParts, mapAgentStatusToUIStatus, useElementsAdapter };
320
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"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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"}