experimental-a2 0.3.0 → 0.5.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 (205) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/dist/ai-CFNeCrRl.d.ts +334 -0
  3. package/dist/ai-CFNeCrRl.d.ts.map +1 -0
  4. package/dist/ai-server.browser.js +2 -0
  5. package/dist/ai-server.browser.js.map +1 -0
  6. package/dist/ai-server.d.ts +49 -9
  7. package/dist/ai-server.d.ts.map +1 -0
  8. package/dist/ai-server.js +123 -49
  9. package/dist/ai-server.js.map +1 -0
  10. package/dist/ai.d.ts +2 -303
  11. package/dist/ai.js +233 -86
  12. package/dist/ai.js.map +1 -0
  13. package/dist/cli-B3VuxoDe.js +599 -0
  14. package/dist/cli-B3VuxoDe.js.map +1 -0
  15. package/dist/cli-bin.d.ts +1 -0
  16. package/dist/cli-bin.js +7 -0
  17. package/dist/cli-bin.js.map +1 -0
  18. package/dist/cli.d.ts +20 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +2 -0
  21. package/dist/client-BKlyLiOU.js +1008 -0
  22. package/dist/client-BKlyLiOU.js.map +1 -0
  23. package/dist/client-D7mvIXrF.d.ts +191 -0
  24. package/dist/client-D7mvIXrF.d.ts.map +1 -0
  25. package/dist/client.d.ts +2 -90
  26. package/dist/client.js +1 -409
  27. package/dist/{contract-CG_adnu_.js → contract-48bUMgcL.js} +12 -2
  28. package/dist/contract-48bUMgcL.js.map +1 -0
  29. package/dist/{contract-C_3dIIEU.d.ts → contract-jIfaR085.d.ts} +63 -8
  30. package/dist/contract-jIfaR085.d.ts.map +1 -0
  31. package/dist/devtools-J_jZ2vQf.d.ts +152 -0
  32. package/dist/devtools-J_jZ2vQf.d.ts.map +1 -0
  33. package/dist/devtools-kJJaORn-.js +340 -0
  34. package/dist/devtools-kJJaORn-.js.map +1 -0
  35. package/dist/devtools-server.browser.js +3 -1
  36. package/dist/devtools-server.browser.js.map +1 -0
  37. package/dist/devtools-server.d.ts +4 -3
  38. package/dist/devtools-server.d.ts.map +1 -0
  39. package/dist/devtools-server.js +226 -43
  40. package/dist/devtools-server.js.map +1 -0
  41. package/dist/devtools.d.ts +2 -0
  42. package/dist/devtools.js +2 -0
  43. package/dist/{errors-BJRMd-h6.js → errors-BQuJpe82.js} +6 -4
  44. package/dist/errors-BQuJpe82.js.map +1 -0
  45. package/dist/{errors-xL_JTXsY.d.ts → errors-W6nwJ-fm.d.ts} +3 -2
  46. package/dist/errors-W6nwJ-fm.d.ts.map +1 -0
  47. package/dist/http.d.ts +135 -28
  48. package/dist/http.d.ts.map +1 -0
  49. package/dist/http.js +647 -61
  50. package/dist/http.js.map +1 -0
  51. package/dist/{idempotent-replay-BMyHrP0L.js → idempotent-replay-DuqEkYA7.js} +4 -2
  52. package/dist/idempotent-replay-DuqEkYA7.js.map +1 -0
  53. package/dist/index.d.ts +5 -5
  54. package/dist/index.js +2 -2
  55. package/dist/{inspection-E7qbD0Xj.js → inspection-DaxB5jM2.js} +4 -1
  56. package/dist/inspection-DaxB5jM2.js.map +1 -0
  57. package/dist/internal-DstsI6Re.js +211 -0
  58. package/dist/internal-DstsI6Re.js.map +1 -0
  59. package/dist/otel.d.ts +3 -2
  60. package/dist/otel.d.ts.map +1 -0
  61. package/dist/otel.js +2 -0
  62. package/dist/otel.js.map +1 -0
  63. package/dist/platform-B4TnJtWu.js +34 -0
  64. package/dist/platform-B4TnJtWu.js.map +1 -0
  65. package/dist/react.d.ts +47 -15
  66. package/dist/react.d.ts.map +1 -0
  67. package/dist/react.js +30 -15
  68. package/dist/react.js.map +1 -0
  69. package/dist/retryable-lazy-DZWmHpii.js +2 -0
  70. package/dist/retryable-lazy-DZWmHpii.js.map +1 -0
  71. package/dist/scheduler-qstash.d.ts +79 -0
  72. package/dist/scheduler-qstash.d.ts.map +1 -0
  73. package/dist/scheduler-qstash.js +501 -0
  74. package/dist/scheduler-qstash.js.map +1 -0
  75. package/dist/scheduler-task-BpzhPnRS.js +56 -0
  76. package/dist/scheduler-task-BpzhPnRS.js.map +1 -0
  77. package/dist/{recovery-vercel.d.ts → scheduler-vercel.d.ts} +18 -24
  78. package/dist/scheduler-vercel.d.ts.map +1 -0
  79. package/dist/scheduler-vercel.js +228 -0
  80. package/dist/scheduler-vercel.js.map +1 -0
  81. package/dist/server-C72KOw51.js +1457 -0
  82. package/dist/server-C72KOw51.js.map +1 -0
  83. package/dist/server-DUF9pjsx.d.ts +261 -0
  84. package/dist/server-DUF9pjsx.d.ts.map +1 -0
  85. package/dist/server.browser.js +2 -0
  86. package/dist/server.browser.js.map +1 -0
  87. package/dist/server.d.ts +4 -155
  88. package/dist/server.js +2 -2
  89. package/dist/{log-ldf5g8Cx.d.ts → store-DysUkTH3.d.ts} +120 -35
  90. package/dist/store-DysUkTH3.d.ts.map +1 -0
  91. package/dist/{log-yJbXUf72.js → store-N8PXxDAS.js} +3 -1
  92. package/dist/store-N8PXxDAS.js.map +1 -0
  93. package/dist/store-codec-DTG0Ftek.js +10 -0
  94. package/dist/store-codec-DTG0Ftek.js.map +1 -0
  95. package/dist/store-memory.d.ts +12 -0
  96. package/dist/store-memory.d.ts.map +1 -0
  97. package/dist/{log-memory.js → store-memory.js} +145 -34
  98. package/dist/store-memory.js.map +1 -0
  99. package/dist/{log-polling-DZ1MiKLg.js → store-polling-dSeLxzfb.js} +7 -5
  100. package/dist/store-polling-dSeLxzfb.js.map +1 -0
  101. package/dist/{log-postgres.d.ts → store-postgres.d.ts} +7 -6
  102. package/dist/store-postgres.d.ts.map +1 -0
  103. package/dist/{log-postgres.js → store-postgres.js} +214 -24
  104. package/dist/store-postgres.js.map +1 -0
  105. package/dist/{log-redis-core-CyJ5L8yR.js → store-redis-core-BFLwz0Wj.js} +271 -66
  106. package/dist/store-redis-core-BFLwz0Wj.js.map +1 -0
  107. package/dist/{log-redis-http.d.ts → store-redis-http.d.ts} +8 -7
  108. package/dist/store-redis-http.d.ts.map +1 -0
  109. package/dist/{log-redis-http.js → store-redis-http.js} +22 -12
  110. package/dist/store-redis-http.js.map +1 -0
  111. package/dist/{log-redis.d.ts → store-redis.d.ts} +7 -6
  112. package/dist/store-redis.d.ts.map +1 -0
  113. package/dist/{log-redis.js → store-redis.js} +101 -39
  114. package/dist/store-redis.js.map +1 -0
  115. package/dist/{log-sqlite.d.ts → store-sqlite.d.ts} +7 -6
  116. package/dist/store-sqlite.d.ts.map +1 -0
  117. package/dist/{log-sqlite.js → store-sqlite.js} +118 -22
  118. package/dist/store-sqlite.js.map +1 -0
  119. package/dist/{telemetry-Cso0qyHQ.d.ts → telemetry-BjYHTfh2.d.ts} +3 -2
  120. package/dist/telemetry-BjYHTfh2.d.ts.map +1 -0
  121. package/dist/testing.browser.d.ts +1 -0
  122. package/dist/testing.browser.js +6 -0
  123. package/dist/testing.browser.js.map +1 -0
  124. package/dist/testing.d.ts +32 -0
  125. package/dist/testing.d.ts.map +1 -0
  126. package/dist/testing.js +103 -0
  127. package/dist/testing.js.map +1 -0
  128. package/dist/validate-XKT4FSNn.js +2 -0
  129. package/dist/validate-XKT4FSNn.js.map +1 -0
  130. package/dist/wire-BFQmSJ-9.js +284 -0
  131. package/dist/wire-BFQmSJ-9.js.map +1 -0
  132. package/docs/01-quickstart.mdx +3 -3
  133. package/docs/concepts/01-contracts.mdx +18 -13
  134. package/docs/concepts/02-handlers.mdx +7 -7
  135. package/docs/concepts/03-durability.mdx +21 -21
  136. package/docs/concepts/04-state.mdx +18 -21
  137. package/docs/guides/01-timers.mdx +154 -49
  138. package/docs/guides/02-cancellation.mdx +30 -4
  139. package/docs/guides/03-react.mdx +76 -57
  140. package/docs/guides/04-local-first.mdx +1 -1
  141. package/docs/guides/05-production.mdx +310 -61
  142. package/docs/guides/06-ai-agents.mdx +252 -74
  143. package/docs/guides/07-devtools.mdx +137 -12
  144. package/docs/guides/08-application-data.mdx +1 -1
  145. package/docs/guides/09-presence.mdx +263 -0
  146. package/docs/guides/10-transports.mdx +140 -0
  147. package/docs/index.mdx +18 -14
  148. package/docs/reference/01-api.mdx +839 -110
  149. package/docs/reference/02-errors.mdx +13 -6
  150. package/package.json +24 -7
  151. package/src/ai-coordinator.ts +358 -0
  152. package/src/ai-projector.ts +524 -0
  153. package/src/ai-sdk-step.ts +261 -0
  154. package/src/ai-server.browser.ts +5 -0
  155. package/src/ai-server.ts +1719 -0
  156. package/src/ai.ts +2155 -0
  157. package/src/cache-indexeddb.ts +10 -0
  158. package/src/cli-bin.ts +5 -0
  159. package/src/cli.ts +1046 -0
  160. package/src/client.ts +1826 -0
  161. package/src/contract.ts +206 -0
  162. package/src/deterministic-id.ts +72 -0
  163. package/src/devtools-app.ts +989 -0
  164. package/src/devtools-server.browser.ts +5 -0
  165. package/src/devtools-server.ts +604 -0
  166. package/src/devtools.ts +716 -0
  167. package/src/errors.ts +50 -0
  168. package/src/http.ts +394 -0
  169. package/src/idempotent-replay.ts +53 -0
  170. package/src/index.ts +37 -0
  171. package/src/inspection.ts +39 -0
  172. package/src/internal.ts +426 -0
  173. package/src/otel.ts +59 -0
  174. package/src/platform.ts +60 -0
  175. package/src/push-envelope.ts +137 -0
  176. package/src/react.ts +284 -0
  177. package/src/reducer.ts +108 -0
  178. package/src/retryable-lazy.ts +27 -0
  179. package/src/scheduler-qstash.ts +915 -0
  180. package/src/scheduler-task.ts +106 -0
  181. package/src/scheduler-vercel.ts +437 -0
  182. package/src/server.browser.ts +12 -0
  183. package/src/server.ts +2700 -0
  184. package/src/session-socket.ts +548 -0
  185. package/src/sse.ts +141 -0
  186. package/src/standard-schema.ts +77 -0
  187. package/src/store-codec.ts +10 -0
  188. package/src/store-memory.ts +788 -0
  189. package/src/store-polling.ts +102 -0
  190. package/src/store-postgres.ts +1212 -0
  191. package/src/store-redis-core.ts +1494 -0
  192. package/src/store-redis-http.ts +116 -0
  193. package/src/store-redis.ts +458 -0
  194. package/src/store-sqlite.ts +1108 -0
  195. package/src/store.ts +385 -0
  196. package/src/telemetry.ts +47 -0
  197. package/src/testing.browser.ts +5 -0
  198. package/src/testing.ts +185 -0
  199. package/src/validate.ts +39 -0
  200. package/src/wire.ts +454 -0
  201. package/dist/internal-gCd5qMry.js +0 -44
  202. package/dist/log-memory.d.ts +0 -11
  203. package/dist/recovery-vercel.js +0 -119
  204. package/dist/server-BcLa4RFL.js +0 -877
  205. package/dist/wire-BVsgR8o9.js +0 -62
