sensemaking 0.12.2 → 0.13.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 (245) hide show
  1. package/dist/cjs/cli/download.js +4 -4
  2. package/dist/cjs/cli/download.js.map +1 -1
  3. package/dist/cjs/cli/init.js +4 -4
  4. package/dist/cjs/cli/init.js.map +1 -1
  5. package/dist/cjs/cli/map.js +4 -4
  6. package/dist/cjs/cli/map.js.map +1 -1
  7. package/dist/cjs/cli/named.js +2 -2
  8. package/dist/cjs/cli/named.js.map +1 -1
  9. package/dist/cjs/cli/path.js +6 -6
  10. package/dist/cjs/cli/path.js.map +1 -1
  11. package/dist/cjs/cli/peek.js +4 -4
  12. package/dist/cjs/cli/peek.js.map +1 -1
  13. package/dist/cjs/cli/related.js +4 -4
  14. package/dist/cjs/cli/related.js.map +1 -1
  15. package/dist/cjs/cli/search.js +4 -4
  16. package/dist/cjs/cli/search.js.map +1 -1
  17. package/dist/cjs/cli/shared.d.cts +2 -2
  18. package/dist/cjs/cli/shared.d.ts +2 -2
  19. package/dist/cjs/cli/shared.js +5 -5
  20. package/dist/cjs/cli/shared.js.map +1 -1
  21. package/dist/cjs/cli/status.js +16 -16
  22. package/dist/cjs/cli/status.js.map +1 -1
  23. package/dist/cjs/cli/types.d.cts +1 -1
  24. package/dist/cjs/cli/types.d.ts +1 -1
  25. package/dist/cjs/cli.js +3 -3
  26. package/dist/cjs/cli.js.map +1 -1
  27. package/dist/cjs/commands/index.d.cts +10 -0
  28. package/dist/cjs/commands/index.d.ts +10 -0
  29. package/dist/cjs/commands/index.js +42 -0
  30. package/dist/cjs/commands/index.js.map +1 -0
  31. package/dist/cjs/commands/map.d.cts +21 -0
  32. package/dist/cjs/commands/map.d.ts +21 -0
  33. package/dist/cjs/commands/map.js +90 -0
  34. package/dist/cjs/commands/map.js.map +1 -0
  35. package/dist/cjs/commands/peek.d.cts +20 -0
  36. package/dist/cjs/commands/peek.d.ts +20 -0
  37. package/dist/cjs/commands/peek.js +175 -0
  38. package/dist/cjs/commands/peek.js.map +1 -0
  39. package/dist/cjs/commands/related.d.cts +6 -0
  40. package/dist/cjs/commands/related.d.ts +6 -0
  41. package/dist/cjs/commands/related.js +232 -0
  42. package/dist/cjs/commands/related.js.map +1 -0
  43. package/dist/cjs/commands/scope.d.cts +10 -0
  44. package/dist/cjs/commands/scope.d.ts +10 -0
  45. package/dist/cjs/commands/scope.js +124 -0
  46. package/dist/cjs/commands/scope.js.map +1 -0
  47. package/dist/cjs/commands/search.d.cts +12 -0
  48. package/dist/cjs/commands/search.d.ts +12 -0
  49. package/dist/cjs/{commands.js → commands/search.js} +20 -358
  50. package/dist/cjs/commands/search.js.map +1 -0
  51. package/dist/cjs/commands/status.d.cts +9 -0
  52. package/dist/cjs/commands/status.d.ts +9 -0
  53. package/dist/cjs/commands/status.js +25 -0
  54. package/dist/cjs/commands/status.js.map +1 -0
  55. package/dist/cjs/config/access.d.cts +19 -0
  56. package/dist/cjs/config/access.d.ts +19 -0
  57. package/dist/cjs/config/access.js +149 -0
  58. package/dist/cjs/config/access.js.map +1 -0
  59. package/dist/cjs/config/index.d.cts +5 -0
  60. package/dist/cjs/config/index.d.ts +5 -0
  61. package/dist/cjs/config/index.js +77 -0
  62. package/dist/cjs/config/index.js.map +1 -0
  63. package/dist/cjs/config/load.d.cts +8 -0
  64. package/dist/cjs/config/load.d.ts +8 -0
  65. package/dist/cjs/config/load.js +448 -0
  66. package/dist/cjs/config/load.js.map +1 -0
  67. package/dist/cjs/config/resolve.d.cts +6 -0
  68. package/dist/cjs/config/resolve.d.ts +6 -0
  69. package/dist/cjs/config/resolve.js +50 -0
  70. package/dist/cjs/config/resolve.js.map +1 -0
  71. package/dist/{esm/config.d.ts → cjs/config/types.d.cts} +2 -32
  72. package/dist/cjs/{config.d.cts → config/types.d.ts} +2 -32
  73. package/dist/cjs/config/types.js +39 -0
  74. package/dist/cjs/config/types.js.map +1 -0
  75. package/dist/cjs/config/validate.d.cts +4 -0
  76. package/dist/cjs/config/validate.d.ts +4 -0
  77. package/dist/cjs/config/validate.js +363 -0
  78. package/dist/cjs/config/validate.js.map +1 -0
  79. package/dist/cjs/db/index.d.cts +4 -0
  80. package/dist/cjs/db/index.d.ts +4 -0
  81. package/dist/cjs/db/index.js +42 -0
  82. package/dist/cjs/db/index.js.map +1 -0
  83. package/dist/cjs/{db.d.cts → db/open.d.cts} +2 -8
  84. package/dist/cjs/{db.d.ts → db/open.d.ts} +2 -8
  85. package/dist/cjs/db/open.js +223 -0
  86. package/dist/cjs/db/open.js.map +1 -0
  87. package/dist/cjs/db/reconcile.d.cts +9 -0
  88. package/dist/cjs/db/reconcile.d.ts +9 -0
  89. package/dist/cjs/{db.js → db/reconcile.js} +24 -261
  90. package/dist/cjs/db/reconcile.js.map +1 -0
  91. package/dist/cjs/db/shared.d.cts +5 -0
  92. package/dist/cjs/db/shared.d.ts +5 -0
  93. package/dist/cjs/db/shared.js +45 -0
  94. package/dist/cjs/db/shared.js.map +1 -0
  95. package/dist/cjs/features/embed.d.cts +1 -1
  96. package/dist/cjs/features/embed.d.ts +1 -1
  97. package/dist/cjs/features/embed.js +4 -3
  98. package/dist/cjs/features/embed.js.map +1 -1
  99. package/dist/cjs/features/index.d.cts +1 -1
  100. package/dist/cjs/features/index.d.ts +1 -1
  101. package/dist/cjs/features/index.js +4 -2
  102. package/dist/cjs/features/index.js.map +1 -1
  103. package/dist/cjs/features/links.js +38 -20
  104. package/dist/cjs/features/links.js.map +1 -1
  105. package/dist/cjs/features/tags.d.cts +2 -0
  106. package/dist/cjs/features/tags.d.ts +2 -0
  107. package/dist/cjs/features/tags.js +188 -0
  108. package/dist/cjs/features/tags.js.map +1 -0
  109. package/dist/cjs/features/types.d.cts +2 -2
  110. package/dist/cjs/features/types.d.ts +2 -2
  111. package/dist/cjs/index.d.cts +6 -6
  112. package/dist/cjs/index.d.ts +6 -6
  113. package/dist/cjs/index.js +15 -15
  114. package/dist/cjs/index.js.map +1 -1
  115. package/dist/cjs/scan.d.cts +3 -1
  116. package/dist/cjs/scan.d.ts +3 -1
  117. package/dist/cjs/scan.js +9 -6
  118. package/dist/cjs/scan.js.map +1 -1
  119. package/dist/cjs/sql-functions.d.cts +2 -0
  120. package/dist/cjs/sql-functions.d.ts +2 -0
  121. package/dist/cjs/sql-functions.js +64 -0
  122. package/dist/cjs/sql-functions.js.map +1 -0
  123. package/dist/cjs/watch.d.cts +1 -1
  124. package/dist/cjs/watch.d.ts +1 -1
  125. package/dist/cjs/watch.js +12 -12
  126. package/dist/cjs/watch.js.map +1 -1
  127. package/dist/esm/cli/download.js +1 -1
  128. package/dist/esm/cli/download.js.map +1 -1
  129. package/dist/esm/cli/init.js +1 -1
  130. package/dist/esm/cli/init.js.map +1 -1
  131. package/dist/esm/cli/map.js +1 -1
  132. package/dist/esm/cli/map.js.map +1 -1
  133. package/dist/esm/cli/named.js +1 -1
  134. package/dist/esm/cli/named.js.map +1 -1
  135. package/dist/esm/cli/path.js +1 -1
  136. package/dist/esm/cli/path.js.map +1 -1
  137. package/dist/esm/cli/peek.js +1 -1
  138. package/dist/esm/cli/peek.js.map +1 -1
  139. package/dist/esm/cli/related.js +1 -1
  140. package/dist/esm/cli/related.js.map +1 -1
  141. package/dist/esm/cli/search.js +1 -1
  142. package/dist/esm/cli/search.js.map +1 -1
  143. package/dist/esm/cli/shared.d.ts +2 -2
  144. package/dist/esm/cli/shared.js +2 -2
  145. package/dist/esm/cli/shared.js.map +1 -1
  146. package/dist/esm/cli/status.js +3 -3
  147. package/dist/esm/cli/status.js.map +1 -1
  148. package/dist/esm/cli/types.d.ts +1 -1
  149. package/dist/esm/cli/types.js.map +1 -1
  150. package/dist/esm/cli.js +1 -1
  151. package/dist/esm/cli.js.map +1 -1
  152. package/dist/esm/commands/index.d.ts +10 -0
  153. package/dist/esm/commands/index.js +8 -0
  154. package/dist/esm/commands/index.js.map +1 -0
  155. package/dist/esm/commands/map.d.ts +21 -0
  156. package/dist/esm/commands/map.js +56 -0
  157. package/dist/esm/commands/map.js.map +1 -0
  158. package/dist/esm/commands/peek.d.ts +20 -0
  159. package/dist/esm/commands/peek.js +63 -0
  160. package/dist/esm/commands/peek.js.map +1 -0
  161. package/dist/esm/commands/related.d.ts +6 -0
  162. package/dist/esm/commands/related.js +47 -0
  163. package/dist/esm/commands/related.js.map +1 -0
  164. package/dist/esm/commands/scope.d.ts +10 -0
  165. package/dist/esm/commands/scope.js +60 -0
  166. package/dist/esm/commands/scope.js.map +1 -0
  167. package/dist/esm/commands/search.d.ts +12 -0
  168. package/dist/esm/commands/search.js +258 -0
  169. package/dist/esm/commands/search.js.map +1 -0
  170. package/dist/esm/commands/status.d.ts +9 -0
  171. package/dist/esm/commands/status.js +16 -0
  172. package/dist/esm/commands/status.js.map +1 -0
  173. package/dist/esm/config/access.d.ts +19 -0
  174. package/dist/esm/config/access.js +89 -0
  175. package/dist/esm/config/access.js.map +1 -0
  176. package/dist/esm/config/index.d.ts +5 -0
  177. package/dist/esm/config/index.js +4 -0
  178. package/dist/esm/config/index.js.map +1 -0
  179. package/dist/esm/config/load.d.ts +8 -0
  180. package/dist/esm/config/load.js +242 -0
  181. package/dist/esm/config/load.js.map +1 -0
  182. package/dist/esm/config/resolve.d.ts +6 -0
  183. package/dist/esm/config/resolve.js +35 -0
  184. package/dist/esm/config/resolve.js.map +1 -0
  185. package/dist/{cjs/config.d.ts → esm/config/types.d.ts} +2 -32
  186. package/dist/esm/config/types.js +15 -0
  187. package/dist/esm/config/types.js.map +1 -0
  188. package/dist/esm/config/validate.d.ts +4 -0
  189. package/dist/esm/config/validate.js +226 -0
  190. package/dist/esm/config/validate.js.map +1 -0
  191. package/dist/esm/db/index.d.ts +4 -0
  192. package/dist/esm/db/index.js +5 -0
  193. package/dist/esm/db/index.js.map +1 -0
  194. package/dist/esm/{db.d.ts → db/open.d.ts} +2 -8
  195. package/dist/esm/db/open.js +160 -0
  196. package/dist/esm/db/open.js.map +1 -0
  197. package/dist/esm/db/reconcile.d.ts +9 -0
  198. package/dist/esm/{db.js → db/reconcile.js} +12 -216
  199. package/dist/esm/db/reconcile.js.map +1 -0
  200. package/dist/esm/db/shared.d.ts +5 -0
  201. package/dist/esm/db/shared.js +20 -0
  202. package/dist/esm/db/shared.js.map +1 -0
  203. package/dist/esm/features/embed.d.ts +1 -1
  204. package/dist/esm/features/embed.js +2 -1
  205. package/dist/esm/features/embed.js.map +1 -1
  206. package/dist/esm/features/index.d.ts +1 -1
  207. package/dist/esm/features/index.js +3 -1
  208. package/dist/esm/features/index.js.map +1 -1
  209. package/dist/esm/features/links.js +36 -21
  210. package/dist/esm/features/links.js.map +1 -1
  211. package/dist/esm/features/tags.d.ts +2 -0
  212. package/dist/esm/features/tags.js +80 -0
  213. package/dist/esm/features/tags.js.map +1 -0
  214. package/dist/esm/features/types.d.ts +2 -2
  215. package/dist/esm/features/types.js.map +1 -1
  216. package/dist/esm/index.d.ts +6 -6
  217. package/dist/esm/index.js +3 -3
  218. package/dist/esm/index.js.map +1 -1
  219. package/dist/esm/scan.d.ts +3 -1
  220. package/dist/esm/scan.js +5 -2
  221. package/dist/esm/scan.js.map +1 -1
  222. package/dist/esm/sql-functions.d.ts +2 -0
  223. package/dist/esm/sql-functions.js +47 -0
  224. package/dist/esm/sql-functions.js.map +1 -0
  225. package/dist/esm/watch.d.ts +1 -1
  226. package/dist/esm/watch.js +2 -2
  227. package/dist/esm/watch.js.map +1 -1
  228. package/package.json +2 -1
  229. package/schema.json +4 -0
  230. package/skills/sense/SKILL.md +3 -3
  231. package/skills/sense-bases/EXAMPLES.md +103 -0
  232. package/skills/sense-bases/SKILL.md +137 -0
  233. package/skills/sense-setup/SKILL.md +1 -1
  234. package/dist/cjs/commands.d.cts +0 -58
  235. package/dist/cjs/commands.d.ts +0 -58
  236. package/dist/cjs/commands.js.map +0 -1
  237. package/dist/cjs/config.js +0 -919
  238. package/dist/cjs/config.js.map +0 -1
  239. package/dist/cjs/db.js.map +0 -1
  240. package/dist/esm/commands.d.ts +0 -58
  241. package/dist/esm/commands.js +0 -486
  242. package/dist/esm/commands.js.map +0 -1
  243. package/dist/esm/config.js +0 -599
  244. package/dist/esm/config.js.map +0 -1
  245. package/dist/esm/db.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/status.ts"],"sourcesContent":["import { dirname } from 'node:path';\nimport { presetCoverage } from '../commands.ts';\nimport { embedConfig, featureStates, SUPPORTED_CONFIG_VERSION } from '../config.ts';\nimport { docCount, getMeta, open, SCHEMA_VERSION } from '../db.ts';\nimport { isDownloadable, MODEL_FILENAMES, modelDir, modelPresent } from '../features/embed.ts';\nimport { featuresLine, presetsLines } from '../output.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, FORMAT, formatOf, parse, printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\n// status names what you cannot read off the config file: locations sense chose, values it\n// derived, state it stored. Config content is not echoed -- the config line says which file to\n// read, and duplicating its globs here would create two places that disagree after an edit.\n// The exception is the embed block's url and key, whose effect is remote and otherwise invisible.\n\n// Vectors are computed on the first semantic query, not at reconcile, so a tree can have a\n// semantic-on preset with nothing embedded yet -- reported here because a fast reconcile on\n// such a tree otherwise reads as \"the feature isn't on\".\nfunction vectorState(db: ReturnType<typeof open>['db']): { embedded: number; pending: number } | null {\n try {\n const row = db.prepare('SELECT COUNT(vector) AS embedded, COUNT(*) - COUNT(vector) AS pending FROM embeddings').get() as { embedded: number; pending: number };\n return row;\n } catch {\n return null;\n }\n}\n\nfunction parseErrorCount(db: ReturnType<typeof open>['db']): number {\n const row = db.prepare(`SELECT COUNT(*) AS n FROM frontmatter WHERE \"_parse_error\" IS NOT NULL`).get() as { n: number };\n return row.n;\n}\n\n// A URL can carry credentials in its userinfo (https://user:pass@host/v1). status output gets\n// pasted into issues and transcripts, so it is always safe to paste.\nexport function redactUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (!parsed.username && !parsed.password) return url;\n parsed.username = '';\n parsed.password = '';\n return `${parsed.toString().replace(/\\/$/, '')} (credentials redacted)`;\n } catch {\n return url;\n }\n}\n\nconst status: Command = (ctx) => {\n const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.status}`, { ...FORMAT, ...CONFIG });\n const format = formatOf(values);\n const cfg = ctx.resolveConfig(values.config as string | undefined);\n const { db, dbPath, warnings } = open(cfg);\n printWarnings(warnings);\n\n const features = featureStates(cfg);\n const e = embedConfig(cfg);\n const hasModel = e ? modelPresent(cfg) : false;\n const vectors = e ? vectorState(db) : null;\n const presets = presetCoverage(db, cfg);\n const heartbeat = getMeta(db, 'watch_heartbeat');\n // Derived at open() (F): 3x the largest reconcile this cache has ever held its write\n // transaction for, floored at 30s -- read back from the connection rather than\n // recomputed here, so this always reports what open() actually set.\n const busyTimeoutMs = (db.prepare('PRAGMA busy_timeout').get() as { timeout: number }).timeout;\n // The env var holds the token; only its name and whether it is set are ever reported.\n const keyEnv = e?.key ? { name: e.key, set: (process.env[e.key] ?? '') !== '' } : null;\n const result = {\n config: cfg.configPath,\n configVersion: SUPPORTED_CONFIG_VERSION,\n migratedFrom: cfg.migratedFrom ?? null,\n unknownConfigKeys: cfg.unknownKeys ?? null,\n tree: cfg.baseDir,\n cache: dirname(dbPath),\n db: dbPath,\n cacheSchema: SCHEMA_VERSION,\n docs: docCount(db),\n unparseableFrontmatter: parseErrorCount(db),\n features: features.on,\n featuresOff: features.off,\n embed: e ? { type: e.type, model: e.model, dir: e.type === 'static' ? modelDir(e.model) : null, url: e.url ? redactUrl(e.url) : null, keyEnv, downloaded: hasModel, ...(vectors ?? {}) } : null,\n presets,\n queries: Object.keys(cfg.queries ?? {}).length,\n watcherPid: getMeta(db, 'watch_pid'),\n watcherHeartbeatSecondsAgo: heartbeat ? Math.round((Date.now() - Date.parse(heartbeat)) / 1000) : null,\n busyTimeoutMs,\n };\n\n if (format === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const migrated = cfg.migratedFrom !== undefined ? `, migrated from v${cfg.migratedFrom} on this run` : '';\n console.log(`config: ${result.config} (v${SUPPORTED_CONFIG_VERSION}${migrated})`);\n // A load-time stderr warning has scrolled away by the time anyone looks here.\n if (cfg.unknownKeys) console.log(` unknown keys, ignored: ${cfg.unknownKeys.join(', ')}`);\n console.log(`tree: ${result.tree}`);\n console.log(`cache: ${result.cache} (schema ${SCHEMA_VERSION}; delete this directory to reset)`);\n console.log(`docs: ${result.docs}${result.unparseableFrontmatter > 0 ? ` (${result.unparseableFrontmatter} with unparseable frontmatter: WHERE _parse_error IS NOT NULL)` : ''}`);\n console.log('');\n console.log(featuresLine(features));\n // One authoritative block, off states included: an absent model reads as a degraded search,\n // not as an empty corpus.\n if (!e) console.log('embed: off (no preset asks for vectors)');\n else {\n console.log(`embed: ${e.type} ${e.model}`);\n if (e.type === 'static') console.log(` model: ${modelDir(e.model)} (${hasModel ? 'present' : `missing, ${isDownloadable(e.model) ? `run \\`${ctx.name} download\\`` : `no ${MODEL_FILENAMES} in that directory`}`})`);\n if (e.url) console.log(` url: ${redactUrl(e.url)}`);\n if (keyEnv) console.log(` key: env ${keyEnv.name} (${keyEnv.set ? 'set' : 'NOT SET'})`);\n if (!hasModel) console.log(' vectors: off until the model is present; search runs on words and links');\n else if (vectors) console.log(` vectors: ${vectors.embedded} embedded, ${vectors.pending} pending (embedded on the first semantic search)`);\n }\n console.log('');\n for (const line of presetsLines(presets)) console.log(line);\n console.log('');\n console.log(`queries: ${result.queries} saved (${ctx.name} --list)`);\n const pid = result.watcherPid ? `pid ${result.watcherPid}, ` : '';\n console.log(result.watcherHeartbeatSecondsAgo === null ? 'watcher: none' : `watcher: ${pid}last heartbeat ${result.watcherHeartbeatSecondsAgo}s ago`);\n console.log(`sqlite: busy_timeout ${result.busyTimeoutMs}ms (derived: 3x the largest reconcile this cache has recorded, floored at 30000ms)`);\n }\n db.close();\n};\nexport default status;\n"],"names":["redactUrl","vectorState","db","row","prepare","get","parseErrorCount","n","url","parsed","URL","username","password","toString","replace","status","ctx","process","cfg","values","parse","argv","USAGE","name","FORMAT","CONFIG","format","formatOf","resolveConfig","config","open","dbPath","warnings","printWarnings","features","featureStates","e","embedConfig","hasModel","modelPresent","vectors","presets","presetCoverage","heartbeat","getMeta","busyTimeoutMs","timeout","keyEnv","key","set","env","result","configPath","configVersion","SUPPORTED_CONFIG_VERSION","migratedFrom","unknownConfigKeys","unknownKeys","tree","baseDir","cache","dirname","cacheSchema","SCHEMA_VERSION","docs","docCount","unparseableFrontmatter","on","featuresOff","off","embed","type","model","dir","modelDir","downloaded","queries","Object","keys","length","watcherPid","watcherHeartbeatSecondsAgo","Math","round","Date","now","console","log","JSON","stringify","migrated","undefined","join","featuresLine","isDownloadable","MODEL_FILENAMES","embedded","pending","presetsLines","line","pid","close"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/status.ts"],"sourcesContent":["import { dirname } from 'node:path';\nimport { presetCoverage } from '../commands/index.ts';\nimport { embedConfig, featureStates, SUPPORTED_CONFIG_VERSION } from '../config/index.ts';\nimport { docCount, getMeta, open, SCHEMA_VERSION } from '../db/index.ts';\nimport { isDownloadable, MODEL_FILENAMES, modelDir, modelPresent } from '../features/embed.ts';\nimport { featuresLine, presetsLines } from '../output.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, FORMAT, formatOf, parse, printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\n// status names what you cannot read off the config file: locations sense chose, values it\n// derived, state it stored. Config content is not echoed -- the config line says which file to\n// read, and duplicating its globs here would create two places that disagree after an edit.\n// The exception is the embed block's url and key, whose effect is remote and otherwise invisible.\n\n// Vectors are computed on the first semantic query, not at reconcile, so a tree can have a\n// semantic-on preset with nothing embedded yet -- reported here because a fast reconcile on\n// such a tree otherwise reads as \"the feature isn't on\".\nfunction vectorState(db: ReturnType<typeof open>['db']): { embedded: number; pending: number } | null {\n try {\n const row = db.prepare('SELECT COUNT(vector) AS embedded, COUNT(*) - COUNT(vector) AS pending FROM embeddings').get() as { embedded: number; pending: number };\n return row;\n } catch {\n return null;\n }\n}\n\nfunction parseErrorCount(db: ReturnType<typeof open>['db']): number {\n const row = db.prepare(`SELECT COUNT(*) AS n FROM frontmatter WHERE \"_parse_error\" IS NOT NULL`).get() as { n: number };\n return row.n;\n}\n\n// A URL can carry credentials in its userinfo (https://user:pass@host/v1). status output gets\n// pasted into issues and transcripts, so it is always safe to paste.\nexport function redactUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (!parsed.username && !parsed.password) return url;\n parsed.username = '';\n parsed.password = '';\n return `${parsed.toString().replace(/\\/$/, '')} (credentials redacted)`;\n } catch {\n return url;\n }\n}\n\nconst status: Command = (ctx) => {\n const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.status}`, { ...FORMAT, ...CONFIG });\n const format = formatOf(values);\n const cfg = ctx.resolveConfig(values.config as string | undefined);\n const { db, dbPath, warnings } = open(cfg);\n printWarnings(warnings);\n\n const features = featureStates(cfg);\n const e = embedConfig(cfg);\n const hasModel = e ? modelPresent(cfg) : false;\n const vectors = e ? vectorState(db) : null;\n const presets = presetCoverage(db, cfg);\n const heartbeat = getMeta(db, 'watch_heartbeat');\n // Derived at open() (F): 3x the largest reconcile this cache has ever held its write\n // transaction for, floored at 30s -- read back from the connection rather than\n // recomputed here, so this always reports what open() actually set.\n const busyTimeoutMs = (db.prepare('PRAGMA busy_timeout').get() as { timeout: number }).timeout;\n // The env var holds the token; only its name and whether it is set are ever reported.\n const keyEnv = e?.key ? { name: e.key, set: (process.env[e.key] ?? '') !== '' } : null;\n const result = {\n config: cfg.configPath,\n configVersion: SUPPORTED_CONFIG_VERSION,\n migratedFrom: cfg.migratedFrom ?? null,\n unknownConfigKeys: cfg.unknownKeys ?? null,\n tree: cfg.baseDir,\n cache: dirname(dbPath),\n db: dbPath,\n cacheSchema: SCHEMA_VERSION,\n docs: docCount(db),\n unparseableFrontmatter: parseErrorCount(db),\n features: features.on,\n featuresOff: features.off,\n embed: e ? { type: e.type, model: e.model, dir: e.type === 'static' ? modelDir(e.model) : null, url: e.url ? redactUrl(e.url) : null, keyEnv, downloaded: hasModel, ...(vectors ?? {}) } : null,\n presets,\n queries: Object.keys(cfg.queries ?? {}).length,\n watcherPid: getMeta(db, 'watch_pid'),\n watcherHeartbeatSecondsAgo: heartbeat ? Math.round((Date.now() - Date.parse(heartbeat)) / 1000) : null,\n busyTimeoutMs,\n };\n\n if (format === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const migrated = cfg.migratedFrom !== undefined ? `, migrated from v${cfg.migratedFrom} on this run` : '';\n console.log(`config: ${result.config} (v${SUPPORTED_CONFIG_VERSION}${migrated})`);\n // A load-time stderr warning has scrolled away by the time anyone looks here.\n if (cfg.unknownKeys) console.log(` unknown keys, ignored: ${cfg.unknownKeys.join(', ')}`);\n console.log(`tree: ${result.tree}`);\n console.log(`cache: ${result.cache} (schema ${SCHEMA_VERSION}; delete this directory to reset)`);\n console.log(`docs: ${result.docs}${result.unparseableFrontmatter > 0 ? ` (${result.unparseableFrontmatter} with unparseable frontmatter: WHERE _parse_error IS NOT NULL)` : ''}`);\n console.log('');\n console.log(featuresLine(features));\n // One authoritative block, off states included: an absent model reads as a degraded search,\n // not as an empty corpus.\n if (!e) console.log('embed: off (no preset asks for vectors)');\n else {\n console.log(`embed: ${e.type} ${e.model}`);\n if (e.type === 'static') console.log(` model: ${modelDir(e.model)} (${hasModel ? 'present' : `missing, ${isDownloadable(e.model) ? `run \\`${ctx.name} download\\`` : `no ${MODEL_FILENAMES} in that directory`}`})`);\n if (e.url) console.log(` url: ${redactUrl(e.url)}`);\n if (keyEnv) console.log(` key: env ${keyEnv.name} (${keyEnv.set ? 'set' : 'NOT SET'})`);\n if (!hasModel) console.log(' vectors: off until the model is present; search runs on words and links');\n else if (vectors) console.log(` vectors: ${vectors.embedded} embedded, ${vectors.pending} pending (embedded on the first semantic search)`);\n }\n console.log('');\n for (const line of presetsLines(presets)) console.log(line);\n console.log('');\n console.log(`queries: ${result.queries} saved (${ctx.name} --list)`);\n const pid = result.watcherPid ? `pid ${result.watcherPid}, ` : '';\n console.log(result.watcherHeartbeatSecondsAgo === null ? 'watcher: none' : `watcher: ${pid}last heartbeat ${result.watcherHeartbeatSecondsAgo}s ago`);\n console.log(`sqlite: busy_timeout ${result.busyTimeoutMs}ms (derived: 3x the largest reconcile this cache has recorded, floored at 30000ms)`);\n }\n db.close();\n};\nexport default status;\n"],"names":["redactUrl","vectorState","db","row","prepare","get","parseErrorCount","n","url","parsed","URL","username","password","toString","replace","status","ctx","process","cfg","values","parse","argv","USAGE","name","FORMAT","CONFIG","format","formatOf","resolveConfig","config","open","dbPath","warnings","printWarnings","features","featureStates","e","embedConfig","hasModel","modelPresent","vectors","presets","presetCoverage","heartbeat","getMeta","busyTimeoutMs","timeout","keyEnv","key","set","env","result","configPath","configVersion","SUPPORTED_CONFIG_VERSION","migratedFrom","unknownConfigKeys","unknownKeys","tree","baseDir","cache","dirname","cacheSchema","SCHEMA_VERSION","docs","docCount","unparseableFrontmatter","on","featuresOff","off","embed","type","model","dir","modelDir","downloaded","queries","Object","keys","length","watcherPid","watcherHeartbeatSecondsAgo","Math","round","Date","now","console","log","JSON","stringify","migrated","undefined","join","featuresLine","isDownloadable","MODEL_FILENAMES","embedded","pending","presetsLines","line","pid","close"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ResolvedConfig } from '../config.js';
