@tanstack/ai 0.57.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.
Files changed (95) hide show
  1. package/dist/esm/activities/chat/agents/define-agent.d.ts +81 -0
  2. package/dist/esm/activities/chat/agents/define-agent.js +34 -0
  3. package/dist/esm/activities/chat/agents/define-agent.js.map +1 -0
  4. package/dist/esm/activities/chat/agents/route.d.ts +53 -0
  5. package/dist/esm/activities/chat/agents/route.js +59 -0
  6. package/dist/esm/activities/chat/agents/route.js.map +1 -0
  7. package/dist/esm/activities/chat/agents/spawn.d.ts +124 -0
  8. package/dist/esm/activities/chat/agents/spawn.js +490 -0
  9. package/dist/esm/activities/chat/agents/spawn.js.map +1 -0
  10. package/dist/esm/activities/chat/agents/turn.d.ts +36 -0
  11. package/dist/esm/activities/chat/agents/turn.js +78 -0
  12. package/dist/esm/activities/chat/agents/turn.js.map +1 -0
  13. package/dist/esm/activities/chat/index.d.ts +13 -3
  14. package/dist/esm/activities/chat/index.js +345 -19
  15. package/dist/esm/activities/chat/index.js.map +1 -1
  16. package/dist/esm/activities/chat/messages.d.ts +7 -1
  17. package/dist/esm/activities/chat/messages.js +94 -18
  18. package/dist/esm/activities/chat/messages.js.map +1 -1
  19. package/dist/esm/activities/chat/middleware/run-store.d.ts +43 -7
  20. package/dist/esm/activities/chat/middleware/run-store.js +8 -1
  21. package/dist/esm/activities/chat/middleware/run-store.js.map +1 -1
  22. package/dist/esm/activities/chat/middleware/types.d.ts +50 -3
  23. package/dist/esm/activities/chat/middleware/types.js.map +1 -1
  24. package/dist/esm/activities/chat/stream/processor.d.ts +46 -0
  25. package/dist/esm/activities/chat/stream/processor.js +280 -7
  26. package/dist/esm/activities/chat/stream/processor.js.map +1 -1
  27. package/dist/esm/activities/chat/tools/tool-calls.d.ts +17 -3
  28. package/dist/esm/activities/chat/tools/tool-calls.js +56 -7
  29. package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
  30. package/dist/esm/activities/generateAudio/index.js +1 -1
  31. package/dist/esm/activities/generateImage/index.js +1 -1
  32. package/dist/esm/activities/generateLiveVideo/index.js +1 -1
  33. package/dist/esm/activities/generateSpeech/index.js +1 -1
  34. package/dist/esm/activities/generateTranscription/index.js +1 -1
  35. package/dist/esm/activities/generateVoice/index.js +1 -1
  36. package/dist/esm/activities/generateWorld/index.js +1 -1
  37. package/dist/esm/activities/index.d.ts +3 -0
  38. package/dist/esm/activities/index.js +5 -3
  39. package/dist/esm/activities/summarize/index.js +1 -1
  40. package/dist/esm/client.d.ts +5 -36
  41. package/dist/esm/client.js +4 -37
  42. package/dist/esm/client.js.map +1 -1
  43. package/dist/esm/index.d.ts +5 -0
  44. package/dist/esm/index.js +7 -4
  45. package/dist/esm/middlewares/content-guard.js.map +1 -1
  46. package/dist/esm/stream-to-response.js +12 -6
  47. package/dist/esm/stream-to-response.js.map +1 -1
  48. package/dist/esm/strip-to-spec-middleware.js +2 -1
  49. package/dist/esm/strip-to-spec-middleware.js.map +1 -1
  50. package/dist/esm/types.d.ts +128 -89
  51. package/dist/esm/utilities/adapter-yield-chunk.d.ts +5 -1
  52. package/dist/esm/utilities/ag-ui-usage.d.ts +9 -9
  53. package/dist/esm/utilities/ag-ui-usage.js +66 -3
  54. package/dist/esm/utilities/ag-ui-usage.js.map +1 -1
  55. package/dist/esm/utilities/ag-ui-wire.js +56 -0
  56. package/dist/esm/utilities/ag-ui-wire.js.map +1 -1
  57. package/dist/esm/utilities/durability-batch.d.ts +8 -0
  58. package/dist/esm/utilities/durability-batch.js +45 -0
  59. package/dist/esm/utilities/durability-batch.js.map +1 -0
  60. package/dist/esm/utilities/normalize-stream-chunk.js +7 -2
  61. package/dist/esm/utilities/normalize-stream-chunk.js.map +1 -1
  62. package/dist/esm/utilities/spec-event-keys.js +13 -8
  63. package/dist/esm/utilities/spec-event-keys.js.map +1 -1
  64. package/dist/esm/utilities/subagent-wire.d.ts +36 -0
  65. package/dist/esm/utilities/subagent-wire.js +131 -0
  66. package/dist/esm/utilities/subagent-wire.js.map +1 -0
  67. package/package.json +4 -4
  68. package/skills/ai-core/adapter-configuration/references/grok-adapter.md +1 -1
  69. package/skills/ai-core/media-generation/SKILL.md +2 -2
  70. package/skills/ai-core/middleware/SKILL.md +7 -4
  71. package/src/activities/chat/agents/define-agent.ts +121 -0
  72. package/src/activities/chat/agents/route.ts +115 -0
  73. package/src/activities/chat/agents/spawn.ts +806 -0
  74. package/src/activities/chat/agents/turn.ts +151 -0
  75. package/src/activities/chat/index.ts +540 -16
  76. package/src/activities/chat/messages.ts +125 -15
  77. package/src/activities/chat/middleware/run-store.ts +56 -7
  78. package/src/activities/chat/middleware/types.ts +55 -2
  79. package/src/activities/chat/stream/processor.ts +428 -8
  80. package/src/activities/chat/tools/tool-calls.ts +92 -16
  81. package/src/activities/index.ts +15 -0
  82. package/src/client.ts +22 -35
  83. package/src/index.ts +23 -0
  84. package/src/middlewares/content-guard.ts +7 -5
  85. package/src/stream-to-response.ts +16 -6
  86. package/src/strip-to-spec-middleware.ts +2 -1
  87. package/src/types.ts +177 -95
  88. package/src/utilities/adapter-yield-chunk.ts +10 -2
  89. package/src/utilities/ag-ui-usage.test.ts +38 -0
  90. package/src/utilities/ag-ui-usage.ts +98 -11
  91. package/src/utilities/ag-ui-wire.ts +74 -0
  92. package/src/utilities/durability-batch.ts +48 -0
  93. package/src/utilities/normalize-stream-chunk.ts +10 -2
  94. package/src/utilities/spec-event-keys.ts +34 -7
  95. 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
+ }