Base interface for stream-like objects. Contains common properties shared between UseStream and SubagentStream.
interface StreamBaseCurrently active subagents (where status === "running").
Use this to track and display subagents that are actively executing. Completed or errored subagents are not included.
// Show loading indicators for active subagents
stream.activeSubagents.map(subagent => (
<SubagentCard
key={subagent.id}
type={subagent.toolCall.args.subagent_type}
isLoading={true}
/>
));Get subagent stream by tool call ID.
Use this when you have a specific tool call ID and need to access its corresponding subagent stream.
// In a tool call component
const subagent = stream.getSubagent(toolCall.id);
if (subagent) {
return <SubagentProgress subagent={subagent} />;
}Get all subagents triggered by a specific AI message.
Useful for rendering subagent activities grouped by conversation turn. Each AI message that contains subagent tool calls will have its triggered subagents returned by this method.
// Render subagents inline after the AI message that triggered them
{stream.messages.map((msg) => (
<div key={msg.id}>
<MessageBubble message={msg} />
{msg.type === "ai" && "tool_calls" in msg && (
<SubagentPipeline
subagents={stream.getSubagentsByMessage(msg.id)}
/>
)}
</div>
))}Get all subagents of a specific type.
Returns streams with properly inferred state types based on subagent name. When called with a literal string that matches a subagent name, TypeScript will infer the correct state type for that subagent.
// Get all researcher subagents with typed state
const researchers = stream.getSubagentsByType("researcher");
researchers.forEach(researcher => {
// researcher.values is typed based on ResearchMiddleware
console.log("Research messages:", researcher.values.messages.length);
console.log("Status:", researcher.status);
});
// Get all writer subagents
const writers = stream.getSubagentsByType("writer");
// writers have different state type based on WriterMiddlewareGet tool calls for a specific AI message.
Use this to find which tool calls were initiated by a particular assistant message, useful for rendering tool calls inline with messages.
messages.map(message => {
if (message.type === "ai") {
const calls = stream.getToolCalls(message);
return (
<>
<MessageBubble message={message} />
{calls.map(tc => <ToolCallCard key={tc.call.id} {...tc} />)}
</>
);
}
return <MessageBubble message={message} />;
});Current interrupt, if the stream is interrupted.
Convenience alias for interrupts[0].
For workflows with multiple concurrent interrupts, use interrupts instead.
Interrupt payloads collected during the run, if any.
Mirrors the in-process run.interrupts.
Whether the stream is currently running.
true while streaming, false when idle or completed.
Switch to a different thread, clearing the current stream state.
Pass null to reset to no thread (a new thread will be created on next submit).