1
+ import type { ResolvedConfig } from '../config/index.js';
2
2
  export interface Ctx {
3
3
  name: string;
4
4
  argv: string[];
@@ -1,4 +1,4 @@
1
- import type { ResolvedConfig } from '../config.js';
1
+ import type { ResolvedConfig } from '../config/index.js';
2
2
  export interface Ctx {
3
3
  name: string;
4
4
  argv: string[];
package/dist/cjs/cli.js CHANGED
@@ -12,7 +12,7 @@ Object.defineProperty(exports, // Thrown errors -> exit 1 with the message verba
12
12
  var _nodemodule = require("node:module");
13
13
  var _nodeutil = require("node:util");
14
14
  var _indexts = require("./cli/index.js");
15
- var _configts = require("./config.js");
15
+ var _indexts1 = require("./config/index.js");
16
16
  function _array_like_to_array(arr, len) {
17
17
  if (len == null || len > arr.length) len = arr.length;
18
18
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -237,9 +237,9 @@ function usage(name) {
237
237
  ]).join('\n');
238
238
  }
239
239
  function resolveConfigFor(name, configPath) {
240
- var cfg = (0, _configts.loadConfig)(configPath);
240
+ var cfg = (0, _indexts1.loadConfig)(configPath);
241
241
  if (cfg.migratedFrom !== undefined) {
242
- console.warn("".concat(name, ": migrated ").concat(cfg.configPath, " from config version ").concat(cfg.migratedFrom, " to ").concat(_configts.SUPPORTED_CONFIG_VERSION));
242
+ console.warn("".concat(name, ": migrated ").concat(cfg.configPath, " from config version ").concat(cfg.migratedFrom, " to ").concat(_indexts1.SUPPORTED_CONFIG_VERSION));
243
243
  }
244
244
  if (cfg.unknownKeys !== undefined) {
245
245
  console.warn("".concat(name, ": ").concat(cfg.configPath, " sets ").concat(cfg.unknownKeys.join(', '), ", which this build does not read (no effect); see schema.json for the keys it does"));
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { parseArgs } from 'node:util';\nimport { COMMANDS, USAGE } from './cli/index.ts';\nimport type { Ctx } from './cli/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only; commands lazy-load from src/cli/, so nothing heavy is imported\n// here. Flags parse per command -- this file handles only --version/--help/--list/--config.\n\n// Works from dist/cjs and dist/esm alike: walk up past the dist type-marker package.json.\nfunction packageVersion(): string {\n const load = createRequire(import.meta.url);\n for (const rel of ['../package.json', '../../package.json', '../../../package.json']) {\n try {\n const pkg = load(rel) as { name?: string; version?: string };\n if (pkg.name === 'sensemaking' && pkg.version) return pkg.version;\n } catch {}\n }\n return 'unknown';\n}\n\nfunction usage(name: string): string {\n const lines = Object.values(USAGE).map((u) => ` ${name} ${u}`);\n return [`usage: ${name} <name> [params...] [--format table|json|csv] [--config path]`, ...lines, ` ${name} --list`, ` ${name} --version`].join('\\n');\n}\n\nfunction resolveConfigFor(name: string, configPath: string | undefined) {\n const cfg = loadConfig(configPath);\n if (cfg.migratedFrom !== undefined) {\n console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);\n }\n if (cfg.unknownKeys !== undefined) {\n console.warn(`${name}: ${cfg.configPath} sets ${cfg.unknownKeys.join(', ')}, which this build does not read (no effect); see schema.json for the keys it does`);\n }\n return cfg;\n}\n\n// Thrown errors -> exit 1 with the message verbatim; usage errors exit 2 directly.\nexport default async function cli(argv: string[], name: string): Promise<void> {\n // stdout is a pipe whenever the caller pipes or redirects, and a reader that goes away\n // (`| head`) makes every later write fail. The failure arrives asynchronously, after the\n // write loop has already returned: console.log absorbs it, process.stdout.write (what the\n // streaming formats use) does not, so with no listener the process dies on an unhandled\n // 'error' event having already done its work. Neither throwing nor exiting is safe from\n // here. The event is async, so a throw is an uncaught exception rather than something\n // bin/cli.js can catch, and process.exit() would skip the cleanup `sense watch` runs on the\n // way out, leaving a heartbeat behind that makes a dead watcher look alive.\n process.stdout.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EPIPE') return;\n console.error(`sense: ${err.message}`);\n process.exitCode = 1;\n });\n\n const first = argv[0];\n\n // No command word, or the first token looks like a flag: the only flags this level knows.\n if (!first || first.startsWith('-')) {\n let values: Record<string, string | boolean | undefined>;\n try {\n ({ values } = parseArgs({\n args: argv,\n options: {\n version: { type: 'boolean', default: false, short: 'v' },\n help: { type: 'boolean', default: false, short: 'h' },\n list: { type: 'boolean', default: false },\n config: { type: 'string' },\n },\n allowPositionals: true,\n }));\n } catch (err) {\n console.error((err as Error).message);\n console.error(usage(name));\n process.exit(2);\n }\n\n try {\n if (values.version) {\n console.log(packageVersion());\n return;\n }\n if (values.help) {\n console.log(usage(name));\n return;\n }\n if (values.list) {\n const queries = resolveConfigFor(name, values.config as string | undefined).queries;\n for (const queryName of Object.keys(queries).sort()) {\n // Every entry names its verb, so --list can label both kinds rather than only\n // marking the exception.\n console.log(`${queryName} (${'search' in queries[queryName] ? 'search' : 'sql'})`);\n }\n return;\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n\n console.error(usage(name));\n process.exit(2);\n }\n\n // Breaking renames get one release of a pointer instead of an \"unknown\" error: find ->\n // search, and query -> sql (which took its name back from the search sense of \"query\").\n const RENAMED: Record<string, string> = { find: 'search', query: 'sql' };\n if (RENAMED[first]) {\n console.error(`${name}: ${first} is now ${RENAMED[first]}`);\n console.error(usage(name));\n process.exit(2);\n }\n\n const ctx: Ctx = {\n name,\n argv: argv.slice(1),\n resolveConfig: (configPath) => resolveConfigFor(name, configPath),\n usageError(message) {\n console.error(message);\n process.exit(2);\n },\n };\n\n try {\n const load = COMMANDS[first];\n if (load) await (await load()).default(ctx);\n else await (await import('./cli/named.ts')).default(ctx, first);\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n}\n"],"names":["cli","packageVersion","load","createRequire","rel","pkg","name","version","usage","lines","Object","values","USAGE","map","u","join","resolveConfigFor","configPath","cfg","loadConfig","migratedFrom","undefined","console","warn","SUPPORTED_CONFIG_VERSION","unknownKeys","argv","first","queries","queryName","RENAMED","ctx","err","process","stdout","on","code","error","message","exitCode","startsWith","parseArgs","args","options","type","default","short","help","list","config","allowPositionals","exit","log","keys","sort","find","query","slice","resolveConfig","usageError","COMMANDS"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { parseArgs } from 'node:util';\nimport { COMMANDS, USAGE } from './cli/index.ts';\nimport type { Ctx } from './cli/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config/index.ts';\n\n// Parsing and dispatch only; commands lazy-load from src/cli/, so nothing heavy is imported\n// here. Flags parse per command -- this file handles only --version/--help/--list/--config.\n\n// Works from dist/cjs and dist/esm alike: walk up past the dist type-marker package.json.\nfunction packageVersion(): string {\n const load = createRequire(import.meta.url);\n for (const rel of ['../package.json', '../../package.json', '../../../package.json']) {\n try {\n const pkg = load(rel) as { name?: string; version?: string };\n if (pkg.name === 'sensemaking' && pkg.version) return pkg.version;\n } catch {}\n }\n return 'unknown';\n}\n\nfunction usage(name: string): string {\n const lines = Object.values(USAGE).map((u) => ` ${name} ${u}`);\n return [`usage: ${name} <name> [params...] [--format table|json|csv] [--config path]`, ...lines, ` ${name} --list`, ` ${name} --version`].join('\\n');\n}\n\nfunction resolveConfigFor(name: string, configPath: string | undefined) {\n const cfg = loadConfig(configPath);\n if (cfg.migratedFrom !== undefined) {\n console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);\n }\n if (cfg.unknownKeys !== undefined) {\n console.warn(`${name}: ${cfg.configPath} sets ${cfg.unknownKeys.join(', ')}, which this build does not read (no effect); see schema.json for the keys it does`);\n }\n return cfg;\n}\n\n// Thrown errors -> exit 1 with the message verbatim; usage errors exit 2 directly.\nexport default async function cli(argv: string[], name: string): Promise<void> {\n // stdout is a pipe whenever the caller pipes or redirects, and a reader that goes away\n // (`| head`) makes every later write fail. The failure arrives asynchronously, after the\n // write loop has already returned: console.log absorbs it, process.stdout.write (what the\n // streaming formats use) does not, so with no listener the process dies on an unhandled\n // 'error' event having already done its work. Neither throwing nor exiting is safe from\n // here. The event is async, so a throw is an uncaught exception rather than something\n // bin/cli.js can catch, and process.exit() would skip the cleanup `sense watch` runs on the\n // way out, leaving a heartbeat behind that makes a dead watcher look alive.\n process.stdout.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EPIPE') return;\n console.error(`sense: ${err.message}`);\n process.exitCode = 1;\n });\n\n const first = argv[0];\n\n // No command word, or the first token looks like a flag: the only flags this level knows.\n if (!first || first.startsWith('-')) {\n let values: Record<string, string | boolean | undefined>;\n try {\n ({ values } = parseArgs({\n args: argv,\n options: {\n version: { type: 'boolean', default: false, short: 'v' },\n help: { type: 'boolean', default: false, short: 'h' },\n list: { type: 'boolean', default: false },\n config: { type: 'string' },\n },\n allowPositionals: true,\n }));\n } catch (err) {\n console.error((err as Error).message);\n console.error(usage(name));\n process.exit(2);\n }\n\n try {\n if (values.version) {\n console.log(packageVersion());\n return;\n }\n if (values.help) {\n console.log(usage(name));\n return;\n }\n if (values.list) {\n const queries = resolveConfigFor(name, values.config as string | undefined).queries;\n for (const queryName of Object.keys(queries).sort()) {\n // Every entry names its verb, so --list can label both kinds rather than only\n // marking the exception.\n console.log(`${queryName} (${'search' in queries[queryName] ? 'search' : 'sql'})`);\n }\n return;\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n\n console.error(usage(name));\n process.exit(2);\n }\n\n // Breaking renames get one release of a pointer instead of an \"unknown\" error: find ->\n // search, and query -> sql (which took its name back from the search sense of \"query\").\n const RENAMED: Record<string, string> = { find: 'search', query: 'sql' };\n if (RENAMED[first]) {\n console.error(`${name}: ${first} is now ${RENAMED[first]}`);\n console.error(usage(name));\n process.exit(2);\n }\n\n const ctx: Ctx = {\n name,\n argv: argv.slice(1),\n resolveConfig: (configPath) => resolveConfigFor(name, configPath),\n usageError(message) {\n console.error(message);\n process.exit(2);\n },\n };\n\n try {\n const load = COMMANDS[first];\n if (load) await (await load()).default(ctx);\n else await (await import('./cli/named.ts')).default(ctx, first);\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n}\n"],"names":["cli","packageVersion","load","createRequire","rel","pkg","name","version","usage","lines","Object","values","USAGE","map","u","join","resolveConfigFor","configPath","cfg","loadConfig","migratedFrom","undefined","console","warn","SUPPORTED_CONFIG_VERSION","unknownKeys","argv","first","queries","queryName","RENAMED","ctx","err","process","stdout","on","code","error","message","exitCode","startsWith","parseArgs","args","options","type","default","short","help","list","config","allowPositionals","exit","log","keys","sort","find","query","slice","resolveConfig","usageError","COMMANDS"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type { TreeMap } from './map.js';
2
+ export { mapTree } from './map.js';
3
+ export type { Peek } from './peek.js';
4
+ export { peek, resolveNote } from './peek.js';
5
+ export { relatedNotes } from './related.js';
6
+ export { scopedPaths } from './scope.js';
7
+ export type { SearchOptions } from './search.js';
8
+ export { search } from './search.js';
9
+ export type { PresetCoverage } from './status.js';
10
+ export { presetCoverage } from './status.js';
@@ -0,0 +1,10 @@
1
+ export type { TreeMap } from './map.js';
2
+ export { mapTree } from './map.js';
3
+ export type { Peek } from './peek.js';
4
+ export { peek, resolveNote } from './peek.js';
5
+ export { relatedNotes } from './related.js';
6
+ export { scopedPaths } from './scope.js';
7
+ export type { SearchOptions } from './search.js';
8
+ export { search } from './search.js';
9
+ export type { PresetCoverage } from './status.js';
10
+ export { presetCoverage } from './status.js';
@@ -0,0 +1,42 @@
1
+ // The three commands: mapTree (orient), search (locate), peek (structure).
2
+ // Each returns data; cli.ts renders. All of them degrade when a feature is off.
3
+ "use strict";
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ function _export(target, all) {
8
+ for(var name in all)Object.defineProperty(target, name, {
9
+ enumerable: true,
10
+ get: Object.getOwnPropertyDescriptor(all, name).get
11
+ });
12
+ }
13
+ _export(exports, {
14
+ get mapTree () {
15
+ return _mapts.mapTree;
16
+ },
17
+ get peek () {
18
+ return _peekts.peek;
19
+ },
20
+ get presetCoverage () {
21
+ return _statusts.presetCoverage;
22
+ },
23
+ get relatedNotes () {
24
+ return _relatedts.relatedNotes;
25
+ },
26
+ get resolveNote () {
27
+ return _peekts.resolveNote;
28
+ },
29
+ get scopedPaths () {
30
+ return _scopets.scopedPaths;
31
+ },
32
+ get search () {
33
+ return _searchts.search;
34
+ }
35
+ });
36
+ var _mapts = require("./map.js");
37
+ var _peekts = require("./peek.js");
38
+ var _relatedts = require("./related.js");
39
+ var _scopets = require("./scope.js");
40
+ var _searchts = require("./search.js");
41
+ var _statusts = require("./status.js");
42
+ /* 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/commands/index.ts"],"sourcesContent":["// The three commands: mapTree (orient), search (locate), peek (structure).\n// Each returns data; cli.ts renders. All of them degrade when a feature is off.\n\nexport type { TreeMap } from './map.ts';\nexport { mapTree } from './map.ts';\nexport type { Peek } from './peek.ts';\nexport { peek, resolveNote } from './peek.ts';\nexport { relatedNotes } from './related.ts';\nexport { scopedPaths } from './scope.ts';\nexport type { SearchOptions } from './search.ts';\nexport { search } from './search.ts';\nexport type { PresetCoverage } from './status.ts';\nexport { presetCoverage } from './status.ts';\n"],"names":["mapTree","peek","presetCoverage","relatedNotes","resolveNote","scopedPaths","search"],"mappings":"AAAA,2EAA2E;AAC3E,gFAAgF;;;;;;;;;;;;QAGvEA;eAAAA,cAAO;;QAEPC;eAAAA,YAAI;;QAMJC;eAAAA,wBAAc;;QALdC;eAAAA,uBAAY;;QADNC;eAAAA,mBAAW;;QAEjBC;eAAAA,oBAAW;;QAEXC;eAAAA,gBAAM;;;qBANS;sBAEU;yBACL;uBACD;wBAEL;wBAEQ"}
@@ -0,0 +1,21 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.js';
3
+ import type { Row } from '../output.js';
4
+ import type { PresetCoverage } from './status.js';
5
+ export interface TreeMap {
6
+ docs: {
7
+ count: number;
8
+ bytes: number;
9
+ };
10
+ fields: Row[];
11
+ fieldsTotal: number;
12
+ features: {
13
+ on: FeatureName[];
14
+ off: FeatureName[];
15
+ };
16
+ presets: PresetCoverage[];
17
+ hubs: Row[];
18
+ recent: Row[];
19
+ recentCaveat: string | null;
20
+ }
21
+ export declare function mapTree(db: DatabaseSync, cfg: ResolvedConfig, overrides?: SearchOverrides): TreeMap;
@@ -0,0 +1,21 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.js';
3
+ import type { Row } from '../output.js';
4
+ import type { PresetCoverage } from './status.js';
5
+ export interface TreeMap {
6
+ docs: {
7
+ count: number;
8
+ bytes: number;
9
+ };
10
+ fields: Row[];
11
+ fieldsTotal: number;
12
+ features: {
13
+ on: FeatureName[];
14
+ off: FeatureName[];
15
+ };
16
+ presets: PresetCoverage[];
17
+ hubs: Row[];
18
+ recent: Row[];
19
+ recentCaveat: string | null;
20
+ }
21
+ export declare function mapTree(db: DatabaseSync, cfg: ResolvedConfig, overrides?: SearchOverrides): TreeMap;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "mapTree", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return mapTree;
9
+ }
10
+ });
11
+ var _indexts = require("../config/index.js");
12
+ var _scopets = require("./scope.js");
13
+ var _statusts = require("./status.js");
14
+ // A result row is capped at SQLITE_MAX_COLUMN (2000, default); two aggregate expressions
15
+ // per field keeps a chunk's row safely under that regardless of how many fields the tree has.
16
+ var MAP_COLUMN_CHUNK = 300;
17
+ function chunk(items, size) {
18
+ var out = [];
19
+ for(var i = 0; i < items.length; i += size)out.push(items.slice(i, i + size));
20
+ return out;
21
+ }
22
+ function mapTree(db, cfg) {
23
+ var overrides = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
24
+ (0, _scopets.setupMapScope)(db, (0, _scopets.scopedPaths)(db, cfg, overrides));
25
+ var scopeWhere = 'WHERE "path" IN (SELECT "path" FROM _map_scope)';
26
+ var scopeAnd = 'AND f."path" IN (SELECT "path" FROM _map_scope)';
27
+ var docs = db.prepare('SELECT COUNT(*) AS count, COALESCE(SUM("_size"), 0) AS bytes FROM frontmatter '.concat(scopeWhere)).get();
28
+ var columns = db.prepare('PRAGMA table_info(frontmatter)').all().map(function(r) {
29
+ return r.name;
30
+ }).filter(function(name) {
31
+ return !_scopets.INTERNAL_COLUMNS.has(name);
32
+ });
33
+ // Observed types, not declared: SQLite types per value, so a field can be text in most notes
34
+ // and numeric in a few. One aggregate scan per chunk of columns; FILTER matches COUNT's nulls.
35
+ var allFields = [];
36
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
37
+ try {
38
+ var _loop = function() {
39
+ var group = _step.value;
40
+ var exprs = group.map(function(name, i) {
41
+ var quoted = '"'.concat(name.split('"').join('""'), '"');
42
+ return "COUNT(".concat(quoted, ") AS n").concat(i, ", GROUP_CONCAT(DISTINCT typeof(").concat(quoted, ")) FILTER (WHERE ").concat(quoted, " IS NOT NULL) AS t").concat(i);
43
+ });
44
+ var result = db.prepare("SELECT ".concat(exprs.join(', '), " FROM frontmatter ").concat(scopeWhere)).get();
45
+ group.forEach(function(name, i) {
46
+ var _result_;
47
+ return allFields.push({
48
+ field: name,
49
+ coverage: result["n".concat(i)],
50
+ type: (_result_ = result["t".concat(i)]) !== null && _result_ !== void 0 ? _result_ : ''
51
+ });
52
+ });
53
+ };
54
+ for(var _iterator = chunk(columns, MAP_COLUMN_CHUNK)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
55
+ } catch (err) {
56
+ _didIteratorError = true;
57
+ _iteratorError = err;
58
+ } finally{
59
+ try {
60
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
61
+ _iterator.return();
62
+ }
63
+ } finally{
64
+ if (_didIteratorError) {
65
+ throw _iteratorError;
66
+ }
67
+ }
68
+ }
69
+ allFields.sort(function(a, b) {
70
+ return b.coverage - a.coverage;
71
+ });
72
+ var fields = allFields.slice(0, 20);
73
+ var hubs = (0, _indexts.featureEnabled)(cfg, 'rank') ? db.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 '.concat(scopeAnd, ' ORDER BY f."_rank" DESC LIMIT 8')).all() : [];
74
+ var recent = db.prepare('SELECT "path", datetime("_mtime" / 1000, \'unixepoch\') AS modified FROM frontmatter '.concat(scopeWhere, ' ORDER BY "_mtime" DESC LIMIT 5')).all();
75
+ // A fresh clone/copy stamps files with checkout time, not edit history; second granularity
76
+ // matches the `recent` table above and is coarse enough to catch that without an exact-ms match.
77
+ var topSecond = db.prepare("SELECT COUNT(*) AS n FROM frontmatter ".concat(scopeWhere, ' GROUP BY CAST("_mtime" / 1000 AS INTEGER) ORDER BY n DESC LIMIT 1')).get();
78
+ var recentCaveat = topSecond && docs.count > 1 && topSecond.n > docs.count / 2 ? "".concat(topSecond.n, " of ").concat(docs.count, " files share one modified second, so recency likely reflects a checkout or copy, not edit history") : null;
79
+ return {
80
+ docs: docs,
81
+ fields: fields,
82
+ fieldsTotal: allFields.length,
83
+ features: (0, _indexts.featureStates)(cfg),
84
+ presets: (0, _statusts.presetCoverage)(db, cfg),
85
+ hubs: hubs,
86
+ recent: recent,
87
+ recentCaveat: recentCaveat
88
+ };
89
+ }
90
+ /* 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/commands/map.ts"],"sourcesContent":["import type { DatabaseSync } from 'node:sqlite';\nimport type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.ts';\nimport { featureEnabled, featureStates } from '../config/index.ts';\nimport type { Row } from '../output.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\n// per field keeps a chunk's row safely under that regardless of how many fields the tree has.\nconst MAP_COLUMN_CHUNK = 300;\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 function mapTree(db: DatabaseSync, cfg: ResolvedConfig, overrides: SearchOverrides = {}): TreeMap {\n setupMapScope(db, scopedPaths(db, 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 = db.prepare(`SELECT COUNT(*) AS count, COALESCE(SUM(\"_size\"), 0) AS bytes FROM frontmatter ${scopeWhere}`).get() as { count: number; bytes: number };\n\n const columns = (db.prepare('PRAGMA table_info(frontmatter)').all() as Array<{ name: string }>).map((r) => r.name).filter((name) => !INTERNAL_COLUMNS.has(name));\n // Observed types, not declared: SQLite types per value, so a field can be text in most notes\n // and numeric in a few. One aggregate scan per chunk of columns; FILTER matches COUNT's nulls.\n const allFields: Row[] = [];\n for (const group of chunk(columns, MAP_COLUMN_CHUNK)) {\n const exprs = group.map((name, i) => {\n const quoted = `\"${name.split('\"').join('\"\"')}\"`;\n return `COUNT(${quoted}) AS n${i}, GROUP_CONCAT(DISTINCT typeof(${quoted})) FILTER (WHERE ${quoted} IS NOT NULL) AS t${i}`;\n });\n const result = db.prepare(`SELECT ${exprs.join(', ')} FROM frontmatter ${scopeWhere}`).get() as Record<string, number | string | null>;\n group.forEach((name, i) => allFields.push({ field: name, coverage: result[`n${i}`] as number, type: (result[`t${i}`] as string) ?? '' }));\n }\n allFields.sort((a, b) => (b.coverage as number) - (a.coverage as number));\n const fields = allFields.slice(0, 20);\n\n const hubs = featureEnabled(cfg, 'rank') ? (db.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 = db.prepare(`SELECT \"path\", datetime(\"_mtime\" / 1000, 'unixepoch') AS modified FROM frontmatter ${scopeWhere} ORDER BY \"_mtime\" DESC LIMIT 5`).all() as Row[];\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 = db.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: presetCoverage(db, cfg), hubs, recent, recentCaveat };\n}\n"],"names":["mapTree","MAP_COLUMN_CHUNK","chunk","items","size","out","i","length","push","slice","db","cfg","overrides","setupMapScope","scopedPaths","scopeWhere","scopeAnd","docs","prepare","get","columns","all","map","r","name","filter","INTERNAL_COLUMNS","has","allFields","group","exprs","quoted","split","join","result","forEach","field","coverage","type","sort","a","b","fields","hubs","featureEnabled","recent","topSecond","recentCaveat","count","n","fieldsTotal","features","featureStates","presets","presetCoverage"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.js';
3
+ import type { Row } from '../output.js';
4
+ export declare function resolveNote(paths: string[], arg: string): string;
5
+ export interface Peek {
6
+ path: string;
7
+ tokens: number;
8
+ frontmatter: Row;
9
+ parseError: string | null;
10
+ sections: Row[];
11
+ outbound: string[];
12
+ backlinks: string[];
13
+ unresolved: string[];
14
+ sectionsTotal: number;
15
+ outboundTotal: number;
16
+ backlinksTotal: number;
17
+ unresolvedTotal: number;
18
+ off: FeatureName[];
19
+ }
20
+ export declare function peek(db: DatabaseSync, cfg: ResolvedConfig, pathArg: string, overrides?: SearchOverrides): Peek;
@@ -0,0 +1,20 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.js';
3
+ import type { Row } from '../output.js';
4
+ export declare function resolveNote(paths: string[], arg: string): string;
5
+ export interface Peek {
6
+ path: string;
7
+ tokens: number;
8
+ frontmatter: Row;
9
+ parseError: string | null;
10
+ sections: Row[];
11
+ outbound: string[];
12
+ backlinks: string[];
13
+ unresolved: string[];
14
+ sectionsTotal: number;
15
+ outboundTotal: number;
16
+ backlinksTotal: number;
17
+ unresolvedTotal: number;
18
+ off: FeatureName[];
19
+ }
20
+ export declare function peek(db: DatabaseSync, cfg: ResolvedConfig, pathArg: string, overrides?: SearchOverrides): Peek;
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get peek () {
13
+ return peek;
14
+ },
15
+ get resolveNote () {
16
+ return resolveNote;
17
+ }
18
+ });
19
+ var _posix = /*#__PURE__*/ _interop_require_default(require("node:path/posix"));
20
+ var _indexts = require("../config/index.js");
21
+ var _errorsts = require("../errors.js");
22
+ var _scopets = require("./scope.js");
23
+ function _array_like_to_array(arr, len) {
24
+ if (len == null || len > arr.length) len = arr.length;
25
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
26
+ return arr2;
27
+ }
28
+ function _array_with_holes(arr) {
29
+ if (Array.isArray(arr)) return arr;
30
+ }
31
+ function _array_without_holes(arr) {
32
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
33
+ }
34
+ function _interop_require_default(obj) {
35
+ return obj && obj.__esModule ? obj : {
36
+ default: obj
37
+ };
38
+ }
39
+ function _iterable_to_array(iter) {
40
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
41
+ }
42
+ function _iterable_to_array_limit(arr, i) {
43
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
44
+ if (_i == null) return;
45
+ var _arr = [];
46
+ var _n = true;
47
+ var _d = false;
48
+ var _s, _e;
49
+ try {
50
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
51
+ _arr.push(_s.value);
52
+ if (i && _arr.length === i) break;
53
+ }
54
+ } catch (err) {
55
+ _d = true;
56
+ _e = err;
57
+ } finally{
58
+ try {
59
+ if (!_n && _i["return"] != null) _i["return"]();
60
+ } finally{
61
+ if (_d) throw _e;
62
+ }
63
+ }
64
+ return _arr;
65
+ }
66
+ function _non_iterable_rest() {
67
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
68
+ }
69
+ function _non_iterable_spread() {
70
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
71
+ }
72
+ function _sliced_to_array(arr, i) {
73
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
74
+ }
75
+ function _to_consumable_array(arr) {
76
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
77
+ }
78
+ function _unsupported_iterable_to_array(o, minLen) {
79
+ if (!o) return;
80
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
81
+ var n = Object.prototype.toString.call(o).slice(8, -1);
82
+ if (n === "Object" && o.constructor) n = o.constructor.name;
83
+ if (n === "Map" || n === "Set") return Array.from(n);
84
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
85
+ }
86
+ function resolveNote(paths, arg) {
87
+ var exact = paths.find(function(p) {
88
+ return p === arg;
89
+ });
90
+ if (exact) return exact;
91
+ var base = _posix.default.basename(arg).replace(/\.md$/i, '').toLowerCase();
92
+ var matches = paths.filter(function(p) {
93
+ return _posix.default.basename(p).replace(/\.md$/i, '').toLowerCase() === base;
94
+ });
95
+ if (matches.length === 1) return matches[0];
96
+ if (matches.length > 1) throw new _errorsts.SenseError('NOTE_AMBIGUOUS', '"'.concat(arg, '" is ambiguous: ').concat(matches.join(', ')));
97
+ throw new _errorsts.SenseError('NOTE_NOT_FOUND', 'no note matches "'.concat(arg, '"'));
98
+ }
99
+ var PEEK_LIST_LIMIT = 20;
100
+ function peek(db, cfg, pathArg) {
101
+ var overrides = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
102
+ var _row__parse_error, _row__size;
103
+ var paths = db.prepare('SELECT "path" FROM frontmatter').all().map(function(r) {
104
+ return r.path;
105
+ });
106
+ var path = resolveNote(paths, pathArg);
107
+ var row = db.prepare('SELECT * FROM frontmatter WHERE "path" = ?').get(path);
108
+ var parseError = (_row__parse_error = row._parse_error) !== null && _row__parse_error !== void 0 ? _row__parse_error : null;
109
+ var frontmatter = {};
110
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
111
+ try {
112
+ for(var _iterator = Object.entries(row)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
113
+ var _step_value = _sliced_to_array(_step.value, 2), key = _step_value[0], value = _step_value[1];
114
+ if (!_scopets.INTERNAL_COLUMNS.has(key) && value !== null) frontmatter[key] = value;
115
+ }
116
+ } catch (err) {
117
+ _didIteratorError = true;
118
+ _iteratorError = err;
119
+ } finally{
120
+ try {
121
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
122
+ _iterator.return();
123
+ }
124
+ } finally{
125
+ if (_didIteratorError) {
126
+ throw _iteratorError;
127
+ }
128
+ }
129
+ }
130
+ var sectionsTotal = (0, _indexts.featureEnabled)(cfg, 'sections') ? db.prepare('SELECT COUNT(*) AS n FROM sections WHERE "path" = ?').get(path).n : 0;
131
+ var sections = (0, _indexts.featureEnabled)(cfg, 'sections') ? db.prepare('SELECT level, heading, start_line, end_line, tokens FROM sections WHERE "path" = ? ORDER BY idx LIMIT ?').all(path, PEEK_LIST_LIMIT) : [];
132
+ var outbound = [];
133
+ var backlinks = [];
134
+ var unresolved = [];
135
+ var backlinksTotal = 0;
136
+ var _allowed = (0, _scopets.scopedPaths)(db, cfg, overrides);
137
+ if ((0, _indexts.featureEnabled)(cfg, 'links')) {
138
+ var out = db.prepare('SELECT target, dst FROM links WHERE src = ? ORDER BY target').all(path);
139
+ outbound = _to_consumable_array(new Set(out.filter(function(l) {
140
+ return l.dst !== null;
141
+ }).map(function(l) {
142
+ return l.dst;
143
+ })));
144
+ unresolved = out.filter(function(l) {
145
+ return l.dst === null;
146
+ }).map(function(l) {
147
+ return l.target;
148
+ });
149
+ backlinksTotal = db.prepare('SELECT COUNT(DISTINCT src) AS n FROM links WHERE dst = ?').get(path).n;
150
+ backlinks = db.prepare('SELECT DISTINCT src FROM links WHERE dst = ? ORDER BY src LIMIT ?').all(path, PEEK_LIST_LIMIT).map(function(r) {
151
+ return r.src;
152
+ });
153
+ }
154
+ return {
155
+ path: path,
156
+ tokens: Math.ceil(((_row__size = row._size) !== null && _row__size !== void 0 ? _row__size : 0) / 4),
157
+ frontmatter: frontmatter,
158
+ parseError: parseError,
159
+ sections: sections,
160
+ outbound: outbound.slice(0, PEEK_LIST_LIMIT),
161
+ backlinks: backlinks,
162
+ unresolved: unresolved.slice(0, PEEK_LIST_LIMIT),
163
+ sectionsTotal: sectionsTotal,
164
+ outboundTotal: outbound.length,
165
+ backlinksTotal: backlinksTotal,
166
+ unresolvedTotal: unresolved.length,
167
+ off: [
168
+ 'sections',
169
+ 'links'
170
+ ].filter(function(name) {
171
+ return !(0, _indexts.featureEnabled)(cfg, name);
172
+ })
173
+ };
174
+ }
175
+ /* 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/commands/peek.ts"],"sourcesContent":["import posix from 'node:path/posix';\nimport type { DatabaseSync } from 'node:sqlite';\nimport type { FeatureName, ResolvedConfig, SearchOverrides } from '../config/index.ts';\nimport { featureEnabled } from '../config/index.ts';\nimport { SenseError } from '../errors.ts';\nimport type { Row } from '../output.ts';\nimport { INTERNAL_COLUMNS, scopedPaths } from './scope.ts';\n\n// Note resolution shared by peek and path: an exact path, or a unique basename (case\n// insensitive, .md stripped).\nexport function resolveNote(paths: string[], arg: string): string {\n const exact = paths.find((p) => p === arg);\n if (exact) return exact;\n const base = posix.basename(arg).replace(/\\.md$/i, '').toLowerCase();\n const matches = paths.filter((p) => posix.basename(p).replace(/\\.md$/i, '').toLowerCase() === base);\n if (matches.length === 1) return matches[0];\n if (matches.length > 1) throw new SenseError('NOTE_AMBIGUOUS', `\"${arg}\" is ambiguous: ${matches.join(', ')}`);\n throw new SenseError('NOTE_NOT_FOUND', `no note matches \"${arg}\"`);\n}\n\nexport interface Peek {\n path: string;\n tokens: number;\n frontmatter: Row;\n // Set when the note's frontmatter was refused, so an empty frontmatter block reads as \"did\n // not parse\" rather than \"has none\". Same reason `_parse_error` sits in the row.\n parseError: string | null;\n sections: Row[];\n outbound: string[];\n backlinks: string[];\n unresolved: string[];\n // Totals before truncation: a hub can have thousands of backlinks (or a note thousands of\n // headings), and peek's whole point is bounded output. Query the sections/links tables\n // directly for the full list.\n sectionsTotal: number;\n outboundTotal: number;\n backlinksTotal: number;\n unresolvedTotal: number;\n // Bounded k-hop expansion beyond the immediate ring already shown by outbound/backlinks\n // (depth starts at 2).\n off: FeatureName[]; // disabled features whose blocks are omitted (not empty)\n}\n\nconst PEEK_LIST_LIMIT = 20;\n\n// peek: everything about one note except its prose -- frontmatter, outline with line\n// ranges + token estimates (so the follow-up Read is a range, not the file), links both ways.\nexport function peek(db: DatabaseSync, cfg: ResolvedConfig, pathArg: string, overrides: SearchOverrides = {}): Peek {\n const paths = (db.prepare('SELECT \"path\" FROM frontmatter').all() as Array<{ path: string }>).map((r) => r.path);\n const path = resolveNote(paths, pathArg);\n\n const row = db.prepare('SELECT * FROM frontmatter WHERE \"path\" = ?').get(path) as Row;\n const parseError = (row._parse_error as string | null) ?? null;\n const frontmatter: Row = {};\n for (const [key, value] of Object.entries(row)) {\n if (!INTERNAL_COLUMNS.has(key) && value !== null) frontmatter[key] = value;\n }\n\n const sectionsTotal = featureEnabled(cfg, 'sections') ? (db.prepare('SELECT COUNT(*) AS n FROM sections WHERE \"path\" = ?').get(path) as { n: number }).n : 0;\n const sections = featureEnabled(cfg, 'sections') ? (db.prepare('SELECT level, heading, start_line, end_line, tokens FROM sections WHERE \"path\" = ? ORDER BY idx LIMIT ?').all(path, PEEK_LIST_LIMIT) as Row[]) : [];\n\n let outbound: string[] = [];\n let backlinks: string[] = [];\n let unresolved: string[] = [];\n let backlinksTotal = 0;\n const _allowed = scopedPaths(db, cfg, overrides);\n if (featureEnabled(cfg, 'links')) {\n const out = db.prepare('SELECT target, dst FROM links WHERE src = ? ORDER BY target').all(path) as Array<{ target: string; dst: string | null }>;\n outbound = [...new Set(out.filter((l) => l.dst !== null).map((l) => l.dst as string))];\n unresolved = out.filter((l) => l.dst === null).map((l) => l.target);\n backlinksTotal = (db.prepare('SELECT COUNT(DISTINCT src) AS n FROM links WHERE dst = ?').get(path) as { n: number }).n;\n backlinks = (db.prepare('SELECT DISTINCT src FROM links WHERE dst = ? ORDER BY src LIMIT ?').all(path, PEEK_LIST_LIMIT) as Array<{ src: string }>).map((r) => r.src);\n }\n\n return {\n path,\n tokens: Math.ceil(((row._size as number) ?? 0) / 4),\n frontmatter,\n parseError,\n sections,\n outbound: outbound.slice(0, PEEK_LIST_LIMIT),\n backlinks,\n unresolved: unresolved.slice(0, PEEK_LIST_LIMIT),\n sectionsTotal,\n outboundTotal: outbound.length,\n backlinksTotal,\n unresolvedTotal: unresolved.length,\n off: (['sections', 'links'] as FeatureName[]).filter((name) => !featureEnabled(cfg, name)),\n };\n}\n"],"names":["peek","resolveNote","paths","arg","exact","find","p","base","posix","basename","replace","toLowerCase","matches","filter","length","SenseError","join","PEEK_LIST_LIMIT","db","cfg","pathArg","overrides","row","prepare","all","map","r","path","get","parseError","_parse_error","frontmatter","Object","entries","key","value","INTERNAL_COLUMNS","has","sectionsTotal","featureEnabled","n","sections","outbound","backlinks","unresolved","backlinksTotal","_allowed","scopedPaths","out","Set","l","dst","target","src","tokens","Math","ceil","_size","slice","outboundTotal","unresolvedTotal","off","name"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { ResolvedConfig, SearchOverrides } from '../config/index.js';
3
+ export declare function relatedNotes(db: DatabaseSync, cfg: ResolvedConfig, pathArg: string, overrides: SearchOverrides, k: number): Promise<Array<{
4
+ path: string;
5
+ similarity: number;
6
+ }>>;