@memstack/server 0.7.3 → 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/README.md CHANGED
@@ -7,7 +7,7 @@ REST API server for MemStack — self-hostable agent memory. Runs on Node.js 22+
7
7
  ```bash
8
8
  npm install @memstack/server
9
9
  # or via Docker:
10
- docker pull ghcr.io/isiomac/memstack-server:0.7.2
10
+ docker pull ghcr.io/isiomac/memstack-server:0.8.0
11
11
  ```
12
12
 
13
13
  ## Quick Start
@@ -125,7 +125,7 @@ docker run -p 3000:3000 \
125
125
  -e MEMSTACK_STORAGE=postgres \
126
126
  -e DATABASE_URL=postgresql://... \
127
127
  -e OPENAI_API_KEY=sk-... \
128
- ghcr.io/isiomac/memstack-server:0.7.2
128
+ ghcr.io/isiomac/memstack-server:0.8.0
129
129
  ```
130
130
 
131
131
  ## License
package/dist/index.js CHANGED
@@ -5,56 +5,61 @@ import { z } from 'zod';
5
5
  import { zodToJsonSchema } from 'zod-to-json-schema';
6
6
 
7
7
  // src/index.ts
8
- function buildLLMAdapter() {
9
- if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {
8
+ function isMissingModule(error) {
9
+ const code = error?.code;
10
+ return code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND";
11
+ }
12
+ function buildLLMAdapter(env) {
13
+ if (!env.ANTHROPIC_API_KEY && !env.OPENAI_API_KEY) {
10
14
  throw new Error("At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set");
11
15
  }
12
- if (process.env.ANTHROPIC_API_KEY) {
13
- return new AnthropicLLMAdapter({ apiKey: process.env.ANTHROPIC_API_KEY });
16
+ if (env.ANTHROPIC_API_KEY) {
17
+ return new AnthropicLLMAdapter({ apiKey: env.ANTHROPIC_API_KEY, defaultModel: env.MEMSTACK_LLM_MODEL });
14
18
  }
15
19
  return new OpenAILLMAdapter({
16
- apiKey: process.env.OPENAI_API_KEY ?? "",
17
- baseURL: process.env.MEMSTACK_OPENAI_BASE_URL,
18
- defaultModel: process.env.MEMSTACK_LLM_MODEL
20
+ apiKey: env.OPENAI_API_KEY ?? "",
21
+ baseURL: env.MEMSTACK_OPENAI_BASE_URL,
22
+ defaultModel: env.MEMSTACK_LLM_MODEL
19
23
  });
20
24
  }
21
- function buildEmbeddingAdapter() {
22
- if (process.env.MEMSTACK_OPENAI_BASE_URL) return void 0;
23
- if (process.env.OPENAI_API_KEY) {
24
- return new OpenAIEmbeddingAdapter({ apiKey: process.env.OPENAI_API_KEY });
25
+ function buildEmbeddingAdapter(env) {
26
+ if (env.MEMSTACK_OPENAI_BASE_URL) return void 0;
27
+ if (env.OPENAI_API_KEY) {
28
+ return new OpenAIEmbeddingAdapter({ apiKey: env.OPENAI_API_KEY });
25
29
  }
26
30
  return void 0;
27
31
  }
28
- async function buildStorageAdapter() {
29
- const storage = process.env.MEMSTACK_STORAGE ?? "memory";
32
+ async function buildStorageAdapter(env) {
33
+ const storage = env.MEMSTACK_STORAGE ?? "memory";
30
34
  switch (storage) {
31
35
  case "memory":
32
36
  return new InMemoryStorageAdapter();
33
37
  case "markdown":
34
38
  return new MarkdownStorageAdapter({
35
- dir: process.env.MEMSTACK_DIR ?? "./memories"
39
+ dir: env.MEMSTACK_DIR ?? "./memories"
36
40
  });
37
41
  case "disk":
38
42
  return new DiskStorageAdapter({
39
- storageDir: process.env.MEMSTACK_DIR ?? "./memstack-data"
43
+ storageDir: env.MEMSTACK_DIR ?? "./memstack-data"
40
44
  });
41
45
  case "postgres":
42
- if (!process.env.DATABASE_URL) {
46
+ if (!env.DATABASE_URL) {
43
47
  throw new Error("postgres storage requires DATABASE_URL");
44
48
  }
45
49
  return new PostgresStorageAdapter({
46
- connectionString: process.env.DATABASE_URL
50
+ connectionString: env.DATABASE_URL
47
51
  });
48
52
  case "sqlite": {
49
53
  try {
50
54
  const BetterSqlite3 = await import('better-sqlite3');
51
55
  const db = new BetterSqlite3.default(
52
- process.env.SQLITE_PATH ?? "./memstack.db"
56
+ env.SQLITE_PATH ?? "./memstack.db"
53
57
  );
54
58
  return new SQLiteStorageAdapter({ db });
55
- } catch {
59
+ } catch (error) {
60
+ if (!isMissingModule(error)) throw error;
56
61
  throw new Error(
57
- "SQLite requires better-sqlite3. Install: npm install better-sqlite3"
62
+ "SQLite requires better-sqlite3. Install: npm install better-sqlite3@^11.10.0"
58
63
  );
59
64
  }
60
65
  }
@@ -62,12 +67,13 @@ async function buildStorageAdapter() {
62
67
  try {
63
68
  const Redis = await import('ioredis');
64
69
  const client = new Redis.default(
65
- process.env.REDIS_URL ?? "redis://localhost:6379"
70
+ env.REDIS_URL ?? "redis://localhost:6379"
66
71
  );
67
72
  return new RedisStorageAdapter({ redis: client });
68
- } catch {
73
+ } catch (error) {
74
+ if (!isMissingModule(error)) throw error;
69
75
  throw new Error(
70
- "Redis requires ioredis. Install: npm install ioredis"
76
+ "Redis requires ioredis. Install: npm install ioredis@^5.11.1"
71
77
  );
72
78
  }
73
79
  }
@@ -76,11 +82,14 @@ async function buildStorageAdapter() {
76
82
  }
77
83
  }
78
84
  async function loadConfigFromEnv() {
79
- const llm = buildLLMAdapter();
80
- const embedding = buildEmbeddingAdapter();
81
- const storage = await buildStorageAdapter();
82
- const embedOnStore = process.env.MEMSTACK_EMBED_ON_STORE !== "false";
83
- const defaultActorId = process.env.MEMSTACK_ACTOR ?? "default";
85
+ return buildConfig(process.env);
86
+ }
87
+ async function buildConfig(env) {
88
+ const llm = buildLLMAdapter(env);
89
+ const embedding = buildEmbeddingAdapter(env);
90
+ const storage = await buildStorageAdapter(env);
91
+ const embedOnStore = env.MEMSTACK_EMBED_ON_STORE !== "false";
92
+ const defaultActorId = env.MEMSTACK_ACTOR ?? "default";
84
93
  return {
85
94
  config: { llm, embedding, storage, defaults: { embedOnStore } },
86
95
  defaultActorId
@@ -92,7 +101,7 @@ async function loadConfig() {
92
101
  const { config } = await loadConfigFromEnv();
93
102
  return config;
94
103
  }
95
- var MemoryTypeSchema = z.enum(["interaction", "summary", "observation", "fact", "reflection"]);
104
+ var MemoryTypeSchema = z.enum(["interaction", "summary", "observation", "fact", "reflection", "preference", "decision", "instruction"]);
96
105
  var isoDate = z.string().datetime({ offset: true }).or(z.string().date()).transform((s) => new Date(s));
97
106
  var StoreMemorySchema = z.object({
98
107
  actorId: z.string().min(1),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../config-env/src/index.ts","../src/config.ts","../src/schemas.ts","../src/openapi.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { MemStackConfig, StorageProvider, LLMProvider, EmbeddingProvider } from \"@memstack/core\";\nimport {\n InMemoryStorageAdapter,\n DiskStorageAdapter,\n MarkdownStorageAdapter,\n PostgresStorageAdapter,\n SQLiteStorageAdapter,\n RedisStorageAdapter,\n OpenAILLMAdapter,\n AnthropicLLMAdapter,\n OpenAIEmbeddingAdapter,\n} from \"@memstack/core\";\n\nfunction buildLLMAdapter(): LLMProvider {\n if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {\n throw new Error(\"At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set\");\n }\n if (process.env.ANTHROPIC_API_KEY) {\n return new AnthropicLLMAdapter({ apiKey: process.env.ANTHROPIC_API_KEY });\n }\n return new OpenAILLMAdapter({\n apiKey: process.env.OPENAI_API_KEY ?? \"\",\n baseURL: process.env.MEMSTACK_OPENAI_BASE_URL,\n defaultModel: process.env.MEMSTACK_LLM_MODEL,\n });\n}\n\nfunction buildEmbeddingAdapter(): EmbeddingProvider | undefined {\n if (process.env.MEMSTACK_OPENAI_BASE_URL) return undefined;\n if (process.env.OPENAI_API_KEY) {\n return new OpenAIEmbeddingAdapter({ apiKey: process.env.OPENAI_API_KEY });\n }\n return undefined;\n}\n\nasync function buildStorageAdapter(): Promise<StorageProvider> {\n const storage = process.env.MEMSTACK_STORAGE ?? \"memory\";\n\n switch (storage) {\n case \"memory\":\n return new InMemoryStorageAdapter();\n\n case \"markdown\":\n return new MarkdownStorageAdapter({\n dir: process.env.MEMSTACK_DIR ?? \"./memories\",\n });\n\n case \"disk\":\n return new DiskStorageAdapter({\n storageDir: process.env.MEMSTACK_DIR ?? \"./memstack-data\",\n });\n\n case \"postgres\":\n if (!process.env.DATABASE_URL) {\n throw new Error(\"postgres storage requires DATABASE_URL\");\n }\n return new PostgresStorageAdapter({\n connectionString: process.env.DATABASE_URL,\n });\n\n case \"sqlite\": {\n try {\n // @ts-expect-error optional peer dep\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const db = new BetterSqlite3.default(\n process.env.SQLITE_PATH ?? \"./memstack.db\",\n );\n return new SQLiteStorageAdapter({ db: db as never });\n } catch {\n throw new Error(\n \"SQLite requires better-sqlite3. Install: npm install better-sqlite3\",\n );\n }\n }\n\n case \"redis\": {\n try {\n const Redis = await import(\"ioredis\");\n const client = new Redis.default(\n process.env.REDIS_URL ?? \"redis://localhost:6379\",\n );\n return new RedisStorageAdapter({ redis: client as never });\n } catch {\n throw new Error(\n \"Redis requires ioredis. Install: npm install ioredis\",\n );\n }\n }\n\n default:\n throw new Error(`Unknown MEMSTACK_STORAGE: \"${storage}\". Supported: memory, markdown, disk, postgres, sqlite, redis`);\n }\n}\n\nexport interface EnvConfigResult {\n config: MemStackConfig;\n /** From MEMSTACK_ACTOR, defaults to \"default\". Only meaningful for clients that scope work to one actor per process (e.g. the MCP server). */\n defaultActorId: string;\n}\n\n/**\n * Builds a MemStackConfig purely from environment variables. Shared by\n * @memstack/cli, @memstack/mcp, and @memstack/server so storage/LLM/embedding\n * wiring and env var behavior can't drift between the three entry points.\n */\nexport async function loadConfigFromEnv(): Promise<EnvConfigResult> {\n const llm = buildLLMAdapter();\n const embedding = buildEmbeddingAdapter();\n const storage = await buildStorageAdapter();\n const embedOnStore = process.env.MEMSTACK_EMBED_ON_STORE !== \"false\";\n const defaultActorId = process.env.MEMSTACK_ACTOR ?? \"default\";\n\n return {\n config: { llm, embedding, storage, defaults: { embedOnStore } },\n defaultActorId,\n };\n}\n","import type { MemStackConfig } from \"@memstack/core\";\nimport { loadConfigFromEnv } from \"@memstack/config-env\";\n\nexport async function loadConfig(): Promise<MemStackConfig> {\n const { config } = await loadConfigFromEnv();\n return config;\n}\n","import { z } from \"zod\";\n\nexport const MemoryTypeSchema = z.enum([\"interaction\", \"summary\", \"observation\", \"fact\", \"reflection\"]);\n\nconst isoDate = z.string().datetime({ offset: true }).or(z.string().date()).transform((s) => new Date(s));\n\nexport const StoreMemorySchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n embedding: z.array(z.number()).optional(),\n sourceId: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n id: z.string().optional(),\n});\n\nexport const BatchStoreSchema = z.object({\n memories: z.array(StoreMemorySchema).min(1),\n});\n\nexport const RetrieveSchema = z.object({\n actorId: z.string().optional(),\n query: z.string().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n tags: z.array(z.string()).optional(),\n limit: z.number().int().positive().optional(),\n strategy: z.enum([\"semantic\", \"hybrid\", \"recent\", \"important\"]).optional(),\n createdAfter: isoDate.optional(),\n createdBefore: isoDate.optional(),\n});\n\nexport const ContextSchema = z.object({\n actorId: z.string().min(1),\n maxTokens: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n retrieveStrategy: z.enum([\"recent\", \"important\", \"hybrid\"]).optional(),\n format: z.enum([\"markdown\", \"messages\"]).optional(),\n});\n\nexport const ProcessSchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n});\n\nexport const SummarizeSchema = z.object({\n actorId: z.string().optional(),\n olderThan: isoDate.optional(),\n skipMostRecent: z.number().int().nonnegative().optional(),\n targetCount: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n keepOriginals: z.boolean().optional(),\n chunkSize: z.number().int().positive().optional(),\n prompt: z.string().optional(),\n});\n\nexport interface RestPruneStrategy {\n type: \"byAge\" | \"byImportance\" | \"byCount\" | \"byType\" | \"compose\";\n actorId?: string;\n maxAge?: number;\n minImportance?: number;\n maxPerActor?: number;\n memoryTypes?: z.infer<typeof MemoryTypeSchema>[];\n strategies?: RestPruneStrategy[];\n}\n\n// \"custom\" prune (a JS predicate function) can't cross JSON, so it's excluded\n// from the REST-reachable type set — everything else in PruneStrategy is.\n//\n// actorId is optional in the schema (nested `strategies` entries don't need\n// it — only the top-level scan is ever actor-scoped) but the /v1/prune and\n// /v1/prune/dry-run route handlers reject a request that omits it at the top\n// level, since there's no \"current session actor\" to fall back on the way\n// the CLI/MCP surfaces have.\nexport const PruneStrategySchema: z.ZodType<RestPruneStrategy> = z.lazy(() =>\n z.object({\n type: z.enum([\"byAge\", \"byImportance\", \"byCount\", \"byType\", \"compose\"]),\n actorId: z.string().min(1).optional(),\n maxAge: z.number().nonnegative().optional(),\n minImportance: z.number().min(0).max(1).optional(),\n maxPerActor: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n strategies: z.array(PruneStrategySchema).optional(),\n }),\n);\n\nexport const MergeSchema = z.object({\n ids: z.array(z.string()).min(2),\n});\n\nexport const PurgeSchema = z.object({\n actorId: z.string().min(1),\n});\n\nexport const DeleteManySchema = z.object({\n ids: z.array(z.string()).min(1),\n});\n\nexport const ImportSchema = z.union([\n z.array(z.unknown()),\n z.object({\n version: z.number().optional(),\n memories: z.array(z.unknown()),\n exportedAt: z.string().optional(),\n }),\n]);\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\n\ninterface RouteDoc {\n method: \"get\" | \"post\" | \"delete\";\n path: string;\n summary: string;\n requestSchema?: z.ZodType;\n successStatus: number;\n}\n\nconst ROUTES: RouteDoc[] = [\n { method: \"post\", path: \"/v1/memories\", summary: \"Store a memory\", requestSchema: StoreMemorySchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/batch\", summary: \"Store multiple memories\", requestSchema: BatchStoreSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/retrieve\", summary: \"Retrieve memories\", requestSchema: RetrieveSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/context\", summary: \"Compile LLM-ready context\", requestSchema: ContextSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/count\", summary: \"Count memories matching filters\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/export\", summary: \"Export a memory snapshot\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/{id}\", summary: \"Get a memory by ID\", successStatus: 200 },\n { method: \"delete\", path: \"/v1/memories/{id}\", summary: \"Delete a memory by ID\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/delete-many\", summary: \"Delete multiple memories by ID\", requestSchema: DeleteManySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/purge\", summary: \"Delete all memories for an actor\", requestSchema: PurgeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/merge\", summary: \"Merge multiple memories into one\", requestSchema: MergeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/process\", summary: \"Store a memory with auto-enrichment\", requestSchema: ProcessSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/{id}/touch\", summary: \"Bump a memory's recency\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/import\", summary: \"Import a memory snapshot\", requestSchema: ImportSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/summarize\", summary: \"Compress old memories into a summary\", requestSchema: SummarizeSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/summarize/stream\", summary: \"Stream summarization via SSE\", successStatus: 200 },\n { method: \"post\", path: \"/v1/prune\", summary: \"Remove stale/low-value memories\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/prune/dry-run\", summary: \"Preview what a prune strategy would remove\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/stats/{actorId}\", summary: \"Memory diagnostics for an actor\", successStatus: 200 },\n { method: \"get\", path: \"/health\", summary: \"Health check\", successStatus: 200 },\n];\n\n/**\n * Hand-maintained route list, but request body shapes are generated from the\n * same zod schemas that validate incoming requests — one source of truth.\n */\nexport function buildOpenApiDocument(version: string): Record<string, unknown> {\n const paths: Record<string, Record<string, unknown>> = {};\n\n for (const route of ROUTES) {\n const pathItem = (paths[route.path] ??= {});\n const pathParams = [...route.path.matchAll(/\\{(\\w+)\\}/g)].map((m) => ({\n name: m[1],\n in: \"path\",\n required: true,\n schema: { type: \"string\" },\n }));\n\n pathItem[route.method] = {\n summary: route.summary,\n ...(pathParams.length ? { parameters: pathParams } : {}),\n ...(route.requestSchema\n ? {\n requestBody: {\n required: true,\n content: { \"application/json\": { schema: JSON.parse(JSON.stringify(zodToJsonSchema(route.requestSchema))) } },\n },\n }\n : {}),\n responses: {\n [String(route.successStatus)]: { description: \"Success\" },\n ...(route.requestSchema ? { \"400\": { description: \"Validation failed\" } } : {}),\n \"500\": { description: \"Internal error\" },\n },\n };\n }\n\n return {\n openapi: \"3.1.0\",\n info: {\n title: \"MemStack Server API\",\n version,\n description: \"REST API for MemStack — self-hostable agent memory. See https://github.com/isiomaC/memstack for the full guide.\",\n },\n servers: [{ url: \"/\" }],\n paths,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Hono, type Context } from \"hono\";\nimport { MemStack } from \"@memstack/core\";\nimport type { MemoryType, MemStackSnapshot } from \"@memstack/core\";\nimport type { z } from \"zod\";\nimport { loadConfig } from \"./config.js\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\nimport { buildOpenApiDocument } from \"./openapi.js\";\n\nconst pkg = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf-8\")) as { version: string };\n\nconst app = new Hono();\n\nlet _ms: MemStack | null = null;\nasync function getMs(): Promise<MemStack> {\n if (!_ms) {\n _ms = new MemStack(await loadConfig());\n }\n return _ms;\n}\n\ntype ParsedBody<T> = { ok: true; data: T } | { ok: false; response: Response };\n\nasync function parseBody<S extends z.ZodTypeAny>(c: Context, schema: S): Promise<ParsedBody<z.infer<S>>> {\n const raw = await c.req.json().catch(() => undefined);\n const result = schema.safeParse(raw);\n if (!result.success) {\n return { ok: false, response: c.json({ error: \"Validation failed\", issues: result.error.issues }, 400) };\n }\n return { ok: true, data: result.data };\n}\n\napp.use(\"*\", async (c, next) => {\n const apiKey = process.env.MEMSTACK_API_KEY;\n if (apiKey) {\n const auth = c.req.header(\"Authorization\");\n if (!auth || auth !== `Bearer ${apiKey}`) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n }\n await next();\n});\n\nconst requestCounts = new Map<string, { count: number; reset: number }>();\n\napp.use(\"*\", async (c, next) => {\n const rateLimit = parseInt(process.env.MEMSTACK_RATE_LIMIT ?? \"0\", 10);\n if (rateLimit <= 0) return next();\n\n const key = c.req.header(\"x-forwarded-for\") ?? \"anonymous\";\n const now = Date.now();\n const entry = requestCounts.get(key) ?? { count: 0, reset: now + 60000 };\n\n if (now > entry.reset) {\n entry.count = 1;\n entry.reset = now + 60000;\n } else {\n entry.count++;\n }\n\n requestCounts.set(key, entry);\n\n if (requestCounts.size > 10000) {\n for (const [k, v] of requestCounts) {\n if (now > v.reset) requestCounts.delete(k);\n }\n }\n\n if (entry.count > rateLimit) {\n return c.json({ error: \"Too many requests\" }, 429);\n }\n\n await next();\n});\n\napp.post(\"/v1/memories\", async (c) => {\n const parsed = await parseBody(c, StoreMemorySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.store(parsed.data);\n return c.json(memory, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/batch\", async (c) => {\n const parsed = await parseBody(c, BatchStoreSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.storeBatch(parsed.data.memories);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/retrieve\", async (c) => {\n const parsed = await parseBody(c, RetrieveSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const results = await (await getMs()).memory.retrieve(parsed.data);\n return c.json(results);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/context\", async (c) => {\n const parsed = await parseBody(c, ContextSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const ctx = await (await getMs()).memory.compileContext(parsed.data);\n return c.json({\n context: ctx.systemPrompt,\n tokenCount: ctx.tokenEstimate,\n memoryCount: ctx.recentMemories.length + ctx.importantMemories.length,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/count\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const memoryType = c.req.query(\"memoryType\");\n const minImportance = c.req.query(\"minImportance\");\n const count = await (await getMs()).memory.count({\n actorId,\n memoryType: memoryType as MemoryType | undefined,\n minImportance: minImportance ? parseFloat(minImportance) : undefined,\n });\n return c.json({ count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/export\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const snapshot = await (await getMs()).export(actorId);\n return c.json(snapshot);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/:id\", async (c) => {\n try {\n const memory = await (await getMs()).memory.get(c.req.param(\"id\"));\n if (!memory) return c.json({ error: \"Not found\" }, 404);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.delete(\"/v1/memories/:id\", async (c) => {\n try {\n const id = c.req.param(\"id\");\n const ms = await getMs();\n const existing = await ms.memory.get(id);\n if (!existing) return c.json({ deleted: false, error: \"Not found\" }, 404);\n await ms.memory.delete(id);\n return c.json({ deleted: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/delete-many\", async (c) => {\n const parsed = await parseBody(c, DeleteManySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const deleted = await (await getMs()).memory.deleteMany(parsed.data.ids);\n return c.json({ deleted });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/purge\", async (c) => {\n const parsed = await parseBody(c, PurgeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const count = await (await getMs()).memory.purgeActor(parsed.data.actorId);\n return c.json({ purged: count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/merge\", async (c) => {\n const parsed = await parseBody(c, MergeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.merge(parsed.data.ids);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/process\", async (c) => {\n const parsed = await parseBody(c, ProcessSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).process(parsed.data);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/:id/touch\", async (c) => {\n try {\n await (await getMs()).memory.touch(c.req.param(\"id\"));\n return c.json({ touched: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/import\", async (c) => {\n const parsed = await parseBody(c, ImportSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const body = parsed.data;\n const memories = Array.isArray(body) ? body : body.memories;\n const exportedAt = Array.isArray(body) ? new Date().toISOString() : (body.exportedAt ?? new Date().toISOString());\n // The snapshot's memories come from a prior export() call; we validate the\n // envelope shape above but trust the memory contents rather than re-validating\n // every field of every memory.\n const snapshot = { version: 1 as const, memories, exportedAt } as unknown as MemStackSnapshot;\n await (await getMs()).import(snapshot);\n return c.json({ imported: memories.length }, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/summarize\", async (c) => {\n const parsed = await parseBody(c, SummarizeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.summarize(parsed.data);\n return c.json({\n summarized: result.deletedCount,\n summaryId: result.summary.id,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to prune (scopes deletion to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.prune(parsed.data);\n return c.json({ pruned: result.count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune/dry-run\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to preview pruning (scopes the scan to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.dryRunPrune(parsed.data);\n return c.json(result);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/stats/:actorId\", async (c) => {\n try {\n const actorId = c.req.param(\"actorId\");\n const stats = await (await getMs()).memory.stats(actorId);\n return c.json(stats);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/summarize/stream\", async (c) => {\n const actorId = c.req.query(\"actorId\") ?? \"default\";\n const olderThan = c.req.query(\"olderThan\");\n const skipMostRecent = c.req.query(\"skipMostRecent\");\n const targetCount = c.req.query(\"targetCount\");\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n const ms = await getMs();\n const gen = ms.memory.summarizeStream({\n actorId,\n olderThan: olderThan ? new Date(olderThan) : undefined,\n skipMostRecent: skipMostRecent ? parseInt(skipMostRecent, 10) : undefined,\n targetCount: targetCount ? parseInt(targetCount, 10) : undefined,\n });\n\n for await (const { chunk, text } of gen) {\n const line = `data: ${JSON.stringify({ chunk, text })}\\n\\n`;\n controller.enqueue(new TextEncoder().encode(line));\n }\n controller.enqueue(new TextEncoder().encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify({ error: msg })}\\n\\n`));\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n});\n\napp.get(\"/health\", async (c) => {\n try {\n const status = await (await getMs()).health();\n return c.json({\n status: status.storage ? \"ok\" : \"degraded\",\n storage: status.storage ? \"connected\" : \"disconnected\",\n version: pkg.version,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/openapi.json\", (c) => c.json(buildOpenApiDocument(pkg.version)));\n\nsetInterval(() => {\n const now = Date.now();\n for (const [key, entry] of requestCounts) {\n if (now > entry.reset) requestCounts.delete(key);\n }\n}, 60000).unref();\n\nconst port = parseInt(process.env.PORT ?? \"3000\", 10);\n\n// Bun and Deno auto-start an HTTP server from this shape when the module is\n// run directly. Node has no equivalent — see serve.ts for the Node entry point.\nexport default { port, fetch: app.fetch };\n"]}
