oh-my-second-brain 0.3.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/ACKNOWLEDGMENTS.md +8 -0
- package/CHANGELOG-assets.md +10 -0
- package/CHANGELOG-cli.md +11 -0
- package/CHANGELOG-kernel.md +31 -0
- package/CHANGELOG-mcp.md +12 -0
- package/CHANGELOG-vendors.md +6 -0
- package/CHANGELOG.md +35 -0
- package/assets/hermes-manifest.json +1 -1
- package/assets/skills/doctor/SKILL.md +2 -2
- package/assets/skills/search/SKILL.md +17 -1
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.js +13 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/host-commands.js +2 -1
- package/dist/cli/host-commands.js.map +1 -1
- package/dist/cli/oms.d.ts +1 -1
- package/dist/cli/oms.js +26 -3
- package/dist/cli/oms.js.map +1 -1
- package/dist/cli/semantic-args.js +102 -3
- package/dist/cli/semantic-args.js.map +1 -1
- package/dist/cli/semantic.js +30 -6
- package/dist/cli/semantic.js.map +1 -1
- package/dist/cli/setup-command.d.ts +16 -0
- package/dist/cli/setup-command.js +50 -1
- package/dist/cli/setup-command.js.map +1 -1
- package/dist/kernel/contracts/index.d.ts +144 -0
- package/dist/kernel/contracts/index.js +401 -0
- package/dist/kernel/contracts/index.js.map +1 -0
- package/dist/kernel/conventions/note-exclude.d.ts +14 -0
- package/dist/kernel/conventions/note-exclude.js +95 -0
- package/dist/kernel/conventions/note-exclude.js.map +1 -0
- package/dist/kernel/engine/assemble.d.ts +22 -1
- package/dist/kernel/engine/assemble.js +202 -19
- package/dist/kernel/engine/assemble.js.map +1 -1
- package/dist/kernel/engine/axes/store.d.ts +90 -0
- package/dist/kernel/engine/axes/store.js +422 -0
- package/dist/kernel/engine/axes/store.js.map +1 -0
- package/dist/kernel/engine/conventions/vault-lint.d.ts +7 -2
- package/dist/kernel/engine/conventions/vault-lint.js +7 -21
- package/dist/kernel/engine/conventions/vault-lint.js.map +1 -1
- package/dist/kernel/engine/embed/identity.d.ts +14 -4
- package/dist/kernel/engine/embed/identity.js +33 -1
- package/dist/kernel/engine/embed/identity.js.map +1 -1
- package/dist/kernel/engine/embed/model.d.ts +134 -0
- package/dist/kernel/engine/embed/model.js +302 -0
- package/dist/kernel/engine/embed/model.js.map +1 -0
- package/dist/kernel/engine/embed/provider.d.ts +36 -5
- package/dist/kernel/engine/embed/provider.js +240 -103
- package/dist/kernel/engine/embed/provider.js.map +1 -1
- package/dist/kernel/engine/embed/store.d.ts +5 -1
- package/dist/kernel/engine/embed/store.js +136 -26
- package/dist/kernel/engine/embed/store.js.map +1 -1
- package/dist/kernel/engine/embed/sync.d.ts +53 -0
- package/dist/kernel/engine/embed/sync.js +489 -59
- package/dist/kernel/engine/embed/sync.js.map +1 -1
- package/dist/kernel/engine/graph/builder.d.ts +9 -5
- package/dist/kernel/engine/graph/builder.js +225 -82
- package/dist/kernel/engine/graph/builder.js.map +1 -1
- package/dist/kernel/engine/graph/node.d.ts +49 -1
- package/dist/kernel/engine/graph/node.js +205 -0
- package/dist/kernel/engine/graph/node.js.map +1 -1
- package/dist/kernel/engine/mcp/facade.d.ts +21 -1
- package/dist/kernel/engine/mcp/facade.js +523 -28
- package/dist/kernel/engine/mcp/facade.js.map +1 -1
- package/dist/kernel/engine/mcp/query-mapper.d.ts +27 -2
- package/dist/kernel/engine/mcp/query-mapper.js +157 -12
- package/dist/kernel/engine/mcp/query-mapper.js.map +1 -1
- package/dist/kernel/engine/mcp/types.d.ts +64 -2
- package/dist/kernel/engine/retrieval/dispatcher.d.ts +22 -0
- package/dist/kernel/engine/retrieval/dispatcher.js +84 -8
- package/dist/kernel/engine/retrieval/dispatcher.js.map +1 -1
- package/dist/kernel/engine/retrieval/index.d.ts +2 -1
- package/dist/kernel/engine/retrieval/index.js +1 -1
- package/dist/kernel/engine/retrieval/index.js.map +1 -1
- package/dist/kernel/engine/retrieval/reranker.d.ts +82 -4
- package/dist/kernel/engine/retrieval/reranker.js +178 -3
- package/dist/kernel/engine/retrieval/reranker.js.map +1 -1
- package/dist/kernel/engine/retrieval/rrf.d.ts +10 -2
- package/dist/kernel/engine/retrieval/rrf.js +39 -16
- package/dist/kernel/engine/retrieval/rrf.js.map +1 -1
- package/dist/kernel/engine/tracer.d.ts +13 -0
- package/dist/kernel/engine/tracer.js +63 -6
- package/dist/kernel/engine/tracer.js.map +1 -1
- package/dist/kernel/graph/cache.js +174 -23
- package/dist/kernel/graph/cache.js.map +1 -1
- package/dist/kernel/index.d.ts +2 -0
- package/dist/kernel/index.js +2 -0
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/measurement/no-default-contract.d.ts +17 -0
- package/dist/kernel/measurement/no-default-contract.js +84 -0
- package/dist/kernel/measurement/no-default-contract.js.map +1 -0
- package/dist/kernel/searchbackend/engine-search-backend.js +93 -7
- package/dist/kernel/searchbackend/engine-search-backend.js.map +1 -1
- package/dist/kernel/searchbackend/search-backend.d.ts +11 -1
- package/dist/kernel/searchbackend/search-backend.js +66 -5
- package/dist/kernel/searchbackend/search-backend.js.map +1 -1
- package/dist/kernel/semantic/semantic-engine.js +31 -5
- package/dist/kernel/semantic/semantic-engine.js.map +1 -1
- package/dist/kernel/semantic/semantic-retrieve-args.d.ts +19 -2
- package/dist/kernel/semantic/semantic-retrieve-args.js +81 -7
- package/dist/kernel/semantic/semantic-retrieve-args.js.map +1 -1
- package/dist/kernel/update/update.d.ts +7 -0
- package/dist/kernel/update/update.js +106 -8
- package/dist/kernel/update/update.js.map +1 -1
- package/dist/mcp/server.js +84 -34
- package/dist/mcp/server.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/** The canonical environment variables for selecting an embedding model. */
|
|
2
|
+
export declare const EMBEDDING_PROVIDER_ENV: "OMS_EMBEDDING_PROVIDER";
|
|
3
|
+
export declare const EMBEDDING_MODEL_ENV: "OMS_EMBEDDING_MODEL";
|
|
4
|
+
export declare const INSTALLED_DEFAULT_DESCRIPTOR = "default-model.json";
|
|
5
|
+
export declare const CAPABILITY_RECEIPT = "capability-receipt.json";
|
|
6
|
+
/** Metadata needed to use an installed embedding model. */
|
|
7
|
+
export interface EmbeddingModelDescriptor {
|
|
8
|
+
readonly provider: string;
|
|
9
|
+
/** Provider model id. For local providers this may be a filename. */
|
|
10
|
+
readonly model: string;
|
|
11
|
+
/** Absolute path to a locally installed model, when applicable. */
|
|
12
|
+
readonly path?: string;
|
|
13
|
+
/** Alias accepted in descriptors produced by setup adapters. */
|
|
14
|
+
readonly modelPath?: string;
|
|
15
|
+
/** Source URL used by setup, when this model was acquired. */
|
|
16
|
+
readonly url?: string;
|
|
17
|
+
/** SHA-256 digest of the installed bytes, lowercase hexadecimal. */
|
|
18
|
+
readonly sha256?: string;
|
|
19
|
+
readonly dimensions?: number;
|
|
20
|
+
/** Canonical model context window in tokens. */
|
|
21
|
+
readonly context?: number;
|
|
22
|
+
/** Canonical context-length alias used by some setup adapters. */
|
|
23
|
+
readonly contextLength?: number;
|
|
24
|
+
readonly contextTokens?: number;
|
|
25
|
+
/** Optional Matryoshka (MRL) output width. */
|
|
26
|
+
readonly mrlDim?: number;
|
|
27
|
+
/** Declared output-vector normalization scheme. */
|
|
28
|
+
readonly normalization?: string;
|
|
29
|
+
/** Declared query/passage prefix scheme. */
|
|
30
|
+
readonly prefixScheme?: string;
|
|
31
|
+
/** Optional filename used for the cache artifact. */
|
|
32
|
+
readonly filename?: string;
|
|
33
|
+
}
|
|
34
|
+
export type ModelResolutionSource = "configured" | "installed-default" | "none";
|
|
35
|
+
export interface EmbeddingCapabilityReceipt {
|
|
36
|
+
readonly kind: "embedding-capability";
|
|
37
|
+
readonly available: boolean;
|
|
38
|
+
readonly source: ModelResolutionSource | "setup";
|
|
39
|
+
readonly provider?: string;
|
|
40
|
+
readonly model?: string;
|
|
41
|
+
readonly modelPath?: string;
|
|
42
|
+
readonly cachePath?: string;
|
|
43
|
+
readonly sha256?: string;
|
|
44
|
+
readonly dimensions?: number;
|
|
45
|
+
readonly context?: number;
|
|
46
|
+
readonly contextLength?: number;
|
|
47
|
+
readonly contextTokens?: number;
|
|
48
|
+
readonly mrlDim?: number;
|
|
49
|
+
readonly normalization?: string;
|
|
50
|
+
readonly prefixScheme?: string;
|
|
51
|
+
readonly guidance: string;
|
|
52
|
+
}
|
|
53
|
+
export interface EmbeddingModelResolution {
|
|
54
|
+
readonly available: boolean;
|
|
55
|
+
readonly source: ModelResolutionSource;
|
|
56
|
+
readonly provider?: string;
|
|
57
|
+
readonly model?: string;
|
|
58
|
+
readonly modelPath?: string;
|
|
59
|
+
readonly descriptor?: EmbeddingModelDescriptor;
|
|
60
|
+
readonly receipt: EmbeddingCapabilityReceipt;
|
|
61
|
+
}
|
|
62
|
+
export interface ResolveEmbeddingModelOptions {
|
|
63
|
+
/** Environment snapshot. Defaults to process.env. */
|
|
64
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
65
|
+
/** Installed descriptor to use when the canonical env pair is absent. */
|
|
66
|
+
readonly installedDefault?: EmbeddingModelDescriptor | null;
|
|
67
|
+
/** Alias accepted for callers that call the descriptor a default model. */
|
|
68
|
+
readonly defaultModel?: EmbeddingModelDescriptor | null;
|
|
69
|
+
/** Optional cache root for automatic installed-default discovery. */
|
|
70
|
+
readonly cacheDir?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resolve the one canonical embedding selection.
|
|
74
|
+
*
|
|
75
|
+
* A complete environment pair always wins. A half-pair is an error rather than
|
|
76
|
+
* an invitation to silently use a different model. If neither environment
|
|
77
|
+
* variable is set, an explicitly supplied installed descriptor is used, then
|
|
78
|
+
* the result is an honest unavailable capability.
|
|
79
|
+
*/
|
|
80
|
+
export declare function resolveEmbeddingModel(options?: ResolveEmbeddingModelOptions): EmbeddingModelResolution;
|
|
81
|
+
/** Short alias for code that refers to this operation as model resolution. */
|
|
82
|
+
export declare const resolveModel: typeof resolveEmbeddingModel;
|
|
83
|
+
/**
|
|
84
|
+
* Cache root for downloaded model bytes. It is deliberately user-level and
|
|
85
|
+
* never derived from a vault path. `cacheDir` can be supplied by setup/tests.
|
|
86
|
+
*/
|
|
87
|
+
export declare function embeddingModelCacheDir(options?: {
|
|
88
|
+
readonly cacheDir?: string;
|
|
89
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
90
|
+
readonly homeDir?: string;
|
|
91
|
+
}): string;
|
|
92
|
+
export declare const getEmbeddingModelCacheDir: typeof embeddingModelCacheDir;
|
|
93
|
+
/** Read the setup-written descriptor synchronously for engine assembly. */
|
|
94
|
+
export declare function readInstalledEmbeddingDefaultSync(options?: {
|
|
95
|
+
readonly cacheDir?: string;
|
|
96
|
+
}): EmbeddingModelDescriptor | null;
|
|
97
|
+
export interface AcquireEmbeddingModelOptions {
|
|
98
|
+
/** Descriptor must include URL and expected SHA-256 for setup acquisition. */
|
|
99
|
+
readonly descriptor: EmbeddingModelDescriptor & {
|
|
100
|
+
readonly url: string;
|
|
101
|
+
readonly sha256: string;
|
|
102
|
+
};
|
|
103
|
+
/** Optional explicit cache root. It must be outside `vault`, when provided. */
|
|
104
|
+
readonly cacheDir?: string;
|
|
105
|
+
/** Used only to reject an accidental cache path inside the vault. */
|
|
106
|
+
readonly vault?: string;
|
|
107
|
+
/** Injection point for focused tests; production uses the global fetch. */
|
|
108
|
+
readonly fetchImpl?: typeof fetch;
|
|
109
|
+
}
|
|
110
|
+
export interface AcquiredEmbeddingModel {
|
|
111
|
+
readonly descriptor: EmbeddingModelDescriptor;
|
|
112
|
+
readonly modelPath: string;
|
|
113
|
+
readonly cachePath: string;
|
|
114
|
+
readonly receipt: EmbeddingCapabilityReceipt;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Download and install a model for setup only.
|
|
118
|
+
*
|
|
119
|
+
* This function is intentionally not imported by the MCP server. It writes
|
|
120
|
+
* only to the user-level model cache, verifies bytes before publishing them,
|
|
121
|
+
* and leaves an installed-default descriptor plus capability receipt there for
|
|
122
|
+
* future model resolution.
|
|
123
|
+
*/
|
|
124
|
+
export declare function acquireEmbeddingModel(options: AcquireEmbeddingModelOptions): Promise<AcquiredEmbeddingModel>;
|
|
125
|
+
/** Read the setup-written default descriptor without touching a vault. */
|
|
126
|
+
export declare function readInstalledEmbeddingDefault(options?: {
|
|
127
|
+
readonly cacheDir?: string;
|
|
128
|
+
}): Promise<EmbeddingModelDescriptor | null>;
|
|
129
|
+
/** Async resolver that consults the setup cache when no env pair is present. */
|
|
130
|
+
export declare function resolveEmbeddingModelFromCache(options?: {
|
|
131
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
132
|
+
readonly cacheDir?: string;
|
|
133
|
+
}): Promise<EmbeddingModelResolution>;
|
|
134
|
+
export declare const resolveModelFromCache: typeof resolveEmbeddingModelFromCache;
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
/** The canonical environment variables for selecting an embedding model. */
|
|
7
|
+
export const EMBEDDING_PROVIDER_ENV = "OMS_EMBEDDING_PROVIDER";
|
|
8
|
+
export const EMBEDDING_MODEL_ENV = "OMS_EMBEDDING_MODEL";
|
|
9
|
+
export const INSTALLED_DEFAULT_DESCRIPTOR = "default-model.json";
|
|
10
|
+
export const CAPABILITY_RECEIPT = "capability-receipt.json";
|
|
11
|
+
const INCOMPLETE_CONFIG_ERROR = `Embedding configuration is incomplete. Set both ${EMBEDDING_PROVIDER_ENV} and ${EMBEDDING_MODEL_ENV}.`;
|
|
12
|
+
const NO_MODEL_GUIDANCE = `No embedding model is configured. Set ${EMBEDDING_PROVIDER_ENV} and ${EMBEDDING_MODEL_ENV}, ` +
|
|
13
|
+
"or install a local model with `oms setup --embedding-descriptor <descriptor>`.";
|
|
14
|
+
function trim(value) {
|
|
15
|
+
return (value ?? "").trim();
|
|
16
|
+
}
|
|
17
|
+
function assertCompleteDescriptor(descriptor) {
|
|
18
|
+
const context = descriptor.context ?? descriptor.contextLength ?? descriptor.contextTokens;
|
|
19
|
+
if (!Number.isInteger(descriptor.dimensions) || descriptor.dimensions === undefined || descriptor.dimensions <= 0 ||
|
|
20
|
+
!Number.isInteger(context) || context === undefined || context <= 0 ||
|
|
21
|
+
!Number.isInteger(descriptor.mrlDim) || descriptor.mrlDim === undefined || descriptor.mrlDim < 0 ||
|
|
22
|
+
!trim(descriptor.normalization) ||
|
|
23
|
+
!trim(descriptor.prefixScheme)) {
|
|
24
|
+
throw new Error("Embedding descriptor is incomplete. dimensions/context/mrlDim/normalization/prefixScheme are required.");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function receiptFor(resolution, guidance) {
|
|
28
|
+
return {
|
|
29
|
+
kind: "embedding-capability",
|
|
30
|
+
available: resolution.available,
|
|
31
|
+
source: resolution.source,
|
|
32
|
+
...(resolution.provider ? { provider: resolution.provider } : {}),
|
|
33
|
+
...(resolution.model ? { model: resolution.model } : {}),
|
|
34
|
+
...(resolution.modelPath ? { modelPath: resolution.modelPath } : {}),
|
|
35
|
+
...(resolution.descriptor?.sha256 ? { sha256: resolution.descriptor.sha256 } : {}),
|
|
36
|
+
...(resolution.descriptor?.dimensions !== undefined
|
|
37
|
+
? { dimensions: resolution.descriptor.dimensions }
|
|
38
|
+
: {}),
|
|
39
|
+
...(resolution.descriptor?.context !== undefined ? { context: resolution.descriptor.context } : {}),
|
|
40
|
+
...(resolution.descriptor?.contextLength !== undefined
|
|
41
|
+
? { contextLength: resolution.descriptor.contextLength }
|
|
42
|
+
: {}),
|
|
43
|
+
...(resolution.descriptor?.contextTokens !== undefined
|
|
44
|
+
? { contextTokens: resolution.descriptor.contextTokens }
|
|
45
|
+
: {}),
|
|
46
|
+
...(resolution.descriptor?.mrlDim !== undefined ? { mrlDim: resolution.descriptor.mrlDim } : {}),
|
|
47
|
+
...(resolution.descriptor?.normalization !== undefined
|
|
48
|
+
? { normalization: resolution.descriptor.normalization }
|
|
49
|
+
: {}),
|
|
50
|
+
...(resolution.descriptor?.prefixScheme !== undefined
|
|
51
|
+
? { prefixScheme: resolution.descriptor.prefixScheme }
|
|
52
|
+
: {}),
|
|
53
|
+
guidance,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function withReceipt(resolution, guidance) {
|
|
57
|
+
return { ...resolution, receipt: receiptFor(resolution, guidance) };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the one canonical embedding selection.
|
|
61
|
+
*
|
|
62
|
+
* A complete environment pair always wins. A half-pair is an error rather than
|
|
63
|
+
* an invitation to silently use a different model. If neither environment
|
|
64
|
+
* variable is set, an explicitly supplied installed descriptor is used, then
|
|
65
|
+
* the result is an honest unavailable capability.
|
|
66
|
+
*/
|
|
67
|
+
export function resolveEmbeddingModel(options = {}) {
|
|
68
|
+
const env = options.env ?? process.env;
|
|
69
|
+
const provider = trim(env[EMBEDDING_PROVIDER_ENV]);
|
|
70
|
+
const model = trim(env[EMBEDDING_MODEL_ENV]);
|
|
71
|
+
if ((provider === "") !== (model === "")) {
|
|
72
|
+
throw new Error(INCOMPLETE_CONFIG_ERROR);
|
|
73
|
+
}
|
|
74
|
+
if (provider !== "" && model !== "") {
|
|
75
|
+
const descriptor = options.installedDefault !== undefined
|
|
76
|
+
? options.installedDefault
|
|
77
|
+
: options.defaultModel !== undefined
|
|
78
|
+
? options.defaultModel
|
|
79
|
+
: readInstalledEmbeddingDefaultSync({ cacheDir: options.cacheDir });
|
|
80
|
+
if (descriptor !== null && descriptor !== undefined) {
|
|
81
|
+
const descriptorModel = trim(descriptor.path) || trim(descriptor.modelPath) || trim(descriptor.model);
|
|
82
|
+
if (trim(descriptor.provider) !== provider || descriptorModel !== model) {
|
|
83
|
+
throw new Error("Embedding descriptor does not match the configured provider/model.");
|
|
84
|
+
}
|
|
85
|
+
assertCompleteDescriptor(descriptor);
|
|
86
|
+
}
|
|
87
|
+
const resolution = {
|
|
88
|
+
available: true,
|
|
89
|
+
source: "configured",
|
|
90
|
+
provider,
|
|
91
|
+
model,
|
|
92
|
+
...(descriptor !== null && descriptor !== undefined ? { descriptor } : {}),
|
|
93
|
+
};
|
|
94
|
+
return withReceipt(resolution, "Embedding model selected from the canonical environment pair.");
|
|
95
|
+
}
|
|
96
|
+
// `null` explicitly disables discovery. With no override, setup's
|
|
97
|
+
// user-level descriptor is the second precedence tier.
|
|
98
|
+
const descriptor = options.installedDefault !== undefined
|
|
99
|
+
? options.installedDefault
|
|
100
|
+
: options.defaultModel !== undefined
|
|
101
|
+
? options.defaultModel
|
|
102
|
+
: readInstalledEmbeddingDefaultSync({ cacheDir: options.cacheDir });
|
|
103
|
+
if (descriptor !== null) {
|
|
104
|
+
const installedProvider = trim(descriptor.provider);
|
|
105
|
+
const installedModel = trim(descriptor.model);
|
|
106
|
+
if (installedProvider === "" || installedModel === "") {
|
|
107
|
+
throw new Error(`Installed embedding default is invalid. It must name both a provider and model (${EMBEDDING_PROVIDER_ENV} / ${EMBEDDING_MODEL_ENV}).`);
|
|
108
|
+
}
|
|
109
|
+
const modelPath = trim(descriptor.path) || trim(descriptor.modelPath);
|
|
110
|
+
const resolution = {
|
|
111
|
+
available: true,
|
|
112
|
+
source: "installed-default",
|
|
113
|
+
provider: installedProvider,
|
|
114
|
+
model: installedModel,
|
|
115
|
+
...(modelPath ? { modelPath } : {}),
|
|
116
|
+
descriptor,
|
|
117
|
+
};
|
|
118
|
+
return withReceipt(resolution, `Using the installed default model. Set ${EMBEDDING_PROVIDER_ENV}=${installedProvider} and ${EMBEDDING_MODEL_ENV}=${modelPath || installedModel} to select it explicitly.`);
|
|
119
|
+
}
|
|
120
|
+
const resolution = {
|
|
121
|
+
available: false,
|
|
122
|
+
source: "none",
|
|
123
|
+
};
|
|
124
|
+
return withReceipt(resolution, NO_MODEL_GUIDANCE);
|
|
125
|
+
}
|
|
126
|
+
/** Short alias for code that refers to this operation as model resolution. */
|
|
127
|
+
export const resolveModel = resolveEmbeddingModel;
|
|
128
|
+
/**
|
|
129
|
+
* Cache root for downloaded model bytes. It is deliberately user-level and
|
|
130
|
+
* never derived from a vault path. `cacheDir` can be supplied by setup/tests.
|
|
131
|
+
*/
|
|
132
|
+
export function embeddingModelCacheDir(options = {}) {
|
|
133
|
+
if (options.cacheDir?.trim())
|
|
134
|
+
return path.resolve(options.cacheDir);
|
|
135
|
+
const env = options.env ?? process.env;
|
|
136
|
+
const xdg = trim(env["XDG_CACHE_HOME"]);
|
|
137
|
+
const root = xdg !== "" ? xdg : path.join(options.homeDir ?? homedir(), ".cache");
|
|
138
|
+
return path.resolve(root, "oms", "models");
|
|
139
|
+
}
|
|
140
|
+
export const getEmbeddingModelCacheDir = embeddingModelCacheDir;
|
|
141
|
+
/** Read the setup-written descriptor synchronously for engine assembly. */
|
|
142
|
+
export function readInstalledEmbeddingDefaultSync(options = {}) {
|
|
143
|
+
try {
|
|
144
|
+
const parsed = JSON.parse(readFileSync(path.join(embeddingModelCacheDir(options), INSTALLED_DEFAULT_DESCRIPTOR), "utf8"));
|
|
145
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
146
|
+
return null;
|
|
147
|
+
const candidate = parsed;
|
|
148
|
+
if (typeof candidate.provider !== "string" || typeof candidate.model !== "string")
|
|
149
|
+
return null;
|
|
150
|
+
return candidate;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function isInside(child, parent) {
|
|
157
|
+
const relative = path.relative(parent, child);
|
|
158
|
+
return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
159
|
+
}
|
|
160
|
+
function safeName(value) {
|
|
161
|
+
const result = value.trim().replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
162
|
+
return result || "model";
|
|
163
|
+
}
|
|
164
|
+
function extensionFromDescriptor(descriptor) {
|
|
165
|
+
const candidate = descriptor.filename ?? descriptor.model;
|
|
166
|
+
const extension = path.extname(candidate);
|
|
167
|
+
return extension.length > 0 && extension.length <= 12 ? extension : ".bin";
|
|
168
|
+
}
|
|
169
|
+
function modelFilename(descriptor) {
|
|
170
|
+
const supplied = descriptor.filename?.trim();
|
|
171
|
+
if (supplied)
|
|
172
|
+
return path.basename(supplied);
|
|
173
|
+
return `${safeName(descriptor.provider)}-${safeName(descriptor.model)}${extensionFromDescriptor(descriptor)}`;
|
|
174
|
+
}
|
|
175
|
+
function sha256Bytes(bytes) {
|
|
176
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
177
|
+
}
|
|
178
|
+
function assertSha256(expected) {
|
|
179
|
+
const normalized = (expected ?? "").trim().toLowerCase();
|
|
180
|
+
if (!/^[a-f0-9]{64}$/.test(normalized)) {
|
|
181
|
+
throw new Error("Embedding model SHA-256 must be a 64-character hexadecimal digest.");
|
|
182
|
+
}
|
|
183
|
+
return normalized;
|
|
184
|
+
}
|
|
185
|
+
async function readVerified(pathname, expected) {
|
|
186
|
+
try {
|
|
187
|
+
const bytes = await readFile(pathname);
|
|
188
|
+
const actual = sha256Bytes(bytes);
|
|
189
|
+
if (actual !== expected) {
|
|
190
|
+
await rm(pathname, { force: true });
|
|
191
|
+
throw new Error(`Embedding model SHA-256 checksum mismatch: expected ${expected}, got ${actual}.`);
|
|
192
|
+
}
|
|
193
|
+
return bytes;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
if (error instanceof Error && /checksum mismatch/.test(error.message))
|
|
197
|
+
throw error;
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async function writeAtomic(pathname, bytes) {
|
|
202
|
+
const temporary = `${pathname}.${process.pid}.${Date.now()}.tmp`;
|
|
203
|
+
try {
|
|
204
|
+
await writeFile(temporary, bytes, { flag: "wx" });
|
|
205
|
+
await rename(temporary, pathname);
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
await rm(temporary, { force: true });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Download and install a model for setup only.
|
|
213
|
+
*
|
|
214
|
+
* This function is intentionally not imported by the MCP server. It writes
|
|
215
|
+
* only to the user-level model cache, verifies bytes before publishing them,
|
|
216
|
+
* and leaves an installed-default descriptor plus capability receipt there for
|
|
217
|
+
* future model resolution.
|
|
218
|
+
*/
|
|
219
|
+
export async function acquireEmbeddingModel(options) {
|
|
220
|
+
const descriptor = options.descriptor;
|
|
221
|
+
const expected = assertSha256(descriptor.sha256);
|
|
222
|
+
const url = typeof descriptor.url === "string" ? descriptor.url.trim() : "";
|
|
223
|
+
if (url === "") {
|
|
224
|
+
throw new Error("Embedding model URL is required for setup acquisition.");
|
|
225
|
+
}
|
|
226
|
+
const cacheRoot = embeddingModelCacheDir({ cacheDir: options.cacheDir });
|
|
227
|
+
if (options.vault !== undefined && isInside(cacheRoot, path.resolve(options.vault))) {
|
|
228
|
+
throw new Error("Embedding model cache must be outside the vault.");
|
|
229
|
+
}
|
|
230
|
+
await mkdir(cacheRoot, { recursive: true });
|
|
231
|
+
const cachePath = path.join(cacheRoot, modelFilename(descriptor));
|
|
232
|
+
let bytes = await readVerified(cachePath, expected);
|
|
233
|
+
if (bytes === null) {
|
|
234
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
235
|
+
const response = await fetchImpl(url);
|
|
236
|
+
if (!response.ok) {
|
|
237
|
+
throw new Error(`Embedding model download failed: ${response.status} ${response.statusText}.`);
|
|
238
|
+
}
|
|
239
|
+
bytes = new Uint8Array(await response.arrayBuffer());
|
|
240
|
+
const actual = sha256Bytes(bytes);
|
|
241
|
+
if (actual !== expected) {
|
|
242
|
+
throw new Error(`Embedding model SHA-256 checksum mismatch: expected ${expected}, got ${actual}.`);
|
|
243
|
+
}
|
|
244
|
+
await writeAtomic(cachePath, bytes);
|
|
245
|
+
}
|
|
246
|
+
const installed = {
|
|
247
|
+
...descriptor,
|
|
248
|
+
path: cachePath,
|
|
249
|
+
sha256: expected,
|
|
250
|
+
filename: modelFilename(descriptor),
|
|
251
|
+
};
|
|
252
|
+
const descriptorPath = path.join(cacheRoot, INSTALLED_DEFAULT_DESCRIPTOR);
|
|
253
|
+
const receiptPath = path.join(cacheRoot, CAPABILITY_RECEIPT);
|
|
254
|
+
await writeAtomic(descriptorPath, `${JSON.stringify(installed, null, 2)}\n`);
|
|
255
|
+
const receipt = {
|
|
256
|
+
kind: "embedding-capability",
|
|
257
|
+
available: true,
|
|
258
|
+
source: "setup",
|
|
259
|
+
provider: installed.provider,
|
|
260
|
+
model: installed.model,
|
|
261
|
+
modelPath: cachePath,
|
|
262
|
+
cachePath,
|
|
263
|
+
sha256: expected,
|
|
264
|
+
...(installed.dimensions !== undefined ? { dimensions: installed.dimensions } : {}),
|
|
265
|
+
...(installed.context !== undefined ? { context: installed.context } : {}),
|
|
266
|
+
...(installed.contextLength !== undefined ? { contextLength: installed.contextLength } : {}),
|
|
267
|
+
...(installed.contextTokens !== undefined ? { contextTokens: installed.contextTokens } : {}),
|
|
268
|
+
...(installed.mrlDim !== undefined ? { mrlDim: installed.mrlDim } : {}),
|
|
269
|
+
...(installed.normalization !== undefined ? { normalization: installed.normalization } : {}),
|
|
270
|
+
...(installed.prefixScheme !== undefined ? { prefixScheme: installed.prefixScheme } : {}),
|
|
271
|
+
guidance: `Model installed. Set ${EMBEDDING_PROVIDER_ENV}=${installed.provider} and ${EMBEDDING_MODEL_ENV}=${installed.path || installed.model} to select it.`,
|
|
272
|
+
};
|
|
273
|
+
await writeAtomic(receiptPath, `${JSON.stringify(receipt, null, 2)}\n`);
|
|
274
|
+
return { descriptor: installed, modelPath: cachePath, cachePath, receipt };
|
|
275
|
+
}
|
|
276
|
+
/** Read the setup-written default descriptor without touching a vault. */
|
|
277
|
+
export async function readInstalledEmbeddingDefault(options = {}) {
|
|
278
|
+
try {
|
|
279
|
+
const raw = await readFile(path.join(embeddingModelCacheDir(options), INSTALLED_DEFAULT_DESCRIPTOR), "utf8");
|
|
280
|
+
const parsed = JSON.parse(raw);
|
|
281
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
282
|
+
return null;
|
|
283
|
+
const candidate = parsed;
|
|
284
|
+
if (typeof candidate.provider !== "string" || typeof candidate.model !== "string")
|
|
285
|
+
return null;
|
|
286
|
+
return candidate;
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** Async resolver that consults the setup cache when no env pair is present. */
|
|
293
|
+
export async function resolveEmbeddingModelFromCache(options = {}) {
|
|
294
|
+
const provider = trim((options.env ?? process.env)[EMBEDDING_PROVIDER_ENV]);
|
|
295
|
+
const model = trim((options.env ?? process.env)[EMBEDDING_MODEL_ENV]);
|
|
296
|
+
if (provider !== "" || model !== "")
|
|
297
|
+
return resolveEmbeddingModel({ env: options.env });
|
|
298
|
+
const installedDefault = await readInstalledEmbeddingDefault({ cacheDir: options.cacheDir });
|
|
299
|
+
return resolveEmbeddingModel({ env: options.env, installedDefault });
|
|
300
|
+
}
|
|
301
|
+
export const resolveModelFromCache = resolveEmbeddingModelFromCache;
|
|
302
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../src/kernel/engine/embed/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,9 +19,28 @@
|
|
|
19
19
|
import type { EmbeddingProvider } from "../types.js";
|
|
20
20
|
/** Default embedding dimension for the GGUF provider (EmbeddingGemma-300M). */
|
|
21
21
|
export declare const GGUF_EMBEDDING_DIMENSIONS = 768;
|
|
22
|
+
/** Default context length for the GGUF provider (EmbeddingGemma-300M). */
|
|
23
|
+
export declare const GGUF_EMBEDDING_CONTEXT_LENGTH = 2048;
|
|
24
|
+
/** Embedding provider seam for callers that need the query-side prefix. */
|
|
25
|
+
export interface QueryEmbeddingProvider extends EmbeddingProvider {
|
|
26
|
+
readonly embedQuery: (text: string) => Promise<Float32Array>;
|
|
27
|
+
}
|
|
28
|
+
/** Per-model runtime dimensions/context supplied by the model descriptor. */
|
|
29
|
+
export interface EmbeddingRuntimeOptions {
|
|
30
|
+
readonly dimensions?: number;
|
|
31
|
+
/** Canonical model context window in tokens. */
|
|
32
|
+
readonly context?: number;
|
|
33
|
+
/** Canonical context length field. */
|
|
34
|
+
readonly contextLength?: number;
|
|
35
|
+
/** Descriptor alias used by setup adapters. */
|
|
36
|
+
readonly contextTokens?: number;
|
|
37
|
+
readonly mrlDim?: number;
|
|
38
|
+
readonly normalization?: string;
|
|
39
|
+
readonly prefixScheme?: string;
|
|
40
|
+
}
|
|
22
41
|
/**
|
|
23
42
|
* Create a production EmbeddingProvider backed by a local GGUF model via
|
|
24
|
-
* node-llama-cpp. Target model: EmbeddingGemma-300M (
|
|
43
|
+
* node-llama-cpp. Target model: EmbeddingGemma-300M (descriptor width).
|
|
25
44
|
*
|
|
26
45
|
* Design (ported idea-only from qmd, MIT — ACKNOWLEDGMENTS.md M1):
|
|
27
46
|
* - Lazy-load: model/contexts are not initialised until the first embed() call.
|
|
@@ -32,9 +51,10 @@ export declare const GGUF_EMBEDDING_DIMENSIONS = 768;
|
|
|
32
51
|
* Contexts are selected round-robin; embed calls do not queue.
|
|
33
52
|
*
|
|
34
53
|
* @param modelPath - Absolute path to the GGUF model file.
|
|
35
|
-
* @param
|
|
54
|
+
* @param dimensionsOrOptions - Expected width or descriptor runtime options.
|
|
55
|
+
* @param contextLength - Legacy positional context-length override.
|
|
36
56
|
*/
|
|
37
|
-
export declare function createGGUFEmbeddingProvider(modelPath: string,
|
|
57
|
+
export declare function createGGUFEmbeddingProvider(modelPath: string, dimensionsOrOptions?: number | EmbeddingRuntimeOptions, contextLength?: number): QueryEmbeddingProvider;
|
|
38
58
|
/**
|
|
39
59
|
* Create an Upstage Solar embedding provider (4096d).
|
|
40
60
|
*
|
|
@@ -42,7 +62,7 @@ export declare function createGGUFEmbeddingProvider(modelPath: string, dimension
|
|
|
42
62
|
* when UPSTAGE_API_KEY is set in the environment; never use by default.
|
|
43
63
|
* The API key MUST come from env — never hardcoded (R4 secrets-via-env).
|
|
44
64
|
*/
|
|
45
|
-
export declare function createUpstageProvider(apiKey: string, model: string):
|
|
65
|
+
export declare function createUpstageProvider(apiKey: string, model: string, dimensions?: number, metadata?: Pick<EmbeddingRuntimeOptions, "context" | "contextLength" | "contextTokens" | "mrlDim" | "normalization" | "prefixScheme">): QueryEmbeddingProvider;
|
|
46
66
|
export type EmbeddingProviderKind = "gguf" | "upstage";
|
|
47
67
|
/** Options for the production embedding factory (explicit provider + model). */
|
|
48
68
|
export interface EmbeddingProviderOptions {
|
|
@@ -50,6 +70,17 @@ export interface EmbeddingProviderOptions {
|
|
|
50
70
|
provider?: EmbeddingProviderKind | string;
|
|
51
71
|
/** Provider-specific model identifier selected by OMS_EMBEDDING_MODEL. */
|
|
52
72
|
model?: string;
|
|
73
|
+
/** Descriptor-derived vector width. */
|
|
74
|
+
dimensions?: number;
|
|
75
|
+
/** Canonical model context window in tokens. */
|
|
76
|
+
context?: number;
|
|
77
|
+
/** Descriptor-derived context length (no model-specific default here). */
|
|
78
|
+
contextLength?: number;
|
|
79
|
+
/** Setup descriptor alias for contextLength. */
|
|
80
|
+
contextTokens?: number;
|
|
81
|
+
mrlDim?: number;
|
|
82
|
+
normalization?: string;
|
|
83
|
+
prefixScheme?: string;
|
|
53
84
|
}
|
|
54
85
|
/** Alias kept for callers that import StrictEmbeddingProviderOptions by name. */
|
|
55
86
|
export type StrictEmbeddingProviderOptions = EmbeddingProviderOptions;
|
|
@@ -63,4 +94,4 @@ export type StrictEmbeddingProviderOptions = EmbeddingProviderOptions;
|
|
|
63
94
|
* @throws {Error} When provider/model are missing or unsupported, or when
|
|
64
95
|
* provider-specific auth is missing.
|
|
65
96
|
*/
|
|
66
|
-
export declare function requireRealEmbeddingProvider(opts?: StrictEmbeddingProviderOptions):
|
|
97
|
+
export declare function requireRealEmbeddingProvider(opts?: StrictEmbeddingProviderOptions): QueryEmbeddingProvider;
|