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.
- package/dist/adapters/elements/index.cjs +324 -0
- package/dist/adapters/elements/index.cjs.map +1 -0
- package/dist/adapters/elements/index.d.cts +212 -0
- package/dist/adapters/elements/index.d.mts +212 -0
- package/dist/adapters/elements/index.mjs +320 -0
- package/dist/adapters/elements/index.mjs.map +1 -0
- package/dist/agent-CrH-He58.mjs +2974 -0
- package/dist/agent-CrH-He58.mjs.map +1 -0
- package/dist/agent-Cuks-Idh.cjs +3396 -0
- package/dist/agent-Cuks-Idh.cjs.map +1 -0
- package/dist/chunk-CbDLau6x.cjs +34 -0
- package/dist/cli/index.cjs +3162 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.mjs +3120 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/file-saver-BJCqMIb5.mjs +655 -0
- package/dist/file-saver-BJCqMIb5.mjs.map +1 -0
- package/dist/file-saver-C6O2LAvg.cjs +679 -0
- package/dist/file-saver-C6O2LAvg.cjs.map +1 -0
- package/dist/index.cjs +1471 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1581 -0
- package/dist/index.d.mts +1581 -0
- package/dist/index.mjs +1371 -0
- package/dist/index.mjs.map +1 -0
- package/dist/load-79a2H4m0.cjs +163 -0
- package/dist/load-79a2H4m0.cjs.map +1 -0
- package/dist/load-94gjHorc.mjs +3 -0
- package/dist/load-B6CA5js_.mjs +142 -0
- package/dist/load-B6CA5js_.mjs.map +1 -0
- package/dist/load-C2qVmZMp.cjs +3 -0
- package/dist/types-4g9UvXal.d.mts +1151 -0
- package/dist/types-IulnvhFg.d.cts +1151 -0
- package/package.json +26 -12
- package/src/adapters/elements/index.ts +0 -27
- package/src/adapters/elements/messageAdapter.ts +0 -165
- package/src/adapters/elements/statusAdapter.ts +0 -39
- package/src/adapters/elements/types.ts +0 -97
- package/src/adapters/elements/useElementsAdapter.ts +0 -261
- package/src/agent.ts +0 -1258
- package/src/backends/composite.ts +0 -273
- package/src/backends/filesystem.ts +0 -692
- package/src/backends/index.ts +0 -22
- package/src/backends/local-sandbox.ts +0 -175
- package/src/backends/persistent.ts +0 -593
- package/src/backends/sandbox.ts +0 -510
- package/src/backends/state.ts +0 -244
- package/src/backends/utils.ts +0 -287
- package/src/checkpointer/file-saver.ts +0 -98
- package/src/checkpointer/index.ts +0 -5
- package/src/checkpointer/kv-saver.ts +0 -82
- package/src/checkpointer/memory-saver.ts +0 -82
- package/src/checkpointer/types.ts +0 -125
- package/src/cli/components/ApiKeyInput.tsx +0 -300
- package/src/cli/components/FilePreview.tsx +0 -237
- package/src/cli/components/Input.tsx +0 -277
- package/src/cli/components/Message.tsx +0 -93
- package/src/cli/components/ModelSelection.tsx +0 -338
- package/src/cli/components/SlashMenu.tsx +0 -101
- package/src/cli/components/StatusBar.tsx +0 -89
- package/src/cli/components/Subagent.tsx +0 -91
- package/src/cli/components/TodoList.tsx +0 -133
- package/src/cli/components/ToolApproval.tsx +0 -70
- package/src/cli/components/ToolCall.tsx +0 -144
- package/src/cli/components/ToolCallSummary.tsx +0 -175
- package/src/cli/components/Welcome.tsx +0 -75
- package/src/cli/components/index.ts +0 -24
- package/src/cli/hooks/index.ts +0 -12
- package/src/cli/hooks/useAgent.ts +0 -933
- package/src/cli/index.tsx +0 -1066
- package/src/cli/theme.ts +0 -205
- package/src/cli/utils/model-list.ts +0 -365
- package/src/constants/errors.ts +0 -29
- package/src/constants/limits.ts +0 -195
- package/src/index.ts +0 -176
- package/src/middleware/agent-memory.ts +0 -330
- package/src/prompts.ts +0 -196
- package/src/skills/index.ts +0 -2
- package/src/skills/load.ts +0 -191
- package/src/skills/types.ts +0 -53
- package/src/tools/execute.ts +0 -167
- package/src/tools/filesystem.ts +0 -418
- package/src/tools/index.ts +0 -39
- package/src/tools/subagent.ts +0 -443
- package/src/tools/todos.ts +0 -101
- package/src/tools/web.ts +0 -567
- package/src/types/backend.ts +0 -177
- package/src/types/core.ts +0 -220
- package/src/types/events.ts +0 -430
- package/src/types/index.ts +0 -94
- package/src/types/structured-output.ts +0 -43
- package/src/types/subagent.ts +0 -96
- package/src/types.ts +0 -22
- package/src/utils/approval.ts +0 -213
- package/src/utils/events.ts +0 -416
- package/src/utils/eviction.ts +0 -181
- package/src/utils/index.ts +0 -34
- package/src/utils/model-parser.ts +0 -38
- package/src/utils/patch-tool-calls.ts +0 -233
- package/src/utils/project-detection.ts +0 -32
- 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
|