aether-server 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.
@@ -0,0 +1,28 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ import { AetherConfig, Aether } from 'aether-core';
3
+
4
+ interface ServerConfig {
5
+ /** Port to listen on */
6
+ port?: number;
7
+ /** Host to bind to */
8
+ host?: string;
9
+ /** CORS origin configuration */
10
+ corsOrigin?: string | string[] | boolean;
11
+ /** Aether configuration */
12
+ aether: AetherConfig;
13
+ /** Enable request logging */
14
+ logging?: boolean;
15
+ /** API key for authentication (optional) */
16
+ apiKey?: string;
17
+ }
18
+
19
+ declare module 'fastify' {
20
+ interface FastifyInstance {
21
+ aether: Aether;
22
+ }
23
+ }
24
+ declare function createServer(config: ServerConfig): Promise<FastifyInstance>;
25
+
26
+ declare function startServer(config: ServerConfig): Promise<void>;
27
+
28
+ export { type ServerConfig, createServer, startServer };
package/dist/index.js ADDED
@@ -0,0 +1,274 @@
1
+ // src/app.ts
2
+ import Fastify from "fastify";
3
+ import cors from "@fastify/cors";
4
+ import websocket from "@fastify/websocket";
5
+ import { Aether } from "aether-core";
6
+
7
+ // src/config.ts
8
+ function getDefaultConfig() {
9
+ return {
10
+ port: parseInt(process.env["PORT"] ?? "3000", 10),
11
+ host: process.env["HOST"] ?? "0.0.0.0",
12
+ corsOrigin: process.env["CORS_ORIGIN"] ?? true,
13
+ logging: process.env["NODE_ENV"] !== "test"
14
+ };
15
+ }
16
+
17
+ // src/routes/memory.ts
18
+ import { z } from "zod";
19
+ var addMemorySchema = z.object({
20
+ content: z.string().min(1),
21
+ actor: z.string().optional(),
22
+ action: z.string().optional(),
23
+ context: z.record(z.unknown()).optional()
24
+ });
25
+ var querySchema = z.object({
26
+ q: z.string().min(1),
27
+ actor: z.string().optional(),
28
+ type: z.enum(["semantic", "temporal", "relational", "hybrid"]).optional(),
29
+ limit: z.coerce.number().min(1).max(100).optional(),
30
+ threshold: z.coerce.number().min(0).max(1).optional()
31
+ });
32
+ var batchAddSchema = z.object({
33
+ events: z.array(addMemorySchema).min(1).max(100)
34
+ });
35
+ var memoryRoutes = async (fastify) => {
36
+ fastify.post("/memory", async (request, reply) => {
37
+ const result = addMemorySchema.safeParse(request.body);
38
+ if (!result.success) {
39
+ return reply.code(400).send({ error: "Invalid request", details: result.error.issues });
40
+ }
41
+ const { content, actor, action, context } = result.data;
42
+ const event = await fastify.aether.add({ content, actor, action, context });
43
+ return reply.code(201).send(event);
44
+ });
45
+ fastify.get("/memory", async (request, reply) => {
46
+ const result = querySchema.safeParse(request.query);
47
+ if (!result.success) {
48
+ return reply.code(400).send({ error: "Invalid query", details: result.error.issues });
49
+ }
50
+ const { q, actor, type, limit, threshold } = result.data;
51
+ const events = await fastify.aether.retrieve(q, {
52
+ actor,
53
+ retrievalType: type,
54
+ limit: limit ?? 10,
55
+ threshold
56
+ });
57
+ return events;
58
+ });
59
+ fastify.get("/memory/:id", async (request, reply) => {
60
+ const event = await fastify.aether.get(request.params.id);
61
+ if (!event) {
62
+ return reply.code(404).send({ error: "Memory not found" });
63
+ }
64
+ return event;
65
+ });
66
+ fastify.delete("/memory/:id", async (request, reply) => {
67
+ const deleted = await fastify.aether.delete(request.params.id);
68
+ if (!deleted) {
69
+ return reply.code(404).send({ error: "Memory not found" });
70
+ }
71
+ return { success: true };
72
+ });
73
+ fastify.post("/memory/batch", async (request, reply) => {
74
+ const result = batchAddSchema.safeParse(request.body);
75
+ if (!result.success) {
76
+ return reply.code(400).send({ error: "Invalid request", details: result.error.issues });
77
+ }
78
+ const events = await fastify.aether.addBatch(result.data.events);
79
+ return reply.code(201).send(events);
80
+ });
81
+ fastify.get(
82
+ "/history/:actor",
83
+ async (request) => {
84
+ const limit = request.query.limit ? parseInt(request.query.limit, 10) : 20;
85
+ const events = await fastify.aether.getHistory(request.params.actor, limit);
86
+ return events;
87
+ }
88
+ );
89
+ fastify.post("/search", async (request, reply) => {
90
+ const body = request.body;
91
+ if (!body || typeof body !== "object") {
92
+ return reply.code(400).send({ error: "Invalid request body" });
93
+ }
94
+ try {
95
+ const events = await fastify.aether.search({
96
+ semantic: body["semantic"],
97
+ temporal: body["temporal"],
98
+ relational: body["relational"],
99
+ limit: body["limit"] ?? 10,
100
+ combineStrategy: body["combineStrategy"]
101
+ });
102
+ return events;
103
+ } catch (err) {
104
+ return reply.code(400).send({ error: String(err) });
105
+ }
106
+ });
107
+ fastify.get("/stats", async () => {
108
+ return fastify.aether.stats();
109
+ });
110
+ };
111
+
112
+ // src/routes/health.ts
113
+ var healthRoutes = async (fastify) => {
114
+ fastify.get("/health", async (_request, _reply) => {
115
+ const stats = await fastify.aether.stats();
116
+ return {
117
+ status: "ok",
118
+ version: "0.1.0",
119
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
120
+ storage: stats.storageAdapter,
121
+ embeddings: stats.embeddingProvider,
122
+ events: stats.totalEvents
123
+ };
124
+ });
125
+ };
126
+
127
+ // src/websocket/handler.ts
128
+ var wsHandler = async (fastify) => {
129
+ const clients = /* @__PURE__ */ new Set();
130
+ const unsubscribe = fastify.aether.subscribe((event) => {
131
+ const message = JSON.stringify({
132
+ type: "memory:added",
133
+ data: event
134
+ });
135
+ for (const client of clients) {
136
+ if (client.readyState === 1) {
137
+ client.send(message);
138
+ }
139
+ }
140
+ });
141
+ fastify.addHook("onClose", () => {
142
+ unsubscribe();
143
+ clients.clear();
144
+ });
145
+ fastify.get("/ws", { websocket: true }, (connection) => {
146
+ const socket = connection.socket;
147
+ clients.add(socket);
148
+ socket.send(
149
+ JSON.stringify({
150
+ type: "connected",
151
+ data: { message: "Connected to Aether WebSocket" }
152
+ })
153
+ );
154
+ socket.on("message", async (rawMessage) => {
155
+ try {
156
+ const message = JSON.parse(rawMessage.toString());
157
+ switch (message.type) {
158
+ case "ping":
159
+ socket.send(JSON.stringify({ type: "pong" }));
160
+ break;
161
+ case "subscribe":
162
+ socket.send(
163
+ JSON.stringify({
164
+ type: "subscribed",
165
+ data: { message: "Subscribed to memory events" }
166
+ })
167
+ );
168
+ break;
169
+ case "add":
170
+ if (message.data && typeof message.data === "object") {
171
+ const input = message.data;
172
+ if (input.content) {
173
+ const event = await fastify.aether.add({
174
+ content: input.content,
175
+ actor: input.actor,
176
+ context: input.context
177
+ });
178
+ socket.send(
179
+ JSON.stringify({
180
+ type: "memory:added",
181
+ data: event
182
+ })
183
+ );
184
+ }
185
+ }
186
+ break;
187
+ default:
188
+ socket.send(
189
+ JSON.stringify({
190
+ type: "error",
191
+ data: { message: `Unknown message type: ${message.type}` }
192
+ })
193
+ );
194
+ }
195
+ } catch (err) {
196
+ socket.send(
197
+ JSON.stringify({
198
+ type: "error",
199
+ data: { message: "Invalid message format" }
200
+ })
201
+ );
202
+ }
203
+ });
204
+ socket.on("close", () => {
205
+ clients.delete(socket);
206
+ });
207
+ });
208
+ };
209
+
210
+ // src/app.ts
211
+ async function createServer(config) {
212
+ const mergedConfig = { ...getDefaultConfig(), ...config };
213
+ const fastify = Fastify({
214
+ logger: mergedConfig.logging ? {
215
+ transport: {
216
+ target: "pino-pretty",
217
+ options: {
218
+ translateTime: "HH:MM:ss Z",
219
+ ignore: "pid,hostname"
220
+ }
221
+ }
222
+ } : false
223
+ });
224
+ await fastify.register(cors, {
225
+ origin: mergedConfig.corsOrigin,
226
+ methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
227
+ });
228
+ await fastify.register(websocket);
229
+ const aether = new Aether(config.aether);
230
+ await aether.initialize();
231
+ fastify.decorate("aether", aether);
232
+ if (mergedConfig.apiKey) {
233
+ fastify.addHook("onRequest", async (request, reply) => {
234
+ if (request.url === "/health") return;
235
+ const authHeader = request.headers.authorization;
236
+ if (!authHeader || authHeader !== `Bearer ${mergedConfig.apiKey}`) {
237
+ reply.code(401).send({ error: "Unauthorized" });
238
+ }
239
+ });
240
+ }
241
+ await fastify.register(healthRoutes);
242
+ await fastify.register(memoryRoutes, { prefix: "/api/v1" });
243
+ await fastify.register(wsHandler);
244
+ fastify.addHook("onClose", async () => {
245
+ await aether.close();
246
+ });
247
+ return fastify;
248
+ }
249
+
250
+ // src/start.ts
251
+ async function startServer(config) {
252
+ const server = await createServer(config);
253
+ const port = config.port ?? 3e3;
254
+ const host = config.host ?? "0.0.0.0";
255
+ try {
256
+ await server.listen({ port, host });
257
+ console.log(`Aether server listening on http://${host}:${port}`);
258
+ } catch (err) {
259
+ server.log.error(err);
260
+ process.exit(1);
261
+ }
262
+ const shutdown = async () => {
263
+ console.log("\nShutting down...");
264
+ await server.close();
265
+ process.exit(0);
266
+ };
267
+ process.on("SIGINT", shutdown);
268
+ process.on("SIGTERM", shutdown);
269
+ }
270
+ export {
271
+ createServer,
272
+ startServer
273
+ };
274
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app.ts","../src/config.ts","../src/routes/memory.ts","../src/routes/health.ts","../src/websocket/handler.ts","../src/start.ts"],"sourcesContent":["import Fastify, { type FastifyInstance } from 'fastify';\nimport cors from '@fastify/cors';\nimport websocket from '@fastify/websocket';\nimport { Aether } from 'aether-core';\nimport { type ServerConfig, getDefaultConfig } from './config.js';\nimport { memoryRoutes } from './routes/memory.js';\nimport { healthRoutes } from './routes/health.js';\nimport { wsHandler } from './websocket/handler.js';\n\ndeclare module 'fastify' {\n interface FastifyInstance {\n aether: Aether;\n }\n}\n\nexport async function createServer(config: ServerConfig): Promise<FastifyInstance> {\n const mergedConfig = { ...getDefaultConfig(), ...config };\n\n const fastify = Fastify({\n logger: mergedConfig.logging\n ? {\n transport: {\n target: 'pino-pretty',\n options: {\n translateTime: 'HH:MM:ss Z',\n ignore: 'pid,hostname',\n },\n },\n }\n : false,\n });\n\n // Register plugins\n await fastify.register(cors, {\n origin: mergedConfig.corsOrigin,\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n });\n\n await fastify.register(websocket);\n\n // Initialize Aether\n const aether = new Aether(config.aether);\n await aether.initialize();\n\n // Decorate fastify with aether instance\n fastify.decorate('aether', aether);\n\n // Optional API key authentication\n if (mergedConfig.apiKey) {\n fastify.addHook('onRequest', async (request, reply) => {\n // Skip auth for health check\n if (request.url === '/health') return;\n\n const authHeader = request.headers.authorization;\n if (!authHeader || authHeader !== `Bearer ${mergedConfig.apiKey}`) {\n reply.code(401).send({ error: 'Unauthorized' });\n }\n });\n }\n\n // Register routes\n await fastify.register(healthRoutes);\n await fastify.register(memoryRoutes, { prefix: '/api/v1' });\n\n // WebSocket for real-time updates\n await fastify.register(wsHandler);\n\n // Cleanup on close\n fastify.addHook('onClose', async () => {\n await aether.close();\n });\n\n return fastify;\n}\n","import type { AetherConfig } from 'aether-core';\n\nexport interface ServerConfig {\n /** Port to listen on */\n port?: number;\n /** Host to bind to */\n host?: string;\n /** CORS origin configuration */\n corsOrigin?: string | string[] | boolean;\n /** Aether configuration */\n aether: AetherConfig;\n /** Enable request logging */\n logging?: boolean;\n /** API key for authentication (optional) */\n apiKey?: string;\n}\n\nexport function getDefaultConfig(): Partial<ServerConfig> {\n return {\n port: parseInt(process.env['PORT'] ?? '3000', 10),\n host: process.env['HOST'] ?? '0.0.0.0',\n corsOrigin: process.env['CORS_ORIGIN'] ?? true,\n logging: process.env['NODE_ENV'] !== 'test',\n };\n}\n","import type { FastifyPluginAsync } from 'fastify';\nimport { z } from 'zod';\nimport type { RetrievalType } from 'aether-core';\n\n// Request schemas\nconst addMemorySchema = z.object({\n content: z.string().min(1),\n actor: z.string().optional(),\n action: z.string().optional(),\n context: z.record(z.unknown()).optional(),\n});\n\nconst querySchema = z.object({\n q: z.string().min(1),\n actor: z.string().optional(),\n type: z.enum(['semantic', 'temporal', 'relational', 'hybrid']).optional(),\n limit: z.coerce.number().min(1).max(100).optional(),\n threshold: z.coerce.number().min(0).max(1).optional(),\n});\n\nconst batchAddSchema = z.object({\n events: z.array(addMemorySchema).min(1).max(100),\n});\n\nexport const memoryRoutes: FastifyPluginAsync = async (fastify) => {\n // Add a single memory\n fastify.post('/memory', async (request, reply) => {\n const result = addMemorySchema.safeParse(request.body);\n if (!result.success) {\n return reply.code(400).send({ error: 'Invalid request', details: result.error.issues });\n }\n\n const { content, actor, action, context } = result.data;\n const event = await fastify.aether.add({ content, actor, action, context });\n\n return reply.code(201).send(event);\n });\n\n // Query memories\n fastify.get('/memory', async (request, reply) => {\n const result = querySchema.safeParse(request.query);\n if (!result.success) {\n return reply.code(400).send({ error: 'Invalid query', details: result.error.issues });\n }\n\n const { q, actor, type, limit, threshold } = result.data;\n const events = await fastify.aether.retrieve(q, {\n actor,\n retrievalType: type as RetrievalType | undefined,\n limit: limit ?? 10,\n threshold,\n });\n\n return events;\n });\n\n // Get memory by ID\n fastify.get<{ Params: { id: string } }>('/memory/:id', async (request, reply) => {\n const event = await fastify.aether.get(request.params.id);\n\n if (!event) {\n return reply.code(404).send({ error: 'Memory not found' });\n }\n\n return event;\n });\n\n // Delete memory by ID\n fastify.delete<{ Params: { id: string } }>('/memory/:id', async (request, reply) => {\n const deleted = await fastify.aether.delete(request.params.id);\n\n if (!deleted) {\n return reply.code(404).send({ error: 'Memory not found' });\n }\n\n return { success: true };\n });\n\n // Batch add memories\n fastify.post('/memory/batch', async (request, reply) => {\n const result = batchAddSchema.safeParse(request.body);\n if (!result.success) {\n return reply.code(400).send({ error: 'Invalid request', details: result.error.issues });\n }\n\n const events = await fastify.aether.addBatch(result.data.events);\n return reply.code(201).send(events);\n });\n\n // Get actor history\n fastify.get<{ Params: { actor: string }; Querystring: { limit?: string } }>(\n '/history/:actor',\n async (request) => {\n const limit = request.query.limit ? parseInt(request.query.limit, 10) : 20;\n const events = await fastify.aether.getHistory(request.params.actor, limit);\n return events;\n }\n );\n\n // Advanced search\n fastify.post('/search', async (request, reply) => {\n const body = request.body as Record<string, unknown>;\n\n // Basic validation\n if (!body || typeof body !== 'object') {\n return reply.code(400).send({ error: 'Invalid request body' });\n }\n\n try {\n const events = await fastify.aether.search({\n semantic: body['semantic'] as { query: string; weight?: number } | undefined,\n temporal: body['temporal'] as { actor: string; recency?: number; weight?: number } | undefined,\n relational: body['relational'] as { contextKeys: string[]; values: unknown[]; weight?: number } | undefined,\n limit: (body['limit'] as number) ?? 10,\n combineStrategy: body['combineStrategy'] as 'union' | 'intersection' | 'weighted' | undefined,\n });\n return events;\n } catch (err) {\n return reply.code(400).send({ error: String(err) });\n }\n });\n\n // Get statistics\n fastify.get('/stats', async () => {\n return fastify.aether.stats();\n });\n};\n","import type { FastifyPluginAsync } from 'fastify';\n\nexport const healthRoutes: FastifyPluginAsync = async (fastify) => {\n fastify.get('/health', async (_request, _reply) => {\n const stats = await fastify.aether.stats();\n\n return {\n status: 'ok',\n version: '0.1.0',\n timestamp: new Date().toISOString(),\n storage: stats.storageAdapter,\n embeddings: stats.embeddingProvider,\n events: stats.totalEvents,\n };\n });\n};\n","import type { FastifyPluginAsync } from 'fastify';\nimport type { WebSocket } from 'ws';\nimport type { MemoryEvent } from 'aether-core';\n\ninterface WebSocketMessage {\n type: string;\n data?: unknown;\n}\n\nexport const wsHandler: FastifyPluginAsync = async (fastify) => {\n // Track connected clients\n const clients = new Set<WebSocket>();\n\n // Subscribe to aether events and broadcast to all clients\n const unsubscribe = fastify.aether.subscribe((event: MemoryEvent) => {\n const message = JSON.stringify({\n type: 'memory:added',\n data: event,\n });\n\n for (const client of clients) {\n if (client.readyState === 1) {\n // WebSocket.OPEN\n client.send(message);\n }\n }\n });\n\n // Cleanup on server close\n fastify.addHook('onClose', () => {\n unsubscribe();\n clients.clear();\n });\n\n // WebSocket route\n fastify.get('/ws', { websocket: true }, (connection) => {\n const socket = connection.socket;\n clients.add(socket);\n\n // Send welcome message\n socket.send(\n JSON.stringify({\n type: 'connected',\n data: { message: 'Connected to Aether WebSocket' },\n })\n );\n\n // Handle incoming messages\n socket.on('message', async (rawMessage) => {\n try {\n const message = JSON.parse(rawMessage.toString()) as WebSocketMessage;\n\n switch (message.type) {\n case 'ping':\n socket.send(JSON.stringify({ type: 'pong' }));\n break;\n\n case 'subscribe':\n // Client is already subscribed via the global subscription\n socket.send(\n JSON.stringify({\n type: 'subscribed',\n data: { message: 'Subscribed to memory events' },\n })\n );\n break;\n\n case 'add':\n // Allow adding memories via WebSocket\n if (message.data && typeof message.data === 'object') {\n const input = message.data as { content?: string; actor?: string; context?: Record<string, unknown> };\n if (input.content) {\n const event = await fastify.aether.add({\n content: input.content,\n actor: input.actor,\n context: input.context,\n });\n socket.send(\n JSON.stringify({\n type: 'memory:added',\n data: event,\n })\n );\n }\n }\n break;\n\n default:\n socket.send(\n JSON.stringify({\n type: 'error',\n data: { message: `Unknown message type: ${message.type}` },\n })\n );\n }\n } catch (err) {\n socket.send(\n JSON.stringify({\n type: 'error',\n data: { message: 'Invalid message format' },\n })\n );\n }\n });\n\n // Handle disconnect\n socket.on('close', () => {\n clients.delete(socket);\n });\n });\n};\n","import { createServer } from './app.js';\nimport type { ServerConfig } from './config.js';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const server = await createServer(config);\n\n const port = config.port ?? 3000;\n const host = config.host ?? '0.0.0.0';\n\n try {\n await server.listen({ port, host });\n console.log(`Aether server listening on http://${host}:${port}`);\n } catch (err) {\n server.log.error(err);\n process.exit(1);\n }\n\n // Handle graceful shutdown\n const shutdown = async () => {\n console.log('\\nShutting down...');\n await server.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "aether-server",
3
+ "version": "0.1.0",
4
+ "description": "REST/WebSocket server for Aether Memory Framework",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "dependencies": {
18
+ "fastify": "^4.25.0",
19
+ "@fastify/cors": "^9.0.0",
20
+ "@fastify/websocket": "^9.0.0",
21
+ "zod": "^3.22.0",
22
+ "aether-core": "0.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.10.0",
26
+ "@types/ws": "^8.5.0",
27
+ "tsup": "^8.0.0",
28
+ "typescript": "^5.3.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=18.0.0"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "keywords": [
37
+ "aether",
38
+ "server",
39
+ "rest",
40
+ "api",
41
+ "llm",
42
+ "memory"
43
+ ],
44
+ "license": "MIT",
45
+ "scripts": {
46
+ "build": "tsup",
47
+ "dev": "tsup --watch",
48
+ "start": "node dist/index.js",
49
+ "typecheck": "tsc --noEmit",
50
+ "clean": "rm -rf dist .turbo"
51
+ }
52
+ }