{"_id":"@bookingcare/db","name":"@bookingcare/db","dist-tags":{"latest":"0.3.0"},"versions":{"0.3.0":{"name":"@bookingcare/db","version":"0.3.0","description":"Persistence layer for agent sessions with pluggable storage backends","license":"MIT","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json-store":{"types":"./dist/providers/json-store.d.ts","default":"./dist/providers/json-store.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","dev":"tsc -p tsconfig.build.json --watch","clean":"rm -rf dist *.tsbuildinfo","type-check":"tsc --noEmit"},"devDependencies":{"@bookingcare/tsconfig":"workspace:*","@types/node":"^25.6.2","typescript":"^5.8.0","vitest":"^4.1.5"},"dependencies":{"@bookingcare/ai":"^0.3.0"},"_id":"@bookingcare/db@0.3.0","gitHead":"aae37561b3c77dd32db84fe0e6d0946166756019","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-rWplgdFwJT1HK/5vc2VG4x29XJLeCr92PdgRhRGCtc5yb29+pPXj3r4AabYOiEbRDxTqrhOMCJOcpfNKzEiRgA==","shasum":"720f157b832143b73accc725f6ba8304161ebfd8","tarball":"https://registry.npmjs.org/@bookingcare/db/-/db-0.3.0.tgz","fileCount":22,"unpackedSize":27865,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBQkbh1RlhMZr9Jcj35V9F6oJOTkZuI+6TEjWUkykn8yAiAM+gSY6WCPg/Rco1pXvsEAR6l9WhKtk/hrEcNSa1q6KA=="}]},"_npmUser":{"name":"nampham1106","email":"nampham11062002@gmail.com"},"directories":{},"maintainers":[{"name":"nampham1106","email":"nampham11062002@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/db_0.3.0_1779040413566_0.9962835552865121"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T17:53:33.471Z","0.3.0":"2026-05-17T17:53:33.707Z","modified":"2026-05-17T17:53:33.963Z"},"maintainers":[{"name":"nampham1106","email":"nampham11062002@gmail.com"}],"description":"Persistence layer for agent sessions with pluggable storage backends","license":"MIT","readme":"# @bookingcare/db\n\nPersistence layer for agent sessions with pluggable storage backends.\n\nProvides a `Store` interface for saving messages, todo snapshots, and session metadata. The shipped `JSONStore` provider writes each session to a dedicated directory on the local filesystem.\n\n## Installation\n\n```bash\npnpm add @bookingcare/db\n```\n\n## Quick Start\n\n```typescript\nimport { JSONStore } from \"@bookingcare/db\";\n\nconst store = await JSONStore.create({ baseDir: \"./data\" });\n\n// Save a session\nawait store.saveMessages(\"session-1\", messages);\nawait store.saveInfo(\"session-1\", {\n  sessionId: \"session-1\",\n  model: \"gpt-4\",\n  provider: \"openai\",\n  systemPrompt: \"You are helpful.\",\n  createdAt: Date.now(),\n  updatedAt: Date.now(),\n  messageCount: messages.length,\n});\n\n// Resume a session\nconst messages = await store.loadMessages(\"session-1\");\nconst info = await store.loadInfo(\"session-1\");\n```\n\n## Store Interface\n\nAll storage backends implement `Store`:\n\n```typescript\ninterface Store {\n  // Messages\n  saveMessages(sessionId: string, messages: Message[]): Promise<void>;\n  loadMessages(sessionId: string, opts?: LoadMessagesOptions): Promise<Message[]>;\n\n  // Todos\n  saveTodos(sessionId: string, snapshot: TodoSnapshot): Promise<void>;\n  loadTodos(sessionId: string): Promise<TodoSnapshot | undefined>;\n\n  // Metadata\n  saveInfo(sessionId: string, info: AgentInfo): Promise<void>;\n  loadInfo(sessionId: string): Promise<AgentInfo | undefined>;\n\n  // Lifecycle\n  exists(sessionId: string): Promise<boolean>;\n  delete(sessionId: string): Promise<void>;\n  list(prefix?: string): Promise<string[]>;\n}\n```\n\n### loadMessages filters\n\n```typescript\nconst msgs = await store.loadMessages(\"session-1\", {\n  role: \"assistant\", // only assistant messages\n  limit: 10, // last 10 messages\n  since: Date.now() - 24 * 60 * 60 * 1000, // messages from the last 24h\n});\n```\n\nFilters can be combined. `limit` applies last (after role and since).\n\n## JSONStore\n\nA filesystem-based `Store` implementation. Each session gets a directory containing three JSON files:\n\n```\n{baseDir}/{sessionId}/\n  messages.json  — message transcript\n  todos.json     — todo snapshot\n  info.json      — session metadata\n```\n\n```typescript\nimport { JSONStore } from \"@bookingcare/db\";\n\nconst store = await JSONStore.create({ baseDir: \"./data/sessions\" });\n\n// Check if a session exists\nif (await store.exists(\"session-1\")) {\n  // Delete it\n  await store.delete(\"session-1\");\n}\n\n// List all sessions\nconst sessionIds = await store.list();\n// Filter by prefix\nconst agents = await store.list(\"agent-\");\n```\n\n## Error Types\n\n| Error              | When                            |\n| ------------------ | ------------------------------- |\n| `StoreError`       | Base class for all store errors |\n| `NotFoundError`    | Session does not exist          |\n| `CorruptDataError` | Stored JSON is malformed        |\n\n`JSONStore` treats missing session files as normal: `loadMessages` returns an empty array, `loadInfo` and `loadTodos` return `undefined`.\n\n## Serialization Utilities\n\nHelpers for converting agent runtime state into storable snapshots:\n\n```typescript\nimport { serializeAgentState, createTodoSnapshot } from \"@bookingcare/db\";\n\nconst { messages, info } = serializeAgentState(agentState);\nconst todoSnapshot = createTodoSnapshot(todoItems, renderedText);\n```\n\n`serializeAgentState` intentionally excludes transient fields (`streamingMessage`, `pendingToolCalls`, `isStreaming`, `errorMessage`) and tools (which are runtime function references). Callers must re-register tools after resuming a session.\n","readmeFilename":"README.md","_rev":"1-718968abbfd938ef26422dbe00851d77"}