Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion examples/fork-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ async function streamText(
prompt: string
): Promise<string> {
let text = '';
for await (const msg of session.stream(prompt)) {
for await (const msg of session.stream(prompt, {
includePartialMessages: true,
})) {
if (msg.type === DroidMessageType.AssistantTextDelta) {
text += msg.text;
}
Expand Down
6 changes: 3 additions & 3 deletions examples/interrupt-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ const session = await createSession({ cwd: process.cwd() });
let deltaCount = 0;

try {
for await (const msg of session.stream(
'Write a long history of computing.'
)) {
for await (const msg of session.stream('Write a long history of computing.', {
includePartialMessages: true,
})) {
if (msg.type !== DroidMessageType.AssistantTextDelta) {
continue;
}
Expand Down
4 changes: 3 additions & 1 deletion examples/multi-turn-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ async function streamText(
prompt: string
): Promise<string> {
let text = '';
for await (const msg of session.stream(prompt)) {
for await (const msg of session.stream(prompt, {
includePartialMessages: true,
})) {
if (msg.type === DroidMessageType.AssistantTextDelta) {
text += msg.text;
}
Expand Down
3 changes: 2 additions & 1 deletion examples/sdk-mcp-tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ const session = await createSession({

try {
for await (const msg of session.stream(
'Use the favorite_number tool for Ada and tell me the answer.'
'Use the favorite_number tool for Ada and tell me the answer.',
{ includePartialMessages: true }
)) {
if (msg.type === DroidMessageType.AssistantTextDelta) {
process.stdout.write(msg.text);
Expand Down
4 changes: 4 additions & 0 deletions src/stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,14 @@ export interface DroidToolCallMessage extends DroidStreamBase {
export interface DroidAssistantMessage extends DroidStreamBase {
readonly type: 'assistant';
readonly message: FactoryDroidMessage;
readonly parentMessageId?: string;
readonly text: string;
}

export interface DroidUserMessage extends DroidStreamBase {
readonly type: 'user';
readonly message: FactoryDroidMessage;
readonly parentMessageId?: string;
}

export interface ToolResult extends DroidStreamBase {
Expand Down Expand Up @@ -458,13 +460,15 @@ export function convertNotificationToStreamMessage(
type: DroidMessageType.Assistant,
sessionId,
message: msg,
parentMessageId: notification.parentId ?? msg.parentId,
text: extractTextFromMessage(msg),
});
} else if (msg.role === FactoryDroidMessageRole.User) {
messages.push({
type: DroidMessageType.User,
sessionId,
message: msg,
parentMessageId: notification.parentId ?? msg.parentId,
});
} else {
messages.push({
Expand Down
52 changes: 52 additions & 0 deletions tests/stream.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -932,6 +932,58 @@ describe('convertNotificationToStreamMessage', () => {
expect(messages[0].type).toBe('assistant');
});

it('sets parentMessageId on user messages', () => {
const notification = makeNotification(
SessionNotificationType.CREATE_MESSAGE,
{
message: {
id: 'user-id-1',
role: 'user',
parentId: 'message-parent-id',
createdAt: 1000,
updatedAt: 1000,
content: [{ type: 'text', text: 'hello' }],
},
parentId: 'notification-parent-id',
requestId: 'req-1',
}
);

const result = convertNotificationToStreamMessage(notification);
expect(Array.isArray(result)).toBe(true);
const messages = result as DroidMessage[];
expect(messages).toHaveLength(1);
expect(messages[0]).toMatchObject({
type: 'user',
parentMessageId: 'notification-parent-id',
});
});

it('sets parentMessageId on assistant messages', () => {
const notification = makeNotification(
SessionNotificationType.CREATE_MESSAGE,
{
message: {
id: 'assistant-id-1',
role: 'assistant',
parentId: 'user-id-1',
createdAt: 1000,
updatedAt: 1000,
content: [{ type: 'text', text: 'hello' }],
},
}
);

const result = convertNotificationToStreamMessage(notification);
expect(Array.isArray(result)).toBe(true);
const messages = result as DroidMessage[];
expect(messages).toHaveLength(1);
expect(messages[0]).toMatchObject({
type: 'assistant',
parentMessageId: 'user-id-1',
});
});

it('handles empty content array', () => {
const notification = makeNotification(
SessionNotificationType.CREATE_MESSAGE,
Expand Down
Loading