sensemaking 0.9.1 → 0.9.2

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 (67) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/cli/check.js +34 -3
  3. package/dist/cjs/cli/check.js.map +1 -1
  4. package/dist/cjs/cli/index.d.cts +11 -0
  5. package/dist/cjs/cli/index.d.ts +11 -0
  6. package/dist/cjs/cli/index.js +22 -3
  7. package/dist/cjs/cli/index.js.map +1 -1
  8. package/dist/cjs/cli/init.js +3 -0
  9. package/dist/cjs/cli/init.js.map +1 -1
  10. package/dist/cjs/cli/map.js +33 -2
  11. package/dist/cjs/cli/map.js.map +1 -1
  12. package/dist/cjs/cli/named.d.cts +1 -1
  13. package/dist/cjs/cli/named.d.ts +1 -1
  14. package/dist/cjs/cli/named.js +46 -12
  15. package/dist/cjs/cli/named.js.map +1 -1
  16. package/dist/cjs/cli/peek.js +36 -4
  17. package/dist/cjs/cli/peek.js.map +1 -1
  18. package/dist/cjs/cli/query.js +35 -3
  19. package/dist/cjs/cli/query.js.map +1 -1
  20. package/dist/cjs/cli/rebuild.js +31 -1
  21. package/dist/cjs/cli/rebuild.js.map +1 -1
  22. package/dist/cjs/cli/search.js +42 -10
  23. package/dist/cjs/cli/search.js.map +1 -1
  24. package/dist/cjs/cli/shared.d.cts +13 -2
  25. package/dist/cjs/cli/shared.d.ts +13 -2
  26. package/dist/cjs/cli/shared.js +139 -7
  27. package/dist/cjs/cli/shared.js.map +1 -1
  28. package/dist/cjs/cli/status.js +5 -2
  29. package/dist/cjs/cli/status.js.map +1 -1
  30. package/dist/cjs/cli/types.d.cts +2 -12
  31. package/dist/cjs/cli/types.d.ts +2 -12
  32. package/dist/cjs/cli/watch.js +38 -2
  33. package/dist/cjs/cli/watch.js.map +1 -1
  34. package/dist/cjs/cli.js +113 -121
  35. package/dist/cjs/cli.js.map +1 -1
  36. package/dist/esm/cli/check.js +9 -3
  37. package/dist/esm/cli/check.js.map +1 -1
  38. package/dist/esm/cli/index.d.ts +11 -0
  39. package/dist/esm/cli/index.js +14 -0
  40. package/dist/esm/cli/index.js.map +1 -1
  41. package/dist/esm/cli/init.js +3 -0
  42. package/dist/esm/cli/init.js.map +1 -1
  43. package/dist/esm/cli/map.js +11 -3
  44. package/dist/esm/cli/map.js.map +1 -1
  45. package/dist/esm/cli/named.d.ts +1 -1
  46. package/dist/esm/cli/named.js +23 -13
  47. package/dist/esm/cli/named.js.map +1 -1
  48. package/dist/esm/cli/peek.js +12 -5
  49. package/dist/esm/cli/peek.js.map +1 -1
  50. package/dist/esm/cli/query.js +11 -4
  51. package/dist/esm/cli/query.js.map +1 -1
  52. package/dist/esm/cli/rebuild.js +6 -2
  53. package/dist/esm/cli/rebuild.js.map +1 -1
  54. package/dist/esm/cli/search.js +18 -10
  55. package/dist/esm/cli/search.js.map +1 -1
  56. package/dist/esm/cli/shared.d.ts +13 -2
  57. package/dist/esm/cli/shared.js +74 -7
  58. package/dist/esm/cli/shared.js.map +1 -1
  59. package/dist/esm/cli/status.js +9 -3
  60. package/dist/esm/cli/status.js.map +1 -1
  61. package/dist/esm/cli/types.d.ts +2 -12
  62. package/dist/esm/cli/types.js.map +1 -1
  63. package/dist/esm/cli/watch.js +11 -3
  64. package/dist/esm/cli/watch.js.map +1 -1
  65. package/dist/esm/cli.js +82 -95
  66. package/dist/esm/cli.js.map +1 -1
  67. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/named.ts"],"sourcesContent":["import { search } from '../commands.ts';\nimport { printRows } from '../output.ts';\nimport { parseK, runSql, withDb } from './shared.ts';\nimport type { Ctx } from './types.ts';\n\n// Fallback when the first positional is not a command: a named query from config, either a\n// SQL string (run as-is) or a saved search (run through the `search` command's own machinery).\nexport default async function named(ctx: Ctx, queryName: string, params: string[]): Promise<void> {\n const cfg = ctx.resolveConfig();\n const entry = cfg.queries[queryName];\n if (entry === undefined) {\n console.error(`unknown query: \"${queryName}\"`);\n console.error(`valid queries: ${Object.keys(cfg.queries).sort().join(', ')}`);\n process.exit(2);\n }\n\n if (typeof entry === 'string') {\n runSql(cfg, entry, params, ctx.format, `query \"${queryName}\"`);\n return;\n }\n if ('sql' in entry) {\n runSql(cfg, entry.sql, params, ctx.format, `query \"${queryName}\"`);\n return;\n }\n\n // A saved search's text is fixed in config; there is nowhere for a positional to bind.\n if (params.length > 0) {\n ctx.usageError(`\"${queryName}\" is a saved search and takes no positional parameters; edit its \"search\" in sense.config.json, or use \"${ctx.name} search\" directly`);\n }\n const k = parseK(ctx) ?? entry.k;\n const where = ctx.values.where ?? entry.where;\n const preset = ctx.values.preset ?? entry.preset;\n const include = ctx.values.include ?? entry.include;\n // --lexical upgrades a saved search's semantic behavior the same way --where/--k\n // override; absent means the saved value (the flag has no default false override).\n const semantic = ctx.values.lexical ? false : entry.semantic;\n await withDb(ctx, async (db, resolvedCfg) => printRows(await search(db, resolvedCfg, entry.search, { k, where, preset, include, semantic }), ctx.format));\n}\n"],"names":["search","printRows","parseK","runSql","withDb","named","ctx","queryName","params","cfg","resolveConfig","entry","queries","undefined","console","error","Object","keys","sort","join","process","exit","format","sql","length","usageError","name","k","where","values","preset","include","semantic","lexical","db","resolvedCfg"],"mappings":"AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,SAAS,QAAQ,eAAe;AACzC,SAASC,MAAM,EAAEC,MAAM,EAAEC,MAAM,QAAQ,cAAc;AAGrD,2FAA2F;AAC3F,+FAA+F;AAC/F,eAAe,eAAeC,MAAMC,GAAQ,EAAEC,SAAiB,EAAEC,MAAgB;QAsBrEN,SACII,mBACCA,oBACCA;IAxBhB,MAAMG,MAAMH,IAAII,aAAa;IAC7B,MAAMC,QAAQF,IAAIG,OAAO,CAACL,UAAU;IACpC,IAAII,UAAUE,WAAW;QACvBC,QAAQC,KAAK,CAAC,CAAC,gBAAgB,EAAER,UAAU,CAAC,CAAC;QAC7CO,QAAQC,KAAK,CAAC,CAAC,eAAe,EAAEC,OAAOC,IAAI,CAACR,IAAIG,OAAO,EAAEM,IAAI,GAAGC,IAAI,CAAC,OAAO;QAC5EC,QAAQC,IAAI,CAAC;IACf;IAEA,IAAI,OAAOV,UAAU,UAAU;QAC7BR,OAAOM,KAAKE,OAAOH,QAAQF,IAAIgB,MAAM,EAAE,CAAC,OAAO,EAAEf,UAAU,CAAC,CAAC;QAC7D;IACF;IACA,IAAI,SAASI,OAAO;QAClBR,OAAOM,KAAKE,MAAMY,GAAG,EAAEf,QAAQF,IAAIgB,MAAM,EAAE,CAAC,OAAO,EAAEf,UAAU,CAAC,CAAC;QACjE;IACF;IAEA,uFAAuF;IACvF,IAAIC,OAAOgB,MAAM,GAAG,GAAG;QACrBlB,IAAImB,UAAU,CAAC,CAAC,CAAC,EAAElB,UAAU,wGAAwG,EAAED,IAAIoB,IAAI,CAAC,iBAAiB,CAAC;IACpK;IACA,MAAMC,KAAIzB,UAAAA,OAAOI,kBAAPJ,qBAAAA,UAAeS,MAAMgB,CAAC;IAChC,MAAMC,SAAQtB,oBAAAA,IAAIuB,MAAM,CAACD,KAAK,cAAhBtB,+BAAAA,oBAAoBK,MAAMiB,KAAK;IAC7C,MAAME,UAASxB,qBAAAA,IAAIuB,MAAM,CAACC,MAAM,cAAjBxB,gCAAAA,qBAAqBK,MAAMmB,MAAM;IAChD,MAAMC,WAAUzB,sBAAAA,IAAIuB,MAAM,CAACE,OAAO,cAAlBzB,iCAAAA,sBAAsBK,MAAMoB,OAAO;IACnD,iFAAiF;IACjF,mFAAmF;IACnF,MAAMC,WAAW1B,IAAIuB,MAAM,CAACI,OAAO,GAAG,QAAQtB,MAAMqB,QAAQ;IAC5D,MAAM5B,OAAOE,KAAK,OAAO4B,IAAIC,cAAgBlC,UAAU,MAAMD,OAAOkC,IAAIC,aAAaxB,MAAMX,MAAM,EAAE;YAAE2B;YAAGC;YAAOE;YAAQC;YAASC;QAAS,IAAI1B,IAAIgB,MAAM;AACzJ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/named.ts"],"sourcesContent":["import { search } from '../commands.ts';\nimport { printRows } from '../output.ts';\nimport { CONFIG, FORMAT, formatOf, parse, parseK, runSql, SEARCH_FLAGS, withDb } from './shared.ts';\nimport type { Ctx } from './types.ts';\n\n// Fallback when the first positional is not a command: a named query from config, either a\n// SQL string (run as-is) or a saved search (run through the `search` command's own machinery).\n// Flags cover both shapes -- SEARCH_FLAGS override a saved search's fields the same way they\n// override a preset's.\nexport default async function named(ctx: Ctx, queryName: string): Promise<void> {\n const usage = `usage: ${ctx.name} ${queryName} [params...] [--format table|json] [--config path] [--where \"<sql>\"] [--k n] [--preset name] [--include glob ...] [--lexical]`;\n const { values, positionals: params } = parse(ctx.argv, usage, { ...SEARCH_FLAGS, ...FORMAT, ...CONFIG });\n const format = formatOf(values);\n const configPath = values.config as string | undefined;\n\n const cfg = ctx.resolveConfig(configPath);\n const entry = cfg.queries[queryName];\n if (entry === undefined) {\n console.error(`unknown query: \"${queryName}\"`);\n console.error(`valid queries: ${Object.keys(cfg.queries).sort().join(', ')}`);\n process.exit(2);\n }\n\n if (typeof entry === 'string') {\n runSql(cfg, entry, params, format, `query \"${queryName}\"`);\n return;\n }\n if ('sql' in entry) {\n runSql(cfg, entry.sql, params, format, `query \"${queryName}\"`);\n return;\n }\n\n // A saved search's text is fixed in config; there is nowhere for a positional to bind.\n if (params.length > 0) {\n ctx.usageError(`\"${queryName}\" is a saved search and takes no positional parameters; edit its \"search\" in sense.config.json, or use \"${ctx.name} search\" directly`);\n }\n const k = parseK(values.k as string | undefined, ctx.usageError) ?? entry.k;\n const where = (values.where as string | undefined) ?? entry.where;\n const preset = (values.preset as string | undefined) ?? entry.preset;\n const include = (values.include as string[] | undefined) ?? entry.include;\n // --lexical upgrades a saved search's semantic behavior the same way --where/--k\n // override; absent means the saved value (the flag has no default false override).\n const semantic = values.lexical ? false : entry.semantic;\n await withDb(ctx, configPath, async (db, resolvedCfg) => printRows(await search(db, resolvedCfg, entry.search, { k, where, preset, include, semantic }), format));\n}\n"],"names":["search","printRows","CONFIG","FORMAT","formatOf","parse","parseK","runSql","SEARCH_FLAGS","withDb","named","ctx","queryName","values","usage","name","positionals","params","argv","format","configPath","config","cfg","resolveConfig","entry","queries","undefined","console","error","Object","keys","sort","join","process","exit","sql","length","usageError","k","where","preset","include","semantic","lexical","db","resolvedCfg"],"mappings":"AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,SAAS,QAAQ,eAAe;AACzC,SAASC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAEC,YAAY,EAAEC,MAAM,QAAQ,cAAc;AAGpG,2FAA2F;AAC3F,+FAA+F;AAC/F,6FAA6F;AAC7F,uBAAuB;AACvB,eAAe,eAAeC,MAAMC,GAAQ,EAAEC,SAAiB;QA2BnDN,SACKO,eACCA,gBACCA;IA7BjB,MAAMC,QAAQ,CAAC,OAAO,EAAEH,IAAII,IAAI,CAAC,CAAC,EAAEH,UAAU,6HAA6H,CAAC;IAC5K,MAAM,EAAEC,MAAM,EAAEG,aAAaC,MAAM,EAAE,GAAGZ,MAAMM,IAAIO,IAAI,EAAEJ,OAAO;QAAE,GAAGN,YAAY;QAAE,GAAGL,MAAM;QAAE,GAAGD,MAAM;IAAC;IACvG,MAAMiB,SAASf,SAASS;IACxB,MAAMO,aAAaP,OAAOQ,MAAM;IAEhC,MAAMC,MAAMX,IAAIY,aAAa,CAACH;IAC9B,MAAMI,QAAQF,IAAIG,OAAO,CAACb,UAAU;IACpC,IAAIY,UAAUE,WAAW;QACvBC,QAAQC,KAAK,CAAC,CAAC,gBAAgB,EAAEhB,UAAU,CAAC,CAAC;QAC7Ce,QAAQC,KAAK,CAAC,CAAC,eAAe,EAAEC,OAAOC,IAAI,CAACR,IAAIG,OAAO,EAAEM,IAAI,GAAGC,IAAI,CAAC,OAAO;QAC5EC,QAAQC,IAAI,CAAC;IACf;IAEA,IAAI,OAAOV,UAAU,UAAU;QAC7BjB,OAAOe,KAAKE,OAAOP,QAAQE,QAAQ,CAAC,OAAO,EAAEP,UAAU,CAAC,CAAC;QACzD;IACF;IACA,IAAI,SAASY,OAAO;QAClBjB,OAAOe,KAAKE,MAAMW,GAAG,EAAElB,QAAQE,QAAQ,CAAC,OAAO,EAAEP,UAAU,CAAC,CAAC;QAC7D;IACF;IAEA,uFAAuF;IACvF,IAAIK,OAAOmB,MAAM,GAAG,GAAG;QACrBzB,IAAI0B,UAAU,CAAC,CAAC,CAAC,EAAEzB,UAAU,wGAAwG,EAAED,IAAII,IAAI,CAAC,iBAAiB,CAAC;IACpK;IACA,MAAMuB,KAAIhC,UAAAA,OAAOO,OAAOyB,CAAC,EAAwB3B,IAAI0B,UAAU,eAArD/B,qBAAAA,UAA0DkB,MAAMc,CAAC;IAC3E,MAAMC,SAAS1B,gBAAAA,OAAO0B,KAAK,cAAZ1B,2BAAAA,gBAAuCW,MAAMe,KAAK;IACjE,MAAMC,UAAU3B,iBAAAA,OAAO2B,MAAM,cAAb3B,4BAAAA,iBAAwCW,MAAMgB,MAAM;IACpE,MAAMC,WAAW5B,kBAAAA,OAAO4B,OAAO,cAAd5B,6BAAAA,kBAA2CW,MAAMiB,OAAO;IACzE,iFAAiF;IACjF,mFAAmF;IACnF,MAAMC,WAAW7B,OAAO8B,OAAO,GAAG,QAAQnB,MAAMkB,QAAQ;IACxD,MAAMjC,OAAOE,KAAKS,YAAY,OAAOwB,IAAIC,cAAgB5C,UAAU,MAAMD,OAAO4C,IAAIC,aAAarB,MAAMxB,MAAM,EAAE;YAAEsC;YAAGC;YAAOC;YAAQC;YAASC;QAAS,IAAIvB;AAC3J"}
