sensemaking 0.23.1 → 0.24.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.
Files changed (214) hide show
  1. package/README.md +15 -10
  2. package/dist/cjs/cli/index.d.cts +1 -1
  3. package/dist/cjs/cli/index.d.ts +1 -1
  4. package/dist/cjs/cli/index.js +1 -1
  5. package/dist/cjs/cli/index.js.map +1 -1
  6. package/dist/cjs/cli/named.js +6 -2
  7. package/dist/cjs/cli/named.js.map +1 -1
  8. package/dist/cjs/cli/search.js +6 -2
  9. package/dist/cjs/cli/search.js.map +1 -1
  10. package/dist/cjs/cli/shared.d.cts +2 -0
  11. package/dist/cjs/cli/shared.d.ts +2 -0
  12. package/dist/cjs/cli/shared.js +24 -0
  13. package/dist/cjs/cli/shared.js.map +1 -1
  14. package/dist/cjs/cli/status.js +6 -3
  15. package/dist/cjs/cli/status.js.map +1 -1
  16. package/dist/cjs/cli/watch.js +1 -1
  17. package/dist/cjs/cli/watch.js.map +1 -1
  18. package/dist/cjs/commands/map.js +2 -2
  19. package/dist/cjs/commands/map.js.map +1 -1
  20. package/dist/cjs/commands/related.js +2 -2
  21. package/dist/cjs/commands/related.js.map +1 -1
  22. package/dist/cjs/commands/search.d.cts +10 -0
  23. package/dist/cjs/commands/search.d.ts +10 -0
  24. package/dist/cjs/commands/search.js +489 -180
  25. package/dist/cjs/commands/search.js.map +1 -1
  26. package/dist/cjs/config/access.js +7 -1
  27. package/dist/cjs/config/access.js.map +1 -1
  28. package/dist/cjs/config/load.js +6 -1
  29. package/dist/cjs/config/load.js.map +1 -1
  30. package/dist/cjs/config/types.d.cts +3 -0
  31. package/dist/cjs/config/types.d.ts +3 -0
  32. package/dist/cjs/config/types.js.map +1 -1
  33. package/dist/cjs/config/validate.js +4 -0
  34. package/dist/cjs/config/validate.js.map +1 -1
  35. package/dist/cjs/embed/query.js +4 -4
  36. package/dist/cjs/embed/query.js.map +1 -1
  37. package/dist/cjs/output/output.js +45 -8
  38. package/dist/cjs/output/output.js.map +1 -1
  39. package/dist/cjs/output/search-error.d.cts +1 -0
  40. package/dist/cjs/output/search-error.d.ts +1 -0
  41. package/dist/cjs/output/search-error.js +28 -4
  42. package/dist/cjs/output/search-error.js.map +1 -1
  43. package/dist/cjs/scan/frontmatter.js +1 -1
  44. package/dist/cjs/scan/frontmatter.js.map +1 -1
  45. package/dist/cjs/scan/index.js +1 -0
  46. package/dist/cjs/scan/index.js.map +1 -1
  47. package/dist/cjs/store/cache.js +2 -1
  48. package/dist/cjs/store/cache.js.map +1 -1
  49. package/dist/cjs/store/duckdb/fieldStats.js +4 -7
  50. package/dist/cjs/store/duckdb/fieldStats.js.map +1 -1
  51. package/dist/cjs/store/duckdb/lexical.d.cts +2 -2
  52. package/dist/cjs/store/duckdb/lexical.d.ts +2 -2
  53. package/dist/cjs/store/duckdb/lexical.js +215 -64
  54. package/dist/cjs/store/duckdb/lexical.js.map +1 -1
  55. package/dist/cjs/store/duckdb/reconcile.js +7 -2
  56. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  57. package/dist/cjs/store/duckdb/store.js +1 -3
  58. package/dist/cjs/store/duckdb/store.js.map +1 -1
  59. package/dist/cjs/store/duckdb/vectors.js +13 -8
  60. package/dist/cjs/store/duckdb/vectors.js.map +1 -1
  61. package/dist/cjs/store/native.js +5 -4
  62. package/dist/cjs/store/native.js.map +1 -1
  63. package/dist/cjs/store/open.js +20 -6
  64. package/dist/cjs/store/open.js.map +1 -1
  65. package/dist/cjs/store/shared.js.map +1 -1
  66. package/dist/cjs/store/sqlite/lexical.js +1 -4
  67. package/dist/cjs/store/sqlite/lexical.js.map +1 -1
  68. package/dist/cjs/store/sqlite/store.js +1 -4
  69. package/dist/cjs/store/sqlite/store.js.map +1 -1
  70. package/dist/cjs/store/sqlite/vectors.js +78 -24
  71. package/dist/cjs/store/sqlite/vectors.js.map +1 -1
  72. package/dist/cjs/store/turso/connection.js +2 -1
  73. package/dist/cjs/store/turso/connection.js.map +1 -1
  74. package/dist/cjs/store/turso/lexical-text.d.cts +1 -0
  75. package/dist/cjs/store/turso/lexical-text.d.ts +1 -0
  76. package/dist/cjs/store/turso/lexical-text.js +40 -0
  77. package/dist/cjs/store/turso/lexical-text.js.map +1 -0
  78. package/dist/cjs/store/turso/lexical.js +89 -16
  79. package/dist/cjs/store/turso/lexical.js.map +1 -1
  80. package/dist/cjs/store/turso/open.d.cts +1 -1
  81. package/dist/cjs/store/turso/open.d.ts +1 -1
  82. package/dist/cjs/store/turso/open.js +2 -2
  83. package/dist/cjs/store/turso/open.js.map +1 -1
  84. package/dist/cjs/store/turso/reconcile.d.cts +1 -1
  85. package/dist/cjs/store/turso/reconcile.d.ts +1 -1
  86. package/dist/cjs/store/turso/reconcile.js +6 -2
  87. package/dist/cjs/store/turso/reconcile.js.map +1 -1
  88. package/dist/cjs/store/turso/sql-functions.d.cts +1 -0
  89. package/dist/cjs/store/turso/sql-functions.d.ts +1 -0
  90. package/dist/cjs/store/turso/sql-functions.js +174 -0
  91. package/dist/cjs/store/turso/sql-functions.js.map +1 -0
  92. package/dist/cjs/store/turso/store.js +2 -3
  93. package/dist/cjs/store/turso/store.js.map +1 -1
  94. package/dist/cjs/store/turso/vectors.js +50 -14
  95. package/dist/cjs/store/turso/vectors.js.map +1 -1
  96. package/dist/cjs/store/types.d.cts +1 -2
  97. package/dist/cjs/store/types.d.ts +1 -2
  98. package/dist/cjs/store/types.js +1 -4
  99. package/dist/cjs/store/types.js.map +1 -1
  100. package/dist/cjs/store/vectors.d.cts +7 -0
  101. package/dist/cjs/store/vectors.d.ts +7 -0
  102. package/dist/cjs/store/vectors.js +8 -0
  103. package/dist/cjs/store/vectors.js.map +1 -1
  104. package/dist/cjs/text/segment.d.cts +13 -0
  105. package/dist/cjs/text/segment.d.ts +13 -0
  106. package/dist/cjs/text/segment.js +109 -4
  107. package/dist/cjs/text/segment.js.map +1 -1
  108. package/dist/cjs/watch.d.cts +1 -1
  109. package/dist/cjs/watch.d.ts +1 -1
  110. package/dist/cjs/watch.js +5 -4
  111. package/dist/cjs/watch.js.map +1 -1
  112. package/dist/esm/cli/index.d.ts +1 -1
  113. package/dist/esm/cli/index.js +1 -1
  114. package/dist/esm/cli/index.js.map +1 -1
  115. package/dist/esm/cli/named.js +6 -2
  116. package/dist/esm/cli/named.js.map +1 -1
  117. package/dist/esm/cli/search.js +5 -1
  118. package/dist/esm/cli/search.js.map +1 -1
  119. package/dist/esm/cli/shared.d.ts +2 -0
  120. package/dist/esm/cli/shared.js +19 -0
  121. package/dist/esm/cli/shared.js.map +1 -1
  122. package/dist/esm/cli/status.js +6 -3
  123. package/dist/esm/cli/status.js.map +1 -1
  124. package/dist/esm/cli/watch.js +1 -1
  125. package/dist/esm/cli/watch.js.map +1 -1
  126. package/dist/esm/commands/map.js +2 -2
  127. package/dist/esm/commands/map.js.map +1 -1
  128. package/dist/esm/commands/related.js +2 -1
  129. package/dist/esm/commands/related.js.map +1 -1
  130. package/dist/esm/commands/search.d.ts +10 -0
  131. package/dist/esm/commands/search.js +272 -91
  132. package/dist/esm/commands/search.js.map +1 -1
  133. package/dist/esm/config/access.js +7 -0
  134. package/dist/esm/config/access.js.map +1 -1
  135. package/dist/esm/config/load.js +6 -1
  136. package/dist/esm/config/load.js.map +1 -1
  137. package/dist/esm/config/types.d.ts +3 -0
  138. package/dist/esm/config/types.js.map +1 -1
  139. package/dist/esm/config/validate.js +4 -0
  140. package/dist/esm/config/validate.js.map +1 -1
  141. package/dist/esm/embed/query.js +4 -4
  142. package/dist/esm/embed/query.js.map +1 -1
  143. package/dist/esm/output/output.js +27 -4
  144. package/dist/esm/output/output.js.map +1 -1
  145. package/dist/esm/output/search-error.d.ts +1 -0
  146. package/dist/esm/output/search-error.js +17 -1
  147. package/dist/esm/output/search-error.js.map +1 -1
  148. package/dist/esm/scan/frontmatter.js +1 -1
  149. package/dist/esm/scan/frontmatter.js.map +1 -1
  150. package/dist/esm/scan/index.js +1 -0
  151. package/dist/esm/scan/index.js.map +1 -1
  152. package/dist/esm/store/cache.js +2 -1
  153. package/dist/esm/store/cache.js.map +1 -1
  154. package/dist/esm/store/duckdb/fieldStats.js +4 -7
  155. package/dist/esm/store/duckdb/fieldStats.js.map +1 -1
  156. package/dist/esm/store/duckdb/lexical.d.ts +2 -2
  157. package/dist/esm/store/duckdb/lexical.js +94 -40
  158. package/dist/esm/store/duckdb/lexical.js.map +1 -1
  159. package/dist/esm/store/duckdb/reconcile.js +2 -2
  160. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  161. package/dist/esm/store/duckdb/store.js +2 -4
  162. package/dist/esm/store/duckdb/store.js.map +1 -1
  163. package/dist/esm/store/duckdb/vectors.js +26 -13
  164. package/dist/esm/store/duckdb/vectors.js.map +1 -1
  165. package/dist/esm/store/native.js +5 -4
  166. package/dist/esm/store/native.js.map +1 -1
  167. package/dist/esm/store/open.js +21 -4
  168. package/dist/esm/store/open.js.map +1 -1
  169. package/dist/esm/store/shared.js +1 -2
  170. package/dist/esm/store/shared.js.map +1 -1
  171. package/dist/esm/store/sqlite/lexical.js +2 -5
  172. package/dist/esm/store/sqlite/lexical.js.map +1 -1
  173. package/dist/esm/store/sqlite/store.js +1 -4
  174. package/dist/esm/store/sqlite/store.js.map +1 -1
  175. package/dist/esm/store/sqlite/vectors.js +48 -19
  176. package/dist/esm/store/sqlite/vectors.js.map +1 -1
  177. package/dist/esm/store/turso/connection.js +3 -2
  178. package/dist/esm/store/turso/connection.js.map +1 -1
  179. package/dist/esm/store/turso/lexical-text.d.ts +1 -0
  180. package/dist/esm/store/turso/lexical-text.js +12 -0
  181. package/dist/esm/store/turso/lexical-text.js.map +1 -0
  182. package/dist/esm/store/turso/lexical.js +56 -21
  183. package/dist/esm/store/turso/lexical.js.map +1 -1
  184. package/dist/esm/store/turso/open.d.ts +1 -1
  185. package/dist/esm/store/turso/open.js +2 -2
  186. package/dist/esm/store/turso/open.js.map +1 -1
  187. package/dist/esm/store/turso/reconcile.d.ts +1 -1
  188. package/dist/esm/store/turso/reconcile.js +6 -2
  189. package/dist/esm/store/turso/reconcile.js.map +1 -1
  190. package/dist/esm/store/turso/sql-functions.d.ts +1 -0
  191. package/dist/esm/store/turso/sql-functions.js +179 -0
  192. package/dist/esm/store/turso/sql-functions.js.map +1 -0
  193. package/dist/esm/store/turso/store.js +3 -5
  194. package/dist/esm/store/turso/store.js.map +1 -1
  195. package/dist/esm/store/turso/vectors.js +19 -10
  196. package/dist/esm/store/turso/vectors.js.map +1 -1
  197. package/dist/esm/store/types.d.ts +1 -2
  198. package/dist/esm/store/types.js +6 -8
  199. package/dist/esm/store/types.js.map +1 -1
  200. package/dist/esm/store/vectors.d.ts +7 -0
  201. package/dist/esm/store/vectors.js +8 -2
  202. package/dist/esm/store/vectors.js.map +1 -1
  203. package/dist/esm/text/segment.d.ts +13 -0
  204. package/dist/esm/text/segment.js +70 -0
  205. package/dist/esm/text/segment.js.map +1 -1
  206. package/dist/esm/watch.d.ts +1 -1
  207. package/dist/esm/watch.js +5 -4
  208. package/dist/esm/watch.js.map +1 -1
  209. package/package.json +4 -3
  210. package/schema.json +7 -2
  211. package/skills/sense/EXAMPLES.md +3 -3
  212. package/skills/sense/SKILL.md +6 -6
  213. package/skills/sense-setup/EXAMPLES.md +21 -0
  214. package/skills/sense-setup/SKILL.md +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/map.ts"],"sourcesContent":["import type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.ts';\nimport { featureEnabled, featureStates } from '../config/index.ts';\nimport type { Row } from '../output/output.ts';\nimport type { FieldStat, Store } from '../store/types.ts';\nimport { INTERNAL_COLUMNS, scopedPaths, setupMapScope } from './scope.ts';\nimport type { PresetCoverage } from './status.ts';\nimport { presetCoverage } from './status.ts';\n\nexport interface TreeMap {\n docs: { count: number; bytes: number };\n fields: Row[]; // top 20 by coverage; fieldsTotal carries the real count\n fieldsTotal: number;\n features: { on: FeatureName[]; off: FeatureName[] };\n presets: PresetCoverage[];\n hubs: Row[];\n recent: Row[];\n recentCaveat: string | null;\n}\n\n// A result row is capped at SQLITE_MAX_COLUMN (2000, default); two aggregate expressions per\n// field keeps a chunk's row width safely under that regardless of how many fields the tree has.\nconst MAP_COLUMN_CHUNK = 300;\n\n// \"YYYY-MM-DD HH:MM:SS\" UTC, the exact shape sqlite's datetime(ms / 1000, 'unixepoch') prints;\n// formatted in JS so the query stays dialect-free.\nfunction utcSecond(ms: number): string {\n return new Date(ms).toISOString().slice(0, 19).replace('T', ' ');\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\n return out;\n}\n\n// What is this scope: fixed-size output regardless of tree size. Coverage and features stay\n// global -- they describe the tree, not the current question.\nexport async function mapTree(store: Store, cfg: ResolvedConfig, overrides: SearchOverrides = {}): Promise<TreeMap> {\n return store.transaction(async () => {\n await setupMapScope(store, await scopedPaths(store, cfg, overrides));\n const scopeWhere = 'WHERE \"path\" IN (SELECT \"path\" FROM _map_scope)';\n const scopeAnd = 'AND f.\"path\" IN (SELECT \"path\" FROM _map_scope)';\n\n const docs = (await (await store.prepare(`SELECT COUNT(*) AS count, COALESCE(SUM(\"_size\"), 0) AS bytes FROM frontmatter ${scopeWhere}`)).get()) as { count: number; bytes: number };\n\n const columns = (await store.docs.columns()).filter((name) => !INTERNAL_COLUMNS.has(name));\n // Observed types, not declared: a field can be text in most notes and numeric in a few, so\n // every distinct type observed across the scope is reported, not just the first.\n const allFields: FieldStat[] = [];\n for (const group of chunk(columns, MAP_COLUMN_CHUNK)) allFields.push(...(await store.docs.fieldStats(group, scopeWhere)));\n allFields.sort((a, b) => b.coverage - a.coverage);\n const fields = allFields.slice(0, 20) as unknown as Row[];\n\n const hubs = featureEnabled(cfg, 'rank') ? ((await (await store.prepare(`SELECT f.\"path\" AS path, round(f.\"_rank\" * 100, 2) AS rank, content.title FROM frontmatter f JOIN content ON content.path = f.\"path\" WHERE f.\"_rank\" IS NOT NULL ${scopeAnd} ORDER BY f.\"_rank\" DESC LIMIT 8`)).all()) as Row[]) : [];\n\n const recent = ((await (await store.prepare(`SELECT \"path\", \"_mtime\" AS mtime FROM frontmatter ${scopeWhere} ORDER BY \"_mtime\" DESC LIMIT 5`)).all()) as Array<{ path: string; mtime: number }>).map((r) => ({ path: r.path, modified: utcSecond(r.mtime) }));\n\n // A fresh clone/copy stamps files with checkout time, not edit history; second granularity\n // matches the `recent` table above and is coarse enough to catch that without an exact-ms match.\n const topSecond = (await (await store.prepare(`SELECT COUNT(*) AS n FROM frontmatter ${scopeWhere} GROUP BY CAST(\"_mtime\" / 1000 AS INTEGER) ORDER BY n DESC LIMIT 1`)).get()) as { n: number } | undefined;\n const recentCaveat = topSecond && docs.count > 1 && topSecond.n > docs.count / 2 ? `${topSecond.n} of ${docs.count} files share one modified second, so recency likely reflects a checkout or copy, not edit history` : null;\n\n return { docs, fields, fieldsTotal: allFields.length, features: featureStates(cfg), presets: await presetCoverage(store, cfg), hubs, recent, recentCaveat };\n });\n}\n"],"names":["mapTree","MAP_COLUMN_CHUNK","utcSecond","ms","Date","toISOString","slice","replace","chunk","items","size","out","i","length","push","store","cfg","overrides","transaction","allFields","scopeWhere","scopeAnd","docs","columns","group","fields","hubs","recent","topSecond","recentCaveat","scopedPaths","setupMapScope","prepare","get","filter","name","INTERNAL_COLUMNS","has","fieldStats","sort","a","b","coverage","featureEnabled","all","map","r","path","modified","mtime","count","n","fieldsTotal","features","featureStates","presetCoverage","presets"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/map.ts"],"sourcesContent":["import type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.ts';\nimport { featureEnabled, featureStates } from '../config/index.ts';\nimport type { Row } from '../output/output.ts';\nimport type { FieldStat, Store } from '../store/types.ts';\nimport { INTERNAL_COLUMNS, scopedPaths, setupMapScope } from './scope.ts';\nimport type { PresetCoverage } from './status.ts';\nimport { presetCoverage } from './status.ts';\n\nexport interface TreeMap {\n docs: { count: number; bytes: number };\n fields: Row[]; // top 20 by coverage; fieldsTotal carries the real count\n fieldsTotal: number;\n features: { on: FeatureName[]; off: FeatureName[] };\n presets: PresetCoverage[];\n hubs: Row[];\n recent: Row[];\n recentCaveat: string | null;\n}\n\n// A result row is capped at SQLITE_MAX_COLUMN (2000, default); two aggregate expressions per\n// field keeps a chunk's row width safely under that regardless of how many fields the tree has.\nconst MAP_COLUMN_CHUNK = 300;\n\n// \"YYYY-MM-DD HH:MM:SS\" UTC, the exact shape sqlite's datetime(ms / 1000, 'unixepoch') prints;\n// formatted in JS so the query stays dialect-free.\nfunction utcSecond(ms: number): string {\n return new Date(ms).toISOString().slice(0, 19).replace('T', ' ');\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\n return out;\n}\n\n// What is this scope: fixed-size output regardless of tree size. Coverage and features stay\n// global -- they describe the tree, not the current question.\nexport async function mapTree(store: Store, cfg: ResolvedConfig, overrides: SearchOverrides = {}): Promise<TreeMap> {\n return store.transaction(async () => {\n await setupMapScope(store, await scopedPaths(store, cfg, overrides));\n const scopeWhere = 'WHERE \"path\" IN (SELECT \"path\" FROM _map_scope)';\n const scopeAnd = 'AND f.\"path\" IN (SELECT \"path\" FROM _map_scope)';\n\n const docs = (await (await store.prepare(`SELECT COUNT(*) AS count, COALESCE(SUM(\"_size\"), 0) AS bytes FROM frontmatter ${scopeWhere}`)).get()) as { count: number; bytes: number };\n\n const columns = (await store.docs.columns()).filter((name) => !INTERNAL_COLUMNS.has(name));\n // Observed types, not declared: a field can be text in most notes and numeric in a few, so\n // every distinct type observed across the scope is reported, not just the first.\n const allFields: FieldStat[] = [];\n for (const group of chunk(columns, MAP_COLUMN_CHUNK)) allFields.push(...(await store.docs.fieldStats(group, scopeWhere)));\n allFields.sort((a, b) => b.coverage - a.coverage);\n const fields = allFields.slice(0, 20) as unknown as Row[];\n\n const hubs = featureEnabled(cfg, 'rank')\n ? ((await (await store.prepare(`SELECT f.\"path\" AS path, round(f.\"_rank\" * 100, 2) AS rank, content.title FROM frontmatter f JOIN content ON content.path = f.\"path\" WHERE f.\"_rank\" IS NOT NULL ${scopeAnd} ORDER BY f.\"_rank\" DESC, f.\"path\" ASC LIMIT 8`)).all()) as Row[])\n : [];\n\n const recent = ((await (await store.prepare(`SELECT \"path\", \"_mtime\" AS mtime FROM frontmatter ${scopeWhere} ORDER BY \"_mtime\" DESC, \"path\" ASC LIMIT 5`)).all()) as Array<{ path: string; mtime: number }>).map((r) => ({ path: r.path, modified: utcSecond(r.mtime) }));\n\n // A fresh clone/copy stamps files with checkout time, not edit history; second granularity\n // matches the `recent` table above and is coarse enough to catch that without an exact-ms match.\n const topSecond = (await (await store.prepare(`SELECT COUNT(*) AS n FROM frontmatter ${scopeWhere} GROUP BY CAST(\"_mtime\" / 1000 AS INTEGER) ORDER BY n DESC LIMIT 1`)).get()) as { n: number } | undefined;\n const recentCaveat = topSecond && docs.count > 1 && topSecond.n > docs.count / 2 ? `${topSecond.n} of ${docs.count} files share one modified second, so recency likely reflects a checkout or copy, not edit history` : null;\n\n return { docs, fields, fieldsTotal: allFields.length, features: featureStates(cfg), presets: await presetCoverage(store, cfg), hubs, recent, recentCaveat };\n });\n}\n"],"names":["mapTree","MAP_COLUMN_CHUNK","utcSecond","ms","Date","toISOString","slice","replace","chunk","items","size","out","i","length","push","store","cfg","overrides","transaction","allFields","scopeWhere","scopeAnd","docs","columns","group","fields","hubs","recent","topSecond","recentCaveat","scopedPaths","setupMapScope","prepare","get","filter","name","INTERNAL_COLUMNS","has","fieldStats","sort","a","b","coverage","featureEnabled","all","map","r","path","modified","mtime","count","n","fieldsTotal","features","featureStates","presetCoverage","presets"],"mappings":"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"}
