sensemaking 0.15.3 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/README.md +33 -5
  2. package/dist/cjs/cli/download.js +15 -19
  3. package/dist/cjs/cli/download.js.map +1 -1
  4. package/dist/cjs/cli/index.d.cts +1 -1
  5. package/dist/cjs/cli/index.d.ts +1 -1
  6. package/dist/cjs/cli/index.js +9 -20
  7. package/dist/cjs/cli/index.js.map +1 -1
  8. package/dist/cjs/cli/init.js +31 -5
  9. package/dist/cjs/cli/init.js.map +1 -1
  10. package/dist/cjs/cli/map.js +1 -3
  11. package/dist/cjs/cli/map.js.map +1 -1
  12. package/dist/cjs/cli/named.js +3 -8
  13. package/dist/cjs/cli/named.js.map +1 -1
  14. package/dist/cjs/cli/path.js +4 -7
  15. package/dist/cjs/cli/path.js.map +1 -1
  16. package/dist/cjs/cli/peek.js +2 -4
  17. package/dist/cjs/cli/peek.js.map +1 -1
  18. package/dist/cjs/cli/related.js +14 -20
  19. package/dist/cjs/cli/related.js.map +1 -1
  20. package/dist/cjs/cli/search.js +12 -17
  21. package/dist/cjs/cli/search.js.map +1 -1
  22. package/dist/cjs/cli/shared.js +17 -21
  23. package/dist/cjs/cli/shared.js.map +1 -1
  24. package/dist/cjs/cli/sql.js +7 -8
  25. package/dist/cjs/cli/sql.js.map +1 -1
  26. package/dist/cjs/cli/status.js +344 -102
  27. package/dist/cjs/cli/status.js.map +1 -1
  28. package/dist/cjs/cli/watch.js +3 -8
  29. package/dist/cjs/cli/watch.js.map +1 -1
  30. package/dist/cjs/cli.js +22 -34
  31. package/dist/cjs/cli.js.map +1 -1
  32. package/dist/cjs/column-hint.js +4 -2
  33. package/dist/cjs/column-hint.js.map +1 -1
  34. package/dist/cjs/commands/peek.js +5 -3
  35. package/dist/cjs/commands/peek.js.map +1 -1
  36. package/dist/cjs/commands/related.js +31 -28
  37. package/dist/cjs/commands/related.js.map +1 -1
  38. package/dist/cjs/commands/scope.js +4 -2
  39. package/dist/cjs/commands/scope.js.map +1 -1
  40. package/dist/cjs/commands/search.js +36 -108
  41. package/dist/cjs/commands/search.js.map +1 -1
  42. package/dist/cjs/commands/signals.d.cts +18 -0
  43. package/dist/cjs/commands/signals.d.ts +18 -0
  44. package/dist/cjs/commands/signals.js +299 -0
  45. package/dist/cjs/commands/signals.js.map +1 -0
  46. package/dist/cjs/commands/status.d.cts +2 -2
  47. package/dist/cjs/commands/status.d.ts +2 -2
  48. package/dist/cjs/commands/status.js +1 -1
  49. package/dist/cjs/commands/status.js.map +1 -1
  50. package/dist/cjs/config/access.d.cts +5 -2
  51. package/dist/cjs/config/access.d.ts +5 -2
  52. package/dist/cjs/config/access.js +34 -14
  53. package/dist/cjs/config/access.js.map +1 -1
  54. package/dist/cjs/config/index.d.cts +4 -1
  55. package/dist/cjs/config/index.d.ts +4 -1
  56. package/dist/cjs/config/index.js +12 -2
  57. package/dist/cjs/config/index.js.map +1 -1
  58. package/dist/cjs/config/load.d.cts +6 -1
  59. package/dist/cjs/config/load.d.ts +6 -1
  60. package/dist/cjs/config/load.js +87 -15
  61. package/dist/cjs/config/load.js.map +1 -1
  62. package/dist/cjs/config/resolve.js +1 -1
  63. package/dist/cjs/config/resolve.js.map +1 -1
  64. package/dist/cjs/config/signals.d.cts +4 -0
  65. package/dist/cjs/config/signals.d.ts +4 -0
  66. package/dist/cjs/config/signals.js +30 -0
  67. package/dist/cjs/config/signals.js.map +1 -0
  68. package/dist/cjs/config/types.d.cts +6 -4
  69. package/dist/cjs/config/types.d.ts +6 -4
  70. package/dist/cjs/config/types.js +1 -1
  71. package/dist/cjs/config/types.js.map +1 -1
  72. package/dist/cjs/config/validate.js +121 -12
  73. package/dist/cjs/config/validate.js.map +1 -1
  74. package/dist/cjs/db/open.d.cts +1 -1
  75. package/dist/cjs/db/open.d.ts +1 -1
  76. package/dist/cjs/db/open.js +10 -3
  77. package/dist/cjs/db/open.js.map +1 -1
  78. package/dist/cjs/db/reconcile.d.cts +1 -0
  79. package/dist/cjs/db/reconcile.d.ts +1 -0
  80. package/dist/cjs/db/reconcile.js +20 -3
  81. package/dist/cjs/db/reconcile.js.map +1 -1
  82. package/dist/cjs/embed/cohere.d.cts +2 -0
  83. package/dist/cjs/embed/cohere.d.ts +2 -0
  84. package/dist/cjs/embed/cohere.js +238 -0
  85. package/dist/cjs/embed/cohere.js.map +1 -0
  86. package/dist/cjs/embed/http.d.cts +2 -0
  87. package/dist/cjs/embed/http.d.ts +2 -0
  88. package/dist/cjs/embed/http.js +258 -0
  89. package/dist/cjs/embed/http.js.map +1 -0
  90. package/dist/cjs/embed/identity.d.cts +13 -0
  91. package/dist/cjs/embed/identity.d.ts +13 -0
  92. package/dist/cjs/embed/identity.js +194 -0
  93. package/dist/cjs/embed/identity.js.map +1 -0
  94. package/dist/cjs/embed/langfit.d.cts +6 -0
  95. package/dist/cjs/embed/langfit.d.ts +6 -0
  96. package/dist/cjs/embed/langfit.js +326 -0
  97. package/dist/cjs/embed/langfit.js.map +1 -0
  98. package/dist/cjs/embed/languages.d.cts +3 -0
  99. package/dist/cjs/embed/languages.d.ts +3 -0
  100. package/dist/cjs/embed/languages.js +98 -0
  101. package/dist/cjs/embed/languages.js.map +1 -0
  102. package/dist/cjs/embed/openai.d.cts +2 -0
  103. package/dist/cjs/embed/openai.d.ts +2 -0
  104. package/dist/cjs/embed/openai.js +268 -0
  105. package/dist/cjs/embed/openai.js.map +1 -0
  106. package/dist/cjs/embed/query.d.cts +21 -0
  107. package/dist/cjs/embed/query.d.ts +21 -0
  108. package/dist/cjs/embed/query.js +610 -0
  109. package/dist/cjs/embed/query.js.map +1 -0
  110. package/dist/cjs/embed/registry.d.cts +3 -0
  111. package/dist/cjs/embed/registry.d.ts +3 -0
  112. package/dist/cjs/embed/registry.js +114 -0
  113. package/dist/cjs/embed/registry.js.map +1 -0
  114. package/dist/cjs/embed/static.d.cts +2 -0
  115. package/dist/cjs/embed/static.d.ts +2 -0
  116. package/dist/cjs/embed/static.js +367 -0
  117. package/dist/cjs/embed/static.js.map +1 -0
  118. package/dist/cjs/embed/store.d.cts +8 -0
  119. package/dist/cjs/embed/store.d.ts +8 -0
  120. package/dist/cjs/embed/store.js +498 -0
  121. package/dist/cjs/embed/store.js.map +1 -0
  122. package/dist/cjs/embed/types.d.cts +8 -0
  123. package/dist/cjs/embed/types.d.ts +8 -0
  124. package/dist/cjs/embed/types.js +7 -0
  125. package/dist/cjs/embed/types.js.map +1 -0
  126. package/dist/cjs/errors.d.cts +1 -1
  127. package/dist/cjs/errors.d.ts +1 -1
  128. package/dist/cjs/errors.js +15 -24
  129. package/dist/cjs/errors.js.map +1 -1
  130. package/dist/cjs/features/embed.d.cts +4 -27
  131. package/dist/cjs/features/embed.d.ts +4 -27
  132. package/dist/cjs/features/embed.js +6 -978
  133. package/dist/cjs/features/embed.js.map +1 -1
  134. package/dist/cjs/features/links.js +4 -2
  135. package/dist/cjs/features/links.js.map +1 -1
  136. package/dist/cjs/features/rank.js +1 -1
  137. package/dist/cjs/features/tags.js +4 -2
  138. package/dist/cjs/features/tags.js.map +1 -1
  139. package/dist/cjs/fences.js.map +1 -1
  140. package/dist/cjs/graph.js +5 -3
  141. package/dist/cjs/graph.js.map +1 -1
  142. package/dist/cjs/index.d.cts +1 -1
  143. package/dist/cjs/index.d.ts +1 -1
  144. package/dist/cjs/index.js.map +1 -1
  145. package/dist/cjs/output.d.cts +2 -2
  146. package/dist/cjs/output.d.ts +2 -2
  147. package/dist/cjs/output.js +15 -8
  148. package/dist/cjs/output.js.map +1 -1
  149. package/dist/cjs/scan.js +13 -8
  150. package/dist/cjs/scan.js.map +1 -1
  151. package/dist/cjs/segment.js +67 -14
  152. package/dist/cjs/segment.js.map +1 -1
  153. package/dist/cjs/traverse.js +4 -2
  154. package/dist/cjs/traverse.js.map +1 -1
  155. package/dist/cjs/watch.js +2 -5
  156. package/dist/cjs/watch.js.map +1 -1
  157. package/dist/esm/cli/download.js +9 -8
  158. package/dist/esm/cli/download.js.map +1 -1
  159. package/dist/esm/cli/index.d.ts +1 -1
  160. package/dist/esm/cli/index.js +1 -1
  161. package/dist/esm/cli/index.js.map +1 -1
  162. package/dist/esm/cli/init.js +32 -6
  163. package/dist/esm/cli/init.js.map +1 -1
  164. package/dist/esm/cli/status.js +36 -8
  165. package/dist/esm/cli/status.js.map +1 -1
  166. package/dist/esm/commands/related.js +14 -10
  167. package/dist/esm/commands/related.js.map +1 -1
  168. package/dist/esm/commands/search.js +27 -78
  169. package/dist/esm/commands/search.js.map +1 -1
  170. package/dist/esm/commands/signals.d.ts +18 -0
  171. package/dist/esm/commands/signals.js +78 -0
  172. package/dist/esm/commands/signals.js.map +1 -0
  173. package/dist/esm/commands/status.d.ts +2 -2
  174. package/dist/esm/commands/status.js +2 -2
  175. package/dist/esm/commands/status.js.map +1 -1
  176. package/dist/esm/config/access.d.ts +5 -2
  177. package/dist/esm/config/access.js +31 -12
  178. package/dist/esm/config/access.js.map +1 -1
  179. package/dist/esm/config/index.d.ts +4 -1
  180. package/dist/esm/config/index.js +2 -1
  181. package/dist/esm/config/index.js.map +1 -1
  182. package/dist/esm/config/load.d.ts +6 -1
  183. package/dist/esm/config/load.js +67 -9
  184. package/dist/esm/config/load.js.map +1 -1
  185. package/dist/esm/config/resolve.js +2 -2
  186. package/dist/esm/config/resolve.js.map +1 -1
  187. package/dist/esm/config/signals.d.ts +4 -0
  188. package/dist/esm/config/signals.js +14 -0
  189. package/dist/esm/config/signals.js.map +1 -0
  190. package/dist/esm/config/types.d.ts +6 -4
  191. package/dist/esm/config/types.js +1 -1
  192. package/dist/esm/config/types.js.map +1 -1
  193. package/dist/esm/config/validate.js +58 -11
  194. package/dist/esm/config/validate.js.map +1 -1
  195. package/dist/esm/db/open.d.ts +1 -1
  196. package/dist/esm/db/open.js +7 -2
  197. package/dist/esm/db/open.js.map +1 -1
  198. package/dist/esm/db/reconcile.d.ts +1 -0
  199. package/dist/esm/db/reconcile.js +10 -0
  200. package/dist/esm/db/reconcile.js.map +1 -1
  201. package/dist/esm/embed/cohere.d.ts +2 -0
  202. package/dist/esm/embed/cohere.js +46 -0
  203. package/dist/esm/embed/cohere.js.map +1 -0
  204. package/dist/esm/embed/http.d.ts +2 -0
  205. package/dist/esm/embed/http.js +33 -0
  206. package/dist/esm/embed/http.js.map +1 -0
  207. package/dist/esm/embed/identity.d.ts +13 -0
  208. package/dist/esm/embed/identity.js +92 -0
  209. package/dist/esm/embed/identity.js.map +1 -0
  210. package/dist/esm/embed/langfit.d.ts +6 -0
  211. package/dist/esm/embed/langfit.js +44 -0
  212. package/dist/esm/embed/langfit.js.map +1 -0
  213. package/dist/esm/embed/languages.d.ts +3 -0
  214. package/dist/esm/embed/languages.js +80 -0
  215. package/dist/esm/embed/languages.js.map +1 -0
  216. package/dist/esm/embed/openai.d.ts +2 -0
  217. package/dist/esm/embed/openai.js +49 -0
  218. package/dist/esm/embed/openai.js.map +1 -0
  219. package/dist/esm/embed/query.d.ts +21 -0
  220. package/dist/esm/embed/query.js +181 -0
  221. package/dist/esm/embed/query.js.map +1 -0
  222. package/dist/esm/embed/registry.d.ts +3 -0
  223. package/dist/esm/embed/registry.js +45 -0
  224. package/dist/esm/embed/registry.js.map +1 -0
  225. package/dist/esm/embed/static.d.ts +2 -0
  226. package/dist/esm/embed/static.js +72 -0
  227. package/dist/esm/embed/static.js.map +1 -0
  228. package/dist/esm/embed/store.d.ts +8 -0
  229. package/dist/esm/embed/store.js +123 -0
  230. package/dist/esm/embed/store.js.map +1 -0
  231. package/dist/esm/embed/types.d.ts +8 -0
  232. package/dist/esm/embed/types.js +3 -0
  233. package/dist/esm/embed/types.js.map +1 -0
  234. package/dist/esm/errors.d.ts +1 -1
  235. package/dist/esm/errors.js.map +1 -1
  236. package/dist/esm/features/embed.d.ts +4 -27
  237. package/dist/esm/features/embed.js +0 -346
  238. package/dist/esm/features/embed.js.map +1 -1
  239. package/dist/esm/fences.js.map +1 -1
  240. package/dist/esm/index.d.ts +1 -1
  241. package/dist/esm/index.js.map +1 -1
  242. package/dist/esm/output.d.ts +2 -2
  243. package/dist/esm/output.js +6 -2
  244. package/dist/esm/output.js.map +1 -1
  245. package/dist/esm/scan.js +7 -4
  246. package/dist/esm/scan.js.map +1 -1
  247. package/dist/esm/segment.js +49 -19
  248. package/dist/esm/segment.js.map +1 -1
  249. package/package.json +9 -1
  250. package/schema.json +14 -7
  251. package/skills/sense/SKILL.md +21 -5
  252. package/skills/sense-setup/EXAMPLES.md +6 -6
  253. package/skills/sense-setup/SKILL.md +6 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/query.ts"],"sourcesContent":["import { join } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport type { Config, ResolvedConfig } from '../config/index.ts';\nimport { SenseError } from '../errors.ts';\nimport type { Chunk } from '../features/embed.ts';\nimport { embed } from '../features/embed.ts';\nimport { progress } from '../progress.ts';\nimport { parseFile } from '../scan.ts';\nimport { checkLanguageFit } from './langfit.ts';\nimport { getProvider } from './registry.ts';\n\n// Storage lever fixed by the bake-off (BENCHMARKING.md): int8 at 256 dims is\n// quality-free vs f32-512 when fused. Queries stay f32 at the same dims.\nconst STORE_DIMS = 256;\n// Seed chunks that participate in a `related` scan; see similarNotes for the measurement.\nconst TARGET_CHUNK_CAP = 16;\n\n// Slice + re-normalize (Matryoshka); optionally round through int8 storage. Exported for\n// benchmark/lib/embed.mjs, which scores the same lever math offline.\nexport function toStore(full: Float32Array, dims: number, int8: boolean): { v: Float32Array; scale: number } {\n const v = new Float32Array(dims);\n let norm = 0;\n for (let d = 0; d < dims; d++) norm += full[d] * full[d];\n norm = Math.sqrt(norm) + 1e-32;\n for (let d = 0; d < dims; d++) v[d] = full[d] / norm;\n if (!int8) return { v, scale: 1 };\n let max = 0;\n for (let d = 0; d < dims; d++) max = Math.max(max, Math.abs(v[d]));\n return { v, scale: max / 127 || 1 };\n}\n\n// Embed rows whose vector is NULL, re-deriving chunk text from the files through the\n// same parse + chunker that stored the rows.\nexport async function embedPending(db: DatabaseSync, cfg: Config, baseDir: string): Promise<void> {\n const provider = await getProvider(cfg); // throws EMBED_DISABLED before touching the table\n const dirty = db.prepare('SELECT \"path\", chunk FROM embeddings WHERE vector IS NULL ORDER BY \"path\", chunk').all() as Array<{ path: string; chunk: number }>;\n if (dirty.length === 0) return;\n const storeDims = Math.min(STORE_DIMS, provider.dims);\n\n const byPath = new Map<string, number[]>();\n for (const row of dirty) {\n const list = byPath.get(row.path) ?? [];\n list.push(row.chunk);\n byPath.set(row.path, list);\n }\n\n const jobs: Array<{ path: string; chunk: number; text: string }> = [];\n for (const [path, chunkIdxs] of byPath) {\n let chunks: Chunk[];\n try {\n // presets/embed are irrelevant here -- re-deriving chunk text for a doc that already\n // has embeddings rows means the tree had an embedding model at reconcile time.\n chunks = parseFile({ relPath: path, absPath: join(baseDir, path), mtimeMs: 0, ctimeMs: 0, size: 0, presets: [], embed: true }, [embed]).doc.extracted.embed as Chunk[];\n } catch {\n continue; // vanished since reconcile; the next reconcile removes its rows\n }\n for (const idx of chunkIdxs) if (chunks[idx]) jobs.push({ path, chunk: idx, text: chunks[idx].text });\n }\n\n // Over the exact texts about to be embedded, before any of them are: a mismatch fails\n // this run loudly instead of quietly storing vectors from the wrong model.\n await checkLanguageFit(\n db,\n provider,\n jobs.map((j) => j.text)\n );\n\n const update = db.prepare('UPDATE embeddings SET scale = ?, vector = ? WHERE \"path\" = ? AND chunk = ?');\n // The lazy build is the one long silence a first search hits (measured 23s at\n // 26k notes); progress makes it distinguishable from a hang.\n const report = progress('embedding chunks', jobs.length);\n for (let i = 0; i < jobs.length; i += provider.batchCap) {\n const batch = jobs.slice(i, i + provider.batchCap);\n const vectors = await provider.embedDocuments(batch.map((j) => j.text));\n db.exec('BEGIN');\n try {\n batch.forEach((job, j) => {\n const { v, scale } = toStore(vectors[j], storeDims, true);\n const q = new Int8Array(storeDims);\n for (let d = 0; d < storeDims; d++) q[d] = Math.round(v[d] / scale);\n update.run(scale, Buffer.from(q.buffer), job.path, job.chunk);\n });\n db.exec('COMMIT');\n } catch (err) {\n db.exec('ROLLBACK');\n throw err;\n }\n report.tick(Math.min(i + provider.batchCap, jobs.length));\n }\n report.finish();\n}\n\n// Dequantised int8 dot products land a little either side of a true cosine, so an identical\n// pair prints 1.001 and undermines a column whose whole job is being a bounded number.\nfunction asCosine(score: number): number {\n return Math.round(Math.min(1, Math.max(-1, score)) * 1000) / 1000;\n}\n\n// Best chunk per file by cosine, its line range riding along; FTS5 operators are stripped as\n// lexical syntax. Similarity comes back because the fused score cannot express match quality,\n// and nearest-neighbour search always returns a neighbour however far away.\nexport async function semanticCandidates(db: DatabaseSync, cfg: Config, terms: string, fetch: number, allowed?: Set<string>): Promise<Array<{ path: string; lines: string; similarity: number }>> {\n const baseDir = (cfg as Partial<ResolvedConfig>).baseDir;\n if (!baseDir) throw new SenseError('EMBED_MODEL', 'semantic expansion needs a config with baseDir (use loadConfig/open)');\n await embedPending(db, cfg, baseDir);\n\n const provider = await getProvider(cfg);\n const storeDims = Math.min(STORE_DIMS, provider.dims);\n const text = (terms.match(/[\\p{L}\\p{N}]+/gu) ?? []).filter((t) => !['AND', 'OR', 'NOT', 'NEAR'].includes(t)).join(' ');\n const { v: qv } = toStore(await provider.embedQuery(text), storeDims, false);\n\n const rows = db.prepare('SELECT \"path\", start_line, end_line, scale, vector FROM embeddings WHERE vector IS NOT NULL').all() as Array<{\n path: string;\n start_line: number;\n end_line: number;\n scale: number;\n vector: Uint8Array;\n }>;\n\n const best = new Map<string, { score: number; lines: string }>();\n for (const row of rows) {\n if (allowed && !allowed.has(row.path)) continue;\n const q = new Int8Array(row.vector.buffer, row.vector.byteOffset, Math.min(storeDims, row.vector.byteLength));\n let dot = 0;\n for (let d = 0; d < q.length; d++) dot += q[d] * qv[d];\n const score = dot * row.scale;\n const existing = best.get(row.path);\n if (!existing || score > existing.score) best.set(row.path, { score, lines: `L${row.start_line}-${row.end_line}` });\n }\n return [...best.entries()]\n .sort((a, b) => b[1].score - a[1].score)\n .slice(0, fetch)\n .map(([path, b]) => ({ path, lines: b.lines, similarity: asCosine(b.score) }));\n}\n\n// Whether a note has any chunk with a vector. Distinguishes \"nothing is near this note\" from\n// \"this note has no text\", which look the same in an empty result.\nexport function hasEmbedding(db: DatabaseSync, path: string): boolean {\n const row = db.prepare('SELECT 1 AS ok FROM embeddings WHERE \"path\" = ? AND vector IS NOT NULL LIMIT 1').get(path) as { ok: number } | undefined;\n return row !== undefined;\n}\n\n// Note-to-note similarity is the max cosine over (target chunk, other chunk) pairs, one linear\n// scan of stored vectors. Reads only what is stored, so it stays sync.\nexport function similarNotes(db: DatabaseSync, _cfg: Config, path: string, opts: { exclude: Set<string>; allowed?: Set<string>; k: number }): Array<{ path: string; similarity: number }> {\n // Cost is target_chunks x stored_chunks, so a heading-dense seed multiplies a full-corpus\n // scan (12.7s at 201 chunks/note). Sample evenly, so late sections still get a vote.\n const targetRows = db.prepare('SELECT scale, vector FROM embeddings WHERE \"path\" = ? AND vector IS NOT NULL ORDER BY chunk').all(path) as Array<{ scale: number; vector: Uint8Array }>;\n if (targetRows.length === 0) return [];\n const step = Math.max(1, Math.ceil(targetRows.length / TARGET_CHUNK_CAP));\n const target = targetRows.filter((_, i) => i % step === 0).map((row) => ({ v: new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength), scale: row.scale }));\n\n const rows = db.prepare('SELECT \"path\", scale, vector FROM embeddings WHERE vector IS NOT NULL').all() as Array<{ path: string; scale: number; vector: Uint8Array }>;\n const best = new Map<string, number>();\n for (const row of rows) {\n if (row.path === path || opts.exclude.has(row.path) || (opts.allowed && !opts.allowed.has(row.path))) continue;\n const other = new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength);\n for (const t of target) {\n let dot = 0;\n const len = Math.min(t.v.length, other.length);\n for (let d = 0; d < len; d++) dot += t.v[d] * other[d];\n const score = dot * t.scale * row.scale;\n const existing = best.get(row.path);\n if (existing === undefined || score > existing) best.set(row.path, score);\n }\n }\n\n return [...best.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, opts.k)\n .map(([p, score]) => ({ path: p, similarity: asCosine(score) }));\n}\n"],"names":["embedPending","hasEmbedding","semanticCandidates","similarNotes","toStore","STORE_DIMS","TARGET_CHUNK_CAP","full","dims","int8","v","Float32Array","norm","d","Math","sqrt","scale","max","abs","db","cfg","baseDir","provider","dirty","storeDims","byPath","row","list","jobs","path","chunkIdxs","chunks","idx","update","report","i","batch","vectors","slice","batchCap","embedDocuments","map","j","text","exec","forEach","job","q","Int8Array","round","run","Buffer","from","buffer","chunk","err","tick","min","length","getProvider","prepare","all","Map","get","push","set","parseFile","relPath","absPath","join","mtimeMs","ctimeMs","size","presets","embed","doc","extracted","checkLanguageFit","progress","finish","asCosine","score","terms","fetch","allowed","qv","rows","best","dot","existing","SenseError","match","filter","t","includes","embedQuery","has","vector","byteOffset","byteLength","lines","start_line","end_line","entries","sort","a","b","similarity","undefined","_cfg","opts","targetRows","step","ceil","target","_","exclude","other","len","k","p"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Config } from '../config/index.js';