@@ -1,12 +1,19 @@
1
1
  import { peek } from '../commands.js';
2
2
  import { renderPeek } from '../output.js';
3
- import { withDb } from './shared.js';
3
+ import { USAGE } from './index.js';
4
+ import { CONFIG, FORMAT, formatOf, parse, withDb } from './shared.js';
4
5
  const peekCmd = (ctx)=>{
5
- const [pathArg] = ctx.rest;
6
- if (!pathArg) ctx.usageError(`usage: ${ctx.name} peek <path>`);
7
- return withDb(ctx, (db, cfg)=>{
6
+ const usage = `usage: ${ctx.name} ${USAGE.peek}`;
7
+ const { values, positionals } = parse(ctx.argv, usage, {
8
+ ...FORMAT,
9
+ ...CONFIG
10
+ });
11
+ const [pathArg] = positionals;
12
+ if (!pathArg) ctx.usageError(usage);
13
+ const format = formatOf(values);
14
+ return withDb(ctx, values.config, (db, cfg)=>{
8
15
  const result = peek(db, cfg, pathArg);
9
- console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderPeek(result));
16
+ console.log(format === 'json' ? JSON.stringify(result, null, 2) : renderPeek(result));
10
17
  });
11
18
  };
12
19
  export default peekCmd;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/peek.ts"],"sourcesContent":["import { peek } from '../commands.ts';\nimport { renderPeek } from '../output.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":["peek","renderPeek","withDb","peekCmd","ctx","pathArg","rest","usageError","name","db","cfg","result","console","log","format","JSON","stringify"],"mappings":"AAAA,SAASA,IAAI,QAAQ,iBAAiB;AACtC,SAASC,UAAU,QAAQ,eAAe;AAC1C,SAASC,MAAM,QAAQ,cAAc;AAGrC,MAAMC,UAAmB,CAACC;IACxB,MAAM,CAACC,QAAQ,GAAGD,IAAIE,IAAI;IAC1B,IAAI,CAACD,SAASD,IAAIG,UAAU,CAAC,CAAC,OAAO,EAAEH,IAAII,IAAI,CAAC,YAAY,CAAC;IAC7D,OAAON,OAAOE,KAAK,CAACK,IAAIC;QACtB,MAAMC,SAASX,KAAKS,IAAIC,KAAKL;QAC7BO,QAAQC,GAAG,CAACT,IAAIU,MAAM,KAAK,SAASC,KAAKC,SAAS,CAACL,QAAQ,MAAM,KAAKV,WAAWU;IACnF;AACF;AACA,eAAeR,QAAQ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/peek.ts"],"sourcesContent":["import { peek } from '../commands.ts';\nimport { renderPeek } from '../output.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, FORMAT, formatOf, parse, withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst peekCmd: Command = (ctx) => {\n const usage = `usage: ${ctx.name} ${USAGE.peek}`;\n const { values, positionals } = parse(ctx.argv, usage, { ...FORMAT, ...CONFIG });\n const [pathArg] = positionals;\n if (!pathArg) ctx.usageError(usage);\n const format = formatOf(values);\n return withDb(ctx, values.config as string | undefined, (db, cfg) => {\n const result = peek(db, cfg, pathArg);\n console.log(format === 'json' ? JSON.stringify(result, null, 2) : renderPeek(result));\n });\n};\nexport default peekCmd;\n"],"names":["peek","renderPeek","USAGE","CONFIG","FORMAT","formatOf","parse","withDb","peekCmd","ctx","usage","name","values","positionals","argv","pathArg","usageError","format","config","db","cfg","result","console","log","JSON","stringify"],"mappings":"AAAA,SAASA,IAAI,QAAQ,iBAAiB;AACtC,SAASC,UAAU,QAAQ,eAAe;AAC1C,SAASC,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,MAAM,QAAQ,cAAc;AAGtE,MAAMC,UAAmB,CAACC;IACxB,MAAMC,QAAQ,CAAC,OAAO,EAAED,IAAIE,IAAI,CAAC,CAAC,EAAET,MAAMF,IAAI,EAAE;IAChD,MAAM,EAAEY,MAAM,EAAEC,WAAW,EAAE,GAAGP,MAAMG,IAAIK,IAAI,EAAEJ,OAAO;QAAE,GAAGN,MAAM;QAAE,GAAGD,MAAM;IAAC;IAC9E,MAAM,CAACY,QAAQ,GAAGF;IAClB,IAAI,CAACE,SAASN,IAAIO,UAAU,CAACN;IAC7B,MAAMO,SAASZ,SAASO;IACxB,OAAOL,OAAOE,KAAKG,OAAOM,MAAM,EAAwB,CAACC,IAAIC;QAC3D,MAAMC,SAASrB,KAAKmB,IAAIC,KAAKL;QAC7BO,QAAQC,GAAG,CAACN,WAAW,SAASO,KAAKC,SAAS,CAACJ,QAAQ,MAAM,KAAKpB,WAAWoB;IAC/E;AACF;AACA,eAAeb,QAAQ"}
@@ -1,7 +1,14 @@
1
- import { runSql } from './shared.js';
1
+ import { USAGE } from './index.js';
2
+ import { CONFIG, FORMAT, formatOf, parse, runSql } from './shared.js';
2
3
  const query = (ctx)=>{
3
- const [sql, ...params] = ctx.rest;
4
- if (!sql) ctx.usageError(`usage: ${ctx.name} query "<sql>" [params...]`);
5
- runSql(ctx.resolveConfig(), sql, params, ctx.format, 'ad-hoc query');
4
+ const usage = `usage: ${ctx.name} ${USAGE.query}`;
5
+ const { values, positionals } = parse(ctx.argv, usage, {
6
+ ...FORMAT,
7
+ ...CONFIG
8
+ });
9
+ const [sql, ...params] = positionals;
10
+ if (!sql) ctx.usageError(usage);
11
+ const format = formatOf(values);
12
+ runSql(ctx.resolveConfig(values.config), sql, params, format, 'ad-hoc query');
6
13
  };
7
14
  export default query;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/query.ts"],"sourcesContent":["import { runSql } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst query: Command = (ctx) => {\n const [sql, ...params] = ctx.rest;\n if (!sql) ctx.usageError(`usage: ${ctx.name} query \"<sql>\" [params...]`);\n runSql(ctx.resolveConfig(), sql, params, ctx.format, 'ad-hoc query');\n};\nexport default query;\n"],"names":["runSql","query","ctx","sql","params","rest","usageError","name","resolveConfig","format"],"mappings":"AAAA,SAASA,MAAM,QAAQ,cAAc;AAGrC,MAAMC,QAAiB,CAACC;IACtB,MAAM,CAACC,KAAK,GAAGC,OAAO,GAAGF,IAAIG,IAAI;IACjC,IAAI,CAACF,KAAKD,IAAII,UAAU,CAAC,CAAC,OAAO,EAAEJ,IAAIK,IAAI,CAAC,0BAA0B,CAAC;IACvEP,OAAOE,IAAIM,aAAa,IAAIL,KAAKC,QAAQF,IAAIO,MAAM,EAAE;AACvD;AACA,eAAeR,MAAM"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/query.ts"],"sourcesContent":["import { USAGE } from './index.ts';\nimport { CONFIG, FORMAT, formatOf, parse, runSql } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst query: Command = (ctx) => {\n const usage = `usage: ${ctx.name} ${USAGE.query}`;\n const { values, positionals } = parse(ctx.argv, usage, { ...FORMAT, ...CONFIG });\n const [sql, ...params] = positionals;\n if (!sql) ctx.usageError(usage);\n const format = formatOf(values);\n runSql(ctx.resolveConfig(values.config as string | undefined), sql, params, format, 'ad-hoc query');\n};\nexport default query;\n"],"names":["USAGE","CONFIG","FORMAT","formatOf","parse","runSql","query","ctx","usage","name","values","positionals","argv","sql","params","usageError","format","resolveConfig","config"],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,MAAM,QAAQ,cAAc;AAGtE,MAAMC,QAAiB,CAACC;IACtB,MAAMC,QAAQ,CAAC,OAAO,EAAED,IAAIE,IAAI,CAAC,CAAC,EAAET,MAAMM,KAAK,EAAE;IACjD,MAAM,EAAEI,MAAM,EAAEC,WAAW,EAAE,GAAGP,MAAMG,IAAIK,IAAI,EAAEJ,OAAO;QAAE,GAAGN,MAAM;QAAE,GAAGD,MAAM;IAAC;IAC9E,MAAM,CAACY,KAAK,GAAGC,OAAO,GAAGH;IACzB,IAAI,CAACE,KAAKN,IAAIQ,UAAU,CAACP;IACzB,MAAMQ,SAASb,SAASO;IACxBL,OAAOE,IAAIU,aAAa,CAACP,OAAOQ,MAAM,GAAyBL,KAAKC,QAAQE,QAAQ;AACtF;AACA,eAAeV,MAAM"}
