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
package/src/ai-control-server.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { reducer as makeReducer } from './reducer.ts'
|
|
1
2
|
// oxlint-disable no-await-in-loop -- work acknowledgements follow the durable stream.
|
|
2
3
|
import { applyControlChanges, controlCommit } from './ai-control-state.ts'
|
|
3
4
|
import type { ControlChange, ControlCommit } from './ai-control.ts'
|
|
4
5
|
import type { UIMessage } from 'ai'
|
|
5
6
|
import type {
|
|
6
7
|
AIEventDefs,
|
|
7
|
-
AgentDefinition,
|
|
8
8
|
GenerationRequestedPayload,
|
|
9
9
|
MessageInterruptedPayload,
|
|
10
10
|
} from './ai.ts'
|
|
@@ -21,7 +21,12 @@ import {
|
|
|
21
21
|
type WorkFact,
|
|
22
22
|
type WorkReport,
|
|
23
23
|
} from './ai-control.ts'
|
|
24
|
-
import type {
|
|
24
|
+
import type {
|
|
25
|
+
AppendInput,
|
|
26
|
+
Contract,
|
|
27
|
+
ContractEvent,
|
|
28
|
+
EventDefs,
|
|
29
|
+
} from './contract.ts'
|
|
25
30
|
import type { HandlerContext } from './server.ts'
|
|
26
31
|
import type { Reducer } from './reducer.ts'
|
|
27
32
|
import type { AICoordinatorState, CoordinatorCall } from './ai-coordinator.ts'
|
|
@@ -29,6 +34,7 @@ import { validateSync } from './validate.ts'
|
|
|
29
34
|
import type { StandardSchemaV1 } from './standard-schema.ts'
|
|
30
35
|
import { A2Error } from './errors.ts'
|
|
31
36
|
import { aiEventId } from './ai-id.ts'
|
|
37
|
+
import { CONSOLE_TELEMETRY, type A2Telemetry } from './telemetry.ts'
|
|
32
38
|
|
|
33
39
|
export class ControlCancelled extends Error {}
|
|
34
40
|
|
|
@@ -69,41 +75,42 @@ export const createControlRuntime = <
|
|
|
69
75
|
M extends UIMessage,
|
|
70
76
|
D extends AIEventDefs<M> & EventDefs,
|
|
71
77
|
>(options: {
|
|
72
|
-
|
|
78
|
+
contract: Contract<D, Record<never, never>, unknown>
|
|
79
|
+
telemetry?: A2Telemetry
|
|
73
80
|
}): AIControlRuntime<M, D> => {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (event.type === 'ai.control.decided') {
|
|
92
|
-
const receipt = event.payload as ControlReceipt
|
|
93
|
-
if (Object.hasOwn(state.pendingStops, receipt.commandId)) {
|
|
94
|
-
const pendingStops = { ...state.pendingStops }
|
|
95
|
-
delete pendingStops[receipt.commandId]
|
|
96
|
-
return { ...state, pendingStops }
|
|
81
|
+
const telemetry = options.telemetry ?? CONSOLE_TELEMETRY
|
|
82
|
+
const reducer = makeReducer({
|
|
83
|
+
contract: options.contract,
|
|
84
|
+
name: 'a2.ai.control.v5',
|
|
85
|
+
initialState: initialControlState<M>(),
|
|
86
|
+
}).fold((state, event) => {
|
|
87
|
+
if (event.type === 'ai.control.requested') {
|
|
88
|
+
const command = event.payload as ControlCommand<M>
|
|
89
|
+
if (command.action === 'stop')
|
|
90
|
+
return {
|
|
91
|
+
...state,
|
|
92
|
+
pendingStops: {
|
|
93
|
+
...state.pendingStops,
|
|
94
|
+
[event.id]: command.turnId,
|
|
95
|
+
},
|
|
97
96
|
}
|
|
97
|
+
}
|
|
98
|
+
if (event.type === 'ai.control.decided') {
|
|
99
|
+
const receipt = event.payload as ControlReceipt
|
|
100
|
+
if (Object.hasOwn(state.pendingStops, receipt.commandId)) {
|
|
101
|
+
const pendingStops = { ...state.pendingStops }
|
|
102
|
+
delete pendingStops[receipt.commandId]
|
|
103
|
+
return { ...state, pendingStops }
|
|
98
104
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
}
|
|
106
|
+
return event.type === 'ai.control.committed'
|
|
107
|
+
? applyControlChanges({
|
|
108
|
+
state,
|
|
109
|
+
changes: (event.payload as ControlCommit).changes,
|
|
110
|
+
})
|
|
111
|
+
: state
|
|
112
|
+
})
|
|
113
|
+
const coordinator = aiCoordinatorReducer(options.contract)
|
|
107
114
|
|
|
108
115
|
const handler = async (
|
|
109
116
|
ctx: HandlerContext<
|
|
@@ -438,7 +445,7 @@ export const createControlRuntime = <
|
|
|
438
445
|
},
|
|
439
446
|
id: await aiEventId(
|
|
440
447
|
'a2.ai.request.retry',
|
|
441
|
-
options.
|
|
448
|
+
options.contract.name,
|
|
442
449
|
ctx.event.sessionId,
|
|
443
450
|
command.request.retryId,
|
|
444
451
|
),
|
|
@@ -668,7 +675,7 @@ export const createControlRuntime = <
|
|
|
668
675
|
payload: { message: item.message, generate: item.generate },
|
|
669
676
|
id: await aiEventId(
|
|
670
677
|
'a2.ai.admitted',
|
|
671
|
-
options.
|
|
678
|
+
options.contract.name,
|
|
672
679
|
ctx.event.sessionId,
|
|
673
680
|
item.id,
|
|
674
681
|
),
|
|
@@ -684,7 +691,7 @@ export const createControlRuntime = <
|
|
|
684
691
|
}
|
|
685
692
|
const requestId = await aiEventId(
|
|
686
693
|
'a2.ai.request.message',
|
|
687
|
-
options.
|
|
694
|
+
options.contract.name,
|
|
688
695
|
ctx.event.sessionId,
|
|
689
696
|
item.id,
|
|
690
697
|
)
|
|
@@ -736,7 +743,7 @@ export const createControlRuntime = <
|
|
|
736
743
|
GenerationRequestedPayload | { turnId: string; version: number }
|
|
737
744
|
const { turnId, version } = 'turnId' in payload ? payload : payload.control!
|
|
738
745
|
for (const event of events) {
|
|
739
|
-
const schema = options.
|
|
746
|
+
const schema = options.contract.events[
|
|
740
747
|
event.type
|
|
741
748
|
] as StandardSchemaV1<unknown>
|
|
742
749
|
const result = validateSync(
|
|
@@ -808,41 +815,54 @@ export const createControlRuntime = <
|
|
|
808
815
|
const input = await report({ ctx, events: lifecycle, settled: false, name })
|
|
809
816
|
const persisted = await ctx.session.append(name, ...progress, input)
|
|
810
817
|
const index = persisted.at(-1)!.index
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
if (
|
|
831
|
-
item.value.type === 'ai.control.decided' &&
|
|
832
|
-
(item.value.payload as ControlReceipt).commandId === input.id
|
|
833
|
-
) {
|
|
834
|
-
if ((item.value.payload as ControlReceipt).outcome === 'rejected')
|
|
835
|
-
throw new ControlCancelled('stale AI work')
|
|
836
|
-
return [
|
|
837
|
-
...persisted.filter((event) => event.type !== 'ai.work.reported'),
|
|
838
|
-
...canonical,
|
|
839
|
-
]
|
|
818
|
+
return telemetry.span(
|
|
819
|
+
'a2.ai.ack',
|
|
820
|
+
{
|
|
821
|
+
'a2.contract': options.contract.name,
|
|
822
|
+
'a2.session_id': ctx.event.sessionId,
|
|
823
|
+
'a2.ai.ack.request_id': ctx.event.id,
|
|
824
|
+
'a2.ai.ack.report_id': input.id!,
|
|
825
|
+
},
|
|
826
|
+
async () => {
|
|
827
|
+
const feed = ctx.session.stream({ startAfter: index })
|
|
828
|
+
const stream = feed[Symbol.asyncIterator]()
|
|
829
|
+
const canonical: ContractEvent<D>[] = []
|
|
830
|
+
const wanted = new Set(lifecycle.map((event) => event.id))
|
|
831
|
+
let rejectAbort!: (error: unknown) => void
|
|
832
|
+
const aborted = new Promise<never>((_, reject) => {
|
|
833
|
+
rejectAbort = reject
|
|
834
|
+
})
|
|
835
|
+
const onAbort = (): void => {
|
|
836
|
+
rejectAbort(ctx.signal.reason)
|
|
840
837
|
}
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
838
|
+
ctx.signal.addEventListener('abort', onAbort, { once: true })
|
|
839
|
+
try {
|
|
840
|
+
ctx.signal.throwIfAborted()
|
|
841
|
+
for (;;) {
|
|
842
|
+
const item = await Promise.race([stream.next(), aborted])
|
|
843
|
+
if (item.done)
|
|
844
|
+
throw new Error('AI control acknowledgement stream ended')
|
|
845
|
+
if (wanted.has(item.value.id)) canonical.push(item.value)
|
|
846
|
+
if (
|
|
847
|
+
item.value.type === 'ai.control.decided' &&
|
|
848
|
+
(item.value.payload as ControlReceipt).commandId === input.id
|
|
849
|
+
) {
|
|
850
|
+
if ((item.value.payload as ControlReceipt).outcome === 'rejected')
|
|
851
|
+
throw new ControlCancelled('stale AI work')
|
|
852
|
+
return [
|
|
853
|
+
...persisted.filter(
|
|
854
|
+
(event) => event.type !== 'ai.work.reported',
|
|
855
|
+
),
|
|
856
|
+
...canonical,
|
|
857
|
+
]
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
} finally {
|
|
861
|
+
ctx.signal.removeEventListener('abort', onAbort)
|
|
862
|
+
await stream.return?.()
|
|
863
|
+
}
|
|
864
|
+
},
|
|
865
|
+
)
|
|
846
866
|
}
|
|
847
867
|
|
|
848
868
|
const settled = ({
|
package/src/ai-coordinator.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { reducer } from './reducer.ts'
|
|
1
2
|
import type { UIMessage } from 'ai'
|
|
2
3
|
import { applyControlChanges } from './ai-control-state.ts'
|
|
3
4
|
import type { ControlCommit, ControlWork } from './ai-control.ts'
|
|
@@ -255,7 +256,8 @@ export const foldCoordinator = <M extends UIMessage, D extends EventDefs>(
|
|
|
255
256
|
return inputTokens !== undefined &&
|
|
256
257
|
Number.isFinite(inputTokens) &&
|
|
257
258
|
inputTokens >= 0 &&
|
|
258
|
-
estimate !== undefined
|
|
259
|
+
estimate !== undefined &&
|
|
260
|
+
state.response.generation.model !== undefined
|
|
259
261
|
? {
|
|
260
262
|
...uncalibrated,
|
|
261
263
|
calibration: {
|
|
@@ -436,28 +438,27 @@ export const aiCoordinatorReducer = <
|
|
|
436
438
|
M extends UIMessage,
|
|
437
439
|
D extends AIEventDefs<M> & EventDefs,
|
|
438
440
|
>(
|
|
439
|
-
contract: Contract<D>,
|
|
441
|
+
contract: Contract<D, Record<never, never>, unknown>,
|
|
440
442
|
): Reducer<D, AICoordinatorState> =>
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
.
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
.
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
)
|
|
443
|
+
reducer({
|
|
444
|
+
contract: contract,
|
|
445
|
+
name: 'a2.ai.coordinator.v6',
|
|
446
|
+
initialState: {
|
|
447
|
+
closed: false,
|
|
448
|
+
queued: [],
|
|
449
|
+
} as AICoordinatorState,
|
|
450
|
+
}).fold((state, event) =>
|
|
451
|
+
event.type === 'ai.control.committed'
|
|
452
|
+
? applyControlChanges({
|
|
453
|
+
state,
|
|
454
|
+
changes: (event.payload as ControlCommit).changes
|
|
455
|
+
.filter((change) => change.path[0] === 'coordinator')
|
|
456
|
+
.map((change) =>
|
|
457
|
+
Object.assign({}, change, { path: change.path.slice(1) }),
|
|
458
|
+
),
|
|
459
|
+
})
|
|
460
|
+
: state,
|
|
461
|
+
)
|
|
461
462
|
|
|
462
463
|
export const continuationReady = (state: AICoordinatorState): boolean => {
|
|
463
464
|
const response = state.response
|