wolbarg 0.4.0 → 0.5.1

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/CHANGELOG.md CHANGED
@@ -5,6 +5,25 @@ All notable changes to this project are documented here.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
+ ## [0.5.0] — 2026-07-19
9
+
10
+ ### Added
11
+
12
+ - **Optional graph memory** — `graph` constructor option with `sqliteGraph({ path })` (local) and `neo4jGraph({ url, username, password })` (networked); optional peer `neo4j-driver`
13
+ - **Typed graph API** — `linkMemories()`, `getRelated()` on the facade; provider surface also includes `unlinkMemories`, `upsertEntity`, `linkEntityToMemory`, `deleteMemory`
14
+ - **`recall({ includeGraph: true })`** — attaches `related` neighbor memories from the graph
15
+ - **Cascade deletes** — `forget` / `clear` remove graph memory nodes and incident edges when graph is configured
16
+ - **Graph-aware checkpoints / export** — file-backed SQLite graph snapshots alongside memory DB; Neo4j refuses with `GraphCheckpointNotSupportedError` (`GRAPH_CHECKPOINT_NOT_SUPPORTED`)
17
+ - **Schema v4** — memory DB index / ANN housekeeping migration on open (graph tables live in a separate SQLite file or Neo4j)
18
+ - **Wolbarg Studio** — graph canvas, Connect for memory/telemetry/checkpoints/graph, ops filters for graph methods, stream / checkpoints / explain polish
19
+ - **Docs** — Graph memory, What's New 0.5, Observability screenshots, provider-isolated project layout
20
+
21
+ ### Compatibility
22
+
23
+ - Graph is **optional** and **additive**. Omitting `graph` leaves 0.4 behavior unchanged.
24
+ - No required constructor changes for upgrades from **0.4.x**.
25
+ - Raw Cypher `query()` is Neo4j-only; SQLite graph hard-errors (use typed methods for portable code).
26
+
8
27
  ## [0.4.0] — 2026-07-18
9
28
 
10
29
  ### Added