@@ -1,7 +1,11 @@
1
1
  import { docCount, rebuild } from '../db.js';
2
- import { printWarnings } from './shared.js';
2
+ import { USAGE } from './index.js';
3
+ import { CONFIG, parse, printWarnings } from './shared.js';
3
4
  const rebuildCmd = (ctx)=>{
4
- const result = rebuild(ctx.resolveConfig());
5
+ const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.rebuild}`, {
6
+ ...CONFIG
7
+ });
8
+ const result = rebuild(ctx.resolveConfig(values.config));
5
9
  printWarnings(result.warnings);
6
10
  console.log(`rebuilt: ${docCount(result.db)} docs`);
7
11
  result.db.close();
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/rebuild.ts"],"sourcesContent":["import { docCount, rebuild } from '../db.ts';\nimport { printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst rebuildCmd: Command = (ctx) => {\n const result = rebuild(ctx.resolveConfig());\n printWarnings(result.warnings);\n console.log(`rebuilt: ${docCount(result.db)} docs`);\n result.db.close();\n};\nexport default rebuildCmd;\n"],"names":["docCount","rebuild","printWarnings","rebuildCmd","ctx","result","resolveConfig","warnings","console","log","db","close"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,OAAO,QAAQ,WAAW;AAC7C,SAASC,aAAa,QAAQ,cAAc;AAG5C,MAAMC,aAAsB,CAACC;IAC3B,MAAMC,SAASJ,QAAQG,IAAIE,aAAa;IACxCJ,cAAcG,OAAOE,QAAQ;IAC7BC,QAAQC,GAAG,CAAC,CAAC,SAAS,EAAET,SAASK,OAAOK,EAAE,EAAE,KAAK,CAAC;IAClDL,OAAOK,EAAE,CAACC,KAAK;AACjB;AACA,eAAeR,WAAW"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/rebuild.ts"],"sourcesContent":["import { docCount, rebuild } from '../db.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, parse, printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst rebuildCmd: Command = (ctx) => {\n const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.rebuild}`, { ...CONFIG });\n const result = rebuild(ctx.resolveConfig(values.config as string | undefined));\n printWarnings(result.warnings);\n console.log(`rebuilt: ${docCount(result.db)} docs`);\n result.db.close();\n};\nexport default rebuildCmd;\n"],"names":["docCount","rebuild","USAGE","CONFIG","parse","printWarnings","rebuildCmd","ctx","values","argv","name","result","resolveConfig","config","warnings","console","log","db","close"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,OAAO,QAAQ,WAAW;AAC7C,SAASC,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,EAAEC,KAAK,EAAEC,aAAa,QAAQ,cAAc;AAG3D,MAAMC,aAAsB,CAACC;IAC3B,MAAM,EAAEC,MAAM,EAAE,GAAGJ,MAAMG,IAAIE,IAAI,EAAE,CAAC,OAAO,EAAEF,IAAIG,IAAI,CAAC,CAAC,EAAER,MAAMD,OAAO,EAAE,EAAE;QAAE,GAAGE,MAAM;IAAC;IACtF,MAAMQ,SAASV,QAAQM,IAAIK,aAAa,CAACJ,OAAOK,MAAM;IACtDR,cAAcM,OAAOG,QAAQ;IAC7BC,QAAQC,GAAG,CAAC,CAAC,SAAS,EAAEhB,SAASW,OAAOM,EAAE,EAAE,KAAK,CAAC;IAClDN,OAAOM,EAAE,CAACC,KAAK;AACjB;AACA,eAAeZ,WAAW"}
@@ -1,16 +1,24 @@
1
1
  import { search } from '../commands.js';
