@almadar/agent 2.0.4 → 2.0.5

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.
@@ -11,4 +11,5 @@ export { AgenticSearchEngine, createAgenticSearchEngine, type SearchStrategy, ty
11
11
  export { ObservabilityCollector, getObservabilityCollector, resetObservabilityCollector, recordEvent, startObservabilitySession, endObservabilitySession, getPerformanceSnapshot, type ObservableEventType, type ObservableEvent, type SessionTelemetry, type PerformanceSnapshot, type HealthCheckResult, } from '../observability.js';
12
12
  export { MultiUserManager, getMultiUserManager, resetMultiUserManager, createUserContext, isAdmin, requireOwnership, type UserContext, type ScopedSessionMetadata, type AccessCheckResult, type UserSessionStats, } from '../multi-user.js';
13
13
  export { StateSyncManager, getStateSyncManager, resetStateSyncManager, withSync, debounceSync, type StateChangeType, type StateChangeEvent, type VersionVector, type StateSyncSnapshot, type ConflictResolution, type StateSyncConfig, } from '../state-sync.js';
14
+ export { LocalMemoryBackend, type LocalMemoryBackendOptions, type ErrorResolution, } from './local-memory-backend.js';
14
15
  export type { UserFeedback, PatternAffinity, InterruptRecord, ToolApprovalPreference, CheckpointRecord, } from './types.js';
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Local File-System Memory Backend
3
+ *
4
+ * Implements MemoryManager's storage interface backed by `.orb` files
5
+ * instead of Firestore collections.
6
+ *
7
+ * Per the minimal memory strategy, only error resolution files are active
8
+ * at launch. Other memory types are stubbed (accept writes, return empty
9
+ * on reads) until evaluation proves their value.
10
+ *
11
+ * Storage layout:
12
+ * ~/.almadar/memory/
13
+ * ├── memory.orb (schema definition)
14
+ * ├── errors.orb (error resolution instances - ACTIVE)
15
+ * ├── preferences.orb (stubbed until eval)
16
+ * ├── sessions.orb (stubbed until eval)
17
+ * ├── projects.orb (stubbed until eval)
18
+ * ├── patterns.orb (stubbed until eval)
19
+ * └── index.orb (stubbed until eval)
20
+ */
21
+ import type { UserPreference, GenerationSession, ProjectContext } from './memory-orbital.js';
22
+ import type { PatternAffinity, InterruptRecord, ToolApprovalPreference, CheckpointRecord, UserFeedback } from './types.js';
23
+ export interface LocalMemoryBackendOptions {
24
+ memoryDir?: string;
25
+ }
26
+ /**
27
+ * Error resolution record stored in errors.orb.
28
+ */
29
+ export interface ErrorResolution {
30
+ id: string;
31
+ errorSignature: string;
32
+ errorMessage: string;
33
+ resolution: string;
34
+ context: string;
35
+ createdAt: number;
36
+ usageCount: number;
37
+ }
38
+ export declare class LocalMemoryBackend {
39
+ private readonly memoryDir;
40
+ constructor(options?: LocalMemoryBackendOptions);
41
+ private filePath;
42
+ private readInstances;
43
+ private writeInstances;
44
+ recordErrorResolution(resolution: Omit<ErrorResolution, 'id' | 'createdAt' | 'usageCount'>): Promise<string>;
45
+ findErrorResolution(errorSignature: string): Promise<ErrorResolution | null>;
46
+ searchErrorResolutions(query: string): Promise<ErrorResolution[]>;
47
+ getAllErrorResolutions(): Promise<ErrorResolution[]>;
48
+ getUserPreferences(_userId: string): Promise<UserPreference | null>;
49
+ updateUserPreferences(_userId: string, _preferences: Partial<Omit<UserPreference, 'id' | 'userId' | 'learnedAt'>>): Promise<void>;
50
+ recordGeneration(_userId: string, _session: Omit<GenerationSession, 'id' | 'userId' | 'createdAt'>): Promise<string>;
51
+ getGenerationSession(_sessionId: string): Promise<GenerationSession | null>;
52
+ getUserGenerationHistory(_userId: string, _limit?: number): Promise<GenerationSession[]>;
53
+ getProjectContext(_appId: string): Promise<ProjectContext | null>;
54
+ updateProjectContext(_appId: string, _update: Partial<Omit<ProjectContext, 'id' | 'appId'>>): Promise<void>;
55
+ updatePatternAffinity(_userId: string, _patternId: string, _outcome: 'success' | 'failure' | 'partial', _context?: {
56
+ entityType?: string;
57
+ useCase?: string;
58
+ }): Promise<void>;
59
+ getPatternAffinity(_userId: string, _patternId: string): Promise<PatternAffinity | null>;
60
+ getUserPatterns(_userId: string): Promise<PatternAffinity[]>;
61
+ recordFeedback(_sessionId: string, _feedback: Omit<UserFeedback, 'feedbackId' | 'sessionId' | 'timestamp'>): Promise<void>;
62
+ recordInterruptDecision(_sessionId: string, _userId: string, _interruptData: {
63
+ toolName: string;
64
+ toolArgs: Record<string, unknown>;
65
+ decision: 'approved' | 'rejected' | 'modified';
66
+ modifiedArgs?: Record<string, unknown>;
67
+ reason?: string;
68
+ }): Promise<void>;
69
+ getSessionInterrupts(_sessionId: string): Promise<InterruptRecord[]>;
70
+ getToolApprovalPreference(_userId: string, _toolName: string): Promise<ToolApprovalPreference | null>;
71
+ shouldAutoApproveTool(_userId: string, _toolName: string): Promise<boolean>;
72
+ recordCheckpoint(_userId: string, _checkpointData: {
73
+ checkpointId: string;
74
+ threadId: string;
75
+ parentCheckpointId?: string;
76
+ metadata?: Record<string, unknown>;
77
+ }): Promise<void>;
78
+ getUserCheckpoints(_userId: string, _limit?: number): Promise<CheckpointRecord[]>;
79
+ getThreadCheckpoints(_threadId: string): Promise<CheckpointRecord[]>;
80
+ }
@@ -5,6 +5,7 @@
5
5
  */
6
6
  export type { SessionMetadata, SessionRecord, PersistenceMode, Session, } from './types.js';
7
7
  export { MemorySessionBackend } from './memory-backend.js';
8
+ export { LocalSessionBackend, type LocalSessionBackendOptions, } from './local-session-backend.js';
8
9
  export { FirestoreCheckpointer, type FirestoreCheckpointerOptions, type FirestoreDb, type FirestoreTimestamp, } from './firestore-checkpointer.js';
9
10
  export { FirestoreSessionStore, type FirestoreSessionStoreOptions, } from './firestore-session-store.js';
10
11
  export { FirestoreStore, type FirestoreStoreOptions, } from './firestore-store.js';
@@ -1,3 +1,6 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
1
4
  import { BaseCheckpointSaver, BaseStore } from '@langchain/langgraph-checkpoint';
2
5
 
3
6
  // src/persistence/memory-backend.ts
@@ -39,6 +42,194 @@ var MemorySessionBackend = class {
39
42
  return this.sessions.has(threadId);
40
43
  }
41
44
  };