2
+ import type { EmbedProvider } from './types.js';
3
+ export declare function getProvider(cfg: Config): Promise<EmbedProvider>;
@@ -0,0 +1,3 @@
1
+ import type { Config } from '../config/index.js';
2
+ import type { EmbedProvider } from './types.js';
3
+ export declare function getProvider(cfg: Config): Promise<EmbedProvider>;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "getProvider", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return getProvider;
9
+ }
10
+ });
11
+ var _indexts = require("../config/index.js");
12
+ var _errorsts = require("../errors.js");
13
+ var _coherets = require("./cohere.js");
14
+ var _openaits = require("./openai.js");
15
+ var _staticts = require("./static.js");
16
+ function _define_property(obj, key, value) {
17
+ if (key in obj) {
18
+ Object.defineProperty(obj, key, {
19
+ value: value,
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true
23
+ });
24
+ } else obj[key] = value;
25
+ return obj;
26
+ }
27
+ function _object_spread(target) {
28
+ for(var i = 1; i < arguments.length; i++){
29
+ var source = arguments[i] != null ? arguments[i] : {};
30
+ var ownKeys = Object.keys(source);
31
+ if (typeof Object.getOwnPropertySymbols === "function") {
32
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
33
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
34
+ }));
35
+ }
36
+ ownKeys.forEach(function(key) {
37
+ _define_property(target, key, source[key]);
38
+ });
39
+ }
40
+ return target;
41
+ }
42
+ function ownKeys(object, enumerableOnly) {
43
+ var keys = Object.keys(object);
44
+ if (Object.getOwnPropertySymbols) {
45
+ var symbols = Object.getOwnPropertySymbols(object);
46
+ if (enumerableOnly) {
47
+ symbols = symbols.filter(function(sym) {
48
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
49
+ });
50
+ }
51
+ keys.push.apply(keys, symbols);
52
+ }
53
+ return keys;
54
+ }
55
+ function _object_spread_props(target, source) {
56
+ source = source != null ? source : {};
57
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
58
+ else {
59
+ ownKeys(Object(source)).forEach(function(key) {
60
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
61
+ });
62
+ }
63
+ return target;
64
+ }
65
+ // One factory per wire protocol: adding a protocol is a new file plus an entry here, not
66
+ // an edit to a dispatch ternary.
67
+ var REGISTRY = {
68
+ static: function _static(model) {
69
+ return (0, _staticts.staticProvider)(model);
70
+ },
71
+ openai: function openai(model, url, key) {
72
+ return (0, _openaits.openaiProvider)(model, url, key);
73
+ },
74
+ cohere: function cohere(model, url, key) {
75
+ return (0, _coherets.cohereProvider)(model, url, key);
76
+ }
77
+ };
78
+ var providers = new Map();
79
+ function getProvider(cfg) {
80
+ var _e_url, _e_key, _e_languages;
81
+ var e = (0, _indexts.embedConfig)(cfg);
82
+ if (!e) throw new _errorsts.SenseError('EMBED_DISABLED', 'this tree has no embedding model: add an "embed" block naming one to sense.config.json; a Hugging Face id fetches automatically at first use, or run `sense download` to prefetch it');
83
+ var factory = REGISTRY[e.provider];
84
+ if (!factory) throw new _errorsts.SenseError('EMBED_MODEL', 'embed.provider "'.concat(e.provider, '" has no provider implementation in this build'));
85
+ // Every input that shapes the provider is in the key: two trees sharing an endpoint and
86
+ // model but declaring different languages or reading different key env vars are two
87
+ // providers, not one, however long a process lives.
88
+ var sig = JSON.stringify([
89
+ e.provider,
90
+ e.model,
91
+ (_e_url = e.url) !== null && _e_url !== void 0 ? _e_url : '',
92
+ (_e_key = e.key) !== null && _e_key !== void 0 ? _e_key : '',
93
+ (_e_languages = e.languages) !== null && _e_languages !== void 0 ? _e_languages : []
94
+ ]);
95
+ var p = providers.get(sig);
96
+ if (!p) {
97
+ p = factory(e.model, e.url, e.key);
98
+ // Owner-declared languages override a provider's own: the config is the one home for
99
+ // what no model card can state (http models have no fetchable card here).
100
+ if (e.languages) p = p.then(function(prov) {
101
+ return _object_spread_props(_object_spread({}, prov), {
102
+ languages: e.languages
103
+ });
104
+ });
105
+ providers.set(sig, p);
106
+ // A rejected construction is evicted, so a transient failure retries instead of
107
+ // poisoning this config for the process lifetime.
108
+ p.catch(function() {
109
+ return providers.delete(sig);
110
+ });
111
+ }
112
+ return p;
113
+ }
114
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/registry.ts"],"sourcesContent":["import type { Config } from '../config/index.ts';\nimport { embedConfig } from '../config/index.ts';\nimport { SenseError } from '../errors.ts';\nimport { cohereProvider } from './cohere.ts';\nimport { openaiProvider } from './openai.ts';\nimport { staticProvider } from './static.ts';\nimport type { EmbedProvider } from './types.ts';\n\ntype ProviderFactory = (model: string, url: string | undefined, key: string | undefined) => Promise<EmbedProvider>;\n\n// One factory per wire protocol: adding a protocol is a new file plus an entry here, not\n// an edit to a dispatch ternary.\nconst REGISTRY: Record<string, ProviderFactory> = {\n static: (model) => staticProvider(model),\n openai: (model, url, key) => openaiProvider(model, url, key),\n cohere: (model, url, key) => cohereProvider(model, url, key),\n};\n\nconst providers = new Map<string, Promise<EmbedProvider>>();\n\nexport function getProvider(cfg: Config): Promise<EmbedProvider> {\n const e = embedConfig(cfg);\n if (!e) throw new SenseError('EMBED_DISABLED', 'this tree has no embedding model: add an \"embed\" block naming one to sense.config.json; a Hugging Face id fetches automatically at first use, or run `sense download` to prefetch it');\n const factory = REGISTRY[e.provider];\n if (!factory) throw new SenseError('EMBED_MODEL', `embed.provider \"${e.provider}\" has no provider implementation in this build`);\n // Every input that shapes the provider is in the key: two trees sharing an endpoint and\n // model but declaring different languages or reading different key env vars are two\n // providers, not one, however long a process lives.\n const sig = JSON.stringify([e.provider, e.model, e.url ?? '', e.key ?? '', e.languages ?? []]);\n let p = providers.get(sig);\n if (!p) {\n p = factory(e.model, e.url, e.key);\n // Owner-declared languages override a provider's own: the config is the one home for\n // what no model card can state (http models have no fetchable card here).\n if (e.languages) p = p.then((prov) => ({ ...prov, languages: e.languages }));\n providers.set(sig, p);\n // A rejected construction is evicted, so a transient failure retries instead of\n // poisoning this config for the process lifetime.\n p.catch(() => providers.delete(sig));\n }\n return p;\n}\n"],"names":["getProvider","REGISTRY","static","model","staticProvider","openai","url","key","openaiProvider","cohere","cohereProvider","providers","Map","cfg","e","embedConfig","SenseError","factory","provider","sig","JSON","stringify","languages","p","get","then","prov","set","catch","delete"],"mappings":";;;;+BAoBgBA;;;eAAAA;;;uBAnBY;wBACD;wBACI;wBACA;wBACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAK/B,yFAAyF;AACzF,iCAAiC;AACjC,IAAMC,WAA4C;IAChDC,QAAQ,SAARA,QAASC;eAAUC,IAAAA,wBAAc,EAACD;;IAClCE,QAAQ,SAARA,OAASF,OAAOG,KAAKC;eAAQC,IAAAA,wBAAc,EAACL,OAAOG,KAAKC;;IACxDE,QAAQ,SAARA,OAASN,OAAOG,KAAKC;eAAQG,IAAAA,wBAAc,EAACP,OAAOG,KAAKC;;AAC1D;AAEA,IAAMI,YAAY,IAAIC;AAEf,SAASZ,YAAYa,GAAW;QAQYC,QAAaA,QAAaA;IAP3E,IAAMA,IAAIC,IAAAA,oBAAW,EAACF;IACtB,IAAI,CAACC,GAAG,MAAM,IAAIE,oBAAU,CAAC,kBAAkB;IAC/C,IAAMC,UAAUhB,QAAQ,CAACa,EAAEI,QAAQ,CAAC;IACpC,IAAI,CAACD,SAAS,MAAM,IAAID,oBAAU,CAAC,eAAe,AAAC,mBAA6B,OAAXF,EAAEI,QAAQ,EAAC;IAChF,wFAAwF;IACxF,oFAAoF;IACpF,oDAAoD;IACpD,IAAMC,MAAMC,KAAKC,SAAS,CAAC;QAACP,EAAEI,QAAQ;QAAEJ,EAAEX,KAAK;SAAEW,SAAAA,EAAER,GAAG,cAALQ,oBAAAA,SAAS;SAAIA,SAAAA,EAAEP,GAAG,cAALO,oBAAAA,SAAS;SAAIA,eAAAA,EAAEQ,SAAS,cAAXR,0BAAAA,eAAe,EAAE;KAAC;IAC7F,IAAIS,IAAIZ,UAAUa,GAAG,CAACL;IACtB,IAAI,CAACI,GAAG;QACNA,IAAIN,QAAQH,EAAEX,KAAK,EAAEW,EAAER,GAAG,EAAEQ,EAAEP,GAAG;QACjC,qFAAqF;QACrF,0EAA0E;QAC1E,IAAIO,EAAEQ,SAAS,EAAEC,IAAIA,EAAEE,IAAI,CAAC,SAACC;mBAAU,wCAAKA;gBAAMJ,WAAWR,EAAEQ,SAAS;;;QACxEX,UAAUgB,GAAG,CAACR,KAAKI;QACnB,gFAAgF;QAChF,kDAAkD;QAClDA,EAAEK,KAAK,CAAC;mBAAMjB,UAAUkB,MAAM,CAACV;;IACjC;IACA,OAAOI;AACT"}
@@ -0,0 +1,2 @@
1
+ import type { EmbedProvider } from './types.js';
2
+ export declare function staticProvider(model: string): Promise<EmbedProvider>;
@@ -0,0 +1,2 @@
1
+ import type { EmbedProvider } from './types.js';
2
+ export declare function staticProvider(model: string): Promise<EmbedProvider>;
@@ -0,0 +1,367 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "staticProvider", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return staticProvider;
9
+ }
10
+ });
11
+ var _nodefs = require("node:fs");
12
+ var _nodepath = require("node:path");
13
+ var _errorsts = require("../errors.js");
14
+ var _storets = require("./store.js");
15
+ function _array_like_to_array(arr, len) {
16
+ if (len == null || len > arr.length) len = arr.length;
17
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
18
+ return arr2;
19
+ }
20
+ function _array_with_holes(arr) {
21
+ if (Array.isArray(arr)) return arr;
22
+ }
23
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
24
+ try {
25
+ var info = gen[key](arg);
26
+ var value = info.value;
27
+ } catch (error) {
28
+ reject(error);
29
+ return;
30
+ }
31
+ if (info.done) resolve(value);
32
+ else Promise.resolve(value).then(_next, _throw);
33
+ }
34
+ function _async_to_generator(fn) {
35
+ return function() {
36
+ var self = this, args = arguments;
37
+ return new Promise(function(resolve, reject) {
38
+ var gen = fn.apply(self, args);
39
+ function _next(value) {
40
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
41
+ }
42
+ function _throw(err) {
43
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
44
+ }
45
+ _next(undefined);
46
+ });
47
+ };
48
+ }
49
+ function _getRequireWildcardCache(nodeInterop) {
50
+ if (typeof WeakMap !== "function") return null;
51
+ var cacheBabelInterop = new WeakMap();
52
+ var cacheNodeInterop = new WeakMap();
53
+ return (_getRequireWildcardCache = function(nodeInterop) {
54
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
55
+ })(nodeInterop);
56
+ }
57
+ function _interop_require_wildcard(obj, nodeInterop) {
58
+ if (!nodeInterop && obj && obj.__esModule) return obj;
59
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") return {
60
+ default: obj
61
+ };
62
+ var cache = _getRequireWildcardCache(nodeInterop);
63
+ if (cache && cache.has(obj)) return cache.get(obj);
64
+ var newObj = {
65
+ __proto__: null
66
+ };
67
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
68
+ for(var key in obj){
69
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
70
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
71
+ if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);
72
+ else newObj[key] = obj[key];
73
+ }
74
+ }
75
+ newObj.default = obj;
76
+ if (cache) cache.set(obj, newObj);
77
+ return newObj;
78
+ }
79
+ function _iterable_to_array_limit(arr, i) {
80
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
81
+ if (_i == null) return;
82
+ var _arr = [];
83
+ var _n = true;
84
+ var _d = false;
85
+ var _s, _e;
86
+ try {
87
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
88
+ _arr.push(_s.value);
89
+ if (i && _arr.length === i) break;
90
+ }
91
+ } catch (err) {
92
+ _d = true;
93
+ _e = err;
94
+ } finally{
95
+ try {
96
+ if (!_n && _i["return"] != null) _i["return"]();
97
+ } finally{
98
+ if (_d) throw _e;
99
+ }
100
+ }
101
+ return _arr;
102
+ }
103
+ function _non_iterable_rest() {
104
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
105
+ }
106
+ function _sliced_to_array(arr, i) {
107
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
108
+ }
109
+ function _ts_generator(thisArg, body) {
110
+ var f, y, t, _ = {
111
+ label: 0,
112
+ sent: function() {
113
+ if (t[0] & 1) throw t[1];
114
+ return t[1];
115
+ },
116
+ trys: [],
117
+ ops: []
118
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
119
+ return d(g, "next", {
120
+ value: verb(0)
121
+ }), d(g, "throw", {
122
+ value: verb(1)
123
+ }), d(g, "return", {
124
+ value: verb(2)
125
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
126
+ value: function() {
127
+ return this;
128
+ }
129
+ }), g;
130
+ function verb(n) {
131
+ return function(v) {
132
+ return step([
133
+ n,
134
+ v
135
+ ]);
136
+ };
137
+ }
138
+ function step(op) {
139
+ if (f) throw new TypeError("Generator is already executing.");
140
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
141
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
142
+ if (y = 0, t) op = [
143
+ op[0] & 2,
144
+ t.value
145
+ ];
146
+ switch(op[0]){
147
+ case 0:
148
+ case 1:
149
+ t = op;
150
+ break;
151
+ case 4:
152
+ _.label++;
153
+ return {
154
+ value: op[1],
155
+ done: false
156
+ };
157
+ case 5:
158
+ _.label++;
159
+ y = op[1];
160
+ op = [
161
+ 0
162
+ ];
163
+ continue;
164
+ case 7:
165
+ op = _.ops.pop();
166
+ _.trys.pop();
167
+ continue;
168
+ default:
169
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
170
+ _ = 0;
171
+ continue;
172
+ }
173
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
174
+ _.label = op[1];
175
+ break;
176
+ }
177
+ if (op[0] === 6 && _.label < t[1]) {
178
+ _.label = t[1];
179
+ t = op;
180
+ break;
181
+ }
182
+ if (t && _.label < t[2]) {
183
+ _.label = t[2];
184
+ _.ops.push(op);
185
+ break;
186
+ }
187
+ if (t[2]) _.ops.pop();
188
+ _.trys.pop();
189
+ continue;
190
+ }
191
+ op = body.call(thisArg, _);
192
+ } catch (e) {
193
+ op = [
194
+ 6,
195
+ e
196
+ ];
197
+ y = 0;
198
+ } finally{
199
+ f = t = 0;
200
+ }
201
+ if (op[0] & 5) throw op[1];
202
+ return {
203
+ value: op[0] ? op[1] : void 0,
204
+ done: true
205
+ };
206
+ }
207
+ }
208
+ function _unsupported_iterable_to_array(o, minLen) {
209
+ if (!o) return;
210
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
211
+ var n = Object.prototype.toString.call(o).slice(8, -1);
212
+ if (n === "Object" && o.constructor) n = o.constructor.name;
213
+ if (n === "Map" || n === "Set") return Array.from(n);
214
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
215
+ }
216
+ var BATCH_CAP = 64;
217
+ function staticProvider(model) {
218
+ return _async_to_generator(function() {
219
+ var _ref, _tokenizerJson_model, _tokenizerJson_model_vocab, _tokenizerJson_model1, dir, languages, cached, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, file, raw, headerLen, header, entry, spec, dims, dataStart, matrix, tokenizerJson, Tokenizer, tok, unkId;
220
+ function one(text) {
221
+ // The tokenizer yields undefined (not the unk id) for tokens outside the vocab; an
222
+ // undefined id would index the matrix at NaN and poison the whole mean-pool -- and the
223
+ // int8 conversion then stores the NaN vector as all zeros, silently. Keep integers only.
224
+ var ids = tok.encode(text, {
225
+ add_special_tokens: false
226
+ }).ids.filter(function(id) {
227
+ return Number.isInteger(id) && id !== unkId;
228
+ });
229
+ var v = new Float32Array(dims);
230
+ if (ids.length === 0) return v;
231
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
232
+ try {
233
+ for(var _iterator = ids[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
234
+ var id = _step.value;
235
+ var off = id * dims;
236
+ for(var d = 0; d < dims; d++)v[d] += matrix[off + d];
237
+ }
238
+ } catch (err) {
239
+ _didIteratorError = true;
240
+ _iteratorError = err;
241
+ } finally{
242
+ try {
243
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
244
+ _iterator.return();
245
+ }
246
+ } finally{
247
+ if (_didIteratorError) {
248
+ throw _iteratorError;
249
+ }
250
+ }
251
+ }
252
+ var norm = 0;
253
+ for(var d1 = 0; d1 < dims; d1++){
254
+ v[d1] /= ids.length;
255
+ norm += v[d1] * v[d1];
256
+ }
257
+ norm = Math.sqrt(norm) + 1e-32;
258
+ for(var d2 = 0; d2 < dims; d2++)v[d2] /= norm;
259
+ return v;
260
+ }
261
+ return _ts_generator(this, function(_state) {
262
+ switch(_state.label){
263
+ case 0:
264
+ if (!(0, _storets.isDownloadable)(model)) return [
265
+ 3,
266
+ 2
267
+ ];
268
+ return [
269
+ 4,
270
+ (0, _storets.downloadModel)(model, function(file, into) {
271
+ return console.error("sense: fetching ".concat(model, "/").concat(file, " into ").concat(into));
272
+ })
273
+ ];
274
+ case 1:
275
+ // Naming a HF id is consent: fetch whatever is missing now, announcing it on stderr.
276
+ dir = _state.sent();
277
+ // Cached beside the repo; a local model directory has no card to read, so it has none.
278
+ cached = (0, _storets.readLanguages)(model);
279
+ languages = cached && cached.length > 0 ? cached : undefined;
280
+ return [
281
+ 3,
282
+ 3
283
+ ];
284
+ case 2:
285
+ dir = (0, _storets.modelDir)(model);
286
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
287
+ try {
288
+ for(_iterator = _storets.MODEL_FILES[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
289
+ file = _step.value;
290
+ if (!(0, _nodefs.existsSync)((0, _nodepath.join)(dir, file))) {
291
+ throw new _errorsts.SenseError('EMBED_MODEL_MISSING', "embed model ".concat(model, " is not available (looked in ").concat(dir, "); expected ").concat(_storets.MODEL_FILENAMES, " in that directory"));
292
+ }
293
+ }
294
+ } catch (err) {
295
+ _didIteratorError = true;
296
+ _iteratorError = err;
297
+ } finally{
298
+ try {
299
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
300
+ _iterator.return();
301
+ }
302
+ } finally{
303
+ if (_didIteratorError) {
304
+ throw _iteratorError;
305
+ }
306
+ }
307
+ }
308
+ _state.label = 3;
309
+ case 3:
310
+ raw = (0, _nodefs.readFileSync)((0, _nodepath.join)(dir, 'model.safetensors'));
311
+ headerLen = Number(raw.readBigUInt64LE(0));
312
+ header = JSON.parse(raw.subarray(8, 8 + headerLen).toString('utf8'));
313
+ entry = Object.entries(header).find(function(param) {
314
+ var _param = _sliced_to_array(param, 1), k = _param[0];
315
+ return k !== '__metadata__';
316
+ });
317
+ if (!entry || entry[1].dtype !== 'F32') throw new _errorsts.SenseError('EMBED_MODEL', "".concat(model, ": expected an F32 safetensors matrix"));
318
+ spec = entry[1];
319
+ dims = spec.shape[1];
320
+ dataStart = raw.byteOffset + 8 + headerLen + spec.data_offsets[0];
321
+ matrix = dataStart % 4 === 0 ? new Float32Array(raw.buffer, dataStart, spec.shape[0] * dims) : new Float32Array(raw.buffer.slice(dataStart, dataStart + spec.shape[0] * dims * 4));
322
+ tokenizerJson = JSON.parse((0, _nodefs.readFileSync)((0, _nodepath.join)(dir, 'tokenizer.json'), 'utf8'));
323
+ return [
324
+ 4,
325
+ Promise.resolve().then(function() {
326
+ return /*#__PURE__*/ _interop_require_wildcard(require("@huggingface/tokenizers"));
327
+ })
328
+ ];
329
+ case 4:
330
+ Tokenizer = _state.sent().Tokenizer;
331
+ tok = new Tokenizer(tokenizerJson, {});
332
+ unkId = (_ref = (_tokenizerJson_model1 = tokenizerJson.model) === null || _tokenizerJson_model1 === void 0 ? void 0 : (_tokenizerJson_model_vocab = _tokenizerJson_model1.vocab) === null || _tokenizerJson_model_vocab === void 0 ? void 0 : _tokenizerJson_model_vocab[(_tokenizerJson_model = tokenizerJson.model) === null || _tokenizerJson_model === void 0 ? void 0 : _tokenizerJson_model.unk_token]) !== null && _ref !== void 0 ? _ref : -1;
333
+ // Symmetric model: document and query embedding are the same call.
334
+ return [
335
+ 2,
336
+ {
337
+ id: "static:".concat(model),
338
+ dims: dims,
339
+ batchCap: BATCH_CAP,
340
+ languages: languages,
341
+ embedDocuments: function embedDocuments(texts) {
342
+ return _async_to_generator(function() {
343
+ return _ts_generator(this, function(_state) {
344
+ return [
345
+ 2,
346
+ texts.map(one)
347
+ ];
348
+ });
349
+ })();
350
+ },
351
+ embedQuery: function embedQuery(text) {
352
+ return _async_to_generator(function() {
353
+ return _ts_generator(this, function(_state) {
354
+ return [
355
+ 2,
356
+ one(text)
357
+ ];
358
+ });
359
+ })();
360
+ }
361
+ }
362
+ ];
363
+ }
364
+ });
365
+ })();
366
+ }
367
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/static.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { SenseError } from '../errors.ts';\nimport { downloadModel, isDownloadable, MODEL_FILENAMES, MODEL_FILES, modelDir, readLanguages } from './store.ts';\nimport type { EmbedProvider } from './types.ts';\n\nconst BATCH_CAP = 64;\n\n// Model2Vec safetensors + pure-JS tokenizer. Encode convention from model2vec/model.py: no\n// special tokens, drop unk ids, mean-pool, L2-normalize.\nexport async function staticProvider(model: string): Promise<EmbedProvider> {\n let dir: string;\n let languages: string[] | undefined;\n if (isDownloadable(model)) {\n // Naming a HF id is consent: fetch whatever is missing now, announcing it on stderr.\n dir = await downloadModel(model, (file, into) => console.error(`sense: fetching ${model}/${file} into ${into}`));\n // Cached beside the repo; a local model directory has no card to read, so it has none.\n const cached = readLanguages(model);\n languages = cached && cached.length > 0 ? cached : undefined;\n } else {\n dir = modelDir(model);\n for (const file of MODEL_FILES) {\n if (!existsSync(join(dir, file))) {\n throw new SenseError('EMBED_MODEL_MISSING', `embed model ${model} is not available (looked in ${dir}); expected ${MODEL_FILENAMES} in that directory`);\n }\n }\n }\n\n const raw = readFileSync(join(dir, 'model.safetensors'));\n const headerLen = Number(raw.readBigUInt64LE(0));\n const header = JSON.parse(raw.subarray(8, 8 + headerLen).toString('utf8')) as Record<string, { dtype: string; shape: number[]; data_offsets: number[] }>;\n const entry = Object.entries(header).find(([k]) => k !== '__metadata__');\n if (!entry || entry[1].dtype !== 'F32') throw new SenseError('EMBED_MODEL', `${model}: expected an F32 safetensors matrix`);\n const spec = entry[1];\n const dims = spec.shape[1];\n const dataStart = raw.byteOffset + 8 + headerLen + spec.data_offsets[0];\n const matrix = dataStart % 4 === 0 ? new Float32Array(raw.buffer, dataStart, spec.shape[0] * dims) : new Float32Array(raw.buffer.slice(dataStart, dataStart + spec.shape[0] * dims * 4));\n\n const tokenizerJson = JSON.parse(readFileSync(join(dir, 'tokenizer.json'), 'utf8'));\n // Lazy import: the tokenizer loads only on the semantic path, never at CLI startup.\n const { Tokenizer } = await import('@huggingface/tokenizers');\n const tok = new Tokenizer(tokenizerJson, {});\n const unkId = tokenizerJson.model?.vocab?.[tokenizerJson.model?.unk_token] ?? -1;\n\n function one(text: string): Float32Array {\n // The tokenizer yields undefined (not the unk id) for tokens outside the vocab; an\n // undefined id would index the matrix at NaN and poison the whole mean-pool -- and the\n // int8 conversion then stores the NaN vector as all zeros, silently. Keep integers only.\n const ids = (tok.encode(text, { add_special_tokens: false }).ids as number[]).filter((id) => Number.isInteger(id) && id !== unkId);\n const v = new Float32Array(dims);\n if (ids.length === 0) return v;\n for (const id of ids) {\n const off = id * dims;\n for (let d = 0; d < dims; d++) v[d] += matrix[off + d];\n }\n let norm = 0;\n for (let d = 0; d < dims; d++) {\n v[d] /= ids.length;\n norm += v[d] * v[d];\n }\n norm = Math.sqrt(norm) + 1e-32;\n for (let d = 0; d < dims; d++) v[d] /= norm;\n return v;\n }\n\n // Symmetric model: document and query embedding are the same call.\n return { id: `static:${model}`, dims, batchCap: BATCH_CAP, languages, embedDocuments: async (texts) => texts.map(one), embedQuery: async (text) => one(text) };\n}\n"],"names":["staticProvider","BATCH_CAP","model","tokenizerJson","dir","languages","cached","file","raw","headerLen","header","entry","spec","dims","dataStart","matrix","Tokenizer","tok","unkId","one","text","ids","encode","add_special_tokens","filter","id","Number","isInteger","v","Float32Array","length","off","d","norm","Math","sqrt","isDownloadable","downloadModel","into","console","error","readLanguages","undefined","modelDir","MODEL_FILES","existsSync","join","SenseError","MODEL_FILENAMES","readFileSync","readBigUInt64LE","JSON","parse","subarray","toString","Object","entries","find","k","dtype","shape","byteOffset","data_offsets","buffer","slice","vocab","unk_token","batchCap","embedDocuments","texts","map","embedQuery"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Config } from '../config/index.js';
2
+ import { embedConfig } from '../config/index.js';
3
+ export { hasModelFiles, isDownloadable, MODEL_FILENAMES, MODEL_FILES, modelDir, readLanguages, refsMainPath, snapshotDir, writeLanguages, writeRef } from './identity.js';
4
+ export declare function modelPresent(cfg: Config): boolean;
5
+ type ResolvedEmbedConfig = NonNullable<ReturnType<typeof embedConfig>>;
6
+ export declare function localModelMissing(e: ResolvedEmbedConfig | null): e is ResolvedEmbedConfig;
7
+ export declare function downloadModelRevision(model: string, sha: string, onFile?: (file: string, dir: string) => void): Promise<string>;
8
+ export declare function downloadModel(model: string, onFile?: (file: string, dir: string) => void): Promise<string>;
@@ -0,0 +1,8 @@
1
+ import type { Config } from '../config/index.js';
2
+ import { embedConfig } from '../config/index.js';
3
+ export { hasModelFiles, isDownloadable, MODEL_FILENAMES, MODEL_FILES, modelDir, readLanguages, refsMainPath, snapshotDir, writeLanguages, writeRef } from './identity.js';
4
+ export declare function modelPresent(cfg: Config): boolean;
5
+ type ResolvedEmbedConfig = NonNullable<ReturnType<typeof embedConfig>>;
6
+ export declare function localModelMissing(e: ResolvedEmbedConfig | null): e is ResolvedEmbedConfig;
7
+ export declare function downloadModelRevision(model: string, sha: string, onFile?: (file: string, dir: string) => void): Promise<string>;
8
+ export declare function downloadModel(model: string, onFile?: (file: string, dir: string) => void): Promise<string>;