experimental-a2 0.7.0 → 0.8.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 +19 -0
- package/dist/ai-server.d.ts +1 -1
- package/dist/ai-server.d.ts.map +1 -1
- package/dist/ai-server.js +13 -11
- package/dist/ai-server.js.map +1 -1
- package/dist/ai.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/scheduler-qstash.d.ts +2 -2
- package/dist/scheduler-qstash.js +1 -1
- package/dist/scheduler-vercel.d.ts +2 -2
- package/dist/scheduler-vercel.js +1 -1
- package/dist/{server-286j79Mt.js → server-B2XNevQA.js} +123 -53
- package/dist/server-B2XNevQA.js.map +1 -0
- package/dist/{server-DgXmORIq.d.ts → server-DjPhHnbI.d.ts} +7 -4
- package/dist/server-DjPhHnbI.d.ts.map +1 -0
- package/dist/server.d.ts +3 -3
- package/dist/server.js +1 -1
- package/dist/store-N8PXxDAS.js.map +1 -1
- package/dist/{store-flRz1OWh.d.ts → store-RJO35BMj.d.ts} +25 -8
- package/dist/store-RJO35BMj.d.ts.map +1 -0
- package/dist/store-memory.d.ts +1 -1
- package/dist/store-memory.d.ts.map +1 -1
- package/dist/store-memory.js +79 -19
- package/dist/store-memory.js.map +1 -1
- package/dist/store-postgres.d.ts +1 -1
- package/dist/store-postgres.d.ts.map +1 -1
- package/dist/store-postgres.js +230 -101
- package/dist/store-postgres.js.map +1 -1
- package/dist/{store-redis-core-DEYO8Ryv.js → store-redis-core-DT01r4GZ.js} +167 -29
- package/dist/store-redis-core-DT01r4GZ.js.map +1 -0
- package/dist/store-redis-http.d.ts +1 -1
- package/dist/store-redis-http.js +2 -2
- package/dist/store-redis-http.js.map +1 -1
- package/dist/store-redis.d.ts +1 -1
- package/dist/store-redis.js +2 -2
- 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 +103 -19
- package/dist/store-sqlite.js.map +1 -1
- package/docs/concepts/02-handlers.mdx +4 -0
- package/docs/concepts/04-state.mdx +57 -9
- package/docs/guides/06-ai-agents.mdx +2 -1
- package/docs/reference/01-api.mdx +39 -16
- package/package.json +1 -1
- package/src/ai-server.ts +27 -10
- package/src/server.ts +242 -87
- package/src/store-memory.ts +138 -20
- package/src/store-postgres.ts +355 -138
- package/src/store-redis-core.ts +201 -27
- package/src/store-redis-http.ts +1 -1
- package/src/store-redis.ts +1 -1
- package/src/store-sqlite.ts +191 -34
- package/src/store.ts +27 -9
- package/dist/server-286j79Mt.js.map +0 -1
- package/dist/server-DgXmORIq.d.ts.map +0 -1
- package/dist/store-flRz1OWh.d.ts.map +0 -1
- package/dist/store-redis-core-DEYO8Ryv.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- d8f2793: Make handler state reads event-relative. `ctx.session.state(reducer)` now folds
|
|
8
|
+
through the triggering event, so concurrent appends do not change what retries
|
|
9
|
+
observe. Pass `{ through: 'latest' }` for an intentional live read, or a numeric
|
|
10
|
+
`through` for an inclusive boundary.
|
|
11
|
+
|
|
12
|
+
A2 now keeps one reducer snapshot head plus only the historical checkpoints
|
|
13
|
+
currently referenced by unfinished handler events. Completion and
|
|
14
|
+
dead-lettering release those references and collect orphan history atomically.
|
|
15
|
+
Root reads and handler latest reads do not retain historical checkpoints. There
|
|
16
|
+
are no retention knobs.
|
|
17
|
+
|
|
18
|
+
AI handlers now recheck cancellation immediately before invoking a tool or
|
|
19
|
+
model, so work canceled during asynchronous prompt or instruction resolution
|
|
20
|
+
does not cross an external execution boundary.
|
|
21
|
+
|
|
3
22
|
## 0.7.0
|
|
4
23
|
|
|
5
24
|
### Minor Changes
|
package/dist/ai-server.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as EventDefs, r as ContractEvent } from "./contract-jIfaR085.js";
|
|
2
|
-
import { n as A2Server, p as ServerOptions } from "./server-
|
|
2
|
+
import { n as A2Server, p as ServerOptions } from "./server-DjPhHnbI.js";
|
|
3
3
|
import { AIEventDefs, AIState, AgentDefinition, AgentToolContext, AgentToolEventDefs } from "./ai.js";
|
|
4
4
|
import { Instructions, LanguageModel, TextStreamPart, ToolSet, ToolSet as ToolSet$1, UIMessage, UIMessageChunk, streamText } from "ai";
|
|
5
5
|
//#region src/ai-sdk-step.d.ts
|
package/dist/ai-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-server.d.ts","names":[],"sources":["../src/ai-sdk-step.ts","../src/ai-server.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ai-server.d.ts","names":[],"sources":["../src/ai-sdk-step.ts","../src/ai-server.ts"],"mappings":";;;;;KAiBK,kBAAkB,UAAU,aAAW,kBAAkB,WAAW;KAKpE,iBAAiB,UAAU,sBAE5B,KACE,QAAQ,kBAAkB;KAI3B;KAmBA;KASA,iBAAiB,UAAU,yBACpB,WAAW,IAAI,KAAK,EAAE;KAG7B,aAAa,UAAU,WAAS,gBAAgB,kBAAkB,MACrE,YAAY,kBAAkB,GAAG,cAAa,aAAa,qBACvD;KAGD,qBAAqB,UAAU,aAAW,KAC7C,aAAa;WAGJ,OAAO,iBAAiB;;KAG9B,yBAAyB,UAAU,aAAW,KACjD,aAAa;WAGJ,OAAO,iBAAiB;;KAG9B,mBAAmB,UAAU,OAAO,iBAAiB;KAErD,yBAAyB,UAAU,aAAW,YACjD,kBAAkB;KAGf,yBAAyB,UAAU,cACtC,SAAS,KAAK,WAAW,yBAAyB;EAChD,OAAO,iBAAiB;MAEvB,WAAW,yBAAyB;KAEpC,2BAA2B,UAAU,aAAW,YACnD,kBAAkB;KAGf,oBAAoB,UAAU,aAAW,QAC5C,2BAA2B,QACvB;KAGD,oBAAoB,UAAU,cACjC,SAAS,KAAK,WAAW,oBAAoB;EAC3C,OAAO,iBAAiB;MAEvB,WAAW,oBAAoB;;KAGxB,kBAAkB,UAAU,aAAW,QACjD,KACE,kBAAkB,IAClB,8BAA8B;EAGhC,UAAU,iBAAiB;EAC3B,UAAU,mBAAmB,qBAAqB;EAClD,uBAAuB,mBAAmB,qBAAqB;EAC/D,cAAc,mBAAmB,yBAAyB;EAC1D,2BAA2B,mBAAmB,yBAAyB;EACvE,iBAAiB,yBAAyB;EAC1C,8BAA8B,yBAAyB;EACvD,yBACE,oBAAoB,KAAK,MAAM,oBAAoB;;;;KCd3C,qBACV,UAAU,WACV,UAAU,YAAY,KAAK,WAC3B,UAAU;EAEV,SAAS,cAAc;EACvB;EACA;EACA;EACA,UAAU;EACV,OAAO,QAAQ;EACf,SAAS,cAAc;EACvB,QAAQ;EACR,OAAO;EACP,OAAO;EACP,eAAe;EACf,YAAY,wBAAwB;;KAG1B,cACV,UAAU,WACV,UAAU,YAAY,KAAK,WAC3B,UAAU,YAEV,SAAS,qBAAqB,GAAG,GAAG,OACjC,eAAe,kBAAkB,QAAQ,eAAe;KAExD,kBAAkB,UAAU,aAC/B,UAAU,gBAAgB,YAAY;KAE5B,qBACV,UAAU,WACV,UAAU,YAAY,KAAK,WAC3B,UAAU,YAEV,SAAS,qBAAqB,GAAG,GAAG;EAAO,MAAM,eAAe;MAC7D,kBAAkB;KAEX,qBACV,UAAU,WACV,UAAU,YAAY,KAAK;EAE3B,OAAO,cAAc;EACrB,OAAO,QAAQ;EACf,SAAS,cAAc;EACvB,QAAQ;;KAGE,WAAW,GAAG,KAAK,MAAM,SAAS,MAAM,IAAI,QAAQ;KAEpD,iBACV,UAAU,WACV,UAAU,YAAY,KAAK;EAE3B,cACE,SAAS,qBAAqB,GAAG;IAAO,UAAU;gBACvC;EACb,QACE,SAAS,qBAAqB,GAAG;IAAO,UAAU;MACjD,MAAM,QAAQ;;KAGP,wBAAwB,UAAU,WAAW,kBAAkB;KAE/D,sBACV,UAAU,WACV,UAAU,YAAY,KAAK,WAC3B,UAAU,UAAU;EAEpB,OAAO,gBAAgB,GAAG;;EAE1B,OAAO,WAAW,eAAe,qBAAqB,GAAG;EACzD,QAAQ;EACR,eAAe,WACb,0BACA,qBAAqB,GAAG;;EAG1B,aAAa,wBAAwB;;;;EAIrC;;EAEA,kBAAkB,qBAAqB,GAAG,GAAG;;;;;EAK7C,WAAW,cAAc,GAAG,GAAG;EAC/B,aAAa,iBAAiB,GAAG;;EAEjC;IAAa;IAAoB;;;KAGvB,yBACV,UAAU,WACV,UAAU,YAAY,KAAK,WAC3B,UAAU,UAAU,WAClB,sBAAsB,GAAG,GAAG,KAC9B,KAAK,cAAc;EACjB,WAAW,cAAc;;;iBA2Bb,sBAAsB,UAAU,oBAAoB,GAClE,KAAK,iBAAiB,IACtB,UAAU,IACT;;;;;iBA2hBa,eACd,UAAU,WACV,UAAU,YAAY,KAAK,WAC3B,UAAU,UAAU,SAEpB,SAAS,sBAAsB,GAAG,GAAG,KACpC,YAAY,cAAc;;iBAm5Bb,kBACd,UAAU,WACV,UAAU,YAAY,KAAK,WAC3B,UAAU,UAAU,SACpB,SAAS,yBAAyB,GAAG,GAAG,KAAK,SAAS"}
|
package/dist/ai-server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as A2Error } from "./errors-BQuJpe82.js";
|
|
2
2
|
import { f as consumeSchedulerSendFailure, p as installAmbientToolScopeStorage } from "./internal-DRXJ56EI.js";
|
|
3
|
-
import { r as setServerFetchHooks, t as createServer } from "./server-
|
|
3
|
+
import { r as setServerFetchHooks, t as createServer } from "./server-B2XNevQA.js";
|
|
4
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
5
|
import { convertToModelMessages, stepCountIs, streamText, toUIMessageStream } from "ai";
|
|
6
6
|
//#region src/ai-sdk-step.ts
|
|
@@ -674,9 +674,9 @@ function createHandlers(options) {
|
|
|
674
674
|
}
|
|
675
675
|
};
|
|
676
676
|
};
|
|
677
|
-
const scheduleNext = async (ctx) => requestForNextMessage((await ctx.session.state(coordinator)).state);
|
|
677
|
+
const scheduleNext = async (ctx) => requestForNextMessage((await ctx.session.state(coordinator, { through: "latest" })).state);
|
|
678
678
|
const continueIfReady = async (ctx, generationId) => {
|
|
679
|
-
const state = (await ctx.session.state(coordinator)).state;
|
|
679
|
+
const state = (await ctx.session.state(coordinator, { through: "latest" })).state;
|
|
680
680
|
const response = state.response;
|
|
681
681
|
if (response?.generation?.generationId !== generationId) return;
|
|
682
682
|
const input = response.inputResponse;
|
|
@@ -805,6 +805,7 @@ function createHandlers(options) {
|
|
|
805
805
|
const execute = tools[call.toolName]?.execute;
|
|
806
806
|
if (execute === void 0) return resultEvent(call, "execution:error", { error: `Tool '${call.toolName}' has no server executor` });
|
|
807
807
|
const messages = await promptMessages(ctx.event.sessionId, call, ctx.session.history);
|
|
808
|
+
if (ctx.signal.aborted) return;
|
|
808
809
|
const scope = {
|
|
809
810
|
contract: options.agent.contract,
|
|
810
811
|
context: ctx
|
|
@@ -812,7 +813,7 @@ function createHandlers(options) {
|
|
|
812
813
|
return toolScopeStorage.run(scope, () => runToolExecution(ctx, call, execute, messages));
|
|
813
814
|
};
|
|
814
815
|
const handleToolCall = async (ctx) => {
|
|
815
|
-
const response = (await ctx.session.state(coordinator)).state.response;
|
|
816
|
+
const response = (await ctx.session.state(coordinator, { through: "latest" })).state.response;
|
|
816
817
|
const current = response?.calls.find((candidate) => candidate.index === ctx.event.index);
|
|
817
818
|
if (current === void 0 || response?.generation?.generationId !== ctx.event.payload.generationId || response.failure !== void 0 || current.terminal || current.approval !== void 0) return;
|
|
818
819
|
if (current.call.providerExecuted === true) {
|
|
@@ -822,7 +823,7 @@ function createHandlers(options) {
|
|
|
822
823
|
return executeTool(ctx, current.call);
|
|
823
824
|
};
|
|
824
825
|
const handleApproval = async (ctx) => {
|
|
825
|
-
const response = (await ctx.session.state(coordinator)).state.response;
|
|
826
|
+
const response = (await ctx.session.state(coordinator, { through: "latest" })).state.response;
|
|
826
827
|
const current = response?.calls.find((candidate) => candidate.approval?.approvalId === ctx.event.payload.approvalId && candidate.approval.messageId === ctx.event.payload.messageId && candidate.approval.generationId === ctx.event.payload.generationId && candidate.responseIndex === ctx.event.index);
|
|
827
828
|
if (current === void 0 || response?.generation?.generationId !== current.call.generationId || response.failure !== void 0 || current.terminal) return;
|
|
828
829
|
if (current.call.providerExecuted === true) {
|
|
@@ -836,7 +837,7 @@ function createHandlers(options) {
|
|
|
836
837
|
const history = await ctx.session.history();
|
|
837
838
|
const requestId = ctx.event.id;
|
|
838
839
|
const request = ctx.event.payload;
|
|
839
|
-
const coordinatorState = (await ctx.session.state(coordinator)).state;
|
|
840
|
+
const coordinatorState = (await ctx.session.state(coordinator, { through: "latest" })).state;
|
|
840
841
|
if (coordinatorState.closed || coordinatorState.response?.activeRequestId !== requestId) return;
|
|
841
842
|
if (history.some((event) => {
|
|
842
843
|
if (event.type === "ai.generation.completed") return event.payload.requestId === requestId;
|
|
@@ -919,7 +920,7 @@ function createHandlers(options) {
|
|
|
919
920
|
payload: started
|
|
920
921
|
});
|
|
921
922
|
await ctx.session.append("generation-start", ...startEvents);
|
|
922
|
-
const startedCoordinatorState = (await ctx.session.state(coordinator)).state;
|
|
923
|
+
const startedCoordinatorState = (await ctx.session.state(coordinator, { through: "latest" })).state;
|
|
923
924
|
if (startedCoordinatorState.response?.activeRequestId !== requestId || startedCoordinatorState.response.generation?.generationId !== generationId) return;
|
|
924
925
|
const promptCoordinatorState = {
|
|
925
926
|
...coordinatorStateAt(history),
|
|
@@ -962,13 +963,14 @@ function createHandlers(options) {
|
|
|
962
963
|
};
|
|
963
964
|
}
|
|
964
965
|
}
|
|
965
|
-
const currentState = (await ctx.session.state(options.agent.reducer)).state;
|
|
966
|
-
const currentCoordinatorState = (await ctx.session.state(coordinator)).state;
|
|
966
|
+
const currentState = (await ctx.session.state(options.agent.reducer, { through: "latest" })).state;
|
|
967
|
+
const currentCoordinatorState = (await ctx.session.state(coordinator, { through: "latest" })).state;
|
|
967
968
|
const generationMessages = activeContextMessages(currentState, currentCoordinatorState);
|
|
968
969
|
promptCache.set(promptCacheKey(ctx.event.sessionId, generationId), convertToModelMessages(generationMessages, { tools }));
|
|
969
970
|
let pendingToolCalls = [];
|
|
970
971
|
try {
|
|
971
972
|
const resolvedInstructions = options.instructions === void 0 ? void 0 : await resolve(options.instructions, resolverContext);
|
|
973
|
+
if (ctx.signal.aborted) return;
|
|
972
974
|
const generateContext = {
|
|
973
975
|
request: ctx.event,
|
|
974
976
|
requestId,
|
|
@@ -1083,7 +1085,7 @@ function createHandlers(options) {
|
|
|
1083
1085
|
return scheduleNext(ctx);
|
|
1084
1086
|
};
|
|
1085
1087
|
const handleRetry = async (ctx) => {
|
|
1086
|
-
const response = (await ctx.session.state(coordinator)).state.response;
|
|
1088
|
+
const response = (await ctx.session.state(coordinator, { through: "latest" })).state.response;
|
|
1087
1089
|
if (response?.status !== "failed" || response.rootMessageId !== ctx.event.payload.messageId || response.responseMessageId !== ctx.event.payload.responseMessageId) return;
|
|
1088
1090
|
return {
|
|
1089
1091
|
type: "ai.generation.requested",
|
|
@@ -1096,7 +1098,7 @@ function createHandlers(options) {
|
|
|
1096
1098
|
};
|
|
1097
1099
|
};
|
|
1098
1100
|
const handleInputResponse = async (ctx) => {
|
|
1099
|
-
const response = (await ctx.session.state(coordinator)).state.response;
|
|
1101
|
+
const response = (await ctx.session.state(coordinator, { through: "latest" })).state.response;
|
|
1100
1102
|
if (response?.responseMessageId !== ctx.event.payload.messageId || response.inputResponse?.index !== ctx.event.index || response.inputResponse.generationId !== ctx.event.payload.generationId || response.inputResponse.inputId !== ctx.event.payload.inputId) return;
|
|
1101
1103
|
await continueIfReady(ctx, ctx.event.payload.generationId);
|
|
1102
1104
|
};
|