@reactive-agents/memory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/index.d.ts +516 -0
- package/dist/index.js +1424 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/database.ts","../src/search.ts","../src/services/memory-service.ts","../src/services/working-memory.ts","../src/services/semantic-memory.ts","../src/services/episodic-memory.ts","../src/services/procedural-memory.ts","../src/fs/memory-file-system.ts","../src/indexing/zettelkasten.ts","../src/compaction/compaction-service.ts","../src/extraction/memory-extractor.ts","../src/extraction/memory-consolidator.ts","../src/runtime.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\n// ─── Memory ID (branded string) ───\n\nexport const MemoryId = Schema.String.pipe(Schema.brand(\"MemoryId\"));\nexport type MemoryId = typeof MemoryId.Type;\n\n// ─── Memory Type (4 types) ───\n\nexport const MemoryType = Schema.Literal(\n \"semantic\",\n \"episodic\",\n \"procedural\",\n \"working\",\n);\nexport type MemoryType = typeof MemoryType.Type;\n\n// ─── Memory Source ───\n\nexport const MemorySourceSchema = Schema.Struct({\n type: Schema.Literal(\"agent\", \"user\", \"tool\", \"system\", \"llm-extraction\"),\n id: Schema.String,\n taskId: Schema.optional(Schema.String),\n});\nexport type MemorySource = typeof MemorySourceSchema.Type;\n\n// ─── Base Memory Entry ───\n\nexport const MemoryEntrySchema = Schema.Struct({\n id: MemoryId,\n agentId: Schema.String,\n type: MemoryType,\n content: Schema.String,\n importance: Schema.Number.pipe(Schema.between(0, 1)),\n createdAt: Schema.DateFromSelf,\n updatedAt: Schema.DateFromSelf,\n source: MemorySourceSchema,\n tags: Schema.Array(Schema.String),\n metadata: Schema.optional(\n Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n ),\n});\nexport type MemoryEntry = typeof MemoryEntrySchema.Type;\n\n// ─── Semantic Memory Entry (long-term knowledge) ───\n\nexport const SemanticEntrySchema = Schema.Struct({\n id: MemoryId,\n agentId: Schema.String,\n content: Schema.String,\n summary: Schema.String,\n importance: Schema.Number.pipe(Schema.between(0, 1)),\n verified: Schema.Boolean,\n tags: Schema.Array(Schema.String),\n embedding: Schema.optional(Schema.Array(Schema.Number)),\n createdAt: Schema.DateFromSelf,\n updatedAt: Schema.DateFromSelf,\n accessCount: Schema.Number,\n lastAccessedAt: Schema.DateFromSelf,\n});\nexport type SemanticEntry = typeof SemanticEntrySchema.Type;\n\n// ─── Daily Log Entry (episodic) ───\n\nexport const DailyLogEntrySchema = Schema.Struct({\n id: MemoryId,\n agentId: Schema.String,\n date: Schema.String,\n content: Schema.String,\n taskId: Schema.optional(Schema.String),\n eventType: Schema.Literal(\n \"task-started\",\n \"task-completed\",\n \"task-failed\",\n \"decision-made\",\n \"error-encountered\",\n \"user-feedback\",\n \"tool-call\",\n \"observation\",\n ),\n cost: Schema.optional(Schema.Number),\n duration: Schema.optional(Schema.Number),\n metadata: Schema.optional(\n Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n ),\n createdAt: Schema.DateFromSelf,\n});\nexport type DailyLogEntry = typeof DailyLogEntrySchema.Type;\n\n// ─── Session Snapshot (episodic) ───\n\nexport const SessionSnapshotSchema = Schema.Struct({\n id: Schema.String,\n agentId: Schema.String,\n messages: Schema.Array(Schema.Unknown),\n summary: Schema.String,\n keyDecisions: Schema.Array(Schema.String),\n taskIds: Schema.Array(Schema.String),\n startedAt: Schema.DateFromSelf,\n endedAt: Schema.DateFromSelf,\n totalCost: Schema.Number,\n totalTokens: Schema.Number,\n});\nexport type SessionSnapshot = typeof SessionSnapshotSchema.Type;\n\n// ─── Procedural Entry (learned workflows) ───\n\nexport const ProceduralEntrySchema = Schema.Struct({\n id: MemoryId,\n agentId: Schema.String,\n name: Schema.String,\n description: Schema.String,\n pattern: Schema.String,\n successRate: Schema.Number.pipe(Schema.between(0, 1)),\n useCount: Schema.Number,\n tags: Schema.Array(Schema.String),\n createdAt: Schema.DateFromSelf,\n updatedAt: Schema.DateFromSelf,\n});\nexport type ProceduralEntry = typeof ProceduralEntrySchema.Type;\n\n// ─── Working Memory Item (in-process only) ───\n\nexport const WorkingMemoryItemSchema = Schema.Struct({\n id: MemoryId,\n content: Schema.String,\n importance: Schema.Number.pipe(Schema.between(0, 1)),\n addedAt: Schema.DateFromSelf,\n source: MemorySourceSchema,\n});\nexport type WorkingMemoryItem = typeof WorkingMemoryItemSchema.Type;\n\n// ─── Zettelkasten Link ───\n\nexport const LinkType = Schema.Literal(\n \"similar\",\n \"sequential\",\n \"causal\",\n \"contradicts\",\n \"supports\",\n \"elaborates\",\n);\nexport type LinkType = typeof LinkType.Type;\n\nexport const ZettelLinkSchema = Schema.Struct({\n source: MemoryId,\n target: MemoryId,\n strength: Schema.Number.pipe(Schema.between(0, 1)),\n type: LinkType,\n createdAt: Schema.DateFromSelf,\n});\nexport type ZettelLink = typeof ZettelLinkSchema.Type;\n\n// ─── Compaction Config ───\n\nexport const CompactionStrategySchema = Schema.Literal(\n \"count\",\n \"time\",\n \"semantic\",\n \"progressive\",\n);\nexport type CompactionStrategy = typeof CompactionStrategySchema.Type;\n\nexport const CompactionConfigSchema = Schema.Struct({\n strategy: CompactionStrategySchema,\n maxEntries: Schema.optional(Schema.Number),\n intervalMs: Schema.optional(Schema.Number),\n similarityThreshold: Schema.optional(Schema.Number),\n decayFactor: Schema.optional(Schema.Number),\n});\nexport type CompactionConfig = typeof CompactionConfigSchema.Type;\n\n// ─── Search Options ───\n\nexport const SearchOptionsSchema = Schema.Struct({\n query: Schema.String,\n types: Schema.optional(Schema.Array(MemoryType)),\n limit: Schema.optional(Schema.Number),\n threshold: Schema.optional(Schema.Number),\n useVector: Schema.optional(Schema.Boolean),\n agentId: Schema.String,\n});\nexport type SearchOptions = typeof SearchOptionsSchema.Type;\n\n// ─── Memory Bootstrap Result ───\n\nexport const MemoryBootstrapResultSchema = Schema.Struct({\n agentId: Schema.String,\n semanticContext: Schema.String,\n recentEpisodes: Schema.Array(DailyLogEntrySchema),\n activeWorkflows: Schema.Array(ProceduralEntrySchema),\n workingMemory: Schema.Array(WorkingMemoryItemSchema),\n bootstrappedAt: Schema.DateFromSelf,\n tier: Schema.Literal(\"1\", \"2\"),\n});\nexport type MemoryBootstrapResult = typeof MemoryBootstrapResultSchema.Type;\n\n// ─── Eviction Policy ───\n\nexport const EvictionPolicy = Schema.Literal(\"fifo\", \"lru\", \"importance\");\nexport type EvictionPolicy = typeof EvictionPolicy.Type;\n\n// ─── Memory Config ───\n\nexport const MemoryConfigSchema = Schema.Struct({\n tier: Schema.Literal(\"1\", \"2\"),\n agentId: Schema.String,\n dbPath: Schema.String,\n working: Schema.Struct({\n capacity: Schema.Number,\n evictionPolicy: EvictionPolicy,\n }),\n semantic: Schema.Struct({\n maxMarkdownLines: Schema.Number,\n importanceThreshold: Schema.Number,\n }),\n episodic: Schema.Struct({\n retainDays: Schema.Number,\n maxSnapshotsPerSession: Schema.Number,\n }),\n compaction: CompactionConfigSchema,\n zettelkasten: Schema.Struct({\n enabled: Schema.Boolean,\n linkingThreshold: Schema.Number.pipe(Schema.between(0, 1)),\n maxLinksPerEntry: Schema.Number,\n }),\n});\nexport type MemoryConfig = typeof MemoryConfigSchema.Type;\n\nexport const defaultMemoryConfig = (agentId: string): MemoryConfig => ({\n tier: \"1\",\n agentId,\n dbPath: `.reactive-agents/memory/${agentId}/memory.db`,\n working: { capacity: 7, evictionPolicy: \"fifo\" },\n semantic: { maxMarkdownLines: 200, importanceThreshold: 0.7 },\n episodic: { retainDays: 30, maxSnapshotsPerSession: 3 },\n compaction: {\n strategy: \"progressive\",\n maxEntries: 1000,\n intervalMs: 86_400_000,\n similarityThreshold: 0.92,\n decayFactor: 0.05,\n },\n zettelkasten: {\n enabled: true,\n linkingThreshold: 0.85,\n maxLinksPerEntry: 10,\n },\n});\n","import { Data } from \"effect\";\n\nexport class MemoryError extends Data.TaggedError(\"MemoryError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\nexport class MemoryNotFoundError extends Data.TaggedError(\n \"MemoryNotFoundError\",\n)<{\n readonly memoryId: string;\n readonly message: string;\n}> {}\n\nexport class DatabaseError extends Data.TaggedError(\"DatabaseError\")<{\n readonly message: string;\n readonly operation: \"read\" | \"write\" | \"delete\" | \"search\" | \"migrate\";\n readonly cause?: unknown;\n}> {}\n\nexport class CapacityExceededError extends Data.TaggedError(\n \"CapacityExceededError\",\n)<{\n readonly message: string;\n readonly capacity: number;\n readonly current: number;\n}> {}\n\nexport class ContextError extends Data.TaggedError(\"ContextError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\nexport class CompactionError extends Data.TaggedError(\"CompactionError\")<{\n readonly message: string;\n readonly strategy: string;\n readonly cause?: unknown;\n}> {}\n\nexport class SearchError extends Data.TaggedError(\"SearchError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\nexport class ExtractionError extends Data.TaggedError(\"ExtractionError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n","import { Effect, Context, Layer } from \"effect\";\nimport { Database } from \"bun:sqlite\";\nimport { DatabaseError } from \"./errors.js\";\nimport type { MemoryConfig } from \"./types.js\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// ─── Service Interface (extracted to break circular reference) ───\n\nexport interface MemoryDatabaseService {\n /** Execute a query with parameters. Returns rows. */\n readonly query: <T = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ) => Effect.Effect<T[], DatabaseError>;\n\n /** Execute a statement (INSERT/UPDATE/DELETE). Returns changes count. */\n readonly exec: (\n sql: string,\n params?: readonly unknown[],\n ) => Effect.Effect<number, DatabaseError>;\n\n /** Execute multiple statements in a transaction. */\n readonly transaction: <T>(\n fn: (db: MemoryDatabaseService) => Effect.Effect<T, DatabaseError>,\n ) => Effect.Effect<T, DatabaseError>;\n\n /** Close the database connection. */\n readonly close: () => Effect.Effect<void, never>;\n}\n\n// ─── Service Tag ───\n\nexport class MemoryDatabase extends Context.Tag(\"MemoryDatabase\")<\n MemoryDatabase,\n MemoryDatabaseService\n>() {}\n\n// ─── Schema SQL ───\n\nconst SCHEMA_SQL = `\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = NORMAL;\n PRAGMA foreign_keys = ON;\n\n CREATE TABLE IF NOT EXISTS semantic_memory (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n content TEXT NOT NULL,\n summary TEXT NOT NULL,\n importance REAL NOT NULL DEFAULT 0.5,\n verified INTEGER NOT NULL DEFAULT 0,\n tags TEXT NOT NULL DEFAULT '[]',\n embedding BLOB,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n access_count INTEGER NOT NULL DEFAULT 0,\n last_accessed_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS episodic_log (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n date TEXT NOT NULL,\n content TEXT NOT NULL,\n task_id TEXT,\n event_type TEXT NOT NULL,\n cost REAL,\n duration REAL,\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS session_snapshots (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n messages TEXT NOT NULL,\n summary TEXT NOT NULL,\n key_decisions TEXT NOT NULL DEFAULT '[]',\n task_ids TEXT NOT NULL DEFAULT '[]',\n started_at TEXT NOT NULL,\n ended_at TEXT NOT NULL,\n total_cost REAL NOT NULL DEFAULT 0,\n total_tokens INTEGER NOT NULL DEFAULT 0\n );\n\n CREATE TABLE IF NOT EXISTS procedural_memory (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT NOT NULL,\n pattern TEXT NOT NULL,\n success_rate REAL NOT NULL DEFAULT 0,\n use_count INTEGER NOT NULL DEFAULT 0,\n tags TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS zettel_links (\n source_id TEXT NOT NULL,\n target_id TEXT NOT NULL,\n strength REAL NOT NULL DEFAULT 0,\n type TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (source_id, target_id)\n );\n\n -- FTS5 virtual table for full-text search (Tier 1 semantic search)\n CREATE VIRTUAL TABLE IF NOT EXISTS semantic_fts USING fts5(\n id UNINDEXED,\n content,\n tags,\n content='semantic_memory',\n content_rowid='rowid'\n );\n\n -- FTS5 for episodic log\n CREATE VIRTUAL TABLE IF NOT EXISTS episodic_fts USING fts5(\n id UNINDEXED,\n content,\n content='episodic_log',\n content_rowid='rowid'\n );\n\n -- Triggers to keep FTS5 in sync\n CREATE TRIGGER IF NOT EXISTS semantic_fts_insert\n AFTER INSERT ON semantic_memory BEGIN\n INSERT INTO semantic_fts(rowid, id, content, tags)\n VALUES (new.rowid, new.id, new.content, new.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS semantic_fts_delete\n AFTER DELETE ON semantic_memory BEGIN\n INSERT INTO semantic_fts(semantic_fts, rowid, id, content, tags)\n VALUES ('delete', old.rowid, old.id, old.content, old.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS semantic_fts_update\n AFTER UPDATE ON semantic_memory BEGIN\n INSERT INTO semantic_fts(semantic_fts, rowid, id, content, tags)\n VALUES ('delete', old.rowid, old.id, old.content, old.tags);\n INSERT INTO semantic_fts(rowid, id, content, tags)\n VALUES (new.rowid, new.id, new.content, new.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS episodic_fts_insert\n AFTER INSERT ON episodic_log BEGIN\n INSERT INTO episodic_fts(rowid, id, content)\n VALUES (new.rowid, new.id, new.content);\n END;\n\n CREATE TRIGGER IF NOT EXISTS episodic_fts_delete\n AFTER DELETE ON episodic_log BEGIN\n INSERT INTO episodic_fts(episodic_fts, rowid, id, content)\n VALUES ('delete', old.rowid, old.id, old.content);\n END;\n\n CREATE TRIGGER IF NOT EXISTS episodic_fts_update\n AFTER UPDATE ON episodic_log BEGIN\n INSERT INTO episodic_fts(episodic_fts, rowid, id, content)\n VALUES ('delete', old.rowid, old.id, old.content);\n INSERT INTO episodic_fts(rowid, id, content)\n VALUES (new.rowid, new.id, new.content);\n END;\n`;\n\n// ─── Live Implementation ───\n\nexport const MemoryDatabaseLive = (config: MemoryConfig) =>\n Layer.scoped(\n MemoryDatabase,\n Effect.gen(function* () {\n // Ensure directory exists\n const dbDir = path.dirname(config.dbPath);\n yield* Effect.sync(() => {\n if (!fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n }\n });\n\n // Open SQLite connection\n const db = yield* Effect.try({\n try: () => new Database(config.dbPath, { create: true }),\n catch: (e) =>\n new DatabaseError({\n message: `Failed to open database: ${e}`,\n operation: \"migrate\",\n cause: e,\n }),\n });\n\n // Run schema migrations\n yield* Effect.try({\n try: () => db.exec(SCHEMA_SQL),\n catch: (e) =>\n new DatabaseError({\n message: `Schema migration failed: ${e}`,\n operation: \"migrate\",\n cause: e,\n }),\n });\n\n // Register finalizer to close DB cleanly\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n try {\n db.close();\n } catch {\n /* ignore */\n }\n }),\n );\n\n const service: MemoryDatabaseService = {\n query: <T>(sql: string, params: readonly unknown[] = []) =>\n Effect.try({\n try: () => {\n const stmt = db.prepare(sql);\n return stmt.all(...(params as any[])) as T[];\n },\n catch: (e) =>\n new DatabaseError({\n message: `Query failed: ${e}\\nSQL: ${sql}`,\n operation: \"read\",\n cause: e,\n }),\n }),\n\n exec: (sql: string, params: readonly unknown[] = []) =>\n Effect.try({\n try: () => {\n const stmt = db.prepare(sql);\n const result = stmt.run(...(params as any[]));\n return result.changes;\n },\n catch: (e) =>\n new DatabaseError({\n message: `Exec failed: ${e}\\nSQL: ${sql}`,\n operation: \"write\",\n cause: e,\n }),\n }),\n\n transaction: <T>(fn: (db: MemoryDatabaseService) => Effect.Effect<T, DatabaseError>) =>\n Effect.gen(function* () {\n let result: unknown;\n yield* Effect.try({\n try: () => {\n const txn = db.transaction(() => {\n result = Effect.runSync(fn(service));\n });\n txn();\n },\n catch: (e) =>\n new DatabaseError({\n message: `Transaction failed: ${e}`,\n operation: \"write\",\n cause: e,\n }),\n });\n return result as T;\n }),\n\n close: () =>\n Effect.sync(() => {\n try {\n db.close();\n } catch {\n /* ignore */\n }\n }),\n };\n\n return service;\n }),\n );\n","import { Effect, Context, Layer } from \"effect\";\nimport { MemoryDatabase } from \"./database.js\";\nimport type { SearchOptions, SemanticEntry, DailyLogEntry } from \"./types.js\";\nimport type { MemoryId } from \"./types.js\";\nimport { DatabaseError } from \"./errors.js\";\n\n// ─── Service Tag ───\n\nexport class MemorySearchService extends Context.Tag(\"MemorySearchService\")<\n MemorySearchService,\n {\n /** Full-text search across semantic memory (FTS5). Tier 1 + 2. */\n readonly searchSemantic: (\n options: SearchOptions,\n ) => Effect.Effect<SemanticEntry[], DatabaseError>;\n\n /** Full-text search across episodic log (FTS5). Tier 1 + 2. */\n readonly searchEpisodic: (\n options: SearchOptions,\n ) => Effect.Effect<DailyLogEntry[], DatabaseError>;\n\n /**\n * Vector KNN search across semantic memory (sqlite-vec). Tier 2 only.\n * Returns DatabaseError if vec0 extension not loaded.\n */\n readonly searchVector: (\n queryEmbedding: readonly number[],\n agentId: string,\n limit: number,\n ) => Effect.Effect<SemanticEntry[], DatabaseError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const MemorySearchServiceLive = Layer.effect(\n MemorySearchService,\n Effect.gen(function* () {\n const db = yield* MemoryDatabase;\n\n return {\n searchSemantic: (options) =>\n Effect.gen(function* () {\n const limit = options.limit ?? 10;\n const rows = yield* db.query<{\n id: string;\n agent_id: string;\n content: string;\n summary: string;\n importance: number;\n verified: number;\n tags: string;\n created_at: string;\n updated_at: string;\n access_count: number;\n last_accessed_at: string;\n }>(\n `SELECT sm.*\n FROM semantic_memory sm\n JOIN semantic_fts ON semantic_fts.id = sm.id\n WHERE semantic_fts MATCH ?\n AND sm.agent_id = ?\n ORDER BY rank\n LIMIT ?`,\n [options.query, options.agentId, limit],\n );\n\n return rows.map((r) => ({\n id: r.id as MemoryId,\n agentId: r.agent_id,\n content: r.content,\n summary: r.summary,\n importance: r.importance,\n verified: Boolean(r.verified),\n tags: JSON.parse(r.tags),\n createdAt: new Date(r.created_at),\n updatedAt: new Date(r.updated_at),\n accessCount: r.access_count,\n lastAccessedAt: new Date(r.last_accessed_at),\n })) satisfies SemanticEntry[];\n }),\n\n searchEpisodic: (options) =>\n Effect.gen(function* () {\n const limit = options.limit ?? 20;\n const rows = yield* db.query<{\n id: string;\n agent_id: string;\n date: string;\n content: string;\n task_id: string | null;\n event_type: string;\n cost: number | null;\n duration: number | null;\n metadata: string;\n created_at: string;\n }>(\n `SELECT el.*\n FROM episodic_log el\n JOIN episodic_fts ON episodic_fts.id = el.id\n WHERE episodic_fts MATCH ?\n AND el.agent_id = ?\n ORDER BY rank\n LIMIT ?`,\n [options.query, options.agentId, limit],\n );\n\n return rows.map((r) => ({\n id: r.id as MemoryId,\n agentId: r.agent_id,\n date: r.date,\n content: r.content,\n taskId: r.task_id ?? undefined,\n eventType: r.event_type as DailyLogEntry[\"eventType\"],\n cost: r.cost ?? undefined,\n duration: r.duration ?? undefined,\n metadata: JSON.parse(r.metadata),\n createdAt: new Date(r.created_at),\n })) satisfies DailyLogEntry[];\n }),\n\n // Tier 2 only — requires sqlite-vec extension loaded on db connection\n searchVector: (_queryEmbedding, _agentId, _limit) =>\n Effect.fail(\n new DatabaseError({\n message:\n \"Vector search requires Tier 2 (sqlite-vec). Use createMemoryLayer('2').\",\n operation: \"search\",\n }),\n ),\n };\n }),\n);\n","import { Effect, Context, Layer } from \"effect\";\nimport type {\n MemoryBootstrapResult,\n MemoryConfig,\n SemanticEntry,\n DailyLogEntry,\n WorkingMemoryItem,\n MemoryId,\n SessionSnapshot,\n} from \"../types.js\";\nimport { MemoryError, DatabaseError } from \"../errors.js\";\nimport { WorkingMemoryService } from \"./working-memory.js\";\nimport { SemanticMemoryService } from \"./semantic-memory.js\";\nimport { EpisodicMemoryService } from \"./episodic-memory.js\";\nimport { ProceduralMemoryService } from \"./procedural-memory.js\";\nimport { MemoryFileSystem } from \"../fs/memory-file-system.js\";\nimport { ZettelkastenService } from \"../indexing/zettelkasten.js\";\n\n// ─── Service Tag ───\n\nexport class MemoryService extends Context.Tag(\"MemoryService\")<\n MemoryService,\n {\n /**\n * Bootstrap: load semantic context + recent episodes for agent.\n * Called by ExecutionEngine at Phase 1 (BOOTSTRAP).\n */\n readonly bootstrap: (\n agentId: string,\n ) => Effect.Effect<MemoryBootstrapResult, MemoryError | DatabaseError>;\n\n /**\n * Flush: generate memory.md projection from SQLite and write to disk.\n */\n readonly flush: (\n agentId: string,\n ) => Effect.Effect<void, MemoryError | DatabaseError>;\n\n /**\n * Snapshot: save session messages to episodic SQLite storage.\n */\n readonly snapshot: (\n snapshot: SessionSnapshot,\n ) => Effect.Effect<void, DatabaseError>;\n\n /**\n * Store a working memory item (adds to in-process Ref).\n */\n readonly addToWorking: (\n item: WorkingMemoryItem,\n ) => Effect.Effect<void, never>;\n\n /**\n * Store a semantic memory entry (persists to SQLite).\n * Auto-links via Zettelkasten if enabled.\n */\n readonly storeSemantic: (\n entry: SemanticEntry,\n ) => Effect.Effect<MemoryId, DatabaseError>;\n\n /**\n * Log an episodic event (persists to SQLite).\n */\n readonly logEpisode: (\n entry: DailyLogEntry,\n ) => Effect.Effect<MemoryId, DatabaseError>;\n\n /**\n * Get current working memory contents.\n */\n readonly getWorking: () => Effect.Effect<\n readonly WorkingMemoryItem[],\n never\n >;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const MemoryServiceLive = (config: MemoryConfig) =>\n Layer.effect(\n MemoryService,\n Effect.gen(function* () {\n const working = yield* WorkingMemoryService;\n const semantic = yield* SemanticMemoryService;\n const episodic = yield* EpisodicMemoryService;\n const _procedural = yield* ProceduralMemoryService;\n const fileSystem = yield* MemoryFileSystem;\n const zettel = yield* ZettelkastenService;\n\n const basePath = `.reactive-agents/memory`;\n\n return {\n bootstrap: (agentId) =>\n Effect.gen(function* () {\n // Ensure directory exists\n yield* fileSystem\n .ensureDirectory(agentId, basePath)\n .pipe(Effect.catchAll(() => Effect.void));\n\n // Read memory.md for semantic context\n const semanticContext = yield* fileSystem\n .readMarkdown(agentId, basePath)\n .pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n\n // Get recent episodic entries (last 20)\n const recentEpisodes = yield* episodic\n .getRecent(agentId, 20)\n .pipe(Effect.catchAll(() => Effect.succeed([] as DailyLogEntry[])));\n\n // Get active workflows\n const activeWorkflows = yield* _procedural\n .listActive(agentId)\n .pipe(Effect.catchAll(() => Effect.succeed([] as never[])));\n\n // Get current working memory\n const workingMemory = yield* working.get();\n\n return {\n agentId,\n semanticContext,\n recentEpisodes,\n activeWorkflows,\n workingMemory: [...workingMemory],\n bootstrappedAt: new Date(),\n tier: config.tier,\n } satisfies MemoryBootstrapResult;\n }),\n\n flush: (agentId) =>\n Effect.gen(function* () {\n const markdown = yield* semantic.generateMarkdown(\n agentId,\n config.semantic.maxMarkdownLines,\n );\n yield* fileSystem.writeMarkdown(agentId, markdown, basePath);\n }),\n\n snapshot: (snap) => episodic.saveSnapshot(snap),\n\n addToWorking: (item) => working.add(item),\n\n storeSemantic: (entry) =>\n Effect.gen(function* () {\n const id = yield* semantic.store(entry);\n // Auto-link if Zettelkasten enabled\n if (config.zettelkasten.enabled) {\n yield* zettel\n .autoLinkText(\n entry.id,\n entry.content,\n entry.agentId,\n config.zettelkasten.linkingThreshold,\n )\n .pipe(Effect.catchAll(() => Effect.succeed([])));\n }\n return id;\n }),\n\n logEpisode: (entry) => episodic.log(entry),\n\n getWorking: () => working.get(),\n };\n }),\n );\n","import { Effect, Context, Layer, Ref } from \"effect\";\nimport type { WorkingMemoryItem, EvictionPolicy } from \"../types.js\";\nimport { MemoryError } from \"../errors.js\";\n\n// ─── Service Tag ───\n\nexport class WorkingMemoryService extends Context.Tag(\"WorkingMemoryService\")<\n WorkingMemoryService,\n {\n /** Add item to working memory. Evicts according to policy if at capacity. */\n readonly add: (item: WorkingMemoryItem) => Effect.Effect<void, never>;\n\n /** Get all items in working memory (newest first). */\n readonly get: () => Effect.Effect<readonly WorkingMemoryItem[], never>;\n\n /** Clear all items. */\n readonly clear: () => Effect.Effect<void, never>;\n\n /** Evict one item according to policy and return it. */\n readonly evict: () => Effect.Effect<WorkingMemoryItem, MemoryError>;\n\n /** Current count. */\n readonly size: () => Effect.Effect<number, never>;\n\n /** Find item by content similarity (text contains). */\n readonly find: (\n query: string,\n ) => Effect.Effect<readonly WorkingMemoryItem[], never>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const WorkingMemoryServiceLive = (\n capacity: number = 7,\n evictionPolicy: EvictionPolicy = \"fifo\",\n) =>\n Layer.effect(\n WorkingMemoryService,\n Effect.gen(function* () {\n const store = yield* Ref.make<WorkingMemoryItem[]>([]);\n\n const evictOne = (items: WorkingMemoryItem[]): WorkingMemoryItem[] => {\n if (items.length === 0) return items;\n switch (evictionPolicy) {\n case \"fifo\":\n return items.slice(1);\n case \"lru\":\n // Evict least recently added (same as FIFO for add-only workloads)\n return items.slice(1);\n case \"importance\": {\n // Evict lowest importance\n const minIdx = items.reduce(\n (minI, item, i) =>\n item.importance < items[minI]!.importance ? i : minI,\n 0,\n );\n return [...items.slice(0, minIdx), ...items.slice(minIdx + 1)];\n }\n }\n };\n\n return {\n add: (item) =>\n Ref.update(store, (items) => {\n const withRoom =\n items.length >= capacity ? evictOne(items) : items;\n return [...withRoom, item];\n }),\n\n get: () =>\n Ref.get(store).pipe(\n Effect.map(\n (items) => [...items].reverse() as readonly WorkingMemoryItem[],\n ),\n ),\n\n clear: () => Ref.set(store, []),\n\n evict: () =>\n Effect.gen(function* () {\n const items = yield* Ref.get(store);\n if (items.length === 0) {\n return yield* Effect.fail(\n new MemoryError({\n message: \"Working memory is empty, cannot evict\",\n }),\n );\n }\n const evicted = items[0]!;\n yield* Ref.set(store, items.slice(1));\n return evicted;\n }),\n\n size: () => Ref.get(store).pipe(Effect.map((items) => items.length)),\n\n find: (query) =>\n Ref.get(store).pipe(\n Effect.map((items) =>\n items.filter((item) =>\n item.content.toLowerCase().includes(query.toLowerCase()),\n ),\n ),\n ),\n };\n }),\n );\n","import { Effect, Context, Layer } from \"effect\";\nimport type { SemanticEntry, MemoryId } from \"../types.js\";\nimport { MemoryNotFoundError, DatabaseError } from \"../errors.js\";\nimport { MemoryDatabase } from \"../database.js\";\n\n// ─── Service Tag ───\n\nexport class SemanticMemoryService extends Context.Tag(\"SemanticMemoryService\")<\n SemanticMemoryService,\n {\n /** Store a semantic memory entry. */\n readonly store: (\n entry: SemanticEntry,\n ) => Effect.Effect<MemoryId, DatabaseError>;\n\n /** Get entry by ID. */\n readonly get: (\n id: MemoryId,\n ) => Effect.Effect<SemanticEntry, MemoryNotFoundError | DatabaseError>;\n\n /** Update an existing entry. */\n readonly update: (\n id: MemoryId,\n patch: Partial<\n Pick<\n SemanticEntry,\n \"content\" | \"summary\" | \"importance\" | \"verified\" | \"tags\"\n >\n >,\n ) => Effect.Effect<void, DatabaseError>;\n\n /** Delete an entry. */\n readonly delete: (id: MemoryId) => Effect.Effect<void, DatabaseError>;\n\n /** Get all entries for an agent, sorted by importance desc. */\n readonly listByAgent: (\n agentId: string,\n limit?: number,\n ) => Effect.Effect<SemanticEntry[], DatabaseError>;\n\n /** Increment access count and update last_accessed_at. */\n readonly recordAccess: (id: MemoryId) => Effect.Effect<void, DatabaseError>;\n\n /** Generate memory.md projection (top N entries by importance, max 200 lines). */\n readonly generateMarkdown: (\n agentId: string,\n maxLines?: number,\n ) => Effect.Effect<string, DatabaseError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const SemanticMemoryServiceLive = Layer.effect(\n SemanticMemoryService,\n Effect.gen(function* () {\n const db = yield* MemoryDatabase;\n\n const rowToEntry = (r: Record<string, unknown>): SemanticEntry => ({\n id: r.id as MemoryId,\n agentId: r.agent_id as string,\n content: r.content as string,\n summary: r.summary as string,\n importance: r.importance as number,\n verified: Boolean(r.verified),\n tags: JSON.parse(r.tags as string),\n embedding: r.embedding\n ? Array.from(new Float32Array(r.embedding as ArrayBuffer))\n : undefined,\n createdAt: new Date(r.created_at as string),\n updatedAt: new Date(r.updated_at as string),\n accessCount: r.access_count as number,\n lastAccessedAt: new Date(r.last_accessed_at as string),\n });\n\n return {\n store: (entry) =>\n Effect.gen(function* () {\n yield* db.exec(\n `INSERT OR REPLACE INTO semantic_memory\n (id, agent_id, content, summary, importance, verified, tags, created_at, updated_at, access_count, last_accessed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entry.id,\n entry.agentId,\n entry.content,\n entry.summary,\n entry.importance,\n entry.verified ? 1 : 0,\n JSON.stringify(entry.tags),\n entry.createdAt.toISOString(),\n entry.updatedAt.toISOString(),\n entry.accessCount,\n entry.lastAccessedAt.toISOString(),\n ],\n );\n return entry.id;\n }),\n\n get: (id) =>\n Effect.gen(function* () {\n const rows = yield* db.query(\n `SELECT * FROM semantic_memory WHERE id = ?`,\n [id],\n );\n if (rows.length === 0) {\n return yield* Effect.fail(\n new MemoryNotFoundError({\n memoryId: id,\n message: `Semantic entry ${id} not found`,\n }),\n );\n }\n return rowToEntry(rows[0]!);\n }),\n\n update: (id, patch) =>\n Effect.gen(function* () {\n const sets: string[] = [];\n const params: unknown[] = [];\n\n if (patch.content !== undefined) {\n sets.push(\"content = ?\");\n params.push(patch.content);\n }\n if (patch.summary !== undefined) {\n sets.push(\"summary = ?\");\n params.push(patch.summary);\n }\n if (patch.importance !== undefined) {\n sets.push(\"importance = ?\");\n params.push(patch.importance);\n }\n if (patch.verified !== undefined) {\n sets.push(\"verified = ?\");\n params.push(patch.verified ? 1 : 0);\n }\n if (patch.tags !== undefined) {\n sets.push(\"tags = ?\");\n params.push(JSON.stringify(patch.tags));\n }\n\n sets.push(\"updated_at = ?\");\n params.push(new Date().toISOString());\n params.push(id);\n\n yield* db.exec(\n `UPDATE semantic_memory SET ${sets.join(\", \")} WHERE id = ?`,\n params,\n );\n }),\n\n delete: (id) =>\n db\n .exec(`DELETE FROM semantic_memory WHERE id = ?`, [id])\n .pipe(Effect.asVoid),\n\n listByAgent: (agentId, limit = 100) =>\n db\n .query(\n `SELECT * FROM semantic_memory WHERE agent_id = ? ORDER BY importance DESC LIMIT ?`,\n [agentId, limit],\n )\n .pipe(Effect.map((rows) => rows.map(rowToEntry))),\n\n recordAccess: (id) =>\n db\n .exec(\n `UPDATE semantic_memory SET access_count = access_count + 1, last_accessed_at = ? WHERE id = ?`,\n [new Date().toISOString(), id],\n )\n .pipe(Effect.asVoid),\n\n generateMarkdown: (agentId, maxLines = 200) =>\n Effect.gen(function* () {\n const entries = yield* db.query<{\n content: string;\n summary: string;\n importance: number;\n tags: string;\n updated_at: string;\n }>(\n `SELECT content, summary, importance, tags, updated_at\n FROM semantic_memory\n WHERE agent_id = ?\n ORDER BY importance DESC, updated_at DESC\n LIMIT 50`,\n [agentId],\n );\n\n const lines: string[] = [\n `# Agent Memory — ${agentId}`,\n `> Generated: ${new Date().toISOString()}`,\n \"\",\n ];\n\n for (const entry of entries) {\n const tags = JSON.parse(entry.tags) as string[];\n const tagStr = tags.length > 0 ? ` [${tags.join(\", \")}]` : \"\";\n const importanceBar = \"\\u2588\".repeat(\n Math.round(entry.importance * 5),\n );\n lines.push(\n `## ${importanceBar} (${entry.importance.toFixed(2)})${tagStr}`,\n );\n lines.push(entry.summary);\n lines.push(\"\");\n\n if (lines.length >= maxLines) break;\n }\n\n return lines.slice(0, maxLines).join(\"\\n\");\n }),\n };\n }),\n);\n","import { Effect, Context, Layer } from \"effect\";\nimport type { DailyLogEntry, SessionSnapshot, MemoryId } from \"../types.js\";\nimport { DatabaseError } from \"../errors.js\";\nimport { MemoryDatabase } from \"../database.js\";\n\n// ─── Service Tag ───\n\nexport class EpisodicMemoryService extends Context.Tag(\"EpisodicMemoryService\")<\n EpisodicMemoryService,\n {\n /** Log an episodic event. */\n readonly log: (\n entry: DailyLogEntry,\n ) => Effect.Effect<MemoryId, DatabaseError>;\n\n /** Get today's log for an agent. */\n readonly getToday: (\n agentId: string,\n ) => Effect.Effect<DailyLogEntry[], DatabaseError>;\n\n /** Get recent log entries (newest first). */\n readonly getRecent: (\n agentId: string,\n limit: number,\n ) => Effect.Effect<DailyLogEntry[], DatabaseError>;\n\n /** Get entries by task ID. */\n readonly getByTask: (\n taskId: string,\n ) => Effect.Effect<DailyLogEntry[], DatabaseError>;\n\n /** Save a session snapshot. */\n readonly saveSnapshot: (\n snapshot: SessionSnapshot,\n ) => Effect.Effect<void, DatabaseError>;\n\n /** Get the most recent session snapshot for an agent. */\n readonly getLatestSnapshot: (\n agentId: string,\n ) => Effect.Effect<SessionSnapshot | null, DatabaseError>;\n\n /** Prune entries older than retainDays. */\n readonly prune: (\n agentId: string,\n retainDays: number,\n ) => Effect.Effect<number, DatabaseError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const EpisodicMemoryServiceLive = Layer.effect(\n EpisodicMemoryService,\n Effect.gen(function* () {\n const db = yield* MemoryDatabase;\n\n const rowToEntry = (r: Record<string, unknown>): DailyLogEntry => ({\n id: r.id as MemoryId,\n agentId: r.agent_id as string,\n date: r.date as string,\n content: r.content as string,\n taskId: (r.task_id as string | null) ?? undefined,\n eventType: r.event_type as DailyLogEntry[\"eventType\"],\n cost: (r.cost as number | null) ?? undefined,\n duration: (r.duration as number | null) ?? undefined,\n metadata: JSON.parse((r.metadata as string) ?? \"{}\"),\n createdAt: new Date(r.created_at as string),\n });\n\n return {\n log: (entry) =>\n Effect.gen(function* () {\n yield* db.exec(\n `INSERT INTO episodic_log\n (id, agent_id, date, content, task_id, event_type, cost, duration, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entry.id,\n entry.agentId,\n entry.date,\n entry.content,\n entry.taskId ?? null,\n entry.eventType,\n entry.cost ?? null,\n entry.duration ?? null,\n JSON.stringify(entry.metadata ?? {}),\n entry.createdAt.toISOString(),\n ],\n );\n return entry.id;\n }),\n\n getToday: (agentId) => {\n const today = new Date().toISOString().slice(0, 10);\n return db\n .query(\n `SELECT * FROM episodic_log WHERE agent_id = ? AND date = ? ORDER BY created_at DESC`,\n [agentId, today],\n )\n .pipe(Effect.map((rows) => rows.map(rowToEntry)));\n },\n\n getRecent: (agentId, limit) =>\n db\n .query(\n `SELECT * FROM episodic_log WHERE agent_id = ? ORDER BY created_at DESC LIMIT ?`,\n [agentId, limit],\n )\n .pipe(Effect.map((rows) => rows.map(rowToEntry))),\n\n getByTask: (taskId) =>\n db\n .query(\n `SELECT * FROM episodic_log WHERE task_id = ? ORDER BY created_at ASC`,\n [taskId],\n )\n .pipe(Effect.map((rows) => rows.map(rowToEntry))),\n\n saveSnapshot: (snapshot) =>\n db\n .exec(\n `INSERT OR REPLACE INTO session_snapshots\n (id, agent_id, messages, summary, key_decisions, task_ids, started_at, ended_at, total_cost, total_tokens)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n snapshot.id,\n snapshot.agentId,\n JSON.stringify(snapshot.messages),\n snapshot.summary,\n JSON.stringify(snapshot.keyDecisions),\n JSON.stringify(snapshot.taskIds),\n snapshot.startedAt.toISOString(),\n snapshot.endedAt.toISOString(),\n snapshot.totalCost,\n snapshot.totalTokens,\n ],\n )\n .pipe(Effect.asVoid),\n\n getLatestSnapshot: (agentId) =>\n db\n .query(\n `SELECT * FROM session_snapshots WHERE agent_id = ? ORDER BY ended_at DESC LIMIT 1`,\n [agentId],\n )\n .pipe(\n Effect.map((rows) => {\n if (rows.length === 0) return null;\n const r = rows[0]! as Record<string, unknown>;\n return {\n id: r.id as string,\n agentId: r.agent_id as string,\n messages: JSON.parse(r.messages as string),\n summary: r.summary as string,\n keyDecisions: JSON.parse(r.key_decisions as string),\n taskIds: JSON.parse(r.task_ids as string),\n startedAt: new Date(r.started_at as string),\n endedAt: new Date(r.ended_at as string),\n totalCost: r.total_cost as number,\n totalTokens: r.total_tokens as number,\n } satisfies SessionSnapshot;\n }),\n ),\n\n prune: (agentId, retainDays) => {\n const cutoff = new Date(\n Date.now() - retainDays * 86_400_000,\n ).toISOString();\n return db.exec(\n `DELETE FROM episodic_log WHERE agent_id = ? AND created_at < ?`,\n [agentId, cutoff],\n );\n },\n };\n }),\n);\n","import { Effect, Context, Layer } from \"effect\";\nimport type { ProceduralEntry, MemoryId } from \"../types.js\";\nimport { DatabaseError, MemoryNotFoundError } from \"../errors.js\";\nimport { MemoryDatabase } from \"../database.js\";\n\n// ─── Service Tag ───\n\nexport class ProceduralMemoryService extends Context.Tag(\n \"ProceduralMemoryService\",\n)<\n ProceduralMemoryService,\n {\n /** Store a new workflow/pattern. */\n readonly store: (\n entry: ProceduralEntry,\n ) => Effect.Effect<MemoryId, DatabaseError>;\n\n /** Get workflow by ID. */\n readonly get: (\n id: MemoryId,\n ) => Effect.Effect<ProceduralEntry, MemoryNotFoundError | DatabaseError>;\n\n /** Update success rate and use count after execution. */\n readonly recordOutcome: (\n id: MemoryId,\n success: boolean,\n ) => Effect.Effect<void, DatabaseError>;\n\n /** List active workflows for an agent (sorted by success rate). */\n readonly listActive: (\n agentId: string,\n ) => Effect.Effect<ProceduralEntry[], DatabaseError>;\n\n /** Find workflows matching tags. */\n readonly findByTags: (\n agentId: string,\n tags: readonly string[],\n ) => Effect.Effect<ProceduralEntry[], DatabaseError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const ProceduralMemoryServiceLive = Layer.effect(\n ProceduralMemoryService,\n Effect.gen(function* () {\n const db = yield* MemoryDatabase;\n\n const rowToEntry = (r: Record<string, unknown>): ProceduralEntry => ({\n id: r.id as MemoryId,\n agentId: r.agent_id as string,\n name: r.name as string,\n description: r.description as string,\n pattern: r.pattern as string,\n successRate: r.success_rate as number,\n useCount: r.use_count as number,\n tags: JSON.parse(r.tags as string),\n createdAt: new Date(r.created_at as string),\n updatedAt: new Date(r.updated_at as string),\n });\n\n return {\n store: (entry) =>\n Effect.gen(function* () {\n yield* db.exec(\n `INSERT OR REPLACE INTO procedural_memory\n (id, agent_id, name, description, pattern, success_rate, use_count, tags, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entry.id,\n entry.agentId,\n entry.name,\n entry.description,\n entry.pattern,\n entry.successRate,\n entry.useCount,\n JSON.stringify(entry.tags),\n entry.createdAt.toISOString(),\n entry.updatedAt.toISOString(),\n ],\n );\n return entry.id;\n }),\n\n get: (id) =>\n Effect.gen(function* () {\n const rows = yield* db.query(\n `SELECT * FROM procedural_memory WHERE id = ?`,\n [id],\n );\n if (rows.length === 0) {\n return yield* Effect.fail(\n new MemoryNotFoundError({\n memoryId: id,\n message: `Procedural entry ${id} not found`,\n }),\n );\n }\n return rowToEntry(rows[0]!);\n }),\n\n recordOutcome: (id, success) =>\n Effect.gen(function* () {\n const rows = yield* db.query<{\n success_rate: number;\n use_count: number;\n }>(\n `SELECT success_rate, use_count FROM procedural_memory WHERE id = ?`,\n [id],\n );\n if (rows.length === 0) return;\n const { success_rate, use_count } = rows[0]!;\n const newCount = use_count + 1;\n const newRate = success_rate * 0.9 + (success ? 1 : 0) * 0.1;\n yield* db.exec(\n `UPDATE procedural_memory SET success_rate = ?, use_count = ?, updated_at = ? WHERE id = ?`,\n [newRate, newCount, new Date().toISOString(), id],\n );\n }),\n\n listActive: (agentId) =>\n db\n .query(\n `SELECT * FROM procedural_memory WHERE agent_id = ? ORDER BY success_rate DESC, use_count DESC`,\n [agentId],\n )\n .pipe(Effect.map((rows) => rows.map(rowToEntry))),\n\n findByTags: (agentId, tags) =>\n Effect.gen(function* () {\n const all = yield* db.query(\n `SELECT * FROM procedural_memory WHERE agent_id = ?`,\n [agentId],\n );\n return all\n .map(rowToEntry)\n .filter((e) => tags.some((t) => e.tags.includes(t)));\n }),\n };\n }),\n);\n","import { Effect, Context, Layer } from \"effect\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { MemoryError } from \"../errors.js\";\n\n// ─── Service Tag ───\n\nexport class MemoryFileSystem extends Context.Tag(\"MemoryFileSystem\")<\n MemoryFileSystem,\n {\n /** Write memory.md projection for an agent. */\n readonly writeMarkdown: (\n agentId: string,\n content: string,\n basePath: string,\n ) => Effect.Effect<void, MemoryError>;\n\n /** Read memory.md for bootstrap. Returns empty string if not found. */\n readonly readMarkdown: (\n agentId: string,\n basePath: string,\n ) => Effect.Effect<string, MemoryError>;\n\n /** Ensure agent memory directory exists. */\n readonly ensureDirectory: (\n agentId: string,\n basePath: string,\n ) => Effect.Effect<void, MemoryError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const MemoryFileSystemLive = Layer.succeed(MemoryFileSystem, {\n writeMarkdown: (agentId, content, basePath) =>\n Effect.tryPromise({\n try: async () => {\n const dir = path.join(basePath, agentId);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(path.join(dir, \"memory.md\"), content, \"utf8\");\n },\n catch: (e) =>\n new MemoryError({\n message: `Failed to write memory.md: ${e}`,\n cause: e,\n }),\n }),\n\n readMarkdown: (agentId, basePath) =>\n Effect.tryPromise({\n try: async () => {\n const filePath = path.join(basePath, agentId, \"memory.md\");\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return \"\";\n }\n },\n catch: (e) =>\n new MemoryError({\n message: `Failed to read memory.md: ${e}`,\n cause: e,\n }),\n }),\n\n ensureDirectory: (agentId, basePath) =>\n Effect.tryPromise({\n try: async () => {\n await fs.mkdir(path.join(basePath, agentId), { recursive: true });\n },\n catch: (e) =>\n new MemoryError({\n message: `Failed to create memory directory: ${e}`,\n cause: e,\n }),\n }),\n});\n","import { Effect, Context, Layer } from \"effect\";\nimport type { MemoryId, ZettelLink, LinkType } from \"../types.js\";\nimport { DatabaseError } from \"../errors.js\";\nimport { MemoryDatabase } from \"../database.js\";\n\n// ─── Service Tag ───\n\nexport class ZettelkastenService extends Context.Tag(\"ZettelkastenService\")<\n ZettelkastenService,\n {\n /** Add a link between two memory entries. */\n readonly addLink: (link: ZettelLink) => Effect.Effect<void, DatabaseError>;\n\n /** Get all links for a memory ID (as source or target). */\n readonly getLinks: (\n memoryId: MemoryId,\n ) => Effect.Effect<ZettelLink[], DatabaseError>;\n\n /** Get IDs of all memories linked to a given ID. */\n readonly getLinked: (\n memoryId: MemoryId,\n ) => Effect.Effect<MemoryId[], DatabaseError>;\n\n /** Traverse link graph up to `depth` hops from startId. */\n readonly traverse: (\n startId: MemoryId,\n depth: number,\n ) => Effect.Effect<MemoryId[], DatabaseError>;\n\n /** Delete all links for a memory (when entry is deleted). */\n readonly deleteLinks: (\n memoryId: MemoryId,\n ) => Effect.Effect<void, DatabaseError>;\n\n /**\n * Auto-link via FTS5 similarity (find semantically similar entries\n * and create \"similar\" links if above threshold).\n */\n readonly autoLinkText: (\n memoryId: MemoryId,\n content: string,\n agentId: string,\n threshold?: number,\n ) => Effect.Effect<ZettelLink[], DatabaseError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const ZettelkastenServiceLive = Layer.effect(\n ZettelkastenService,\n Effect.gen(function* () {\n const db = yield* MemoryDatabase;\n\n const rowToLink = (r: Record<string, unknown>): ZettelLink => ({\n source: r.source_id as MemoryId,\n target: r.target_id as MemoryId,\n strength: r.strength as number,\n type: r.type as LinkType,\n createdAt: new Date(r.created_at as string),\n });\n\n return {\n addLink: (link) =>\n db\n .exec(\n `INSERT OR REPLACE INTO zettel_links (source_id, target_id, strength, type, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n [\n link.source,\n link.target,\n link.strength,\n link.type,\n link.createdAt.toISOString(),\n ],\n )\n .pipe(Effect.asVoid),\n\n getLinks: (memoryId) =>\n db\n .query(\n `SELECT * FROM zettel_links WHERE source_id = ? OR target_id = ? ORDER BY strength DESC`,\n [memoryId, memoryId],\n )\n .pipe(Effect.map((rows) => rows.map(rowToLink))),\n\n getLinked: (memoryId) =>\n db\n .query(\n `SELECT CASE WHEN source_id = ? THEN target_id ELSE source_id END as linked_id\n FROM zettel_links\n WHERE source_id = ? OR target_id = ?\n ORDER BY strength DESC`,\n [memoryId, memoryId, memoryId],\n )\n .pipe(\n Effect.map((rows) => rows.map((r) => r.linked_id as MemoryId)),\n ),\n\n traverse: (startId, depth) =>\n Effect.gen(function* () {\n const visited = new Set<string>();\n const result: MemoryId[] = [];\n const queue: Array<{ id: MemoryId; d: number }> = [\n { id: startId, d: 0 },\n ];\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (visited.has(item.id) || item.d > depth) continue;\n visited.add(item.id);\n if (item.id !== startId) result.push(item.id);\n\n const links = yield* db.query<{ linked_id: string }>(\n `SELECT CASE WHEN source_id = ? THEN target_id ELSE source_id END as linked_id\n FROM zettel_links WHERE source_id = ? OR target_id = ?`,\n [item.id, item.id, item.id],\n );\n\n for (const link of links) {\n if (!visited.has(link.linked_id)) {\n queue.push({\n id: link.linked_id as MemoryId,\n d: item.d + 1,\n });\n }\n }\n }\n\n return result;\n }),\n\n deleteLinks: (memoryId) =>\n db\n .exec(\n `DELETE FROM zettel_links WHERE source_id = ? OR target_id = ?`,\n [memoryId, memoryId],\n )\n .pipe(Effect.asVoid),\n\n // Text-based auto-linking via FTS5 search\n autoLinkText: (memoryId, content, agentId, threshold = 0.85) =>\n Effect.gen(function* () {\n // Use simplified text similarity via FTS5 rank as proxy\n const searchTerms = content\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 10)\n .join(\" OR \");\n\n if (searchTerms.length === 0) return [];\n\n const similar = yield* db.query<{\n id: string;\n rank: number;\n }>(\n `SELECT sm.id, semantic_fts.rank\n FROM semantic_memory sm\n JOIN semantic_fts ON semantic_fts.id = sm.id\n WHERE semantic_fts MATCH ?\n AND sm.agent_id = ?\n AND sm.id != ?\n ORDER BY rank\n LIMIT 5`,\n [searchTerms, agentId, memoryId],\n );\n\n const now = new Date();\n const links: ZettelLink[] = [];\n\n for (const row of similar) {\n // Convert FTS rank to 0-1 strength (rank is negative BM25 score)\n const strength = Math.min(1, Math.max(0, 1 + row.rank / 10));\n if (strength < threshold) continue;\n\n const link: ZettelLink = {\n source: memoryId,\n target: row.id as MemoryId,\n strength,\n type: \"similar\",\n createdAt: now,\n };\n\n yield* db.exec(\n `INSERT OR REPLACE INTO zettel_links (source_id, target_id, strength, type, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n [\n link.source,\n link.target,\n link.strength,\n link.type,\n link.createdAt.toISOString(),\n ],\n );\n links.push(link);\n }\n\n return links;\n }),\n };\n }),\n);\n","import { Effect, Context, Layer } from \"effect\";\nimport type { CompactionConfig } from \"../types.js\";\nimport { CompactionError, DatabaseError } from \"../errors.js\";\nimport { MemoryDatabase } from \"../database.js\";\n\n// ─── Service Tag ───\n\nexport class CompactionService extends Context.Tag(\"CompactionService\")<\n CompactionService,\n {\n /** Run compaction for an agent using the given strategy. */\n readonly compact: (\n agentId: string,\n config: CompactionConfig,\n ) => Effect.Effect<number, CompactionError | DatabaseError>;\n\n /** Count-based compaction: remove lowest-importance entries above threshold. */\n readonly compactByCount: (\n agentId: string,\n maxEntries: number,\n ) => Effect.Effect<number, DatabaseError>;\n\n /** Time-based compaction: remove entries older than interval. */\n readonly compactByTime: (\n agentId: string,\n intervalMs: number,\n ) => Effect.Effect<number, DatabaseError>;\n\n /** Semantic compaction: merge near-duplicate entries (by FTS5 similarity). */\n readonly compactBySimilarity: (\n agentId: string,\n threshold: number,\n ) => Effect.Effect<number, DatabaseError>;\n\n /** Progressive compaction: count -> time -> decay. */\n readonly compactProgressive: (\n agentId: string,\n config: CompactionConfig,\n ) => Effect.Effect<number, DatabaseError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const CompactionServiceLive = Layer.effect(\n CompactionService,\n Effect.gen(function* () {\n const db = yield* MemoryDatabase;\n\n return {\n compact: (agentId, config) =>\n Effect.gen(function* () {\n switch (config.strategy) {\n case \"count\":\n return yield* compactByCount(agentId, config.maxEntries ?? 1000);\n case \"time\":\n return yield* compactByTime(\n agentId,\n config.intervalMs ?? 86_400_000,\n );\n case \"semantic\":\n return yield* compactBySimilarity(\n agentId,\n config.similarityThreshold ?? 0.92,\n );\n case \"progressive\":\n return yield* compactProgressive(agentId, config);\n }\n }),\n\n compactByCount: (agentId, maxEntries) =>\n compactByCount(agentId, maxEntries),\n\n compactByTime: (agentId, intervalMs) =>\n compactByTime(agentId, intervalMs),\n\n compactBySimilarity: (agentId, threshold) =>\n compactBySimilarity(agentId, threshold),\n\n compactProgressive: (agentId, config) =>\n compactProgressive(agentId, config),\n };\n\n function compactByCount(agentId: string, maxEntries: number) {\n return Effect.gen(function* () {\n // Count current entries\n const countRows = yield* db.query<{ cnt: number }>(\n `SELECT COUNT(*) as cnt FROM semantic_memory WHERE agent_id = ?`,\n [agentId],\n );\n const count = countRows[0]?.cnt ?? 0;\n\n if (count <= maxEntries) return 0;\n\n const toRemove = count - maxEntries;\n // Delete lowest importance entries\n const deleted = yield* db.exec(\n `DELETE FROM semantic_memory WHERE id IN (\n SELECT id FROM semantic_memory\n WHERE agent_id = ?\n ORDER BY importance ASC, last_accessed_at ASC\n LIMIT ?\n )`,\n [agentId, toRemove],\n );\n return deleted;\n });\n }\n\n function compactByTime(agentId: string, intervalMs: number) {\n return Effect.gen(function* () {\n const cutoff = new Date(Date.now() - intervalMs).toISOString();\n const deleted = yield* db.exec(\n `DELETE FROM semantic_memory\n WHERE agent_id = ? AND updated_at < ? AND importance < 0.5`,\n [agentId, cutoff],\n );\n return deleted;\n });\n }\n\n function compactBySimilarity(agentId: string, _threshold: number) {\n return Effect.gen(function* () {\n // In Tier 1, we use a simplified approach:\n // Find entries with identical content and merge them\n const duplicates = yield* db.query<{ content: string; cnt: number }>(\n `SELECT content, COUNT(*) as cnt FROM semantic_memory\n WHERE agent_id = ? GROUP BY content HAVING cnt > 1`,\n [agentId],\n );\n\n let removed = 0;\n for (const dup of duplicates) {\n // Keep the highest importance one, delete the rest\n const deleted = yield* db.exec(\n `DELETE FROM semantic_memory WHERE id IN (\n SELECT id FROM semantic_memory\n WHERE agent_id = ? AND content = ?\n ORDER BY importance DESC\n LIMIT -1 OFFSET 1\n )`,\n [agentId, dup.content],\n );\n removed += deleted;\n }\n return removed;\n });\n }\n\n function compactProgressive(agentId: string, config: CompactionConfig) {\n return Effect.gen(function* () {\n let totalRemoved = 0;\n\n // Step 1: Count-based\n totalRemoved += yield* compactByCount(\n agentId,\n config.maxEntries ?? 1000,\n );\n\n // Step 2: Time-based\n totalRemoved += yield* compactByTime(\n agentId,\n config.intervalMs ?? 86_400_000,\n );\n\n // Step 3: Apply decay to low-access entries\n const decayFactor = config.decayFactor ?? 0.05;\n yield* db.exec(\n `UPDATE semantic_memory\n SET importance = MAX(0, importance - ?)\n WHERE agent_id = ? AND access_count < 3 AND importance > 0.1`,\n [decayFactor, agentId],\n );\n\n return totalRemoved;\n });\n }\n }),\n);\n","import { Effect, Context, Layer } from \"effect\";\nimport type { SemanticEntry, MemoryId, DailyLogEntry } from \"../types.js\";\nimport { ExtractionError } from \"../errors.js\";\n\n// ─── Service Tag ───\n\nexport class MemoryExtractor extends Context.Tag(\"MemoryExtractor\")<\n MemoryExtractor,\n {\n /**\n * Extract semantic memories from a conversation.\n * In Tier 1, this uses simple heuristic extraction (no LLM).\n * In Tier 2, this uses LLMService for intelligent extraction.\n */\n readonly extractFromConversation: (\n agentId: string,\n messages: readonly { role: string; content: string }[],\n ) => Effect.Effect<SemanticEntry[], ExtractionError>;\n\n /**\n * Extract episodic events from a conversation.\n */\n readonly extractEpisodic: (\n agentId: string,\n messages: readonly { role: string; content: string }[],\n ) => Effect.Effect<DailyLogEntry[], ExtractionError>;\n }\n>() {}\n\n// ─── Tier 1 Heuristic Implementation (no LLM required) ───\n\nlet idCounter = 0;\nconst nextId = (): MemoryId =>\n `mem-extract-${Date.now()}-${++idCounter}` as MemoryId;\n\nexport const MemoryExtractorLive = Layer.succeed(MemoryExtractor, {\n extractFromConversation: (agentId, messages) =>\n Effect.try({\n try: () => {\n const entries: SemanticEntry[] = [];\n const now = new Date();\n\n for (const msg of messages) {\n if (msg.role !== \"assistant\") continue;\n // Heuristic: extract sentences that look like facts/knowledge\n const sentences = msg.content\n .split(/[.!?]\\s+/)\n .filter((s) => s.length > 30);\n\n for (const sentence of sentences.slice(0, 3)) {\n entries.push({\n id: nextId(),\n agentId,\n content: sentence.trim(),\n summary: sentence.trim().slice(0, 100),\n importance: 0.5,\n verified: false,\n tags: [],\n createdAt: now,\n updatedAt: now,\n accessCount: 0,\n lastAccessedAt: now,\n });\n }\n }\n\n return entries;\n },\n catch: (e) =>\n new ExtractionError({\n message: `Extraction failed: ${e}`,\n cause: e,\n }),\n }),\n\n extractEpisodic: (agentId, messages) =>\n Effect.try({\n try: () => {\n const entries: DailyLogEntry[] = [];\n const now = new Date();\n const today = now.toISOString().slice(0, 10);\n\n for (const msg of messages) {\n if (msg.content.length < 10) continue;\n entries.push({\n id: nextId(),\n agentId,\n date: today,\n content: msg.content.slice(0, 500),\n eventType: \"observation\",\n createdAt: now,\n metadata: { role: msg.role },\n });\n }\n\n return entries.slice(0, 10);\n },\n catch: (e) =>\n new ExtractionError({\n message: `Episodic extraction failed: ${e}`,\n cause: e,\n }),\n }),\n});\n","import { Effect, Context, Layer } from \"effect\";\nimport type { MemoryConfig } from \"../types.js\";\nimport { DatabaseError } from \"../errors.js\";\nimport { MemoryDatabase } from \"../database.js\";\n\n// ─── Service Tag ───\n\nexport class MemoryConsolidator extends Context.Tag(\"MemoryConsolidator\")<\n MemoryConsolidator,\n {\n /**\n * Run a consolidation cycle: merge near-duplicates, decay old entries,\n * promote high-access entries.\n * Returns the number of entries affected.\n */\n readonly consolidate: (\n agentId: string,\n ) => Effect.Effect<number, DatabaseError>;\n\n /**\n * Decay importance of entries that haven't been accessed recently.\n */\n readonly decayUnused: (\n agentId: string,\n decayFactor: number,\n ) => Effect.Effect<number, DatabaseError>;\n\n /**\n * Promote entries that have high access counts.\n */\n readonly promoteActive: (\n agentId: string,\n ) => Effect.Effect<number, DatabaseError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const MemoryConsolidatorLive = (config: MemoryConfig) =>\n Layer.effect(\n MemoryConsolidator,\n Effect.gen(function* () {\n const db = yield* MemoryDatabase;\n const decayFactor = config.compaction.decayFactor ?? 0.05;\n\n return {\n consolidate: (agentId) =>\n Effect.gen(function* () {\n let affected = 0;\n\n // Step 1: Decay unused entries\n affected += yield* decayUnused(agentId, decayFactor);\n\n // Step 2: Promote active entries\n affected += yield* promoteActive(agentId);\n\n // Step 3: Remove entries with importance near zero\n const removed = yield* db.exec(\n `DELETE FROM semantic_memory\n WHERE agent_id = ? AND importance < 0.05 AND access_count < 2`,\n [agentId],\n );\n affected += removed;\n\n return affected;\n }),\n\n decayUnused: (agentId, factor) => decayUnused(agentId, factor),\n\n promoteActive: (agentId) => promoteActive(agentId),\n };\n\n function decayUnused(agentId: string, factor: number) {\n return Effect.gen(function* () {\n const cutoff = new Date(\n Date.now() - 7 * 86_400_000,\n ).toISOString();\n const result = yield* db.exec(\n `UPDATE semantic_memory\n SET importance = MAX(0, importance - ?)\n WHERE agent_id = ?\n AND last_accessed_at < ?\n AND importance > 0.1`,\n [factor, agentId, cutoff],\n );\n return result;\n });\n }\n\n function promoteActive(agentId: string) {\n return Effect.gen(function* () {\n const result = yield* db.exec(\n `UPDATE semantic_memory\n SET importance = MIN(1, importance + 0.05)\n WHERE agent_id = ?\n AND access_count >= 5\n AND importance < 0.95`,\n [agentId],\n );\n return result;\n });\n }\n }),\n );\n","import { Layer } from \"effect\";\nimport { WorkingMemoryServiceLive } from \"./services/working-memory.js\";\nimport { SemanticMemoryServiceLive } from \"./services/semantic-memory.js\";\nimport { EpisodicMemoryServiceLive } from \"./services/episodic-memory.js\";\nimport { ProceduralMemoryServiceLive } from \"./services/procedural-memory.js\";\nimport { MemoryFileSystemLive } from \"./fs/memory-file-system.js\";\nimport { MemorySearchServiceLive } from \"./search.js\";\nimport { ZettelkastenServiceLive } from \"./indexing/zettelkasten.js\";\nimport { MemoryServiceLive } from \"./services/memory-service.js\";\nimport { MemoryDatabaseLive } from \"./database.js\";\nimport type { MemoryConfig } from \"./types.js\";\nimport { defaultMemoryConfig } from \"./types.js\";\n\n/**\n * Create the complete memory layer.\n *\n * Tier 1 (zero deps): FTS5 full-text search only.\n * Tier 2 (sqlite-vec): FTS5 + KNN vector search.\n *\n * Usage:\n * const MemoryLive = createMemoryLayer(\"1\", { agentId: \"my-agent\" });\n * myProgram.pipe(Effect.provide(MemoryLive));\n */\nexport const createMemoryLayer = (\n tier: \"1\" | \"2\",\n configOverrides?: Partial<MemoryConfig> & { agentId: string },\n) => {\n const agentId = configOverrides?.agentId ?? \"default\";\n const config: MemoryConfig = {\n ...defaultMemoryConfig(agentId),\n ...configOverrides,\n tier,\n };\n\n // Database layer (foundation)\n const dbLayer = MemoryDatabaseLive(config);\n\n // Services that depend on DB\n const coreServices = Layer.mergeAll(\n SemanticMemoryServiceLive,\n EpisodicMemoryServiceLive,\n ProceduralMemoryServiceLive,\n MemorySearchServiceLive,\n ZettelkastenServiceLive,\n ).pipe(Layer.provide(dbLayer));\n\n // Working memory (in-process only, no DB)\n const workingLayer = WorkingMemoryServiceLive(\n config.working.capacity,\n config.working.evictionPolicy,\n );\n\n // File system layer (no deps)\n const fsLayer = MemoryFileSystemLive;\n\n // Orchestrator layer\n const memoryServiceLayer = MemoryServiceLive(config).pipe(\n Layer.provide(Layer.mergeAll(workingLayer, coreServices, fsLayer)),\n );\n\n return Layer.mergeAll(\n dbLayer,\n workingLayer,\n coreServices,\n fsLayer,\n memoryServiceLayer,\n );\n};\n"],"mappings":"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","names":["Effect","Context","Layer","Context","Layer","Effect","Effect","Context","Layer","Effect","Context","Layer","Context","Layer","Effect","Effect","Context","Layer","Context","Layer","Effect","Effect","Context","Layer","Context","Layer","Effect","Effect","Context","Layer","Context","Layer","Effect","Effect","Context","Layer","fs","path","Context","Layer","Effect","Effect","Context","Layer","Context","Layer","Effect","Context","Layer","Effect","Effect","Context","Layer","Context","Layer","Effect","Effect","Context","Layer","Context","Layer","Effect","Effect","Context","Layer","Context","Layer","Effect","Layer","Layer"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reactive-agents/memory",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsup --config ../../tsup.config.base.ts",
|
|
9
|
+
"typecheck": "tsc --noEmit",
|
|
10
|
+
"test": "bun test",
|
|
11
|
+
"test:watch": "bun test --watch"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"effect": "^3.10.0",
|
|
15
|
+
"@reactive-agents/core": "0.1.0"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"typescript": "^5.7.0",
|
|
19
|
+
"bun-types": "latest"
|
|
20
|
+
},
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/tylerjrbuell/reactive-agents-ts.git",
|
|
25
|
+
"directory": "packages/memory"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE"
|
|
34
|
+
],
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"import": "./dist/index.js",
|
|
39
|
+
"default": "./dist/index.js"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"description": "Memory system for Reactive Agents — Working, Semantic, Episodic, and Procedural memory backed by bun:sqlite",
|
|
43
|
+
"homepage": "https://tylerjrbuell.github.io/reactive-agents-ts/",
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/tylerjrbuell/reactive-agents-ts/issues"
|
|
46
|
+
}
|
|
47
|
+
}
|