@@ -168,7 +168,7 @@ function _unsupported_iterable_to_array(o, minLen) {
168
168
  }
169
169
  function relatedNotes(store, cfg, pathArg, overrides, k) {
170
170
  return _async_to_generator(function() {
171
- var paths, path, outbound, backlinks, exclude, effective, e, allowed;
171
+ var _cfg_rootDir, paths, path, outbound, backlinks, exclude, effective, e, allowed;
172
172
  return _ts_generator(this, function(_state) {
173
173
  switch(_state.label){
174
174
  case 0:
@@ -242,7 +242,7 @@ function relatedNotes(store, cfg, pathArg, overrides, k) {
242
242
  // having no indexed text until some search has run.
243
243
  return [
244
244
  4,
245
- (0, _queryts.embedPending)(store, cfg, cfg.baseDir)
245
+ (0, _queryts.embedPending)(store, cfg, (_cfg_rootDir = cfg.rootDir) !== null && _cfg_rootDir !== void 0 ? _cfg_rootDir : cfg.baseDir)
246
246
  ];
247
247
  case 8:
248
248
  _state.sent();
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/related.ts"],"sourcesContent":["import type { ResolvedConfig, SearchOverrides } from '../config/index.ts';\nimport { embedConfig, embedEnabled, resolveSearch } from '../config/index.ts';\nimport { embedPending, hasEmbedding, similarNotes } from '../embed/query.ts';\nimport { localModelMissing, MODEL_FILENAMES } from '../embed/store.ts';\nimport { SenseError } from '../errors.ts';\nimport type { Store } from '../store/types.ts';\nimport { resolveNote } from './peek.ts';\nimport { scopedPaths, scopeHasEmbeddings } from './scope.ts';\n\n// Notes most similar by cosine, excluding self and everything already linked either way.\n// Its own command, not a peek section: a full embeddings scan is ~480ms at 26k notes.\nexport async function relatedNotes(store: Store, cfg: ResolvedConfig, pathArg: string, overrides: SearchOverrides, k: number): Promise<Array<{ path: string; similarity: number }>> {\n const paths = ((await (await store.prepare('SELECT \"path\" FROM frontmatter')).all()) as Array<{ path: string }>).map((r) => r.path);\n const path = resolveNote(paths, pathArg);\n\n const outbound = ((await (await store.prepare('SELECT DISTINCT dst FROM links WHERE src = ? AND dst IS NOT NULL AND dst != src')).all(path)) as Array<{ dst: string }>).map((r) => r.dst);\n const backlinks = ((await (await store.prepare('SELECT DISTINCT src FROM links WHERE dst = ? AND src != dst')).all(path)) as Array<{ src: string }>).map((r) => r.src);\n const exclude = new Set([path, ...outbound, ...backlinks]);\n\n // Vectors are the only signal `related` has, so every way of not having them is an error\n // naming the cause; an empty result means one thing, nothing near in meaning.\n const effective = resolveSearch(cfg, overrides);\n if (!embedEnabled(cfg)) {\n throw new SenseError('EMBED_DISABLED', 'related ranks notes by meaning, and 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; `sense download` prefetches it) -- search works without it, on words and links');\n }\n // search gates on the same signal, so a preset's declared signals mean one thing: without\n // this check an overlapping vectors-on preset would answer for a scope that declined them.\n if (effective.signals.vectors === undefined) {\n throw new SenseError('PRESET_NOT_SEMANTIC', `preset \"${effective.presetName}\" has no \"vectors\" signal, so this scope has no vectors and related has no other signal; search it instead (words and links), or add \"vectors\" to that preset's signals`);\n }\n // A downloadable HF id proceeds -- embedPending's getProvider call fetches it lazily on\n // consent. Only a local path with missing files can never fetch itself.\n const e = embedConfig(cfg); // embedEnabled(cfg) above guarantees this is set\n if (localModelMissing(e)) {\n throw new SenseError('EMBED_MODEL_MISSING', `related ranks notes by meaning, so it needs the embedding model, but the local model path \"${e.model}\" is missing ${MODEL_FILENAMES}; point embed.model at a directory containing them (search still works without it, on words and links)`);\n }\n const allowed = await scopedPaths(store, cfg, overrides);\n // Top up pending rows before the seed check, or a fresh index reports every note as\n // having no indexed text until some search has run.\n await embedPending(store, cfg, cfg.baseDir);\n if (!(await hasEmbedding(store, path))) {\n throw new SenseError('NOTE_NOT_EMBEDDED', `${path} has no indexed text to compare -- a note that is frontmatter only, or empty, has nothing to rank by meaning`);\n }\n if (!(await scopeHasEmbeddings(store, cfg, allowed))) return [];\n return similarNotes(store, cfg, path, { exclude, allowed, k });\n}\n"],"names":["relatedNotes","store","cfg","pathArg","overrides","k","paths","path","outbound","backlinks","exclude","effective","e","allowed","prepare","all","map","r","resolveNote","dst","src","Set","resolveSearch","embedEnabled","SenseError","signals","vectors","undefined","presetName","embedConfig","localModelMissing","MODEL_FILENAMES","model","scopedPaths","embedPending","baseDir","hasEmbedding","scopeHasEmbeddings","similarNotes"],"mappings":";;;;+BAWsBA;;;eAAAA;;;uBAVmC;uBACA;uBACN;wBACxB;sBAEC;uBACoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIzC,SAAeA,aAAaC,KAAY,EAAEC,GAAmB,EAAEC,OAAe,EAAEC,SAA0B,EAAEC,CAAS;;YACpHC,OACAC,MAEAC,UACAC,WACAC,SAIAC,WAWAC,GAIAC;;;;oBAxBiB;;wBAAMZ,MAAMa,OAAO,CAAC;;;oBAA3B;;wBAAO,cAAuDC,GAAG;;;oBAA3ET,QAAQ,AAAE,cAAiGU,GAAG,CAAC,SAACC;+BAAMA,EAAEV,IAAI;;oBAC5HA,OAAOW,IAAAA,mBAAW,EAACZ,OAAOH;oBAEN;;wBAAMF,MAAMa,OAAO,CAAC;;;oBAA3B;;wBAAO,cAAwGC,GAAG,CAACR;;;oBAAhIC,WAAW,AAAE,cAAqJQ,GAAG,CAAC,SAACC;+BAAMA,EAAEE,GAAG;;oBAC7J;;wBAAMlB,MAAMa,OAAO,CAAC;;;oBAA3B;;wBAAO,cAAoFC,GAAG,CAACR;;;oBAA7GE,YAAY,AAAE,cAAiIO,GAAG,CAAC,SAACC;+BAAMA,EAAEG,GAAG;;oBAC/JV,UAAU,IAAIW,IAAI;wBAACd;sBAAD,OAAO,qBAAGC,WAAU,qBAAGC;oBAE/C,yFAAyF;oBACzF,8EAA8E;oBACxEE,YAAYW,IAAAA,sBAAa,EAACpB,KAAKE;oBACrC,IAAI,CAACmB,IAAAA,qBAAY,EAACrB,MAAM;wBACtB,MAAM,IAAIsB,oBAAU,CAAC,kBAAkB;oBACzC;oBACA,0FAA0F;oBAC1F,2FAA2F;oBAC3F,IAAIb,UAAUc,OAAO,CAACC,OAAO,KAAKC,WAAW;wBAC3C,MAAM,IAAIH,oBAAU,CAAC,uBAAuB,AAAC,WAA+B,OAArBb,UAAUiB,UAAU,EAAC;oBAC9E;oBACA,wFAAwF;oBACxF,wEAAwE;oBAClEhB,IAAIiB,IAAAA,oBAAW,EAAC3B,MAAM,iDAAiD;oBAC7E,IAAI4B,IAAAA,0BAAiB,EAAClB,IAAI;wBACxB,MAAM,IAAIY,oBAAU,CAAC,uBAAuB,AAAC,8FAAoHO,OAAvBnB,EAAEoB,KAAK,EAAC,iBAA+B,OAAhBD,wBAAe,EAAC;oBACnL;oBACgB;;wBAAME,IAAAA,oBAAW,EAAChC,OAAOC,KAAKE;;;oBAAxCS,UAAU;oBAChB,oFAAoF;oBACpF,oDAAoD;oBACpD;;wBAAMqB,IAAAA,qBAAY,EAACjC,OAAOC,KAAKA,IAAIiC,OAAO;;;oBAA1C;oBACM;;wBAAMC,IAAAA,qBAAY,EAACnC,OAAOM;;;oBAAhC,IAAI,CAAE,eAAkC;wBACtC,MAAM,IAAIiB,oBAAU,CAAC,qBAAqB,AAAC,GAAO,OAALjB,MAAK;oBACpD;oBACM;;wBAAM8B,IAAAA,2BAAkB,EAACpC,OAAOC,KAAKW;;;oBAA3C,IAAI,CAAE,eAAgD;;;;oBACtD;;wBAAOyB,IAAAA,qBAAY,EAACrC,OAAOC,KAAKK,MAAM;4BAAEG,SAAAA;4BAASG,SAAAA;4BAASR,GAAAA;wBAAE;;;;IAC9D"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/related.ts"],"sourcesContent":["import type { ResolvedConfig, SearchOverrides } from '../config/index.ts';\nimport { embedConfig, embedEnabled, resolveSearch } from '../config/index.ts';\nimport { embedPending, hasEmbedding, similarNotes } from '../embed/query.ts';\nimport { localModelMissing, MODEL_FILENAMES } from '../embed/store.ts';\nimport { SenseError } from '../errors.ts';\nimport type { Store } from '../store/types.ts';\nimport { resolveNote } from './peek.ts';\nimport { scopedPaths, scopeHasEmbeddings } from './scope.ts';\n\n// Notes most similar by cosine, excluding self and everything already linked either way.\n// Its own command, not a peek section: a full embeddings scan is ~480ms at 26k notes.\nexport async function relatedNotes(store: Store, cfg: ResolvedConfig, pathArg: string, overrides: SearchOverrides, k: number): Promise<Array<{ path: string; similarity: number }>> {\n const paths = ((await (await store.prepare('SELECT \"path\" FROM frontmatter')).all()) as Array<{ path: string }>).map((r) => r.path);\n const path = resolveNote(paths, pathArg);\n\n const outbound = ((await (await store.prepare('SELECT DISTINCT dst FROM links WHERE src = ? AND dst IS NOT NULL AND dst != src')).all(path)) as Array<{ dst: string }>).map((r) => r.dst);\n const backlinks = ((await (await store.prepare('SELECT DISTINCT src FROM links WHERE dst = ? AND src != dst')).all(path)) as Array<{ src: string }>).map((r) => r.src);\n const exclude = new Set([path, ...outbound, ...backlinks]);\n\n // Vectors are the only signal `related` has, so every way of not having them is an error\n // naming the cause; an empty result means one thing, nothing near in meaning.\n const effective = resolveSearch(cfg, overrides);\n if (!embedEnabled(cfg)) {\n throw new SenseError('EMBED_DISABLED', 'related ranks notes by meaning, and 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; `sense download` prefetches it) -- search works without it, on words and links');\n }\n // search gates on the same signal, so a preset's declared signals mean one thing: without\n // this check an overlapping vectors-on preset would answer for a scope that declined them.\n if (effective.signals.vectors === undefined) {\n throw new SenseError('PRESET_NOT_SEMANTIC', `preset \"${effective.presetName}\" has no \"vectors\" signal, so this scope has no vectors and related has no other signal; search it instead (words and links), or add \"vectors\" to that preset's signals`);\n }\n // A downloadable HF id proceeds -- embedPending's getProvider call fetches it lazily on\n // consent. Only a local path with missing files can never fetch itself.\n const e = embedConfig(cfg); // embedEnabled(cfg) above guarantees this is set\n if (localModelMissing(e)) {\n throw new SenseError('EMBED_MODEL_MISSING', `related ranks notes by meaning, so it needs the embedding model, but the local model path \"${e.model}\" is missing ${MODEL_FILENAMES}; point embed.model at a directory containing them (search still works without it, on words and links)`);\n }\n const allowed = await scopedPaths(store, cfg, overrides);\n // Top up pending rows before the seed check, or a fresh index reports every note as\n // having no indexed text until some search has run.\n await embedPending(store, cfg, cfg.rootDir ?? cfg.baseDir);\n if (!(await hasEmbedding(store, path))) {\n throw new SenseError('NOTE_NOT_EMBEDDED', `${path} has no indexed text to compare -- a note that is frontmatter only, or empty, has nothing to rank by meaning`);\n }\n if (!(await scopeHasEmbeddings(store, cfg, allowed))) return [];\n return similarNotes(store, cfg, path, { exclude, allowed, k });\n}\n"],"names":["relatedNotes","store","cfg","pathArg","overrides","k","paths","path","outbound","backlinks","exclude","effective","e","allowed","prepare","all","map","r","resolveNote","dst","src","Set","resolveSearch","embedEnabled","SenseError","signals","vectors","undefined","presetName","embedConfig","localModelMissing","MODEL_FILENAMES","model","scopedPaths","embedPending","rootDir","baseDir","hasEmbedding","scopeHasEmbeddings","similarNotes"],"mappings":";;;;+BAWsBA;;;eAAAA;;;uBAVmC;uBACA;uBACN;wBACxB;sBAEC;uBACoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIzC,SAAeA,aAAaC,KAAY,EAAEC,GAAmB,EAAEC,OAAe,EAAEC,SAA0B,EAAEC,CAAS;;YA4B3FH,cA3BzBI,OACAC,MAEAC,UACAC,WACAC,SAIAC,WAWAC,GAIAC;;;;oBAxBiB;;wBAAMZ,MAAMa,OAAO,CAAC;;;oBAA3B;;wBAAO,cAAuDC,GAAG;;;oBAA3ET,QAAQ,AAAE,cAAiGU,GAAG,CAAC,SAACC;+BAAMA,EAAEV,IAAI;;oBAC5HA,OAAOW,IAAAA,mBAAW,EAACZ,OAAOH;oBAEN;;wBAAMF,MAAMa,OAAO,CAAC;;;oBAA3B;;wBAAO,cAAwGC,GAAG,CAACR;;;oBAAhIC,WAAW,AAAE,cAAqJQ,GAAG,CAAC,SAACC;+BAAMA,EAAEE,GAAG;;oBAC7J;;wBAAMlB,MAAMa,OAAO,CAAC;;;oBAA3B;;wBAAO,cAAoFC,GAAG,CAACR;;;oBAA7GE,YAAY,AAAE,cAAiIO,GAAG,CAAC,SAACC;+BAAMA,EAAEG,GAAG;;oBAC/JV,UAAU,IAAIW,IAAI;wBAACd;sBAAD,OAAO,qBAAGC,WAAU,qBAAGC;oBAE/C,yFAAyF;oBACzF,8EAA8E;oBACxEE,YAAYW,IAAAA,sBAAa,EAACpB,KAAKE;oBACrC,IAAI,CAACmB,IAAAA,qBAAY,EAACrB,MAAM;wBACtB,MAAM,IAAIsB,oBAAU,CAAC,kBAAkB;oBACzC;oBACA,0FAA0F;oBAC1F,2FAA2F;oBAC3F,IAAIb,UAAUc,OAAO,CAACC,OAAO,KAAKC,WAAW;wBAC3C,MAAM,IAAIH,oBAAU,CAAC,uBAAuB,AAAC,WAA+B,OAArBb,UAAUiB,UAAU,EAAC;oBAC9E;oBACA,wFAAwF;oBACxF,wEAAwE;oBAClEhB,IAAIiB,IAAAA,oBAAW,EAAC3B,MAAM,iDAAiD;oBAC7E,IAAI4B,IAAAA,0BAAiB,EAAClB,IAAI;wBACxB,MAAM,IAAIY,oBAAU,CAAC,uBAAuB,AAAC,8FAAoHO,OAAvBnB,EAAEoB,KAAK,EAAC,iBAA+B,OAAhBD,wBAAe,EAAC;oBACnL;oBACgB;;wBAAME,IAAAA,oBAAW,EAAChC,OAAOC,KAAKE;;;oBAAxCS,UAAU;oBAChB,oFAAoF;oBACpF,oDAAoD;oBACpD;;wBAAMqB,IAAAA,qBAAY,EAACjC,OAAOC,MAAKA,eAAAA,IAAIiC,OAAO,cAAXjC,0BAAAA,eAAeA,IAAIkC,OAAO;;;oBAAzD;oBACM;;wBAAMC,IAAAA,qBAAY,EAACpC,OAAOM;;;oBAAhC,IAAI,CAAE,eAAkC;wBACtC,MAAM,IAAIiB,oBAAU,CAAC,qBAAqB,AAAC,GAAO,OAALjB,MAAK;oBACpD;oBACM;;wBAAM+B,IAAAA,2BAAkB,EAACrC,OAAOC,KAAKW;;;oBAA3C,IAAI,CAAE,eAAgD;;;;oBACtD;;wBAAO0B,IAAAA,qBAAY,EAACtC,OAAOC,KAAKK,MAAM;4BAAEG,SAAAA;4BAASG,SAAAA;4BAASR,GAAAA;wBAAE;;;;IAC9D"}
@@ -1,6 +1,13 @@
1
1
  import type { ResolvedConfig } from '../config/index.js';
2
2
  import type { Row } from '../output/output.js';
3
3
  import type { Store } from '../store/types.js';
4
+ export declare const SNIPPET_CHAR_LIMIT_DEFAULT = 80;
5
+ export declare const SNIPPET_COUNT_LIMIT_DEFAULT = 1;
6
+ export declare function computeSnippets(text: string, terms: string[], charLimit: number, countLimit: number): {
7
+ snippets: string[];
8
+ offset: number;
9
+ };
10
+ export declare function lineNumberAt(text: string, offset: number): number;
4
11
  export interface SearchOptions {
5
12
  k?: number;
6
13
  where?: string;
@@ -8,5 +15,8 @@ export interface SearchOptions {
8
15
  include?: string[];
9
16
  exclude?: string[];
10
17
  noExclude?: boolean;
18
+ snippetCharLimit?: number;
19
+ snippetCountLimit?: number;
11
20
  }
21
+ export declare function hydrateSearchRows(store: Store, cfg: ResolvedConfig, rows: Row[], matchedPaths: Set<string>, terms: string, opts?: Pick<SearchOptions, 'snippetCharLimit' | 'snippetCountLimit'>): Promise<void>;
12
22
  export declare function search(store: Store, cfg: ResolvedConfig, terms: string, opts?: SearchOptions): Promise<Row[]>;
@@ -1,6 +1,13 @@
1
1
  import type { ResolvedConfig } from '../config/index.js';
2
2
  import type { Row } from '../output/output.js';
3
3
  import type { Store } from '../store/types.js';
4
+ export declare const SNIPPET_CHAR_LIMIT_DEFAULT = 80;
5
+ export declare const SNIPPET_COUNT_LIMIT_DEFAULT = 1;
6
+ export declare function computeSnippets(text: string, terms: string[], charLimit: number, countLimit: number): {
7
+ snippets: string[];
8
+ offset: number;
9
+ };
10
+ export declare function lineNumberAt(text: string, offset: number): number;
4
11
  export interface SearchOptions {
5
12
  k?: number;
6
13
  where?: string;
@@ -8,5 +15,8 @@ export interface SearchOptions {
8
15
  include?: string[];
9
16
  exclude?: string[];
10
17
  noExclude?: boolean;
18
+ snippetCharLimit?: number;
19
+ snippetCountLimit?: number;
11
20
  }
21
+ export declare function hydrateSearchRows(store: Store, cfg: ResolvedConfig, rows: Row[], matchedPaths: Set<string>, terms: string, opts?: Pick<SearchOptions, 'snippetCharLimit' | 'snippetCountLimit'>): Promise<void>;
12
22
  export declare function search(store: Store, cfg: ResolvedConfig, terms: string, opts?: SearchOptions): Promise<Row[]>;