1
+ {"version":3,"sources":["../../config-env/src/index.ts","../src/config.ts","../src/schemas.ts","../src/openapi.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { MemStackConfig, StorageProvider, LLMProvider, EmbeddingProvider } from \"@memstack/core\";\nimport { readConfigFile } from \"./config-file.js\";\nimport type { MemStackConfigFile } from \"./config-file.js\";\nimport {\n InMemoryStorageAdapter,\n DiskStorageAdapter,\n MarkdownStorageAdapter,\n PostgresStorageAdapter,\n SQLiteStorageAdapter,\n RedisStorageAdapter,\n OpenAILLMAdapter,\n AnthropicLLMAdapter,\n OpenAIEmbeddingAdapter,\n} from \"@memstack/core\";\n\ntype Env = Record<string, string | undefined>;\n\n// Drivers are optional peers the user installs; only a missing module means \"install it\".\nfunction isMissingModule(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return code === \"ERR_MODULE_NOT_FOUND\" || code === \"MODULE_NOT_FOUND\";\n}\n\nfunction buildLLMAdapter(env: Env): LLMProvider {\n if (!env.ANTHROPIC_API_KEY && !env.OPENAI_API_KEY) {\n throw new Error(\"At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set\");\n }\n if (env.ANTHROPIC_API_KEY) {\n return new AnthropicLLMAdapter({ apiKey: env.ANTHROPIC_API_KEY, defaultModel: env.MEMSTACK_LLM_MODEL });\n }\n return new OpenAILLMAdapter({\n apiKey: env.OPENAI_API_KEY ?? \"\",\n baseURL: env.MEMSTACK_OPENAI_BASE_URL,\n defaultModel: env.MEMSTACK_LLM_MODEL,\n });\n}\n\nfunction buildEmbeddingAdapter(env: Env): EmbeddingProvider | undefined {\n if (env.MEMSTACK_OPENAI_BASE_URL) return undefined;\n if (env.OPENAI_API_KEY) {\n return new OpenAIEmbeddingAdapter({ apiKey: env.OPENAI_API_KEY });\n }\n return undefined;\n}\n\nasync function buildStorageAdapter(env: Env): Promise<StorageProvider> {\n const storage = env.MEMSTACK_STORAGE ?? \"memory\";\n\n switch (storage) {\n case \"memory\":\n return new InMemoryStorageAdapter();\n\n case \"markdown\":\n return new MarkdownStorageAdapter({\n dir: env.MEMSTACK_DIR ?? \"./memories\",\n });\n\n case \"disk\":\n return new DiskStorageAdapter({\n storageDir: env.MEMSTACK_DIR ?? \"./memstack-data\",\n });\n\n case \"postgres\":\n if (!env.DATABASE_URL) {\n throw new Error(\"postgres storage requires DATABASE_URL\");\n }\n return new PostgresStorageAdapter({\n connectionString: env.DATABASE_URL,\n });\n\n case \"sqlite\": {\n try {\n // @ts-expect-error optional peer dep\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const db = new BetterSqlite3.default(\n env.SQLITE_PATH ?? \"./memstack.db\",\n );\n return new SQLiteStorageAdapter({ db: db as never });\n } catch (error) {\n if (!isMissingModule(error)) throw error;\n throw new Error(\n \"SQLite requires better-sqlite3. Install: npm install better-sqlite3@^11.10.0\",\n );\n }\n }\n\n case \"redis\": {\n try {\n const Redis = await import(\"ioredis\");\n const client = new Redis.default(\n env.REDIS_URL ?? \"redis://localhost:6379\",\n );\n return new RedisStorageAdapter({ redis: client as never });\n } catch (error) {\n if (!isMissingModule(error)) throw error;\n throw new Error(\n \"Redis requires ioredis. Install: npm install ioredis@^5.11.1\",\n );\n }\n }\n\n default:\n throw new Error(`Unknown MEMSTACK_STORAGE: \"${storage}\". Supported: memory, markdown, disk, postgres, sqlite, redis`);\n }\n}\n\nexport interface EnvConfigResult {\n config: MemStackConfig;\n /** From MEMSTACK_ACTOR, defaults to \"default\". Only meaningful for clients that scope work to one actor per process (e.g. the MCP server). */\n defaultActorId: string;\n}\n\n/**\n * Builds a MemStackConfig purely from environment variables. Shared by\n * @memstack/cli, @memstack/mcp, and @memstack/server so storage/LLM/embedding\n * wiring and env var behavior can't drift between the three entry points.\n */\nexport async function loadConfigFromEnv(): Promise<EnvConfigResult> {\n return buildConfig(process.env);\n}\n\n/**\n * Builds a MemStackConfig from `~/.memstack/config.json` overlaid with\n * environment variables. Used by harness entry points. Each section is taken\n * whole from one source: any LLM variable in the environment replaces the\n * file's `llm` section, and `MEMSTACK_STORAGE` replaces its `storage`\n * section, so a key from one provider is never sent to another's URL.\n */\nexport async function loadConfig(options: { configPath?: string } = {}): Promise<EnvConfigResult> {\n return buildConfig(mergeConfigFile(readConfigFile(options.configPath), process.env));\n}\n\n/** The environment with the config file's sections filled in where the environment has none. */\nexport function mergeConfigFile(file: MemStackConfigFile | undefined, env: Env): Env {\n const merged: Env = { ...env };\n const envHasLLM = LLM_ENV.some((key) => env[key] !== undefined);\n if (file?.llm && !envHasLLM) {\n if (file.llm.provider === \"anthropic\") merged.ANTHROPIC_API_KEY = file.llm.apiKey;\n else {\n merged.OPENAI_API_KEY = file.llm.apiKey;\n merged.MEMSTACK_OPENAI_BASE_URL = file.llm.baseURL;\n }\n merged.MEMSTACK_LLM_MODEL = file.llm.model;\n }\n if (file?.storage && env.MEMSTACK_STORAGE === undefined) {\n const { type, path, url } = file.storage;\n merged.MEMSTACK_STORAGE = type;\n if (type === \"sqlite\") merged.SQLITE_PATH = path;\n if (type === \"disk\" || type === \"markdown\") merged.MEMSTACK_DIR = path;\n if (type === \"postgres\") merged.DATABASE_URL = url;\n if (type === \"redis\") merged.REDIS_URL = url;\n }\n return merged;\n}\n\nconst LLM_ENV = [\"OPENAI_API_KEY\", \"ANTHROPIC_API_KEY\", \"MEMSTACK_OPENAI_BASE_URL\", \"MEMSTACK_LLM_MODEL\"];\n\nasync function buildConfig(env: Env): Promise<EnvConfigResult> {\n const llm = buildLLMAdapter(env);\n const embedding = buildEmbeddingAdapter(env);\n const storage = await buildStorageAdapter(env);\n const embedOnStore = env.MEMSTACK_EMBED_ON_STORE !== \"false\";\n const defaultActorId = env.MEMSTACK_ACTOR ?? \"default\";\n\n return {\n config: { llm, embedding, storage, defaults: { embedOnStore } },\n defaultActorId,\n };\n}\n\nexport { resolveProject, normalizeRemote, pinProject, PIN_FILE } from \"./project.js\";\nexport type { ProjectIdentity, ProjectSource } from \"./project.js\";\nexport {\n STORAGE_TYPES,\n memstackHome,\n configFilePath,\n readConfigFile,\n writeConfigFile,\n checkConfigPermissions,\n} from \"./config-file.js\";\nexport type { MemStackConfigFile, StorageType } from \"./config-file.js\";\n","import type { MemStackConfig } from \"@memstack/core\";\nimport { loadConfigFromEnv } from \"@memstack/config-env\";\n\nexport async function loadConfig(): Promise<MemStackConfig> {\n const { config } = await loadConfigFromEnv();\n return config;\n}\n","import { z } from \"zod\";\n\nexport const MemoryTypeSchema = z.enum([\"interaction\", \"summary\", \"observation\", \"fact\", \"reflection\", \"preference\", \"decision\", \"instruction\"]);\n\nconst isoDate = z.string().datetime({ offset: true }).or(z.string().date()).transform((s) => new Date(s));\n\nexport const StoreMemorySchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n embedding: z.array(z.number()).optional(),\n sourceId: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n id: z.string().optional(),\n});\n\nexport const BatchStoreSchema = z.object({\n memories: z.array(StoreMemorySchema).min(1),\n});\n\nexport const RetrieveSchema = z.object({\n actorId: z.string().optional(),\n query: z.string().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n tags: z.array(z.string()).optional(),\n limit: z.number().int().positive().optional(),\n strategy: z.enum([\"semantic\", \"hybrid\", \"recent\", \"important\"]).optional(),\n createdAfter: isoDate.optional(),\n createdBefore: isoDate.optional(),\n});\n\nexport const ContextSchema = z.object({\n actorId: z.string().min(1),\n maxTokens: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n retrieveStrategy: z.enum([\"recent\", \"important\", \"hybrid\"]).optional(),\n format: z.enum([\"markdown\", \"messages\"]).optional(),\n});\n\nexport const ProcessSchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n});\n\nexport const SummarizeSchema = z.object({\n actorId: z.string().optional(),\n olderThan: isoDate.optional(),\n skipMostRecent: z.number().int().nonnegative().optional(),\n targetCount: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n keepOriginals: z.boolean().optional(),\n chunkSize: z.number().int().positive().optional(),\n prompt: z.string().optional(),\n});\n\nexport interface RestPruneStrategy {\n type: \"byAge\" | \"byImportance\" | \"byCount\" | \"byType\" | \"compose\";\n actorId?: string;\n maxAge?: number;\n minImportance?: number;\n maxPerActor?: number;\n memoryTypes?: z.infer<typeof MemoryTypeSchema>[];\n strategies?: RestPruneStrategy[];\n}\n\n// \"custom\" prune (a JS predicate function) can't cross JSON, so it's excluded\n// from the REST-reachable type set — everything else in PruneStrategy is.\n//\n// actorId is optional in the schema (nested `strategies` entries don't need\n// it — only the top-level scan is ever actor-scoped) but the /v1/prune and\n// /v1/prune/dry-run route handlers reject a request that omits it at the top\n// level, since there's no \"current session actor\" to fall back on the way\n// the CLI/MCP surfaces have.\nexport const PruneStrategySchema: z.ZodType<RestPruneStrategy> = z.lazy(() =>\n z.object({\n type: z.enum([\"byAge\", \"byImportance\", \"byCount\", \"byType\", \"compose\"]),\n actorId: z.string().min(1).optional(),\n maxAge: z.number().nonnegative().optional(),\n minImportance: z.number().min(0).max(1).optional(),\n maxPerActor: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n strategies: z.array(PruneStrategySchema).optional(),\n }),\n);\n\nexport const MergeSchema = z.object({\n ids: z.array(z.string()).min(2),\n});\n\nexport const PurgeSchema = z.object({\n actorId: z.string().min(1),\n});\n\nexport const DeleteManySchema = z.object({\n ids: z.array(z.string()).min(1),\n});\n\nexport const ImportSchema = z.union([\n z.array(z.unknown()),\n z.object({\n version: z.number().optional(),\n memories: z.array(z.unknown()),\n exportedAt: z.string().optional(),\n }),\n]);\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\n\ninterface RouteDoc {\n method: \"get\" | \"post\" | \"delete\";\n path: string;\n summary: string;\n requestSchema?: z.ZodType;\n successStatus: number;\n}\n\nconst ROUTES: RouteDoc[] = [\n { method: \"post\", path: \"/v1/memories\", summary: \"Store a memory\", requestSchema: StoreMemorySchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/batch\", summary: \"Store multiple memories\", requestSchema: BatchStoreSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/retrieve\", summary: \"Retrieve memories\", requestSchema: RetrieveSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/context\", summary: \"Compile LLM-ready context\", requestSchema: ContextSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/count\", summary: \"Count memories matching filters\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/export\", summary: \"Export a memory snapshot\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/{id}\", summary: \"Get a memory by ID\", successStatus: 200 },\n { method: \"delete\", path: \"/v1/memories/{id}\", summary: \"Delete a memory by ID\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/delete-many\", summary: \"Delete multiple memories by ID\", requestSchema: DeleteManySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/purge\", summary: \"Delete all memories for an actor\", requestSchema: PurgeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/merge\", summary: \"Merge multiple memories into one\", requestSchema: MergeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/process\", summary: \"Store a memory with auto-enrichment\", requestSchema: ProcessSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/{id}/touch\", summary: \"Bump a memory's recency\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/import\", summary: \"Import a memory snapshot\", requestSchema: ImportSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/summarize\", summary: \"Compress old memories into a summary\", requestSchema: SummarizeSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/summarize/stream\", summary: \"Stream summarization via SSE\", successStatus: 200 },\n { method: \"post\", path: \"/v1/prune\", summary: \"Remove stale/low-value memories\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/prune/dry-run\", summary: \"Preview what a prune strategy would remove\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/stats/{actorId}\", summary: \"Memory diagnostics for an actor\", successStatus: 200 },\n { method: \"get\", path: \"/health\", summary: \"Health check\", successStatus: 200 },\n];\n\n/**\n * Hand-maintained route list, but request body shapes are generated from the\n * same zod schemas that validate incoming requests — one source of truth.\n */\nexport function buildOpenApiDocument(version: string): Record<string, unknown> {\n const paths: Record<string, Record<string, unknown>> = {};\n\n for (const route of ROUTES) {\n const pathItem = (paths[route.path] ??= {});\n const pathParams = [...route.path.matchAll(/\\{(\\w+)\\}/g)].map((m) => ({\n name: m[1],\n in: \"path\",\n required: true,\n schema: { type: \"string\" },\n }));\n\n pathItem[route.method] = {\n summary: route.summary,\n ...(pathParams.length ? { parameters: pathParams } : {}),\n ...(route.requestSchema\n ? {\n requestBody: {\n required: true,\n content: { \"application/json\": { schema: JSON.parse(JSON.stringify(zodToJsonSchema(route.requestSchema))) } },\n },\n }\n : {}),\n responses: {\n [String(route.successStatus)]: { description: \"Success\" },\n ...(route.requestSchema ? { \"400\": { description: \"Validation failed\" } } : {}),\n \"500\": { description: \"Internal error\" },\n },\n };\n }\n\n return {\n openapi: \"3.1.0\",\n info: {\n title: \"MemStack Server API\",\n version,\n description: \"REST API for MemStack — self-hostable agent memory. See https://github.com/isiomaC/memstack for the full guide.\",\n },\n servers: [{ url: \"/\" }],\n paths,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Hono, type Context } from \"hono\";\nimport { MemStack } from \"@memstack/core\";\nimport type { MemoryType, MemStackSnapshot } from \"@memstack/core\";\nimport type { z } from \"zod\";\nimport { loadConfig } from \"./config.js\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\nimport { buildOpenApiDocument } from \"./openapi.js\";\n\nconst pkg = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf-8\")) as { version: string };\n\nconst app = new Hono();\n\nlet _ms: MemStack | null = null;\nasync function getMs(): Promise<MemStack> {\n if (!_ms) {\n _ms = new MemStack(await loadConfig());\n }\n return _ms;\n}\n\ntype ParsedBody<T> = { ok: true; data: T } | { ok: false; response: Response };\n\nasync function parseBody<S extends z.ZodTypeAny>(c: Context, schema: S): Promise<ParsedBody<z.infer<S>>> {\n const raw = await c.req.json().catch(() => undefined);\n const result = schema.safeParse(raw);\n if (!result.success) {\n return { ok: false, response: c.json({ error: \"Validation failed\", issues: result.error.issues }, 400) };\n }\n return { ok: true, data: result.data };\n}\n\napp.use(\"*\", async (c, next) => {\n const apiKey = process.env.MEMSTACK_API_KEY;\n if (apiKey) {\n const auth = c.req.header(\"Authorization\");\n if (!auth || auth !== `Bearer ${apiKey}`) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n }\n await next();\n});\n\nconst requestCounts = new Map<string, { count: number; reset: number }>();\n\napp.use(\"*\", async (c, next) => {\n const rateLimit = parseInt(process.env.MEMSTACK_RATE_LIMIT ?? \"0\", 10);\n if (rateLimit <= 0) return next();\n\n const key = c.req.header(\"x-forwarded-for\") ?? \"anonymous\";\n const now = Date.now();\n const entry = requestCounts.get(key) ?? { count: 0, reset: now + 60000 };\n\n if (now > entry.reset) {\n entry.count = 1;\n entry.reset = now + 60000;\n } else {\n entry.count++;\n }\n\n requestCounts.set(key, entry);\n\n if (requestCounts.size > 10000) {\n for (const [k, v] of requestCounts) {\n if (now > v.reset) requestCounts.delete(k);\n }\n }\n\n if (entry.count > rateLimit) {\n return c.json({ error: \"Too many requests\" }, 429);\n }\n\n await next();\n});\n\napp.post(\"/v1/memories\", async (c) => {\n const parsed = await parseBody(c, StoreMemorySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.store(parsed.data);\n return c.json(memory, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/batch\", async (c) => {\n const parsed = await parseBody(c, BatchStoreSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.storeBatch(parsed.data.memories);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/retrieve\", async (c) => {\n const parsed = await parseBody(c, RetrieveSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const results = await (await getMs()).memory.retrieve(parsed.data);\n return c.json(results);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/context\", async (c) => {\n const parsed = await parseBody(c, ContextSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const ctx = await (await getMs()).memory.compileContext(parsed.data);\n return c.json({\n context: ctx.systemPrompt,\n tokenCount: ctx.tokenEstimate,\n memoryCount: ctx.recentMemories.length + ctx.importantMemories.length,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/count\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const memoryType = c.req.query(\"memoryType\");\n const minImportance = c.req.query(\"minImportance\");\n const count = await (await getMs()).memory.count({\n actorId,\n memoryType: memoryType as MemoryType | undefined,\n minImportance: minImportance ? parseFloat(minImportance) : undefined,\n });\n return c.json({ count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/export\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const snapshot = await (await getMs()).export(actorId);\n return c.json(snapshot);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/:id\", async (c) => {\n try {\n const memory = await (await getMs()).memory.get(c.req.param(\"id\"));\n if (!memory) return c.json({ error: \"Not found\" }, 404);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.delete(\"/v1/memories/:id\", async (c) => {\n try {\n const id = c.req.param(\"id\");\n const ms = await getMs();\n const existing = await ms.memory.get(id);\n if (!existing) return c.json({ deleted: false, error: \"Not found\" }, 404);\n await ms.memory.delete(id);\n return c.json({ deleted: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/delete-many\", async (c) => {\n const parsed = await parseBody(c, DeleteManySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const deleted = await (await getMs()).memory.deleteMany(parsed.data.ids);\n return c.json({ deleted });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/purge\", async (c) => {\n const parsed = await parseBody(c, PurgeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const count = await (await getMs()).memory.purgeActor(parsed.data.actorId);\n return c.json({ purged: count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/merge\", async (c) => {\n const parsed = await parseBody(c, MergeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.merge(parsed.data.ids);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/process\", async (c) => {\n const parsed = await parseBody(c, ProcessSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).process(parsed.data);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/:id/touch\", async (c) => {\n try {\n await (await getMs()).memory.touch(c.req.param(\"id\"));\n return c.json({ touched: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/import\", async (c) => {\n const parsed = await parseBody(c, ImportSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const body = parsed.data;\n const memories = Array.isArray(body) ? body : body.memories;\n const exportedAt = Array.isArray(body) ? new Date().toISOString() : (body.exportedAt ?? new Date().toISOString());\n // The snapshot's memories come from a prior export() call; we validate the\n // envelope shape above but trust the memory contents rather than re-validating\n // every field of every memory.\n const snapshot = { version: 1 as const, memories, exportedAt } as unknown as MemStackSnapshot;\n await (await getMs()).import(snapshot);\n return c.json({ imported: memories.length }, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/summarize\", async (c) => {\n const parsed = await parseBody(c, SummarizeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.summarize(parsed.data);\n return c.json({\n summarized: result.deletedCount,\n summaryId: result.summary.id,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to prune (scopes deletion to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.prune(parsed.data);\n return c.json({ pruned: result.count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune/dry-run\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to preview pruning (scopes the scan to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.dryRunPrune(parsed.data);\n return c.json(result);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/stats/:actorId\", async (c) => {\n try {\n const actorId = c.req.param(\"actorId\");\n const stats = await (await getMs()).memory.stats(actorId);\n return c.json(stats);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/summarize/stream\", async (c) => {\n const actorId = c.req.query(\"actorId\") ?? \"default\";\n const olderThan = c.req.query(\"olderThan\");\n const skipMostRecent = c.req.query(\"skipMostRecent\");\n const targetCount = c.req.query(\"targetCount\");\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n const ms = await getMs();\n const gen = ms.memory.summarizeStream({\n actorId,\n olderThan: olderThan ? new Date(olderThan) : undefined,\n skipMostRecent: skipMostRecent ? parseInt(skipMostRecent, 10) : undefined,\n targetCount: targetCount ? parseInt(targetCount, 10) : undefined,\n });\n\n for await (const { chunk, text } of gen) {\n const line = `data: ${JSON.stringify({ chunk, text })}\\n\\n`;\n controller.enqueue(new TextEncoder().encode(line));\n }\n controller.enqueue(new TextEncoder().encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify({ error: msg })}\\n\\n`));\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n});\n\napp.get(\"/health\", async (c) => {\n try {\n const status = await (await getMs()).health();\n return c.json({\n status: status.storage ? \"ok\" : \"degraded\",\n storage: status.storage ? \"connected\" : \"disconnected\",\n version: pkg.version,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/openapi.json\", (c) => c.json(buildOpenApiDocument(pkg.version)));\n\nsetInterval(() => {\n const now = Date.now();\n for (const [key, entry] of requestCounts) {\n if (now > entry.reset) requestCounts.delete(key);\n }\n}, 60000).unref();\n\nconst port = parseInt(process.env.PORT ?? \"3000\", 10);\n\n// Bun and Deno auto-start an HTTP server from this shape when the module is\n// run directly. Node has no equivalent — see serve.ts for the Node entry point.\nexport default { port, fetch: app.fetch };\n"]}
package/dist/serve.js CHANGED
@@ -6,56 +6,61 @@ import { MemStack, AnthropicLLMAdapter, OpenAILLMAdapter, OpenAIEmbeddingAdapter
6
6
  import { z } from 'zod';
7
7
  import { zodToJsonSchema } from 'zod-to-json-schema';
8
8
 
9
- function buildLLMAdapter() {
10
- if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {
9
+ function isMissingModule(error) {
10
+ const code = error?.code;
11
+ return code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND";
12
+ }
13
+ function buildLLMAdapter(env) {
14
+ if (!env.ANTHROPIC_API_KEY && !env.OPENAI_API_KEY) {
11
15
  throw new Error("At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set");
12
16
  }
13
- if (process.env.ANTHROPIC_API_KEY) {
14
- return new AnthropicLLMAdapter({ apiKey: process.env.ANTHROPIC_API_KEY });
17
+ if (env.ANTHROPIC_API_KEY) {
18
+ return new AnthropicLLMAdapter({ apiKey: env.ANTHROPIC_API_KEY, defaultModel: env.MEMSTACK_LLM_MODEL });
15
19
  }
16
20
  return new OpenAILLMAdapter({
17
- apiKey: process.env.OPENAI_API_KEY ?? "",
18
- baseURL: process.env.MEMSTACK_OPENAI_BASE_URL,
19
- defaultModel: process.env.MEMSTACK_LLM_MODEL
21
+ apiKey: env.OPENAI_API_KEY ?? "",
22
+ baseURL: env.MEMSTACK_OPENAI_BASE_URL,
23
+ defaultModel: env.MEMSTACK_LLM_MODEL
20
24
  });
21
25
  }
22
- function buildEmbeddingAdapter() {
23
- if (process.env.MEMSTACK_OPENAI_BASE_URL) return void 0;
24
- if (process.env.OPENAI_API_KEY) {
25
- return new OpenAIEmbeddingAdapter({ apiKey: process.env.OPENAI_API_KEY });
26
+ function buildEmbeddingAdapter(env) {
27
+ if (env.MEMSTACK_OPENAI_BASE_URL) return void 0;
28
+ if (env.OPENAI_API_KEY) {
29
+ return new OpenAIEmbeddingAdapter({ apiKey: env.OPENAI_API_KEY });
26
30
  }
27
31
  return void 0;
28
32
  }
29
- async function buildStorageAdapter() {
30
- const storage = process.env.MEMSTACK_STORAGE ?? "memory";
33
+ async function buildStorageAdapter(env) {
34
+ const storage = env.MEMSTACK_STORAGE ?? "memory";
31
35
  switch (storage) {
32
36
  case "memory":
33
37
  return new InMemoryStorageAdapter();
34
38
  case "markdown":
35
39
  return new MarkdownStorageAdapter({
36
- dir: process.env.MEMSTACK_DIR ?? "./memories"
40
+ dir: env.MEMSTACK_DIR ?? "./memories"
37
41
  });
38
42
  case "disk":
39
43
  return new DiskStorageAdapter({
40
- storageDir: process.env.MEMSTACK_DIR ?? "./memstack-data"
44
+ storageDir: env.MEMSTACK_DIR ?? "./memstack-data"
41
45
  });
42
46
  case "postgres":
43
- if (!process.env.DATABASE_URL) {
47
+ if (!env.DATABASE_URL) {
44
48
  throw new Error("postgres storage requires DATABASE_URL");
45
49
  }
46
50
  return new PostgresStorageAdapter({
47
- connectionString: process.env.DATABASE_URL
51
+ connectionString: env.DATABASE_URL
48
52
  });
49
53
  case "sqlite": {
50
54
  try {
51
55
  const BetterSqlite3 = await import('better-sqlite3');
52
56
  const db = new BetterSqlite3.default(
53
- process.env.SQLITE_PATH ?? "./memstack.db"
57
+ env.SQLITE_PATH ?? "./memstack.db"
54
58
  );
55
59
  return new SQLiteStorageAdapter({ db });
56
- } catch {
60
+ } catch (error) {
61
+ if (!isMissingModule(error)) throw error;
57
62
  throw new Error(
58
- "SQLite requires better-sqlite3. Install: npm install better-sqlite3"
63
+ "SQLite requires better-sqlite3. Install: npm install better-sqlite3@^11.10.0"
59
64
  );
60
65
  }
61
66
  }
@@ -63,12 +68,13 @@ async function buildStorageAdapter() {
63
68
  try {
64
69
  const Redis = await import('ioredis');
65
70
  const client = new Redis.default(
66
- process.env.REDIS_URL ?? "redis://localhost:6379"
71
+ env.REDIS_URL ?? "redis://localhost:6379"
67
72
  );
68
73
  return new RedisStorageAdapter({ redis: client });
69
- } catch {
74
+ } catch (error) {
75
+ if (!isMissingModule(error)) throw error;
70
76
  throw new Error(
71
- "Redis requires ioredis. Install: npm install ioredis"
77
+ "Redis requires ioredis. Install: npm install ioredis@^5.11.1"
72
78
  );
73
79
  }
74
80
  }
@@ -77,11 +83,14 @@ async function buildStorageAdapter() {
77
83
  }
78
84
  }
79
85
  async function loadConfigFromEnv() {
80
- const llm = buildLLMAdapter();
81
- const embedding = buildEmbeddingAdapter();
82
- const storage = await buildStorageAdapter();
83
- const embedOnStore = process.env.MEMSTACK_EMBED_ON_STORE !== "false";
84
- const defaultActorId = process.env.MEMSTACK_ACTOR ?? "default";
86
+ return buildConfig(process.env);
87
+ }
88
+ async function buildConfig(env) {
89
+ const llm = buildLLMAdapter(env);
90
+ const embedding = buildEmbeddingAdapter(env);
91
+ const storage = await buildStorageAdapter(env);
92
+ const embedOnStore = env.MEMSTACK_EMBED_ON_STORE !== "false";
93
+ const defaultActorId = env.MEMSTACK_ACTOR ?? "default";
85
94
  return {
86
95
  config: { llm, embedding, storage, defaults: { embedOnStore } },
87
96
  defaultActorId
@@ -93,7 +102,7 @@ async function loadConfig() {
93
102
  const { config } = await loadConfigFromEnv();
94
103
  return config;
95
104
  }
96
- var MemoryTypeSchema = z.enum(["interaction", "summary", "observation", "fact", "reflection"]);
105
+ var MemoryTypeSchema = z.enum(["interaction", "summary", "observation", "fact", "reflection", "preference", "decision", "instruction"]);
97
106
  var isoDate = z.string().datetime({ offset: true }).or(z.string().date()).transform((s) => new Date(s));
98
107
  var StoreMemorySchema = z.object({
99
108
  actorId: z.string().min(1),
package/dist/serve.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../config-env/src/index.ts","../src/config.ts","../src/schemas.ts","../src/openapi.ts","../src/index.ts","../src/serve.ts"],"names":[],"mappings":"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","file":"serve.js","sourcesContent":["import type { MemStackConfig, StorageProvider, LLMProvider, EmbeddingProvider } from \"@memstack/core\";\nimport {\n InMemoryStorageAdapter,\n DiskStorageAdapter,\n MarkdownStorageAdapter,\n PostgresStorageAdapter,\n SQLiteStorageAdapter,\n RedisStorageAdapter,\n OpenAILLMAdapter,\n AnthropicLLMAdapter,\n OpenAIEmbeddingAdapter,\n} from \"@memstack/core\";\n\nfunction buildLLMAdapter(): LLMProvider {\n if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {\n throw new Error(\"At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set\");\n }\n if (process.env.ANTHROPIC_API_KEY) {\n return new AnthropicLLMAdapter({ apiKey: process.env.ANTHROPIC_API_KEY });\n }\n return new OpenAILLMAdapter({\n apiKey: process.env.OPENAI_API_KEY ?? \"\",\n baseURL: process.env.MEMSTACK_OPENAI_BASE_URL,\n defaultModel: process.env.MEMSTACK_LLM_MODEL,\n });\n}\n\nfunction buildEmbeddingAdapter(): EmbeddingProvider | undefined {\n if (process.env.MEMSTACK_OPENAI_BASE_URL) return undefined;\n if (process.env.OPENAI_API_KEY) {\n return new OpenAIEmbeddingAdapter({ apiKey: process.env.OPENAI_API_KEY });\n }\n return undefined;\n}\n\nasync function buildStorageAdapter(): Promise<StorageProvider> {\n const storage = process.env.MEMSTACK_STORAGE ?? \"memory\";\n\n switch (storage) {\n case \"memory\":\n return new InMemoryStorageAdapter();\n\n case \"markdown\":\n return new MarkdownStorageAdapter({\n dir: process.env.MEMSTACK_DIR ?? \"./memories\",\n });\n\n case \"disk\":\n return new DiskStorageAdapter({\n storageDir: process.env.MEMSTACK_DIR ?? \"./memstack-data\",\n });\n\n case \"postgres\":\n if (!process.env.DATABASE_URL) {\n throw new Error(\"postgres storage requires DATABASE_URL\");\n }\n return new PostgresStorageAdapter({\n connectionString: process.env.DATABASE_URL,\n });\n\n case \"sqlite\": {\n try {\n // @ts-expect-error optional peer dep\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const db = new BetterSqlite3.default(\n process.env.SQLITE_PATH ?? \"./memstack.db\",\n );\n return new SQLiteStorageAdapter({ db: db as never });\n } catch {\n throw new Error(\n \"SQLite requires better-sqlite3. Install: npm install better-sqlite3\",\n );\n }\n }\n\n case \"redis\": {\n try {\n const Redis = await import(\"ioredis\");\n const client = new Redis.default(\n process.env.REDIS_URL ?? \"redis://localhost:6379\",\n );\n return new RedisStorageAdapter({ redis: client as never });\n } catch {\n throw new Error(\n \"Redis requires ioredis. Install: npm install ioredis\",\n );\n }\n }\n\n default:\n throw new Error(`Unknown MEMSTACK_STORAGE: \"${storage}\". Supported: memory, markdown, disk, postgres, sqlite, redis`);\n }\n}\n\nexport interface EnvConfigResult {\n config: MemStackConfig;\n /** From MEMSTACK_ACTOR, defaults to \"default\". Only meaningful for clients that scope work to one actor per process (e.g. the MCP server). */\n defaultActorId: string;\n}\n\n/**\n * Builds a MemStackConfig purely from environment variables. Shared by\n * @memstack/cli, @memstack/mcp, and @memstack/server so storage/LLM/embedding\n * wiring and env var behavior can't drift between the three entry points.\n */\nexport async function loadConfigFromEnv(): Promise<EnvConfigResult> {\n const llm = buildLLMAdapter();\n const embedding = buildEmbeddingAdapter();\n const storage = await buildStorageAdapter();\n const embedOnStore = process.env.MEMSTACK_EMBED_ON_STORE !== \"false\";\n const defaultActorId = process.env.MEMSTACK_ACTOR ?? \"default\";\n\n return {\n config: { llm, embedding, storage, defaults: { embedOnStore } },\n defaultActorId,\n };\n}\n","import type { MemStackConfig } from \"@memstack/core\";\nimport { loadConfigFromEnv } from \"@memstack/config-env\";\n\nexport async function loadConfig(): Promise<MemStackConfig> {\n const { config } = await loadConfigFromEnv();\n return config;\n}\n","import { z } from \"zod\";\n\nexport const MemoryTypeSchema = z.enum([\"interaction\", \"summary\", \"observation\", \"fact\", \"reflection\"]);\n\nconst isoDate = z.string().datetime({ offset: true }).or(z.string().date()).transform((s) => new Date(s));\n\nexport const StoreMemorySchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n embedding: z.array(z.number()).optional(),\n sourceId: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n id: z.string().optional(),\n});\n\nexport const BatchStoreSchema = z.object({\n memories: z.array(StoreMemorySchema).min(1),\n});\n\nexport const RetrieveSchema = z.object({\n actorId: z.string().optional(),\n query: z.string().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n tags: z.array(z.string()).optional(),\n limit: z.number().int().positive().optional(),\n strategy: z.enum([\"semantic\", \"hybrid\", \"recent\", \"important\"]).optional(),\n createdAfter: isoDate.optional(),\n createdBefore: isoDate.optional(),\n});\n\nexport const ContextSchema = z.object({\n actorId: z.string().min(1),\n maxTokens: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n retrieveStrategy: z.enum([\"recent\", \"important\", \"hybrid\"]).optional(),\n format: z.enum([\"markdown\", \"messages\"]).optional(),\n});\n\nexport const ProcessSchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n});\n\nexport const SummarizeSchema = z.object({\n actorId: z.string().optional(),\n olderThan: isoDate.optional(),\n skipMostRecent: z.number().int().nonnegative().optional(),\n targetCount: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n keepOriginals: z.boolean().optional(),\n chunkSize: z.number().int().positive().optional(),\n prompt: z.string().optional(),\n});\n\nexport interface RestPruneStrategy {\n type: \"byAge\" | \"byImportance\" | \"byCount\" | \"byType\" | \"compose\";\n actorId?: string;\n maxAge?: number;\n minImportance?: number;\n maxPerActor?: number;\n memoryTypes?: z.infer<typeof MemoryTypeSchema>[];\n strategies?: RestPruneStrategy[];\n}\n\n// \"custom\" prune (a JS predicate function) can't cross JSON, so it's excluded\n// from the REST-reachable type set — everything else in PruneStrategy is.\n//\n// actorId is optional in the schema (nested `strategies` entries don't need\n// it — only the top-level scan is ever actor-scoped) but the /v1/prune and\n// /v1/prune/dry-run route handlers reject a request that omits it at the top\n// level, since there's no \"current session actor\" to fall back on the way\n// the CLI/MCP surfaces have.\nexport const PruneStrategySchema: z.ZodType<RestPruneStrategy> = z.lazy(() =>\n z.object({\n type: z.enum([\"byAge\", \"byImportance\", \"byCount\", \"byType\", \"compose\"]),\n actorId: z.string().min(1).optional(),\n maxAge: z.number().nonnegative().optional(),\n minImportance: z.number().min(0).max(1).optional(),\n maxPerActor: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n strategies: z.array(PruneStrategySchema).optional(),\n }),\n);\n\nexport const MergeSchema = z.object({\n ids: z.array(z.string()).min(2),\n});\n\nexport const PurgeSchema = z.object({\n actorId: z.string().min(1),\n});\n\nexport const DeleteManySchema = z.object({\n ids: z.array(z.string()).min(1),\n});\n\nexport const ImportSchema = z.union([\n z.array(z.unknown()),\n z.object({\n version: z.number().optional(),\n memories: z.array(z.unknown()),\n exportedAt: z.string().optional(),\n }),\n]);\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\n\ninterface RouteDoc {\n method: \"get\" | \"post\" | \"delete\";\n path: string;\n summary: string;\n requestSchema?: z.ZodType;\n successStatus: number;\n}\n\nconst ROUTES: RouteDoc[] = [\n { method: \"post\", path: \"/v1/memories\", summary: \"Store a memory\", requestSchema: StoreMemorySchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/batch\", summary: \"Store multiple memories\", requestSchema: BatchStoreSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/retrieve\", summary: \"Retrieve memories\", requestSchema: RetrieveSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/context\", summary: \"Compile LLM-ready context\", requestSchema: ContextSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/count\", summary: \"Count memories matching filters\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/export\", summary: \"Export a memory snapshot\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/{id}\", summary: \"Get a memory by ID\", successStatus: 200 },\n { method: \"delete\", path: \"/v1/memories/{id}\", summary: \"Delete a memory by ID\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/delete-many\", summary: \"Delete multiple memories by ID\", requestSchema: DeleteManySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/purge\", summary: \"Delete all memories for an actor\", requestSchema: PurgeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/merge\", summary: \"Merge multiple memories into one\", requestSchema: MergeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/process\", summary: \"Store a memory with auto-enrichment\", requestSchema: ProcessSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/{id}/touch\", summary: \"Bump a memory's recency\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/import\", summary: \"Import a memory snapshot\", requestSchema: ImportSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/summarize\", summary: \"Compress old memories into a summary\", requestSchema: SummarizeSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/summarize/stream\", summary: \"Stream summarization via SSE\", successStatus: 200 },\n { method: \"post\", path: \"/v1/prune\", summary: \"Remove stale/low-value memories\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/prune/dry-run\", summary: \"Preview what a prune strategy would remove\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/stats/{actorId}\", summary: \"Memory diagnostics for an actor\", successStatus: 200 },\n { method: \"get\", path: \"/health\", summary: \"Health check\", successStatus: 200 },\n];\n\n/**\n * Hand-maintained route list, but request body shapes are generated from the\n * same zod schemas that validate incoming requests — one source of truth.\n */\nexport function buildOpenApiDocument(version: string): Record<string, unknown> {\n const paths: Record<string, Record<string, unknown>> = {};\n\n for (const route of ROUTES) {\n const pathItem = (paths[route.path] ??= {});\n const pathParams = [...route.path.matchAll(/\\{(\\w+)\\}/g)].map((m) => ({\n name: m[1],\n in: \"path\",\n required: true,\n schema: { type: \"string\" },\n }));\n\n pathItem[route.method] = {\n summary: route.summary,\n ...(pathParams.length ? { parameters: pathParams } : {}),\n ...(route.requestSchema\n ? {\n requestBody: {\n required: true,\n content: { \"application/json\": { schema: JSON.parse(JSON.stringify(zodToJsonSchema(route.requestSchema))) } },\n },\n }\n : {}),\n responses: {\n [String(route.successStatus)]: { description: \"Success\" },\n ...(route.requestSchema ? { \"400\": { description: \"Validation failed\" } } : {}),\n \"500\": { description: \"Internal error\" },\n },\n };\n }\n\n return {\n openapi: \"3.1.0\",\n info: {\n title: \"MemStack Server API\",\n version,\n description: \"REST API for MemStack — self-hostable agent memory. See https://github.com/isiomaC/memstack for the full guide.\",\n },\n servers: [{ url: \"/\" }],\n paths,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Hono, type Context } from \"hono\";\nimport { MemStack } from \"@memstack/core\";\nimport type { MemoryType, MemStackSnapshot } from \"@memstack/core\";\nimport type { z } from \"zod\";\nimport { loadConfig } from \"./config.js\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\nimport { buildOpenApiDocument } from \"./openapi.js\";\n\nconst pkg = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf-8\")) as { version: string };\n\nconst app = new Hono();\n\nlet _ms: MemStack | null = null;\nasync function getMs(): Promise<MemStack> {\n if (!_ms) {\n _ms = new MemStack(await loadConfig());\n }\n return _ms;\n}\n\ntype ParsedBody<T> = { ok: true; data: T } | { ok: false; response: Response };\n\nasync function parseBody<S extends z.ZodTypeAny>(c: Context, schema: S): Promise<ParsedBody<z.infer<S>>> {\n const raw = await c.req.json().catch(() => undefined);\n const result = schema.safeParse(raw);\n if (!result.success) {\n return { ok: false, response: c.json({ error: \"Validation failed\", issues: result.error.issues }, 400) };\n }\n return { ok: true, data: result.data };\n}\n\napp.use(\"*\", async (c, next) => {\n const apiKey = process.env.MEMSTACK_API_KEY;\n if (apiKey) {\n const auth = c.req.header(\"Authorization\");\n if (!auth || auth !== `Bearer ${apiKey}`) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n }\n await next();\n});\n\nconst requestCounts = new Map<string, { count: number; reset: number }>();\n\napp.use(\"*\", async (c, next) => {\n const rateLimit = parseInt(process.env.MEMSTACK_RATE_LIMIT ?? \"0\", 10);\n if (rateLimit <= 0) return next();\n\n const key = c.req.header(\"x-forwarded-for\") ?? \"anonymous\";\n const now = Date.now();\n const entry = requestCounts.get(key) ?? { count: 0, reset: now + 60000 };\n\n if (now > entry.reset) {\n entry.count = 1;\n entry.reset = now + 60000;\n } else {\n entry.count++;\n }\n\n requestCounts.set(key, entry);\n\n if (requestCounts.size > 10000) {\n for (const [k, v] of requestCounts) {\n if (now > v.reset) requestCounts.delete(k);\n }\n }\n\n if (entry.count > rateLimit) {\n return c.json({ error: \"Too many requests\" }, 429);\n }\n\n await next();\n});\n\napp.post(\"/v1/memories\", async (c) => {\n const parsed = await parseBody(c, StoreMemorySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.store(parsed.data);\n return c.json(memory, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/batch\", async (c) => {\n const parsed = await parseBody(c, BatchStoreSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.storeBatch(parsed.data.memories);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/retrieve\", async (c) => {\n const parsed = await parseBody(c, RetrieveSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const results = await (await getMs()).memory.retrieve(parsed.data);\n return c.json(results);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/context\", async (c) => {\n const parsed = await parseBody(c, ContextSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const ctx = await (await getMs()).memory.compileContext(parsed.data);\n return c.json({\n context: ctx.systemPrompt,\n tokenCount: ctx.tokenEstimate,\n memoryCount: ctx.recentMemories.length + ctx.importantMemories.length,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/count\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const memoryType = c.req.query(\"memoryType\");\n const minImportance = c.req.query(\"minImportance\");\n const count = await (await getMs()).memory.count({\n actorId,\n memoryType: memoryType as MemoryType | undefined,\n minImportance: minImportance ? parseFloat(minImportance) : undefined,\n });\n return c.json({ count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/export\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const snapshot = await (await getMs()).export(actorId);\n return c.json(snapshot);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/:id\", async (c) => {\n try {\n const memory = await (await getMs()).memory.get(c.req.param(\"id\"));\n if (!memory) return c.json({ error: \"Not found\" }, 404);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.delete(\"/v1/memories/:id\", async (c) => {\n try {\n const id = c.req.param(\"id\");\n const ms = await getMs();\n const existing = await ms.memory.get(id);\n if (!existing) return c.json({ deleted: false, error: \"Not found\" }, 404);\n await ms.memory.delete(id);\n return c.json({ deleted: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/delete-many\", async (c) => {\n const parsed = await parseBody(c, DeleteManySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const deleted = await (await getMs()).memory.deleteMany(parsed.data.ids);\n return c.json({ deleted });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/purge\", async (c) => {\n const parsed = await parseBody(c, PurgeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const count = await (await getMs()).memory.purgeActor(parsed.data.actorId);\n return c.json({ purged: count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/merge\", async (c) => {\n const parsed = await parseBody(c, MergeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.merge(parsed.data.ids);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/process\", async (c) => {\n const parsed = await parseBody(c, ProcessSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).process(parsed.data);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/:id/touch\", async (c) => {\n try {\n await (await getMs()).memory.touch(c.req.param(\"id\"));\n return c.json({ touched: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/import\", async (c) => {\n const parsed = await parseBody(c, ImportSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const body = parsed.data;\n const memories = Array.isArray(body) ? body : body.memories;\n const exportedAt = Array.isArray(body) ? new Date().toISOString() : (body.exportedAt ?? new Date().toISOString());\n // The snapshot's memories come from a prior export() call; we validate the\n // envelope shape above but trust the memory contents rather than re-validating\n // every field of every memory.\n const snapshot = { version: 1 as const, memories, exportedAt } as unknown as MemStackSnapshot;\n await (await getMs()).import(snapshot);\n return c.json({ imported: memories.length }, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/summarize\", async (c) => {\n const parsed = await parseBody(c, SummarizeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.summarize(parsed.data);\n return c.json({\n summarized: result.deletedCount,\n summaryId: result.summary.id,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to prune (scopes deletion to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.prune(parsed.data);\n return c.json({ pruned: result.count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune/dry-run\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to preview pruning (scopes the scan to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.dryRunPrune(parsed.data);\n return c.json(result);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/stats/:actorId\", async (c) => {\n try {\n const actorId = c.req.param(\"actorId\");\n const stats = await (await getMs()).memory.stats(actorId);\n return c.json(stats);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/summarize/stream\", async (c) => {\n const actorId = c.req.query(\"actorId\") ?? \"default\";\n const olderThan = c.req.query(\"olderThan\");\n const skipMostRecent = c.req.query(\"skipMostRecent\");\n const targetCount = c.req.query(\"targetCount\");\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n const ms = await getMs();\n const gen = ms.memory.summarizeStream({\n actorId,\n olderThan: olderThan ? new Date(olderThan) : undefined,\n skipMostRecent: skipMostRecent ? parseInt(skipMostRecent, 10) : undefined,\n targetCount: targetCount ? parseInt(targetCount, 10) : undefined,\n });\n\n for await (const { chunk, text } of gen) {\n const line = `data: ${JSON.stringify({ chunk, text })}\\n\\n`;\n controller.enqueue(new TextEncoder().encode(line));\n }\n controller.enqueue(new TextEncoder().encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify({ error: msg })}\\n\\n`));\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n});\n\napp.get(\"/health\", async (c) => {\n try {\n const status = await (await getMs()).health();\n return c.json({\n status: status.storage ? \"ok\" : \"degraded\",\n storage: status.storage ? \"connected\" : \"disconnected\",\n version: pkg.version,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/openapi.json\", (c) => c.json(buildOpenApiDocument(pkg.version)));\n\nsetInterval(() => {\n const now = Date.now();\n for (const [key, entry] of requestCounts) {\n if (now > entry.reset) requestCounts.delete(key);\n }\n}, 60000).unref();\n\nconst port = parseInt(process.env.PORT ?? \"3000\", 10);\n\n// Bun and Deno auto-start an HTTP server from this shape when the module is\n// run directly. Node has no equivalent — see serve.ts for the Node entry point.\nexport default { port, fetch: app.fetch };\n","#!/usr/bin/env node\nimport { serve } from \"@hono/node-server\";\nimport server from \"./index.js\";\n\nserve(server, (info) => {\n console.log(`memstack server listening on http://localhost:${info.port}`);\n});\n"]}
1
+ {"version":3,"sources":["../../config-env/src/index.ts","../src/config.ts","../src/schemas.ts","../src/openapi.ts","../src/index.ts","../src/serve.ts"],"names":[],"mappings":"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","file":"serve.js","sourcesContent":["import type { MemStackConfig, StorageProvider, LLMProvider, EmbeddingProvider } from \"@memstack/core\";\nimport { readConfigFile } from \"./config-file.js\";\nimport type { MemStackConfigFile } from \"./config-file.js\";\nimport {\n InMemoryStorageAdapter,\n DiskStorageAdapter,\n MarkdownStorageAdapter,\n PostgresStorageAdapter,\n SQLiteStorageAdapter,\n RedisStorageAdapter,\n OpenAILLMAdapter,\n AnthropicLLMAdapter,\n OpenAIEmbeddingAdapter,\n} from \"@memstack/core\";\n\ntype Env = Record<string, string | undefined>;\n\n// Drivers are optional peers the user installs; only a missing module means \"install it\".\nfunction isMissingModule(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return code === \"ERR_MODULE_NOT_FOUND\" || code === \"MODULE_NOT_FOUND\";\n}\n\nfunction buildLLMAdapter(env: Env): LLMProvider {\n if (!env.ANTHROPIC_API_KEY && !env.OPENAI_API_KEY) {\n throw new Error(\"At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set\");\n }\n if (env.ANTHROPIC_API_KEY) {\n return new AnthropicLLMAdapter({ apiKey: env.ANTHROPIC_API_KEY, defaultModel: env.MEMSTACK_LLM_MODEL });\n }\n return new OpenAILLMAdapter({\n apiKey: env.OPENAI_API_KEY ?? \"\",\n baseURL: env.MEMSTACK_OPENAI_BASE_URL,\n defaultModel: env.MEMSTACK_LLM_MODEL,\n });\n}\n\nfunction buildEmbeddingAdapter(env: Env): EmbeddingProvider | undefined {\n if (env.MEMSTACK_OPENAI_BASE_URL) return undefined;\n if (env.OPENAI_API_KEY) {\n return new OpenAIEmbeddingAdapter({ apiKey: env.OPENAI_API_KEY });\n }\n return undefined;\n}\n\nasync function buildStorageAdapter(env: Env): Promise<StorageProvider> {\n const storage = env.MEMSTACK_STORAGE ?? \"memory\";\n\n switch (storage) {\n case \"memory\":\n return new InMemoryStorageAdapter();\n\n case \"markdown\":\n return new MarkdownStorageAdapter({\n dir: env.MEMSTACK_DIR ?? \"./memories\",\n });\n\n case \"disk\":\n return new DiskStorageAdapter({\n storageDir: env.MEMSTACK_DIR ?? \"./memstack-data\",\n });\n\n case \"postgres\":\n if (!env.DATABASE_URL) {\n throw new Error(\"postgres storage requires DATABASE_URL\");\n }\n return new PostgresStorageAdapter({\n connectionString: env.DATABASE_URL,\n });\n\n case \"sqlite\": {\n try {\n // @ts-expect-error optional peer dep\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const db = new BetterSqlite3.default(\n env.SQLITE_PATH ?? \"./memstack.db\",\n );\n return new SQLiteStorageAdapter({ db: db as never });\n } catch (error) {\n if (!isMissingModule(error)) throw error;\n throw new Error(\n \"SQLite requires better-sqlite3. Install: npm install better-sqlite3@^11.10.0\",\n );\n }\n }\n\n case \"redis\": {\n try {\n const Redis = await import(\"ioredis\");\n const client = new Redis.default(\n env.REDIS_URL ?? \"redis://localhost:6379\",\n );\n return new RedisStorageAdapter({ redis: client as never });\n } catch (error) {\n if (!isMissingModule(error)) throw error;\n throw new Error(\n \"Redis requires ioredis. Install: npm install ioredis@^5.11.1\",\n );\n }\n }\n\n default:\n throw new Error(`Unknown MEMSTACK_STORAGE: \"${storage}\". Supported: memory, markdown, disk, postgres, sqlite, redis`);\n }\n}\n\nexport interface EnvConfigResult {\n config: MemStackConfig;\n /** From MEMSTACK_ACTOR, defaults to \"default\". Only meaningful for clients that scope work to one actor per process (e.g. the MCP server). */\n defaultActorId: string;\n}\n\n/**\n * Builds a MemStackConfig purely from environment variables. Shared by\n * @memstack/cli, @memstack/mcp, and @memstack/server so storage/LLM/embedding\n * wiring and env var behavior can't drift between the three entry points.\n */\nexport async function loadConfigFromEnv(): Promise<EnvConfigResult> {\n return buildConfig(process.env);\n}\n\n/**\n * Builds a MemStackConfig from `~/.memstack/config.json` overlaid with\n * environment variables. Used by harness entry points. Each section is taken\n * whole from one source: any LLM variable in the environment replaces the\n * file's `llm` section, and `MEMSTACK_STORAGE` replaces its `storage`\n * section, so a key from one provider is never sent to another's URL.\n */\nexport async function loadConfig(options: { configPath?: string } = {}): Promise<EnvConfigResult> {\n return buildConfig(mergeConfigFile(readConfigFile(options.configPath), process.env));\n}\n\n/** The environment with the config file's sections filled in where the environment has none. */\nexport function mergeConfigFile(file: MemStackConfigFile | undefined, env: Env): Env {\n const merged: Env = { ...env };\n const envHasLLM = LLM_ENV.some((key) => env[key] !== undefined);\n if (file?.llm && !envHasLLM) {\n if (file.llm.provider === \"anthropic\") merged.ANTHROPIC_API_KEY = file.llm.apiKey;\n else {\n merged.OPENAI_API_KEY = file.llm.apiKey;\n merged.MEMSTACK_OPENAI_BASE_URL = file.llm.baseURL;\n }\n merged.MEMSTACK_LLM_MODEL = file.llm.model;\n }\n if (file?.storage && env.MEMSTACK_STORAGE === undefined) {\n const { type, path, url } = file.storage;\n merged.MEMSTACK_STORAGE = type;\n if (type === \"sqlite\") merged.SQLITE_PATH = path;\n if (type === \"disk\" || type === \"markdown\") merged.MEMSTACK_DIR = path;\n if (type === \"postgres\") merged.DATABASE_URL = url;\n if (type === \"redis\") merged.REDIS_URL = url;\n }\n return merged;\n}\n\nconst LLM_ENV = [\"OPENAI_API_KEY\", \"ANTHROPIC_API_KEY\", \"MEMSTACK_OPENAI_BASE_URL\", \"MEMSTACK_LLM_MODEL\"];\n\nasync function buildConfig(env: Env): Promise<EnvConfigResult> {\n const llm = buildLLMAdapter(env);\n const embedding = buildEmbeddingAdapter(env);\n const storage = await buildStorageAdapter(env);\n const embedOnStore = env.MEMSTACK_EMBED_ON_STORE !== \"false\";\n const defaultActorId = env.MEMSTACK_ACTOR ?? \"default\";\n\n return {\n config: { llm, embedding, storage, defaults: { embedOnStore } },\n defaultActorId,\n };\n}\n\nexport { resolveProject, normalizeRemote, pinProject, PIN_FILE } from \"./project.js\";\nexport type { ProjectIdentity, ProjectSource } from \"./project.js\";\nexport {\n STORAGE_TYPES,\n memstackHome,\n configFilePath,\n readConfigFile,\n writeConfigFile,\n checkConfigPermissions,\n} from \"./config-file.js\";\nexport type { MemStackConfigFile, StorageType } from \"./config-file.js\";\n","import type { MemStackConfig } from \"@memstack/core\";\nimport { loadConfigFromEnv } from \"@memstack/config-env\";\n\nexport async function loadConfig(): Promise<MemStackConfig> {\n const { config } = await loadConfigFromEnv();\n return config;\n}\n","import { z } from \"zod\";\n\nexport const MemoryTypeSchema = z.enum([\"interaction\", \"summary\", \"observation\", \"fact\", \"reflection\", \"preference\", \"decision\", \"instruction\"]);\n\nconst isoDate = z.string().datetime({ offset: true }).or(z.string().date()).transform((s) => new Date(s));\n\nexport const StoreMemorySchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n embedding: z.array(z.number()).optional(),\n sourceId: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n id: z.string().optional(),\n});\n\nexport const BatchStoreSchema = z.object({\n memories: z.array(StoreMemorySchema).min(1),\n});\n\nexport const RetrieveSchema = z.object({\n actorId: z.string().optional(),\n query: z.string().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n tags: z.array(z.string()).optional(),\n limit: z.number().int().positive().optional(),\n strategy: z.enum([\"semantic\", \"hybrid\", \"recent\", \"important\"]).optional(),\n createdAfter: isoDate.optional(),\n createdBefore: isoDate.optional(),\n});\n\nexport const ContextSchema = z.object({\n actorId: z.string().min(1),\n maxTokens: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n retrieveStrategy: z.enum([\"recent\", \"important\", \"hybrid\"]).optional(),\n format: z.enum([\"markdown\", \"messages\"]).optional(),\n});\n\nexport const ProcessSchema = z.object({\n actorId: z.string().min(1),\n content: z.string().min(1),\n memoryType: MemoryTypeSchema.optional(),\n importance: z.number().min(0).max(1).optional(),\n emotionalValence: z.number().min(-1).max(1).optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n expiresAt: isoDate.optional(),\n onConflict: z.literal(\"append\").optional(),\n});\n\nexport const SummarizeSchema = z.object({\n actorId: z.string().optional(),\n olderThan: isoDate.optional(),\n skipMostRecent: z.number().int().nonnegative().optional(),\n targetCount: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n keepOriginals: z.boolean().optional(),\n chunkSize: z.number().int().positive().optional(),\n prompt: z.string().optional(),\n});\n\nexport interface RestPruneStrategy {\n type: \"byAge\" | \"byImportance\" | \"byCount\" | \"byType\" | \"compose\";\n actorId?: string;\n maxAge?: number;\n minImportance?: number;\n maxPerActor?: number;\n memoryTypes?: z.infer<typeof MemoryTypeSchema>[];\n strategies?: RestPruneStrategy[];\n}\n\n// \"custom\" prune (a JS predicate function) can't cross JSON, so it's excluded\n// from the REST-reachable type set — everything else in PruneStrategy is.\n//\n// actorId is optional in the schema (nested `strategies` entries don't need\n// it — only the top-level scan is ever actor-scoped) but the /v1/prune and\n// /v1/prune/dry-run route handlers reject a request that omits it at the top\n// level, since there's no \"current session actor\" to fall back on the way\n// the CLI/MCP surfaces have.\nexport const PruneStrategySchema: z.ZodType<RestPruneStrategy> = z.lazy(() =>\n z.object({\n type: z.enum([\"byAge\", \"byImportance\", \"byCount\", \"byType\", \"compose\"]),\n actorId: z.string().min(1).optional(),\n maxAge: z.number().nonnegative().optional(),\n minImportance: z.number().min(0).max(1).optional(),\n maxPerActor: z.number().int().positive().optional(),\n memoryTypes: z.array(MemoryTypeSchema).optional(),\n strategies: z.array(PruneStrategySchema).optional(),\n }),\n);\n\nexport const MergeSchema = z.object({\n ids: z.array(z.string()).min(2),\n});\n\nexport const PurgeSchema = z.object({\n actorId: z.string().min(1),\n});\n\nexport const DeleteManySchema = z.object({\n ids: z.array(z.string()).min(1),\n});\n\nexport const ImportSchema = z.union([\n z.array(z.unknown()),\n z.object({\n version: z.number().optional(),\n memories: z.array(z.unknown()),\n exportedAt: z.string().optional(),\n }),\n]);\n","import { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\n\ninterface RouteDoc {\n method: \"get\" | \"post\" | \"delete\";\n path: string;\n summary: string;\n requestSchema?: z.ZodType;\n successStatus: number;\n}\n\nconst ROUTES: RouteDoc[] = [\n { method: \"post\", path: \"/v1/memories\", summary: \"Store a memory\", requestSchema: StoreMemorySchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/batch\", summary: \"Store multiple memories\", requestSchema: BatchStoreSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/retrieve\", summary: \"Retrieve memories\", requestSchema: RetrieveSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/context\", summary: \"Compile LLM-ready context\", requestSchema: ContextSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/count\", summary: \"Count memories matching filters\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/export\", summary: \"Export a memory snapshot\", successStatus: 200 },\n { method: \"get\", path: \"/v1/memories/{id}\", summary: \"Get a memory by ID\", successStatus: 200 },\n { method: \"delete\", path: \"/v1/memories/{id}\", summary: \"Delete a memory by ID\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/delete-many\", summary: \"Delete multiple memories by ID\", requestSchema: DeleteManySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/purge\", summary: \"Delete all memories for an actor\", requestSchema: PurgeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/merge\", summary: \"Merge multiple memories into one\", requestSchema: MergeSchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/process\", summary: \"Store a memory with auto-enrichment\", requestSchema: ProcessSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/memories/{id}/touch\", summary: \"Bump a memory's recency\", successStatus: 200 },\n { method: \"post\", path: \"/v1/memories/import\", summary: \"Import a memory snapshot\", requestSchema: ImportSchema, successStatus: 201 },\n { method: \"post\", path: \"/v1/summarize\", summary: \"Compress old memories into a summary\", requestSchema: SummarizeSchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/summarize/stream\", summary: \"Stream summarization via SSE\", successStatus: 200 },\n { method: \"post\", path: \"/v1/prune\", summary: \"Remove stale/low-value memories\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"post\", path: \"/v1/prune/dry-run\", summary: \"Preview what a prune strategy would remove\", requestSchema: PruneStrategySchema, successStatus: 200 },\n { method: \"get\", path: \"/v1/stats/{actorId}\", summary: \"Memory diagnostics for an actor\", successStatus: 200 },\n { method: \"get\", path: \"/health\", summary: \"Health check\", successStatus: 200 },\n];\n\n/**\n * Hand-maintained route list, but request body shapes are generated from the\n * same zod schemas that validate incoming requests — one source of truth.\n */\nexport function buildOpenApiDocument(version: string): Record<string, unknown> {\n const paths: Record<string, Record<string, unknown>> = {};\n\n for (const route of ROUTES) {\n const pathItem = (paths[route.path] ??= {});\n const pathParams = [...route.path.matchAll(/\\{(\\w+)\\}/g)].map((m) => ({\n name: m[1],\n in: \"path\",\n required: true,\n schema: { type: \"string\" },\n }));\n\n pathItem[route.method] = {\n summary: route.summary,\n ...(pathParams.length ? { parameters: pathParams } : {}),\n ...(route.requestSchema\n ? {\n requestBody: {\n required: true,\n content: { \"application/json\": { schema: JSON.parse(JSON.stringify(zodToJsonSchema(route.requestSchema))) } },\n },\n }\n : {}),\n responses: {\n [String(route.successStatus)]: { description: \"Success\" },\n ...(route.requestSchema ? { \"400\": { description: \"Validation failed\" } } : {}),\n \"500\": { description: \"Internal error\" },\n },\n };\n }\n\n return {\n openapi: \"3.1.0\",\n info: {\n title: \"MemStack Server API\",\n version,\n description: \"REST API for MemStack — self-hostable agent memory. See https://github.com/isiomaC/memstack for the full guide.\",\n },\n servers: [{ url: \"/\" }],\n paths,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Hono, type Context } from \"hono\";\nimport { MemStack } from \"@memstack/core\";\nimport type { MemoryType, MemStackSnapshot } from \"@memstack/core\";\nimport type { z } from \"zod\";\nimport { loadConfig } from \"./config.js\";\nimport {\n StoreMemorySchema,\n BatchStoreSchema,\n RetrieveSchema,\n ContextSchema,\n ProcessSchema,\n SummarizeSchema,\n PruneStrategySchema,\n MergeSchema,\n PurgeSchema,\n DeleteManySchema,\n ImportSchema,\n} from \"./schemas.js\";\nimport { buildOpenApiDocument } from \"./openapi.js\";\n\nconst pkg = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf-8\")) as { version: string };\n\nconst app = new Hono();\n\nlet _ms: MemStack | null = null;\nasync function getMs(): Promise<MemStack> {\n if (!_ms) {\n _ms = new MemStack(await loadConfig());\n }\n return _ms;\n}\n\ntype ParsedBody<T> = { ok: true; data: T } | { ok: false; response: Response };\n\nasync function parseBody<S extends z.ZodTypeAny>(c: Context, schema: S): Promise<ParsedBody<z.infer<S>>> {\n const raw = await c.req.json().catch(() => undefined);\n const result = schema.safeParse(raw);\n if (!result.success) {\n return { ok: false, response: c.json({ error: \"Validation failed\", issues: result.error.issues }, 400) };\n }\n return { ok: true, data: result.data };\n}\n\napp.use(\"*\", async (c, next) => {\n const apiKey = process.env.MEMSTACK_API_KEY;\n if (apiKey) {\n const auth = c.req.header(\"Authorization\");\n if (!auth || auth !== `Bearer ${apiKey}`) {\n return c.json({ error: \"Unauthorized\" }, 401);\n }\n }\n await next();\n});\n\nconst requestCounts = new Map<string, { count: number; reset: number }>();\n\napp.use(\"*\", async (c, next) => {\n const rateLimit = parseInt(process.env.MEMSTACK_RATE_LIMIT ?? \"0\", 10);\n if (rateLimit <= 0) return next();\n\n const key = c.req.header(\"x-forwarded-for\") ?? \"anonymous\";\n const now = Date.now();\n const entry = requestCounts.get(key) ?? { count: 0, reset: now + 60000 };\n\n if (now > entry.reset) {\n entry.count = 1;\n entry.reset = now + 60000;\n } else {\n entry.count++;\n }\n\n requestCounts.set(key, entry);\n\n if (requestCounts.size > 10000) {\n for (const [k, v] of requestCounts) {\n if (now > v.reset) requestCounts.delete(k);\n }\n }\n\n if (entry.count > rateLimit) {\n return c.json({ error: \"Too many requests\" }, 429);\n }\n\n await next();\n});\n\napp.post(\"/v1/memories\", async (c) => {\n const parsed = await parseBody(c, StoreMemorySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.store(parsed.data);\n return c.json(memory, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/batch\", async (c) => {\n const parsed = await parseBody(c, BatchStoreSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.storeBatch(parsed.data.memories);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/retrieve\", async (c) => {\n const parsed = await parseBody(c, RetrieveSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const results = await (await getMs()).memory.retrieve(parsed.data);\n return c.json(results);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/context\", async (c) => {\n const parsed = await parseBody(c, ContextSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const ctx = await (await getMs()).memory.compileContext(parsed.data);\n return c.json({\n context: ctx.systemPrompt,\n tokenCount: ctx.tokenEstimate,\n memoryCount: ctx.recentMemories.length + ctx.importantMemories.length,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/count\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const memoryType = c.req.query(\"memoryType\");\n const minImportance = c.req.query(\"minImportance\");\n const count = await (await getMs()).memory.count({\n actorId,\n memoryType: memoryType as MemoryType | undefined,\n minImportance: minImportance ? parseFloat(minImportance) : undefined,\n });\n return c.json({ count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/export\", async (c) => {\n try {\n const actorId = c.req.query(\"actorId\");\n const snapshot = await (await getMs()).export(actorId);\n return c.json(snapshot);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/memories/:id\", async (c) => {\n try {\n const memory = await (await getMs()).memory.get(c.req.param(\"id\"));\n if (!memory) return c.json({ error: \"Not found\" }, 404);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.delete(\"/v1/memories/:id\", async (c) => {\n try {\n const id = c.req.param(\"id\");\n const ms = await getMs();\n const existing = await ms.memory.get(id);\n if (!existing) return c.json({ deleted: false, error: \"Not found\" }, 404);\n await ms.memory.delete(id);\n return c.json({ deleted: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/delete-many\", async (c) => {\n const parsed = await parseBody(c, DeleteManySchema);\n if (!parsed.ok) return parsed.response;\n try {\n const deleted = await (await getMs()).memory.deleteMany(parsed.data.ids);\n return c.json({ deleted });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/purge\", async (c) => {\n const parsed = await parseBody(c, PurgeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const count = await (await getMs()).memory.purgeActor(parsed.data.actorId);\n return c.json({ purged: count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/merge\", async (c) => {\n const parsed = await parseBody(c, MergeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const memory = await (await getMs()).memory.merge(parsed.data.ids);\n return c.json(memory);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/process\", async (c) => {\n const parsed = await parseBody(c, ProcessSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).process(parsed.data);\n return c.json(result, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/:id/touch\", async (c) => {\n try {\n await (await getMs()).memory.touch(c.req.param(\"id\"));\n return c.json({ touched: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/memories/import\", async (c) => {\n const parsed = await parseBody(c, ImportSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const body = parsed.data;\n const memories = Array.isArray(body) ? body : body.memories;\n const exportedAt = Array.isArray(body) ? new Date().toISOString() : (body.exportedAt ?? new Date().toISOString());\n // The snapshot's memories come from a prior export() call; we validate the\n // envelope shape above but trust the memory contents rather than re-validating\n // every field of every memory.\n const snapshot = { version: 1 as const, memories, exportedAt } as unknown as MemStackSnapshot;\n await (await getMs()).import(snapshot);\n return c.json({ imported: memories.length }, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/summarize\", async (c) => {\n const parsed = await parseBody(c, SummarizeSchema);\n if (!parsed.ok) return parsed.response;\n try {\n const result = await (await getMs()).memory.summarize(parsed.data);\n return c.json({\n summarized: result.deletedCount,\n summaryId: result.summary.id,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to prune (scopes deletion to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.prune(parsed.data);\n return c.json({ pruned: result.count });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.post(\"/v1/prune/dry-run\", async (c) => {\n const parsed = await parseBody(c, PruneStrategySchema);\n if (!parsed.ok) return parsed.response;\n if (!parsed.data.actorId) {\n return c.json({ error: \"actorId is required to preview pruning (scopes the scan to a single actor)\" }, 400);\n }\n try {\n const result = await (await getMs()).memory.dryRunPrune(parsed.data);\n return c.json(result);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/stats/:actorId\", async (c) => {\n try {\n const actorId = c.req.param(\"actorId\");\n const stats = await (await getMs()).memory.stats(actorId);\n return c.json(stats);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/v1/summarize/stream\", async (c) => {\n const actorId = c.req.query(\"actorId\") ?? \"default\";\n const olderThan = c.req.query(\"olderThan\");\n const skipMostRecent = c.req.query(\"skipMostRecent\");\n const targetCount = c.req.query(\"targetCount\");\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n const ms = await getMs();\n const gen = ms.memory.summarizeStream({\n actorId,\n olderThan: olderThan ? new Date(olderThan) : undefined,\n skipMostRecent: skipMostRecent ? parseInt(skipMostRecent, 10) : undefined,\n targetCount: targetCount ? parseInt(targetCount, 10) : undefined,\n });\n\n for await (const { chunk, text } of gen) {\n const line = `data: ${JSON.stringify({ chunk, text })}\\n\\n`;\n controller.enqueue(new TextEncoder().encode(line));\n }\n controller.enqueue(new TextEncoder().encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Internal error\";\n controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify({ error: msg })}\\n\\n`));\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n});\n\napp.get(\"/health\", async (c) => {\n try {\n const status = await (await getMs()).health();\n return c.json({\n status: status.storage ? \"ok\" : \"degraded\",\n storage: status.storage ? \"connected\" : \"disconnected\",\n version: pkg.version,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : \"Internal error\" }, 500);\n }\n});\n\napp.get(\"/openapi.json\", (c) => c.json(buildOpenApiDocument(pkg.version)));\n\nsetInterval(() => {\n const now = Date.now();\n for (const [key, entry] of requestCounts) {\n if (now > entry.reset) requestCounts.delete(key);\n }\n}, 60000).unref();\n\nconst port = parseInt(process.env.PORT ?? \"3000\", 10);\n\n// Bun and Deno auto-start an HTTP server from this shape when the module is\n// run directly. Node has no equivalent — see serve.ts for the Node entry point.\nexport default { port, fetch: app.fetch };\n","#!/usr/bin/env node\nimport { serve } from \"@hono/node-server\";\nimport server from \"./index.js\";\n\nserve(server, (info) => {\n console.log(`memstack server listening on http://localhost:${info.port}`);\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memstack/server",
3
- "version": "0.7.3",
3
+ "version": "0.8.0",
4
4
  "description": "REST API server for MemStack — self-hostable agent memory",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -33,14 +33,14 @@
33
33
  "hono": "^4.0.0",
34
34
  "zod": "^3.23.8",
35
35
  "zod-to-json-schema": "^3.25.2",
36
- "@memstack/core": "0.7.3"
36
+ "@memstack/core": "0.8.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.0.0",
40
40
  "tsup": "^8.0.0",
41
41
  "typescript": "^5.7.0",
42
42
  "vitest": "^1.0.0",
43
- "@memstack/config-env": "0.7.3"
43
+ "@memstack/config-env": "0.8.0"
44
44
  },
45
45
  "keywords": [
46
46
  "api",