@batalabs/virlow-mcp-core 3.18.0 → 3.68.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/LICENSE +8 -18
- package/README.md +1 -1
- package/dist/api.d.ts +32 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +38 -5
- package/dist/api.js.map +1 -1
- package/dist/attrs-extract.d.ts +48 -0
- package/dist/attrs-extract.d.ts.map +1 -0
- package/dist/attrs-extract.js +153 -0
- package/dist/attrs-extract.js.map +1 -0
- package/dist/attrs.d.ts +445 -0
- package/dist/attrs.d.ts.map +1 -0
- package/dist/attrs.js +604 -0
- package/dist/attrs.js.map +1 -0
- package/dist/cjs/api.d.ts +32 -0
- package/dist/cjs/api.js +38 -5
- package/dist/cjs/attrs-extract.d.ts +47 -0
- package/dist/cjs/attrs-extract.js +159 -0
- package/dist/cjs/attrs.d.ts +444 -0
- package/dist/cjs/attrs.js +635 -0
- package/dist/cjs/index.d.ts +5 -1
- package/dist/cjs/index.js +22 -1
- package/dist/cjs/memories.d.ts +79 -1
- package/dist/cjs/memories.js +249 -15
- package/dist/cjs/memory-graph.d.ts +105 -0
- package/dist/cjs/memory-graph.js +270 -0
- package/dist/cjs/memory-note.d.ts +57 -0
- package/dist/cjs/memory-note.js +174 -10
- package/dist/cjs/memory-secrets.d.ts +19 -0
- package/dist/cjs/memory-secrets.js +108 -0
- package/dist/cjs/notes.d.ts +208 -2
- package/dist/cjs/notes.js +721 -12
- package/dist/http/index.d.ts +4 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +3 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/local-origin.d.ts +61 -0
- package/dist/http/local-origin.d.ts.map +1 -0
- package/dist/http/local-origin.js +92 -0
- package/dist/http/local-origin.js.map +1 -0
- package/dist/http/server.d.ts +39 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +131 -0
- package/dist/http/server.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/memories.d.ts +79 -1
- package/dist/memories.d.ts.map +1 -1
- package/dist/memories.js +249 -15
- package/dist/memories.js.map +1 -1
- package/dist/memory-graph.d.ts +106 -0
- package/dist/memory-graph.d.ts.map +1 -0
- package/dist/memory-graph.js +258 -0
- package/dist/memory-graph.js.map +1 -0
- package/dist/memory-note.d.ts +57 -0
- package/dist/memory-note.d.ts.map +1 -1
- package/dist/memory-note.js +170 -10
- package/dist/memory-note.js.map +1 -1
- package/dist/memory-secrets.d.ts +20 -0
- package/dist/memory-secrets.d.ts.map +1 -0
- package/dist/memory-secrets.js +103 -0
- package/dist/memory-secrets.js.map +1 -0
- package/dist/notes.d.ts +208 -2
- package/dist/notes.d.ts.map +1 -1
- package/dist/notes.js +722 -13
- package/dist/notes.js.map +1 -1
- package/dist/tools.d.ts +8 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +465 -10
- package/dist/tools.js.map +1 -1
- package/package.json +21 -5
package/LICENSE
CHANGED
|
@@ -1,21 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
Copyright (c) 2026 Bata Labs LLC. All rights reserved.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This software and its source code are proprietary and confidential.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
in
|
|
8
|
-
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
5
|
+
No license, express or implied, is granted to any person to use, copy,
|
|
6
|
+
modify, merge, publish, distribute, sublicense, or sell copies of this
|
|
7
|
+
software, in whole or in part, except under a separate written agreement
|
|
8
|
+
with Bata Labs LLC.
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
10
|
+
Unauthorized copying, distribution, or disclosure of this software is
|
|
11
|
+
prohibited.
|
package/README.md
CHANGED
|
@@ -12,4 +12,4 @@ bug rather than an inconsistency.
|
|
|
12
12
|
What it does *not* contain: transports, the CLI, and the unlock user interface.
|
|
13
13
|
Those differ between local and hosted and belong to their hosts.
|
|
14
14
|
|
|
15
|
-
Published from [batalabs/virlow-app](https://
|
|
15
|
+
Published from [batalabs/virlow-app](https://git.typelets.com/batalabs/virlow-app).
|
package/dist/api.d.ts
CHANGED
|
@@ -6,6 +6,14 @@ export interface AuthTokens {
|
|
|
6
6
|
accessToken: string;
|
|
7
7
|
refreshToken: string;
|
|
8
8
|
}
|
|
9
|
+
/** What `/api/auth/refresh` answers, minus the refresh token this client keeps. */
|
|
10
|
+
export interface RefreshBody {
|
|
11
|
+
user: {
|
|
12
|
+
id: string;
|
|
13
|
+
email: string;
|
|
14
|
+
};
|
|
15
|
+
accessToken: string;
|
|
16
|
+
}
|
|
9
17
|
export type LoginResult = {
|
|
10
18
|
mfaRequired: true;
|
|
11
19
|
mfaToken: string;
|
|
@@ -38,6 +46,8 @@ export interface ApiNote {
|
|
|
38
46
|
hidden: boolean | null;
|
|
39
47
|
createdAt: string;
|
|
40
48
|
updatedAt: string;
|
|
49
|
+
/** Encrypted v2 blob of the note's structured attrs (props, links, mentions). */
|
|
50
|
+
encryptedAttrs: string | null;
|
|
41
51
|
}
|
|
42
52
|
export interface NoteWrite {
|
|
43
53
|
title: string;
|
|
@@ -52,6 +62,7 @@ export interface NoteWrite {
|
|
|
52
62
|
starred?: boolean;
|
|
53
63
|
archived?: boolean;
|
|
54
64
|
deleted?: boolean;
|
|
65
|
+
encryptedAttrs?: string | null;
|
|
55
66
|
}
|
|
56
67
|
export interface ApiFolder {
|
|
57
68
|
id: string;
|
|
@@ -63,14 +74,26 @@ export interface ApiFolder {
|
|
|
63
74
|
/** The user's "Expose to MCP" switch. False by default — nothing in this
|
|
64
75
|
* folder is shown to AI tools until they turn it on. */
|
|
65
76
|
mcpEnabled: boolean;
|
|
77
|
+
/** Encrypted v2 blob of the folder's property and view definitions. */
|
|
78
|
+
encryptedSchema: string | null;
|
|
66
79
|
}
|
|
67
80
|
export declare class VirlowApi {
|
|
68
81
|
private readonly baseUrl;
|
|
69
82
|
private tokens;
|
|
70
83
|
private refreshInFlight;
|
|
71
84
|
onTokensRotated?: (tokens: AuthTokens) => void;
|
|
85
|
+
/** Fired when a refresh is refused outright and the session is gone. */
|
|
86
|
+
onTokensCleared?: () => void;
|
|
72
87
|
constructor(baseUrl: string);
|
|
73
88
|
setTokens(tokens: AuthTokens | null): void;
|
|
89
|
+
getTokens(): AuthTokens | null;
|
|
90
|
+
/**
|
|
91
|
+
* Rotate the refresh token exactly once no matter how many callers arrive
|
|
92
|
+
* while a rotation is pending. The API revokes the whole token family when a
|
|
93
|
+
* replaced refresh token is presented again, so two concurrent refreshes are
|
|
94
|
+
* not a race, they are a forced sign-out.
|
|
95
|
+
*/
|
|
96
|
+
refreshSession(): Promise<RefreshBody>;
|
|
74
97
|
private request;
|
|
75
98
|
private refresh;
|
|
76
99
|
private doRefresh;
|
|
@@ -135,5 +158,14 @@ export declare class VirlowApi {
|
|
|
135
158
|
folders: ApiFolder[];
|
|
136
159
|
}>;
|
|
137
160
|
createFolder(name: string, parentId?: string | null, kind?: 'memories'): Promise<ApiFolder>;
|
|
161
|
+
/** Partial update of a folder. Only `encryptedSchema` is used from here so
|
|
162
|
+
* far, and it is forwarded as an already-encrypted blob: nothing in this
|
|
163
|
+
* client encrypts, and nothing on the server can read it. */
|
|
164
|
+
updateFolder(id: string, body: {
|
|
165
|
+
name?: string;
|
|
166
|
+
parentId?: string | null;
|
|
167
|
+
mcpEnabled?: boolean;
|
|
168
|
+
encryptedSchema?: string | null;
|
|
169
|
+
}): Promise<ApiFolder>;
|
|
138
170
|
}
|
|
139
171
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM;CAKlB;AA6CD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,WAAW,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,WAAW,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5G,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb;kFAC8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB;+EAC2E;IAC3E,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/api.js
CHANGED
|
@@ -56,12 +56,29 @@ export class VirlowApi {
|
|
|
56
56
|
tokens = null;
|
|
57
57
|
refreshInFlight = null;
|
|
58
58
|
onTokensRotated;
|
|
59
|
+
/** Fired when a refresh is refused outright and the session is gone. */
|
|
60
|
+
onTokensCleared;
|
|
59
61
|
constructor(baseUrl) {
|
|
60
62
|
this.baseUrl = baseUrl;
|
|
61
63
|
}
|
|
62
64
|
setTokens(tokens) {
|
|
63
65
|
this.tokens = tokens;
|
|
64
66
|
}
|
|
67
|
+
getTokens() {
|
|
68
|
+
return this.tokens;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Rotate the refresh token exactly once no matter how many callers arrive
|
|
72
|
+
* while a rotation is pending. The API revokes the whole token family when a
|
|
73
|
+
* replaced refresh token is presented again, so two concurrent refreshes are
|
|
74
|
+
* not a race, they are a forced sign-out.
|
|
75
|
+
*/
|
|
76
|
+
refreshSession() {
|
|
77
|
+
this.refreshInFlight ??= this.doRefresh().finally(() => {
|
|
78
|
+
this.refreshInFlight = null;
|
|
79
|
+
});
|
|
80
|
+
return this.refreshInFlight;
|
|
81
|
+
}
|
|
65
82
|
async request(method, path, body, opts = {}) {
|
|
66
83
|
const { auth = true, retryOn401 = true } = opts;
|
|
67
84
|
const headers = { 'content-type': 'application/json' };
|
|
@@ -85,17 +102,27 @@ export class VirlowApi {
|
|
|
85
102
|
return data;
|
|
86
103
|
}
|
|
87
104
|
refresh() {
|
|
88
|
-
|
|
89
|
-
this.refreshInFlight = null;
|
|
90
|
-
});
|
|
91
|
-
return this.refreshInFlight;
|
|
105
|
+
return this.refreshSession().then(() => undefined);
|
|
92
106
|
}
|
|
93
107
|
async doRefresh() {
|
|
94
108
|
if (!this.tokens)
|
|
95
109
|
throw new ApiError(401, 'Not authenticated');
|
|
96
|
-
|
|
110
|
+
let rotated;
|
|
111
|
+
try {
|
|
112
|
+
rotated = await this.request('POST', '/api/auth/refresh', { refreshToken: this.tokens.refreshToken }, { auth: false, retryOn401: false });
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
// Only a definitive refusal ends the session. A network failure or a 5xx
|
|
116
|
+
// while the API restarts must leave the tokens in place for a retry.
|
|
117
|
+
if (err instanceof ApiError && err.status === 401) {
|
|
118
|
+
this.tokens = null;
|
|
119
|
+
this.onTokensCleared?.();
|
|
120
|
+
}
|
|
121
|
+
throw err;
|
|
122
|
+
}
|
|
97
123
|
this.tokens = { accessToken: rotated.accessToken, refreshToken: rotated.refreshToken };
|
|
98
124
|
this.onTokensRotated?.(this.tokens);
|
|
125
|
+
return { user: rotated.user, accessToken: rotated.accessToken };
|
|
99
126
|
}
|
|
100
127
|
login(email, password) {
|
|
101
128
|
return this.request('POST', '/api/auth/login', { email, password }, { auth: false });
|
|
@@ -185,5 +212,11 @@ export class VirlowApi {
|
|
|
185
212
|
body.kind = kind;
|
|
186
213
|
return this.request('POST', '/api/folders', body);
|
|
187
214
|
}
|
|
215
|
+
/** Partial update of a folder. Only `encryptedSchema` is used from here so
|
|
216
|
+
* far, and it is forwarded as an already-encrypted blob: nothing in this
|
|
217
|
+
* client encrypts, and nothing on the server can read it. */
|
|
218
|
+
updateFolder(id, body) {
|
|
219
|
+
return this.request('PUT', `/api/folders/${id}`, body);
|
|
220
|
+
}
|
|
188
221
|
}
|
|
189
222
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IADlB,YACkB,MAAc,EAC9B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QAI9B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,iBAAiB,CAAC,IAAa,EAAE,QAAgB;IACxD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC/D,MAAM,CAAC,GAAG,IAA8C,CAAC;IACzD,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACvD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM;aACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,CAAC,GAAG,KAA8C,CAAC;YACzD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACtE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-side twins of the web's src/lib/attrs/extract.ts. Kept in this shared
|
|
3
|
+
* package (not copied into mcp-core in a form the web could not later reuse)
|
|
4
|
+
* so the two can eventually converge on one implementation.
|
|
5
|
+
*
|
|
6
|
+
* The web module prefers DOMParser and falls back to this regex/tokenizer
|
|
7
|
+
* path only when DOMParser is unavailable. mcp-core runs in Node, which has
|
|
8
|
+
* no DOMParser, so it always takes that fallback path; the logic here is
|
|
9
|
+
* meant to produce the same answers as the web's fallback for the same
|
|
10
|
+
* input, not to reimplement its DOMParser branch.
|
|
11
|
+
*/
|
|
12
|
+
/** Ids of every `<span data-type="noteLink" data-note-id="...">` in `html`,
|
|
13
|
+
* unique, in document order. Attribute order within the tag does not matter. */
|
|
14
|
+
export declare function extractLinkIds(html: string): string[];
|
|
15
|
+
/** Minimal entity decoding for the no-DOMParser text extraction below,
|
|
16
|
+
* covering the common cases the editor actually emits. */
|
|
17
|
+
export declare function decodeEntities(text: string): string;
|
|
18
|
+
/** Flattens note HTML to plain text for mention matching: block-level
|
|
19
|
+
* closing tags and `<br>` become a space (so words either side of a block
|
|
20
|
+
* boundary do not run together), remaining tags are stripped, and entities
|
|
21
|
+
* are decoded. */
|
|
22
|
+
export declare function htmlToText(html: string): string;
|
|
23
|
+
export interface TitleEntry {
|
|
24
|
+
id: string;
|
|
25
|
+
title: string;
|
|
26
|
+
}
|
|
27
|
+
export interface TitleMatcher {
|
|
28
|
+
find(text: string, excludeIds?: Set<string>): string[];
|
|
29
|
+
}
|
|
30
|
+
/** Split into word tokens (letters, digits, underscore); punctuation and
|
|
31
|
+
* spaces separate. Titles are tokenized with the same tokenizer as body text
|
|
32
|
+
* so punctuation like "Follow-up", "Node.js" or "(draft)" indexes the same
|
|
33
|
+
* way it appears in prose. */
|
|
34
|
+
export declare function tokenize(text: string): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Titles are indexed by their first lowercase token. At each token position
|
|
37
|
+
* in the text we look up only the titles that start with that token. Before
|
|
38
|
+
* doing the O(title length) positional check, a token-set pre-filter built
|
|
39
|
+
* once per `find` call rejects, in O(1) per word, any candidate whose words
|
|
40
|
+
* do not all occur somewhere in the text; a candidate that fails this
|
|
41
|
+
* pre-filter is rejected without walking its words. This keeps `find` linear
|
|
42
|
+
* in text tokens for the pre-filter, with positional work spent only on
|
|
43
|
+
* candidates that could plausibly match.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildTitleMatcher(entries: TitleEntry[], opts?: {
|
|
46
|
+
minLength?: number;
|
|
47
|
+
}): TitleMatcher;
|
|
48
|
+
//# sourceMappingURL=attrs-extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attrs-extract.d.ts","sourceRoot":"","sources":["../src/attrs-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuBH;gFACgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAarD;AAID;0DAC0D;AAC1D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;;kBAGkB;AAClB,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CACxD;AAID;;;8BAG8B;AAC9B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CAiDxG"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-side twins of the web's src/lib/attrs/extract.ts. Kept in this shared
|
|
3
|
+
* package (not copied into mcp-core in a form the web could not later reuse)
|
|
4
|
+
* so the two can eventually converge on one implementation.
|
|
5
|
+
*
|
|
6
|
+
* The web module prefers DOMParser and falls back to this regex/tokenizer
|
|
7
|
+
* path only when DOMParser is unavailable. mcp-core runs in Node, which has
|
|
8
|
+
* no DOMParser, so it always takes that fallback path; the logic here is
|
|
9
|
+
* meant to produce the same answers as the web's fallback for the same
|
|
10
|
+
* input, not to reimplement its DOMParser branch.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Matches one opening `<span ...>` tag. A naive `[^>]*` up to the first `>`
|
|
14
|
+
* would stop inside a quoted attribute value that happens to contain a
|
|
15
|
+
* literal `>` (for example `data-note-title="A > B"`), truncating the tag
|
|
16
|
+
* and losing whatever attribute came after it, such as data-note-id. This
|
|
17
|
+
* alternates "not a quote or '>'", a double-quoted run, or a single-quoted
|
|
18
|
+
* run, so only the real closing '>' outside any quotes ends the match.
|
|
19
|
+
*/
|
|
20
|
+
const SPAN_TAG = /<span\b((?:[^"'>]|"[^"]*"|'[^']*')*)>/g;
|
|
21
|
+
const ATTR = /([a-zA-Z_:][-\w:.]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
|
|
22
|
+
/** Attribute name/value pairs from inside one tag's attribute list (the
|
|
23
|
+
* captured group of SPAN_TAG), independent of the order they appear in. */
|
|
24
|
+
function parseAttrs(attrString) {
|
|
25
|
+
const attrs = {};
|
|
26
|
+
for (const m of attrString.matchAll(ATTR)) {
|
|
27
|
+
attrs[m[1]] = m[2] ?? m[3] ?? '';
|
|
28
|
+
}
|
|
29
|
+
return attrs;
|
|
30
|
+
}
|
|
31
|
+
/** Ids of every `<span data-type="noteLink" data-note-id="...">` in `html`,
|
|
32
|
+
* unique, in document order. Attribute order within the tag does not matter. */
|
|
33
|
+
export function extractLinkIds(html) {
|
|
34
|
+
const ids = [];
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
for (const m of html.matchAll(SPAN_TAG)) {
|
|
37
|
+
const attrs = parseAttrs(m[1] ?? '');
|
|
38
|
+
if (attrs['data-type'] !== 'noteLink')
|
|
39
|
+
continue;
|
|
40
|
+
const id = attrs['data-note-id'] ?? '';
|
|
41
|
+
if (id && !seen.has(id)) {
|
|
42
|
+
seen.add(id);
|
|
43
|
+
ids.push(id);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return ids;
|
|
47
|
+
}
|
|
48
|
+
const BLOCK_END = /<\/(p|div|h[1-6]|li|blockquote|pre|td|th|tr|section|article)>|<br\s*\/?>/gi;
|
|
49
|
+
/** Minimal entity decoding for the no-DOMParser text extraction below,
|
|
50
|
+
* covering the common cases the editor actually emits. */
|
|
51
|
+
export function decodeEntities(text) {
|
|
52
|
+
return text
|
|
53
|
+
.replace(/</g, '<')
|
|
54
|
+
.replace(/>/g, '>')
|
|
55
|
+
.replace(/"/g, '"')
|
|
56
|
+
.replace(/'/g, "'")
|
|
57
|
+
.replace(/ /g, ' ')
|
|
58
|
+
.replace(/&/g, '&');
|
|
59
|
+
}
|
|
60
|
+
/** Flattens note HTML to plain text for mention matching: block-level
|
|
61
|
+
* closing tags and `<br>` become a space (so words either side of a block
|
|
62
|
+
* boundary do not run together), remaining tags are stripped, and entities
|
|
63
|
+
* are decoded. */
|
|
64
|
+
export function htmlToText(html) {
|
|
65
|
+
const spaced = html.replace(BLOCK_END, ' ');
|
|
66
|
+
return decodeEntities(spaced.replace(/<[^>]+>/g, '')).trim();
|
|
67
|
+
}
|
|
68
|
+
const WORD = /[\p{L}\p{N}_]/u;
|
|
69
|
+
/** Split into word tokens (letters, digits, underscore); punctuation and
|
|
70
|
+
* spaces separate. Titles are tokenized with the same tokenizer as body text
|
|
71
|
+
* so punctuation like "Follow-up", "Node.js" or "(draft)" indexes the same
|
|
72
|
+
* way it appears in prose. */
|
|
73
|
+
export function tokenize(text) {
|
|
74
|
+
const tokens = [];
|
|
75
|
+
let current = '';
|
|
76
|
+
for (const ch of text) {
|
|
77
|
+
if (WORD.test(ch))
|
|
78
|
+
current += ch;
|
|
79
|
+
else if (current) {
|
|
80
|
+
tokens.push(current);
|
|
81
|
+
current = '';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (current)
|
|
85
|
+
tokens.push(current);
|
|
86
|
+
return tokens;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Titles are indexed by their first lowercase token. At each token position
|
|
90
|
+
* in the text we look up only the titles that start with that token. Before
|
|
91
|
+
* doing the O(title length) positional check, a token-set pre-filter built
|
|
92
|
+
* once per `find` call rejects, in O(1) per word, any candidate whose words
|
|
93
|
+
* do not all occur somewhere in the text; a candidate that fails this
|
|
94
|
+
* pre-filter is rejected without walking its words. This keeps `find` linear
|
|
95
|
+
* in text tokens for the pre-filter, with positional work spent only on
|
|
96
|
+
* candidates that could plausibly match.
|
|
97
|
+
*/
|
|
98
|
+
export function buildTitleMatcher(entries, opts = {}) {
|
|
99
|
+
const minLength = opts.minLength ?? 3;
|
|
100
|
+
const byFirstWord = new Map();
|
|
101
|
+
for (const { id, title } of entries) {
|
|
102
|
+
const words = tokenize(title.trim().toLowerCase());
|
|
103
|
+
if (words.length === 0)
|
|
104
|
+
continue;
|
|
105
|
+
const joinedLength = words.reduce((sum, word) => sum + word.length, 0);
|
|
106
|
+
if (joinedLength < minLength)
|
|
107
|
+
continue;
|
|
108
|
+
const list = byFirstWord.get(words[0]) ?? [];
|
|
109
|
+
list.push({ id, words });
|
|
110
|
+
byFirstWord.set(words[0], list);
|
|
111
|
+
}
|
|
112
|
+
for (const list of byFirstWord.values())
|
|
113
|
+
list.sort((a, b) => b.words.length - a.words.length);
|
|
114
|
+
return {
|
|
115
|
+
find(text, excludeIds) {
|
|
116
|
+
const tokens = tokenize(text.toLowerCase());
|
|
117
|
+
const tokenSet = new Set(tokens);
|
|
118
|
+
const found = [];
|
|
119
|
+
const seen = new Set();
|
|
120
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
121
|
+
const candidates = byFirstWord.get(tokens[i]);
|
|
122
|
+
if (!candidates)
|
|
123
|
+
continue;
|
|
124
|
+
for (const { id, words } of candidates) {
|
|
125
|
+
if (seen.has(id) || excludeIds?.has(id))
|
|
126
|
+
continue;
|
|
127
|
+
let allWordsPresent = true;
|
|
128
|
+
for (let w = 1; w < words.length; w++) {
|
|
129
|
+
if (!tokenSet.has(words[w])) {
|
|
130
|
+
allWordsPresent = false;
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (!allWordsPresent)
|
|
135
|
+
continue;
|
|
136
|
+
let ok = true;
|
|
137
|
+
for (let k = 1; k < words.length; k++) {
|
|
138
|
+
if (tokens[i + k] !== words[k]) {
|
|
139
|
+
ok = false;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (ok) {
|
|
144
|
+
seen.add(id);
|
|
145
|
+
found.push(id);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return found;
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=attrs-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attrs-extract.js","sourceRoot":"","sources":["../src/attrs-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,QAAQ,GAAG,wCAAwC,CAAC;AAC1D,MAAM,IAAI,GAAG,qDAAqD,CAAC;AAEnE;2EAC2E;AAC3E,SAAS,UAAU,CAAC,UAAkB;IACpC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;gFACgF;AAChF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,UAAU;YAAE,SAAS;QAChD,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,SAAS,GAAG,4EAA4E,CAAC;AAE/F;0DAC0D;AAC1D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI;SACR,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;kBAGkB;AAClB,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC5C,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/D,CAAC;AAWD,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAE9B;;;8BAG8B;AAC9B,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;aAC5B,IAAI,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAqB,EAAE,OAA+B,EAAE;IACxF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6C,CAAC;IACzE,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvE,IAAI,YAAY,GAAG,SAAS;YAAE,SAAS;QACvC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACzB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE9F,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,UAAU;YACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAC1B,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;oBACvC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;wBAAE,SAAS;oBAClD,IAAI,eAAe,GAAG,IAAI,CAAC;oBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;4BAC7B,eAAe,GAAG,KAAK,CAAC;4BACxB,MAAM;wBACR,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,eAAe;wBAAE,SAAS;oBAC/B,IAAI,EAAE,GAAG,IAAI,CAAC;oBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC/B,EAAE,GAAG,KAAK,CAAC;4BACX,MAAM;wBACR,CAAC;oBACH,CAAC;oBACD,IAAI,EAAE,EAAE,CAAC;wBACP,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACb,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|