obsidian-mcp-server 3.7.2 → 3.9.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/AGENTS.md +20 -15
- package/CLAUDE.md +20 -15
- package/README.md +31 -19
- package/changelog/3.8.x/3.8.0.md +38 -0
- package/changelog/3.9.x/3.9.0.md +43 -0
- package/changelog/template.md +10 -3
- package/dist/config/server-config.d.ts +1 -0
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +30 -19
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +27 -15
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +4 -3
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +23 -12
- package/dist/instructions.js.map +1 -1
- package/dist/mcp-server/resources/definitions/index.d.ts +2 -2
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts +3 -2
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js +6 -5
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js.map +1 -1
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts +2 -2
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js +2 -2
- package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts +15 -6
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js +24 -12
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +250 -230
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/index.js +6 -4
- package/dist/mcp-server/tools/definitions/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +8 -2
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +10 -3
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +7 -6
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +7 -7
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +8 -5
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +6 -6
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +8 -8
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts +4 -4
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js +7 -7
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +3 -3
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +8 -2
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +10 -3
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +185 -35
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +145 -82
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +8 -2
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +12 -5
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -1
- package/dist/services/obsidian/jsonlogic-evaluator.d.ts +33 -8
- package/dist/services/obsidian/jsonlogic-evaluator.d.ts.map +1 -1
- package/dist/services/obsidian/jsonlogic-evaluator.js +171 -32
- package/dist/services/obsidian/jsonlogic-evaluator.js.map +1 -1
- package/dist/services/obsidian/jsonlogic-worker.d.ts +6 -5
- package/dist/services/obsidian/jsonlogic-worker.d.ts.map +1 -1
- package/dist/services/obsidian/jsonlogic-worker.js +7 -5
- package/dist/services/obsidian/jsonlogic-worker.js.map +1 -1
- package/dist/services/obsidian/obsidian-service.d.ts +90 -36
- package/dist/services/obsidian/obsidian-service.d.ts.map +1 -1
- package/dist/services/obsidian/obsidian-service.js +748 -248
- package/dist/services/obsidian/obsidian-service.js.map +1 -1
- package/dist/services/obsidian/patch-instruction.d.ts +4 -1
- package/dist/services/obsidian/patch-instruction.d.ts.map +1 -1
- package/dist/services/obsidian/patch-instruction.js +5 -2
- package/dist/services/obsidian/patch-instruction.js.map +1 -1
- package/dist/services/obsidian/path-policy.d.ts +67 -23
- package/dist/services/obsidian/path-policy.d.ts.map +1 -1
- package/dist/services/obsidian/path-policy.js +183 -80
- package/dist/services/obsidian/path-policy.js.map +1 -1
- package/dist/services/obsidian/section-extractor.d.ts +62 -1
- package/dist/services/obsidian/section-extractor.d.ts.map +1 -1
- package/dist/services/obsidian/section-extractor.js +387 -51
- package/dist/services/obsidian/section-extractor.js.map +1 -1
- package/dist/services/obsidian/simple-search.d.ts +62 -0
- package/dist/services/obsidian/simple-search.d.ts.map +1 -0
- package/dist/services/obsidian/simple-search.js +264 -0
- package/dist/services/obsidian/simple-search.js.map +1 -0
- package/manifest.json +12 -4
- package/package.json +9 -9
- package/server.json +23 -11
- package/skills/obsidian-guide/SKILL.md +61 -0
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Server-side JSONLogic evaluation for searches scoped by
|
|
3
|
-
* OBSIDIAN_READ_PATHS. The caller's tree runs here, on
|
|
4
|
-
* the readable notes alone, instead of upstream over the
|
|
5
|
-
* result, or error reads a note outside the read scope.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
3
|
+
* OBSIDIAN_READ_PATHS or OBSIDIAN_DENY_PATHS. The caller's tree runs here, on
|
|
4
|
+
* a worker thread, over the readable notes alone, instead of upstream over the
|
|
5
|
+
* whole vault: no hit, result, or error reads a note outside the read scope.
|
|
6
|
+
* The notes carry no link fields: which note a link resolves to is Obsidian's
|
|
7
|
+
* vault-wide resolution, so `links`, `backlinks`, and `unresolvedLinks` would
|
|
8
|
+
* change with notes outside the scope (#165). A tree that names one fails with
|
|
9
|
+
* `link_fields_unavailable` before the search makes a request.
|
|
8
10
|
*
|
|
9
11
|
* Every evaluation is bounded — tree depth, work budgets the worker enforces
|
|
10
12
|
* (per note for what each note's evaluation builds, per search for what kept
|
|
@@ -63,6 +65,27 @@ export declare function readsContent(logic: unknown): boolean;
|
|
|
63
65
|
* anything recursive (serialization, the worker hand-off, evaluation).
|
|
64
66
|
*/
|
|
65
67
|
export declare function assertTreeDepth(logic: unknown): void;
|
|
68
|
+
/**
|
|
69
|
+
* Reject a tree that reads a link field of the note through `var`, `missing`,
|
|
70
|
+
* or `missing_some`. A scoped search's notes carry none, so such a read would
|
|
71
|
+
* see `null` on every note: `{"in": [X, {"var": "backlinks"}]}` would answer
|
|
72
|
+
* "nothing links here", and `{"missing": ["backlinks"]}` would report the
|
|
73
|
+
* field missing everywhere. Only a key fixed by the tree is caught —
|
|
74
|
+
* `"links"`, `"backlinks.0"`, the array form with a default — while a computed
|
|
75
|
+
* key reads `null`, and a `var` or `missing` applied to the elements a `map`,
|
|
76
|
+
* `filter`, `reduce`, `all`, `some`, or `none` walks reads the element, not
|
|
77
|
+
* the note. An object of other than one key is data json-logic-js never
|
|
78
|
+
* evaluates. Iterative; the tree's depth is already held to
|
|
79
|
+
* {@link MAX_TREE_DEPTH}.
|
|
80
|
+
*/
|
|
81
|
+
export declare function assertNoLinkFields(logic: unknown): void;
|
|
82
|
+
/** One search's evaluation; see {@link createJsonLogicEvaluation}. */
|
|
83
|
+
export interface JsonLogicEvaluation {
|
|
84
|
+
/** Terminate the worker, if one started. Idempotent; the search calls it however it ends. */
|
|
85
|
+
close(): Promise<void>;
|
|
86
|
+
/** Evaluate the next batch of readable notes, in vault order. */
|
|
87
|
+
evaluate(notes: NoteContext[]): Promise<StructuredSearchHit[]>;
|
|
88
|
+
}
|
|
66
89
|
/**
|
|
67
90
|
* One search's evaluation of `logic`. `evaluate` takes the readable notes in
|
|
68
91
|
* vault order, all at once or in successive batches; the budget for kept
|
|
@@ -73,11 +96,13 @@ export declare function assertTreeDepth(logic: unknown): void;
|
|
|
73
96
|
* `logic_invalid` when the tree fails on a note, `logic_too_costly` past
|
|
74
97
|
* either budget or the deadline, `note_too_deep` for a note the worker
|
|
75
98
|
* hand-off cannot carry, and the abort reason when `signal` aborts first.
|
|
99
|
+
*
|
|
100
|
+
* One worker evaluates every batch: started with the first batch that holds a
|
|
101
|
+
* note, it is terminated when a batch fails, passes a bound, or is cancelled,
|
|
102
|
+
* and otherwise by `close`.
|
|
76
103
|
*/
|
|
77
104
|
export declare function createJsonLogicEvaluation(logic: unknown, opts?: {
|
|
78
105
|
signal?: AbortSignal | undefined;
|
|
79
106
|
deadlineMs?: number;
|
|
80
|
-
}):
|
|
81
|
-
evaluate: (notes: NoteContext[]) => Promise<StructuredSearchHit[]>;
|
|
82
|
-
};
|
|
107
|
+
}): JsonLogicEvaluation;
|
|
83
108
|
//# sourceMappingURL=jsonlogic-evaluator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonlogic-evaluator.d.ts","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-evaluator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jsonlogic-evaluator.d.ts","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAyC,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,OAAQ,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,WAAa,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,WAAa,CAAC;AAE3C,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAW7C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAMpD;AAkBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CA2BvD;AAsED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CAChE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,mBAAmB,CAqFrB"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Server-side JSONLogic evaluation for searches scoped by
|
|
3
|
-
* OBSIDIAN_READ_PATHS. The caller's tree runs here, on
|
|
4
|
-
* the readable notes alone, instead of upstream over the
|
|
5
|
-
* result, or error reads a note outside the read scope.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
3
|
+
* OBSIDIAN_READ_PATHS or OBSIDIAN_DENY_PATHS. The caller's tree runs here, on
|
|
4
|
+
* a worker thread, over the readable notes alone, instead of upstream over the
|
|
5
|
+
* whole vault: no hit, result, or error reads a note outside the read scope.
|
|
6
|
+
* The notes carry no link fields: which note a link resolves to is Obsidian's
|
|
7
|
+
* vault-wide resolution, so `links`, `backlinks`, and `unresolvedLinks` would
|
|
8
|
+
* change with notes outside the scope (#165). A tree that names one fails with
|
|
9
|
+
* `link_fields_unavailable` before the search makes a request.
|
|
8
10
|
*
|
|
9
11
|
* Every evaluation is bounded — tree depth, work budgets the worker enforces
|
|
10
12
|
* (per note for what each note's evaluation builds, per search for what kept
|
|
@@ -74,6 +76,108 @@ export function assertTreeDepth(logic) {
|
|
|
74
76
|
throw tooCostly(`The JSONLogic tree nests deeper than ${MAX_TREE_DEPTH.toLocaleString('en-US')} levels.`);
|
|
75
77
|
}
|
|
76
78
|
}
|
|
79
|
+
/** The note fields a scoped search leaves out: each follows Obsidian's link resolution across the whole vault. */
|
|
80
|
+
const LINK_FIELDS = new Set(['links', 'backlinks', 'unresolvedLinks']);
|
|
81
|
+
/**
|
|
82
|
+
* json-logic-js operations that apply their second operand to each element of
|
|
83
|
+
* the first (`reduce`: to `{ current, accumulator }`) rather than to the note.
|
|
84
|
+
*/
|
|
85
|
+
const PER_ELEMENT_OPERATIONS = new Set([
|
|
86
|
+
'map',
|
|
87
|
+
'filter',
|
|
88
|
+
'reduce',
|
|
89
|
+
'all',
|
|
90
|
+
'some',
|
|
91
|
+
'none',
|
|
92
|
+
]);
|
|
93
|
+
/**
|
|
94
|
+
* Reject a tree that reads a link field of the note through `var`, `missing`,
|
|
95
|
+
* or `missing_some`. A scoped search's notes carry none, so such a read would
|
|
96
|
+
* see `null` on every note: `{"in": [X, {"var": "backlinks"}]}` would answer
|
|
97
|
+
* "nothing links here", and `{"missing": ["backlinks"]}` would report the
|
|
98
|
+
* field missing everywhere. Only a key fixed by the tree is caught —
|
|
99
|
+
* `"links"`, `"backlinks.0"`, the array form with a default — while a computed
|
|
100
|
+
* key reads `null`, and a `var` or `missing` applied to the elements a `map`,
|
|
101
|
+
* `filter`, `reduce`, `all`, `some`, or `none` walks reads the element, not
|
|
102
|
+
* the note. An object of other than one key is data json-logic-js never
|
|
103
|
+
* evaluates. Iterative; the tree's depth is already held to
|
|
104
|
+
* {@link MAX_TREE_DEPTH}.
|
|
105
|
+
*/
|
|
106
|
+
export function assertNoLinkFields(logic) {
|
|
107
|
+
const pending = [logic];
|
|
108
|
+
while (pending.length > 0) {
|
|
109
|
+
const node = pending.pop();
|
|
110
|
+
if (Array.isArray(node)) {
|
|
111
|
+
for (const item of node)
|
|
112
|
+
pending.push(item);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (node === null || typeof node !== 'object' || Object.keys(node).length !== 1)
|
|
116
|
+
continue;
|
|
117
|
+
const [[operation, raw]] = Object.entries(node);
|
|
118
|
+
const operands = Array.isArray(raw) ? raw : [raw];
|
|
119
|
+
const keys = operation === 'var'
|
|
120
|
+
? [raw]
|
|
121
|
+
: operation === 'missing'
|
|
122
|
+
? missingKeys(raw)
|
|
123
|
+
: operation === 'missing_some'
|
|
124
|
+
? missingKeys(operands[1])
|
|
125
|
+
: [];
|
|
126
|
+
for (const key of keys) {
|
|
127
|
+
const field = varField(key);
|
|
128
|
+
if (field !== undefined && LINK_FIELDS.has(field))
|
|
129
|
+
throw linkFieldsUnavailable(field);
|
|
130
|
+
}
|
|
131
|
+
for (const [index, operand] of operands.entries()) {
|
|
132
|
+
if (index !== 1 || !PER_ELEMENT_OPERATIONS.has(operation))
|
|
133
|
+
pending.push(operand);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The keys `missing` reads, each through `{"var": key}`, as json-logic-js
|
|
139
|
+
* picks them from its arguments: the first argument when it is an array,
|
|
140
|
+
* otherwise every argument. `missing_some` hands its second operand to
|
|
141
|
+
* `missing` the same way. None when a computed first argument leaves the
|
|
142
|
+
* choice to the note.
|
|
143
|
+
*/
|
|
144
|
+
function missingKeys(raw) {
|
|
145
|
+
const args = Array.isArray(raw) ? raw : [raw];
|
|
146
|
+
if (Array.isArray(args[0]))
|
|
147
|
+
return args[0];
|
|
148
|
+
return staticValue(args[0]) === COMPUTED ? [] : args;
|
|
149
|
+
}
|
|
150
|
+
/** The note field `{"var": raw}` reads when the tree fixes its key; `undefined` otherwise. */
|
|
151
|
+
function varField(raw) {
|
|
152
|
+
return staticKey(Array.isArray(raw) ? raw[0] : raw)?.split('.')[0];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The key a `var` operand evaluates to when the tree alone fixes it, as the
|
|
156
|
+
* worker's `var` reads it (`String(key)`); `undefined` when it is computed or
|
|
157
|
+
* names the whole note. json-logic-js evaluates an array element by element,
|
|
158
|
+
* so a literal array is fixed when every element is, and returns an object of
|
|
159
|
+
* other than one key as it is.
|
|
160
|
+
*/
|
|
161
|
+
function staticKey(operand) {
|
|
162
|
+
const value = staticValue(operand);
|
|
163
|
+
if (value === COMPUTED || value === undefined || value === null || value === '')
|
|
164
|
+
return;
|
|
165
|
+
return String(value);
|
|
166
|
+
}
|
|
167
|
+
const COMPUTED = Symbol('computed');
|
|
168
|
+
function staticValue(operand) {
|
|
169
|
+
if (Array.isArray(operand)) {
|
|
170
|
+
const values = operand.map(staticValue);
|
|
171
|
+
return values.includes(COMPUTED) ? COMPUTED : values;
|
|
172
|
+
}
|
|
173
|
+
if (operand !== null && typeof operand === 'object' && Object.keys(operand).length === 1) {
|
|
174
|
+
return COMPUTED;
|
|
175
|
+
}
|
|
176
|
+
return operand;
|
|
177
|
+
}
|
|
178
|
+
function linkFieldsUnavailable(field) {
|
|
179
|
+
return validationError(`The JSONLogic tree reads \`${field}\`, which a search under OBSIDIAN_READ_PATHS or OBSIDIAN_DENY_PATHS does not provide: \`links\`, \`backlinks\`, and \`unresolvedLinks\` follow Obsidian's link resolution across the whole vault.`, { reason: 'link_fields_unavailable' });
|
|
180
|
+
}
|
|
77
181
|
/**
|
|
78
182
|
* Deepest object/array nesting in `value`, which is level 1, measured until
|
|
79
183
|
* it passes `limit`. Iterative, so it measures data too deep for any
|
|
@@ -102,12 +206,59 @@ function nestingDepth(value, limit = Number.POSITIVE_INFINITY) {
|
|
|
102
206
|
* `logic_invalid` when the tree fails on a note, `logic_too_costly` past
|
|
103
207
|
* either budget or the deadline, `note_too_deep` for a note the worker
|
|
104
208
|
* hand-off cannot carry, and the abort reason when `signal` aborts first.
|
|
209
|
+
*
|
|
210
|
+
* One worker evaluates every batch: started with the first batch that holds a
|
|
211
|
+
* note, it is terminated when a batch fails, passes a bound, or is cancelled,
|
|
212
|
+
* and otherwise by `close`.
|
|
105
213
|
*/
|
|
106
214
|
export function createJsonLogicEvaluation(logic, opts = {}) {
|
|
107
215
|
const { signal, deadlineMs = EVALUATION_DEADLINE_MS } = opts;
|
|
108
216
|
let keptUnitsLeft = KEPT_RESULT_UNITS;
|
|
109
217
|
let msLeft = deadlineMs;
|
|
218
|
+
let worker;
|
|
219
|
+
/** The batch the worker is evaluating, settled by its reply, its failure, or its exit. */
|
|
220
|
+
let pending;
|
|
110
221
|
const pastDeadline = () => tooCostly(`Evaluating the JSONLogic tree over the readable notes ran past ${deadlineMs / 1000} s.`);
|
|
222
|
+
const start = () => {
|
|
223
|
+
const started = new Worker(WORKER_URL);
|
|
224
|
+
started.on('message', (response) => pending?.resolve(response));
|
|
225
|
+
started.on('error', (err) => pending?.reject(err));
|
|
226
|
+
started.on('exit', (code) => {
|
|
227
|
+
pending?.reject(new Error(`JSONLogic worker exited with code ${code} before answering`));
|
|
228
|
+
if (worker === started)
|
|
229
|
+
worker = undefined;
|
|
230
|
+
});
|
|
231
|
+
return started;
|
|
232
|
+
};
|
|
233
|
+
const close = async () => {
|
|
234
|
+
const running = worker;
|
|
235
|
+
worker = undefined;
|
|
236
|
+
await running?.terminate();
|
|
237
|
+
};
|
|
238
|
+
/** Hand `request` to the worker and wait for its reply, the deadline, or the abort. */
|
|
239
|
+
const answer = async (request) => {
|
|
240
|
+
worker ??= start();
|
|
241
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
242
|
+
pending = { resolve, reject };
|
|
243
|
+
const timer = setTimeout(() => reject(pastDeadline()), msLeft);
|
|
244
|
+
const onAbort = () => reject(signal?.reason);
|
|
245
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
246
|
+
try {
|
|
247
|
+
worker.postMessage(request);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
// Rejected before the await below takes the promise, so the exit `close` raises settles nothing.
|
|
251
|
+
reject(handOffError(err, request.notes));
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
return await promise;
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
pending = undefined;
|
|
258
|
+
clearTimeout(timer);
|
|
259
|
+
signal?.removeEventListener('abort', onAbort);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
111
262
|
return {
|
|
112
263
|
async evaluate(notes) {
|
|
113
264
|
if (notes.length === 0)
|
|
@@ -116,7 +267,19 @@ export function createJsonLogicEvaluation(logic, opts = {}) {
|
|
|
116
267
|
if (msLeft <= 0)
|
|
117
268
|
throw pastDeadline();
|
|
118
269
|
const started = performance.now();
|
|
119
|
-
|
|
270
|
+
let response;
|
|
271
|
+
try {
|
|
272
|
+
response = await answer({
|
|
273
|
+
logic,
|
|
274
|
+
notes,
|
|
275
|
+
keptUnits: keptUnitsLeft,
|
|
276
|
+
noteUnits: NOTE_BUILD_UNITS,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
await close();
|
|
281
|
+
throw err;
|
|
282
|
+
}
|
|
120
283
|
msLeft -= performance.now() - started;
|
|
121
284
|
if (response.ok) {
|
|
122
285
|
keptUnitsLeft = response.keptUnitsLeft;
|
|
@@ -125,8 +288,10 @@ export function createJsonLogicEvaluation(logic, opts = {}) {
|
|
|
125
288
|
result: JSON.parse(hit.json),
|
|
126
289
|
}));
|
|
127
290
|
}
|
|
291
|
+
await close();
|
|
128
292
|
throw failureError(response);
|
|
129
293
|
},
|
|
294
|
+
close,
|
|
130
295
|
};
|
|
131
296
|
}
|
|
132
297
|
function failureError(response) {
|
|
@@ -142,32 +307,6 @@ function failureError(response) {
|
|
|
142
307
|
return tooCostly(`The JSONLogic tree's results over the readable notes held more than the search's work budget of ${KEPT_RESULT_UNITS.toLocaleString('en-US')} units: each result over 1,024 characters pays for what it holds beyond its own note's size.`);
|
|
143
308
|
}
|
|
144
309
|
}
|
|
145
|
-
/** One worker per batch, terminated however it ends. */
|
|
146
|
-
async function runWorker(request, deadlineMs, pastDeadline, signal) {
|
|
147
|
-
const worker = new Worker(WORKER_URL);
|
|
148
|
-
const { promise, resolve, reject } = Promise.withResolvers();
|
|
149
|
-
const timer = setTimeout(() => reject(pastDeadline()), deadlineMs);
|
|
150
|
-
const onAbort = () => reject(signal?.reason);
|
|
151
|
-
signal?.addEventListener('abort', onAbort, { once: true });
|
|
152
|
-
worker.once('message', resolve);
|
|
153
|
-
worker.once('error', reject);
|
|
154
|
-
worker.once('exit', (code) => reject(new Error(`JSONLogic worker exited with code ${code} before answering`)));
|
|
155
|
-
try {
|
|
156
|
-
worker.postMessage(request);
|
|
157
|
-
}
|
|
158
|
-
catch (err) {
|
|
159
|
-
// Rejected before the await below takes the promise, so the exit `terminate` raises settles nothing.
|
|
160
|
-
reject(handOffError(err, request.notes));
|
|
161
|
-
}
|
|
162
|
-
try {
|
|
163
|
-
return await promise;
|
|
164
|
-
}
|
|
165
|
-
finally {
|
|
166
|
-
clearTimeout(timer);
|
|
167
|
-
signal?.removeEventListener('abort', onAbort);
|
|
168
|
-
await worker.terminate();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
310
|
/**
|
|
172
311
|
* Why `postMessage` refused a batch. Structured clone recurses, so data
|
|
173
312
|
* nested deep enough overflows the stack: about 3,500 levels under Node,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonlogic-evaluator.js","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-evaluator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jsonlogic-evaluator.js","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Worker-thread entry that evaluates a caller's JSONLogic tree
|
|
3
|
-
* against note contexts, for searches scoped by OBSIDIAN_READ_PATHS
|
|
4
|
-
* operator set the Local REST API plugin runs
|
|
5
|
-
* `glob` and `regexp`), with the plugin's hit
|
|
6
|
-
* a scoped search answers as the plugin would
|
|
3
|
+
* against note contexts, for searches scoped by OBSIDIAN_READ_PATHS or
|
|
4
|
+
* OBSIDIAN_DENY_PATHS. Runs the operator set the Local REST API plugin runs
|
|
5
|
+
* (json-logic-js 2.0.5 plus its `glob` and `regexp`), with the plugin's hit
|
|
6
|
+
* test and JSON-shaped results, so a scoped search answers as the plugin would
|
|
7
|
+
* over the same notes.
|
|
7
8
|
*
|
|
8
9
|
* Off the main thread so a slow tree cannot hold the event loop: the evaluator
|
|
9
10
|
* terminates this worker at its deadline, which also stops a native regex
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
*
|
|
19
20
|
* @module services/obsidian/jsonlogic-worker
|
|
20
21
|
*/
|
|
21
|
-
/** A note as the plugin's JSONLogic search evaluates it, link fields
|
|
22
|
+
/** A note as the plugin's JSONLogic search evaluates it, less the link fields a scoped search leaves out. */
|
|
22
23
|
export interface NoteContext {
|
|
23
24
|
path: string;
|
|
24
25
|
[field: string]: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonlogic-worker.d.ts","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-worker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jsonlogic-worker.d.ts","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,6GAA6G;AAC7G,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,kGAAkG;IAClG,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,kGAAkG;IAClG,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,SAAS,GAAG,gBAAgB,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF,KAAK,aAAa,GAAG,kBAAkB,GAAG,kBAAkB,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Worker-thread entry that evaluates a caller's JSONLogic tree
|
|
3
|
-
* against note contexts, for searches scoped by OBSIDIAN_READ_PATHS
|
|
4
|
-
* operator set the Local REST API plugin runs
|
|
5
|
-
* `glob` and `regexp`), with the plugin's hit
|
|
6
|
-
* a scoped search answers as the plugin would
|
|
3
|
+
* against note contexts, for searches scoped by OBSIDIAN_READ_PATHS or
|
|
4
|
+
* OBSIDIAN_DENY_PATHS. Runs the operator set the Local REST API plugin runs
|
|
5
|
+
* (json-logic-js 2.0.5 plus its `glob` and `regexp`), with the plugin's hit
|
|
6
|
+
* test and JSON-shaped results, so a scoped search answers as the plugin would
|
|
7
|
+
* over the same notes.
|
|
7
8
|
*
|
|
8
9
|
* Off the main thread so a slow tree cannot hold the event loop: the evaluator
|
|
9
10
|
* terminates this worker at its deadline, which also stops a native regex
|
|
@@ -231,7 +232,8 @@ function evaluate(request) {
|
|
|
231
232
|
}
|
|
232
233
|
return { ok: true, hits, keptUnitsLeft };
|
|
233
234
|
}
|
|
234
|
-
|
|
235
|
+
/** One reply per request: a search's batches arrive one at a time, each answered before the next is sent. */
|
|
236
|
+
parentPort?.on('message', (request) => {
|
|
235
237
|
parentPort?.postMessage(evaluate(request));
|
|
236
238
|
});
|
|
237
239
|
//# sourceMappingURL=jsonlogic-worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonlogic-worker.js","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-worker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jsonlogic-worker.js","sourceRoot":"","sources":["../../../src/services/obsidian/jsonlogic-worker.ts"],"names":[],"mappings":"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"}
|