2
2
  import { printRows } from '../output.js';
3
- import { parseK, withDb } from './shared.js';
3
+ import { USAGE } from './index.js';
4
+ import { CONFIG, FORMAT, formatOf, parse, parseK, SEARCH_FLAGS, withDb } from './shared.js';
4
5
  const searchCmd = async (ctx)=>{
5
- const [terms] = ctx.rest;
6
- if (!terms) ctx.usageError(`usage: ${ctx.name} search "<terms>" [--preset name] [--include glob ...] [--where "<sql>"] [--k n] [--lexical]`);
7
- const k = parseK(ctx);
8
- await withDb(ctx, async (db, cfg)=>printRows(await search(db, cfg, terms, {
6
+ const usage = `usage: ${ctx.name} ${USAGE.search}`;
7
+ const { values, positionals } = parse(ctx.argv, usage, {
8
+ ...SEARCH_FLAGS,
9
+ ...FORMAT,
10
+ ...CONFIG
11
+ });
12
+ const [terms] = positionals;
13
+ if (!terms) ctx.usageError(usage);
14
+ const k = parseK(values.k, ctx.usageError);
15
+ const format = formatOf(values);
16
+ await withDb(ctx, values.config, async (db, cfg)=>printRows(await search(db, cfg, terms, {
9
17
  k,
10
- where: ctx.values.where,
11
- preset: ctx.values.preset,
12
- include: ctx.values.include,
13
- semantic: ctx.values.lexical ? false : undefined
14
- }), ctx.format));
18
+ where: values.where,
19
+ preset: values.preset,
20
+ include: values.include,
21
+ semantic: values.lexical ? false : undefined
22
+ }), format));
15
23
  };
16
24
  export default searchCmd;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/search.ts"],"sourcesContent":["import { search } from '../commands.ts';\nimport { printRows } from '../output.ts';\nimport { parseK, withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst searchCmd: Command = async (ctx) => {\n const [terms] = ctx.rest;\n if (!terms) ctx.usageError(`usage: ${ctx.name} search \"<terms>\" [--preset name] [--include glob ...] [--where \"<sql>\"] [--k n] [--lexical]`);\n const k = parseK(ctx);\n await withDb(ctx, async (db, cfg) => printRows(await search(db, cfg, terms, { k, where: ctx.values.where, preset: ctx.values.preset, include: ctx.values.include, semantic: ctx.values.lexical ? false : undefined }), ctx.format));\n};\nexport default searchCmd;\n"],"names":["search","printRows","parseK","withDb","searchCmd","ctx","terms","rest","usageError","name","k","db","cfg","where","values","preset","include","semantic","lexical","undefined","format"],"mappings":"AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,SAAS,QAAQ,eAAe;AACzC,SAASC,MAAM,EAAEC,MAAM,QAAQ,cAAc;AAG7C,MAAMC,YAAqB,OAAOC;IAChC,MAAM,CAACC,MAAM,GAAGD,IAAIE,IAAI;IACxB,IAAI,CAACD,OAAOD,IAAIG,UAAU,CAAC,CAAC,OAAO,EAAEH,IAAII,IAAI,CAAC,4FAA4F,CAAC;IAC3I,MAAMC,IAAIR,OAAOG;IACjB,MAAMF,OAAOE,KAAK,OAAOM,IAAIC,MAAQX,UAAU,MAAMD,OAAOW,IAAIC,KAAKN,OAAO;YAAEI;YAAGG,OAAOR,IAAIS,MAAM,CAACD,KAAK;YAAEE,QAAQV,IAAIS,MAAM,CAACC,MAAM;YAAEC,SAASX,IAAIS,MAAM,CAACE,OAAO;YAAEC,UAAUZ,IAAIS,MAAM,CAACI,OAAO,GAAG,QAAQC;QAAU,IAAId,IAAIe,MAAM;AACnO;AACA,eAAehB,UAAU"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/search.ts"],"sourcesContent":["import { search } from '../commands.ts';\nimport { printRows } from '../output.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, FORMAT, formatOf, parse, parseK, SEARCH_FLAGS, withDb } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst searchCmd: Command = async (ctx) => {\n const usage = `usage: ${ctx.name} ${USAGE.search}`;\n const { values, positionals } = parse(ctx.argv, usage, { ...SEARCH_FLAGS, ...FORMAT, ...CONFIG });\n const [terms] = positionals;\n if (!terms) ctx.usageError(usage);\n const k = parseK(values.k as string | undefined, ctx.usageError);\n const format = formatOf(values);\n await withDb(ctx, values.config as string | undefined, async (db, cfg) => printRows(await search(db, cfg, terms, { k, where: values.where as string | undefined, preset: values.preset as string | undefined, include: values.include as string[] | undefined, semantic: values.lexical ? false : undefined }), format));\n};\nexport default searchCmd;\n"],"names":["search","printRows","USAGE","CONFIG","FORMAT","formatOf","parse","parseK","SEARCH_FLAGS","withDb","searchCmd","ctx","usage","name","values","positionals","argv","terms","usageError","k","format","config","db","cfg","where","preset","include","semantic","lexical","undefined"],"mappings":"AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,SAAS,QAAQ,eAAe;AACzC,SAASC,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,MAAM,EAAEC,YAAY,EAAEC,MAAM,QAAQ,cAAc;AAG5F,MAAMC,YAAqB,OAAOC;IAChC,MAAMC,QAAQ,CAAC,OAAO,EAAED,IAAIE,IAAI,CAAC,CAAC,EAAEX,MAAMF,MAAM,EAAE;IAClD,MAAM,EAAEc,MAAM,EAAEC,WAAW,EAAE,GAAGT,MAAMK,IAAIK,IAAI,EAAEJ,OAAO;QAAE,GAAGJ,YAAY;QAAE,GAAGJ,MAAM;QAAE,GAAGD,MAAM;IAAC;IAC/F,MAAM,CAACc,MAAM,GAAGF;IAChB,IAAI,CAACE,OAAON,IAAIO,UAAU,CAACN;IAC3B,MAAMO,IAAIZ,OAAOO,OAAOK,CAAC,EAAwBR,IAAIO,UAAU;IAC/D,MAAME,SAASf,SAASS;IACxB,MAAML,OAAOE,KAAKG,OAAOO,MAAM,EAAwB,OAAOC,IAAIC,MAAQtB,UAAU,MAAMD,OAAOsB,IAAIC,KAAKN,OAAO;YAAEE;YAAGK,OAAOV,OAAOU,KAAK;YAAwBC,QAAQX,OAAOW,MAAM;YAAwBC,SAASZ,OAAOY,OAAO;YAA0BC,UAAUb,OAAOc,OAAO,GAAG,QAAQC;QAAU,IAAIT;AAClT;AACA,eAAeV,UAAU"}
