@neottia/searchable-core 0.2.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 +21 -0
- package/NOTICE.md +5 -0
- package/README.md +71 -0
- package/config.schema.json +246 -0
- package/dist/config.d.ts +423 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +343 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction-worker.d.ts +2 -0
- package/dist/extraction-worker.d.ts.map +1 -0
- package/dist/extraction-worker.js +38 -0
- package/dist/extraction-worker.js.map +1 -0
- package/dist/fetcher.d.ts +5 -0
- package/dist/fetcher.d.ts.map +1 -0
- package/dist/fetcher.js +173 -0
- package/dist/fetcher.js.map +1 -0
- package/dist/http.d.ts +54 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +372 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/migration-worker.d.ts +2 -0
- package/dist/migration-worker.d.ts.map +1 -0
- package/dist/migration-worker.js +60 -0
- package/dist/migration-worker.js.map +1 -0
- package/dist/migration.d.ts +19 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +221 -0
- package/dist/migration.js.map +1 -0
- package/dist/providers.d.ts +9 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +210 -0
- package/dist/providers.js.map +1 -0
- package/dist/redaction.d.ts +9 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +161 -0
- package/dist/redaction.js.map +1 -0
- package/dist/runtime.d.ts +20 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +205 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schemas.d.ts +49 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +64 -0
- package/dist/schemas.js.map +1 -0
- package/dist/services.d.ts +20 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +2 -0
- package/dist/services.js.map +1 -0
- package/dist/stash.d.ts +65 -0
- package/dist/stash.d.ts.map +1 -0
- package/dist/stash.js +490 -0
- package/dist/stash.js.map +1 -0
- package/dist/tool-contracts.d.ts +104 -0
- package/dist/tool-contracts.d.ts.map +1 -0
- package/dist/tool-contracts.js +71 -0
- package/dist/tool-contracts.js.map +1 -0
- package/dist/tools.d.ts +23 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +134 -0
- package/dist/tools.js.map +1 -0
- package/dist/utf8.d.ts +2 -0
- package/dist/utf8.d.ts.map +1 -0
- package/dist/utf8.js +14 -0
- package/dist/utf8.js.map +1 -0
- package/dist/worker.d.ts +12 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +45 -0
- package/dist/worker.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stash.d.ts","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":"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"}
|
package/dist/stash.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { DEFAULT_STORE_LIMITS, applyCanonicalBatch, computeByteRevision, openDisposableSqliteCache, readManagedFile, rebuildDisposableSqliteCache, resolveManagedPath, resolveManagedRoot, scanManagedFiles, withRepositoryLease, } from '@neottia/repository-store';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { SearchableError } from './errors.js';
|
|
6
|
+
import { checkSearchableDeadline, createSearchableDeadline, remainingSearchableDeadline, shortenSearchableDeadline, } from './http.js';
|
|
7
|
+
import { searchableHttpUrlSchema, webFetchSourceSchema } from './schemas.js';
|
|
8
|
+
import { truncateUtf8 } from './utf8.js';
|
|
9
|
+
const APPLICATION_ID = 0x4e535243;
|
|
10
|
+
const SCHEMA_VERSION = 1;
|
|
11
|
+
const STORE_OPERATION_TIMEOUT_MS = 60_000;
|
|
12
|
+
export const SEARCHABLE_CACHE_STORAGE_MULTIPLIER = 8;
|
|
13
|
+
export const SEARCHABLE_CACHE_FIXED_BYTES = 8 * 1024 * 1024;
|
|
14
|
+
const pageRecordSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
version: z.literal(1),
|
|
17
|
+
id: z.string().regex(/^page-[0-9a-f]{64}$/u),
|
|
18
|
+
url: searchableHttpUrlSchema,
|
|
19
|
+
title: z.string().min(1),
|
|
20
|
+
content: z.string().min(1),
|
|
21
|
+
excerpt: z.string().optional(),
|
|
22
|
+
site_name: z.string().optional(),
|
|
23
|
+
source: webFetchSourceSchema.optional(),
|
|
24
|
+
created_at: z.iso.datetime({ offset: true }),
|
|
25
|
+
updated_at: z.iso.datetime({ offset: true }),
|
|
26
|
+
})
|
|
27
|
+
.strict();
|
|
28
|
+
export class SearchableStore {
|
|
29
|
+
config;
|
|
30
|
+
cwd;
|
|
31
|
+
rootPromise;
|
|
32
|
+
cacheRootPromise;
|
|
33
|
+
constructor(config, cwd) {
|
|
34
|
+
this.config = config;
|
|
35
|
+
this.cwd = cwd;
|
|
36
|
+
}
|
|
37
|
+
static fromConfig(config, cwd) {
|
|
38
|
+
return new SearchableStore(config, cwd);
|
|
39
|
+
}
|
|
40
|
+
async stash(input, context) {
|
|
41
|
+
this.assertEnabled();
|
|
42
|
+
const normalizedUrl = normalizeStashUrl(input.url);
|
|
43
|
+
const id = pageId(normalizedUrl);
|
|
44
|
+
const control = operationControl(context);
|
|
45
|
+
await this.withCatalog(async (root, lease, catalog) => {
|
|
46
|
+
const current = catalog.get(id);
|
|
47
|
+
const now = new Date().toISOString();
|
|
48
|
+
const record = {
|
|
49
|
+
version: 1,
|
|
50
|
+
id,
|
|
51
|
+
url: normalizedUrl,
|
|
52
|
+
title: input.title,
|
|
53
|
+
content: input.content,
|
|
54
|
+
...(input.excerpt === undefined ? {} : { excerpt: input.excerpt }),
|
|
55
|
+
...(input.siteName === undefined ? {} : { site_name: input.siteName }),
|
|
56
|
+
...(input.source === undefined ? {} : { source: input.source }),
|
|
57
|
+
created_at: current?.record.created_at ?? now,
|
|
58
|
+
updated_at: current && samePage(current.record, input, normalizedUrl) ? current.record.updated_at : now,
|
|
59
|
+
};
|
|
60
|
+
const bytes = encodePage(record);
|
|
61
|
+
const path = `${this.config.root}/pages/${id}.json`;
|
|
62
|
+
if (current && Buffer.from(bytes).equals(Buffer.from(encodePage(current.record))))
|
|
63
|
+
return;
|
|
64
|
+
const proposed = new Map(catalog);
|
|
65
|
+
proposed.set(id, { record, revision: computeByteRevision(bytes), relativePath: path });
|
|
66
|
+
validateCatalog(proposed, this.config);
|
|
67
|
+
const operation = {
|
|
68
|
+
kind: 'write',
|
|
69
|
+
path: resolveManagedPath(root, path),
|
|
70
|
+
bytes,
|
|
71
|
+
expected: current?.revision ?? 'absent',
|
|
72
|
+
};
|
|
73
|
+
await applyCanonicalBatch(root, lease, [operation], {
|
|
74
|
+
...control,
|
|
75
|
+
inventory: [resolveManagedPath(root, this.config.root), resolveManagedPath(root, `${this.config.root}/pages`)],
|
|
76
|
+
});
|
|
77
|
+
}, control);
|
|
78
|
+
return { stashed: true, url: normalizedUrl };
|
|
79
|
+
}
|
|
80
|
+
async importPages(candidates, preview, context) {
|
|
81
|
+
this.assertEnabled();
|
|
82
|
+
const control = operationControl(context);
|
|
83
|
+
return this.withCatalog(async (root, lease, catalog) => {
|
|
84
|
+
const proposed = new Map(catalog);
|
|
85
|
+
const operations = [];
|
|
86
|
+
const conflicts = [];
|
|
87
|
+
const existing = [];
|
|
88
|
+
const now = new Date().toISOString();
|
|
89
|
+
for (const candidate of candidates) {
|
|
90
|
+
const url = normalizeStashUrl(candidate.url);
|
|
91
|
+
const id = pageId(url);
|
|
92
|
+
const current = catalog.get(id);
|
|
93
|
+
if (current) {
|
|
94
|
+
if (current.record.url === url &&
|
|
95
|
+
current.record.title === candidate.title &&
|
|
96
|
+
current.record.content === candidate.content)
|
|
97
|
+
existing.push(id);
|
|
98
|
+
else
|
|
99
|
+
conflicts.push(id);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const record = {
|
|
103
|
+
version: 1,
|
|
104
|
+
id,
|
|
105
|
+
url,
|
|
106
|
+
title: candidate.title,
|
|
107
|
+
content: candidate.content,
|
|
108
|
+
created_at: now,
|
|
109
|
+
updated_at: now,
|
|
110
|
+
};
|
|
111
|
+
const bytes = encodePage(record);
|
|
112
|
+
const relativePath = `${this.config.root}/pages/${id}.json`;
|
|
113
|
+
proposed.set(id, { record, revision: computeByteRevision(bytes), relativePath });
|
|
114
|
+
operations.push({ kind: 'write', path: resolveManagedPath(root, relativePath), bytes, expected: 'absent' });
|
|
115
|
+
}
|
|
116
|
+
validateCatalog(proposed, this.config);
|
|
117
|
+
if (conflicts.length || preview)
|
|
118
|
+
return { planned: operations.length, imported: 0, conflicts, existing, warnings: [] };
|
|
119
|
+
if (operations.length)
|
|
120
|
+
await applyCanonicalBatch(root, lease, operations, {
|
|
121
|
+
...control,
|
|
122
|
+
inventory: [
|
|
123
|
+
resolveManagedPath(root, this.config.root),
|
|
124
|
+
resolveManagedPath(root, `${this.config.root}/pages`),
|
|
125
|
+
],
|
|
126
|
+
});
|
|
127
|
+
const warnings = [];
|
|
128
|
+
if (operations.length)
|
|
129
|
+
try {
|
|
130
|
+
const rebuilt = await rebuildDisposableSqliteCache(await this.cacheRoot(), lease, cacheSpecification(await this.cacheRoot(), proposed, control), control);
|
|
131
|
+
await rebuilt.close();
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
warnings.push('Canonical pages were imported, but the disposable search cache requires a later rebuild.');
|
|
135
|
+
}
|
|
136
|
+
return { planned: operations.length, imported: operations.length, conflicts, existing, warnings };
|
|
137
|
+
}, control);
|
|
138
|
+
}
|
|
139
|
+
async grep(input, context) {
|
|
140
|
+
this.assertEnabled();
|
|
141
|
+
const terms = queryTerms(input.query);
|
|
142
|
+
const control = operationControl(context);
|
|
143
|
+
return this.withCatalog(async (root, lease, catalog) => {
|
|
144
|
+
const handle = await this.ensureCache(await this.cacheRoot(), lease, catalog, context, control);
|
|
145
|
+
try {
|
|
146
|
+
const statement = await handle.database.prepare('SELECT pages.id,pages.revision,bm25(page_fts,5.0,1.0) AS rank FROM page_fts JOIN pages ON pages.id=page_fts.page_id WHERE page_fts MATCH ? ORDER BY rank ASC,pages.id ASC LIMIT ?');
|
|
147
|
+
const candidates = await statement.all([ftsExpression(terms), input.limit], { maxRows: input.limit, maxBytes: this.config.security.limits.max_result_bytes });
|
|
148
|
+
const refreshed = await reloadCandidatePages(root, lease, catalog, candidates, this.config, control);
|
|
149
|
+
return {
|
|
150
|
+
results: candidates.flatMap((candidate) => {
|
|
151
|
+
const page = refreshed.get(candidate.id);
|
|
152
|
+
if (!page || page.revision !== candidate.revision || !matches(page.record, terms))
|
|
153
|
+
return [];
|
|
154
|
+
return [
|
|
155
|
+
{
|
|
156
|
+
url: page.record.url,
|
|
157
|
+
title: page.record.title,
|
|
158
|
+
snippet: canonicalSnippet(page.record, terms, this.config.grep.snippet_bytes),
|
|
159
|
+
rank: candidate.rank,
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
}),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
await handle.close();
|
|
167
|
+
}
|
|
168
|
+
}, control);
|
|
169
|
+
}
|
|
170
|
+
async context(input, context) {
|
|
171
|
+
const results = await this.grep({ query: input.question, limit: input.limit }, context);
|
|
172
|
+
const wanted = new Set(results.results.map((result) => result.url));
|
|
173
|
+
const terms = queryTerms(input.question);
|
|
174
|
+
const contentBytes = Math.max(256, Math.floor(this.config.ask.context_bytes / Math.max(1, results.results.length)));
|
|
175
|
+
const control = operationControl(context);
|
|
176
|
+
return this.withCatalog(async (_root, _lease, catalog) => results.results.flatMap((result) => {
|
|
177
|
+
const page = [...catalog.values()].find((entry) => entry.record.url === result.url && wanted.has(result.url));
|
|
178
|
+
return page ? [{ ...page.record, content: canonicalContext(page.record, terms, contentBytes) }] : [];
|
|
179
|
+
}), control);
|
|
180
|
+
}
|
|
181
|
+
async validate(context) {
|
|
182
|
+
const control = operationControl(context);
|
|
183
|
+
return this.withCatalog(async (_root, lease, catalog) => {
|
|
184
|
+
const handle = await this.ensureCache(await this.cacheRoot(), lease, catalog, context, control);
|
|
185
|
+
try {
|
|
186
|
+
return { valid: true, pages: catalog.size, cache: handle.rebuilt ? 'rebuilt' : 'checked', errors: [] };
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
await handle.close();
|
|
190
|
+
}
|
|
191
|
+
}, control);
|
|
192
|
+
}
|
|
193
|
+
async ensureCache(root, lease, catalog, context, control) {
|
|
194
|
+
const specification = cacheSpecification(root, catalog, control);
|
|
195
|
+
const opened = await openDisposableSqliteCache(root, lease, specification, control);
|
|
196
|
+
let reason;
|
|
197
|
+
if (opened.state === 'ready') {
|
|
198
|
+
let fresh = false;
|
|
199
|
+
try {
|
|
200
|
+
const rebuiltAt = await (await opened.database.prepare("SELECT value FROM neottia_repository_cache_meta WHERE key='rebuilt_at'")).get();
|
|
201
|
+
const age = Date.now() - Date.parse(rebuiltAt?.value ?? '');
|
|
202
|
+
fresh = Number.isFinite(age) && age >= -300_000 && age <= this.config.cache.max_age_ms;
|
|
203
|
+
if (fresh)
|
|
204
|
+
return { database: opened.database, rebuilt: false, close: opened.close };
|
|
205
|
+
reason = 'stale';
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
if (!fresh)
|
|
209
|
+
await opened.close();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
reason = opened.reason;
|
|
214
|
+
}
|
|
215
|
+
let policy = this.config.cache.stale_policy;
|
|
216
|
+
if (policy === 'prompt')
|
|
217
|
+
policy = (await context?.onStaleCache?.()) === false ? 'fail' : 'rebuild';
|
|
218
|
+
if (policy === 'fail') {
|
|
219
|
+
if (reason === 'stale')
|
|
220
|
+
throw cacheError('STASH_CACHE_STALE', 'The Searchable cache exceeds max_age_ms.');
|
|
221
|
+
throw cacheError('STASH_CACHE_REBUILD_REQUIRED', `The Searchable cache requires rebuild: ${reason}.`);
|
|
222
|
+
}
|
|
223
|
+
const rebuilt = await rebuildDisposableSqliteCache(root, lease, specification, control);
|
|
224
|
+
return { database: rebuilt.database, rebuilt: true, close: rebuilt.close };
|
|
225
|
+
}
|
|
226
|
+
async withCatalog(operation, control) {
|
|
227
|
+
const root = await this.root();
|
|
228
|
+
try {
|
|
229
|
+
return await withRepositoryLease(root, async (lease) => operation(root, lease, await loadCatalog(root, lease, this.config, control)), control);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
if (error instanceof SearchableError)
|
|
233
|
+
throw error;
|
|
234
|
+
if (control.sourceSignal?.aborted)
|
|
235
|
+
throw new SearchableError('cancelled', 'OPERATION_CANCELLED', 'Searchable operation was cancelled.');
|
|
236
|
+
try {
|
|
237
|
+
checkSearchableDeadline(control.monotonicDeadline);
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
throw new SearchableError('service', 'DEADLINE_EXCEEDED', 'The Searchable operation exceeded its deadline.');
|
|
241
|
+
}
|
|
242
|
+
throw new SearchableError('service', 'STASH_STORAGE_FAILED', 'Searchable canonical storage failed.');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
root() {
|
|
246
|
+
this.rootPromise ??= resolveManagedRoot({ authorityRoot: resolve(this.cwd), limits: storeLimits(this.config) });
|
|
247
|
+
return this.rootPromise;
|
|
248
|
+
}
|
|
249
|
+
cacheRoot() {
|
|
250
|
+
this.cacheRootPromise ??= resolveManagedRoot({
|
|
251
|
+
authorityRoot: resolve(this.cwd),
|
|
252
|
+
managedPath: '.neottia/cache',
|
|
253
|
+
limits: cacheStoreLimits(this.config),
|
|
254
|
+
});
|
|
255
|
+
return this.cacheRootPromise;
|
|
256
|
+
}
|
|
257
|
+
assertEnabled() {
|
|
258
|
+
if (!this.config.enabled)
|
|
259
|
+
throw new SearchableError('configuration', 'CAPABILITY_DISABLED', 'Searchable requires modules.searchable.enabled=true.');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
export function normalizeStashUrl(value) {
|
|
263
|
+
const url = new URL(value);
|
|
264
|
+
if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
|
|
265
|
+
throw new SearchableError('validation', 'STASH_URL_INVALID', 'Stash URLs must use HTTP(S) without user information.');
|
|
266
|
+
url.protocol = url.protocol.toLowerCase();
|
|
267
|
+
url.hostname = url.hostname.toLowerCase();
|
|
268
|
+
url.hash = '';
|
|
269
|
+
if ((url.protocol === 'http:' && url.port === '80') || (url.protocol === 'https:' && url.port === '443'))
|
|
270
|
+
url.port = '';
|
|
271
|
+
return url.href;
|
|
272
|
+
}
|
|
273
|
+
export function pageId(normalizedUrl) {
|
|
274
|
+
return `page-${createHash('sha256').update(normalizedUrl).digest('hex')}`;
|
|
275
|
+
}
|
|
276
|
+
export function encodePage(record) {
|
|
277
|
+
const ordered = {
|
|
278
|
+
version: record.version,
|
|
279
|
+
id: record.id,
|
|
280
|
+
url: record.url,
|
|
281
|
+
title: record.title,
|
|
282
|
+
content: record.content,
|
|
283
|
+
...(record.excerpt === undefined ? {} : { excerpt: record.excerpt }),
|
|
284
|
+
...(record.site_name === undefined ? {} : { site_name: record.site_name }),
|
|
285
|
+
...(record.source === undefined ? {} : { source: record.source }),
|
|
286
|
+
created_at: record.created_at,
|
|
287
|
+
updated_at: record.updated_at,
|
|
288
|
+
};
|
|
289
|
+
return Buffer.from(`${JSON.stringify(ordered, null, 2)}\n`, 'utf8');
|
|
290
|
+
}
|
|
291
|
+
async function loadCatalog(root, lease, config, control) {
|
|
292
|
+
const files = await scanManagedFiles(root, lease, {
|
|
293
|
+
...control,
|
|
294
|
+
under: [resolveManagedPath(root, `${config.root}/pages`)],
|
|
295
|
+
accept: (path) => path.endsWith('.json'),
|
|
296
|
+
});
|
|
297
|
+
const catalog = new Map();
|
|
298
|
+
for (const file of files) {
|
|
299
|
+
const page = parseCatalogFile(file);
|
|
300
|
+
if (catalog.has(page.record.id))
|
|
301
|
+
throw new SearchableError('service', 'STASH_RECORD_INVALID', 'Canonical Searchable pages contain a duplicate identity.');
|
|
302
|
+
catalog.set(page.record.id, page);
|
|
303
|
+
}
|
|
304
|
+
validateCatalog(catalog, config);
|
|
305
|
+
return catalog;
|
|
306
|
+
}
|
|
307
|
+
async function reloadCandidatePages(root, lease, catalog, candidates, config, control) {
|
|
308
|
+
const refreshed = new Map();
|
|
309
|
+
for (const candidate of candidates) {
|
|
310
|
+
if (refreshed.has(candidate.id))
|
|
311
|
+
continue;
|
|
312
|
+
const current = catalog.get(candidate.id);
|
|
313
|
+
if (!current)
|
|
314
|
+
continue;
|
|
315
|
+
let file;
|
|
316
|
+
try {
|
|
317
|
+
file = await readManagedFile(root, lease, resolveManagedPath(root, current.relativePath), control);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
if (hasCode(error, 'ENOENT'))
|
|
321
|
+
continue;
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
const page = parseCatalogFile(file);
|
|
325
|
+
if (page.record.id !== candidate.id)
|
|
326
|
+
throw new SearchableError('service', 'STASH_RECORD_INVALID', 'A canonical Searchable page changed identity during search.');
|
|
327
|
+
refreshed.set(candidate.id, page);
|
|
328
|
+
}
|
|
329
|
+
validateCatalog(refreshed, config);
|
|
330
|
+
return refreshed;
|
|
331
|
+
}
|
|
332
|
+
function parseCatalogFile(file) {
|
|
333
|
+
let parsed;
|
|
334
|
+
try {
|
|
335
|
+
parsed = JSON.parse(Buffer.from(file.bytes).toString('utf8'));
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
throw new SearchableError('service', 'STASH_RECORD_INVALID', 'A canonical Searchable page contains invalid JSON.');
|
|
339
|
+
}
|
|
340
|
+
const record = pageRecordSchema.parse(parsed);
|
|
341
|
+
if (pageId(normalizeStashUrl(record.url)) !== record.id || !file.path.relativePath.endsWith(`/${record.id}.json`))
|
|
342
|
+
throw new SearchableError('service', 'STASH_RECORD_INVALID', 'A canonical Searchable page has inconsistent identity.');
|
|
343
|
+
return { record, revision: file.revision, relativePath: file.path.relativePath };
|
|
344
|
+
}
|
|
345
|
+
function hasCode(error, code) {
|
|
346
|
+
return error instanceof Error && 'code' in error && error.code === code;
|
|
347
|
+
}
|
|
348
|
+
function cacheSpecification(root, catalog, control) {
|
|
349
|
+
const rows = [...catalog.values()].sort((left, right) => left.record.id.localeCompare(right.record.id));
|
|
350
|
+
return {
|
|
351
|
+
path: resolveManagedPath(root, 'searchable.sqlite'),
|
|
352
|
+
applicationId: APPLICATION_ID,
|
|
353
|
+
schemaVersion: SCHEMA_VERSION,
|
|
354
|
+
canonicalDigest: catalogDigest(catalog),
|
|
355
|
+
schemaSql: [
|
|
356
|
+
'CREATE TABLE pages (id TEXT PRIMARY KEY, revision TEXT NOT NULL)',
|
|
357
|
+
"CREATE VIRTUAL TABLE page_fts USING fts5(page_id UNINDEXED,title,content,tokenize='unicode61')",
|
|
358
|
+
],
|
|
359
|
+
async populate(database) {
|
|
360
|
+
const pages = await database.prepare('INSERT INTO pages VALUES (?,?)');
|
|
361
|
+
const fts = await database.prepare('INSERT INTO page_fts(page_id,title,content) VALUES (?,?,?)');
|
|
362
|
+
for (const row of rows) {
|
|
363
|
+
checkStoreControl(control);
|
|
364
|
+
await pages.run([row.record.id, row.revision]);
|
|
365
|
+
await fts.run([row.record.id, row.record.title, row.record.content]);
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
async healthCheck(database) {
|
|
369
|
+
const count = await (await database.prepare('SELECT count(*) AS value FROM pages')).get();
|
|
370
|
+
const ftsCount = await (await database.prepare('SELECT count(*) AS value FROM page_fts')).get();
|
|
371
|
+
if (count?.value !== rows.length || ftsCount?.value !== rows.length)
|
|
372
|
+
throw new Error('Searchable cache row count contradicts canonical state.');
|
|
373
|
+
const projected = await database.prepare('SELECT pages.id,pages.revision,page_fts.title,page_fts.content FROM pages JOIN page_fts ON pages.id=page_fts.page_id WHERE pages.id>? ORDER BY pages.id LIMIT 1');
|
|
374
|
+
let previous = '';
|
|
375
|
+
for (const expected of rows) {
|
|
376
|
+
checkStoreControl(control);
|
|
377
|
+
const actual = await projected.get([
|
|
378
|
+
previous,
|
|
379
|
+
]);
|
|
380
|
+
if (!actual ||
|
|
381
|
+
actual.id !== expected.record.id ||
|
|
382
|
+
actual.revision !== expected.revision ||
|
|
383
|
+
actual.title !== expected.record.title ||
|
|
384
|
+
actual.content !== expected.record.content)
|
|
385
|
+
throw new Error('Searchable cache content contradicts canonical state.');
|
|
386
|
+
previous = actual.id;
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
function catalogDigest(catalog) {
|
|
392
|
+
const hash = createHash('sha256');
|
|
393
|
+
for (const [id, value] of [...catalog].sort(([left], [right]) => left.localeCompare(right)))
|
|
394
|
+
hash.update(`${id}\0${value.relativePath}\0${value.revision}\n`);
|
|
395
|
+
return hash.digest('hex');
|
|
396
|
+
}
|
|
397
|
+
function validateCatalog(catalog, config) {
|
|
398
|
+
let total = 0;
|
|
399
|
+
for (const page of catalog.values()) {
|
|
400
|
+
const size = encodePage(page.record).byteLength;
|
|
401
|
+
if (size > config.security.limits.max_content_bytes + 64 * 1024)
|
|
402
|
+
throw new SearchableError('resource_limit', 'STASH_RECORD_TOO_LARGE', 'A canonical page exceeds its byte limit.');
|
|
403
|
+
total += size;
|
|
404
|
+
}
|
|
405
|
+
if (total > config.security.limits.max_storage_bytes)
|
|
406
|
+
throw new SearchableError('resource_limit', 'STASH_STORAGE_LIMIT', 'Canonical Searchable pages exceed max_storage_bytes.');
|
|
407
|
+
}
|
|
408
|
+
function storeLimits(config) {
|
|
409
|
+
const maxFile = config.security.limits.max_content_bytes + config.security.limits.max_title_bytes + 128 * 1024;
|
|
410
|
+
return storeLimitsForBytes(config, maxFile, config.security.limits.max_storage_bytes);
|
|
411
|
+
}
|
|
412
|
+
function cacheStoreLimits(config) {
|
|
413
|
+
const maximum = config.security.limits.max_storage_bytes * SEARCHABLE_CACHE_STORAGE_MULTIPLIER + SEARCHABLE_CACHE_FIXED_BYTES;
|
|
414
|
+
return storeLimitsForBytes(config, maximum, maximum);
|
|
415
|
+
}
|
|
416
|
+
function storeLimitsForBytes(config, maxFile, maxTotalBytes) {
|
|
417
|
+
const projectionBytes = config.security.limits.max_content_bytes + config.security.limits.max_title_bytes + 128 * 1024;
|
|
418
|
+
return {
|
|
419
|
+
...DEFAULT_STORE_LIMITS,
|
|
420
|
+
maxFileBytes: maxFile,
|
|
421
|
+
maxFiles: 10_000,
|
|
422
|
+
maxBatchPaths: 10_000,
|
|
423
|
+
maxTotalBytes,
|
|
424
|
+
maxBeforeImageBytes: maxTotalBytes,
|
|
425
|
+
maxTemporaryBytes: maxTotalBytes,
|
|
426
|
+
maxStatementParameterBytes: Math.max(DEFAULT_STORE_LIMITS.maxStatementParameterBytes, projectionBytes),
|
|
427
|
+
maxQueryRows: Math.max(DEFAULT_STORE_LIMITS.maxQueryRows, config.security.limits.max_results),
|
|
428
|
+
maxQueryResultBytes: Math.max(config.security.limits.max_result_bytes, projectionBytes),
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
function queryTerms(query) {
|
|
432
|
+
const terms = query.match(/[\p{L}\p{N}_-]+/gu)?.slice(0, 32) ?? [];
|
|
433
|
+
if (!terms.length)
|
|
434
|
+
throw new SearchableError('validation', 'QUERY_INVALID', 'Search requires at least one letter or number.');
|
|
435
|
+
return terms;
|
|
436
|
+
}
|
|
437
|
+
function ftsExpression(terms) {
|
|
438
|
+
return terms.map((term) => `"${term.replaceAll('"', '""')}"`).join(' AND ');
|
|
439
|
+
}
|
|
440
|
+
function matches(record, terms) {
|
|
441
|
+
const haystack = `${record.title}\n${record.content}`.toLocaleLowerCase();
|
|
442
|
+
return terms.every((term) => haystack.includes(term.toLocaleLowerCase()));
|
|
443
|
+
}
|
|
444
|
+
function canonicalSnippet(record, terms, maximumBytes) {
|
|
445
|
+
return canonicalContext(record, terms, maximumBytes, 80);
|
|
446
|
+
}
|
|
447
|
+
function canonicalContext(record, terms, maximumBytes, leadingCharacters = 256) {
|
|
448
|
+
const lower = record.content.toLocaleLowerCase();
|
|
449
|
+
const indices = terms.map((term) => lower.indexOf(term.toLocaleLowerCase())).filter((index) => index >= 0);
|
|
450
|
+
const start = Math.max(0, (indices.length ? Math.min(...indices) : 0) - leadingCharacters);
|
|
451
|
+
return truncateUtf8(record.content.slice(start), maximumBytes);
|
|
452
|
+
}
|
|
453
|
+
function samePage(current, input, normalizedUrl) {
|
|
454
|
+
return (current.url === normalizedUrl &&
|
|
455
|
+
current.title === input.title &&
|
|
456
|
+
current.content === input.content &&
|
|
457
|
+
current.excerpt === input.excerpt &&
|
|
458
|
+
current.site_name === input.siteName &&
|
|
459
|
+
current.source === input.source);
|
|
460
|
+
}
|
|
461
|
+
function operationControl(context) {
|
|
462
|
+
const requestedDeadline = createSearchableDeadline(STORE_OPERATION_TIMEOUT_MS, context?.deadline);
|
|
463
|
+
const monotonicDeadline = context?.transportDeadline
|
|
464
|
+
? {
|
|
465
|
+
expiresAt: Math.min(shortenSearchableDeadline(context.transportDeadline, STORE_OPERATION_TIMEOUT_MS).expiresAt, requestedDeadline.expiresAt),
|
|
466
|
+
}
|
|
467
|
+
: requestedDeadline;
|
|
468
|
+
checkSearchableDeadline(monotonicDeadline, context?.signal);
|
|
469
|
+
const deadlineSignal = AbortSignal.timeout(Math.ceil(remainingSearchableDeadline(monotonicDeadline)));
|
|
470
|
+
const signal = context?.signal ? AbortSignal.any([context.signal, deadlineSignal]) : deadlineSignal;
|
|
471
|
+
return {
|
|
472
|
+
signal,
|
|
473
|
+
monotonicDeadline,
|
|
474
|
+
...(context?.signal === undefined ? {} : { sourceSignal: context.signal }),
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
function checkStoreControl(control) {
|
|
478
|
+
if (control.sourceSignal?.aborted)
|
|
479
|
+
throw new SearchableError('cancelled', 'OPERATION_CANCELLED', 'Searchable operation was cancelled.');
|
|
480
|
+
try {
|
|
481
|
+
checkSearchableDeadline(control.monotonicDeadline);
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
throw new SearchableError('service', 'DEADLINE_EXCEEDED', 'The Searchable operation exceeded its deadline.');
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
function cacheError(code, message) {
|
|
488
|
+
return new SearchableError('service', code, message);
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=stash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stash.js","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { searchableProviderSchema } from './schemas.js';
|
|
3
|
+
export declare const searchableToolSchemas: {
|
|
4
|
+
readonly web_search: {
|
|
5
|
+
readonly input: z.ZodObject<{
|
|
6
|
+
query: z.ZodString;
|
|
7
|
+
provider: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
duckduckgo: "duckduckgo";
|
|
9
|
+
google: "google";
|
|
10
|
+
bing: "bing";
|
|
11
|
+
brave: "brave";
|
|
12
|
+
}>>;
|
|
13
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
}, z.core.$strict>;
|
|
15
|
+
readonly output: z.ZodObject<{
|
|
16
|
+
results: z.ZodArray<z.ZodObject<{
|
|
17
|
+
title: z.ZodString;
|
|
18
|
+
url: z.ZodURL;
|
|
19
|
+
snippet: z.ZodString;
|
|
20
|
+
siteName: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strict>>;
|
|
22
|
+
}, z.core.$strict>;
|
|
23
|
+
};
|
|
24
|
+
readonly web_fetch: {
|
|
25
|
+
readonly input: z.ZodObject<{
|
|
26
|
+
url: z.ZodURL;
|
|
27
|
+
}, z.core.$strict>;
|
|
28
|
+
readonly output: z.ZodObject<{
|
|
29
|
+
title: z.ZodString;
|
|
30
|
+
content: z.ZodString;
|
|
31
|
+
url: z.ZodURL;
|
|
32
|
+
excerpt: z.ZodOptional<z.ZodString>;
|
|
33
|
+
siteName: z.ZodOptional<z.ZodString>;
|
|
34
|
+
source: z.ZodEnum<{
|
|
35
|
+
direct: "direct";
|
|
36
|
+
jina: "jina";
|
|
37
|
+
wayback: "wayback";
|
|
38
|
+
}>;
|
|
39
|
+
}, z.core.$strict>;
|
|
40
|
+
};
|
|
41
|
+
readonly web_stash: {
|
|
42
|
+
readonly input: z.ZodObject<{
|
|
43
|
+
url: z.ZodURL;
|
|
44
|
+
title: z.ZodString;
|
|
45
|
+
content: z.ZodString;
|
|
46
|
+
excerpt: z.ZodOptional<z.ZodString>;
|
|
47
|
+
siteName: z.ZodOptional<z.ZodString>;
|
|
48
|
+
source: z.ZodOptional<z.ZodEnum<{
|
|
49
|
+
direct: "direct";
|
|
50
|
+
jina: "jina";
|
|
51
|
+
wayback: "wayback";
|
|
52
|
+
}>>;
|
|
53
|
+
}, z.core.$strict>;
|
|
54
|
+
readonly output: z.ZodObject<{
|
|
55
|
+
stashed: z.ZodLiteral<true>;
|
|
56
|
+
url: z.ZodURL;
|
|
57
|
+
}, z.core.$strict>;
|
|
58
|
+
};
|
|
59
|
+
readonly web_grep: {
|
|
60
|
+
readonly input: z.ZodObject<{
|
|
61
|
+
query: z.ZodString;
|
|
62
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
63
|
+
}, z.core.$strict>;
|
|
64
|
+
readonly output: z.ZodObject<{
|
|
65
|
+
results: z.ZodArray<z.ZodObject<{
|
|
66
|
+
url: z.ZodURL;
|
|
67
|
+
title: z.ZodString;
|
|
68
|
+
snippet: z.ZodString;
|
|
69
|
+
rank: z.ZodNumber;
|
|
70
|
+
}, z.core.$strict>>;
|
|
71
|
+
}, z.core.$strict>;
|
|
72
|
+
};
|
|
73
|
+
readonly web_ask: {
|
|
74
|
+
readonly input: z.ZodObject<{
|
|
75
|
+
question: z.ZodString;
|
|
76
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
77
|
+
}, z.core.$strict>;
|
|
78
|
+
readonly output: z.ZodObject<{
|
|
79
|
+
answer: z.ZodString;
|
|
80
|
+
contextUrls: z.ZodArray<z.ZodURL>;
|
|
81
|
+
}, z.core.$strict>;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
export type SearchableToolName = keyof typeof searchableToolSchemas;
|
|
85
|
+
export type SearchableToolInput<Name extends SearchableToolName> = z.output<(typeof searchableToolSchemas)[Name]['input']>;
|
|
86
|
+
export type SearchableToolOutput<Name extends SearchableToolName> = z.output<(typeof searchableToolSchemas)[Name]['output']>;
|
|
87
|
+
type ConfiguredInputDefaults = {
|
|
88
|
+
web_search: {
|
|
89
|
+
provider: z.output<typeof searchableProviderSchema>;
|
|
90
|
+
limit: number;
|
|
91
|
+
};
|
|
92
|
+
web_fetch: Record<never, never>;
|
|
93
|
+
web_stash: Record<never, never>;
|
|
94
|
+
web_grep: {
|
|
95
|
+
limit: number;
|
|
96
|
+
};
|
|
97
|
+
web_ask: {
|
|
98
|
+
limit: number;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
export type ResolvedSearchableToolInput<Name extends SearchableToolName> = SearchableToolInput<Name> & ConfiguredInputDefaults[Name];
|
|
102
|
+
export declare function searchableToolJsonSchema(name: SearchableToolName, boundary: 'input' | 'output'): Record<string, unknown>;
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=tool-contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-contracts.d.ts","sourceRoot":"","sources":["../src/tool-contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,wBAAwB,EAMzB,MAAM,cAAc,CAAC;AAgBtB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,qBAAqB,CAAC;AACpE,MAAM,MAAM,mBAAmB,CAAC,IAAI,SAAS,kBAAkB,IAAI,CAAC,CAAC,MAAM,CACzE,CAAC,OAAO,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAC9C,CAAC;AACF,MAAM,MAAM,oBAAoB,CAAC,IAAI,SAAS,kBAAkB,IAAI,CAAC,CAAC,MAAM,CAC1E,CAAC,OAAO,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAC/C,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,UAAU,EAAE;QAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChC,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B,CAAC;AAGF,MAAM,MAAM,2BAA2B,CAAC,IAAI,SAAS,kBAAkB,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAClG,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAGhC,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB"}
|