sensemaking 0.5.0 → 0.7.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 (108) hide show
  1. package/README.md +13 -6
  2. package/dist/cjs/cli.js +8 -1
  3. package/dist/cjs/cli.js.map +1 -1
  4. package/dist/cjs/commands/check.d.cts +3 -0
  5. package/dist/cjs/commands/check.d.ts +3 -0
  6. package/dist/cjs/commands/check.js +130 -0
  7. package/dist/cjs/commands/check.js.map +1 -0
  8. package/dist/cjs/commands/find.js +173 -10
  9. package/dist/cjs/commands/find.js.map +1 -1
  10. package/dist/cjs/commands/index.js +5 -0
  11. package/dist/cjs/commands/index.js.map +1 -1
  12. package/dist/cjs/commands/map.js +1 -1
  13. package/dist/cjs/commands/map.js.map +1 -1
  14. package/dist/cjs/commands/peek.js +1 -1
  15. package/dist/cjs/commands/peek.js.map +1 -1
  16. package/dist/cjs/commands/shared.d.cts +1 -1
  17. package/dist/cjs/commands/shared.d.ts +1 -1
  18. package/dist/cjs/commands/shared.js +166 -8
  19. package/dist/cjs/commands/shared.js.map +1 -1
  20. package/dist/cjs/commands/status.js +72 -5
  21. package/dist/cjs/commands/status.js.map +1 -1
  22. package/dist/cjs/commands/types.d.cts +1 -0
  23. package/dist/cjs/commands/types.d.ts +1 -0
  24. package/dist/cjs/config.d.cts +32 -2
  25. package/dist/cjs/config.d.ts +32 -2
  26. package/dist/cjs/config.js +199 -11
  27. package/dist/cjs/config.js.map +1 -1
  28. package/dist/cjs/db.d.cts +1 -1
  29. package/dist/cjs/db.d.ts +1 -1
  30. package/dist/cjs/db.js +47 -17
  31. package/dist/cjs/db.js.map +1 -1
  32. package/dist/cjs/errors.d.cts +1 -1
  33. package/dist/cjs/errors.d.ts +1 -1
  34. package/dist/cjs/errors.js.map +1 -1
  35. package/dist/cjs/features/embed.d.cts +15 -0
  36. package/dist/cjs/features/embed.d.ts +15 -0
  37. package/dist/cjs/features/embed.js +844 -0
  38. package/dist/cjs/features/embed.js.map +1 -0
  39. package/dist/cjs/features/index.js +3 -1
  40. package/dist/cjs/features/index.js.map +1 -1
  41. package/dist/cjs/features/types.d.cts +4 -1
  42. package/dist/cjs/features/types.d.ts +4 -1
  43. package/dist/cjs/index.d.cts +1 -1
  44. package/dist/cjs/index.d.ts +1 -1
  45. package/dist/cjs/index.js.map +1 -1
  46. package/dist/cjs/output.d.cts +5 -0
  47. package/dist/cjs/output.d.ts +5 -0
  48. package/dist/cjs/output.js +48 -9
  49. package/dist/cjs/output.js.map +1 -1
  50. package/dist/cjs/scan.d.cts +1 -1
  51. package/dist/cjs/scan.d.ts +1 -1
  52. package/dist/cjs/scan.js +17 -10
  53. package/dist/cjs/scan.js.map +1 -1
  54. package/dist/cjs/verbs.d.cts +8 -2
  55. package/dist/cjs/verbs.d.ts +8 -2
  56. package/dist/cjs/verbs.js +308 -81
  57. package/dist/cjs/verbs.js.map +1 -1
  58. package/dist/esm/cli.js +8 -1
  59. package/dist/esm/cli.js.map +1 -1
  60. package/dist/esm/commands/check.d.ts +3 -0
  61. package/dist/esm/commands/check.js +56 -0
  62. package/dist/esm/commands/check.js.map +1 -0
  63. package/dist/esm/commands/find.js +5 -4
  64. package/dist/esm/commands/find.js.map +1 -1
  65. package/dist/esm/commands/index.js +1 -0
  66. package/dist/esm/commands/index.js.map +1 -1
  67. package/dist/esm/commands/map.js +1 -3
  68. package/dist/esm/commands/map.js.map +1 -1
  69. package/dist/esm/commands/peek.js +1 -1
  70. package/dist/esm/commands/peek.js.map +1 -1
  71. package/dist/esm/commands/shared.d.ts +1 -1
  72. package/dist/esm/commands/shared.js +2 -2
  73. package/dist/esm/commands/shared.js.map +1 -1
  74. package/dist/esm/commands/status.js +43 -5
  75. package/dist/esm/commands/status.js.map +1 -1
  76. package/dist/esm/commands/types.d.ts +1 -0
  77. package/dist/esm/commands/types.js.map +1 -1
  78. package/dist/esm/config.d.ts +32 -2
  79. package/dist/esm/config.js +98 -9
  80. package/dist/esm/config.js.map +1 -1
  81. package/dist/esm/db.d.ts +1 -1
  82. package/dist/esm/db.js +20 -11
  83. package/dist/esm/db.js.map +1 -1
  84. package/dist/esm/errors.d.ts +1 -1
  85. package/dist/esm/errors.js.map +1 -1
  86. package/dist/esm/features/embed.d.ts +15 -0
  87. package/dist/esm/features/embed.js +299 -0
  88. package/dist/esm/features/embed.js.map +1 -0
  89. package/dist/esm/features/index.js +3 -1
  90. package/dist/esm/features/index.js.map +1 -1
  91. package/dist/esm/features/types.d.ts +4 -1
  92. package/dist/esm/features/types.js.map +1 -1
  93. package/dist/esm/index.d.ts +1 -1
  94. package/dist/esm/index.js.map +1 -1
  95. package/dist/esm/output.d.ts +5 -0
  96. package/dist/esm/output.js +40 -8
  97. package/dist/esm/output.js.map +1 -1
  98. package/dist/esm/scan.d.ts +1 -1
  99. package/dist/esm/scan.js +17 -10
  100. package/dist/esm/scan.js.map +1 -1
  101. package/dist/esm/verbs.d.ts +8 -2
  102. package/dist/esm/verbs.js +92 -18
  103. package/dist/esm/verbs.js.map +1 -1
  104. package/package.json +2 -1
  105. package/schema.json +35 -1
  106. package/skills/sense/EXAMPLES.md +16 -0
  107. package/skills/sense/SKILL.md +60 -20
  108. package/skills/sense-setup/SKILL.md +91 -0
package/README.md CHANGED
@@ -59,14 +59,16 @@ ORDER BY bm25(content, 10.0, 5.0, 1.0) LIMIT 10
59
59
  | verb | does |
60
60
  |---|---|
61
61
  | `map` | doc count, frontmatter field coverage, top hubs by link rank, recent changes |
