oh-my-second-brain 0.7.0 → 0.8.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG-assets.md +2 -0
- package/CHANGELOG-cli.md +11 -0
- package/CHANGELOG-kernel.md +17 -0
- package/CHANGELOG-mcp.md +2 -0
- package/CHANGELOG-vendors.md +2 -0
- package/CHANGELOG.md +26 -0
- package/README.md +9 -4
- package/assets/hermes-manifest.json +1 -1
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.js +6 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/oms.js +15 -1
- package/dist/cli/oms.js.map +1 -1
- package/dist/cli/usage.js +18 -1
- package/dist/cli/usage.js.map +1 -1
- package/dist/kernel/engine/embed/chunker.d.ts +2 -1
- package/dist/kernel/engine/embed/chunker.js +40 -6
- package/dist/kernel/engine/embed/chunker.js.map +1 -1
- package/dist/kernel/engine/embed/model.d.ts +26 -0
- package/dist/kernel/engine/embed/model.js +40 -2
- package/dist/kernel/engine/embed/model.js.map +1 -1
- package/dist/kernel/engine/embed/provider.js +31 -8
- package/dist/kernel/engine/embed/provider.js.map +1 -1
- package/dist/kernel/engine/embed/store.d.ts +12 -0
- package/dist/kernel/engine/embed/store.js +41 -7
- package/dist/kernel/engine/embed/store.js.map +1 -1
- package/dist/kernel/engine/embed/sync.js +2 -2
- package/dist/kernel/engine/embed/sync.js.map +1 -1
- package/dist/kernel/engine/types.d.ts +21 -3
- package/dist/kernel/engine/types.js +10 -1
- package/dist/kernel/engine/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "oms",
|
|
12
12
|
"description": "Oh My Second Brain convention layer for Obsidian vaults — capture, retrieve, and validate knowledge under a declared semantic convention.",
|
|
13
|
-
"version": "0.
|
|
13
|
+
"version": "0.8.0",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "gobeumsu",
|
|
16
16
|
"email": "gobeumsu@gmail.com"
|
|
@@ -37,5 +37,5 @@
|
|
|
37
37
|
]
|
|
38
38
|
}
|
|
39
39
|
],
|
|
40
|
-
"version": "0.
|
|
40
|
+
"version": "0.8.0"
|
|
41
41
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Oh My Second Brain convention layer for Obsidian vaults — Codex native rules, skills, and MCP adapter.",
|
|
5
5
|
"_note": "oms install writes Codex MCP config, installs ~/.codex/rules/oms.md, and installs ~/.codex/skills/oms-*.",
|
|
6
6
|
"skills": "./assets/skills/",
|
package/CHANGELOG-assets.md
CHANGED
package/CHANGELOG-cli.md
CHANGED
|
@@ -4,6 +4,17 @@ Changes to the `oms` command surface belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.8.0] - 2026-08-29
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`oms setup --embedding-default` installs a working local embedding model in one step.** It downloads the pinned EmbeddingGemma-300M model, verifies it against the shipped SHA-256, and publishes it to the user-level cache. After that, `oms embed` and vector search work without setting `OMS_EMBEDDING_PROVIDER` or `OMS_EMBEDDING_MODEL` at all — the gap that previously forced anyone wanting native semantic search to hand-author a descriptor JSON or export a matching environment pair. Nothing changes for a vault that does not run it: with no model installed, lexical search keeps working and vector requests still fail loudly naming both variables, and the guidance now names this command as the one-step remedy.
|
|
12
|
+
- The three setup embedding options are mutually exclusive and now say so. Passing more than one of `--embedding-default`, `--embedding-descriptor`, or `--embedding-no-default` exits with an error naming the conflicting flags instead of silently letting one win.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- `oms --help` documents the setup embedding options. All three existed only in source before this; `--embedding-descriptor` and `--embedding-no-default` shipped undocumented.
|
|
17
|
+
|
|
7
18
|
## [0.7.0] - 2026-08-27
|
|
8
19
|
|
|
9
20
|
### Breaking
|
package/CHANGELOG-kernel.md
CHANGED
|
@@ -4,6 +4,23 @@ Domain logic changes belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.8.0] - 2026-08-29
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **A pinned default embedding model is now available for explicit one-step install.** `PINNED_DEFAULT_EMBEDDING_MODEL` describes EmbeddingGemma-300M (`embeddinggemma-300M-Q8_0.gguf`, 768d, 2048-token context) with its source URL and a verified SHA-256 of `b5ce9d77…90d63`. This is the same model qmd resolves from its own `DEFAULT_EMBED_MODEL_URI`, so a vault indexed by `oms embed` gets that toolchain's retrieval quality instead of a lesser stand-in. The constant is deliberately **not** a fallback: `resolveEmbeddingModel` never reaches for it, because an implicit default would defeat the E-1 no-default contract, which verifies at runtime that embedding capability stays honestly unavailable with no environment pair and an empty cache. Its only consumer is the explicit setup acquisition path, which verifies the downloaded bytes against the pinned digest before publishing them. ADR-007 P-B is unaffected — a real, explicitly installed model was never the fake fallback that principle forbids.
|
|
12
|
+
- **Chunks now carry their document title into the embedding input.** `Chunk.title` is resolved from frontmatter `title`, then the first ATX H1, then the literal `none`, and `EmbeddingProvider.embed(text, title?)` accepts it. A passage prefix may declare a `{title}` slot, which the GGUF and Upstage providers substitute per chunk; the pinned descriptor uses `title: {title} | text: `, reproducing qmd's `formatDocForEmbedding` byte-for-byte. This matters for retrieval rather than cosmetics: a chunk from the middle of a note is frequently ambiguous on its own, and the document title is the cheapest available disambiguating context. A prefix without the slot is prepended exactly as before, so every existing descriptor keeps its current behavior.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- **Chunk change-detection digests now cover the document title as well as the chunk text.** The title reaches every chunk's embedding input, so a digest over text alone reported "unchanged" for each chunk that did not itself contain the title line — leaving stored vectors that still encoded the *old* title after a retitle. The digest is now taken over title and text with a NUL separator, so no retitle can collide with a body edit. The cost is explicit: because the digest formula changed, the first `oms embed` after upgrading re-embeds every chunk once. We chose that over making the digest conditional on provider configuration, which would have coupled chunking to embedding settings and left the stale-vector bug reachable.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **Vector queries no longer fail outright on an unbounded candidate limit.** Without an explicit `candidateLimit`, the MCP facade requests `Number.MAX_SAFE_INTEGER` candidates so it retrieves the complete ranked stream and keeps `totalCount` and offset cursors accurate past the first page. FTS tolerates that, but sqlite-vec rejects any knn `k` above its own 4096 ceiling, so every vector and HyDE query failed with `k value in knn query too large`. The collection-scoped branch had the same defect from the opposite direction: it passed the *total* chunk count, which fails on any vault with more than 4096 chunks. The store — the only layer that knows the extension's constraint — now clamps `k` into the supported range, and a non-positive request collapses to 1 rather than 0 so a caller asking for "some" results never silently gets an empty page. This was unreachable in practice until now, because a vault with no embedding model never got as far as a vector query; configuring a local model exposed it immediately.
|
|
21
|
+
|
|
22
|
+
The clamp is a genuine ceiling, not a cure-all, and it moves the cost rather than removing it. In a vault with more than 4096 chunks the vector candidate stream is truncated, so a vector-derived `totalCount` and any deep page beyond that band are bounded by it; a collection-scoped query is affected more sharply, because sqlite-vec ranks before the collection predicate is applied, so a collection whose chunks all fall outside the band can be starved. Both are properties of ANN-before-predicate search in sqlite-vec. The alternative was failing every vector query outright, which is what shipped before this clamp.
|
|
23
|
+
|
|
7
24
|
## [0.7.0] - 2026-08-27
|
|
8
25
|
|
|
9
26
|
### Breaking
|
package/CHANGELOG-mcp.md
CHANGED
package/CHANGELOG-vendors.md
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,32 @@ This aggregate changelog contains changes that span multiple layers.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.8.0] - 2026-08-29
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **Semantic search now has a one-step setup.** `oms setup --embedding-default` downloads EmbeddingGemma-300M, verifies it against a pinned SHA-256, and installs it under your user cache — not in the vault. After that, `oms embed` and vector search work with no environment variables at all:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
oms setup --embedding-default
|
|
21
|
+
oms embed
|
|
22
|
+
oms semantic vsearch "what should I retrieve?"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Until now, native semantic search worked only if you hand-authored a model descriptor JSON or exported a matching `OMS_EMBEDDING_PROVIDER` + `OMS_EMBEDDING_MODEL` pair. The model runs locally through `node-llama-cpp`, needs no API key, and embeds at its full 768 dimensions with no folding.
|
|
26
|
+
|
|
27
|
+
Choosing your own model is unchanged: set both environment variables, or pass `oms setup --embedding-descriptor <path>`. Setting only one of the pair is still an error naming both, never a silent fallback. Installing no model is still fine — lexical search, graph retrieval, and convention validation all keep working, and only vector and HyDE requests are refused.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **Note titles now inform semantic search results.** A chunk from the middle of a note is often ambiguous on its own, so each chunk's embedding now includes its document title (frontmatter `title`, else the first `# heading`). A note titled "Kubernetes Pod Scheduling" whose body only says "the controller assigns each pending item to the best-fit node" is now findable by searching for Kubernetes.
|
|
32
|
+
|
|
33
|
+
**One-time cost when you upgrade:** because the title is part of what gets embedded, it is also part of how OMS detects changes — otherwise renaming a note would leave most of its chunks holding vectors that still encode the old title. That changes the change-detection digest, so the first `oms embed` after upgrading re-embeds your vault once. Subsequent runs are incremental again.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- **Vector search was completely broken and now works.** Every vector or HyDE query failed with `k value in knn query too large`, because the search layer asks for an unbounded candidate set and the vector index rejects any request above its own 4096-result ceiling. Collection-scoped vector queries had the same defect from the other direction, failing on any vault with more than 4096 chunks. This affected anyone who had configured an embedding model; without one, queries never reached the vector path at all. No reindex is needed for this fix.
|
|
38
|
+
|
|
13
39
|
## [0.7.0] - 2026-08-27
|
|
14
40
|
|
|
15
41
|
### Breaking
|
package/README.md
CHANGED
|
@@ -103,14 +103,19 @@ oms hook Vault guard hooks (Claude Code pre/post tool-use)
|
|
|
103
103
|
|
|
104
104
|
## Semantic search (optional)
|
|
105
105
|
|
|
106
|
-
Semantic retrieval requires a real embedding model — there is no fake/hash fallback (ADR-007).
|
|
106
|
+
Semantic retrieval requires a real embedding model — there is no fake/hash fallback (ADR-007). The quickest path is the pinned local default:
|
|
107
107
|
|
|
108
108
|
```bash
|
|
109
|
-
oms
|
|
110
|
-
oms
|
|
109
|
+
oms setup --vault /path/to/vault --yes --embedding-default
|
|
110
|
+
oms embed --vault /path/to/vault
|
|
111
|
+
oms semantic vsearch "what should I retrieve?" --vault /path/to/vault
|
|
111
112
|
```
|
|
112
113
|
|
|
113
|
-
|
|
114
|
+
`--embedding-default` downloads EmbeddingGemma-300M (~318 MB), verifies it against a pinned SHA-256, and installs it under your user cache — not in the vault. It runs locally through `node-llama-cpp`, needs no API key, and embeds at the model's full 768 dimensions with no folding. After that, `oms embed` and vector search need no environment variables.
|
|
115
|
+
|
|
116
|
+
To choose your own model instead, set `OMS_EMBEDDING_PROVIDER` + `OMS_EMBEDDING_MODEL` (`gguf` with a local GGUF path, or `upstage` with a model id and `UPSTAGE_API_KEY`). Setting only one of the pair is an error naming both, never a silent fallback.
|
|
117
|
+
|
|
118
|
+
Without any model, lexical search, graph-based retrieval, and convention validation all still work; only vector and HyDE requests are refused, and they say which variables to set.
|
|
114
119
|
|
|
115
120
|
## Development
|
|
116
121
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Oh My Second Brain convention layer for Obsidian vaults — Hermes skill bundle and MCP adapter.",
|
|
5
5
|
"_note": "oms install writes ~/.hermes/config.yaml mcp_servers.oms and installs skills under ~/.hermes/skills/knowledge-management/oms/."
|
|
6
6
|
}
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ export interface ParsedCliArgs {
|
|
|
24
24
|
readonly conventionNote: boolean;
|
|
25
25
|
readonly embeddingDescriptorPath: string | undefined;
|
|
26
26
|
readonly embeddingNoDefault: boolean;
|
|
27
|
+
/** setup: install the pinned default embedding model. */
|
|
28
|
+
readonly embeddingDefault: boolean;
|
|
27
29
|
readonly unknownFlags: readonly string[];
|
|
28
30
|
readonly error: CliArgumentError | undefined;
|
|
29
31
|
}
|
package/dist/cli/args.js
CHANGED
|
@@ -32,6 +32,7 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
32
32
|
let conventionNote = true;
|
|
33
33
|
let embeddingDescriptorPath;
|
|
34
34
|
let embeddingNoDefault = false;
|
|
35
|
+
let embeddingDefault = false;
|
|
35
36
|
const unknownFlags = [];
|
|
36
37
|
for (let i = 1; i < argv.length; i++) {
|
|
37
38
|
const arg = argv[i];
|
|
@@ -111,6 +112,9 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
111
112
|
else if (arg === "--embedding-no-default") {
|
|
112
113
|
embeddingNoDefault = true;
|
|
113
114
|
}
|
|
115
|
+
else if (arg === "--embedding-default") {
|
|
116
|
+
embeddingDefault = true;
|
|
117
|
+
}
|
|
114
118
|
else if (arg !== undefined) {
|
|
115
119
|
unknownFlags.push(arg);
|
|
116
120
|
}
|
|
@@ -136,6 +140,7 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
136
140
|
conventionNote,
|
|
137
141
|
embeddingDescriptorPath,
|
|
138
142
|
embeddingNoDefault,
|
|
143
|
+
embeddingDefault,
|
|
139
144
|
unknownFlags,
|
|
140
145
|
error: undefined,
|
|
141
146
|
};
|
|
@@ -161,6 +166,7 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
161
166
|
conventionNote,
|
|
162
167
|
embeddingDescriptorPath,
|
|
163
168
|
embeddingNoDefault,
|
|
169
|
+
embeddingDefault,
|
|
164
170
|
unknownFlags,
|
|
165
171
|
error: new CliArgumentError(message),
|
|
166
172
|
};
|
package/dist/cli/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAG/E,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/oms.js
CHANGED
|
@@ -7,6 +7,7 @@ import { runPreToolUse } from "../vendors/claude/hook/pre-tool-use.js";
|
|
|
7
7
|
import { resolveEffectiveVault } from "../kernel/link/link.js";
|
|
8
8
|
import { runMcpServer } from "../mcp/server.js";
|
|
9
9
|
import { resolveBundledAssetPaths } from "../kernel/runtime/assets.js";
|
|
10
|
+
import { PINNED_DEFAULT_EMBEDDING_MODEL } from "../kernel/engine/embed/model.js";
|
|
10
11
|
import { parseCliArgs } from "./args.js";
|
|
11
12
|
import { runAudit } from "./audit.js";
|
|
12
13
|
import { runDoctor, runLint } from "./doctor-lint.js";
|
|
@@ -42,7 +43,7 @@ async function main() {
|
|
|
42
43
|
process.exitCode = 1;
|
|
43
44
|
return;
|
|
44
45
|
}
|
|
45
|
-
let { command, vault, vaultExplicit, yes, apply, installClaude, suggestFields, runtime, dryRun, executeExternal, checkUpdate, timeoutMs, agentVault, verbose, json, maxPerConcept, folders, conventionNote, embeddingDescriptorPath, embeddingNoDefault, unknownFlags, } = parsedArgs;
|
|
46
|
+
let { command, vault, vaultExplicit, yes, apply, installClaude, suggestFields, runtime, dryRun, executeExternal, checkUpdate, timeoutMs, agentVault, verbose, json, maxPerConcept, folders, conventionNote, embeddingDescriptorPath, embeddingNoDefault, embeddingDefault, unknownFlags, } = parsedArgs;
|
|
46
47
|
// `mcp` keeps the FULL resolution result: the write surface trusts every
|
|
47
48
|
// source except `cwd`, so the server needs the source, not just the path.
|
|
48
49
|
let mcpTarget;
|
|
@@ -72,10 +73,23 @@ async function main() {
|
|
|
72
73
|
vault = (await resolveEffectiveVault(process.cwd(), process.env)).vault;
|
|
73
74
|
}
|
|
74
75
|
if (command === "setup") {
|
|
76
|
+
const embeddingChoices = [
|
|
77
|
+
embeddingDescriptorPath !== undefined ? "--embedding-descriptor" : undefined,
|
|
78
|
+
embeddingDefault ? "--embedding-default" : undefined,
|
|
79
|
+
embeddingNoDefault ? "--embedding-no-default" : undefined,
|
|
80
|
+
].filter((flag) => flag !== undefined);
|
|
81
|
+
if (embeddingChoices.length > 1) {
|
|
82
|
+
console.error(`[oms] Choose one embedding option, not ${embeddingChoices.join(" and ")}.`);
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
75
86
|
let embeddingDescriptor;
|
|
76
87
|
if (embeddingDescriptorPath !== undefined) {
|
|
77
88
|
embeddingDescriptor = JSON.parse(readFileSync(embeddingDescriptorPath, "utf8"));
|
|
78
89
|
}
|
|
90
|
+
else if (embeddingDefault) {
|
|
91
|
+
embeddingDescriptor = PINNED_DEFAULT_EMBEDDING_MODEL;
|
|
92
|
+
}
|
|
79
93
|
else if (embeddingNoDefault) {
|
|
80
94
|
embeddingDescriptor = null;
|
|
81
95
|
}
|
package/dist/cli/oms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oms.js","sourceRoot":"","sources":["../../src/cli/oms.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oms.js","sourceRoot":"","sources":["../../src/cli/oms.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/usage.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { harnessSurfaceRegistry } from "../kernel/harness/surface-registry.js";
|
|
2
2
|
const MAIN_USAGE_COMMANDS = [
|
|
3
|
-
{
|
|
3
|
+
{
|
|
4
|
+
name: "setup",
|
|
5
|
+
line: " setup Adopt an existing vault into the Oh My Second Brain convention.",
|
|
6
|
+
detailLines: [
|
|
7
|
+
" --embedding-default Install the pinned local embedding model (EmbeddingGemma-300M, 768d).",
|
|
8
|
+
" --embedding-descriptor <path> Install an operator-supplied model descriptor instead.",
|
|
9
|
+
" --embedding-no-default Waive model installation; vector search stays unavailable.",
|
|
10
|
+
],
|
|
11
|
+
},
|
|
4
12
|
{ name: "install", line: " install Install Oh My Second Brain host adapters and MCP registration." },
|
|
5
13
|
{ name: "uninstall", line: " uninstall Remove Oh My Second Brain host adapters and MCP registration." },
|
|
6
14
|
{ name: "update", line: " update Check for or apply an explicit package update, then refresh host adapters." },
|
|
@@ -61,6 +69,7 @@ oh-my-second-brain — Oh My Second Brain convention layer for Obsidian vaults
|
|
|
61
69
|
|
|
62
70
|
Usage:
|
|
63
71
|
oh-my-second-brain setup [--vault <path>] [--yes] [--suggest-fields] [--install-claude]
|
|
72
|
+
[--embedding-default | --embedding-descriptor <path> | --embedding-no-default]
|
|
64
73
|
oh-my-second-brain install [--vault <path>] [--runtime <${runtime}>] [--dry-run] [--execute] [--yes] [--json]
|
|
65
74
|
oh-my-second-brain uninstall [--runtime <all|${registry.hosts.map((host) => host.runtime).join("|")}>] [--dry-run] [--execute] [--yes] [--json]
|
|
66
75
|
oh-my-second-brain update [--check] [--dry-run] [--yes] [--runtime <${runtime}>] [--vault <path>]
|
|
@@ -94,6 +103,14 @@ Options:
|
|
|
94
103
|
--apply linkify: rewrite notes in place; must be combined with --yes.
|
|
95
104
|
--no-convention-note
|
|
96
105
|
link: skip writing the managed OMS usage block to AGENTS.md.
|
|
106
|
+
--embedding-default
|
|
107
|
+
setup: download and verify the pinned EmbeddingGemma-300M model into the
|
|
108
|
+
user-level cache, then select it for \`oms embed\` and vector search without
|
|
109
|
+
requiring OMS_EMBEDDING_PROVIDER / OMS_EMBEDDING_MODEL.
|
|
110
|
+
--embedding-descriptor <path>
|
|
111
|
+
setup: install an operator-supplied model descriptor (SHA-256 verified).
|
|
112
|
+
--embedding-no-default
|
|
113
|
+
setup: explicitly install no model; lexical search still works.
|
|
97
114
|
`;
|
|
98
115
|
}
|
|
99
116
|
export function printUsage() {
|
package/dist/cli/usage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAS/E,MAAM,mBAAmB,GAAgC;IACvD,
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,9 @@ import type { Chunk, ChunkerOptions } from "../types.js";
|
|
|
14
14
|
* - vault-relative `docPath`
|
|
15
15
|
* - zero-based `ordinal` within the document
|
|
16
16
|
* - raw `text`
|
|
17
|
+
* - `title` — the document title, prepended to this chunk's embedding input
|
|
17
18
|
* - `headingPath` — breadcrumb from doc root to the chunk's section
|
|
18
|
-
* - `sha` — SHA-256
|
|
19
|
+
* - `sha` — SHA-256 digest of `title` + `text` for change-detection
|
|
19
20
|
*
|
|
20
21
|
* When a section exceeds `maxTokens`, it is further split line by line until
|
|
21
22
|
* each emitted chunk fits the budget. Overlap lines from the previous flush
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* zero verbatim code. See ACKNOWLEDGMENTS.md for attribution.
|
|
7
7
|
*/
|
|
8
8
|
import { createHash } from "node:crypto";
|
|
9
|
+
import { parseNote } from "../../conventions/frontmatter.js";
|
|
10
|
+
import { UNTITLED_DOCUMENT_TITLE } from "../types.js";
|
|
9
11
|
const DEFAULT_MAX_TOKENS = 900;
|
|
10
12
|
const DEFAULT_OVERLAP_RATIO = 0.15;
|
|
11
13
|
// ---------------------------------------------------------------------------
|
|
@@ -45,9 +47,37 @@ function isCjk(cp) {
|
|
|
45
47
|
(cp >= 0x20000 && cp <= 0x2fa1f) // CJK Ext B–F + compatibility supplement
|
|
46
48
|
);
|
|
47
49
|
}
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
/**
|
|
51
|
+
* SHA-256 change-detection digest over everything that reaches the embedding
|
|
52
|
+
* input: the document title AND the chunk text.
|
|
53
|
+
*
|
|
54
|
+
* The title must be inside the digest. It is prepended to every chunk's
|
|
55
|
+
* embedding input, so a digest over `text` alone would report "unchanged" for
|
|
56
|
+
* each chunk that does not itself contain the title line — leaving vectors that
|
|
57
|
+
* still encode the OLD title after a retitle. The NUL separator keeps
|
|
58
|
+
* (title, text) unambiguous so no retitle can collide with a body edit.
|
|
59
|
+
*/
|
|
60
|
+
function chunkDigest(title, text) {
|
|
61
|
+
return createHash("sha256").update(`${title}\u0000${text}`).digest("hex");
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The document title carried into every chunk's embedding input.
|
|
65
|
+
*
|
|
66
|
+
* Frontmatter `title` wins, then the first ATX H1, else the untitled literal.
|
|
67
|
+
* Reuses the shared convention parser rather than re-deriving frontmatter here.
|
|
68
|
+
* A malformed-frontmatter document still yields a title: `parseNote` reports
|
|
69
|
+
* diagnostics instead of throwing, and the H1 scan covers the body.
|
|
70
|
+
*/
|
|
71
|
+
function documentTitle(rawText) {
|
|
72
|
+
const parsed = parseNote(rawText);
|
|
73
|
+
const declared = parsed.frontmatter["title"];
|
|
74
|
+
if (typeof declared === "string" && declared.trim() !== "")
|
|
75
|
+
return declared.trim();
|
|
76
|
+
const heading = /^#\s+(.+)$/m.exec(parsed.body) ?? /^#\s+(.+)$/m.exec(rawText);
|
|
77
|
+
const headingTitle = heading?.[1]?.trim();
|
|
78
|
+
if (headingTitle !== undefined && headingTitle !== "")
|
|
79
|
+
return headingTitle;
|
|
80
|
+
return UNTITLED_DOCUMENT_TITLE;
|
|
51
81
|
}
|
|
52
82
|
/**
|
|
53
83
|
* Update a mutable heading-path array given a newly encountered ATX heading.
|
|
@@ -69,8 +99,9 @@ function applyHeading(current, level, title) {
|
|
|
69
99
|
* - vault-relative `docPath`
|
|
70
100
|
* - zero-based `ordinal` within the document
|
|
71
101
|
* - raw `text`
|
|
102
|
+
* - `title` — the document title, prepended to this chunk's embedding input
|
|
72
103
|
* - `headingPath` — breadcrumb from doc root to the chunk's section
|
|
73
|
-
* - `sha` — SHA-256
|
|
104
|
+
* - `sha` — SHA-256 digest of `title` + `text` for change-detection
|
|
74
105
|
*
|
|
75
106
|
* When a section exceeds `maxTokens`, it is further split line by line until
|
|
76
107
|
* each emitted chunk fits the budget. Overlap lines from the previous flush
|
|
@@ -83,6 +114,7 @@ export function chunkDocument(docPath, rawText, opts = {}) {
|
|
|
83
114
|
const overlapLineCount = Math.max(1, Math.round(10 * overlapRatio));
|
|
84
115
|
const lines = rawText.split("\n");
|
|
85
116
|
const chunks = [];
|
|
117
|
+
const title = documentTitle(rawText);
|
|
86
118
|
let ordinal = 0;
|
|
87
119
|
let buffer = [];
|
|
88
120
|
let headingPath = [];
|
|
@@ -96,8 +128,9 @@ export function chunkDocument(docPath, rawText, opts = {}) {
|
|
|
96
128
|
docPath,
|
|
97
129
|
ordinal: ordinal++,
|
|
98
130
|
text,
|
|
131
|
+
title,
|
|
99
132
|
headingPath: headingPath.slice(),
|
|
100
|
-
sha:
|
|
133
|
+
sha: chunkDigest(title, text),
|
|
101
134
|
});
|
|
102
135
|
// Carry the last N lines as overlap into the next chunk
|
|
103
136
|
buffer = buffer.slice(-overlapLineCount);
|
|
@@ -122,8 +155,9 @@ export function chunkDocument(docPath, rawText, opts = {}) {
|
|
|
122
155
|
docPath,
|
|
123
156
|
ordinal: ordinal++,
|
|
124
157
|
text: remaining,
|
|
158
|
+
title,
|
|
125
159
|
headingPath: headingPath.slice(),
|
|
126
|
-
sha:
|
|
160
|
+
sha: chunkDigest(title, remaining),
|
|
127
161
|
});
|
|
128
162
|
}
|
|
129
163
|
return chunks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../../../src/kernel/engine/embed/chunker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../../../src/kernel/engine/embed/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,32 @@ export declare const EMBEDDING_PROVIDER_ENV: "OMS_EMBEDDING_PROVIDER";
|
|
|
3
3
|
export declare const EMBEDDING_MODEL_ENV: "OMS_EMBEDDING_MODEL";
|
|
4
4
|
export declare const INSTALLED_DEFAULT_DESCRIPTOR = "default-model.json";
|
|
5
5
|
export declare const CAPABILITY_RECEIPT = "capability-receipt.json";
|
|
6
|
+
/**
|
|
7
|
+
* The one pinned default embedding model, offered by `oms setup --embedding-default`.
|
|
8
|
+
*
|
|
9
|
+
* This is the same model qmd resolves from its own `DEFAULT_EMBED_MODEL_URI`
|
|
10
|
+
* (`hf:ggml-org/embeddinggemma-300M-GGUF/embeddinggemma-300M-Q8_0.gguf`), so a
|
|
11
|
+
* vault indexed by `oms embed` gets that toolchain's retrieval quality rather
|
|
12
|
+
* than a lesser stand-in. `dimensions` is the model's native width and is
|
|
13
|
+
* stored unfolded (ADR-007 P-A); `mrlDim: 0` records that no Matryoshka
|
|
14
|
+
* truncation is applied.
|
|
15
|
+
*
|
|
16
|
+
* This constant is NOT a fallback. `resolveEmbeddingModel` never reaches for
|
|
17
|
+
* it, because an implicit default would defeat the E-1 no-default contract in
|
|
18
|
+
* `src/kernel/measurement/no-default-contract.ts`: with no environment pair and
|
|
19
|
+
* an empty cache, embedding capability must stay honestly unavailable. The only
|
|
20
|
+
* consumer is the explicit setup acquisition path, which verifies `sha256`
|
|
21
|
+
* against the downloaded bytes before publishing them.
|
|
22
|
+
*
|
|
23
|
+
* `prefixScheme` reproduces EmbeddingGemma's asymmetric prompts byte-for-byte
|
|
24
|
+
* as qmd formats them in `formatQueryForEmbedding` / `formatDocForEmbedding`,
|
|
25
|
+
* including the document title: `{title}` is substituted per chunk, matching
|
|
26
|
+
* qmd's `title: <title> | text: <text>` document prompt.
|
|
27
|
+
*/
|
|
28
|
+
export declare const PINNED_DEFAULT_EMBEDDING_MODEL: EmbeddingModelDescriptor & {
|
|
29
|
+
readonly url: string;
|
|
30
|
+
readonly sha256: string;
|
|
31
|
+
};
|
|
6
32
|
/** Metadata needed to use an installed embedding model. */
|
|
7
33
|
export interface EmbeddingModelDescriptor {
|
|
8
34
|
readonly provider: string;
|
|
@@ -8,9 +8,47 @@ export const EMBEDDING_PROVIDER_ENV = "OMS_EMBEDDING_PROVIDER";
|
|
|
8
8
|
export const EMBEDDING_MODEL_ENV = "OMS_EMBEDDING_MODEL";
|
|
9
9
|
export const INSTALLED_DEFAULT_DESCRIPTOR = "default-model.json";
|
|
10
10
|
export const CAPABILITY_RECEIPT = "capability-receipt.json";
|
|
11
|
+
/**
|
|
12
|
+
* The one pinned default embedding model, offered by `oms setup --embedding-default`.
|
|
13
|
+
*
|
|
14
|
+
* This is the same model qmd resolves from its own `DEFAULT_EMBED_MODEL_URI`
|
|
15
|
+
* (`hf:ggml-org/embeddinggemma-300M-GGUF/embeddinggemma-300M-Q8_0.gguf`), so a
|
|
16
|
+
* vault indexed by `oms embed` gets that toolchain's retrieval quality rather
|
|
17
|
+
* than a lesser stand-in. `dimensions` is the model's native width and is
|
|
18
|
+
* stored unfolded (ADR-007 P-A); `mrlDim: 0` records that no Matryoshka
|
|
19
|
+
* truncation is applied.
|
|
20
|
+
*
|
|
21
|
+
* This constant is NOT a fallback. `resolveEmbeddingModel` never reaches for
|
|
22
|
+
* it, because an implicit default would defeat the E-1 no-default contract in
|
|
23
|
+
* `src/kernel/measurement/no-default-contract.ts`: with no environment pair and
|
|
24
|
+
* an empty cache, embedding capability must stay honestly unavailable. The only
|
|
25
|
+
* consumer is the explicit setup acquisition path, which verifies `sha256`
|
|
26
|
+
* against the downloaded bytes before publishing them.
|
|
27
|
+
*
|
|
28
|
+
* `prefixScheme` reproduces EmbeddingGemma's asymmetric prompts byte-for-byte
|
|
29
|
+
* as qmd formats them in `formatQueryForEmbedding` / `formatDocForEmbedding`,
|
|
30
|
+
* including the document title: `{title}` is substituted per chunk, matching
|
|
31
|
+
* qmd's `title: <title> | text: <text>` document prompt.
|
|
32
|
+
*/
|
|
33
|
+
export const PINNED_DEFAULT_EMBEDDING_MODEL = {
|
|
34
|
+
provider: "gguf",
|
|
35
|
+
model: "embeddinggemma-300M-Q8_0.gguf",
|
|
36
|
+
filename: "embeddinggemma-300M-Q8_0.gguf",
|
|
37
|
+
url: "https://huggingface.co/ggml-org/embeddinggemma-300M-GGUF/resolve/main/embeddinggemma-300M-Q8_0.gguf",
|
|
38
|
+
sha256: "b5ce9d77a3fc4b3b39ccb5643c36777911cc4eb46a66962eadfa3f5f60490d63",
|
|
39
|
+
dimensions: 768,
|
|
40
|
+
context: 2048,
|
|
41
|
+
mrlDim: 0,
|
|
42
|
+
normalization: "l2",
|
|
43
|
+
prefixScheme: JSON.stringify({
|
|
44
|
+
query: "task: search result | query: ",
|
|
45
|
+
passage: "title: {title} | text: ",
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
11
48
|
const INCOMPLETE_CONFIG_ERROR = `Embedding configuration is incomplete. Set both ${EMBEDDING_PROVIDER_ENV} and ${EMBEDDING_MODEL_ENV}.`;
|
|
12
|
-
const NO_MODEL_GUIDANCE =
|
|
13
|
-
|
|
49
|
+
const NO_MODEL_GUIDANCE = "No embedding model is configured. Run `oms setup --embedding-default` to install the pinned " +
|
|
50
|
+
`local model, or set ${EMBEDDING_PROVIDER_ENV} and ${EMBEDDING_MODEL_ENV} to choose your own ` +
|
|
51
|
+
"(`oms setup --embedding-descriptor <path>` installs an operator-supplied descriptor).";
|
|
14
52
|
function trim(value) {
|
|
15
53
|
return (value ?? "").trim();
|
|
16
54
|
}
|