@@ -0,0 +1,261 @@
1
+ import {
2
+ convertToModelMessages,
3
+ stepCountIs,
4
+ streamText,
5
+ toUIMessageStream,
6
+ } from 'ai'
7
+ import type {
8
+ FinishReason,
9
+ InferUIMessageChunk,
10
+ Instructions,
11
+ LanguageModel,
12
+ LanguageModelUsage,
13
+ TextStreamPart,
14
+ ToolSet,
15
+ UIMessage,
16
+ } from 'ai'
17
+
18
+ type StreamTextOptions<T extends ToolSet> = Parameters<typeof streamText<T>>[0]
19
+
20
+ type UIMessageMetadata<M extends UIMessage> =
21
+ M extends UIMessage<infer Metadata> ? Metadata : unknown
22
+
23
+ type ModelStepTimeout<T extends ToolSet> =
24
+ | number
25
+ | Omit<
26
+ Exclude<StreamTextOptions<T>['timeout'], number | undefined>,
27
+ 'toolMs' | 'tools'
28
+ >
29
+
30
+ type ControlledStreamTextSetting =
31
+ | '_internal'
32
+ | 'abortSignal'
33
+ | 'instructions'
34
+ | 'messages'
35
+ | 'model'
36
+ | 'onToolExecutionEnd'
37
+ | 'onToolExecutionStart'
38
+ | 'experimental_onToolCallFinish'
39
+ | 'experimental_onToolCallStart'
40
+ | 'experimental_sandbox'
41
+ | 'experimental_toolCallers'
42
+ | 'experimental_toolApprovalSecret'
43
+ | 'prompt'
44
+ | 'prepareStep'
45
+ | 'stopWhen'
46
+ | 'system'
47
+ | 'tools'
48
+
49
+ type RetypedStreamTextSetting =
50
+ | 'experimental_onStart'
51
+ | 'experimental_onStepStart'
52
+ | 'experimental_repairToolCall'
53
+ | 'experimental_transform'
54
+ | 'onStart'
55
+ | 'onStepStart'
56
+ | 'repairToolCall'
57
+
58
+ type ModelFacingTools<T extends ToolSet> = {
59
+ readonly [K in keyof T]: Omit<T[K], 'execute'>
60
+ }
61
+
62
+ type SettingEvent<T extends ToolSet, K extends keyof StreamTextOptions<T>> =
63
+ NonNullable<StreamTextOptions<T>[K]> extends (event: infer EVENT) => unknown
64
+ ? EVENT
65
+ : never
66
+
67
+ type ModelPhaseStartEvent<T extends ToolSet> = Omit<
68
+ SettingEvent<T, 'onStart'>,
69
+ 'tools'
70
+ > & {
71
+ readonly tools: ModelFacingTools<T> | undefined
72
+ }
73
+
74
+ type ModelPhaseStepStartEvent<T extends ToolSet> = Omit<
75
+ SettingEvent<T, 'onStepStart'>,
76
+ 'tools'
77
+ > & {
78
+ readonly tools: ModelFacingTools<T> | undefined
79
+ }
80
+
81
+ type ModelPhaseCallback<EVENT> = (event: EVENT) => void | PromiseLike<void>
82
+
83
+ type StreamTextRepairToolCall<T extends ToolSet> = NonNullable<
84
+ StreamTextOptions<T>['repairToolCall']
85
+ >
86
+
87
+ type ModelPhaseRepairToolCall<T extends ToolSet> = (
88
+ options: Omit<Parameters<StreamTextRepairToolCall<T>>[0], 'tools'> & {
89
+ tools: ModelFacingTools<T>
90
+ },
91
+ ) => ReturnType<StreamTextRepairToolCall<T>>
92
+
93
+ type StreamTextTransformSetting<T extends ToolSet> = NonNullable<
94
+ StreamTextOptions<T>['experimental_transform']
95
+ >
96
+
97
+ type StreamTextTransform<T extends ToolSet> = Extract<
98
+ StreamTextTransformSetting<T>,
99
+ (...args: never[]) => unknown
100
+ >
101
+
102
+ type ModelPhaseTransform<T extends ToolSet> = (
103
+ options: Omit<Parameters<StreamTextTransform<T>>[0], 'tools'> & {
104
+ tools: ModelFacingTools<T>
105
+ },
106
+ ) => ReturnType<StreamTextTransform<T>>
107
+
108
+ /** AI SDK streamText settings that remain meaningful for one durable step. */
109
+ export type AISDKStepSettings<T extends ToolSet> = Partial<
110
+ Omit<
111
+ StreamTextOptions<T>,
112
+ ControlledStreamTextSetting | RetypedStreamTextSetting | 'timeout'
113
+ >
114
+ > & {
115
+ timeout?: ModelStepTimeout<T>
116
+ onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>
117
+ experimental_onStart?: ModelPhaseCallback<ModelPhaseStartEvent<T>>
118
+ onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>
119
+ experimental_onStepStart?: ModelPhaseCallback<ModelPhaseStepStartEvent<T>>
120
+ repairToolCall?: ModelPhaseRepairToolCall<T>
121
+ experimental_repairToolCall?: ModelPhaseRepairToolCall<T>
122
+ experimental_transform?:
123
+ ModelPhaseTransform<T> | Array<ModelPhaseTransform<T>>
124
+ }
125
+
126
+ export type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {
127
+ model: LanguageModel
128
+ tools: T
129
+ messages: M[]
130
+ responseMessageId: string
131
+ abortSignal: AbortSignal
132
+ instructions?: Instructions
133
+ settings?: AISDKStepSettings<T>
134
+ messageMetadata?: (options: {
135
+ part: TextStreamPart<T>
136
+ }) => UIMessageMetadata<M> | undefined
137
+ }
138
+
139
+ export type AISDKStepCompletion = {
140
+ finishReason: FinishReason
141
+ usage: LanguageModelUsage
142
+ }
143
+
144
+ export type AISDKStepResult<M extends UIMessage> = {
145
+ stream: ReadableStream<InferUIMessageChunk<M>>
146
+ completion(): AISDKStepCompletion
147
+ }
148
+
149
+ const CONTROLLED_SETTINGS: readonly ControlledStreamTextSetting[] = [
150
+ '_internal',
151
+ 'abortSignal',
152
+ 'instructions',
153
+ 'messages',
154
+ 'model',
155
+ 'onToolExecutionEnd',
156
+ 'onToolExecutionStart',
157
+ 'experimental_onToolCallFinish',
158
+ 'experimental_onToolCallStart',
159
+ 'experimental_sandbox',
160
+ 'experimental_toolCallers',
161
+ 'experimental_toolApprovalSecret',
162
+ 'prompt',
163
+ 'prepareStep',
164
+ 'stopWhen',
165
+ 'system',
166
+ 'tools',
167
+ ]
168
+
169
+ const safeSettings = <T extends ToolSet>(
170
+ settings: AISDKStepSettings<T> | undefined,
171
+ ): AISDKStepSettings<T> => {
172
+ const result = { ...settings } as AISDKStepSettings<T>
173
+ for (const key of CONTROLLED_SETTINGS) Reflect.deleteProperty(result, key)
174
+ if (typeof result.timeout === 'object' && result.timeout !== null) {
175
+ const timeout = { ...result.timeout } as Record<string, unknown>
176
+ Reflect.deleteProperty(timeout, 'toolMs')
177
+ Reflect.deleteProperty(timeout, 'tools')
178
+ result.timeout = timeout as ModelStepTimeout<T>
179
+ }
180
+ return result
181
+ }
182
+
183
+ const modelToolSet = <T extends ToolSet>(tools: T): T =>
184
+ Object.fromEntries(
185
+ Object.entries(tools).map(([name, tool]) => {
186
+ if (tool.type === 'provider' && tool.isProviderExecuted === true) {
187
+ return [name, tool]
188
+ }
189
+ const definition = { ...tool }
190
+ Reflect.deleteProperty(definition, 'execute')
191
+ return [name, definition]
192
+ }),
193
+ ) as T
194
+
195
+ const errorMessage = (error: unknown): string =>
196
+ error instanceof Error ? error.message : String(error)
197
+
198
+ /** Run exactly one AI SDK model step while leaving local tool execution to A2. */
199
+ export async function generateAISDKStep<M extends UIMessage, T extends ToolSet>(
200
+ input: AISDKStepInput<M, T>,
201
+ ): Promise<AISDKStepResult<M>> {
202
+ const settings = safeSettings(input.settings)
203
+ const tools = modelToolSet(input.tools)
204
+ const messages = await convertToModelMessages(input.messages, { tools })
205
+ const streamOptions = {
206
+ ...settings,
207
+ model: input.model,
208
+ tools,
209
+ messages,
210
+ abortSignal: input.abortSignal,
211
+ ...(input.instructions === undefined
212
+ ? {}
213
+ : { instructions: input.instructions }),
214
+ stopWhen: stepCountIs(1),
215
+ // A2 records stream failures durably; the AI SDK default writes them to
216
+ // stderr in addition to yielding an error part.
217
+ onError: settings.onError ?? (() => {}),
218
+ } as unknown as StreamTextOptions<T>
219
+ const result = streamText<T>(streamOptions)
220
+
221
+ let completion: AISDKStepCompletion | undefined
222
+ let fatalError: { value: unknown } | undefined
223
+ const observed = result.stream.pipeThrough(
224
+ new TransformStream<TextStreamPart<T>, TextStreamPart<T>>({
225
+ transform(part, controller) {
226
+ if (part.type === 'error' && fatalError === undefined) {
227
+ fatalError = { value: part.error }
228
+ } else if (part.type === 'finish') {
229
+ completion = {
230
+ finishReason: part.finishReason,
231
+ usage: part.totalUsage,
232
+ }
233
+ }
234
+ controller.enqueue(part)
235
+ },
236
+ }),
237
+ )
238
+
239
+ return {
240
+ stream: toUIMessageStream<T, M>({
241
+ stream: observed,
242
+ tools,
243
+ originalMessages: input.messages,
244
+ generateMessageId: () => input.responseMessageId,
245
+ onError: errorMessage,
246
+ ...(input.messageMetadata === undefined
247
+ ? {}
248
+ : { messageMetadata: input.messageMetadata }),
249
+ }),
250
+ completion() {
251
+ if (fatalError !== undefined) throw fatalError.value
252
+ if (completion === undefined) {
253
+ throw new Error('AI SDK step ended without a finish part')
254
+ }
255
+ if (completion.finishReason === 'error') {
256
+ throw new Error('AI SDK step finished with an error')
257
+ }
258
+ return completion
259
+ },
260
+ }
261
+ }
@@ -0,0 +1,5 @@
1
+ /** experimental-a2/ai/server is server-only; agent definitions live in experimental-a2/ai. */
2
+ throw new Error(
3
+ 'experimental-a2/ai/server is server-only — a client bundle imported it. Import agent from experimental-a2/ai in browser code instead.',
4
+ )
5
+ export {}