45
+ var DEFAULT_SESSIONS_DIR = path.join(os.homedir(), ".almadar", "sessions");
46
+ var LocalSessionBackend = class {
47
+ constructor(options = {}) {
48
+ this.sessionsDir = options.sessionsDir ?? DEFAULT_SESSIONS_DIR;
49
+ fs.mkdirSync(this.sessionsDir, { recursive: true });
50
+ }
51
+ sessionDir(threadId) {
52
+ return path.join(this.sessionsDir, threadId);
53
+ }
54
+ sessionFilePath(threadId) {
55
+ return path.join(this.sessionDir(threadId), "session.orb");
56
+ }
57
+ checkpointFilePath(threadId) {
58
+ return path.join(this.sessionDir(threadId), "checkpoint.orb");
59
+ }
60
+ eventsFilePath(threadId) {
61
+ return path.join(this.sessionDir(threadId), "events.orb");
62
+ }
63
+ /**
64
+ * Store session metadata as an .orb file.
65
+ */
66
+ store(threadId, metadata) {
67
+ const dir = this.sessionDir(threadId);
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ const schema = {
70
+ name: `session-${threadId}`,
71
+ version: "1.0.0",
72
+ orbitals: [
73
+ {
74
+ name: "SessionRecord",
75
+ entity: {
76
+ name: "Session",
77
+ fields: [
78
+ { name: "skill", type: "string" },
79
+ { name: "workDir", type: "string" },
80
+ { name: "createdAt", type: "number" },
81
+ { name: "lastActivityAt", type: "number" },
82
+ { name: "approveAll", type: "boolean" }
83
+ ]
84
+ },
85
+ instances: [
86
+ {
87
+ id: threadId,
88
+ skill: metadata.skill,
89
+ workDir: metadata.workDir,
90
+ createdAt: metadata.createdAt,
91
+ lastActivityAt: metadata.lastActivityAt,
92
+ approveAll: metadata.approveAll ?? false
93
+ }
94
+ ]
95
+ }
96
+ ]
97
+ };
98
+ fs.writeFileSync(this.sessionFilePath(threadId), JSON.stringify(schema, null, 2));
99
+ }
100
+ /**
101
+ * Get session metadata from .orb file.
102
+ */
103
+ get(threadId) {
104
+ const filePath = this.sessionFilePath(threadId);
105
+ if (!fs.existsSync(filePath)) return void 0;
106
+ try {
107
+ const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
108
+ const instance = raw?.orbitals?.[0]?.instances?.[0];
109
+ if (!instance) return void 0;
110
+ return {
111
+ skill: instance.skill,
112
+ workDir: instance.workDir,
113
+ createdAt: instance.createdAt,
114
+ lastActivityAt: instance.lastActivityAt,
115
+ approveAll: instance.approveAll
116
+ };
117
+ } catch {
118
+ return void 0;
119
+ }
120
+ }
121
+ /**
122
+ * Delete session directory.
123
+ */
124
+ delete(threadId) {
125
+ const dir = this.sessionDir(threadId);
126
+ if (!fs.existsSync(dir)) return false;
127
+ fs.rmSync(dir, { recursive: true, force: true });
128
+ return true;
129
+ }
130
+ /**
131
+ * List all sessions.
132
+ */
133
+ list() {
134
+ if (!fs.existsSync(this.sessionsDir)) return [];
135
+ const entries = fs.readdirSync(this.sessionsDir, { withFileTypes: true });
136
+ const records = [];
137
+ for (const entry of entries) {
138
+ if (!entry.isDirectory()) continue;
139
+ const meta = this.get(entry.name);
140
+ if (meta) {
141
+ records.push({ threadId: entry.name, ...meta });
142
+ }
143
+ }
144
+ return records.sort((a, b) => b.lastActivityAt - a.lastActivityAt);
145
+ }
146
+ /**
147
+ * Check if a session exists.
148
+ */
149
+ has(threadId) {
150
+ return fs.existsSync(this.sessionFilePath(threadId));
151
+ }
152
+ /**
153
+ * Store a checkpoint blob for the session.
154
+ */
155
+ storeCheckpoint(threadId, checkpoint) {
156
+ const dir = this.sessionDir(threadId);
157
+ fs.mkdirSync(dir, { recursive: true });
158
+ const schema = {
159
+ name: `checkpoint-${threadId}`,
160
+ version: "1.0.0",
161
+ orbitals: [
162
+ {
163
+ name: "Checkpoint",
164
+ entity: {
165
+ name: "CheckpointData",
166
+ fields: [{ name: "data", type: "json" }]
167
+ },
168
+ instances: [{ id: "latest", data: checkpoint }]
169
+ }
170
+ ]
171
+ };
172
+ fs.writeFileSync(this.checkpointFilePath(threadId), JSON.stringify(schema, null, 2));
173
+ }
174
+ /**
175
+ * Load the latest checkpoint for a session.
176
+ */
177
+ loadCheckpoint(threadId) {
178
+ const filePath = this.checkpointFilePath(threadId);
179
+ if (!fs.existsSync(filePath)) return void 0;
180
+ try {
181
+ const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
182
+ return raw?.orbitals?.[0]?.instances?.[0]?.data;
183
+ } catch {
184
+ return void 0;
185
+ }
186
+ }
187
+ /**
188
+ * Append events to the session's event stream.
189
+ */
190
+ appendEvents(threadId, events) {
191
+ const dir = this.sessionDir(threadId);
192
+ fs.mkdirSync(dir, { recursive: true });
193
+ const filePath = this.eventsFilePath(threadId);
194
+ let existing = [];
195
+ if (fs.existsSync(filePath)) {
196
+ try {
197
+ const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
198
+ existing = raw?.orbitals?.[0]?.instances ?? [];
199
+ } catch {
200
+ }
201
+ }
202
+ const merged = [...existing, ...events];
203
+ const schema = {
204
+ name: `events-${threadId}`,
205
+ version: "1.0.0",
206
+ orbitals: [
207
+ {
208
+ name: "EventStream",
209
+ entity: {
210
+ name: "Event",
211
+ fields: [{ name: "data", type: "json" }]
212
+ },
213
+ instances: merged
214
+ }
215
+ ]
216
+ };
217
+ fs.writeFileSync(filePath, JSON.stringify(schema, null, 2));
218
+ }
219
+ /**
220
+ * Read all events for a session.
221
+ */
222
+ readEvents(threadId) {
223
+ const filePath = this.eventsFilePath(threadId);
224
+ if (!fs.existsSync(filePath)) return [];
225
+ try {
226
+ const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
227
+ return raw?.orbitals?.[0]?.instances ?? [];
228
+ } catch {
229
+ return [];
230
+ }
231
+ }
232
+ };
42
233
  var FirestoreCheckpointer = class extends BaseCheckpointSaver {
43
234
  constructor(options) {
44
235
  super();
@@ -462,9 +653,9 @@ var FirestoreStore = class extends BaseStore {
462
653
  let query = this.db.collection(this.collection);
463
654
  if (op.matchConditions) {
464
655
  for (const condition of op.matchConditions) {
465
- const path = condition.path.filter((p) => p !== "*").join("/");
656
+ const path2 = condition.path.filter((p) => p !== "*").join("/");
466
657
  if (condition.matchType === "prefix") {
467
- query = query.where("namespaceKey", ">=", path).where("namespaceKey", "<", path + "\uFFFF");
658
+ query = query.where("namespaceKey", ">=", path2).where("namespaceKey", "<", path2 + "\uFFFF");
468
659
  }
469
660
  }
470
661
  }
@@ -484,6 +675,6 @@ var FirestoreStore = class extends BaseStore {
484
675
  }
485
676
  };
486
677
 
487
- export { FirestoreCheckpointer, FirestoreSessionStore, FirestoreStore, MemorySessionBackend };
678
+ export { FirestoreCheckpointer, FirestoreSessionStore, FirestoreStore, LocalSessionBackend, MemorySessionBackend };
488
679
  //# sourceMappingURL=index.js.map
489
680
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/persistence/memory-backend.ts","../../src/persistence/firestore-checkpointer.ts","../../src/persistence/firestore-session-store.ts","../../src/persistence/firestore-store.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * In-Memory Persistence Backend\n *\n * Provides in-memory session metadata storage for development.\n * Data is lost on process restart.\n */\n\nimport type { SessionMetadata, SessionRecord } from './types.js';\n\n// ============================================================================\n// MemorySessionBackend\n// ============================================================================\n\n/**\n * In-memory session metadata store.\n */\nexport class MemorySessionBackend {\n private sessions = new Map<string, SessionMetadata>();\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n this.sessions.set(threadId, metadata);\n }\n\n /**\n * Get session metadata.\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.sessions.get(threadId);\n }\n\n /**\n * Delete session metadata.\n */\n delete(threadId: string): boolean {\n return this.sessions.delete(threadId);\n }\n\n /**\n * List all sessions.\n */\n list(): SessionRecord[] {\n return Array.from(this.sessions.entries()).map(([threadId, meta]) => ({\n threadId,\n ...meta,\n }));\n }\n\n /**\n * Check if a session exists.\n */\n has(threadId: string): boolean {\n return this.sessions.has(threadId);\n }\n}\n","/**\n * Firestore Checkpointer for LangGraph\n *\n * Custom implementation of BaseCheckpointSaver using Firebase Firestore.\n * This is required because LangGraph only provides Postgres/Redis savers.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n * This keeps the @almadar/agent package free of firebase-admin as a direct dependency.\n */\n\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointTuple,\n type CheckpointMetadata,\n type CheckpointListOptions,\n type PendingWrite,\n} from '@langchain/langgraph-checkpoint';\nimport type { RunnableConfig } from '@langchain/core/runnables';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * Consumers pass their own Firestore instance.\n */\nexport interface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\nexport interface FirestoreCollectionRef {\n doc(id: string): FirestoreDocRef;\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n}\n\nexport interface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n readonly ref: unknown;\n}\n\nexport interface FirestoreQuery {\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n startAfter(doc: unknown): FirestoreQuery;\n get(): Promise<FirestoreQuerySnapshot>;\n}\n\nexport interface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\nexport interface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Firestore Timestamp-like interface.\n */\nexport interface FirestoreTimestamp {\n toDate(): Date;\n}\n\n/**\n * Options for FirestoreCheckpointer.\n */\nexport interface FirestoreCheckpointerOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for checkpoints.\n * @default 'agent_checkpoints'\n */\n checkpointsCollection?: string;\n\n /**\n * Collection name for pending writes.\n * @default 'agent_writes'\n */\n writesCollection?: string;\n}\n\n/**\n * Document structure for checkpoint storage.\n */\ninterface CheckpointDocument {\n threadId: string;\n checkpointId: string;\n parentCheckpointId?: string;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n createdAt: unknown;\n updatedAt: unknown;\n}\n\n/**\n * Document structure for pending writes.\n */\ninterface WriteDocument {\n threadId: string;\n checkpointId: string;\n taskId: string;\n channel: string;\n value: unknown;\n createdAt: unknown;\n}\n\n// ============================================================================\n// FirestoreCheckpointer\n// ============================================================================\n\n/**\n * Firestore-backed checkpointer for LangGraph agents.\n *\n * Provides persistent checkpoint storage across server restarts.\n * Thread checkpoints are stored as Firestore documents.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const checkpointer = new FirestoreCheckpointer({\n * db: getFirestore(),\n * checkpointsCollection: 'agent_checkpoints',\n * });\n *\n * const agent = createDeepAgent({\n * // ...\n * checkpointer,\n * });\n * ```\n */\nexport class FirestoreCheckpointer extends BaseCheckpointSaver {\n private db: FirestoreDb;\n private checkpointsCollection: string;\n private writesCollection: string;\n\n constructor(options: FirestoreCheckpointerOptions) {\n super();\n this.db = options.db;\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_checkpoints';\n this.writesCollection = options.writesCollection ?? 'agent_writes';\n }\n\n /**\n * Get thread ID from config.\n */\n private getThreadId(config: RunnableConfig): string {\n const threadId = config.configurable?.thread_id;\n if (!threadId || typeof threadId !== 'string') {\n throw new Error('thread_id is required in config.configurable');\n }\n return threadId;\n }\n\n /**\n * Get checkpoint ID from config, or undefined for latest.\n */\n private getCheckpointId(config: RunnableConfig): string | undefined {\n return config.configurable?.checkpoint_id as string | undefined;\n }\n\n /**\n * Get checkpoint by config.\n */\n async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId);\n\n if (checkpointId) {\n query = query.where('checkpointId', '==', checkpointId);\n } else {\n query = query.orderBy('createdAt', 'desc').limit(1);\n }\n\n const snapshot = await query.get();\n if (snapshot.empty) {\n return undefined;\n }\n\n const doc = snapshot.docs[0];\n const data = doc.data() as unknown as CheckpointDocument;\n\n // Get pending writes for this checkpoint\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', data.checkpointId)\n .get();\n\n const pendingWrites = writesSnapshot.docs.map((writeDoc) => {\n const writeData = writeDoc.data() as unknown as WriteDocument;\n return [writeData.taskId, writeData.channel, writeData.value] as [string, string, unknown];\n });\n\n // Build parent config if available\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n return {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n pendingWrites,\n };\n }\n\n /**\n * List checkpoints for a thread.\n */\n async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncGenerator<CheckpointTuple> {\n const threadId = this.getThreadId(config);\n const limit = options?.limit ?? 10;\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .limit(limit);\n\n // Apply filter if provided\n if (options?.filter) {\n for (const [key, value] of Object.entries(options.filter)) {\n query = query.where(`metadata.${key}`, '==', value);\n }\n }\n\n // Apply before cursor if provided\n if (options?.before?.configurable?.checkpoint_id) {\n const beforeDoc = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', options.before.configurable.checkpoint_id)\n .get();\n\n if (!beforeDoc.empty) {\n query = query.startAfter(beforeDoc.docs[0]);\n }\n }\n\n const snapshot = await query.get();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as CheckpointDocument;\n\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n yield {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n };\n }\n }\n\n /**\n * Save a checkpoint.\n */\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>\n ): Promise<RunnableConfig> {\n const threadId = this.getThreadId(config);\n const checkpointId = checkpoint.id;\n const parentCheckpointId = this.getCheckpointId(config);\n\n const now = new Date();\n\n const docData: CheckpointDocument = {\n threadId,\n checkpointId,\n parentCheckpointId,\n checkpoint,\n metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n // Use checkpointId as document ID for easy lookup\n const docId = `${threadId}_${checkpointId}`;\n await this.db.collection(this.checkpointsCollection).doc(docId).set(docData);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_id: checkpointId,\n },\n };\n }\n\n /**\n * Store pending writes for a checkpoint.\n */\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string\n ): Promise<void> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n if (!checkpointId) {\n throw new Error('checkpoint_id is required for putWrites');\n }\n\n const batch = this.db.batch();\n const now = new Date();\n\n for (const [idx, [channel, value]] of writes.entries()) {\n const docId = `${threadId}_${checkpointId}_${taskId}_${idx}`;\n const docRef = this.db.collection(this.writesCollection).doc(docId);\n\n const writeData: WriteDocument = {\n threadId,\n checkpointId,\n taskId,\n channel,\n value,\n createdAt: now,\n };\n\n batch.set(docRef, writeData);\n }\n\n await batch.commit();\n }\n\n /**\n * Delete all checkpoints and writes for a thread.\n */\n async deleteThread(threadId: string): Promise<void> {\n // Delete checkpoints\n const checkpointsSnapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const checkpointBatch = this.db.batch();\n for (const doc of checkpointsSnapshot.docs) {\n checkpointBatch.delete(doc.ref);\n }\n await checkpointBatch.commit();\n\n // Delete writes\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const writesBatch = this.db.batch();\n for (const doc of writesSnapshot.docs) {\n writesBatch.delete(doc.ref);\n }\n await writesBatch.commit();\n }\n}\n","/**\n * Firestore Session Store for DeepAgent\n *\n * Provides persistent session storage for skill-based agents.\n * Sessions are stored in Firestore and persist across server restarts.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport type { Session } from './types.js';\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreSessionStore.\n */\nexport interface FirestoreSessionStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for sessions.\n * @default 'agent_sessions'\n */\n collection?: string;\n}\n\n/**\n * Document structure for session storage.\n */\ninterface SessionDocument {\n threadId: string;\n skill: string;\n workDir: string;\n userId?: string;\n createdAt: FirestoreTimestamp;\n lastActivityAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreSessionStore\n// ============================================================================\n\n/**\n * Firestore-backed session store for skill agents.\n *\n * @example\n * ```typescript\n * const sessionStore = new FirestoreSessionStore({ db: getFirestore() });\n *\n * await sessionStore.save({\n * threadId: 'abc-123',\n * skill: 'kflow-generating-m',\n * workDir: '/tmp/workspace',\n * createdAt: new Date(),\n * lastActivityAt: new Date(),\n * });\n *\n * const session = await sessionStore.get('abc-123');\n * ```\n */\nexport class FirestoreSessionStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreSessionStoreOptions) {\n this.db = options.db;\n this.collection = options.collection ?? 'agent_sessions';\n }\n\n /**\n * Save a session.\n */\n async save(session: Session): Promise<void> {\n const now = new Date();\n\n const docData = {\n threadId: session.threadId,\n skill: session.skill,\n workDir: session.workDir,\n userId: session.userId,\n createdAt: session.createdAt,\n lastActivityAt: now,\n };\n\n await this.db.collection(this.collection).doc(session.threadId).set(docData);\n }\n\n /**\n * Get a session by thread ID.\n */\n async get(threadId: string): Promise<Session | null> {\n const doc = await this.db.collection(this.collection).doc(threadId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n }\n\n /**\n * Update session's last activity timestamp.\n */\n async touch(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).update({\n lastActivityAt: new Date(),\n });\n }\n\n /**\n * Delete a session.\n */\n async delete(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).delete();\n }\n\n /**\n * List sessions, optionally filtered by user ID.\n */\n async list(options?: { userId?: string; limit?: number }): Promise<Session[]> {\n let query = this.db\n .collection(this.collection)\n .orderBy('lastActivityAt', 'desc');\n\n if (options?.userId) {\n query = query.where('userId', '==', options.userId);\n }\n\n const limit = options?.limit ?? 100;\n query = query.limit(limit);\n\n const snapshot = await query.get();\n\n return snapshot.docs.map((doc) => {\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n });\n }\n\n /**\n * Delete expired sessions (older than specified hours).\n */\n async deleteExpired(maxAgeHours: number = 24): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeHours * 60 * 60 * 1000);\n\n const snapshot = await this.db\n .collection(this.collection)\n .where('lastActivityAt', '<', cutoff)\n .get();\n\n const batch = this.db.batch();\n for (const doc of snapshot.docs) {\n batch.delete(doc.ref);\n }\n\n await batch.commit();\n return snapshot.size;\n }\n}\n","/**\n * Firestore Store for LangGraph\n *\n * Custom implementation of BaseStore using Firebase Firestore.\n * This provides persistent key-value storage for agent memories.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport {\n BaseStore,\n type Item,\n type GetOperation,\n type SearchOperation,\n type PutOperation,\n type ListNamespacesOperation,\n type Operation,\n type OperationResults,\n type SearchItem,\n} from '@langchain/langgraph-checkpoint';\n\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreStore.\n */\nexport interface FirestoreStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for store items.\n * @default 'agent_memories'\n */\n collection?: string;\n}\n\n/**\n * Document structure for store items.\n */\ninterface StoreDocument {\n namespace: string[];\n namespaceKey: string; // Joined namespace for querying\n key: string;\n value: Record<string, unknown>;\n createdAt: FirestoreTimestamp;\n updatedAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreStore\n// ============================================================================\n\n/**\n * Firestore-backed store for LangGraph agent memories.\n *\n * Provides persistent key-value storage that can be shared across threads.\n * Items are organized by hierarchical namespaces.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const store = new FirestoreStore({\n * db: getFirestore(),\n * collection: 'agent_memories',\n * });\n *\n * // Store a memory\n * await store.put(['agent', 'patterns'], 'schema-best-practices', {\n * content: 'Always validate schemas before saving',\n * });\n *\n * // Retrieve a memory\n * const item = await store.get(['agent', 'patterns'], 'schema-best-practices');\n * ```\n */\nexport class FirestoreStore extends BaseStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreStoreOptions) {\n super();\n this.db = options.db;\n this.collection = options.collection ?? 'agent_memories';\n }\n\n /**\n * Create document ID from namespace and key.\n */\n private makeDocId(namespace: string[], key: string): string {\n return [...namespace, key].join('/');\n }\n\n /**\n * Create namespace key for querying.\n */\n private makeNamespaceKey(namespace: string[]): string {\n return namespace.join('/');\n }\n\n /**\n * Execute multiple operations in a batch.\n */\n async batch<Op extends Operation[]>(operations: Op): Promise<OperationResults<Op>> {\n const results: unknown[] = [];\n\n for (const op of operations) {\n if ('key' in op && 'namespace' in op && !('namespacePrefix' in op)) {\n if ('value' in op) {\n // PutOperation\n const putOp = op as PutOperation;\n if (putOp.value === null) {\n await this.deleteItem(putOp.namespace, putOp.key);\n } else {\n await this.putItem(putOp.namespace, putOp.key, putOp.value);\n }\n results.push(undefined);\n } else {\n // GetOperation\n const getOp = op as GetOperation;\n const item = await this.getItem(getOp.namespace, getOp.key);\n results.push(item);\n }\n } else if ('namespacePrefix' in op) {\n // SearchOperation\n const searchOp = op as SearchOperation;\n const items = await this.searchItems(searchOp);\n results.push(items);\n } else if ('matchConditions' in op || ('limit' in op && 'offset' in op && !('namespacePrefix' in op))) {\n // ListNamespacesOperation\n const listOp = op as ListNamespacesOperation;\n const namespaces = await this.listNamespacesItems(listOp);\n results.push(namespaces);\n }\n }\n\n return results as OperationResults<Op>;\n }\n\n /**\n * Get an item by namespace and key.\n */\n private async getItem(namespace: string[], key: string): Promise<Item | null> {\n const docId = this.makeDocId(namespace, key);\n const doc = await this.db.collection(this.collection).doc(docId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n }\n\n /**\n * Put an item.\n */\n private async putItem(\n namespace: string[],\n key: string,\n value: Record<string, unknown>\n ): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n const now = new Date();\n\n const existingDoc = await this.db.collection(this.collection).doc(docId).get();\n const createdAt = existingDoc.exists\n ? ((existingDoc.data() as unknown as StoreDocument).createdAt as unknown as Date)\n : now;\n\n const docData = {\n namespace,\n namespaceKey: this.makeNamespaceKey(namespace),\n key,\n value,\n createdAt,\n updatedAt: now,\n };\n\n await this.db.collection(this.collection).doc(docId).set(docData);\n }\n\n /**\n * Delete an item.\n */\n private async deleteItem(namespace: string[], key: string): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n await this.db.collection(this.collection).doc(docId).delete();\n }\n\n /**\n * Search for items.\n */\n private async searchItems(op: SearchOperation): Promise<SearchItem[]> {\n const namespacePrefix = this.makeNamespaceKey(op.namespacePrefix);\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n // Query by namespace prefix\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n limit(n: number): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n if (namespacePrefix) {\n // Use range query for prefix matching\n query = query\n .where('namespaceKey', '>=', namespacePrefix)\n .where('namespaceKey', '<', namespacePrefix + '\\uffff');\n }\n\n // Apply filters\n if (op.filter) {\n for (const [key, filterValue] of Object.entries(op.filter)) {\n if (typeof filterValue === 'object' && filterValue !== null) {\n // Handle comparison operators\n for (const [operator, value] of Object.entries(filterValue as Record<string, unknown>)) {\n switch (operator) {\n case '$eq':\n query = query.where(`value.${key}`, '==', value);\n break;\n case '$ne':\n query = query.where(`value.${key}`, '!=', value);\n break;\n case '$gt':\n query = query.where(`value.${key}`, '>', value);\n break;\n case '$gte':\n query = query.where(`value.${key}`, '>=', value);\n break;\n case '$lt':\n query = query.where(`value.${key}`, '<', value);\n break;\n case '$lte':\n query = query.where(`value.${key}`, '<=', value);\n break;\n }\n }\n } else {\n // Direct equality\n query = query.where(`value.${key}`, '==', filterValue);\n }\n }\n }\n\n // Apply pagination\n query = query.limit(limit + offset);\n\n const snapshot = await query.get();\n const docs = snapshot.docs.slice(offset);\n\n return docs.map((doc) => {\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n });\n }\n\n /**\n * List namespaces.\n */\n private async listNamespacesItems(op: ListNamespacesOperation): Promise<string[][]> {\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n // Apply match conditions\n if (op.matchConditions) {\n for (const condition of op.matchConditions) {\n const path = condition.path.filter((p) => p !== '*').join('/');\n if (condition.matchType === 'prefix') {\n query = query\n .where('namespaceKey', '>=', path)\n .where('namespaceKey', '<', path + '\\uffff');\n }\n // suffix matching done in memory\n }\n }\n\n // Get all documents and extract unique namespaces\n const snapshot = await query.get();\n const namespaceSet = new Set<string>();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as StoreDocument;\n const namespace = data.namespace;\n\n // Apply max depth if specified\n if (op.maxDepth !== undefined && namespace.length > op.maxDepth) {\n namespaceSet.add(namespace.slice(0, op.maxDepth).join('/'));\n } else {\n namespaceSet.add(namespace.join('/'));\n }\n }\n\n const namespaces = Array.from(namespaceSet)\n .map((ns) => ns.split('/'))\n .slice(offset, offset + limit);\n\n return namespaces;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/persistence/memory-backend.ts","../../src/persistence/local-session-backend.ts","../../src/persistence/firestore-checkpointer.ts","../../src/persistence/firestore-session-store.ts","../../src/persistence/firestore-store.ts"],"names":["path"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * In-Memory Persistence Backend\n *\n * Provides in-memory session metadata storage for development.\n * Data is lost on process restart.\n */\n\nimport type { SessionMetadata, SessionRecord } from './types.js';\n\n// ============================================================================\n// MemorySessionBackend\n// ============================================================================\n\n/**\n * In-memory session metadata store.\n */\nexport class MemorySessionBackend {\n private sessions = new Map<string, SessionMetadata>();\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n this.sessions.set(threadId, metadata);\n }\n\n /**\n * Get session metadata.\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.sessions.get(threadId);\n }\n\n /**\n * Delete session metadata.\n */\n delete(threadId: string): boolean {\n return this.sessions.delete(threadId);\n }\n\n /**\n * List all sessions.\n */\n list(): SessionRecord[] {\n return Array.from(this.sessions.entries()).map(([threadId, meta]) => ({\n threadId,\n ...meta,\n }));\n }\n\n /**\n * Check if a session exists.\n */\n has(threadId: string): boolean {\n return this.sessions.has(threadId);\n }\n}\n","/**\n * Local File-System Session Backend\n *\n * Persists session records and checkpoints as `.orb` instance files\n * under ~/.almadar/sessions/<threadId>/.\n *\n * Implements the same interface as MemorySessionBackend but data survives\n * process restarts.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { SessionMetadata, SessionRecord } from './types.js';\n\nconst DEFAULT_SESSIONS_DIR = path.join(os.homedir(), '.almadar', 'sessions');\n\nexport interface LocalSessionBackendOptions {\n sessionsDir?: string;\n}\n\nexport class LocalSessionBackend {\n private readonly sessionsDir: string;\n\n constructor(options: LocalSessionBackendOptions = {}) {\n this.sessionsDir = options.sessionsDir ?? DEFAULT_SESSIONS_DIR;\n fs.mkdirSync(this.sessionsDir, { recursive: true });\n }\n\n private sessionDir(threadId: string): string {\n return path.join(this.sessionsDir, threadId);\n }\n\n private sessionFilePath(threadId: string): string {\n return path.join(this.sessionDir(threadId), 'session.orb');\n }\n\n private checkpointFilePath(threadId: string): string {\n return path.join(this.sessionDir(threadId), 'checkpoint.orb');\n }\n\n private eventsFilePath(threadId: string): string {\n return path.join(this.sessionDir(threadId), 'events.orb');\n }\n\n /**\n * Store session metadata as an .orb file.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n const dir = this.sessionDir(threadId);\n fs.mkdirSync(dir, { recursive: true });\n\n const schema = {\n name: `session-${threadId}`,\n version: '1.0.0',\n orbitals: [\n {\n name: 'SessionRecord',\n entity: {\n name: 'Session',\n fields: [\n { name: 'skill', type: 'string' },\n { name: 'workDir', type: 'string' },\n { name: 'createdAt', type: 'number' },\n { name: 'lastActivityAt', type: 'number' },\n { name: 'approveAll', type: 'boolean' },\n ],\n },\n instances: [\n {\n id: threadId,\n skill: metadata.skill,\n workDir: metadata.workDir,\n createdAt: metadata.createdAt,\n lastActivityAt: metadata.lastActivityAt,\n approveAll: metadata.approveAll ?? false,\n },\n ],\n },\n ],\n };\n\n fs.writeFileSync(this.sessionFilePath(threadId), JSON.stringify(schema, null, 2));\n }\n\n /**\n * Get session metadata from .orb file.\n */\n get(threadId: string): SessionMetadata | undefined {\n const filePath = this.sessionFilePath(threadId);\n if (!fs.existsSync(filePath)) return undefined;\n\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n const instance = raw?.orbitals?.[0]?.instances?.[0];\n if (!instance) return undefined;\n\n return {\n skill: instance.skill,\n workDir: instance.workDir,\n createdAt: instance.createdAt,\n lastActivityAt: instance.lastActivityAt,\n approveAll: instance.approveAll,\n };\n } catch {\n return undefined;\n }\n }\n\n /**\n * Delete session directory.\n */\n delete(threadId: string): boolean {\n const dir = this.sessionDir(threadId);\n if (!fs.existsSync(dir)) return false;\n fs.rmSync(dir, { recursive: true, force: true });\n return true;\n }\n\n /**\n * List all sessions.\n */\n list(): SessionRecord[] {\n if (!fs.existsSync(this.sessionsDir)) return [];\n\n const entries = fs.readdirSync(this.sessionsDir, { withFileTypes: true });\n const records: SessionRecord[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const meta = this.get(entry.name);\n if (meta) {\n records.push({ threadId: entry.name, ...meta });\n }\n }\n\n return records.sort((a, b) => b.lastActivityAt - a.lastActivityAt);\n }\n\n /**\n * Check if a session exists.\n */\n has(threadId: string): boolean {\n return fs.existsSync(this.sessionFilePath(threadId));\n }\n\n /**\n * Store a checkpoint blob for the session.\n */\n storeCheckpoint(threadId: string, checkpoint: unknown): void {\n const dir = this.sessionDir(threadId);\n fs.mkdirSync(dir, { recursive: true });\n\n const schema = {\n name: `checkpoint-${threadId}`,\n version: '1.0.0',\n orbitals: [\n {\n name: 'Checkpoint',\n entity: {\n name: 'CheckpointData',\n fields: [{ name: 'data', type: 'json' }],\n },\n instances: [{ id: 'latest', data: checkpoint }],\n },\n ],\n };\n\n fs.writeFileSync(this.checkpointFilePath(threadId), JSON.stringify(schema, null, 2));\n }\n\n /**\n * Load the latest checkpoint for a session.\n */\n loadCheckpoint(threadId: string): unknown | undefined {\n const filePath = this.checkpointFilePath(threadId);\n if (!fs.existsSync(filePath)) return undefined;\n\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n return raw?.orbitals?.[0]?.instances?.[0]?.data;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Append events to the session's event stream.\n */\n appendEvents(threadId: string, events: unknown[]): void {\n const dir = this.sessionDir(threadId);\n fs.mkdirSync(dir, { recursive: true });\n\n const filePath = this.eventsFilePath(threadId);\n let existing: unknown[] = [];\n\n if (fs.existsSync(filePath)) {\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n existing = raw?.orbitals?.[0]?.instances ?? [];\n } catch {\n // Corrupt file, start fresh\n }\n }\n\n const merged = [...existing, ...events];\n\n const schema = {\n name: `events-${threadId}`,\n version: '1.0.0',\n orbitals: [\n {\n name: 'EventStream',\n entity: {\n name: 'Event',\n fields: [{ name: 'data', type: 'json' }],\n },\n instances: merged,\n },\n ],\n };\n\n fs.writeFileSync(filePath, JSON.stringify(schema, null, 2));\n }\n\n /**\n * Read all events for a session.\n */\n readEvents(threadId: string): unknown[] {\n const filePath = this.eventsFilePath(threadId);\n if (!fs.existsSync(filePath)) return [];\n\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n return raw?.orbitals?.[0]?.instances ?? [];\n } catch {\n return [];\n }\n }\n}\n","/**\n * Firestore Checkpointer for LangGraph\n *\n * Custom implementation of BaseCheckpointSaver using Firebase Firestore.\n * This is required because LangGraph only provides Postgres/Redis savers.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n * This keeps the @almadar/agent package free of firebase-admin as a direct dependency.\n */\n\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointTuple,\n type CheckpointMetadata,\n type CheckpointListOptions,\n type PendingWrite,\n} from '@langchain/langgraph-checkpoint';\nimport type { RunnableConfig } from '@langchain/core/runnables';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * Consumers pass their own Firestore instance.\n */\nexport interface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\nexport interface FirestoreCollectionRef {\n doc(id: string): FirestoreDocRef;\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n}\n\nexport interface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n readonly ref: unknown;\n}\n\nexport interface FirestoreQuery {\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n startAfter(doc: unknown): FirestoreQuery;\n get(): Promise<FirestoreQuerySnapshot>;\n}\n\nexport interface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\nexport interface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Firestore Timestamp-like interface.\n */\nexport interface FirestoreTimestamp {\n toDate(): Date;\n}\n\n/**\n * Options for FirestoreCheckpointer.\n */\nexport interface FirestoreCheckpointerOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for checkpoints.\n * @default 'agent_checkpoints'\n */\n checkpointsCollection?: string;\n\n /**\n * Collection name for pending writes.\n * @default 'agent_writes'\n */\n writesCollection?: string;\n}\n\n/**\n * Document structure for checkpoint storage.\n */\ninterface CheckpointDocument {\n threadId: string;\n checkpointId: string;\n parentCheckpointId?: string;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n createdAt: unknown;\n updatedAt: unknown;\n}\n\n/**\n * Document structure for pending writes.\n */\ninterface WriteDocument {\n threadId: string;\n checkpointId: string;\n taskId: string;\n channel: string;\n value: unknown;\n createdAt: unknown;\n}\n\n// ============================================================================\n// FirestoreCheckpointer\n// ============================================================================\n\n/**\n * Firestore-backed checkpointer for LangGraph agents.\n *\n * Provides persistent checkpoint storage across server restarts.\n * Thread checkpoints are stored as Firestore documents.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const checkpointer = new FirestoreCheckpointer({\n * db: getFirestore(),\n * checkpointsCollection: 'agent_checkpoints',\n * });\n *\n * const agent = createDeepAgent({\n * // ...\n * checkpointer,\n * });\n * ```\n */\nexport class FirestoreCheckpointer extends BaseCheckpointSaver {\n private db: FirestoreDb;\n private checkpointsCollection: string;\n private writesCollection: string;\n\n constructor(options: FirestoreCheckpointerOptions) {\n super();\n this.db = options.db;\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_checkpoints';\n this.writesCollection = options.writesCollection ?? 'agent_writes';\n }\n\n /**\n * Get thread ID from config.\n */\n private getThreadId(config: RunnableConfig): string {\n const threadId = config.configurable?.thread_id;\n if (!threadId || typeof threadId !== 'string') {\n throw new Error('thread_id is required in config.configurable');\n }\n return threadId;\n }\n\n /**\n * Get checkpoint ID from config, or undefined for latest.\n */\n private getCheckpointId(config: RunnableConfig): string | undefined {\n return config.configurable?.checkpoint_id as string | undefined;\n }\n\n /**\n * Get checkpoint by config.\n */\n async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId);\n\n if (checkpointId) {\n query = query.where('checkpointId', '==', checkpointId);\n } else {\n query = query.orderBy('createdAt', 'desc').limit(1);\n }\n\n const snapshot = await query.get();\n if (snapshot.empty) {\n return undefined;\n }\n\n const doc = snapshot.docs[0];\n const data = doc.data() as unknown as CheckpointDocument;\n\n // Get pending writes for this checkpoint\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', data.checkpointId)\n .get();\n\n const pendingWrites = writesSnapshot.docs.map((writeDoc) => {\n const writeData = writeDoc.data() as unknown as WriteDocument;\n return [writeData.taskId, writeData.channel, writeData.value] as [string, string, unknown];\n });\n\n // Build parent config if available\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n return {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n pendingWrites,\n };\n }\n\n /**\n * List checkpoints for a thread.\n */\n async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncGenerator<CheckpointTuple> {\n const threadId = this.getThreadId(config);\n const limit = options?.limit ?? 10;\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .limit(limit);\n\n // Apply filter if provided\n if (options?.filter) {\n for (const [key, value] of Object.entries(options.filter)) {\n query = query.where(`metadata.${key}`, '==', value);\n }\n }\n\n // Apply before cursor if provided\n if (options?.before?.configurable?.checkpoint_id) {\n const beforeDoc = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', options.before.configurable.checkpoint_id)\n .get();\n\n if (!beforeDoc.empty) {\n query = query.startAfter(beforeDoc.docs[0]);\n }\n }\n\n const snapshot = await query.get();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as CheckpointDocument;\n\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n yield {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n };\n }\n }\n\n /**\n * Save a checkpoint.\n */\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>\n ): Promise<RunnableConfig> {\n const threadId = this.getThreadId(config);\n const checkpointId = checkpoint.id;\n const parentCheckpointId = this.getCheckpointId(config);\n\n const now = new Date();\n\n const docData: CheckpointDocument = {\n threadId,\n checkpointId,\n parentCheckpointId,\n checkpoint,\n metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n // Use checkpointId as document ID for easy lookup\n const docId = `${threadId}_${checkpointId}`;\n await this.db.collection(this.checkpointsCollection).doc(docId).set(docData);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_id: checkpointId,\n },\n };\n }\n\n /**\n * Store pending writes for a checkpoint.\n */\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string\n ): Promise<void> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n if (!checkpointId) {\n throw new Error('checkpoint_id is required for putWrites');\n }\n\n const batch = this.db.batch();\n const now = new Date();\n\n for (const [idx, [channel, value]] of writes.entries()) {\n const docId = `${threadId}_${checkpointId}_${taskId}_${idx}`;\n const docRef = this.db.collection(this.writesCollection).doc(docId);\n\n const writeData: WriteDocument = {\n threadId,\n checkpointId,\n taskId,\n channel,\n value,\n createdAt: now,\n };\n\n batch.set(docRef, writeData);\n }\n\n await batch.commit();\n }\n\n /**\n * Delete all checkpoints and writes for a thread.\n */\n async deleteThread(threadId: string): Promise<void> {\n // Delete checkpoints\n const checkpointsSnapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const checkpointBatch = this.db.batch();\n for (const doc of checkpointsSnapshot.docs) {\n checkpointBatch.delete(doc.ref);\n }\n await checkpointBatch.commit();\n\n // Delete writes\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const writesBatch = this.db.batch();\n for (const doc of writesSnapshot.docs) {\n writesBatch.delete(doc.ref);\n }\n await writesBatch.commit();\n }\n}\n","/**\n * Firestore Session Store for DeepAgent\n *\n * Provides persistent session storage for skill-based agents.\n * Sessions are stored in Firestore and persist across server restarts.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport type { Session } from './types.js';\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreSessionStore.\n */\nexport interface FirestoreSessionStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for sessions.\n * @default 'agent_sessions'\n */\n collection?: string;\n}\n\n/**\n * Document structure for session storage.\n */\ninterface SessionDocument {\n threadId: string;\n skill: string;\n workDir: string;\n userId?: string;\n createdAt: FirestoreTimestamp;\n lastActivityAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreSessionStore\n// ============================================================================\n\n/**\n * Firestore-backed session store for skill agents.\n *\n * @example\n * ```typescript\n * const sessionStore = new FirestoreSessionStore({ db: getFirestore() });\n *\n * await sessionStore.save({\n * threadId: 'abc-123',\n * skill: 'kflow-generating-m',\n * workDir: '/tmp/workspace',\n * createdAt: new Date(),\n * lastActivityAt: new Date(),\n * });\n *\n * const session = await sessionStore.get('abc-123');\n * ```\n */\nexport class FirestoreSessionStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreSessionStoreOptions) {\n this.db = options.db;\n this.collection = options.collection ?? 'agent_sessions';\n }\n\n /**\n * Save a session.\n */\n async save(session: Session): Promise<void> {\n const now = new Date();\n\n const docData = {\n threadId: session.threadId,\n skill: session.skill,\n workDir: session.workDir,\n userId: session.userId,\n createdAt: session.createdAt,\n lastActivityAt: now,\n };\n\n await this.db.collection(this.collection).doc(session.threadId).set(docData);\n }\n\n /**\n * Get a session by thread ID.\n */\n async get(threadId: string): Promise<Session | null> {\n const doc = await this.db.collection(this.collection).doc(threadId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n }\n\n /**\n * Update session's last activity timestamp.\n */\n async touch(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).update({\n lastActivityAt: new Date(),\n });\n }\n\n /**\n * Delete a session.\n */\n async delete(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).delete();\n }\n\n /**\n * List sessions, optionally filtered by user ID.\n */\n async list(options?: { userId?: string; limit?: number }): Promise<Session[]> {\n let query = this.db\n .collection(this.collection)\n .orderBy('lastActivityAt', 'desc');\n\n if (options?.userId) {\n query = query.where('userId', '==', options.userId);\n }\n\n const limit = options?.limit ?? 100;\n query = query.limit(limit);\n\n const snapshot = await query.get();\n\n return snapshot.docs.map((doc) => {\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n });\n }\n\n /**\n * Delete expired sessions (older than specified hours).\n */\n async deleteExpired(maxAgeHours: number = 24): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeHours * 60 * 60 * 1000);\n\n const snapshot = await this.db\n .collection(this.collection)\n .where('lastActivityAt', '<', cutoff)\n .get();\n\n const batch = this.db.batch();\n for (const doc of snapshot.docs) {\n batch.delete(doc.ref);\n }\n\n await batch.commit();\n return snapshot.size;\n }\n}\n","/**\n * Firestore Store for LangGraph\n *\n * Custom implementation of BaseStore using Firebase Firestore.\n * This provides persistent key-value storage for agent memories.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport {\n BaseStore,\n type Item,\n type GetOperation,\n type SearchOperation,\n type PutOperation,\n type ListNamespacesOperation,\n type Operation,\n type OperationResults,\n type SearchItem,\n} from '@langchain/langgraph-checkpoint';\n\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreStore.\n */\nexport interface FirestoreStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for store items.\n * @default 'agent_memories'\n */\n collection?: string;\n}\n\n/**\n * Document structure for store items.\n */\ninterface StoreDocument {\n namespace: string[];\n namespaceKey: string; // Joined namespace for querying\n key: string;\n value: Record<string, unknown>;\n createdAt: FirestoreTimestamp;\n updatedAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreStore\n// ============================================================================\n\n/**\n * Firestore-backed store for LangGraph agent memories.\n *\n * Provides persistent key-value storage that can be shared across threads.\n * Items are organized by hierarchical namespaces.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const store = new FirestoreStore({\n * db: getFirestore(),\n * collection: 'agent_memories',\n * });\n *\n * // Store a memory\n * await store.put(['agent', 'patterns'], 'schema-best-practices', {\n * content: 'Always validate schemas before saving',\n * });\n *\n * // Retrieve a memory\n * const item = await store.get(['agent', 'patterns'], 'schema-best-practices');\n * ```\n */\nexport class FirestoreStore extends BaseStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreStoreOptions) {\n super();\n this.db = options.db;\n this.collection = options.collection ?? 'agent_memories';\n }\n\n /**\n * Create document ID from namespace and key.\n */\n private makeDocId(namespace: string[], key: string): string {\n return [...namespace, key].join('/');\n }\n\n /**\n * Create namespace key for querying.\n */\n private makeNamespaceKey(namespace: string[]): string {\n return namespace.join('/');\n }\n\n /**\n * Execute multiple operations in a batch.\n */\n async batch<Op extends Operation[]>(operations: Op): Promise<OperationResults<Op>> {\n const results: unknown[] = [];\n\n for (const op of operations) {\n if ('key' in op && 'namespace' in op && !('namespacePrefix' in op)) {\n if ('value' in op) {\n // PutOperation\n const putOp = op as PutOperation;\n if (putOp.value === null) {\n await this.deleteItem(putOp.namespace, putOp.key);\n } else {\n await this.putItem(putOp.namespace, putOp.key, putOp.value);\n }\n results.push(undefined);\n } else {\n // GetOperation\n const getOp = op as GetOperation;\n const item = await this.getItem(getOp.namespace, getOp.key);\n results.push(item);\n }\n } else if ('namespacePrefix' in op) {\n // SearchOperation\n const searchOp = op as SearchOperation;\n const items = await this.searchItems(searchOp);\n results.push(items);\n } else if ('matchConditions' in op || ('limit' in op && 'offset' in op && !('namespacePrefix' in op))) {\n // ListNamespacesOperation\n const listOp = op as ListNamespacesOperation;\n const namespaces = await this.listNamespacesItems(listOp);\n results.push(namespaces);\n }\n }\n\n return results as OperationResults<Op>;\n }\n\n /**\n * Get an item by namespace and key.\n */\n private async getItem(namespace: string[], key: string): Promise<Item | null> {\n const docId = this.makeDocId(namespace, key);\n const doc = await this.db.collection(this.collection).doc(docId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n }\n\n /**\n * Put an item.\n */\n private async putItem(\n namespace: string[],\n key: string,\n value: Record<string, unknown>\n ): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n const now = new Date();\n\n const existingDoc = await this.db.collection(this.collection).doc(docId).get();\n const createdAt = existingDoc.exists\n ? ((existingDoc.data() as unknown as StoreDocument).createdAt as unknown as Date)\n : now;\n\n const docData = {\n namespace,\n namespaceKey: this.makeNamespaceKey(namespace),\n key,\n value,\n createdAt,\n updatedAt: now,\n };\n\n await this.db.collection(this.collection).doc(docId).set(docData);\n }\n\n /**\n * Delete an item.\n */\n private async deleteItem(namespace: string[], key: string): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n await this.db.collection(this.collection).doc(docId).delete();\n }\n\n /**\n * Search for items.\n */\n private async searchItems(op: SearchOperation): Promise<SearchItem[]> {\n const namespacePrefix = this.makeNamespaceKey(op.namespacePrefix);\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n // Query by namespace prefix\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n limit(n: number): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n if (namespacePrefix) {\n // Use range query for prefix matching\n query = query\n .where('namespaceKey', '>=', namespacePrefix)\n .where('namespaceKey', '<', namespacePrefix + '\\uffff');\n }\n\n // Apply filters\n if (op.filter) {\n for (const [key, filterValue] of Object.entries(op.filter)) {\n if (typeof filterValue === 'object' && filterValue !== null) {\n // Handle comparison operators\n for (const [operator, value] of Object.entries(filterValue as Record<string, unknown>)) {\n switch (operator) {\n case '$eq':\n query = query.where(`value.${key}`, '==', value);\n break;\n case '$ne':\n query = query.where(`value.${key}`, '!=', value);\n break;\n case '$gt':\n query = query.where(`value.${key}`, '>', value);\n break;\n case '$gte':\n query = query.where(`value.${key}`, '>=', value);\n break;\n case '$lt':\n query = query.where(`value.${key}`, '<', value);\n break;\n case '$lte':\n query = query.where(`value.${key}`, '<=', value);\n break;\n }\n }\n } else {\n // Direct equality\n query = query.where(`value.${key}`, '==', filterValue);\n }\n }\n }\n\n // Apply pagination\n query = query.limit(limit + offset);\n\n const snapshot = await query.get();\n const docs = snapshot.docs.slice(offset);\n\n return docs.map((doc) => {\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n });\n }\n\n /**\n * List namespaces.\n */\n private async listNamespacesItems(op: ListNamespacesOperation): Promise<string[][]> {\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n // Apply match conditions\n if (op.matchConditions) {\n for (const condition of op.matchConditions) {\n const path = condition.path.filter((p) => p !== '*').join('/');\n if (condition.matchType === 'prefix') {\n query = query\n .where('namespaceKey', '>=', path)\n .where('namespaceKey', '<', path + '\\uffff');\n }\n // suffix matching done in memory\n }\n }\n\n // Get all documents and extract unique namespaces\n const snapshot = await query.get();\n const namespaceSet = new Set<string>();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as StoreDocument;\n const namespace = data.namespace;\n\n // Apply max depth if specified\n if (op.maxDepth !== undefined && namespace.length > op.maxDepth) {\n namespaceSet.add(namespace.slice(0, op.maxDepth).join('/'));\n } else {\n namespaceSet.add(namespace.join('/'));\n }\n }\n\n const namespaces = Array.from(namespaceSet)\n .map((ns) => ns.split('/'))\n .slice(offset, offset + limit);\n\n return namespaces;\n }\n}\n"]}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Local File-System Session Backend
3
+ *
4
+ * Persists session records and checkpoints as `.orb` instance files
5
+ * under ~/.almadar/sessions/<threadId>/.
6
+ *
7
+ * Implements the same interface as MemorySessionBackend but data survives
8
+ * process restarts.
9
+ */
10
+ import type { SessionMetadata, SessionRecord } from './types.js';
11
+ export interface LocalSessionBackendOptions {
12
+ sessionsDir?: string;
13
+ }
14
+ export declare class LocalSessionBackend {
15
+ private readonly sessionsDir;
16
+ constructor(options?: LocalSessionBackendOptions);
17
+ private sessionDir;
18
+ private sessionFilePath;
19
+ private checkpointFilePath;
20
+ private eventsFilePath;
21
+ /**
22
+ * Store session metadata as an .orb file.
23
+ */
24
+ store(threadId: string, metadata: SessionMetadata): void;
25
+ /**
26
+ * Get session metadata from .orb file.
27
+ */
28
+ get(threadId: string): SessionMetadata | undefined;
29
+ /**
30
+ * Delete session directory.
31
+ */
32
+ delete(threadId: string): boolean;
33
+ /**
34
+ * List all sessions.
35
+ */
36
+ list(): SessionRecord[];
37
+ /**
38
+ * Check if a session exists.
39
+ */
40
+ has(threadId: string): boolean;
41
+ /**
42
+ * Store a checkpoint blob for the session.
43
+ */
44
+ storeCheckpoint(threadId: string, checkpoint: unknown): void;
45
+ /**
46
+ * Load the latest checkpoint for a session.
47
+ */
48
+ loadCheckpoint(threadId: string): unknown | undefined;
49
+ /**
50
+ * Append events to the session's event stream.
51
+ */
52
+ appendEvents(threadId: string, events: unknown[]): void;
53
+ /**
54
+ * Read all events for a session.
55
+ */
56
+ readEvents(threadId: string): unknown[];
57
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/agent",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "AI agent infrastructure for Almadar orbital schema generation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",