@@ -1,7 +1,18 @@
1
+ import type { ParseArgsOptionsConfig } from 'node:util';
1
2
  import type { ResolvedConfig } from '../config.js';
2
3
  import type { OpenResult } from '../db.js';
3
4
  import type { Ctx } from './types.js';
4
- export declare function parseK(ctx: Ctx): number | undefined;
5
+ export declare const FORMAT: ParseArgsOptionsConfig;
6
+ export declare const CONFIG: ParseArgsOptionsConfig;
7
+ export declare const SEARCH_FLAGS: ParseArgsOptionsConfig;
8
+ type Values = Record<string, string | boolean | string[] | undefined>;
9
+ export declare function formatOf(values: Values): 'table' | 'json';
10
+ export declare function parse(argv: string[], usage: string, options: ParseArgsOptionsConfig): {
11
+ values: Values;
12
+ positionals: string[];
13
+ };
14
+ export declare function parseK(k: string | undefined, usageError: (message: string) => never): number | undefined;
5
15
  export declare function printWarnings(warnings: string[]): void;
6
- export declare function withDb(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void | Promise<void>): Promise<void>;
16
+ export declare function withDb(ctx: Ctx, configPath: string | undefined, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void | Promise<void>): Promise<void>;
7
17
  export declare function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void;
18
+ export {};
@@ -1,21 +1,88 @@
1
+ import { parseArgs } from 'node:util';
1
2
  import { open } from '../db.js';
2
3
  import { printRows } from '../output.js';
3
4
  import { searchError } from '../search-error.js';
5
+ // Spreadable option fragments -- one flag name keeps one meaning across every command's table.
6
+ export const FORMAT = {
7
+ format: {
8
+ type: 'string',
9
+ default: 'table'
10
+ }
11
+ };
12
+ export const CONFIG = {
13
+ config: {
14
+ type: 'string'
15
+ }
16
+ };
17
+ export const SEARCH_FLAGS = {
18
+ where: {
19
+ type: 'string'
20
+ },
21
+ k: {
22
+ type: 'string'
23
+ },
24
+ preset: {
25
+ type: 'string'
26
+ },
27
+ include: {
28
+ type: 'string',
29
+ multiple: true
30
+ },
31
+ lexical: {
32
+ type: 'boolean',
33
+ default: false
34
+ }
35
+ };
36
+ export function formatOf(values) {
37
+ return values.format === 'json' ? 'json' : 'table';
38
+ }
39
+ // Per-command parseArgs: strict (a foreign flag exits 2), and every table gets --help for free.
40
+ export function parse(argv, usage, options) {
41
+ let values;
42
+ let positionals;
43
+ try {
44
+ ({ values, positionals } = parseArgs({
45
+ args: argv,
46
+ options: {
47
+ ...options,
48
+ help: {
49
+ type: 'boolean',
50
+ default: false,
51
+ short: 'h'
52
+ }
53
+ },
54
+ strict: true,
55
+ allowPositionals: true
56
+ }));
57
+ } catch (err) {
58
+ console.error(err.message);
59
+ console.error(usage);
60
+ process.exit(2);
61
+ }
62
+ if (values.help) {
63
+ console.log(usage);
64
+ process.exit(0);
65
+ }
66
+ return {
67
+ values,
68
+ positionals
69
+ };
70
+ }
4
71
  // --k must be a positive integer: SQLite reads a bound LIMIT of -1 as "unlimited" and 0 as
5
72
  // "nothing", and parseInt would silently truncate "5.9" -- all three are caller mistakes
6
73
  // worth a usage error, matching the config-level SavedSearch validation.
