sensemaking 0.9.5 → 0.11.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.
- package/README.md +27 -22
- package/dist/cjs/cli/download.d.cts +3 -0
- package/dist/cjs/cli/download.d.ts +3 -0
- package/dist/cjs/cli/download.js +214 -0
- package/dist/cjs/cli/download.js.map +1 -0
- package/dist/cjs/cli/index.d.cts +6 -5
- package/dist/cjs/cli/index.d.ts +6 -5
- package/dist/cjs/cli/index.js +20 -14
- package/dist/cjs/cli/index.js.map +1 -1
- package/dist/cjs/cli/init.js +4 -1
- package/dist/cjs/cli/init.js.map +1 -1
- package/dist/cjs/cli/map.js +2 -2
- package/dist/cjs/cli/map.js.map +1 -1
- package/dist/cjs/cli/named.js +13 -19
- package/dist/cjs/cli/named.js.map +1 -1
- package/dist/cjs/cli/path.d.cts +3 -0
- package/dist/cjs/cli/path.d.ts +3 -0
- package/dist/cjs/cli/path.js +161 -0
- package/dist/cjs/cli/path.js.map +1 -0
- package/dist/cjs/cli/peek.js +3 -2
- package/dist/cjs/cli/peek.js.map +1 -1
- package/dist/cjs/cli/related.d.cts +3 -0
- package/dist/cjs/cli/related.d.ts +3 -0
- package/dist/cjs/cli/related.js +279 -0
- package/dist/cjs/cli/related.js.map +1 -0
- package/dist/cjs/cli/search.js +3 -7
- package/dist/cjs/cli/search.js.map +1 -1
- package/dist/cjs/cli/shared.d.cts +4 -2
- package/dist/cjs/cli/shared.d.ts +4 -2
- package/dist/cjs/cli/shared.js +49 -6
- package/dist/cjs/cli/shared.js.map +1 -1
- package/dist/cjs/cli/sql.d.cts +3 -0
- package/dist/cjs/cli/sql.d.ts +3 -0
- package/dist/cjs/cli/{query.js → sql.js} +33 -5
- package/dist/cjs/cli/sql.js.map +1 -0
- package/dist/cjs/cli/status.d.cts +1 -0
- package/dist/cjs/cli/status.d.ts +1 -0
- package/dist/cjs/cli/status.js +80 -10
- package/dist/cjs/cli/status.js.map +1 -1
- package/dist/cjs/cli.js +14 -15
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands.d.cts +13 -4
- package/dist/cjs/commands.d.ts +13 -4
- package/dist/cjs/commands.js +161 -61
- package/dist/cjs/commands.js.map +1 -1
- package/dist/cjs/config.d.cts +6 -4
- package/dist/cjs/config.d.ts +6 -4
- package/dist/cjs/config.js +137 -58
- package/dist/cjs/config.js.map +1 -1
- package/dist/cjs/db.d.cts +2 -2
- package/dist/cjs/db.d.ts +2 -2
- package/dist/cjs/db.js +25 -46
- package/dist/cjs/db.js.map +1 -1
- package/dist/cjs/errors.d.cts +1 -1
- package/dist/cjs/errors.d.ts +1 -1
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/features/embed.d.cts +15 -0
- package/dist/cjs/features/embed.d.ts +15 -0
- package/dist/cjs/features/embed.js +277 -61
- package/dist/cjs/features/embed.js.map +1 -1
- package/dist/cjs/features/links.js +7 -16
- package/dist/cjs/features/links.js.map +1 -1
- package/dist/cjs/features/rank.js +2 -6
- package/dist/cjs/features/rank.js.map +1 -1
- package/dist/cjs/index.d.cts +2 -2
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/output.d.cts +3 -0
- package/dist/cjs/output.d.ts +3 -0
- package/dist/cjs/output.js +17 -15
- package/dist/cjs/output.js.map +1 -1
- package/dist/cjs/progress.js +2 -4
- package/dist/cjs/progress.js.map +1 -1
- package/dist/cjs/scan.d.cts +2 -0
- package/dist/cjs/scan.d.ts +2 -0
- package/dist/cjs/scan.js +150 -44
- package/dist/cjs/scan.js.map +1 -1
- package/dist/cjs/search-error.js +4 -6
- package/dist/cjs/search-error.js.map +1 -1
- package/dist/cjs/traverse.d.cts +8 -0
- package/dist/cjs/traverse.d.ts +8 -0
- package/dist/cjs/traverse.js +97 -0
- package/dist/cjs/traverse.js.map +1 -0
- package/dist/esm/cli/download.d.ts +3 -0
- package/dist/esm/cli/download.js +27 -0
- package/dist/esm/cli/download.js.map +1 -0
- package/dist/esm/cli/index.d.ts +6 -5
- package/dist/esm/cli/index.js +13 -11
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/init.js +4 -1
- package/dist/esm/cli/init.js.map +1 -1
- package/dist/esm/cli/map.js +3 -2
- package/dist/esm/cli/map.js.map +1 -1
- package/dist/esm/cli/named.js +13 -17
- package/dist/esm/cli/named.js.map +1 -1
- package/dist/esm/cli/path.d.ts +3 -0
- package/dist/esm/cli/path.js +51 -0
- package/dist/esm/cli/path.js.map +1 -0
- package/dist/esm/cli/peek.js +4 -2
- package/dist/esm/cli/peek.js.map +1 -1
- package/dist/esm/cli/related.d.ts +3 -0
- package/dist/esm/cli/related.js +26 -0
- package/dist/esm/cli/related.js.map +1 -0
- package/dist/esm/cli/search.js +2 -5
- package/dist/esm/cli/search.js.map +1 -1
- package/dist/esm/cli/shared.d.ts +4 -2
- package/dist/esm/cli/shared.js +49 -6
- package/dist/esm/cli/shared.js.map +1 -1
- package/dist/esm/cli/sql.d.ts +3 -0
- package/dist/esm/cli/{query.js → sql.js} +8 -5
- package/dist/esm/cli/sql.js.map +1 -0
- package/dist/esm/cli/status.d.ts +1 -0
- package/dist/esm/cli/status.js +72 -8
- package/dist/esm/cli/status.js.map +1 -1
- package/dist/esm/cli.js +13 -10
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands.d.ts +13 -4
- package/dist/esm/commands.js +135 -72
- package/dist/esm/commands.js.map +1 -1
- package/dist/esm/config.d.ts +6 -4
- package/dist/esm/config.js +126 -75
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/db.d.ts +2 -2
- package/dist/esm/db.js +28 -48
- package/dist/esm/db.js.map +1 -1
- package/dist/esm/errors.d.ts +1 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/features/embed.d.ts +15 -0
- package/dist/esm/features/embed.js +137 -42
- package/dist/esm/features/embed.js.map +1 -1
- package/dist/esm/features/links.js +8 -17
- package/dist/esm/features/links.js.map +1 -1
- package/dist/esm/features/rank.js +2 -6
- package/dist/esm/features/rank.js.map +1 -1
- package/dist/esm/features/types.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/output.d.ts +3 -0
- package/dist/esm/output.js +19 -17
- package/dist/esm/output.js.map +1 -1
- package/dist/esm/progress.js +2 -4
- package/dist/esm/progress.js.map +1 -1
- package/dist/esm/scan.d.ts +2 -0
- package/dist/esm/scan.js +123 -47
- package/dist/esm/scan.js.map +1 -1
- package/dist/esm/search-error.js +4 -6
- package/dist/esm/search-error.js.map +1 -1
- package/dist/esm/traverse.d.ts +8 -0
- package/dist/esm/traverse.js +71 -0
- package/dist/esm/traverse.js.map +1 -0
- package/package.json +7 -3
- package/schema.json +12 -16
- package/skills/sense/EXAMPLES.md +8 -8
- package/skills/sense/SKILL.md +51 -23
- package/skills/sense-setup/EXAMPLES.md +24 -21
- package/skills/sense-setup/SKILL.md +9 -9
- package/dist/cjs/cli/check.d.cts +0 -3
- package/dist/cjs/cli/check.d.ts +0 -3
- package/dist/cjs/cli/check.js +0 -398
- package/dist/cjs/cli/check.js.map +0 -1
- package/dist/cjs/cli/query.d.cts +0 -3
- package/dist/cjs/cli/query.d.ts +0 -3
- package/dist/cjs/cli/query.js.map +0 -1
- package/dist/cjs/cli/rebuild.d.cts +0 -3
- package/dist/cjs/cli/rebuild.d.ts +0 -3
- package/dist/cjs/cli/rebuild.js +0 -50
- package/dist/cjs/cli/rebuild.js.map +0 -1
- package/dist/esm/cli/check.d.ts +0 -3
- package/dist/esm/cli/check.js +0 -94
- package/dist/esm/cli/check.js.map +0 -1
- package/dist/esm/cli/query.d.ts +0 -3
- package/dist/esm/cli/query.js.map +0 -1
- package/dist/esm/cli/rebuild.d.ts +0 -3
- package/dist/esm/cli/rebuild.js +0 -13
- package/dist/esm/cli/rebuild.js.map +0 -1
package/dist/esm/cli/status.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
1
2
|
import { presetCoverage } from '../commands.js';
|
|
2
|
-
import { embedConfig, featureStates } from '../config.js';
|
|
3
|
-
import { docCount, getMeta, open } from '../db.js';
|
|
3
|
+
import { embedConfig, featureStates, SUPPORTED_CONFIG_VERSION } from '../config.js';
|
|
4
|
+
import { docCount, getMeta, open, SCHEMA_VERSION } from '../db.js';
|
|
5
|
+
import { isDownloadable, MODEL_FILENAMES, modelDir, modelPresent } from '../features/embed.js';
|
|
4
6
|
import { featuresLine, presetsLines } from '../output.js';
|
|
5
7
|
import { USAGE } from './index.js';
|
|
6
8
|
import { CONFIG, FORMAT, formatOf, parse, printWarnings } from './shared.js';
|
|
9
|
+
// status names what you cannot read off the config file: locations sense chose, values it
|
|
10
|
+
// derived, state it stored. Config content is not echoed -- the config line says which file to
|
|
11
|
+
// read, and duplicating its globs here would create two places that disagree after an edit.
|
|
12
|
+
// The exception is the embed block's url and key, whose effect is remote and otherwise invisible.
|
|
7
13
|
// Vectors are computed on the first semantic query, not at reconcile, so a tree can have a
|
|
8
|
-
// semantic-on preset with nothing embedded yet -- reported here because a fast
|
|
14
|
+
// semantic-on preset with nothing embedded yet -- reported here because a fast reconcile on
|
|
9
15
|
// such a tree otherwise reads as "the feature isn't on".
|
|
10
16
|
function vectorState(db) {
|
|
11
17
|
try {
|
|
@@ -15,7 +21,25 @@ function vectorState(db) {
|
|
|
15
21
|
return null;
|
|
16
22
|
}
|
|
17
23
|
}
|
|
24
|
+
function parseErrorCount(db) {
|
|
25
|
+
const row = db.prepare(`SELECT COUNT(*) AS n FROM frontmatter WHERE "_parse_error" IS NOT NULL`).get();
|
|
26
|
+
return row.n;
|
|
27
|
+
}
|
|
28
|
+
// A URL can carry credentials in its userinfo (https://user:pass@host/v1). status output gets
|
|
29
|
+
// pasted into issues and transcripts, so it is always safe to paste.
|
|
30
|
+
export function redactUrl(url) {
|
|
31
|
+
try {
|
|
32
|
+
const parsed = new URL(url);
|
|
33
|
+
if (!parsed.username && !parsed.password) return url;
|
|
34
|
+
parsed.username = '';
|
|
35
|
+
parsed.password = '';
|
|
36
|
+
return `${parsed.toString().replace(/\/$/, '')} (credentials redacted)`;
|
|
37
|
+
} catch {
|
|
38
|
+
return url;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
18
41
|
const status = (ctx)=>{
|
|
42
|
+
var _process_env_e_key, _cfg_migratedFrom, _cfg_unknownKeys, _cfg_queries;
|
|
19
43
|
const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.status}`, {
|
|
20
44
|
...FORMAT,
|
|
21
45
|
...CONFIG
|
|
@@ -26,6 +50,7 @@ const status = (ctx)=>{
|
|
|
26
50
|
printWarnings(warnings);
|
|
27
51
|
const features = featureStates(cfg);
|
|
28
52
|
const e = embedConfig(cfg);
|
|
53
|
+
const hasModel = e ? modelPresent(cfg) : false;
|
|
29
54
|
const vectors = e ? vectorState(db) : null;
|
|
30
55
|
const presets = presetCoverage(db, cfg);
|
|
31
56
|
const heartbeat = getMeta(db, 'watch_heartbeat');
|
|
@@ -33,30 +58,69 @@ const status = (ctx)=>{
|
|
|
33
58
|
// transaction for, floored at 30s -- read back from the connection rather than
|
|
34
59
|
// recomputed here, so this always reports what open() actually set.
|
|
35
60
|
const busyTimeoutMs = db.prepare('PRAGMA busy_timeout').get().timeout;
|
|
61
|
+
// The env var holds the token; only its name and whether it is set are ever reported.
|
|
62
|
+
const keyEnv = (e === null || e === void 0 ? void 0 : e.key) ? {
|
|
63
|
+
name: e.key,
|
|
64
|
+
set: ((_process_env_e_key = process.env[e.key]) !== null && _process_env_e_key !== void 0 ? _process_env_e_key : '') !== ''
|
|
65
|
+
} : null;
|
|
36
66
|
const result = {
|
|
67
|
+
config: cfg.configPath,
|
|
68
|
+
configVersion: SUPPORTED_CONFIG_VERSION,
|
|
69
|
+
migratedFrom: (_cfg_migratedFrom = cfg.migratedFrom) !== null && _cfg_migratedFrom !== void 0 ? _cfg_migratedFrom : null,
|
|
70
|
+
unknownConfigKeys: (_cfg_unknownKeys = cfg.unknownKeys) !== null && _cfg_unknownKeys !== void 0 ? _cfg_unknownKeys : null,
|
|
71
|
+
tree: cfg.baseDir,
|
|
72
|
+
cache: dirname(dbPath),
|
|
37
73
|
db: dbPath,
|
|
74
|
+
cacheSchema: SCHEMA_VERSION,
|
|
38
75
|
docs: docCount(db),
|
|
76
|
+
unparseableFrontmatter: parseErrorCount(db),
|
|
39
77
|
features: features.on,
|
|
40
78
|
featuresOff: features.off,
|
|
41
79
|
embed: e ? {
|
|
42
80
|
type: e.type,
|
|
43
81
|
model: e.model,
|
|
82
|
+
dir: e.type === 'static' ? modelDir(e.model) : null,
|
|
83
|
+
url: e.url ? redactUrl(e.url) : null,
|
|
84
|
+
keyEnv,
|
|
85
|
+
downloaded: hasModel,
|
|
44
86
|
...vectors !== null && vectors !== void 0 ? vectors : {}
|
|
45
87
|
} : null,
|
|
46
88
|
presets,
|
|
89
|
+
queries: Object.keys((_cfg_queries = cfg.queries) !== null && _cfg_queries !== void 0 ? _cfg_queries : {}).length,
|
|
90
|
+
watcherPid: getMeta(db, 'watch_pid'),
|
|
47
91
|
watcherHeartbeatSecondsAgo: heartbeat ? Math.round((Date.now() - Date.parse(heartbeat)) / 1000) : null,
|
|
48
92
|
busyTimeoutMs
|
|
49
93
|
};
|
|
50
94
|
if (format === 'json') {
|
|
51
95
|
console.log(JSON.stringify(result, null, 2));
|
|
52
96
|
} else {
|
|
53
|
-
|
|
54
|
-
console.log(`
|
|
97
|
+
const migrated = cfg.migratedFrom !== undefined ? `, migrated from v${cfg.migratedFrom} on this run` : '';
|
|
98
|
+
console.log(`config: ${result.config} (v${SUPPORTED_CONFIG_VERSION}${migrated})`);
|
|
99
|
+
// A load-time stderr warning has scrolled away by the time anyone looks here.
|
|
100
|
+
if (cfg.unknownKeys) console.log(` unknown keys, ignored: ${cfg.unknownKeys.join(', ')}`);
|
|
101
|
+
console.log(`tree: ${result.tree}`);
|
|
102
|
+
console.log(`cache: ${result.cache} (schema ${SCHEMA_VERSION}; delete this directory to reset)`);
|
|
103
|
+
console.log(`docs: ${result.docs}${result.unparseableFrontmatter > 0 ? ` (${result.unparseableFrontmatter} with unparseable frontmatter: WHERE _parse_error IS NOT NULL)` : ''}`);
|
|
104
|
+
console.log('');
|
|
55
105
|
console.log(featuresLine(features));
|
|
56
|
-
|
|
106
|
+
// One authoritative block, off states included: an absent model reads as a degraded search,
|
|
107
|
+
// not as an empty corpus.
|
|
108
|
+
if (!e) console.log('embed: off (no preset asks for vectors)');
|
|
109
|
+
else {
|
|
110
|
+
console.log(`embed: ${e.type} ${e.model}`);
|
|
111
|
+
if (e.type === 'static') console.log(` model: ${modelDir(e.model)} (${hasModel ? 'present' : `missing, ${isDownloadable(e.model) ? `run \`${ctx.name} download\`` : `no ${MODEL_FILENAMES} in that directory`}`})`);
|
|
112
|
+
if (e.url) console.log(` url: ${redactUrl(e.url)}`);
|
|
113
|
+
if (keyEnv) console.log(` key: env ${keyEnv.name} (${keyEnv.set ? 'set' : 'NOT SET'})`);
|
|
114
|
+
if (!hasModel) console.log(' vectors: off until the model is present; search runs on words and links');
|
|
115
|
+
else if (vectors) console.log(` vectors: ${vectors.embedded} embedded, ${vectors.pending} pending (embedded on the first semantic search)`);
|
|
116
|
+
}
|
|
117
|
+
console.log('');
|
|
57
118
|
for (const line of presetsLines(presets))console.log(line);
|
|
58
|
-
console.log(
|
|
59
|
-
console.log(`
|
|
119
|
+
console.log('');
|
|
120
|
+
console.log(`queries: ${result.queries} saved (${ctx.name} --list)`);
|
|
121
|
+
const pid = result.watcherPid ? `pid ${result.watcherPid}, ` : '';
|
|
122
|
+
console.log(result.watcherHeartbeatSecondsAgo === null ? 'watcher: none' : `watcher: ${pid}last heartbeat ${result.watcherHeartbeatSecondsAgo}s ago`);
|
|
123
|
+
console.log(`sqlite: busy_timeout ${result.busyTimeoutMs}ms (derived: 3x the largest reconcile this cache has recorded, floored at 30000ms)`);
|
|
60
124
|
}
|
|
61
125
|
db.close();
|
|
62
126
|
};
|
|
@@ -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 { 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
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/status.ts"],"sourcesContent":["import { dirname } from 'node:path';\nimport { presetCoverage } from '../commands.ts';\nimport { embedConfig, featureStates, SUPPORTED_CONFIG_VERSION } from '../config.ts';\nimport { docCount, getMeta, open, SCHEMA_VERSION } from '../db.ts';\nimport { isDownloadable, MODEL_FILENAMES, modelDir, modelPresent } from '../features/embed.ts';\nimport { featuresLine, presetsLines } from '../output.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, FORMAT, formatOf, parse, printWarnings } from './shared.ts';\nimport type { Command } from './types.ts';\n\n// status names what you cannot read off the config file: locations sense chose, values it\n// derived, state it stored. Config content is not echoed -- the config line says which file to\n// read, and duplicating its globs here would create two places that disagree after an edit.\n// The exception is the embed block's url and key, whose effect is remote and otherwise invisible.\n\n// Vectors are computed on the first semantic query, not at reconcile, so a tree can have a\n// semantic-on preset with nothing embedded yet -- reported here because a fast reconcile on\n// such a tree otherwise reads as \"the feature isn't on\".\nfunction vectorState(db: ReturnType<typeof open>['db']): { embedded: number; pending: number } | null {\n try {\n const row = db.prepare('SELECT COUNT(vector) AS embedded, COUNT(*) - COUNT(vector) AS pending FROM embeddings').get() as { embedded: number; pending: number };\n return row;\n } catch {\n return null;\n }\n}\n\nfunction parseErrorCount(db: ReturnType<typeof open>['db']): number {\n const row = db.prepare(`SELECT COUNT(*) AS n FROM frontmatter WHERE \"_parse_error\" IS NOT NULL`).get() as { n: number };\n return row.n;\n}\n\n// A URL can carry credentials in its userinfo (https://user:pass@host/v1). status output gets\n// pasted into issues and transcripts, so it is always safe to paste.\nexport function redactUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (!parsed.username && !parsed.password) return url;\n parsed.username = '';\n parsed.password = '';\n return `${parsed.toString().replace(/\\/$/, '')} (credentials redacted)`;\n } catch {\n return url;\n }\n}\n\nconst status: Command = (ctx) => {\n const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.status}`, { ...FORMAT, ...CONFIG });\n const format = formatOf(values);\n const cfg = ctx.resolveConfig(values.config as string | undefined);\n const { db, dbPath, warnings } = open(cfg);\n printWarnings(warnings);\n\n const features = featureStates(cfg);\n const e = embedConfig(cfg);\n const hasModel = e ? modelPresent(cfg) : false;\n const vectors = e ? vectorState(db) : null;\n const presets = presetCoverage(db, cfg);\n const heartbeat = getMeta(db, 'watch_heartbeat');\n // Derived at open() (F): 3x the largest reconcile this cache has ever held its write\n // transaction for, floored at 30s -- read back from the connection rather than\n // recomputed here, so this always reports what open() actually set.\n const busyTimeoutMs = (db.prepare('PRAGMA busy_timeout').get() as { timeout: number }).timeout;\n // The env var holds the token; only its name and whether it is set are ever reported.\n const keyEnv = e?.key ? { name: e.key, set: (process.env[e.key] ?? '') !== '' } : null;\n const result = {\n config: cfg.configPath,\n configVersion: SUPPORTED_CONFIG_VERSION,\n migratedFrom: cfg.migratedFrom ?? null,\n unknownConfigKeys: cfg.unknownKeys ?? null,\n tree: cfg.baseDir,\n cache: dirname(dbPath),\n db: dbPath,\n cacheSchema: SCHEMA_VERSION,\n docs: docCount(db),\n unparseableFrontmatter: parseErrorCount(db),\n features: features.on,\n featuresOff: features.off,\n embed: e ? { type: e.type, model: e.model, dir: e.type === 'static' ? modelDir(e.model) : null, url: e.url ? redactUrl(e.url) : null, keyEnv, downloaded: hasModel, ...(vectors ?? {}) } : null,\n presets,\n queries: Object.keys(cfg.queries ?? {}).length,\n watcherPid: getMeta(db, 'watch_pid'),\n watcherHeartbeatSecondsAgo: heartbeat ? Math.round((Date.now() - Date.parse(heartbeat)) / 1000) : null,\n busyTimeoutMs,\n };\n\n if (format === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const migrated = cfg.migratedFrom !== undefined ? `, migrated from v${cfg.migratedFrom} on this run` : '';\n console.log(`config: ${result.config} (v${SUPPORTED_CONFIG_VERSION}${migrated})`);\n // A load-time stderr warning has scrolled away by the time anyone looks here.\n if (cfg.unknownKeys) console.log(` unknown keys, ignored: ${cfg.unknownKeys.join(', ')}`);\n console.log(`tree: ${result.tree}`);\n console.log(`cache: ${result.cache} (schema ${SCHEMA_VERSION}; delete this directory to reset)`);\n console.log(`docs: ${result.docs}${result.unparseableFrontmatter > 0 ? ` (${result.unparseableFrontmatter} with unparseable frontmatter: WHERE _parse_error IS NOT NULL)` : ''}`);\n console.log('');\n console.log(featuresLine(features));\n // One authoritative block, off states included: an absent model reads as a degraded search,\n // not as an empty corpus.\n if (!e) console.log('embed: off (no preset asks for vectors)');\n else {\n console.log(`embed: ${e.type} ${e.model}`);\n if (e.type === 'static') console.log(` model: ${modelDir(e.model)} (${hasModel ? 'present' : `missing, ${isDownloadable(e.model) ? `run \\`${ctx.name} download\\`` : `no ${MODEL_FILENAMES} in that directory`}`})`);\n if (e.url) console.log(` url: ${redactUrl(e.url)}`);\n if (keyEnv) console.log(` key: env ${keyEnv.name} (${keyEnv.set ? 'set' : 'NOT SET'})`);\n if (!hasModel) console.log(' vectors: off until the model is present; search runs on words and links');\n else if (vectors) console.log(` vectors: ${vectors.embedded} embedded, ${vectors.pending} pending (embedded on the first semantic search)`);\n }\n console.log('');\n for (const line of presetsLines(presets)) console.log(line);\n console.log('');\n console.log(`queries: ${result.queries} saved (${ctx.name} --list)`);\n const pid = result.watcherPid ? `pid ${result.watcherPid}, ` : '';\n console.log(result.watcherHeartbeatSecondsAgo === null ? 'watcher: none' : `watcher: ${pid}last heartbeat ${result.watcherHeartbeatSecondsAgo}s ago`);\n console.log(`sqlite: busy_timeout ${result.busyTimeoutMs}ms (derived: 3x the largest reconcile this cache has recorded, floored at 30000ms)`);\n }\n db.close();\n};\nexport default status;\n"],"names":["dirname","presetCoverage","embedConfig","featureStates","SUPPORTED_CONFIG_VERSION","docCount","getMeta","open","SCHEMA_VERSION","isDownloadable","MODEL_FILENAMES","modelDir","modelPresent","featuresLine","presetsLines","USAGE","CONFIG","FORMAT","formatOf","parse","printWarnings","vectorState","db","row","prepare","get","parseErrorCount","n","redactUrl","url","parsed","URL","username","password","toString","replace","status","ctx","process","cfg","values","argv","name","format","resolveConfig","config","dbPath","warnings","features","e","hasModel","vectors","presets","heartbeat","busyTimeoutMs","timeout","keyEnv","key","set","env","result","configPath","configVersion","migratedFrom","unknownConfigKeys","unknownKeys","tree","baseDir","cache","cacheSchema","docs","unparseableFrontmatter","on","featuresOff","off","embed","type","model","dir","downloaded","queries","Object","keys","length","watcherPid","watcherHeartbeatSecondsAgo","Math","round","Date","now","console","log","JSON","stringify","migrated","undefined","join","embedded","pending","line","pid","close"],"mappings":"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"}
|
package/dist/esm/cli.js
CHANGED
|
@@ -2,10 +2,8 @@ import { createRequire } from 'node:module';
|
|
|
2
2
|
import { parseArgs } from 'node:util';
|
|
3
3
|
import { COMMANDS, USAGE } from './cli/index.js';
|
|
4
4
|
import { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.js';
|
|
5
|
-
// Parsing and dispatch only
|
|
6
|
-
//
|
|
7
|
-
// per command (each command's own parse() call); this file only handles the bare top-level
|
|
8
|
-
// flags (--version/--help/--list/--config) and dispatch.
|
|
5
|
+
// Parsing and dispatch only; commands lazy-load from src/cli/, so nothing heavy is imported
|
|
6
|
+
// here. Flags parse per command -- this file handles only --version/--help/--list/--config.
|
|
9
7
|
// Works from dist/cjs and dist/esm alike: walk up past the dist type-marker package.json.
|
|
10
8
|
function packageVersion() {
|
|
11
9
|
const load = createRequire(import.meta.url);
|
|
@@ -87,9 +85,9 @@ export default async function cli(argv, name) {
|
|
|
87
85
|
if (values.list) {
|
|
88
86
|
const queries = resolveConfigFor(name, values.config).queries;
|
|
89
87
|
for (const queryName of Object.keys(queries).sort()){
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
console.log(
|
|
88
|
+
// Every entry names its verb, so --list can label both kinds rather than only
|
|
89
|
+
// marking the exception.
|
|
90
|
+
console.log(`${queryName} (${'search' in queries[queryName] ? 'search' : 'sql'})`);
|
|
93
91
|
}
|
|
94
92
|
return;
|
|
95
93
|
}
|
|
@@ -100,9 +98,14 @@ export default async function cli(argv, name) {
|
|
|
100
98
|
console.error(usage(name));
|
|
101
99
|
process.exit(2);
|
|
102
100
|
}
|
|
103
|
-
//
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
// Breaking renames get one release of a pointer instead of an "unknown" error: find ->
|
|
102
|
+
// search, and query -> sql (which took its name back from the search sense of "query").
|
|
103
|
+
const RENAMED = {
|
|
104
|
+
find: 'search',
|
|
105
|
+
query: 'sql'
|
|
106
|
+
};
|
|
107
|
+
if (RENAMED[first]) {
|
|
108
|
+
console.error(`${name}: ${first} is now ${RENAMED[first]}`);
|
|
106
109
|
console.error(usage(name));
|
|
107
110
|
process.exit(2);
|
|
108
111
|
}
|
package/dist/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { parseArgs } from 'node:util';\nimport { COMMANDS, USAGE } from './cli/index.ts';\nimport type { Ctx } from './cli/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { parseArgs } from 'node:util';\nimport { COMMANDS, USAGE } from './cli/index.ts';\nimport type { Ctx } from './cli/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only; commands lazy-load from src/cli/, so nothing heavy is imported\n// here. Flags parse per command -- this file handles only --version/--help/--list/--config.\n\n// Works from dist/cjs and dist/esm alike: walk up past the dist type-marker package.json.\nfunction packageVersion(): string {\n const load = createRequire(import.meta.url);\n for (const rel of ['../package.json', '../../package.json', '../../../package.json']) {\n try {\n const pkg = load(rel) as { name?: string; version?: string };\n if (pkg.name === 'sensemaking' && pkg.version) return pkg.version;\n } catch {}\n }\n return 'unknown';\n}\n\nfunction usage(name: string): string {\n const lines = Object.values(USAGE).map((u) => ` ${name} ${u}`);\n return [`usage: ${name} <name> [params...] [--format table|json] [--config path]`, ...lines, ` ${name} --list`, ` ${name} --version`].join('\\n');\n}\n\nfunction resolveConfigFor(name: string, configPath: string | undefined) {\n const cfg = loadConfig(configPath);\n if (cfg.migratedFrom !== undefined) {\n console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);\n }\n if (cfg.unknownKeys !== undefined) {\n console.warn(`${name}: ${cfg.configPath} sets ${cfg.unknownKeys.join(', ')}, which this build does not read (no effect); see schema.json for the keys it does`);\n }\n return cfg;\n}\n\n// Thrown errors -> exit 1 with the message verbatim; usage errors exit 2 directly.\nexport default async function cli(argv: string[], name: string): Promise<void> {\n const first = argv[0];\n\n // No command word, or the first token looks like a flag: the only flags this level knows.\n if (!first || first.startsWith('-')) {\n let values: Record<string, string | boolean | undefined>;\n try {\n ({ values } = parseArgs({\n args: argv,\n options: {\n version: { type: 'boolean', default: false, short: 'v' },\n help: { type: 'boolean', default: false, short: 'h' },\n list: { type: 'boolean', default: false },\n config: { type: 'string' },\n },\n allowPositionals: true,\n }));\n } catch (err) {\n console.error((err as Error).message);\n console.error(usage(name));\n process.exit(2);\n }\n\n try {\n if (values.version) {\n console.log(packageVersion());\n return;\n }\n if (values.help) {\n console.log(usage(name));\n return;\n }\n if (values.list) {\n const queries = resolveConfigFor(name, values.config as string | undefined).queries;\n for (const queryName of Object.keys(queries).sort()) {\n // Every entry names its verb, so --list can label both kinds rather than only\n // marking the exception.\n console.log(`${queryName} (${'search' in queries[queryName] ? 'search' : 'sql'})`);\n }\n return;\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n\n console.error(usage(name));\n process.exit(2);\n }\n\n // Breaking renames get one release of a pointer instead of an \"unknown\" error: find ->\n // search, and query -> sql (which took its name back from the search sense of \"query\").\n const RENAMED: Record<string, string> = { find: 'search', query: 'sql' };\n if (RENAMED[first]) {\n console.error(`${name}: ${first} is now ${RENAMED[first]}`);\n console.error(usage(name));\n process.exit(2);\n }\n\n const ctx: Ctx = {\n name,\n argv: argv.slice(1),\n resolveConfig: (configPath) => resolveConfigFor(name, configPath),\n usageError(message) {\n console.error(message);\n process.exit(2);\n },\n };\n\n try {\n const load = COMMANDS[first];\n if (load) await (await load()).default(ctx);\n else await (await import('./cli/named.ts')).default(ctx, first);\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n}\n"],"names":["createRequire","parseArgs","COMMANDS","USAGE","loadConfig","SUPPORTED_CONFIG_VERSION","packageVersion","load","url","rel","pkg","name","version","usage","lines","Object","values","map","u","join","resolveConfigFor","configPath","cfg","migratedFrom","undefined","console","warn","unknownKeys","cli","argv","first","startsWith","args","options","type","default","short","help","list","config","allowPositionals","err","error","message","process","exit","log","queries","queryName","keys","sort","RENAMED","find","query","ctx","slice","resolveConfig","usageError"],"mappings":"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"}
|
package/dist/esm/commands.d.ts
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
-
import type { FeatureName, ResolvedConfig } from './config.js';
|
|
2
|
+
import type { FeatureName, ResolvedConfig, SearchOverrides } from './config.js';
|
|
3
3
|
import type { Row } from './output.js';
|
|
4
4
|
export interface SearchOptions {
|
|
5
5
|
k?: number;
|
|
6
6
|
where?: string;
|
|
7
7
|
preset?: string;
|
|
8
8
|
include?: string[];
|
|
9
|
-
|
|
9
|
+
exclude?: string[];
|
|
10
|
+
noExclude?: boolean;
|
|
10
11
|
}
|
|
11
12
|
export declare function search(db: DatabaseSync, cfg: ResolvedConfig, terms: string, opts?: SearchOptions): Promise<Row[]>;
|
|
13
|
+
export declare function scopedPaths(db: DatabaseSync, cfg: ResolvedConfig, overrides: SearchOverrides): Set<string>;
|
|
12
14
|
export interface PresetCoverage {
|
|
13
15
|
name: string;
|
|
14
16
|
files: number;
|
|
15
17
|
embedded: number;
|
|
18
|
+
semantic: boolean;
|
|
16
19
|
}
|
|
17
20
|
export declare function presetCoverage(db: DatabaseSync, cfg: ResolvedConfig): PresetCoverage[];
|
|
18
21
|
export interface TreeMap {
|
|
@@ -30,11 +33,13 @@ export interface TreeMap {
|
|
|
30
33
|
hubs: Row[];
|
|
31
34
|
recent: Row[];
|
|
32
35
|
}
|
|
33
|
-
export declare function mapTree(db: DatabaseSync, cfg: ResolvedConfig): TreeMap;
|
|
36
|
+
export declare function mapTree(db: DatabaseSync, cfg: ResolvedConfig, overrides?: SearchOverrides): TreeMap;
|
|
37
|
+
export declare function resolveNote(paths: string[], arg: string): string;
|
|
34
38
|
export interface Peek {
|
|
35
39
|
path: string;
|
|
36
40
|
tokens: number;
|
|
37
41
|
frontmatter: Row;
|
|
42
|
+
parseError: string | null;
|
|
38
43
|
sections: Row[];
|
|
39
44
|
outbound: string[];
|
|
40
45
|
backlinks: string[];
|
|
@@ -45,4 +50,8 @@ export interface Peek {
|
|
|
45
50
|
unresolvedTotal: number;
|
|
46
51
|
off: FeatureName[];
|
|
47
52
|
}
|
|
48
|
-
export declare function peek(db: DatabaseSync, cfg: ResolvedConfig, pathArg: string): Peek;
|
|
53
|
+
export declare function peek(db: DatabaseSync, cfg: ResolvedConfig, pathArg: string, overrides?: SearchOverrides): Peek;
|
|
54
|
+
export declare function relatedNotes(db: DatabaseSync, cfg: ResolvedConfig, pathArg: string, overrides: SearchOverrides, k: number): Promise<Array<{
|
|
55
|
+
path: string;
|
|
56
|
+
similarity: number;
|
|
57
|
+
}>>;
|