62
- | `find "<terms>" [--where "<sql>"] [--k n]` | BM25 + link-graph expansion, fused; `via` marks each row `match`, `link`, or `match+link` |
62
+ | `find "<terms>" [--where "<sql>"] [--k n] [--semantic]` | BM25 + link-graph expansion, fused; `via` marks each row `match`, `link`, or `match+link` |
63
63
  | `peek <path>` | frontmatter + heading outline (`[L143-162, ~380t]`) + links both ways, capped at 20 per list |
64
64
  | `query "<sql>" [params...]` | ad-hoc SQL over all four tables; `?` binds positional args |
65
65
 
66
66
  `find` seeds a personalized-PageRank walk with the BM25 matches, so a note that never contains
67
67
  the terms but is linked from ones that do still surfaces. Terms pass verbatim to FTS5 `MATCH`
68
68
  (bare words AND-join; operators are yours to write). `--where` takes a frontmatter condition
69
- against alias `f`.
69
+ against alias `f`. On trees with the `embed` feature, `--semantic` additionally expands by
70
+ meaning — explicit per query, never silent; rows it adds are labeled `via: vector` and carry a
71
+ `lines` column pointing at the best-matching section.
70
72
  `--format json` on any verb returns structured output.
71
73
 
72
74
  ## Config
@@ -91,6 +93,12 @@ goes BM25-only without `links`, `map` drops hubs without `rank`, `peek` drops th
91
93
  without `sections`). Toggling rebuilds the cache. Older config versions auto-migrate on load,
92
94
  noted on stderr.
93
95
 
