@ariaflowagents/cf-agent 0.1.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/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # @ariaflowagents/cf-agent
2
+
3
+ Cloudflare Agents base class for hosting AriaFlow Runtime on Durable Objects.
4
+
5
+ ## Why Cloudflare Agents
6
+
7
+ - Batteries-included state with automatic client sync and embedded SQLite.
8
+ - Real-time WebSockets for streaming agent updates.
9
+ - Extensible edge runtime with Durable Objects for global, low-latency sessions.
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { AriaFlowChatAgent } from '@ariaflowagents/cf-agent';
15
+ import { Runtime, type AgentConfig } from '@ariaflowagents/core';
16
+
17
+ export class SupportAgent extends AriaFlowChatAgent {
18
+ async createRuntimeConfig() {
19
+ const support: AgentConfig = {
20
+ id: 'support',
21
+ name: 'Support',
22
+ systemPrompt: 'You help users with support questions.',
23
+ };
24
+
25
+ return {
26
+ agents: [support],
27
+ defaultAgentId: 'support',
28
+ };
29
+ }
30
+ }
31
+ ```
32
+
33
+ ## Notes
34
+
35
+ - `createRuntimeConfig()` is called once on startup and should return a `Runtime`
36
+ or a `HarnessConfig` used to build one.
37
+ - The base class streams AriaFlow parts over WebSockets and syncs `activeAgentId`
38
+ into Agent state on handoffs.
39
+ - `GET /info` is handled in `onRequest` for simple metadata.
40
+ - `CloudflareSQLiteStore` is exported from this package for custom session wiring.
@@ -0,0 +1,24 @@
1
+ import { Agent, type Connection, type WSMessage } from 'agents';
2
+ import { Runtime, type HarnessConfig, type HarnessHooks, type HarnessStreamPart } from '@ariaflowagents/core';
3
+ export type AriaFlowRuntimeFactory = HarnessConfig | Runtime;
4
+ export type AriaFlowChatPayload = {
5
+ type?: string;
6
+ text?: string;
7
+ message?: string;
8
+ content?: string;
9
+ sessionId?: string;
10
+ userId?: string;
11
+ };
12
+ export declare abstract class AriaFlowChatAgent<Env = unknown, State = unknown> extends Agent<Env, State> {
13
+ protected runtime: Runtime;
14
+ abstract createRuntimeConfig(): Promise<AriaFlowRuntimeFactory> | AriaFlowRuntimeFactory;
15
+ protected getContextId(): string | null;
16
+ protected getSessionId(_connection: Connection, _payload: AriaFlowChatPayload): string;
17
+ protected getHooks(): HarnessHooks;
18
+ protected shouldBroadcast(): boolean;
19
+ protected sendPart(connection: Connection, part: HarnessStreamPart): void;
20
+ onStart(): Promise<void>;
21
+ onMessage(connection: Connection, message: WSMessage): Promise<void>;
22
+ onRequest(request: Request): Promise<Response>;
23
+ }
24
+ //# sourceMappingURL=AriaFlowChatAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AriaFlowChatAgent.d.ts","sourceRoot":"","sources":["../src/AriaFlowChatAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9G,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,OAAO,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA6DF,8BAAsB,iBAAiB,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,CAAE,SAAQ,KAAK,CACnF,GAAG,EACH,KAAK,CACN;IACC,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAE5B,QAAQ,CAAC,mBAAmB,IAAI,OAAO,CAAC,sBAAsB,CAAC,GAAG,sBAAsB;IAExF,SAAS,CAAC,YAAY,IAAI,MAAM,GAAG,IAAI;IAKvC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAItF,SAAS,CAAC,QAAQ,IAAI,YAAY;IA0BlC,SAAS,CAAC,eAAe,IAAI,OAAO;IAIpC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAYnE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBxB,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCpE,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CAYrD"}
@@ -0,0 +1,153 @@
1
+ import { Agent } from 'agents';
2
+ import { Runtime } from '@ariaflowagents/core';
3
+ import { CloudflareSQLiteStore } from './stores/CloudflareSQLiteStore.js';
4
+ const mergeHooks = (base, extra) => {
5
+ if (!base)
6
+ return extra ?? {};
7
+ if (!extra)
8
+ return base;
9
+ const merged = { ...base };
10
+ for (const [key, hook] of Object.entries(extra)) {
11
+ const hookKey = key;
12
+ const existing = merged[hookKey];
13
+ if (!hook)
14
+ continue;
15
+ if (existing) {
16
+ merged[hookKey] = (async (...args) => {
17
+ await existing(...args);
18
+ await hook(...args);
19
+ });
20
+ }
21
+ else {
22
+ merged[hookKey] = hook;
23
+ }
24
+ }
25
+ return merged;
26
+ };
27
+ const coerceToString = (message) => {
28
+ if (typeof message === 'string') {
29
+ return message;
30
+ }
31
+ if (message instanceof ArrayBuffer) {
32
+ return new TextDecoder().decode(message);
33
+ }
34
+ if (ArrayBuffer.isView(message)) {
35
+ return new TextDecoder().decode(message.buffer);
36
+ }
37
+ return null;
38
+ };
39
+ const parsePayload = (raw) => {
40
+ const asString = coerceToString(raw);
41
+ if (!asString)
42
+ return null;
43
+ try {
44
+ return JSON.parse(asString);
45
+ }
46
+ catch {
47
+ return { text: asString };
48
+ }
49
+ };
50
+ export class AriaFlowChatAgent extends Agent {
51
+ runtime;
52
+ getContextId() {
53
+ const ctx = this.ctx;
54
+ return ctx?.id?.toString?.() ?? null;
55
+ }
56
+ getSessionId(_connection, _payload) {
57
+ return _payload.sessionId ?? this.getContextId() ?? _connection.id;
58
+ }
59
+ getHooks() {
60
+ return {
61
+ onHandoff: async (_context, _from, to, reason) => {
62
+ if (this.setState) {
63
+ const state = this.state;
64
+ this.setState({
65
+ ...state,
66
+ activeAgentId: to,
67
+ lastHandoffReason: reason,
68
+ updatedAt: Date.now(),
69
+ });
70
+ }
71
+ },
72
+ onAgentStart: async (_context, agentId) => {
73
+ if (this.setState) {
74
+ const state = this.state;
75
+ this.setState({
76
+ ...state,
77
+ activeAgentId: agentId,
78
+ updatedAt: Date.now(),
79
+ });
80
+ }
81
+ },
82
+ };
83
+ }
84
+ shouldBroadcast() {
85
+ return true;
86
+ }
87
+ sendPart(connection, part) {
88
+ const payload = JSON.stringify(part);
89
+ const broadcaster = this;
90
+ if (this.shouldBroadcast() && typeof broadcaster.broadcast === 'function') {
91
+ broadcaster.broadcast(payload);
92
+ return;
93
+ }
94
+ connection.send(payload);
95
+ }
96
+ async onStart() {
97
+ await super.onStart();
98
+ const config = await this.createRuntimeConfig();
99
+ if (config instanceof Runtime) {
100
+ this.runtime = config;
101
+ return;
102
+ }
103
+ const hooks = mergeHooks(config.hooks, this.getHooks());
104
+ const sessionStore = config.sessionStore ?? new CloudflareSQLiteStore(this.sql);
105
+ this.runtime = new Runtime({
106
+ ...config,
107
+ hooks,
108
+ sessionStore,
109
+ });
110
+ }
111
+ async onMessage(connection, message) {
112
+ const payload = parsePayload(message);
113
+ if (!payload)
114
+ return;
115
+ if (payload.type === 'ping') {
116
+ connection.send(JSON.stringify({ type: 'pong' }));
117
+ return;
118
+ }
119
+ const input = payload.text ?? payload.message ?? payload.content;
120
+ if (typeof input !== 'string' || !input.trim()) {
121
+ connection.send(JSON.stringify({ type: 'error', error: 'Message content required' }));
122
+ return;
123
+ }
124
+ const sessionId = this.getSessionId(connection, payload);
125
+ try {
126
+ for await (const part of this.runtime.stream({
127
+ input,
128
+ sessionId,
129
+ userId: payload.userId,
130
+ })) {
131
+ this.sendPart(connection, part);
132
+ }
133
+ }
134
+ catch (error) {
135
+ connection.send(JSON.stringify({
136
+ type: 'error',
137
+ error: error.message,
138
+ }));
139
+ }
140
+ }
141
+ async onRequest(request) {
142
+ const url = new URL(request.url);
143
+ if (url.pathname.endsWith('/info')) {
144
+ return Response.json({
145
+ agentId: this.getContextId(),
146
+ runtimeReady: Boolean(this.runtime),
147
+ timestamp: Date.now(),
148
+ });
149
+ }
150
+ return super.onRequest(request);
151
+ }
152
+ }
153
+ //# sourceMappingURL=AriaFlowChatAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AriaFlowChatAgent.js","sourceRoot":"","sources":["../src/AriaFlowChatAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { AriaFlowChatAgent } from './AriaFlowChatAgent.js';
2
+ export type { AriaFlowChatPayload, AriaFlowRuntimeFactory } from './AriaFlowChatAgent.js';
3
+ export { CloudflareSQLiteStore } from './stores/CloudflareSQLiteStore.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { AriaFlowChatAgent } from './AriaFlowChatAgent.js';
2
+ export { CloudflareSQLiteStore } from './stores/CloudflareSQLiteStore.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Session, SessionStore } from '@ariaflowagents/core';
2
+ export declare class CloudflareSQLiteStore implements SessionStore {
3
+ private sql;
4
+ constructor(sql: any);
5
+ private init;
6
+ get(id: string): Promise<Session | null>;
7
+ save(session: Session): Promise<void>;
8
+ delete(id: string): Promise<void>;
9
+ list(userId?: string): Promise<Session[]>;
10
+ cleanup(maxAgeMs: number): Promise<number>;
11
+ }
12
+ //# sourceMappingURL=CloudflareSQLiteStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareSQLiteStore.d.ts","sourceRoot":"","sources":["../../src/stores/CloudflareSQLiteStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAiClE,qBAAa,qBAAsB,YAAW,YAAY;IAC5C,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,GAAG;IAI5B,OAAO,CAAC,IAAI;IAUN,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAaxC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAmBzC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAajD"}
@@ -0,0 +1,99 @@
1
+ function reviveSession(raw) {
2
+ const session = { ...raw };
3
+ session.createdAt = new Date(session.createdAt);
4
+ session.updatedAt = new Date(session.updatedAt);
5
+ session.handoffHistory = (session.handoffHistory ?? []).map(record => ({
6
+ ...record,
7
+ timestamp: new Date(record.timestamp),
8
+ }));
9
+ if (session.metadata) {
10
+ session.metadata = {
11
+ ...session.metadata,
12
+ createdAt: new Date(session.metadata.createdAt),
13
+ lastActiveAt: new Date(session.metadata.lastActiveAt),
14
+ handoffHistory: (session.metadata.handoffHistory ?? []).map(record => ({
15
+ ...record,
16
+ timestamp: new Date(record.timestamp),
17
+ })),
18
+ };
19
+ }
20
+ session.agentStates = Object.fromEntries(Object.entries(session.agentStates ?? {}).map(([agentId, state]) => [
21
+ agentId,
22
+ {
23
+ ...state,
24
+ lastActive: new Date(state.lastActive),
25
+ },
26
+ ]));
27
+ return session;
28
+ }
29
+ export class CloudflareSQLiteStore {
30
+ sql;
31
+ constructor(sql) {
32
+ this.sql = sql;
33
+ this.init();
34
+ }
35
+ init() {
36
+ this.sql `
37
+ CREATE TABLE IF NOT EXISTS ariaflow_sessions (
38
+ id TEXT PRIMARY KEY,
39
+ data TEXT NOT NULL,
40
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
41
+ )
42
+ `;
43
+ }
44
+ async get(id) {
45
+ const rows = this.sql `SELECT data FROM ariaflow_sessions WHERE id = ${id}`;
46
+ if (rows && rows.length > 0) {
47
+ try {
48
+ return reviveSession(JSON.parse(rows[0].data));
49
+ }
50
+ catch (error) {
51
+ console.error('Failed to parse session data from SQLite', error);
52
+ return null;
53
+ }
54
+ }
55
+ return null;
56
+ }
57
+ async save(session) {
58
+ const data = JSON.stringify(session);
59
+ this.sql `
60
+ INSERT INTO ariaflow_sessions (id, data, updated_at)
61
+ VALUES (${session.id}, ${data}, CURRENT_TIMESTAMP)
62
+ ON CONFLICT(id) DO UPDATE SET
63
+ data = excluded.data,
64
+ updated_at = excluded.updated_at
65
+ `;
66
+ }
67
+ async delete(id) {
68
+ this.sql `DELETE FROM ariaflow_sessions WHERE id = ${id}`;
69
+ }
70
+ async list(userId) {
71
+ const rows = (this.sql `SELECT data FROM ariaflow_sessions` ?? []);
72
+ const sessions = rows
73
+ .map(row => {
74
+ try {
75
+ return reviveSession(JSON.parse(row.data));
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ })
81
+ .filter((session) => session !== null);
82
+ if (!userId) {
83
+ return sessions;
84
+ }
85
+ return sessions.filter((session) => session.userId === userId);
86
+ }
87
+ async cleanup(maxAgeMs) {
88
+ const cutoff = new Date(Date.now() - maxAgeMs).toISOString();
89
+ const result = this.sql `
90
+ DELETE FROM ariaflow_sessions
91
+ WHERE updated_at < ${cutoff}
92
+ `;
93
+ if (typeof result?.changes === 'number') {
94
+ return result.changes;
95
+ }
96
+ return 0;
97
+ }
98
+ }
99
+ //# sourceMappingURL=CloudflareSQLiteStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareSQLiteStore.js","sourceRoot":"","sources":["../../src/stores/CloudflareSQLiteStore.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@ariaflowagents/cf-agent",
3
+ "version": "0.1.0",
4
+ "description": "Cloudflare Agents base class for hosting AriaFlow Runtime on Durable Objects",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "agents": "^0.3.5"
16
+ },
17
+ "peerDependencies": {
18
+ "@ariaflowagents/core": "^0.1.0",
19
+ "agents": "^0.3.5"
20
+ },
21
+ "devDependencies": {
22
+ "@ariaflowagents/core": "file:../ariaflow-core",
23
+ "agents": "^0.3.5",
24
+ "typescript": "^5.3.0"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc -p tsconfig.json",
28
+ "clean": "rm -rf dist",
29
+ "prepublishOnly": "npm run build"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md"
37
+ ]
38
+ }