@poco-ai/agentero-dsh-host 0.0.0-stage → 0.1.1
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/lib/bookmarks-write.d.ts +24 -0
- package/lib/bookmarks-write.js +181 -0
- package/lib/bookmarks-write.js.map +1 -0
- package/lib/catalog.d.ts +28 -0
- package/lib/catalog.js +58 -0
- package/lib/catalog.js.map +1 -0
- package/lib/cli-run.d.ts +15 -0
- package/lib/cli-run.js +102 -0
- package/lib/cli-run.js.map +1 -0
- package/lib/client/index.d.ts +71 -0
- package/lib/client/settings-model.d.ts +28 -0
- package/lib/client/settings.d.ts +27 -0
- package/lib/client/ui/button.d.ts +10 -0
- package/lib/client/ui/input.d.ts +2 -0
- package/lib/client/utils.d.ts +2 -0
- package/lib/client.js +4071 -0
- package/lib/index.d.ts +55 -0
- package/lib/index.js +1100 -0
- package/lib/index.js.map +1 -0
- package/lib/marks-store.d.ts +80 -0
- package/lib/marks-store.js +393 -0
- package/lib/marks-store.js.map +1 -0
- package/lib/notes-files.d.ts +47 -0
- package/lib/notes-files.js +427 -0
- package/lib/notes-files.js.map +1 -0
- package/lib/pdf-file.d.ts +23 -0
- package/lib/pdf-file.js +84 -0
- package/lib/pdf-file.js.map +1 -0
- package/lib/tools.d.ts +8 -0
- package/lib/tools.js +204 -0
- package/lib/tools.js.map +1 -0
- package/lib/translate.d.ts +70 -0
- package/lib/translate.js +80 -0
- package/lib/translate.js.map +1 -0
- package/lib/translation/batches.d.ts +21 -0
- package/lib/translation/batches.js +88 -0
- package/lib/translation/batches.js.map +1 -0
- package/lib/translation/chunks.d.ts +2 -0
- package/lib/translation/chunks.js +36 -0
- package/lib/translation/chunks.js.map +1 -0
- package/lib/translation/mask.d.ts +22 -0
- package/lib/translation/mask.js +69 -0
- package/lib/translation/mask.js.map +1 -0
- package/lib/translation/pipeline.d.ts +3 -0
- package/lib/translation/pipeline.js +119 -0
- package/lib/translation/pipeline.js.map +1 -0
- package/lib/translation/preserved-links.d.ts +26 -0
- package/lib/translation/preserved-links.js +127 -0
- package/lib/translation/preserved-links.js.map +1 -0
- package/lib/translation/prompt.d.ts +99 -0
- package/lib/translation/prompt.js +224 -0
- package/lib/translation/prompt.js.map +1 -0
- package/lib/translation/retry.d.ts +3 -0
- package/lib/translation/retry.js +30 -0
- package/lib/translation/retry.js.map +1 -0
- package/lib/translation/sentences.d.ts +5 -0
- package/lib/translation/sentences.js +77 -0
- package/lib/translation/sentences.js.map +1 -0
- package/lib/vault.d.ts +21 -0
- package/lib/vault.js +69 -0
- package/lib/vault.js.map +1 -0
- package/package.json +44 -3
- package/src/translation/MOTIF-LICENSE.txt +21 -0
- package/README.md +0 -3
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { lstat, mkdir, readFile, readdir, readlink, realpath, writeFile } from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
/** Markdown files returned from one vault `notes` directory. */
|
|
4
|
+
const NOTE_LIMIT = 500;
|
|
5
|
+
const INVALID_PATH = 'invalid path';
|
|
6
|
+
const NOT_FOUND = 'not found';
|
|
7
|
+
function ioCode(error) {
|
|
8
|
+
if (typeof error !== 'object' || error === null || !('code' in error))
|
|
9
|
+
return undefined;
|
|
10
|
+
return typeof error.code === 'string' ? error.code : undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Vault-relative path with `/` separators.
|
|
14
|
+
* Absolute paths and `.` / `..` segments are rejected.
|
|
15
|
+
*/
|
|
16
|
+
function vaultRelative(input) {
|
|
17
|
+
if (/[\u0000-\u001f]/.test(input))
|
|
18
|
+
return undefined;
|
|
19
|
+
const unified = input.replaceAll('\\', '/');
|
|
20
|
+
if (unified === '' || unified.startsWith('/') || /^[a-zA-Z]:/.test(unified))
|
|
21
|
+
return undefined;
|
|
22
|
+
if (path.win32.isAbsolute(input) || path.posix.isAbsolute(unified))
|
|
23
|
+
return undefined;
|
|
24
|
+
const segments = unified.split('/');
|
|
25
|
+
if (segments.some(segment => segment === '' || segment === '.' || segment === '..'))
|
|
26
|
+
return undefined;
|
|
27
|
+
return segments.join('/');
|
|
28
|
+
}
|
|
29
|
+
export function within(parent, child, allowEqual) {
|
|
30
|
+
const relative = path.relative(parent, child);
|
|
31
|
+
if (relative === '')
|
|
32
|
+
return allowEqual;
|
|
33
|
+
if (path.isAbsolute(relative))
|
|
34
|
+
return false;
|
|
35
|
+
return relative !== '..' && !relative.startsWith(`..${path.sep}`);
|
|
36
|
+
}
|
|
37
|
+
function samePath(left, right) {
|
|
38
|
+
return path.relative(left, right) === '';
|
|
39
|
+
}
|
|
40
|
+
async function vaultDirectory(vault) {
|
|
41
|
+
try {
|
|
42
|
+
const real = await realpath(vault);
|
|
43
|
+
const stat = await lstat(real);
|
|
44
|
+
if (!stat.isDirectory())
|
|
45
|
+
return undefined;
|
|
46
|
+
return real;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const code = ioCode(error);
|
|
50
|
+
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
51
|
+
return undefined;
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function opensFence(line) {
|
|
56
|
+
const match = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);
|
|
57
|
+
if (match === null)
|
|
58
|
+
return undefined;
|
|
59
|
+
const marker = match[1] ?? '';
|
|
60
|
+
const info = match[2] ?? '';
|
|
61
|
+
if (marker.startsWith('`') && info.includes('`'))
|
|
62
|
+
return undefined;
|
|
63
|
+
const char = marker[0];
|
|
64
|
+
if (char !== '`' && char !== '~')
|
|
65
|
+
return undefined;
|
|
66
|
+
return { char, len: marker.length };
|
|
67
|
+
}
|
|
68
|
+
function closesFence(line, open) {
|
|
69
|
+
const match = /^ {0,3}(`{3,}|~{3,})[ \t]*$/.exec(line);
|
|
70
|
+
if (match === null)
|
|
71
|
+
return false;
|
|
72
|
+
const marker = match[1] ?? '';
|
|
73
|
+
return marker[0] === open.char && marker.length >= open.len;
|
|
74
|
+
}
|
|
75
|
+
/** First ATX heading outside a fence. Empty headings are skipped. */
|
|
76
|
+
function atxHeading(line) {
|
|
77
|
+
const match = /^ {0,3}(#{1,6})[ \t]+(.*)$/.exec(line);
|
|
78
|
+
if (match === null)
|
|
79
|
+
return undefined;
|
|
80
|
+
const text = (match[2] ?? '').replace(/[ \t]+#+\s*$/, '').trim();
|
|
81
|
+
if (text === '')
|
|
82
|
+
return undefined;
|
|
83
|
+
return text;
|
|
84
|
+
}
|
|
85
|
+
function noteTitle(text, filename) {
|
|
86
|
+
const source = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
87
|
+
let fence;
|
|
88
|
+
for (const line of source.split(/\r?\n/)) {
|
|
89
|
+
if (fence !== undefined) {
|
|
90
|
+
if (closesFence(line, fence))
|
|
91
|
+
fence = undefined;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const opened = opensFence(line);
|
|
95
|
+
if (opened !== undefined) {
|
|
96
|
+
fence = opened;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const heading = atxHeading(line);
|
|
100
|
+
if (heading !== undefined)
|
|
101
|
+
return heading;
|
|
102
|
+
}
|
|
103
|
+
return filename;
|
|
104
|
+
}
|
|
105
|
+
async function walkNotes(dir, relPosix, out) {
|
|
106
|
+
if (out.length >= NOTE_LIMIT)
|
|
107
|
+
return;
|
|
108
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
109
|
+
entries.sort((left, right) => left.name.localeCompare(right.name));
|
|
110
|
+
const files = [];
|
|
111
|
+
const dirs = [];
|
|
112
|
+
for (const entry of entries) {
|
|
113
|
+
if (entry.isSymbolicLink())
|
|
114
|
+
continue;
|
|
115
|
+
if (entry.isDirectory()) {
|
|
116
|
+
if (entry.name.startsWith('.'))
|
|
117
|
+
continue;
|
|
118
|
+
dirs.push(entry.name);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (!entry.isFile() || !entry.name.endsWith('.md'))
|
|
122
|
+
continue;
|
|
123
|
+
files.push(entry.name);
|
|
124
|
+
}
|
|
125
|
+
for (const name of files) {
|
|
126
|
+
if (out.length >= NOTE_LIMIT)
|
|
127
|
+
return;
|
|
128
|
+
const rel = `${relPosix}/${name}`;
|
|
129
|
+
let title = name;
|
|
130
|
+
try {
|
|
131
|
+
title = noteTitle(await readFile(path.join(dir, name), 'utf8'), name);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
title = name;
|
|
135
|
+
}
|
|
136
|
+
out.push({ path: rel, title });
|
|
137
|
+
}
|
|
138
|
+
for (const name of dirs) {
|
|
139
|
+
if (out.length >= NOTE_LIMIT)
|
|
140
|
+
return;
|
|
141
|
+
await walkNotes(path.join(dir, name), `${relPosix}/${name}`, out);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** Markdown files under `<vault>/notes`. A missing notes directory is an empty list. */
|
|
145
|
+
export async function listVaultNotes(vault) {
|
|
146
|
+
const root = await vaultDirectory(vault);
|
|
147
|
+
if (root === undefined)
|
|
148
|
+
return [];
|
|
149
|
+
const notesLexical = path.join(root, 'notes');
|
|
150
|
+
let notesReal;
|
|
151
|
+
try {
|
|
152
|
+
notesReal = await realpath(notesLexical);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (ioCode(error) === 'ENOENT')
|
|
156
|
+
return [];
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
const stat = await lstat(notesReal);
|
|
160
|
+
if (!stat.isDirectory() || !within(root, notesReal, false))
|
|
161
|
+
return [];
|
|
162
|
+
const notes = [];
|
|
163
|
+
await walkNotes(notesReal, 'notes', notes);
|
|
164
|
+
notes.sort((left, right) => left.path.localeCompare(right.path));
|
|
165
|
+
return notes;
|
|
166
|
+
}
|
|
167
|
+
/** Read a UTF-8 file whose real path stays inside the vault. */
|
|
168
|
+
export async function readVaultFile(vault, rawPath) {
|
|
169
|
+
const relative = vaultRelative(rawPath);
|
|
170
|
+
if (relative === undefined)
|
|
171
|
+
return { status: 400, error: INVALID_PATH };
|
|
172
|
+
const root = await vaultDirectory(vault);
|
|
173
|
+
if (root === undefined)
|
|
174
|
+
return { status: 404, error: NOT_FOUND };
|
|
175
|
+
const lexical = path.join(root, ...relative.split('/'));
|
|
176
|
+
if (!within(root, lexical, false))
|
|
177
|
+
return { status: 400, error: INVALID_PATH };
|
|
178
|
+
try {
|
|
179
|
+
const stat = await lstat(lexical);
|
|
180
|
+
if (stat.isSymbolicLink()) {
|
|
181
|
+
const target = await readlink(lexical);
|
|
182
|
+
const resolved = path.resolve(path.dirname(lexical), target);
|
|
183
|
+
if (!within(root, resolved, false))
|
|
184
|
+
return { status: 400, error: INVALID_PATH };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
const code = ioCode(error);
|
|
189
|
+
if (code === 'ENOENT')
|
|
190
|
+
return { status: 404, error: NOT_FOUND };
|
|
191
|
+
if (code === 'ELOOP' || code === 'ENOTDIR')
|
|
192
|
+
return { status: 400, error: INVALID_PATH };
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
let real;
|
|
196
|
+
try {
|
|
197
|
+
real = await realpath(lexical);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
const code = ioCode(error);
|
|
201
|
+
if (code === 'ENOENT')
|
|
202
|
+
return { status: 404, error: NOT_FOUND };
|
|
203
|
+
if (code === 'ELOOP' || code === 'ENOTDIR')
|
|
204
|
+
return { status: 400, error: INVALID_PATH };
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
if (!within(root, real, false))
|
|
208
|
+
return { status: 400, error: INVALID_PATH };
|
|
209
|
+
const stat = await lstat(real);
|
|
210
|
+
if (!stat.isFile())
|
|
211
|
+
return { status: 400, error: INVALID_PATH };
|
|
212
|
+
const text = await readFile(real, 'utf8');
|
|
213
|
+
return { status: 200, path: relative, text };
|
|
214
|
+
}
|
|
215
|
+
/** Nearest existing directory at or above `start`. */
|
|
216
|
+
async function firstExisting(start) {
|
|
217
|
+
const missing = [];
|
|
218
|
+
let current = start;
|
|
219
|
+
for (;;) {
|
|
220
|
+
let stat;
|
|
221
|
+
try {
|
|
222
|
+
stat = await lstat(current);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (ioCode(error) !== 'ENOENT')
|
|
226
|
+
throw error;
|
|
227
|
+
missing.push(current);
|
|
228
|
+
const parent = path.dirname(current);
|
|
229
|
+
if (parent === current)
|
|
230
|
+
return 'bad';
|
|
231
|
+
current = parent;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (!stat.isDirectory() && !stat.isSymbolicLink())
|
|
235
|
+
return 'bad';
|
|
236
|
+
let real;
|
|
237
|
+
try {
|
|
238
|
+
real = await realpath(current);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const code = ioCode(error);
|
|
242
|
+
if (code === 'ENOENT' || code === 'ELOOP' || code === 'ENOTDIR')
|
|
243
|
+
return 'bad';
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
const realStat = await lstat(real);
|
|
247
|
+
if (!realStat.isDirectory())
|
|
248
|
+
return 'bad';
|
|
249
|
+
return { lexical: current, real, missing };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function notesFile(relative) {
|
|
253
|
+
return relative.startsWith('notes/') && relative.length > 'notes/'.length;
|
|
254
|
+
}
|
|
255
|
+
/** `papers/<id>/NOTES.md` only. The paper directory must already exist. */
|
|
256
|
+
function paperNotesFile(relative) {
|
|
257
|
+
return /^papers\/[^/]+\/NOTES\.md$/.test(relative);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Resolve a vault-relative path to a lexical path inside the vault.
|
|
261
|
+
* Does not require the target to exist.
|
|
262
|
+
*/
|
|
263
|
+
export async function locateVaultPath(vault, rawPath) {
|
|
264
|
+
const relative = vaultRelative(rawPath);
|
|
265
|
+
if (relative === undefined)
|
|
266
|
+
return { ok: false, status: 400, error: INVALID_PATH };
|
|
267
|
+
const root = await vaultDirectory(vault);
|
|
268
|
+
if (root === undefined)
|
|
269
|
+
return { ok: false, status: 404, error: NOT_FOUND };
|
|
270
|
+
const lexical = path.join(root, ...relative.split('/'));
|
|
271
|
+
if (!within(root, lexical, false))
|
|
272
|
+
return { ok: false, status: 400, error: INVALID_PATH };
|
|
273
|
+
return { ok: true, location: { root, relative, lexical } };
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Create or replace `papers/<id>/NOTES.md`.
|
|
277
|
+
* The paper directory must already exist. This does not create `papers/`.
|
|
278
|
+
*/
|
|
279
|
+
async function writePaperNotes(vault, relative, text) {
|
|
280
|
+
const located = await locateVaultPath(vault, relative);
|
|
281
|
+
if (!located.ok)
|
|
282
|
+
return { status: located.status, error: located.error };
|
|
283
|
+
const { root, lexical } = located.location;
|
|
284
|
+
const parentLexical = path.dirname(lexical);
|
|
285
|
+
let parentReal;
|
|
286
|
+
try {
|
|
287
|
+
parentReal = await realpath(parentLexical);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const code = ioCode(error);
|
|
291
|
+
if (code === 'ENOENT')
|
|
292
|
+
return { status: 404, error: NOT_FOUND };
|
|
293
|
+
if (code === 'ELOOP' || code === 'ENOTDIR')
|
|
294
|
+
return { status: 400, error: INVALID_PATH };
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
if (!within(root, parentReal, false))
|
|
298
|
+
return { status: 400, error: INVALID_PATH };
|
|
299
|
+
const parentStat = await lstat(parentReal);
|
|
300
|
+
if (!parentStat.isDirectory())
|
|
301
|
+
return { status: 400, error: INVALID_PATH };
|
|
302
|
+
let exists = false;
|
|
303
|
+
try {
|
|
304
|
+
await lstat(lexical);
|
|
305
|
+
exists = true;
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
if (ioCode(error) !== 'ENOENT')
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
if (exists) {
|
|
312
|
+
let fileReal;
|
|
313
|
+
try {
|
|
314
|
+
fileReal = await realpath(lexical);
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
const code = ioCode(error);
|
|
318
|
+
if (code === 'ENOENT' || code === 'ELOOP' || code === 'ENOTDIR')
|
|
319
|
+
return { status: 400, error: INVALID_PATH };
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
if (!within(parentReal, fileReal, false))
|
|
323
|
+
return { status: 400, error: INVALID_PATH };
|
|
324
|
+
const fileStat = await lstat(fileReal);
|
|
325
|
+
if (!fileStat.isFile())
|
|
326
|
+
return { status: 400, error: INVALID_PATH };
|
|
327
|
+
}
|
|
328
|
+
await writeFile(lexical, text, { encoding: 'utf8', flag: exists ? 'w' : 'wx' });
|
|
329
|
+
return { status: 200, path: relative };
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Write UTF-8 under `<vault>/notes`, or replace one paper's `NOTES.md`.
|
|
333
|
+
* Parent directories are created only inside `notes/`.
|
|
334
|
+
* Other paths are refused.
|
|
335
|
+
*/
|
|
336
|
+
export async function writeVaultNote(vault, rawPath, text) {
|
|
337
|
+
const relative = vaultRelative(rawPath);
|
|
338
|
+
if (relative === undefined)
|
|
339
|
+
return { status: 400, error: INVALID_PATH };
|
|
340
|
+
if (paperNotesFile(relative))
|
|
341
|
+
return writePaperNotes(vault, relative, text);
|
|
342
|
+
if (!notesFile(relative))
|
|
343
|
+
return { status: 400, error: INVALID_PATH };
|
|
344
|
+
const root = await vaultDirectory(vault);
|
|
345
|
+
if (root === undefined)
|
|
346
|
+
return { status: 404, error: NOT_FOUND };
|
|
347
|
+
const notesLexical = path.join(root, 'notes');
|
|
348
|
+
const fileLexical = path.join(root, ...relative.split('/'));
|
|
349
|
+
if (!within(notesLexical, fileLexical, false))
|
|
350
|
+
return { status: 400, error: INVALID_PATH };
|
|
351
|
+
const ancestor = await firstExisting(path.dirname(fileLexical));
|
|
352
|
+
if (ancestor === 'bad' || !within(root, ancestor.real, true))
|
|
353
|
+
return { status: 400, error: INVALID_PATH };
|
|
354
|
+
if (samePath(ancestor.real, root)) {
|
|
355
|
+
// `notes` is not an existing directory. A symlink here would write outside it.
|
|
356
|
+
try {
|
|
357
|
+
await lstat(notesLexical);
|
|
358
|
+
return { status: 400, error: INVALID_PATH };
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
if (ioCode(error) !== 'ENOENT')
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
364
|
+
const underNotes = ancestor.missing.every(dir => samePath(dir, notesLexical) || within(notesLexical, dir, false));
|
|
365
|
+
if (!underNotes)
|
|
366
|
+
return { status: 400, error: INVALID_PATH };
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
let notesReal;
|
|
370
|
+
try {
|
|
371
|
+
notesReal = await realpath(notesLexical);
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
const code = ioCode(error);
|
|
375
|
+
if (code === 'ENOENT' || code === 'ELOOP' || code === 'ENOTDIR')
|
|
376
|
+
return { status: 400, error: INVALID_PATH };
|
|
377
|
+
throw error;
|
|
378
|
+
}
|
|
379
|
+
const notesStat = await lstat(notesReal);
|
|
380
|
+
if (!notesStat.isDirectory() || !within(root, notesReal, false))
|
|
381
|
+
return { status: 400, error: INVALID_PATH };
|
|
382
|
+
if (!within(notesReal, ancestor.real, true))
|
|
383
|
+
return { status: 400, error: INVALID_PATH };
|
|
384
|
+
const projected = ancestor.missing.every(dir => {
|
|
385
|
+
const suffix = path.relative(ancestor.lexical, dir);
|
|
386
|
+
if (suffix === '' || path.isAbsolute(suffix) || suffix === '..' || suffix.startsWith(`..${path.sep}`))
|
|
387
|
+
return false;
|
|
388
|
+
return within(notesReal, path.resolve(ancestor.real, suffix), true);
|
|
389
|
+
});
|
|
390
|
+
if (!projected)
|
|
391
|
+
return { status: 400, error: INVALID_PATH };
|
|
392
|
+
}
|
|
393
|
+
let exists = false;
|
|
394
|
+
try {
|
|
395
|
+
await lstat(fileLexical);
|
|
396
|
+
exists = true;
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
if (ioCode(error) !== 'ENOENT')
|
|
400
|
+
throw error;
|
|
401
|
+
}
|
|
402
|
+
if (exists) {
|
|
403
|
+
let fileReal;
|
|
404
|
+
let notesReal;
|
|
405
|
+
try {
|
|
406
|
+
fileReal = await realpath(fileLexical);
|
|
407
|
+
notesReal = await realpath(notesLexical);
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
const code = ioCode(error);
|
|
411
|
+
if (code === 'ENOENT' || code === 'ELOOP' || code === 'ENOTDIR')
|
|
412
|
+
return { status: 400, error: INVALID_PATH };
|
|
413
|
+
throw error;
|
|
414
|
+
}
|
|
415
|
+
if (!within(root, fileReal, false) || !within(root, notesReal, false) || !within(notesReal, fileReal, false)) {
|
|
416
|
+
return { status: 400, error: INVALID_PATH };
|
|
417
|
+
}
|
|
418
|
+
const fileStat = await lstat(fileReal);
|
|
419
|
+
if (!fileStat.isFile())
|
|
420
|
+
return { status: 400, error: INVALID_PATH };
|
|
421
|
+
}
|
|
422
|
+
if (!exists)
|
|
423
|
+
await mkdir(path.dirname(fileLexical), { recursive: true });
|
|
424
|
+
await writeFile(fileLexical, text, { encoding: 'utf8', flag: exists ? 'w' : 'wx' });
|
|
425
|
+
return { status: 200, path: relative };
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=notes-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes-files.js","sourceRoot":"","sources":["../src/notes-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type PdfReadResult = {
|
|
2
|
+
status: 200;
|
|
3
|
+
bytes: Buffer;
|
|
4
|
+
} | {
|
|
5
|
+
status: 400 | 404;
|
|
6
|
+
error: string;
|
|
7
|
+
};
|
|
8
|
+
export type PdfPathResult = {
|
|
9
|
+
status: 200;
|
|
10
|
+
realPath: string;
|
|
11
|
+
} | {
|
|
12
|
+
status: 400 | 404;
|
|
13
|
+
error: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Resolve one PDF on disk.
|
|
17
|
+
* A `ref` ending in `.pdf` is that file.
|
|
18
|
+
* Any other ref is a paper directory: prefer `<dirname>.pdf`, else the first
|
|
19
|
+
* direct-child `.pdf` in locale order. Nested directories are not searched.
|
|
20
|
+
*/
|
|
21
|
+
export declare function locateVaultPdf(vault: string, rawRef: string): Promise<PdfPathResult>;
|
|
22
|
+
/** Read one PDF. A `ref` ending in `.pdf` is that file; any other ref is a paper directory. */
|
|
23
|
+
export declare function readVaultPdf(vault: string, rawRef: string): Promise<PdfReadResult>;
|
package/lib/pdf-file.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { lstat, readdir, readFile, realpath } from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { locateVaultPath } from './notes-files.js';
|
|
4
|
+
function ioCode(error) {
|
|
5
|
+
if (typeof error !== 'object' || error === null || !('code' in error))
|
|
6
|
+
return undefined;
|
|
7
|
+
return typeof error.code === 'string' ? error.code : undefined;
|
|
8
|
+
}
|
|
9
|
+
async function readRegularFile(realPath) {
|
|
10
|
+
const stat = await lstat(realPath);
|
|
11
|
+
if (!stat.isFile())
|
|
12
|
+
return { status: 400, error: 'invalid path' };
|
|
13
|
+
return { status: 200, bytes: await readFile(realPath) };
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve one PDF on disk.
|
|
17
|
+
* A `ref` ending in `.pdf` is that file.
|
|
18
|
+
* Any other ref is a paper directory: prefer `<dirname>.pdf`, else the first
|
|
19
|
+
* direct-child `.pdf` in locale order. Nested directories are not searched.
|
|
20
|
+
*/
|
|
21
|
+
export async function locateVaultPdf(vault, rawRef) {
|
|
22
|
+
const located = await locateVaultPath(vault, rawRef);
|
|
23
|
+
if (!located.ok)
|
|
24
|
+
return { status: located.status, error: located.error };
|
|
25
|
+
const { root, relative, lexical } = located.location;
|
|
26
|
+
if (relative.toLowerCase().endsWith('.pdf')) {
|
|
27
|
+
let real;
|
|
28
|
+
try {
|
|
29
|
+
real = await realpath(lexical);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const code = ioCode(error);
|
|
33
|
+
if (code === 'ENOENT')
|
|
34
|
+
return { status: 404, error: 'not found' };
|
|
35
|
+
if (code === 'ELOOP' || code === 'ENOTDIR')
|
|
36
|
+
return { status: 400, error: 'invalid path' };
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
const relativeToRoot = path.relative(root, real);
|
|
40
|
+
if (relativeToRoot.startsWith('..') || path.isAbsolute(relativeToRoot)) {
|
|
41
|
+
return { status: 400, error: 'invalid path' };
|
|
42
|
+
}
|
|
43
|
+
return { status: 200, realPath: real };
|
|
44
|
+
}
|
|
45
|
+
let dirReal;
|
|
46
|
+
try {
|
|
47
|
+
dirReal = await realpath(lexical);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const code = ioCode(error);
|
|
51
|
+
if (code === 'ENOENT')
|
|
52
|
+
return { status: 404, error: 'not found' };
|
|
53
|
+
if (code === 'ELOOP' || code === 'ENOTDIR')
|
|
54
|
+
return { status: 400, error: 'invalid path' };
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
const relativeToRoot = path.relative(root, dirReal);
|
|
58
|
+
if (relativeToRoot.startsWith('..') || path.isAbsolute(relativeToRoot)) {
|
|
59
|
+
return { status: 400, error: 'invalid path' };
|
|
60
|
+
}
|
|
61
|
+
const dirStat = await lstat(dirReal);
|
|
62
|
+
if (!dirStat.isDirectory())
|
|
63
|
+
return { status: 400, error: 'invalid path' };
|
|
64
|
+
const entries = await readdir(dirReal, { withFileTypes: true });
|
|
65
|
+
const pdfs = entries
|
|
66
|
+
.filter(entry => entry.isFile() && entry.name.toLowerCase().endsWith('.pdf'))
|
|
67
|
+
.map(entry => entry.name)
|
|
68
|
+
.sort((left, right) => left.localeCompare(right));
|
|
69
|
+
if (pdfs.length === 0)
|
|
70
|
+
return { status: 404, error: 'not found' };
|
|
71
|
+
const preferred = `${path.posix.basename(relative)}.pdf`;
|
|
72
|
+
const name = pdfs.find(item => item === preferred) ?? pdfs[0];
|
|
73
|
+
if (name === undefined)
|
|
74
|
+
return { status: 404, error: 'not found' };
|
|
75
|
+
return { status: 200, realPath: path.join(dirReal, name) };
|
|
76
|
+
}
|
|
77
|
+
/** Read one PDF. A `ref` ending in `.pdf` is that file; any other ref is a paper directory. */
|
|
78
|
+
export async function readVaultPdf(vault, rawRef) {
|
|
79
|
+
const located = await locateVaultPdf(vault, rawRef);
|
|
80
|
+
if (located.status !== 200)
|
|
81
|
+
return located;
|
|
82
|
+
return readRegularFile(located.realPath);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=pdf-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-file.js","sourceRoot":"","sources":["../src/pdf-file.ts"],"names":[],"mappings":"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"}
|
package/lib/tools.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import { type CatalogSettings } from './catalog.js';
|
|
4
|
+
/**
|
|
5
|
+
* Register model tools that read and import the same vault as the panels.
|
|
6
|
+
* @returns Disposer that unregisters every tool.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerTools(ctx: Context, settings: CatalogSettings, children: Set<ChildProcess>): () => void;
|