@tanstack/ai 0.58.0 → 0.59.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/esm/activities/chat/agents/define-agent.d.ts +81 -0
- package/dist/esm/activities/chat/agents/define-agent.js +34 -0
- package/dist/esm/activities/chat/agents/define-agent.js.map +1 -0
- package/dist/esm/activities/chat/agents/route.d.ts +53 -0
- package/dist/esm/activities/chat/agents/route.js +59 -0
- package/dist/esm/activities/chat/agents/route.js.map +1 -0
- package/dist/esm/activities/chat/agents/spawn.d.ts +124 -0
- package/dist/esm/activities/chat/agents/spawn.js +490 -0
- package/dist/esm/activities/chat/agents/spawn.js.map +1 -0
- package/dist/esm/activities/chat/agents/turn.d.ts +36 -0
- package/dist/esm/activities/chat/agents/turn.js +78 -0
- package/dist/esm/activities/chat/agents/turn.js.map +1 -0
- package/dist/esm/activities/chat/index.d.ts +13 -3
- package/dist/esm/activities/chat/index.js +337 -13
- package/dist/esm/activities/chat/index.js.map +1 -1
- package/dist/esm/activities/chat/messages.d.ts +7 -1
- package/dist/esm/activities/chat/messages.js +94 -18
- package/dist/esm/activities/chat/messages.js.map +1 -1
- package/dist/esm/activities/chat/middleware/run-store.d.ts +43 -7
- package/dist/esm/activities/chat/middleware/run-store.js +8 -1
- package/dist/esm/activities/chat/middleware/run-store.js.map +1 -1
- package/dist/esm/activities/chat/middleware/types.d.ts +47 -1
- package/dist/esm/activities/chat/middleware/types.js.map +1 -1
- package/dist/esm/activities/chat/stream/processor.d.ts +46 -0
- package/dist/esm/activities/chat/stream/processor.js +280 -7
- package/dist/esm/activities/chat/stream/processor.js.map +1 -1
- package/dist/esm/activities/chat/tools/tool-calls.d.ts +17 -3
- package/dist/esm/activities/chat/tools/tool-calls.js +54 -5
- package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
- package/dist/esm/activities/generateAudio/index.js +1 -1
- package/dist/esm/activities/generateImage/index.js +1 -1
- package/dist/esm/activities/generateLiveVideo/index.js +1 -1
- package/dist/esm/activities/generateSpeech/index.js +1 -1
- package/dist/esm/activities/generateTranscription/index.js +1 -1
- package/dist/esm/activities/generateVoice/index.js +1 -1
- package/dist/esm/activities/generateWorld/index.js +1 -1
- package/dist/esm/activities/index.d.ts +3 -0
- package/dist/esm/activities/index.js +5 -3
- package/dist/esm/activities/summarize/index.js +1 -1
- package/dist/esm/client.d.ts +5 -36
- package/dist/esm/client.js +4 -37
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +6 -3
- package/dist/esm/middlewares/content-guard.js.map +1 -1
- package/dist/esm/types.d.ts +110 -88
- package/dist/esm/utilities/adapter-yield-chunk.d.ts +5 -1
- package/dist/esm/utilities/ag-ui-usage.d.ts +9 -9
- package/dist/esm/utilities/ag-ui-usage.js +66 -3
- package/dist/esm/utilities/ag-ui-usage.js.map +1 -1
- package/dist/esm/utilities/ag-ui-wire.js +56 -0
- package/dist/esm/utilities/ag-ui-wire.js.map +1 -1
- package/dist/esm/utilities/normalize-stream-chunk.js +7 -2
- package/dist/esm/utilities/normalize-stream-chunk.js.map +1 -1
- package/dist/esm/utilities/spec-event-keys.js +13 -8
- package/dist/esm/utilities/spec-event-keys.js.map +1 -1
- package/dist/esm/utilities/subagent-wire.d.ts +36 -0
- package/dist/esm/utilities/subagent-wire.js +131 -0
- package/dist/esm/utilities/subagent-wire.js.map +1 -0
- package/package.json +2 -2
- package/skills/ai-core/adapter-configuration/references/grok-adapter.md +1 -1
- package/skills/ai-core/media-generation/SKILL.md +2 -2
- package/skills/ai-core/middleware/SKILL.md +7 -4
- package/src/activities/chat/agents/define-agent.ts +121 -0
- package/src/activities/chat/agents/route.ts +115 -0
- package/src/activities/chat/agents/spawn.ts +806 -0
- package/src/activities/chat/agents/turn.ts +151 -0
- package/src/activities/chat/index.ts +529 -11
- package/src/activities/chat/messages.ts +125 -15
- package/src/activities/chat/middleware/run-store.ts +56 -7
- package/src/activities/chat/middleware/types.ts +47 -0
- package/src/activities/chat/stream/processor.ts +428 -8
- package/src/activities/chat/tools/tool-calls.ts +77 -11
- package/src/activities/index.ts +15 -0
- package/src/client.ts +22 -35
- package/src/index.ts +23 -0
- package/src/middlewares/content-guard.ts +7 -5
- package/src/types.ts +154 -94
- package/src/utilities/adapter-yield-chunk.ts +10 -2
- package/src/utilities/ag-ui-usage.test.ts +38 -0
- package/src/utilities/ag-ui-usage.ts +98 -11
- package/src/utilities/ag-ui-wire.ts +74 -0
- package/src/utilities/normalize-stream-chunk.ts +10 -2
- package/src/utilities/spec-event-keys.ts +34 -7
- package/src/utilities/subagent-wire.ts +184 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
splitSubagentWire,
|
|
3
|
+
subagentWireText,
|
|
4
|
+
wireSubagentRunId,
|
|
5
|
+
} from '../../../utilities/subagent-wire'
|
|
6
|
+
import type { SubagentWireGroup } from '../../../utilities/subagent-wire'
|
|
7
|
+
import type {
|
|
8
|
+
ModelMessage,
|
|
9
|
+
RunAgentResumeItem,
|
|
10
|
+
SubagentPart,
|
|
11
|
+
SubagentStatus,
|
|
12
|
+
UIMessage,
|
|
13
|
+
} from '../../../types'
|
|
14
|
+
|
|
15
|
+
type AnyMessage = UIMessage | ModelMessage
|
|
16
|
+
|
|
17
|
+
export interface SubagentTurnChild {
|
|
18
|
+
subagentRunId: string
|
|
19
|
+
name: string
|
|
20
|
+
status: SubagentStatus
|
|
21
|
+
parentToolCallId?: string
|
|
22
|
+
/** The child's own messages from the earlier run. */
|
|
23
|
+
messages: Array<AnyMessage>
|
|
24
|
+
/** Text the child wrote. */
|
|
25
|
+
text: string
|
|
26
|
+
/** Resume entries for this child and its nested children. */
|
|
27
|
+
resume: Array<RunAgentResumeItem>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** The interrupted turn that a resume continues. */
|
|
31
|
+
export interface SubagentTurn {
|
|
32
|
+
/**
|
|
33
|
+
* Messages up to and including the last top-level user message. Child wire
|
|
34
|
+
* messages do not count.
|
|
35
|
+
*/
|
|
36
|
+
before: Array<AnyMessage>
|
|
37
|
+
/** Direct children of the parent in that turn. */
|
|
38
|
+
children: Array<SubagentTurnChild>
|
|
39
|
+
/** Resume entries that no child owns. They belong to the parent run. */
|
|
40
|
+
rest: Array<RunAgentResumeItem>
|
|
41
|
+
/** The router plan of the earlier run, from the children's metadata. */
|
|
42
|
+
plan?: unknown
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Key of the router plan in `SUBAGENT_STARTED` metadata (`metadata.tanstack`). */
|
|
46
|
+
export const SUBAGENT_PLAN_KEY = 'subagentPlan'
|
|
47
|
+
|
|
48
|
+
function planOf(metadata: Record<string, unknown> | undefined): unknown {
|
|
49
|
+
const tanstack = metadata?.tanstack
|
|
50
|
+
if (typeof tanstack !== 'object' || tanstack === null) return undefined
|
|
51
|
+
return (tanstack as Record<string, unknown>)[SUBAGENT_PLAN_KEY]
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function uiText(messages: ReadonlyArray<UIMessage>) {
|
|
55
|
+
return messages
|
|
56
|
+
.flatMap((message) =>
|
|
57
|
+
message.role === 'assistant'
|
|
58
|
+
? message.parts.flatMap((part) =>
|
|
59
|
+
part.type === 'text' && part.content.trim() !== ''
|
|
60
|
+
? [part.content.trim()]
|
|
61
|
+
: [],
|
|
62
|
+
)
|
|
63
|
+
: [],
|
|
64
|
+
)
|
|
65
|
+
.join('\n\n')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function partInterruptIds(part: SubagentPart): Array<string> {
|
|
69
|
+
return [
|
|
70
|
+
...(part.subagent.interruptIds ?? []),
|
|
71
|
+
...part.subagent.messages.flatMap((message) =>
|
|
72
|
+
message.parts.flatMap((nested) =>
|
|
73
|
+
nested.type === 'subagent' ? partInterruptIds(nested) : [],
|
|
74
|
+
),
|
|
75
|
+
),
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function groupInterruptIds(group: SubagentWireGroup<unknown>): Array<string> {
|
|
80
|
+
return [
|
|
81
|
+
...(group.info.interruptIds ?? []),
|
|
82
|
+
...splitSubagentWire(group.messages).groups.flatMap(groupInterruptIds),
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Find the children of the trailing assistant turn that `resume` answers.
|
|
88
|
+
* Returns undefined when no child owns a resume entry.
|
|
89
|
+
*/
|
|
90
|
+
export function readSubagentTurn(
|
|
91
|
+
messages: ReadonlyArray<AnyMessage>,
|
|
92
|
+
resume: ReadonlyArray<RunAgentResumeItem> | undefined,
|
|
93
|
+
): SubagentTurn | undefined {
|
|
94
|
+
if (!resume || resume.length === 0) return undefined
|
|
95
|
+
const lastUser = messages.findLastIndex(
|
|
96
|
+
(message) =>
|
|
97
|
+
message.role === 'user' && wireSubagentRunId(message) === undefined,
|
|
98
|
+
)
|
|
99
|
+
const before = messages.slice(0, lastUser + 1)
|
|
100
|
+
const turn = messages.slice(lastUser + 1)
|
|
101
|
+
|
|
102
|
+
const found: Array<Omit<SubagentTurnChild, 'resume'> & { ids: Set<string> }> =
|
|
103
|
+
[]
|
|
104
|
+
let plan: unknown
|
|
105
|
+
for (const message of turn) {
|
|
106
|
+
if (!('parts' in message)) continue
|
|
107
|
+
for (const part of message.parts) {
|
|
108
|
+
if (part.type !== 'subagent') continue
|
|
109
|
+
plan ??= planOf(part.subagent.metadata)
|
|
110
|
+
found.push({
|
|
111
|
+
subagentRunId: part.subagent.id,
|
|
112
|
+
name: part.subagent.name,
|
|
113
|
+
status: part.subagent.status,
|
|
114
|
+
...(part.subagent.parentToolCallId !== undefined && {
|
|
115
|
+
parentToolCallId: part.subagent.parentToolCallId,
|
|
116
|
+
}),
|
|
117
|
+
messages: part.subagent.messages,
|
|
118
|
+
text: uiText(part.subagent.messages),
|
|
119
|
+
ids: new Set(partInterruptIds(part)),
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
for (const group of splitSubagentWire(turn).groups) {
|
|
124
|
+
plan ??= planOf(group.info.metadata)
|
|
125
|
+
found.push({
|
|
126
|
+
subagentRunId: group.id,
|
|
127
|
+
name: group.info.name,
|
|
128
|
+
status: group.info.status,
|
|
129
|
+
...(group.info.parentToolCallId !== undefined && {
|
|
130
|
+
parentToolCallId: group.info.parentToolCallId,
|
|
131
|
+
}),
|
|
132
|
+
messages: group.messages,
|
|
133
|
+
text: subagentWireText(group.messages),
|
|
134
|
+
ids: new Set(groupInterruptIds(group)),
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const owned = new Set<string>()
|
|
139
|
+
const children = found.map(({ ids, ...child }) => {
|
|
140
|
+
const entries = resume.filter((entry) => ids.has(entry.interruptId))
|
|
141
|
+
for (const entry of entries) owned.add(entry.interruptId)
|
|
142
|
+
return { ...child, resume: entries }
|
|
143
|
+
})
|
|
144
|
+
if (owned.size === 0) return undefined
|
|
145
|
+
return {
|
|
146
|
+
before,
|
|
147
|
+
children,
|
|
148
|
+
rest: resume.filter((entry) => !owned.has(entry.interruptId)),
|
|
149
|
+
...(plan !== undefined && { plan }),
|
|
150
|
+
}
|
|
151
|
+
}
|