@projectaria/cf-agents 0.1.1 → 0.1.2
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/README.md +358 -253
- package/dist/AriaCFChatAgent.d.ts +37 -0
- package/dist/AriaCFChatAgent.d.ts.map +1 -0
- package/dist/AriaCFChatAgent.js +200 -0
- package/dist/AriaCFChatAgent.js.map +1 -0
- package/dist/CloudflareSessionStore.d.ts +37 -0
- package/dist/CloudflareSessionStore.d.ts.map +1 -0
- package/dist/CloudflareSessionStore.js +101 -0
- package/dist/CloudflareSessionStore.js.map +1 -0
- package/dist/aria-to-ui-stream.d.ts +21 -0
- package/dist/aria-to-ui-stream.d.ts.map +1 -0
- package/dist/aria-to-ui-stream.js +118 -0
- package/dist/aria-to-ui-stream.js.map +1 -0
- package/dist/index.d.ts +25 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -23
- package/dist/index.js.map +1 -1
- package/dist/message-format.d.ts +39 -0
- package/dist/message-format.d.ts.map +1 -0
- package/dist/message-format.js +124 -0
- package/dist/message-format.js.map +1 -0
- package/dist/types.d.ts +59 -146
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -7
- package/dist/types.js.map +1 -1
- package/package.json +3 -2
- package/dist/AriaAgent.d.ts +0 -186
- package/dist/AriaAgent.d.ts.map +0 -1
- package/dist/AriaAgent.js +0 -756
- package/dist/AriaAgent.js.map +0 -1
- package/dist/aria-agent-integration.d.ts +0 -52
- package/dist/aria-agent-integration.d.ts.map +0 -1
- package/dist/aria-agent-integration.js +0 -186
- package/dist/aria-agent-integration.js.map +0 -1
- package/dist/message-converter.d.ts +0 -48
- package/dist/message-converter.d.ts.map +0 -1
- package/dist/message-converter.js +0 -138
- package/dist/message-converter.js.map +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AriaCFChatAgent - Main Agent Class for ARIA on Cloudflare
|
|
3
|
+
*
|
|
4
|
+
* This class extends Cloudflare's AIChatAgent and integrates ARIA's
|
|
5
|
+
* agent system for structured conversations.
|
|
6
|
+
*/
|
|
7
|
+
import { AIChatAgent } from "@cloudflare/ai-chat";
|
|
8
|
+
import { type AgentContext } from "agents";
|
|
9
|
+
import { type Agent as AriaAgent, type AgentSession, type ToolRegistry, VoltRuntime } from "@projectaria/aria-agents";
|
|
10
|
+
import type { StreamTextOnFinishCallback, ToolSet, LanguageModel } from "ai";
|
|
11
|
+
import type { AriaCFChatAgentConfig, AriaCFState, AriaCFChatAgentConfigResolved } from "./types";
|
|
12
|
+
import { CloudflareSessionStore } from "./CloudflareSessionStore";
|
|
13
|
+
export declare abstract class AriaCFChatAgent<Env = any, State extends AriaCFState = AriaCFState> extends AIChatAgent<Env, State> {
|
|
14
|
+
protected readonly ariaAgent: AriaAgent;
|
|
15
|
+
protected readonly voltRuntime: VoltRuntime;
|
|
16
|
+
protected readonly config: AriaCFChatAgentConfigResolved;
|
|
17
|
+
protected readonly sessionStore: CloudflareSessionStore;
|
|
18
|
+
readonly initialState: State;
|
|
19
|
+
constructor(ctx: AgentContext, env: Env);
|
|
20
|
+
protected resolveConfig(): AriaCFChatAgentConfigResolved;
|
|
21
|
+
protected abstract getConfig(): AriaCFChatAgentConfig;
|
|
22
|
+
protected createAriaAgent(): AriaAgent;
|
|
23
|
+
protected createVoltRuntime(): VoltRuntime;
|
|
24
|
+
protected getModel(): LanguageModel;
|
|
25
|
+
protected getModelId(): string;
|
|
26
|
+
protected getTools(): ToolRegistry;
|
|
27
|
+
onChatMessage(onFinish: StreamTextOnFinishCallback<ToolSet>, _options?: {
|
|
28
|
+
abortSignal?: AbortSignal;
|
|
29
|
+
}): Promise<Response | undefined>;
|
|
30
|
+
protected updateStateFromSession(ariaSession: AgentSession): void;
|
|
31
|
+
onRequest(request: Request): Promise<Response>;
|
|
32
|
+
protected getCloudflareTools(): ToolRegistry;
|
|
33
|
+
onStart(): void;
|
|
34
|
+
onDestroy(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function createAriaCFChatAgent<Env = any>(config: AriaCFChatAgentConfig): new (ctx: AgentContext, env: Env) => AriaCFChatAgent<Env>;
|
|
37
|
+
//# sourceMappingURL=AriaCFChatAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AriaCFChatAgent.d.ts","sourceRoot":"","sources":["../src/AriaCFChatAgent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,YAAY,EAAc,MAAM,QAAQ,CAAC;AACvD,OAAO,EAEL,KAAK,KAAK,IAAI,SAAS,EACvB,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,WAAW,EAKZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,0BAA0B,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAG7E,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EACX,6BAA6B,EAC9B,MAAM,SAAS,CAAC;AAIjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAUlE,8BAAsB,eAAe,CACnC,GAAG,GAAG,GAAG,EACT,KAAK,SAAS,WAAW,GAAG,WAAW,CACvC,SAAQ,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC;IAC/B,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;IAExD,QAAQ,CAAC,YAAY,EAAE,KAAK,CAEjB;gBAEC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG;IAsBvC,SAAS,CAAC,aAAa,IAAI,6BAA6B;IAaxD,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,qBAAqB;IAErD,SAAS,CAAC,eAAe,IAAI,SAAS;IAWtC,SAAS,CAAC,iBAAiB,IAAI,WAAW;IAc1C,SAAS,CAAC,QAAQ,IAAI,aAAa;IAInC,SAAS,CAAC,UAAU,IAAI,MAAM;IAQ9B,SAAS,CAAC,QAAQ,IAAI,YAAY;IAInB,aAAa,CAC1B,QAAQ,EAAE,0BAA0B,CAAC,OAAO,CAAC,EAC7C,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,GACvC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IA4BhC,SAAS,CAAC,sBAAsB,CAAC,WAAW,EAAE,YAAY,GAAG,IAAI;IASlD,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAe7D,SAAS,CAAC,kBAAkB,IAAI,YAAY;IAmD5C,OAAO,IAAI,IAAI;IAYf,SAAS,IAAI,IAAI;CAElB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAG,GAAG,EAC7C,MAAM,EAAE,qBAAqB,GAC5B,KAAK,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,KAAK,eAAe,CAAC,GAAG,CAAC,CAU3D"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AriaCFChatAgent - Main Agent Class for ARIA on Cloudflare
|
|
3
|
+
*
|
|
4
|
+
* This class extends Cloudflare's AIChatAgent and integrates ARIA's
|
|
5
|
+
* agent system for structured conversations.
|
|
6
|
+
*/
|
|
7
|
+
import { AIChatAgent } from "@cloudflare/ai-chat";
|
|
8
|
+
import { createAgent, VoltRuntime, CombinedAnalysisService, ProgressionEngine, PromptBuilder, } from "@projectaria/aria-agents";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { cloudflareToAriaSession, extractLastUserInput } from "./message-format";
|
|
11
|
+
import { createARIAStreamResponse } from "./aria-to-ui-stream";
|
|
12
|
+
import { CloudflareSessionStore } from "./CloudflareSessionStore";
|
|
13
|
+
const ARIA_CF_INITIAL_STATE = {
|
|
14
|
+
ariaSessionId: null,
|
|
15
|
+
workingMemory: {},
|
|
16
|
+
agentConfig: null,
|
|
17
|
+
lastActivity: null,
|
|
18
|
+
activeFlow: null,
|
|
19
|
+
};
|
|
20
|
+
export class AriaCFChatAgent extends AIChatAgent {
|
|
21
|
+
ariaAgent;
|
|
22
|
+
voltRuntime;
|
|
23
|
+
config;
|
|
24
|
+
sessionStore;
|
|
25
|
+
initialState = {
|
|
26
|
+
...ARIA_CF_INITIAL_STATE,
|
|
27
|
+
};
|
|
28
|
+
constructor(ctx, env) {
|
|
29
|
+
super(ctx, env);
|
|
30
|
+
this.config = this.resolveConfig();
|
|
31
|
+
this.sessionStore = new CloudflareSessionStore(ctx);
|
|
32
|
+
this.ariaAgent = this.createAriaAgent();
|
|
33
|
+
this.voltRuntime = this.createVoltRuntime();
|
|
34
|
+
const modelId = this.getModelId();
|
|
35
|
+
const agentName = "aria-agent";
|
|
36
|
+
const agentId = this.ariaAgent.id;
|
|
37
|
+
this.setState({
|
|
38
|
+
...this.initialState,
|
|
39
|
+
agentConfig: {
|
|
40
|
+
id: agentId,
|
|
41
|
+
name: agentName,
|
|
42
|
+
modelId,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
resolveConfig() {
|
|
47
|
+
const config = this.getConfig();
|
|
48
|
+
return {
|
|
49
|
+
flows: config.flows ?? new Map(),
|
|
50
|
+
model: config.model,
|
|
51
|
+
instructions: config.instructions ?? "You are a helpful AI assistant.",
|
|
52
|
+
guidelines: config.guidelines ?? [],
|
|
53
|
+
tools: config.tools ?? {},
|
|
54
|
+
historyLimit: config.historyLimit ?? 50,
|
|
55
|
+
enablePersistence: config.enablePersistence ?? true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
createAriaAgent() {
|
|
59
|
+
return createAgent({
|
|
60
|
+
id: this.name,
|
|
61
|
+
name: this.name,
|
|
62
|
+
model: this.config.model,
|
|
63
|
+
instructions: this.config.instructions,
|
|
64
|
+
guidelines: this.config.guidelines,
|
|
65
|
+
tools: this.getTools(),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
createVoltRuntime() {
|
|
69
|
+
const analysisService = new CombinedAnalysisService(this.config.model, new PromptBuilder({ guidelines: this.config.guidelines }));
|
|
70
|
+
return new VoltRuntime({
|
|
71
|
+
flows: this.config.flows,
|
|
72
|
+
analysisService,
|
|
73
|
+
progressionEngine: new ProgressionEngine(),
|
|
74
|
+
sessionStore: this.config.enablePersistence ? this.sessionStore : undefined,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
getModel() {
|
|
78
|
+
return this.config.model;
|
|
79
|
+
}
|
|
80
|
+
getModelId() {
|
|
81
|
+
const model = this.config.model;
|
|
82
|
+
if (typeof model === "object" && model !== null) {
|
|
83
|
+
return model.modelId ?? "unknown";
|
|
84
|
+
}
|
|
85
|
+
return "unknown";
|
|
86
|
+
}
|
|
87
|
+
getTools() {
|
|
88
|
+
return this.config.tools;
|
|
89
|
+
}
|
|
90
|
+
async onChatMessage(onFinish, _options) {
|
|
91
|
+
const messages = this.messages;
|
|
92
|
+
const lastMessage = messages[messages.length - 1];
|
|
93
|
+
if (!lastMessage) {
|
|
94
|
+
return new Response("No message", { status: 400 });
|
|
95
|
+
}
|
|
96
|
+
const userText = extractLastUserInput(messages);
|
|
97
|
+
const ariaSession = cloudflareToAriaSession(messages, this.state);
|
|
98
|
+
if (this.config.enablePersistence) {
|
|
99
|
+
await this.voltRuntime.startSession(ariaSession.sessionId);
|
|
100
|
+
}
|
|
101
|
+
const result = await this.ariaAgent.streamText({
|
|
102
|
+
input: userText,
|
|
103
|
+
session: ariaSession,
|
|
104
|
+
});
|
|
105
|
+
const session = result.session;
|
|
106
|
+
if (session) {
|
|
107
|
+
this.updateStateFromSession(session);
|
|
108
|
+
}
|
|
109
|
+
return createARIAStreamResponse(result.fullStream, onFinish);
|
|
110
|
+
}
|
|
111
|
+
updateStateFromSession(ariaSession) {
|
|
112
|
+
this.setState({
|
|
113
|
+
...this.state,
|
|
114
|
+
ariaSessionId: ariaSession.sessionId,
|
|
115
|
+
workingMemory: ariaSession.workingMemory,
|
|
116
|
+
lastActivity: new Date().toISOString(),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async onRequest(request) {
|
|
120
|
+
const url = new URL(request.url);
|
|
121
|
+
if (url.pathname === "/health") {
|
|
122
|
+
return Response.json({
|
|
123
|
+
status: "healthy",
|
|
124
|
+
agent: this.name,
|
|
125
|
+
model: this.getModelId(),
|
|
126
|
+
lastActivity: this.state.lastActivity,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return super.onRequest(request);
|
|
130
|
+
}
|
|
131
|
+
getCloudflareTools() {
|
|
132
|
+
return {
|
|
133
|
+
scheduleTask: {
|
|
134
|
+
description: "Schedule a task to run in the future.",
|
|
135
|
+
inputSchema: z.object({
|
|
136
|
+
when: z.union([z.number(), z.string()]),
|
|
137
|
+
callback: z.string(),
|
|
138
|
+
data: z.any().optional(),
|
|
139
|
+
}),
|
|
140
|
+
execute: async (args) => {
|
|
141
|
+
const when = args.when;
|
|
142
|
+
const callback = args.callback;
|
|
143
|
+
const data = args.data;
|
|
144
|
+
let scheduleWhen = when;
|
|
145
|
+
if (typeof when === "string" && !when.includes("*")) {
|
|
146
|
+
const date = new Date(when);
|
|
147
|
+
if (!isNaN(date.getTime())) {
|
|
148
|
+
scheduleWhen = date;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// schedule() is a Cloudflare Agent method with specific signature
|
|
152
|
+
const result = await this.schedule(scheduleWhen, callback, data);
|
|
153
|
+
return { taskId: result.id, type: result.type };
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
cancelTask: {
|
|
157
|
+
description: "Cancel a scheduled task by ID",
|
|
158
|
+
inputSchema: z.object({
|
|
159
|
+
taskId: z.string(),
|
|
160
|
+
}),
|
|
161
|
+
execute: async (args) => {
|
|
162
|
+
const taskId = args.taskId;
|
|
163
|
+
const success = await this.cancelSchedule(taskId);
|
|
164
|
+
return { success };
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
getSchedules: {
|
|
168
|
+
description: "Get all currently scheduled tasks",
|
|
169
|
+
inputSchema: z.object({}),
|
|
170
|
+
execute: async () => {
|
|
171
|
+
const schedules = this.getSchedules();
|
|
172
|
+
return { schedules };
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
onStart() {
|
|
178
|
+
if (this.config.enablePersistence) {
|
|
179
|
+
this.sessionStore.initialize();
|
|
180
|
+
}
|
|
181
|
+
if (this.state.ariaSessionId && this.config.enablePersistence) {
|
|
182
|
+
this.voltRuntime.startSession(this.state.ariaSessionId).catch((error) => {
|
|
183
|
+
console.error("Failed to resume session:", error);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
onDestroy() {
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export function createAriaCFChatAgent(config) {
|
|
191
|
+
return class extends AriaCFChatAgent {
|
|
192
|
+
constructor(ctx, env) {
|
|
193
|
+
super(ctx, env);
|
|
194
|
+
}
|
|
195
|
+
getConfig() {
|
|
196
|
+
return config;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=AriaCFChatAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AriaCFChatAgent.js","sourceRoot":"","sources":["../src/AriaCFChatAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Session Store Implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides session persistence using Cloudflare's built-in SQLite storage.
|
|
5
|
+
*/
|
|
6
|
+
import type { Session } from "@projectaria/aria-agents";
|
|
7
|
+
import type { Agent } from "agents";
|
|
8
|
+
export interface SessionStore {
|
|
9
|
+
get(id: string): Promise<{
|
|
10
|
+
session: Session;
|
|
11
|
+
} | undefined>;
|
|
12
|
+
create(session: Session): Promise<void>;
|
|
13
|
+
update(session: Session): Promise<void>;
|
|
14
|
+
delete(id: string): Promise<void>;
|
|
15
|
+
list(limit?: number, offset?: number): Promise<Array<{
|
|
16
|
+
session: Session;
|
|
17
|
+
}>>;
|
|
18
|
+
count(): Promise<number>;
|
|
19
|
+
}
|
|
20
|
+
export declare class CloudflareSessionStore {
|
|
21
|
+
private static readonly TABLE_NAME;
|
|
22
|
+
private readonly agent;
|
|
23
|
+
private initialized;
|
|
24
|
+
constructor(agent: Agent);
|
|
25
|
+
initialize(): void;
|
|
26
|
+
get(id: string): Promise<{
|
|
27
|
+
session: Session;
|
|
28
|
+
} | undefined>;
|
|
29
|
+
create(session: Session): Promise<void>;
|
|
30
|
+
update(session: Session): Promise<void>;
|
|
31
|
+
delete(id: string): Promise<void>;
|
|
32
|
+
list(limit?: number, offset?: number): Promise<Array<{
|
|
33
|
+
session: Session;
|
|
34
|
+
}>>;
|
|
35
|
+
count(): Promise<number>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=CloudflareSessionStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudflareSessionStore.d.ts","sourceRoot":"","sources":["../src/CloudflareSessionStore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5E,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,KAAK;IAIxB,UAAU,IAAI,IAAI;IAoBZ,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAuB1D,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASvC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjC,IAAI,CACR,KAAK,GAAE,MAAY,EACnB,MAAM,GAAE,MAAU,GACjB,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAwBjC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAU/B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Session Store Implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides session persistence using Cloudflare's built-in SQLite storage.
|
|
5
|
+
*/
|
|
6
|
+
export class CloudflareSessionStore {
|
|
7
|
+
static TABLE_NAME = "aria_sessions";
|
|
8
|
+
agent;
|
|
9
|
+
initialized = false;
|
|
10
|
+
constructor(agent) {
|
|
11
|
+
this.agent = agent;
|
|
12
|
+
}
|
|
13
|
+
initialize() {
|
|
14
|
+
if (this.initialized)
|
|
15
|
+
return;
|
|
16
|
+
this.agent.sql `
|
|
17
|
+
CREATE TABLE IF NOT EXISTS ${CloudflareSessionStore.TABLE_NAME} (
|
|
18
|
+
session_id TEXT PRIMARY KEY,
|
|
19
|
+
data TEXT NOT NULL,
|
|
20
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
21
|
+
updated_at INTEGER DEFAULT (unixepoch())
|
|
22
|
+
)
|
|
23
|
+
`;
|
|
24
|
+
this.agent.sql `
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_${CloudflareSessionStore.TABLE_NAME}_updated
|
|
26
|
+
ON ${CloudflareSessionStore.TABLE_NAME}(updated_at)
|
|
27
|
+
`;
|
|
28
|
+
this.initialized = true;
|
|
29
|
+
}
|
|
30
|
+
async get(id) {
|
|
31
|
+
this.initialize();
|
|
32
|
+
const results = this.agent.sql `
|
|
33
|
+
SELECT data FROM ${CloudflareSessionStore.TABLE_NAME}
|
|
34
|
+
WHERE session_id = ${id}
|
|
35
|
+
`;
|
|
36
|
+
const firstResult = results[0];
|
|
37
|
+
if (!firstResult) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const session = JSON.parse(firstResult.data);
|
|
42
|
+
return { session };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error(`Failed to parse session ${id}:`, error);
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async create(session) {
|
|
50
|
+
this.initialize();
|
|
51
|
+
this.agent.sql `
|
|
52
|
+
INSERT INTO ${CloudflareSessionStore.TABLE_NAME} (session_id, data)
|
|
53
|
+
VALUES (${session.id}, ${JSON.stringify(session)})
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
async update(session) {
|
|
57
|
+
this.initialize();
|
|
58
|
+
this.agent.sql `
|
|
59
|
+
UPDATE ${CloudflareSessionStore.TABLE_NAME}
|
|
60
|
+
SET data = ${JSON.stringify(session)},
|
|
61
|
+
updated_at = unixepoch()
|
|
62
|
+
WHERE session_id = ${session.id}
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
async delete(id) {
|
|
66
|
+
this.initialize();
|
|
67
|
+
this.agent.sql `
|
|
68
|
+
DELETE FROM ${CloudflareSessionStore.TABLE_NAME}
|
|
69
|
+
WHERE session_id = ${id}
|
|
70
|
+
`;
|
|
71
|
+
}
|
|
72
|
+
async list(limit = 100, offset = 0) {
|
|
73
|
+
this.initialize();
|
|
74
|
+
const results = this.agent.sql `
|
|
75
|
+
SELECT data FROM ${CloudflareSessionStore.TABLE_NAME}
|
|
76
|
+
ORDER BY updated_at DESC
|
|
77
|
+
LIMIT ${limit}
|
|
78
|
+
OFFSET ${offset}
|
|
79
|
+
`;
|
|
80
|
+
const sessions = [];
|
|
81
|
+
for (const row of results) {
|
|
82
|
+
try {
|
|
83
|
+
const session = JSON.parse(row.data);
|
|
84
|
+
sessions.push({ session });
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error("Failed to parse session:", error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return sessions;
|
|
91
|
+
}
|
|
92
|
+
async count() {
|
|
93
|
+
this.initialize();
|
|
94
|
+
const results = this.agent.sql `
|
|
95
|
+
SELECT COUNT(*) as count FROM ${CloudflareSessionStore.TABLE_NAME}
|
|
96
|
+
`;
|
|
97
|
+
const firstResult = results[0];
|
|
98
|
+
return firstResult?.count ?? 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=CloudflareSessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudflareSessionStore.js","sourceRoot":"","sources":["../src/CloudflareSessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Stream Mapper: ARIA → AI SDK UI Format
|
|
3
|
+
*
|
|
4
|
+
* Converts ARIA stream parts to AI SDK UI message format.
|
|
5
|
+
*/
|
|
6
|
+
import type { AriaStreamPart } from "@projectaria/aria-agents";
|
|
7
|
+
export interface AriaToUIStreamConfig {
|
|
8
|
+
includeMetadata?: boolean;
|
|
9
|
+
toolTypePrefix?: string;
|
|
10
|
+
preserveOriginalType?: boolean;
|
|
11
|
+
generateToolCallIds?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function ariaToUIStream(ariaStream: AsyncIterable<AriaStreamPart>, config?: AriaToUIStreamConfig): AsyncGenerator<any, void, unknown>;
|
|
14
|
+
export declare function ariaPartToUIPart(part: AriaStreamPart, config?: AriaToUIStreamConfig): any;
|
|
15
|
+
export declare function createARIAStreamResponse(ariaStream: AsyncIterable<AriaStreamPart>, onFinish?: (result: any) => void): Response;
|
|
16
|
+
export declare function ariaHistoryToUIMessages(history: AriaStreamPart[]): any[];
|
|
17
|
+
export declare function isToolCallPart(part: AriaStreamPart): boolean;
|
|
18
|
+
export declare function isToolResultPart(part: AriaStreamPart): boolean;
|
|
19
|
+
export declare function isTextPart(part: AriaStreamPart): boolean;
|
|
20
|
+
export declare function getToolNameFromPart(part: AriaStreamPart): string | null;
|
|
21
|
+
//# sourceMappingURL=aria-to-ui-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-to-ui-stream.d.ts","sourceRoot":"","sources":["../src/aria-to-ui-stream.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AASD,wBAAuB,cAAc,CACnC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,EACzC,MAAM,GAAE,oBAAyB,GAChC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAUpC;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,cAAc,EACpB,MAAM,GAAE,oBAAyB,GAChC,GAAG,CAkEL;AAMD,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,EACzC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAC/B,QAAQ,CAUV;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,EAAE,GACxB,GAAG,EAAE,CASP;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAE9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAExD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAKvE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Stream Mapper: ARIA → AI SDK UI Format
|
|
3
|
+
*
|
|
4
|
+
* Converts ARIA stream parts to AI SDK UI message format.
|
|
5
|
+
*/
|
|
6
|
+
import { createUIMessageStream, createUIMessageStreamResponse, } from "ai";
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
includeMetadata: false,
|
|
9
|
+
toolTypePrefix: "tool-",
|
|
10
|
+
preserveOriginalType: false,
|
|
11
|
+
generateToolCallIds: true,
|
|
12
|
+
};
|
|
13
|
+
export async function* ariaToUIStream(ariaStream, config = {}) {
|
|
14
|
+
const resolvedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
15
|
+
for await (const part of ariaStream) {
|
|
16
|
+
const uiPart = ariaPartToUIPart(part, resolvedConfig);
|
|
17
|
+
if (uiPart !== null) {
|
|
18
|
+
yield uiPart;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function ariaPartToUIPart(part, config = {}) {
|
|
23
|
+
const resolvedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
24
|
+
const { toolTypePrefix, generateToolCallIds } = resolvedConfig;
|
|
25
|
+
const partType = part.type;
|
|
26
|
+
if (partType === "text-delta") {
|
|
27
|
+
return {
|
|
28
|
+
type: "text",
|
|
29
|
+
text: part.text || "",
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (partType === "text-start" || partType === "text-end") {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (partType === "tool-call") {
|
|
36
|
+
const toolCallId = part.toolCallId ?? (generateToolCallIds ? generateToolCallId() : `tc-${Date.now()}`);
|
|
37
|
+
return {
|
|
38
|
+
type: `${toolTypePrefix}${part.toolName}`,
|
|
39
|
+
toolCallId,
|
|
40
|
+
state: "input-available",
|
|
41
|
+
input: part.input ?? {},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (partType === "tool-result") {
|
|
45
|
+
const toolCallId = part.toolCallId ?? (generateToolCallIds ? generateToolCallId() : `tc-${Date.now()}`);
|
|
46
|
+
const isError = part.output && typeof part.output === "object" && part.output !== null && "error" in part.output;
|
|
47
|
+
const output = part.output;
|
|
48
|
+
return {
|
|
49
|
+
type: `${toolTypePrefix}${part.toolName}`,
|
|
50
|
+
toolCallId,
|
|
51
|
+
state: isError ? "error" : "output-available",
|
|
52
|
+
input: part.input,
|
|
53
|
+
output: isError ? undefined : part.output,
|
|
54
|
+
error: isError ? String(output?.error) : undefined,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (partType === "tool-error") {
|
|
58
|
+
const toolCallId = part.toolCallId ?? (generateToolCallIds ? generateToolCallId() : `tc-${Date.now()}`);
|
|
59
|
+
return {
|
|
60
|
+
type: `${toolTypePrefix}${part.toolName}`,
|
|
61
|
+
toolCallId,
|
|
62
|
+
state: "error",
|
|
63
|
+
error: part.error,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (partType === "error") {
|
|
67
|
+
return {
|
|
68
|
+
type: "text",
|
|
69
|
+
text: `Error: ${part.error instanceof Error ? part.error.message : String(part.error)}`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (partType === "start-step" || partType === "start" || partType === "finish" || partType === "abort") {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
type: "text",
|
|
77
|
+
text: `[Unknown stream part: ${partType}]`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function generateToolCallId() {
|
|
81
|
+
return `tc-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
82
|
+
}
|
|
83
|
+
export function createARIAStreamResponse(ariaStream, onFinish) {
|
|
84
|
+
const stream = createUIMessageStream({
|
|
85
|
+
execute: async ({ writer }) => {
|
|
86
|
+
for await (const part of ariaToUIStream(ariaStream)) {
|
|
87
|
+
writer.write(part);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return createUIMessageStreamResponse(stream);
|
|
92
|
+
}
|
|
93
|
+
export function ariaHistoryToUIMessages(history) {
|
|
94
|
+
const messages = [];
|
|
95
|
+
for (const part of history) {
|
|
96
|
+
const uiPart = ariaPartToUIPart(part);
|
|
97
|
+
if (uiPart) {
|
|
98
|
+
messages.push(uiPart);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return messages;
|
|
102
|
+
}
|
|
103
|
+
export function isToolCallPart(part) {
|
|
104
|
+
return part.type === "tool-call";
|
|
105
|
+
}
|
|
106
|
+
export function isToolResultPart(part) {
|
|
107
|
+
return part.type === "tool-result";
|
|
108
|
+
}
|
|
109
|
+
export function isTextPart(part) {
|
|
110
|
+
return part.type === "text-delta";
|
|
111
|
+
}
|
|
112
|
+
export function getToolNameFromPart(part) {
|
|
113
|
+
if (part.type === "tool-call" || part.type === "tool-result" || part.type === "tool-error") {
|
|
114
|
+
return part.toolName;
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=aria-to-ui-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-to-ui-stream.js","sourceRoot":"","sources":["../src/aria-to-ui-stream.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,32 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ARIA Cloudflare Agents Integration
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* A framework for building structured, multi-turn AI conversations on Cloudflare Workers.
|
|
5
|
+
* Integrates ARIA's flow orchestration with Cloudflare's Agent system.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Key Components:
|
|
8
|
+
* - AriaCFChatAgent: Base class extending Cloudflare's AIChatAgent
|
|
9
|
+
* - createAriaCFChatAgent: Factory function for creating agent subclasses
|
|
10
|
+
* - CloudflareSessionStore: SQL-based session persistence
|
|
11
|
+
* - ariaToUIStream: Universal stream mapper (ARIA → AI SDK UI format)
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* - Access via agent.getWorkingMemory(), agent.setWorkingMemory()
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { createAriaCFChatAgent } from "@projectaria/cf-agents";
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* const MyAgent = createAriaCFChatAgent({
|
|
18
|
+
* flows: new Map([[myFlow.id, myFlow]]),
|
|
19
|
+
* instructions: "You are a helpful assistant.",
|
|
20
|
+
* workersAiBinding: env.AI,
|
|
21
|
+
* });
|
|
20
22
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* bun add agents ai
|
|
23
|
+
* export { MyAgent as MyAgent };
|
|
24
|
+
* ```
|
|
24
25
|
*/
|
|
25
|
-
export {
|
|
26
|
-
export
|
|
27
|
-
export {
|
|
28
|
-
export {
|
|
29
|
-
export type {
|
|
26
|
+
export { AriaCFChatAgent, createAriaCFChatAgent } from "./AriaCFChatAgent.js";
|
|
27
|
+
export { CloudflareSessionStore } from "./CloudflareSessionStore.js";
|
|
28
|
+
export { cloudflareToAriaSession, extractTextContent, extractLastUserInput, createUserMessage, createAssistantMessage, createToolResultMessage, truncateMessageHistory, isToolCall, isToolResult, extractToolCalls, extractToolResults, } from "./message-format.js";
|
|
29
|
+
export { ariaToUIStream, ariaPartToUIPart, createARIAStreamResponse, ariaHistoryToUIMessages, } from "./aria-to-ui-stream.js";
|
|
30
|
+
export type { AriaToUIStreamConfig, } from "./aria-to-ui-stream.js";
|
|
31
|
+
export type { AriaCFChatAgentConfig, AriaCFState, AriaCFChatAgentConfigResolved, } from "./types.js";
|
|
30
32
|
export { createAgent } from "@projectaria/aria-agents";
|
|
31
|
-
export type { Agent,
|
|
33
|
+
export type { Agent, AgentSession, FlowDefinition, ToolRegistry, SessionStore, } from "@projectaria/aria-agents";
|
|
34
|
+
export type { UIMessage, ToolSet, LanguageModelUsage, } from "ai";
|
|
32
35
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,qBAAqB,EACrB,WAAW,EACX,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EACV,KAAK,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,GACb,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,SAAS,EACT,OAAO,EACP,kBAAkB,GACnB,MAAM,IAAI,CAAC"}
|