experimental-a2 0.16.1 → 0.18.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/CHANGELOG.md +373 -0
- package/README.md +1 -1
- package/dist/{actor-ohPC-81x.d.ts → actor-Bjce9_5U.d.ts} +21 -11
- package/dist/actor-Bjce9_5U.d.ts.map +1 -0
- package/dist/actor-client.d.ts +2 -5
- package/dist/actor-client.d.ts.map +1 -1
- package/dist/actor-client.js +13 -4
- package/dist/actor-client.js.map +1 -1
- package/dist/actor-react.d.ts +5 -3
- package/dist/actor-react.d.ts.map +1 -1
- package/dist/actor-react.js +20 -10
- package/dist/actor-react.js.map +1 -1
- package/dist/{actor-shared-B5tJfzt-.js → actor-shared-t7w8xIKP.js} +12 -7
- package/dist/actor-shared-t7w8xIKP.js.map +1 -0
- package/dist/actor.d.ts +1 -1
- package/dist/actor.js +42 -23
- package/dist/actor.js.map +1 -1
- package/dist/{ai-DgOBltJ_.js → ai-BpOGm-zB.js} +621 -216
- package/dist/ai-BpOGm-zB.js.map +1 -0
- package/dist/{ai-CrEf6p_W.d.ts → ai-DrUaMyRt.d.ts} +114 -100
- package/dist/ai-DrUaMyRt.d.ts.map +1 -0
- package/dist/ai-client.d.ts +27 -0
- package/dist/ai-client.d.ts.map +1 -0
- package/dist/ai-client.js +29 -0
- package/dist/ai-client.js.map +1 -0
- package/dist/ai-fx.browser.d.ts +1 -0
- package/dist/ai-fx.browser.js +6 -0
- package/dist/ai-fx.browser.js.map +1 -0
- package/dist/ai-fx.d.ts +10 -0
- package/dist/ai-fx.d.ts.map +1 -0
- package/dist/ai-fx.js +634 -0
- package/dist/ai-fx.js.map +1 -0
- package/dist/ai-harness-BuLh_EYi.js +273 -0
- package/dist/ai-harness-BuLh_EYi.js.map +1 -0
- package/dist/ai-harness-DvsPeJeB.d.ts +26 -0
- package/dist/ai-harness-DvsPeJeB.d.ts.map +1 -0
- package/dist/ai-pi.browser.d.ts +1 -0
- package/dist/ai-pi.browser.js +6 -0
- package/dist/ai-pi.browser.js.map +1 -0
- package/dist/ai-pi.d.ts +17 -0
- package/dist/ai-pi.d.ts.map +1 -0
- package/dist/ai-pi.js +904 -0
- package/dist/ai-pi.js.map +1 -0
- package/dist/ai-react.d.ts +96 -0
- package/dist/ai-react.d.ts.map +1 -0
- package/dist/ai-react.js +142 -0
- package/dist/ai-react.js.map +1 -0
- package/dist/ai-server.browser.js +2 -2
- package/dist/ai-server.browser.js.map +1 -1
- package/dist/ai-server.d.ts +109 -43
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +526 -283
- package/dist/ai-server.js.map +1 -1
- package/dist/ai.d.ts +2 -2
- package/dist/ai.js +2 -2
- package/dist/bounded-cache-CPHWF-8h.js +41 -0
- package/dist/bounded-cache-CPHWF-8h.js.map +1 -0
- package/dist/{client-BYzHjkwU.js → client-BReKqwZC.js} +447 -80
- package/dist/client-BReKqwZC.js.map +1 -0
- package/dist/{client-CzyacQpJ.d.ts → client-h_DKFAjj.d.ts} +14 -13
- package/dist/client-h_DKFAjj.d.ts.map +1 -0
- package/dist/client.d.ts +4 -2
- package/dist/client.js +1 -1
- package/dist/{contract-CKRg_E4q.js → contract-BYKASlCV.js} +12 -21
- package/dist/contract-BYKASlCV.js.map +1 -0
- package/dist/{idempotent-replay-DVOlyYbx.js → idempotent-replay-JdgMQRRm.js} +2 -2
- package/dist/{idempotent-replay-DVOlyYbx.js.map → idempotent-replay-JdgMQRRm.js.map} +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/{errors-DvhSXnxk.d.ts → initial-snapshot-Bx-c0pDP.d.ts} +7 -3
- package/dist/initial-snapshot-Bx-c0pDP.d.ts.map +1 -0
- package/dist/{internal-Dq2qYxou.js → internal-B2T3U4Rq.js} +29 -2
- package/dist/internal-B2T3U4Rq.js.map +1 -0
- package/dist/otel.d.ts +1 -1
- package/dist/react-BBXgHWFc.d.ts +86 -0
- package/dist/react-BBXgHWFc.d.ts.map +1 -0
- package/dist/react.d.ts +2 -122
- package/dist/react.js +107 -100
- package/dist/react.js.map +1 -1
- package/dist/reducer-BAXc8JyF.js +87 -0
- package/dist/reducer-BAXc8JyF.js.map +1 -0
- package/dist/{reducer-otzHjuJj.d.ts → reducer-CqA59Q6U.d.ts} +46 -30
- package/dist/reducer-CqA59Q6U.d.ts.map +1 -0
- package/dist/reducer-runtime-DQwz_J59.js +28 -0
- package/dist/reducer-runtime-DQwz_J59.js.map +1 -0
- package/dist/scheduler-qstash.d.ts +3 -3
- package/dist/scheduler-qstash.d.ts.map +1 -1
- package/dist/scheduler-qstash.js +33 -10
- package/dist/scheduler-qstash.js.map +1 -1
- package/dist/{scheduler-task-BpzhPnRS.js → scheduler-task-X1SToDjP.js} +18 -3
- package/dist/scheduler-task-X1SToDjP.js.map +1 -0
- package/dist/scheduler-vercel.d.ts +4 -9
- package/dist/scheduler-vercel.d.ts.map +1 -1
- package/dist/scheduler-vercel.js +25 -44
- package/dist/scheduler-vercel.js.map +1 -1
- package/dist/{server-BD5ckxZb.js → server-Dw_k_7kO.js} +904 -219
- package/dist/server-Dw_k_7kO.js.map +1 -0
- package/dist/{server-DbD7IJVK.d.ts → server-En7cbi3v.d.ts} +116 -26
- package/dist/server-En7cbi3v.d.ts.map +1 -0
- package/dist/server.d.ts +4 -4
- package/dist/server.js +2 -2
- package/dist/session-clear-Bo-XTFEy.d.ts +12 -0
- package/dist/session-clear-Bo-XTFEy.d.ts.map +1 -0
- package/dist/{errors-DCk6ch5n.js → session-clear-DGI4jTQ5.js} +17 -2
- package/dist/session-clear-DGI4jTQ5.js.map +1 -0
- package/dist/{store-DyZM6fS5.d.ts → store-Djdv0bnZ.d.ts} +73 -3
- package/dist/store-Djdv0bnZ.d.ts.map +1 -0
- package/dist/store-N8PXxDAS.js.map +1 -1
- package/dist/store-memory.d.ts +1 -1
- package/dist/store-memory.d.ts.map +1 -1
- package/dist/store-memory.js +205 -66
- package/dist/store-memory.js.map +1 -1
- package/dist/{store-polling-CmxUbV93.js → store-polling-B5FcwJfo.js} +21 -4
- package/dist/store-polling-B5FcwJfo.js.map +1 -0
- package/dist/store-postgres.d.ts +1 -1
- package/dist/store-postgres.d.ts.map +1 -1
- package/dist/store-postgres.js +450 -108
- package/dist/store-postgres.js.map +1 -1
- package/dist/{store-presence-polling-C7-XZyW9.js → store-presence-polling-BAwS8RWn.js} +3 -3
- package/dist/{store-presence-polling-C7-XZyW9.js.map → store-presence-polling-BAwS8RWn.js.map} +1 -1
- package/dist/store-redis-http.d.ts +1 -1
- package/dist/store-redis-http.d.ts.map +1 -1
- package/dist/store-redis-http.js +293 -11
- package/dist/store-redis-http.js.map +1 -1
- package/dist/store-redis-notify-BRITti_o.js +2493 -0
- package/dist/store-redis-notify-BRITti_o.js.map +1 -0
- package/dist/store-redis.d.ts +1 -1
- package/dist/store-redis.d.ts.map +1 -1
- package/dist/store-redis.js +11 -11
- package/dist/store-redis.js.map +1 -1
- package/dist/store-sqlite.d.ts +1 -1
- package/dist/store-sqlite.d.ts.map +1 -1
- package/dist/store-sqlite.js +197 -33
- package/dist/store-sqlite.js.map +1 -1
- package/dist/stream-buffer-Cx7AAPGq.js +23 -0
- package/dist/stream-buffer-Cx7AAPGq.js.map +1 -0
- package/dist/{telemetry-B5jzpy6y.d.ts → telemetry-Cyfqo6Qt.d.ts} +2 -2
- package/dist/telemetry-Cyfqo6Qt.d.ts.map +1 -0
- package/dist/{wire-BO5wWCb1.js → wire-rSUglYo8.js} +132 -10
- package/dist/wire-rSUglYo8.js.map +1 -0
- package/docs/01-quickstart.mdx +50 -84
- package/docs/{guides/07-examples.mdx → 02-examples.mdx} +10 -20
- package/docs/actors/01-introduction.mdx +48 -82
- package/docs/actors/02-concurrency.mdx +43 -70
- package/docs/actors/03-timers.mdx +28 -42
- package/docs/actors/04-routes.mdx +110 -137
- package/docs/actors/meta.ts +1 -1
- package/docs/agents/01-introduction.mdx +257 -0
- package/docs/agents/02-tools.mdx +247 -0
- package/docs/agents/03-conversations.mdx +538 -0
- package/docs/agents/04-harnesses.mdx +136 -0
- package/docs/agents/meta.ts +1 -0
- package/docs/client/01-react.mdx +294 -0
- package/docs/client/02-transports.mdx +86 -0
- package/docs/client/03-presence.mdx +224 -0
- package/docs/client/meta.ts +1 -0
- package/docs/contract/01-events.mdx +57 -0
- package/docs/contract/02-state.mdx +142 -0
- package/docs/contract/03-sessions.mdx +175 -0
- package/docs/index.mdx +112 -156
- package/docs/reference/01-core.mdx +139 -0
- package/docs/reference/02-server.mdx +855 -0
- package/docs/reference/03-client.mdx +301 -0
- package/docs/reference/04-ai.mdx +722 -0
- package/docs/reference/05-adapters.mdx +351 -0
- package/docs/reference/06-errors.mdx +138 -0
- package/docs/reference/meta.ts +1 -1
- package/docs/server/01-handlers.mdx +200 -0
- package/docs/server/02-timers.mdx +130 -0
- package/docs/server/03-cancellation.mdx +141 -0
- package/docs/server/04-routes.mdx +243 -0
- package/docs/server/05-production.mdx +322 -0
- package/docs/server/06-guarantees.mdx +123 -0
- package/examples/playground/DEPLOY.md +53 -7
- package/examples/playground/app/a0/[appId]/loading.tsx +16 -0
- package/examples/playground/app/a0/[appId]/page.tsx +53 -0
- package/examples/playground/app/a0/a0.css +818 -0
- package/examples/playground/app/a0/app-list.tsx +218 -0
- package/examples/playground/app/a0/app-view.tsx +63 -0
- package/examples/playground/app/a0/apps/[appId]/preview/route.ts +27 -0
- package/examples/playground/app/a0/apps/[appId]/route.ts +28 -0
- package/examples/playground/app/a0/apps.test.ts +128 -0
- package/examples/playground/app/a0/apps.ts +102 -0
- package/examples/playground/app/a0/chat.tsx +410 -0
- package/examples/playground/app/a0/columns.tsx +109 -0
- package/examples/playground/app/a0/context-menu.tsx +116 -0
- package/examples/playground/app/a0/cookies.ts +46 -0
- package/examples/playground/app/a0/crash-on-request.ts +72 -0
- package/examples/playground/app/a0/crashes/route.ts +3 -0
- package/examples/playground/app/a0/crashes.test.ts +33 -0
- package/examples/playground/app/a0/crashes.ts +28 -0
- package/examples/playground/app/a0/devtools.tsx +164 -0
- package/examples/playground/app/a0/events/route.ts +6 -0
- package/examples/playground/app/a0/flags.ts +30 -0
- package/examples/playground/app/a0/fx/events/route.ts +9 -0
- package/examples/playground/app/a0/fx/scheduler/route.ts +7 -0
- package/examples/playground/app/a0/fx/short/events/route.ts +11 -0
- package/examples/playground/app/a0/layout.tsx +38 -0
- package/examples/playground/app/a0/list/route.ts +10 -0
- package/examples/playground/app/a0/model.test.ts +73 -0
- package/examples/playground/app/a0/model.ts +95 -0
- package/examples/playground/app/a0/no-photon.cjs +4 -0
- package/examples/playground/app/a0/no-quickjs.cjs +3 -0
- package/examples/playground/app/a0/page.tsx +14 -0
- package/examples/playground/app/a0/pi/events/route.ts +9 -0
- package/examples/playground/app/a0/pi/scheduler/route.ts +7 -0
- package/examples/playground/app/a0/pi/short/events/route.ts +11 -0
- package/examples/playground/app/a0/preview-pane.tsx +145 -0
- package/examples/playground/app/a0/preview.test.ts +53 -0
- package/examples/playground/app/a0/preview.ts +26 -0
- package/examples/playground/app/a0/sandbox-log.ts +75 -0
- package/examples/playground/app/a0/sandbox-session.ts +152 -0
- package/examples/playground/app/a0/sandbox.ts +191 -0
- package/examples/playground/app/a0/sandboxes/scheduler/route.ts +6 -0
- package/examples/playground/app/a0/scheduler/route.ts +7 -0
- package/examples/playground/app/a0/server.ts +213 -0
- package/examples/playground/app/a0/session.ts +59 -0
- package/examples/playground/app/a0/shell.tsx +158 -0
- package/examples/playground/app/a0/short/events/route.ts +9 -0
- package/examples/playground/app/a0/splitter.tsx +120 -0
- package/examples/playground/app/agent/[agentId]/agent-client.tsx +144 -174
- package/examples/playground/app/agent/[agentId]/command-receipt.test.tsx +65 -0
- package/examples/playground/app/agent/[agentId]/command-receipt.tsx +27 -0
- package/examples/playground/app/agent/[agentId]/compaction-event.tsx +25 -24
- package/examples/playground/app/agent/[agentId]/compaction-panel.test.tsx +119 -0
- package/examples/playground/app/agent/[agentId]/compaction-panel.tsx +208 -165
- package/examples/playground/app/agent/[agentId]/page.tsx +2 -16
- package/examples/playground/app/agent/events/route.ts +5 -2
- package/examples/playground/app/agent/ingress.test.ts +101 -0
- package/examples/playground/app/agent/model-input.test.tsx +58 -0
- package/examples/playground/app/agent/model-input.tsx +115 -0
- package/examples/playground/app/agent/model.test.ts +73 -0
- package/examples/playground/app/agent/model.ts +58 -26
- package/examples/playground/app/agent/new-agent-session.tsx +37 -19
- package/examples/playground/app/agent/page.tsx +4 -4
- package/examples/playground/app/agent/server.ts +19 -15
- package/examples/playground/app/agent/session.ts +5 -6
- package/examples/playground/app/agent/telemetry.test.ts +189 -0
- package/examples/playground/app/agent/telemetry.ts +30 -0
- package/examples/playground/app/agent/trace.test.ts +23 -0
- package/examples/playground/app/agent/trace.ts +18 -0
- package/examples/playground/app/canvas/[canvasId]/canvas-client.tsx +12 -12
- package/examples/playground/app/canvas/[canvasId]/page.tsx +1 -2
- package/examples/playground/app/canvas/[canvasId]/session.ts +2 -2
- package/examples/playground/app/canvas/model.ts +53 -53
- package/examples/playground/app/chat/[chatId]/agent-state.test.ts +176 -0
- package/examples/playground/app/chat/[chatId]/agent-stream-drawer.tsx +16 -1
- package/examples/playground/app/chat/[chatId]/chat-client.tsx +55 -77
- package/examples/playground/app/chat/[chatId]/chat-view.ts +37 -3
- package/examples/playground/app/chat/[chatId]/page.tsx +7 -15
- package/examples/playground/app/chat/[chatId]/session.ts +2 -19
- package/examples/playground/app/chat/agent/route.ts +9 -0
- package/examples/playground/app/chat/model.test.ts +46 -119
- package/examples/playground/app/chat/model.ts +82 -128
- package/examples/playground/app/chat/scheduler/route.ts +2 -2
- package/examples/playground/app/chat/server.test.ts +112 -0
- package/examples/playground/app/chat/server.ts +113 -117
- package/examples/playground/app/components/activity-feed.tsx +30 -1
- package/examples/playground/app/components/activity-history.test.tsx +35 -0
- package/examples/playground/app/components/demo-icons.tsx +89 -0
- package/examples/playground/app/components/demos.tsx +33 -0
- package/examples/playground/app/components/fast-link.test.tsx +58 -0
- package/examples/playground/app/components/fast-link.tsx +55 -0
- package/examples/playground/app/components/site-header.tsx +96 -0
- package/examples/playground/app/counter/counter-client.tsx +3 -3
- package/examples/playground/app/counter/model.test.ts +3 -3
- package/examples/playground/app/counter/model.ts +11 -21
- package/examples/playground/app/counter/page.tsx +2 -15
- package/examples/playground/app/counter/session.ts +2 -2
- package/examples/playground/app/documents/[documentId]/code-editor.tsx +12 -1
- package/examples/playground/app/documents/[documentId]/document-client.tsx +10 -11
- package/examples/playground/app/documents/[documentId]/page.tsx +1 -2
- package/examples/playground/app/documents/[documentId]/session.ts +2 -2
- package/examples/playground/app/documents/model.ts +27 -27
- package/examples/playground/app/globals.css +420 -207
- package/examples/playground/app/initial-state.test.tsx +54 -0
- package/examples/playground/app/layout.tsx +7 -23
- package/examples/playground/app/orders/[orderId]/page.tsx +1 -2
- package/examples/playground/app/orders/[orderId]/session.ts +2 -2
- package/examples/playground/app/orders/model.ts +49 -49
- package/examples/playground/app/page.tsx +13 -102
- package/examples/playground/app/recovery/[recoveryId]/page.tsx +1 -2
- package/examples/playground/app/recovery/[recoveryId]/session.ts +2 -2
- package/examples/playground/app/recovery/model.ts +30 -30
- package/examples/playground/instrumentation.ts +5 -0
- package/examples/playground/next.config.ts +17 -5
- package/examples/playground/package.json +13 -2
- package/examples/playground/scripts/a0-template.ts +77 -0
- package/examples/playground/vercel.json +36 -0
- package/package.json +29 -3
- package/src/actor-client.ts +16 -4
- package/src/actor-react.ts +25 -11
- package/src/actor-shared.ts +21 -6
- package/src/actor.ts +76 -31
- package/src/ai-agent-actions.ts +219 -0
- package/src/ai-agent.ts +2517 -0
- package/src/ai-app-state.ts +91 -0
- package/src/ai-client-state.ts +6 -3
- package/src/ai-client.ts +62 -0
- package/src/ai-context-schema.ts +25 -5
- package/src/ai-context.ts +90 -40
- package/src/ai-control-server.ts +92 -72
- package/src/ai-coordinator.ts +23 -22
- package/src/ai-fx.browser.ts +5 -0
- package/src/ai-fx.ts +833 -0
- package/src/ai-harness.ts +518 -0
- package/src/ai-message-base.ts +209 -0
- package/src/ai-message-projection.ts +262 -64
- package/src/ai-model-metadata.ts +11 -6
- package/src/ai-pi.browser.ts +5 -0
- package/src/ai-pi.ts +1263 -0
- package/src/ai-progress-batches.ts +26 -0
- package/src/ai-projector.ts +95 -14
- package/src/ai-react.ts +146 -0
- package/src/ai-sdk-step.ts +2 -2
- package/src/ai-server.browser.ts +2 -2
- package/src/ai-server.ts +23 -1965
- package/src/ai-stored-state.ts +48 -163
- package/src/ai.ts +339 -155
- package/src/bootstrap-stream.ts +72 -0
- package/src/bounded-cache.ts +55 -0
- package/src/client-render-session.ts +49 -0
- package/src/client.ts +688 -151
- package/src/contract.ts +92 -42
- package/src/deterministic-id.ts +37 -0
- package/src/equal-json.ts +32 -0
- package/src/errors.ts +13 -1
- package/src/index.ts +5 -1
- package/src/initial-snapshot.ts +39 -0
- package/src/internal.ts +52 -0
- package/src/libfx.d.ts +34 -0
- package/src/postgres-notification-scope.ts +14 -3
- package/src/react.ts +171 -206
- package/src/redis-http-reply.ts +256 -0
- package/src/redis-http-stream.ts +73 -0
- package/src/redis-http-subscriptions.ts +13 -5
- package/src/reducer-runtime.ts +52 -0
- package/src/reducer.ts +93 -11
- package/src/scheduler-qstash.ts +49 -20
- package/src/scheduler-task.ts +34 -2
- package/src/scheduler-vercel.ts +32 -84
- package/src/server-fetch.ts +139 -35
- package/src/server.ts +1133 -255
- package/src/session-clear.ts +23 -0
- package/src/session-socket.ts +154 -49
- package/src/sse.ts +71 -4
- package/src/store-memory.ts +252 -75
- package/src/store-polling.ts +18 -4
- package/src/store-postgres.ts +541 -114
- package/src/store-redis-core.ts +1450 -493
- package/src/store-redis-http.ts +18 -2
- package/src/store-redis-notify.ts +262 -85
- package/src/store-redis.ts +19 -9
- package/src/store-sqlite.ts +319 -45
- package/src/store.ts +79 -1
- package/src/stream-buffer.ts +43 -0
- package/src/telemetry.ts +14 -1
- package/src/wire.ts +241 -13
- package/dist/actor-ohPC-81x.d.ts.map +0 -1
- package/dist/actor-shared-B5tJfzt-.js.map +0 -1
- package/dist/ai-CrEf6p_W.d.ts.map +0 -1
- package/dist/ai-DgOBltJ_.js.map +0 -1
- package/dist/client-BYzHjkwU.js.map +0 -1
- package/dist/client-CzyacQpJ.d.ts.map +0 -1
- package/dist/contract-CKRg_E4q.js.map +0 -1
- package/dist/errors-DCk6ch5n.js.map +0 -1
- package/dist/errors-DvhSXnxk.d.ts.map +0 -1
- package/dist/internal-Dq2qYxou.js.map +0 -1
- package/dist/react.d.ts.map +0 -1
- package/dist/reducer-DEMjEY_O.js +0 -29
- package/dist/reducer-DEMjEY_O.js.map +0 -1
- package/dist/reducer-otzHjuJj.d.ts.map +0 -1
- package/dist/scheduler-task-BpzhPnRS.js.map +0 -1
- package/dist/server-BD5ckxZb.js.map +0 -1
- package/dist/server-DbD7IJVK.d.ts.map +0 -1
- package/dist/store-DyZM6fS5.d.ts.map +0 -1
- package/dist/store-polling-CmxUbV93.js.map +0 -1
- package/dist/store-redis-notify-BVLUfI3j.js +0 -1583
- package/dist/store-redis-notify-BVLUfI3j.js.map +0 -1
- package/dist/telemetry-B5jzpy6y.d.ts.map +0 -1
- package/dist/validate-XKT4FSNn.js +0 -30
- package/dist/validate-XKT4FSNn.js.map +0 -1
- package/dist/wire-BO5wWCb1.js.map +0 -1
- package/docs/concepts/01-contracts.mdx +0 -142
- package/docs/concepts/02-handlers.mdx +0 -284
- package/docs/concepts/03-durability.mdx +0 -314
- package/docs/concepts/04-state.mdx +0 -209
- package/docs/guides/01-timers.mdx +0 -185
- package/docs/guides/02-cancellation.mdx +0 -161
- package/docs/guides/03-react.mdx +0 -384
- package/docs/guides/04-local-first.mdx +0 -88
- package/docs/guides/05-production.mdx +0 -521
- package/docs/guides/06-ai-agents.mdx +0 -1318
- package/docs/guides/08-application-data.mdx +0 -113
- package/docs/guides/09-presence.mdx +0 -266
- package/docs/guides/10-transports.mdx +0 -221
- package/docs/reference/01-api.mdx +0 -1896
- package/docs/reference/02-errors.mdx +0 -149
- package/examples/playground/app/agent/[agentId]/compaction/route.ts +0 -14
- package/examples/playground/app/agent/compaction-settings.test.ts +0 -144
- package/examples/playground/app/agent/compaction-settings.ts +0 -49
- package/examples/playground/app/agent/compaction-timeline.test.ts +0 -377
- package/examples/playground/app/agent/compaction-timeline.ts +0 -208
- /package/docs/{concepts → contract}/meta.ts +0 -0
- /package/docs/{guides → server}/meta.ts +0 -0
|
@@ -1,4 +1,30 @@
|
|
|
1
1
|
import type { UIMessageChunk } from 'ai'
|
|
2
|
+
import type { GenerationProgressPayload } from './ai.ts'
|
|
3
|
+
|
|
4
|
+
/** Progress already in a log may name its generation by ids instead of `startIndex`. */
|
|
5
|
+
export type StoredProgressPayload =
|
|
6
|
+
| GenerationProgressPayload
|
|
7
|
+
| {
|
|
8
|
+
requestId: string
|
|
9
|
+
generationId: string
|
|
10
|
+
responseMessageId: string
|
|
11
|
+
chunks: UIMessageChunk[]
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const progressOwnedBy = ({
|
|
15
|
+
payload,
|
|
16
|
+
owner,
|
|
17
|
+
startIndex,
|
|
18
|
+
}: {
|
|
19
|
+
payload: StoredProgressPayload
|
|
20
|
+
owner: { requestId: string; generationId: string; responseMessageId: string }
|
|
21
|
+
startIndex: number
|
|
22
|
+
}): boolean =>
|
|
23
|
+
'startIndex' in payload
|
|
24
|
+
? payload.startIndex === startIndex
|
|
25
|
+
: payload.requestId === owner.requestId &&
|
|
26
|
+
payload.generationId === owner.generationId &&
|
|
27
|
+
payload.responseMessageId === owner.responseMessageId
|
|
2
28
|
|
|
3
29
|
export type ProgressBatch = { index: number; chunks: UIMessageChunk[] }
|
|
4
30
|
type BatchBlock = ProgressBatch[] | { left: BatchBlock; right: BatchBlock }
|
package/src/ai-projector.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import { sameValue } from './equal-json.ts'
|
|
2
|
+
import type { ToolCalledPayload } from './ai.ts'
|
|
1
3
|
import type { UIMessage, UIMessageChunk } from 'ai'
|
|
2
4
|
import { parsePartialJSON } from './parse-partial-json.ts'
|
|
3
5
|
|
|
6
|
+
export type ProjectionChunk =
|
|
7
|
+
UIMessageChunk | { type: 'a2-tool-called'; call: ToolCalledPayload }
|
|
8
|
+
|
|
4
9
|
type MutablePart = Record<string, unknown>
|
|
5
10
|
|
|
6
11
|
type PartialToolCall = {
|
|
@@ -22,9 +27,22 @@ const cloneMessage = <M extends UIMessage>(messageId: string, base?: M): M =>
|
|
|
22
27
|
: {
|
|
23
28
|
...base,
|
|
24
29
|
id: messageId,
|
|
25
|
-
parts: base.parts
|
|
30
|
+
parts: [...base.parts],
|
|
26
31
|
}) as M
|
|
27
32
|
|
|
33
|
+
const editPart = ({
|
|
34
|
+
parts,
|
|
35
|
+
part,
|
|
36
|
+
}: {
|
|
37
|
+
parts: MutablePart[]
|
|
38
|
+
part: MutablePart
|
|
39
|
+
}): MutablePart => {
|
|
40
|
+
const index = parts.indexOf(part)
|
|
41
|
+
const next = { ...part }
|
|
42
|
+
parts[index] = next
|
|
43
|
+
return next
|
|
44
|
+
}
|
|
45
|
+
|
|
28
46
|
const currentStepParts = (parts: MutablePart[]): MutablePart[] => {
|
|
29
47
|
let start = parts.length - 1
|
|
30
48
|
while (start >= 0 && parts[start]?.['type'] !== 'step-start') start -= 1
|
|
@@ -49,6 +67,30 @@ const findToolPart = (
|
|
|
49
67
|
)
|
|
50
68
|
}
|
|
51
69
|
|
|
70
|
+
export const hasToolCall = ({
|
|
71
|
+
message,
|
|
72
|
+
call,
|
|
73
|
+
}: {
|
|
74
|
+
message: UIMessage
|
|
75
|
+
call: ToolCalledPayload
|
|
76
|
+
}): boolean => {
|
|
77
|
+
const part = findToolPart(
|
|
78
|
+
message.parts as unknown as MutablePart[],
|
|
79
|
+
call.toolCallId,
|
|
80
|
+
)
|
|
81
|
+
return (
|
|
82
|
+
part !== undefined &&
|
|
83
|
+
part['state'] !== 'input-streaming' &&
|
|
84
|
+
sameValue(part['input'], call.input) &&
|
|
85
|
+
(part['callProviderMetadata'] !== undefined ||
|
|
86
|
+
call.providerMetadata === undefined) &&
|
|
87
|
+
(part['toolMetadata'] !== undefined || call.toolMetadata === undefined) &&
|
|
88
|
+
(call.providerExecuted === undefined ||
|
|
89
|
+
part['providerExecuted'] === call.providerExecuted) &&
|
|
90
|
+
(call.title === undefined || part['title'] === call.title)
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
52
94
|
const findApprovalPart = (
|
|
53
95
|
parts: MutablePart[],
|
|
54
96
|
approvalId: string,
|
|
@@ -92,7 +134,7 @@ const setToolPart = (options: {
|
|
|
92
134
|
toolCallId: options.toolCallId,
|
|
93
135
|
}
|
|
94
136
|
options.parts.push(part)
|
|
95
|
-
}
|
|
137
|
+
} else part = editPart({ parts: options.parts, part })
|
|
96
138
|
|
|
97
139
|
part['state'] = options.state
|
|
98
140
|
part['input'] = options.input
|
|
@@ -134,7 +176,7 @@ export type UIMessageCursor = {
|
|
|
134
176
|
export function projectUIMessage<M extends UIMessage>(options: {
|
|
135
177
|
messageId: string
|
|
136
178
|
base?: M
|
|
137
|
-
chunks: readonly
|
|
179
|
+
chunks: readonly ProjectionChunk[]
|
|
138
180
|
}): M {
|
|
139
181
|
return projectUIMessageStream(options).message
|
|
140
182
|
}
|
|
@@ -143,7 +185,7 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
143
185
|
messageId: string
|
|
144
186
|
base?: M
|
|
145
187
|
cursor?: UIMessageCursor
|
|
146
|
-
chunks: readonly
|
|
188
|
+
chunks: readonly ProjectionChunk[]
|
|
147
189
|
}): { message: M; cursor: UIMessageCursor } {
|
|
148
190
|
const message = cloneMessage(options.messageId, options.base)
|
|
149
191
|
const record = message as unknown as Record<string, unknown>
|
|
@@ -189,14 +231,17 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
189
231
|
activeText.set(chunk.id, part)
|
|
190
232
|
parts.push(part)
|
|
191
233
|
}
|
|
234
|
+
part = editPart({ parts, part })
|
|
235
|
+
activeText.set(chunk.id, part)
|
|
192
236
|
part['text'] =
|
|
193
237
|
`${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`
|
|
194
238
|
setOptional(part, 'providerMetadata', chunk.providerMetadata)
|
|
195
239
|
break
|
|
196
240
|
}
|
|
197
241
|
case 'text-end': {
|
|
198
|
-
const
|
|
199
|
-
if (
|
|
242
|
+
const current = activeText.get(chunk.id)
|
|
243
|
+
if (current) {
|
|
244
|
+
const part = editPart({ parts, part: current })
|
|
200
245
|
part['state'] = 'done'
|
|
201
246
|
setOptional(part, 'providerMetadata', chunk.providerMetadata)
|
|
202
247
|
activeText.delete(chunk.id)
|
|
@@ -223,14 +268,17 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
223
268
|
activeReasoning.set(chunk.id, part)
|
|
224
269
|
parts.push(part)
|
|
225
270
|
}
|
|
271
|
+
part = editPart({ parts, part })
|
|
272
|
+
activeReasoning.set(chunk.id, part)
|
|
226
273
|
part['text'] =
|
|
227
274
|
`${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`
|
|
228
275
|
setOptional(part, 'providerMetadata', chunk.providerMetadata)
|
|
229
276
|
break
|
|
230
277
|
}
|
|
231
278
|
case 'reasoning-end': {
|
|
232
|
-
const
|
|
233
|
-
if (
|
|
279
|
+
const current = activeReasoning.get(chunk.id)
|
|
280
|
+
if (current) {
|
|
281
|
+
const part = editPart({ parts, part: current })
|
|
234
282
|
part['state'] = 'done'
|
|
235
283
|
setOptional(part, 'providerMetadata', chunk.providerMetadata)
|
|
236
284
|
activeReasoning.delete(chunk.id)
|
|
@@ -327,6 +375,37 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
327
375
|
})
|
|
328
376
|
break
|
|
329
377
|
}
|
|
378
|
+
case 'a2-tool-called': {
|
|
379
|
+
const call = chunk.call
|
|
380
|
+
const current = findToolPart(parts, call.toolCallId)
|
|
381
|
+
if (current) {
|
|
382
|
+
const existing = editPart({ parts, part: current })
|
|
383
|
+
existing['input'] = call.input
|
|
384
|
+
if (existing['state'] === 'input-streaming')
|
|
385
|
+
existing['state'] = 'input-available'
|
|
386
|
+
if (existing['callProviderMetadata'] === undefined)
|
|
387
|
+
setOptional(existing, 'callProviderMetadata', call.providerMetadata)
|
|
388
|
+
if (existing['toolMetadata'] === undefined)
|
|
389
|
+
setOptional(existing, 'toolMetadata', call.toolMetadata)
|
|
390
|
+
setOptional(existing, 'providerExecuted', call.providerExecuted)
|
|
391
|
+
setOptional(existing, 'title', call.title)
|
|
392
|
+
} else {
|
|
393
|
+
setToolPart({
|
|
394
|
+
parts,
|
|
395
|
+
toolCallId: call.toolCallId,
|
|
396
|
+
toolName: call.toolName,
|
|
397
|
+
dynamic: call.dynamic === true,
|
|
398
|
+
state: 'input-available',
|
|
399
|
+
input: call.input,
|
|
400
|
+
providerExecuted: call.providerExecuted,
|
|
401
|
+
providerMetadata: call.providerMetadata,
|
|
402
|
+
toolMetadata: call.toolMetadata,
|
|
403
|
+
title: call.title,
|
|
404
|
+
})
|
|
405
|
+
}
|
|
406
|
+
partialTools.delete(call.toolCallId)
|
|
407
|
+
break
|
|
408
|
+
}
|
|
330
409
|
case 'tool-input-available':
|
|
331
410
|
setToolPart({
|
|
332
411
|
parts,
|
|
@@ -363,8 +442,9 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
363
442
|
break
|
|
364
443
|
}
|
|
365
444
|
case 'tool-approval-request': {
|
|
366
|
-
const
|
|
367
|
-
if (!
|
|
445
|
+
const current = findToolPart(parts, chunk.toolCallId)
|
|
446
|
+
if (!current) break
|
|
447
|
+
const part = editPart({ parts, part: current })
|
|
368
448
|
part['state'] = 'approval-requested'
|
|
369
449
|
part['approval'] = {
|
|
370
450
|
id: chunk.approvalId,
|
|
@@ -376,8 +456,9 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
376
456
|
break
|
|
377
457
|
}
|
|
378
458
|
case 'tool-approval-response': {
|
|
379
|
-
const
|
|
380
|
-
if (!
|
|
459
|
+
const current = findApprovalPart(parts, chunk.approvalId)
|
|
460
|
+
if (!current) break
|
|
461
|
+
const part = editPart({ parts, part: current })
|
|
381
462
|
const approval = isRecord(part['approval']) ? part['approval'] : {}
|
|
382
463
|
part['state'] = 'approval-responded'
|
|
383
464
|
part['approval'] = {
|
|
@@ -441,7 +522,7 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
441
522
|
}
|
|
442
523
|
case 'tool-output-denied': {
|
|
443
524
|
const part = findToolPart(parts, chunk.toolCallId)
|
|
444
|
-
if (part) part['state'] = 'output-denied'
|
|
525
|
+
if (part) editPart({ parts, part })['state'] = 'output-denied'
|
|
445
526
|
break
|
|
446
527
|
}
|
|
447
528
|
case 'start-step':
|
|
@@ -496,7 +577,7 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
|
|
|
496
577
|
(part) =>
|
|
497
578
|
part['type'] === chunk.type && part['id'] === chunk.id,
|
|
498
579
|
)
|
|
499
|
-
if (existing) existing['data'] = chunk.data
|
|
580
|
+
if (existing) editPart({ parts, part: existing })['data'] = chunk.data
|
|
500
581
|
else
|
|
501
582
|
parts.push({
|
|
502
583
|
type: chunk.type,
|
package/src/ai-react.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
/**
|
|
3
|
+
* experimental-a2/ai/react — one hook for an agent session: its live
|
|
4
|
+
* optimistic `AIState`, and actions that fill in protocol identities.
|
|
5
|
+
*
|
|
6
|
+
* ```tsx
|
|
7
|
+
* import type { assistant } from '@/server/assistant' // erased at build
|
|
8
|
+
* const { messages, indicator, sendMessage, stop } =
|
|
9
|
+
* useAgent<typeof assistant>({ api: '/api/agent', id, initial })
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* With a shared `agentContract()`, pass it as `contract` to fold its
|
|
13
|
+
* application state in the browser too.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { AIEventDefs, AIState } from './ai.ts'
|
|
17
|
+
import { withAgentActions, type UseAgentResult } from './ai-agent-actions.ts'
|
|
18
|
+
import {
|
|
19
|
+
createAgentClient,
|
|
20
|
+
type AgentClient,
|
|
21
|
+
type AgentMessage,
|
|
22
|
+
type AnyAgent,
|
|
23
|
+
} from './ai-client.ts'
|
|
24
|
+
import type { Contract, EventDefs } from './contract.ts'
|
|
25
|
+
import type { InitialSnapshot } from './initial-snapshot.ts'
|
|
26
|
+
import { createClient, type A2Client } from './client.ts'
|
|
27
|
+
import type { Reducer } from './reducer.ts'
|
|
28
|
+
import { useSession, type UseSessionResult } from './react.ts'
|
|
29
|
+
|
|
30
|
+
export type UseAgentOptions<A extends AnyAgent> = {
|
|
31
|
+
/** The session id. */
|
|
32
|
+
id: string
|
|
33
|
+
/** The server-rendered `assistant.session(id).state()`. */
|
|
34
|
+
initial?: InitialSnapshot<AIState<AgentMessage<A>>>
|
|
35
|
+
participant?: string
|
|
36
|
+
} & (
|
|
37
|
+
| {
|
|
38
|
+
/** The route serving the agent's `fetch`; its client is shared. */
|
|
39
|
+
api: string
|
|
40
|
+
contract?: never
|
|
41
|
+
}
|
|
42
|
+
| { client: AgentClient<A> }
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Use a session of an agent served from a shared `agentContract()`, folding
|
|
47
|
+
* its application state in the browser. The contract is a real import here.
|
|
48
|
+
*/
|
|
49
|
+
export type UseContractAgentOptions<D extends EventDefs, S extends AIState> = {
|
|
50
|
+
/** The session id. */
|
|
51
|
+
id: string
|
|
52
|
+
/** The server-rendered `agent.session(id).state()`. */
|
|
53
|
+
initial?: InitialSnapshot<S>
|
|
54
|
+
participant?: string
|
|
55
|
+
} & (
|
|
56
|
+
| {
|
|
57
|
+
/** The route serving the agent's `fetch`; its client is shared. */
|
|
58
|
+
api: string
|
|
59
|
+
contract: Contract<D, Record<never, never>, Reducer<D, S>>
|
|
60
|
+
}
|
|
61
|
+
| {
|
|
62
|
+
/** `createClient({ contract, api })`, shared with pushes outside React. */
|
|
63
|
+
client: A2Client<D, S>
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
const clients = new Map<string, AgentClient>()
|
|
68
|
+
const contractClients = new WeakMap<object, Map<string, object>>()
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* One client per route for the page's lifetime; its idle sessions expire
|
|
72
|
+
* after the default `gcTime`. It reads `globalThis.fetch` per request, so
|
|
73
|
+
* instrumentation installed later still applies.
|
|
74
|
+
*/
|
|
75
|
+
const clientFor = (api: string): AgentClient => {
|
|
76
|
+
let client = clients.get(api)
|
|
77
|
+
if (client === undefined) {
|
|
78
|
+
client = createAgentClient({
|
|
79
|
+
api,
|
|
80
|
+
fetch: (input, init) => globalThis.fetch(input, init),
|
|
81
|
+
})
|
|
82
|
+
clients.set(api, client)
|
|
83
|
+
}
|
|
84
|
+
return client
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** One client per contract and route, like `clientFor`. */
|
|
88
|
+
const contractClientFor = <D extends EventDefs, S>(
|
|
89
|
+
contract: Contract<D, Record<never, never>, Reducer<D, S>>,
|
|
90
|
+
api: string,
|
|
91
|
+
): A2Client<D, S> => {
|
|
92
|
+
let byApi = contractClients.get(contract)
|
|
93
|
+
if (byApi === undefined) {
|
|
94
|
+
byApi = new Map()
|
|
95
|
+
contractClients.set(contract, byApi)
|
|
96
|
+
}
|
|
97
|
+
let client = byApi.get(api) as A2Client<D, S> | undefined
|
|
98
|
+
if (client === undefined) {
|
|
99
|
+
client = createClient({
|
|
100
|
+
contract,
|
|
101
|
+
api,
|
|
102
|
+
fetch: (input, init) => globalThis.fetch(input, init),
|
|
103
|
+
})
|
|
104
|
+
byApi.set(api, client)
|
|
105
|
+
}
|
|
106
|
+
return client
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Use a session of an agent served from a shared `agentContract()`. */
|
|
110
|
+
export function useAgent<D extends EventDefs, S extends AIState>(
|
|
111
|
+
options: UseContractAgentOptions<D, S>,
|
|
112
|
+
): UseAgentResult<D, S>
|
|
113
|
+
/**
|
|
114
|
+
* Use one agent session. Pass `typeof` the server's `agent()` for its
|
|
115
|
+
* message types; the import is type-only and erased.
|
|
116
|
+
*/
|
|
117
|
+
export function useAgent<A extends AnyAgent = AnyAgent>(
|
|
118
|
+
options: UseAgentOptions<A>,
|
|
119
|
+
): UseAgentResult<AIEventDefs<AgentMessage<A>>, AIState<AgentMessage<A>>>
|
|
120
|
+
export function useAgent(
|
|
121
|
+
options:
|
|
122
|
+
UseAgentOptions<AnyAgent> | UseContractAgentOptions<AIEventDefs, AIState>,
|
|
123
|
+
): object {
|
|
124
|
+
const session: UseSessionResult<AIEventDefs, AIState> = useSession(
|
|
125
|
+
'client' in options
|
|
126
|
+
? options.client
|
|
127
|
+
: options.contract !== undefined
|
|
128
|
+
? contractClientFor(options.contract, options.api)
|
|
129
|
+
: clientFor(options.api),
|
|
130
|
+
options.id,
|
|
131
|
+
{
|
|
132
|
+
...(options.initial === undefined ? {} : { initial: options.initial }),
|
|
133
|
+
...(options.participant === undefined
|
|
134
|
+
? {}
|
|
135
|
+
: { participant: options.participant }),
|
|
136
|
+
},
|
|
137
|
+
)
|
|
138
|
+
return withAgentActions(session)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export type { AgentClient, AgentMessage, AnyAgent }
|
|
142
|
+
export type {
|
|
143
|
+
AgentActions,
|
|
144
|
+
AgentIndicator,
|
|
145
|
+
UseAgentResult,
|
|
146
|
+
} from './ai-agent-actions.ts'
|
package/src/ai-sdk-step.ts
CHANGED
|
@@ -8,7 +8,6 @@ import type {
|
|
|
8
8
|
FinishReason,
|
|
9
9
|
InferUIMessageChunk,
|
|
10
10
|
Instructions,
|
|
11
|
-
LanguageModel,
|
|
12
11
|
LanguageModelUsage,
|
|
13
12
|
ModelMessage,
|
|
14
13
|
TextStreamPart,
|
|
@@ -125,7 +124,8 @@ export type AISDKStepSettings<T extends ToolSet> = Partial<
|
|
|
125
124
|
}
|
|
126
125
|
|
|
127
126
|
export type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {
|
|
128
|
-
model
|
|
127
|
+
/** An AI Gateway model ID, resolved through the AI SDK's global provider. */
|
|
128
|
+
model: string
|
|
129
129
|
tools: T
|
|
130
130
|
messages: M[]
|
|
131
131
|
modelMessages?: ModelMessage[]
|
package/src/ai-server.browser.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** experimental-a2/ai/server is server-only;
|
|
1
|
+
/** experimental-a2/ai/server is server-only; browsers use experimental-a2/ai/react or /ai/client. */
|
|
2
2
|
throw new Error(
|
|
3
|
-
|
|
3
|
+
"experimental-a2/ai/server is server-only — a client bundle imported it. Import its agent's type with `import type`, and use experimental-a2/ai/react or experimental-a2/ai/client in browser code.",
|
|
4
4
|
)
|
|
5
5
|
export {}
|