7
- export function parseK(ctx) {
8
- if (ctx.values.k === undefined) return undefined;
9
- const k = Number(ctx.values.k);
10
- if (!Number.isInteger(k) || k <= 0) ctx.usageError(`--k expects a positive integer, got "${ctx.values.k}"`);
11
- return k;
74
+ export function parseK(k, usageError) {
75
+ if (k === undefined) return undefined;
76
+ const parsed = Number(k);
77
+ if (!Number.isInteger(parsed) || parsed <= 0) usageError(`--k expects a positive integer, got "${k}"`);
78
+ return parsed;
12
79
  }
13
80
  // Shared open-query-close envelope for commands that touch the tree.
14
81
  export function printWarnings(warnings) {
15
82
  for (const w of warnings)console.warn(w);
16
83
  }
17
- export async function withDb(ctx, fn) {
18
- const cfg = ctx.resolveConfig();
84
+ export async function withDb(ctx, configPath, fn) {
85
+ const cfg = ctx.resolveConfig(configPath);
19
86
  const { db, warnings } = open(cfg);
20
87
  printWarnings(warnings);
21
88
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/shared.ts"],"sourcesContent":["import type { ResolvedConfig } from '../config.ts';\nimport type { OpenResult } from '../db.ts';\nimport { open } from '../db.ts';\nimport type { Row } from '../output.ts';\nimport { printRows } from '../output.ts';\nimport { searchError } from '../search-error.ts';\nimport type { Ctx } from './types.ts';\n\n// --k must be a positive integer: SQLite reads a bound LIMIT of -1 as \"unlimited\" and 0 as\n// \"nothing\", and parseInt would silently truncate \"5.9\" -- all three are caller mistakes\n// worth a usage error, matching the config-level SavedSearch validation.\nexport function parseK(ctx: Ctx): number | undefined {\n if (ctx.values.k === undefined) return undefined;\n const k = Number(ctx.values.k);\n if (!Number.isInteger(k) || k <= 0) ctx.usageError(`--k expects a positive integer, got \"${ctx.values.k}\"`);\n return k;\n}\n\n// Shared open-query-close envelope for commands that touch the tree.\n\nexport function printWarnings(warnings: string[]): void {\n for (const w of warnings) console.warn(w);\n}\n\nexport async function withDb(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void | Promise<void>): Promise<void> {\n const cfg = ctx.resolveConfig();\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n try {\n await fn(db, cfg);\n } finally {\n db.close();\n }\n}\n\n// An unbound `?` silently binds NULL, so mismatched param counts fail loudly instead.\nexport function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void {\n const placeholderCount = (sql.match(/\\?/g) ?? []).length;\n if (params.length !== placeholderCount) {\n console.error(`${label} expects ${placeholderCount} parameter(s), got ${params.length}`);\n process.exit(2);\n }\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n let rows: Row[];\n try {\n rows = db.prepare(sql).all(...params) as Row[];\n } catch (err) {\n db.close();\n // A saved query or ad-hoc SQL can carry `content MATCH ?` too, so the same FTS5\n // punctuation trap applies -- the bound parameters are the search terms there. SQL\n // without MATCH gets its error verbatim; search advice on a plain typo would mislead.\n if (/\\bMATCH\\b/i.test(sql)) throw searchError(err as Error, params.join(' '));\n throw err;\n }\n printRows(rows, format);\n db.close();\n}\n"],"names":["open","printRows","searchError","parseK","ctx","values","k","undefined","Number","isInteger","usageError","printWarnings","warnings","w","console","warn","withDb","fn","cfg","resolveConfig","db","close","runSql","sql","params","format","label","placeholderCount","match","length","error","process","exit","rows","prepare","all","err","test","join"],"mappings":"AAEA,SAASA,IAAI,QAAQ,WAAW;AAEhC,SAASC,SAAS,QAAQ,eAAe;AACzC,SAASC,WAAW,QAAQ,qBAAqB;AAGjD,2FAA2F;AAC3F,yFAAyF;AACzF,yEAAyE;AACzE,OAAO,SAASC,OAAOC,GAAQ;IAC7B,IAAIA,IAAIC,MAAM,CAACC,CAAC,KAAKC,WAAW,OAAOA;IACvC,MAAMD,IAAIE,OAAOJ,IAAIC,MAAM,CAACC,CAAC;IAC7B,IAAI,CAACE,OAAOC,SAAS,CAACH,MAAMA,KAAK,GAAGF,IAAIM,UAAU,CAAC,CAAC,qCAAqC,EAAEN,IAAIC,MAAM,CAACC,CAAC,CAAC,CAAC,CAAC;IAC1G,OAAOA;AACT;AAEA,qEAAqE;AAErE,OAAO,SAASK,cAAcC,QAAkB;IAC9C,KAAK,MAAMC,KAAKD,SAAUE,QAAQC,IAAI,CAACF;AACzC;AAEA,OAAO,eAAeG,OAAOZ,GAAQ,EAAEa,EAAuE;IAC5G,MAAMC,MAAMd,IAAIe,aAAa;IAC7B,MAAM,EAAEC,EAAE,EAAER,QAAQ,EAAE,GAAGZ,KAAKkB;IAC9BP,cAAcC;IACd,IAAI;QACF,MAAMK,GAAGG,IAAIF;IACf,SAAU;QACRE,GAAGC,KAAK;IACV;AACF;AAEA,sFAAsF;AACtF,OAAO,SAASC,OAAOJ,GAAmB,EAAEK,GAAW,EAAEC,MAAgB,EAAEC,MAAwB,EAAEC,KAAa;QACtFH;IAA1B,MAAMI,mBAAmB,EAACJ,aAAAA,IAAIK,KAAK,CAAC,oBAAVL,wBAAAA,aAAoB,EAAE,EAAEM,MAAM;IACxD,IAAIL,OAAOK,MAAM,KAAKF,kBAAkB;QACtCb,QAAQgB,KAAK,CAAC,GAAGJ,MAAM,SAAS,EAAEC,iBAAiB,mBAAmB,EAAEH,OAAOK,MAAM,EAAE;QACvFE,QAAQC,IAAI,CAAC;IACf;IACA,MAAM,EAAEZ,EAAE,EAAER,QAAQ,EAAE,GAAGZ,KAAKkB;IAC9BP,cAAcC;IACd,IAAIqB;IACJ,IAAI;QACFA,OAAOb,GAAGc,OAAO,CAACX,KAAKY,GAAG,IAAIX;IAChC,EAAE,OAAOY,KAAK;QACZhB,GAAGC,KAAK;QACR,gFAAgF;QAChF,mFAAmF;QACnF,sFAAsF;QACtF,IAAI,aAAagB,IAAI,CAACd,MAAM,MAAMrB,YAAYkC,KAAcZ,OAAOc,IAAI,CAAC;QACxE,MAAMF;IACR;IACAnC,UAAUgC,MAAMR;IAChBL,GAAGC,KAAK;AACV"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/shared.ts"],"sourcesContent":["import type { ParseArgsOptionsConfig } from 'node:util';\nimport { parseArgs } from 'node:util';\nimport type { ResolvedConfig } from '../config.ts';\nimport type { OpenResult } from '../db.ts';\nimport { open } from '../db.ts';\nimport type { Row } from '../output.ts';\nimport { printRows } from '../output.ts';\nimport { searchError } from '../search-error.ts';\nimport type { Ctx } from './types.ts';\n\n// Spreadable option fragments -- one flag name keeps one meaning across every command's table.\nexport const FORMAT: ParseArgsOptionsConfig = { format: { type: 'string', default: 'table' } };\nexport const CONFIG: ParseArgsOptionsConfig = { config: { type: 'string' } };\nexport const SEARCH_FLAGS: ParseArgsOptionsConfig = {\n where: { type: 'string' },\n k: { type: 'string' },\n preset: { type: 'string' },\n include: { type: 'string', multiple: true },\n lexical: { type: 'boolean', default: false },\n};\n\ntype Values = Record<string, string | boolean | string[] | undefined>;\n\nexport function formatOf(values: Values): 'table' | 'json' {\n return values.format === 'json' ? 'json' : 'table';\n}\n\n// Per-command parseArgs: strict (a foreign flag exits 2), and every table gets --help for free.\nexport function parse(argv: string[], usage: string, options: ParseArgsOptionsConfig): { values: Values; positionals: string[] } {\n let values: Values;\n let positionals: string[];\n try {\n ({ values, positionals } = parseArgs({\n args: argv,\n options: { ...options, help: { type: 'boolean', default: false, short: 'h' } },\n strict: true,\n allowPositionals: true,\n }));\n } catch (err) {\n console.error((err as Error).message);\n console.error(usage);\n process.exit(2);\n }\n if (values.help) {\n console.log(usage);\n process.exit(0);\n }\n return { values, positionals };\n}\n\n// --k must be a positive integer: SQLite reads a bound LIMIT of -1 as \"unlimited\" and 0 as\n// \"nothing\", and parseInt would silently truncate \"5.9\" -- all three are caller mistakes\n// worth a usage error, matching the config-level SavedSearch validation.\nexport function parseK(k: string | undefined, usageError: (message: string) => never): number | undefined {\n if (k === undefined) return undefined;\n const parsed = Number(k);\n if (!Number.isInteger(parsed) || parsed <= 0) usageError(`--k expects a positive integer, got \"${k}\"`);\n return parsed;\n}\n\n// Shared open-query-close envelope for commands that touch the tree.\n\nexport function printWarnings(warnings: string[]): void {\n for (const w of warnings) console.warn(w);\n}\n\nexport async function withDb(ctx: Ctx, configPath: string | undefined, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void | Promise<void>): Promise<void> {\n const cfg = ctx.resolveConfig(configPath);\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n try {\n await fn(db, cfg);\n } finally {\n db.close();\n }\n}\n\n// An unbound `?` silently binds NULL, so mismatched param counts fail loudly instead.\nexport function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void {\n const placeholderCount = (sql.match(/\\?/g) ?? []).length;\n if (params.length !== placeholderCount) {\n console.error(`${label} expects ${placeholderCount} parameter(s), got ${params.length}`);\n process.exit(2);\n }\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n let rows: Row[];\n try {\n rows = db.prepare(sql).all(...params) as Row[];\n } catch (err) {\n db.close();\n // A saved query or ad-hoc SQL can carry `content MATCH ?` too, so the same FTS5\n // punctuation trap applies -- the bound parameters are the search terms there. SQL\n // without MATCH gets its error verbatim; search advice on a plain typo would mislead.\n if (/\\bMATCH\\b/i.test(sql)) throw searchError(err as Error, params.join(' '));\n throw err;\n }\n printRows(rows, format);\n db.close();\n}\n"],"names":["parseArgs","open","printRows","searchError","FORMAT","format","type","default","CONFIG","config","SEARCH_FLAGS","where","k","preset","include","multiple","lexical","formatOf","values","parse","argv","usage","options","positionals","args","help","short","strict","allowPositionals","err","console","error","message","process","exit","log","parseK","usageError","undefined","parsed","Number","isInteger","printWarnings","warnings","w","warn","withDb","ctx","configPath","fn","cfg","resolveConfig","db","close","runSql","sql","params","label","placeholderCount","match","length","rows","prepare","all","test","join"],"mappings":"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"}
@@ -2,7 +2,8 @@ import { presetCoverage } from '../commands.js';
2
2
  import { embedConfig, featureStates } from '../config.js';
3
3
  import { docCount, getMeta, open } from '../db.js';
4
4
  import { featuresLine, presetsLines } from '../output.js';
5
- import { printWarnings } from './shared.js';
5
+ import { USAGE } from './index.js';
6
+ import { CONFIG, FORMAT, formatOf, parse, printWarnings } from './shared.js';
6
7
  // Vectors are computed on the first semantic query, not at reconcile, so a tree can have a
7
8
  // semantic-on preset with nothing embedded yet -- reported here because a fast `rebuild` on
8
9
  // such a tree otherwise reads as "the feature isn't on".
@@ -15,7 +16,12 @@ function vectorState(db) {
15
16
  }
16
17
  }
17
18
  const status = (ctx)=>{
18
- const cfg = ctx.resolveConfig();
19
+ const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.status}`, {
20
+ ...FORMAT,
21
+ ...CONFIG
22
+ });
23
+ const format = formatOf(values);
24
+ const cfg = ctx.resolveConfig(values.config);
19
25
  const { db, dbPath, warnings } = open(cfg);
20
26
  printWarnings(warnings);
21
27
  const features = featureStates(cfg);
@@ -41,7 +47,7 @@ const status = (ctx)=>{
41
47
  watcherHeartbeatSecondsAgo: heartbeat ? Math.round((Date.now() - Date.parse(heartbeat)) / 1000) : null,
42
48
  busyTimeoutMs
43
49
  };
44
- if (ctx.format === 'json') {
50
+ if (format === 'json') {
45
51
  console.log(JSON.stringify(result, null, 2));
46
52
  } else {
47
53
  console.log(`db: ${result.db}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/status.ts"],"sourcesContent":["import { presetCoverage } from '../commands.ts';\nimport { embedConfig, featureStates } from '../config.ts';\nimport { docCount, getMeta, open } from '../db.ts';\nimport { featuresLine, presetsLines } from '../output.ts';\nimport { printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\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 `rebuild` 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\nconst status: Command = (ctx) => {\n const cfg = ctx.resolveConfig();\n const { db, dbPath, warnings } = open(cfg);\n printWarnings(warnings);\n\n const features = featureStates(cfg);\n const e = embedConfig(cfg);\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 const result = {\n db: dbPath,\n docs: docCount(db),\n features: features.on,\n featuresOff: features.off,\n embed: e ? { type: e.type, model: e.model, ...(vectors ?? {}) } : null,\n presets,\n watcherHeartbeatSecondsAgo: heartbeat ? Math.round((Date.now() - Date.parse(heartbeat)) / 1000) : null,\n busyTimeoutMs,\n };\n\n if (ctx.format === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`db: ${result.db}`);\n console.log(`docs: ${result.docs}`);\n console.log(featuresLine(features));\n if (e) console.log(`embed: ${e.type} ${e.model}${vectors ? ` (vectors: ${vectors.embedded} embedded, ${vectors.pending} pending — embedded on the first semantic search)` : ''}`);\n for (const line of presetsLines(presets)) console.log(line);\n console.log(result.watcherHeartbeatSecondsAgo === null ? 'watcher: no watcher' : `watcher: last heartbeat ${result.watcherHeartbeatSecondsAgo}s ago`);\n console.log(`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":["presetCoverage","embedConfig","featureStates","docCount","getMeta","open","featuresLine","presetsLines","printWarnings","vectorState","db","row","prepare","get","status","ctx","cfg","resolveConfig","dbPath","warnings","features","e","vectors","presets","heartbeat","busyTimeoutMs","timeout","result","docs","on","featuresOff","off","embed","type","model","watcherHeartbeatSecondsAgo","Math","round","Date","now","parse","format","console","log","JSON","stringify","embedded","pending","line","close"],"mappings":"AAAA,SAASA,cAAc,QAAQ,iBAAiB;AAChD,SAASC,WAAW,EAAEC,aAAa,QAAQ,eAAe;AAC1D,SAASC,QAAQ,EAAEC,OAAO,EAAEC,IAAI,QAAQ,WAAW;AACnD,SAASC,YAAY,EAAEC,YAAY,QAAQ,eAAe;AAC1D,SAASC,aAAa,QAAQ,cAAc;AAG5C,2FAA2F;AAC3F,4FAA4F;AAC5F,yDAAyD;AACzD,SAASC,YAAYC,EAAiC;IACpD,IAAI;QACF,MAAMC,MAAMD,GAAGE,OAAO,CAAC,yFAAyFC,GAAG;QACnH,OAAOF;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,MAAMG,SAAkB,CAACC;IACvB,MAAMC,MAAMD,IAAIE,aAAa;IAC7B,MAAM,EAAEP,EAAE,EAAEQ,MAAM,EAAEC,QAAQ,EAAE,GAAGd,KAAKW;IACtCR,cAAcW;IAEd,MAAMC,WAAWlB,cAAcc;IAC/B,MAAMK,IAAIpB,YAAYe;IACtB,MAAMM,UAAUD,IAAIZ,YAAYC,MAAM;IACtC,MAAMa,UAAUvB,eAAeU,IAAIM;IACnC,MAAMQ,YAAYpB,QAAQM,IAAI;IAC9B,qFAAqF;IACrF,+EAA+E;IAC/E,oEAAoE;IACpE,MAAMe,gBAAgB,AAACf,GAAGE,OAAO,CAAC,uBAAuBC,GAAG,GAA2Ba,OAAO;IAC9F,MAAMC,SAAS;QACbjB,IAAIQ;QACJU,MAAMzB,SAASO;QACfU,UAAUA,SAASS,EAAE;QACrBC,aAAaV,SAASW,GAAG;QACzBC,OAAOX,IAAI;YAAEY,MAAMZ,EAAEY,IAAI;YAAEC,OAAOb,EAAEa,KAAK;eAAMZ,oBAAAA,qBAAAA,UAAW,CAAC,CAAhB;QAAmB,IAAI;QAClEC;QACAY,4BAA4BX,YAAYY,KAAKC,KAAK,CAAC,AAACC,CAAAA,KAAKC,GAAG,KAAKD,KAAKE,KAAK,CAAChB,UAAS,IAAK,QAAQ;QAClGC;IACF;IAEA,IAAIV,IAAI0B,MAAM,KAAK,QAAQ;QACzBC,QAAQC,GAAG,CAACC,KAAKC,SAAS,CAAClB,QAAQ,MAAM;IAC3C,OAAO;QACLe,QAAQC,GAAG,CAAC,CAAC,IAAI,EAAEhB,OAAOjB,EAAE,EAAE;QAC9BgC,QAAQC,GAAG,CAAC,CAAC,MAAM,EAAEhB,OAAOC,IAAI,EAAE;QAClCc,QAAQC,GAAG,CAACrC,aAAac;QACzB,IAAIC,GAAGqB,QAAQC,GAAG,CAAC,CAAC,OAAO,EAAEtB,EAAEY,IAAI,CAAC,CAAC,EAAEZ,EAAEa,KAAK,GAAGZ,UAAU,CAAC,WAAW,EAAEA,QAAQwB,QAAQ,CAAC,WAAW,EAAExB,QAAQyB,OAAO,CAAC,iDAAiD,CAAC,GAAG,IAAI;QAChL,KAAK,MAAMC,QAAQzC,aAAagB,SAAUmB,QAAQC,GAAG,CAACK;QACtDN,QAAQC,GAAG,CAAChB,OAAOQ,0BAA0B,KAAK,OAAO,wBAAwB,CAAC,wBAAwB,EAAER,OAAOQ,0BAA0B,CAAC,KAAK,CAAC;QACpJO,QAAQC,GAAG,CAAC,CAAC,cAAc,EAAEhB,OAAOF,aAAa,CAAC,kFAAkF,CAAC;IACvI;IACAf,GAAGuC,KAAK;AACV;AACA,eAAenC,OAAO"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/status.ts"],"sourcesContent":["import { presetCoverage } from '../commands.ts';\nimport { embedConfig, featureStates } from '../config.ts';\nimport { docCount, getMeta, open } from '../db.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// 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 `rebuild` 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\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 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 const result = {\n db: dbPath,\n docs: docCount(db),\n features: features.on,\n featuresOff: features.off,\n embed: e ? { type: e.type, model: e.model, ...(vectors ?? {}) } : null,\n presets,\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 console.log(`db: ${result.db}`);\n console.log(`docs: ${result.docs}`);\n console.log(featuresLine(features));\n if (e) console.log(`embed: ${e.type} ${e.model}${vectors ? ` (vectors: ${vectors.embedded} embedded, ${vectors.pending} pending — embedded on the first semantic search)` : ''}`);\n for (const line of presetsLines(presets)) console.log(line);\n console.log(result.watcherHeartbeatSecondsAgo === null ? 'watcher: no watcher' : `watcher: last heartbeat ${result.watcherHeartbeatSecondsAgo}s ago`);\n console.log(`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":["presetCoverage","embedConfig","featureStates","docCount","getMeta","open","featuresLine","presetsLines","USAGE","CONFIG","FORMAT","formatOf","parse","printWarnings","vectorState","db","row","prepare","get","status","ctx","values","argv","name","format","cfg","resolveConfig","config","dbPath","warnings","features","e","vectors","presets","heartbeat","busyTimeoutMs","timeout","result","docs","on","featuresOff","off","embed","type","model","watcherHeartbeatSecondsAgo","Math","round","Date","now","console","log","JSON","stringify","embedded","pending","line","close"],"mappings":"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"}
@@ -1,18 +1,8 @@
1
1
  import type { ResolvedConfig } from '../config.js';
2
2
  export interface Ctx {
3
3
  name: string;
4
- rest: string[];
5
- format: 'table' | 'json';
6
- values: {
7
- config?: string;
8
- where?: string;
9
- k?: string;
10
- preset?: string;
11
- include?: string[];
12
- force: boolean;
13
- lexical: boolean;
14
- };
15
- resolveConfig(): ResolvedConfig;
4
+ argv: string[];
5
+ resolveConfig(configPath?: string): ResolvedConfig;
16
6
  usageError(message: string): never;
17
7
  }
18
8
  export type Command = (ctx: Ctx) => Promise<void> | void;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/types.ts"],"sourcesContent":["import type { ResolvedConfig } from '../config.ts';\n\n// Handed to every command; argv parsing stays in cli.ts.\nexport interface Ctx {\n name: string;\n rest: string[]; // positionals after the command word\n format: 'table' | 'json';\n values: { config?: string; where?: string; k?: string; preset?: string; include?: string[]; force: boolean; lexical: boolean };\n resolveConfig(): ResolvedConfig;\n usageError(message: string): never;\n}\n\nexport type Command = (ctx: Ctx) => Promise<void> | void;\n"],"names":[],"mappings":"AAYA,WAAyD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/types.ts"],"sourcesContent":["import type { ResolvedConfig } from '../config.ts';\n\n// Handed to every command; each command parses its own argv via shared.ts's `parse`.\nexport interface Ctx {\n name: string;\n argv: string[]; // argv after the command word\n resolveConfig(configPath?: string): ResolvedConfig;\n usageError(message: string): never;\n}\n\nexport type Command = (ctx: Ctx) => Promise<void> | void;\n"],"names":[],"mappings":"AAUA,WAAyD"}
@@ -1,8 +1,16 @@
1
1
  import { runWatch } from '../watch.js';
2
- import { printWarnings } from './shared.js';
2
+ import { USAGE } from './index.js';
3
+ import { CONFIG, parse, printWarnings } from './shared.js';
3
4
  const watch = async (ctx)=>{
4
- await runWatch(ctx.resolveConfig(), {
5
- force: ctx.values.force,
5
+ const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.watch}`, {
6
+ force: {
7
+ type: 'boolean',
8
+ default: false
9
+ },
10
+ ...CONFIG
11
+ });
12
+ await runWatch(ctx.resolveConfig(values.config), {
13
+ force: values.force,
6
14
  onEvent: (event)=>{
7
15
  if (event.type === 'started') {
8
16
  console.log(`${ctx.name} watch: watching ${event.baseDir}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/watch.ts"],"sourcesContent":["import type { WatchEvent } from '../watch.ts';\nimport { runWatch } from '../watch.ts';\nimport { printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst watch: Command = async (ctx) => {\n await runWatch(ctx.resolveConfig(), {\n force: ctx.values.force,\n onEvent: (event: WatchEvent) => {\n if (event.type === 'started') {\n console.log(`${ctx.name} watch: watching ${event.baseDir}`);\n console.log(`${ctx.name} watch: db ${event.dbPath}`);\n } else if (event.type === 'reconciled') {\n printWarnings(event.warnings);\n if (event.parsed > 0) console.log(`${ctx.name} watch: reconciled, ${event.parsed} file(s) reparsed (${event.total} total)`);\n } else {\n console.error(`${ctx.name} watch: reconcile error: ${event.message}`);\n }\n },\n });\n};\nexport default watch;\n"],"names":["runWatch","printWarnings","watch","ctx","resolveConfig","force","values","onEvent","event","type","console","log","name","baseDir","dbPath","warnings","parsed","total","error","message"],"mappings":"AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,aAAa,QAAQ,cAAc;AAG5C,MAAMC,QAAiB,OAAOC;IAC5B,MAAMH,SAASG,IAAIC,aAAa,IAAI;QAClCC,OAAOF,IAAIG,MAAM,CAACD,KAAK;QACvBE,SAAS,CAACC;YACR,IAAIA,MAAMC,IAAI,KAAK,WAAW;gBAC5BC,QAAQC,GAAG,CAAC,GAAGR,IAAIS,IAAI,CAAC,iBAAiB,EAAEJ,MAAMK,OAAO,EAAE;gBAC1DH,QAAQC,GAAG,CAAC,GAAGR,IAAIS,IAAI,CAAC,WAAW,EAAEJ,MAAMM,MAAM,EAAE;YACrD,OAAO,IAAIN,MAAMC,IAAI,KAAK,cAAc;gBACtCR,cAAcO,MAAMO,QAAQ;gBAC5B,IAAIP,MAAMQ,MAAM,GAAG,GAAGN,QAAQC,GAAG,CAAC,GAAGR,IAAIS,IAAI,CAAC,oBAAoB,EAAEJ,MAAMQ,MAAM,CAAC,mBAAmB,EAAER,MAAMS,KAAK,CAAC,OAAO,CAAC;YAC5H,OAAO;gBACLP,QAAQQ,KAAK,CAAC,GAAGf,IAAIS,IAAI,CAAC,yBAAyB,EAAEJ,MAAMW,OAAO,EAAE;YACtE;QACF;IACF;AACF;AACA,eAAejB,MAAM"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/watch.ts"],"sourcesContent":["import type { WatchEvent } from '../watch.ts';\nimport { runWatch } from '../watch.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, parse, printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst watch: Command = async (ctx) => {\n const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.watch}`, { force: { type: 'boolean', default: false }, ...CONFIG });\n await runWatch(ctx.resolveConfig(values.config as string | undefined), {\n force: values.force as boolean,\n onEvent: (event: WatchEvent) => {\n if (event.type === 'started') {\n console.log(`${ctx.name} watch: watching ${event.baseDir}`);\n console.log(`${ctx.name} watch: db ${event.dbPath}`);\n } else if (event.type === 'reconciled') {\n printWarnings(event.warnings);\n if (event.parsed > 0) console.log(`${ctx.name} watch: reconciled, ${event.parsed} file(s) reparsed (${event.total} total)`);\n } else {\n console.error(`${ctx.name} watch: reconcile error: ${event.message}`);\n }\n },\n });\n};\nexport default watch;\n"],"names":["runWatch","USAGE","CONFIG","parse","printWarnings","watch","ctx","values","argv","name","force","type","default","resolveConfig","config","onEvent","event","console","log","baseDir","dbPath","warnings","parsed","total","error","message"],"mappings":"AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,EAAEC,KAAK,EAAEC,aAAa,QAAQ,cAAc;AAG3D,MAAMC,QAAiB,OAAOC;IAC5B,MAAM,EAAEC,MAAM,EAAE,GAAGJ,MAAMG,IAAIE,IAAI,EAAE,CAAC,OAAO,EAAEF,IAAIG,IAAI,CAAC,CAAC,EAAER,MAAMI,KAAK,EAAE,EAAE;QAAEK,OAAO;YAAEC,MAAM;YAAWC,SAAS;QAAM;QAAG,GAAGV,MAAM;IAAC;IAChI,MAAMF,SAASM,IAAIO,aAAa,CAACN,OAAOO,MAAM,GAAyB;QACrEJ,OAAOH,OAAOG,KAAK;QACnBK,SAAS,CAACC;YACR,IAAIA,MAAML,IAAI,KAAK,WAAW;gBAC5BM,QAAQC,GAAG,CAAC,GAAGZ,IAAIG,IAAI,CAAC,iBAAiB,EAAEO,MAAMG,OAAO,EAAE;gBAC1DF,QAAQC,GAAG,CAAC,GAAGZ,IAAIG,IAAI,CAAC,WAAW,EAAEO,MAAMI,MAAM,EAAE;YACrD,OAAO,IAAIJ,MAAML,IAAI,KAAK,cAAc;gBACtCP,cAAcY,MAAMK,QAAQ;gBAC5B,IAAIL,MAAMM,MAAM,GAAG,GAAGL,QAAQC,GAAG,CAAC,GAAGZ,IAAIG,IAAI,CAAC,oBAAoB,EAAEO,MAAMM,MAAM,CAAC,mBAAmB,EAAEN,MAAMO,KAAK,CAAC,OAAO,CAAC;YAC5H,OAAO;gBACLN,QAAQO,KAAK,CAAC,GAAGlB,IAAIG,IAAI,CAAC,yBAAyB,EAAEO,MAAMS,OAAO,EAAE;YACtE;QACF;IACF;AACF;AACA,eAAepB,MAAM"}