sensemaking 0.15.4 → 0.16.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 +33 -5
- package/dist/cjs/cli/download.js +12 -11
- package/dist/cjs/cli/download.js.map +1 -1
- package/dist/cjs/cli/index.d.cts +1 -1
- package/dist/cjs/cli/index.d.ts +1 -1
- package/dist/cjs/cli/index.js +1 -1
- package/dist/cjs/cli/index.js.map +1 -1
- package/dist/cjs/cli/init.js +31 -5
- package/dist/cjs/cli/init.js.map +1 -1
- package/dist/cjs/cli/status.js +343 -99
- package/dist/cjs/cli/status.js.map +1 -1
- package/dist/cjs/commands/related.js +17 -13
- package/dist/cjs/commands/related.js.map +1 -1
- package/dist/cjs/commands/search.js +25 -96
- package/dist/cjs/commands/search.js.map +1 -1
- package/dist/cjs/commands/signals.d.cts +18 -0
- package/dist/cjs/commands/signals.d.ts +18 -0
- package/dist/cjs/commands/signals.js +299 -0
- package/dist/cjs/commands/signals.js.map +1 -0
- package/dist/cjs/commands/status.d.cts +2 -2
- package/dist/cjs/commands/status.d.ts +2 -2
- package/dist/cjs/commands/status.js +1 -1
- package/dist/cjs/commands/status.js.map +1 -1
- package/dist/cjs/config/access.d.cts +5 -2
- package/dist/cjs/config/access.d.ts +5 -2
- package/dist/cjs/config/access.js +30 -12
- package/dist/cjs/config/access.js.map +1 -1
- package/dist/cjs/config/index.d.cts +4 -1
- package/dist/cjs/config/index.d.ts +4 -1
- package/dist/cjs/config/index.js +12 -2
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/config/load.d.cts +6 -1
- package/dist/cjs/config/load.d.ts +6 -1
- package/dist/cjs/config/load.js +83 -8
- package/dist/cjs/config/load.js.map +1 -1
- package/dist/cjs/config/resolve.js +1 -1
- package/dist/cjs/config/resolve.js.map +1 -1
- package/dist/cjs/config/signals.d.cts +4 -0
- package/dist/cjs/config/signals.d.ts +4 -0
- package/dist/cjs/config/signals.js +30 -0
- package/dist/cjs/config/signals.js.map +1 -0
- package/dist/cjs/config/types.d.cts +6 -4
- package/dist/cjs/config/types.d.ts +6 -4
- package/dist/cjs/config/types.js +1 -1
- package/dist/cjs/config/types.js.map +1 -1
- package/dist/cjs/config/validate.js +120 -11
- package/dist/cjs/config/validate.js.map +1 -1
- package/dist/cjs/db/open.d.cts +1 -1
- package/dist/cjs/db/open.d.ts +1 -1
- package/dist/cjs/db/open.js +6 -1
- package/dist/cjs/db/open.js.map +1 -1
- package/dist/cjs/db/reconcile.d.cts +1 -0
- package/dist/cjs/db/reconcile.d.ts +1 -0
- package/dist/cjs/db/reconcile.js +15 -0
- package/dist/cjs/db/reconcile.js.map +1 -1
- package/dist/cjs/embed/cohere.d.cts +2 -0
- package/dist/cjs/embed/cohere.d.ts +2 -0
- package/dist/cjs/embed/cohere.js +238 -0
- package/dist/cjs/embed/cohere.js.map +1 -0
- package/dist/cjs/embed/http.d.cts +2 -0
- package/dist/cjs/embed/http.d.ts +2 -0
- package/dist/cjs/embed/http.js +258 -0
- package/dist/cjs/embed/http.js.map +1 -0
- package/dist/cjs/embed/identity.d.cts +13 -0
- package/dist/cjs/embed/identity.d.ts +13 -0
- package/dist/cjs/embed/identity.js +194 -0
- package/dist/cjs/embed/identity.js.map +1 -0
- package/dist/cjs/embed/langfit.d.cts +6 -0
- package/dist/cjs/embed/langfit.d.ts +6 -0
- package/dist/cjs/embed/langfit.js +326 -0
- package/dist/cjs/embed/langfit.js.map +1 -0
- package/dist/cjs/embed/languages.d.cts +3 -0
- package/dist/cjs/embed/languages.d.ts +3 -0
- package/dist/cjs/embed/languages.js +98 -0
- package/dist/cjs/embed/languages.js.map +1 -0
- package/dist/cjs/embed/openai.d.cts +2 -0
- package/dist/cjs/embed/openai.d.ts +2 -0
- package/dist/cjs/embed/openai.js +268 -0
- package/dist/cjs/embed/openai.js.map +1 -0
- package/dist/cjs/embed/query.d.cts +21 -0
- package/dist/cjs/embed/query.d.ts +21 -0
- package/dist/cjs/embed/query.js +610 -0
- package/dist/cjs/embed/query.js.map +1 -0
- package/dist/cjs/embed/registry.d.cts +3 -0
- package/dist/cjs/embed/registry.d.ts +3 -0
- package/dist/cjs/embed/registry.js +114 -0
- package/dist/cjs/embed/registry.js.map +1 -0
- package/dist/cjs/embed/static.d.cts +2 -0
- package/dist/cjs/embed/static.d.ts +2 -0
- package/dist/cjs/embed/static.js +367 -0
- package/dist/cjs/embed/static.js.map +1 -0
- package/dist/cjs/embed/store.d.cts +8 -0
- package/dist/cjs/embed/store.d.ts +8 -0
- package/dist/cjs/embed/store.js +498 -0
- package/dist/cjs/embed/store.js.map +1 -0
- package/dist/cjs/embed/types.d.cts +8 -0
- package/dist/cjs/embed/types.d.ts +8 -0
- package/dist/cjs/embed/types.js +7 -0
- package/dist/cjs/embed/types.js.map +1 -0
- 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 +4 -27
- package/dist/cjs/features/embed.d.ts +4 -27
- package/dist/cjs/features/embed.js +3 -969
- package/dist/cjs/features/embed.js.map +1 -1
- package/dist/cjs/index.d.cts +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/output.d.cts +2 -2
- package/dist/cjs/output.d.ts +2 -2
- package/dist/cjs/output.js +9 -2
- package/dist/cjs/output.js.map +1 -1
- package/dist/cjs/scan.js +8 -5
- package/dist/cjs/scan.js.map +1 -1
- package/dist/cjs/segment.js +67 -14
- package/dist/cjs/segment.js.map +1 -1
- package/dist/esm/cli/download.js +9 -8
- package/dist/esm/cli/download.js.map +1 -1
- package/dist/esm/cli/index.d.ts +1 -1
- package/dist/esm/cli/index.js +1 -1
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/init.js +32 -6
- package/dist/esm/cli/init.js.map +1 -1
- package/dist/esm/cli/status.js +36 -8
- package/dist/esm/cli/status.js.map +1 -1
- package/dist/esm/commands/related.js +14 -10
- package/dist/esm/commands/related.js.map +1 -1
- package/dist/esm/commands/search.js +27 -78
- package/dist/esm/commands/search.js.map +1 -1
- package/dist/esm/commands/signals.d.ts +18 -0
- package/dist/esm/commands/signals.js +78 -0
- package/dist/esm/commands/signals.js.map +1 -0
- package/dist/esm/commands/status.d.ts +2 -2
- package/dist/esm/commands/status.js +2 -2
- package/dist/esm/commands/status.js.map +1 -1
- package/dist/esm/config/access.d.ts +5 -2
- package/dist/esm/config/access.js +31 -12
- package/dist/esm/config/access.js.map +1 -1
- package/dist/esm/config/index.d.ts +4 -1
- package/dist/esm/config/index.js +2 -1
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/config/load.d.ts +6 -1
- package/dist/esm/config/load.js +67 -9
- package/dist/esm/config/load.js.map +1 -1
- package/dist/esm/config/resolve.js +2 -2
- package/dist/esm/config/resolve.js.map +1 -1
- package/dist/esm/config/signals.d.ts +4 -0
- package/dist/esm/config/signals.js +14 -0
- package/dist/esm/config/signals.js.map +1 -0
- package/dist/esm/config/types.d.ts +6 -4
- package/dist/esm/config/types.js +1 -1
- package/dist/esm/config/types.js.map +1 -1
- package/dist/esm/config/validate.js +58 -11
- package/dist/esm/config/validate.js.map +1 -1
- package/dist/esm/db/open.d.ts +1 -1
- package/dist/esm/db/open.js +7 -2
- package/dist/esm/db/open.js.map +1 -1
- package/dist/esm/db/reconcile.d.ts +1 -0
- package/dist/esm/db/reconcile.js +10 -0
- package/dist/esm/db/reconcile.js.map +1 -1
- package/dist/esm/embed/cohere.d.ts +2 -0
- package/dist/esm/embed/cohere.js +46 -0
- package/dist/esm/embed/cohere.js.map +1 -0
- package/dist/esm/embed/http.d.ts +2 -0
- package/dist/esm/embed/http.js +33 -0
- package/dist/esm/embed/http.js.map +1 -0
- package/dist/esm/embed/identity.d.ts +13 -0
- package/dist/esm/embed/identity.js +92 -0
- package/dist/esm/embed/identity.js.map +1 -0
- package/dist/esm/embed/langfit.d.ts +6 -0
- package/dist/esm/embed/langfit.js +44 -0
- package/dist/esm/embed/langfit.js.map +1 -0
- package/dist/esm/embed/languages.d.ts +3 -0
- package/dist/esm/embed/languages.js +80 -0
- package/dist/esm/embed/languages.js.map +1 -0
- package/dist/esm/embed/openai.d.ts +2 -0
- package/dist/esm/embed/openai.js +49 -0
- package/dist/esm/embed/openai.js.map +1 -0
- package/dist/esm/embed/query.d.ts +21 -0
- package/dist/esm/embed/query.js +181 -0
- package/dist/esm/embed/query.js.map +1 -0
- package/dist/esm/embed/registry.d.ts +3 -0
- package/dist/esm/embed/registry.js +45 -0
- package/dist/esm/embed/registry.js.map +1 -0
- package/dist/esm/embed/static.d.ts +2 -0
- package/dist/esm/embed/static.js +72 -0
- package/dist/esm/embed/static.js.map +1 -0
- package/dist/esm/embed/store.d.ts +8 -0
- package/dist/esm/embed/store.js +123 -0
- package/dist/esm/embed/store.js.map +1 -0
- package/dist/esm/embed/types.d.ts +8 -0
- package/dist/esm/embed/types.js +3 -0
- package/dist/esm/embed/types.js.map +1 -0
- package/dist/esm/errors.d.ts +1 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/features/embed.d.ts +4 -27
- package/dist/esm/features/embed.js +0 -346
- package/dist/esm/features/embed.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/output.d.ts +2 -2
- package/dist/esm/output.js +6 -2
- package/dist/esm/output.js.map +1 -1
- package/dist/esm/scan.js +7 -4
- package/dist/esm/scan.js.map +1 -1
- package/dist/esm/segment.js +49 -19
- package/dist/esm/segment.js.map +1 -1
- package/package.json +9 -1
- package/schema.json +14 -7
- package/skills/sense/SKILL.md +21 -5
- package/skills/sense-setup/EXAMPLES.md +6 -6
- package/skills/sense-setup/SKILL.md +6 -4
package/README.md
CHANGED
|
@@ -74,12 +74,12 @@ ORDER BY bm25(content, 10.0, 5.0, 1.0) LIMIT 10
|
|
|
74
74
|
```json
|
|
75
75
|
{
|
|
76
76
|
"$schema": "https://unpkg.com/sensemaking/schema.json",
|
|
77
|
-
"version":
|
|
77
|
+
"version": 5,
|
|
78
78
|
"presets": {
|
|
79
79
|
"default": { "include": ["**/*.md"], "k": 10 },
|
|
80
80
|
"raw": { "include": ["raw/**/*.md"], "k": 5 }
|
|
81
81
|
},
|
|
82
|
-
"embed": { "model": "minishlab/potion-retrieval-32M", "
|
|
82
|
+
"embed": { "model": "minishlab/potion-retrieval-32M", "provider": "static" },
|
|
83
83
|
"queries": {
|
|
84
84
|
"dead-links": { "sql": "SELECT src, target FROM links WHERE dst IS NULL" },
|
|
85
85
|
"by-tag": { "sql": "SELECT path, title FROM frontmatter WHERE has(tags, ?) ORDER BY path" },
|
|
@@ -90,7 +90,7 @@ ORDER BY bm25(content, 10.0, 5.0, 1.0) LIMIT 10
|
|
|
90
90
|
|
|
91
91
|
| key | holds |
|
|
92
92
|
|---|---|
|
|
93
|
-
| `presets` | named bundles of `include`/`exclude` globs, `k` (result count), `
|
|
93
|
+
| `presets` | named bundles of `include`/`exclude` globs, `k` (result count), `signals` (which engines this scope searches with -- `words`, `links`, `vectors`; every signal whose prerequisites hold, unless the preset lists them exhaustively), `where` (a standing SQL filter). A file is indexed if any preset includes it, embedded if a model is named and some covering preset's `signals` include `vectors`; `status` shows each preset's coverage. |
|
|
94
94
|
| `embed` | the model vectors are built with. Naming one gives the tree vectors; omitting the block means none at all, whatever the presets say. `sense download` fetches it. |
|
|
95
95
|
| `content` | settings for the `content` table. `tokenize` names the FTS5 tokenizer, defaulting to `porter unicode61`: name `trigram` for substring matching inside a Latin word, or `unicode61 tokenchars '-_'` to keep hyphenated terms whole. Languages written without word spaces (Chinese, Japanese, Thai, Khmer, Lao, Burmese) need no decision here: they are indexed per grapheme and searched as ordered phrases, substring semantics, what grep gives, needing no minimum length; naming a tokenizer turns that off, since the tree has then chosen its own scheme. Changing it rebuilds the text index only; vectors, links, and sections are kept. |
|
|
96
96
|
| `queries` | entries runnable as `sense <name>`, each naming the verb it runs: `{ sql }` for SQL (`?` binds positional args) or `{ search }` for a ranked search with its settings baked in, so `sense hot` needs no flags. Running an entry validates it: a typo'd column errors and exits nonzero, and a parameterised entry validates with any argument, since preparing precedes binding. |
|
|
@@ -98,10 +98,38 @@ ORDER BY bm25(content, 10.0, 5.0, 1.0) LIMIT 10
|
|
|
98
98
|
|
|
99
99
|
Bare commands use the `default` preset; `--preset` names another; flags override single fields. Editing a preset rebuilds the cache and says which preset caused it.
|
|
100
100
|
|
|
101
|
-
Vectors need a model
|
|
101
|
+
Vectors need a model. Naming a Hugging Face id in `embed.model` is consent to fetch it: it downloads lazily, on the first vector search, with progress on stderr, into `~/.sense/models` (huggingface_hub's cache layout, one snapshot directory per resolved revision, shared by every tree, 124 MB, never in the package). `sense download` prefetches the same model ahead of time, so the wait happens on your schedule instead of the first query's; it is idempotent and prints the resolved revision. `embed.model` is a Hugging Face id, or a path to a directory holding `model.safetensors` and `tokenizer.json`, which nothing fetches for you. A preset that asks for vectors when a local model path is missing those files is an error naming the fix, rather than a quieter result that would make the same search answer differently before and after; a preset whose `signals` exclude `vectors` never asks, so it is unaffected. An optional top-level `"embed": { "model", "provider", "url", "key" }` block points at any Model2Vec model, local path, or OpenAI-compatible endpoint (Ollama, LM Studio, hosted). Embedding the notes themselves happens on the first vector search, with progress.
|
|
102
102
|
|
|
103
103
|
Two custom SQL functions. `has(field, value)`: array membership on JSON-array fields, substring on strings, false on missing keys. `segment(terms)`: rewrites a run of Chinese, Japanese, Thai, Khmer, Lao, or Burmese text into the ordered grapheme phrase the sidecar columns need, leaving everything else unchanged, so it is safe to add to any hand-written `MATCH`. Frontmatter parsing is lenient: syntax errors are per-file warnings, and the values are still indexed, so one bad note never costs you the crawl.
|
|
104
104
|
|
|
105
|
+
## Providers
|
|
106
|
+
|
|
107
|
+
`embed.provider` picks the wire protocol; `embed.model` names the model. [INTEGRATIONS.md](INTEGRATIONS.md) is the record of what has actually been run and verified against this codebase -- only that gets named as a recommendation.
|
|
108
|
+
|
|
109
|
+
**static** -- a local, pure-JS Model2Vec model; no network at query time.
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
"embed": { "model": "minishlab/potion-retrieval-32M", "provider": "static" }
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`model` is a Hugging Face id, fetched to `~/.sense/models` on first use, or a path to a local directory holding `model.safetensors` and `tokenizer.json`.
|
|
116
|
+
|
|
117
|
+
**openai** -- any endpoint serving an OpenAI-shaped `POST /embeddings`.
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
"embed": { "model": "nomic-embed-text", "provider": "openai", "url": "http://localhost:11434/v1" }
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Ollama serves this shape at `http://localhost:11434/v1`. LM Studio serves the same shape at `http://localhost:1234/v1`, with narrower platform support than Ollama: Apple Silicon only on Mac, AVX2 on Windows. Content stays on the machine for either. Any other OpenAI-shaped endpoint, including a hosted one, works the same way through `provider: "openai"` and its own `url`; a hosted endpoint means tree content is sent to that service.
|
|
124
|
+
|
|
125
|
+
**cohere** -- Cohere's native `/v2/embed`, which expresses the doc/query distinction (`input_type`) the OpenAI shape cannot.
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
"embed": { "model": "embed-v4.0", "provider": "cohere", "key": "COHERE_API_KEY" }
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`key` names the environment variable holding the API key; the key value itself never goes in the config. Content is sent to Cohere.
|
|
132
|
+
|
|
105
133
|
## Scale
|
|
106
134
|
|
|
107
135
|
Every query starts with a freshness check against the cache in `.sense/`; only changed files are re-parsed. What to expect as a tree grows:
|
|
@@ -136,7 +164,7 @@ Two skills: `sense` for querying a tree (what each command is for, FTS5 syntax,
|
|
|
136
164
|
- **RAG / vector stores:** similarity can't express `WHERE status = 'active'`. Here vectors are one signal inside `search`: same SQLite file, filters compose, every row labels its evidence (`via`), and a preset turns vectors off per layer of the tree. No second store, no daemon, no native builds.
|
|
137
165
|
- **Document-OS apps (Anytype, Logseq, SilverBullet, Capacities):** full applications with their own UI and storage. `sense` is headless: your files stay files, there's no app to run.
|
|
138
166
|
|
|
139
|
-
Dependencies: [yaml](https://github.com/eemeli/yaml), [remove-markdown](https://github.com/zuchka/remove-markdown), [@huggingface/tokenizers](https://github.com/huggingface/tokenizers.js) (pure JS), and Node's built-in SQLite. No native builds.
|
|
167
|
+
Dependencies: [yaml](https://github.com/eemeli/yaml), [remove-markdown](https://github.com/zuchka/remove-markdown), [@huggingface/tokenizers](https://github.com/huggingface/tokenizers.js), [franc-min](https://github.com/wooorm/franc) (all pure JS), and Node's built-in SQLite. No native builds.
|
|
140
168
|
|
|
141
169
|
## License
|
|
142
170
|
|
package/dist/cjs/cli/download.js
CHANGED
|
@@ -8,9 +8,10 @@ Object.defineProperty(exports, "default", {
|
|
|
8
8
|
return _default;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
+
var _nodepath = require("node:path");
|
|
11
12
|
var _indexts = require("../config/index.js");
|
|
13
|
+
var _storets = require("../embed/store.js");
|
|
12
14
|
var _errorsts = require("../errors.js");
|
|
13
|
-
var _embedts = require("../features/embed.js");
|
|
14
15
|
var _indexts1 = require("./index.js");
|
|
15
16
|
var _sharedts = require("./shared.js");
|
|
16
17
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
@@ -164,12 +165,11 @@ function _ts_generator(thisArg, body) {
|
|
|
164
165
|
};
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
// is no prompt for CI to bypass; running it twice is a no-op.
|
|
168
|
+
// A prefetch over the store's own fetch path: a search would fetch the same weights
|
|
169
|
+
// lazily, so this only moves the wait earlier. Idempotent; asks nothing, so CI can run it unattended.
|
|
170
170
|
var download = function download(ctx) {
|
|
171
171
|
return _async_to_generator(function() {
|
|
172
|
-
var values, cfg, e, dir;
|
|
172
|
+
var values, cfg, e, at, dir;
|
|
173
173
|
return _ts_generator(this, function(_state) {
|
|
174
174
|
switch(_state.label){
|
|
175
175
|
case 0:
|
|
@@ -177,27 +177,28 @@ var download = function download(ctx) {
|
|
|
177
177
|
cfg = ctx.resolveConfig(values.config);
|
|
178
178
|
e = (0, _indexts.embedConfig)(cfg);
|
|
179
179
|
if (!e) throw new _errorsts.SenseError('EMBED_DISABLED', 'no preset asks for vectors, so there is no model to download');
|
|
180
|
-
if (e.
|
|
181
|
-
console.log('embed
|
|
180
|
+
if (e.provider !== 'static') {
|
|
181
|
+
console.log('embed provider is "'.concat(e.provider, '" (').concat(e.url, "), so there is nothing to download; ").concat(ctx.name, " search reaches it over the network"));
|
|
182
182
|
return [
|
|
183
183
|
2
|
|
184
184
|
];
|
|
185
185
|
}
|
|
186
|
-
if ((0,
|
|
187
|
-
|
|
186
|
+
if ((0, _storets.modelPresent)(cfg)) {
|
|
187
|
+
at = (0, _storets.isDownloadable)(e.model) ? "@".concat((0, _nodepath.basename)((0, _storets.modelDir)(e.model)), " ") : ' ';
|
|
188
|
+
console.log("".concat(e.model).concat(at, "is already available in ").concat((0, _storets.modelDir)(e.model)));
|
|
188
189
|
return [
|
|
189
190
|
2
|
|
190
191
|
];
|
|
191
192
|
}
|
|
192
193
|
return [
|
|
193
194
|
4,
|
|
194
|
-
(0,
|
|
195
|
+
(0, _storets.downloadModel)(e.model, function(file, into) {
|
|
195
196
|
return console.error("fetching ".concat(e.model, "/").concat(file, " into ").concat(into));
|
|
196
197
|
})
|
|
197
198
|
];
|
|
198
199
|
case 1:
|
|
199
200
|
dir = _state.sent();
|
|
200
|
-
console.log("downloaded ".concat(e.model, " into ").concat(dir));
|
|
201
|
+
console.log("downloaded ".concat(e.model, "@").concat((0, _nodepath.basename)(dir), " into ").concat(dir));
|
|
201
202
|
return [
|
|
202
203
|
2
|
|
203
204
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/download.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/download.ts"],"sourcesContent":["import { basename } from 'node:path';\nimport { embedConfig } from '../config/index.ts';\nimport { downloadModel, isDownloadable, modelDir, modelPresent } from '../embed/store.ts';\nimport { SenseError } from '../errors.ts';\nimport { USAGE } from './index.ts';\nimport { CONFIG, parse } from './shared.ts';\nimport type { Command } from './types.ts';\n\n// A prefetch over the store's own fetch path: a search would fetch the same weights\n// lazily, so this only moves the wait earlier. Idempotent; asks nothing, so CI can run it unattended.\nconst download: Command = async (ctx) => {\n const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.download}`, { ...CONFIG });\n const cfg = ctx.resolveConfig(values.config as string | undefined);\n const e = embedConfig(cfg);\n if (!e) throw new SenseError('EMBED_DISABLED', 'no preset asks for vectors, so there is no model to download');\n\n if (e.provider !== 'static') {\n console.log(`embed provider is \"${e.provider}\" (${e.url}), so there is nothing to download; ${ctx.name} search reaches it over the network`);\n return;\n }\n if (modelPresent(cfg)) {\n const at = isDownloadable(e.model) ? `@${basename(modelDir(e.model))} ` : ' ';\n console.log(`${e.model}${at}is already available in ${modelDir(e.model)}`);\n return;\n }\n const dir = await downloadModel(e.model, (file, into) => console.error(`fetching ${e.model}/${file} into ${into}`));\n console.log(`downloaded ${e.model}@${basename(dir)} into ${dir}`);\n};\nexport default download;\n"],"names":["download","ctx","values","cfg","e","at","dir","parse","argv","USAGE","name","CONFIG","resolveConfig","config","embedConfig","SenseError","provider","console","log","url","modelPresent","isDownloadable","model","basename","modelDir","downloadModel","file","into","error"],"mappings":";;;;+BA4BA;;;eAAA;;;wBA5ByB;uBACG;uBAC0C;wBAC3C;wBACL;wBACQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAG9B,oFAAoF;AACpF,sGAAsG;AACtG,IAAMA,WAAoB,kBAAOC;;YACvBC,QACFC,KACAC,GAQEC,IAIFC;;;;oBAdEJ,SAAWK,IAAAA,eAAK,EAACN,IAAIO,IAAI,EAAE,AAAC,UAAqBC,OAAZR,IAAIS,IAAI,EAAC,KAAkB,OAAfD,eAAK,CAACT,QAAQ,GAAI,mBAAKW,gBAAM,GAA9ET;oBACFC,MAAMF,IAAIW,aAAa,CAACV,OAAOW,MAAM;oBACrCT,IAAIU,IAAAA,oBAAW,EAACX;oBACtB,IAAI,CAACC,GAAG,MAAM,IAAIW,oBAAU,CAAC,kBAAkB;oBAE/C,IAAIX,EAAEY,QAAQ,KAAK,UAAU;wBAC3BC,QAAQC,GAAG,CAAC,AAAC,sBAAqCd,OAAhBA,EAAEY,QAAQ,EAAC,OAAiDf,OAA5CG,EAAEe,GAAG,EAAC,wCAA+C,OAATlB,IAAIS,IAAI,EAAC;wBACvG;;;oBACF;oBACA,IAAIU,IAAAA,qBAAY,EAACjB,MAAM;wBACfE,KAAKgB,IAAAA,uBAAc,EAACjB,EAAEkB,KAAK,IAAI,AAAC,IAA+B,OAA5BC,IAAAA,kBAAQ,EAACC,IAAAA,iBAAQ,EAACpB,EAAEkB,KAAK,IAAG,OAAK;wBAC1EL,QAAQC,GAAG,CAAC,AAAC,GAAYb,OAAVD,EAAEkB,KAAK,EAAgCE,OAA7BnB,IAAG,4BAA4C,OAAlBmB,IAAAA,iBAAQ,EAACpB,EAAEkB,KAAK;wBACtE;;;oBACF;oBACY;;wBAAMG,IAAAA,sBAAa,EAACrB,EAAEkB,KAAK,EAAE,SAACI,MAAMC;mCAASV,QAAQW,KAAK,CAAC,AAAC,YAAsBF,OAAXtB,EAAEkB,KAAK,EAAC,KAAgBK,OAAbD,MAAK,UAAa,OAALC;;;;oBAArGrB,MAAM;oBACZW,QAAQC,GAAG,CAAC,AAAC,cAAwBK,OAAXnB,EAAEkB,KAAK,EAAC,KAAyBhB,OAAtBiB,IAAAA,kBAAQ,EAACjB,MAAK,UAAY,OAAJA;;;;;;IAC7D;;IACA,WAAeN"}
|
package/dist/cjs/cli/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Command } from './types.js';
|
|
2
2
|
export declare const USAGE: {
|
|
3
|
-
readonly init: "init";
|
|
3
|
+
readonly init: "init [--model id-or-path] [--provider static|openai|cohere] [--url url]";
|
|
4
4
|
readonly watch: "watch [--force] [--config path]";
|
|
5
5
|
readonly status: "status [--format table|json] [--config path]";
|
|
6
6
|
readonly download: "download [--config path]";
|
package/dist/cjs/cli/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Command } from './types.js';
|
|
2
2
|
export declare const USAGE: {
|
|
3
|
-
readonly init: "init";
|
|
3
|
+
readonly init: "init [--model id-or-path] [--provider static|openai|cohere] [--url url]";
|
|
4
4
|
readonly watch: "watch [--force] [--config path]";
|
|
5
5
|
readonly status: "status [--format table|json] [--config path]";
|
|
6
6
|
readonly download: "download [--config path]";
|
package/dist/cjs/cli/index.js
CHANGED
|
@@ -47,7 +47,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
47
47
|
return newObj;
|
|
48
48
|
}
|
|
49
49
|
var USAGE = {
|
|
50
|
-
init: 'init',
|
|
50
|
+
init: 'init [--model id-or-path] [--provider static|openai|cohere] [--url url]',
|
|
51
51
|
watch: 'watch [--force] [--config path]',
|
|
52
52
|
status: 'status [--format table|json] [--config path]',
|
|
53
53
|
download: 'download [--config path]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/index.ts"],"sourcesContent":["import type { Command } from './types.ts';\n\n// Each command's usage line, minus the leading \"usage: <name> \" -- shared by cli.ts's\n// top-level usage() and the command's own parse() error/--help output, so there is one\n// copy of each line, not two that can drift.\nexport const USAGE = {\n init: 'init',\n watch: 'watch [--force] [--config path]',\n status: 'status [--format table|json] [--config path]',\n download: 'download [--config path]',\n sql: 'sql \"<statement>\" [params...] [--preset name] [--format table|json|csv] [--config path]',\n search: 'search \"<terms>\" [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--k n] [--format table|json|csv] [--config path]',\n map: 'map [--format table|json] [--config path]',\n peek: 'peek <path> [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--format table|json] [--config path]',\n path: 'path <a> <b> [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--max-depth n] [--format table|json] [--config path]',\n related: 'related <note> [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--k n] [--format table|json|csv] [--config path]',\n} as const;\n\n// Lazy registry: a command's imports load only when it runs, so a heavy dependency in one\n// command never taxes the others (or --version/--help). These names are reserved: a saved\n// entry in config can never shadow them.\nexport const COMMANDS: Record<string, () => Promise<{ default: Command }>> = {\n init: () => import('./init.ts'),\n watch: () => import('./watch.ts'),\n status: () => import('./status.ts'),\n download: () => import('./download.ts'),\n sql: () => import('./sql.ts'),\n search: () => import('./search.ts'),\n map: () => import('./map.ts'),\n peek: () => import('./peek.ts'),\n path: () => import('./path.ts'),\n related: () => import('./related.ts'),\n};\n\nexport type { Command, Ctx } from './types.ts';\n"],"names":["COMMANDS","USAGE","init","watch","status","download","sql","search","map","peek","path","related"],"mappings":";;;;;;;;;;;QAqBaA;eAAAA;;QAhBAC;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAN,IAAMA,QAAQ;IACnBC,MAAM;IACNC,OAAO;IACPC,QAAQ;IACRC,UAAU;IACVC,KAAK;IACLC,QAAQ;IACRC,KAAK;IACLC,MAAM;IACNC,MAAM;IACNC,SAAS;AACX;AAKO,IAAMX,WAAgE;IAC3EE,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,OAAO,SAAPA;eAAa;2DAAA,QAAO;;;IACpBC,QAAQ,SAARA;eAAc;2DAAA,QAAO;;;IACrBC,UAAU,SAAVA;eAAgB;2DAAA,QAAO;;;IACvBC,KAAK,SAALA;eAAW;2DAAA,QAAO;;;IAClBC,QAAQ,SAARA;eAAc;2DAAA,QAAO;;;IACrBC,KAAK,SAALA;eAAW;2DAAA,QAAO;;;IAClBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,SAAS,SAATA;eAAe;2DAAA,QAAO;;;AACxB"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/index.ts"],"sourcesContent":["import type { Command } from './types.ts';\n\n// Each command's usage line, minus the leading \"usage: <name> \" -- shared by cli.ts's\n// top-level usage() and the command's own parse() error/--help output, so there is one\n// copy of each line, not two that can drift.\nexport const USAGE = {\n init: 'init [--model id-or-path] [--provider static|openai|cohere] [--url url]',\n watch: 'watch [--force] [--config path]',\n status: 'status [--format table|json] [--config path]',\n download: 'download [--config path]',\n sql: 'sql \"<statement>\" [params...] [--preset name] [--format table|json|csv] [--config path]',\n search: 'search \"<terms>\" [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--k n] [--format table|json|csv] [--config path]',\n map: 'map [--format table|json] [--config path]',\n peek: 'peek <path> [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--format table|json] [--config path]',\n path: 'path <a> <b> [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--max-depth n] [--format table|json] [--config path]',\n related: 'related <note> [--preset name] [--include glob ...] [--exclude glob ...] [--no-exclude] [--where \"<sql>\"] [--k n] [--format table|json|csv] [--config path]',\n} as const;\n\n// Lazy registry: a command's imports load only when it runs, so a heavy dependency in one\n// command never taxes the others (or --version/--help). These names are reserved: a saved\n// entry in config can never shadow them.\nexport const COMMANDS: Record<string, () => Promise<{ default: Command }>> = {\n init: () => import('./init.ts'),\n watch: () => import('./watch.ts'),\n status: () => import('./status.ts'),\n download: () => import('./download.ts'),\n sql: () => import('./sql.ts'),\n search: () => import('./search.ts'),\n map: () => import('./map.ts'),\n peek: () => import('./peek.ts'),\n path: () => import('./path.ts'),\n related: () => import('./related.ts'),\n};\n\nexport type { Command, Ctx } from './types.ts';\n"],"names":["COMMANDS","USAGE","init","watch","status","download","sql","search","map","peek","path","related"],"mappings":";;;;;;;;;;;QAqBaA;eAAAA;;QAhBAC;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAN,IAAMA,QAAQ;IACnBC,MAAM;IACNC,OAAO;IACPC,QAAQ;IACRC,UAAU;IACVC,KAAK;IACLC,QAAQ;IACRC,KAAK;IACLC,MAAM;IACNC,MAAM;IACNC,SAAS;AACX;AAKO,IAAMX,WAAgE;IAC3EE,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,OAAO,SAAPA;eAAa;2DAAA,QAAO;;;IACpBC,QAAQ,SAARA;eAAc;2DAAA,QAAO;;;IACrBC,UAAU,SAAVA;eAAgB;2DAAA,QAAO;;;IACvBC,KAAK,SAALA;eAAW;2DAAA,QAAO;;;IAClBC,QAAQ,SAARA;eAAc;2DAAA,QAAO;;;IACrBC,KAAK,SAALA;eAAW;2DAAA,QAAO;;;IAClBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,MAAM,SAANA;eAAY;2DAAA,QAAO;;;IACnBC,SAAS,SAATA;eAAe;2DAAA,QAAO;;;AACxB"}
|
package/dist/cjs/cli/init.js
CHANGED
|
@@ -12,13 +12,39 @@ var _indexts = require("../config/index.js");
|
|
|
12
12
|
var _indexts1 = require("./index.js");
|
|
13
13
|
var _sharedts = require("./shared.js");
|
|
14
14
|
var init = function init(ctx) {
|
|
15
|
-
(0, _sharedts.parse)(ctx.argv, "usage: ".concat(ctx.name, " ").concat(_indexts1.USAGE.init), {
|
|
16
|
-
|
|
15
|
+
var values = (0, _sharedts.parse)(ctx.argv, "usage: ".concat(ctx.name, " ").concat(_indexts1.USAGE.init), {
|
|
16
|
+
model: {
|
|
17
|
+
type: 'string'
|
|
18
|
+
},
|
|
19
|
+
provider: {
|
|
20
|
+
type: 'string'
|
|
21
|
+
},
|
|
22
|
+
url: {
|
|
23
|
+
type: 'string'
|
|
24
|
+
}
|
|
25
|
+
}).values;
|
|
26
|
+
var modelFlag = values.model;
|
|
27
|
+
var providerFlag = values.provider;
|
|
28
|
+
var model = modelFlag !== null && modelFlag !== void 0 ? modelFlag : _indexts.DEFAULT_EMBED_MODEL;
|
|
29
|
+
var provider = providerFlag !== null && providerFlag !== void 0 ? providerFlag : 'static';
|
|
30
|
+
var url = values.url;
|
|
31
|
+
// An invalid --provider throws here (validateConfig's own shape error), before anything is
|
|
32
|
+
// written -- one validator, not a second copy of its rules.
|
|
33
|
+
var configPath = (0, _indexts.initConfig)(process.cwd(), {
|
|
34
|
+
model: modelFlag,
|
|
35
|
+
provider: providerFlag,
|
|
36
|
+
url: url
|
|
37
|
+
});
|
|
17
38
|
console.log("created ".concat(configPath));
|
|
18
39
|
console.log("query away: ".concat(ctx.name, ' sql "SELECT path FROM frontmatter LIMIT 10"'));
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
|
|
40
|
+
// Naming a model is consent to fetch it, so writing one into the config says so loudly,
|
|
41
|
+
// with the download consequence and the prefetch command, right where it was just written.
|
|
42
|
+
if (provider === 'static') {
|
|
43
|
+
console.log("embed model: ".concat(model, " (static); nothing downloads until the first vector search -- ").concat(ctx.name, " download fetches it now instead"));
|
|
44
|
+
} else {
|
|
45
|
+
console.log("embed model: ".concat(model, " (").concat(provider).concat(url ? " at ".concat(url) : '', "); reached over the network at search time, nothing to download"));
|
|
46
|
+
}
|
|
47
|
+
console.log('a non-English tree should pick a model for its languages: see the sense-setup skill or INTEGRATIONS.md');
|
|
22
48
|
// The decisions a new tree faces -- features, frontmatter conventions, note size -- are not
|
|
23
49
|
// in this output; name both places that hold them, since an agent may have neither.
|
|
24
50
|
console.log('features and tree design: the sense-setup skill, or schema.json');
|
package/dist/cjs/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/init.ts"],"sourcesContent":["import { initConfig } from '../config/index.ts';\nimport { USAGE } from './index.ts';\nimport { parse } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst init: Command = (ctx) => {\n parse(ctx.argv, `usage: ${ctx.name} ${USAGE.init}`, {});\n const configPath = initConfig(process.cwd());\n console.log(`created ${configPath}`);\n console.log(`query away: ${ctx.name} sql \"SELECT path FROM frontmatter LIMIT 10\"`);\n //
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli/init.ts"],"sourcesContent":["import { DEFAULT_EMBED_MODEL, initConfig } from '../config/index.ts';\nimport { USAGE } from './index.ts';\nimport { parse } from './shared.ts';\nimport type { Command } from './types.ts';\n\nconst init: Command = (ctx) => {\n const { values } = parse(ctx.argv, `usage: ${ctx.name} ${USAGE.init}`, {\n model: { type: 'string' },\n provider: { type: 'string' },\n url: { type: 'string' },\n });\n const modelFlag = values.model as string | undefined;\n const providerFlag = values.provider as string | undefined;\n const model = modelFlag ?? DEFAULT_EMBED_MODEL;\n const provider = providerFlag ?? 'static';\n const url = values.url as string | undefined;\n // An invalid --provider throws here (validateConfig's own shape error), before anything is\n // written -- one validator, not a second copy of its rules.\n const configPath = initConfig(process.cwd(), { model: modelFlag, provider: providerFlag, url });\n console.log(`created ${configPath}`);\n console.log(`query away: ${ctx.name} sql \"SELECT path FROM frontmatter LIMIT 10\"`);\n // Naming a model is consent to fetch it, so writing one into the config says so loudly,\n // with the download consequence and the prefetch command, right where it was just written.\n if (provider === 'static') {\n console.log(`embed model: ${model} (static); nothing downloads until the first vector search -- ${ctx.name} download fetches it now instead`);\n } else {\n console.log(`embed model: ${model} (${provider}${url ? ` at ${url}` : ''}); reached over the network at search time, nothing to download`);\n }\n console.log('a non-English tree should pick a model for its languages: see the sense-setup skill or INTEGRATIONS.md');\n // The decisions a new tree faces -- features, frontmatter conventions, note size -- are not\n // in this output; name both places that hold them, since an agent may have neither.\n console.log('features and tree design: the sense-setup skill, or schema.json');\n};\nexport default init;\n"],"names":["init","ctx","values","parse","argv","USAGE","name","model","type","provider","url","modelFlag","providerFlag","DEFAULT_EMBED_MODEL","configPath","initConfig","process","cwd","console","log"],"mappings":";;;;+BAiCA;;;eAAA;;;uBAjCgD;wBAC1B;wBACA;AAGtB,IAAMA,OAAgB,cAACC;IACrB,IAAM,AAAEC,SAAWC,IAAAA,eAAK,EAACF,IAAIG,IAAI,EAAE,AAAC,UAAqBC,OAAZJ,IAAIK,IAAI,EAAC,KAAc,OAAXD,eAAK,CAACL,IAAI,GAAI;QACrEO,OAAO;YAAEC,MAAM;QAAS;QACxBC,UAAU;YAAED,MAAM;QAAS;QAC3BE,KAAK;YAAEF,MAAM;QAAS;IACxB,GAJQN;IAKR,IAAMS,YAAYT,OAAOK,KAAK;IAC9B,IAAMK,eAAeV,OAAOO,QAAQ;IACpC,IAAMF,QAAQI,sBAAAA,uBAAAA,YAAaE,4BAAmB;IAC9C,IAAMJ,WAAWG,yBAAAA,0BAAAA,eAAgB;IACjC,IAAMF,MAAMR,OAAOQ,GAAG;IACtB,2FAA2F;IAC3F,4DAA4D;IAC5D,IAAMI,aAAaC,IAAAA,mBAAU,EAACC,QAAQC,GAAG,IAAI;QAAEV,OAAOI;QAAWF,UAAUG;QAAcF,KAAAA;IAAI;IAC7FQ,QAAQC,GAAG,CAAC,AAAC,WAAqB,OAAXL;IACvBI,QAAQC,GAAG,CAAC,AAAC,eAAuB,OAATlB,IAAIK,IAAI,EAAC;IACpC,wFAAwF;IACxF,2FAA2F;IAC3F,IAAIG,aAAa,UAAU;QACzBS,QAAQC,GAAG,CAAC,AAAC,gBAAqFlB,OAAtEM,OAAM,kEAAyE,OAATN,IAAIK,IAAI,EAAC;IAC7G,OAAO;QACLY,QAAQC,GAAG,CAAC,AAAC,gBAAyBV,OAAVF,OAAM,MAAeG,OAAXD,UAAmC,OAAxBC,MAAM,AAAC,OAAU,OAAJA,OAAQ,IAAG;IAC3E;IACAQ,QAAQC,GAAG,CAAC;IACZ,4FAA4F;IAC5F,oFAAoF;IACpFD,QAAQC,GAAG,CAAC;AACd;IACA,WAAenB"}
|