@@ -147,6 +166,7 @@ const ctx = wolbarg({
147
166
 
148
167
  - Initial npm release path (pre–modular storage / ingest)
149
168
 
169
+ [0.5.0]: https://github.com/wolbarg/wolbarg/releases/tag/v0.5.0
150
170
  [0.4.0]: https://github.com/wolbarg/wolbarg/releases/tag/v0.4.0
151
171
  [0.3.2]: https://github.com/wolbarg/wolbarg/releases/tag/v0.3.2
152
172
  [0.3.1]: https://github.com/wolbarg/wolbarg/releases/tag/v0.3.1
package/README.md CHANGED
@@ -1,52 +1,131 @@
1
- <p align="center">
2
- <img src="./assets/wolbarg-banner.png" alt="Wolbarg Logo: Memory Infrastructure for AI Agents" width="720" />
3
- </p>
1
+ ![Wolbarg — Memory Infrastructure for AI Agents](./assets/wolbarg-banner.png)
4
2
 
5
3
  # Wolbarg
6
4
 
7
- **Modular, provider-agnostic semantic memory for AI agents (v0.3.1).**
5
+ **Modular, provider-agnostic semantic memory for AI agents.**
8
6
 
9
7
  [![npm version](https://img.shields.io/npm/v/wolbarg.svg)](https://www.npmjs.com/package/wolbarg)
10
8
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
9
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D22.5-brightgreen.svg)](https://nodejs.org)
11
10
  [![Docs](https://img.shields.io/badge/docs-wolbarg.com-black)](https://wolbarg.com)
12
- [![Benchmarks](https://img.shields.io/badge/benchmarks-Storage%20suite-black)](https://wolbarg.com/benchmarks)
11
+ [![Benchmarks](https://img.shields.io/badge/benchmarks-v0.4%20stress-black)](https://wolbarg.com/benchmarks)
13
12
 
14
- ## Benchmarks
13
+ ```bash
14
+ npm install wolbarg
15
+ ```
16
+
17
+ Wolbarg is **memory infrastructure**, not an agent framework. Agents call `remember()` / `recall()` (and optionally ingest, compress, subscribe, and link memories in a graph). You bring SQLite or PostgreSQL, any OpenAI-compatible embedding API, and optional peers for PDF/DOCX/OCR/Neo4j.
18
+
19
+ **Current release: [v0.5.0](./CHANGELOG.md)** — optional graph memory (SQLite + Neo4j), `includeGraph` recall, cascade forget, graph-aware checkpoints, and [Wolbarg Studio](https://wolbarg.com/docs/observability) graph canvas.
15
20
 
16
- **v0.2.1 Storage suite** (mock embeddings · scale quick) — dual-backend SQLite + PostgreSQL:
21
+ ---
17
22
 
18
- | Metric | Result |
23
+ ## Why Wolbarg?
24
+
25
+ | Problem | What Wolbarg does |
19
26
  | --- | --- |
20
- | SQLite search @ 1k | **2.02 ms** |
21
- | SQLite insert @ 1k | **1.72k ops/sec** |
22
- | SQLite cold start | **7.91 ms** |
23
- | Postgres 16 writers | **1.12k ops/sec** |
27
+ | Agents forget between sessions | Durable semantic memory on **your** disk or Postgres |
28
+ | Vendor lock-in | Pluggable embeddings, LLM, rerankers, OCR, vision, storage, graph |
29
+ | Vectors alone are not enough | Hybrid search (semantic + BM25), metadata filters, MMR, optional rerank |
30
+ | Multi-agent writes collide | SQLite `BEGIN IMMEDIATE` + retries; Postgres row-level locking |
31
+ | Duplicate facts pile up | Opt-in write-time dedupe / upsert |
32
+ | Repeated embeds cost money | Transparent embedding cache (default on) |
33
+ | Need structure, not only similarity | Optional **graph** — `linkMemories` / `getRelated` (SQLite ↔ Neo4j) |
34
+ | Hard to debug memory | Telemetry + **Wolbarg Studio** (local, read-only) |
35
+
36
+ ---
37
+
38
+ ## Features
39
+
40
+ - **Storage** — SQLite (`node:sqlite` + sqlite-vec) or PostgreSQL (+ optional pgvector)
41
+ - **Recall** — semantic, hybrid, metadata filters, MMR, rerank, `explain: true`
42
+ - **Ingest** — text / markdown / PDF / DOCX / images (peers for PDF/DOCX/OCR)
43
+ - **Compress** — optional LLM summarization with archive lineage
44
+ - **`subscribe()`** — real-time change events (SQLite in-process; Postgres LISTEN/NOTIFY)
45
+ - **Concurrency** — multi-writer SQLite hardening (`WOLBARG_STORAGE_LOCKED`)
46
+ - **Embedding cache** — `hash(content) + model`
47
+ - **Dedupe / upsert** — opt-in exact / near / exact-or-near
48
+ - **Graph memory (0.5)** — `sqliteGraph` / `neo4jGraph`, `linkMemories`, `getRelated`, `includeGraph`
49
+ - **Checkpoints / export** — file-backed SQLite snapshots (+ graph file when applicable)
50
+ - **Telemetry** — independent event DB; Studio dashboard, Trace Explorer, graph canvas
24
51
 
25
- Storage (mock) LIVE (real providers). Full page: [wolbarg.com/benchmarks](https://wolbarg.com/benchmarks) · [methodology](https://wolbarg.com/docs/benchmarks) · [raw JSON](https://wolbarg.com/benchmarks/benchmark.json).
52
+ Docs: [Getting started](https://wolbarg.com/docs/getting-started) · [What's new in 0.5](https://wolbarg.com/docs/guides/whats-new) · [Graph memory](https://wolbarg.com/docs/graph-memory) · [Studio](https://wolbarg.com/docs/observability)
53
+
54
+ ---
55
+
56
+ ## Benchmarks (v0.4.0 stress · mock embeddings)
57
+
58
+ Published dual-backend **v4-stress** suite (2026-07-18 · Node v24.13.1 · win32/arm64 · 8 CPUs). Mock embeddings isolate SDK + database cost — not LIVE provider latency.
59
+
60
+ ### Headlines
61
+
62
+ | Metric | SQLite | PostgreSQL |
63
+ | --- | --- | --- |
64
+ | Cold `ready()` | **16.18 ms** | **91.39 ms** |
65
+ | Batch remember (200) | **5,795 ops/s** | **2,795 ops/s** |
66
+ | Bulk insert 2k | **7,509 ops/s** | **4,085 ops/s** |
67
+ | Recall p95 @ 2k | **4.83 ms** | **141.5 ms** |
68
+ | 16 writers throughput | **8,660 ops/s** | **3,335 ops/s** |
69
+ | Embedding cache speedup | **1.47×** | **1.18×** |
70
+ | Suite result | 25 pass / 0 fail | 21 pass / 0 fail / 4 skip\* |
71
+
72
+ \*Postgres skips SQLite-only paths (telemetry EventDatabase, file checkpoints, export/import).
73
+
74
+ ### SQLite — stress & concurrency
75
+
76
+ | Case | Result |
77
+ | --- | --- |
78
+ | Bulk insert 2k + search | 7,509 insert ops/s · recall p50 **4.12 ms** · p95 **4.83 ms** |
79
+ | 8 writers × 20 ops | **6,084** ops/s · p95 **3.05 ms** · 0 failures |
80
+ | 16 writers × 20 ops | **8,660** ops/s · p95 **2.46 ms** · 0 failures |
81
+ | 32 writers × 20 ops | **6,798** ops/s · p95 **22.94 ms** · 0 failures |
82
+ | Mixed read/write storm | 0 failures |
83
+
84
+ ### PostgreSQL — stress & concurrency
85
+
86
+ | Case | Result |
87
+ | --- | --- |
88
+ | Bulk insert 2k + search | 4,085 insert ops/s · recall p50 **23.29 ms** · p95 **141.5 ms** |
89
+ | 8 writers × 20 ops | **2,555** ops/s · p95 **8.51 ms** · 0 failures |
90
+ | 16 writers × 20 ops | **3,335** ops/s · p95 **9.48 ms** · 0 failures |
91
+ | 32 writers × 20 ops | **3,802** ops/s · p95 **14.77 ms** · 0 failures |
92
+ | Mixed read/write storm | 0 failures |
93
+
94
+ **Artifacts:** [SQLite JSON](https://wolbarg.com/benchmarks/version-0.4.0-sqlite-benchmark.json) · [SQLite MD](https://wolbarg.com/benchmarks/version-0.4.0-sqlite-benchmark.md) · [Postgres JSON](https://wolbarg.com/benchmarks/version-0.4.0-postgres-benchmark.json) · [Postgres MD](https://wolbarg.com/benchmarks/version-0.4.0-postgres-benchmark.md) · [Interactive page](https://wolbarg.com/benchmarks) · [Methodology](https://wolbarg.com/docs/benchmarks)
95
+
96
+ Also published: [embedding-cache](https://wolbarg.com/benchmarks/embedding-cache.json) · [multiprocess concurrency](https://wolbarg.com/benchmarks/multiprocess-concurrency.json)
97
+
98
+ ---
26
99
 
27
100
  ## Installation
28
101
 
29
102
  ```bash
30
103
  npm install wolbarg
104
+ # or: pnpm add wolbarg · yarn add wolbarg · bun add wolbarg
31
105
  ```
32
106
 
33
- Node.js **22.5+**.
107
+ **Requires Node.js 22.5+** (built-in `node:sqlite`).
108
+
109
+ ### Optional peers
34
110
 
35
- ### Optional peers (install when you use the feature)
111
+ Install only what you use:
36
112
 
37
113
  | Peer | Required for |
38
114
  | --- | --- |
39
- | `pg` | `postgres({ … })` storage |
40
- | `pdf-parse` (pin `@1.1.4`) | `ingest()` of `.pdf` files |
41
- | `mammoth` | `ingest()` of `.docx` files |
42
- | `tesseract.js` | OCR provider for images |
115
+ | `pg` | PostgreSQL storage |
116
+ | `neo4j-driver` | `neo4jGraph(...)` |
117
+ | `pdf-parse@1.1.4` | PDF ingest |
118
+ | `mammoth` | DOCX ingest |
119
+ | `tesseract.js` | OCR |
43
120
 
44
121
  ```bash
45
- # Example: PDF + DOCX ingest
46
- npm install pdf-parse@1.1.4 mammoth
122
+ npm install pg neo4j-driver # production storage + graph
123
+ npm install pdf-parse@1.1.4 mammoth # document ingest
47
124
  ```
48
125
 
49
- **Important:** these packages are **not** bundled with `Wolbarg`. If you call `ingest()` on PDF/DOCX without the matching peer, Wolbarg throws a configuration error at use time (not at import). Plain `.txt` / `.md` / `.csv` / `.json` need no extras.
126
+ Peers are **not** bundled. Missing peers fail at use time for that path not at import. Plain `.txt` / `.md` / `.csv` / `.json` and SQLite graph need no extras.
127
+
128
+ ---
50
129
 
51
130
  ## Quick start
52
131
 
@@ -65,39 +144,83 @@ const ctx = wolbarg({
65
144
  model: "gpt-4.1-mini",
66
145
  }),
67
146
  keywordSearch: bm25(),
147
+ concurrency: { maxRetries: 5 },
148
+ embeddingCache: { enabled: true },
149
+ memory: { dedupe: { enabled: true, strategy: "exact-or-near" } },
68
150
  telemetry: {
69
151
  enabled: true,
70
152
  database: { provider: "sqlite", url: "./telemetry.db" },
71
153
  level: "debug",
72
- captureQueries: true,
73
- captureLatency: true,
74
154
  },
75
155
  });
76
156
 
77
- await ctx.remember({
157
+ await ctx.ready();
158
+
159
+ const saved = await ctx.remember({
78
160
  agent: "research",
79
161
  content: { text: "Stripe supports recurring invoices." },
80
162
  metadata: { topic: "billing" },
81
163
  });
164
+ // saved.action === "created" | "updated"
165
+
166
+ const hits = await ctx.recall({
167
+ query: "How do recurring invoices work?",
168
+ topK: 5,
169
+ hybrid: true,
170
+ });
171
+
172
+ ctx.subscribe({ organization: "my-org" }, (e) => {
173
+ console.log(e.event, e.memoryId);
174
+ });
82
175
 
83
- const hits = await ctx.recall({ query: "invoices", topK: 5 });
84
- const explained = await ctx.recall({ query: "invoices", explain: true });
85
176
  await ctx.checkpoint("before-compress");
177
+ await ctx.close();
86
178
  ```
87
179
 
88
- `new Wolbarg({ storage: sqlite("./memory.db"), embedding })` remains supported for backwards compatibility.
180
+ ### Graph memory (0.5)
89
181
 
90
- ## Quick start (legacy constructor)
182
+ Same typed API locally and in production — swap only the factory:
91
183
 
92
184
  ```ts
93
- import {
94
- Wolbarg,
95
- sqlite,
96
- openaiEmbedding,
97
- openaiLlm,
98
- bm25,
99
- meta,
100
- } from "wolbarg";
185
+ import { wolbarg, openaiEmbedding, sqliteGraph, neo4jGraph } from "wolbarg";
186
+
187
+ // Local
188
+ graph: sqliteGraph({ path: "./graph.db" })
189
+
190
+ // Production
191
+ graph: neo4jGraph({
192
+ url: process.env.NEO4J_URL!,
193
+ username: process.env.NEO4J_USER!,
194
+ password: process.env.NEO4J_PASSWORD!,
195
+ })
196
+ ```
197
+
198
+ ```ts
199
+ const a = await ctx.remember({
200
+ agent: "support",
201
+ content: { text: "Refunds take 5 business days." },
202
+ });
203
+ const b = await ctx.remember({
204
+ agent: "support",
205
+ content: { text: "Chargebacks escalate to risk." },
206
+ });
207
+
208
+ await ctx.linkMemories(a.id, b.id, "related_to");
209
+ const related = await ctx.getRelated(a.id, { depth: 1 });
210
+
211
+ const withGraph = await ctx.recall({
212
+ query: "refunds",
213
+ includeGraph: true,
214
+ });
215
+ // withGraph[0].related — neighbors from the graph
216
+ ```
217
+
218
+ Guide: [Graph memory](https://wolbarg.com/docs/graph-memory) · Prefer a [provider-isolated project layout](https://wolbarg.com/docs/installation#project-layout) so backend swaps stay one-file.
219
+
220
+ ### Constructor DI (still supported)
221
+
222
+ ```ts
223
+ import { Wolbarg, sqlite, openaiEmbedding } from "wolbarg";
101
224
 
102
225
  const ctx = new Wolbarg({
103
226
  organization: "my-org",
@@ -106,78 +229,93 @@ const ctx = new Wolbarg({
106
229
  apiKey: process.env.OPENAI_API_KEY!,
107
230
  model: "text-embedding-3-small",
108
231
  }),
109
- llm: openaiLlm({
110
- apiKey: process.env.OPENAI_API_KEY!,
111
- model: "gpt-4.1-mini",
112
- }),
113
- keywordSearch: bm25(),
114
- });
115
-
116
- await ctx.remember({
117
- agent: "research",
118
- content: { text: "Stripe supports recurring invoices." },
119
- metadata: { topic: "billing" },
120
- });
121
-
122
- const hits = await ctx.recall({
123
- query: "recurring invoices",
124
- topK: 5,
125
- hybrid: true,
126
- filter: { metadata: meta.eq("topic", "billing") },
127
232
  });
128
233
  ```
129
234
 
130
235
  **Required:** `organization`, `storage` or `database`, `embedding`.
131
- **Optional:** `llm`, `telemetry`, `keywordSearch`, `reranker`, `ocr`, `vision`, `chunking`, `compression`, `retrieval`, `checkpoint`.
236
+ **Optional:** `llm`, `keywordSearch`, `reranker`, `ocr`, `vision`, `chunking`, `telemetry`, `concurrency`, `embeddingCache`, `memory.dedupe`, `graph`, `checkpoint` / `checkpointDirectory`.
132
237
 
133
- Calling `compress` without `llm` is a TypeScript error.
238
+ ---
134
239
 
135
- ## API
240
+ ## API surface
136
241
 
137
- | Method | Description |
242
+ | Method | Role |
138
243
  | --- | --- |
139
- | `remember` / `rememberBatch` | Store + embed |
140
- | `recall` / `recallBatch` | Semantic / hybrid search (`explain: true` for diagnostics) |
141
- | `ingest` | Documents chunks memories (**peers** for PDF/DOCX/OCR) |
142
- | `compress` | LLM summary (needs `llm`) |
143
- | `checkpoint` / `rollback` / `listCheckpoints` | First-party memory snapshots |
144
- | `export` / `import` | Portable SQLite memory bundles |
145
- | `forget` / `history` / `stats` / `clear` | Management |
146
- | `ready` / `close` | Lifecycle |
244
+ | `remember` / `rememberBatch` | Embed + store (`RememberResult` includes `action`) |
245
+ | `update` | Edit an existing memory by id |
246
+ | `recall` / `recallBatch` | Semantic / hybrid search; `explain` · `includeGraph` |
247
+ | `ingest` | Documents chunks memories |
248
+ | `compress` | LLM summary (requires `llm`) |
249
+ | `linkMemories` / `getRelated` | Graph edges / traversal (requires `graph`) |
250
+ | `subscribe` | Real-time change callbacks |
251
+ | `checkpoint` / `rollback` / `listCheckpoints` / … | SQLite snapshots (+ graph file when SQLite graph) |
252
+ | `export` / `import` | Portable SQLite + manifest |
253
+ | `forget` / `history` / `stats` / `clear` | Lifecycle (forget/clear cascade graph when configured) |
254
+ | `ready` / `close` / `flushTelemetry` | Lifecycle |
255
+
256
+ Full reference: [wolbarg.com/docs/api](https://wolbarg.com/docs/api)
147
257
 
148
- ## Studio
258
+ ---
149
259
 
150
- Local telemetry dashboard (separate app — not bundled into the SDK):
260
+ ## Wolbarg Studio
261
+
262
+ Local observability dashboard — **not** bundled in the npm package. The SDK writes telemetry; Studio reads it (and can open memory / graph files for the canvas).
151
263
 
152
264
  ```bash
153
- cd wolbarg_studio
265
+ git clone https://github.com/Atharvmunde11/wolbarg-studio
266
+ cd wolbarg-studio
154
267
  npm install
155
- npm run dev
268
+ npm run dev # http://localhost:3100
156
269
  ```
157
270
 
158
- Open http://localhost:3100 and connect to your `./telemetry.db`. Connections persist under the user config directory (`~/.wolbarg/studio.json` / AppData), never inside the project.
271
+ Connect telemetry (`./telemetry.db`), optional memory DB, checkpoint directory, and graph backend. Screenshots and setup: [Observability & Studio](https://wolbarg.com/docs/observability).
159
272
 
160
- Telemetry SQLite files use an additive, versioned schema. On writable open, v1
161
- files are migrated in place to telemetry schema v2 and retain all existing
162
- events. V2 adds organization, agent, tags, checkpoint, persisted recall
163
- explanations, and measured stage spans. `SqliteEventDatabase.query()` can filter
164
- by `organization`, `agentId`, `tag`, and `checkpointId`; read-only access to an
165
- unmigrated v1 file remains supported.
273
+ ---
166
274
 
167
- Full documentation: [wolbarg.com](https://wolbarg.com/docs/introduction)
275
+ ## Documentation
168
276
 
169
- ## Limitations (v0.3)
277
+ | Topic | Link |
278
+ | --- | --- |
279
+ | Getting started | https://wolbarg.com/docs/getting-started |
280
+ | Installation & project layout | https://wolbarg.com/docs/installation |
281
+ | Configuration | https://wolbarg.com/docs/configuration |
282
+ | Graph memory | https://wolbarg.com/docs/graph-memory |
283
+ | Observability & Studio | https://wolbarg.com/docs/observability |
284
+ | Concurrency | https://wolbarg.com/docs/concurrency |
285
+ | Real-time events | https://wolbarg.com/docs/realtime-events |
286
+ | Embedding cache | https://wolbarg.com/docs/embedding-cache |
287
+ | Memory upsert | https://wolbarg.com/docs/memory-upsert |
288
+ | What's new in 0.5 | https://wolbarg.com/docs/guides/whats-new |
289
+ | Migration | https://wolbarg.com/docs/migration |
290
+ | Limitations | https://wolbarg.com/docs/guides/limitations |
291
+ | Changelog | [CHANGELOG.md](./CHANGELOG.md) |
292
+
293
+ ---
294
+
295
+ ## Limitations
296
+
297
+ - **Node 22.5+** required (`node:sqlite`).
298
+ - **Ingest peers** required for PDF / DOCX / OCR paths.
299
+ - **PDF** text-layer via `pdf-parse`; scan PDFs need OCR/vision.
300
+ - **Telemetry** is SQLite-only today (Postgres typed but not implemented).
301
+ - **SQLite `subscribe()`** is in-process only; Postgres uses LISTEN/NOTIFY.
302
+ - **Checkpoints / export** require file-backed SQLite memory (not `:memory:` / not Postgres).
303
+ - **Neo4j** checkpoint / export / import throw `GraphCheckpointNotSupportedError` (refuse, don't skip).
304
+ - **Cypher `query()`** is Neo4j-only; SQLite graph uses typed methods.
305
+ - Not an agent framework, chat UI, or hosted vector SaaS.
306
+
307
+ ---
308
+
309
+ ## Upgrade
170
310
 
171
- - **Ingest peers are opt-in but required for those formats** — see table above.
172
- - **PDF text layer only** via `pdf-parse`; scan/image PDFs need OCR/vision (or a text PDF). Older pdf.js in `pdf-parse@1.1.4` may reject some modern PDFs.
173
- - **Node `node:sqlite` is experimental**; Node **22.5+** required.
174
- - **Postgres** memory storage needs `pg`; telemetry/checkpoints are SQLite-only in v0.3 (interfaces ready for Postgres).
175
- - **Not** an agent framework, chat UI, or hosted vector SaaS.
311
+ ```bash
312
+ npm install wolbarg@^0.5.0
313
+ ```
176
314
 
177
- ## Migration from 0.1 / 0.2
315
+ 0.5 is **additive**. Omitting `graph` keeps 0.4 behavior. See [Migration](https://wolbarg.com/docs/migration) and [CHANGELOG](./CHANGELOG.md).
178
316
 
179
- `init()` and `new Wolbarg({ storage })` still work. Prefer `wolbarg({ database, telemetry })`. LLM is optional. Schema auto-migrates to v2.
317
+ ---
180
318
 
181
319
  ## License
182
320
 
183
- MIT
321
+ MIT © [Atharv Munde](https://github.com/Atharvmunde11)