96
+ `embed` is the one opt-in feature (absent = off; most trees don't need vectors): `"embed": true`
97
+ uses the built-in static model (downloaded to `~/.cache/sensemaking` on first use, never in the
98
+ package), or `{ "model", "type": "static"|"api", "url", "key" }` points at any Model2Vec model,
99
+ local path, or OpenAI-compatible endpoint (Ollama, LM Studio, hosted). With it on, vectors stay
100
+ fresh at reconcile and `find --semantic` uses them; default `find` results are unchanged.
101
+
94
102
  ## Reference
95
103
 
96
104
  - `has(field, value)` — the one custom SQL function: array membership on JSON-array fields,
@@ -140,10 +148,9 @@ The skill teaches the descent: `map` to orient, `find` to locate, `peek` before
140
148
  query it headless.
141
149
  - **Index-on-build tools (MarkdownDB)** — query a snapshot; `sense` reconciles on every query.
142
150
  - **Note CLIs (zk)** — fixed schema; `sense` filters on arbitrary frontmatter.
143
- - **RAG / vector stores** — similarity can't express `WHERE status = 'active'`. Vector recall is
144
- planned as an optional `embed` feature (pure-JS provider package, fused into `find`) not
145
- blocked (`node:sqlite` can load extensions since Node 22.13), just deferred until BM25 + links
146
- measurably miss.
151
+ - **RAG / vector stores** — similarity can't express `WHERE status = 'active'`. Here vectors are
152
+ the optional `embed` feature: same SQLite file, filters compose, expansion is explicit per
153
+ query (`find --semantic`) and labeled no second store, no daemon, no native builds.
147
154
 
148
155
  Dependencies: [yaml](https://github.com/eemeli/yaml),
149
156
  [remove-markdown](https://github.com/zuchka/remove-markdown),
package/dist/cjs/cli.js CHANGED
@@ -226,7 +226,7 @@ function packageVersion() {
226
226
  return 'unknown';
227
227
  }
228
228
  function usage(name) {
229
- return "usage: ".concat(name, " <name> [params...] [--format table|json] [--config path]\n") + " ".concat(name, ' query "<sql>" [params...]\n') + " ".concat(name, ' find "<terms>" [--where "<sql>"] [--k n]\n') + " ".concat(name, " map\n") + " ".concat(name, " peek <path>\n") + " ".concat(name, " --list\n") + " ".concat(name, " init\n") + " ".concat(name, " watch [--force]\n") + " ".concat(name, " status\n") + " ".concat(name, " rebuild\n") + " ".concat(name, " --version");
229
+ return "usage: ".concat(name, " <name> [params...] [--format table|json] [--config path]\n") + " ".concat(name, ' query "<sql>" [params...]\n') + " ".concat(name, ' find "<terms>" [--where "<sql>"] [--k n] [--semantic]\n') + " ".concat(name, " map\n") + " ".concat(name, " peek <path>\n") + " ".concat(name, " --list\n") + " ".concat(name, " init\n") + " ".concat(name, " watch [--force]\n") + " ".concat(name, " status\n") + " ".concat(name, " rebuild\n") + " ".concat(name, " --version");
230
230
  }
231
231
  function cli(argv, name) {
232
232
  return _async_to_generator(function() {
@@ -252,6 +252,10 @@ function cli(argv, name) {
252
252
  k: {
253
253
  type: 'string'
254
254
  },
255
+ semantic: {
256
+ type: 'boolean',
257
+ default: false
258
+ },
255
259
  list: {
256
260
  type: 'boolean',
257
261
  default: false
@@ -300,6 +304,9 @@ function cli(argv, name) {
300
304
  if (cfg.migratedFrom !== undefined) {
301
305
  console.warn("".concat(name, ": migrated ").concat(cfg.configPath, " from config version ").concat(cfg.migratedFrom, " to ").concat(_configts.SUPPORTED_CONFIG_VERSION));
302
306
  }
307
+ if (cfg.unknownKeys !== undefined) {
308
+ 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"));
309
+ }
303
310
  return cfg;
304
311
  },
305
312
  usageError: function usageError(message) {
@@ -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 } from './commands/index.ts';\nimport type { Ctx } from './commands/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only. Commands live in src/commands/, one file each, lazy-loaded --\n// nothing tree- or dependency-heavy may be imported at the top of this file.\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 return (\n `usage: ${name} <name> [params...] [--format table|json] [--config path]\\n` +\n ` ${name} query \"<sql>\" [params...]\\n` +\n ` ${name} find \"<terms>\" [--where \"<sql>\"] [--k n]\\n` +\n ` ${name} map\\n` +\n ` ${name} peek <path>\\n` +\n ` ${name} --list\\n` +\n ` ${name} init\\n` +\n ` ${name} watch [--force]\\n` +\n ` ${name} status\\n` +\n ` ${name} rebuild\\n` +\n ` ${name} --version`\n );\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 let values: Record<string, string | boolean | undefined>;\n let positionals: string[];\n try {\n ({ values, positionals } = parseArgs({\n args: argv,\n options: {\n format: { type: 'string', default: 'table' },\n config: { type: 'string' },\n where: { type: 'string' },\n k: { type: 'string' },\n list: { type: 'boolean', default: false },\n force: { type: 'boolean', default: false },\n version: { type: 'boolean', default: false, short: 'v' },\n help: { type: 'boolean', default: false, short: 'h' },\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 if (values.version) {\n console.log(`v${packageVersion()}`);\n return;\n }\n if (values.help) {\n console.log(usage(name));\n return;\n }\n\n const ctx: Ctx = {\n name,\n rest: positionals.slice(1),\n format: values.format === 'json' ? 'json' : 'table',\n values: values as Ctx['values'],\n resolveConfig() {\n const cfg = loadConfig(values.config as string | undefined);\n if (cfg.migratedFrom !== undefined) {\n console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);\n }\n return cfg;\n },\n usageError(message) {\n console.error(message);\n process.exit(2);\n },\n };\n\n try {\n if (values.list) {\n for (const queryName of Object.keys(ctx.resolveConfig().queries).sort()) console.log(queryName);\n return;\n }\n\n const [first, ...params] = positionals;\n if (!first) {\n console.error(usage(name));\n process.exit(2);\n }\n\n const load = COMMANDS[first];\n if (load) await (await load()).default(ctx);\n else (await import('./commands/named.ts')).default(ctx, first, params);\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","argv","values","positionals","ctx","queryName","first","params","err","parseArgs","args","options","format","type","default","config","where","k","list","force","short","help","allowPositionals","console","error","message","process","exit","log","rest","slice","resolveConfig","cfg","loadConfig","migratedFrom","undefined","warn","configPath","SUPPORTED_CONFIG_VERSION","usageError","Object","keys","queries","sort","COMMANDS"],"mappings":";;;;+BAqCA,mFAAmF;AACnF;;;eAA8BA;;;0BAtCA;wBACJ;uBACD;wBAE4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAErD,2FAA2F;AAC3F,6EAA6E;AAE7E,0FAA0F;AAC1F,SAASC;IACP,IAAMC,OAAOC,IAAAA,yBAAa,EAAC;IAC3B,gBAAkB,QAAA;QAAC;QAAmB;QAAsB;KAAwB,OAAlE,mBAAoE;YAA3EC,MAAO;QAChB,IAAI;YACF,IAAMC,MAAMH,KAAKE;YACjB,IAAIC,IAAIC,IAAI,KAAK,iBAAiBD,IAAIE,OAAO,EAAE,OAAOF,IAAIE,OAAO;QACnE,EAAE,eAAM,CAAC;IACX;IACA,OAAO;AACT;AAEA,SAASC,MAAMF,IAAY;IACzB,OACE,AAAC,UAAc,OAALA,MAAK,iEACf,AAAC,UAAc,OAALA,MAAK,kCACf,AAAC,UAAc,OAALA,MAAK,iDACf,AAAC,UAAc,OAALA,MAAK,YACf,AAAC,UAAc,OAALA,MAAK,oBACf,AAAC,UAAc,OAALA,MAAK,eACf,AAAC,UAAc,OAALA,MAAK,aACf,AAAC,UAAc,OAALA,MAAK,wBACf,AAAC,UAAc,OAALA,MAAK,eACf,AAAC,UAAc,OAALA,MAAK,gBACf,AAAC,UAAc,OAALA,MAAK;AAEnB;AAGe,SAAeN,IAAIS,IAAc,EAAEH,IAAY;;YACxDI,QACAC,kBA+BEC,KAoBG,2BAAA,mBAAA,gBAAA,WAAA,OAAMC,WAIcF,cAApBG,OAAUC,QAMXb,MAGCc;;;;oBA/DT,IAAI;;8BACyBC,IAAAA,mBAAS,EAAC;4BACnCC,MAAMT;4BACNU,SAAS;gCACPC,QAAQ;oCAAEC,MAAM;oCAAUC,SAAS;gCAAQ;gCAC3CC,QAAQ;oCAAEF,MAAM;gCAAS;gCACzBG,OAAO;oCAAEH,MAAM;gCAAS;gCACxBI,GAAG;oCAAEJ,MAAM;gCAAS;gCACpBK,MAAM;oCAAEL,MAAM;oCAAWC,SAAS;gCAAM;gCACxCK,OAAO;oCAAEN,MAAM;oCAAWC,SAAS;gCAAM;gCACzCf,SAAS;oCAAEc,MAAM;oCAAWC,SAAS;oCAAOM,OAAO;gCAAI;gCACvDC,MAAM;oCAAER,MAAM;oCAAWC,SAAS;oCAAOM,OAAO;gCAAI;4BACtD;4BACAE,kBAAkB;wBACpB,IAbGpB,aAAAA,QAAQC,kBAAAA;oBAcb,EAAE,OAAOK,KAAK;wBACZe,QAAQC,KAAK,CAAC,AAAChB,IAAciB,OAAO;wBACpCF,QAAQC,KAAK,CAACxB,MAAMF;wBACpB4B,QAAQC,IAAI,CAAC;oBACf;oBAEA,IAAIzB,OAAOH,OAAO,EAAE;wBAClBwB,QAAQK,GAAG,CAAC,AAAC,IAAoB,OAAjBnC;wBAChB;;;oBACF;oBACA,IAAIS,OAAOmB,IAAI,EAAE;wBACfE,QAAQK,GAAG,CAAC5B,MAAMF;wBAClB;;;oBACF;oBAEMM,MAAW;wBACfN,MAAAA;wBACA+B,MAAM1B,YAAY2B,KAAK,CAAC;wBACxBlB,QAAQV,OAAOU,MAAM,KAAK,SAAS,SAAS;wBAC5CV,QAAQA;wBACR6B,eAAAA,SAAAA;4BACE,IAAMC,MAAMC,IAAAA,oBAAU,EAAC/B,OAAOa,MAAM;4BACpC,IAAIiB,IAAIE,YAAY,KAAKC,WAAW;gCAClCZ,QAAQa,IAAI,CAAC,AAAC,GAAoBJ,OAAlBlC,MAAK,eAAmDkC,OAAtCA,IAAIK,UAAU,EAAC,yBAA8CC,OAAvBN,IAAIE,YAAY,EAAC,QAA+B,OAAzBI,kCAAwB;4BACzH;4BACA,OAAON;wBACT;wBACAO,YAAAA,SAAAA,WAAWd,OAAO;4BAChBF,QAAQC,KAAK,CAACC;4BACdC,QAAQC,IAAI,CAAC;wBACf;oBACF;;;;;;;;;oBAGE,IAAIzB,OAAOgB,IAAI,EAAE;wBACV,kCAAA,2BAAA;;4BAAL,IAAK,YAAmBsB,OAAOC,IAAI,CAACrC,IAAI2B,aAAa,GAAGW,OAAO,EAAEC,IAAI,yBAAhE,6BAAA,QAAA,yBAAA;gCAAMtC,YAAN;gCAAoEkB,QAAQK,GAAG,CAACvB;;;4BAAhF;4BAAA;;;qCAAA,6BAAA;oCAAA;;;oCAAA;0CAAA;;;;wBACL;;;oBACF;oBAE2BF,yBAAAA,cAApBG,QAAoBH,iBAAVI,SAAUJ,mBAAb;oBACd,IAAI,CAACG,OAAO;wBACViB,QAAQC,KAAK,CAACxB,MAAMF;wBACpB4B,QAAQC,IAAI,CAAC;oBACf;oBAEMjC,OAAOkD,iBAAQ,CAACtC,MAAM;yBACxBZ,MAAAA;;;;oBAAa;;wBAAMA;;;oBAAb;;wBAAO,cAAcoB,OAAO,CAACV;;;oBAA7B;;;;;;oBACJ;;wBAAM;2EAAA,QAAO;;;;oBAAb,cAAqCU,OAAO,CAACV,KAAKE,OAAOC;;;;;;;;oBACxDC;oBACPe,QAAQC,KAAK,CAAC,AAAChB,IAAciB,OAAO;oBACpCC,QAAQC,IAAI,CAAC;;;;;;;;;;;IAEjB"}
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 } from './commands/index.ts';\nimport type { Ctx } from './commands/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only. Commands live in src/commands/, one file each, lazy-loaded --\n// nothing tree- or dependency-heavy may be imported at the top of this file.\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 return (\n `usage: ${name} <name> [params...] [--format table|json] [--config path]\\n` +\n ` ${name} query \"<sql>\" [params...]\\n` +\n ` ${name} find \"<terms>\" [--where \"<sql>\"] [--k n] [--semantic]\\n` +\n ` ${name} map\\n` +\n ` ${name} peek <path>\\n` +\n ` ${name} --list\\n` +\n ` ${name} init\\n` +\n ` ${name} watch [--force]\\n` +\n ` ${name} status\\n` +\n ` ${name} rebuild\\n` +\n ` ${name} --version`\n );\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 let values: Record<string, string | boolean | undefined>;\n let positionals: string[];\n try {\n ({ values, positionals } = parseArgs({\n args: argv,\n options: {\n format: { type: 'string', default: 'table' },\n config: { type: 'string' },\n where: { type: 'string' },\n k: { type: 'string' },\n semantic: { type: 'boolean', default: false },\n list: { type: 'boolean', default: false },\n force: { type: 'boolean', default: false },\n version: { type: 'boolean', default: false, short: 'v' },\n help: { type: 'boolean', default: false, short: 'h' },\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 if (values.version) {\n console.log(`v${packageVersion()}`);\n return;\n }\n if (values.help) {\n console.log(usage(name));\n return;\n }\n\n const ctx: Ctx = {\n name,\n rest: positionals.slice(1),\n format: values.format === 'json' ? 'json' : 'table',\n values: values as Ctx['values'],\n resolveConfig() {\n const cfg = loadConfig(values.config as string | undefined);\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 usageError(message) {\n console.error(message);\n process.exit(2);\n },\n };\n\n try {\n if (values.list) {\n for (const queryName of Object.keys(ctx.resolveConfig().queries).sort()) console.log(queryName);\n return;\n }\n\n const [first, ...params] = positionals;\n if (!first) {\n console.error(usage(name));\n process.exit(2);\n }\n\n const load = COMMANDS[first];\n if (load) await (await load()).default(ctx);\n else (await import('./commands/named.ts')).default(ctx, first, params);\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","argv","values","positionals","ctx","queryName","first","params","err","parseArgs","args","options","format","type","default","config","where","k","semantic","list","force","short","help","allowPositionals","console","error","message","process","exit","log","rest","slice","resolveConfig","cfg","loadConfig","migratedFrom","undefined","warn","configPath","SUPPORTED_CONFIG_VERSION","unknownKeys","join","usageError","Object","keys","queries","sort","COMMANDS"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const check: Command;
3
+ export default check;
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const check: Command;
3
+ export default check;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _dbts = require("../db.js");
12
+ var _outputts = require("../output.js");
13
+ var _sharedts = require("./shared.js");
14
+ function _array_like_to_array(arr, len) {
15
+ if (len == null || len > arr.length) len = arr.length;
16
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
17
+ return arr2;
18
+ }
19
+ function _array_with_holes(arr) {
20
+ if (Array.isArray(arr)) return arr;
21
+ }
22
+ function _iterable_to_array_limit(arr, i) {
23
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
24
+ if (_i == null) return;
25
+ var _arr = [];
26
+ var _n = true;
27
+ var _d = false;
28
+ var _s, _e;
29
+ try {
30
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
31
+ _arr.push(_s.value);
32
+ if (i && _arr.length === i) break;
33
+ }
34
+ } catch (err) {
35
+ _d = true;
36
+ _e = err;
37
+ } finally{
38
+ try {
39
+ if (!_n && _i["return"] != null) _i["return"]();
40
+ } finally{
41
+ if (_d) throw _e;
42
+ }
43
+ }
44
+ return _arr;
45
+ }
46
+ function _non_iterable_rest() {
47
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
48
+ }
49
+ function _sliced_to_array(arr, i) {
50
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
51
+ }
52
+ function _unsupported_iterable_to_array(o, minLen) {
53
+ if (!o) return;
54
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
55
+ var n = Object.prototype.toString.call(o).slice(8, -1);
56
+ if (n === "Object" && o.constructor) n = o.constructor.name;
57
+ if (n === "Map" || n === "Set") return Array.from(n);
58
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
59
+ }
60
+ // A saved query that returns zero rows looks identical to a true empty result, so a broken
61
+ // one can sit unnoticed -- one field report had `WHERE flag = 'true'` against a numeric
62
+ // column reading as "nothing tagged yet" for hours. Preparing each query catches syntax and
63
+ // unknown-column errors without executing it; queries that take no parameters are also run
64
+ // for a row count. Parameterised queries are validated but not counted: inventing arguments
65
+ // would report a count for a query nobody ran.
66
+ var check = function check(ctx) {
67
+ var _cfg_queries;
68
+ var cfg = ctx.resolveConfig();
69
+ var _open = (0, _dbts.open)(cfg), db = _open.db, warnings = _open.warnings;
70
+ (0, _sharedts.printWarnings)(warnings);
71
+ var rows = [];
72
+ var failed = 0;
73
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
74
+ try {
75
+ for(var _iterator = Object.entries((_cfg_queries = cfg.queries) !== null && _cfg_queries !== void 0 ? _cfg_queries : {})[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
76
+ var _step_value = _sliced_to_array(_step.value, 2), name = _step_value[0], sql = _step_value[1];
77
+ var _sql_match;
78
+ var params = ((_sql_match = sql.match(/\?/g)) !== null && _sql_match !== void 0 ? _sql_match : []).length;
79
+ try {
80
+ var statement = db.prepare(sql);
81
+ if (params > 0) {
82
+ rows.push({
83
+ query: name,
84
+ params: params,
85
+ rows: '—',
86
+ status: 'ok (not run: needs parameters)'
87
+ });
88
+ continue;
89
+ }
90
+ var count = statement.all().length;
91
+ rows.push({
92
+ query: name,
93
+ params: params,
94
+ rows: count,
95
+ status: count === 0 ? 'ok, but returns 0 rows' : 'ok'
96
+ });
97
+ } catch (err) {
98
+ failed++;
99
+ rows.push({
100
+ query: name,
101
+ params: params,
102
+ rows: '—',
103
+ status: "FAILED: ".concat(err.message)
104
+ });
105
+ }
106
+ }
107
+ } catch (err) {
108
+ _didIteratorError = true;
109
+ _iteratorError = err;
110
+ } finally{
111
+ try {
112
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
113
+ _iterator.return();
114
+ }
115
+ } finally{
116
+ if (_didIteratorError) {
117
+ throw _iteratorError;
118
+ }
119
+ }
120
+ }
121
+ db.close();
122
+ if (rows.length === 0) {
123
+ console.log('no saved queries in config');
124
+ return;
125
+ }
126
+ (0, _outputts.printRows)(rows, ctx.format);
127
+ if (failed > 0) process.exit(1);
128
+ };
129
+ var _default = check;
130
+ /* 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/check.ts"],"sourcesContent":["import { open } from '../db.ts';\nimport type { Row } from '../output.ts';\nimport { printRows } from '../output.ts';\nimport { printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\n// A saved query that returns zero rows looks identical to a true empty result, so a broken\n// one can sit unnoticed -- one field report had `WHERE flag = 'true'` against a numeric\n// column reading as \"nothing tagged yet\" for hours. Preparing each query catches syntax and\n// unknown-column errors without executing it; queries that take no parameters are also run\n// for a row count. Parameterised queries are validated but not counted: inventing arguments\n// would report a count for a query nobody ran.\nconst check: Command = (ctx) => {\n const cfg = ctx.resolveConfig();\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n\n const rows: Row[] = [];\n let failed = 0;\n for (const [name, sql] of Object.entries(cfg.queries ?? {})) {\n const params = (sql.match(/\\?/g) ?? []).length;\n try {\n const statement = db.prepare(sql);\n if (params > 0) {\n rows.push({ query: name, params, rows: '—', status: 'ok (not run: needs parameters)' });\n continue;\n }\n const count = (statement.all() as unknown[]).length;\n rows.push({ query: name, params, rows: count, status: count === 0 ? 'ok, but returns 0 rows' : 'ok' });\n } catch (err) {\n failed++;\n rows.push({ query: name, params, rows: '—', status: `FAILED: ${(err as Error).message}` });\n }\n }\n\n db.close();\n if (rows.length === 0) {\n console.log('no saved queries in config');\n return;\n }\n printRows(rows, ctx.format);\n if (failed > 0) process.exit(1);\n};\nexport default check;\n"],"names":["check","ctx","cfg","resolveConfig","open","db","warnings","printWarnings","rows","failed","Object","entries","queries","name","sql","params","match","length","statement","prepare","push","query","status","count","all","err","message","close","console","log","printRows","format","process","exit"],"mappings":";;;;+BA2CA;;;eAAA;;;oBA3CqB;wBAEK;wBACI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAG9B,2FAA2F;AAC3F,wFAAwF;AACxF,4FAA4F;AAC5F,2FAA2F;AAC3F,4FAA4F;AAC5F,+CAA+C;AAC/C,IAAMA,QAAiB,eAACC;QAOmBC;IANzC,IAAMA,MAAMD,IAAIE,aAAa;IAC7B,IAAyBC,QAAAA,IAAAA,UAAI,EAACF,MAAtBG,KAAiBD,MAAjBC,IAAIC,WAAaF,MAAbE;IACZC,IAAAA,uBAAa,EAACD;IAEd,IAAME,OAAc,EAAE;IACtB,IAAIC,SAAS;QACR,kCAAA,2BAAA;;QAAL,QAAK,YAAqBC,OAAOC,OAAO,EAACT,eAAAA,IAAIU,OAAO,cAAXV,0BAAAA,eAAe,CAAC,uBAApD,SAAA,6BAAA,QAAA,yBAAA,iCAAwD;YAAxD,mCAAA,iBAAOW,uBAAMC;gBACAA;YAAhB,IAAMC,SAAS,EAACD,aAAAA,IAAIE,KAAK,CAAC,oBAAVF,wBAAAA,aAAoB,EAAE,EAAEG,MAAM;YAC9C,IAAI;gBACF,IAAMC,YAAYb,GAAGc,OAAO,CAACL;gBAC7B,IAAIC,SAAS,GAAG;oBACdP,KAAKY,IAAI,CAAC;wBAAEC,OAAOR;wBAAME,QAAAA;wBAAQP,MAAM;wBAAKc,QAAQ;oBAAiC;oBACrF;gBACF;gBACA,IAAMC,QAAQ,AAACL,UAAUM,GAAG,GAAiBP,MAAM;gBACnDT,KAAKY,IAAI,CAAC;oBAAEC,OAAOR;oBAAME,QAAAA;oBAAQP,MAAMe;oBAAOD,QAAQC,UAAU,IAAI,2BAA2B;gBAAK;YACtG,EAAE,OAAOE,KAAK;gBACZhB;gBACAD,KAAKY,IAAI,CAAC;oBAAEC,OAAOR;oBAAME,QAAAA;oBAAQP,MAAM;oBAAKc,QAAQ,AAAC,WAAiC,OAAvB,AAACG,IAAcC,OAAO;gBAAG;YAC1F;QACF;;QAdK;QAAA;;;iBAAA,6BAAA;gBAAA;;;gBAAA;sBAAA;;;;IAgBLrB,GAAGsB,KAAK;IACR,IAAInB,KAAKS,MAAM,KAAK,GAAG;QACrBW,QAAQC,GAAG,CAAC;QACZ;IACF;IACAC,IAAAA,mBAAS,EAACtB,MAAMP,IAAI8B,MAAM;IAC1B,IAAItB,SAAS,GAAGuB,QAAQC,IAAI,CAAC;AAC/B;IACA,WAAejC"}
@@ -19,6 +19,35 @@ function _array_like_to_array(arr, len) {
19
19
  function _array_with_holes(arr) {
20
20
  if (Array.isArray(arr)) return arr;
21
21
  }
22
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
23
+ try {
24
+ var info = gen[key](arg);
25
+ var value = info.value;
26
+ } catch (error) {
27
+ reject(error);
28
+ return;
29
+ }
30
+ if (info.done) {
31
+ resolve(value);
32
+ } else {
33
+ Promise.resolve(value).then(_next, _throw);
34
+ }
35
+ }
36
+ function _async_to_generator(fn) {
37
+ return function() {
38
+ var self = this, args = arguments;
39
+ return new Promise(function(resolve, reject) {
40
+ var gen = fn.apply(self, args);
41
+ function _next(value) {
42
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
43
+ }
44
+ function _throw(err) {
45
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
46
+ }
47
+ _next(undefined);
48
+ });
49
+ };
50
+ }
22
51
  function _iterable_to_array_limit(arr, i) {
23
52
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
24
53
  if (_i == null) return;
@@ -57,17 +86,151 @@ function _unsupported_iterable_to_array(o, minLen) {
57
86
  if (n === "Map" || n === "Set") return Array.from(n);
58
87
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
59
88
  }
89
+ function _ts_generator(thisArg, body) {
90
+ var f, y, t, _ = {
91
+ label: 0,
92
+ sent: function() {
93
+ if (t[0] & 1) throw t[1];
94
+ return t[1];
95
+ },
96
+ trys: [],
97
+ ops: []
98
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
99
+ return d(g, "next", {
100
+ value: verb(0)
101
+ }), d(g, "throw", {
102
+ value: verb(1)
103
+ }), d(g, "return", {
104
+ value: verb(2)
105
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
106
+ value: function() {
107
+ return this;
108
+ }
109
+ }), g;
110
+ function verb(n) {
111
+ return function(v) {
112
+ return step([
113
+ n,
114
+ v
115
+ ]);
116
+ };
117
+ }
118
+ function step(op) {
119
+ if (f) throw new TypeError("Generator is already executing.");
120
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
121
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
122
+ if (y = 0, t) op = [
123
+ op[0] & 2,
124
+ t.value
125
+ ];
126
+ switch(op[0]){
127
+ case 0:
128
+ case 1:
129
+ t = op;
130
+ break;
131
+ case 4:
132
+ _.label++;
133
+ return {
134
+ value: op[1],
135
+ done: false
136
+ };
137
+ case 5:
138
+ _.label++;
139
+ y = op[1];
140
+ op = [
141
+ 0
142
+ ];
143
+ continue;
144
+ case 7:
145
+ op = _.ops.pop();
146
+ _.trys.pop();
147
+ continue;
148
+ default:
149
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
150
+ _ = 0;
151
+ continue;
152
+ }
153
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
154
+ _.label = op[1];
155
+ break;
156
+ }
157
+ if (op[0] === 6 && _.label < t[1]) {
158
+ _.label = t[1];
159
+ t = op;
160
+ break;
161
+ }
162
+ if (t && _.label < t[2]) {
163
+ _.label = t[2];
164
+ _.ops.push(op);
165
+ break;
166
+ }
167
+ if (t[2]) _.ops.pop();
168
+ _.trys.pop();
169
+ continue;
170
+ }
171
+ op = body.call(thisArg, _);
172
+ } catch (e) {
173
+ op = [
174
+ 6,
175
+ e
176
+ ];
177
+ y = 0;
178
+ } finally{
179
+ f = t = 0;
180
+ }
181
+ if (op[0] & 5) throw op[1];
182
+ return {
183
+ value: op[0] ? op[1] : void 0,
184
+ done: true
185
+ };
186
+ }
187
+ }
60
188
  var findCmd = function findCmd(ctx) {
61
- var _ctx_rest = _sliced_to_array(ctx.rest, 1), terms = _ctx_rest[0];
62
- if (!terms) ctx.usageError("usage: ".concat(ctx.name, ' find "<terms>" [--where "<sql>"] [--k n]'));
63
- var k = ctx.values.k === undefined ? undefined : Number.parseInt(ctx.values.k, 10);
64
- if (ctx.values.k !== undefined && !Number.isInteger(k)) ctx.usageError('--k expects an integer, got "'.concat(ctx.values.k, '"'));
65
- (0, _sharedts.withDb)(ctx, function(db, cfg) {
66
- return (0, _outputts.printRows)((0, _verbsts.find)(db, cfg, terms, {
67
- k: k,
68
- where: ctx.values.where
69
- }), ctx.format);
70
- });
189
+ return _async_to_generator(function() {
190
+ var _ctx_rest, terms, k;
191
+ return _ts_generator(this, function(_state) {
192
+ switch(_state.label){
193
+ case 0:
194
+ _ctx_rest = _sliced_to_array(ctx.rest, 1), terms = _ctx_rest[0];
195
+ if (!terms) ctx.usageError("usage: ".concat(ctx.name, ' find "<terms>" [--where "<sql>"] [--k n] [--semantic]'));
196
+ k = ctx.values.k === undefined ? undefined : Number.parseInt(ctx.values.k, 10);
197
+ if (ctx.values.k !== undefined && !Number.isInteger(k)) ctx.usageError('--k expects an integer, got "'.concat(ctx.values.k, '"'));
198
+ return [
199
+ 4,
200
+ (0, _sharedts.withDb)(ctx, function(db, cfg) {
201
+ return _async_to_generator(function() {
202
+ return _ts_generator(this, function(_state) {
203
+ switch(_state.label){
204
+ case 0:
205
+ return [
206
+ 4,
207
+ (0, _verbsts.find)(db, cfg, terms, {
208
+ k: k,
209
+ where: ctx.values.where,
210
+ semantic: ctx.values.semantic
211
+ })
212
+ ];
213
+ case 1:
214
+ return [
215
+ 2,
216
+ _outputts.printRows.apply(void 0, [
217
+ _state.sent(),
218
+ ctx.format
219
+ ])
220
+ ];
221
+ }
222
+ });
223
+ })();
224
+ })
225
+ ];
226
+ case 1:
227
+ _state.sent();
228
+ return [
229
+ 2
230
+ ];
231
+ }
232
+ });
233
+ })();
71
234
  };
72
235
  var _default = findCmd;
73
236
  /* 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; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/find.ts"],"sourcesContent":["import { printRows } from '../output.ts';\nimport { find } from '../verbs.ts';\nimport { withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst findCmd: Command = (ctx) => {\n const [terms] = ctx.rest;\n if (!terms) ctx.usageError(`usage: ${ctx.name} find \"<terms>\" [--where \"<sql>\"] [--k n]`);\n const k = ctx.values.k === undefined ? undefined : Number.parseInt(ctx.values.k, 10);\n if (ctx.values.k !== undefined && !Number.isInteger(k)) ctx.usageError(`--k expects an integer, got \"${ctx.values.k}\"`);\n withDb(ctx, (db, cfg) => printRows(find(db, cfg, terms, { k, where: ctx.values.where }), ctx.format));\n};\nexport default findCmd;\n"],"names":["findCmd","ctx","rest","terms","usageError","name","k","values","undefined","Number","parseInt","isInteger","withDb","db","cfg","printRows","find","where","format"],"mappings":";;;;+BAYA;;;eAAA;;;wBAZ0B;uBACL;wBACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGvB,IAAMA,UAAmB,iBAACC;IACxB,IAAgBA,6BAAAA,IAAIC,IAAI,MAAjBC,QAASF;IAChB,IAAI,CAACE,OAAOF,IAAIG,UAAU,CAAC,AAAC,UAAkB,OAATH,IAAII,IAAI,EAAC;IAC9C,IAAMC,IAAIL,IAAIM,MAAM,CAACD,CAAC,KAAKE,YAAYA,YAAYC,OAAOC,QAAQ,CAACT,IAAIM,MAAM,CAACD,CAAC,EAAE;IACjF,IAAIL,IAAIM,MAAM,CAACD,CAAC,KAAKE,aAAa,CAACC,OAAOE,SAAS,CAACL,IAAIL,IAAIG,UAAU,CAAC,AAAC,gCAA4C,OAAbH,IAAIM,MAAM,CAACD,CAAC,EAAC;IACpHM,IAAAA,gBAAM,EAACX,KAAK,SAACY,IAAIC;eAAQC,IAAAA,mBAAS,EAACC,IAAAA,aAAI,EAACH,IAAIC,KAAKX,OAAO;YAAEG,GAAAA;YAAGW,OAAOhB,IAAIM,MAAM,CAACU,KAAK;QAAC,IAAIhB,IAAIiB,MAAM;;AACrG;IACA,WAAelB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/find.ts"],"sourcesContent":["import { printRows } from '../output.ts';\nimport { find } from '../verbs.ts';\nimport { withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst findCmd: Command = async (ctx) => {\n const [terms] = ctx.rest;\n if (!terms) ctx.usageError(`usage: ${ctx.name} find \"<terms>\" [--where \"<sql>\"] [--k n] [--semantic]`);\n const k = ctx.values.k === undefined ? undefined : Number.parseInt(ctx.values.k, 10);\n if (ctx.values.k !== undefined && !Number.isInteger(k)) ctx.usageError(`--k expects an integer, got \"${ctx.values.k}\"`);\n await withDb(ctx, async (db, cfg) => printRows(await find(db, cfg, terms, { k, where: ctx.values.where, semantic: ctx.values.semantic }), ctx.format));\n};\nexport default findCmd;\n"],"names":["findCmd","ctx","terms","k","rest","usageError","name","values","undefined","Number","parseInt","isInteger","withDb","db","cfg","find","where","semantic","printRows","format"],"mappings":";;;;+BAYA;;;eAAA;;;wBAZ0B;uBACL;wBACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGvB,IAAMA,UAAmB,iBAAOC;;YACdA,WAATC,OAEDC;;;;oBAFUF,6BAAAA,IAAIG,IAAI,MAAjBF,QAASD;oBAChB,IAAI,CAACC,OAAOD,IAAII,UAAU,CAAC,AAAC,UAAkB,OAATJ,IAAIK,IAAI,EAAC;oBACxCH,IAAIF,IAAIM,MAAM,CAACJ,CAAC,KAAKK,YAAYA,YAAYC,OAAOC,QAAQ,CAACT,IAAIM,MAAM,CAACJ,CAAC,EAAE;oBACjF,IAAIF,IAAIM,MAAM,CAACJ,CAAC,KAAKK,aAAa,CAACC,OAAOE,SAAS,CAACR,IAAIF,IAAII,UAAU,CAAC,AAAC,gCAA4C,OAAbJ,IAAIM,MAAM,CAACJ,CAAC,EAAC;oBACpH;;wBAAMS,IAAAA,gBAAM,EAACX,KAAK,SAAOY,IAAIC;;;;;4CAAkB;;gDAAMC,IAAAA,aAAI,EAACF,IAAIC,KAAKZ,OAAO;oDAAEC,GAAAA;oDAAGa,OAAOf,IAAIM,MAAM,CAACS,KAAK;oDAAEC,UAAUhB,IAAIM,MAAM,CAACU,QAAQ;gDAAC;;;;;gDAAjGC,mBAAS;oDAAC;oDAA2FjB,IAAIkB,MAAM;;;;;;;;;oBAApJ;;;;;;IACF;;IACA,WAAenB"}
@@ -65,6 +65,11 @@ var COMMANDS = {
65
65
  return /*#__PURE__*/ _interop_require_wildcard(require("./status.js"));
66
66
  });
67
67
  },
68
+ check: function check() {
69
+ return Promise.resolve().then(function() {
70
+ return /*#__PURE__*/ _interop_require_wildcard(require("./check.js"));
71
+ });
72
+ },
68
73
  rebuild: function rebuild() {
69
74
  return Promise.resolve().then(function() {
70
75
  return /*#__PURE__*/ _interop_require_wildcard(require("./rebuild.js"));
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/index.ts"],"sourcesContent":["import type { Command } from './types.ts';\n\n// Lazy registry: a command's imports load only when it runs, so a heavy dependency in one\n// command never taxes the others (or --version/--help). These names are reserved: a named\n// query in config can never shadow them.\nexport const COMMANDS: Record<string, () => Promise<{ default: Command }>> = {\n init: () => import('./init.ts'),\n watch: () => import('./watch.ts'),\n status: () => import('./status.ts'),\n rebuild: () => import('./rebuild.ts'),\n query: () => import('./query.ts'),\n find: () => import('./find.ts'),\n map: () => import('./map.ts'),\n peek: () => import('./peek.ts'),\n};\n\nexport type { Command, Ctx } from './types.ts';\n"],"names":["COMMANDS","init","watch","status","rebuild","query","find","map","peek"],"mappings":";;;;+BAKaA;;;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAN,IAAMA,WAAgE;IAC3EC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,OAAO,SAAPA;eAAa;2DAAA,QAAO;;;IACpBC,QAAQ,SAARA;eAAc;2DAAA,QAAO;;;IACrBC,SAAS,SAATA;eAAe;2DAAA,QAAO;;;IACtBC,OAAO,SAAPA;eAAa;2DAAA,QAAO;;;IACpBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,KAAK,SAALA;eAAW;2DAAA,QAAO;;;IAClBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;AACrB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/index.ts"],"sourcesContent":["import type { Command } from './types.ts';\n\n// Lazy registry: a command's imports load only when it runs, so a heavy dependency in one\n// command never taxes the others (or --version/--help). These names are reserved: a named\n// query in config can never shadow them.\nexport const COMMANDS: Record<string, () => Promise<{ default: Command }>> = {\n init: () => import('./init.ts'),\n watch: () => import('./watch.ts'),\n status: () => import('./status.ts'),\n check: () => import('./check.ts'),\n rebuild: () => import('./rebuild.ts'),\n query: () => import('./query.ts'),\n find: () => import('./find.ts'),\n map: () => import('./map.ts'),\n peek: () => import('./peek.ts'),\n};\n\nexport type { Command, Ctx } from './types.ts';\n"],"names":["COMMANDS","init","watch","status","check","rebuild","query","find","map","peek"],"mappings":";;;;+BAKaA;;;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAN,IAAMA,WAAgE;IAC3EC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,OAAO,SAAPA;eAAa;2DAAA,QAAO;;;IACpBC,QAAQ,SAARA;eAAc;2DAAA,QAAO;;;IACrBC,OAAO,SAAPA;eAAa;2DAAA,QAAO;;;IACpBC,SAAS,SAATA;eAAe;2DAAA,QAAO;;;IACtBC,OAAO,SAAPA;eAAa;2DAAA,QAAO;;;IACpBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,KAAK,SAALA;eAAW;2DAAA,QAAO;;;IAClBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;AACrB"}
@@ -12,7 +12,7 @@ var _outputts = require("../output.js");
12
12
  var _verbsts = require("../verbs.js");
13
13
  var _sharedts = require("./shared.js");
14
14
  var map = function map(ctx) {
15
- (0, _sharedts.withDb)(ctx, function(db, cfg) {
15
+ return (0, _sharedts.withDb)(ctx, function(db, cfg) {
16
16
  var result = (0, _verbsts.mapTree)(db, cfg);
17
17
  console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : (0, _outputts.renderMap)(result));
18
18
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/map.ts"],"sourcesContent":["import { renderMap } from '../output.ts';\nimport { mapTree } from '../verbs.ts';\nimport { withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst map: Command = (ctx) => {\n withDb(ctx, (db, cfg) => {\n const result = mapTree(db, cfg);\n console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderMap(result));\n });\n};\nexport default map;\n"],"names":["map","ctx","withDb","db","cfg","result","mapTree","console","log","format","JSON","stringify","renderMap"],"mappings":";;;;+BAWA;;;eAAA;;;wBAX0B;uBACF;wBACD;AAGvB,IAAMA,MAAe,aAACC;IACpBC,IAAAA,gBAAM,EAACD,KAAK,SAACE,IAAIC;QACf,IAAMC,SAASC,IAAAA,gBAAO,EAACH,IAAIC;QAC3BG,QAAQC,GAAG,CAACP,IAAIQ,MAAM,KAAK,SAASC,KAAKC,SAAS,CAACN,QAAQ,MAAM,KAAKO,IAAAA,mBAAS,EAACP;IAClF;AACF;IACA,WAAeL"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/map.ts"],"sourcesContent":["import { renderMap } from '../output.ts';\nimport { mapTree } from '../verbs.ts';\nimport { withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst map: Command = (ctx) =>\n withDb(ctx, (db, cfg) => {\n const result = mapTree(db, cfg);\n console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderMap(result));\n });\nexport default map;\n"],"names":["map","ctx","withDb","db","cfg","result","mapTree","console","log","format","JSON","stringify","renderMap"],"mappings":";;;;+BAUA;;;eAAA;;;wBAV0B;uBACF;wBACD;AAGvB,IAAMA,MAAe,aAACC;WACpBC,IAAAA,gBAAM,EAACD,KAAK,SAACE,IAAIC;QACf,IAAMC,SAASC,IAAAA,gBAAO,EAACH,IAAIC;QAC3BG,QAAQC,GAAG,CAACP,IAAIQ,MAAM,KAAK,SAASC,KAAKC,SAAS,CAACN,QAAQ,MAAM,KAAKO,IAAAA,mBAAS,EAACP;IAClF;;IACF,WAAeL"}
@@ -60,7 +60,7 @@ function _unsupported_iterable_to_array(o, minLen) {
60
60
  var peekCmd = function peekCmd(ctx) {
61
61
  var _ctx_rest = _sliced_to_array(ctx.rest, 1), pathArg = _ctx_rest[0];
62
62
  if (!pathArg) ctx.usageError("usage: ".concat(ctx.name, " peek <path>"));
63
- (0, _sharedts.withDb)(ctx, function(db, cfg) {
63
+ return (0, _sharedts.withDb)(ctx, function(db, cfg) {
64
64
  var result = (0, _verbsts.peek)(db, cfg, pathArg);
65
65
  console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : (0, _outputts.renderPeek)(result));
66
66
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/peek.ts"],"sourcesContent":["import { renderPeek } from '../output.ts';\nimport { peek } from '../verbs.ts';\nimport { withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst peekCmd: Command = (ctx) => {\n const [pathArg] = ctx.rest;\n if (!pathArg) ctx.usageError(`usage: ${ctx.name} peek <path>`);\n withDb(ctx, (db, cfg) => {\n const result = peek(db, cfg, pathArg);\n console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderPeek(result));\n });\n};\nexport default peekCmd;\n"],"names":["peekCmd","ctx","rest","pathArg","usageError","name","withDb","db","cfg","result","peek","console","log","format","JSON","stringify","renderPeek"],"mappings":";;;;+BAaA;;;eAAA;;;wBAb2B;uBACN;wBACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGvB,IAAMA,UAAmB,iBAACC;IACxB,IAAkBA,6BAAAA,IAAIC,IAAI,MAAnBC,UAAWF;IAClB,IAAI,CAACE,SAASF,IAAIG,UAAU,CAAC,AAAC,UAAkB,OAATH,IAAII,IAAI,EAAC;IAChDC,IAAAA,gBAAM,EAACL,KAAK,SAACM,IAAIC;QACf,IAAMC,SAASC,IAAAA,aAAI,EAACH,IAAIC,KAAKL;QAC7BQ,QAAQC,GAAG,CAACX,IAAIY,MAAM,KAAK,SAASC,KAAKC,SAAS,CAACN,QAAQ,MAAM,KAAKO,IAAAA,oBAAU,EAACP;IACnF;AACF;IACA,WAAeT"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/peek.ts"],"sourcesContent":["import { renderPeek } from '../output.ts';\nimport { peek } from '../verbs.ts';\nimport { withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst peekCmd: Command = (ctx) => {\n const [pathArg] = ctx.rest;\n if (!pathArg) ctx.usageError(`usage: ${ctx.name} peek <path>`);\n return withDb(ctx, (db, cfg) => {\n const result = peek(db, cfg, pathArg);\n console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderPeek(result));\n });\n};\nexport default peekCmd;\n"],"names":["peekCmd","ctx","rest","pathArg","usageError","name","withDb","db","cfg","result","peek","console","log","format","JSON","stringify","renderPeek"],"mappings":";;;;+BAaA;;;eAAA;;;wBAb2B;uBACN;wBACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGvB,IAAMA,UAAmB,iBAACC;IACxB,IAAkBA,6BAAAA,IAAIC,IAAI,MAAnBC,UAAWF;IAClB,IAAI,CAACE,SAASF,IAAIG,UAAU,CAAC,AAAC,UAAkB,OAATH,IAAII,IAAI,EAAC;IAChD,OAAOC,IAAAA,gBAAM,EAACL,KAAK,SAACM,IAAIC;QACtB,IAAMC,SAASC,IAAAA,aAAI,EAACH,IAAIC,KAAKL;QAC7BQ,QAAQC,GAAG,CAACX,IAAIY,MAAM,KAAK,SAASC,KAAKC,SAAS,CAACN,QAAQ,MAAM,KAAKO,IAAAA,oBAAU,EAACP;IACnF;AACF;IACA,WAAeT"}
@@ -2,5 +2,5 @@ import type { ResolvedConfig } from '../config.js';
2
2
  import type { OpenResult } from '../db.js';
3
3
  import type { Ctx } from './types.js';
4
4
  export declare function printWarnings(warnings: string[]): void;
5
- export declare function withDb(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void): void;
5
+ export declare function withDb(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void | Promise<void>): Promise<void>;
6
6
  export declare function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void;
@@ -2,5 +2,5 @@ import type { ResolvedConfig } from '../config.js';
2
2
  import type { OpenResult } from '../db.js';
3
3
  import type { Ctx } from './types.js';
4
4
  export declare function printWarnings(warnings: string[]): void;
5
- export declare function withDb(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void): void;
5
+ export declare function withDb(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void | Promise<void>): Promise<void>;
6
6
  export declare function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void;