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,401 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const AXIS_KINDS = ["folder", "field", "link"];
|
|
4
|
+
const VALUE_TYPES = [
|
|
5
|
+
"text",
|
|
6
|
+
"string",
|
|
7
|
+
"select",
|
|
8
|
+
"number",
|
|
9
|
+
"boolean",
|
|
10
|
+
"checkbox",
|
|
11
|
+
"date",
|
|
12
|
+
"datetime",
|
|
13
|
+
"list",
|
|
14
|
+
"multitext",
|
|
15
|
+
"multi",
|
|
16
|
+
"tags",
|
|
17
|
+
"aliases",
|
|
18
|
+
"file",
|
|
19
|
+
];
|
|
20
|
+
function isRecord(value) {
|
|
21
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
function fail(message) {
|
|
24
|
+
throw new Error(`Invalid frontmatter contract: ${message}`);
|
|
25
|
+
}
|
|
26
|
+
function asAxisKind(value, where) {
|
|
27
|
+
if (typeof value === "string" && AXIS_KINDS.includes(value)) {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
fail(`${where}.kind must be one of folder, field, or link.`);
|
|
31
|
+
}
|
|
32
|
+
function asValueType(value, where) {
|
|
33
|
+
if (isRecord(value) && value["type"] !== undefined)
|
|
34
|
+
return asValueType(value["type"], `${where}.type`);
|
|
35
|
+
if (typeof value === "string" && VALUE_TYPES.includes(value)) {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
if (typeof value === "string") {
|
|
39
|
+
const normalized = value.trim().toLowerCase();
|
|
40
|
+
const aliases = {
|
|
41
|
+
text: "text",
|
|
42
|
+
input: "text",
|
|
43
|
+
string: "string",
|
|
44
|
+
select: "select",
|
|
45
|
+
number: "number",
|
|
46
|
+
boolean: "boolean",
|
|
47
|
+
checkbox: "checkbox",
|
|
48
|
+
date: "date",
|
|
49
|
+
datetime: "datetime",
|
|
50
|
+
list: "list",
|
|
51
|
+
multi: "multi",
|
|
52
|
+
multitext: "multitext",
|
|
53
|
+
tags: "tags",
|
|
54
|
+
aliases: "aliases",
|
|
55
|
+
file: "file",
|
|
56
|
+
};
|
|
57
|
+
const alias = aliases[normalized];
|
|
58
|
+
if (alias !== undefined)
|
|
59
|
+
return alias;
|
|
60
|
+
}
|
|
61
|
+
fail(`${where}.type must be a supported Obsidian property type.`);
|
|
62
|
+
}
|
|
63
|
+
function asString(value, where) {
|
|
64
|
+
if (typeof value !== "string" || value.trim().length === 0)
|
|
65
|
+
fail(`${where} must be a non-empty string.`);
|
|
66
|
+
return value.trim();
|
|
67
|
+
}
|
|
68
|
+
function asAllowedValues(value, where) {
|
|
69
|
+
if (!Array.isArray(value))
|
|
70
|
+
fail(`${where} must be an array.`);
|
|
71
|
+
return value.map((item, index) => {
|
|
72
|
+
if (typeof item === "string")
|
|
73
|
+
return asString(item, `${where}[${index}]`);
|
|
74
|
+
if (!isRecord(item))
|
|
75
|
+
fail(`${where}[${index}] must be a string or object.`);
|
|
76
|
+
const extras = Object.fromEntries(Object.entries(item).filter(([key]) => key !== "value" && key !== "intent"));
|
|
77
|
+
const intent = item["intent"] === undefined ? undefined : asString(item["intent"], `${where}[${index}].intent`);
|
|
78
|
+
const allowed = {
|
|
79
|
+
...extras,
|
|
80
|
+
value: asString(item["value"], `${where}[${index}].value`),
|
|
81
|
+
...(intent === undefined ? {} : { intent }),
|
|
82
|
+
};
|
|
83
|
+
return allowed;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function parseAxis(value, where, impliedKind, impliedKey) {
|
|
87
|
+
if (!isRecord(value))
|
|
88
|
+
fail(`${where} must be an object.`);
|
|
89
|
+
const kind = asAxisKind(value["kind"] ?? impliedKind, where);
|
|
90
|
+
const key = asString(value["key"] ?? impliedKey, `${where}.key`);
|
|
91
|
+
const type = asValueType(value["type"], where);
|
|
92
|
+
const intent = value["intent"] === undefined ? undefined : asString(value["intent"], `${where}.intent`);
|
|
93
|
+
const required = value["required"] === undefined ? undefined : value["required"];
|
|
94
|
+
if (required !== undefined && typeof required !== "boolean")
|
|
95
|
+
fail(`${where}.required must be boolean.`);
|
|
96
|
+
const normalize = value["normalize"];
|
|
97
|
+
if (normalize !== undefined && normalize !== "lower" && normalize !== "trim" && normalize !== "kebab") {
|
|
98
|
+
fail(`${where}.normalize must be lower, trim, or kebab.`);
|
|
99
|
+
}
|
|
100
|
+
const allowedValues = value["allowedValues"] === undefined
|
|
101
|
+
? undefined
|
|
102
|
+
: asAllowedValues(value["allowedValues"], `${where}.allowedValues`);
|
|
103
|
+
const extras = Object.fromEntries(Object.entries(value).filter(([key]) => !["kind", "key", "type", "intent", "required", "normalize", "allowedValues"].includes(key)));
|
|
104
|
+
return {
|
|
105
|
+
...extras,
|
|
106
|
+
kind,
|
|
107
|
+
key,
|
|
108
|
+
type,
|
|
109
|
+
...(intent === undefined ? {} : { intent }),
|
|
110
|
+
...(required === undefined ? {} : { required }),
|
|
111
|
+
...(normalize === undefined ? {} : { normalize }),
|
|
112
|
+
...(allowedValues === undefined ? {} : { allowedValues }),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Parse the two contract shapes emitted by setup: the canonical axis array and
|
|
117
|
+
* the convenient `{ folder: {...}, field: {...} }` grouping form. Both become
|
|
118
|
+
* one deterministic in-memory representation.
|
|
119
|
+
*/
|
|
120
|
+
function parseAxes(value) {
|
|
121
|
+
if (Array.isArray(value))
|
|
122
|
+
return value.map((axis, index) => parseAxis(axis, `axes[${index}]`));
|
|
123
|
+
if (!isRecord(value))
|
|
124
|
+
fail("axes must be an array or object.");
|
|
125
|
+
const axes = [];
|
|
126
|
+
for (const [kindKey, group] of Object.entries(value)) {
|
|
127
|
+
if (!AXIS_KINDS.includes(kindKey))
|
|
128
|
+
fail(`axes.${kindKey} is not a supported axis kind.`);
|
|
129
|
+
const kind = kindKey;
|
|
130
|
+
if (Array.isArray(group)) {
|
|
131
|
+
group.forEach((axis, index) => axes.push(parseAxis(axis, `axes.${kind}[${index}]`, kind)));
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (!isRecord(group))
|
|
135
|
+
fail(`axes.${kind} must be an object or array.`);
|
|
136
|
+
if (group["type"] !== undefined || group["key"] !== undefined || group["kind"] !== undefined) {
|
|
137
|
+
axes.push(parseAxis(group, `axes.${kind}`, kind));
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
for (const [key, descriptor] of Object.entries(group)) {
|
|
141
|
+
axes.push(parseAxis(descriptor, `axes.${kind}.${key}`, kind, key));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return axes;
|
|
145
|
+
}
|
|
146
|
+
function parseTypeMap(value, where) {
|
|
147
|
+
if (!isRecord(value))
|
|
148
|
+
fail(`${where} must be an object.`);
|
|
149
|
+
const types = {};
|
|
150
|
+
for (const [key, type] of Object.entries(value)) {
|
|
151
|
+
types[asString(key, `${where} key`)] = asValueType(type, `${where}.${key}`);
|
|
152
|
+
}
|
|
153
|
+
return types;
|
|
154
|
+
}
|
|
155
|
+
function parseAllowedValues(value) {
|
|
156
|
+
if (!isRecord(value))
|
|
157
|
+
fail("allowedValues must be an object.");
|
|
158
|
+
const allowedValues = {};
|
|
159
|
+
for (const [key, values] of Object.entries(value)) {
|
|
160
|
+
allowedValues[asString(key, "allowedValues key")] = asAllowedValues(values, `allowedValues.${key}`);
|
|
161
|
+
}
|
|
162
|
+
return allowedValues;
|
|
163
|
+
}
|
|
164
|
+
function validateUniqueAxes(axes) {
|
|
165
|
+
const seen = new Set();
|
|
166
|
+
for (const axis of axes) {
|
|
167
|
+
const identity = `${axis.kind}:${axis.key.toLowerCase()}`;
|
|
168
|
+
if (seen.has(identity))
|
|
169
|
+
fail(`duplicate axis ${axis.kind}:${axis.key}.`);
|
|
170
|
+
seen.add(identity);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** Parse and validate a JSON contract. Malformed contracts always throw. */
|
|
174
|
+
export function parseContract(input) {
|
|
175
|
+
let value;
|
|
176
|
+
if (typeof input === "string") {
|
|
177
|
+
try {
|
|
178
|
+
value = JSON.parse(input);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const message = error instanceof Error ? error.message : "invalid JSON";
|
|
182
|
+
fail(`JSON parse failed (${message}).`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
value = input;
|
|
187
|
+
}
|
|
188
|
+
if (!isRecord(value))
|
|
189
|
+
fail("root must be an object.");
|
|
190
|
+
const version = value["version"];
|
|
191
|
+
if (typeof version !== "number" || !Number.isInteger(version) || version < 1) {
|
|
192
|
+
fail("version must be a positive integer.");
|
|
193
|
+
}
|
|
194
|
+
const intent = value["intent"] === undefined ? undefined : asString(value["intent"], "intent");
|
|
195
|
+
const axes = parseAxes(value["axes"]);
|
|
196
|
+
const types = parseTypeMap(value["types"], "types");
|
|
197
|
+
const allowedValues = parseAllowedValues(value["allowedValues"]);
|
|
198
|
+
validateUniqueAxes(axes);
|
|
199
|
+
// Axis-local declarations are copied into the top-level indexes so callers
|
|
200
|
+
// have one lookup path. Conflicting declarations are contract errors.
|
|
201
|
+
for (const axis of axes) {
|
|
202
|
+
const priorType = types[axis.key];
|
|
203
|
+
if (priorType !== undefined && priorType !== axis.type)
|
|
204
|
+
fail(`types.${axis.key} conflicts with axis type.`);
|
|
205
|
+
if (axis.allowedValues !== undefined) {
|
|
206
|
+
const priorValues = allowedValues[axis.key];
|
|
207
|
+
if (priorValues !== undefined && JSON.stringify(priorValues) !== JSON.stringify(axis.allowedValues)) {
|
|
208
|
+
fail(`allowedValues.${axis.key} conflicts with axis declaration.`);
|
|
209
|
+
}
|
|
210
|
+
if (priorValues === undefined)
|
|
211
|
+
allowedValues[axis.key] = [...axis.allowedValues];
|
|
212
|
+
}
|
|
213
|
+
if (priorType === undefined)
|
|
214
|
+
types[axis.key] = axis.type;
|
|
215
|
+
}
|
|
216
|
+
const extras = Object.fromEntries(Object.entries(value).filter(([key]) => !["version", "intent", "axes", "types", "allowedValues"].includes(key)));
|
|
217
|
+
return {
|
|
218
|
+
...extras,
|
|
219
|
+
version,
|
|
220
|
+
...(intent === undefined ? {} : { intent }),
|
|
221
|
+
axes,
|
|
222
|
+
types,
|
|
223
|
+
allowedValues,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/** Canonical stable JSON representation (two-space indent, trailing newline). */
|
|
227
|
+
export function serializeContract(contract) {
|
|
228
|
+
const parsed = parseContract(contract);
|
|
229
|
+
const axes = [...parsed.axes]
|
|
230
|
+
.sort((left, right) => left.kind.localeCompare(right.kind) || left.key.localeCompare(right.key))
|
|
231
|
+
.map((axis) => {
|
|
232
|
+
const extras = Object.fromEntries(Object.entries(axis)
|
|
233
|
+
.filter(([key]) => !["kind", "key", "type", "required", "normalize", "allowedValues", "intent"].includes(key))
|
|
234
|
+
.sort(([left], [right]) => left.localeCompare(right)));
|
|
235
|
+
return {
|
|
236
|
+
kind: axis.kind,
|
|
237
|
+
key: axis.key,
|
|
238
|
+
type: axis.type,
|
|
239
|
+
...(axis.required === undefined ? {} : { required: axis.required }),
|
|
240
|
+
...(axis.normalize === undefined ? {} : { normalize: axis.normalize }),
|
|
241
|
+
...(axis.allowedValues === undefined ? {} : { allowedValues: [...axis.allowedValues] }),
|
|
242
|
+
...(axis.intent === undefined ? {} : { intent: axis.intent }),
|
|
243
|
+
...extras,
|
|
244
|
+
};
|
|
245
|
+
});
|
|
246
|
+
const types = Object.fromEntries(Object.entries(parsed.types).sort(([left], [right]) => left.localeCompare(right)));
|
|
247
|
+
const allowedValues = Object.fromEntries(Object.entries(parsed.allowedValues)
|
|
248
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
249
|
+
.map(([key, values]) => [key, [...values]]));
|
|
250
|
+
const extras = Object.fromEntries(Object.entries(parsed)
|
|
251
|
+
.filter(([key]) => !["version", "intent", "axes", "types", "allowedValues"].includes(key))
|
|
252
|
+
.sort(([left], [right]) => left.localeCompare(right)));
|
|
253
|
+
return `${JSON.stringify({
|
|
254
|
+
version: parsed.version,
|
|
255
|
+
...(parsed.intent === undefined ? {} : { intent: parsed.intent }),
|
|
256
|
+
axes,
|
|
257
|
+
types,
|
|
258
|
+
allowedValues,
|
|
259
|
+
...extras,
|
|
260
|
+
}, null, 2)}\n`;
|
|
261
|
+
}
|
|
262
|
+
export const CONTRACT_SCHEMA = {
|
|
263
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
264
|
+
type: "object",
|
|
265
|
+
additionalProperties: true,
|
|
266
|
+
required: ["version", "axes", "types", "allowedValues"],
|
|
267
|
+
properties: {
|
|
268
|
+
version: { type: "integer", minimum: 1 },
|
|
269
|
+
intent: { type: "string", minLength: 1 },
|
|
270
|
+
axes: {
|
|
271
|
+
type: "array",
|
|
272
|
+
items: {
|
|
273
|
+
type: "object",
|
|
274
|
+
additionalProperties: true,
|
|
275
|
+
required: ["kind", "key", "type"],
|
|
276
|
+
properties: {
|
|
277
|
+
kind: { enum: ["folder", "field", "link"] },
|
|
278
|
+
key: { type: "string", minLength: 1 },
|
|
279
|
+
type: { enum: VALUE_TYPES },
|
|
280
|
+
intent: { type: "string", minLength: 1 },
|
|
281
|
+
required: { type: "boolean" },
|
|
282
|
+
normalize: { enum: ["lower", "trim", "kebab"] },
|
|
283
|
+
allowedValues: {
|
|
284
|
+
type: "array",
|
|
285
|
+
items: {
|
|
286
|
+
oneOf: [
|
|
287
|
+
{ type: "string" },
|
|
288
|
+
{
|
|
289
|
+
type: "object",
|
|
290
|
+
additionalProperties: true,
|
|
291
|
+
required: ["value"],
|
|
292
|
+
properties: { value: { type: "string", minLength: 1 }, intent: { type: "string", minLength: 1 } },
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
types: { type: "object", additionalProperties: { enum: VALUE_TYPES } },
|
|
301
|
+
allowedValues: {
|
|
302
|
+
type: "object",
|
|
303
|
+
additionalProperties: {
|
|
304
|
+
type: "array",
|
|
305
|
+
items: {
|
|
306
|
+
oneOf: [
|
|
307
|
+
{ type: "string" },
|
|
308
|
+
{
|
|
309
|
+
type: "object",
|
|
310
|
+
additionalProperties: true,
|
|
311
|
+
required: ["value"],
|
|
312
|
+
properties: { value: { type: "string", minLength: 1 }, intent: { type: "string", minLength: 1 } },
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
function omsTypesPath(input) {
|
|
321
|
+
if (path.basename(input) === "types.json")
|
|
322
|
+
return input;
|
|
323
|
+
if (path.basename(input) === ".oms")
|
|
324
|
+
return path.join(input, "types.json");
|
|
325
|
+
return path.join(input, ".oms", "types.json");
|
|
326
|
+
}
|
|
327
|
+
function obsidianTypesPath(input) {
|
|
328
|
+
if (path.basename(input) === "types.json" && path.basename(path.dirname(input)) === ".obsidian")
|
|
329
|
+
return input;
|
|
330
|
+
if (path.basename(input) === "types.json" && path.basename(path.dirname(input)) === ".oms") {
|
|
331
|
+
return path.join(path.dirname(path.dirname(input)), ".obsidian", "types.json");
|
|
332
|
+
}
|
|
333
|
+
if (path.basename(input) === ".obsidian")
|
|
334
|
+
return path.join(input, "types.json");
|
|
335
|
+
return path.join(input, ".obsidian", "types.json");
|
|
336
|
+
}
|
|
337
|
+
/** Read the tracked JSON contract. Legacy YAML files are deliberately ignored. */
|
|
338
|
+
export async function loadContract(input, options = {}) {
|
|
339
|
+
let raw;
|
|
340
|
+
try {
|
|
341
|
+
raw = await readFile(omsTypesPath(input), "utf-8");
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
345
|
+
return null;
|
|
346
|
+
throw error;
|
|
347
|
+
}
|
|
348
|
+
const contract = parseContract(raw);
|
|
349
|
+
if (options.obsidianTypes === false)
|
|
350
|
+
return contract;
|
|
351
|
+
const authority = await loadObsidianTypes(input);
|
|
352
|
+
if (authority === null)
|
|
353
|
+
return contract;
|
|
354
|
+
const types = { ...contract.types, ...authority.types };
|
|
355
|
+
const axes = contract.axes.map((axis) => ({ ...axis, type: types[axis.key] ?? axis.type }));
|
|
356
|
+
return { ...contract, axes, types };
|
|
357
|
+
}
|
|
358
|
+
/** Read `.obsidian/types.json` through one adapter; this function never writes. */
|
|
359
|
+
export async function loadObsidianTypes(input) {
|
|
360
|
+
let raw;
|
|
361
|
+
const source = obsidianTypesPath(input);
|
|
362
|
+
try {
|
|
363
|
+
raw = await readFile(source, "utf-8");
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
367
|
+
return null;
|
|
368
|
+
throw error;
|
|
369
|
+
}
|
|
370
|
+
let parsed;
|
|
371
|
+
try {
|
|
372
|
+
parsed = JSON.parse(raw);
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
const message = error instanceof Error ? error.message : "invalid JSON";
|
|
376
|
+
throw new Error(`Invalid Obsidian types authority: JSON parse failed (${message}).`);
|
|
377
|
+
}
|
|
378
|
+
if (!isRecord(parsed))
|
|
379
|
+
throw new Error("Invalid Obsidian types authority: root must be an object.");
|
|
380
|
+
const candidate = parsed["types"] ?? parsed;
|
|
381
|
+
const types = {};
|
|
382
|
+
if (Array.isArray(candidate)) {
|
|
383
|
+
candidate.forEach((entry, index) => {
|
|
384
|
+
if (!isRecord(entry))
|
|
385
|
+
throw new Error(`Invalid Obsidian types authority: types[${index}] must be an object.`);
|
|
386
|
+
const name = asString(entry["name"] ?? entry["key"], `types[${index}].name`);
|
|
387
|
+
types[name] = asValueType(entry["type"], `types[${index}]`);
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
Object.assign(types, parseTypeMap(candidate, "types"));
|
|
392
|
+
}
|
|
393
|
+
return { types, source };
|
|
394
|
+
}
|
|
395
|
+
/** Persist a validated contract to `.oms/types.json`; no YAML is migrated. */
|
|
396
|
+
export async function writeContract(input, contract) {
|
|
397
|
+
const target = omsTypesPath(input);
|
|
398
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
399
|
+
await writeFile(target, serializeContract(contract), "utf-8");
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kernel/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAuD7B,MAAM,UAAU,GAAgC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5E,MAAM,WAAW,GAAiC;IAChD,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,UAAU;IACV,MAAM;IACN,UAAU;IACV,MAAM;IACN,WAAW;IACX,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;CACP,CAAC;AAEF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,KAAa;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,UAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnF,OAAO,KAAyB,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IACvG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpF,OAAO,KAA0B,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAgD;YAC3D,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,WAAW;YACtB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,MAAM;SACb,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,GAAG,KAAK,mDAAmD,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,KAAa;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IACzG,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAC9D,OAAQ,KAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,+BAA+B,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;QAC/G,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,UAAU,CAAC,CAAC;QAChH,MAAM,OAAO,GAAG;YACd,GAAG,MAAM;YACT,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,SAAS,CAAC;YAC1D,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,KAAa,EAAE,WAA8B,EAAE,UAAmB;IACnG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,UAAU,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;IACxG,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjF,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IACxG,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACtG,IAAI,CAAC,GAAG,KAAK,2CAA2C,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,SAAS;QACxD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,GAAG,KAAK,gBAAgB,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvK,OAAO;QACL,GAAG,MAAM;QACT,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAE/D,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,IAAI,CAAE,UAAgC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,QAAQ,OAAO,gCAAgC,CAAC,CAAC;QAChH,MAAM,IAAI,GAAG,OAA2B,CAAC;QACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3F,SAAS;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,IAAI,8BAA8B,CAAC,CAAC;QACvE,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;YAC7F,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa;IACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAsC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAmC,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAA6B;IACvD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACzE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,KAAuB;IACnD,IAAI,KAAc,CAAC;IACnB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;YACxE,IAAI,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7E,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACjE,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEzB,2EAA2E;IAC3E,sEAAsE;IACtE,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,4BAA4B,CAAC,CAAC;QAC5G,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpG,IAAI,CAAC,iBAAiB,IAAI,CAAC,GAAG,mCAAmC,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,WAAW,KAAK,SAAS;gBAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,SAAS,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnJ,OAAO;QACL,GAAG,MAAM;QACT,OAAO;QACP,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,IAAI;QACJ,KAAK;QACL,aAAa;KACd,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,QAA6B;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC/F,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;aACjB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC7G,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CACxD,CAAC;QACF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YACtE,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACvF,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7D,GAAG,MAAM;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;SACjC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAC9C,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SACzF,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CACxD,CAAC;IACF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACjE,IAAI;QACJ,KAAK;QACL,aAAa;QACb,GAAG,MAAM;KACV,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,8CAA8C;IACvD,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,IAAI;IAC1B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC;IACvD,UAAU,EAAE;QACV,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QACxC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;QACxC,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,IAAI;gBAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;gBACjC,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;oBAC3C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;oBACrC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;oBAC3B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;oBACxC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC7B,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;oBAC/C,aAAa,EAAE;wBACb,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,KAAK,EAAE;gCACL,EAAE,IAAI,EAAE,QAAQ,EAAE;gCAClB;oCACE,IAAI,EAAE,QAAQ;oCACd,oBAAoB,EAAE,IAAI;oCAC1B,QAAQ,EAAE,CAAC,OAAO,CAAC;oCACnB,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE;iCAClG;6BACF;yBACF;qBACF;iBACF;aACF;SACF;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;QACtE,aAAa,EAAE;YACb,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE;gBACpB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAClB;4BACE,IAAI,EAAE,QAAQ;4BACd,oBAAoB,EAAE,IAAI;4BAC1B,QAAQ,EAAE,CAAC,OAAO,CAAC;4BACnB,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE;yBAClG;qBACF;iBACF;aACF;SACF;KACF;CACO,CAAC;AAEX,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9G,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,UAAgD,EAAE;IAClG,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjH,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACxC,MAAM,KAAK,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAa;IACnD,IAAI,GAAW,CAAC;IAChB,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjH,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,wDAAwD,OAAO,IAAI,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;IAC5C,MAAM,KAAK,GAAsC,EAAE,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,sBAAsB,CAAC,CAAC;YAC9G,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC;YAC7E,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,GAAG,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,QAA6B;IAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default audit exemptions - build artifacts, self-documenting templates, and
|
|
3
|
+
* skill files that intentionally carry no frontmatter. This is the single
|
|
4
|
+
* declaration; ../engine/conventions/vault-lint.ts re-exports it so its
|
|
5
|
+
* existing importers are unaffected.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_EXCLUDE_GLOBS: readonly string[];
|
|
8
|
+
/** True when `notePath` matches at least one of `globs`. */
|
|
9
|
+
export declare function matchesAnyGlob(notePath: string, globs: readonly string[]): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Predicate over vault-relative, forward-slashed note paths.
|
|
12
|
+
* Resolved once per vault root and reused by every walker level.
|
|
13
|
+
*/
|
|
14
|
+
export declare function excludedNoteMatcher(vaultRoot: string): Promise<(notePath: string) => boolean>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault-declared note exclusions for the scanning walkers.
|
|
3
|
+
*
|
|
4
|
+
* `taxonomy.yaml: exclude` names markdown files that are not notes - template
|
|
5
|
+
* sources whose pre-substitution frontmatter is intentionally not valid YAML
|
|
6
|
+
* (Templater tags, agent {{var}} placeholders), build staging, skill files.
|
|
7
|
+
* The vault-lint lane already honours it via `resolveExcludeGlobs` in
|
|
8
|
+
* ../engine/conventions/vault-lint.ts, but the walkers that feed retrieval
|
|
9
|
+
* (the engine graph builder, the EAV axis scan, the graph cache) never saw
|
|
10
|
+
* it and threw on the first excluded note, aborting the whole vault scan.
|
|
11
|
+
*
|
|
12
|
+
* This module gives those walkers the same exclusion policy without
|
|
13
|
+
* requiring a full Ontology load (two of the three call sites intentionally
|
|
14
|
+
* do not load one): it reads <vaultRoot>/.oms/taxonomy.yaml directly and
|
|
15
|
+
* degrades to the built-in defaults when the file is missing or malformed.
|
|
16
|
+
*/
|
|
17
|
+
import { readFile } from "node:fs/promises";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import { parse as parseYaml } from "yaml";
|
|
20
|
+
/**
|
|
21
|
+
* Default audit exemptions - build artifacts, self-documenting templates, and
|
|
22
|
+
* skill files that intentionally carry no frontmatter. This is the single
|
|
23
|
+
* declaration; ../engine/conventions/vault-lint.ts re-exports it so its
|
|
24
|
+
* existing importers are unaffected.
|
|
25
|
+
*/
|
|
26
|
+
export const DEFAULT_EXCLUDE_GLOBS = [
|
|
27
|
+
"25. Digital Garden/.deploy-staging/**",
|
|
28
|
+
"**/*.template.md",
|
|
29
|
+
"**/SKILL.md",
|
|
30
|
+
".obsidian/**",
|
|
31
|
+
".trash/**",
|
|
32
|
+
".oms/**",
|
|
33
|
+
"_attachments/**",
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Convert a `*`/`**` glob into an anchored RegExp. `**` matches across `/`,
|
|
37
|
+
* `*` does not.
|
|
38
|
+
*
|
|
39
|
+
* GLOBSTAR must be a placeholder character that (a) cannot appear in a glob
|
|
40
|
+
* and (b) survives the escaping step below untouched. The NUL character
|
|
41
|
+
* (written here as the escape sequence "\u0000") satisfies both. A printable
|
|
42
|
+
* stand-in typed as the literal four-character escape sequence would not
|
|
43
|
+
* survive: the escaping regex would itself escape its backslash, and the
|
|
44
|
+
* later split on the placeholder would never match again - silently
|
|
45
|
+
* disabling all "**" handling.
|
|
46
|
+
*/
|
|
47
|
+
function globToRegExp(glob) {
|
|
48
|
+
const GLOBSTAR = "\u0000";
|
|
49
|
+
const withPlaceholder = glob.replace(/\*\*/g, GLOBSTAR);
|
|
50
|
+
const escaped = withPlaceholder.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
51
|
+
const withStar = escaped.replace(/\*/g, "[^/]*");
|
|
52
|
+
const pattern = withStar.split(GLOBSTAR).join(".*");
|
|
53
|
+
return new RegExp(`^${pattern}$`);
|
|
54
|
+
}
|
|
55
|
+
/** True when `notePath` matches at least one of `globs`. */
|
|
56
|
+
export function matchesAnyGlob(notePath, globs) {
|
|
57
|
+
return globs.some((glob) => globToRegExp(glob).test(notePath));
|
|
58
|
+
}
|
|
59
|
+
/** One resolve per vault root per process; every walker level shares it. */
|
|
60
|
+
const matcherCache = new Map();
|
|
61
|
+
async function loadExcludeMatchers(vaultRoot) {
|
|
62
|
+
const key = path.resolve(vaultRoot);
|
|
63
|
+
let pending = matcherCache.get(key);
|
|
64
|
+
if (pending === undefined) {
|
|
65
|
+
pending = (async () => {
|
|
66
|
+
let declared = [];
|
|
67
|
+
try {
|
|
68
|
+
const raw = await readFile(path.join(key, ".oms", "taxonomy.yaml"), "utf-8");
|
|
69
|
+
const parsed = parseYaml(raw);
|
|
70
|
+
const rawExclude = parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)
|
|
71
|
+
? parsed["exclude"]
|
|
72
|
+
: undefined;
|
|
73
|
+
if (Array.isArray(rawExclude) && rawExclude.every((item) => typeof item === "string")) {
|
|
74
|
+
declared = rawExclude;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// A vault with no (or an unparsable) taxonomy.yaml still gets the
|
|
79
|
+
// built-in defaults - a missing exclude declaration is not fatal.
|
|
80
|
+
}
|
|
81
|
+
return [...DEFAULT_EXCLUDE_GLOBS, ...declared].map(globToRegExp);
|
|
82
|
+
})();
|
|
83
|
+
matcherCache.set(key, pending);
|
|
84
|
+
}
|
|
85
|
+
return pending;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Predicate over vault-relative, forward-slashed note paths.
|
|
89
|
+
* Resolved once per vault root and reused by every walker level.
|
|
90
|
+
*/
|
|
91
|
+
export async function excludedNoteMatcher(vaultRoot) {
|
|
92
|
+
const matchers = await loadExcludeMatchers(vaultRoot);
|
|
93
|
+
return (notePath) => matchers.some((pattern) => pattern.test(notePath));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=note-exclude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-exclude.js","sourceRoot":"","sources":["../../../src/kernel/conventions/note-exclude.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* - Explicit embedding configuration: OMS_EMBEDDING_PROVIDER + OMS_EMBEDDING_MODEL.
|
|
10
10
|
* - Lex-only semantic queries must remain usable without embedding configuration.
|
|
11
11
|
*/
|
|
12
|
+
import type { EmbeddingModelDescriptor } from "./embed/model.js";
|
|
12
13
|
import { McpEngineAdapter } from "./mcp/facade.js";
|
|
13
|
-
import type { DispatcherDeps } from "./retrieval/dispatcher.js";
|
|
14
|
+
import type { DispatcherDeps, DispatcherPolicy } from "./retrieval/dispatcher.js";
|
|
14
15
|
import type { EngineStore } from "./embed/store.js";
|
|
15
16
|
import type { EmbeddingProvider } from "./types.js";
|
|
16
17
|
import type { Reranker } from "./retrieval/reranker.js";
|
|
@@ -22,10 +23,28 @@ export interface AssembleConfig {
|
|
|
22
23
|
embeddingProvider?: string;
|
|
23
24
|
/** Optional explicit embedding model/id/path (OMS_EMBEDDING_MODEL). */
|
|
24
25
|
embeddingModel?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Optional canonical descriptor supplied by setup. When omitted, assembly
|
|
28
|
+
* discovers the setup-written installed default. `null` explicitly waives
|
|
29
|
+
* default discovery.
|
|
30
|
+
*/
|
|
31
|
+
embeddingDescriptor?: EmbeddingModelDescriptor | null;
|
|
32
|
+
/** Test/setup override for the user-level model cache root. */
|
|
33
|
+
embeddingCacheDir?: string;
|
|
34
|
+
/** Explicit descriptor-shape overrides for callers without a descriptor. */
|
|
35
|
+
embeddingDimensions?: number;
|
|
36
|
+
embeddingContext?: number;
|
|
37
|
+
embeddingContextLength?: number;
|
|
38
|
+
embeddingContextTokens?: number;
|
|
39
|
+
embeddingMrlDim?: number;
|
|
40
|
+
embeddingNormalization?: string;
|
|
41
|
+
embeddingPrefixScheme?: string;
|
|
25
42
|
/** Absolute path to the SQLite engine store database file. Default: <vault>/.oms/engine-store.sqlite */
|
|
26
43
|
dbPath?: string;
|
|
27
44
|
/** RRF smoothing constant passed to DispatcherDeps (default 60). */
|
|
28
45
|
rrfK?: number;
|
|
46
|
+
/** Explicit retrieval policy used by the production dispatcher. */
|
|
47
|
+
policy?: DispatcherPolicy;
|
|
29
48
|
/** Default BFS hop depth for graph sub-queries (default 2). */
|
|
30
49
|
graphDepth?: number;
|
|
31
50
|
/**
|
|
@@ -59,6 +78,8 @@ export interface SyncVaultResult {
|
|
|
59
78
|
skipped: number;
|
|
60
79
|
available: boolean;
|
|
61
80
|
reason?: string;
|
|
81
|
+
/** True when this sync replaced the active on-disk generation. */
|
|
82
|
+
generationSwapped?: boolean;
|
|
62
83
|
}
|
|
63
84
|
/**
|
|
64
85
|
* Assemble a semantic-capable engine with a REAL embedding provider.
|