{"_id":"@eddacraft/kindling-provider-local","_rev":"4-6565192ca232167c0fb17b29179a401e","name":"@eddacraft/kindling-provider-local","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@eddacraft/kindling-provider-local","version":"0.1.0","keywords":["kindling","retrieval","search","fts","full-text-search","ranking","bm25","local-first"],"author":{"name":"EddaCraft","email":"hello@eddacraft.ai"},"license":"Apache-2.0","_id":"@eddacraft/kindling-provider-local@0.1.0","maintainers":[{"name":"joshuaboys","email":"josh@arkahna.io"}],"homepage":"https://github.com/EddaCraft/kindling/tree/main/packages/kindling-provider-local#readme","bugs":{"url":"https://github.com/EddaCraft/kindling/issues"},"dist":{"shasum":"edad26de6333a5713c84e1270c343d8fb1f32323","tarball":"https://registry.npmjs.org/@eddacraft/kindling-provider-local/-/kindling-provider-local-0.1.0.tgz","fileCount":11,"integrity":"sha512-LgZj86jnhYygqeqN96IaH9j5Q3M4LvC5EAzXLl6/qSDvsXP52aXoxc1UEK/m5EV4e31+JnTVaMs/tg78iDND9Q==","signatures":[{"sig":"MEUCIQDhWNl85CzxVDW6SJrCEdXrJqFdZIClwnuqP0oJOryObQIgQHF8+GkAmvpRjtbwUwm6DC/Rk+EIxScs6gom/iwOgUY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eddacraft%2fkindling-provider-local@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37338},"main":"./dist/index.js","type":"module","_from":"file:eddacraft-kindling-provider-local-0.1.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src","test":"vitest run","build":"tsc --build","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"joshuaboys","email":"josh@arkahna.io"},"_resolved":"/tmp/d615f07a073d8902163069dd646a2945/eddacraft-kindling-provider-local-0.1.0.tgz","_integrity":"sha512-LgZj86jnhYygqeqN96IaH9j5Q3M4LvC5EAzXLl6/qSDvsXP52aXoxc1UEK/m5EV4e31+JnTVaMs/tg78iDND9Q==","repository":{"url":"git+https://github.com/EddaCraft/kindling.git","type":"git","directory":"packages/kindling-provider-local"},"_npmVersion":"10.8.2","description":"Local FTS-based retrieval provider for Kindling with deterministic, explainable ranking","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@eddacraft/kindling-core":"0.1.0","@eddacraft/kindling-store-sqlite":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.3.0","@types/node":"^20.11.0","@types/better-sqlite3":"^7.6.8"},"_npmOperationalInternal":{"tmp":"tmp/kindling-provider-local_0.1.0_1770862717284_0.6976841362724757","host":"s3://npm-registry-packages-npm-production"},"deprecated":"DEPRECATED: this package is deprecated and will be removed at v1.0.0. kindling is now a Rust daemon; use @eddacraft/kindling (thin client) or the `kindling` binary. See https://github.com/eddacraft/kindling."},"0.1.1":{"name":"@eddacraft/kindling-provider-local","version":"0.1.1","keywords":["kindling","retrieval","search","fts","full-text-search","ranking","bm25","local-first"],"author":{"name":"EddaCraft","email":"hello@eddacraft.ai"},"license":"Apache-2.0","_id":"@eddacraft/kindling-provider-local@0.1.1","maintainers":[{"name":"joshuaboys","email":"josh@arkahna.io"}],"homepage":"https://github.com/EddaCraft/kindling/tree/main/packages/kindling-provider-local#readme","bugs":{"url":"https://github.com/EddaCraft/kindling/issues"},"dist":{"shasum":"a38afece75aa4f5c6b97a02e05735529a841c2ae","tarball":"https://registry.npmjs.org/@eddacraft/kindling-provider-local/-/kindling-provider-local-0.1.1.tgz","fileCount":11,"integrity":"sha512-o4ipe2gOzeQgFOtPBa2Kp+w2/Sfh/ScA9kDPkWPGTML9CkvmSlF6ObSXRk5fdhPiv1VkctnBR+O0C158iD4xKA==","signatures":[{"sig":"MEQCIGYB2wOdwl9s7Nh3nJIYaHh8t0sbjgXxF5SsuarUBTARAiBk0/CzPiL3UiapZvLmY/j1Bw6WOflhCQSMtKOkX4imhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eddacraft%2fkindling-provider-local@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37338},"main":"./dist/index.js","type":"module","_from":"file:eddacraft-kindling-provider-local-0.1.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src","test":"vitest run","build":"tsc --build","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"joshuaboys","email":"josh@arkahna.io"},"_resolved":"/tmp/610a15fca0a235a83236087f94fa05a2/eddacraft-kindling-provider-local-0.1.1.tgz","_integrity":"sha512-o4ipe2gOzeQgFOtPBa2Kp+w2/Sfh/ScA9kDPkWPGTML9CkvmSlF6ObSXRk5fdhPiv1VkctnBR+O0C158iD4xKA==","repository":{"url":"git+https://github.com/EddaCraft/kindling.git","type":"git","directory":"packages/kindling-provider-local"},"_npmVersion":"10.8.2","description":"Local FTS-based retrieval provider for Kindling with deterministic, explainable ranking","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@eddacraft/kindling-core":"0.1.1","@eddacraft/kindling-store-sqlite":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.3.0","@types/node":"^20.11.0","@types/better-sqlite3":"^7.6.8"},"_npmOperationalInternal":{"tmp":"tmp/kindling-provider-local_0.1.1_1770960593567_0.8389772955351962","host":"s3://npm-registry-packages-npm-production"},"deprecated":"DEPRECATED: this package is deprecated and will be removed at v1.0.0. kindling is now a Rust daemon; use @eddacraft/kindling (thin client) or the `kindling` binary. See https://github.com/eddacraft/kindling."},"0.1.2":{"name":"@eddacraft/kindling-provider-local","version":"0.1.2","keywords":["kindling","retrieval","search","fts","full-text-search","ranking","bm25","local-first"],"author":{"name":"EddaCraft","email":"hello@eddacraft.ai"},"license":"Apache-2.0","_id":"@eddacraft/kindling-provider-local@0.1.2","maintainers":[{"name":"joshuaboys","email":"josh@arkahna.io"}],"homepage":"https://github.com/EddaCraft/kindling/tree/main/packages/kindling-provider-local#readme","bugs":{"url":"https://github.com/EddaCraft/kindling/issues"},"dist":{"shasum":"39b3f96bbc67aad7e0f236a7154b8cf7b3db65bc","tarball":"https://registry.npmjs.org/@eddacraft/kindling-provider-local/-/kindling-provider-local-0.1.2.tgz","fileCount":11,"integrity":"sha512-zzPkQPtNR+V8q7fEJ39o2YlCLiNT2iMEowThVP4PKhvKAnCkqaRelFY5z7+fbclmyKGg9sbY31pPy/194aqI8A==","signatures":[{"sig":"MEYCIQDmUYv6P/A6EnHXSPAIJ2NIp1pYnPTcTGj7MykgmkC16QIhAP3aRREncjZUSAzuPTp1gfpoCzBA4QCChkl/JMT5sivc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eddacraft%2fkindling-provider-local@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":32338},"main":"./dist/index.js","type":"module","_from":"file:eddacraft-kindling-provider-local-0.1.2.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"eslint src","test":"vitest run","build":"tsc --build","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"joshuaboys","email":"josh@arkahna.io"},"_resolved":"/tmp/3a6028684a74e98cf4a91b02d7119862/eddacraft-kindling-provider-local-0.1.2.tgz","_integrity":"sha512-zzPkQPtNR+V8q7fEJ39o2YlCLiNT2iMEowThVP4PKhvKAnCkqaRelFY5z7+fbclmyKGg9sbY31pPy/194aqI8A==","repository":{"url":"git+https://github.com/EddaCraft/kindling.git","type":"git","directory":"packages/kindling-provider-local"},"_npmVersion":"10.8.2","description":"Local FTS-based retrieval provider for Kindling with deterministic, explainable ranking","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@eddacraft/kindling-core":"0.1.2","@eddacraft/kindling-store-sqlite":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.3.0","@types/node":"^20.11.0","@types/better-sqlite3":"^7.6.8"},"_npmOperationalInternal":{"tmp":"tmp/kindling-provider-local_0.1.2_1771253721141_0.7817894013398747","host":"s3://npm-registry-packages-npm-production"},"deprecated":"DEPRECATED: this package is deprecated and will be removed at v1.0.0. kindling is now a Rust daemon; use @eddacraft/kindling (thin client) or the `kindling` binary. See https://github.com/eddacraft/kindling."}},"time":{"created":"2026-02-12T02:18:37.217Z","modified":"2026-06-22T06:09:26.898Z","0.1.0":"2026-02-12T02:18:37.430Z","0.1.1":"2026-02-13T05:29:53.709Z","0.1.2":"2026-02-16T14:55:21.301Z"},"bugs":{"url":"https://github.com/EddaCraft/kindling/issues"},"author":{"name":"EddaCraft","email":"hello@eddacraft.ai"},"license":"Apache-2.0","homepage":"https://github.com/EddaCraft/kindling/tree/main/packages/kindling-provider-local#readme","keywords":["kindling","retrieval","search","fts","full-text-search","ranking","bm25","local-first"],"repository":{"url":"git+https://github.com/EddaCraft/kindling.git","type":"git","directory":"packages/kindling-provider-local"},"description":"Local FTS-based retrieval provider for Kindling with deterministic, explainable ranking","maintainers":[{"name":"joshuaboys","email":"josh@arkahna.io"}],"readme":"# @eddacraft/kindling-provider-local\n\nLocal FTS-based retrieval provider for Kindling with deterministic, explainable ranking.\n\n[![npm version](https://img.shields.io/npm/v/@eddacraft/kindling-provider-local.svg)](https://www.npmjs.com/package/@eddacraft/kindling-provider-local)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](../../LICENSE)\n\n## Installation\n\n```bash\nnpm install @eddacraft/kindling-provider-local\n```\n\n## Overview\n\n`@eddacraft/kindling-provider-local` implements the `RetrievalProvider` interface using SQLite FTS5:\n\n- **FTS5 Search** - Full-text search with BM25 ranking\n- **Recency Weighting** - Recent observations score higher\n- **Deterministic Results** - Same query always produces same results\n- **Explainable Scoring** - Results include match context and scores\n\n## Usage\n\n```typescript\nimport { LocalFtsProvider } from '@eddacraft/kindling-provider-local';\nimport { openDatabase } from '@eddacraft/kindling-store-sqlite';\n\n// Initialize\nconst db = openDatabase({ path: './kindling.db' });\nconst provider = new LocalFtsProvider(db);\n\n// Search\nconst results = await provider.search({\n  query: 'authentication error',\n  scopeIds: { repoId: '/repo' },\n  maxResults: 50,\n});\n\n// Results include scores and context\nfor (const result of results) {\n  console.log(`${result.entity.id}: ${result.score}`);\n  console.log(`  Match: ${result.matchContext}`);\n}\n```\n\n## Scoring\n\nThe provider combines FTS relevance with recency:\n\n```\nscore = (fts_relevance * 0.7) + (recency_score * 0.3)\n\nwhere:\n  fts_relevance = BM25 rank normalized to [0,1] across all results\n                  (observations + summaries combined)\n  recency_score = MAX(0, 1.0 - age_ms / max_age_ms)\n```\n\nBM25 normalization is done cross-table in JavaScript so that observation and summary scores are directly comparable. Singleton results receive a relevance of 0.5 (unknown relative relevance).\n\n## Provider Interface\n\n```typescript\ninterface RetrievalProvider {\n  name: string;\n  search(options: ProviderSearchOptions): Promise<ProviderSearchResult[]>;\n}\n\ninterface ProviderSearchOptions {\n  query: string;\n  scopeIds: ScopeIds;\n  maxResults?: number;\n  excludeIds?: string[];\n  includeRedacted?: boolean;\n}\n\ninterface ProviderSearchResult {\n  entity: Observation | Summary;\n  score: number;\n  matchContext?: string;\n}\n```\n\n## Characteristics\n\n| Property          | Value                      |\n| ----------------- | -------------------------- |\n| **Name**          | `local-fts`                |\n| **Deterministic** | Yes                        |\n| **Latency**       | < 50ms typical             |\n| **Max Results**   | Configurable (default: 50) |\n\n## Integration with Core\n\n```typescript\nimport { CapsuleManager } from '@eddacraft/kindling-core';\nimport { SqliteKindlingStore } from '@eddacraft/kindling-store-sqlite';\nimport { LocalFtsProvider } from '@eddacraft/kindling-provider-local';\n\nconst store = new SqliteKindlingStore(db);\nconst provider = new LocalFtsProvider(db);\n\n// Provider is used by core for retrieval\nconst manager = new CapsuleManager(store, { provider });\n\nconst results = manager.retrieve({\n  query: 'authentication',\n  scopeIds: { sessionId: 's1' },\n});\n```\n\n## Related Packages\n\n- [`@eddacraft/kindling-core`](../kindling-core) - Domain types and `RetrievalProvider` interface\n- [`@eddacraft/kindling-store-sqlite`](../kindling-store-sqlite) - SQLite store with FTS indexes\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}